diff --git a/.eslintignore b/.eslintignore index 45ef798e9..19c084e4b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,5 +1,4 @@ **/node_modules/* -parser/react-native-live-markdown-parser.js # any js file inside android and ios folders **/android/**/*.js diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index cca322702..b8355d2b8 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -27,22 +27,9 @@ jobs: - name: Install node_modules run: npm ci - - name: Verify there's no parser diff - working-directory: parser - run: | - npm run build - if ! git diff --name-only --exit-code; then - # shellcheck disable=SC2016 - echo 'Error: Parser diff detected! Please run `cd parser && npm run build` and commit the changes.' - exit 1 - fi - - name: Typecheck library run: npm run typecheck -- --project tsconfig.json - - name: Typecheck parser - run: npm run typecheck -- --project parser/tsconfig.json - - name: Typecheck example app run: npm run typecheck -- --project example/tsconfig.json diff --git a/.gitignore b/.gitignore index d9ceaf0b9..d6cadc5d0 100644 --- a/.gitignore +++ b/.gitignore @@ -78,5 +78,4 @@ android/keystores/debug.keystore lib/ # react-native-live-markdown -android/src/main/assets/react-native-live-markdown-parser.js .build_complete diff --git a/.yarn/patches/html-entities-npm-2.5.2-0b6113e376.patch b/.yarn/patches/html-entities-npm-2.5.2-0b6113e376.patch new file mode 100644 index 000000000..8fe1bb677 --- /dev/null +++ b/.yarn/patches/html-entities-npm-2.5.2-0b6113e376.patch @@ -0,0 +1,9 @@ +diff --git a/lib/index.js b/lib/index.js +index 3a44c851c4895f74db30360befb509d232055c56..2f7809ba105f32aa3d9620c1be3f14c93e589185 100644 +--- a/lib/index.js ++++ b/lib/index.js +@@ -1,2 +1,3 @@ ++"worklet"; + "use strict";var __assign=this&&this.__assign||function(){__assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i'"&]/g,nonAscii:/[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g,nonAsciiPrintable:/[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g,nonAsciiPrintableOnly:/[\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g,extensive:/[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g};var defaultEncodeOptions={mode:"specialChars",level:"all",numeric:"decimal"};function encode(text,_a){var _b=_a===void 0?defaultEncodeOptions:_a,_c=_b.mode,mode=_c===void 0?"specialChars":_c,_d=_b.numeric,numeric=_d===void 0?"decimal":_d,_e=_b.level,level=_e===void 0?"all":_e;if(!text){return""}var encodeRegExp=encodeRegExps[mode];var references=allNamedReferences[level].characters;var isHex=numeric==="hexadecimal";return replaceUsingRegExp(text,encodeRegExp,(function(input){var result=references[input];if(!result){var code=input.length>1?surrogate_pairs_1.getCodePoint(input,0):input.charCodeAt(0);result=(isHex?"&#x"+code.toString(16):"&#"+code)+";"}return result}))}exports.encode=encode;var defaultDecodeOptions={scope:"body",level:"all"};var strict=/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g;var attribute=/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g;var baseDecodeRegExps={xml:{strict:strict,attribute:attribute,body:named_references_1.bodyRegExps.xml},html4:{strict:strict,attribute:attribute,body:named_references_1.bodyRegExps.html4},html5:{strict:strict,attribute:attribute,body:named_references_1.bodyRegExps.html5}};var decodeRegExps=__assign(__assign({},baseDecodeRegExps),{all:baseDecodeRegExps.html5});var fromCharCode=String.fromCharCode;var outOfBoundsChar=fromCharCode(65533);var defaultDecodeEntityOptions={level:"all"};function getDecodedEntity(entity,references,isAttribute,isStrict){var decodeResult=entity;var decodeEntityLastChar=entity[entity.length-1];if(isAttribute&&decodeEntityLastChar==="="){decodeResult=entity}else if(isStrict&&decodeEntityLastChar!==";"){decodeResult=entity}else{var decodeResultByReference=references[entity];if(decodeResultByReference){decodeResult=decodeResultByReference}else if(entity[0]==="&"&&entity[1]==="#"){var decodeSecondChar=entity[2];var decodeCode=decodeSecondChar=="x"||decodeSecondChar=="X"?parseInt(entity.substr(3),16):parseInt(entity.substr(2));decodeResult=decodeCode>=1114111?outOfBoundsChar:decodeCode>65535?surrogate_pairs_1.fromCodePoint(decodeCode):fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode]||decodeCode)}}return decodeResult}function decodeEntity(entity,_a){var _b=(_a===void 0?defaultDecodeEntityOptions:_a).level,level=_b===void 0?"all":_b;if(!entity){return""}return getDecodedEntity(entity,allNamedReferences[level].entities,false,false)}exports.decodeEntity=decodeEntity;function decode(text,_a){var _b=_a===void 0?defaultDecodeOptions:_a,_c=_b.level,level=_c===void 0?"all":_c,_d=_b.scope,scope=_d===void 0?level==="xml"?"strict":"body":_d;if(!text){return""}var decodeRegExp=decodeRegExps[level][scope];var references=allNamedReferences[level].entities;var isAttribute=scope==="attribute";var isStrict=scope==="strict";return replaceUsingRegExp(text,decodeRegExp,(function(entity){return getDecodedEntity(entity,references,isAttribute,isStrict)}))}exports.decode=decode; + //# sourceMappingURL=./index.js.map +\ No newline at end of file diff --git a/README.md b/README.md index e9b847cd5..d8c2dec5a 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ - ⚛️ Drop-in replacement for `` component - ⌨️ Live synchronous formatting on every keystroke - ⚡ Fully native experience (selection, spellcheck, autocomplete) +- 🔧 Customizable logic - 🎨 Customizable styles - 🌐 Universal support (Android, iOS, web) - 🏗️ Supports New Architecture @@ -14,15 +15,17 @@ First, install the library from npm with the package manager of your choice: ```sh -yarn add @expensify/react-native-live-markdown -npm install @expensify/react-native-live-markdown --save -npx expo install @expensify/react-native-live-markdown +yarn add @expensify/react-native-live-markdown react-native-reanimated expensify-common +npm install @expensify/react-native-live-markdown react-native-reanimated expensify-common --save +npx expo install @expensify/react-native-live-markdown react-native-reanimated expensify-common ``` +React Native Live Markdown requires [react-native-reanimated](https://github.com/software-mansion/react-native-reanimated) 3.16.3 or newer and [expensify-common](https://github.com/Expensify/expensify-common) 2.0.108 or newer. + Then, install the iOS dependencies with CocoaPods: ```sh -cd ios && pod install +cd ios && bundler install && bundler exec pod install ``` The library includes native code so you will need to re-build the native app. @@ -33,7 +36,7 @@ The library includes native code so you will need to re-build the native app. ## Usage ```tsx -import {MarkdownTextInput} from '@expensify/react-native-live-markdown'; +import {MarkdownTextInput, parseExpensiMark} from '@expensify/react-native-live-markdown'; import React from 'react'; export default function App() { @@ -43,6 +46,7 @@ export default function App() { ); } @@ -118,6 +122,48 @@ The style object can be passed to multiple `MarkdownTextInput` components using > [!TIP] > We recommend to store the style object outside of a component body or memoize the style object with `React.useMemo`. +## Parsing logic + +`MarkdownTextInput` behavior can be customized via `parser` property. Parser is a function that accepts a plaintext string and returns an array of `MarkdownRange` objects: + +```ts +interface MarkdownRange { + type: MarkdownType; + start: number; + length: number; + depth?: number; +} +``` + +Currently, only the following types are supported: + +```ts +type MarkdownType = 'bold' | 'italic' | 'strikethrough' | 'emoji' | 'mention-here' | 'mention-user' | 'mention-report' | 'link' | 'code' | 'pre' | 'blockquote' | 'h1' | 'syntax'; +``` + +Parser needs to be marked as a [worklet](https://docs.swmansion.com/react-native-reanimated/docs/guides/worklets/) because it's executed on the UI thread as the user types. + +Here's a sample function that parses all substrings located between two asterisks as bold text: + +```ts +function parser(input: string) { + 'worklet'; + + const ranges = []; + const regexp = /\*(.*?)\*/g; + let match; + while ((match = regexp.exec(input)) !== null) { + ranges.push({start: match.index, length: 1, type: 'syntax'}); + ranges.push({start: match.index + 1, length: match[1]!.length, type: 'bold'}); + ranges.push({start: match.index + 1 + match[1]!.length, length: 1, type: 'syntax'}); + } + return ranges; +} +``` + +> [!TIP] +> We recommend to store the parser function outside of a component body or memoize the parser function with `React.useMemo`. + ## Markdown flavors support Currently, `react-native-live-markdown` supports only [ExpensiMark](https://github.com/Expensify/expensify-common/blob/main/lib/ExpensiMark.ts) flavor. We are working on CommonMark support as well as possibility to use other Markdown parsers. @@ -126,9 +172,10 @@ Currently, `react-native-live-markdown` supports only [ExpensiMark](https://gith `MarkdownTextInput` inherits all props of React Native's `TextInput` component as well as introduces the following properties: -| Prop | Type | Default | Note | -| --------------- | --------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `markdownStyle` | `MarkdownStyle` | `undefined` | Adds custom styling to Markdown text. The provided value is merged with default style object. See [Styling](https://github.com/expensify/react-native-live-markdown/blob/main/README.md#styling) for more information. | +| Prop | Type | Default | Note | +| --------------- | ------------------------------------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `parser` | `(value: string) => MarkdownRange[]` | `undefined` | A function that parses the current value and returns an array of ranges. | +| `markdownStyle` | `MarkdownStyle` | `undefined` | Adds custom styling to Markdown text. The provided value is merged with default style object. See [Styling](https://github.com/expensify/react-native-live-markdown/blob/main/README.md#styling) for more information. | ## Compatibility diff --git a/RNLiveMarkdown.podspec b/RNLiveMarkdown.podspec index c70a06086..de9baafc1 100644 --- a/RNLiveMarkdown.podspec +++ b/RNLiveMarkdown.podspec @@ -18,11 +18,9 @@ Pod::Spec.new do |s| s.platforms = { :ios => "11.0", :visionos => "1.0" } s.source = { :git => "https://github.com/expensify/react-native-live-markdown.git", :tag => "#{s.version}" } - s.source_files = "apple/**/*.{h,m,mm}" + s.source_files = "apple/**/*.{h,m,mm}", "cpp/**/*.{h,cpp}" - s.resources = "parser/react-native-live-markdown-parser.js" - - s.dependency "hermes-engine" + s.dependency "RNReanimated/worklets" s.xcconfig = { "OTHER_CFLAGS" => "$(inherited) -DREACT_NATIVE_MINOR_VERSION=#{react_native_minor_version}" diff --git a/android/build.gradle b/android/build.gradle index 6aa3061f5..8dc5b7639 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -156,6 +156,9 @@ android { "**/libjsi.so", "**/libreactnativejni.so", "**/libreactnative.so", + "**/libreact_nativemodule_core.so", + "**/libruntimeexecutor.so", + "**/libworklets.so", "**/libreact_render*.so", "**/librrc_root.so", ] @@ -171,6 +174,7 @@ repositories { dependencies { implementation "com.facebook.react:react-android" // version substituted by RNGP implementation "com.facebook.react:hermes-android" // version substituted by RNGP + implementation project(":react-native-reanimated") } if (isNewArchitectureEnabled()) { @@ -180,12 +184,3 @@ if (isNewArchitectureEnabled()) { codegenJavaPackageName = "com.expensify.livemarkdown" } } - -task copyJS(type: Copy) { - from '../parser/react-native-live-markdown-parser.js' - into 'src/main/assets' -} - -tasks.preBuild { - dependsOn copyJS -} diff --git a/android/src/main/cpp/CMakeLists.txt b/android/src/main/cpp/CMakeLists.txt index b314c4ab4..97b42a77e 100644 --- a/android/src/main/cpp/CMakeLists.txt +++ b/android/src/main/cpp/CMakeLists.txt @@ -8,27 +8,35 @@ add_compile_options(-fvisibility=hidden -fexceptions -frtti) string(APPEND CMAKE_CXX_FLAGS " -DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}") -file(GLOB livemarkdown_SRC CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +set(CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../cpp") -add_library(${CMAKE_PROJECT_NAME} SHARED ${livemarkdown_SRC}) +file(GLOB ANDROID_SRC CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +file(GLOB CPP_SRC CONFIGURE_DEPENDS "${CPP_DIR}/*.cpp") -target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +add_library(${CMAKE_PROJECT_NAME} SHARED ${ANDROID_SRC} ${CPP_SRC}) + +target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CPP_DIR}) find_package(fbjni REQUIRED CONFIG) find_package(ReactAndroid REQUIRED CONFIG) -find_package(hermes-engine REQUIRED CONFIG) +find_package(react-native-reanimated REQUIRED CONFIG) target_link_libraries( ${CMAKE_PROJECT_NAME} fbjni::fbjni - hermes-engine::libhermes ReactAndroid::jsi + react-native-reanimated::worklets ) if (ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) target_link_libraries(${CMAKE_PROJECT_NAME} ReactAndroid::reactnative) elseif (ReactAndroid_VERSION_MINOR GREATER_EQUAL 75) - target_link_libraries(${CMAKE_PROJECT_NAME} ReactAndroid::reactnativejni) + target_link_libraries( + ${CMAKE_PROJECT_NAME} + ReactAndroid::react_nativemodule_core + ReactAndroid::reactnativejni + ReactAndroid::runtimeexecutor + ) else () message(FATAL_ERROR "react-native-live-markdown requires react-native 0.75 or newer.") endif () diff --git a/android/src/main/cpp/MarkdownParser.cpp b/android/src/main/cpp/MarkdownParser.cpp new file mode 100644 index 000000000..b645eb48b --- /dev/null +++ b/android/src/main/cpp/MarkdownParser.cpp @@ -0,0 +1,35 @@ +#include "MarkdownParser.h" +#include "MarkdownGlobal.h" + +#include + +using namespace facebook; + +namespace expensify { +namespace livemarkdown { + jni::local_ref MarkdownParser::nativeParse( + jni::alias_ref jThis, + jni::alias_ref text, + const int parserId) { + static std::mutex workletRuntimeMutex; // this needs to be global since the worklet runtime is also global + const auto lock = std::lock_guard(workletRuntimeMutex); + + const auto markdownRuntime = expensify::livemarkdown::getMarkdownRuntime(); + jsi::Runtime &rt = markdownRuntime->getJSIRuntime(); + + const auto markdownWorklet = expensify::livemarkdown::getMarkdownWorklet(parserId); + + const auto input = jsi::String::createFromUtf8(rt, text->toStdString()); + const auto output = markdownRuntime->runGuarded(markdownWorklet, input); + + const auto json = rt.global().getPropertyAsObject(rt, "JSON").getPropertyAsFunction(rt, "stringify").call(rt, output).asString(rt).utf8(rt); + return jni::make_jstring(json); + } + + void MarkdownParser::registerNatives() { + registerHybrid({ + makeNativeMethod("nativeParse", MarkdownParser::nativeParse)}); + } + +} // namespace livemarkdown +} // namespace expensify diff --git a/android/src/main/cpp/MarkdownUtils.h b/android/src/main/cpp/MarkdownParser.h similarity index 59% rename from android/src/main/cpp/MarkdownUtils.h rename to android/src/main/cpp/MarkdownParser.h index eb951bae6..fc3313b54 100644 --- a/android/src/main/cpp/MarkdownUtils.h +++ b/android/src/main/cpp/MarkdownParser.h @@ -15,25 +15,20 @@ using namespace facebook; namespace expensify { namespace livemarkdown { - class MarkdownUtils : public jni::HybridClass, + class MarkdownParser : public jni::HybridClass, public jsi::HostObject { public: static constexpr auto kJavaDescriptor = - "Lcom/expensify/livemarkdown/MarkdownUtils;"; + "Lcom/expensify/livemarkdown/MarkdownParser;"; - static void nativeInitializeRuntime( + static jni::local_ref nativeParse( jni::alias_ref jThis, - jni::alias_ref code); - - static jni::local_ref nativeParseMarkdown( - jni::alias_ref jThis, - jni::alias_ref input); + jni::alias_ref text, + const int parserId); static void registerNatives(); private: - static std::shared_ptr runtime_; - friend HybridBase; }; diff --git a/android/src/main/cpp/MarkdownUtils.cpp b/android/src/main/cpp/MarkdownUtils.cpp deleted file mode 100644 index 63c69a726..000000000 --- a/android/src/main/cpp/MarkdownUtils.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "MarkdownUtils.h" - -#include -#include - -using namespace facebook; - -namespace expensify { -namespace livemarkdown { - std::shared_ptr MarkdownUtils::runtime_; - - void MarkdownUtils::nativeInitializeRuntime( - jni::alias_ref jThis, - jni::alias_ref code) { - assert(runtime_ == nullptr && "Markdown runtime is already initialized"); - runtime_ = facebook::hermes::makeHermesRuntime(); - auto codeBuffer = std::make_shared(code->toStdString()); - runtime_->evaluateJavaScript(codeBuffer, "nativeInitializeRuntime"); - } - - jni::local_ref MarkdownUtils::nativeParseMarkdown( - jni::alias_ref jThis, - jni::alias_ref input) { - jsi::Runtime &rt = *runtime_; - auto func = rt.global().getPropertyAsFunction(rt, "parseExpensiMarkToRanges"); - auto arg = input->toStdString(); - jsi::Value result; - try { - result = func.call(rt, arg); - } catch (jsi::JSError e) { - result = jsi::Array(rt, 0); - } - auto json = rt.global().getPropertyAsObject(rt, "JSON").getPropertyAsFunction(rt, "stringify").call(rt, result).asString(rt).utf8(rt); - return jni::make_jstring(json); - } - - void MarkdownUtils::registerNatives() { - registerHybrid({ - makeNativeMethod("nativeInitializeRuntime", MarkdownUtils::nativeInitializeRuntime), - makeNativeMethod("nativeParseMarkdown", MarkdownUtils::nativeParseMarkdown)}); - } - -} // namespace livemarkdown -} // namespace expensify diff --git a/android/src/main/cpp/OnLoad.cpp b/android/src/main/cpp/OnLoad.cpp index deddae9b0..7daa4a33b 100644 --- a/android/src/main/cpp/OnLoad.cpp +++ b/android/src/main/cpp/OnLoad.cpp @@ -1,8 +1,14 @@ #include -#include "MarkdownUtils.h" +#include "MarkdownParser.h" +#include "RuntimeDecorator.h" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { return facebook::jni::initialize( - vm, [] { expensify::livemarkdown::MarkdownUtils::registerNatives(); }); + vm, [] { expensify::livemarkdown::MarkdownParser::registerNatives(); }); +} + +extern "C" JNIEXPORT void JNICALL Java_com_expensify_livemarkdown_LiveMarkdownModule_injectJSIBindings(JNIEnv *env, jobject thiz, jlong jsiRuntime) { + jsi::Runtime &rt = *reinterpret_cast(jsiRuntime); + expensify::livemarkdown::injectJSIBindings(rt); } diff --git a/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java b/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java index efabbe878..3693ad7d4 100644 --- a/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java +++ b/android/src/main/java/com/expensify/livemarkdown/CustomFabricUIManager.java @@ -13,7 +13,7 @@ public class CustomFabricUIManager { - public static FabricUIManager create(FabricUIManager source, ReadableMap markdownProps) { + public static FabricUIManager create(FabricUIManager source, ReadableMap markdownProps, int parserId) { Class uiManagerClass = source.getClass(); try { @@ -27,7 +27,7 @@ public static FabricUIManager create(FabricUIManager source, ReadableMap markdow FabricUIManager customFabricUIManager = new FabricUIManager(reactContext, viewManagerRegistry, batchEventDispatchedListener); - mountingManagerField.set(customFabricUIManager, new CustomMountingManager(viewManagerRegistry, mountItemExecutor, reactContext, markdownProps)); + mountingManagerField.set(customFabricUIManager, new CustomMountingManager(viewManagerRegistry, mountItemExecutor, reactContext, markdownProps, parserId)); return customFabricUIManager; } catch (NoSuchFieldException | IllegalAccessException e) { diff --git a/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java b/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java index 6718d593a..46c9d27d2 100644 --- a/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java +++ b/android/src/main/java/com/expensify/livemarkdown/CustomMountingManager.java @@ -38,14 +38,12 @@ public CustomMountingManager( @NonNull ViewManagerRegistry viewManagerRegistry, @NonNull MountItemExecutor mountItemExecutor, @NonNull Context context, - @NonNull ReadableMap decoratorProps) { + @NonNull ReadableMap decoratorProps, + int parserId) { super(viewManagerRegistry, mountItemExecutor); - - AssetManager assetManager = context.getAssets(); - MarkdownUtils.maybeInitializeRuntime(assetManager); - - this.markdownUtils = new MarkdownUtils(assetManager); + this.markdownUtils = new MarkdownUtils((ReactContext) context); this.markdownUtils.setMarkdownStyle(new MarkdownStyle(decoratorProps, context)); + this.markdownUtils.setParserId(parserId); } @Override diff --git a/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java b/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java index 80641ce63..5d0ca2d69 100644 --- a/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java +++ b/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownModule.java @@ -4,8 +4,15 @@ import com.facebook.react.fabric.FabricUIManager; import com.facebook.react.uimanager.UIManagerHelper; import com.facebook.react.uimanager.common.UIManagerType; +import com.facebook.soloader.SoLoader; + +import java.util.Objects; public class LiveMarkdownModule extends NativeLiveMarkdownModuleSpec { + static { + SoLoader.loadLibrary("livemarkdown"); + } + private NativeProxy mNativeProxy; public LiveMarkdownModule(ReactApplicationContext reactContext) { super(reactContext); @@ -21,6 +28,11 @@ public boolean install() { mNativeProxy.createCommitHook(uiManager); } + long jsiRuntime = Objects.requireNonNull(getReactApplicationContext().getJavaScriptContextHolder(), "[react-native-live-markdown] JavaScriptContextHolder is null").get(); + injectJSIBindings(jsiRuntime); + return true; } + + private native void injectJSIBindings(long jsiRuntime); } diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownFormatter.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownFormatter.java new file mode 100644 index 000000000..2ef8ccf97 --- /dev/null +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownFormatter.java @@ -0,0 +1,132 @@ +package com.expensify.livemarkdown; + +import android.content.res.AssetManager; +import android.text.SpannableStringBuilder; +import android.text.Spanned; + +import androidx.annotation.NonNull; + +import com.expensify.livemarkdown.spans.*; +import com.facebook.react.views.text.internal.span.CustomLineHeightSpan; +import com.facebook.systrace.Systrace; + +import java.util.List; +import java.util.Objects; + +public class MarkdownFormatter { + private final @NonNull AssetManager mAssetManager; + + public MarkdownFormatter(@NonNull AssetManager assetManager) { + mAssetManager = assetManager; + } + + public void format(@NonNull SpannableStringBuilder ssb, @NonNull List markdownRanges, @NonNull MarkdownStyle markdownStyle) { + try { + Systrace.beginSection(0, "format"); + Objects.requireNonNull(markdownStyle, "mMarkdownStyle is null"); + removeSpans(ssb); + applyRanges(ssb, markdownRanges, markdownStyle); + } finally { + Systrace.endSection(0); + } + } + + private void removeSpans(@NonNull SpannableStringBuilder ssb) { + try { + Systrace.beginSection(0, "removeSpans"); + // We shouldn't use `removeSpans()` because it also removes SpellcheckSpan, SuggestionSpan etc. + MarkdownSpan[] spans = ssb.getSpans(0, ssb.length(), MarkdownSpan.class); + for (MarkdownSpan span : spans) { + ssb.removeSpan(span); + } + } finally { + Systrace.endSection(0); + } + } + + private void applyRanges(@NonNull SpannableStringBuilder ssb, @NonNull List markdownRanges, @NonNull MarkdownStyle markdownStyle) { + try { + Systrace.beginSection(0, "applyRanges"); + for (MarkdownRange markdownRange : markdownRanges) { + applyRange(ssb, markdownRange, markdownStyle); + } + } finally { + Systrace.endSection(0); + } + } + + private void applyRange(@NonNull SpannableStringBuilder ssb, @NonNull MarkdownRange markdownRange, @NonNull MarkdownStyle markdownStyle) { + String type = markdownRange.getType(); + int start = markdownRange.getStart(); + int end = markdownRange.getEnd(); + switch (type) { + case "bold": + setSpan(ssb, new MarkdownBoldSpan(), start, end); + break; + case "italic": + setSpan(ssb, new MarkdownItalicSpan(), start, end); + break; + case "strikethrough": + setSpan(ssb, new MarkdownStrikethroughSpan(), start, end); + break; + case "emoji": + setSpan(ssb, new MarkdownEmojiSpan(markdownStyle.getEmojiFontSize()), start, end); + break; + case "mention-here": + setSpan(ssb, new MarkdownForegroundColorSpan(markdownStyle.getMentionHereColor()), start, end); + setSpan(ssb, new MarkdownBackgroundColorSpan(markdownStyle.getMentionHereBackgroundColor()), start, end); + break; + case "mention-user": + // TODO: change mention color when it mentions current user + setSpan(ssb, new MarkdownForegroundColorSpan(markdownStyle.getMentionUserColor()), start, end); + setSpan(ssb, new MarkdownBackgroundColorSpan(markdownStyle.getMentionUserBackgroundColor()), start, end); + break; + case "mention-report": + setSpan(ssb, new MarkdownForegroundColorSpan(markdownStyle.getMentionReportColor()), start, end); + setSpan(ssb, new MarkdownBackgroundColorSpan(markdownStyle.getMentionReportBackgroundColor()), start, end); + break; + case "syntax": + setSpan(ssb, new MarkdownForegroundColorSpan(markdownStyle.getSyntaxColor()), start, end); + break; + case "link": + setSpan(ssb, new MarkdownUnderlineSpan(), start, end); + setSpan(ssb, new MarkdownForegroundColorSpan(markdownStyle.getLinkColor()), start, end); + break; + case "code": + setSpan(ssb, new MarkdownFontFamilySpan(markdownStyle.getCodeFontFamily(), mAssetManager), start, end); + setSpan(ssb, new MarkdownFontSizeSpan(markdownStyle.getCodeFontSize()), start, end); + setSpan(ssb, new MarkdownForegroundColorSpan(markdownStyle.getCodeColor()), start, end); + setSpan(ssb, new MarkdownBackgroundColorSpan(markdownStyle.getCodeBackgroundColor()), start, end); + break; + case "pre": + setSpan(ssb, new MarkdownFontFamilySpan(markdownStyle.getPreFontFamily(), mAssetManager), start, end); + setSpan(ssb, new MarkdownFontSizeSpan(markdownStyle.getPreFontSize()), start, end); + setSpan(ssb, new MarkdownForegroundColorSpan(markdownStyle.getPreColor()), start, end); + setSpan(ssb, new MarkdownBackgroundColorSpan(markdownStyle.getPreBackgroundColor()), start, end); + break; + case "h1": + setSpan(ssb, new MarkdownBoldSpan(), start, end); + CustomLineHeightSpan[] spans = ssb.getSpans(0, ssb.length(), CustomLineHeightSpan.class); + if (spans.length >= 1) { + int lineHeight = spans[0].getLineHeight(); + setSpan(ssb, new MarkdownLineHeightSpan(lineHeight * 1.5f), start, end); + } + // NOTE: size span must be set after line height span to avoid height jumps + setSpan(ssb, new MarkdownFontSizeSpan(markdownStyle.getH1FontSize()), start, end); + break; + case "blockquote": + MarkdownBlockquoteSpan span = new MarkdownBlockquoteSpan( + markdownStyle.getBlockquoteBorderColor(), + markdownStyle.getBlockquoteBorderWidth(), + markdownStyle.getBlockquoteMarginLeft(), + markdownStyle.getBlockquotePaddingLeft(), + markdownRange.getDepth()); + setSpan(ssb, span, start, end); + break; + } + } + + private void setSpan(@NonNull SpannableStringBuilder ssb, @NonNull MarkdownSpan span, int start, int end) { + ssb.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } +} diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownParser.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownParser.java new file mode 100644 index 000000000..3e108db70 --- /dev/null +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownParser.java @@ -0,0 +1,89 @@ +package com.expensify.livemarkdown; + +import androidx.annotation.NonNull; + +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.util.RNLog; +import com.facebook.soloader.SoLoader; +import com.facebook.systrace.Systrace; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +public class MarkdownParser { + static { + SoLoader.loadLibrary("livemarkdown"); + } + + private final @NonNull ReactContext mReactContext; + private String mPrevText; + private int mPrevParserId; + private List mPrevMarkdownRanges; + + public MarkdownParser(@NonNull ReactContext reactContext) { + mReactContext = reactContext; + } + + private native String nativeParse(@NonNull String text, int parserId); + + public synchronized List parse(@NonNull String text, int parserId) { + try { + Systrace.beginSection(0, "parse"); + + if (text.equals(mPrevText) && parserId == mPrevParserId) { + return mPrevMarkdownRanges; + } + + String json; + try { + Systrace.beginSection(0, "nativeParse"); + json = nativeParse(text, parserId); + } catch (Exception e) { + // Skip formatting, runGuarded will show the error in LogBox + mPrevText = text; + mPrevParserId = parserId; + mPrevMarkdownRanges = Collections.emptyList(); + return mPrevMarkdownRanges; + } finally { + Systrace.endSection(0); + } + + List markdownRanges = new LinkedList<>(); + try { + Systrace.beginSection(0, "markdownRanges"); + JSONArray ranges = new JSONArray(json); + for (int i = 0; i < ranges.length(); i++) { + JSONObject range = ranges.getJSONObject(i); + String type = range.getString("type"); + int start = range.getInt("start"); + int length = range.getInt("length"); + int depth = range.optInt("depth", 1); + if (length == 0 || start + length > text.length()) { + continue; + } + markdownRanges.add(new MarkdownRange(type, start, length, depth)); + } + } catch (JSONException e) { + RNLog.w(mReactContext, "[react-native-live-markdown] Incorrect schema of worklet parser output: " + e.getMessage()); + mPrevText = text; + mPrevParserId = parserId; + mPrevMarkdownRanges = Collections.emptyList(); + return mPrevMarkdownRanges; + } finally { + Systrace.endSection(0); + } + + mPrevText = text; + mPrevParserId = parserId; + mPrevMarkdownRanges = markdownRanges; + return mPrevMarkdownRanges; + } finally { + Systrace.endSection(0); + } + } +} diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownRange.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownRange.java new file mode 100644 index 000000000..1fda115b9 --- /dev/null +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownRange.java @@ -0,0 +1,39 @@ +package com.expensify.livemarkdown; + +import androidx.annotation.NonNull; + +public class MarkdownRange { + private final @NonNull String mType; + private final int mStart; + private final int mEnd; + private final int mLength; + private final int mDepth; + + public MarkdownRange(@NonNull String type, int start, int length, int depth) { + mType = type; + mStart = start; + mEnd = start + length; + mLength = length; + mDepth = depth; + } + + public String getType() { + return mType; + } + + public int getStart() { + return mStart; + } + + public int getEnd() { + return mEnd; + } + + public int getLength() { + return mLength; + } + + public int getDepth() { + return mDepth; + } +} diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java index cf691e62a..50606f982 100644 --- a/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java @@ -32,6 +32,7 @@ public class MarkdownStyle { private final float mBlockquotePaddingLeft; + @NonNull private final String mCodeFontFamily; private final float mCodeFontSize; @@ -42,6 +43,7 @@ public class MarkdownStyle { @ColorInt private final int mCodeBackgroundColor; + @NonNull private final String mPreFontFamily; private final float mPreFontSize; diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java index 99512ce2b..6bd1a68fe 100644 --- a/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java @@ -11,6 +11,7 @@ import android.view.ViewGroup; import android.view.ViewParent; +import com.facebook.react.bridge.ReactContext; import com.facebook.react.views.textinput.ReactEditText; public class MarkdownTextInputDecoratorView extends View { @@ -29,6 +30,8 @@ public MarkdownTextInputDecoratorView(Context context, @Nullable AttributeSet at private MarkdownStyle mMarkdownStyle; + private int mParserId; + private MarkdownUtils mMarkdownUtils; private ReactEditText mReactEditText; @@ -52,10 +55,9 @@ protected void onAttachedToWindow() { } if (previousSibling instanceof ReactEditText) { - AssetManager assetManager = getContext().getAssets(); - MarkdownUtils.maybeInitializeRuntime(assetManager); - mMarkdownUtils = new MarkdownUtils(assetManager); + mMarkdownUtils = new MarkdownUtils((ReactContext) getContext()); mMarkdownUtils.setMarkdownStyle(mMarkdownStyle); + mMarkdownUtils.setParserId(mParserId); mReactEditText = (ReactEditText) previousSibling; mTextWatcher = new MarkdownTextWatcher(mMarkdownUtils); mReactEditText.addTextChangedListener(mTextWatcher); @@ -78,6 +80,18 @@ protected void setMarkdownStyle(MarkdownStyle markdownStyle) { if (mMarkdownUtils != null) { mMarkdownUtils.setMarkdownStyle(mMarkdownStyle); } + applyNewStyles(); + } + + protected void setParserId(int parserId) { + mParserId = parserId; + if (mMarkdownUtils != null) { + mMarkdownUtils.setParserId(mParserId); + } + applyNewStyles(); + } + + protected void applyNewStyles() { if (mReactEditText != null) { int selectionStart = mReactEditText.getSelectionStart(); int selectionEnd = mReactEditText.getSelectionEnd(); diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java index c86ccd5d4..f10f1f577 100644 --- a/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java @@ -28,4 +28,10 @@ public void setMarkdownStyle(@NonNull MarkdownTextInputDecoratorView view, @NonN MarkdownStyle markdownStyle = new MarkdownStyle(value, view.getContext()); view.setMarkdownStyle(markdownStyle); } + + @Override + @ReactProp(name = "parserId") + public void setParserId(@NonNull MarkdownTextInputDecoratorView view, int parserId) { + view.setParserId(parserId); + } } diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java index 23b215a23..d182be1fd 100644 --- a/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java @@ -7,7 +7,7 @@ import androidx.annotation.NonNull; public class MarkdownTextWatcher implements TextWatcher { - private final MarkdownUtils mMarkdownUtils; + private final @NonNull MarkdownUtils mMarkdownUtils; public MarkdownTextWatcher(@NonNull MarkdownUtils markdownUtils) { mMarkdownUtils = markdownUtils; @@ -25,8 +25,8 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { @Override public void afterTextChanged(Editable editable) { - if (editable instanceof SpannableStringBuilder) { - mMarkdownUtils.applyMarkdownFormatting((SpannableStringBuilder) editable); + if (editable instanceof SpannableStringBuilder ssb) { + mMarkdownUtils.applyMarkdownFormatting(ssb); } } } diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java index e51aa4b4c..6877e46f9 100644 --- a/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java @@ -1,182 +1,42 @@ package com.expensify.livemarkdown; -import android.content.res.AssetManager; import android.text.SpannableStringBuilder; -import android.text.Spanned; import androidx.annotation.NonNull; -import com.expensify.livemarkdown.spans.*; -import com.facebook.react.views.text.internal.span.CustomLineHeightSpan; -import com.facebook.soloader.SoLoader; +import com.facebook.react.bridge.ReactContext; +import com.facebook.systrace.Systrace; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Objects; +import java.util.List; public class MarkdownUtils { - static { - SoLoader.loadLibrary("livemarkdown"); - } - - private static boolean IS_RUNTIME_INITIALIZED = false; - - public static synchronized void maybeInitializeRuntime(AssetManager assetManager) { - if (IS_RUNTIME_INITIALIZED) { - return; - } - try { - InputStream inputStream = assetManager.open("react-native-live-markdown-parser.js"); - byte[] buffer = new byte[inputStream.available()]; - inputStream.read(buffer); - inputStream.close(); - String code = new String(buffer); - nativeInitializeRuntime(code); - IS_RUNTIME_INITIALIZED = true; - } catch (IOException e) { - throw new RuntimeException("Failed to initialize Markdown runtime"); - } + public MarkdownUtils(@NonNull ReactContext reactContext) { + mMarkdownParser = new MarkdownParser(reactContext); + mMarkdownFormatter = new MarkdownFormatter(reactContext.getAssets()); } - private static native void nativeInitializeRuntime(String code); - - private synchronized static String parseMarkdown(String input) { - return nativeParseMarkdown(input); - } - - private static native String nativeParseMarkdown(String input); - - public MarkdownUtils(@NonNull AssetManager assetManager) { - mAssetManager = assetManager; - } - - private final @NonNull AssetManager mAssetManager; - - private String mPrevInput; - - private String mPrevOutput; + private final @NonNull MarkdownParser mMarkdownParser; + private final @NonNull MarkdownFormatter mMarkdownFormatter; private MarkdownStyle mMarkdownStyle; + private int mParserId; public void setMarkdownStyle(@NonNull MarkdownStyle markdownStyle) { mMarkdownStyle = markdownStyle; } - public void applyMarkdownFormatting(SpannableStringBuilder ssb) { - Objects.requireNonNull(mMarkdownStyle, "mMarkdownStyle is null"); - - removeSpans(ssb); - - String input = ssb.toString(); - String output; - if (input.equals(mPrevInput)) { - output = mPrevOutput; - } else { - output = parseMarkdown(input); - mPrevInput = input; - mPrevOutput = output; - } - - try { - JSONArray ranges = new JSONArray(output); - for (int i = 0; i < ranges.length(); i++) { - JSONObject range = ranges.getJSONObject(i); - String type = range.getString("type"); - int start = range.getInt("start"); - int length = range.getInt("length"); - int depth = range.optInt("depth", 1); - int end = start + length; - if (length == 0 || end > input.length()) { - continue; - } - applyRange(ssb, type, start, end, depth); - } - } catch (JSONException e) { - // Do nothing - } + public void setParserId(int parserId) { + mParserId = parserId; } - private void applyRange(SpannableStringBuilder ssb, String type, int start, int end, int depth) { - switch (type) { - case "bold": - setSpan(ssb, new MarkdownBoldSpan(), start, end); - break; - case "italic": - setSpan(ssb, new MarkdownItalicSpan(), start, end); - break; - case "strikethrough": - setSpan(ssb, new MarkdownStrikethroughSpan(), start, end); - break; - case "emoji": - setSpan(ssb, new MarkdownEmojiSpan(mMarkdownStyle.getEmojiFontSize()), start, end); - break; - case "mention-here": - setSpan(ssb, new MarkdownForegroundColorSpan(mMarkdownStyle.getMentionHereColor()), start, end); - setSpan(ssb, new MarkdownBackgroundColorSpan(mMarkdownStyle.getMentionHereBackgroundColor()), start, end); - break; - case "mention-user": - // TODO: change mention color when it mentions current user - setSpan(ssb, new MarkdownForegroundColorSpan(mMarkdownStyle.getMentionUserColor()), start, end); - setSpan(ssb, new MarkdownBackgroundColorSpan(mMarkdownStyle.getMentionUserBackgroundColor()), start, end); - break; - case "mention-report": - setSpan(ssb, new MarkdownForegroundColorSpan(mMarkdownStyle.getMentionReportColor()), start, end); - setSpan(ssb, new MarkdownBackgroundColorSpan(mMarkdownStyle.getMentionReportBackgroundColor()), start, end); - break; - case "syntax": - setSpan(ssb, new MarkdownForegroundColorSpan(mMarkdownStyle.getSyntaxColor()), start, end); - break; - case "link": - setSpan(ssb, new MarkdownUnderlineSpan(), start, end); - setSpan(ssb, new MarkdownForegroundColorSpan(mMarkdownStyle.getLinkColor()), start, end); - break; - case "code": - setSpan(ssb, new MarkdownFontFamilySpan(mMarkdownStyle.getCodeFontFamily(), mAssetManager), start, end); - setSpan(ssb, new MarkdownFontSizeSpan(mMarkdownStyle.getCodeFontSize()), start, end); - setSpan(ssb, new MarkdownForegroundColorSpan(mMarkdownStyle.getCodeColor()), start, end); - setSpan(ssb, new MarkdownBackgroundColorSpan(mMarkdownStyle.getCodeBackgroundColor()), start, end); - break; - case "pre": - setSpan(ssb, new MarkdownFontFamilySpan(mMarkdownStyle.getPreFontFamily(), mAssetManager), start, end); - setSpan(ssb, new MarkdownFontSizeSpan(mMarkdownStyle.getPreFontSize()), start, end); - setSpan(ssb, new MarkdownForegroundColorSpan(mMarkdownStyle.getPreColor()), start, end); - setSpan(ssb, new MarkdownBackgroundColorSpan(mMarkdownStyle.getPreBackgroundColor()), start, end); - break; - case "h1": - setSpan(ssb, new MarkdownBoldSpan(), start, end); - CustomLineHeightSpan[] spans = ssb.getSpans(0, ssb.length(), CustomLineHeightSpan.class); - if (spans.length >= 1) { - int lineHeight = spans[0].getLineHeight(); - setSpan(ssb, new MarkdownLineHeightSpan(lineHeight * 1.5f), start, end); - } - // NOTE: size span must be set after line height span to avoid height jumps - setSpan(ssb, new MarkdownFontSizeSpan(mMarkdownStyle.getH1FontSize()), start, end); - break; - case "blockquote": - MarkdownBlockquoteSpan span = new MarkdownBlockquoteSpan( - mMarkdownStyle.getBlockquoteBorderColor(), - mMarkdownStyle.getBlockquoteBorderWidth(), - mMarkdownStyle.getBlockquoteMarginLeft(), - mMarkdownStyle.getBlockquotePaddingLeft(), - depth); - setSpan(ssb, span, start, end); - break; - } - } - - private void setSpan(SpannableStringBuilder ssb, MarkdownSpan span, int start, int end) { - ssb.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - - private void removeSpans(SpannableStringBuilder ssb) { - // We shouldn't use `removeSpans()` because it also removes SpellcheckSpan, SuggestionSpan etc. - MarkdownSpan[] spans = ssb.getSpans(0, ssb.length(), MarkdownSpan.class); - for (MarkdownSpan span : spans) { - ssb.removeSpan(span); + public void applyMarkdownFormatting(SpannableStringBuilder ssb) { + try { + Systrace.beginSection(0, "applyMarkdownFormatting"); + String text = ssb.toString(); + List markdownRanges = mMarkdownParser.parse(text, mParserId); + mMarkdownFormatter.format(ssb, markdownRanges, mMarkdownStyle); + } finally { + Systrace.endSection(0); } } } diff --git a/android/src/main/new_arch/MarkdownCommitHook.cpp b/android/src/main/new_arch/MarkdownCommitHook.cpp index 78b10e483..0e996bed2 100644 --- a/android/src/main/new_arch/MarkdownCommitHook.cpp +++ b/android/src/main/new_arch/MarkdownCommitHook.cpp @@ -135,7 +135,8 @@ RootShadowNode::Unshared MarkdownCommitHook::shadowTreeWillCommit( const auto currentDecoratorProps = nodes.decorator->getProps()->rawProps["markdownStyle"]; - + const auto currentParserId = + nodes.decorator->getProps()->rawProps["parserId"].asInt(); // if it's the first time we encounter this particular input or the // markdown styles have changed (in which case we need to reset the // cpp cache, to which we don't have a direct access), create a new @@ -143,13 +144,14 @@ RootShadowNode::Unshared MarkdownCommitHook::shadowTreeWillCommit( // for this particular input if (!textLayoutManagers_.contains(nodes.textInput->getTag()) || previousDecoratorProps_[nodes.textInput->getTag()] != - currentDecoratorProps) { + currentDecoratorProps || + previousParserId_[nodes.textInput->getTag()] != currentParserId) { static auto customUIManagerClass = jni::findClassStatic( "com/expensify/livemarkdown/CustomFabricUIManager"); static auto createCustomUIManager = customUIManagerClass ->getStaticMethod( + JFabricUIManager::javaobject, ReadableMap::javaobject, int)>( "create"); auto const decoratorPropsRNM = @@ -160,7 +162,7 @@ RootShadowNode::Unshared MarkdownCommitHook::shadowTreeWillCommit( const auto customUIManager = jni::make_global(createCustomUIManager( customUIManagerClass, fabricUIManager_.get(), - decoratorPropsRM.get())); + decoratorPropsRM.get(), currentParserId)); const ContextContainer::Shared contextContainer = std::make_shared(); contextContainer->insert("FabricUIManager", customUIManager); @@ -168,6 +170,7 @@ RootShadowNode::Unshared MarkdownCommitHook::shadowTreeWillCommit( std::make_shared(contextContainer); previousDecoratorProps_[nodes.textInput->getTag()] = currentDecoratorProps; + previousParserId_[nodes.textInput->getTag()] = currentParserId; } // we need to replace the TextLayoutManager every time to make sure diff --git a/android/src/main/new_arch/MarkdownCommitHook.h b/android/src/main/new_arch/MarkdownCommitHook.h index f14e789cb..ea86e6e73 100644 --- a/android/src/main/new_arch/MarkdownCommitHook.h +++ b/android/src/main/new_arch/MarkdownCommitHook.h @@ -47,6 +47,8 @@ class MarkdownCommitHook : public UIManagerCommitHook { textLayoutManagers_; std::unordered_map previousDecoratorProps_; + std::unordered_map + previousParserId_; std::unordered_map previousEventCount_; }; diff --git a/android/src/newarch/LiveMarkdownModuleSpec.java b/android/src/newarch/LiveMarkdownModuleSpec.java new file mode 100644 index 000000000..41e499ac1 --- /dev/null +++ b/android/src/newarch/LiveMarkdownModuleSpec.java @@ -0,0 +1,9 @@ +package com.expensify.livemarkdown; + +import com.facebook.react.bridge.ReactApplicationContext; + +abstract class LiveMarkdownModuleSpec extends NativeLiveMarkdownModuleSpec { + LiveMarkdownModuleSpec(ReactApplicationContext context) { + super(context); + } +} diff --git a/android/src/oldarch/LiveMarkdownModuleSpec.java b/android/src/oldarch/LiveMarkdownModuleSpec.java new file mode 100644 index 000000000..1a0b682b0 --- /dev/null +++ b/android/src/oldarch/LiveMarkdownModuleSpec.java @@ -0,0 +1,12 @@ +package com.expensify.livemarkdown; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; + +abstract class LiveMarkdownModuleSpec extends ReactContextBaseJavaModule { + LiveMarkdownModuleSpec(ReactApplicationContext context) { + super(context); + } + + public abstract boolean install(); +} diff --git a/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java b/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java index 48306ffae..7b1caca6c 100644 --- a/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java +++ b/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java @@ -7,4 +7,5 @@ public abstract class MarkdownTextInputDecoratorViewManagerSpec extends SimpleViewManager { public abstract void setMarkdownStyle(T view, ReadableMap value); + public abstract void setParserId(T view, int value); } diff --git a/apple/LiveMarkdownModule.h b/apple/LiveMarkdownModule.h new file mode 100644 index 000000000..42fbb1e22 --- /dev/null +++ b/apple/LiveMarkdownModule.h @@ -0,0 +1,16 @@ +#ifdef RCT_NEW_ARCH_ENABLED +#import +#else +#import +#endif // RCT_NEW_ARCH_ENABLED + +#import + +// Without inheriting after RCTEventEmitter we don't get access to bridge +@interface LiveMarkdownModule : RCTEventEmitter +#ifdef RCT_NEW_ARCH_ENABLED + +#else + +#endif // RCT_NEW_ARCH_ENABLED +@end diff --git a/apple/RCTLiveMarkdownModule.mm b/apple/LiveMarkdownModule.mm similarity index 67% rename from apple/RCTLiveMarkdownModule.mm rename to apple/LiveMarkdownModule.mm index 53e917851..ec18df739 100644 --- a/apple/RCTLiveMarkdownModule.mm +++ b/apple/LiveMarkdownModule.mm @@ -1,40 +1,55 @@ +#import "LiveMarkdownModule.h" + +#import + #ifdef RCT_NEW_ARCH_ENABLED +#import +#endif // RCT_NEW_ARCH_ENABLED +#import + +#ifdef RCT_NEW_ARCH_ENABLED #import #import +#endif // RCT_NEW_ARCH_ENABLED -#import "MarkdownCommitHook.h" -#import "MarkdownShadowFamilyRegistry.h" -#import "RCTLiveMarkdownModule.h" +#import +using namespace facebook; using namespace expensify::livemarkdown; // A turbomodule used to register the commit hook // I think this is the easiest way to access the UIManager, which we need to // actually register the hook -@implementation RCTLiveMarkdownModule { - BOOL installed_; +@implementation LiveMarkdownModule { +#ifdef RCT_NEW_ARCH_ENABLED std::shared_ptr commitHook_; __weak RCTSurfacePresenter *surfacePresenter_; +#endif // RCT_NEW_ARCH_ENABLED } -RCT_EXPORT_MODULE(@"LiveMarkdownModule") +RCT_EXPORT_MODULE() -- (NSNumber *)install { - if (!installed_ && surfacePresenter_ != nil) { - RCTScheduler *scheduler = [surfacePresenter_ scheduler]; +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) +{ + RCTCxxBridge *cxxBridge = (RCTCxxBridge *)self.bridge; + jsi::Runtime &rt = *(jsi::Runtime *)cxxBridge.runtime; + expensify::livemarkdown::injectJSIBindings(rt); - commitHook_ = std::make_shared(scheduler.uiManager); - installed_ = YES; - } - return @1; +#ifdef RCT_NEW_ARCH_ENABLED + RCTScheduler *scheduler = [surfacePresenter_ scheduler]; + commitHook_ = std::make_shared(scheduler.uiManager); +#endif // RCT_NEW_ARCH_ENABLED + + return @(1); } +#ifdef RCT_NEW_ARCH_ENABLED + - (void)handleJavaScriptDidLoadNotification:(NSNotification *)notification { surfacePresenter_ = self.bridge.surfacePresenter; - [self install]; } - (void)setBridge:(RCTBridge *)bridge @@ -62,7 +77,6 @@ - (void)setSurfacePresenter:(id)surfacePresenter surfacePresenter_ = surfacePresenter; } - - (std::shared_ptr)getTurboModule: (const facebook::react::ObjCTurboModule::InitParams &)params { return std::make_shared( @@ -75,6 +89,6 @@ - (void)invalidate { [super invalidate]; } -@end - #endif // RCT_NEW_ARCH_ENABLED + +@end diff --git a/apple/MarkdownCommitHook.mm b/apple/MarkdownCommitHook.mm index 85040b016..f98f12194 100644 --- a/apple/MarkdownCommitHook.mm +++ b/apple/MarkdownCommitHook.mm @@ -158,6 +158,7 @@ usedUtils = MarkdownCommitHook::getOrCreateMarkdownUtils(*nodes.decorator); [usedUtils setMarkdownStyle:markdownStyle]; + [usedUtils setParserId:@(markdownProps.parserId)]; // convert the attibuted string stored in state to // NSAttributedString @@ -236,6 +237,7 @@ usedUtils = MarkdownCommitHook::getOrCreateMarkdownUtils(*nodes.decorator); [usedUtils setMarkdownStyle:markdownStyle]; + [usedUtils setParserId:@(markdownProps.parserId)]; // convert the attibuted string stored in state to // NSAttributedString diff --git a/apple/MarkdownFormatter.h b/apple/MarkdownFormatter.h new file mode 100644 index 000000000..1f5b1a2e1 --- /dev/null +++ b/apple/MarkdownFormatter.h @@ -0,0 +1,18 @@ +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +const NSAttributedStringKey RCTLiveMarkdownBlockquoteDepthAttributeName = @"RCTLiveMarkdownBlockquoteDepth"; + +@interface MarkdownFormatter : NSObject + +- (nonnull NSAttributedString *)format:(nonnull NSString *)text + withAttributes:(nullable NSDictionary*)attributes + withMarkdownRanges:(nonnull NSArray *)markdownRanges + withMarkdownStyle:(nonnull RCTMarkdownStyle *)markdownStyle; + +NS_ASSUME_NONNULL_END + +@end diff --git a/apple/MarkdownFormatter.mm b/apple/MarkdownFormatter.mm new file mode 100644 index 000000000..642b487bb --- /dev/null +++ b/apple/MarkdownFormatter.mm @@ -0,0 +1,158 @@ +#import "MarkdownFormatter.h" +#import + +@implementation MarkdownFormatter + +- (nonnull NSAttributedString *)format:(nonnull NSString *)text + withAttributes:(nullable NSDictionary *)attributes + withMarkdownRanges:(nonnull NSArray *)markdownRanges + withMarkdownStyle:(nonnull RCTMarkdownStyle *)markdownStyle +{ + NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:text attributes:attributes]; + + [attributedString beginEditing]; + + // If the attributed string ends with underlined text, blurring the single-line input imprints the underline style across the whole string. + // It looks like a bug in iOS, as there is no underline style to be found in the attributed string, especially after formatting. + // This is a workaround that applies the NSUnderlineStyleNone to the string before iterating over ranges which resolves this problem. + [attributedString addAttribute:NSUnderlineStyleAttributeName + value:[NSNumber numberWithInteger:NSUnderlineStyleNone] + range:NSMakeRange(0, attributedString.length)]; + + for (MarkdownRange *markdownRange in markdownRanges) { + [self applyRangeToAttributedString:attributedString + type:std::string([markdownRange.type UTF8String]) + range:markdownRange.range + depth:markdownRange.depth + markdownStyle:markdownStyle]; + } + + RCTApplyBaselineOffset(attributedString); + + [attributedString endEditing]; + + return attributedString; +} + +- (void)applyRangeToAttributedString:(NSMutableAttributedString *)attributedString + type:(const std::string)type + range:(const NSRange)range + depth:(const int)depth + markdownStyle:(nonnull RCTMarkdownStyle *)markdownStyle { + if (type == "bold" || type == "italic" || type == "code" || type == "pre" || type == "h1" || type == "emoji") { + UIFont *font = [attributedString attribute:NSFontAttributeName atIndex:range.location effectiveRange:NULL]; + if (type == "bold") { + font = [RCTFont updateFont:font withWeight:@"bold"]; + } else if (type == "italic") { + font = [RCTFont updateFont:font withStyle:@"italic"]; + } else if (type == "code") { + font = [RCTFont updateFont:font withFamily:markdownStyle.codeFontFamily + size:[NSNumber numberWithFloat:markdownStyle.codeFontSize] + weight:nil + style:nil + variant:nil + scaleMultiplier:0]; + } else if (type == "pre") { + font = [RCTFont updateFont:font withFamily:markdownStyle.preFontFamily + size:[NSNumber numberWithFloat:markdownStyle.preFontSize] + weight:nil + style:nil + variant:nil + scaleMultiplier:0]; + } else if (type == "h1") { + font = [RCTFont updateFont:font withFamily:nil + size:[NSNumber numberWithFloat:markdownStyle.h1FontSize] + weight:@"bold" + style:nil + variant:nil + scaleMultiplier:0]; + } else if (type == "emoji") { + font = [RCTFont updateFont:font withFamily:nil + size:[NSNumber numberWithFloat:markdownStyle.emojiFontSize] + weight:nil + style:nil + variant:nil + scaleMultiplier:0]; + } + [attributedString addAttribute:NSFontAttributeName value:font range:range]; + } + + if (type == "syntax") { + [attributedString addAttribute:NSForegroundColorAttributeName value:markdownStyle.syntaxColor range:range]; + } else if (type == "strikethrough") { + [attributedString addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:range]; + } else if (type == "code") { + [attributedString addAttribute:NSForegroundColorAttributeName value:markdownStyle.codeColor range:range]; + [attributedString addAttribute:NSBackgroundColorAttributeName value:markdownStyle.codeBackgroundColor range:range]; + } else if (type == "mention-here") { + [attributedString addAttribute:NSForegroundColorAttributeName value:markdownStyle.mentionHereColor range:range]; + [attributedString addAttribute:NSBackgroundColorAttributeName value:markdownStyle.mentionHereBackgroundColor range:range]; + } else if (type == "mention-user") { + // TODO: change mention color when it mentions current user + [attributedString addAttribute:NSForegroundColorAttributeName value:markdownStyle.mentionUserColor range:range]; + [attributedString addAttribute:NSBackgroundColorAttributeName value:markdownStyle.mentionUserBackgroundColor range:range]; + } else if (type == "mention-report") { + [attributedString addAttribute:NSForegroundColorAttributeName value:markdownStyle.mentionReportColor range:range]; + [attributedString addAttribute:NSBackgroundColorAttributeName value:markdownStyle.mentionReportBackgroundColor range:range]; + } else if (type == "link") { + [attributedString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:range]; + [attributedString addAttribute:NSForegroundColorAttributeName value:markdownStyle.linkColor range:range]; + } else if (type == "blockquote") { + CGFloat indent = (markdownStyle.blockquoteMarginLeft + markdownStyle.blockquoteBorderWidth + markdownStyle.blockquotePaddingLeft) * depth; + NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; + paragraphStyle.firstLineHeadIndent = indent; + paragraphStyle.headIndent = indent; + [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:range]; + [attributedString addAttribute:RCTLiveMarkdownBlockquoteDepthAttributeName value:@(depth) range:range]; + } else if (type == "pre") { + [attributedString addAttribute:NSForegroundColorAttributeName value:markdownStyle.preColor range:range]; + NSRange rangeForBackground = [[attributedString string] characterAtIndex:range.location] == '\n' ? NSMakeRange(range.location + 1, range.length - 1) : range; + [attributedString addAttribute:NSBackgroundColorAttributeName value:markdownStyle.preBackgroundColor range:rangeForBackground]; + // TODO: pass background color and ranges to layout manager + } +} + +static void RCTApplyBaselineOffset(NSMutableAttributedString *attributedText) +{ + __block CGFloat maximumLineHeight = 0; + + [attributedText enumerateAttribute:NSParagraphStyleAttributeName + inRange:NSMakeRange(0, attributedText.length) + options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired + usingBlock:^(NSParagraphStyle *paragraphStyle, __unused NSRange range, __unused BOOL *stop) { + if (!paragraphStyle) { + return; + } + + maximumLineHeight = MAX(paragraphStyle.maximumLineHeight, maximumLineHeight); + }]; + + if (maximumLineHeight == 0) { + // `lineHeight` was not specified, nothing to do. + return; + } + + __block CGFloat maximumFontLineHeight = 0; + + [attributedText enumerateAttribute:NSFontAttributeName + inRange:NSMakeRange(0, attributedText.length) + options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired + usingBlock:^(UIFont *font, NSRange range, __unused BOOL *stop) { + if (!font) { + return; + } + + maximumFontLineHeight = MAX(font.lineHeight, maximumFontLineHeight); + }]; + + if (maximumLineHeight < maximumFontLineHeight) { + return; + } + + CGFloat baseLineOffset = (maximumLineHeight - maximumFontLineHeight) / 2.0; + [attributedText addAttribute:NSBaselineOffsetAttributeName + value:@(baseLineOffset) + range:NSMakeRange(0, attributedText.length)]; +} + +@end diff --git a/apple/MarkdownLayoutManager.h b/apple/MarkdownLayoutManager.h index 29be3508d..9e965e113 100644 --- a/apple/MarkdownLayoutManager.h +++ b/apple/MarkdownLayoutManager.h @@ -1,5 +1,6 @@ #import #import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/apple/MarkdownLayoutManager.mm b/apple/MarkdownLayoutManager.mm index 3974ba98c..4ea7da64d 100644 --- a/apple/MarkdownLayoutManager.mm +++ b/apple/MarkdownLayoutManager.mm @@ -5,34 +5,27 @@ @implementation MarkdownLayoutManager - (void)drawBackgroundForGlyphRange:(NSRange)glyphsToShow atPoint:(CGPoint)origin { [super drawBackgroundForGlyphRange:glyphsToShow atPoint:origin]; + NSTextStorage *textStorage = self.textStorage; + [self enumerateLineFragmentsForGlyphRange:glyphsToShow usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer * _Nonnull textContainer, NSRange glyphRange, BOOL * _Nonnull stop) { - __block BOOL isBlockquote = NO; - __block int currentDepth = 0; + NSNumber *depth = [textStorage attribute:RCTLiveMarkdownBlockquoteDepthAttributeName atIndex:glyphRange.location effectiveRange:nil]; + if (depth == nil) { + return; // not a blockquote + } + RCTMarkdownUtils *markdownUtils = [self valueForKey:@"markdownUtils"]; - [markdownUtils.blockquoteRangesAndLevels enumerateObjectsUsingBlock:^(NSDictionary *item, NSUInteger idx, BOOL * _Nonnull stop) { - NSRange range = [[item valueForKey:@"range"] rangeValue]; - currentDepth = [[item valueForKey:@"depth"] unsignedIntegerValue]; - NSUInteger start = range.location; - NSUInteger end = start + range.length; - NSUInteger location = glyphRange.location; - if (location >= start && location < end) { - isBlockquote = YES; - *stop = YES; - } - }]; - if (isBlockquote) { - CGFloat paddingLeft = origin.x; - CGFloat paddingTop = origin.y; - CGFloat y = paddingTop + rect.origin.y; - CGFloat width = markdownUtils.markdownStyle.blockquoteBorderWidth; - CGFloat height = rect.size.height; - CGFloat shift = markdownUtils.markdownStyle.blockquoteMarginLeft + markdownUtils.markdownStyle.blockquoteBorderWidth + markdownUtils.markdownStyle.blockquotePaddingLeft; - for (int level = 0; level < currentDepth; level++) { - CGFloat x = paddingLeft + (level * shift) + markdownUtils.markdownStyle.blockquoteMarginLeft; - CGRect lineRect = CGRectMake(x, y, width, height); - [markdownUtils.markdownStyle.blockquoteBorderColor setFill]; - UIRectFill(lineRect); - } + CGFloat paddingLeft = origin.x; + CGFloat paddingTop = origin.y; + CGFloat y = paddingTop + rect.origin.y; + CGFloat width = markdownUtils.markdownStyle.blockquoteBorderWidth; + CGFloat height = rect.size.height; + CGFloat shift = markdownUtils.markdownStyle.blockquoteMarginLeft + markdownUtils.markdownStyle.blockquoteBorderWidth + markdownUtils.markdownStyle.blockquotePaddingLeft; + + for (NSUInteger level = 0; level < [depth unsignedIntValue]; level++) { + CGFloat x = paddingLeft + (level * shift) + markdownUtils.markdownStyle.blockquoteMarginLeft; + CGRect lineRect = CGRectMake(x, y, width, height); + [markdownUtils.markdownStyle.blockquoteBorderColor setFill]; + UIRectFill(lineRect); } }]; } diff --git a/apple/MarkdownParser.h b/apple/MarkdownParser.h new file mode 100644 index 000000000..7ec8d1951 --- /dev/null +++ b/apple/MarkdownParser.h @@ -0,0 +1,12 @@ +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface MarkdownParser : NSObject + +- (NSArray *)parse:(NSString *)text withParserId:(NSNumber *)parserId; + +NS_ASSUME_NONNULL_END + +@end diff --git a/apple/MarkdownParser.mm b/apple/MarkdownParser.mm new file mode 100644 index 000000000..739f106d4 --- /dev/null +++ b/apple/MarkdownParser.mm @@ -0,0 +1,72 @@ +#import "MarkdownParser.h" +#import +#import +#import + +@implementation MarkdownParser { + NSString *_prevText; + NSNumber *_prevParserId; + NSArray *_prevMarkdownRanges; +} + +- (NSArray *)parse:(NSString *)text withParserId:(nonnull NSNumber *)parserId { + @synchronized (self) { + if ([text isEqualToString:_prevText] && [parserId isEqualToNumber:_prevParserId]) { + return _prevMarkdownRanges; + } + + static std::mutex workletRuntimeMutex; // this needs to be global since the worklet runtime is also global + const auto lock = std::lock_guard(workletRuntimeMutex); + + const auto &markdownRuntime = expensify::livemarkdown::getMarkdownRuntime(); + jsi::Runtime &rt = markdownRuntime->getJSIRuntime(); + + const auto &markdownWorklet = expensify::livemarkdown::getMarkdownWorklet([parserId intValue]); + + const auto &input = jsi::String::createFromUtf8(rt, [text UTF8String]); + + jsi::Value output; + try { + output = markdownRuntime->runGuarded(markdownWorklet, input); + } catch (const jsi::JSError &error) { + // Skip formatting, runGuarded will show the error in LogBox + _prevText = text; + _prevParserId = parserId; + _prevMarkdownRanges = @[]; + return _prevMarkdownRanges; + } + + NSMutableArray *markdownRanges = [[NSMutableArray alloc] init]; + try { + const auto &ranges = output.asObject(rt).asArray(rt); + for (size_t i = 0, n = ranges.size(rt); i < n; ++i) { + const auto &item = ranges.getValueAtIndex(rt, i).asObject(rt); + const auto &type = item.getProperty(rt, "type").asString(rt).utf8(rt); + const auto &start = static_cast(item.getProperty(rt, "start").asNumber()); + const auto &length = static_cast(item.getProperty(rt, "length").asNumber()); + const auto &depth = item.hasProperty(rt, "depth") ? static_cast(item.getProperty(rt, "depth").asNumber()) : 1; + + if (length == 0 || start + length > text.length) { + continue; + } + + NSRange range = NSMakeRange(start, length); + MarkdownRange *markdownRange = [[MarkdownRange alloc] initWithType:@(type.c_str()) range:range depth:depth]; + [markdownRanges addObject:markdownRange]; + } + } catch (const jsi::JSError &error) { + RCTLogWarn(@"[react-native-live-markdown] Incorrect schema of worklet parser output: %s", error.getMessage().c_str()); + _prevText = text; + _prevParserId = parserId; + _prevMarkdownRanges = @[]; + return _prevMarkdownRanges; + } + + _prevText = text; + _prevParserId = parserId; + _prevMarkdownRanges = markdownRanges; + return _prevMarkdownRanges; + } +} + +@end diff --git a/apple/MarkdownRange.h b/apple/MarkdownRange.h new file mode 100644 index 000000000..3c44a94bb --- /dev/null +++ b/apple/MarkdownRange.h @@ -0,0 +1,15 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface MarkdownRange : NSObject + +@property (nonatomic, strong) NSString *type; +@property (nonatomic) NSRange range; +@property (nonatomic) NSUInteger depth; + +- (instancetype)initWithType:(NSString *)type range:(NSRange)range depth:(NSUInteger)depth; + +NS_ASSUME_NONNULL_END + +@end diff --git a/apple/MarkdownRange.mm b/apple/MarkdownRange.mm new file mode 100644 index 000000000..6e3dbc909 --- /dev/null +++ b/apple/MarkdownRange.mm @@ -0,0 +1,15 @@ +#import "MarkdownRange.h" + +@implementation MarkdownRange + +- (instancetype)initWithType:(NSString *)type range:(NSRange)range depth:(NSUInteger)depth { + self = [super init]; + if (self) { + _type = type; + _range = range; + _depth = depth; + } + return self; +} + +@end diff --git a/apple/MarkdownTextInputDecoratorComponentView.mm b/apple/MarkdownTextInputDecoratorComponentView.mm index 4b3b07325..9465e2269 100644 --- a/apple/MarkdownTextInputDecoratorComponentView.mm +++ b/apple/MarkdownTextInputDecoratorComponentView.mm @@ -68,6 +68,10 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const & const auto &oldViewProps = *std::static_pointer_cast(_props); const auto &newViewProps = *std::static_pointer_cast(props); + if (oldViewProps.parserId != newViewProps.parserId) { + [_view setParserId:@(newViewProps.parserId)]; + } + // TODO: if (oldViewProps.markdownStyle != newViewProps.markdownStyle) RCTMarkdownStyle *markdownStyle = [[RCTMarkdownStyle alloc] initWithStruct:newViewProps.markdownStyle]; [_view setMarkdownStyle:markdownStyle]; diff --git a/apple/MarkdownTextInputDecoratorView.h b/apple/MarkdownTextInputDecoratorView.h index 198780f2d..7d22469bc 100644 --- a/apple/MarkdownTextInputDecoratorView.h +++ b/apple/MarkdownTextInputDecoratorView.h @@ -7,6 +7,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)setMarkdownStyle:(RCTMarkdownStyle *)markdownStyle; +- (void)setParserId:(NSNumber *)parserId; + @end NS_ASSUME_NONNULL_END diff --git a/apple/MarkdownTextInputDecoratorView.mm b/apple/MarkdownTextInputDecoratorView.mm index c6ae82fbf..d0f94ffe6 100644 --- a/apple/MarkdownTextInputDecoratorView.mm +++ b/apple/MarkdownTextInputDecoratorView.mm @@ -17,6 +17,7 @@ @implementation MarkdownTextInputDecoratorView { RCTMarkdownUtils *_markdownUtils; RCTMarkdownStyle *_markdownStyle; + NSNumber *_parserId; #ifdef RCT_NEW_ARCH_ENABLED __weak RCTTextInputComponentView *_textInput; #else @@ -62,6 +63,7 @@ - (void)didMoveToWindow { _markdownUtils = [[RCTMarkdownUtils alloc] init]; react_native_assert(_markdownStyle != nil); [_markdownUtils setMarkdownStyle:_markdownStyle]; + [_markdownUtils setParserId:_parserId]; [_textInput setMarkdownUtils:_markdownUtils]; if ([_backedTextInputView isKindOfClass:[RCTUITextField class]]) { @@ -109,7 +111,18 @@ - (void)setMarkdownStyle:(RCTMarkdownStyle *)markdownStyle { _markdownStyle = markdownStyle; [_markdownUtils setMarkdownStyle:markdownStyle]; + [self applyNewStyles]; +} +- (void)setParserId:(NSNumber *)parserId +{ + _parserId = parserId; + [_markdownUtils setParserId:parserId]; + [self applyNewStyles]; +} + +- (void)applyNewStyles +{ if (_textView != nil) { // We want to use `textStorage` for applying markdown when possible. Currently it's only available for UITextView [_textView textDidChange]; diff --git a/apple/MarkdownTextInputDecoratorViewManager.mm b/apple/MarkdownTextInputDecoratorViewManager.mm index d59f27b67..465e19aad 100644 --- a/apple/MarkdownTextInputDecoratorViewManager.mm +++ b/apple/MarkdownTextInputDecoratorViewManager.mm @@ -20,4 +20,13 @@ - (UIView *)view #endif /* RCT_NEW_ARCH_ENABLED */ } +RCT_CUSTOM_VIEW_PROPERTY(parserId, NSNumber, MarkdownTextInputDecoratorView) +{ +#ifdef RCT_NEW_ARCH_ENABLED + // implemented in MarkdownTextInputDecoratorView updateProps: +#else + [view setParserId:json]; +#endif /* RCT_NEW_ARCH_ENABLED */ +} + @end diff --git a/apple/RCTLiveMarkdownModule.h b/apple/RCTLiveMarkdownModule.h deleted file mode 100644 index 6494594db..000000000 --- a/apple/RCTLiveMarkdownModule.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef RCT_NEW_ARCH_ENABLED - -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -// Without inheriting after RCTEventEmitter we don't get access to bridge -@interface RCTLiveMarkdownModule - : RCTEventEmitter -@end - -NS_ASSUME_NONNULL_END - -#endif // RCT_NEW_ARCH_ENABLED diff --git a/apple/RCTMarkdownUtils.h b/apple/RCTMarkdownUtils.h index 4d080bb8f..ea1264722 100644 --- a/apple/RCTMarkdownUtils.h +++ b/apple/RCTMarkdownUtils.h @@ -6,7 +6,7 @@ NS_ASSUME_NONNULL_BEGIN @interface RCTMarkdownUtils : NSObject @property (nonatomic) RCTMarkdownStyle *markdownStyle; -@property (nonatomic) NSMutableArray *blockquoteRangesAndLevels; +@property (nonatomic) NSNumber *parserId; - (NSAttributedString *)parseMarkdown:(nullable NSAttributedString *)input withAttributes:(nullable NSDictionary*)attributes; diff --git a/apple/RCTMarkdownUtils.mm b/apple/RCTMarkdownUtils.mm index c22a87845..3c90238be 100644 --- a/apple/RCTMarkdownUtils.mm +++ b/apple/RCTMarkdownUtils.mm @@ -1,213 +1,53 @@ #import -#import "react_native_assert.h" -#import -#import - -#include -#include - -using namespace facebook; +#import +#import @implementation RCTMarkdownUtils { + MarkdownParser *_markdownParser; + MarkdownFormatter *_markdownFormatter; NSString *_prevInputString; NSAttributedString *_prevAttributedString; NSDictionary *_prevTextAttributes; __weak RCTMarkdownStyle *_prevMarkdownStyle; + __weak NSNumber *_prevParserId; } -- (NSAttributedString *)parseMarkdown:(nullable NSAttributedString *)input withAttributes:(nullable NSDictionary *)attributes +- (instancetype)init { - @synchronized (self) { - if (input == nil) { - return nil; - } - - NSString *inputString = [input string]; - if ([inputString isEqualToString:_prevInputString] && [attributes isEqualToDictionary:_prevTextAttributes] && [_markdownStyle isEqual:_prevMarkdownStyle]) { - return _prevAttributedString; - } - - static std::shared_ptr runtime; - static std::mutex runtimeMutex; - auto lock = std::lock_guard(runtimeMutex); - - if (runtime == nullptr) { - NSString *path = [[NSBundle mainBundle] pathForResource:@"react-native-live-markdown-parser" ofType:@"js"]; - assert(path != nil && "[react-native-live-markdown] Markdown parser bundle not found"); - NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL]; - assert(content != nil && "[react-native-live-markdown] Markdown parser bundle is empty"); - runtime = facebook::hermes::makeHermesRuntime(); - auto codeBuffer = std::make_shared([content UTF8String]); - runtime->evaluateJavaScript(codeBuffer, "evaluateJavaScript"); - } - - jsi::Runtime &rt = *runtime; - auto text = jsi::String::createFromUtf8(rt, [inputString UTF8String]); - - auto func = rt.global().getPropertyAsFunction(rt, "parseExpensiMarkToRanges"); - auto output = func.call(rt, text); - if (output.isUndefined()) { - return input; - } - const auto &ranges = output.asObject(rt).asArray(rt); - - NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:inputString attributes:attributes]; - [attributedString beginEditing]; - - // If the attributed string ends with underlined text, blurring the single-line input imprints the underline style across the whole string. - // It looks like a bug in iOS, as there is no underline style to be found in the attributed string, especially after formatting. - // This is a workaround that applies the NSUnderlineStyleNone to the string before iterating over ranges which resolves this problem. - [attributedString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleNone] range:NSMakeRange(0, attributedString.length)]; - - _blockquoteRangesAndLevels = [NSMutableArray new]; - - for (size_t i = 0, n = ranges.size(rt); i < n; ++i) { - const auto &item = ranges.getValueAtIndex(rt, i).asObject(rt); - const auto &type = item.getProperty(rt, "type").asString(rt).utf8(rt); - const auto &start = static_cast(item.getProperty(rt, "start").asNumber()); - const auto &length = static_cast(item.getProperty(rt, "length").asNumber()); - const auto &depth = item.hasProperty(rt, "depth") ? static_cast(item.getProperty(rt, "depth").asNumber()) : 1; - - [self applyRangeToAttributedString:attributedString type:type start:start length:length depth:depth]; - } - - RCTApplyBaselineOffset(attributedString); - - [attributedString endEditing]; - - _prevInputString = inputString; - _prevAttributedString = attributedString; - _prevTextAttributes = attributes; - _prevMarkdownStyle = _markdownStyle; - - return attributedString; - } -} - -- (void)applyRangeToAttributedString:(NSMutableAttributedString *)attributedString type:(const std::string)type start:(const int)start length:(const int)length depth:(const int)depth { - if (length == 0 || start + length > attributedString.length) { - return; - } - - NSRange range = NSMakeRange(start, length); - - if (type == "bold" || type == "italic" || type == "code" || type == "pre" || type == "h1" || type == "emoji") { - UIFont *font = [attributedString attribute:NSFontAttributeName atIndex:start effectiveRange:NULL]; - if (type == "bold") { - font = [RCTFont updateFont:font withWeight:@"bold"]; - } else if (type == "italic") { - font = [RCTFont updateFont:font withStyle:@"italic"]; - } else if (type == "code") { - font = [RCTFont updateFont:font withFamily:_markdownStyle.codeFontFamily - size:[NSNumber numberWithFloat:_markdownStyle.codeFontSize] - weight:nil - style:nil - variant:nil - scaleMultiplier:0]; - } else if (type == "pre") { - font = [RCTFont updateFont:font withFamily:_markdownStyle.preFontFamily - size:[NSNumber numberWithFloat:_markdownStyle.preFontSize] - weight:nil - style:nil - variant:nil - scaleMultiplier:0]; - } else if (type == "h1") { - font = [RCTFont updateFont:font withFamily:nil - size:[NSNumber numberWithFloat:_markdownStyle.h1FontSize] - weight:@"bold" - style:nil - variant:nil - scaleMultiplier:0]; - } else if (type == "emoji") { - font = [RCTFont updateFont:font withFamily:nil - size:[NSNumber numberWithFloat:_markdownStyle.emojiFontSize] - weight:nil - style:nil - variant:nil - scaleMultiplier:0]; - } - [attributedString addAttribute:NSFontAttributeName value:font range:range]; - } + if (self = [super init]) { + _markdownParser = [MarkdownParser new]; + _markdownFormatter = [MarkdownFormatter new]; + } - if (type == "syntax") { - [attributedString addAttribute:NSForegroundColorAttributeName value:_markdownStyle.syntaxColor range:range]; - } else if (type == "strikethrough") { - [attributedString addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:range]; - } else if (type == "code") { - [attributedString addAttribute:NSForegroundColorAttributeName value:_markdownStyle.codeColor range:range]; - [attributedString addAttribute:NSBackgroundColorAttributeName value:_markdownStyle.codeBackgroundColor range:range]; - } else if (type == "mention-here") { - [attributedString addAttribute:NSForegroundColorAttributeName value:_markdownStyle.mentionHereColor range:range]; - [attributedString addAttribute:NSBackgroundColorAttributeName value:_markdownStyle.mentionHereBackgroundColor range:range]; - } else if (type == "mention-user") { - // TODO: change mention color when it mentions current user - [attributedString addAttribute:NSForegroundColorAttributeName value:_markdownStyle.mentionUserColor range:range]; - [attributedString addAttribute:NSBackgroundColorAttributeName value:_markdownStyle.mentionUserBackgroundColor range:range]; - } else if (type == "mention-report") { - [attributedString addAttribute:NSForegroundColorAttributeName value:_markdownStyle.mentionReportColor range:range]; - [attributedString addAttribute:NSBackgroundColorAttributeName value:_markdownStyle.mentionReportBackgroundColor range:range]; - } else if (type == "link") { - [attributedString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:range]; - [attributedString addAttribute:NSForegroundColorAttributeName value:_markdownStyle.linkColor range:range]; - } else if (type == "blockquote") { - CGFloat indent = (_markdownStyle.blockquoteMarginLeft + _markdownStyle.blockquoteBorderWidth + _markdownStyle.blockquotePaddingLeft) * depth; - NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; - paragraphStyle.firstLineHeadIndent = indent; - paragraphStyle.headIndent = indent; - [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:range]; - [_blockquoteRangesAndLevels addObject:@{ - @"range": [NSValue valueWithRange:range], - @"depth": @(depth) - }]; - } else if (type == "pre") { - [attributedString addAttribute:NSForegroundColorAttributeName value:_markdownStyle.preColor range:range]; - NSRange rangeForBackground = [[attributedString string] characterAtIndex:range.location] == '\n' ? NSMakeRange(range.location + 1, range.length - 1) : range; - [attributedString addAttribute:NSBackgroundColorAttributeName value:_markdownStyle.preBackgroundColor range:rangeForBackground]; - // TODO: pass background color and ranges to layout manager - } + return self; } -static void RCTApplyBaselineOffset(NSMutableAttributedString *attributedText) +- (NSAttributedString *)parseMarkdown:(nullable NSAttributedString *)input withAttributes:(nullable NSDictionary *)attributes { - __block CGFloat maximumLineHeight = 0; - - [attributedText enumerateAttribute:NSParagraphStyleAttributeName - inRange:NSMakeRange(0, attributedText.length) - options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired - usingBlock:^(NSParagraphStyle *paragraphStyle, __unused NSRange range, __unused BOOL *stop) { - if (!paragraphStyle) { - return; + @synchronized (self) { + if (input == nil) { + return nil; } - maximumLineHeight = MAX(paragraphStyle.maximumLineHeight, maximumLineHeight); - }]; - - if (maximumLineHeight == 0) { - // `lineHeight` was not specified, nothing to do. - return; - } - - __block CGFloat maximumFontLineHeight = 0; - - [attributedText enumerateAttribute:NSFontAttributeName - inRange:NSMakeRange(0, attributedText.length) - options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired - usingBlock:^(UIFont *font, NSRange range, __unused BOOL *stop) { - if (!font) { - return; + NSString *inputString = [input string]; + if ([inputString isEqualToString:_prevInputString] && [attributes isEqualToDictionary:_prevTextAttributes] && [_markdownStyle isEqual:_prevMarkdownStyle] && [_parserId isEqualToNumber:_prevParserId]) { + return _prevAttributedString; } - maximumFontLineHeight = MAX(font.lineHeight, maximumFontLineHeight); - }]; + NSArray *markdownRanges = [_markdownParser parse:inputString withParserId:_parserId]; - if (maximumLineHeight < maximumFontLineHeight) { - return; - } + NSAttributedString *attributedString = [_markdownFormatter format:inputString + withAttributes:attributes + withMarkdownRanges:markdownRanges + withMarkdownStyle:_markdownStyle]; + _prevInputString = inputString; + _prevAttributedString = attributedString; + _prevTextAttributes = attributes; + _prevMarkdownStyle = _markdownStyle; + _prevParserId = _parserId; - CGFloat baseLineOffset = (maximumLineHeight - maximumFontLineHeight) / 2.0; - [attributedText addAttribute:NSBaselineOffsetAttributeName - value:@(baseLineOffset) - range:NSMakeRange(0, attributedText.length)]; + return attributedString; + } } @end diff --git a/cpp/MarkdownGlobal.cpp b/cpp/MarkdownGlobal.cpp new file mode 100644 index 000000000..1941eed67 --- /dev/null +++ b/cpp/MarkdownGlobal.cpp @@ -0,0 +1,45 @@ +#include "MarkdownGlobal.h" + +#include + +using namespace facebook; + +namespace expensify { +namespace livemarkdown { + +std::shared_ptr globalMarkdownWorkletRuntime; + +void setMarkdownRuntime(const std::shared_ptr &markdownWorkletRuntime) { + globalMarkdownWorkletRuntime = markdownWorkletRuntime; +} + +std::shared_ptr getMarkdownRuntime() { + return globalMarkdownWorkletRuntime; +} + +std::unordered_map> globalMarkdownShareableWorklets; +std::mutex globalMarkdownShareableWorkletsMutex; +int nextParserId = 1; + +const int registerMarkdownWorklet(const std::shared_ptr &markdownWorklet) { + assert(markdownWorklet != nullptr); + auto parserId = nextParserId++; + std::unique_lock lock(globalMarkdownShareableWorkletsMutex); + globalMarkdownShareableWorklets[parserId] = markdownWorklet; + return parserId; +} + +void unregisterMarkdownWorklet(const int parserId) { + std::unique_lock lock(globalMarkdownShareableWorkletsMutex); + globalMarkdownShareableWorklets.erase(parserId); +} + +std::shared_ptr getMarkdownWorklet(const int parserId) { + std::unique_lock lock(globalMarkdownShareableWorkletsMutex); + const auto &worklet = globalMarkdownShareableWorklets[parserId]; + assert(worklet != nullptr); + return worklet; +} + +} // namespace livemarkdown +} // namespace expensify diff --git a/cpp/MarkdownGlobal.h b/cpp/MarkdownGlobal.h new file mode 100644 index 000000000..1edfb45b1 --- /dev/null +++ b/cpp/MarkdownGlobal.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include + +using namespace facebook; +using namespace worklets; + +namespace expensify { +namespace livemarkdown { + +void setMarkdownRuntime(const std::shared_ptr &markdownWorkletRuntime); + +std::shared_ptr getMarkdownRuntime(); + +const int registerMarkdownWorklet(const std::shared_ptr &markdownWorklet); + +void unregisterMarkdownWorklet(const int parserId); + +std::shared_ptr getMarkdownWorklet(const int parserId); + +} // namespace livemarkdown +} // namespace expensify diff --git a/cpp/RuntimeDecorator.cpp b/cpp/RuntimeDecorator.cpp new file mode 100644 index 000000000..5332e30df --- /dev/null +++ b/cpp/RuntimeDecorator.cpp @@ -0,0 +1,43 @@ +#include "RuntimeDecorator.h" +#include "MarkdownGlobal.h" + +using namespace facebook; +using namespace worklets; + +namespace expensify { +namespace livemarkdown { + +void injectJSIBindings(jsi::Runtime &rt) { + + rt.global().setProperty(rt, "jsi_setMarkdownRuntime", jsi::Function::createFromHostFunction( + rt, + jsi::PropNameID::forAscii(rt, "jsi_setMarkdownRuntime"), + 1, + [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { + setMarkdownRuntime(extractWorkletRuntime(rt, args[0])); + return jsi::Value::undefined(); + })); + + rt.global().setProperty(rt, "jsi_registerMarkdownWorklet", jsi::Function::createFromHostFunction( + rt, + jsi::PropNameID::forAscii(rt, "jsi_registerMarkdownWorklet"), + 1, + [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { + auto parserId = registerMarkdownWorklet(extractShareableOrThrow(rt, args[0])); + return jsi::Value(parserId); + })); + + rt.global().setProperty(rt, "jsi_unregisterMarkdownWorklet", jsi::Function::createFromHostFunction( + rt, + jsi::PropNameID::forAscii(rt, "jsi_unregisterMarkdownWorklet"), + 1, + [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { + auto parserId = static_cast(args[0].asNumber()); + unregisterMarkdownWorklet(parserId); + return jsi::Value::undefined(); + })); + +} + +} // namespace livemarkdown +} // namespace expensify diff --git a/cpp/RuntimeDecorator.h b/cpp/RuntimeDecorator.h new file mode 100644 index 000000000..c5554af63 --- /dev/null +++ b/cpp/RuntimeDecorator.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +using namespace facebook; + +namespace expensify { +namespace livemarkdown { + +void injectJSIBindings(jsi::Runtime &rt); + +} // namespace livemarkdown +} // namespace expensify diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 93caed2fa..7c1ddc7fb 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -45,7 +45,7 @@ react { /* Hermes Commands */ // The hermes compiler command to run. By default it is 'hermesc' - // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + hermesCommand = "$rootDir/../../node_modules/react-native/sdks/hermesc/osx-bin/hermesc" // // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" // hermesFlags = ["-O", "-output-source-map"] diff --git a/example/babel.config.js b/example/babel.config.js index d9addbbab..353c7d446 100644 --- a/example/babel.config.js +++ b/example/babel.config.js @@ -13,5 +13,6 @@ module.exports = { }, }, ], + 'react-native-reanimated/plugin', ], }; diff --git a/example/index.ts b/example/index.js similarity index 100% rename from example/index.ts rename to example/index.js diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 6003a05a4..f3bb3529c 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,12 +1,12 @@ PODS: - boost (1.84.0) - DoubleConversion (1.1.6) - - FBLazyVector (0.75.2) + - FBLazyVector (0.75.3) - fmt (9.1.0) - glog (0.3.5) - - hermes-engine (0.75.2): - - hermes-engine/Pre-built (= 0.75.2) - - hermes-engine/Pre-built (0.75.2) + - hermes-engine (0.75.3): + - hermes-engine/Pre-built (= 0.75.3) + - hermes-engine/Pre-built (0.75.3) - RCT-Folly (2024.01.01.00): - boost - DoubleConversion @@ -23,32 +23,32 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog - - RCTDeprecation (0.75.2) - - RCTRequired (0.75.2) - - RCTTypeSafety (0.75.2): - - FBLazyVector (= 0.75.2) - - RCTRequired (= 0.75.2) - - React-Core (= 0.75.2) - - React (0.75.2): - - React-Core (= 0.75.2) - - React-Core/DevSupport (= 0.75.2) - - React-Core/RCTWebSocket (= 0.75.2) - - React-RCTActionSheet (= 0.75.2) - - React-RCTAnimation (= 0.75.2) - - React-RCTBlob (= 0.75.2) - - React-RCTImage (= 0.75.2) - - React-RCTLinking (= 0.75.2) - - React-RCTNetwork (= 0.75.2) - - React-RCTSettings (= 0.75.2) - - React-RCTText (= 0.75.2) - - React-RCTVibration (= 0.75.2) - - React-callinvoker (0.75.2) - - React-Core (0.75.2): + - RCTDeprecation (0.75.3) + - RCTRequired (0.75.3) + - RCTTypeSafety (0.75.3): + - FBLazyVector (= 0.75.3) + - RCTRequired (= 0.75.3) + - React-Core (= 0.75.3) + - React (0.75.3): + - React-Core (= 0.75.3) + - React-Core/DevSupport (= 0.75.3) + - React-Core/RCTWebSocket (= 0.75.3) + - React-RCTActionSheet (= 0.75.3) + - React-RCTAnimation (= 0.75.3) + - React-RCTBlob (= 0.75.3) + - React-RCTImage (= 0.75.3) + - React-RCTLinking (= 0.75.3) + - React-RCTNetwork (= 0.75.3) + - React-RCTSettings (= 0.75.3) + - React-RCTText (= 0.75.3) + - React-RCTVibration (= 0.75.3) + - React-callinvoker (0.75.3) + - React-Core (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - - React-Core/Default (= 0.75.2) + - React-Core/Default (= 0.75.3) - React-cxxreact - React-featureflags - React-hermes @@ -60,7 +60,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/CoreModulesHeaders (0.75.2): + - React-Core/CoreModulesHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -77,7 +77,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/Default (0.75.2): + - React-Core/Default (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -93,13 +93,13 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/DevSupport (0.75.2): + - React-Core/DevSupport (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - - React-Core/Default (= 0.75.2) - - React-Core/RCTWebSocket (= 0.75.2) + - React-Core/Default (= 0.75.3) + - React-Core/RCTWebSocket (= 0.75.3) - React-cxxreact - React-featureflags - React-hermes @@ -111,7 +111,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTActionSheetHeaders (0.75.2): + - React-Core/RCTActionSheetHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -128,7 +128,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTAnimationHeaders (0.75.2): + - React-Core/RCTAnimationHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -145,7 +145,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTBlobHeaders (0.75.2): + - React-Core/RCTBlobHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -162,7 +162,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTImageHeaders (0.75.2): + - React-Core/RCTImageHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -179,7 +179,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTLinkingHeaders (0.75.2): + - React-Core/RCTLinkingHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -196,7 +196,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTNetworkHeaders (0.75.2): + - React-Core/RCTNetworkHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -213,7 +213,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTSettingsHeaders (0.75.2): + - React-Core/RCTSettingsHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -230,7 +230,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTTextHeaders (0.75.2): + - React-Core/RCTTextHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -247,7 +247,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTVibrationHeaders (0.75.2): + - React-Core/RCTVibrationHeaders (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -264,12 +264,12 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTWebSocket (0.75.2): + - React-Core/RCTWebSocket (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - - React-Core/Default (= 0.75.2) + - React-Core/Default (= 0.75.3) - React-cxxreact - React-featureflags - React-hermes @@ -281,36 +281,36 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-CoreModules (0.75.2): + - React-CoreModules (0.75.3): - DoubleConversion - fmt (= 9.1.0) - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety (= 0.75.2) - - React-Core/CoreModulesHeaders (= 0.75.2) - - React-jsi (= 0.75.2) + - RCTTypeSafety (= 0.75.3) + - React-Core/CoreModulesHeaders (= 0.75.3) + - React-jsi (= 0.75.3) - React-jsinspector - React-NativeModulesApple - React-RCTBlob - - React-RCTImage (= 0.75.2) + - React-RCTImage (= 0.75.3) - ReactCodegen - ReactCommon - SocketRocket (= 0.7.0) - - React-cxxreact (0.75.2): + - React-cxxreact (0.75.3): - boost - DoubleConversion - fmt (= 9.1.0) - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.75.2) - - React-debug (= 0.75.2) - - React-jsi (= 0.75.2) + - React-callinvoker (= 0.75.3) + - React-debug (= 0.75.3) + - React-jsi (= 0.75.3) - React-jsinspector - - React-logger (= 0.75.2) - - React-perflogger (= 0.75.2) - - React-runtimeexecutor (= 0.75.2) - - React-debug (0.75.2) - - React-defaultsnativemodule (0.75.2): + - React-logger (= 0.75.3) + - React-perflogger (= 0.75.3) + - React-runtimeexecutor (= 0.75.3) + - React-debug (0.75.3) + - React-defaultsnativemodule (0.75.3): - DoubleConversion - glog - hermes-engine @@ -335,7 +335,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - React-domnativemodule (0.75.2): + - React-domnativemodule (0.75.3): - DoubleConversion - glog - hermes-engine @@ -357,7 +357,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - React-Fabric (0.75.2): + - React-Fabric (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -368,21 +368,21 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/animations (= 0.75.2) - - React-Fabric/attributedstring (= 0.75.2) - - React-Fabric/componentregistry (= 0.75.2) - - React-Fabric/componentregistrynative (= 0.75.2) - - React-Fabric/components (= 0.75.2) - - React-Fabric/core (= 0.75.2) - - React-Fabric/dom (= 0.75.2) - - React-Fabric/imagemanager (= 0.75.2) - - React-Fabric/leakchecker (= 0.75.2) - - React-Fabric/mounting (= 0.75.2) - - React-Fabric/observers (= 0.75.2) - - React-Fabric/scheduler (= 0.75.2) - - React-Fabric/telemetry (= 0.75.2) - - React-Fabric/templateprocessor (= 0.75.2) - - React-Fabric/uimanager (= 0.75.2) + - React-Fabric/animations (= 0.75.3) + - React-Fabric/attributedstring (= 0.75.3) + - React-Fabric/componentregistry (= 0.75.3) + - React-Fabric/componentregistrynative (= 0.75.3) + - React-Fabric/components (= 0.75.3) + - React-Fabric/core (= 0.75.3) + - React-Fabric/dom (= 0.75.3) + - React-Fabric/imagemanager (= 0.75.3) + - React-Fabric/leakchecker (= 0.75.3) + - React-Fabric/mounting (= 0.75.3) + - React-Fabric/observers (= 0.75.3) + - React-Fabric/scheduler (= 0.75.3) + - React-Fabric/telemetry (= 0.75.3) + - React-Fabric/templateprocessor (= 0.75.3) + - React-Fabric/uimanager (= 0.75.3) - React-featureflags - React-graphics - React-jsi @@ -392,7 +392,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/animations (0.75.2): + - React-Fabric/animations (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -412,7 +412,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.75.2): + - React-Fabric/attributedstring (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -432,7 +432,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.75.2): + - React-Fabric/componentregistry (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -452,7 +452,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.75.2): + - React-Fabric/componentregistrynative (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -472,7 +472,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components (0.75.2): + - React-Fabric/components (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -483,9 +483,9 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.75.2) - - React-Fabric/components/root (= 0.75.2) - - React-Fabric/components/view (= 0.75.2) + - React-Fabric/components/legacyviewmanagerinterop (= 0.75.3) + - React-Fabric/components/root (= 0.75.3) + - React-Fabric/components/view (= 0.75.3) - React-featureflags - React-graphics - React-jsi @@ -495,7 +495,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.75.2): + - React-Fabric/components/legacyviewmanagerinterop (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -515,7 +515,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.75.2): + - React-Fabric/components/root (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -535,7 +535,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.75.2): + - React-Fabric/components/view (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -556,7 +556,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-Fabric/core (0.75.2): + - React-Fabric/core (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -576,7 +576,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/dom (0.75.2): + - React-Fabric/dom (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -596,7 +596,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.75.2): + - React-Fabric/imagemanager (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -616,7 +616,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.75.2): + - React-Fabric/leakchecker (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -636,7 +636,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.75.2): + - React-Fabric/mounting (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -656,7 +656,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers (0.75.2): + - React-Fabric/observers (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -667,7 +667,7 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/observers/events (= 0.75.2) + - React-Fabric/observers/events (= 0.75.3) - React-featureflags - React-graphics - React-jsi @@ -677,7 +677,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers/events (0.75.2): + - React-Fabric/observers/events (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -697,7 +697,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.75.2): + - React-Fabric/scheduler (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -719,7 +719,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.75.2): + - React-Fabric/telemetry (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -739,7 +739,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.75.2): + - React-Fabric/templateprocessor (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -759,7 +759,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.75.2): + - React-Fabric/uimanager (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -770,7 +770,7 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.75.2) + - React-Fabric/uimanager/consistency (= 0.75.3) - React-featureflags - React-graphics - React-jsi @@ -781,7 +781,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.75.2): + - React-Fabric/uimanager/consistency (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -802,7 +802,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-FabricComponents (0.75.2): + - React-FabricComponents (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -814,8 +814,8 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components (= 0.75.2) - - React-FabricComponents/textlayoutmanager (= 0.75.2) + - React-FabricComponents/components (= 0.75.3) + - React-FabricComponents/textlayoutmanager (= 0.75.3) - React-featureflags - React-graphics - React-jsi @@ -827,7 +827,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components (0.75.2): + - React-FabricComponents/components (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -839,15 +839,15 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.75.2) - - React-FabricComponents/components/iostextinput (= 0.75.2) - - React-FabricComponents/components/modal (= 0.75.2) - - React-FabricComponents/components/rncore (= 0.75.2) - - React-FabricComponents/components/safeareaview (= 0.75.2) - - React-FabricComponents/components/scrollview (= 0.75.2) - - React-FabricComponents/components/text (= 0.75.2) - - React-FabricComponents/components/textinput (= 0.75.2) - - React-FabricComponents/components/unimplementedview (= 0.75.2) + - React-FabricComponents/components/inputaccessory (= 0.75.3) + - React-FabricComponents/components/iostextinput (= 0.75.3) + - React-FabricComponents/components/modal (= 0.75.3) + - React-FabricComponents/components/rncore (= 0.75.3) + - React-FabricComponents/components/safeareaview (= 0.75.3) + - React-FabricComponents/components/scrollview (= 0.75.3) + - React-FabricComponents/components/text (= 0.75.3) + - React-FabricComponents/components/textinput (= 0.75.3) + - React-FabricComponents/components/unimplementedview (= 0.75.3) - React-featureflags - React-graphics - React-jsi @@ -859,7 +859,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/inputaccessory (0.75.2): + - React-FabricComponents/components/inputaccessory (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -882,7 +882,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/iostextinput (0.75.2): + - React-FabricComponents/components/iostextinput (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -905,7 +905,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/modal (0.75.2): + - React-FabricComponents/components/modal (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -928,7 +928,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/rncore (0.75.2): + - React-FabricComponents/components/rncore (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -951,7 +951,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/safeareaview (0.75.2): + - React-FabricComponents/components/safeareaview (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -974,7 +974,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/scrollview (0.75.2): + - React-FabricComponents/components/scrollview (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -997,7 +997,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/text (0.75.2): + - React-FabricComponents/components/text (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1020,7 +1020,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/textinput (0.75.2): + - React-FabricComponents/components/textinput (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1043,7 +1043,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/unimplementedview (0.75.2): + - React-FabricComponents/components/unimplementedview (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1066,7 +1066,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/textlayoutmanager (0.75.2): + - React-FabricComponents/textlayoutmanager (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1089,26 +1089,26 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricImage (0.75.2): + - React-FabricImage (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired (= 0.75.2) - - RCTTypeSafety (= 0.75.2) + - RCTRequired (= 0.75.3) + - RCTTypeSafety (= 0.75.3) - React-Fabric - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.75.2) + - React-jsiexecutor (= 0.75.3) - React-logger - React-rendererdebug - React-utils - ReactCommon - Yoga - - React-featureflags (0.75.2) - - React-featureflagsnativemodule (0.75.2): + - React-featureflags (0.75.3) + - React-featureflagsnativemodule (0.75.3): - DoubleConversion - glog - hermes-engine @@ -1129,7 +1129,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - React-graphics (0.75.2): + - React-graphics (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1137,19 +1137,19 @@ PODS: - React-jsi - React-jsiexecutor - React-utils - - React-hermes (0.75.2): + - React-hermes (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - - React-cxxreact (= 0.75.2) + - React-cxxreact (= 0.75.3) - React-jsi - - React-jsiexecutor (= 0.75.2) + - React-jsiexecutor (= 0.75.3) - React-jsinspector - - React-perflogger (= 0.75.2) + - React-perflogger (= 0.75.3) - React-runtimeexecutor - - React-idlecallbacksnativemodule (0.75.2): + - React-idlecallbacksnativemodule (0.75.3): - DoubleConversion - glog - hermes-engine @@ -1171,7 +1171,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - React-ImageManager (0.75.2): + - React-ImageManager (0.75.3): - glog - RCT-Folly/Fabric - React-Core/Default @@ -1180,43 +1180,43 @@ PODS: - React-graphics - React-rendererdebug - React-utils - - React-jserrorhandler (0.75.2): + - React-jserrorhandler (0.75.3): - RCT-Folly/Fabric (= 2024.01.01.00) - React-debug - React-jsi - - React-jsi (0.75.2): + - React-jsi (0.75.3): - boost - DoubleConversion - fmt (= 9.1.0) - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - - React-jsiexecutor (0.75.2): + - React-jsiexecutor (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - - React-cxxreact (= 0.75.2) - - React-jsi (= 0.75.2) + - React-cxxreact (= 0.75.3) + - React-jsi (= 0.75.3) - React-jsinspector - - React-perflogger (= 0.75.2) - - React-jsinspector (0.75.2): + - React-perflogger (= 0.75.3) + - React-jsinspector (0.75.3): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-featureflags - React-jsi - - React-runtimeexecutor (= 0.75.2) - - React-jsitracing (0.75.2): + - React-runtimeexecutor (= 0.75.3) + - React-jsitracing (0.75.3): - React-jsi - - React-logger (0.75.2): + - React-logger (0.75.3): - glog - - React-Mapbuffer (0.75.2): + - React-Mapbuffer (0.75.3): - glog - React-debug - - React-microtasksnativemodule (0.75.2): + - React-microtasksnativemodule (0.75.3): - DoubleConversion - glog - hermes-engine @@ -1237,8 +1237,8 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - React-nativeconfig (0.75.2) - - React-NativeModulesApple (0.75.2): + - React-nativeconfig (0.75.3) + - React-NativeModulesApple (0.75.3): - glog - hermes-engine - React-callinvoker @@ -1249,13 +1249,13 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-perflogger (0.75.2) - - React-performancetimeline (0.75.2): + - React-perflogger (0.75.3) + - React-performancetimeline (0.75.3): - RCT-Folly (= 2024.01.01.00) - React-cxxreact - - React-RCTActionSheet (0.75.2): - - React-Core/RCTActionSheetHeaders (= 0.75.2) - - React-RCTAnimation (0.75.2): + - React-RCTActionSheet (0.75.3): + - React-Core/RCTActionSheetHeaders (= 0.75.3) + - React-RCTAnimation (0.75.3): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety - React-Core/RCTAnimationHeaders @@ -1263,7 +1263,7 @@ PODS: - React-NativeModulesApple - ReactCodegen - ReactCommon - - React-RCTAppDelegate (0.75.2): + - React-RCTAppDelegate (0.75.3): - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1288,7 +1288,7 @@ PODS: - React-utils - ReactCodegen - ReactCommon - - React-RCTBlob (0.75.2): + - React-RCTBlob (0.75.3): - DoubleConversion - fmt (= 9.1.0) - hermes-engine @@ -1301,7 +1301,7 @@ PODS: - React-RCTNetwork - ReactCodegen - ReactCommon - - React-RCTFabric (0.75.2): + - React-RCTFabric (0.75.3): - glog - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) @@ -1324,7 +1324,7 @@ PODS: - React-runtimescheduler - React-utils - Yoga - - React-RCTImage (0.75.2): + - React-RCTImage (0.75.3): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety - React-Core/RCTImageHeaders @@ -1333,14 +1333,14 @@ PODS: - React-RCTNetwork - ReactCodegen - ReactCommon - - React-RCTLinking (0.75.2): - - React-Core/RCTLinkingHeaders (= 0.75.2) - - React-jsi (= 0.75.2) + - React-RCTLinking (0.75.3): + - React-Core/RCTLinkingHeaders (= 0.75.3) + - React-jsi (= 0.75.3) - React-NativeModulesApple - ReactCodegen - ReactCommon - - ReactCommon/turbomodule/core (= 0.75.2) - - React-RCTNetwork (0.75.2): + - ReactCommon/turbomodule/core (= 0.75.3) + - React-RCTNetwork (0.75.3): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety - React-Core/RCTNetworkHeaders @@ -1348,7 +1348,7 @@ PODS: - React-NativeModulesApple - ReactCodegen - ReactCommon - - React-RCTSettings (0.75.2): + - React-RCTSettings (0.75.3): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety - React-Core/RCTSettingsHeaders @@ -1356,24 +1356,24 @@ PODS: - React-NativeModulesApple - ReactCodegen - ReactCommon - - React-RCTText (0.75.2): - - React-Core/RCTTextHeaders (= 0.75.2) + - React-RCTText (0.75.3): + - React-Core/RCTTextHeaders (= 0.75.3) - Yoga - - React-RCTVibration (0.75.2): + - React-RCTVibration (0.75.3): - RCT-Folly (= 2024.01.01.00) - React-Core/RCTVibrationHeaders - React-jsi - React-NativeModulesApple - ReactCodegen - ReactCommon - - React-rendererconsistency (0.75.2) - - React-rendererdebug (0.75.2): + - React-rendererconsistency (0.75.3) + - React-rendererdebug (0.75.3): - DoubleConversion - fmt (= 9.1.0) - RCT-Folly (= 2024.01.01.00) - React-debug - - React-rncore (0.75.2) - - React-RuntimeApple (0.75.2): + - React-rncore (0.75.3) + - React-RuntimeApple (0.75.3): - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - React-callinvoker @@ -1392,7 +1392,7 @@ PODS: - React-RuntimeHermes - React-runtimescheduler - React-utils - - React-RuntimeCore (0.75.2): + - React-RuntimeCore (0.75.3): - glog - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) @@ -1405,9 +1405,9 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - React-runtimeexecutor (0.75.2): - - React-jsi (= 0.75.2) - - React-RuntimeHermes (0.75.2): + - React-runtimeexecutor (0.75.3): + - React-jsi (= 0.75.3) + - React-RuntimeHermes (0.75.3): - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - React-featureflags @@ -1418,7 +1418,7 @@ PODS: - React-nativeconfig - React-RuntimeCore - React-utils - - React-runtimescheduler (0.75.2): + - React-runtimescheduler (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -1431,13 +1431,13 @@ PODS: - React-rendererdebug - React-runtimeexecutor - React-utils - - React-utils (0.75.2): + - React-utils (0.75.3): - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-debug - - React-jsi (= 0.75.2) - - ReactCodegen (0.75.2): + - React-jsi (= 0.75.3) + - ReactCodegen (0.75.3): - DoubleConversion - glog - hermes-engine @@ -1457,47 +1457,47 @@ PODS: - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactCommon (0.75.2): - - ReactCommon/turbomodule (= 0.75.2) - - ReactCommon/turbomodule (0.75.2): + - ReactCommon (0.75.3): + - ReactCommon/turbomodule (= 0.75.3) + - ReactCommon/turbomodule (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.75.2) - - React-cxxreact (= 0.75.2) - - React-jsi (= 0.75.2) - - React-logger (= 0.75.2) - - React-perflogger (= 0.75.2) - - ReactCommon/turbomodule/bridging (= 0.75.2) - - ReactCommon/turbomodule/core (= 0.75.2) - - ReactCommon/turbomodule/bridging (0.75.2): + - React-callinvoker (= 0.75.3) + - React-cxxreact (= 0.75.3) + - React-jsi (= 0.75.3) + - React-logger (= 0.75.3) + - React-perflogger (= 0.75.3) + - ReactCommon/turbomodule/bridging (= 0.75.3) + - ReactCommon/turbomodule/core (= 0.75.3) + - ReactCommon/turbomodule/bridging (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.75.2) - - React-cxxreact (= 0.75.2) - - React-jsi (= 0.75.2) - - React-logger (= 0.75.2) - - React-perflogger (= 0.75.2) - - ReactCommon/turbomodule/core (0.75.2): + - React-callinvoker (= 0.75.3) + - React-cxxreact (= 0.75.3) + - React-jsi (= 0.75.3) + - React-logger (= 0.75.3) + - React-perflogger (= 0.75.3) + - ReactCommon/turbomodule/core (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.75.2) - - React-cxxreact (= 0.75.2) - - React-debug (= 0.75.2) - - React-featureflags (= 0.75.2) - - React-jsi (= 0.75.2) - - React-logger (= 0.75.2) - - React-perflogger (= 0.75.2) - - React-utils (= 0.75.2) - - RNLiveMarkdown (0.1.184): + - React-callinvoker (= 0.75.3) + - React-cxxreact (= 0.75.3) + - React-debug (= 0.75.3) + - React-featureflags (= 0.75.3) + - React-jsi (= 0.75.3) + - React-logger (= 0.75.3) + - React-perflogger (= 0.75.3) + - React-utils (= 0.75.3) + - RNLiveMarkdown (0.1.199): - DoubleConversion - glog - hermes-engine @@ -1517,9 +1517,98 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNLiveMarkdown/newarch (= 0.1.184) + - RNLiveMarkdown/newarch (= 0.1.199) + - RNReanimated/worklets - Yoga - - RNLiveMarkdown/newarch (0.1.184): + - RNLiveMarkdown/newarch (0.1.199): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/worklets + - Yoga + - RNReanimated (3.16.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 3.16.3) + - RNReanimated/worklets (= 3.16.3) + - Yoga + - RNReanimated/reanimated (3.16.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated/apple (= 3.16.3) + - Yoga + - RNReanimated/reanimated/apple (3.16.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNReanimated/worklets (3.16.3): - DoubleConversion - glog - hermes-engine @@ -1608,6 +1697,7 @@ DEPENDENCIES: - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../../node_modules/react-native/ReactCommon`) - RNLiveMarkdown (from `../..`) + - RNReanimated (from `../../node_modules/react-native-reanimated`) - Yoga (from `../../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: @@ -1740,74 +1830,77 @@ EXTERNAL SOURCES: :path: "../../node_modules/react-native/ReactCommon" RNLiveMarkdown: :path: "../.." + RNReanimated: + :path: "../../node_modules/react-native-reanimated" Yoga: :path: "../../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: boost: 4cb898d0bf20404aab1850c656dcea009429d6c1 DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 - FBLazyVector: 38bb611218305c3bc61803e287b8a81c6f63b619 + FBLazyVector: 7b438dceb9f904bd85ca3c31d64cce32a035472b fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 glog: 69ef571f3de08433d766d614c73a9838a06bf7eb - hermes-engine: 3b6e0717ca847e2fc90a201e59db36caf04dee88 + hermes-engine: 8d2103d6c0176779aea4e25df6bb1410f9946680 RCT-Folly: 4464f4d875961fce86008d45f4ecf6cef6de0740 - RCTDeprecation: 34cbf122b623037ea9facad2e92e53434c5c7422 - RCTRequired: 24c446d7bcd0f517d516b6265d8df04dc3eb1219 - RCTTypeSafety: ef5e91bd791abd3a99b2c75fd565791102a66352 - React: 643f06bc294806d2db2526b424fdf759e107f514 - React-callinvoker: 34d1fa0c340104f324e2521f546196beb44dfad2 - React-Core: facd883836d8d1cc1949d2053c58eab5fb22eb75 - React-CoreModules: f92a2cb11d22f6066823ca547c61e900325dfe44 - React-cxxreact: f5595a4cbfe5a4e9d401dffa2c1c78bbbbbe75e4 - React-debug: 4a91c177b5b2efcc546fb50bc2f676f3f589efab - React-defaultsnativemodule: 6b666572abf5fe7fe87836a42776abd6ad5ed173 - React-domnativemodule: 785d767c4edbb9f011b8c976271077759ca5c4aa - React-Fabric: a33cc1fdc62a3085774783bb30970531589d2028 - React-FabricComponents: 98de5f94cbd35d407f4fc78855298b562d8289cb - React-FabricImage: 0ce8fd83844d9edef5825116d38f0e208b9ad786 - React-featureflags: 37a78859ad71db758e2efdcbdb7384afefa8701e - React-featureflagsnativemodule: f94aacb52c463e200ee185bff90ae3b392e60263 - React-graphics: c16f1bab97a5d473831a79360d84300e93a614e5 - React-hermes: 7801f8c0e12f326524b461dc368d3e74f3d2a385 - React-idlecallbacksnativemodule: d81bb7b5d26cea9852a8edc6ad1979cd7ed0841f - React-ImageManager: 98a1e5b0b05528dde47ebcd953d916ac66d46c09 - React-jserrorhandler: 08f1c3465a71a6549c27ad82809ce145ad52d4f1 - React-jsi: 161428ab2c706d5fcd9878d260ff1513fdb356ab - React-jsiexecutor: abfdc7526151c6755f836235bbaa53b267a0803c - React-jsinspector: f0786053a1a258a4d8dde859d1a820c26ee686f0 - React-jsitracing: 52b849a77d02e2dc262a3031454c23be8dabb4d9 - React-logger: 8db32983d75dc2ad54f278f344ccb9b256e694fc - React-Mapbuffer: 1c08607305558666fd16678b85ef135e455d5c96 - React-microtasksnativemodule: f13f03163b6a5ec66665dfe80a0df4468bb766a6 - React-nativeconfig: 57781b79e11d5af7573e6f77cbf1143b71802a6d - React-NativeModulesApple: 7ff2e2cfb2e5fa5bdedcecf28ce37e696c6ef1e1 - React-perflogger: 8a360ccf603de6ddbe9ff8f54383146d26e6c936 - React-performancetimeline: 3cfec915adcb3653a5a633b41e711903844c35d8 - React-RCTActionSheet: 1c0e26a88eec41215089cf4436e38188cfe9f01a - React-RCTAnimation: d87207841b1e2ae1389e684262ea8c73c887cb04 - React-RCTAppDelegate: 328e56399c4f1c3d20cfe547ea24ebded2b3a87f - React-RCTBlob: 79b42cb7db55f34079297687a480dbcf37f023f6 - React-RCTFabric: 27636a6a5fa5622159297fce26881945d3658cf6 - React-RCTImage: 0c10a75de59f7384a2a55545d5f36fe783e6ecda - React-RCTLinking: bf08f4f655bf777af292b8d97449072c8bb196ca - React-RCTNetwork: 1b690846b40fc5685af58e088720657db6814637 - React-RCTSettings: 097e420926dd44153fb25174835b572aded224d6 - React-RCTText: d8fe2ae9f95b2ccd03b2f534286e938254791992 - React-RCTVibration: 976466dba32c0981a836e45ce38bcd4c8d6d924e - React-rendererconsistency: ee0d6f1b4420e1ad5bb01c02170e7ecbd278e307 - React-rendererdebug: 7fbf02f30d1e0bb0d96d65cf2548219cb53b29b6 - React-rncore: 7ffc5be03adbf0a5cbf1b654483f487a899cff08 - React-RuntimeApple: e623f002e1871de30a443291171d3f2fb134a6ec - React-RuntimeCore: a67357d4f073b1dbe6fbefc5273072027f201e1c - React-runtimeexecutor: 5bb52479abf8081086afb0397dc33dc97202a439 - React-RuntimeHermes: 860cf64708a12a2fa62366fe51fe000121fa031b - React-runtimescheduler: fff88d51ad2c8815fc75930dbac224d680593e6b - React-utils: 81a715d9c0a2a49047e77a86f3a2247408540deb - ReactCodegen: 4eedb2fdd079174d6fc3c80b1cccafbe4ff1be8d - ReactCommon: 6ef348087d250257c44c0204461c03f036650e9b - RNLiveMarkdown: d5a311813de4429b9f18e764badc5bd7923cbaea + RCTDeprecation: 4191f6e64b72d9743f6fe1a8a16e89e868f5e9e7 + RCTRequired: 9bb589570f2bb3abc6518761e3fd1ad9b7f7f06c + RCTTypeSafety: 1c1a8741c86df0a0ac1a99cf3fb0e29eedbc2c88 + React: b6810a201ee11e69ae8bfd4eb4aaab86610600bf + React-callinvoker: d6c7898b63e6a2d37bc308f17c05be0ba3630b10 + React-Core: 2fc97900b68e7568233698c6113ca9d64ed8b520 + React-CoreModules: 2d68c251bc4080028f2835fa47504e8f20669a21 + React-cxxreact: 5f233f8ac7ea4772e49462e0ab2b0a15a4f80ab7 + React-debug: fd0ed8ecd5f8a23c7daf5ceaca8aa722a4d083fd + React-defaultsnativemodule: 1f9a0cae1ef7e05a6ea2bbec2e5eff6eb70da16a + React-domnativemodule: 38d632c6963ab2d08f5ce67808e070439bd1461c + React-Fabric: 3d0f5e2735d2f77a897ee684edeff7bb0e061919 + React-FabricComponents: 68032a85a3c25c9c8d6ce676d8af9a85e2370f24 + React-FabricImage: f8ac2df576703097b5b2f8d972b162cdca855aa3 + React-featureflags: cf78861db9318ae29982fa8953c92d31b276c9ac + React-featureflagsnativemodule: 99ffda7fc2cc0f9578b05b84d8b4a2e9dcb39b8b + React-graphics: 7572851bca7242416b648c45d6af87d93d29281e + React-hermes: 95c27801c60615345ee6256eafa6d597ce983b8b + React-idlecallbacksnativemodule: e4fd9ee09b8481dd22f1e173984e5ee2730712ce + React-ImageManager: aedf54d34d4475c66f4c3da6b8359b95bee904e4 + React-jserrorhandler: 0c8949672a00f2a502c767350e591e3ec3d82fb3 + React-jsi: d77bb442a4b0849063f2bd22d3c1fa71918713b7 + React-jsiexecutor: 3b9c6334b7b0f42d4c4aae950132766e63a7809f + React-jsinspector: e1bb5816869507527c30213cc1ed60eae9e3e9c4 + React-jsitracing: 3935b092f85bb1e53b8cf8a00f572413648af46b + React-logger: 4072f39df335ca443932e0ccece41fbeb5ca8404 + React-Mapbuffer: 714f2fae68edcabfc332b754e9fbaa8cfc68fdd4 + React-microtasksnativemodule: 0b6b90da7f203e3015e1252ec3cba49c8ddd85ad + React-nativeconfig: 4a9543185905fe41014c06776bf126083795aed9 + React-NativeModulesApple: 0506da59fc40d2e1e6e12a233db5e81c46face27 + React-perflogger: 3bbb82f18e9ac29a1a6931568e99d6305ef4403b + React-performancetimeline: d15a723422ed500f47cb271f3175abbeb217f5ba + React-RCTActionSheet: cb2b38a53d03ec22f1159c89667b86c2c490d92d + React-RCTAnimation: 6836c87c7364f471e9077fda80b7349bc674be33 + React-RCTAppDelegate: 603240f6a7d7eefeeffe4e29dd0be70dc35208cf + React-RCTBlob: 516dbbd38397f5013394fdd1cc65408cc82e37a1 + React-RCTFabric: 7298604d497db4fe445cd704bd1097636643ee89 + React-RCTImage: 1b2c2c1716db859ffff2d7a06a30b0ec5c677fc5 + React-RCTLinking: 59c07577767e705b0ab95d11e5ad74c61bf2a022 + React-RCTNetwork: f9a827e7d6bc428e0d99cd1fbe0427854354b8c1 + React-RCTSettings: 614252fecc24840f61590c016aca1664a52cfb0f + React-RCTText: 424549f68867265aa25969f50e7b9bf8bd70ae55 + React-RCTVibration: c8d156e6cce18f00b0310db7670fa997c7cda407 + React-rendererconsistency: 993f54bb0df644df2922cd87ea55238d510d992b + React-rendererdebug: 7a8cbb632b68d666ad0fc01b3f9dc1a1bcc9a9f9 + React-rncore: 1df26fe0ae861c599f9f2896f45e8834ef4b85f9 + React-RuntimeApple: b5b14b09e3be4058f9fe7ab4925e1ee343f03310 + React-RuntimeCore: 2073fb33da2aec6ce6c1c9d3d53898ed1f1d806d + React-runtimeexecutor: 9a668b94ad5d93755443311715bd57680330286a + React-RuntimeHermes: b37c62718d6920ac2958a0052bdc1b01aca842b8 + React-runtimescheduler: e25750a18cbb7469e0513f1ace834d14e8c1a202 + React-utils: f2afa6acd905ca2ce7bb8ffb4a22f7f8a12534e8 + ReactCodegen: e35c23cdd36922f6d2990c6c1f1b022ade7ad74d + ReactCommon: 289214026502e6a93484f4a46bcc0efa4f3f2864 + RNLiveMarkdown: 18dd4ceada29d66a6b7c29b1b0df589e2fc82183 + RNReanimated: ab6c33a61e90c4cbe5dbcbe65bd6c7cb3be167e6 SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d - Yoga: 2a45d7e59592db061217551fd3bbe2dd993817ae + Yoga: 1354c027ab07c7736f99a3bef16172d6f1b12b47 PODFILE CHECKSUM: 9b81b0f7bfba9e6fb4fa10efe8319f7860794e08 diff --git a/example/package.json b/example/package.json index 6dd71838b..c75e8e09d 100644 --- a/example/package.json +++ b/example/package.json @@ -9,17 +9,19 @@ "start": "react-native start" }, "dependencies": { + "expensify-common": "2.0.108", "react": "18.3.1", - "react-native": "0.75.2" + "react-native": "0.75.3", + "react-native-reanimated": "3.16.3" }, "devDependencies": { "@babel/core": "^7.20.0", "@babel/preset-env": "^7.20.0", "@babel/runtime": "^7.20.0", - "@react-native/babel-preset": "0.75.2", - "@react-native/eslint-config": "0.75.2", - "@react-native/metro-config": "0.75.2", - "@react-native/typescript-config": "0.75.2", + "@react-native/babel-preset": "0.75.3", + "@react-native/eslint-config": "0.75.3", + "@react-native/metro-config": "0.75.3", + "@react-native/typescript-config": "0.75.3", "@types/react": "^18.2.6", "@types/react-test-renderer": "^18.0.0", "babel-jest": "^29.6.3", diff --git a/example/src/App.tsx b/example/src/App.tsx index 235ff535b..77d5e421d 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,9 +1,20 @@ import * as React from 'react'; import {Button, StyleSheet, Text, View} from 'react-native'; -import {MarkdownTextInput} from '@expensify/react-native-live-markdown'; +import Animated from 'react-native-reanimated'; +import { + MarkdownTextInput, + parseExpensiMark, +} from '@expensify/react-native-live-markdown'; import * as TEST_CONST from './testConstants'; import {PlatformInfo} from './PlatformInfo'; +// This is a workaround that ensures that `ReanimatedCommitHook` is registered before `MarkdownCommitHook`. +// Otherwise, `ReanimatedCommitHook` will cause `AndroidTextInputShadowNode` to be cloned +// and `AndroidTextInputComponentDescriptor` will overwrite a custom `TextLayoutManager` with the default one, +// leading to incorrect height of `MarkdownTextInput` component. +// We don't need this workaround in New Expensify App since Reanimated is imported before Live Markdown. +console.log(Animated); + export default function App() { const [value, setValue] = React.useState(TEST_CONST.EXAMPLE_CONTENT); const [textColorState, setTextColorState] = React.useState(false); @@ -43,6 +54,7 @@ export default function App() { style={[styles.input, style]} ref={ref} markdownStyle={markdownStyle} + parser={parseExpensiMark} placeholder="Type here..." onSelectionChange={e => setSelection(e.nativeEvent.selection)} selection={selection} diff --git a/lefthook.yml b/lefthook.yml index 949a694bf..3c86c43bd 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -6,8 +6,6 @@ pre-commit: run: npx eslint {staged_files} types_root: run: npx tsc --project tsconfig.json --noEmit - types_parser: - run: npx tsc --project ./parser/tsconfig.json --noEmit types_example: run: npx tsc --project ./example/tsconfig.json --noEmit types_WebExample: diff --git a/package-lock.json b/package-lock.json index 10fb943a9..3b9507a72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@expensify/react-native-live-markdown", - "version": "0.1.187", + "version": "0.1.203", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@expensify/react-native-live-markdown", - "version": "0.1.187", + "version": "0.1.203", + "hasInstallScript": true, "license": "MIT", "workspaces": [ - "./parser", "./example", "./WebExample" ], @@ -19,7 +19,7 @@ "@commitlint/config-conventional": "^17.0.2", "@evilmartians/lefthook": "^1.5.0", "@lwc/eslint-plugin-lwc": "^1.7.2", - "@react-native/eslint-config": "0.75.2", + "@react-native/eslint-config": "0.75.3", "@release-it/conventional-changelog": "^5.0.0", "@types/jest": "^29.5.14", "@types/react": "~18.2.6", @@ -39,13 +39,16 @@ "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-tsdoc": "^0.2.17", + "expensify-common": "2.0.108", "jest": "^29.6.3", "jest-environment-jsdom": "^29.7.0", "nodemon": "^3.1.3", + "patch-package": "^8.0.0", "prettier": "2.8.8", "react": "18.3.1", - "react-native": "0.75.2", + "react-native": "0.75.3", "react-native-builder-bob": "^0.20.0", + "react-native-reanimated": "3.16.3", "react-native-web": "^0.19.10", "release-it": "^15.0.0", "turbo": "^1.10.7", @@ -55,25 +58,29 @@ "node": ">= 18.0.0" }, "peerDependencies": { + "expensify-common": ">=2.0.108", "react": "*", - "react-native": "*" + "react-native": "*", + "react-native-reanimated": ">=3.16.3" } }, "example": { "name": "@expensify/react-native-live-markdown-example", "version": "0.0.1", "dependencies": { + "expensify-common": "2.0.108", "react": "18.3.1", - "react-native": "0.75.2" + "react-native": "0.75.3", + "react-native-reanimated": "3.16.3" }, "devDependencies": { "@babel/core": "^7.20.0", "@babel/preset-env": "^7.20.0", "@babel/runtime": "^7.20.0", - "@react-native/babel-preset": "0.75.2", - "@react-native/eslint-config": "0.75.2", - "@react-native/metro-config": "0.75.2", - "@react-native/typescript-config": "0.75.2", + "@react-native/babel-preset": "0.75.3", + "@react-native/eslint-config": "0.75.3", + "@react-native/metro-config": "0.75.3", + "@react-native/typescript-config": "0.75.3", "@types/react": "^18.2.6", "@types/react-test-renderer": "^18.0.0", "babel-jest": "^29.6.3", @@ -126,36 +133,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/cli": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.25.9.tgz", - "integrity": "sha512-I+02IfrTiSanpxJBlZQYb18qCxB6c2Ih371cVpfgIrPQrjAYkf45XxomTJOG8JBWX5GY35/+TmhCMdJ4ZPkL8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "commander": "^6.2.0", - "convert-source-map": "^2.0.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.6.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/code-frame": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", @@ -2487,571 +2464,193 @@ "node": ">=v14" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.4.tgz", - "integrity": "sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz", - "integrity": "sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.4.tgz", - "integrity": "sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==", - "cpu": [ - "x64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz", - "integrity": "sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz", - "integrity": "sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "license": "Python-2.0" }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz", - "integrity": "sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz", - "integrity": "sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz", - "integrity": "sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz", - "integrity": "sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz", - "integrity": "sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==", - "cpu": [ - "ia32" - ], + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz", - "integrity": "sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==", - "cpu": [ - "loong64" - ], + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz", - "integrity": "sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==", + "node_modules/@evilmartians/lefthook": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@evilmartians/lefthook/-/lefthook-1.8.1.tgz", + "integrity": "sha512-qalg0eJG2AV0/rIL4n3dIv33O9T6D/3q54SV0qZ6UaH472fI4WKLTjN/YRvfC8JziQQtMfOD8Awt480ydfyzOw==", "cpu": [ - "mips64el" + "x64", + "arm64", + "ia32" ], "dev": true, + "hasInstallScript": true, "license": "MIT", - "optional": true, "os": [ - "linux" + "darwin", + "linux", + "win32" ], - "engines": { - "node": ">=12" + "bin": { + "lefthook": "bin/index.js" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz", - "integrity": "sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@expensify/react-native-live-markdown-example": { + "resolved": "example", + "link": true + }, + "node_modules/@expo/bunyan": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.1.tgz", + "integrity": "sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "uuid": "^8.0.0" + }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz", - "integrity": "sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz", - "integrity": "sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz", - "integrity": "sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz", - "integrity": "sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz", - "integrity": "sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz", - "integrity": "sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz", - "integrity": "sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz", - "integrity": "sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz", - "integrity": "sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@evilmartians/lefthook": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@evilmartians/lefthook/-/lefthook-1.8.1.tgz", - "integrity": "sha512-qalg0eJG2AV0/rIL4n3dIv33O9T6D/3q54SV0qZ6UaH472fI4WKLTjN/YRvfC8JziQQtMfOD8Awt480ydfyzOw==", - "cpu": [ - "x64", - "arm64", - "ia32" - ], - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "os": [ - "darwin", - "linux", - "win32" - ], - "bin": { - "lefthook": "bin/index.js" - } - }, - "node_modules/@expensify/react-native-live-markdown-example": { - "resolved": "example", - "link": true - }, - "node_modules/@expensify/react-native-live-markdown-parser": { - "resolved": "parser", - "link": true - }, - "node_modules/@expo/bunyan": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.1.tgz", - "integrity": "sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==", - "license": "MIT", - "dependencies": { - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@expo/cli": { - "version": "0.18.30", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.30.tgz", - "integrity": "sha512-V90TUJh9Ly8stYo8nwqIqNWCsYjE28GlVFWEhAFCUOp99foiQr8HSTpiiX5GIrprcPoWmlGoY+J5fQA29R4lFg==", + "node_modules/@expo/cli": { + "version": "0.18.30", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.30.tgz", + "integrity": "sha512-V90TUJh9Ly8stYo8nwqIqNWCsYjE28GlVFWEhAFCUOp99foiQr8HSTpiiX5GIrprcPoWmlGoY+J5fQA29R4lFg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", @@ -4739,14 +4338,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -5093,18 +4684,17 @@ } }, "node_modules/@react-native-community/cli": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-14.0.0.tgz", - "integrity": "sha512-KwMKJB5jsDxqOhT8CGJ55BADDAYxlYDHv5R/ASQlEcdBEZxT0zZmnL0iiq2VqzETUy+Y/Nop+XDFgqyoQm0C2w==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-clean": "14.0.0", - "@react-native-community/cli-config": "14.0.0", - "@react-native-community/cli-debugger-ui": "14.0.0", - "@react-native-community/cli-doctor": "14.0.0", - "@react-native-community/cli-server-api": "14.0.0", - "@react-native-community/cli-tools": "14.0.0", - "@react-native-community/cli-types": "14.0.0", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-14.1.0.tgz", + "integrity": "sha512-k7aTdKNZIec7WMSqMJn9bDVLWPPOaYmshXcnjWy6t5ItsJnREju9p2azMTR5tXY5uIeynose3cxettbhk2Tbnw==", + "dependencies": { + "@react-native-community/cli-clean": "14.1.0", + "@react-native-community/cli-config": "14.1.0", + "@react-native-community/cli-debugger-ui": "14.1.0", + "@react-native-community/cli-doctor": "14.1.0", + "@react-native-community/cli-server-api": "14.1.0", + "@react-native-community/cli-tools": "14.1.0", + "@react-native-community/cli-types": "14.1.0", "chalk": "^4.1.2", "commander": "^9.4.1", "deepmerge": "^4.3.0", @@ -5123,12 +4713,11 @@ } }, "node_modules/@react-native-community/cli-clean": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-14.0.0.tgz", - "integrity": "sha512-kvHthZTNur/wLLx8WL5Oh+r04zzzFAX16r8xuaLhu9qGTE6Th1JevbsIuiQb5IJqD8G/uZDKgIZ2a0/lONcbJg==", - "license": "MIT", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-14.1.0.tgz", + "integrity": "sha512-/C4j1yntLo6faztNgZnsDtgpGqa6j0+GYrxOY8LqaKAN03OCnoeUUKO6w78dycbYSGglc1xjJg2RZI/M2oF2AA==", "dependencies": { - "@react-native-community/cli-tools": "14.0.0", + "@react-native-community/cli-tools": "14.1.0", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-glob": "^3.3.2" @@ -5138,7 +4727,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -5161,7 +4749,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -5173,7 +4760,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -5185,7 +4771,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5194,7 +4779,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -5206,7 +4790,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -5218,12 +4801,11 @@ } }, "node_modules/@react-native-community/cli-config": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-14.0.0.tgz", - "integrity": "sha512-2Nr8KR+dgn1z+HLxT8piguQ1SoEzgKJnOPQKE1uakxWaRFcQ4LOXgzpIAscYwDW6jmQxdNqqbg2cRUoOS7IMtQ==", - "license": "MIT", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-14.1.0.tgz", + "integrity": "sha512-P3FK2rPUJBD1fmQHLgTqpHxsc111pnMdEEFR7KeqprCNz+Qr2QpPxfNy0V7s15tGL5rAv+wpbOGcioIV50EbxA==", "dependencies": { - "@react-native-community/cli-tools": "14.0.0", + "@react-native-community/cli-tools": "14.1.0", "chalk": "^4.1.2", "cosmiconfig": "^9.0.0", "deepmerge": "^4.3.0", @@ -5234,14 +4816,12 @@ "node_modules/@react-native-community/cli-config/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -5267,7 +4847,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5276,25 +4855,23 @@ } }, "node_modules/@react-native-community/cli-debugger-ui": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0.tgz", - "integrity": "sha512-JpfzILfU7eKE9+7AMCAwNJv70H4tJGVv3ZGFqSVoK1YHg5QkVEGsHtoNW8AsqZRS6Fj4os+Fmh+r+z1L36sPmg==", - "license": "MIT", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.1.0.tgz", + "integrity": "sha512-+YbeCL0wLcBcqDwraJFGsqzcXu9S+bwTVrfImne/4mT6itfe3Oa93yrOVJgNbstrt5pJHuwpU76ZXfXoiuncsg==", "dependencies": { "serve-static": "^1.13.1" } }, "node_modules/@react-native-community/cli-doctor": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-14.0.0.tgz", - "integrity": "sha512-in6jylHjaPUaDzV+JtUblh8m9JYIHGjHOf6Xn57hrmE5Zwzwuueoe9rSMHF1P0mtDgRKrWPzAJVejElddfptWA==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-config": "14.0.0", - "@react-native-community/cli-platform-android": "14.0.0", - "@react-native-community/cli-platform-apple": "14.0.0", - "@react-native-community/cli-platform-ios": "14.0.0", - "@react-native-community/cli-tools": "14.0.0", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-14.1.0.tgz", + "integrity": "sha512-xIf0oQDRKt7lufUenRwcLYdINGc0x1FSXHaHjd7lQDGT5FJnCEYlIkYEDDgAl5tnVJSvM/IL2c6O+mffkNEPzQ==", + "dependencies": { + "@react-native-community/cli-config": "14.1.0", + "@react-native-community/cli-platform-android": "14.1.0", + "@react-native-community/cli-platform-apple": "14.1.0", + "@react-native-community/cli-platform-ios": "14.1.0", + "@react-native-community/cli-tools": "14.1.0", "chalk": "^4.1.2", "command-exists": "^1.2.8", "deepmerge": "^4.3.0", @@ -5312,7 +4889,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -5324,7 +4900,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -5347,7 +4922,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -5359,7 +4933,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -5371,7 +4944,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -5383,7 +4955,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -5399,7 +4970,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5408,7 +4978,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -5420,7 +4989,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -5435,7 +5003,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -5458,7 +5025,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5470,7 +5036,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -5483,7 +5048,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5495,7 +5059,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" }, @@ -5507,16 +5070,14 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@react-native-community/cli-doctor/node_modules/yaml": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", - "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", - "license": "ISC", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", "bin": { "yaml": "bin.mjs" }, @@ -5768,16 +5329,15 @@ "license": "MIT" }, "node_modules/@react-native-community/cli-platform-android": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-14.0.0.tgz", - "integrity": "sha512-nt7yVz3pGKQXnVa5MAk7zR+1n41kNKD3Hi2OgybH5tVShMBo7JQoL2ZVVH6/y/9wAwI/s7hXJgzf1OIP3sMq+Q==", - "license": "MIT", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-14.1.0.tgz", + "integrity": "sha512-4JnXkAV+ca8XdUhZ7xjgDhXAMwTVjQs8JqiwP7FTYVrayShXy2cBXm/C3HNDoe+oQOF5tPT2SqsDAF2vYTnKiQ==", "dependencies": { - "@react-native-community/cli-tools": "14.0.0", + "@react-native-community/cli-tools": "14.1.0", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.2.4", + "fast-xml-parser": "^4.4.1", "logkitty": "^0.7.1" } }, @@ -5785,7 +5345,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -5808,7 +5367,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -5820,7 +5378,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -5832,7 +5389,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5841,7 +5397,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -5853,7 +5408,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -5865,16 +5419,15 @@ } }, "node_modules/@react-native-community/cli-platform-apple": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.0.0.tgz", - "integrity": "sha512-WniJL8vR4MeIsjqio2hiWWuUYUJEL3/9TDL5aXNwG68hH3tYgK3742+X9C+vRzdjTmf5IKc/a6PwLsdplFeiwQ==", - "license": "MIT", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.1.0.tgz", + "integrity": "sha512-DExd+pZ7hHxXt8I6BBmckeYUxxq7PQ+o4YSmGIeQx0xUpi+f82obBct2WNC3VWU72Jw6obwfoN6Fwe6F7Wxp5Q==", "dependencies": { - "@react-native-community/cli-tools": "14.0.0", + "@react-native-community/cli-tools": "14.1.0", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.2.4", + "fast-xml-parser": "^4.4.1", "ora": "^5.4.1" } }, @@ -5882,7 +5435,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -5894,7 +5446,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -5917,7 +5468,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -5929,7 +5479,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -5941,7 +5490,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -5953,7 +5501,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -5969,7 +5516,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5978,7 +5524,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -5990,7 +5535,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -6005,7 +5549,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -6028,7 +5571,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -6038,22 +5580,20 @@ } }, "node_modules/@react-native-community/cli-platform-ios": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.0.0.tgz", - "integrity": "sha512-8kxGv7mZ5nGMtueQDq+ndu08f0ikf3Zsqm3Ix8FY5KCXpSgP14uZloO2GlOImq/zFESij+oMhCkZJGggpWpfAw==", - "license": "MIT", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.1.0.tgz", + "integrity": "sha512-ah/ZTiJXUdCVHujyRJ4OmCL5nTq8OWcURcE3UXa1z0sIIiA8io06n+v5n299T9rtPKMwRtVJlQjtO/nbODABPQ==", "dependencies": { - "@react-native-community/cli-platform-apple": "14.0.0" + "@react-native-community/cli-platform-apple": "14.1.0" } }, "node_modules/@react-native-community/cli-server-api": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-14.0.0.tgz", - "integrity": "sha512-A0FIsj0QCcDl1rswaVlChICoNbfN+mkrKB5e1ab5tOYeZMMyCHqvU+eFvAvXjHUlIvVI+LbqCkf4IEdQ6H/2AQ==", - "license": "MIT", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-14.1.0.tgz", + "integrity": "sha512-1k2LBQaYsy9RDWFIfKVne3frOye73O33MV6eYMoRPff7wqxHCrsX1CYJQkmwpgVigZHxYwalHj+Axtu3gpomCA==", "dependencies": { - "@react-native-community/cli-debugger-ui": "14.0.0", - "@react-native-community/cli-tools": "14.0.0", + "@react-native-community/cli-debugger-ui": "14.1.0", + "@react-native-community/cli-tools": "14.1.0", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.1", @@ -6067,7 +5607,6 @@ "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -6083,7 +5622,6 @@ "version": "15.0.19", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -6092,7 +5630,6 @@ "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", @@ -6106,23 +5643,20 @@ "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/@react-native-community/cli-server-api/node_modules/ws": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", "dependencies": { "async-limiter": "~1.0.0" } }, "node_modules/@react-native-community/cli-tools": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.0.0.tgz", - "integrity": "sha512-L7GX5hyYYv0ZWbAyIQKzhHuShnwDqlKYB0tqn57wa5riGCaxYuRPTK+u4qy+WRCye7+i8M4Xj6oQtSd4z0T9cA==", - "license": "MIT", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.1.0.tgz", + "integrity": "sha512-r1KxSu2+OSuhWFoE//1UR7aSTXMLww/UYWQprEw4bSo/kvutGX//4r9ywgXSWp+39udpNN4jQpNTHuWhGZd/Bg==", "dependencies": { "appdirsjs": "^1.2.4", "chalk": "^4.1.2", @@ -6140,7 +5674,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -6152,7 +5685,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -6175,7 +5707,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -6187,7 +5718,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -6199,7 +5729,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -6211,7 +5740,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -6220,7 +5748,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -6236,7 +5763,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -6245,7 +5771,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -6257,7 +5782,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -6272,7 +5796,6 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "license": "MIT", "dependencies": { "is-wsl": "^1.1.0" }, @@ -6284,7 +5807,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -6307,7 +5829,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -6320,7 +5841,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6331,14 +5851,12 @@ "node_modules/@react-native-community/cli-tools/node_modules/sudo-prompt": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "license": "MIT" + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" }, "node_modules/@react-native-community/cli-types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-14.0.0.tgz", - "integrity": "sha512-CMUevd1pOWqvmvutkUiyQT2lNmMHUzSW7NKc1xvHgg39NjbS58Eh2pMzIUP85IwbYNeocfYc3PH19vA/8LnQtg==", - "license": "MIT", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-14.1.0.tgz", + "integrity": "sha512-aJwZI9mGRx3HdP8U4CGhqjt3S4r8GmeOqv4kRagC1UHDk4QNMC+bZ8JgPA4W7FrGiPey+lJQHMDPAXOo51SOUw==", "dependencies": { "joi": "^17.2.1" } @@ -6347,7 +5865,6 @@ "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "license": "MIT", "engines": { "node": "^12.20.0 || >=14" } @@ -6356,7 +5873,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -6379,7 +5895,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -6393,7 +5908,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -6405,7 +5919,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -6417,7 +5930,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -6426,7 +5938,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -6435,7 +5946,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -6447,7 +5957,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -6462,7 +5971,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6474,37 +5982,33 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/@react-native/assets-registry": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.75.2.tgz", - "integrity": "sha512-P1dLHjpUeC0AIkDHRYcx0qLMr+p92IPWL3pmczzo6T76Qa9XzruQOYy0jittxyBK91Csn6HHQ/eit8TeXW8MVw==", - "license": "MIT", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.75.3.tgz", + "integrity": "sha512-i7MaRbYR06WdpJWv3a0PQ2ScFBUeevwcJ0tVopnFwTg0tBWp3NFEMDIcU8lyXVy9Y59WmrP1V2ROaRDaPiESgg==", "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.75.2.tgz", - "integrity": "sha512-BIKVh2ZJPkzluUGgCNgpoh6NTHgX8j04FCS0Z/rTmRJ66hir/EUBl8frMFKrOy/6i4VvZEltOWB5eWfHe1AYgw==", - "license": "MIT", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.75.3.tgz", + "integrity": "sha512-8JmXEKq+Efb9AffsV48l8gmKe/ZQ2PbBygZjHdIf8DNZZhO/z5mt27J4B43MWNdp5Ww1l59T0mEaf8l/uywQUg==", "dependencies": { - "@react-native/codegen": "0.75.2" + "@react-native/codegen": "0.75.3" }, "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-preset": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.75.2.tgz", - "integrity": "sha512-mprpsas+WdCEMjQZnbDiAC4KKRmmLbMB+o/v4mDqKlH4Mcm7RdtP5t80MZGOVCHlceNp1uEIpXywx69DNwgbgg==", - "license": "MIT", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.75.3.tgz", + "integrity": "sha512-VZQkQEj36DKEGApXFYdVcFtqdglbnoVr7aOZpjffURSgPcIA9vWTm1b+OL4ayOaRZXTZKiDBNQCXvBX5E5AgQg==", "dependencies": { "@babel/core": "^7.20.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", @@ -6548,7 +6052,7 @@ "@babel/plugin-transform-typescript": "^7.5.0", "@babel/plugin-transform-unicode-regex": "^7.0.0", "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.75.2", + "@react-native/babel-plugin-codegen": "0.75.3", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, @@ -6560,10 +6064,9 @@ } }, "node_modules/@react-native/codegen": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.75.2.tgz", - "integrity": "sha512-OkWdbtO2jTkfOXfj3ibIL27rM6LoaEuApOByU2G8X+HS6v9U87uJVJlMIRWBDmnxODzazuHwNVA2/wAmSbucaw==", - "license": "MIT", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.75.3.tgz", + "integrity": "sha512-I0bz5jwOkiR7vnhYLGoV22RGmesErUg03tjsCiQgmsMpbyCYumudEtLNN5+DplHGK56bu8KyzBqKkWXGSKSCZQ==", "dependencies": { "@babel/parser": "^7.20.0", "glob": "^7.1.1", @@ -6582,105 +6085,41 @@ } }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.75.2.tgz", - "integrity": "sha512-/tz0bzVja4FU0aAimzzQ7iYR43peaD6pzksArdrrGhlm8OvFYAQPOYSNeIQVMSarwnkNeg1naFKaeYf1o3++yA==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-server-api": "14.0.0-alpha.11", - "@react-native-community/cli-tools": "14.0.0-alpha.11", - "@react-native/dev-middleware": "0.75.2", - "@react-native/metro-babel-transformer": "0.75.2", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.75.3.tgz", + "integrity": "sha512-njsYm+jBWzfLcJcxavAY5QFzYTrmPtjbxq/64GSqwcQYzy9qAkI7LNTK/Wprq1I/4HOuHJO7Km+EddCXB+ByRQ==", + "dependencies": { + "@react-native-community/cli-server-api": "14.1.0", + "@react-native-community/cli-tools": "14.1.0", + "@react-native/dev-middleware": "0.75.3", + "@react-native/metro-babel-transformer": "0.75.3", "chalk": "^4.0.0", "execa": "^5.1.1", "metro": "^0.80.3", "metro-config": "^0.80.3", "metro-core": "^0.80.3", "node-fetch": "^2.2.0", - "querystring": "^0.2.1", "readline": "^1.3.0" }, "engines": { "node": ">=18" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native-community/cli-debugger-ui": { - "version": "14.0.0-alpha.11", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0-alpha.11.tgz", - "integrity": "sha512-0wCNQxhCniyjyMXgR1qXliY180y/2QbvoiYpp2MleGQADr5M1b8lgI4GoyADh5kE+kX3VL0ssjgyxpmbpCD86A==", - "license": "MIT", - "dependencies": { - "serve-static": "^1.13.1" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native-community/cli-server-api": { - "version": "14.0.0-alpha.11", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-14.0.0-alpha.11.tgz", - "integrity": "sha512-I7YeYI7S5wSxnQAqeG8LNqhT99FojiGIk87DU0vTp6U8hIMLcA90fUuBAyJY38AuQZ12ZJpGa8ObkhIhWzGkvg==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-debugger-ui": "14.0.0-alpha.11", - "@react-native-community/cli-tools": "14.0.0-alpha.11", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^6.2.3" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native-community/cli-tools": { - "version": "14.0.0-alpha.11", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.0.0-alpha.11.tgz", - "integrity": "sha512-HQCfVnX9aqRdKdLxmQy4fUAUo+YhNGlBV7ZjOayPbuEGWJ4RN+vSy0Cawk7epo7hXd6vKzc7P7y3HlU6Kxs7+w==", - "license": "MIT", - "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3", - "sudo-prompt": "^9.0.0" - } - }, "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.75.2.tgz", - "integrity": "sha512-qIC6mrlG8RQOPaYLZQiJwqnPchAVGnHWcVDeQxPMPLkM/D5+PC8tuKWYOwgLcEau3RZlgz7QQNk31Qj2/OJG6Q==", - "license": "BSD-3-Clause", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.75.3.tgz", + "integrity": "sha512-99bLQsUwsxUMNR7Wa9eV2uyR38yfd6mOEqfN+JIm8/L9sKA926oh+CZkjDy1M8RmCB6spB5N9fVFVkrVdf2yFA==", "engines": { "node": ">=18" } }, "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.75.2.tgz", - "integrity": "sha512-fTC5m2uVjYp1XPaIJBFgscnQjPdGVsl96z/RfLgXDq0HBffyqbg29ttx6yTCx7lIa9Gdvf6nKQom+e+Oa4izSw==", - "license": "MIT", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.75.3.tgz", + "integrity": "sha512-h2/6+UGmeMWjnT43axy27jNqoDRsE1C1qpjRC3sYpD4g0bI0jSTkY1kAgj8uqGGXLnHXiHOtjLDGdbAgZrsPaA==", "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.75.2", + "@react-native/debugger-frontend": "0.75.3", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -6696,48 +6135,10 @@ "node": ">=18" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@react-native/community-cli-plugin/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6746,7 +6147,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -6769,7 +6169,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -6781,7 +6180,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -6789,39 +6187,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@react-native/community-cli-plugin/node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -6829,14 +6198,12 @@ "node_modules/@react-native/community-cli-plugin/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -6848,7 +6215,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -6860,106 +6226,24 @@ } }, "node_modules/@react-native/community-cli-plugin/node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "license": "MIT", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dependencies": { - "is-wsl": "^1.1.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" }, "engines": { "node": ">=8" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/open/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/@react-native/community-cli-plugin/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "license": "MIT" - }, "node_modules/@react-native/community-cli-plugin/node_modules/ws": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", "dependencies": { "async-limiter": "~1.0.0" } @@ -7038,15 +6322,14 @@ } }, "node_modules/@react-native/eslint-config": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/eslint-config/-/eslint-config-0.75.2.tgz", - "integrity": "sha512-lelWQ/mjwCLONrZ0mrCjWYPZWYckjuVCjdADOSMuEe7/tjwUZYW/e/iQdOvy1USqFwGHLLkTjE722EmQ6P+O7A==", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/eslint-config/-/eslint-config-0.75.3.tgz", + "integrity": "sha512-BUkgQ3+irVZFfikIX3JgQQut/LABcumMZD3lzWRpf1hpbsEsXmYLo3u9qpfyYsavnqVGtWg8bLZDDGG6lmQBhA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.20.0", "@babel/eslint-parser": "^7.20.0", - "@react-native/eslint-plugin": "0.75.2", + "@react-native/eslint-plugin": "0.75.3", "@typescript-eslint/eslint-plugin": "^7.1.1", "@typescript-eslint/parser": "^7.1.1", "eslint-config-prettier": "^8.5.0", @@ -7285,41 +6568,37 @@ } }, "node_modules/@react-native/eslint-plugin": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/eslint-plugin/-/eslint-plugin-0.75.2.tgz", - "integrity": "sha512-cxvSn+io32l+mbyDcpGGGoDXMwFxsVvb1JHSdfbzxi6+94gdD+ce0gqFJY4FCPg/ebJ2gCvQ8j0lt1NoAizUuQ==", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/eslint-plugin/-/eslint-plugin-0.75.3.tgz", + "integrity": "sha512-p0BwuqflumZtUJ8VUt5YQPsYnxrwfHJZCTQ0N1X+4B8aoBNIKxtfzeIqJsSz/GvM86HGgGnd/nyxEo8IwkPo7Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@react-native/gradle-plugin": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.75.2.tgz", - "integrity": "sha512-AELeAOCZi3B2vE6SeN+mjpZjjqzqa76yfFBB3L3f3NWiu4dm/YClTGOj+5IVRRgbt8LDuRImhDoaj7ukheXr4Q==", - "license": "MIT", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.75.3.tgz", + "integrity": "sha512-mSfa/Mq/AsALuG/kvXz5ECrc6HdY5waMHal2sSfa8KA0Gt3JqYQVXF9Pdwd4yR5ClPZDI2HRa1tdE8GVlhMvPA==", "engines": { "node": ">=18" } }, "node_modules/@react-native/js-polyfills": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.75.2.tgz", - "integrity": "sha512-AtLd3mbiE+FXK2Ru3l2NFOXDhUvzdUsCP4qspUw0haVaO/9xzV97RVD2zz0lur2f/LmZqQ2+KXyYzr7048b5iw==", - "license": "MIT", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.75.3.tgz", + "integrity": "sha512-+JVFJ351GSJT3V7LuXscMqfnpR/UxzsAjbBjfAHBR3kqTbVqrAmBccqPCA3NLzgb/RY8khLJklwMUVlWrn8iFg==", "engines": { "node": ">=18" } }, "node_modules/@react-native/metro-babel-transformer": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.75.2.tgz", - "integrity": "sha512-EygglCCuOub2sZ00CSIiEekCXoGL2XbOC6ssOB47M55QKvhdPG/0WBQXvmOmiN42uZgJK99Lj749v4rB0PlPIQ==", - "license": "MIT", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.75.3.tgz", + "integrity": "sha512-gDlEl6C2mwQPLxFOR+yla5MpJpDPNOFD6J5Hd9JM9+lOdUq6MNujh1Xn4ZMvglW7rfViq3nMjg4xPQeGUhDG+w==", "dependencies": { "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.75.2", + "@react-native/babel-preset": "0.75.3", "hermes-parser": "0.22.0", "nullthrows": "^1.1.1" }, @@ -7331,14 +6610,13 @@ } }, "node_modules/@react-native/metro-config": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.75.2.tgz", - "integrity": "sha512-LBcNF0csApOirPVmRhIAAb4ovAXDhn0Dbli5LMaLCosgQwJuhb05z7s1weavcAylPPUS7DuICUQpMoRU6hZzeQ==", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.75.3.tgz", + "integrity": "sha512-BKvJGCzKMtGPfKU4v8+16xtv6iXPbnSeeD6ONvzW0Hm9amPxAP9GGweiUTwnOXUqt9XcfRhytZosiOmGa39Wqg==", "dev": true, - "license": "MIT", "dependencies": { - "@react-native/js-polyfills": "0.75.2", - "@react-native/metro-babel-transformer": "0.75.2", + "@react-native/js-polyfills": "0.75.3", + "@react-native/metro-babel-transformer": "0.75.3", "metro-config": "^0.80.3", "metro-runtime": "^0.80.3" }, @@ -7353,11 +6631,32 @@ "license": "MIT" }, "node_modules/@react-native/typescript-config": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/typescript-config/-/typescript-config-0.75.2.tgz", - "integrity": "sha512-guqu6REcuDmfjlM/B6YNqTfv4kK35gn6ungzZQdU8zznyWiXlyxR7uSSyNcy1QgEztsvO7B3HU073PBHV8RxXQ==", - "dev": true, - "license": "MIT" + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/typescript-config/-/typescript-config-0.75.3.tgz", + "integrity": "sha512-yekwhjG9lDvib+3jYwagEXcyTJ4mEryDLCoQINWCwy+7GtMx2BrKweHc4Phcc1dqmK1U/XMzVUXF3X3hc+FVPA==", + "dev": true + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.75.3.tgz", + "integrity": "sha512-cTLm7k7Y//SvV8UK8esrDHEw5OrwwSJ4Fqc3x52Imi6ROuhshfGIPFwhtn4pmAg9nWHzHwwqiJ+9hCSVnXXX+g==", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.2.6", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, "node_modules/@release-it/conventional-changelog": { "version": "5.1.1", @@ -7969,13 +7268,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/underscore": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.13.0.tgz", - "integrity": "sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/ws": { "version": "8.5.12", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", @@ -8620,6 +7912,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "license": "Apache-2.0" }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -10652,7 +9950,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "license": "Apache-2.0", "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -10666,7 +9963,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -10679,7 +9975,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -10918,16 +10213,6 @@ "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", "license": "MIT" }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -13515,7 +12800,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", "engines": { "node": ">=6" } @@ -13763,57 +13047,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz", - "integrity": "sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.4", - "@esbuild/android-arm64": "0.19.4", - "@esbuild/android-x64": "0.19.4", - "@esbuild/darwin-arm64": "0.19.4", - "@esbuild/darwin-x64": "0.19.4", - "@esbuild/freebsd-arm64": "0.19.4", - "@esbuild/freebsd-x64": "0.19.4", - "@esbuild/linux-arm": "0.19.4", - "@esbuild/linux-arm64": "0.19.4", - "@esbuild/linux-ia32": "0.19.4", - "@esbuild/linux-loong64": "0.19.4", - "@esbuild/linux-mips64el": "0.19.4", - "@esbuild/linux-ppc64": "0.19.4", - "@esbuild/linux-riscv64": "0.19.4", - "@esbuild/linux-s390x": "0.19.4", - "@esbuild/linux-x64": "0.19.4", - "@esbuild/netbsd-x64": "0.19.4", - "@esbuild/openbsd-x64": "0.19.4", - "@esbuild/sunos-x64": "0.19.4", - "@esbuild/win32-arm64": "0.19.4", - "@esbuild/win32-ia32": "0.19.4", - "@esbuild/win32-x64": "0.19.4" - } - }, - "node_modules/esbuild-plugin-tsc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/esbuild-plugin-tsc/-/esbuild-plugin-tsc-0.4.0.tgz", - "integrity": "sha512-q9gWIovt1nkwchMLc2zhyksaiHOv3kDK4b0AUol8lkMCRhJ1zavgfb2fad6BKp7FT9rh/OHmEBXVjczLoi/0yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-comments": "^2.0.1" - }, - "peerDependencies": { - "typescript": "^4.0.0 || ^5.0.0" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -15228,9 +14461,9 @@ } }, "node_modules/expensify-common": { - "version": "2.0.101", - "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.101.tgz", - "integrity": "sha512-5TStDQGsXGJjdk64PBhEdXz/3H6QDlgoanEWI076okL5un4Qd2sSRfxHRiH61foHGsswXJFIZBHK3sysKDOJ4A==", + "version": "2.0.108", + "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.108.tgz", + "integrity": "sha512-q4chHq1dxHJP/5CRTmTiIRrQKZik0Ms2yM6kjCMlCuJT/3aTlFOHCChb24TB/7TgjbSw0utj1cnFhRDfL87RWg==", "license": "MIT", "dependencies": { "awesome-phonenumber": "^5.4.0", @@ -16374,13 +15607,6 @@ "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "license": "Unlicense" }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true, - "license": "MIT" - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -20258,6 +19484,24 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, + "node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -20296,6 +19540,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -20358,6 +19611,15 @@ "node": ">=0.10.0" } }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -23544,6 +22806,91 @@ "cross-spawn": "^7.0.3" } }, + "node_modules/patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -24975,27 +24322,27 @@ "license": "MIT" }, "node_modules/react-native": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.75.2.tgz", - "integrity": "sha512-pP+Yswd/EurzAlKizytRrid9LJaPJzuNldc+o5t01md2VLHym8V7FWH2z9omFKtFTer8ERg0fAhG1fpd0Qq6bQ==", - "license": "MIT", + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.75.3.tgz", + "integrity": "sha512-+Ne6u5H+tPo36sme19SCd1u2UID2uo0J/XzAJarxmrDj4Nsdi44eyUDKtQHmhgxjRGsuVJqAYrMK0abLSq8AHw==", "dependencies": { "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "14.0.0", - "@react-native-community/cli-platform-android": "14.0.0", - "@react-native-community/cli-platform-ios": "14.0.0", - "@react-native/assets-registry": "0.75.2", - "@react-native/codegen": "0.75.2", - "@react-native/community-cli-plugin": "0.75.2", - "@react-native/gradle-plugin": "0.75.2", - "@react-native/js-polyfills": "0.75.2", - "@react-native/normalize-colors": "0.75.2", - "@react-native/virtualized-lists": "0.75.2", + "@react-native-community/cli": "14.1.0", + "@react-native-community/cli-platform-android": "14.1.0", + "@react-native-community/cli-platform-ios": "14.1.0", + "@react-native/assets-registry": "0.75.3", + "@react-native/codegen": "0.75.3", + "@react-native/community-cli-plugin": "0.75.3", + "@react-native/gradle-plugin": "0.75.3", + "@react-native/js-polyfills": "0.75.3", + "@react-native/normalize-colors": "0.75.3", + "@react-native/virtualized-lists": "0.75.3", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "base64-js": "^1.5.1", "chalk": "^4.0.0", + "commander": "^9.4.1", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", @@ -25267,6 +24614,29 @@ "node": ">=8" } }, + "node_modules/react-native-reanimated": { + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.16.3.tgz", + "integrity": "sha512-OWlA6e1oHhytTpc7WiSZ7Tmb8OYwLKYZz29Sz6d6WAg60Hm5GuAiKIWUG7Ako7FLcYhFkA0pEQ2xPMEYUo9vlw==", + "dependencies": { + "@babel/plugin-transform-arrow-functions": "^7.0.0-0", + "@babel/plugin-transform-class-properties": "^7.0.0-0", + "@babel/plugin-transform-classes": "^7.0.0-0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", + "@babel/plugin-transform-optional-chaining": "^7.0.0-0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", + "@babel/plugin-transform-template-literals": "^7.0.0-0", + "@babel/plugin-transform-unicode-regex": "^7.0.0-0", + "@babel/preset-typescript": "^7.16.7", + "convert-source-map": "^2.0.0", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native-web": { "version": "0.19.13", "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.19.13.tgz", @@ -25310,33 +24680,9 @@ } }, "node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.75.2.tgz", - "integrity": "sha512-nPwWJFtsqNFS/qSG9yDOiSJ64mjG7RCP4X/HXFfyWzCM1jq49h/DYBdr+c3e7AvTKGIdy0gGT3vgaRUHZFVdUQ==", - "license": "MIT" - }, - "node_modules/react-native/node_modules/@react-native/virtualized-lists": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.75.2.tgz", - "integrity": "sha512-pD5SVCjxc8k+JdoyQ+IlulBTEqJc3S4KUKsmv5zqbNCyETB0ZUvd4Su7bp+lLF6ALxx6KKmbGk8E3LaWEjUFFQ==", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.2.6", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "version": "0.75.3", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.75.3.tgz", + "integrity": "sha512-3mhF8AJFfIN0E5bEs/DQ4U2LzMJYm+FPSwY5bJ1DZhrxW1PFAh24bAPrSd8PwS0iarQ7biLdr1lWf/8LFv8pDA==" }, "node_modules/react-native/node_modules/@types/yargs": { "version": "15.0.19", @@ -25347,6 +24693,14 @@ "@types/yargs-parser": "*" } }, + "node_modules/react-native/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/react-native/node_modules/pretty-format": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", @@ -27319,7 +26673,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -27997,16 +27350,6 @@ "node": ">=8" } }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -30753,6 +30096,7 @@ "parser": { "name": "@expensify/react-native-live-markdown-parser", "version": "0.0.0", + "extraneous": true, "license": "ISC", "dependencies": { "expensify-common": "2.0.101" @@ -30768,108 +30112,6 @@ "typescript": "^5.3.3" } }, - "parser/node_modules/@react-native/babel-plugin-codegen": { - "version": "0.73.4", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz", - "integrity": "sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@react-native/codegen": "0.73.3" - }, - "engines": { - "node": ">=18" - } - }, - "parser/node_modules/@react-native/babel-preset": { - "version": "0.73.21", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.73.21.tgz", - "integrity": "sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.73.4", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "parser/node_modules/@react-native/codegen": { - "version": "0.73.3", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz", - "integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.0", - "flow-parser": "^0.206.0", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "parser/node_modules/flow-parser": { - "version": "0.206.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.206.0.tgz", - "integrity": "sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "WebExample": { "name": "webexample", "version": "1.0.0", diff --git a/package.json b/package.json index a6cb1b744..0a705c956 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@expensify/react-native-live-markdown", - "version": "0.1.187", + "version": "0.1.203", "description": "Drop-in replacement for React Native's TextInput component with Markdown formatting.", "main": "lib/commonjs/index", "module": "lib/module/index", @@ -10,7 +10,6 @@ "files": [ "src", "lib", - "parser/react-native-live-markdown-parser.js", "android", "apple", "cpp", @@ -32,14 +31,14 @@ "test": "jest", "typecheck": "tsc --noEmit", "lint": "eslint . --ext .js,.ts,.tsx", - "lint:root": "eslint . --ext .js,.ts,.tsx --ignore-pattern '/parser/**/*' --ignore-pattern '/example/**/*' --ignore-pattern '/WebExample/**/*'", - "lint:parser": "eslint parser --ext .js,.ts,.tsx", + "lint:root": "eslint . --ext .js,.ts,.tsx --ignore-pattern '/example/**/*' --ignore-pattern '/WebExample/**/*'", "lint:example": "eslint example --ext .js,.ts,.tsx", "lint:WebExample": "eslint WebExample --ext .js,.ts,.tsx", "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib", - "prepare": "bob build && mkdir -p lib/parser && cp parser/react-native-live-markdown-parser.js lib/parser/react-native-live-markdown-parser.js", + "prepare": "bob build", "build:watch": "nodemon --watch src --ext .ts,.tsx,.css --exec \"rm -f .build_complete && npm run prepare && npm pack && touch .build_complete\"", - "release": "release-it" + "release": "release-it", + "postinstall": "patch-package" }, "keywords": [ "react-native", @@ -65,7 +64,7 @@ "@commitlint/config-conventional": "^17.0.2", "@evilmartians/lefthook": "^1.5.0", "@lwc/eslint-plugin-lwc": "^1.7.2", - "@react-native/eslint-config": "0.75.2", + "@react-native/eslint-config": "0.75.3", "@release-it/conventional-changelog": "^5.0.0", "@types/jest": "^29.5.14", "@types/react": "~18.2.6", @@ -85,24 +84,28 @@ "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-tsdoc": "^0.2.17", + "expensify-common": "2.0.108", "jest": "^29.6.3", "jest-environment-jsdom": "^29.7.0", "nodemon": "^3.1.3", + "patch-package": "^8.0.0", "prettier": "2.8.8", "react": "18.3.1", - "react-native": "0.75.2", + "react-native": "0.75.3", "react-native-builder-bob": "^0.20.0", + "react-native-reanimated": "3.16.3", "react-native-web": "^0.19.10", "release-it": "^15.0.0", "turbo": "^1.10.7", "typescript": "~5.3.3" }, "peerDependencies": { + "expensify-common": ">=2.0.108", "react": "*", - "react-native": "*" + "react-native": "*", + "react-native-reanimated": ">=3.16.3" }, "workspaces": [ - "./parser", "./example", "./WebExample" ], diff --git a/parser/babel.config.json b/parser/babel.config.json deleted file mode 100644 index 6f126ac97..000000000 --- a/parser/babel.config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["module:@react-native/babel-preset"] -} diff --git a/parser/package.json b/parser/package.json deleted file mode 100644 index d37b83947..000000000 --- a/parser/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "@expensify/react-native-live-markdown-parser", - "version": "0.0.0", - "private": true, - "description": "", - "main": "index.js", - "scripts": { - "test": "jest", - "build": "esbuild index.ts --bundle --outfile=build/index.esbuild.js && babel build/index.esbuild.js --out-file build/index.babel.js && esbuild build/index.babel.js --bundle --minify --outfile=react-native-live-markdown-parser.js && rm -rf build", - "run": "node react-native-live-markdown-parser.js" - }, - "author": "", - "license": "ISC", - "devDependencies": { - "@babel/cli": "^7.24.7", - "@babel/core": "^7.24.7", - "@react-native/babel-preset": "0.73.21", - "@types/underscore": "^1.11.15", - "esbuild": "0.19.4", - "esbuild-plugin-tsc": "^0.4.0", - "jest": "^29.7.0", - "typescript": "^5.3.3" - }, - "dependencies": { - "expensify-common": "2.0.101" - } -} diff --git a/parser/react-native-live-markdown-parser.js b/parser/react-native-live-markdown-parser.js deleted file mode 100644 index b8efef5c0..000000000 --- a/parser/react-native-live-markdown-parser.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict";(()=>{var u2=(ie,ve)=>()=>(ve||ie((ve={exports:{}}).exports,ve),ve.exports);var y1=u2((An,Ut)=>{function H0(ie){return ie&&ie.__esModule?ie:{default:ie}}Ut.exports=H0,Ut.exports.__esModule=!0,Ut.exports.default=Ut.exports});var _1=u2((Dn,Gt)=>{function k0(ie,ve){if(!(ie instanceof ve))throw new TypeError("Cannot call a class as a function")}Gt.exports=k0,Gt.exports.__esModule=!0,Gt.exports.default=Gt.exports});var Qr=u2((mn,M2)=>{function Zr(ie){"@babel/helpers - typeof";return M2.exports=Zr=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(ve){return typeof ve}:function(ve){return ve&&typeof Symbol=="function"&&ve.constructor===Symbol&&ve!==Symbol.prototype?"symbol":typeof ve},M2.exports.__esModule=!0,M2.exports.default=M2.exports,Zr(ie)}M2.exports=Zr,M2.exports.__esModule=!0,M2.exports.default=M2.exports});var b1=u2((En,Ht)=>{var F1=Qr().default;function j0(ie,ve){if(F1(ie)!="object"||!ie)return ie;var be=ie[Symbol.toPrimitive];if(be!==void 0){var Ve=be.call(ie,ve||"default");if(F1(Ve)!="object")return Ve;throw new TypeError("@@toPrimitive must return a primitive value.")}return(ve==="string"?String:Number)(ie)}Ht.exports=j0,Ht.exports.__esModule=!0,Ht.exports.default=Ht.exports});var S1=u2((vn,kt)=>{var X0=Qr().default,V0=b1();function W0(ie){var ve=V0(ie,"string");return X0(ve)=="symbol"?ve:ve+""}kt.exports=W0,kt.exports.__esModule=!0,kt.exports.default=kt.exports});var T1=u2((Cn,jt)=>{var K0=S1();function N1(ie,ve){for(var be=0;be{function J0(ie){if(Array.isArray(ie))return ie}Xt.exports=J0,Xt.exports.__esModule=!0,Xt.exports.default=Xt.exports});var O1=u2((yn,Vt)=>{function z0(ie,ve){var be=ie==null?null:typeof Symbol<"u"&&ie[Symbol.iterator]||ie["@@iterator"];if(be!=null){var Ve,tr,rr,re,Dt=[],nt=!0,ur=!1;try{if(rr=(be=be.call(ie)).next,ve===0){if(Object(be)!==be)return;nt=!1}else for(;!(nt=(Ve=rr.call(be)).done)&&(Dt.push(Ve.value),Dt.length!==ve);nt=!0);}catch(Fr){ur=!0,tr=Fr}finally{try{if(!nt&&be.return!=null&&(re=be.return(),Object(re)!==re))return}finally{if(ur)throw tr}}return Dt}}Vt.exports=z0,Vt.exports.__esModule=!0,Vt.exports.default=Vt.exports});var e1=u2((_n,Wt)=>{function Z0(ie,ve){(ve==null||ve>ie.length)&&(ve=ie.length);for(var be=0,Ve=Array(ve);be{var R1=e1();function Q0(ie,ve){if(ie){if(typeof ie=="string")return R1(ie,ve);var be={}.toString.call(ie).slice(8,-1);return be==="Object"&&ie.constructor&&(be=ie.constructor.name),be==="Map"||be==="Set"?Array.from(ie):be==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(be)?R1(ie,ve):void 0}}Kt.exports=Q0,Kt.exports.__esModule=!0,Kt.exports.default=Kt.exports});var I1=u2((bn,Yt)=>{function en(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}Yt.exports=en,Yt.exports.__esModule=!0,Yt.exports.default=Yt.exports});var L1=u2((Sn,Jt)=>{var tn=B1(),rn=O1(),un=t1(),nn=I1();function dn(ie,ve){return tn(ie)||rn(ie,ve)||un(ie,ve)||nn()}Jt.exports=dn,Jt.exports.__esModule=!0,Jt.exports.default=Jt.exports});var w1=u2((Nn,zt)=>{var an=e1();function on(ie){if(Array.isArray(ie))return an(ie)}zt.exports=on,zt.exports.__esModule=!0,zt.exports.default=zt.exports});var M1=u2((Tn,Zt)=>{function sn(ie){if(typeof Symbol<"u"&&ie[Symbol.iterator]!=null||ie["@@iterator"]!=null)return Array.from(ie)}Zt.exports=sn,Zt.exports.__esModule=!0,Zt.exports.default=Zt.exports});var P1=u2((Bn,Qt)=>{function ln(){throw new TypeError(`Invalid attempt to spread non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}Qt.exports=ln,Qt.exports.__esModule=!0,Qt.exports.default=Qt.exports});var q1=u2((On,er)=>{var cn=w1(),fn=M1(),pn=t1(),$n=P1();function hn(ie){return cn(ie)||fn(ie)||pn(ie)||$n()}er.exports=hn,er.exports.__esModule=!0,er.exports.default=er.exports});var _r=y1(),U1=_r(_1()),G1=_r(T1()),At=_r(L1()),r1=_r(q1());(function(){var ie=Object.create,ve=Object.defineProperty,be=Object.getOwnPropertyDescriptor,Ve=Object.getOwnPropertyNames,tr=Object.getPrototypeOf,rr=Object.prototype.hasOwnProperty,re=function(m,x){return function(){return x||(0,m[Ve(m)[0]])((x={exports:{}}).exports,x),x.exports}},Dt=function(m,x,D,S){if(x&&typeof x=="object"||typeof x=="function"){var C=function(L){!rr.call(m,L)&&L!==D&&ve(m,L,{get:function(){return x[L]},enumerable:!(S=be(x,L))||S.enumerable})};for(var N of Ve(x))C(N)}return m},nt=function(m,x,D){return D=m!=null?ie(tr(m)):{},Dt(x||!m||!m.__esModule?ve(D,"default",{value:m,enumerable:!0}):D,m)},ur=re({"../node_modules/awesome-phonenumber/lib/index.js":function(m,x){(function(){var D=this||self;function S(d,o){function b(){}b.prototype=o.prototype,d.Ba=o.prototype,d.prototype=new b,d.prototype.constructor=d,d.Ha=function(k,U,X){for(var ue=Array(arguments.length-2),Ce=2;Ced.length?!1:d2(Y2,d)}function sr(d){return d2(r2,d)?v2(d,l2):v2(d,s2)}function J2(d){var o=sr(d.toString());oe(d),d.g(o)}function lr(){return Object.keys(_2).filter(function(d){return isNaN(d)})}function cr(){return Object.keys(_2).filter(function(d){return!isNaN(d)}).map(function(d){return parseInt(d,10)})}function wr(){var d=Object.keys(n2);return[].concat((0,r1.default)(cr()),(0,r1.default)(d.map(function(o){return parseInt(o,10)})))}function N2(d){return d!=null&&(y(d,9)!=1||g(d,9)[0]!=-1)}function v2(d,o){for(var b=new De,k,U=d.length,X=0;Xo?2:X[X.length-1]=U&&U<=k;++U)if(b=parseInt(d.substring(0,U),10),b in n2)return o.g(d.substring(U)),b;return 0}function R2(d,o,b,k,U){if(o.length==0)return 0;o=new De(o);var X;b!=null&&(X=s(b,11)),X==null&&(X="NonMatch");var ue=o.toString();if(ue.length==0)X=20;else if(V2.test(ue))ue=ue.replace(V2,""),oe(o),o.g(sr(ue)),X=1;else{if(ue=new RegExp(X),J2(o),X=o.toString(),X.search(ue)==0){ue=X.match(ue)[0].length;var Ce=X.substring(ue).match(c2);Ce&&Ce[1]!=null&&0=o.h.length)throw Error("Phone number too short after IDD");if(d=$r(o,k),d!=0)return r(U,1,d),d;throw Error("Invalid country calling code")}return b!=null&&(X=f(b,10),ue=""+X,Ce=o.toString(),Ce.lastIndexOf(ue,0)==0&&(ue=new De(Ce.substring(ue.length)),Ce=s(b,1),Ce=new RegExp(f(Ce,2)),Ft(ue,b,null),ue=ue.toString(),!d2(Ce,o.toString())&&d2(Ce,ue)||ot(d,o.toString(),b,-1)==3))?(k.g(ue),r(U,1,X),X):(r(U,1,0),0)}function Ft(d,o,b){var k=d.toString(),U=k.length,X=s(o,15);if(U!=0&&X!=null&&X.length!=0){var ue=new RegExp("^(?:"+X+")");if(U=ue.exec(k)){X=new RegExp(f(s(o,1),2));var Ce=d2(X,k),He=U.length-1;o=s(o,16),o==null||o.length==0||U[He]==null||U[He].length==0?(!Ce||d2(X,k.substring(U[0].length)))&&(b!=null&&0=o.length)U="";else{var X=o.indexOf(";",U);U=X!==-1?o.substring(U,X):o.substring(U)}var ue=U;if(ue==null?X=!0:ue.length===0?X=!1:(X=Ir.exec(ue),ue=Lr.exec(ue),X=X!==null||ue!==null),!X||(U!=null?(U.charAt(0)==="+"&&k.g(U),U=o.indexOf("tel:"),k.g(o.substring(0<=U?U+4:0,o.indexOf(";phone-context=")))):(U=k.g,o=o??"",X=o.search(W2),0<=X?(o=o.substring(X),o=o.replace(pe,""),X=o.search(K2),0<=X&&(o=o.substring(0,X))):o="",U.call(k,o)),o=k.toString(),U=o.indexOf(";isub="),0U.h.length||(X!=null&&(b=new De(U.toString()),Ft(b,X,new De),d=ot(d,b.toString(),X,-1),d!=2&&d!=4&&d!=5&&(U=b)),d=U.toString(),b=d.length,2>b))throw Error("The string supplied is too short to be a phone number");if(17o;++o){if(k=void 0,d.length"u"||h2.execScript("var "+et[0]);for(var Ke;et.length&&(Ke=et.shift());)et.length||me===void 0?h2[Ke]&&h2[Ke]!==Object.prototype[Ke]?h2=h2[Ke]:h2=h2[Ke]={}:h2[Ke]=me;function $t(d){return T2(d)?q2(Ge,d):0}me.getCountryCodeForRegionCode=$t,me.getRegionCodeForCountryCode=function(d){return x2(d)};function U2(d){var o={};return d.filter(function(b){return o.hasOwnProperty(b)?!1:(o[b]=1,!0)})}me.getSupportedRegionCodes=function(){return U2(lr())},me.getSupportedCallingCodes=function(){return U2(wr())},me.getExample=function(d,o){var b;return o?b=B2(d,Pr(o)):b=B2(d,0),new me(b,d).toJSON()},me.getAsYouType=function(d){return new Qe(d)},me.getNumberFrom=function(d,o){try{e:{if(I2){var b=I2.get(d);if(b){var k=b;break e}}var U;k=new me(d==null||(U=d.number)==null?void 0:U.e164,{})}return{valid:!0,number:Ct(k.l,o)}}catch(X){return{valid:!1,error:X}}},me.prototype.toJSON=function(){return this.g},me.prototype.toJSON=me.prototype.toJSON,me.prototype.ja=function(){return this.g.canBeInternationallyDialled},me.prototype.canBeInternationallyDialled=me.prototype.ja,me.prototype.ya=function(){return this.g.valid},me.prototype.isValid=me.prototype.ya,me.prototype.xa=function(){return this.g.possible},me.prototype.isPossible=me.prototype.xa,me.prototype.getType=function(){return this.g.type},me.prototype.getType=me.prototype.getType,me.prototype.sa=function(){return this.g.type==="mobile"||this.g.type==="fixed-line-or-mobile"},me.prototype.isMobile=me.prototype.sa,me.prototype.ra=function(){return this.g.type==="fixed-line"||this.g.type==="fixed-line-or-mobile"},me.prototype.isFixedLine=me.prototype.ra,me.prototype.ta=function(d){return this.g.number[d??"e164"]},me.prototype.getNumber=me.prototype.ta,me.prototype.va=function(){return this.g.regionCode},me.prototype.getRegionCode=me.prototype.va,me.prototype.ia=function(){return $t(this.g.regionCode)},me.prototype.getCountryCode=me.prototype.ia;function Qe(d){this.j=d,this.h=new hr(d),this.l=this.g=""}Qe.prototype.qa=function(d){this.g+=d;var o=this.h;return o.la=Mr(o,d),this.l=o.la},Qe.prototype.addChar=Qe.prototype.qa,Qe.prototype.za=function(){return this.l},Qe.prototype.number=Qe.prototype.za,Qe.prototype.Aa=function(){return this.g===""?this.l:this.reset(this.g.slice(0,this.g.length-1))},Qe.prototype.removeChar=Qe.prototype.Aa,Qe.prototype.reset=function(d){var o=this.h;if(o.la="",oe(o.u),oe(o.ba),oe(o.$),o.aa=0,o.da="",oe(o.h),o.s="",oe(o.g),o.v=!0,o.oa=!1,o.ca=!1,o.ea=!1,o.j=[],o.ha=!1,o.m!=o.wa&&(o.m=st(o,o.ma)),this.l=this.g="",d){o=0;for(var b=d.length;o",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":"\xA0"," ":"\xA0","¡":"\xA1","¡":"\xA1","¢":"\xA2","¢":"\xA2","£":"\xA3","£":"\xA3","¤":"\xA4","¤":"\xA4","¥":"\xA5","¥":"\xA5","¦":"\xA6","¦":"\xA6","§":"\xA7","§":"\xA7","¨":"\xA8","¨":"\xA8","©":"\xA9","©":"\xA9","ª":"\xAA","ª":"\xAA","«":"\xAB","«":"\xAB","¬":"\xAC","¬":"\xAC","­":"\xAD","­":"\xAD","®":"\xAE","®":"\xAE","¯":"\xAF","¯":"\xAF","°":"\xB0","°":"\xB0","±":"\xB1","±":"\xB1","²":"\xB2","²":"\xB2","³":"\xB3","³":"\xB3","´":"\xB4","´":"\xB4","µ":"\xB5","µ":"\xB5","¶":"\xB6","¶":"\xB6","·":"\xB7","·":"\xB7","¸":"\xB8","¸":"\xB8","¹":"\xB9","¹":"\xB9","º":"\xBA","º":"\xBA","»":"\xBB","»":"\xBB","¼":"\xBC","¼":"\xBC","½":"\xBD","½":"\xBD","¾":"\xBE","¾":"\xBE","¿":"\xBF","¿":"\xBF","À":"\xC0","À":"\xC0","Á":"\xC1","Á":"\xC1","Â":"\xC2","Â":"\xC2","Ã":"\xC3","Ã":"\xC3","Ä":"\xC4","Ä":"\xC4","Å":"\xC5","Å":"\xC5","Æ":"\xC6","Æ":"\xC6","Ç":"\xC7","Ç":"\xC7","È":"\xC8","È":"\xC8","É":"\xC9","É":"\xC9","Ê":"\xCA","Ê":"\xCA","Ë":"\xCB","Ë":"\xCB","Ì":"\xCC","Ì":"\xCC","Í":"\xCD","Í":"\xCD","Î":"\xCE","Î":"\xCE","Ï":"\xCF","Ï":"\xCF","Ð":"\xD0","Ð":"\xD0","Ñ":"\xD1","Ñ":"\xD1","Ò":"\xD2","Ò":"\xD2","Ó":"\xD3","Ó":"\xD3","Ô":"\xD4","Ô":"\xD4","Õ":"\xD5","Õ":"\xD5","Ö":"\xD6","Ö":"\xD6","×":"\xD7","×":"\xD7","Ø":"\xD8","Ø":"\xD8","Ù":"\xD9","Ù":"\xD9","Ú":"\xDA","Ú":"\xDA","Û":"\xDB","Û":"\xDB","Ü":"\xDC","Ü":"\xDC","Ý":"\xDD","Ý":"\xDD","Þ":"\xDE","Þ":"\xDE","ß":"\xDF","ß":"\xDF","à":"\xE0","à":"\xE0","á":"\xE1","á":"\xE1","â":"\xE2","â":"\xE2","ã":"\xE3","ã":"\xE3","ä":"\xE4","ä":"\xE4","å":"\xE5","å":"\xE5","æ":"\xE6","æ":"\xE6","ç":"\xE7","ç":"\xE7","è":"\xE8","è":"\xE8","é":"\xE9","é":"\xE9","ê":"\xEA","ê":"\xEA","ë":"\xEB","ë":"\xEB","ì":"\xEC","ì":"\xEC","í":"\xED","í":"\xED","î":"\xEE","î":"\xEE","ï":"\xEF","ï":"\xEF","ð":"\xF0","ð":"\xF0","ñ":"\xF1","ñ":"\xF1","ò":"\xF2","ò":"\xF2","ó":"\xF3","ó":"\xF3","ô":"\xF4","ô":"\xF4","õ":"\xF5","õ":"\xF5","ö":"\xF6","ö":"\xF6","÷":"\xF7","÷":"\xF7","ø":"\xF8","ø":"\xF8","ù":"\xF9","ù":"\xF9","ú":"\xFA","ú":"\xFA","û":"\xFB","û":"\xFB","ü":"\xFC","ü":"\xFC","ý":"\xFD","ý":"\xFD","þ":"\xFE","þ":"\xFE","ÿ":"\xFF","ÿ":"\xFF",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"\u0152","œ":"\u0153","Š":"\u0160","š":"\u0161","Ÿ":"\u0178","ˆ":"\u02C6","˜":"\u02DC"," ":"\u2002"," ":"\u2003"," ":"\u2009","‌":"\u200C","‍":"\u200D","‎":"\u200E","‏":"\u200F","–":"\u2013","—":"\u2014","‘":"\u2018","’":"\u2019","‚":"\u201A","“":"\u201C","”":"\u201D","„":"\u201E","†":"\u2020","‡":"\u2021","‰":"\u2030","‹":"\u2039","›":"\u203A","€":"\u20AC","ƒ":"\u0192","Α":"\u0391","Β":"\u0392","Γ":"\u0393","Δ":"\u0394","Ε":"\u0395","Ζ":"\u0396","Η":"\u0397","Θ":"\u0398","Ι":"\u0399","Κ":"\u039A","Λ":"\u039B","Μ":"\u039C","Ν":"\u039D","Ξ":"\u039E","Ο":"\u039F","Π":"\u03A0","Ρ":"\u03A1","Σ":"\u03A3","Τ":"\u03A4","Υ":"\u03A5","Φ":"\u03A6","Χ":"\u03A7","Ψ":"\u03A8","Ω":"\u03A9","α":"\u03B1","β":"\u03B2","γ":"\u03B3","δ":"\u03B4","ε":"\u03B5","ζ":"\u03B6","η":"\u03B7","θ":"\u03B8","ι":"\u03B9","κ":"\u03BA","λ":"\u03BB","μ":"\u03BC","ν":"\u03BD","ξ":"\u03BE","ο":"\u03BF","π":"\u03C0","ρ":"\u03C1","ς":"\u03C2","σ":"\u03C3","τ":"\u03C4","υ":"\u03C5","φ":"\u03C6","χ":"\u03C7","ψ":"\u03C8","ω":"\u03C9","ϑ":"\u03D1","ϒ":"\u03D2","ϖ":"\u03D6","•":"\u2022","…":"\u2026","′":"\u2032","″":"\u2033","‾":"\u203E","⁄":"\u2044","℘":"\u2118","ℑ":"\u2111","ℜ":"\u211C","™":"\u2122","ℵ":"\u2135","←":"\u2190","↑":"\u2191","→":"\u2192","↓":"\u2193","↔":"\u2194","↵":"\u21B5","⇐":"\u21D0","⇑":"\u21D1","⇒":"\u21D2","⇓":"\u21D3","⇔":"\u21D4","∀":"\u2200","∂":"\u2202","∃":"\u2203","∅":"\u2205","∇":"\u2207","∈":"\u2208","∉":"\u2209","∋":"\u220B","∏":"\u220F","∑":"\u2211","−":"\u2212","∗":"\u2217","√":"\u221A","∝":"\u221D","∞":"\u221E","∠":"\u2220","∧":"\u2227","∨":"\u2228","∩":"\u2229","∪":"\u222A","∫":"\u222B","∴":"\u2234","∼":"\u223C","≅":"\u2245","≈":"\u2248","≠":"\u2260","≡":"\u2261","≤":"\u2264","≥":"\u2265","⊂":"\u2282","⊃":"\u2283","⊄":"\u2284","⊆":"\u2286","⊇":"\u2287","⊕":"\u2295","⊗":"\u2297","⊥":"\u22A5","⋅":"\u22C5","⌈":"\u2308","⌉":"\u2309","⌊":"\u230A","⌋":"\u230B","⟨":"\u2329","⟩":"\u232A","◊":"\u25CA","♠":"\u2660","♣":"\u2663","♥":"\u2665","♦":"\u2666"},characters:{"'":"'","\xA0":" ","\xA1":"¡","\xA2":"¢","\xA3":"£","\xA4":"¤","\xA5":"¥","\xA6":"¦","\xA7":"§","\xA8":"¨","\xA9":"©",\u00AA:"ª","\xAB":"«","\xAC":"¬","\xAD":"­","\xAE":"®","\xAF":"¯","\xB0":"°","\xB1":"±","\xB2":"²","\xB3":"³","\xB4":"´",\u00B5:"µ","\xB6":"¶","\xB7":"·","\xB8":"¸","\xB9":"¹",\u00BA:"º","\xBB":"»","\xBC":"¼","\xBD":"½","\xBE":"¾","\xBF":"¿",\u00C0:"À",\u00C1:"Á",\u00C2:"Â",\u00C3:"Ã",\u00C4:"Ä",\u00C5:"Å",\u00C6:"Æ",\u00C7:"Ç",\u00C8:"È",\u00C9:"É",\u00CA:"Ê",\u00CB:"Ë",\u00CC:"Ì",\u00CD:"Í",\u00CE:"Î",\u00CF:"Ï",\u00D0:"Ð",\u00D1:"Ñ",\u00D2:"Ò",\u00D3:"Ó",\u00D4:"Ô",\u00D5:"Õ",\u00D6:"Ö","\xD7":"×",\u00D8:"Ø",\u00D9:"Ù",\u00DA:"Ú",\u00DB:"Û",\u00DC:"Ü",\u00DD:"Ý",\u00DE:"Þ",\u00DF:"ß",\u00E0:"à",\u00E1:"á",\u00E2:"â",\u00E3:"ã",\u00E4:"ä",\u00E5:"å",\u00E6:"æ",\u00E7:"ç",\u00E8:"è",\u00E9:"é",\u00EA:"ê",\u00EB:"ë",\u00EC:"ì",\u00ED:"í",\u00EE:"î",\u00EF:"ï",\u00F0:"ð",\u00F1:"ñ",\u00F2:"ò",\u00F3:"ó",\u00F4:"ô",\u00F5:"õ",\u00F6:"ö","\xF7":"÷",\u00F8:"ø",\u00F9:"ù",\u00FA:"ú",\u00FB:"û",\u00FC:"ü",\u00FD:"ý",\u00FE:"þ",\u00FF:"ÿ",'"':""","&":"&","<":"<",">":">",\u0152:"Œ",\u0153:"œ",\u0160:"Š",\u0161:"š",\u0178:"Ÿ","\u02C6":"ˆ","\u02DC":"˜","\u2002":" ","\u2003":" ","\u2009":" ","\u200C":"‌","\u200D":"‍","\u200E":"‎","\u200F":"‏","\u2013":"–","\u2014":"—","\u2018":"‘","\u2019":"’","\u201A":"‚","\u201C":"“","\u201D":"”","\u201E":"„","\u2020":"†","\u2021":"‡","\u2030":"‰","\u2039":"‹","\u203A":"›","\u20AC":"€",\u0192:"ƒ",\u0391:"Α",\u0392:"Β",\u0393:"Γ",\u0394:"Δ",\u0395:"Ε",\u0396:"Ζ",\u0397:"Η",\u0398:"Θ",\u0399:"Ι",\u039A:"Κ",\u039B:"Λ",\u039C:"Μ",\u039D:"Ν",\u039E:"Ξ",\u039F:"Ο",\u03A0:"Π",\u03A1:"Ρ",\u03A3:"Σ",\u03A4:"Τ",\u03A5:"Υ",\u03A6:"Φ",\u03A7:"Χ",\u03A8:"Ψ",\u03A9:"Ω",\u03B1:"α",\u03B2:"β",\u03B3:"γ",\u03B4:"δ",\u03B5:"ε",\u03B6:"ζ",\u03B7:"η",\u03B8:"θ",\u03B9:"ι",\u03BA:"κ",\u03BB:"λ",\u03BC:"μ",\u03BD:"ν",\u03BE:"ξ",\u03BF:"ο",\u03C0:"π",\u03C1:"ρ",\u03C2:"ς",\u03C3:"σ",\u03C4:"τ",\u03C5:"υ",\u03C6:"φ",\u03C7:"χ",\u03C8:"ψ",\u03C9:"ω",\u03D1:"ϑ",\u03D2:"ϒ",\u03D6:"ϖ","\u2022":"•","\u2026":"…","\u2032":"′","\u2033":"″","\u203E":"‾","\u2044":"⁄","\u2118":"℘",\u2111:"ℑ",\u211C:"ℜ","\u2122":"™",\u2135:"ℵ","\u2190":"←","\u2191":"↑","\u2192":"→","\u2193":"↓","\u2194":"↔","\u21B5":"↵","\u21D0":"⇐","\u21D1":"⇑","\u21D2":"⇒","\u21D3":"⇓","\u21D4":"⇔","\u2200":"∀","\u2202":"∂","\u2203":"∃","\u2205":"∅","\u2207":"∇","\u2208":"∈","\u2209":"∉","\u220B":"∋","\u220F":"∏","\u2211":"∑","\u2212":"−","\u2217":"∗","\u221A":"√","\u221D":"∝","\u221E":"∞","\u2220":"∠","\u2227":"∧","\u2228":"∨","\u2229":"∩","\u222A":"∪","\u222B":"∫","\u2234":"∴","\u223C":"∼","\u2245":"≅","\u2248":"≈","\u2260":"≠","\u2261":"≡","\u2264":"≤","\u2265":"≥","\u2282":"⊂","\u2283":"⊃","\u2284":"⊄","\u2286":"⊆","\u2287":"⊇","\u2295":"⊕","\u2297":"⊗","\u22A5":"⊥","\u22C5":"⋅","\u2308":"⌈","\u2309":"⌉","\u230A":"⌊","\u230B":"⌋","\u2329":"⟨","\u232A":"⟩","\u25CA":"◊","\u2660":"♠","\u2663":"♣","\u2665":"♥","\u2666":"♦"}},html5:{entities:{"Æ":"\xC6","Æ":"\xC6","&":"&","&":"&","Á":"\xC1","Á":"\xC1","Ă":"\u0102","Â":"\xC2","Â":"\xC2","А":"\u0410","𝔄":"\u{1D504}","À":"\xC0","À":"\xC0","Α":"\u0391","Ā":"\u0100","⩓":"\u2A53","Ą":"\u0104","𝔸":"\u{1D538}","⁡":"\u2061","Å":"\xC5","Å":"\xC5","𝒜":"\u{1D49C}","≔":"\u2254","Ã":"\xC3","Ã":"\xC3","Ä":"\xC4","Ä":"\xC4","∖":"\u2216","⫧":"\u2AE7","⌆":"\u2306","Б":"\u0411","∵":"\u2235","ℬ":"\u212C","Β":"\u0392","𝔅":"\u{1D505}","𝔹":"\u{1D539}","˘":"\u02D8","ℬ":"\u212C","≎":"\u224E","Ч":"\u0427","©":"\xA9","©":"\xA9","Ć":"\u0106","⋒":"\u22D2","ⅅ":"\u2145","ℭ":"\u212D","Č":"\u010C","Ç":"\xC7","Ç":"\xC7","Ĉ":"\u0108","∰":"\u2230","Ċ":"\u010A","¸":"\xB8","·":"\xB7","ℭ":"\u212D","Χ":"\u03A7","⊙":"\u2299","⊖":"\u2296","⊕":"\u2295","⊗":"\u2297","∲":"\u2232","”":"\u201D","’":"\u2019","∷":"\u2237","⩴":"\u2A74","≡":"\u2261","∯":"\u222F","∮":"\u222E","ℂ":"\u2102","∐":"\u2210","∳":"\u2233","⨯":"\u2A2F","𝒞":"\u{1D49E}","⋓":"\u22D3","≍":"\u224D","ⅅ":"\u2145","⤑":"\u2911","Ђ":"\u0402","Ѕ":"\u0405","Џ":"\u040F","‡":"\u2021","↡":"\u21A1","⫤":"\u2AE4","Ď":"\u010E","Д":"\u0414","∇":"\u2207","Δ":"\u0394","𝔇":"\u{1D507}","´":"\xB4","˙":"\u02D9","˝":"\u02DD","`":"`","˜":"\u02DC","⋄":"\u22C4","ⅆ":"\u2146","𝔻":"\u{1D53B}","¨":"\xA8","⃜":"\u20DC","≐":"\u2250","∯":"\u222F","¨":"\xA8","⇓":"\u21D3","⇐":"\u21D0","⇔":"\u21D4","⫤":"\u2AE4","⟸":"\u27F8","⟺":"\u27FA","⟹":"\u27F9","⇒":"\u21D2","⊨":"\u22A8","⇑":"\u21D1","⇕":"\u21D5","∥":"\u2225","↓":"\u2193","⤓":"\u2913","⇵":"\u21F5","̑":"\u0311","⥐":"\u2950","⥞":"\u295E","↽":"\u21BD","⥖":"\u2956","⥟":"\u295F","⇁":"\u21C1","⥗":"\u2957","⊤":"\u22A4","↧":"\u21A7","⇓":"\u21D3","𝒟":"\u{1D49F}","Đ":"\u0110","Ŋ":"\u014A","Ð":"\xD0","Ð":"\xD0","É":"\xC9","É":"\xC9","Ě":"\u011A","Ê":"\xCA","Ê":"\xCA","Э":"\u042D","Ė":"\u0116","𝔈":"\u{1D508}","È":"\xC8","È":"\xC8","∈":"\u2208","Ē":"\u0112","◻":"\u25FB","▫":"\u25AB","Ę":"\u0118","𝔼":"\u{1D53C}","Ε":"\u0395","⩵":"\u2A75","≂":"\u2242","⇌":"\u21CC","ℰ":"\u2130","⩳":"\u2A73","Η":"\u0397","Ë":"\xCB","Ë":"\xCB","∃":"\u2203","ⅇ":"\u2147","Ф":"\u0424","𝔉":"\u{1D509}","◼":"\u25FC","▪":"\u25AA","𝔽":"\u{1D53D}","∀":"\u2200","ℱ":"\u2131","ℱ":"\u2131","Ѓ":"\u0403",">":">",">":">","Γ":"\u0393","Ϝ":"\u03DC","Ğ":"\u011E","Ģ":"\u0122","Ĝ":"\u011C","Г":"\u0413","Ġ":"\u0120","𝔊":"\u{1D50A}","⋙":"\u22D9","𝔾":"\u{1D53E}","≥":"\u2265","⋛":"\u22DB","≧":"\u2267","⪢":"\u2AA2","≷":"\u2277","⩾":"\u2A7E","≳":"\u2273","𝒢":"\u{1D4A2}","≫":"\u226B","Ъ":"\u042A","ˇ":"\u02C7","^":"^","Ĥ":"\u0124","ℌ":"\u210C","ℋ":"\u210B","ℍ":"\u210D","─":"\u2500","ℋ":"\u210B","Ħ":"\u0126","≎":"\u224E","≏":"\u224F","Е":"\u0415","IJ":"\u0132","Ё":"\u0401","Í":"\xCD","Í":"\xCD","Î":"\xCE","Î":"\xCE","И":"\u0418","İ":"\u0130","ℑ":"\u2111","Ì":"\xCC","Ì":"\xCC","ℑ":"\u2111","Ī":"\u012A","ⅈ":"\u2148","⇒":"\u21D2","∬":"\u222C","∫":"\u222B","⋂":"\u22C2","⁣":"\u2063","⁢":"\u2062","Į":"\u012E","𝕀":"\u{1D540}","Ι":"\u0399","ℐ":"\u2110","Ĩ":"\u0128","І":"\u0406","Ï":"\xCF","Ï":"\xCF","Ĵ":"\u0134","Й":"\u0419","𝔍":"\u{1D50D}","𝕁":"\u{1D541}","𝒥":"\u{1D4A5}","Ј":"\u0408","Є":"\u0404","Х":"\u0425","Ќ":"\u040C","Κ":"\u039A","Ķ":"\u0136","К":"\u041A","𝔎":"\u{1D50E}","𝕂":"\u{1D542}","𝒦":"\u{1D4A6}","Љ":"\u0409","<":"<","<":"<","Ĺ":"\u0139","Λ":"\u039B","⟪":"\u27EA","ℒ":"\u2112","↞":"\u219E","Ľ":"\u013D","Ļ":"\u013B","Л":"\u041B","⟨":"\u27E8","←":"\u2190","⇤":"\u21E4","⇆":"\u21C6","⌈":"\u2308","⟦":"\u27E6","⥡":"\u2961","⇃":"\u21C3","⥙":"\u2959","⌊":"\u230A","↔":"\u2194","⥎":"\u294E","⊣":"\u22A3","↤":"\u21A4","⥚":"\u295A","⊲":"\u22B2","⧏":"\u29CF","⊴":"\u22B4","⥑":"\u2951","⥠":"\u2960","↿":"\u21BF","⥘":"\u2958","↼":"\u21BC","⥒":"\u2952","⇐":"\u21D0","⇔":"\u21D4","⋚":"\u22DA","≦":"\u2266","≶":"\u2276","⪡":"\u2AA1","⩽":"\u2A7D","≲":"\u2272","𝔏":"\u{1D50F}","⋘":"\u22D8","⇚":"\u21DA","Ŀ":"\u013F","⟵":"\u27F5","⟷":"\u27F7","⟶":"\u27F6","⟸":"\u27F8","⟺":"\u27FA","⟹":"\u27F9","𝕃":"\u{1D543}","↙":"\u2199","↘":"\u2198","ℒ":"\u2112","↰":"\u21B0","Ł":"\u0141","≪":"\u226A","⤅":"\u2905","М":"\u041C"," ":"\u205F","ℳ":"\u2133","𝔐":"\u{1D510}","∓":"\u2213","𝕄":"\u{1D544}","ℳ":"\u2133","Μ":"\u039C","Њ":"\u040A","Ń":"\u0143","Ň":"\u0147","Ņ":"\u0145","Н":"\u041D","​":"\u200B","​":"\u200B","​":"\u200B","​":"\u200B","≫":"\u226B","≪":"\u226A"," ":` -`,"𝔑":"\u{1D511}","⁠":"\u2060"," ":"\xA0","ℕ":"\u2115","⫬":"\u2AEC","≢":"\u2262","≭":"\u226D","∦":"\u2226","∉":"\u2209","≠":"\u2260","≂̸":"\u2242\u0338","∄":"\u2204","≯":"\u226F","≱":"\u2271","≧̸":"\u2267\u0338","≫̸":"\u226B\u0338","≹":"\u2279","⩾̸":"\u2A7E\u0338","≵":"\u2275","≎̸":"\u224E\u0338","≏̸":"\u224F\u0338","⋪":"\u22EA","⧏̸":"\u29CF\u0338","⋬":"\u22EC","≮":"\u226E","≰":"\u2270","≸":"\u2278","≪̸":"\u226A\u0338","⩽̸":"\u2A7D\u0338","≴":"\u2274","⪢̸":"\u2AA2\u0338","⪡̸":"\u2AA1\u0338","⊀":"\u2280","⪯̸":"\u2AAF\u0338","⋠":"\u22E0","∌":"\u220C","⋫":"\u22EB","⧐̸":"\u29D0\u0338","⋭":"\u22ED","⊏̸":"\u228F\u0338","⋢":"\u22E2","⊐̸":"\u2290\u0338","⋣":"\u22E3","⊂⃒":"\u2282\u20D2","⊈":"\u2288","⊁":"\u2281","⪰̸":"\u2AB0\u0338","⋡":"\u22E1","≿̸":"\u227F\u0338","⊃⃒":"\u2283\u20D2","⊉":"\u2289","≁":"\u2241","≄":"\u2244","≇":"\u2247","≉":"\u2249","∤":"\u2224","𝒩":"\u{1D4A9}","Ñ":"\xD1","Ñ":"\xD1","Ν":"\u039D","Œ":"\u0152","Ó":"\xD3","Ó":"\xD3","Ô":"\xD4","Ô":"\xD4","О":"\u041E","Ő":"\u0150","𝔒":"\u{1D512}","Ò":"\xD2","Ò":"\xD2","Ō":"\u014C","Ω":"\u03A9","Ο":"\u039F","𝕆":"\u{1D546}","“":"\u201C","‘":"\u2018","⩔":"\u2A54","𝒪":"\u{1D4AA}","Ø":"\xD8","Ø":"\xD8","Õ":"\xD5","Õ":"\xD5","⨷":"\u2A37","Ö":"\xD6","Ö":"\xD6","‾":"\u203E","⏞":"\u23DE","⎴":"\u23B4","⏜":"\u23DC","∂":"\u2202","П":"\u041F","𝔓":"\u{1D513}","Φ":"\u03A6","Π":"\u03A0","±":"\xB1","ℌ":"\u210C","ℙ":"\u2119","⪻":"\u2ABB","≺":"\u227A","⪯":"\u2AAF","≼":"\u227C","≾":"\u227E","″":"\u2033","∏":"\u220F","∷":"\u2237","∝":"\u221D","𝒫":"\u{1D4AB}","Ψ":"\u03A8",""":'"',""":'"',"𝔔":"\u{1D514}","ℚ":"\u211A","𝒬":"\u{1D4AC}","⤐":"\u2910","®":"\xAE","®":"\xAE","Ŕ":"\u0154","⟫":"\u27EB","↠":"\u21A0","⤖":"\u2916","Ř":"\u0158","Ŗ":"\u0156","Р":"\u0420","ℜ":"\u211C","∋":"\u220B","⇋":"\u21CB","⥯":"\u296F","ℜ":"\u211C","Ρ":"\u03A1","⟩":"\u27E9","→":"\u2192","⇥":"\u21E5","⇄":"\u21C4","⌉":"\u2309","⟧":"\u27E7","⥝":"\u295D","⇂":"\u21C2","⥕":"\u2955","⌋":"\u230B","⊢":"\u22A2","↦":"\u21A6","⥛":"\u295B","⊳":"\u22B3","⧐":"\u29D0","⊵":"\u22B5","⥏":"\u294F","⥜":"\u295C","↾":"\u21BE","⥔":"\u2954","⇀":"\u21C0","⥓":"\u2953","⇒":"\u21D2","ℝ":"\u211D","⥰":"\u2970","⇛":"\u21DB","ℛ":"\u211B","↱":"\u21B1","⧴":"\u29F4","Щ":"\u0429","Ш":"\u0428","Ь":"\u042C","Ś":"\u015A","⪼":"\u2ABC","Š":"\u0160","Ş":"\u015E","Ŝ":"\u015C","С":"\u0421","𝔖":"\u{1D516}","↓":"\u2193","←":"\u2190","→":"\u2192","↑":"\u2191","Σ":"\u03A3","∘":"\u2218","𝕊":"\u{1D54A}","√":"\u221A","□":"\u25A1","⊓":"\u2293","⊏":"\u228F","⊑":"\u2291","⊐":"\u2290","⊒":"\u2292","⊔":"\u2294","𝒮":"\u{1D4AE}","⋆":"\u22C6","⋐":"\u22D0","⋐":"\u22D0","⊆":"\u2286","≻":"\u227B","⪰":"\u2AB0","≽":"\u227D","≿":"\u227F","∋":"\u220B","∑":"\u2211","⋑":"\u22D1","⊃":"\u2283","⊇":"\u2287","⋑":"\u22D1","Þ":"\xDE","Þ":"\xDE","™":"\u2122","Ћ":"\u040B","Ц":"\u0426"," ":" ","Τ":"\u03A4","Ť":"\u0164","Ţ":"\u0162","Т":"\u0422","𝔗":"\u{1D517}","∴":"\u2234","Θ":"\u0398","  ":"\u205F\u200A"," ":"\u2009","∼":"\u223C","≃":"\u2243","≅":"\u2245","≈":"\u2248","𝕋":"\u{1D54B}","⃛":"\u20DB","𝒯":"\u{1D4AF}","Ŧ":"\u0166","Ú":"\xDA","Ú":"\xDA","↟":"\u219F","⥉":"\u2949","Ў":"\u040E","Ŭ":"\u016C","Û":"\xDB","Û":"\xDB","У":"\u0423","Ű":"\u0170","𝔘":"\u{1D518}","Ù":"\xD9","Ù":"\xD9","Ū":"\u016A","_":"_","⏟":"\u23DF","⎵":"\u23B5","⏝":"\u23DD","⋃":"\u22C3","⊎":"\u228E","Ų":"\u0172","𝕌":"\u{1D54C}","↑":"\u2191","⤒":"\u2912","⇅":"\u21C5","↕":"\u2195","⥮":"\u296E","⊥":"\u22A5","↥":"\u21A5","⇑":"\u21D1","⇕":"\u21D5","↖":"\u2196","↗":"\u2197","ϒ":"\u03D2","Υ":"\u03A5","Ů":"\u016E","𝒰":"\u{1D4B0}","Ũ":"\u0168","Ü":"\xDC","Ü":"\xDC","⊫":"\u22AB","⫫":"\u2AEB","В":"\u0412","⊩":"\u22A9","⫦":"\u2AE6","⋁":"\u22C1","‖":"\u2016","‖":"\u2016","∣":"\u2223","|":"|","❘":"\u2758","≀":"\u2240"," ":"\u200A","𝔙":"\u{1D519}","𝕍":"\u{1D54D}","𝒱":"\u{1D4B1}","⊪":"\u22AA","Ŵ":"\u0174","⋀":"\u22C0","𝔚":"\u{1D51A}","𝕎":"\u{1D54E}","𝒲":"\u{1D4B2}","𝔛":"\u{1D51B}","Ξ":"\u039E","𝕏":"\u{1D54F}","𝒳":"\u{1D4B3}","Я":"\u042F","Ї":"\u0407","Ю":"\u042E","Ý":"\xDD","Ý":"\xDD","Ŷ":"\u0176","Ы":"\u042B","𝔜":"\u{1D51C}","𝕐":"\u{1D550}","𝒴":"\u{1D4B4}","Ÿ":"\u0178","Ж":"\u0416","Ź":"\u0179","Ž":"\u017D","З":"\u0417","Ż":"\u017B","​":"\u200B","Ζ":"\u0396","ℨ":"\u2128","ℤ":"\u2124","𝒵":"\u{1D4B5}","á":"\xE1","á":"\xE1","ă":"\u0103","∾":"\u223E","∾̳":"\u223E\u0333","∿":"\u223F","â":"\xE2","â":"\xE2","´":"\xB4","´":"\xB4","а":"\u0430","æ":"\xE6","æ":"\xE6","⁡":"\u2061","𝔞":"\u{1D51E}","à":"\xE0","à":"\xE0","ℵ":"\u2135","ℵ":"\u2135","α":"\u03B1","ā":"\u0101","⨿":"\u2A3F","&":"&","&":"&","∧":"\u2227","⩕":"\u2A55","⩜":"\u2A5C","⩘":"\u2A58","⩚":"\u2A5A","∠":"\u2220","⦤":"\u29A4","∠":"\u2220","∡":"\u2221","⦨":"\u29A8","⦩":"\u29A9","⦪":"\u29AA","⦫":"\u29AB","⦬":"\u29AC","⦭":"\u29AD","⦮":"\u29AE","⦯":"\u29AF","∟":"\u221F","⊾":"\u22BE","⦝":"\u299D","∢":"\u2222","Å":"\xC5","⍼":"\u237C","ą":"\u0105","𝕒":"\u{1D552}","≈":"\u2248","⩰":"\u2A70","⩯":"\u2A6F","≊":"\u224A","≋":"\u224B","'":"'","≈":"\u2248","≊":"\u224A","å":"\xE5","å":"\xE5","𝒶":"\u{1D4B6}","*":"*","≈":"\u2248","≍":"\u224D","ã":"\xE3","ã":"\xE3","ä":"\xE4","ä":"\xE4","∳":"\u2233","⨑":"\u2A11","⫭":"\u2AED","≌":"\u224C","϶":"\u03F6","‵":"\u2035","∽":"\u223D","⋍":"\u22CD","⊽":"\u22BD","⌅":"\u2305","⌅":"\u2305","⎵":"\u23B5","⎶":"\u23B6","≌":"\u224C","б":"\u0431","„":"\u201E","∵":"\u2235","∵":"\u2235","⦰":"\u29B0","϶":"\u03F6","ℬ":"\u212C","β":"\u03B2","ℶ":"\u2136","≬":"\u226C","𝔟":"\u{1D51F}","⋂":"\u22C2","◯":"\u25EF","⋃":"\u22C3","⨀":"\u2A00","⨁":"\u2A01","⨂":"\u2A02","⨆":"\u2A06","★":"\u2605","▽":"\u25BD","△":"\u25B3","⨄":"\u2A04","⋁":"\u22C1","⋀":"\u22C0","⤍":"\u290D","⧫":"\u29EB","▪":"\u25AA","▴":"\u25B4","▾":"\u25BE","◂":"\u25C2","▸":"\u25B8","␣":"\u2423","▒":"\u2592","░":"\u2591","▓":"\u2593","█":"\u2588","=⃥":"=\u20E5","≡⃥":"\u2261\u20E5","⌐":"\u2310","𝕓":"\u{1D553}","⊥":"\u22A5","⊥":"\u22A5","⋈":"\u22C8","╗":"\u2557","╔":"\u2554","╖":"\u2556","╓":"\u2553","═":"\u2550","╦":"\u2566","╩":"\u2569","╤":"\u2564","╧":"\u2567","╝":"\u255D","╚":"\u255A","╜":"\u255C","╙":"\u2559","║":"\u2551","╬":"\u256C","╣":"\u2563","╠":"\u2560","╫":"\u256B","╢":"\u2562","╟":"\u255F","⧉":"\u29C9","╕":"\u2555","╒":"\u2552","┐":"\u2510","┌":"\u250C","─":"\u2500","╥":"\u2565","╨":"\u2568","┬":"\u252C","┴":"\u2534","⊟":"\u229F","⊞":"\u229E","⊠":"\u22A0","╛":"\u255B","╘":"\u2558","┘":"\u2518","└":"\u2514","│":"\u2502","╪":"\u256A","╡":"\u2561","╞":"\u255E","┼":"\u253C","┤":"\u2524","├":"\u251C","‵":"\u2035","˘":"\u02D8","¦":"\xA6","¦":"\xA6","𝒷":"\u{1D4B7}","⁏":"\u204F","∽":"\u223D","⋍":"\u22CD","\":"\\","⧅":"\u29C5","⟈":"\u27C8","•":"\u2022","•":"\u2022","≎":"\u224E","⪮":"\u2AAE","≏":"\u224F","≏":"\u224F","ć":"\u0107","∩":"\u2229","⩄":"\u2A44","⩉":"\u2A49","⩋":"\u2A4B","⩇":"\u2A47","⩀":"\u2A40","∩︀":"\u2229\uFE00","⁁":"\u2041","ˇ":"\u02C7","⩍":"\u2A4D","č":"\u010D","ç":"\xE7","ç":"\xE7","ĉ":"\u0109","⩌":"\u2A4C","⩐":"\u2A50","ċ":"\u010B","¸":"\xB8","¸":"\xB8","⦲":"\u29B2","¢":"\xA2","¢":"\xA2","·":"\xB7","𝔠":"\u{1D520}","ч":"\u0447","✓":"\u2713","✓":"\u2713","χ":"\u03C7","○":"\u25CB","⧃":"\u29C3","ˆ":"\u02C6","≗":"\u2257","↺":"\u21BA","↻":"\u21BB","®":"\xAE","Ⓢ":"\u24C8","⊛":"\u229B","⊚":"\u229A","⊝":"\u229D","≗":"\u2257","⨐":"\u2A10","⫯":"\u2AEF","⧂":"\u29C2","♣":"\u2663","♣":"\u2663",":":":","≔":"\u2254","≔":"\u2254",",":",","@":"@","∁":"\u2201","∘":"\u2218","∁":"\u2201","ℂ":"\u2102","≅":"\u2245","⩭":"\u2A6D","∮":"\u222E","𝕔":"\u{1D554}","∐":"\u2210","©":"\xA9","©":"\xA9","℗":"\u2117","↵":"\u21B5","✗":"\u2717","𝒸":"\u{1D4B8}","⫏":"\u2ACF","⫑":"\u2AD1","⫐":"\u2AD0","⫒":"\u2AD2","⋯":"\u22EF","⤸":"\u2938","⤵":"\u2935","⋞":"\u22DE","⋟":"\u22DF","↶":"\u21B6","⤽":"\u293D","∪":"\u222A","⩈":"\u2A48","⩆":"\u2A46","⩊":"\u2A4A","⊍":"\u228D","⩅":"\u2A45","∪︀":"\u222A\uFE00","↷":"\u21B7","⤼":"\u293C","⋞":"\u22DE","⋟":"\u22DF","⋎":"\u22CE","⋏":"\u22CF","¤":"\xA4","¤":"\xA4","↶":"\u21B6","↷":"\u21B7","⋎":"\u22CE","⋏":"\u22CF","∲":"\u2232","∱":"\u2231","⌭":"\u232D","⇓":"\u21D3","⥥":"\u2965","†":"\u2020","ℸ":"\u2138","↓":"\u2193","‐":"\u2010","⊣":"\u22A3","⤏":"\u290F","˝":"\u02DD","ď":"\u010F","д":"\u0434","ⅆ":"\u2146","‡":"\u2021","⇊":"\u21CA","⩷":"\u2A77","°":"\xB0","°":"\xB0","δ":"\u03B4","⦱":"\u29B1","⥿":"\u297F","𝔡":"\u{1D521}","⇃":"\u21C3","⇂":"\u21C2","⋄":"\u22C4","⋄":"\u22C4","♦":"\u2666","♦":"\u2666","¨":"\xA8","ϝ":"\u03DD","⋲":"\u22F2","÷":"\xF7","÷":"\xF7","÷":"\xF7","⋇":"\u22C7","⋇":"\u22C7","ђ":"\u0452","⌞":"\u231E","⌍":"\u230D","$":"$","𝕕":"\u{1D555}","˙":"\u02D9","≐":"\u2250","≑":"\u2251","∸":"\u2238","∔":"\u2214","⊡":"\u22A1","⌆":"\u2306","↓":"\u2193","⇊":"\u21CA","⇃":"\u21C3","⇂":"\u21C2","⤐":"\u2910","⌟":"\u231F","⌌":"\u230C","𝒹":"\u{1D4B9}","ѕ":"\u0455","⧶":"\u29F6","đ":"\u0111","⋱":"\u22F1","▿":"\u25BF","▾":"\u25BE","⇵":"\u21F5","⥯":"\u296F","⦦":"\u29A6","џ":"\u045F","⟿":"\u27FF","⩷":"\u2A77","≑":"\u2251","é":"\xE9","é":"\xE9","⩮":"\u2A6E","ě":"\u011B","≖":"\u2256","ê":"\xEA","ê":"\xEA","≕":"\u2255","э":"\u044D","ė":"\u0117","ⅇ":"\u2147","≒":"\u2252","𝔢":"\u{1D522}","⪚":"\u2A9A","è":"\xE8","è":"\xE8","⪖":"\u2A96","⪘":"\u2A98","⪙":"\u2A99","⏧":"\u23E7","ℓ":"\u2113","⪕":"\u2A95","⪗":"\u2A97","ē":"\u0113","∅":"\u2205","∅":"\u2205","∅":"\u2205"," ":"\u2004"," ":"\u2005"," ":"\u2003","ŋ":"\u014B"," ":"\u2002","ę":"\u0119","𝕖":"\u{1D556}","⋕":"\u22D5","⧣":"\u29E3","⩱":"\u2A71","ε":"\u03B5","ε":"\u03B5","ϵ":"\u03F5","≖":"\u2256","≕":"\u2255","≂":"\u2242","⪖":"\u2A96","⪕":"\u2A95","=":"=","≟":"\u225F","≡":"\u2261","⩸":"\u2A78","⧥":"\u29E5","≓":"\u2253","⥱":"\u2971","ℯ":"\u212F","≐":"\u2250","≂":"\u2242","η":"\u03B7","ð":"\xF0","ð":"\xF0","ë":"\xEB","ë":"\xEB","€":"\u20AC","!":"!","∃":"\u2203","ℰ":"\u2130","ⅇ":"\u2147","≒":"\u2252","ф":"\u0444","♀":"\u2640","ffi":"\uFB03","ff":"\uFB00","ffl":"\uFB04","𝔣":"\u{1D523}","fi":"\uFB01","fj":"fj","♭":"\u266D","fl":"\uFB02","▱":"\u25B1","ƒ":"\u0192","𝕗":"\u{1D557}","∀":"\u2200","⋔":"\u22D4","⫙":"\u2AD9","⨍":"\u2A0D","½":"\xBD","½":"\xBD","⅓":"\u2153","¼":"\xBC","¼":"\xBC","⅕":"\u2155","⅙":"\u2159","⅛":"\u215B","⅔":"\u2154","⅖":"\u2156","¾":"\xBE","¾":"\xBE","⅗":"\u2157","⅜":"\u215C","⅘":"\u2158","⅚":"\u215A","⅝":"\u215D","⅞":"\u215E","⁄":"\u2044","⌢":"\u2322","𝒻":"\u{1D4BB}","≧":"\u2267","⪌":"\u2A8C","ǵ":"\u01F5","γ":"\u03B3","ϝ":"\u03DD","⪆":"\u2A86","ğ":"\u011F","ĝ":"\u011D","г":"\u0433","ġ":"\u0121","≥":"\u2265","⋛":"\u22DB","≥":"\u2265","≧":"\u2267","⩾":"\u2A7E","⩾":"\u2A7E","⪩":"\u2AA9","⪀":"\u2A80","⪂":"\u2A82","⪄":"\u2A84","⋛︀":"\u22DB\uFE00","⪔":"\u2A94","𝔤":"\u{1D524}","≫":"\u226B","⋙":"\u22D9","ℷ":"\u2137","ѓ":"\u0453","≷":"\u2277","⪒":"\u2A92","⪥":"\u2AA5","⪤":"\u2AA4","≩":"\u2269","⪊":"\u2A8A","⪊":"\u2A8A","⪈":"\u2A88","⪈":"\u2A88","≩":"\u2269","⋧":"\u22E7","𝕘":"\u{1D558}","`":"`","ℊ":"\u210A","≳":"\u2273","⪎":"\u2A8E","⪐":"\u2A90",">":">",">":">","⪧":"\u2AA7","⩺":"\u2A7A","⋗":"\u22D7","⦕":"\u2995","⩼":"\u2A7C","⪆":"\u2A86","⥸":"\u2978","⋗":"\u22D7","⋛":"\u22DB","⪌":"\u2A8C","≷":"\u2277","≳":"\u2273","≩︀":"\u2269\uFE00","≩︀":"\u2269\uFE00","⇔":"\u21D4"," ":"\u200A","½":"\xBD","ℋ":"\u210B","ъ":"\u044A","↔":"\u2194","⥈":"\u2948","↭":"\u21AD","ℏ":"\u210F","ĥ":"\u0125","♥":"\u2665","♥":"\u2665","…":"\u2026","⊹":"\u22B9","𝔥":"\u{1D525}","⤥":"\u2925","⤦":"\u2926","⇿":"\u21FF","∻":"\u223B","↩":"\u21A9","↪":"\u21AA","𝕙":"\u{1D559}","―":"\u2015","𝒽":"\u{1D4BD}","ℏ":"\u210F","ħ":"\u0127","⁃":"\u2043","‐":"\u2010","í":"\xED","í":"\xED","⁣":"\u2063","î":"\xEE","î":"\xEE","и":"\u0438","е":"\u0435","¡":"\xA1","¡":"\xA1","⇔":"\u21D4","𝔦":"\u{1D526}","ì":"\xEC","ì":"\xEC","ⅈ":"\u2148","⨌":"\u2A0C","∭":"\u222D","⧜":"\u29DC","℩":"\u2129","ij":"\u0133","ī":"\u012B","ℑ":"\u2111","ℐ":"\u2110","ℑ":"\u2111","ı":"\u0131","⊷":"\u22B7","Ƶ":"\u01B5","∈":"\u2208","℅":"\u2105","∞":"\u221E","⧝":"\u29DD","ı":"\u0131","∫":"\u222B","⊺":"\u22BA","ℤ":"\u2124","⊺":"\u22BA","⨗":"\u2A17","⨼":"\u2A3C","ё":"\u0451","į":"\u012F","𝕚":"\u{1D55A}","ι":"\u03B9","⨼":"\u2A3C","¿":"\xBF","¿":"\xBF","𝒾":"\u{1D4BE}","∈":"\u2208","⋹":"\u22F9","⋵":"\u22F5","⋴":"\u22F4","⋳":"\u22F3","∈":"\u2208","⁢":"\u2062","ĩ":"\u0129","і":"\u0456","ï":"\xEF","ï":"\xEF","ĵ":"\u0135","й":"\u0439","𝔧":"\u{1D527}","ȷ":"\u0237","𝕛":"\u{1D55B}","𝒿":"\u{1D4BF}","ј":"\u0458","є":"\u0454","κ":"\u03BA","ϰ":"\u03F0","ķ":"\u0137","к":"\u043A","𝔨":"\u{1D528}","ĸ":"\u0138","х":"\u0445","ќ":"\u045C","𝕜":"\u{1D55C}","𝓀":"\u{1D4C0}","⇚":"\u21DA","⇐":"\u21D0","⤛":"\u291B","⤎":"\u290E","≦":"\u2266","⪋":"\u2A8B","⥢":"\u2962","ĺ":"\u013A","⦴":"\u29B4","ℒ":"\u2112","λ":"\u03BB","⟨":"\u27E8","⦑":"\u2991","⟨":"\u27E8","⪅":"\u2A85","«":"\xAB","«":"\xAB","←":"\u2190","⇤":"\u21E4","⤟":"\u291F","⤝":"\u291D","↩":"\u21A9","↫":"\u21AB","⤹":"\u2939","⥳":"\u2973","↢":"\u21A2","⪫":"\u2AAB","⤙":"\u2919","⪭":"\u2AAD","⪭︀":"\u2AAD\uFE00","⤌":"\u290C","❲":"\u2772","{":"{","[":"[","⦋":"\u298B","⦏":"\u298F","⦍":"\u298D","ľ":"\u013E","ļ":"\u013C","⌈":"\u2308","{":"{","л":"\u043B","⤶":"\u2936","“":"\u201C","„":"\u201E","⥧":"\u2967","⥋":"\u294B","↲":"\u21B2","≤":"\u2264","←":"\u2190","↢":"\u21A2","↽":"\u21BD","↼":"\u21BC","⇇":"\u21C7","↔":"\u2194","⇆":"\u21C6","⇋":"\u21CB","↭":"\u21AD","⋋":"\u22CB","⋚":"\u22DA","≤":"\u2264","≦":"\u2266","⩽":"\u2A7D","⩽":"\u2A7D","⪨":"\u2AA8","⩿":"\u2A7F","⪁":"\u2A81","⪃":"\u2A83","⋚︀":"\u22DA\uFE00","⪓":"\u2A93","⪅":"\u2A85","⋖":"\u22D6","⋚":"\u22DA","⪋":"\u2A8B","≶":"\u2276","≲":"\u2272","⥼":"\u297C","⌊":"\u230A","𝔩":"\u{1D529}","≶":"\u2276","⪑":"\u2A91","↽":"\u21BD","↼":"\u21BC","⥪":"\u296A","▄":"\u2584","љ":"\u0459","≪":"\u226A","⇇":"\u21C7","⌞":"\u231E","⥫":"\u296B","◺":"\u25FA","ŀ":"\u0140","⎰":"\u23B0","⎰":"\u23B0","≨":"\u2268","⪉":"\u2A89","⪉":"\u2A89","⪇":"\u2A87","⪇":"\u2A87","≨":"\u2268","⋦":"\u22E6","⟬":"\u27EC","⇽":"\u21FD","⟦":"\u27E6","⟵":"\u27F5","⟷":"\u27F7","⟼":"\u27FC","⟶":"\u27F6","↫":"\u21AB","↬":"\u21AC","⦅":"\u2985","𝕝":"\u{1D55D}","⨭":"\u2A2D","⨴":"\u2A34","∗":"\u2217","_":"_","◊":"\u25CA","◊":"\u25CA","⧫":"\u29EB","(":"(","⦓":"\u2993","⇆":"\u21C6","⌟":"\u231F","⇋":"\u21CB","⥭":"\u296D","‎":"\u200E","⊿":"\u22BF","‹":"\u2039","𝓁":"\u{1D4C1}","↰":"\u21B0","≲":"\u2272","⪍":"\u2A8D","⪏":"\u2A8F","[":"[","‘":"\u2018","‚":"\u201A","ł":"\u0142","<":"<","<":"<","⪦":"\u2AA6","⩹":"\u2A79","⋖":"\u22D6","⋋":"\u22CB","⋉":"\u22C9","⥶":"\u2976","⩻":"\u2A7B","⦖":"\u2996","◃":"\u25C3","⊴":"\u22B4","◂":"\u25C2","⥊":"\u294A","⥦":"\u2966","≨︀":"\u2268\uFE00","≨︀":"\u2268\uFE00","∺":"\u223A","¯":"\xAF","¯":"\xAF","♂":"\u2642","✠":"\u2720","✠":"\u2720","↦":"\u21A6","↦":"\u21A6","↧":"\u21A7","↤":"\u21A4","↥":"\u21A5","▮":"\u25AE","⨩":"\u2A29","м":"\u043C","—":"\u2014","∡":"\u2221","𝔪":"\u{1D52A}","℧":"\u2127","µ":"\xB5","µ":"\xB5","∣":"\u2223","*":"*","⫰":"\u2AF0","·":"\xB7","·":"\xB7","−":"\u2212","⊟":"\u229F","∸":"\u2238","⨪":"\u2A2A","⫛":"\u2ADB","…":"\u2026","∓":"\u2213","⊧":"\u22A7","𝕞":"\u{1D55E}","∓":"\u2213","𝓂":"\u{1D4C2}","∾":"\u223E","μ":"\u03BC","⊸":"\u22B8","⊸":"\u22B8","⋙̸":"\u22D9\u0338","≫⃒":"\u226B\u20D2","≫̸":"\u226B\u0338","⇍":"\u21CD","⇎":"\u21CE","⋘̸":"\u22D8\u0338","≪⃒":"\u226A\u20D2","≪̸":"\u226A\u0338","⇏":"\u21CF","⊯":"\u22AF","⊮":"\u22AE","∇":"\u2207","ń":"\u0144","∠⃒":"\u2220\u20D2","≉":"\u2249","⩰̸":"\u2A70\u0338","≋̸":"\u224B\u0338","ʼn":"\u0149","≉":"\u2249","♮":"\u266E","♮":"\u266E","ℕ":"\u2115"," ":"\xA0"," ":"\xA0","≎̸":"\u224E\u0338","≏̸":"\u224F\u0338","⩃":"\u2A43","ň":"\u0148","ņ":"\u0146","≇":"\u2247","⩭̸":"\u2A6D\u0338","⩂":"\u2A42","н":"\u043D","–":"\u2013","≠":"\u2260","⇗":"\u21D7","⤤":"\u2924","↗":"\u2197","↗":"\u2197","≐̸":"\u2250\u0338","≢":"\u2262","⤨":"\u2928","≂̸":"\u2242\u0338","∄":"\u2204","∄":"\u2204","𝔫":"\u{1D52B}","≧̸":"\u2267\u0338","≱":"\u2271","≱":"\u2271","≧̸":"\u2267\u0338","⩾̸":"\u2A7E\u0338","⩾̸":"\u2A7E\u0338","≵":"\u2275","≯":"\u226F","≯":"\u226F","⇎":"\u21CE","↮":"\u21AE","⫲":"\u2AF2","∋":"\u220B","⋼":"\u22FC","⋺":"\u22FA","∋":"\u220B","њ":"\u045A","⇍":"\u21CD","≦̸":"\u2266\u0338","↚":"\u219A","‥":"\u2025","≰":"\u2270","↚":"\u219A","↮":"\u21AE","≰":"\u2270","≦̸":"\u2266\u0338","⩽̸":"\u2A7D\u0338","⩽̸":"\u2A7D\u0338","≮":"\u226E","≴":"\u2274","≮":"\u226E","⋪":"\u22EA","⋬":"\u22EC","∤":"\u2224","𝕟":"\u{1D55F}","¬":"\xAC","¬":"\xAC","∉":"\u2209","⋹̸":"\u22F9\u0338","⋵̸":"\u22F5\u0338","∉":"\u2209","⋷":"\u22F7","⋶":"\u22F6","∌":"\u220C","∌":"\u220C","⋾":"\u22FE","⋽":"\u22FD","∦":"\u2226","∦":"\u2226","⫽⃥":"\u2AFD\u20E5","∂̸":"\u2202\u0338","⨔":"\u2A14","⊀":"\u2280","⋠":"\u22E0","⪯̸":"\u2AAF\u0338","⊀":"\u2280","⪯̸":"\u2AAF\u0338","⇏":"\u21CF","↛":"\u219B","⤳̸":"\u2933\u0338","↝̸":"\u219D\u0338","↛":"\u219B","⋫":"\u22EB","⋭":"\u22ED","⊁":"\u2281","⋡":"\u22E1","⪰̸":"\u2AB0\u0338","𝓃":"\u{1D4C3}","∤":"\u2224","∦":"\u2226","≁":"\u2241","≄":"\u2244","≄":"\u2244","∤":"\u2224","∦":"\u2226","⋢":"\u22E2","⋣":"\u22E3","⊄":"\u2284","⫅̸":"\u2AC5\u0338","⊈":"\u2288","⊂⃒":"\u2282\u20D2","⊈":"\u2288","⫅̸":"\u2AC5\u0338","⊁":"\u2281","⪰̸":"\u2AB0\u0338","⊅":"\u2285","⫆̸":"\u2AC6\u0338","⊉":"\u2289","⊃⃒":"\u2283\u20D2","⊉":"\u2289","⫆̸":"\u2AC6\u0338","≹":"\u2279","ñ":"\xF1","ñ":"\xF1","≸":"\u2278","⋪":"\u22EA","⋬":"\u22EC","⋫":"\u22EB","⋭":"\u22ED","ν":"\u03BD","#":"#","№":"\u2116"," ":"\u2007","⊭":"\u22AD","⤄":"\u2904","≍⃒":"\u224D\u20D2","⊬":"\u22AC","≥⃒":"\u2265\u20D2",">⃒":">\u20D2","⧞":"\u29DE","⤂":"\u2902","≤⃒":"\u2264\u20D2","<⃒":"<\u20D2","⊴⃒":"\u22B4\u20D2","⤃":"\u2903","⊵⃒":"\u22B5\u20D2","∼⃒":"\u223C\u20D2","⇖":"\u21D6","⤣":"\u2923","↖":"\u2196","↖":"\u2196","⤧":"\u2927","Ⓢ":"\u24C8","ó":"\xF3","ó":"\xF3","⊛":"\u229B","⊚":"\u229A","ô":"\xF4","ô":"\xF4","о":"\u043E","⊝":"\u229D","ő":"\u0151","⨸":"\u2A38","⊙":"\u2299","⦼":"\u29BC","œ":"\u0153","⦿":"\u29BF","𝔬":"\u{1D52C}","˛":"\u02DB","ò":"\xF2","ò":"\xF2","⧁":"\u29C1","⦵":"\u29B5","Ω":"\u03A9","∮":"\u222E","↺":"\u21BA","⦾":"\u29BE","⦻":"\u29BB","‾":"\u203E","⧀":"\u29C0","ō":"\u014D","ω":"\u03C9","ο":"\u03BF","⦶":"\u29B6","⊖":"\u2296","𝕠":"\u{1D560}","⦷":"\u29B7","⦹":"\u29B9","⊕":"\u2295","∨":"\u2228","↻":"\u21BB","⩝":"\u2A5D","ℴ":"\u2134","ℴ":"\u2134","ª":"\xAA","ª":"\xAA","º":"\xBA","º":"\xBA","⊶":"\u22B6","⩖":"\u2A56","⩗":"\u2A57","⩛":"\u2A5B","ℴ":"\u2134","ø":"\xF8","ø":"\xF8","⊘":"\u2298","õ":"\xF5","õ":"\xF5","⊗":"\u2297","⨶":"\u2A36","ö":"\xF6","ö":"\xF6","⌽":"\u233D","∥":"\u2225","¶":"\xB6","¶":"\xB6","∥":"\u2225","⫳":"\u2AF3","⫽":"\u2AFD","∂":"\u2202","п":"\u043F","%":"%",".":".","‰":"\u2030","⊥":"\u22A5","‱":"\u2031","𝔭":"\u{1D52D}","φ":"\u03C6","ϕ":"\u03D5","ℳ":"\u2133","☎":"\u260E","π":"\u03C0","⋔":"\u22D4","ϖ":"\u03D6","ℏ":"\u210F","ℎ":"\u210E","ℏ":"\u210F","+":"+","⨣":"\u2A23","⊞":"\u229E","⨢":"\u2A22","∔":"\u2214","⨥":"\u2A25","⩲":"\u2A72","±":"\xB1","±":"\xB1","⨦":"\u2A26","⨧":"\u2A27","±":"\xB1","⨕":"\u2A15","𝕡":"\u{1D561}","£":"\xA3","£":"\xA3","≺":"\u227A","⪳":"\u2AB3","⪷":"\u2AB7","≼":"\u227C","⪯":"\u2AAF","≺":"\u227A","⪷":"\u2AB7","≼":"\u227C","⪯":"\u2AAF","⪹":"\u2AB9","⪵":"\u2AB5","⋨":"\u22E8","≾":"\u227E","′":"\u2032","ℙ":"\u2119","⪵":"\u2AB5","⪹":"\u2AB9","⋨":"\u22E8","∏":"\u220F","⌮":"\u232E","⌒":"\u2312","⌓":"\u2313","∝":"\u221D","∝":"\u221D","≾":"\u227E","⊰":"\u22B0","𝓅":"\u{1D4C5}","ψ":"\u03C8"," ":"\u2008","𝔮":"\u{1D52E}","⨌":"\u2A0C","𝕢":"\u{1D562}","⁗":"\u2057","𝓆":"\u{1D4C6}","ℍ":"\u210D","⨖":"\u2A16","?":"?","≟":"\u225F",""":'"',""":'"',"⇛":"\u21DB","⇒":"\u21D2","⤜":"\u291C","⤏":"\u290F","⥤":"\u2964","∽̱":"\u223D\u0331","ŕ":"\u0155","√":"\u221A","⦳":"\u29B3","⟩":"\u27E9","⦒":"\u2992","⦥":"\u29A5","⟩":"\u27E9","»":"\xBB","»":"\xBB","→":"\u2192","⥵":"\u2975","⇥":"\u21E5","⤠":"\u2920","⤳":"\u2933","⤞":"\u291E","↪":"\u21AA","↬":"\u21AC","⥅":"\u2945","⥴":"\u2974","↣":"\u21A3","↝":"\u219D","⤚":"\u291A","∶":"\u2236","ℚ":"\u211A","⤍":"\u290D","❳":"\u2773","}":"}","]":"]","⦌":"\u298C","⦎":"\u298E","⦐":"\u2990","ř":"\u0159","ŗ":"\u0157","⌉":"\u2309","}":"}","р":"\u0440","⤷":"\u2937","⥩":"\u2969","”":"\u201D","”":"\u201D","↳":"\u21B3","ℜ":"\u211C","ℛ":"\u211B","ℜ":"\u211C","ℝ":"\u211D","▭":"\u25AD","®":"\xAE","®":"\xAE","⥽":"\u297D","⌋":"\u230B","𝔯":"\u{1D52F}","⇁":"\u21C1","⇀":"\u21C0","⥬":"\u296C","ρ":"\u03C1","ϱ":"\u03F1","→":"\u2192","↣":"\u21A3","⇁":"\u21C1","⇀":"\u21C0","⇄":"\u21C4","⇌":"\u21CC","⇉":"\u21C9","↝":"\u219D","⋌":"\u22CC","˚":"\u02DA","≓":"\u2253","⇄":"\u21C4","⇌":"\u21CC","‏":"\u200F","⎱":"\u23B1","⎱":"\u23B1","⫮":"\u2AEE","⟭":"\u27ED","⇾":"\u21FE","⟧":"\u27E7","⦆":"\u2986","𝕣":"\u{1D563}","⨮":"\u2A2E","⨵":"\u2A35",")":")","⦔":"\u2994","⨒":"\u2A12","⇉":"\u21C9","›":"\u203A","𝓇":"\u{1D4C7}","↱":"\u21B1","]":"]","’":"\u2019","’":"\u2019","⋌":"\u22CC","⋊":"\u22CA","▹":"\u25B9","⊵":"\u22B5","▸":"\u25B8","⧎":"\u29CE","⥨":"\u2968","℞":"\u211E","ś":"\u015B","‚":"\u201A","≻":"\u227B","⪴":"\u2AB4","⪸":"\u2AB8","š":"\u0161","≽":"\u227D","⪰":"\u2AB0","ş":"\u015F","ŝ":"\u015D","⪶":"\u2AB6","⪺":"\u2ABA","⋩":"\u22E9","⨓":"\u2A13","≿":"\u227F","с":"\u0441","⋅":"\u22C5","⊡":"\u22A1","⩦":"\u2A66","⇘":"\u21D8","⤥":"\u2925","↘":"\u2198","↘":"\u2198","§":"\xA7","§":"\xA7",";":";","⤩":"\u2929","∖":"\u2216","∖":"\u2216","✶":"\u2736","𝔰":"\u{1D530}","⌢":"\u2322","♯":"\u266F","щ":"\u0449","ш":"\u0448","∣":"\u2223","∥":"\u2225","­":"\xAD","­":"\xAD","σ":"\u03C3","ς":"\u03C2","ς":"\u03C2","∼":"\u223C","⩪":"\u2A6A","≃":"\u2243","≃":"\u2243","⪞":"\u2A9E","⪠":"\u2AA0","⪝":"\u2A9D","⪟":"\u2A9F","≆":"\u2246","⨤":"\u2A24","⥲":"\u2972","←":"\u2190","∖":"\u2216","⨳":"\u2A33","⧤":"\u29E4","∣":"\u2223","⌣":"\u2323","⪪":"\u2AAA","⪬":"\u2AAC","⪬︀":"\u2AAC\uFE00","ь":"\u044C","/":"/","⧄":"\u29C4","⌿":"\u233F","𝕤":"\u{1D564}","♠":"\u2660","♠":"\u2660","∥":"\u2225","⊓":"\u2293","⊓︀":"\u2293\uFE00","⊔":"\u2294","⊔︀":"\u2294\uFE00","⊏":"\u228F","⊑":"\u2291","⊏":"\u228F","⊑":"\u2291","⊐":"\u2290","⊒":"\u2292","⊐":"\u2290","⊒":"\u2292","□":"\u25A1","□":"\u25A1","▪":"\u25AA","▪":"\u25AA","→":"\u2192","𝓈":"\u{1D4C8}","∖":"\u2216","⌣":"\u2323","⋆":"\u22C6","☆":"\u2606","★":"\u2605","ϵ":"\u03F5","ϕ":"\u03D5","¯":"\xAF","⊂":"\u2282","⫅":"\u2AC5","⪽":"\u2ABD","⊆":"\u2286","⫃":"\u2AC3","⫁":"\u2AC1","⫋":"\u2ACB","⊊":"\u228A","⪿":"\u2ABF","⥹":"\u2979","⊂":"\u2282","⊆":"\u2286","⫅":"\u2AC5","⊊":"\u228A","⫋":"\u2ACB","⫇":"\u2AC7","⫕":"\u2AD5","⫓":"\u2AD3","≻":"\u227B","⪸":"\u2AB8","≽":"\u227D","⪰":"\u2AB0","⪺":"\u2ABA","⪶":"\u2AB6","⋩":"\u22E9","≿":"\u227F","∑":"\u2211","♪":"\u266A","¹":"\xB9","¹":"\xB9","²":"\xB2","²":"\xB2","³":"\xB3","³":"\xB3","⊃":"\u2283","⫆":"\u2AC6","⪾":"\u2ABE","⫘":"\u2AD8","⊇":"\u2287","⫄":"\u2AC4","⟉":"\u27C9","⫗":"\u2AD7","⥻":"\u297B","⫂":"\u2AC2","⫌":"\u2ACC","⊋":"\u228B","⫀":"\u2AC0","⊃":"\u2283","⊇":"\u2287","⫆":"\u2AC6","⊋":"\u228B","⫌":"\u2ACC","⫈":"\u2AC8","⫔":"\u2AD4","⫖":"\u2AD6","⇙":"\u21D9","⤦":"\u2926","↙":"\u2199","↙":"\u2199","⤪":"\u292A","ß":"\xDF","ß":"\xDF","⌖":"\u2316","τ":"\u03C4","⎴":"\u23B4","ť":"\u0165","ţ":"\u0163","т":"\u0442","⃛":"\u20DB","⌕":"\u2315","𝔱":"\u{1D531}","∴":"\u2234","∴":"\u2234","θ":"\u03B8","ϑ":"\u03D1","ϑ":"\u03D1","≈":"\u2248","∼":"\u223C"," ":"\u2009","≈":"\u2248","∼":"\u223C","þ":"\xFE","þ":"\xFE","˜":"\u02DC","×":"\xD7","×":"\xD7","⊠":"\u22A0","⨱":"\u2A31","⨰":"\u2A30","∭":"\u222D","⤨":"\u2928","⊤":"\u22A4","⌶":"\u2336","⫱":"\u2AF1","𝕥":"\u{1D565}","⫚":"\u2ADA","⤩":"\u2929","‴":"\u2034","™":"\u2122","▵":"\u25B5","▿":"\u25BF","◃":"\u25C3","⊴":"\u22B4","≜":"\u225C","▹":"\u25B9","⊵":"\u22B5","◬":"\u25EC","≜":"\u225C","⨺":"\u2A3A","⨹":"\u2A39","⧍":"\u29CD","⨻":"\u2A3B","⏢":"\u23E2","𝓉":"\u{1D4C9}","ц":"\u0446","ћ":"\u045B","ŧ":"\u0167","≬":"\u226C","↞":"\u219E","↠":"\u21A0","⇑":"\u21D1","⥣":"\u2963","ú":"\xFA","ú":"\xFA","↑":"\u2191","ў":"\u045E","ŭ":"\u016D","û":"\xFB","û":"\xFB","у":"\u0443","⇅":"\u21C5","ű":"\u0171","⥮":"\u296E","⥾":"\u297E","𝔲":"\u{1D532}","ù":"\xF9","ù":"\xF9","↿":"\u21BF","↾":"\u21BE","▀":"\u2580","⌜":"\u231C","⌜":"\u231C","⌏":"\u230F","◸":"\u25F8","ū":"\u016B","¨":"\xA8","¨":"\xA8","ų":"\u0173","𝕦":"\u{1D566}","↑":"\u2191","↕":"\u2195","↿":"\u21BF","↾":"\u21BE","⊎":"\u228E","υ":"\u03C5","ϒ":"\u03D2","υ":"\u03C5","⇈":"\u21C8","⌝":"\u231D","⌝":"\u231D","⌎":"\u230E","ů":"\u016F","◹":"\u25F9","𝓊":"\u{1D4CA}","⋰":"\u22F0","ũ":"\u0169","▵":"\u25B5","▴":"\u25B4","⇈":"\u21C8","ü":"\xFC","ü":"\xFC","⦧":"\u29A7","⇕":"\u21D5","⫨":"\u2AE8","⫩":"\u2AE9","⊨":"\u22A8","⦜":"\u299C","ϵ":"\u03F5","ϰ":"\u03F0","∅":"\u2205","ϕ":"\u03D5","ϖ":"\u03D6","∝":"\u221D","↕":"\u2195","ϱ":"\u03F1","ς":"\u03C2","⊊︀":"\u228A\uFE00","⫋︀":"\u2ACB\uFE00","⊋︀":"\u228B\uFE00","⫌︀":"\u2ACC\uFE00","ϑ":"\u03D1","⊲":"\u22B2","⊳":"\u22B3","в":"\u0432","⊢":"\u22A2","∨":"\u2228","⊻":"\u22BB","≚":"\u225A","⋮":"\u22EE","|":"|","|":"|","𝔳":"\u{1D533}","⊲":"\u22B2","⊂⃒":"\u2282\u20D2","⊃⃒":"\u2283\u20D2","𝕧":"\u{1D567}","∝":"\u221D","⊳":"\u22B3","𝓋":"\u{1D4CB}","⫋︀":"\u2ACB\uFE00","⊊︀":"\u228A\uFE00","⫌︀":"\u2ACC\uFE00","⊋︀":"\u228B\uFE00","⦚":"\u299A","ŵ":"\u0175","⩟":"\u2A5F","∧":"\u2227","≙":"\u2259","℘":"\u2118","𝔴":"\u{1D534}","𝕨":"\u{1D568}","℘":"\u2118","≀":"\u2240","≀":"\u2240","𝓌":"\u{1D4CC}","⋂":"\u22C2","◯":"\u25EF","⋃":"\u22C3","▽":"\u25BD","𝔵":"\u{1D535}","⟺":"\u27FA","⟷":"\u27F7","ξ":"\u03BE","⟸":"\u27F8","⟵":"\u27F5","⟼":"\u27FC","⋻":"\u22FB","⨀":"\u2A00","𝕩":"\u{1D569}","⨁":"\u2A01","⨂":"\u2A02","⟹":"\u27F9","⟶":"\u27F6","𝓍":"\u{1D4CD}","⨆":"\u2A06","⨄":"\u2A04","△":"\u25B3","⋁":"\u22C1","⋀":"\u22C0","ý":"\xFD","ý":"\xFD","я":"\u044F","ŷ":"\u0177","ы":"\u044B","¥":"\xA5","¥":"\xA5","𝔶":"\u{1D536}","ї":"\u0457","𝕪":"\u{1D56A}","𝓎":"\u{1D4CE}","ю":"\u044E","ÿ":"\xFF","ÿ":"\xFF","ź":"\u017A","ž":"\u017E","з":"\u0437","ż":"\u017C","ℨ":"\u2128","ζ":"\u03B6","𝔷":"\u{1D537}","ж":"\u0436","⇝":"\u21DD","𝕫":"\u{1D56B}","𝓏":"\u{1D4CF}","‍":"\u200D","‌":"\u200C"},characters:{\u00C6:"Æ","&":"&",\u00C1:"Á",\u0102:"Ă",\u00C2:"Â",\u0410:"А","\u{1D504}":"𝔄",\u00C0:"À",\u0391:"Α",\u0100:"Ā","\u2A53":"⩓",\u0104:"Ą","\u{1D538}":"𝔸","\u2061":"⁡",\u00C5:"Å","\u{1D49C}":"𝒜","\u2254":"≔",\u00C3:"Ã",\u00C4:"Ä","\u2216":"∖","\u2AE7":"⫧","\u2306":"⌆",\u0411:"Б","\u2235":"∵",\u212C:"ℬ",\u0392:"Β","\u{1D505}":"𝔅","\u{1D539}":"𝔹","\u02D8":"˘","\u224E":"≎",\u0427:"Ч","\xA9":"©",\u0106:"Ć","\u22D2":"⋒","\u2145":"ⅅ",\u212D:"ℭ",\u010C:"Č",\u00C7:"Ç",\u0108:"Ĉ","\u2230":"∰",\u010A:"Ċ","\xB8":"¸","\xB7":"·",\u03A7:"Χ","\u2299":"⊙","\u2296":"⊖","\u2295":"⊕","\u2297":"⊗","\u2232":"∲","\u201D":"”","\u2019":"’","\u2237":"∷","\u2A74":"⩴","\u2261":"≡","\u222F":"∯","\u222E":"∮",\u2102:"ℂ","\u2210":"∐","\u2233":"∳","\u2A2F":"⨯","\u{1D49E}":"𝒞","\u22D3":"⋓","\u224D":"≍","\u2911":"⤑",\u0402:"Ђ",\u0405:"Ѕ",\u040F:"Џ","\u2021":"‡","\u21A1":"↡","\u2AE4":"⫤",\u010E:"Ď",\u0414:"Д","\u2207":"∇",\u0394:"Δ","\u{1D507}":"𝔇","\xB4":"´","\u02D9":"˙","\u02DD":"˝","`":"`","\u02DC":"˜","\u22C4":"⋄","\u2146":"ⅆ","\u{1D53B}":"𝔻","\xA8":"¨","\u20DC":"⃜","\u2250":"≐","\u21D3":"⇓","\u21D0":"⇐","\u21D4":"⇔","\u27F8":"⟸","\u27FA":"⟺","\u27F9":"⟹","\u21D2":"⇒","\u22A8":"⊨","\u21D1":"⇑","\u21D5":"⇕","\u2225":"∥","\u2193":"↓","\u2913":"⤓","\u21F5":"⇵","\u0311":"̑","\u2950":"⥐","\u295E":"⥞","\u21BD":"↽","\u2956":"⥖","\u295F":"⥟","\u21C1":"⇁","\u2957":"⥗","\u22A4":"⊤","\u21A7":"↧","\u{1D49F}":"𝒟",\u0110:"Đ",\u014A:"Ŋ",\u00D0:"Ð",\u00C9:"É",\u011A:"Ě",\u00CA:"Ê",\u042D:"Э",\u0116:"Ė","\u{1D508}":"𝔈",\u00C8:"È","\u2208":"∈",\u0112:"Ē","\u25FB":"◻","\u25AB":"▫",\u0118:"Ę","\u{1D53C}":"𝔼",\u0395:"Ε","\u2A75":"⩵","\u2242":"≂","\u21CC":"⇌",\u2130:"ℰ","\u2A73":"⩳",\u0397:"Η",\u00CB:"Ë","\u2203":"∃","\u2147":"ⅇ",\u0424:"Ф","\u{1D509}":"𝔉","\u25FC":"◼","\u25AA":"▪","\u{1D53D}":"𝔽","\u2200":"∀",\u2131:"ℱ",\u0403:"Ѓ",">":">",\u0393:"Γ",\u03DC:"Ϝ",\u011E:"Ğ",\u0122:"Ģ",\u011C:"Ĝ",\u0413:"Г",\u0120:"Ġ","\u{1D50A}":"𝔊","\u22D9":"⋙","\u{1D53E}":"𝔾","\u2265":"≥","\u22DB":"⋛","\u2267":"≧","\u2AA2":"⪢","\u2277":"≷","\u2A7E":"⩾","\u2273":"≳","\u{1D4A2}":"𝒢","\u226B":"≫",\u042A:"Ъ","\u02C7":"ˇ","^":"^",\u0124:"Ĥ",\u210C:"ℌ",\u210B:"ℋ",\u210D:"ℍ","\u2500":"─",\u0126:"Ħ","\u224F":"≏",\u0415:"Е",\u0132:"IJ",\u0401:"Ё",\u00CD:"Í",\u00CE:"Î",\u0418:"И",\u0130:"İ",\u2111:"ℑ",\u00CC:"Ì",\u012A:"Ī","\u2148":"ⅈ","\u222C":"∬","\u222B":"∫","\u22C2":"⋂","\u2063":"⁣","\u2062":"⁢",\u012E:"Į","\u{1D540}":"𝕀",\u0399:"Ι",\u2110:"ℐ",\u0128:"Ĩ",\u0406:"І",\u00CF:"Ï",\u0134:"Ĵ",\u0419:"Й","\u{1D50D}":"𝔍","\u{1D541}":"𝕁","\u{1D4A5}":"𝒥",\u0408:"Ј",\u0404:"Є",\u0425:"Х",\u040C:"Ќ",\u039A:"Κ",\u0136:"Ķ",\u041A:"К","\u{1D50E}":"𝔎","\u{1D542}":"𝕂","\u{1D4A6}":"𝒦",\u0409:"Љ","<":"<",\u0139:"Ĺ",\u039B:"Λ","\u27EA":"⟪",\u2112:"ℒ","\u219E":"↞",\u013D:"Ľ",\u013B:"Ļ",\u041B:"Л","\u27E8":"⟨","\u2190":"←","\u21E4":"⇤","\u21C6":"⇆","\u2308":"⌈","\u27E6":"⟦","\u2961":"⥡","\u21C3":"⇃","\u2959":"⥙","\u230A":"⌊","\u2194":"↔","\u294E":"⥎","\u22A3":"⊣","\u21A4":"↤","\u295A":"⥚","\u22B2":"⊲","\u29CF":"⧏","\u22B4":"⊴","\u2951":"⥑","\u2960":"⥠","\u21BF":"↿","\u2958":"⥘","\u21BC":"↼","\u2952":"⥒","\u22DA":"⋚","\u2266":"≦","\u2276":"≶","\u2AA1":"⪡","\u2A7D":"⩽","\u2272":"≲","\u{1D50F}":"𝔏","\u22D8":"⋘","\u21DA":"⇚",\u013F:"Ŀ","\u27F5":"⟵","\u27F7":"⟷","\u27F6":"⟶","\u{1D543}":"𝕃","\u2199":"↙","\u2198":"↘","\u21B0":"↰",\u0141:"Ł","\u226A":"≪","\u2905":"⤅",\u041C:"М","\u205F":" ",\u2133:"ℳ","\u{1D510}":"𝔐","\u2213":"∓","\u{1D544}":"𝕄",\u039C:"Μ",\u040A:"Њ",\u0143:"Ń",\u0147:"Ň",\u0145:"Ņ",\u041D:"Н","\u200B":"​","\n":" ","\u{1D511}":"𝔑","\u2060":"⁠","\xA0":" ",\u2115:"ℕ","\u2AEC":"⫬","\u2262":"≢","\u226D":"≭","\u2226":"∦","\u2209":"∉","\u2260":"≠","\u2242\u0338":"≂̸","\u2204":"∄","\u226F":"≯","\u2271":"≱","\u2267\u0338":"≧̸","\u226B\u0338":"≫̸","\u2279":"≹","\u2A7E\u0338":"⩾̸","\u2275":"≵","\u224E\u0338":"≎̸","\u224F\u0338":"≏̸","\u22EA":"⋪","\u29CF\u0338":"⧏̸","\u22EC":"⋬","\u226E":"≮","\u2270":"≰","\u2278":"≸","\u226A\u0338":"≪̸","\u2A7D\u0338":"⩽̸","\u2274":"≴","\u2AA2\u0338":"⪢̸","\u2AA1\u0338":"⪡̸","\u2280":"⊀","\u2AAF\u0338":"⪯̸","\u22E0":"⋠","\u220C":"∌","\u22EB":"⋫","\u29D0\u0338":"⧐̸","\u22ED":"⋭","\u228F\u0338":"⊏̸","\u22E2":"⋢","\u2290\u0338":"⊐̸","\u22E3":"⋣","\u2282\u20D2":"⊂⃒","\u2288":"⊈","\u2281":"⊁","\u2AB0\u0338":"⪰̸","\u22E1":"⋡","\u227F\u0338":"≿̸","\u2283\u20D2":"⊃⃒","\u2289":"⊉","\u2241":"≁","\u2244":"≄","\u2247":"≇","\u2249":"≉","\u2224":"∤","\u{1D4A9}":"𝒩",\u00D1:"Ñ",\u039D:"Ν",\u0152:"Œ",\u00D3:"Ó",\u00D4:"Ô",\u041E:"О",\u0150:"Ő","\u{1D512}":"𝔒",\u00D2:"Ò",\u014C:"Ō",\u03A9:"Ω",\u039F:"Ο","\u{1D546}":"𝕆","\u201C":"“","\u2018":"‘","\u2A54":"⩔","\u{1D4AA}":"𝒪",\u00D8:"Ø",\u00D5:"Õ","\u2A37":"⨷",\u00D6:"Ö","\u203E":"‾","\u23DE":"⏞","\u23B4":"⎴","\u23DC":"⏜","\u2202":"∂",\u041F:"П","\u{1D513}":"𝔓",\u03A6:"Φ",\u03A0:"Π","\xB1":"±",\u2119:"ℙ","\u2ABB":"⪻","\u227A":"≺","\u2AAF":"⪯","\u227C":"≼","\u227E":"≾","\u2033":"″","\u220F":"∏","\u221D":"∝","\u{1D4AB}":"𝒫",\u03A8:"Ψ",'"':""","\u{1D514}":"𝔔",\u211A:"ℚ","\u{1D4AC}":"𝒬","\u2910":"⤐","\xAE":"®",\u0154:"Ŕ","\u27EB":"⟫","\u21A0":"↠","\u2916":"⤖",\u0158:"Ř",\u0156:"Ŗ",\u0420:"Р",\u211C:"ℜ","\u220B":"∋","\u21CB":"⇋","\u296F":"⥯",\u03A1:"Ρ","\u27E9":"⟩","\u2192":"→","\u21E5":"⇥","\u21C4":"⇄","\u2309":"⌉","\u27E7":"⟧","\u295D":"⥝","\u21C2":"⇂","\u2955":"⥕","\u230B":"⌋","\u22A2":"⊢","\u21A6":"↦","\u295B":"⥛","\u22B3":"⊳","\u29D0":"⧐","\u22B5":"⊵","\u294F":"⥏","\u295C":"⥜","\u21BE":"↾","\u2954":"⥔","\u21C0":"⇀","\u2953":"⥓",\u211D:"ℝ","\u2970":"⥰","\u21DB":"⇛",\u211B:"ℛ","\u21B1":"↱","\u29F4":"⧴",\u0429:"Щ",\u0428:"Ш",\u042C:"Ь",\u015A:"Ś","\u2ABC":"⪼",\u0160:"Š",\u015E:"Ş",\u015C:"Ŝ",\u0421:"С","\u{1D516}":"𝔖","\u2191":"↑",\u03A3:"Σ","\u2218":"∘","\u{1D54A}":"𝕊","\u221A":"√","\u25A1":"□","\u2293":"⊓","\u228F":"⊏","\u2291":"⊑","\u2290":"⊐","\u2292":"⊒","\u2294":"⊔","\u{1D4AE}":"𝒮","\u22C6":"⋆","\u22D0":"⋐","\u2286":"⊆","\u227B":"≻","\u2AB0":"⪰","\u227D":"≽","\u227F":"≿","\u2211":"∑","\u22D1":"⋑","\u2283":"⊃","\u2287":"⊇",\u00DE:"Þ","\u2122":"™",\u040B:"Ћ",\u0426:"Ц"," ":" ",\u03A4:"Τ",\u0164:"Ť",\u0162:"Ţ",\u0422:"Т","\u{1D517}":"𝔗","\u2234":"∴",\u0398:"Θ","\u205F\u200A":"  ","\u2009":" ","\u223C":"∼","\u2243":"≃","\u2245":"≅","\u2248":"≈","\u{1D54B}":"𝕋","\u20DB":"⃛","\u{1D4AF}":"𝒯",\u0166:"Ŧ",\u00DA:"Ú","\u219F":"↟","\u2949":"⥉",\u040E:"Ў",\u016C:"Ŭ",\u00DB:"Û",\u0423:"У",\u0170:"Ű","\u{1D518}":"𝔘",\u00D9:"Ù",\u016A:"Ū",_:"_","\u23DF":"⏟","\u23B5":"⎵","\u23DD":"⏝","\u22C3":"⋃","\u228E":"⊎",\u0172:"Ų","\u{1D54C}":"𝕌","\u2912":"⤒","\u21C5":"⇅","\u2195":"↕","\u296E":"⥮","\u22A5":"⊥","\u21A5":"↥","\u2196":"↖","\u2197":"↗",\u03D2:"ϒ",\u03A5:"Υ",\u016E:"Ů","\u{1D4B0}":"𝒰",\u0168:"Ũ",\u00DC:"Ü","\u22AB":"⊫","\u2AEB":"⫫",\u0412:"В","\u22A9":"⊩","\u2AE6":"⫦","\u22C1":"⋁","\u2016":"‖","\u2223":"∣","|":"|","\u2758":"❘","\u2240":"≀","\u200A":" ","\u{1D519}":"𝔙","\u{1D54D}":"𝕍","\u{1D4B1}":"𝒱","\u22AA":"⊪",\u0174:"Ŵ","\u22C0":"⋀","\u{1D51A}":"𝔚","\u{1D54E}":"𝕎","\u{1D4B2}":"𝒲","\u{1D51B}":"𝔛",\u039E:"Ξ","\u{1D54F}":"𝕏","\u{1D4B3}":"𝒳",\u042F:"Я",\u0407:"Ї",\u042E:"Ю",\u00DD:"Ý",\u0176:"Ŷ",\u042B:"Ы","\u{1D51C}":"𝔜","\u{1D550}":"𝕐","\u{1D4B4}":"𝒴",\u0178:"Ÿ",\u0416:"Ж",\u0179:"Ź",\u017D:"Ž",\u0417:"З",\u017B:"Ż",\u0396:"Ζ",\u2128:"ℨ",\u2124:"ℤ","\u{1D4B5}":"𝒵",\u00E1:"á",\u0103:"ă","\u223E":"∾","\u223E\u0333":"∾̳","\u223F":"∿",\u00E2:"â",\u0430:"а",\u00E6:"æ","\u{1D51E}":"𝔞",\u00E0:"à",\u2135:"ℵ",\u03B1:"α",\u0101:"ā","\u2A3F":"⨿","\u2227":"∧","\u2A55":"⩕","\u2A5C":"⩜","\u2A58":"⩘","\u2A5A":"⩚","\u2220":"∠","\u29A4":"⦤","\u2221":"∡","\u29A8":"⦨","\u29A9":"⦩","\u29AA":"⦪","\u29AB":"⦫","\u29AC":"⦬","\u29AD":"⦭","\u29AE":"⦮","\u29AF":"⦯","\u221F":"∟","\u22BE":"⊾","\u299D":"⦝","\u2222":"∢","\u237C":"⍼",\u0105:"ą","\u{1D552}":"𝕒","\u2A70":"⩰","\u2A6F":"⩯","\u224A":"≊","\u224B":"≋","'":"'",\u00E5:"å","\u{1D4B6}":"𝒶","*":"*",\u00E3:"ã",\u00E4:"ä","\u2A11":"⨑","\u2AED":"⫭","\u224C":"≌","\u03F6":"϶","\u2035":"‵","\u223D":"∽","\u22CD":"⋍","\u22BD":"⊽","\u2305":"⌅","\u23B6":"⎶",\u0431:"б","\u201E":"„","\u29B0":"⦰",\u03B2:"β",\u2136:"ℶ","\u226C":"≬","\u{1D51F}":"𝔟","\u25EF":"◯","\u2A00":"⨀","\u2A01":"⨁","\u2A02":"⨂","\u2A06":"⨆","\u2605":"★","\u25BD":"▽","\u25B3":"△","\u2A04":"⨄","\u290D":"⤍","\u29EB":"⧫","\u25B4":"▴","\u25BE":"▾","\u25C2":"◂","\u25B8":"▸","\u2423":"␣","\u2592":"▒","\u2591":"░","\u2593":"▓","\u2588":"█","=\u20E5":"=⃥","\u2261\u20E5":"≡⃥","\u2310":"⌐","\u{1D553}":"𝕓","\u22C8":"⋈","\u2557":"╗","\u2554":"╔","\u2556":"╖","\u2553":"╓","\u2550":"═","\u2566":"╦","\u2569":"╩","\u2564":"╤","\u2567":"╧","\u255D":"╝","\u255A":"╚","\u255C":"╜","\u2559":"╙","\u2551":"║","\u256C":"╬","\u2563":"╣","\u2560":"╠","\u256B":"╫","\u2562":"╢","\u255F":"╟","\u29C9":"⧉","\u2555":"╕","\u2552":"╒","\u2510":"┐","\u250C":"┌","\u2565":"╥","\u2568":"╨","\u252C":"┬","\u2534":"┴","\u229F":"⊟","\u229E":"⊞","\u22A0":"⊠","\u255B":"╛","\u2558":"╘","\u2518":"┘","\u2514":"└","\u2502":"│","\u256A":"╪","\u2561":"╡","\u255E":"╞","\u253C":"┼","\u2524":"┤","\u251C":"├","\xA6":"¦","\u{1D4B7}":"𝒷","\u204F":"⁏","\\":"\","\u29C5":"⧅","\u27C8":"⟈","\u2022":"•","\u2AAE":"⪮",\u0107:"ć","\u2229":"∩","\u2A44":"⩄","\u2A49":"⩉","\u2A4B":"⩋","\u2A47":"⩇","\u2A40":"⩀","\u2229\uFE00":"∩︀","\u2041":"⁁","\u2A4D":"⩍",\u010D:"č",\u00E7:"ç",\u0109:"ĉ","\u2A4C":"⩌","\u2A50":"⩐",\u010B:"ċ","\u29B2":"⦲","\xA2":"¢","\u{1D520}":"𝔠",\u0447:"ч","\u2713":"✓",\u03C7:"χ","\u25CB":"○","\u29C3":"⧃","\u02C6":"ˆ","\u2257":"≗","\u21BA":"↺","\u21BB":"↻","\u24C8":"Ⓢ","\u229B":"⊛","\u229A":"⊚","\u229D":"⊝","\u2A10":"⨐","\u2AEF":"⫯","\u29C2":"⧂","\u2663":"♣",":":":",",":",","@":"@","\u2201":"∁","\u2A6D":"⩭","\u{1D554}":"𝕔","\u2117":"℗","\u21B5":"↵","\u2717":"✗","\u{1D4B8}":"𝒸","\u2ACF":"⫏","\u2AD1":"⫑","\u2AD0":"⫐","\u2AD2":"⫒","\u22EF":"⋯","\u2938":"⤸","\u2935":"⤵","\u22DE":"⋞","\u22DF":"⋟","\u21B6":"↶","\u293D":"⤽","\u222A":"∪","\u2A48":"⩈","\u2A46":"⩆","\u2A4A":"⩊","\u228D":"⊍","\u2A45":"⩅","\u222A\uFE00":"∪︀","\u21B7":"↷","\u293C":"⤼","\u22CE":"⋎","\u22CF":"⋏","\xA4":"¤","\u2231":"∱","\u232D":"⌭","\u2965":"⥥","\u2020":"†",\u2138:"ℸ","\u2010":"‐","\u290F":"⤏",\u010F:"ď",\u0434:"д","\u21CA":"⇊","\u2A77":"⩷","\xB0":"°",\u03B4:"δ","\u29B1":"⦱","\u297F":"⥿","\u{1D521}":"𝔡","\u2666":"♦",\u03DD:"ϝ","\u22F2":"⋲","\xF7":"÷","\u22C7":"⋇",\u0452:"ђ","\u231E":"⌞","\u230D":"⌍",$:"$","\u{1D555}":"𝕕","\u2251":"≑","\u2238":"∸","\u2214":"∔","\u22A1":"⊡","\u231F":"⌟","\u230C":"⌌","\u{1D4B9}":"𝒹",\u0455:"ѕ","\u29F6":"⧶",\u0111:"đ","\u22F1":"⋱","\u25BF":"▿","\u29A6":"⦦",\u045F:"џ","\u27FF":"⟿",\u00E9:"é","\u2A6E":"⩮",\u011B:"ě","\u2256":"≖",\u00EA:"ê","\u2255":"≕",\u044D:"э",\u0117:"ė","\u2252":"≒","\u{1D522}":"𝔢","\u2A9A":"⪚",\u00E8:"è","\u2A96":"⪖","\u2A98":"⪘","\u2A99":"⪙","\u23E7":"⏧",\u2113:"ℓ","\u2A95":"⪕","\u2A97":"⪗",\u0113:"ē","\u2205":"∅","\u2004":" ","\u2005":" ","\u2003":" ",\u014B:"ŋ","\u2002":" ",\u0119:"ę","\u{1D556}":"𝕖","\u22D5":"⋕","\u29E3":"⧣","\u2A71":"⩱",\u03B5:"ε","\u03F5":"ϵ","=":"=","\u225F":"≟","\u2A78":"⩸","\u29E5":"⧥","\u2253":"≓","\u2971":"⥱",\u212F:"ℯ",\u03B7:"η",\u00F0:"ð",\u00EB:"ë","\u20AC":"€","!":"!",\u0444:"ф","\u2640":"♀",\uFB03:"ffi",\uFB00:"ff",\uFB04:"ffl","\u{1D523}":"𝔣",\uFB01:"fi",fj:"fj","\u266D":"♭",\uFB02:"fl","\u25B1":"▱",\u0192:"ƒ","\u{1D557}":"𝕗","\u22D4":"⋔","\u2AD9":"⫙","\u2A0D":"⨍","\xBD":"½","\u2153":"⅓","\xBC":"¼","\u2155":"⅕","\u2159":"⅙","\u215B":"⅛","\u2154":"⅔","\u2156":"⅖","\xBE":"¾","\u2157":"⅗","\u215C":"⅜","\u2158":"⅘","\u215A":"⅚","\u215D":"⅝","\u215E":"⅞","\u2044":"⁄","\u2322":"⌢","\u{1D4BB}":"𝒻","\u2A8C":"⪌",\u01F5:"ǵ",\u03B3:"γ","\u2A86":"⪆",\u011F:"ğ",\u011D:"ĝ",\u0433:"г",\u0121:"ġ","\u2AA9":"⪩","\u2A80":"⪀","\u2A82":"⪂","\u2A84":"⪄","\u22DB\uFE00":"⋛︀","\u2A94":"⪔","\u{1D524}":"𝔤",\u2137:"ℷ",\u0453:"ѓ","\u2A92":"⪒","\u2AA5":"⪥","\u2AA4":"⪤","\u2269":"≩","\u2A8A":"⪊","\u2A88":"⪈","\u22E7":"⋧","\u{1D558}":"𝕘",\u210A:"ℊ","\u2A8E":"⪎","\u2A90":"⪐","\u2AA7":"⪧","\u2A7A":"⩺","\u22D7":"⋗","\u2995":"⦕","\u2A7C":"⩼","\u2978":"⥸","\u2269\uFE00":"≩︀",\u044A:"ъ","\u2948":"⥈","\u21AD":"↭",\u210F:"ℏ",\u0125:"ĥ","\u2665":"♥","\u2026":"…","\u22B9":"⊹","\u{1D525}":"𝔥","\u2925":"⤥","\u2926":"⤦","\u21FF":"⇿","\u223B":"∻","\u21A9":"↩","\u21AA":"↪","\u{1D559}":"𝕙","\u2015":"―","\u{1D4BD}":"𝒽",\u0127:"ħ","\u2043":"⁃",\u00ED:"í",\u00EE:"î",\u0438:"и",\u0435:"е","\xA1":"¡","\u{1D526}":"𝔦",\u00EC:"ì","\u2A0C":"⨌","\u222D":"∭","\u29DC":"⧜","\u2129":"℩",\u0133:"ij",\u012B:"ī",\u0131:"ı","\u22B7":"⊷",\u01B5:"Ƶ","\u2105":"℅","\u221E":"∞","\u29DD":"⧝","\u22BA":"⊺","\u2A17":"⨗","\u2A3C":"⨼",\u0451:"ё",\u012F:"į","\u{1D55A}":"𝕚",\u03B9:"ι","\xBF":"¿","\u{1D4BE}":"𝒾","\u22F9":"⋹","\u22F5":"⋵","\u22F4":"⋴","\u22F3":"⋳",\u0129:"ĩ",\u0456:"і",\u00EF:"ï",\u0135:"ĵ",\u0439:"й","\u{1D527}":"𝔧","\u0237":"ȷ","\u{1D55B}":"𝕛","\u{1D4BF}":"𝒿",\u0458:"ј",\u0454:"є",\u03BA:"κ",\u03F0:"ϰ",\u0137:"ķ",\u043A:"к","\u{1D528}":"𝔨",\u0138:"ĸ",\u0445:"х",\u045C:"ќ","\u{1D55C}":"𝕜","\u{1D4C0}":"𝓀","\u291B":"⤛","\u290E":"⤎","\u2A8B":"⪋","\u2962":"⥢",\u013A:"ĺ","\u29B4":"⦴",\u03BB:"λ","\u2991":"⦑","\u2A85":"⪅","\xAB":"«","\u291F":"⤟","\u291D":"⤝","\u21AB":"↫","\u2939":"⤹","\u2973":"⥳","\u21A2":"↢","\u2AAB":"⪫","\u2919":"⤙","\u2AAD":"⪭","\u2AAD\uFE00":"⪭︀","\u290C":"⤌","\u2772":"❲","{":"{","[":"[","\u298B":"⦋","\u298F":"⦏","\u298D":"⦍",\u013E:"ľ",\u013C:"ļ",\u043B:"л","\u2936":"⤶","\u2967":"⥧","\u294B":"⥋","\u21B2":"↲","\u2264":"≤","\u21C7":"⇇","\u22CB":"⋋","\u2AA8":"⪨","\u2A7F":"⩿","\u2A81":"⪁","\u2A83":"⪃","\u22DA\uFE00":"⋚︀","\u2A93":"⪓","\u22D6":"⋖","\u297C":"⥼","\u{1D529}":"𝔩","\u2A91":"⪑","\u296A":"⥪","\u2584":"▄",\u0459:"љ","\u296B":"⥫","\u25FA":"◺",\u0140:"ŀ","\u23B0":"⎰","\u2268":"≨","\u2A89":"⪉","\u2A87":"⪇","\u22E6":"⋦","\u27EC":"⟬","\u21FD":"⇽","\u27FC":"⟼","\u21AC":"↬","\u2985":"⦅","\u{1D55D}":"𝕝","\u2A2D":"⨭","\u2A34":"⨴","\u2217":"∗","\u25CA":"◊","(":"(","\u2993":"⦓","\u296D":"⥭","\u200E":"‎","\u22BF":"⊿","\u2039":"‹","\u{1D4C1}":"𝓁","\u2A8D":"⪍","\u2A8F":"⪏","\u201A":"‚",\u0142:"ł","\u2AA6":"⪦","\u2A79":"⩹","\u22C9":"⋉","\u2976":"⥶","\u2A7B":"⩻","\u2996":"⦖","\u25C3":"◃","\u294A":"⥊","\u2966":"⥦","\u2268\uFE00":"≨︀","\u223A":"∺","\xAF":"¯","\u2642":"♂","\u2720":"✠","\u25AE":"▮","\u2A29":"⨩",\u043C:"м","\u2014":"—","\u{1D52A}":"𝔪","\u2127":"℧",\u00B5:"µ","\u2AF0":"⫰","\u2212":"−","\u2A2A":"⨪","\u2ADB":"⫛","\u22A7":"⊧","\u{1D55E}":"𝕞","\u{1D4C2}":"𝓂",\u03BC:"μ","\u22B8":"⊸","\u22D9\u0338":"⋙̸","\u226B\u20D2":"≫⃒","\u21CD":"⇍","\u21CE":"⇎","\u22D8\u0338":"⋘̸","\u226A\u20D2":"≪⃒","\u21CF":"⇏","\u22AF":"⊯","\u22AE":"⊮",\u0144:"ń","\u2220\u20D2":"∠⃒","\u2A70\u0338":"⩰̸","\u224B\u0338":"≋̸",\u0149:"ʼn","\u266E":"♮","\u2A43":"⩃",\u0148:"ň",\u0146:"ņ","\u2A6D\u0338":"⩭̸","\u2A42":"⩂",\u043D:"н","\u2013":"–","\u21D7":"⇗","\u2924":"⤤","\u2250\u0338":"≐̸","\u2928":"⤨","\u{1D52B}":"𝔫","\u21AE":"↮","\u2AF2":"⫲","\u22FC":"⋼","\u22FA":"⋺",\u045A:"њ","\u2266\u0338":"≦̸","\u219A":"↚","\u2025":"‥","\u{1D55F}":"𝕟","\xAC":"¬","\u22F9\u0338":"⋹̸","\u22F5\u0338":"⋵̸","\u22F7":"⋷","\u22F6":"⋶","\u22FE":"⋾","\u22FD":"⋽","\u2AFD\u20E5":"⫽⃥","\u2202\u0338":"∂̸","\u2A14":"⨔","\u219B":"↛","\u2933\u0338":"⤳̸","\u219D\u0338":"↝̸","\u{1D4C3}":"𝓃","\u2284":"⊄","\u2AC5\u0338":"⫅̸","\u2285":"⊅","\u2AC6\u0338":"⫆̸",\u00F1:"ñ",\u03BD:"ν","#":"#","\u2116":"№","\u2007":" ","\u22AD":"⊭","\u2904":"⤄","\u224D\u20D2":"≍⃒","\u22AC":"⊬","\u2265\u20D2":"≥⃒",">\u20D2":">⃒","\u29DE":"⧞","\u2902":"⤂","\u2264\u20D2":"≤⃒","<\u20D2":"<⃒","\u22B4\u20D2":"⊴⃒","\u2903":"⤃","\u22B5\u20D2":"⊵⃒","\u223C\u20D2":"∼⃒","\u21D6":"⇖","\u2923":"⤣","\u2927":"⤧",\u00F3:"ó",\u00F4:"ô",\u043E:"о",\u0151:"ő","\u2A38":"⨸","\u29BC":"⦼",\u0153:"œ","\u29BF":"⦿","\u{1D52C}":"𝔬","\u02DB":"˛",\u00F2:"ò","\u29C1":"⧁","\u29B5":"⦵","\u29BE":"⦾","\u29BB":"⦻","\u29C0":"⧀",\u014D:"ō",\u03C9:"ω",\u03BF:"ο","\u29B6":"⦶","\u{1D560}":"𝕠","\u29B7":"⦷","\u29B9":"⦹","\u2228":"∨","\u2A5D":"⩝",\u2134:"ℴ",\u00AA:"ª",\u00BA:"º","\u22B6":"⊶","\u2A56":"⩖","\u2A57":"⩗","\u2A5B":"⩛",\u00F8:"ø","\u2298":"⊘",\u00F5:"õ","\u2A36":"⨶",\u00F6:"ö","\u233D":"⌽","\xB6":"¶","\u2AF3":"⫳","\u2AFD":"⫽",\u043F:"п","%":"%",".":".","\u2030":"‰","\u2031":"‱","\u{1D52D}":"𝔭",\u03C6:"φ",\u03D5:"ϕ","\u260E":"☎",\u03C0:"π",\u03D6:"ϖ",\u210E:"ℎ","+":"+","\u2A23":"⨣","\u2A22":"⨢","\u2A25":"⨥","\u2A72":"⩲","\u2A26":"⨦","\u2A27":"⨧","\u2A15":"⨕","\u{1D561}":"𝕡","\xA3":"£","\u2AB3":"⪳","\u2AB7":"⪷","\u2AB9":"⪹","\u2AB5":"⪵","\u22E8":"⋨","\u2032":"′","\u232E":"⌮","\u2312":"⌒","\u2313":"⌓","\u22B0":"⊰","\u{1D4C5}":"𝓅",\u03C8:"ψ","\u2008":" ","\u{1D52E}":"𝔮","\u{1D562}":"𝕢","\u2057":"⁗","\u{1D4C6}":"𝓆","\u2A16":"⨖","?":"?","\u291C":"⤜","\u2964":"⥤","\u223D\u0331":"∽̱",\u0155:"ŕ","\u29B3":"⦳","\u2992":"⦒","\u29A5":"⦥","\xBB":"»","\u2975":"⥵","\u2920":"⤠","\u2933":"⤳","\u291E":"⤞","\u2945":"⥅","\u2974":"⥴","\u21A3":"↣","\u219D":"↝","\u291A":"⤚","\u2236":"∶","\u2773":"❳","}":"}","]":"]","\u298C":"⦌","\u298E":"⦎","\u2990":"⦐",\u0159:"ř",\u0157:"ŗ",\u0440:"р","\u2937":"⤷","\u2969":"⥩","\u21B3":"↳","\u25AD":"▭","\u297D":"⥽","\u{1D52F}":"𝔯","\u296C":"⥬",\u03C1:"ρ",\u03F1:"ϱ","\u21C9":"⇉","\u22CC":"⋌","\u02DA":"˚","\u200F":"‏","\u23B1":"⎱","\u2AEE":"⫮","\u27ED":"⟭","\u21FE":"⇾","\u2986":"⦆","\u{1D563}":"𝕣","\u2A2E":"⨮","\u2A35":"⨵",")":")","\u2994":"⦔","\u2A12":"⨒","\u203A":"›","\u{1D4C7}":"𝓇","\u22CA":"⋊","\u25B9":"▹","\u29CE":"⧎","\u2968":"⥨","\u211E":"℞",\u015B:"ś","\u2AB4":"⪴","\u2AB8":"⪸",\u0161:"š",\u015F:"ş",\u015D:"ŝ","\u2AB6":"⪶","\u2ABA":"⪺","\u22E9":"⋩","\u2A13":"⨓",\u0441:"с","\u22C5":"⋅","\u2A66":"⩦","\u21D8":"⇘","\xA7":"§",";":";","\u2929":"⤩","\u2736":"✶","\u{1D530}":"𝔰","\u266F":"♯",\u0449:"щ",\u0448:"ш","\xAD":"­",\u03C3:"σ",\u03C2:"ς","\u2A6A":"⩪","\u2A9E":"⪞","\u2AA0":"⪠","\u2A9D":"⪝","\u2A9F":"⪟","\u2246":"≆","\u2A24":"⨤","\u2972":"⥲","\u2A33":"⨳","\u29E4":"⧤","\u2323":"⌣","\u2AAA":"⪪","\u2AAC":"⪬","\u2AAC\uFE00":"⪬︀",\u044C:"ь","/":"/","\u29C4":"⧄","\u233F":"⌿","\u{1D564}":"𝕤","\u2660":"♠","\u2293\uFE00":"⊓︀","\u2294\uFE00":"⊔︀","\u{1D4C8}":"𝓈","\u2606":"☆","\u2282":"⊂","\u2AC5":"⫅","\u2ABD":"⪽","\u2AC3":"⫃","\u2AC1":"⫁","\u2ACB":"⫋","\u228A":"⊊","\u2ABF":"⪿","\u2979":"⥹","\u2AC7":"⫇","\u2AD5":"⫕","\u2AD3":"⫓","\u266A":"♪","\xB9":"¹","\xB2":"²","\xB3":"³","\u2AC6":"⫆","\u2ABE":"⪾","\u2AD8":"⫘","\u2AC4":"⫄","\u27C9":"⟉","\u2AD7":"⫗","\u297B":"⥻","\u2AC2":"⫂","\u2ACC":"⫌","\u228B":"⊋","\u2AC0":"⫀","\u2AC8":"⫈","\u2AD4":"⫔","\u2AD6":"⫖","\u21D9":"⇙","\u292A":"⤪",\u00DF:"ß","\u2316":"⌖",\u03C4:"τ",\u0165:"ť",\u0163:"ţ",\u0442:"т","\u2315":"⌕","\u{1D531}":"𝔱",\u03B8:"θ",\u03D1:"ϑ",\u00FE:"þ","\xD7":"×","\u2A31":"⨱","\u2A30":"⨰","\u2336":"⌶","\u2AF1":"⫱","\u{1D565}":"𝕥","\u2ADA":"⫚","\u2034":"‴","\u25B5":"▵","\u225C":"≜","\u25EC":"◬","\u2A3A":"⨺","\u2A39":"⨹","\u29CD":"⧍","\u2A3B":"⨻","\u23E2":"⏢","\u{1D4C9}":"𝓉",\u0446:"ц",\u045B:"ћ",\u0167:"ŧ","\u2963":"⥣",\u00FA:"ú",\u045E:"ў",\u016D:"ŭ",\u00FB:"û",\u0443:"у",\u0171:"ű","\u297E":"⥾","\u{1D532}":"𝔲",\u00F9:"ù","\u2580":"▀","\u231C":"⌜","\u230F":"⌏","\u25F8":"◸",\u016B:"ū",\u0173:"ų","\u{1D566}":"𝕦",\u03C5:"υ","\u21C8":"⇈","\u231D":"⌝","\u230E":"⌎",\u016F:"ů","\u25F9":"◹","\u{1D4CA}":"𝓊","\u22F0":"⋰",\u0169:"ũ",\u00FC:"ü","\u29A7":"⦧","\u2AE8":"⫨","\u2AE9":"⫩","\u299C":"⦜","\u228A\uFE00":"⊊︀","\u2ACB\uFE00":"⫋︀","\u228B\uFE00":"⊋︀","\u2ACC\uFE00":"⫌︀",\u0432:"в","\u22BB":"⊻","\u225A":"≚","\u22EE":"⋮","\u{1D533}":"𝔳","\u{1D567}":"𝕧","\u{1D4CB}":"𝓋","\u299A":"⦚",\u0175:"ŵ","\u2A5F":"⩟","\u2259":"≙","\u2118":"℘","\u{1D534}":"𝔴","\u{1D568}":"𝕨","\u{1D4CC}":"𝓌","\u{1D535}":"𝔵",\u03BE:"ξ","\u22FB":"⋻","\u{1D569}":"𝕩","\u{1D4CD}":"𝓍",\u00FD:"ý",\u044F:"я",\u0177:"ŷ",\u044B:"ы","\xA5":"¥","\u{1D536}":"𝔶",\u0457:"ї","\u{1D56A}":"𝕪","\u{1D4CE}":"𝓎",\u044E:"ю",\u00FF:"ÿ",\u017A:"ź",\u017E:"ž",\u0437:"з",\u017C:"ż",\u03B6:"ζ","\u{1D537}":"𝔷",\u0436:"ж","\u21DD":"⇝","\u{1D56B}":"𝕫","\u{1D4CF}":"𝓏","\u200D":"‍","\u200C":"‌"}}}}}),k1=re({"../node_modules/html-entities/lib/numeric-unicode-map.js":function(m){"use strict";Object.defineProperty(m,"__esModule",{value:!0}),m.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}}}),j1=re({"../node_modules/html-entities/lib/surrogate-pairs.js":function(m){"use strict";Object.defineProperty(m,"__esModule",{value:!0}),m.fromCodePoint=String.fromCodePoint||function(x){return String.fromCharCode(Math.floor((x-65536)/1024)+55296,(x-65536)%1024+56320)},m.getCodePoint=String.prototype.codePointAt?function(x,D){return x.codePointAt(D)}:function(x,D){return(x.charCodeAt(D)-55296)*1024+x.charCodeAt(D+1)-56320+65536},m.highSurrogateFrom=55296,m.highSurrogateTo=56319}}),X1=re({"../node_modules/html-entities/lib/index.js":function(m){"use strict";var x=m&&m.__assign||function(){return x=Object.assign||function(g){for(var y,r=1,B=arguments.length;r'"&]/g,nonAscii:/[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g,nonAsciiPrintable:/[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g,nonAsciiPrintableOnly:/[\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g,extensive:/[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g},z={mode:"specialChars",level:"all",numeric:"decimal"};function G(g,y){var r=y===void 0?z:y,B=r.mode,R=B===void 0?"specialChars":B,W=r.numeric,le=W===void 0?"decimal":W,Ee=r.level,$e=Ee===void 0?"all":Ee;if(!g)return"";var De=L[R],oe=N[$e].characters,ye=le==="hexadecimal";return v(g,De,function(Oe){var fe=oe[Oe];if(!fe){var Fe=Oe.length>1?C.getCodePoint(Oe,0):Oe.charCodeAt(0);fe=(ye?"&#x"+Fe.toString(16):"&#"+Fe)+";"}return fe})}m.encode=G;var w={scope:"body",level:"all"},P=/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g,Y=/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g,K={xml:{strict:P,attribute:Y,body:D.bodyRegExps.xml},html4:{strict:P,attribute:Y,body:D.bodyRegExps.html4},html5:{strict:P,attribute:Y,body:D.bodyRegExps.html5}},M=x(x({},K),{all:K.html5}),p=String.fromCharCode,A=p(65533),E={level:"all"};function h(g,y,r,B){var R=g,W=g[g.length-1];if(r&&W==="=")R=g;else if(B&&W!==";")R=g;else{var le=y[g];if(le)R=le;else if(g[0]==="&"&&g[1]==="#"){var Ee=g[2],$e=Ee=="x"||Ee=="X"?parseInt(g.substr(3),16):parseInt(g.substr(2));R=$e>=1114111?A:$e>65535?C.fromCodePoint($e):p(S.numericUnicodeMap[$e]||$e)}}return R}function s(g,y){var r=(y===void 0?E:y).level,B=r===void 0?"all":r;return g?h(g,N[B].entities,!1,!1):""}m.decodeEntity=s;function f(g,y){var r=y===void 0?w:y,B=r.level,R=B===void 0?"all":B,W=r.scope,le=W===void 0?R==="xml"?"strict":"body":W;if(!g)return"";var Ee=M[R][le],$e=N[R].entities,De=le==="attribute",oe=le==="strict";return v(g,Ee,function(ye){return h(ye,$e,De,oe)})}m.decode=f}}),u1=re({"../node_modules/expensify-common/dist/CONST.js":function(m){"use strict";Object.defineProperty(m,"__esModule",{value:!0}),m.PUBLIC_DOMAINS=m.UI=m.CONST=m.g_cloudFrontImg=m.g_cloudFront=void 0;var x="(?=((?=[\\w'#%+-]+(?:\\.[\\w'#%+-]+)*@)[\\w\\.'#%+-]{1,64}@(?:(?=[a-z\\d]+(?:-+[a-z\\d]+)*\\.)(?:[a-z\\d-]{1,63}\\.)+[a-z]{2,63})(?= |_|\\b))(?.*))\\S{3,254}(?=\\k$)",D="YYYY-MM-DD",S="https://d2k5nsl2zxldvw.cloudfront.net";m.g_cloudFront=S;var C=`${S}/images/`;m.g_cloudFrontImg=C;var N={CORPAY_DIRECT_REIMBURSEMENT_CURRENCIES:["USD","GBP","EUR","AUD","CAD"],ACH_DEFAULT_MAX_AMOUNT_LIMIT:2e6,MILEAGE_IRS_RATE:new Date>new Date(2019,1,1)?.545:.58,MAX_TRIAL_BONUS_DAYS:42,COUNTRY:{US:"US",AU:"AU",UK:"UK",NZ:"NZ"},CURRENCIES:{US:"USD",AU:"AUD",UK:"GBP",NZ:"NZD"},STATES:{AK:{stateISO:"AK",stateName:"Alaska"},AL:{stateISO:"AL",stateName:"Alabama"},AR:{stateISO:"AR",stateName:"Arkansas"},AZ:{stateISO:"AZ",stateName:"Arizona"},CA:{stateISO:"CA",stateName:"California"},CO:{stateISO:"CO",stateName:"Colorado"},CT:{stateISO:"CT",stateName:"Connecticut"},DE:{stateISO:"DE",stateName:"Delaware"},FL:{stateISO:"FL",stateName:"Florida"},GA:{stateISO:"GA",stateName:"Georgia"},HI:{stateISO:"HI",stateName:"Hawaii"},IA:{stateISO:"IA",stateName:"Iowa"},ID:{stateISO:"ID",stateName:"Idaho"},IL:{stateISO:"IL",stateName:"Illinois"},IN:{stateISO:"IN",stateName:"Indiana"},KS:{stateISO:"KS",stateName:"Kansas"},KY:{stateISO:"KY",stateName:"Kentucky"},LA:{stateISO:"LA",stateName:"Louisiana"},MA:{stateISO:"MA",stateName:"Massachusetts"},MD:{stateISO:"MD",stateName:"Maryland"},ME:{stateISO:"ME",stateName:"Maine"},MI:{stateISO:"MI",stateName:"Michigan"},MN:{stateISO:"MN",stateName:"Minnesota"},MO:{stateISO:"MO",stateName:"Missouri"},MS:{stateISO:"MS",stateName:"Mississippi"},MT:{stateISO:"MT",stateName:"Montana"},NC:{stateISO:"NC",stateName:"North Carolina"},ND:{stateISO:"ND",stateName:"North Dakota"},NE:{stateISO:"NE",stateName:"Nebraska"},NH:{stateISO:"NH",stateName:"New Hampshire"},NJ:{stateISO:"NJ",stateName:"New Jersey"},NM:{stateISO:"NM",stateName:"New Mexico"},NV:{stateISO:"NV",stateName:"Nevada"},NY:{stateISO:"NY",stateName:"New York"},OH:{stateISO:"OH",stateName:"Ohio"},OK:{stateISO:"OK",stateName:"Oklahoma"},OR:{stateISO:"OR",stateName:"Oregon"},PA:{stateISO:"PA",stateName:"Pennsylvania"},PR:{stateISO:"PR",stateName:"Puerto Rico"},RI:{stateISO:"RI",stateName:"Rhode Island"},SC:{stateISO:"SC",stateName:"South Carolina"},SD:{stateISO:"SD",stateName:"South Dakota"},TN:{stateISO:"TN",stateName:"Tennessee"},TX:{stateISO:"TX",stateName:"Texas"},UT:{stateISO:"UT",stateName:"Utah"},VA:{stateISO:"VA",stateName:"Virginia"},VT:{stateISO:"VT",stateName:"Vermont"},WA:{stateISO:"WA",stateName:"Washington"},WI:{stateISO:"WI",stateName:"Wisconsin"},WV:{stateISO:"WV",stateName:"West Virginia"},WY:{stateISO:"WY",stateName:"Wyoming"},DC:{stateISO:"DC",stateName:"District Of Columbia"}},SPECIAL_CHARS_TO_REMOVE:"$*.+!(,=",REG_EXP:{DOMAIN:/^[\w-\.]*\.\w{2,}$/,EMAIL_PART:x,GENERAL_PHONE_PART:/^(\+\d{1,2}\s?)?(\(\d{3}\)|\d{3})[\s.-]?\d{3}[\s.-]?\d{4}$/,PHONE_PART:"\\+[1-9]\\d{1,14}",FREE_NAME:/^[^\r\n\t]{1,256}$/,MASKED_CARD:/^\d{0,6}[X]+\d{4,7}$/,EMAIL:new RegExp(`^${x}$`,"i"),EXTRACT_EMAIL:new RegExp(x,"gi"),EMAIL_SEARCH:new RegExp(x,"gi"),HYPERLINK:new RegExp("^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$","i"),MARKDOWN_EMAIL:x,EMOJI_RULE:/(?:[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u2388\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2605\u2607-\u2612\u2614-\u2685\u2690-\u2705\u2708-\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763-\u2767\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC00-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDAD-\uDDE5\uDE01-\uDE0F\uDE1A\uDE2F\uDE32-\uDE3A\uDE3C-\uDE3F\uDE49-\uDFFA]|\uD83D[\uDC00-\uDD3D\uDD46-\uDE4F\uDE80-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDCFF\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDEFF]|\uD83F[\uDC00-\uDFFD])(\u200D(?:[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u2388\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2605\u2607-\u2612\u2614-\u2685\u2690-\u2705\u2708-\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763-\u2767\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC00-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDAD-\uDDE5\uDE01-\uDE0F\uDE1A\uDE2F\uDE32-\uDE3A\uDE3C-\uDE3F\uDE49-\uDFFA]|\uD83D[\uDC00-\uDD3D\uDD46-\uDE4F\uDE80-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDCFF\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDEFF]|\uD83F[\uDC00-\uDFFD])|(?:\uD83C[\uDFFB-\uDFFF])|(?:\uDB40[\uDC20-\uDC7F])|\uFE0F|\u20E3)*|(?:\uD83C[\uDDE6-\uDDFF]){2}|[#\*0-9]\uFE0F?\u20E3/g},REPORT:{LIMIT_PRINT_PDF:250,ACH_LIMIT:2e6,ACH_DEFAULT_DAYS:4,TITLE_FORMULA:"{report:title}",MAX_AGE_SAME_COMMENT:300,SMARTREPORT_AGENT_EMAIL:"smartreports@expensify.com"},URL:{FORUM_ROOT:"https://community.expensify.com/",RECEIPTS:{DEVELOPMENT:"https://www.expensify.com.dev/receipts/",STAGING:"https://staging.expensify.com/receipts/",PRODUCTION:"https://www.expensify.com/receipts/"},CLOUDFRONT:"https://d2k5nsl2zxldvw.cloudfront.net",CLOUDFRONT_IMG:"https://d2k5nsl2zxldvw.cloudfront.net/images/",CLOUDFRONT_FILES:"https://d2k5nsl2zxldvw.cloudfront.net/files/",EXPENSIFY_SYNC_MANAGER:"quickbooksdesktop/Expensify_QuickBooksDesktop_Setup_2300802.exe",USEDOT_ROOT:"https://use.expensify.com/",HELPDOT_ROOT:"https://help.expensify.com/",ITUNES_SUBSCRIPTION:"https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/manageSubscriptions"},DATE:{FORMAT_STRING:"yyyy-MM-dd",FORMAT_STRING_PRETTY:"MMM d, yyyy",MOMENT_FORMAT_STRING:D,MOMENT_DATE_TIME:"YYYY-MM-DD HH:mm",MOMENT_DATE_TIME_PRETTY:"MMM DD YYYY h:mma",MOMENT_DATE_TIME_TIMEZONE:"YYYY-MM-DDTHH:mm:ssZ",MOMENT_US_DATE:"MMM D, YYYY",MOMENT_US_DATE_LONG:"MMMM D, YYYY",MOMENT_US_MONTH_YEAR_LONG:"MMMM YYYY",TIMEZONE_OFFSET_MS:new Date().getTimezoneOffset()*6e4,SHORT_MONTH_SHORT_DAY:"MMM d",LONG_YEAR_MONTH_DAY_24_TIME:"yyyy-MM-dd HH:mm:ss",SHORT_MONTH_DAY_LOCAL_TIME:"MMM D [at] LT",SHORT_MONTH_DAY_YEAR_LOCAL_TIME:"MMM D, YYYY [at] LT"},FUNC_DIE_MESSAGE:"Aborting JavaScript execution",EMAIL_DELIVERY_FAILURE_VALIDITY:1209600,BILL_PROCESSING_PARTNER_NAME:"expensify.cash",BILL_PROCESSING_EMAIL_DOMAIN:"expensify.cash",BANK_IMPORT:{BANK_STATUS_BROKEN:2},BANK_ACCOUNT:{VERIFICATION_MAX_ATTEMPTS:7},EXPENSIFY_EMAILS:["concierge@expensify.com","help@expensify.com","receipts@expensify.com","chronos@expensify.com","qa@expensify.com","contributors@expensify.com","firstresponders@expensify.com","qa+travisreceipts@expensify.com","bills@expensify.com","studentambassadors@expensify.com","accounting@expensify.com","payroll@expensify.com","svfg@expensify.com","integrationtestingcreds@expensify.com","admin@expensify.com","notifications@expensify.com"],INVALID_APPROVER_AND_SHAREE_EMAILS:["concierge@expensify.com","help@expensify.com","receipts@expensify.com","chronos@expensify.com","qa@expensify.com","contributors@expensify.com","firstresponders@expensify.com","qa+travisreceipts@expensify.com","bills@expensify.com","admin@expensify.com","notifications@expensify.com"],SMART_SCAN:{COST:20,FREE_NUMBER:25},SMS:{DOMAIN:"expensify.sms",E164_REGEX:/^\+?[1-9]\d{1,14}$/},PASSWORD_COMPLEXITY_REGEX_STRING:"^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{8,}$",INTEGRATIONS:{DATA_MAPPING:{NONE:"NONE",TAG:"TAG",REPORT_FIELD:"REPORT_FIELD",DEFAULT:"DEFAULT"},EXPORT_DATE:{LAST_EXPENSE:"LAST_EXPENSE",REPORT_EXPORTED:"REPORT_EXPORTED",REPORT_SUBMITTED:"REPORT_SUBMITTED"},XERO_HQ_CONNECTION_NAME:"xerohq",EXPENSIFY_SYNC_MANAGER_VERSION:"23.0.802.0"},INTEGRATION_TYPES:{ACCOUNTING:"accounting",HR:"hr"},DIRECT_INTEGRATIONS:{zenefits:{value:"zenefits",text:"Zenefits",image:`${C}icons/export-icons/zenefit.svg`,gray_image:`${C}icons/export-icons/zenefit_gray.svg`,alert_image:`${C}icons/export-icons/zenefit_alert.svg`,types:["hr"],isCorporateOnly:!1},gusto:{value:"gusto",text:"Gusto",image:`${C}icons/export-icons/gusto.svg`,gray_image:`${C}icons/export-icons/gusto_gray.svg`,alert_image:`${C}icons/export-icons/gusto_alert.svg`,types:["hr"],isCorporateOnly:!1},quickbooksOnline:{value:"quickbooksOnline",text:"QuickBooks Online",image:`${C}icons/export-icons/quickbooks.svg`,gray_image:`${C}icons/export-icons/quickbooks_gray.svg`,alert_image:`${C}icons/export-icons/quickbooks_alert.svg`,types:["hr","accounting"],isCorporateOnly:!1},xero:{value:"xero",text:"Xero",image:`${C}icons/export-icons/xero.svg`,gray_image:`${C}icons/export-icons/xero_gray.svg`,alert_image:`${C}icons/export-icons/xero_alert.svg`,types:["accounting"],isCorporateOnly:!1},netsuite:{value:"netsuite",text:"NetSuite",image:`${C}icons/export-icons/netsuite.svg`,gray_image:`${C}icons/export-icons/netsuite_gray.svg`,alert_image:`${C}icons/export-icons/netsuite_alert.svg`,types:["hr","accounting"],isCorporateOnly:!0},quickbooksDesktop:{value:"qbd",text:"QuickBooks Desktop",image:`${C}icons/export-icons/quickbooks.svg`,gray_image:`${C}icons/export-icons/quickbooks_gray.svg`,alert_image:`${C}icons/export-icons/quickbooks_alert.svg`,types:["accounting"],isCorporateOnly:!1},intacct:{value:"intacct",text:"Sage Intacct",image:`${C}icons/export-icons/sage.svg`,gray_image:`${C}icons/export-icons/sage_gray.svg`,alert_image:`${C}icons/export-icons/sage_alert.svg`,types:["hr","accounting"],isCorporateOnly:!0},financialforce:{value:"financialforce",text:"Certinia",image:`${C}icons/export-icons/certinia.svg`,gray_image:`${C}icons/export-icons/certinia_gray.svg`,alert_image:`${C}icons/export-icons/certinia_alert.svg`,types:["accounting"],isCorporateOnly:!0}},INDIRECT_INTEGRATIONS:{microsoft_dynamics:{value:"microsoft_dynamics",text:"Microsoft Dynamics",image:`${C}icons/export-icons/microsoft_dynamics.svg`,gray_image:`${C}icons/export-icons/microsoft_dynamics_gray.svg`,types:["accounting"],isCorporateOnly:!0},oracle:{value:"oracle",text:"Oracle",image:`${C}icons/export-icons/oracle.svg`,gray_image:`${C}icons/export-icons/oracle_gray.svg`,types:["hr","accounting"],isCorporateOnly:!0},sage:{value:"sage",text:"Sage",image:`${C}icons/export-icons/sage.svg`,gray_image:`${C}icons/export-icons/sage_gray.svg`,types:["accounting"],isCorporateOnly:!0},sap:{value:"sap",text:"SAP",image:`${C}icons/export-icons/sap.svg`,gray_image:`${C}icons/export-icons/sap_gray.svg`,types:["accounting"],isCorporateOnly:!0},myob:{value:"myob",text:"MYOB",image:`${C}icons/export-icons/myob.svg`,gray_image:`${C}icons/export-icons/myob_gray.svg`,types:["accounting"],isCorporateOnly:!0},workday:{value:"workday",text:"Workday",image:`${C}icons/export-icons/workday.svg`,gray_image:`${C}icons/export-icons/workday_gray.svg`,types:["hr"],isCorporateOnly:!0},adp:{value:"adp",text:"ADP",image:`${C}icons/export-icons/adp.svg`,types:["hr"],isCorporateOnly:!0},generic_indirect_connection:{value:"generic_indirect_connection",text:"Other",image:`${C}icons/accounting-other--blue.svg`,types:["hr","accounting"]}},DEFAULT_IS_TEMPLATES:{default:{value:"default_template",text:"Basic Export",image:`${C}icons/accounting-other--blue.svg`},tag:{value:"tag_template",text:"Tag Export",image:`${C}icons/accounting-other--blue.svg`},category:{value:"category_template",text:"Category Export",image:`${C}icons/accounting-other--blue.svg`},detailed:{value:"detailed_export",text:"All Data - Expense Level Export",image:`${C}icons/accounting-other--blue.svg`},report:{value:"report_level_export",text:"All Data - Report Level Export",image:`${C}icons/accounting-other--blue.svg`},tax:{value:"multiple_tax_export",text:"Canadian Multiple Tax Export",image:`${C}icons/accounting-other--blue.svg`},perdiem:{value:"per_diem_export",text:"Per Diem Export",image:`${C}icons/accounting-other--blue.svg`},attendees:{value:"attendee_audit_export",text:"Attendee Audit Export",image:`${C}icons/accounting-other--blue.svg`}},NVP:{DISMISSED_VIOLATIONS:"dismissedViolations"},FILESIZE:{BYTES_IN_MEGABYTE:1e6,MAX:1e7},PARTNER_NAMES:{IPHONE:"iphone",ANDROID:"android",CHAT:"chat-expensify-com"},LOGIN_TYPES:{WEB:"login",MOBILE:"device"},EXPENSIFY_CARD:{FEED_NAME:"Expensify Card",FRAUD_STATES:{NONE:0,DOMAIN_CARDS_REIMBURSEMENTS_INVESTIGATION:1,DOMAIN_CARDS_RAPID_INCREASE_INVESTIGATION:2,DOMAIN_CARDS_RAPID_INCREASE_CLEARED:3,DOMAIN_CARDS_RAPID_INCREASE_CONFIRMED:4,INDIVIDUAL_CARD_RAPID_INCREASE_INVESTIGATION:5,INDIVIDUAL_CARD_RAPID_INCREASE_CLEARED:6,INDIVIDUAL_CARD_RAPID_INCREASE_CONFIRMED:7,SUSPICIOUS_PAN_ENTRY:8,SUSPICIOUS_PAN_ENTRY_CLEARED:9,SUSPICIOUS_PAN_ENTRY_CONFIRMED:10}},TRAVEL_BOOKING:{OPTIONS:{shortFlightFare:{economy:"Economy",premiumEconomy:"Premium Economy",business:"Business",first:"First"},longFlightFare:{economy:"Economy",premiumEconomy:"Premium Economy",business:"Business",first:"First"},hotelStar:{oneStar:"1",twoStars:"2",threeStars:"3",fourStars:"4",fiveStars:"5"}},DEFAULT_OPTIONS:{shortFlightFare:"economy",longFlightFare:"economy",hotelStar:"fourStars"}},EXPENSIFY_DOMAINS:["expensify.com","expensifail.com","expensicorp.com"],SUBSCRIPTION_CHANGE_REASONS:{TOO_LIMITED:{id:"tooLimited",label:"Functionality needs improvement",prompt:"What software are you moving to and why?"},TOO_EXPENSIVE:{id:"tooExpensive",label:"Too expensive",prompt:"What software are you moving to and why?"},INADEQUATE_SUPPORT:{id:"inadequateSupport",label:"Inadequate customer support",prompt:"What software are you moving to and why?"},BUSINESS_CLOSING:{id:"businessClosing",label:"Company closing, downsizing, or acquired",prompt:"What software are you moving to and why?"}},VIDEO_EXTENSIONS:["mp4","mov","avi","wmv","flv","mkv","webm","3gp","m4v","mpg","mpeg","ogv"]};m.CONST=N;var v={ICON:{DELETE:"trashcan",CAR:"car",CASH:"cash",MANAGED_CARD:"corporate-card",CARD:"credit-card",CLOCK:"time",PER_DIEM:"per-diem",PENDING_CARD:"card-transaction-pending",CSV_UPLOAD:"csv-upload",PENDING_CREDIT_CARD:"credit-card-pending"},spinnerDIV:'
',spinnerSmallDIV:'
',spinnerLargeDIV:'
',spinnerClass:"view_spinner",SPINNER:"spinner",imageURLPrefix:C,ACTIVE:"active",ERROR:"error",HIDDEN:"hidden",INVISIBLE:"invisible",DEPRECIATED:"depreciated",DISABLED:"disabled",REQUIRED:"required",SELECT_DEFAULT:"###",SELECTED:"selected",QR_CODE:"js_qrCode",DIALOG_Z_INDEX:4e3};m.UI=v;var L=["accountant.com","afis.ch","aol.com","artlover.com","asia.com","att.net","bellsouth.net","bills.expensify.com","btinternet.com","cheerful.com","chromeexpensify.com","comcast.net","consultant.com","contractor.com","cox.net","cpa.com","cryptohistoryprice.com","dr.com","email.com","engineer.com","europe.com","evernote.user","execs.com","expensify.cash","expensify.sms","gmail.com","gmail.con","googlemail.com","hey.com","hotmail.co.uk","hotmail.com","hotmail.fr","hotmail.it","icloud.com","iname.com","jeeviess.com","live.com","mac.com","mail.com","mail.ru","mailfence.com","me.com","msn.com","musician.org","myself.com","outlook.com","pm.me","post.com","privaterelay.appleid.com","proton.me","protonmail.ch","protonmail.com","qq.com","rigl.ch","sasktel.net","sbcglobal.net","spacehotline.com","tafmail.com","techie.com","usa.com","verizon.net","vomoto.com","wolfandcranebar.tech","workmail.com","writeme.com","yahoo.ca","yahoo.co.in","yahoo.co.uk","yahoo.com","yahoo.com.br","ymail.com"];m.PUBLIC_DOMAINS=L}}),V1=re({"../node_modules/expensify-common/dist/tlds.js":function(m){"use strict";Object.defineProperty(m,"__esModule",{value:!0});var x="XN--VERMGENSBERATUNG-PWB|XN--VERMGENSBERATER-CTB|XN--CLCHC0EA0B2G2A9GCD|XN--W4R85EL8FHU5DNRA|TRAVELERSINSURANCE|NORTHWESTERNMUTUAL|XN--XKC2DL3A5EE0H|XN--MGBERP4A5D4AR|XN--MGBAI9AZGQP6J|XN--MGBAH1A3HJKRD|XN--BCK1B9A5DRE4C|XN--5SU34J936BGSG|XN--3OQ18VL8PN36A|XN--XKC2AL3HYE2A|XN--MGBCPQ6GPA1A|XN--MGBA7C0BBN0A|XN--FZYS8D69UVGM|XN--NQV7FS00EMA|XN--MGBC0A9AZCG|XN--MGBAAKC7DVF|XN--MGBA3A4F16A|XN--LGBBAT1AD8J|XN--KCRX77D1X4A|XN--I1B6B1A6A2E|SANDVIKCOROMANT|KERRYPROPERTIES|AMERICANEXPRESS|XN--RVC1E0AM3E|XN--MGBX4CD0AB|XN--MGBI4ECEXP|XN--MGBCA7DZDO|XN--MGBBH1A71E|XN--MGBAYH7GPA|XN--MGBAAM7A8H|XN--MGBA3A3EJT|XN--JLQ61U9W7B|XN--JLQ480N2RG|XN--H2BREG3EVE|XN--FIQ228C5HS|XN--B4W605FERD|XN--80AQECDR1A|XN--6QQ986B3XL|XN--54B7FTA0CC|WEATHERCHANNEL|KERRYLOGISTICS|COOKINGCHANNEL|CANCERRESEARCH|BANANAREPUBLIC|AMERICANFAMILY|AFAMILYCOMPANY|XN--YGBI2AMMX|XN--YFRO4I67O|XN--TIQ49XQYJ|XN--H2BRJ9C8C|XN--FZC2C9E2C|XN--FPCRJ9C3D|XN--ECKVDTC9D|XN--CCKWCXETD|WOLTERSKLUWER|TRAVELCHANNEL|SPREADBETTING|LIFEINSURANCE|INTERNATIONAL|XN--QCKA1PMC|XN--OGBPF8FL|XN--NGBE9E0A|XN--NGBC5AZD|XN--MK1BU44C|XN--MGBT3DHD|XN--MGBPL2FH|XN--MGBGU82A|XN--MGBAB2BD|XN--MGB9AWBF|XN--GCKR3F0F|XN--8Y0A063A|XN--80ASEHDB|XN--80ADXHKS|XN--4DBRK0CE|XN--45BR5CYL|XN--3E0B707E|VERSICHERUNG|SCHOLARSHIPS|LPLFINANCIAL|CONSTRUCTION|XN--ZFR164B|XN--XHQ521B|XN--W4RS40L|XN--VUQ861B|XN--T60B56A|XN--SES554G|XN--S9BRJ9C|XN--ROVU88B|XN--RHQV96G|XN--Q9JYB4C|XN--PGBS0DH|XN--OTU796D|XN--NYQY26A|XN--MIX891F|XN--MGBTX2B|XN--MGBBH1A|XN--KPRY57D|XN--KPRW13D|XN--JVR189M|XN--J6W193G|XN--IMR513N|XN--HXT814E|XN--H2BRJ9C|XN--GK3AT1E|XN--GECRJ9C|XN--G2XX48C|XN--FLW351E|XN--FJQ720A|XN--FCT429K|XN--EFVY88H|XN--D1ACJ3B|XN--CZR694B|XN--CCK2B3B|XN--9KRT00A|XN--80AO21A|XN--6FRZ82G|XN--55QW42G|XN--45BRJ9C|XN--42C2D9A|XN--3HCRJ9C|XN--3DS443G|XN--3BST00M|XN--2SCRJ9C|XN--1QQW23A|XN--1CK2E1B|XN--11B4C3D|WILLIAMHILL|REDUMBRELLA|PROGRESSIVE|PRODUCTIONS|PLAYSTATION|PHOTOGRAPHY|OLAYANGROUP|MOTORCYCLES|LAMBORGHINI|KERRYHOTELS|INVESTMENTS|FOODNETWORK|ENTERPRISES|ENGINEERING|CREDITUNION|CONTRACTORS|CALVINKLEIN|BRIDGESTONE|BLOCKBUSTER|BLACKFRIDAY|BARCLAYCARD|ACCOUNTANTS|XN--Y9A3AQ|XN--WGBL6A|XN--WGBH1C|XN--UNUP4Y|XN--Q7CE6A|XN--PSSY2U|XN--O3CW4H|XN--MXTQ1M|XN--KPUT3I|XN--IO0A7I|XN--FIQZ9S|XN--FIQS8S|XN--FIQ64B|XN--CZRU2D|XN--CZRS0T|XN--CG4BKI|XN--C2BR7G|XN--9ET52U|XN--9DBQ2A|XN--90A3AC|XN--80ASWG|XN--5TZM5G|XN--55QX5D|XN--4GBRIM|XN--45Q11C|XN--3PXU8K|XN--30RR7Y|VOLKSWAGEN|VLAANDEREN|UNIVERSITY|TECHNOLOGY|TATAMOTORS|SWIFTCOVER|SCHAEFFLER|RESTAURANT|REPUBLICAN|REALESTATE|PRUDENTIAL|PROTECTION|PROPERTIES|ONYOURSIDE|NEXTDIRECT|NATIONWIDE|MITSUBISHI|MANAGEMENT|INDUSTRIES|IMMOBILIEN|HEALTHCARE|FOUNDATION|EXTRASPACE|EUROVISION|CUISINELLA|CREDITCARD|CONSULTING|CAPITALONE|BOEHRINGER|BNPPARIBAS|BASKETBALL|ASSOCIATES|APARTMENTS|ACCOUNTANT|YODOBASHI|XN--VHQUV|XN--TCKWE|XN--QXA6A|XN--P1ACF|XN--NQV7F|XN--NGBRX|XN--L1ACC|XN--J1AMH|XN--J1AEF|XN--FHBEI|XN--E1A4C|XN--D1ALF|XN--C1AVG|XN--90AIS|VACATIONS|TRAVELERS|STOCKHOLM|STATEFARM|STATEBANK|SOLUTIONS|SHANGRILA|SCJOHNSON|RICHARDLI|PRAMERICA|PASSAGENS|PANASONIC|MICROSOFT|MELBOURNE|MARSHALLS|MARKETING|LIFESTYLE|LANDROVER|LANCASTER|KUOKGROUP|INSURANCE|INSTITUTE|HOMESENSE|HOMEGOODS|HOMEDEPOT|HISAMITSU|GOLDPOINT|FURNITURE|FUJIXEROX|FRONTDOOR|FRESENIUS|FIRESTONE|FINANCIAL|FAIRWINDS|EQUIPMENT|EDUCATION|DIRECTORY|COMMUNITY|CHRISTMAS|BLOOMBERG|BARCELONA|AQUARELLE|ANALYTICS|AMSTERDAM|ALLFINANZ|ALFAROMEO|ACCENTURE|YOKOHAMA|XN--QXAM|XN--P1AI|XN--NODE|XN--90AE|WOODSIDE|VERISIGN|VENTURES|VANGUARD|TRAINING|SUPPLIES|STCGROUP|SOFTWARE|SOFTBANK|SHOWTIME|SHOPPING|SERVICES|SECURITY|SAMSCLUB|SAARLAND|RELIANCE|REDSTONE|PROPERTY|PLUMBING|PICTURES|PHARMACY|PARTNERS|OBSERVER|MORTGAGE|MERCKMSD|MEMORIAL|MCKINSEY|MASERATI|MARRIOTT|LUNDBECK|LIGHTING|JPMORGAN|ISTANBUL|IPIRANGA|INFINITI|HOSPITAL|HOLDINGS|HELSINKI|HDFCBANK|GUARDIAN|GRAPHICS|GRAINGER|GOODYEAR|FRONTIER|FOOTBALL|FIRMDALE|FIDELITY|FEEDBACK|EXCHANGE|ETISALAT|ERICSSON|ENGINEER|DOWNLOAD|DISCOVER|DISCOUNT|DIAMONDS|DEMOCRAT|DELOITTE|DELIVERY|COMPUTER|COMMBANK|CLOTHING|CLINIQUE|CLEANING|CITYEATS|CIPRIANI|CATHOLIC|CATERING|CAPETOWN|BUSINESS|BUILDERS|BUDAPEST|BRUSSELS|BROADWAY|BRADESCO|BOUTIQUE|BASEBALL|BARGAINS|BAREFOOT|BARCLAYS|ATTORNEY|ALLSTATE|AIRFORCE|ABUDHABI|ZUERICH|YOUTUBE|YAMAXUN|XFINITY|WINNERS|WINDOWS|WHOSWHO|WEDDING|WEBSITE|WEATHER|WATCHES|WANGGOU|WALMART|TRADING|TOSHIBA|TIFFANY|TICKETS|THEATRE|THEATER|TEMASEK|SYSTEMS|SURGERY|SUPPORT|STORAGE|STAPLES|SINGLES|SHIKSHA|SCIENCE|SCHWARZ|SCHMIDT|SANDVIK|SAMSUNG|REXROTH|REVIEWS|RENTALS|RECIPES|REALTOR|POLITIE|PIONEER|PHILIPS|ORIGINS|ORGANIC|OLDNAVY|OKINAWA|NEUSTAR|NETWORK|NETFLIX|NETBANK|MONSTER|MARKETS|LINCOLN|LIMITED|LECLERC|LATROBE|LASALLE|LANXESS|LACAIXA|KOMATSU|KITCHEN|JUNIPER|JEWELRY|ISMAILI|HYUNDAI|HOTMAIL|HOTELES|HOSTING|HOLIDAY|HITACHI|HANGOUT|HAMBURG|GUITARS|GROCERY|GODADDY|GENTING|GALLERY|FUJITSU|FROGANS|FORSALE|FLOWERS|FLORIST|FLIGHTS|FITNESS|FISHING|FINANCE|FERRERO|FERRARI|FASHION|FARMERS|EXPRESS|EXPOSED|DOMAINS|DIGITAL|DENTIST|CRUISES|CRICKET|COURSES|COUPONS|COUNTRY|CORSICA|COOKING|CONTACT|COMPARE|COMPANY|COMCAST|COLOGNE|COLLEGE|CLUBMED|CITADEL|CHINTAI|CHARITY|CHANNEL|CAREERS|CARAVAN|CAPITAL|BUGATTI|BROTHER|BOOKING|BESTBUY|BENTLEY|BAUHAUS|BANAMEX|AVIANCA|AUSPOST|AUDIBLE|AUCTION|ATHLETA|ANDROID|ALIBABA|AGAKHAN|ACADEMY|ABOGADO|ZAPPOS|YANDEX|YACHTS|XIHUAN|WEBCAM|WALTER|VUELOS|VOYAGE|VOTING|VISION|VIRGIN|VILLAS|VIKING|VIAJES|UNICOM|TRAVEL|TOYOTA|TKMAXX|TJMAXX|TIENDA|TENNIS|TATTOO|TARGET|TAOBAO|TAIPEI|SYDNEY|SWATCH|SUZUKI|SUPPLY|STUDIO|STREAM|SOCIAL|SOCCER|SHOUJI|SELECT|SECURE|SEARCH|SCHULE|SCHOOL|SANOFI|SAKURA|SAFETY|RYUKYU|ROGERS|ROCHER|REVIEW|REPORT|REPAIR|REISEN|REALTY|RACING|QUEBEC|PICTET|PHYSIO|PHOTOS|PFIZER|OTSUKA|ORANGE|ORACLE|ONLINE|OLAYAN|OFFICE|NOWRUZ|NORTON|NISSAY|NISSAN|NATURA|NAGOYA|MUTUAL|MUSEUM|MOSCOW|MORMON|MONASH|MOBILE|MATTEL|MARKET|MAKEUP|MAISON|MADRID|LUXURY|LONDON|LOCKER|LIVING|LEFRAK|LAWYER|LATINO|LANCIA|KOSHER|KINDLE|KINDER|KAUFEN|JUEGOS|JOBURG|JAGUAR|INTUIT|INSURE|IMAMAT|HUGHES|HOTELS|HOCKEY|HIPHOP|HERMES|HEALTH|GRATIS|GOOGLE|GLOBAL|GIVING|GEORGE|GARDEN|GALLUP|FUTBOL|FLICKR|FAMILY|EXPERT|EVENTS|ESTATE|ENERGY|EMERCK|DURBAN|DUPONT|DUNLOP|DOCTOR|DIRECT|DESIGN|DENTAL|DEGREE|DEALER|DATSUN|DATING|CRUISE|CREDIT|COUPON|CONDOS|COMSEC|COFFEE|CLINIC|CLAIMS|CIRCLE|CHURCH|CHROME|CHANEL|CENTER|CASINO|CAREER|CAMERA|BROKER|BOSTON|BOSTIK|BHARTI|BERLIN|BEAUTY|BAYERN|AUTHOR|ARAMCO|ANQUAN|AMAZON|ALSTOM|ALSACE|ALIPAY|AIRTEL|AIRBUS|AGENCY|AFRICA|ABBVIE|ABBOTT|ABARTH|YAHOO|XEROX|WORLD|WORKS|WEIBO|WEBER|WATCH|WALES|VOLVO|VODKA|VIDEO|VEGAS|UBANK|TUSHU|TUNES|TRUST|TRADE|TOURS|TOTAL|TORAY|TOOLS|TOKYO|TODAY|TMALL|TIROL|TIRES|TATAR|SWISS|SUCKS|STYLE|STUDY|STORE|STADA|SPORT|SPACE|SOLAR|SMILE|SMART|SLING|SKYPE|SHOES|SHELL|SHARP|SEVEN|SENER|SALON|RUGBY|RODEO|ROCKS|RICOH|REISE|REHAB|RADIO|QUEST|PROMO|PRIME|PRESS|PRAXI|POKER|PLACE|PIZZA|PHOTO|PHONE|PARTY|PARTS|PARIS|OSAKA|OMEGA|NOWTV|NOKIA|NINJA|NIKON|NEXUS|MOVIE|MONEY|MIAMI|MEDIA|MANGO|MACYS|LOTTO|LOTTE|LOCUS|LOANS|LIXIL|LIPSY|LINDE|LILLY|LEXUS|LEGAL|LEASE|LAMER|KYOTO|KOELN|JETZT|IVECO|IRISH|IKANO|HYATT|HOUSE|HORSE|HONDA|HOMES|GUIDE|GUCCI|GROUP|GRIPE|GREEN|GMAIL|GLOBO|GLASS|GLADE|GIVES|GIFTS|GAMES|GALLO|FORUM|FOREX|FINAL|FEDEX|FAITH|EPSON|EMAIL|EDEKA|EARTH|DUBAI|DRIVE|DELTA|DEALS|DANCE|DABUR|CYMRU|CROWN|CODES|COACH|CLOUD|CLICK|CITIC|CISCO|CHEAP|CHASE|CARDS|CANON|BUILD|BOSCH|BOATS|BLACK|BINGO|BIBLE|BEATS|BAIDU|AZURE|AUTOS|AUDIO|ARCHI|APPLE|AMICA|AMFAM|AETNA|ADULT|ACTOR|ZONE|ZERO|ZARA|YOGA|XBOX|WORK|WINE|WIKI|WIEN|WEIR|WANG|VOTO|VOTE|VIVO|VIVA|VISA|VANA|TUBE|TOYS|TOWN|TIPS|TIAA|TEVA|TECH|TEAM|TAXI|TALK|SURF|STAR|SPOT|SONY|SONG|SOHU|SNCF|SKIN|SITE|SINA|SILK|SHOW|SHOP|SHIA|SHAW|SEXY|SEEK|SEAT|SCOT|SAXO|SAVE|SARL|SALE|SAFE|RUHR|RSVP|ROOM|RMIT|RICH|REST|RENT|REIT|READ|RAID|QPON|PROF|PROD|POST|PORN|POHL|PLUS|PLAY|PINK|PING|PICS|PCCW|PARS|PAGE|OPEN|OLLO|NIKE|NICO|NEXT|NEWS|NAVY|NAME|MOTO|MODA|MOBI|MINT|MINI|MENU|MEME|MEET|MAIF|LUXE|LTDA|LOVE|LOFT|LOAN|LIVE|LINK|LIMO|LIKE|LIFE|LIDL|LGBT|LEGO|LAND|KRED|KPMG|KIWI|KDDI|JPRS|JOBS|JEEP|JAVA|ITAU|INFO|IMMO|IMDB|IEEE|ICBC|HSBC|HOST|HGTV|HERE|HELP|HDFC|HAUS|HAIR|GURU|GUGE|GOOG|GOLF|GOLD|GMBH|GIFT|GGEE|GENT|GBIZ|GAME|FUND|FREE|FORD|FOOD|FLIR|FISH|FIRE|FILM|FIDO|FIAT|FAST|FARM|FANS|FAIL|FAGE|ERNI|DVAG|DUCK|DOCS|DISH|DIET|DESI|DELL|DEAL|DCLK|DATE|DATA|CYOU|COOP|COOL|CLUB|CITY|CITI|CHAT|CERN|CBRE|CASH|CASE|CASA|CARS|CARE|CAMP|CALL|CAFE|BUZZ|BOOK|BOND|BOFA|BLUE|BLOG|BING|BIKE|BEST|BEER|BBVA|BANK|BAND|BABY|AUTO|AUDI|ASIA|ASDA|ARTE|ARPA|ARMY|ARAB|AMEX|ALLY|AKDN|AERO|ADAC|ABLE|AARP|ZIP|YUN|YOU|XYZ|XXX|XIN|WTF|WTC|WOW|WME|WIN|WED|VIP|VIN|VIG|VET|UPS|UOL|UNO|UBS|TVS|TUI|TRV|TOP|TJX|THD|TEL|TDK|TCI|TAX|TAB|STC|SRL|SPA|SOY|SKY|SKI|SFR|SEX|SEW|SES|SCB|SCA|SBS|SBI|SAS|SAP|RWE|RUN|RIP|RIO|RIL|REN|RED|QVC|PWC|PUB|PRU|PRO|PNC|PIN|PID|PHD|PET|PAY|OVH|OTT|ORG|OOO|ONL|ONG|ONE|OFF|OBI|NYC|NTT|NRW|NRA|NOW|NHK|NGO|NFL|NEW|NET|NEC|NBA|NAB|MTR|MTN|MSD|MOV|MOM|MOI|MOE|MMA|MLS|MLB|MIT|MIL|MEN|MED|MBA|MAP|MAN|LTD|LPL|LOL|LLP|LLC|LDS|LAW|LAT|KRD|KPN|KIM|KIA|KFH|JOY|JOT|JNJ|JMP|JLL|JIO|JCB|ITV|IST|INT|INK|ING|INC|IFM|ICU|ICE|IBM|HOW|HOT|HKT|HIV|HBO|GOV|GOT|GOP|GOO|GMX|GMO|GLE|GEA|GDN|GAY|GAP|GAL|FYI|FUN|FTR|FRL|FOX|FOO|FLY|FIT|FAN|EUS|ESQ|EDU|ECO|EAT|DVR|DTV|DOT|DOG|DNP|DIY|DHL|DEV|DDS|DAY|DAD|CSC|CRS|CPA|COM|CFD|CFA|CEO|CBS|CBN|CBA|CAT|CAR|CAM|CAL|CAB|BZH|BUY|BOX|BOT|BOO|BOM|BMW|BMS|BIZ|BIO|BID|BET|BCN|BCG|BBT|BBC|BAR|AXA|AWS|ART|APP|AOL|ANZ|AIG|AFL|AEG|ADS|ACO|ABC|ABB|AAA|ZW|ZM|ZA|YT|YE|WS|WF|VU|VN|VI|VG|VE|VC|VA|UZ|UY|US|UK|UG|UA|TZ|TW|TV|TT|TR|TO|TN|TM|TL|TK|TJ|TH|TG|TF|TD|TC|SZ|SY|SX|SV|SU|ST|SS|SR|SO|SN|SM|SL|SK|SJ|SI|SH|SG|SE|SD|SC|SB|SA|RW|RU|RS|RO|RE|QA|PY|PW|PT|PS|PR|PN|PM|PL|PK|PH|PG|PF|PE|PA|OM|NZ|NU|NR|NP|NO|NL|NI|NG|NF|NE|NC|NA|MZ|MY|MX|MW|MV|MU|MT|MS|MR|MQ|MP|MO|MN|MM|ML|MK|MH|MG|ME|MD|MC|MA|LY|LV|LU|LT|LS|LR|LK|LI|LC|LB|LA|KZ|KY|KW|KR|KP|KN|KM|KI|KH|KG|KE|JP|JO|JM|JE|IT|IS|IR|IQ|IO|IN|IM|IL|IE|ID|HU|HT|HR|HN|HM|HK|GY|GW|GU|GT|GS|GR|GQ|GP|GN|GM|GL|GI|GH|GG|GF|GE|GD|GB|GA|FR|FO|FM|FK|FJ|FI|EU|ET|ES|ER|EG|EE|EC|DZ|DO|DM|DK|DJ|DE|CZ|CY|CX|CW|CV|CU|CR|CO|CN|CM|CL|CK|CI|CH|CG|CF|CD|CC|CA|BZ|BY|BW|BV|BT|BS|BR|BO|BN|BM|BJ|BI|BH|BG|BF|BE|BD|BB|BA|AZ|AX|AW|AU|AT|AS|AR|AQ|AO|AM|AL|AI|AG|AF|AE|AD|AC|SJC|RNO|LAX";m.default=x}}),n1=re({"../node_modules/expensify-common/dist/Url.js":function(m){"use strict";var x=m&&m.__importDefault||function(p){return p&&p.__esModule?p:{default:p}};Object.defineProperty(m,"__esModule",{value:!0}),m.MARKDOWN_URL_REGEX=m.LOOSE_URL_WEBSITE_REGEX=m.LOOSE_URL_REGEX=m.URL_PROTOCOL_REGEX=m.URL_REGEX_WITH_REQUIRED_PROTOCOL=m.URL_REGEX=m.URL_FRAGMENT_REGEX=m.URL_PARAM_REGEX=m.URL_PATH_REGEX=m.URL_WEBSITE_REGEX=void 0;var D=x(V1()),S="([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])",C="((ht|f)tps?:\\/\\/)";m.URL_PROTOCOL_REGEX=C;var N=`${C}?((?:www\\.)?[a-z0-9](?=(?