--- license: other datasets: - Salesforce/dialogstudio - Open-Orca/OpenOrca - fka/awesome-chatgpt-prompts - roneneldan/TinyStories - Anthropic/hh-rlhf - tiiuae/falcon-refinedweb - ehartford/dolphin - databricks/databricks-dolly-15k - timdettmers/openassistant-guanaco - lmsys/chatbot_arena_conversations language: - en metrics: - accuracy - code_eval - charcut_mt - character - cer - brier_score - bleurt - bleu - bertscore library_name: keras pipeline_tag: feature-extraction --- # Model Card for Model ID # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/GoNativeWindowManager.java package co.median.android; import android.text.TextUtils; import java.util.LinkedHashMap; import java.util.Map; public class GoNativeWindowManager { private final LinkedHashMap windows; private ExcessWindowsClosedListener excessWindowsClosedListener; public GoNativeWindowManager() { windows = new LinkedHashMap<>(); } public void addNewWindow(String activityId, boolean isRoot) { this.windows.put(activityId, new ActivityWindow(activityId, isRoot)); } public void removeWindow(String activityId) { this.windows.remove(activityId); if (excessWindowsClosedListener != null && windows.size() <= 1) { excessWindowsClosedListener.onAllExcessWindowClosed(); } } public void setOnExcessWindowClosedListener(ExcessWindowsClosedListener listener) { this.excessWindowsClosedListener = listener; } public ActivityWindow getActivityWindowInfo(String activityId) { return windows.get(activityId); } public void setUrlLevel(String activityId, int urlLevel) { ActivityWindow window = windows.get(activityId); if (window != null) { window.setUrlLevels(urlLevel, window.parentUrlLevel); } } public int getUrlLevel(String activityId) { ActivityWindow window = windows.get(activityId); if (window != null) { return window.urlLevel; } return -1; } public void setParentUrlLevel(String activityId, int parentLevel) { ActivityWindow window = windows.get(activityId); if (window != null) { window.setUrlLevels(window.urlLevel, parentLevel); } } public int getParentUrlLevel(String activityId) { ActivityWindow window = windows.get(activityId); if (window != null) { return window.parentUrlLevel; } return -1; } public void setUrlLevels(String activityId, int urlLevel, int parentLevel) { ActivityWindow window = windows.get(activityId); if (window != null) { window.setUrlLevels(urlLevel, parentLevel); } } public boolean isRoot(String activityId) { ActivityWindow window = windows.get(activityId); if (window != null) { return window.isRoot; } return false; } public void setAsNewRoot(String activityId) { for (Map.Entry entry : windows.entrySet()) { ActivityWindow window = entry.getValue(); if (TextUtils.equals(activityId, entry.getKey())) { window.isRoot = true; } else { window.isRoot = false; } } } public void setIgnoreInterceptMaxWindows(String activityId, boolean ignore) { ActivityWindow window = windows.get(activityId); if (window != null) { window.ignoreInterceptMaxWindows = ignore; } } public boolean isIgnoreInterceptMaxWindows(String activityId) { ActivityWindow window = windows.get(activityId); if (window != null) { return window.ignoreInterceptMaxWindows; } return false; } public int getWindowCount() { return windows.size(); } // Returns ID of the next window after root as Excess window public String getExcessWindow() { for (Map.Entry entry : windows.entrySet()) { ActivityWindow window = entry.getValue(); if (window.isRoot) continue; return window.id; } return null; } public static class ActivityWindow { private final String id; private boolean isRoot; private int urlLevel; private int parentUrlLevel; private boolean ignoreInterceptMaxWindows; ActivityWindow(String id, boolean isRoot) { this.id = id; this.isRoot = isRoot; this.urlLevel = -1; this.parentUrlLevel = -1; } public void setUrlLevels(int urlLevel, int parentUrlLevel) { this.urlLevel = urlLevel; this.parentUrlLevel = parentUrlLevel; } @Override public String toString() { return "id=" + id + "\n" + "isRoot=" + isRoot + "\n" + "urlLevel=" + urlLevel + "\n" + "parentUrlLevel=" + parentUrlLevel; } } interface ExcessWindowsClosedListener { void onAllExcessWindowClosed(); } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/GoNativeWindowManager.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/LaunchActivity.java package co.median.android; public class LaunchActivity extends MainActivity{ } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/LaunchActivity.java # Start of /mnt/data/jocal3--U/jocal3--U/android/plugins.gradle import groovy.json.JsonSlurper import org.gradle.initialization.DefaultSettings import org.apache.tools.ant.taskdefs.condition.Os def generatedFileName = "PackageList.java" def generatedFilePackage = "co.median.android" def generatedFileContentsTemplate = """ package $generatedFilePackage; import android.app.Application; import android.content.Context; import android.content.res.Resources; import co.median.median_core.BridgeModule; import java.util.Arrays; import java.util.ArrayList; {{ packageImports }} public class PackageList { private Application application; public PackageList(Application application) { this.application = application; } private Resources getResources() { return this.getApplication().getResources(); } private Application getApplication() { return this.application; } private Context getApplicationContext() { return this.getApplication().getApplicationContext(); } public ArrayList getPackages() { return new ArrayList<>(Arrays.asList( {{ packageClassInstances }} )); } } """ class GoNativeModules { private Logger logger private ArrayList> modulesMetadata private packageName = "co.median.android" GoNativeModules(Logger logger) { this.logger = logger this.modulesMetadata = this.getModulesMetadata() } ArrayList> getModulesMetadata() { if (this.modulesMetadata != null) return this.modulesMetadata ArrayList> modulesMetadata = new ArrayList>() def finder = new FileNameFinder() def files = finder.getFileNames(System.getProperty("user.dir"), 'plugins/**/plugin-metadata.json') files.each { fileName -> def jsonFile = new File(fileName) def parsedJson = new JsonSlurper().parseText(jsonFile.text).plugin parsedJson["sourceDir"] = fileName.tokenize(File.separator)[-3..-2].join(File.separator) modulesMetadata.push(parsedJson) } return modulesMetadata } void addModuleProjects(DefaultSettings defaultSettings) { modulesMetadata.forEach { module -> String pluginName = module["pluginName"] String sourceDir = module["sourceDir"] this.logger.warn(sourceDir) defaultSettings.include(":${pluginName}") defaultSettings.project(":${pluginName}").projectDir = new File(defaultSettings.rootProject.projectDir, "./${sourceDir}") // Include local library required by the plugin String localLibrary = module["localLibrary"] if (localLibrary != null && !localLibrary.isEmpty()) { defaultSettings.include(":${localLibrary}") defaultSettings.project(":${localLibrary}").projectDir = new File(defaultSettings.rootProject.projectDir, "./${sourceDir}/${localLibrary}") } } } void addModuleDependencies(Project appProject) { modulesMetadata.forEach { module -> String pluginName = module["pluginName"] appProject.dependencies { implementation project(path: ":${pluginName}") } } } void generatePackagesFile(File outputDir, String generatedFileName, GString generatedFileContentsTemplate) { def packages = this.modulesMetadata String packageName = this.packageName String packageImports = "" String packageClassInstances = "" if (packages.size() > 0) { packageImports = "import ${packageName}.BuildConfig;\nimport ${packageName}.R;\n\n" packageImports = packageImports + packages.collect { "// ${it.name}\nimport ${it.packageName}.${it.classInstance};" }.join('\n') packageClassInstances = packages.collect { "new ${it.classInstance}()" }.join(",\n ") } String generatedFileContents = generatedFileContentsTemplate.toString() .replace("{{ packageImports }}", packageImports) .replace("{{ packageClassInstances }}", packageClassInstances) outputDir.mkdirs() final FileTreeBuilder treeBuilder = new FileTreeBuilder(outputDir) treeBuilder.file(generatedFileName).newWriter().withWriter { w -> w << generatedFileContents } } } def gonativeModules = new GoNativeModules(logger) ext.applyModulesSettingsGradle = { DefaultSettings defaultSettings -> gonativeModules.addModuleProjects(defaultSettings) } ext.applyNativeModulesAppBuildGradle = { Project project -> gonativeModules.addModuleDependencies(project) def generatedSrcDir = new File(buildDir, "generated/gncli/src/main/java") def generatedCodeDir = new File(generatedSrcDir, generatedFilePackage.replace('.', '/')) task generatePackageList { doLast { gonativeModules.generatePackagesFile(generatedCodeDir, generatedFileName, generatedFileContentsTemplate) } } preBuild.dependsOn generatePackageList android { sourceSets { main { java { srcDirs += generatedSrcDir } } } } } # End of /mnt/data/jocal3--U/jocal3--U/android/plugins.gradle # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/Installation.java package co.median.android; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.util.Log; import androidx.core.app.ActivityCompat; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import java.util.UUID; import co.median.median_core.AppConfig; import co.median.median_core.GNLog; /** * Created by weiyin on 8/8/14. */ public class Installation { private static final String TAG = Installation.class.getName(); private static String sID = null; private static final String INSTALLATION = "INSTALLATION"; public synchronized static String id(Context context) { if (sID == null) { File installation = new File(context.getFilesDir(), INSTALLATION); try { if (!installation.exists()) writeInstallationFile(installation); sID = readInstallationFile(installation); } catch (Exception e) { throw new RuntimeException(e); } } return sID; } public static Map getInfo(Context context) { HashMap info = new HashMap<>(); info.put("platform", "android"); String publicKey = AppConfig.getInstance(context).publicKey; if (publicKey == null) publicKey = ""; info.put("publicKey", publicKey); String packageName = context.getPackageName(); info.put("appId", packageName); PackageManager manager = context.getPackageManager(); try { PackageInfo packageInfo = manager.getPackageInfo(packageName, 0); info.put("appVersion", packageInfo.versionName); info.put("appVersionCode", packageInfo.versionCode); } catch (PackageManager.NameNotFoundException e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } String distribution; boolean isDebuggable = ( 0 != ( context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) ); if (isDebuggable) { distribution = "debug"; } else { String installer = manager.getInstallerPackageName(packageName); if (installer == null) { distribution = "adhoc"; } else if (installer.equals("com.android.vending") || installer.equals("com.google.market")) { distribution = "playstore"; } else if (installer.equals("com.amazon.venezia")) { distribution = "amazon"; } else { distribution = installer; } } info.put("distribution", distribution); info.put("language", Locale.getDefault().getLanguage()); info.put("os", "Android"); info.put("osVersion", Build.VERSION.RELEASE); info.put("model", Build.MANUFACTURER + " " + Build.MODEL); info.put("hardware", Build.FINGERPRINT); info.put("timeZone", TimeZone.getDefault().getID()); info.put("deviceName", getDeviceName()); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { SubscriptionManager subscriptionManager = SubscriptionManager.from(context); if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { List carriers = new ArrayList<>(); for (SubscriptionInfo subscriptionInfo : subscriptionManager.getActiveSubscriptionInfoList()) { carriers.add(subscriptionInfo.getCarrierName().toString()); } info.put("carrierNames", carriers); try { info.put("carrierName", carriers.get(0)); } catch ( IndexOutOfBoundsException e ) { Log.w(TAG, "getInfo: No carriers registered with subscription manager"); } } else { Log.w(TAG, "getInfo: Cannot get carrierNames, READ_PHONE_STATE not granted"); } } info.put("installationId", Installation.id(context)); return info; } private static String readInstallationFile(File installation) throws IOException { RandomAccessFile f = new RandomAccessFile(installation, "r"); byte[] bytes = new byte[(int) f.length()]; f.readFully(bytes); f.close(); return new String(bytes); } private static void writeInstallationFile(File installation) throws IOException { FileOutputStream out = new FileOutputStream(installation); String id = UUID.randomUUID().toString(); out.write(id.getBytes()); out.close(); } private static String getDeviceName() { String manufacturer = Build.MANUFACTURER; String model = Build.MODEL; String name; if (model.startsWith(manufacturer)) { name = model; } else { name = manufacturer + " " + model; } return name; } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/Installation.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/proguard-project.txt # To enable ProGuard in your project, edit project.properties # to define the proguard.config property as described in that file. # # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in ${sdk.dir}/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the ProGuard # include property in project.properties. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # webview interfaces -keepclassmembers class co.median.android.ProfilePicker$ProfileJsBridge { ; } -keepclassmembers class co.median.android.MainActivity$StatusCheckerBridge { ; } -keepattributes JavascriptInterface # stuff for google play services -keep class * extends java.util.ListResourceBundle { protected Object[][] getContents(); } -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { public static final *** NULL; } -keepnames @com.google.android.gms.common.annotation.KeepName class * -keepclassmembernames class * { @com.google.android.gms.common.annotation.KeepName *; } -keepnames class * implements android.os.Parcelable { public static final ** CREATOR; } # Google Cloud Messaging -keep class com.google.android.gms.** { *; } -keep interface com.google.android.gms.** { *; } # appcompat library -dontwarn android.support.v4.** -keep class android.support.v4.** { *; } -keep interface android.support.v4.** { *; } -dontwarn android.support.v7.** -keep class android.support.v7.** { *; } -keep interface android.support.v7.** { *; } # End of /mnt/data/jocal3--U/jocal3--U/android/app/proguard-project.txt # Start of /mnt/data/jocal3--U/jocal3--U/android/generate-header-images.sh #!/bin/sh BASEDIR=$(dirname $0) sips --resampleHeight 36 -s format png --out $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1 sips --resampleHeight 54 -s format png --out $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1 sips --resampleHeight 72 -s format png --out $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1 sips --resampleHeight 108 -s format png --out $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1 sips --resampleHeight 144 -s format png --out $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1 optipng $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png 2>&1 # dark theme icons DARK_ICON=$BASEDIR/HeaderImageDark if [[ -f "$DARK_ICON" ]]; then sips --resampleHeight 36 -s format png --out $BASEDIR/app/src/main/res/drawable-night-mdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1 sips --resampleHeight 54 -s format png --out $BASEDIR/app/src/main/res/drawable-night-hdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1 sips --resampleHeight 72 -s format png --out $BASEDIR/app/src/main/res/drawable-night-xhdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1 sips --resampleHeight 108 -s format png --out $BASEDIR/app/src/main/res/drawable-night-xxhdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1 sips --resampleHeight 144 -s format png --out $BASEDIR/app/src/main/res/drawable-night-xxxhdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1 optipng $BASEDIR/app/src/main/res/drawable-night-mdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-night-hdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-night-xhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-night-xxhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-night-xxxhdpi/ic_actionbar.png 2>&1 fi # End of /mnt/data/jocal3--U/jocal3--U/android/generate-header-images.sh # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/androidCustomJS.js # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/androidCustomJS.js # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AudioUtils.java package co.median.android; import android.content.Context; import android.media.AudioAttributes; import android.media.AudioFocusRequest; import android.media.AudioManager; import android.util.Log; public class AudioUtils { private static final String TAG = AudioUtils.class.getName(); private static AudioFocusRequest initialFocusRequest; private static AudioFocusRequest focusRequest; private static AudioManager.OnAudioFocusChangeListener initialAudioFocusChangeListener; private static AudioManager.OnAudioFocusChangeListener audioFocusChangeListener; /** * @param mode - Accepts int for speaker mode: * 0 - phone speaker (default) * 1 - headset / wired device * 2 - bluetooth */ public static void setUpAudioDevice(MainActivity mainActivity, int mode) { AudioManager mAudioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE); if (mode == 2) { // bluetooth device mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); mAudioManager.startBluetoothSco(); mAudioManager.setBluetoothScoOn(true); } else if (mode == 1) { // wired device mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); mAudioManager.stopBluetoothSco(); mAudioManager.setBluetoothScoOn(false); mAudioManager.setSpeakerphoneOn(false); } else { // phone speaker mAudioManager.setMode(AudioManager.MODE_NORMAL); mAudioManager.stopBluetoothSco(); mAudioManager.setBluetoothScoOn(false); mAudioManager.setSpeakerphoneOn(true); } } public static void reconnectToBluetooth(MainActivity mainActivity, AudioManager audioManager) { if (audioManager.isBluetoothScoAvailableOffCall() && !audioManager.isBluetoothScoOn()) { Log.d(TAG, "Resetting audio to bluetooth device"); setUpAudioDevice(mainActivity, 2); } } /** * Listen to the first AUDIOFOCUS_GAIN before taking the audio input/output priority through requestAudioFocus() * * @param mainActivity */ public static void initAudioFocusListener(MainActivity mainActivity) { int result; final Object focusLock = new Object(); AudioManager audioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE); if (audioManager == null) { Log.w(TAG, "AudioManager is null. Aborting initAudioFocusListener()"); } initialAudioFocusChangeListener = focusChange -> { if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { synchronized (focusLock) { Log.d(TAG, "AudioFocusListener GAINED. Try to request audio focus"); requestAudioFocus(mainActivity); abandonFocusRequest(mainActivity); } } }; if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { result = audioManager.requestAudioFocus(initialAudioFocusChangeListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); } else { AudioAttributes playbackAttributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) .build(); initialFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) .setAudioAttributes(playbackAttributes) .setAcceptsDelayedFocusGain(true) .setOnAudioFocusChangeListener(initialAudioFocusChangeListener) .build(); result = audioManager.requestAudioFocus(initialFocusRequest); } synchronized (focusLock) { if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { Log.d(TAG, "AudioFocusListener REQUEST GRANTED"); } } } /** * Prioritizes the bluetooth device if available. * Reconnects the bluetooth device when the audio focus is lost as a workaround for aborted connections * due to AudioRecord.AUDIO_INPUT_FLAG_FAST denial. * * @param mainActivity */ public static void requestAudioFocus(MainActivity mainActivity) { int result; final Object focusLock = new Object(); AudioManager audioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE); if (audioManager == null) { Log.w(TAG, "AudioManager is null. Aborting requestAudioFocus()"); } audioFocusChangeListener = focusChange -> { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: synchronized (focusLock) { Log.d(TAG, "AudioFocus GAINED. Try to connect bluetooth device"); reconnectToBluetooth(mainActivity, audioManager); } break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: case AudioManager.AUDIOFOCUS_LOSS: synchronized (focusLock) { Log.d(TAG, "AudioFocus LOST. Try to reconnect bluetooth device"); reconnectToBluetooth(mainActivity, audioManager); } break; } }; abandonFocusRequest(mainActivity); if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { result = audioManager.requestAudioFocus(audioFocusChangeListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); } else { AudioAttributes playbackAttributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) .build(); focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) .setAudioAttributes(playbackAttributes) .setAcceptsDelayedFocusGain(true) .setOnAudioFocusChangeListener(audioFocusChangeListener) .build(); result = audioManager.requestAudioFocus(focusRequest); } synchronized (focusLock) { if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { Log.d(TAG, "AudioFocus REQUEST GRANTED"); reconnectToBluetooth(mainActivity, audioManager); } } } public static void abandonFocusRequest(MainActivity mainActivity) { AudioManager audioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE); if (audioManager == null) { Log.w(TAG, "AudioManager is null. Aborting abandonFocusRequest()"); } if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { if (initialAudioFocusChangeListener != null) { audioManager.abandonAudioFocus(initialAudioFocusChangeListener); initialAudioFocusChangeListener = null; } if (audioFocusChangeListener != null) { audioManager.abandonAudioFocus(audioFocusChangeListener); audioFocusChangeListener = null; } } else { if (initialFocusRequest != null) { audioManager.abandonAudioFocusRequest(initialFocusRequest); initialFocusRequest = null; } if (focusRequest != null) { audioManager.abandonAudioFocusRequest(focusRequest); focusRequest = null; } } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AudioUtils.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsonMenuAdapter.java package co.median.android; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.StateListDrawable; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.json.JSONArray; import org.json.JSONObject; import io.gonative.android.icons.Icon; import co.median.median_core.AppConfig; import co.median.median_core.GNLog; /** * Created by weiyin on 4/14/14. */ public class JsonMenuAdapter extends BaseExpandableListAdapter implements ExpandableListView.OnGroupClickListener, ExpandableListView.OnChildClickListener { private static final String TAG = JsonMenuAdapter.class.getName(); private MainActivity mainActivity; private JSONArray menuItems; private boolean groupsHaveIcons = false; private boolean childrenHaveIcons = false; private String status; private int selectedIndex; private ExpandableListView expandableListView; private Integer highlightColor; private int sidebar_icon_size; private int sidebar_expand_indicator_size; JsonMenuAdapter(MainActivity activity, ExpandableListView expandableListView) { this.mainActivity = activity; sidebar_icon_size = mainActivity.getResources().getInteger(R.integer.sidebar_icon_size); sidebar_expand_indicator_size = mainActivity.getResources().getInteger(R.integer.sidebar_expand_indicator_size); this.expandableListView = expandableListView; menuItems = null; this.highlightColor = activity.getResources().getColor(R.color.sidebarHighlight); // broadcast messages BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() != null && intent.getAction().equals(AppConfig.PROCESSED_MENU_MESSAGE)) { update(); } } }; LocalBroadcastManager.getInstance(this.mainActivity) .registerReceiver(broadcastReceiver, new IntentFilter(AppConfig.PROCESSED_MENU_MESSAGE)); } private synchronized void update() { update(this.status); } public synchronized void update(String status) { if (status == null) status = "default"; this.status = status; menuItems = AppConfig.getInstance(mainActivity).menus.get(status); if (menuItems == null) menuItems = new JSONArray(); // figure out groupsHaveIcons and childrenHaveIcons (for layout alignment) groupsHaveIcons = false; childrenHaveIcons = false; for (int i = 0; i < menuItems.length(); i++) { JSONObject item = menuItems.optJSONObject(i); if (item == null) continue; if (!item.isNull("icon") && !item.optString("icon").isEmpty()) { groupsHaveIcons = true; } if (item.optBoolean("isGrouping", false)) { JSONArray sublinks = item.optJSONArray("subLinks"); if (sublinks != null) { for (int j = 0; j < sublinks.length(); j++) { JSONObject sublink = sublinks.optJSONObject(j); if (sublink != null && !sublink.isNull("icon") && !sublink.optString("icon").isEmpty()) { childrenHaveIcons = true; break; } } } } } notifyDataSetChanged(); } private String itemString(String s, int groupPosition) { String value = null; try { JSONObject section = (JSONObject) menuItems.get(groupPosition); if (!section.isNull(s)) value = section.getString(s).trim(); } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return value; } private String itemString(String s, int groupPosition, int childPosition) { String value = null; try { JSONObject section = (JSONObject) menuItems.get(groupPosition); JSONObject sublink = section.getJSONArray("subLinks").getJSONObject(childPosition); if (!sublink.isNull(s)) value = sublink.getString(s).trim(); } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return value; } private String getTitle(int groupPosition) { return itemString("label", groupPosition); } private String getTitle(int groupPosition, int childPosition) { return itemString("label", groupPosition, childPosition); } private Pair getUrlAndJavascript(int groupPosition) { String url = itemString("url", groupPosition); String js = itemString("javascript", groupPosition); return new Pair<>(url, js); } private Pair getUrlAndJavascript(int groupPosition, int childPosition) { String url = itemString("url", groupPosition, childPosition); String js = itemString("javascript", groupPosition, childPosition); return new Pair<>(url, js); } private boolean isGrouping(int groupPosition) { try { JSONObject section = (JSONObject) menuItems.get(groupPosition); return section.optBoolean("isGrouping", false); } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); return false; } } @Override public int getGroupCount() { return menuItems.length(); } @Override public int getChildrenCount(int groupPosition) { int count = 0; try { JSONObject section = (JSONObject) menuItems.get(groupPosition); if (section.optBoolean("isGrouping", false)) { count = section.getJSONArray("subLinks").length(); } else { count = 0; } } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return count; } @Override public Object getGroup(int i) { return null; } @Override public Object getChild(int i, int i2) { return null; } @Override public long getGroupId(int i) { return 0; } @Override public long getChildId(int i, int i2) { return 0; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = mainActivity.getLayoutInflater(); convertView = inflater.inflate(groupsHaveIcons ? R.layout.menu_group_icon : R.layout.menu_group_noicon, null); TextView title = convertView.findViewById(R.id.menu_item_title); title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); } RelativeLayout menuItem = convertView.findViewById(R.id.menu_item); GradientDrawable shape = getHighlightDrawable(); StateListDrawable stateListDrawable = new StateListDrawable(); stateListDrawable.addState(new int[]{android.R.attr.state_activated}, shape); stateListDrawable.addState(new int[]{android.R.attr.state_selected}, shape); menuItem.setBackground(stateListDrawable); // expand/collapse indicator ImageView indicator = convertView.findViewById(R.id.menu_group_indicator); if (isGrouping(groupPosition)) { String iconName; int color = Color.BLACK; if (isExpanded) { iconName = "fas fa-angle-up"; } else { iconName = "fas fa-angle-down"; } if (groupPosition == this.selectedIndex) { color = this.highlightColor; } else { color = mainActivity.getResources().getColor(R.color.sidebarForeground); } indicator.setImageDrawable(new Icon(mainActivity, iconName, sidebar_expand_indicator_size, color).getDrawable()); indicator.setVisibility(View.VISIBLE); } else { indicator.setVisibility(View.GONE); } //set the title TextView title = convertView.findViewById(R.id.menu_item_title); title.setText(getTitle(groupPosition)); if (this.selectedIndex == groupPosition) { title.setTextColor(this.highlightColor); } else { title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); } // set icon String icon = itemString("icon", groupPosition); ImageView imageView = convertView.findViewById(R.id.menu_item_icon); if (icon != null && !icon.isEmpty()) { int color; if (groupPosition == this.selectedIndex) { color = this.highlightColor; } else { color = mainActivity.getResources().getColor(R.color.sidebarForeground); } Drawable iconDrawable = new Icon(mainActivity, icon, sidebar_icon_size, color).getDrawable(); imageView.setImageDrawable(iconDrawable); imageView.setVisibility(View.VISIBLE); } else if (imageView != null) { imageView.setVisibility(View.INVISIBLE); } return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = mainActivity.getLayoutInflater(); if (groupsHaveIcons || childrenHaveIcons) convertView = inflater.inflate(R.layout.menu_child_icon, parent, false); else convertView = inflater.inflate(R.layout.menu_child_noicon, parent, false); // style it TextView title = convertView.findViewById(R.id.menu_item_title); title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); } RelativeLayout menuItem = convertView.findViewById(R.id.menu_item); GradientDrawable shape = getHighlightDrawable(); StateListDrawable stateListDrawable = new StateListDrawable(); stateListDrawable.addState(new int[]{android.R.attr.state_activated}, shape); stateListDrawable.addState(new int[]{android.R.attr.state_selected}, shape); menuItem.setBackground(stateListDrawable); // set title TextView title = convertView.findViewById(R.id.menu_item_title); title.setText(getTitle(groupPosition, childPosition)); if (this.selectedIndex == (groupPosition + childPosition) + 1) { title.setTextColor(this.highlightColor); } else { title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); } // set icon String icon = itemString("icon", groupPosition, childPosition); ImageView imageView = convertView.findViewById(R.id.menu_item_icon); if (icon != null && !icon.isEmpty()) { int color; if (this.selectedIndex == (groupPosition + childPosition) + 1) { color = this.highlightColor; } else { color = mainActivity.getResources().getColor(R.color.sidebarForeground); } Drawable iconDrawable = new Icon(mainActivity, icon, sidebar_icon_size, color).getDrawable(); imageView.setImageDrawable(iconDrawable); imageView.setVisibility(View.VISIBLE); } else if (imageView != null) { imageView.setVisibility(View.INVISIBLE); } return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { try { if (isGrouping(groupPosition)) { // return false for default handling behavior return false; } else { Pair urlAndJavascript = getUrlAndJavascript(groupPosition); loadUrlAndJavascript(urlAndJavascript.first, urlAndJavascript.second); return true; // tell android that we have handled it } } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return false; } @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { int index = parent.getFlatListPosition(ExpandableListView.getPackedPositionForChild(groupPosition, childPosition)); parent.setItemChecked(index, true); this.selectedIndex = index; Pair urlAndJavascript = getUrlAndJavascript(groupPosition, childPosition); loadUrlAndJavascript(urlAndJavascript.first, urlAndJavascript.second); return true; } private void loadUrlAndJavascript(String url, String javascript) { // check for GONATIVE_USERID if (UrlInspector.getInstance().getUserId() != null) { url = url.replaceAll("GONATIVE_USERID", UrlInspector.getInstance().getUserId()); } if (javascript == null) mainActivity.loadUrl(url); else mainActivity.loadUrlAndJavascript(url, javascript); mainActivity.closeDrawers(); } public void autoSelectItem(String url) { String formattedUrl = url.replaceAll("/$", ""); if (menuItems == null) return; for (int i = 0; i < menuItems.length(); i++) { if (formattedUrl.equals(menuItems.optJSONObject(i).optString("url").replaceAll("/$", ""))) { expandableListView.setItemChecked(i, true); selectedIndex = i; return; } } } private GradientDrawable getHighlightDrawable() { GradientDrawable shape = new GradientDrawable(); shape.setCornerRadius(10); shape.setColor(this.highlightColor); shape.setAlpha(30); return shape; } @Override public int getChildType(int groupPosition, int childPosition) { if (groupsHaveIcons || childrenHaveIcons) return 0; else return 1; } @Override public int getChildTypeCount() { return 2; } @Override public int getGroupType(int groupPosition) { if (groupsHaveIcons) return 0; else return 1; } @Override public int getGroupTypeCount() { return 2; } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsonMenuAdapter.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/assets/HelperClass.java package io.median.android; public class HelperClass { public volatile static int newLoad = 0; } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/assets/HelperClass.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/IOUtils.java package co.median.android; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import co.median.median_core.GNLog; public class IOUtils { private static final String TAG = IOUtils.class.getName(); public static void copy(InputStream in, OutputStream out) throws IOException{ byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } public static void close(Closeable c) { if (c == null) return; try { c.close(); } catch (IOException e){ GNLog.getInstance().logError(TAG, e.toString(), e); } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/IOUtils.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/AndroidManifest.xml # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/AndroidManifest.xml # Start of /mnt/data/jocal3--U/jocal3--U/android/generate-app-icons.sh #!/bin/sh BASEDIR=$(dirname $0) sips -z 1024 1024 -s format png --out $BASEDIR/AppIconTemp.png $BASEDIR/AppIcon 2>&1 # create icon surrounded by transparent border (AppIconBordered). Make border slightly less than 256 so background does not bleed through convert $BASEDIR/AppIconTemp.png -bordercolor transparent -border 250 $BASEDIR/AppIconBordered.png # create rounded rectangle icon (AppIconRound) convert -size 1024x1024 xc:none -draw "roundrectangle 0,0,1024,1024,80,80" $BASEDIR/mask.png 2>&1 convert $BASEDIR/AppIconTemp.png -matte $BASEDIR/mask.png -compose DstIn -composite $BASEDIR/AppIconRound.png 2>&1 rm -f $BASEDIR/AppIconTemp.png rm -f $BASEDIR/mask.png sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-mdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-hdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1 sips -z 108 108 -s format png --out $BASEDIR/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1 sips -z 162 162 -s format png --out $BASEDIR/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1 sips -z 216 216 -s format png --out $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1 sips -z 324 324 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1 sips -z 432 432 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-mdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-hdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png 2>&1 # sidebar logo SIDEBAR_LOGO=$BASEDIR/SidebarLogo if [[ -f "SIDEBAR_LOGO" ]]; then sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-mdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-hdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 else sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-mdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-hdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 fi optipng $BASEDIR/app/src/main/res/mipmap-mdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-hdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_sidebar_logo.png 2>&1 SIDEBAR_LOG_DARK=$BASEDIR/SideBarLogoDark if [[ -f "SIDEBAR_LOG_DARK" ]]; then sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-mdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-hdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xhdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xxhdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xxxhdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 else sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-mdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-hdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xxhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xxxhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 fi optipng $BASEDIR/app/src/main/res/mipmap-night-mdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-night-hdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-night-xhdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-night-xxhdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-night-xxxhdpi/ic_sidebar_logo.png 2>&1 sips -z 36 36 -s format png --out $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1 sips -z 54 54 -s format png --out $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1 sips -z 108 108 -s format png --out $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png 2>&1 rm -rf $BASEDIR/AppIconRound.png rm -rf $BASEDIR/AppIconBordered.png # notification icon sips -z 24 24 -s format png --out $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1 sips -z 36 36 -s format png --out $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1 sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1 optipng $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png 2>&1 # End of /mnt/data/jocal3--U/jocal3--U/android/generate-app-icons.sh # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/androidCustomCSS.css @font-face { font-family: "inter"; font-weight: 100 900; font-display: swap; font-style: normal; src: url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter.var-9563063c6f09165dc06c.woff2) format("woff2-variations"), url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter.var-9563063c6f09165dc06c.woff2) format("woff2"); src: url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter.var-9563063c6f09165dc06c.woff2) format("woff2") tech("variations"); } @font-face { font-family: "inter"; font-weight: 100 900; font-display: swap; font-style: italic; src: url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter-italic.var-96d5fbbc1c71a94ee26a.woff2) format("woff2-variations"), url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter-italic.var-96d5fbbc1c71a94ee26a.woff2) format("woff2"); src: url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter-italic.var-96d5fbbc1c71a94ee26a.woff2) format("woff2") tech("variations"); } @font-face { font-family: "jetbrains-mono"; src: url(https://cdn.moderntreasury.com/packs/static/fonts/jetbrains-mono/jetbrains-mono-regular-2b19db54c7d249f725e4.woff2) format("woff2"); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: "jetbrains-mono"; src: url(https://cdn.moderntreasury.com/packs/static/fonts/jetbrains-mono/jetbrains-mono-semibold-fbbf6d4051f550ea9689.woff2) format("woff2"); font-weight: 600; font-style: normal; font-display: swap; } /* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ /* stylelint-disable no-duplicate-selectors */ /* stylelint-disable */ /* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ .ant-select-auto-complete { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; } .ant-select-auto-complete .ant-select-clear { right: 13px; } /* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ /* stylelint-disable no-duplicate-selectors */ /* stylelint-disable */ /* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ .ant-select-single .ant-select-selector { display: flex; } .ant-select-single .ant-select-selector .ant-select-selection-search { position: absolute; top: 0; right: 11px; bottom: 0; left: 11px; } .ant-select-single .ant-select-selector .ant-select-selection-search-input { width: 100%; } .ant-select-single .ant-select-selector .ant-select-selection-item, .ant-select-single .ant-select-selector .ant-select-selection-placeholder { padding: 0; line-height: 30px; transition: all 0.3s, visibility 0s; } .ant-select-single .ant-select-selector .ant-select-selection-item { position: relative; -webkit-user-select: none; user-select: none; } .ant-select-single .ant-select-selector .ant-select-selection-placeholder { transition: none; pointer-events: none; } .ant-select-single .ant-select-selector::after, .ant-select-single .ant-select-selector .ant-select-selection-item::after, .ant-select-single .ant-select-selector .ant-select-selection-placeholder::after { display: inline-block; width: 0; visibility: hidden; content: "\a0"; } .ant-select-single.ant-select-show-arrow .ant-select-selection-search { right: 25px; } .ant-select-single.ant-select-show-arrow .ant-select-selection-item, .ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder { padding-right: 18px; } .ant-select-single.ant-select-open .ant-select-selection-item { color: #bfbfbf; } .ant-select-single:not(.ant-select-customize-input) .ant-select-selector { width: 100%; height: 32px; padding: 0 11px; } .ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input { height: 30px; } .ant-select-single:not(.ant-select-customize-input) .ant-select-selector::after { line-height: 30px; } .ant-select-single.ant-select-customize-input .ant-select-selector::after { display: none; } .ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-search { position: static; width: 100%; } .ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder { position: absolute; right: 0; left: 0; padding: 0 11px; } .ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder::after { display: none; } .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector { height: 40px; } .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector::after, .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item, .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder { line-height: 38px; } .ant-select-single.ant-select-lg:not(.ant-select-customize-input):not( .ant-select-customize-input ) .ant-select-selection-search-input { height: 38px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector { height: 24px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector::after, .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item, .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder { line-height: 22px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input):not( .ant-select-customize-input ) .ant-select-selection-search-input { height: 22px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selection-search { right: 7px; left: 7px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector { padding: 0 7px; } .ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-search { right: 28px; } .ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-item, .ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-placeholder { padding-right: 21px; } .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector { padding: 0 11px; } /** * Do not merge `height` & `line-height` under style with `selection` & `search`, * since chrome may update to redesign with its align logic. */ .ant-select-selection-overflow { position: relative; display: flex; flex: auto; flex-wrap: wrap; max-width: 100%; } .ant-select-selection-overflow-item { flex: none; align-self: center; max-width: 100%; } .ant-select-multiple .ant-select-selector { display: flex; flex-wrap: wrap; align-items: center; padding: 1px 4px; } .ant-select-show-search.ant-select-multiple .ant-select-selector { cursor: text; } .ant-select-disabled.ant-select-multiple .ant-select-selector { background: #f5f5f5; cursor: not-allowed; } .ant-select-multiple .ant-select-selector::after { display: inline-block; width: 0; margin: 2px 0; line-height: 24px; visibility: hidden; content: "\a0"; } .ant-select-multiple.ant-select-show-arrow .ant-select-selector, .ant-select-multiple.ant-select-allow-clear .ant-select-selector { padding-right: 24px; } .ant-select-multiple .ant-select-selection-item { position: relative; display: flex; flex: none; box-sizing: border-box; max-width: 100%; height: 24px; margin-top: 2px; margin-bottom: 2px; line-height: 22px; background: #f5f5f5; border: 1px solid #f0f0f0; border-radius: 2px; cursor: default; transition: font-size 0.3s, line-height 0.3s, height 0.3s; -webkit-user-select: none; user-select: none; margin-inline-end: 4px; padding-inline-start: 8px; padding-inline-end: 4px; } .ant-select-disabled.ant-select-multiple .ant-select-selection-item { color: #bfbfbf; border-color: #d9d9d9; cursor: not-allowed; } .ant-select-multiple .ant-select-selection-item-content { display: inline-block; margin-right: 4px; overflow: hidden; white-space: pre; text-overflow: ellipsis; } .ant-select-multiple .ant-select-selection-item-remove { color: inherit; font-style: normal; line-height: 0; text-align: center; text-transform: none; vertical-align: -0.125em; text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; display: inline-flex; align-items: center; color: rgba(0, 0, 0, 0.45); font-weight: bold; font-size: 10px; line-height: inherit; cursor: pointer; } .ant-select-multiple .ant-select-selection-item-remove > * { line-height: 1; } .ant-select-multiple .ant-select-selection-item-remove svg { display: inline-block; } .ant-select-multiple .ant-select-selection-item-remove::before { display: none; } .ant-select-multiple .ant-select-selection-item-remove .ant-select-multiple .ant-select-selection-item-remove-icon { display: block; } .ant-select-multiple .ant-select-selection-item-remove > .anticon { vertical-align: middle; } .ant-select-multiple .ant-select-selection-item-remove:hover { color: rgba(0, 0, 0, 0.75); } .ant-select-multiple .ant-select-selection-overflow-item + .ant-select-selection-overflow-item .ant-select-selection-search { margin-inline-start: 0; } .ant-select-multiple .ant-select-selection-search { position: relative; max-width: 100%; margin-inline-start: 7px; } .ant-select-multiple .ant-select-selection-search-input, .ant-select-multiple .ant-select-selection-search-mirror { height: 24px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; line-height: 24px; transition: all 0.3s; } .ant-select-multiple .ant-select-selection-search-input { width: 100%; min-width: 4.1px; } .ant-select-multiple .ant-select-selection-search-mirror { position: absolute; top: 0; left: 0; z-index: 999; white-space: pre; visibility: hidden; } .ant-select-multiple .ant-select-selection-placeholder { position: absolute; top: 50%; right: 11px; left: 11px; transform: translateY(-50%); transition: all 0.3s; } .ant-select-multiple.ant-select-lg .ant-select-selector::after { line-height: 32px; } .ant-select-multiple.ant-select-lg .ant-select-selection-item { height: 32px; line-height: 30px; } .ant-select-multiple.ant-select-lg .ant-select-selection-search { height: 32px; line-height: 32px; } .ant-select-multiple.ant-select-lg .ant-select-selection-search-input, .ant-select-multiple.ant-select-lg .ant-select-selection-search-mirror { height: 32px; line-height: 30px; } .ant-select-multiple.ant-select-sm .ant-select-selector::after { line-height: 16px; } .ant-select-multiple.ant-select-sm .ant-select-selection-item { height: 16px; line-height: 14px; } .ant-select-multiple.ant-select-sm .ant-select-selection-search { height: 16px; line-height: 16px; } .ant-select-multiple.ant-select-sm .ant-select-selection-search-input, .ant-select-multiple.ant-select-sm .ant-select-selection-search-mirror { height: 16px; line-height: 14px; } .ant-select-multiple.ant-select-sm .ant-select-selection-placeholder { left: 7px; } .ant-select-multiple.ant-select-sm .ant-select-selection-search { margin-inline-start: 3px; } .ant-select-disabled .ant-select-selection-item-remove { display: none; } .ant-select-status-error.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer) .ant-select-selector { background-color: #fff; border-color: #ff4d4f !important; } .ant-select-status-error.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector, .ant-select-status-error.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector { border-color: #ff7875; box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); border-right-width: 1px; outline: 0; } .ant-select-status-warning.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer) .ant-select-selector { background-color: #fff; border-color: #faad14 !important; } .ant-select-status-warning.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector, .ant-select-status-warning.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector { border-color: #ffc53d; box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); border-right-width: 1px; outline: 0; } .ant-select-status-error.ant-select-has-feedback .ant-select-clear, .ant-select-status-warning.ant-select-has-feedback .ant-select-clear, .ant-select-status-success.ant-select-has-feedback .ant-select-clear, .ant-select-status-validating.ant-select-has-feedback .ant-select-clear { right: 32px; } .ant-select-status-error.ant-select-has-feedback .ant-select-selection-selected-value, .ant-select-status-warning.ant-select-has-feedback .ant-select-selection-selected-value, .ant-select-status-success.ant-select-has-feedback .ant-select-selection-selected-value, .ant-select-status-validating.ant-select-has-feedback .ant-select-selection-selected-value { padding-right: 42px; } /* Reset search input style */ .ant-select { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; position: relative; display: inline-block; cursor: pointer; } .ant-select:not(.ant-select-customize-input) .ant-select-selector { position: relative; background-color: #fff; border: 1px solid #d9d9d9; border-radius: 2px; transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); } .ant-select:not(.ant-select-customize-input) .ant-select-selector input { cursor: pointer; } .ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector { cursor: text; } .ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector input { cursor: auto; } .ant-select-focused:not(.ant-select-disabled).ant-select:not( .ant-select-customize-input ) .ant-select-selector { border-color: #40a9ff; box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); border-right-width: 1px; outline: 0; } .ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector { color: rgba(0, 0, 0, 0.25); background: #f5f5f5; cursor: not-allowed; } .ant-select-multiple.ant-select-disabled.ant-select:not( .ant-select-customize-input ) .ant-select-selector { background: #f5f5f5; } .ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector input { cursor: not-allowed; } .ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input { margin: 0; padding: 0; background: transparent; border: none; outline: none; -webkit-appearance: none; appearance: none; } .ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input::-webkit-search-cancel-button { display: none; /* stylelint-disable-next-line property-no-vendor-prefix */ -webkit-appearance: none; } .ant-select:not(.ant-select-disabled):hover .ant-select-selector { border-color: #40a9ff; border-right-width: 1px; } .ant-select-selection-item { flex: 1 1; overflow: hidden; font-weight: normal; white-space: nowrap; text-overflow: ellipsis; } @media all and (-ms-high-contrast: none) { .ant-select-selection-item *::-ms-backdrop, .ant-select-selection-item { flex: auto; } } .ant-select-selection-placeholder { flex: 1 1; overflow: hidden; color: #bfbfbf; white-space: nowrap; text-overflow: ellipsis; pointer-events: none; } @media all and (-ms-high-contrast: none) { .ant-select-selection-placeholder *::-ms-backdrop, .ant-select-selection-placeholder { flex: auto; } } .ant-select-arrow { display: inline-flex; color: inherit; font-style: normal; text-transform: none; vertical-align: -0.125em; text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; position: absolute; top: 50%; right: 11px; display: flex; align-items: center; height: 12px; margin-top: -6px; color: rgba(0, 0, 0, 0.25); font-size: 12px; line-height: 1; text-align: center; pointer-events: none; } .ant-select-arrow > * { line-height: 1; } .ant-select-arrow svg { display: inline-block; } .ant-select-arrow::before { display: none; } .ant-select-arrow .ant-select-arrow-icon { display: block; } .ant-select-arrow .anticon { vertical-align: top; transition: transform 0.3s; } .ant-select-arrow .anticon > svg { vertical-align: top; } .ant-select-arrow .anticon:not(.ant-select-suffix) { pointer-events: auto; } .ant-select-disabled .ant-select-arrow { cursor: not-allowed; } .ant-select-arrow > *:not(:last-child) { margin-inline-end: 8px; } .ant-select-clear { position: absolute; top: 50%; right: 11px; z-index: 1; display: inline-block; width: 12px; height: 12px; margin-top: -6px; color: rgba(0, 0, 0, 0.25); font-size: 12px; font-style: normal; line-height: 1; text-align: center; text-transform: none; background: #fff; cursor: pointer; opacity: 0; transition: color 0.3s ease, opacity 0.15s ease; text-rendering: auto; } .ant-select-clear::before { display: block; } .ant-select-clear:hover { color: rgba(0, 0, 0, 0.45); } .ant-select:hover .ant-select-clear { opacity: 1; } .ant-select-dropdown { margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum", ; position: absolute; top: -9999px; left: -9999px; z-index: 1050; box-sizing: border-box; padding: 4px 0; overflow: hidden; font-size: 14px; font-variant: initial; background-color: #fff; border-radius: 2px; outline: none; box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); } .ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-bottomLeft, .ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-bottomLeft { animation-name: antSlideUpIn; } .ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-topLeft, .ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-topLeft { animation-name: antSlideDownIn; } .ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-bottomLeft { animation-name: antSlideUpOut; } .ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-topLeft { animation-name: antSlideDownOut; } .ant-select-dropdown-hidden { display: none; } .ant-select-dropdown-empty { color: rgba(0, 0, 0, 0.25); } .ant-select-item-empty { position: relative; display: block; min-height: 32px; padding: 5px 12px; color: rgba(0, 0, 0, 0.85); font-weight: normal; font-size: 14px; line-height: 22px; color: rgba(0, 0, 0, 0.25); } .ant-select-item { position: relative; display: block; min-height: 32px; padding: 5px 12px; color: rgba(0, 0, 0, 0.85); font-weight: normal; font-size: 14px; line-height: 22px; cursor: pointer; transition: background 0.3s ease; } .ant-select-item-group { color: rgba(0, 0, 0, 0.45); font-size: 12px; cursor: default; } .ant-select-item-option { display: flex; } .ant-select-item-option-content { flex: auto; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .ant-select-item-option-state { flex: none; } .ant-select-item-option-active:not(.ant-select-item-option-disabled) { background-color: #f5f5f5; } .ant-select-item-option-selected:not(.ant-select-item-option-disabled) { color: rgba(0, 0, 0, 0.85); font-weight: 600; background-color: #e6f7ff; } .ant-select-item-option-selected:not(.ant-select-item-option-disabled) .ant-select-item-option-state { color: #1890ff; } .ant-select-item-option-disabled { color: rgba(0, 0, 0, 0.25); cursor: not-allowed; } .ant-select-item-option-disabled.ant-select-item-option-selected { background-color: #f5f5f5; } .ant-select-item-option-grouped { padding-left: 24px; } .ant-select-lg { font-size: 16px; } .ant-select-borderless .ant-select-selector { background-color: transparent !important; border-color: transparent !important; box-shadow: none !important; } .ant-select.ant-select-in-form-item { width: 100%; } .ant-select-compact-item:not(.ant-select-compact-last-item) { margin-right: -1px; } .ant-select-compact-item:not( .ant-select-compact-last-item ).ant-select-compact-item-rtl { margin-right: 0; margin-left: -1px; } .ant-select-compact-item:hover > *, .ant-select-compact-item:focus > *, .ant-select-compact-item:active > * { z-index: 2; } .ant-select-compact-item.ant-select-focused > * { z-index: 2; } .ant-select-compact-item[disabled] > * { z-index: 0; } .ant-select-compact-item:not(.ant-select-compact-first-item):not( .ant-select-compact-last-item ).ant-select > .ant-select-selector { border-radius: 0; } .ant-select-compact-item.ant-select-compact-first-item.ant-select:not( .ant-select-compact-last-item ):not(.ant-select-compact-item-rtl) > .ant-select-selector { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ant-select-compact-item.ant-select-compact-last-item.ant-select:not( .ant-select-compact-first-item ):not(.ant-select-compact-item-rtl) > .ant-select-selector { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ant-select-compact-item.ant-select.ant-select-compact-first-item.ant-select-compact-item-rtl:not( .ant-select-compact-last-item ) > .ant-select-selector { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ant-select-compact-item.ant-select.ant-select-compact-last-item.ant-select-compact-item-rtl:not( .ant-select-compact-first-item ) > .ant-select-selector { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ant-select-rtl { direction: rtl; } .ant-select-rtl .ant-select-arrow { right: initial; left: 11px; } .ant-select-rtl .ant-select-clear { right: initial; left: 11px; } .ant-select-dropdown-rtl { direction: rtl; } .ant-select-dropdown-rtl .ant-select-item-option-grouped { padding-right: 24px; padding-left: 12px; } .ant-select-rtl.ant-select-multiple.ant-select-show-arrow .ant-select-selector, .ant-select-rtl.ant-select-multiple.ant-select-allow-clear .ant-select-selector { padding-right: 4px; padding-left: 24px; } .ant-select-rtl.ant-select-multiple .ant-select-selection-item { text-align: right; } .ant-select-rtl.ant-select-multiple .ant-select-selection-item-content { margin-right: 0; margin-left: 4px; text-align: right; } .ant-select-rtl.ant-select-multiple .ant-select-selection-search-mirror { right: 0; left: auto; } .ant-select-rtl.ant-select-multiple .ant-select-selection-placeholder { right: 11px; left: auto; } .ant-select-rtl.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder { right: 7px; } .ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-item, .ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-placeholder { right: 0; left: 9px; text-align: right; } .ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-search { right: 11px; left: 25px; } .ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-item, .ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder { padding-right: 0; padding-left: 18px; } .ant-select-rtl.ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-search { right: 6px; } .ant-select-rtl.ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-item, .ant-select-rtl.ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-placeholder { padding-right: 0; padding-left: 21px; } /* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ /* stylelint-disable no-duplicate-selectors */ /* stylelint-disable */ /* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ @keyframes ant-tree-node-fx-do-not-use { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes antCheckboxEffect { 0% { transform: scale(1); opacity: 0.5; } 100% { transform: scale(1.6); opacity: 0; } } .ant-select-tree-checkbox { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; list-style: none; font-feature-settings: "tnum"; position: relative; top: 0.2em; line-height: 1; white-space: nowrap; outline: none; cursor: pointer; } .ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner, .ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner, .ant-select-tree-checkbox-input:focus + .ant-select-tree-checkbox-inner { border-color: #1890ff; } .ant-select-tree-checkbox-checked::after { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 1px solid #1890ff; border-radius: 2px; visibility: hidden; animation: antCheckboxEffect 0.36s ease-in-out; animation-fill-mode: backwards; content: ""; } .ant-select-tree-checkbox:hover::after, .ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox::after { visibility: visible; } .ant-select-tree-checkbox-inner { position: relative; top: 0; left: 0; display: block; width: 16px; height: 16px; direction: ltr; background-color: #fff; border: 1px solid #d9d9d9; border-radius: 2px; border-collapse: separate; transition: all 0.3s; } .ant-select-tree-checkbox-inner::after { position: absolute; top: 50%; left: 21.5%; display: table; width: 5.71428571px; height: 9.14285714px; border: 2px solid #fff; border-top: 0; border-left: 0; transform: rotate(45deg) scale(0) translate(-50%, -50%); opacity: 0; transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; content: " "; } .ant-select-tree-checkbox-input { position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1; width: 100%; height: 100%; cursor: pointer; opacity: 0; } .ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after { position: absolute; display: table; border: 2px solid #fff; border-top: 0; border-left: 0; transform: rotate(45deg) scale(1) translate(-50%, -50%); opacity: 1; transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; content: " "; } .ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner { background-color: #1890ff; border-color: #1890ff; } .ant-select-tree-checkbox-disabled { cursor: not-allowed; } .ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after { border-color: rgba(0, 0, 0, 0.25); animation-name: none; } .ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input { cursor: not-allowed; pointer-events: none; } .ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner { background-color: #f5f5f5; border-color: #d9d9d9 !important; } .ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after { border-color: #f5f5f5; border-collapse: separate; animation-name: none; } .ant-select-tree-checkbox-disabled + span { color: rgba(0, 0, 0, 0.25); cursor: not-allowed; } .ant-select-tree-checkbox-disabled:hover::after, .ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-disabled::after { visibility: hidden; } .ant-select-tree-checkbox-wrapper { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; display: inline-flex; align-items: baseline; line-height: unset; cursor: pointer; } .ant-select-tree-checkbox-wrapper::after { display: inline-block; width: 0; overflow: hidden; content: "\a0"; } .ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-disabled { cursor: not-allowed; } .ant-select-tree-checkbox-wrapper + .ant-select-tree-checkbox-wrapper { margin-left: 8px; } .ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-in-form-item input[type="checkbox"] { width: 14px; height: 14px; } .ant-select-tree-checkbox + span { padding-right: 8px; padding-left: 8px; } .ant-select-tree-checkbox-group { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; display: inline-block; } .ant-select-tree-checkbox-group-item { margin-right: 8px; } .ant-select-tree-checkbox-group-item:last-child { margin-right: 0; } .ant-select-tree-checkbox-group-item + .ant-select-tree-checkbox-group-item { margin-left: 0; } .ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner { background-color: #fff; border-color: #d9d9d9; } .ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner::after { top: 50%; left: 50%; width: 8px; height: 8px; background-color: #1890ff; border: 0; transform: translate(-50%, -50%) scale(1); opacity: 1; content: " "; } .ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after { background-color: rgba(0, 0, 0, 0.25); border-color: rgba(0, 0, 0, 0.25); } .ant-tree-select-dropdown { padding: 8px 4px; } .ant-tree-select-dropdown-rtl { direction: rtl; } .ant-tree-select-dropdown .ant-select-tree { border-radius: 0; } .ant-tree-select-dropdown .ant-select-tree-list-holder-inner { align-items: stretch; } .ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode .ant-select-tree-node-content-wrapper { flex: auto; } .ant-select-tree { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; background: #fff; border-radius: 2px; transition: background-color 0.3s; } .ant-select-tree-focused:not(:hover):not(.ant-select-tree-active-focused) { background: #e6f7ff; } .ant-select-tree-list-holder-inner { align-items: flex-start; } .ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner { align-items: stretch; } .ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-node-content-wrapper { flex: auto; } .ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging { position: relative; } .ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging::after { position: absolute; top: 0; right: 0; bottom: 4px; left: 0; border: 1px solid #1890ff; opacity: 0; animation: ant-tree-node-fx-do-not-use 0.3s; animation-play-state: running; animation-fill-mode: forwards; content: ""; pointer-events: none; } .ant-select-tree .ant-select-tree-treenode { display: flex; align-items: flex-start; padding: 0 0 4px 0; outline: none; } .ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper { color: rgba(0, 0, 0, 0.25); cursor: not-allowed; } .ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper:hover { background: transparent; } .ant-select-tree .ant-select-tree-treenode-active .ant-select-tree-node-content-wrapper { background: #f5f5f5; } .ant-select-tree .ant-select-tree-treenode:not( .ant-select-tree .ant-select-tree-treenode-disabled ).filter-node .ant-select-tree-title { color: inherit; font-weight: 500; } .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon { width: 24px; line-height: 24px; text-align: center; visibility: visible; opacity: 0.2; transition: opacity 0.3s; } .ant-select-tree-treenode:hover .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon { opacity: 0.45; } .ant-select-tree .ant-select-tree-treenode-draggable.ant-select-tree-treenode-disabled .ant-select-tree-draggable-icon { visibility: hidden; } .ant-select-tree-indent { align-self: stretch; white-space: nowrap; -webkit-user-select: none; user-select: none; } .ant-select-tree-indent-unit { display: inline-block; width: 24px; } .ant-select-tree-draggable-icon { visibility: hidden; } .ant-select-tree-switcher { position: relative; flex: none; align-self: stretch; width: 24px; margin: 0; line-height: 24px; text-align: center; cursor: pointer; -webkit-user-select: none; user-select: none; } .ant-select-tree-switcher .ant-tree-switcher-icon, .ant-select-tree-switcher .ant-select-tree-switcher-icon { display: inline-block; font-size: 10px; vertical-align: baseline; } .ant-select-tree-switcher .ant-tree-switcher-icon svg, .ant-select-tree-switcher .ant-select-tree-switcher-icon svg { transition: transform 0.3s; } .ant-select-tree-switcher-noop { cursor: default; } .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg { transform: rotate(-90deg); } .ant-select-tree-switcher-loading-icon { color: #1890ff; } .ant-select-tree-switcher-leaf-line { position: relative; z-index: 1; display: inline-block; width: 100%; height: 100%; } .ant-select-tree-switcher-leaf-line::before { position: absolute; top: 0; right: 12px; bottom: -4px; margin-left: -1px; border-right: 1px solid #d9d9d9; content: " "; } .ant-select-tree-switcher-leaf-line::after { position: absolute; width: 10px; height: 14px; border-bottom: 1px solid #d9d9d9; content: " "; } .ant-select-tree-checkbox { top: initial; margin: 4px 8px 0 0; } .ant-select-tree .ant-select-tree-node-content-wrapper { position: relative; z-index: auto; min-height: 24px; margin: 0; padding: 0 4px; color: inherit; line-height: 24px; background: transparent; border-radius: 2px; cursor: pointer; transition: all 0.3s, border 0s, line-height 0s, box-shadow 0s; } .ant-select-tree .ant-select-tree-node-content-wrapper:hover { background-color: #f5f5f5; } .ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected { background-color: #bae7ff; } .ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle { display: inline-block; width: 24px; height: 24px; line-height: 24px; text-align: center; vertical-align: top; } .ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle:empty { display: none; } .ant-select-tree-unselectable .ant-select-tree-node-content-wrapper:hover { background-color: transparent; } .ant-select-tree-node-content-wrapper { line-height: 24px; -webkit-user-select: none; user-select: none; } .ant-select-tree-node-content-wrapper .ant-tree-drop-indicator { position: absolute; z-index: 1; height: 2px; background-color: #1890ff; border-radius: 1px; pointer-events: none; } .ant-select-tree-node-content-wrapper .ant-tree-drop-indicator::after { position: absolute; top: -3px; left: -6px; width: 8px; height: 8px; background-color: transparent; border: 2px solid #1890ff; border-radius: 50%; content: ""; } .ant-select-tree .ant-select-tree-treenode.drop-container > [draggable] { box-shadow: 0 0 0 2px #1890ff; } .ant-select-tree-show-line .ant-select-tree-indent-unit { position: relative; height: 100%; } .ant-select-tree-show-line .ant-select-tree-indent-unit::before { position: absolute; top: 0; right: 12px; bottom: -4px; border-right: 1px solid #d9d9d9; content: ""; } .ant-select-tree-show-line .ant-select-tree-indent-unit-end::before { display: none; } .ant-select-tree-show-line .ant-select-tree-switcher { background: #fff; } .ant-select-tree-show-line .ant-select-tree-switcher-line-icon { vertical-align: -0.15em; } .ant-select-tree .ant-select-tree-treenode-leaf-last .ant-select-tree-switcher-leaf-line::before { top: auto !important; bottom: auto !important; height: 14px !important; } .ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg { transform: rotate(90deg); } .ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher-loading-icon { transform: scaleY(-1); } /* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ /* stylelint-disable no-duplicate-selectors */ /* stylelint-disable */ /* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ .ant-drawer { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1000; pointer-events: none; } .ant-drawer-inline { position: absolute; } .ant-drawer-mask { position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1000; background: rgba(0, 0, 0, 0.45); pointer-events: auto; } .ant-drawer-content-wrapper { position: absolute; z-index: 1000; width: 100% !important; transition-property: all; transition-duration: 300ms; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } @media (min-width: 768px) { .ant-drawer-content-wrapper { width: 40% !important; } } .ant-drawer-content-wrapper-hidden { display: none; } .ant-drawer-left > .ant-drawer-content-wrapper { top: 0; bottom: 0; left: 0; box-shadow: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05), 12px 0 48px 16px rgba(0, 0, 0, 0.03); } .ant-drawer-right > .ant-drawer-content-wrapper { top: 0; right: 0; bottom: 0; box-shadow: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05), -12px 0 48px 16px rgba(0, 0, 0, 0.03); } .ant-drawer-top > .ant-drawer-content-wrapper { top: 0; right: 0; left: 0; box-shadow: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05), 0 12px 48px 16px rgba(0, 0, 0, 0.03); } .ant-drawer-bottom > .ant-drawer-content-wrapper { right: 0; bottom: 0; left: 0; box-shadow: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05), 0 -12px 48px 16px rgba(0, 0, 0, 0.03); } .ant-drawer-content { width: 100%; height: 100%; overflow: auto; background: #fff; pointer-events: auto; } .ant-drawer-wrapper-body { display: flex; flex-direction: column; width: 100%; height: 100%; } .ant-drawer-header { display: flex; flex: 0 1; align-items: center; padding: 16px 24px; font-size: 16px; line-height: 22px; border-bottom: 1px solid #f0f0f0; } .ant-drawer-header-title { display: flex; flex: 1 1; align-items: center; min-width: 0; min-height: 0; } .ant-drawer-extra { flex: none; } .ant-drawer-close { display: inline-block; margin-right: 12px; color: rgba(0, 0, 0, 0.45); font-weight: 700; font-size: 16px; font-style: normal; line-height: 1; text-align: center; text-transform: none; text-decoration: none; background: transparent; border: 0; outline: 0; cursor: pointer; transition: color 0.3s; text-rendering: auto; } .ant-drawer-close:focus, .ant-drawer-close:hover { color: rgba(0, 0, 0, 0.75); text-decoration: none; } .ant-drawer-title { flex: 1 1; margin: 0; color: rgba(0, 0, 0, 0.85); font-weight: 500; font-size: 16px; line-height: 22px; } .ant-drawer-body { flex: 1 1; min-width: 0; min-height: 0; padding: 24px; overflow: auto; } .ant-drawer-footer { flex-shrink: 0; padding: 10px 16px; border-top: 1px solid #f0f0f0; } .panel-motion-enter-start, .panel-motion-appear-start, .panel-motion-leave-start { transition: none; } .panel-motion-enter-active, .panel-motion-appear-active, .panel-motion-leave-active { transition: all 0.3s; } .ant-drawer-mask-motion-enter-active, .ant-drawer-mask-motion-appear-active, .ant-drawer-mask-motion-leave-active { transition: all 0.3s; } .ant-drawer-mask-motion-enter, .ant-drawer-mask-motion-appear { opacity: 0; } .ant-drawer-mask-motion-enter-active, .ant-drawer-mask-motion-appear-active { opacity: 1; } .ant-drawer-mask-motion-leave { opacity: 1; } .ant-drawer-mask-motion-leave-active { opacity: 0; } .ant-drawer-panel-motion-left-enter-start, .ant-drawer-panel-motion-left-appear-start, .ant-drawer-panel-motion-left-leave-start { transition: none; } .ant-drawer-panel-motion-left-enter-active, .ant-drawer-panel-motion-left-appear-active, .ant-drawer-panel-motion-left-leave-active { transition: all 0.3s; } .ant-drawer-panel-motion-left-enter-start, .ant-drawer-panel-motion-left-appear-start { transform: translateX(-100%) !important; } .ant-drawer-panel-motion-left-enter-active, .ant-drawer-panel-motion-left-appear-active { transform: translateX(0); } .ant-drawer-panel-motion-left-leave { transform: translateX(0); } .ant-drawer-panel-motion-left-leave-active { transform: translateX(-100%); } .ant-drawer-panel-motion-right-enter-start, .ant-drawer-panel-motion-right-appear-start, .ant-drawer-panel-motion-right-leave-start { transition: none; } .ant-drawer-panel-motion-right-enter-active, .ant-drawer-panel-motion-right-appear-active, .ant-drawer-panel-motion-right-leave-active { transition: all 0.3s; } .ant-drawer-panel-motion-right-enter-start, .ant-drawer-panel-motion-right-appear-start { transform: translateX(100%) !important; } .ant-drawer-panel-motion-right-enter-active, .ant-drawer-panel-motion-right-appear-active { transform: translateX(0); } .ant-drawer-panel-motion-right-leave { transform: translateX(0); } .ant-drawer-panel-motion-right-leave-active { transform: translateX(100%); } .ant-drawer-panel-motion-top-enter-start, .ant-drawer-panel-motion-top-appear-start, .ant-drawer-panel-motion-top-leave-start { transition: none; } .ant-drawer-panel-motion-top-enter-active, .ant-drawer-panel-motion-top-appear-active, .ant-drawer-panel-motion-top-leave-active { transition: all 0.3s; } .ant-drawer-panel-motion-top-enter-start, .ant-drawer-panel-motion-top-appear-start { transform: translateY(-100%) !important; } .ant-drawer-panel-motion-top-enter-active, .ant-drawer-panel-motion-top-appear-active { transform: translateY(0); } .ant-drawer-panel-motion-top-leave { transform: translateY(0); } .ant-drawer-panel-motion-top-leave-active { transform: translateY(-100%); } .ant-drawer-panel-motion-bottom-enter-start, .ant-drawer-panel-motion-bottom-appear-start, .ant-drawer-panel-motion-bottom-leave-start { transition: none; } .ant-drawer-panel-motion-bottom-enter-active, .ant-drawer-panel-motion-bottom-appear-active, .ant-drawer-panel-motion-bottom-leave-active { transition: all 0.3s; } .ant-drawer-panel-motion-bottom-enter-start, .ant-drawer-panel-motion-bottom-appear-start { transform: translateY(100%) !important; } .ant-drawer-panel-motion-bottom-enter-active, .ant-drawer-panel-motion-bottom-appear-active { transform: translateY(0); } .ant-drawer-panel-motion-bottom-leave { transform: translateY(0); } .ant-drawer-panel-motion-bottom-leave-active { transform: translateY(100%); } .ant-drawer-rtl { direction: rtl; } .ant-drawer-rtl .ant-drawer-close { margin-right: 0; margin-left: 12px; } /* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ /* stylelint-disable no-duplicate-selectors */ /* stylelint-disable */ /* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ .ant-table.ant-table-middle { font-size: 14px; } .ant-table.ant-table-middle .ant-table-title, .ant-table.ant-table-middle .ant-table-footer, .ant-table.ant-table-middle .ant-table-thead > tr > th, .ant-table.ant-table-middle .ant-table-tbody > tr > td, .ant-table.ant-table-middle tfoot > tr > th, .ant-table.ant-table-middle tfoot > tr > td { padding: 12px 8px; } .ant-table.ant-table-middle .ant-table-filter-trigger { margin-right: -4px; } .ant-table.ant-table-middle .ant-table-expanded-row-fixed { margin: -12px -8px; } .ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table { margin: -12px -8px -12px 40px; } .ant-table.ant-table-middle .ant-table-selection-column { padding-inline-start: 2px; } .ant-table.ant-table-small { font-size: 14px; } .ant-table.ant-table-small .ant-table-title, .ant-table.ant-table-small .ant-table-footer, .ant-table.ant-table-small .ant-table-thead > tr > th, .ant-table.ant-table-small .ant-table-tbody > tr > td, .ant-table.ant-table-small tfoot > tr > th, .ant-table.ant-table-small tfoot > tr > td { padding: 8px 8px; } .ant-table.ant-table-small .ant-table-filter-trigger { margin-right: -4px; } .ant-table.ant-table-small .ant-table-expanded-row-fixed { margin: -8px -8px; } .ant-table.ant-table-small .ant-table-tbody .ant-table-wrapper:only-child .ant-table { margin: -8px -8px -8px 40px; } .ant-table.ant-table-small .ant-table-selection-column { padding-inline-start: 2px; } .ant-table.ant-table-bordered > .ant-table-title { border: 1px solid #f0f0f0; border-bottom: 0; } .ant-table.ant-table-bordered > .ant-table-container { border-left: 1px solid #f0f0f0; } .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > td, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tfoot > tr > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > td, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > td, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > td, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tfoot > tr > td { border-right: 1px solid #f0f0f0; } .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr:not(:last-child) > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr:not(:last-child) > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr:not(:last-child) > th, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr:not(:last-child) > th { border-bottom: 1px solid #f0f0f0; } .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > th::before, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > th::before, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > th::before, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr > th::before { background-color: transparent !important; } .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > thead > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tfoot > tr > .ant-table-cell-fix-right-first::after { border-right: 1px solid #f0f0f0; } .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td > .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > td > .ant-table-expanded-row-fixed { margin: -16px -17px; } .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td > .ant-table-expanded-row-fixed::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed::after, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-summary > table > tbody > tr > td > .ant-table-expanded-row-fixed::after { position: absolute; top: 0; right: 1px; bottom: 0; border-right: 1px solid #f0f0f0; content: ""; } .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table, .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table { border-top: 1px solid #f0f0f0; } .ant-table.ant-table-bordered.ant-table-scroll-horizontal > .ant-table-container > .ant-table-body > table > tbody > tr.ant-table-expanded-row > td, .ant-table.ant-table-bordered.ant-table-scroll-horizontal > .ant-table-container > .ant-table-body > table > tbody > tr.ant-table-placeholder > td { border-right: 0; } .ant-table.ant-table-bordered.ant-table-middle > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered.ant-table-middle > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed { margin: -12px -9px; } .ant-table.ant-table-bordered.ant-table-small > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered.ant-table-small > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed { margin: -8px -9px; } .ant-table.ant-table-bordered > .ant-table-footer { border: 1px solid #f0f0f0; border-top: 0; } .ant-table-cell .ant-table-container:first-child { border-top: 0; } .ant-table-cell-scrollbar:not([rowspan]) { box-shadow: 0 1px 0 1px #fafafa; } .ant-table-wrapper { clear: both; max-width: 100%; } .ant-table-wrapper::before { display: table; content: ""; } .ant-table-wrapper::after { display: table; clear: both; content: ""; } .ant-table { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; position: relative; font-size: 14px; background: #fff; border-radius: 2px; } .ant-table table { width: 100%; text-align: left; border-radius: 2px 2px 0 0; border-collapse: separate; border-spacing: 0; } .ant-table-thead > tr > th, .ant-table-tbody > tr > td, .ant-table tfoot > tr > th, .ant-table tfoot > tr > td { position: relative; padding: 16px 16px; overflow-wrap: break-word; } .ant-table-cell-ellipsis { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; word-break: keep-all; } .ant-table-cell-ellipsis.ant-table-cell-fix-left-last, .ant-table-cell-ellipsis.ant-table-cell-fix-right-first { overflow: visible; } .ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content, .ant-table-cell-ellipsis.ant-table-cell-fix-right-first .ant-table-cell-content { display: block; overflow: hidden; text-overflow: ellipsis; } .ant-table-cell-ellipsis .ant-table-column-title { overflow: hidden; text-overflow: ellipsis; word-break: keep-all; } .ant-table-title { padding: 16px 16px; } .ant-table-footer { padding: 16px 16px; color: rgba(0, 0, 0, 0.85); background: #fafafa; } .ant-table-thead > tr > th { position: relative; color: rgba(0, 0, 0, 0.85); font-weight: 500; text-align: left; background: #fafafa; border-bottom: 1px solid #f0f0f0; transition: background 0.3s ease; } .ant-table-thead > tr > th[colspan]:not([colspan="1"]) { text-align: center; } .ant-table-thead > tr > th:not(:last-child):not(.ant-table-selection-column):not( .ant-table-row-expand-icon-cell ):not([colspan])::before { position: absolute; top: 50%; right: 0; width: 1px; height: 1.6em; background-color: rgba(0, 0, 0, 0.06); transform: translateY(-50%); transition: background-color 0.3s; content: ""; } .ant-table-thead > tr:not(:last-child) > th[colspan] { border-bottom: 0; } .ant-table-tbody > tr > td { border-bottom: 1px solid #f0f0f0; transition: background 0.3s; } .ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table, .ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table { margin: -16px -16px -16px 32px; } .ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td, .ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td { border-bottom: 0; } .ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:first-child, .ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:first-child, .ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:last-child, .ant-table-tbody > tr > td > .ant-table-expanded-row-fixed > .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:last-child { border-radius: 0; } .ant-table-tbody > tr.ant-table-row:hover > td, .ant-table-tbody > tr > td.ant-table-cell-row-hover { background: #fafafa; } .ant-table-tbody > tr.ant-table-row-selected > td { background: #e6f7ff; border-color: rgba(0, 0, 0, 0.03); } .ant-table-tbody > tr.ant-table-row-selected:hover > td { background: #dcf4ff; } .ant-table-summary { position: relative; z-index: 2; background: #fff; } div.ant-table-summary { box-shadow: 0 -1px 0 #f0f0f0; } .ant-table-summary > tr > th, .ant-table-summary > tr > td { border-bottom: 1px solid #f0f0f0; } .ant-table-pagination.ant-pagination { margin: 16px 0; } .ant-table-pagination { display: flex; flex-wrap: wrap; row-gap: 8px; } .ant-table-pagination > * { flex: none; } .ant-table-pagination-left { justify-content: flex-start; } .ant-table-pagination-center { justify-content: center; } .ant-table-pagination-right { justify-content: flex-end; } .ant-table-thead th.ant-table-column-has-sorters { outline: none; cursor: pointer; transition: all 0.3s; } .ant-table-thead th.ant-table-column-has-sorters:hover { background: rgba(0, 0, 0, 0.04); } .ant-table-thead th.ant-table-column-has-sorters:hover::before { background-color: transparent !important; } .ant-table-thead th.ant-table-column-has-sorters:focus-visible { color: #1890ff; } .ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-left:hover, .ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-right:hover { background: #f5f5f5; } .ant-table-thead th.ant-table-column-sort { background: #f5f5f5; } .ant-table-thead th.ant-table-column-sort::before { background-color: transparent !important; } td.ant-table-column-sort { background: #fafafa; } .ant-table-column-title { position: relative; z-index: 1; flex: 1 1; } .ant-table-column-sorters { display: flex; flex: auto; align-items: center; justify-content: space-between; } .ant-table-column-sorters::after { position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%; content: ""; } .ant-table-column-sorter { margin-left: 4px; color: #bfbfbf; font-size: 0; transition: color 0.3s; } .ant-table-column-sorter-inner { display: inline-flex; flex-direction: column; align-items: center; } .ant-table-column-sorter-up, .ant-table-column-sorter-down { font-size: 11px; } .ant-table-column-sorter-up.active, .ant-table-column-sorter-down.active { color: #1890ff; } .ant-table-column-sorter-up + .ant-table-column-sorter-down { margin-top: -0.3em; } .ant-table-column-sorters:hover .ant-table-column-sorter { color: #a6a6a6; } .ant-table-filter-column { display: flex; justify-content: space-between; } .ant-table-filter-trigger { position: relative; display: flex; align-items: center; margin: -4px -8px -4px 4px; padding: 0 4px; color: #bfbfbf; font-size: 12px; border-radius: 2px; cursor: pointer; transition: all 0.3s; } .ant-table-filter-trigger:hover { color: rgba(0, 0, 0, 0.45); background: rgba(0, 0, 0, 0.04); } .ant-table-filter-trigger.active { color: #1890ff; } .ant-table-filter-dropdown { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; min-width: 120px; background-color: #fff; border-radius: 2px; box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); } .ant-table-filter-dropdown .ant-dropdown-menu { max-height: 264px; overflow-x: hidden; border: 0; box-shadow: none; } .ant-table-filter-dropdown .ant-dropdown-menu:empty::after { display: block; padding: 8px 0; color: rgba(0, 0, 0, 0.25); font-size: 12px; text-align: center; content: "Not Found"; } .ant-table-filter-dropdown-tree { padding: 8px 8px 0; } .ant-table-filter-dropdown-tree .ant-tree-treenode .ant-tree-node-content-wrapper:hover { background-color: #f5f5f5; } .ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper, .ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper:hover { background-color: #bae7ff; } .ant-table-filter-dropdown-search { padding: 8px; border-bottom: 1px #f0f0f0 solid; } .ant-table-filter-dropdown-search-input input { min-width: 140px; } .ant-table-filter-dropdown-search-input .anticon { color: rgba(0, 0, 0, 0.25); } .ant-table-filter-dropdown-checkall { width: 100%; margin-bottom: 4px; margin-left: 4px; } .ant-table-filter-dropdown-submenu > ul { max-height: calc(100vh - 130px); overflow-x: hidden; overflow-y: auto; } .ant-table-filter-dropdown .ant-checkbox-wrapper + span, .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span { padding-left: 8px; } .ant-table-filter-dropdown-btns { display: flex; justify-content: space-between; padding: 7px 8px; overflow: hidden; background-color: inherit; border-top: 1px solid #f0f0f0; } .ant-table-selection-col { width: 32px; } .ant-table-bordered .ant-table-selection-col { width: 50px; } table tr th.ant-table-selection-column, table tr td.ant-table-selection-column { padding-right: 8px; padding-left: 8px; text-align: center; } table tr th.ant-table-selection-column .ant-radio-wrapper, table tr td.ant-table-selection-column .ant-radio-wrapper { margin-right: 0; } table tr th.ant-table-selection-column.ant-table-cell-fix-left { z-index: 3; } table tr th.ant-table-selection-column::after { background-color: transparent !important; } .ant-table-selection { position: relative; display: inline-flex; flex-direction: column; } .ant-table-selection-extra { position: absolute; top: 0; z-index: 1; cursor: pointer; transition: all 0.3s; margin-inline-start: 100%; padding-inline-start: 4px; } .ant-table-selection-extra .anticon { color: #bfbfbf; font-size: 10px; } .ant-table-selection-extra .anticon:hover { color: #a6a6a6; } .ant-table-expand-icon-col { width: 48px; } .ant-table-row-expand-icon-cell { text-align: center; } .ant-table-row-expand-icon-cell .ant-table-row-expand-icon { display: inline-flex; float: none; vertical-align: sub; } .ant-table-row-indent { float: left; height: 1px; } .ant-table-row-expand-icon { color: #1890ff; outline: none; cursor: pointer; transition: color 0.3s; position: relative; float: left; box-sizing: border-box; width: 17px; height: 17px; padding: 0; color: inherit; line-height: 17px; background: #fff; border: 1px solid #f0f0f0; border-radius: 2px; transform: scale(0.94117647); transition: all 0.3s; -webkit-user-select: none; user-select: none; } .ant-table-row-expand-icon:focus-visible, .ant-table-row-expand-icon:hover { color: #40a9ff; } .ant-table-row-expand-icon:active { color: #096dd9; } .ant-table-row-expand-icon:focus, .ant-table-row-expand-icon:hover, .ant-table-row-expand-icon:active { border-color: currentcolor; } .ant-table-row-expand-icon::before, .ant-table-row-expand-icon::after { position: absolute; background: currentcolor; transition: transform 0.3s ease-out; content: ""; } .ant-table-row-expand-icon::before { top: 7px; right: 3px; left: 3px; height: 1px; } .ant-table-row-expand-icon::after { top: 3px; bottom: 3px; left: 7px; width: 1px; transform: rotate(90deg); } .ant-table-row-expand-icon-collapsed::before { transform: rotate(-180deg); } .ant-table-row-expand-icon-collapsed::after { transform: rotate(0deg); } .ant-table-row-expand-icon-spaced { background: transparent; border: 0; visibility: hidden; } .ant-table-row-expand-icon-spaced::before, .ant-table-row-expand-icon-spaced::after { display: none; content: none; } .ant-table-row-indent + .ant-table-row-expand-icon { margin-top: 2.5005px; margin-right: 8px; } tr.ant-table-expanded-row > td, tr.ant-table-expanded-row:hover > td { background: #fbfbfb; } tr.ant-table-expanded-row .ant-descriptions-view { display: flex; } tr.ant-table-expanded-row .ant-descriptions-view table { flex: auto; width: auto; } .ant-table .ant-table-expanded-row-fixed { position: relative; margin: -16px -16px; padding: 16px 16px; } .ant-table-tbody > tr.ant-table-placeholder { text-align: center; } .ant-table-empty .ant-table-tbody > tr.ant-table-placeholder { color: rgba(0, 0, 0, 0.25); } .ant-table-tbody > tr.ant-table-placeholder:hover > td { background: #fff; } .ant-table-cell-fix-left, .ant-table-cell-fix-right { position: sticky !important; z-index: 2; background: #fff; } .ant-table-cell-fix-left-first::after, .ant-table-cell-fix-left-last::after { position: absolute; top: 0; right: 0; bottom: -1px; width: 30px; transform: translateX(100%); transition: box-shadow 0.3s; content: ""; pointer-events: none; } .ant-table-cell-fix-left-all::after { display: none; } .ant-table-cell-fix-right-first::after, .ant-table-cell-fix-right-last::after { position: absolute; top: 0; bottom: -1px; left: 0; width: 30px; transform: translateX(-100%); transition: box-shadow 0.3s; content: ""; pointer-events: none; } .ant-table .ant-table-container::before, .ant-table .ant-table-container::after { position: absolute; top: 0; bottom: 0; z-index: calc(calc(2 + 1) + 1); width: 30px; transition: box-shadow 0.3s; content: ""; pointer-events: none; } .ant-table .ant-table-container::before { left: 0; } .ant-table .ant-table-container::after { right: 0; } .ant-table-ping-left:not(.ant-table-has-fix-left) > .ant-table-container { position: relative; } .ant-table-ping-left:not(.ant-table-has-fix-left) > .ant-table-container::before { box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15); } .ant-table-ping-left .ant-table-cell-fix-left-first::after, .ant-table-ping-left .ant-table-cell-fix-left-last::after { box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15); } .ant-table-ping-left .ant-table-cell-fix-left-last::before { background-color: transparent !important; } .ant-table-ping-right:not(.ant-table-has-fix-right) > .ant-table-container { position: relative; } .ant-table-ping-right:not(.ant-table-has-fix-right) > .ant-table-container::after { box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15); } .ant-table-ping-right .ant-table-cell-fix-right-first::after, .ant-table-ping-right .ant-table-cell-fix-right-last::after { box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15); } .ant-table-sticky-holder { position: sticky; z-index: calc(2 + 1); background: #fff; } .ant-table-sticky-scroll { position: sticky; bottom: 0; z-index: calc(2 + 1); display: flex; align-items: center; background: #ffffff; border-top: 1px solid #f0f0f0; opacity: 0.6; } .ant-table-sticky-scroll:hover { transform-origin: center bottom; } .ant-table-sticky-scroll-bar { height: 8px; background-color: rgba(0, 0, 0, 0.35); border-radius: 4px; } .ant-table-sticky-scroll-bar:hover { background-color: rgba(0, 0, 0, 0.8); } .ant-table-sticky-scroll-bar-active { background-color: rgba(0, 0, 0, 0.8); } @media all and (-ms-high-contrast: none) { .ant-table-ping-left .ant-table-cell-fix-left-last::after { box-shadow: none !important; } .ant-table-ping-right .ant-table-cell-fix-right-first::after { box-shadow: none !important; } } .ant-table { /* title + table */ /* table */ /* table + footer */ } .ant-table-title { border-radius: 2px 2px 0 0; } .ant-table-title + .ant-table-container { border-top-left-radius: 0; border-top-right-radius: 0; } .ant-table-title + .ant-table-container table { border-radius: 0; } .ant-table-title + .ant-table-container table > thead > tr:first-child th:first-child { border-radius: 0; } .ant-table-title + .ant-table-container table > thead > tr:first-child th:last-child { border-radius: 0; } .ant-table-container { border-top-left-radius: 2px; border-top-right-radius: 2px; } .ant-table-container table > thead > tr:first-child th:first-child { border-top-left-radius: 2px; } .ant-table-container table > thead > tr:first-child th:last-child { border-top-right-radius: 2px; } .ant-table-footer { border-radius: 0 0 2px 2px; } .ant-table-wrapper-rtl { direction: rtl; } .ant-table-rtl { direction: rtl; } .ant-table-wrapper-rtl .ant-table table { text-align: right; } .ant-table-wrapper-rtl .ant-table-thead > tr > th[colspan]:not([colspan="1"]) { text-align: center; } .ant-table-wrapper-rtl .ant-table-thead > tr > th:not(:last-child):not(.ant-table-selection-column):not( .ant-table-row-expand-icon-cell ):not([colspan])::before { right: auto; left: 0; } .ant-table-wrapper-rtl .ant-table-thead > tr > th { text-align: right; } .ant-table-tbody > tr .ant-table-wrapper:only-child .ant-table.ant-table-rtl { margin: -16px 33px -16px -16px; } .ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-left { justify-content: flex-end; } .ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-right { justify-content: flex-start; } .ant-table-wrapper-rtl .ant-table-column-sorter { margin-right: 4px; margin-left: 0; } .ant-table-wrapper-rtl .ant-table-filter-column-title { padding: 16px 16px 16px 2.3em; } .ant-table-rtl .ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title { padding: 0 0 0 2.3em; } .ant-table-wrapper-rtl .ant-table-filter-trigger { margin: -4px 4px -4px -8px; } .ant-dropdown-rtl .ant-table-filter-dropdown .ant-checkbox-wrapper + span, .ant-dropdown-rtl .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span, .ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown .ant-checkbox-wrapper + span, .ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span { padding-right: 8px; padding-left: 0; } .ant-table-wrapper-rtl .ant-table-selection { text-align: center; } .ant-table-wrapper-rtl .ant-table-row-indent { float: right; } .ant-table-wrapper-rtl .ant-table-row-expand-icon { float: right; } .ant-table-wrapper-rtl .ant-table-row-indent + .ant-table-row-expand-icon { margin-right: 0; margin-left: 8px; } .ant-table-wrapper-rtl .ant-table-row-expand-icon::after { transform: rotate(-90deg); } .ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::before { transform: rotate(180deg); } .ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::after { transform: rotate(0deg); } /* highlight.js */ .hljs-string, .hljs-doctag, .hljs-regexp { --tw-text-opacity: 1; color: rgb(47 152 174 / var(--tw-text-opacity)); } /* react-json-view */ .react-json-view { font-family: jetbrains-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; } /* recharts */ .recharts-cartesian-axis-tick-value { fill: #727272; font-family: inter, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 12px; line-height: 16px; --tw-text-opacity: 1; color: rgb(114 114 114 / var(--tw-text-opacity)); } /* ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com */ /* 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) */ *, ::before, ::after { box-sizing: border-box; /* 1 */ border-width: 0; /* 2 */ border-style: solid; /* 2 */ border-color: #C5C4BF; /* 2 */ } ::before, ::after { --tw-content: ''; } /* 1. Use a consistent sensible line-height in all browsers. 2. Prevent adjustments of font size after orientation changes in iOS. 3. Use a more readable tab size. 4. Use the user's configured `sans` font-family by default. 5. Use the user's configured `sans` font-feature-settings by default. 6. Use the user's configured `sans` font-variation-settings by default. 7. Disable tap highlights on iOS */ html, :host { line-height: 1.5; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ /* 3 */ tab-size: 4; /* 3 */ font-family: inter, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ font-feature-settings: normal; /* 5 */ font-variation-settings: normal; /* 6 */ -webkit-tap-highlight-color: transparent; /* 7 */ } /* 1. Remove the margin in all browsers. 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. */ body { margin: 0; /* 1 */ line-height: inherit; /* 2 */ } /* 1. Add the correct height in Firefox. 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 3. Ensure horizontal rules are visible by default. */ hr { height: 0; /* 1 */ color: inherit; /* 2 */ border-top-width: 1px; /* 3 */ } /* Add the correct text decoration in Chrome, Edge, and Safari. */ abbr:where([title]) { -webkit-text-decoration: underline dotted; text-decoration: underline dotted; } /* Remove the default font size and weight for headings. */ h1, h2, h3, h4, h5, h6 { font-size: inherit; font-weight: inherit; } /* Reset links to optimize for opt-in styling instead of opt-out. */ a { color: inherit; text-decoration: inherit; } /* Add the correct font weight in Edge and Safari. */ b, strong { font-weight: bolder; } /* 1. Use the user's configured `mono` font-family by default. 2. Use the user's configured `mono` font-feature-settings by default. 3. Use the user's configured `mono` font-variation-settings by default. 4. Correct the odd `em` font sizing in all browsers. */ code, kbd, samp, pre { font-family: jetbrains-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ font-feature-settings: normal; /* 2 */ font-variation-settings: normal; /* 3 */ font-size: 1em; /* 4 */ } /* Add the correct font size in all browsers. */ small { font-size: 80%; } /* Prevent `sub` and `sup` elements from affecting the line height in all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sub { bottom: -0.25em; } sup { top: -0.5em; } /* 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 3. Remove gaps between table borders by default. */ table { text-indent: 0; /* 1 */ border-color: inherit; /* 2 */ border-collapse: collapse; /* 3 */ } /* 1. Change the font styles in all browsers. 2. Remove the margin in Firefox and Safari. 3. Remove default padding in all browsers. */ button, input, optgroup, select, textarea { font-family: inherit; /* 1 */ font-feature-settings: inherit; /* 1 */ font-variation-settings: inherit; /* 1 */ font-size: 100%; /* 1 */ font-weight: inherit; /* 1 */ line-height: inherit; /* 1 */ color: inherit; /* 1 */ margin: 0; /* 2 */ padding: 0; /* 3 */ } /* Remove the inheritance of text transform in Edge and Firefox. */ button, select { text-transform: none; } /* 1. Correct the inability to style clickable types in iOS and Safari. 2. Remove default button styles. */ button, [type='button'], [type='reset'], [type='submit'] { -webkit-appearance: button; /* 1 */ background-color: transparent; /* 2 */ background-image: none; /* 2 */ } /* Use the modern Firefox focus style for all focusable elements. */ :-moz-focusring { outline: auto; } /* Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) */ :-moz-ui-invalid { box-shadow: none; } /* Add the correct vertical alignment in Chrome and Firefox. */ progress { vertical-align: baseline; } /* Correct the cursor style of increment and decrement buttons in Safari. */ ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { height: auto; } /* 1. Correct the odd appearance in Chrome and Safari. 2. Correct the outline style in Safari. */ [type='search'] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ } /* Remove the inner padding in Chrome and Safari on macOS. */ ::-webkit-search-decoration { -webkit-appearance: none; } /* 1. Correct the inability to style clickable types in iOS and Safari. 2. Change font properties to `inherit` in Safari. */ ::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ } /* Add the correct display in Chrome and Safari. */ summary { display: list-item; } /* Removes the default spacing and border for appropriate elements. */ blockquote, dl, dd, h1, h2, h3, h4, h5, h6, hr, figure, p, pre { margin: 0; } fieldset { margin: 0; padding: 0; } legend { padding: 0; } ol, ul, menu { list-style: none; margin: 0; padding: 0; } /* Reset default styling for dialogs. */ dialog { padding: 0; } /* Prevent resizing textareas horizontally by default. */ textarea { resize: vertical; } /* 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 2. Set the default placeholder color to the user's configured gray 400 color. */ input::placeholder, textarea::placeholder { opacity: 1; /* 1 */ color: #8A8985; /* 2 */ } /* Set the default cursor for buttons. */ button, [role="button"] { cursor: pointer; } /* Make sure disabled buttons don't get the pointer cursor. */ :disabled { cursor: default; } /* 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) This can trigger a poorly considered lint error in some tools but is included by design. */ img, svg, video, canvas, audio, iframe, embed, object { display: block; /* 1 */ vertical-align: middle; /* 2 */ } /* Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) */ img, video { max-width: 100%; height: auto; } /* Make elements with the HTML hidden attribute stay hidden by default */ [hidden] { display: none; } svg{display:initial !important} *, ::before, ::after { --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(56 111 177 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; } ::backdrop { --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(56 111 177 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; } .container { width: 100%; } @media (min-width: 640px) { .container { max-width: 640px; } } @media (min-width: 768px) { .container { max-width: 768px; } } @media (min-width: 1024px) { .container { max-width: 1024px; } } @media (min-width: 1280px) { .container { max-width: 1280px; } } @media (min-width: 1536px) { .container { max-width: 1536px; } } :root { --background-default: #FFFFFF; --background-light: #F7F7F6; --background-dark: #303030; --button-background-default: #FFFFFF; --button-background-default-hover: #F7F7F6; --button-background-default-pressed: #F2F1ED; --button-background-primary: #386FB1; --button-background-primary-hover: #2C588F; --button-background-primary-pressed: #204571; --button-background-disabled: #F2F7FF; --surface-info: #FFF5EA; --surface-critical: #FFF4F6; --surface-success: #F0F8F5; --border-default: #DEDDD7; --border-muted: #F2F1ED; --border-strong: #C5C4BF; --text-default: #303030; --text-hover: #727272; --text-muted: #575757; --text-disabled: #444444; --text-critical: #C73D4F; --text-success: #008060; --text-info: #BF4E36; --text-on-primary: #FFFFFF; --text-on-critical: #FFFFFF; --icon-default: #444444; --icon-strong: #222222; --icon-muted: #444444; --icon-disabled: #727272; --icon-critical: #C73D4F; --icon-success: #008060; --icon-info: #BF4E36; --icon-on-primary: #FFFFFF; --icon-on-critical: #FFFFFF; --action-primary: #008060; --action-primary-hover: #006452; --action-primary-pressed: #00473C; --action-primary-disabled: #F0F8F5; --action-critical: #C73D4F; --action-critical-hover: #9F2946; --action-critical-pressed: #7C1B3D; --action-critical-disabled: #FFF4F6; --action-default: #FFFFFF; --action-default-hover: #F2F1ED; --action-default-pressed: #DEDDD7; --action-default-disabled: #F7F7F6; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .\!pointer-events-none { pointer-events: none !important; } .pointer-events-none { pointer-events: none; } .pointer-events-auto { pointer-events: auto; } .\!visible { visibility: visible !important; } .visible { visibility: visible; } .invisible { visibility: hidden; } .collapse { visibility: collapse; } .static { position: static; } .fixed { position: fixed; } .absolute { position: absolute; } .relative { position: relative; } .sticky { position: sticky; } .inset-0 { inset: 0px; } .inset-x-0 { left: 0px; right: 0px; } .-left-0 { left: -0px; } .-left-0\.5 { left: -0.125rem; } .-top-0 { top: -0px; } .-top-0\.5 { top: -0.125rem; } .-top-10 { top: -2.5rem; } .bottom-0 { bottom: 0px; } .bottom-10 { bottom: 2.5rem; } .bottom-6 { bottom: 1.5rem; } .bottom-8 { bottom: 2rem; } .bottom-\[27px\] { bottom: 27px; } .bottom-full { bottom: 100%; } .bottom-px { bottom: 1px; } .left-0 { left: 0px; } .left-1\/2 { left: 50%; } .left-auto { left: auto; } .right-0 { right: 0px; } .right-12 { right: 3rem; } .right-20 { right: 5rem; } .right-5 { right: 1.25rem; } .right-6 { right: 1.5rem; } .right-\[72px\] { right: 72px; } .right-px { right: 1px; } .top-0 { top: 0px; } .top-4 { top: 1rem; } .top-5 { top: 1.25rem; } .top-6 { top: 1.5rem; } .top-8 { top: 2rem; } .top-px { top: 1px; } .z-0 { z-index: 0; } .z-10 { z-index: 10; } .z-20 { z-index: 20; } .z-40 { z-index: 40; } .z-50 { z-index: 50; } .z-auto { z-index: auto; } .order-1 { order: 1; } .order-2 { order: 2; } .col-span-1 { grid-column: span 1 / span 1; } .col-span-10 { grid-column: span 10 / span 10; } .col-span-12 { grid-column: span 12 / span 12; } .col-span-2 { grid-column: span 2 / span 2; } .col-span-3 { grid-column: span 3 / span 3; } .col-span-4 { grid-column: span 4 / span 4; } .col-span-5 { grid-column: span 5 / span 5; } .col-span-7 { grid-column: span 7 / span 7; } .col-span-full { grid-column: 1 / -1; } .col-start-1 { grid-column-start: 1; } .col-start-10 { grid-column-start: 10; } .col-start-12 { grid-column-start: 12; } .col-start-3 { grid-column-start: 3; } .col-start-4 { grid-column-start: 4; } .col-start-5 { grid-column-start: 5; } .col-start-7 { grid-column-start: 7; } .row-start-5 { grid-row-start: 5; } .float-end { float: inline-end; } .float-right { float: right; } .float-left { float: left; } .-m-0 { margin: -0px; } .-m-0\.5 { margin: -0.125rem; } .m-0 { margin: 0px; } .m-1 { margin: 0.25rem; } .m-2 { margin: 0.5rem; } .m-3 { margin: 0.75rem; } .m-4 { margin: 1rem; } .m-5 { margin: 1.25rem; } .m-8 { margin: 2rem; } .m-auto { margin: auto; } .-mx-10 { margin-left: -2.5rem; margin-right: -2.5rem; } .-mx-2 { margin-left: -0.5rem; margin-right: -0.5rem; } .-mx-3 { margin-left: -0.75rem; margin-right: -0.75rem; } .-mx-3\.5 { margin-left: -0.875rem; margin-right: -0.875rem; } .-my-2 { margin-top: -0.5rem; margin-bottom: -0.5rem; } .-my-3 { margin-top: -0.75rem; margin-bottom: -0.75rem; } .mx-1 { margin-left: 0.25rem; margin-right: 0.25rem; } .mx-10 { margin-left: 2.5rem; margin-right: 2.5rem; } .mx-2 { margin-left: 0.5rem; margin-right: 0.5rem; } .mx-20 { margin-left: 5rem; margin-right: 5rem; } .mx-3 { margin-left: 0.75rem; margin-right: 0.75rem; } .mx-4 { margin-left: 1rem; margin-right: 1rem; } .mx-40 { margin-left: 10rem; margin-right: 10rem; } .mx-5 { margin-left: 1.25rem; margin-right: 1.25rem; } .mx-6 { margin-left: 1.5rem; margin-right: 1.5rem; } .mx-8 { margin-left: 2rem; margin-right: 2rem; } .mx-auto { margin-left: auto; margin-right: auto; } .my-0 { margin-top: 0px; margin-bottom: 0px; } .my-0\.5 { margin-top: 0.125rem; margin-bottom: 0.125rem; } .my-1 { margin-top: 0.25rem; margin-bottom: 0.25rem; } .my-10 { margin-top: 2.5rem; margin-bottom: 2.5rem; } .my-12 { margin-top: 3rem; margin-bottom: 3rem; } .my-2 { margin-top: 0.5rem; margin-bottom: 0.5rem; } .my-3 { margin-top: 0.75rem; margin-bottom: 0.75rem; } .my-4 { margin-top: 1rem; margin-bottom: 1rem; } .my-5 { margin-top: 1.25rem; margin-bottom: 1.25rem; } .my-6 { margin-top: 1.5rem; margin-bottom: 1.5rem; } .my-8 { margin-top: 2rem; margin-bottom: 2rem; } .my-auto { margin-top: auto; margin-bottom: auto; } .my-xs { margin-top: 4px; margin-bottom: 4px; } .\!mb-0 { margin-bottom: 0px !important; } .\!mt-1 { margin-top: 0.25rem !important; } .-mb-1 { margin-bottom: -0.25rem; } .-mb-2 { margin-bottom: -0.5rem; } .-mb-3 { margin-bottom: -0.75rem; } .-mb-4 { margin-bottom: -1rem; } .-mb-px { margin-bottom: -1px; } .-ml-2 { margin-left: -0.5rem; } .-ml-2\.5 { margin-left: -0.625rem; } .-ml-3 { margin-left: -0.75rem; } .-ml-4 { margin-left: -1rem; } .-mr-2 { margin-right: -0.5rem; } .-mr-2\.5 { margin-right: -0.625rem; } .-mt-1 { margin-top: -0.25rem; } .-mt-1\.5 { margin-top: -0.375rem; } .-mt-10 { margin-top: -2.5rem; } .-mt-2 { margin-top: -0.5rem; } .-mt-3 { margin-top: -0.75rem; } .-mt-4 { margin-top: -1rem; } .-mt-6 { margin-top: -1.5rem; } .-mt-\[50px\] { margin-top: -50px; } .-mt-px { margin-top: -1px; } .mb-0 { margin-bottom: 0px; } .mb-1 { margin-bottom: 0.25rem; } .mb-10 { margin-bottom: 2.5rem; } .mb-11 { margin-bottom: 2.75rem; } .mb-16 { margin-bottom: 4rem; } .mb-2 { margin-bottom: 0.5rem; } .mb-3 { margin-bottom: 0.75rem; } .mb-4 { margin-bottom: 1rem; } .mb-5 { margin-bottom: 1.25rem; } .mb-6 { margin-bottom: 1.5rem; } .mb-7 { margin-bottom: 1.75rem; } .mb-8 { margin-bottom: 2rem; } .mb-9 { margin-bottom: 2.25rem; } .mb-px { margin-bottom: 1px; } .ml-1 { margin-left: 0.25rem; } .ml-1\.5 { margin-left: 0.375rem; } .ml-12 { margin-left: 3rem; } .ml-2 { margin-left: 0.5rem; } .ml-2\.5 { margin-left: 0.625rem; } .ml-20 { margin-left: 5rem; } .ml-24 { margin-left: 6rem; } .ml-28 { margin-left: 7rem; } .ml-3 { margin-left: 0.75rem; } .ml-4 { margin-left: 1rem; } .ml-5 { margin-left: 1.25rem; } .ml-6 { margin-left: 1.5rem; } .ml-7 { margin-left: 1.75rem; } .ml-8 { margin-left: 2rem; } .ml-9 { margin-left: 2.25rem; } .ml-\[120px\] { margin-left: 120px; } .ml-\[72px\] { margin-left: 72px; } .ml-auto { margin-left: auto; } .mr-0 { margin-right: 0px; } .mr-0\.5 { margin-right: 0.125rem; } .mr-1 { margin-right: 0.25rem; } .mr-16 { margin-right: 4rem; } .mr-2 { margin-right: 0.5rem; } .mr-2\.5 { margin-right: 0.625rem; } .mr-3 { margin-right: 0.75rem; } .mr-4 { margin-right: 1rem; } .mr-6 { margin-right: 1.5rem; } .mr-\[1px\] { margin-right: 1px; } .mt-0 { margin-top: 0px; } .mt-0\.5 { margin-top: 0.125rem; } .mt-1 { margin-top: 0.25rem; } .mt-1\.5 { margin-top: 0.375rem; } .mt-10 { margin-top: 2.5rem; } .mt-12 { margin-top: 3rem; } .mt-14 { margin-top: 3.5rem; } .mt-2 { margin-top: 0.5rem; } .mt-3 { margin-top: 0.75rem; } .mt-4 { margin-top: 1rem; } .mt-5 { margin-top: 1.25rem; } .mt-6 { margin-top: 1.5rem; } .mt-8 { margin-top: 2rem; } .mt-9 { margin-top: 2.25rem; } .box-border { box-sizing: border-box; } .block { display: block; } .inline-block { display: inline-block; } .inline { display: inline; } .flex { display: flex; } .inline-flex { display: inline-flex; } .table { display: table; } .table-cell { display: table-cell; } .grid { display: grid; } .contents { display: contents; } .hidden { display: none; } .aspect-video { aspect-ratio: 16 / 9; } .\!h-3 { height: 0.75rem !important; } .\!h-auto { height: auto !important; } .h-0 { height: 0px; } .h-0\.5 { height: 0.125rem; } .h-1 { height: 0.25rem; } .h-1\.5 { height: 0.375rem; } .h-1\/2 { height: 50%; } .h-10 { height: 2.5rem; } .h-11 { height: 2.75rem; } .h-12 { height: 3rem; } .h-16 { height: 4rem; } .h-2 { height: 0.5rem; } .h-2\.5 { height: 0.625rem; } .h-2\/3 { height: 66.666667%; } .h-2\/5 { height: 40%; } .h-20 { height: 5rem; } .h-24 { height: 6rem; } .h-28 { height: 7rem; } .h-3 { height: 0.75rem; } .h-3\/5 { height: 60%; } .h-32 { height: 8rem; } .h-36 { height: 9rem; } .h-4 { height: 1rem; } .h-4\/5 { height: 80%; } .h-40 { height: 10rem; } .h-44 { height: 11rem; } .h-48 { height: 12rem; } .h-5 { height: 1.25rem; } .h-52 { height: 13rem; } .h-56 { height: 14rem; } .h-6 { height: 1.5rem; } .h-64 { height: 16rem; } .h-7 { height: 1.75rem; } .h-72 { height: 18rem; } .h-8 { height: 2rem; } .h-80 { height: 20rem; } .h-9 { height: 2.25rem; } .h-96 { height: 24rem; } .h-\[24px\] { height: 24px; } .h-\[35px\] { height: 35px; } .h-\[450px\] { height: 450px; } .h-\[480px\] { height: 480px; } .h-\[590px\] { height: 590px; } .h-\[630px\] { height: 630px; } .h-\[648px\] { height: 648px; } .h-\[720px\] { height: 720px; } .h-auto { height: auto; } .h-fit { height: -moz-fit-content; height: fit-content; } .h-full { height: 100%; } .h-px { height: 1px; } .h-screen { height: 100vh; } .max-h-16 { max-height: 4rem; } .max-h-24 { max-height: 6rem; } .max-h-60 { max-height: 15rem; } .max-h-64 { max-height: 16rem; } .max-h-80 { max-height: 20rem; } .max-h-96 { max-height: 24rem; } .max-h-\[353px\] { max-height: 353px; } .max-h-\[384px\] { max-height: 384px; } .max-h-\[405px\] { max-height: 405px; } .max-h-\[600px\] { max-height: 600px; } .max-h-\[692px\] { max-height: 692px; } .max-h-fit { max-height: -moz-fit-content; max-height: fit-content; } .max-h-screen { max-height: 100vh; } .min-h-16 { min-height: 4rem; } .min-h-20 { min-height: 5rem; } .min-h-32 { min-height: 8rem; } .min-h-52 { min-height: 13rem; } .min-h-64 { min-height: 16rem; } .min-h-8 { min-height: 2rem; } .min-h-80 { min-height: 20rem; } .min-h-96 { min-height: 24rem; } .min-h-\[188px\] { min-height: 188px; } .min-h-\[350px\] { min-height: 350px; } .min-h-\[435px\] { min-height: 435px; } .min-h-\[600px\] { min-height: 600px; } .min-h-max { min-height: max-content; } .min-h-screen { min-height: 100vh; } .w-1 { width: 0.25rem; } .w-1\.5 { width: 0.375rem; } .w-1\/12 { width: 8.333333%; } .w-1\/2 { width: 50%; } .w-1\/3 { width: 33.333333%; } .w-1\/4 { width: 25%; } .w-1\/5 { width: 20%; } .w-1\/6 { width: 16.666667%; } .w-10 { width: 2.5rem; } .w-11\/12 { width: 91.666667%; } .w-12 { width: 3rem; } .w-14 { width: 3.5rem; } .w-16 { width: 4rem; } .w-192 { width: 48rem; } .w-2 { width: 0.5rem; } .w-2\.5 { width: 0.625rem; } .w-2\/3 { width: 66.666667%; } .w-20 { width: 5rem; } .w-24 { width: 6rem; } .w-28 { width: 7rem; } .w-3 { width: 0.75rem; } .w-3\/4 { width: 75%; } .w-32 { width: 8rem; } .w-36 { width: 9rem; } .w-4 { width: 1rem; } .w-40 { width: 10rem; } .w-44 { width: 11rem; } .w-48 { width: 12rem; } .w-5 { width: 1.25rem; } .w-52 { width: 13rem; } .w-56 { width: 14rem; } .w-6 { width: 1.5rem; } .w-6\/12 { width: 50%; } .w-60 { width: 15rem; } .w-64 { width: 16rem; } .w-7 { width: 1.75rem; } .w-72 { width: 18rem; } .w-8 { width: 2rem; } .w-80 { width: 20rem; } .w-9 { width: 2.25rem; } .w-9\/12 { width: 75%; } .w-96 { width: 24rem; } .w-\[10\%\] { width: 10%; } .w-\[15\%\] { width: 15%; } .w-\[20\%\] { width: 20%; } .w-\[30px\] { width: 30px; } .w-\[35px\] { width: 35px; } .w-\[36rem\] { width: 36rem; } .w-\[420px\] { width: 420px; } .w-\[50\%\] { width: 50%; } .w-auto { width: auto; } .w-default { width: 16px; } .w-fit { width: -moz-fit-content; width: fit-content; } .w-full { width: 100%; } .w-l { width: 32px; } .w-m { width: 16px; } .w-max { width: max-content; } .w-min { width: min-content; } .w-px { width: 1px; } .w-s { width: 8px; } .w-screen { width: 100vw; } .w-xl { width: 64px; } .w-xs { width: 4px; } .w-xxs { width: 2px; } .\!min-w-0 { min-width: 0px !important; } .\!min-w-\[130px\] { min-width: 130px !important; } .min-w-4xs { min-width: 8rem; } .min-w-60 { min-width: 15rem; } .min-w-\[1rem\] { min-width: 1rem; } .min-w-\[207px\] { min-width: 207px; } .min-w-\[300px\] { min-width: 300px; } .min-w-\[500px\] { min-width: 500px; } .min-w-\[96px\] { min-width: 96px; } .min-w-fit { min-width: -moz-fit-content; min-width: fit-content; } .\!max-w-\[200px\] { max-width: 200px !important; } .max-w-24\/25 { max-width: 96%; } .max-w-2xl { max-width: 42rem; } .max-w-2xs { max-width: 16rem; } .max-w-3xl { max-width: 48rem; } .max-w-3xs { max-width: 12rem; } .max-w-4xl { max-width: 56rem; } .max-w-60 { max-width: 15rem; } .max-w-\[1130px\] { max-width: 1130px; } .max-w-\[1176px\] { max-width: 1176px; } .max-w-\[1600px\] { max-width: 1600px; } .max-w-\[172px\] { max-width: 172px; } .max-w-\[200px\] { max-width: 200px; } .max-w-\[40ch\] { max-width: 40ch; } .max-w-\[420px\] { max-width: 420px; } .max-w-\[480px\] { max-width: 480px; } .max-w-\[540px\] { max-width: 540px; } .max-w-\[586px\] { max-width: 586px; } .max-w-\[60\%\] { max-width: 60%; } .max-w-\[600px\] { max-width: 600px; } .max-w-\[670px\] { max-width: 670px; } .max-w-\[75px\] { max-width: 75px; } .max-w-\[780px\] { max-width: 780px; } .max-w-\[860px\] { max-width: 860px; } .max-w-\[863px\] { max-width: 863px; } .max-w-full { max-width: 100%; } .max-w-lg { max-width: 32rem; } .max-w-max { max-width: max-content; } .max-w-md { max-width: 28rem; } .max-w-sm { max-width: 24rem; } .max-w-xl { max-width: 36rem; } .max-w-xs { max-width: 20rem; } .flex-1 { flex: 1 1; } .flex-initial { flex: 0 1 auto; } .flex-none { flex: none; } .flex-shrink-0 { flex-shrink: 0; } .\!shrink-0 { flex-shrink: 0 !important; } .shrink { flex-shrink: 1; } .shrink-0 { flex-shrink: 0; } .flex-grow { flex-grow: 1; } .flex-grow-0 { flex-grow: 0; } .grow { flex-grow: 1; } .grow-0 { flex-grow: 0; } .basis-0 { flex-basis: 0px; } .basis-1\/3 { flex-basis: 33.333333%; } .basis-2\/3 { flex-basis: 66.666667%; } .basis-4 { flex-basis: 1rem; } .basis-\[16px\] { flex-basis: 16px; } .table-fixed { table-layout: fixed; } .-translate-x-1\/2 { --tw-translate-x: -50%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .rotate-180 { --tw-rotate: 180deg; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .rotate-\[270deg\] { --tw-rotate: 270deg; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .scale-100 { --tw-scale-x: 1; --tw-scale-y: 1; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .scale-95 { --tw-scale-x: .95; --tw-scale-y: .95; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .transform { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } @keyframes pulse { 50% { opacity: .5; } } .animate-pulse { animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } .\!cursor-not-allowed { cursor: not-allowed !important; } .cursor-default { cursor: default; } .cursor-not-allowed { cursor: not-allowed; } .cursor-pointer { cursor: pointer; } .select-none { -webkit-user-select: none; user-select: none; } .resize { resize: both; } .list-inside { list-style-position: inside; } .list-disc { list-style-type: disc; } .appearance-none { -webkit-appearance: none; appearance: none; } .grid-flow-row { grid-auto-flow: row; } .grid-flow-col { grid-auto-flow: column; } .grid-flow-row-dense { grid-auto-flow: row dense; } .auto-rows-fr { grid-auto-rows: minmax(0, 1fr); } .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } .grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)); } .grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)); } .grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } .grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } .grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)); } .grid-cols-\[1fr\2c 1fr\] { grid-template-columns: 1fr 1fr; } .grid-cols-\[1fr\2c minmax\(0\2c 2fr\)\] { grid-template-columns: 1fr minmax(0,2fr); } .grid-cols-\[1fr_2fr\] { grid-template-columns: 1fr 2fr; } .grid-cols-\[1fr_2fr_2fr_2fr\] { grid-template-columns: 1fr 2fr 2fr 2fr; } .grid-cols-\[minmax\(0\2c 2fr\)\2c 1fr\] { grid-template-columns: minmax(0,2fr) 1fr; } .grid-cols-none { grid-template-columns: none; } .grid-rows-\[0fr\] { grid-template-rows: 0fr; } .grid-rows-\[1fr\] { grid-template-rows: 1fr; } .grid-rows-\[auto\2c auto\2c 1fr\] { grid-template-rows: auto auto 1fr; } .flex-row { flex-direction: row; } .flex-row-reverse { flex-direction: row-reverse; } .flex-col { flex-direction: column; } .flex-col-reverse { flex-direction: column-reverse; } .flex-wrap { flex-wrap: wrap; } .flex-nowrap { flex-wrap: nowrap; } .place-content-center { place-content: center; } .place-items-center { place-items: center; } .content-center { align-content: center; } .content-start { align-content: flex-start; } .content-end { align-content: flex-end; } .content-between { align-content: space-between; } .\!items-start { align-items: flex-start !important; } .items-start { align-items: flex-start; } .items-end { align-items: flex-end; } .items-center { align-items: center; } .items-baseline { align-items: baseline; } .items-stretch { align-items: stretch; } .justify-start { justify-content: flex-start; } .justify-end { justify-content: flex-end; } .justify-center { justify-content: center; } .justify-between { justify-content: space-between; } .justify-around { justify-content: space-around; } .justify-evenly { justify-content: space-evenly; } .justify-items-start { justify-items: start; } .justify-items-end { justify-items: end; } .justify-items-center { justify-items: center; } .gap-0 { gap: 0px; } .gap-0\.5 { gap: 0.125rem; } .gap-1 { gap: 0.25rem; } .gap-10 { gap: 2.5rem; } .gap-16 { gap: 4rem; } .gap-2 { gap: 0.5rem; } .gap-3 { gap: 0.75rem; } .gap-4 { gap: 1rem; } .gap-5 { gap: 1.25rem; } .gap-6 { gap: 1.5rem; } .gap-8 { gap: 2rem; } .gap-9 { gap: 2.25rem; } .gap-px { gap: 1px; } .gap-x-1 { column-gap: 0.25rem; } .gap-x-16 { column-gap: 4rem; } .gap-x-2 { column-gap: 0.5rem; } .gap-x-4 { column-gap: 1rem; } .gap-x-6 { column-gap: 1.5rem; } .gap-x-8 { column-gap: 2rem; } .gap-y-14 { row-gap: 3.5rem; } .gap-y-2 { row-gap: 0.5rem; } .gap-y-3 { row-gap: 0.75rem; } .gap-y-4 { row-gap: 1rem; } .gap-y-5 { row-gap: 1.25rem; } .gap-y-6 { row-gap: 1.5rem; } .space-x-0 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0px * var(--tw-space-x-reverse)); margin-left: calc(0px * calc(1 - var(--tw-space-x-reverse))); } .space-x-0\.5 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0.125rem * var(--tw-space-x-reverse)); margin-left: calc(0.125rem * calc(1 - var(--tw-space-x-reverse))); } .space-x-1 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0.25rem * var(--tw-space-x-reverse)); margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); } .space-x-2 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0.5rem * var(--tw-space-x-reverse)); margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); } .space-x-4 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(1rem * var(--tw-space-x-reverse)); margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); } .space-x-6 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(1.5rem * var(--tw-space-x-reverse)); margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); } .space-y-1 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); } .space-y-2 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); } .space-y-4 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(1rem * var(--tw-space-y-reverse)); } .space-y-6 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); } .space-y-8 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(2rem * var(--tw-space-y-reverse)); } .divide-y > :not([hidden]) ~ :not([hidden]) { --tw-divide-y-reverse: 0; border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); } .divide-border-muted > :not([hidden]) ~ :not([hidden]) { border-color: var(--border-muted); } .divide-gray-100 > :not([hidden]) ~ :not([hidden]) { --tw-divide-opacity: 1; border-color: rgb(222 221 215 / var(--tw-divide-opacity)); } .divide-gray-50 > :not([hidden]) ~ :not([hidden]) { --tw-divide-opacity: 1; border-color: rgb(242 241 237 / var(--tw-divide-opacity)); } .divide-gray-700 > :not([hidden]) ~ :not([hidden]) { --tw-divide-opacity: 1; border-color: rgb(68 68 68 / var(--tw-divide-opacity)); } .self-start { align-self: flex-start; } .self-end { align-self: flex-end; } .self-center { align-self: center; } .justify-self-start { justify-self: start; } .justify-self-end { justify-self: end; } .justify-self-center { justify-self: center; } .justify-self-stretch { justify-self: stretch; } .overflow-auto { overflow: auto; } .overflow-hidden { overflow: hidden; } .overflow-x-auto { overflow-x: auto; } .overflow-y-auto { overflow-y: auto; } .overflow-y-hidden { overflow-y: hidden; } .overflow-x-scroll { overflow-x: scroll; } .overflow-y-scroll { overflow-y: scroll; } .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .overflow-ellipsis { text-overflow: ellipsis; } .text-clip { text-overflow: clip; } .\!whitespace-normal { white-space: normal !important; } .whitespace-normal { white-space: normal; } .whitespace-nowrap { white-space: nowrap; } .whitespace-pre { white-space: pre; } .whitespace-pre-wrap { white-space: pre-wrap; } .text-wrap { text-wrap: wrap; } .break-normal { overflow-wrap: normal; word-break: normal; } .break-words { overflow-wrap: break-word; } .break-all { word-break: break-all; } .\!rounded { border-radius: 0.25rem !important; } .rounded { border-radius: 0.25rem; } .rounded-full { border-radius: 9999px; } .rounded-md { border-radius: 0.25rem; } .rounded-none { border-radius: 0px; } .rounded-sm { border-radius: 0.125rem; } .rounded-xl { border-radius: 0.75rem; } .\!rounded-b-none { border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; } .\!rounded-t-none { border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; } .rounded-b { border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } .rounded-b-md { border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } .rounded-b-none { border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; } .rounded-b-sm { border-bottom-right-radius: 0.125rem; border-bottom-left-radius: 0.125rem; } .rounded-l-sm { border-top-left-radius: 0.125rem; border-bottom-left-radius: 0.125rem; } .rounded-r { border-top-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem; } .rounded-r-sm { border-top-right-radius: 0.125rem; border-bottom-right-radius: 0.125rem; } .rounded-t { border-top-left-radius: 0.25rem; border-top-right-radius: 0.25rem; } .rounded-t-none { border-top-left-radius: 0px; border-top-right-radius: 0px; } .rounded-bl-none { border-bottom-left-radius: 0px; } .rounded-tl-none { border-top-left-radius: 0px; } .rounded-tr-sm { border-top-right-radius: 0.125rem; } .border { border-width: 1px; } .border-0 { border-width: 0px; } .border-2 { border-width: 2px; } .border-4 { border-width: 4px; } .\!border-x-0 { border-left-width: 0px !important; border-right-width: 0px !important; } .border-x { border-left-width: 1px; border-right-width: 1px; } .\!border-b-0 { border-bottom-width: 0px !important; } .\!border-t-0 { border-top-width: 0px !important; } .border-b { border-bottom-width: 1px; } .border-b-0 { border-bottom-width: 0px; } .border-b-2 { border-bottom-width: 2px; } .border-b-3 { border-bottom-width: 3px; } .border-l { border-left-width: 1px; } .border-l-4 { border-left-width: 4px; } .border-r { border-right-width: 1px; } .border-r-0 { border-right-width: 0px; } .border-t { border-top-width: 1px; } .border-t-4 { border-top-width: 4px; } .border-t-\[1px\] { border-top-width: 1px; } .border-solid { border-style: solid; } .border-dashed { border-style: dashed; } .\!border-none { border-style: none !important; } .border-none { border-style: none; } .border-\[\#15806E\] { --tw-border-opacity: 1; border-color: rgb(21 128 110 / var(--tw-border-opacity)); } .border-\[\#D9F99D\] { --tw-border-opacity: 1; border-color: rgb(217 249 157 / var(--tw-border-opacity)); } .border-\[\#e4e8ed\] { --tw-border-opacity: 1; border-color: rgb(228 232 237 / var(--tw-border-opacity)); } .border-alpha-black-100 { border-color: rgba(0, 0, 0, 0.12);; } .border-alpha-black-200 { border-color: rgba(0, 0, 0, 0.20);; } .border-alpha-black-300 { border-color: rgba(0, 0, 0, 0.30);; } .border-alpha-black-50 { border-color: rgba(0, 0, 0, 0.05);; } .border-blue-100 { --tw-border-opacity: 1; border-color: rgb(204 222 255 / var(--tw-border-opacity)); } .border-blue-400 { --tw-border-opacity: 1; border-color: rgb(73 141 224 / var(--tw-border-opacity)); } .border-blue-500 { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .border-blue-600 { --tw-border-opacity: 1; border-color: rgb(44 88 143 / var(--tw-border-opacity)); } .border-border-default { border-color: var(--border-default); } .border-cash-300 { --tw-border-opacity: 1; border-color: rgb(157 176 156 / var(--tw-border-opacity)); } .border-cyan-800 { --tw-border-opacity: 1; border-color: rgb(12 56 66 / var(--tw-border-opacity)); } .border-gray-100 { --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); } .border-gray-200 { --tw-border-opacity: 1; border-color: rgb(197 196 191 / var(--tw-border-opacity)); } .border-gray-300 { --tw-border-opacity: 1; border-color: rgb(170 169 164 / var(--tw-border-opacity)); } .border-gray-50 { --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); } .border-gray-500 { --tw-border-opacity: 1; border-color: rgb(114 114 114 / var(--tw-border-opacity)); } .border-gray-700 { --tw-border-opacity: 1; border-color: rgb(68 68 68 / var(--tw-border-opacity)); } .border-green-100 { --tw-border-opacity: 1; border-color: rgb(190 230 213 / var(--tw-border-opacity)); } .border-green-200 { --tw-border-opacity: 1; border-color: rgb(156 210 187 / var(--tw-border-opacity)); } .border-green-400 { --tw-border-opacity: 1; border-color: rgb(64 157 124 / var(--tw-border-opacity)); } .border-green-500 { --tw-border-opacity: 1; border-color: rgb(0 128 96 / var(--tw-border-opacity)); } .border-green-600 { --tw-border-opacity: 1; border-color: rgb(0 100 82 / var(--tw-border-opacity)); } .border-green-700 { --tw-border-opacity: 1; border-color: rgb(0 71 60 / var(--tw-border-opacity)); } .border-orange-100 { --tw-border-opacity: 1; border-color: rgb(255 213 199 / var(--tw-border-opacity)); } .border-orange-300 { --tw-border-opacity: 1; border-color: rgb(247 142 114 / var(--tw-border-opacity)); } .border-orange-400 { --tw-border-opacity: 1; border-color: rgb(224 107 79 / var(--tw-border-opacity)); } .border-purple-100 { --tw-border-opacity: 1; border-color: rgb(216 215 248 / var(--tw-border-opacity)); } .border-purple-500 { --tw-border-opacity: 1; border-color: rgb(112 97 194 / var(--tw-border-opacity)); } .border-purple-600 { --tw-border-opacity: 1; border-color: rgb(87 78 146 / var(--tw-border-opacity)); } .border-red-100 { --tw-border-opacity: 1; border-color: rgb(255 206 211 / var(--tw-border-opacity)); } .border-red-400 { --tw-border-opacity: 1; border-color: rgb(226 82 99 / var(--tw-border-opacity)); } .border-red-500 { --tw-border-opacity: 1; border-color: rgb(199 61 79 / var(--tw-border-opacity)); } .border-red-600 { --tw-border-opacity: 1; border-color: rgb(159 41 70 / var(--tw-border-opacity)); } .border-transparent { border-color: transparent; } .border-white\/10 { border-color: rgb(255 255 255 / 0.1); } .border-yellow-100 { --tw-border-opacity: 1; border-color: rgb(255 214 162 / var(--tw-border-opacity)); } .border-yellow-300 { --tw-border-opacity: 1; border-color: rgb(232 164 66 / var(--tw-border-opacity)); } .border-yellow-50 { --tw-border-opacity: 1; border-color: rgb(255 235 213 / var(--tw-border-opacity)); } .border-t-gray-200 { --tw-border-opacity: 1; border-top-color: rgb(197 196 191 / var(--tw-border-opacity)); } .\!bg-button-background-disabled { background-color: var(--button-background-disabled) !important; } .\!bg-transparent { background-color: transparent !important; } .bg-\[\#15806E\] { --tw-bg-opacity: 1; background-color: rgb(21 128 110 / var(--tw-bg-opacity)); } .bg-\[\#B2ECA1\] { --tw-bg-opacity: 1; background-color: rgb(178 236 161 / var(--tw-bg-opacity)); } .bg-\[\#F1F4F4\] { --tw-bg-opacity: 1; background-color: rgb(241 244 244 / var(--tw-bg-opacity)); } .bg-\[\#F6F6F2\] { --tw-bg-opacity: 1; background-color: rgb(246 246 242 / var(--tw-bg-opacity)); } .bg-\[\#FAFAF9\] { --tw-bg-opacity: 1; background-color: rgb(250 250 249 / var(--tw-bg-opacity)); } .bg-\[\#a4abad\] { --tw-bg-opacity: 1; background-color: rgb(164 171 173 / var(--tw-bg-opacity)); } .bg-alpha-black-50 { background-color: rgba(0, 0, 0, 0.05);; } .bg-background-dark { background-color: var(--background-dark); } .bg-background-default { background-color: var(--background-default); } .bg-background-light { background-color: var(--background-light); } .bg-black\/20 { background-color: rgb(0 0 0 / 0.2); } .bg-blue-100 { --tw-bg-opacity: 1; background-color: rgb(204 222 255 / var(--tw-bg-opacity)); } .bg-blue-25 { --tw-bg-opacity: 1; background-color: rgb(242 247 255 / var(--tw-bg-opacity)); } .bg-blue-50 { --tw-bg-opacity: 1; background-color: rgb(234 241 255 / var(--tw-bg-opacity)); } .bg-blue-500 { --tw-bg-opacity: 1; background-color: rgb(56 111 177 / var(--tw-bg-opacity)); } .bg-button-background-default { background-color: var(--button-background-default); } .bg-cash-25 { --tw-bg-opacity: 1; background-color: rgb(243 248 243 / var(--tw-bg-opacity)); } .bg-categorical-1 { --tw-bg-opacity: 1; background-color: rgb(0 119 136 / var(--tw-bg-opacity)); } .bg-categorical-2 { --tw-bg-opacity: 1; background-color: rgb(137 198 198 / var(--tw-bg-opacity)); } .bg-categorical-3 { --tw-bg-opacity: 1; background-color: rgb(109 60 124 / var(--tw-bg-opacity)); } .bg-categorical-4 { --tw-bg-opacity: 1; background-color: rgb(116 121 230 / var(--tw-bg-opacity)); } .bg-cyan-600 { --tw-bg-opacity: 1; background-color: rgb(0 96 112 / var(--tw-bg-opacity)); } .bg-cyan-900 { --tw-bg-opacity: 1; background-color: rgb(7 39 47 / var(--tw-bg-opacity)); } .bg-gray-100 { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .bg-gray-200 { --tw-bg-opacity: 1; background-color: rgb(197 196 191 / var(--tw-bg-opacity)); } .bg-gray-25 { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .bg-gray-400 { --tw-bg-opacity: 1; background-color: rgb(138 137 133 / var(--tw-bg-opacity)); } .bg-gray-50 { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .bg-gray-500 { --tw-bg-opacity: 1; background-color: rgb(114 114 114 / var(--tw-bg-opacity)); } .bg-gray-700 { --tw-bg-opacity: 1; background-color: rgb(68 68 68 / var(--tw-bg-opacity)); } .bg-gray-800 { --tw-bg-opacity: 1; background-color: rgb(48 48 48 / var(--tw-bg-opacity)); } .bg-gray-900 { --tw-bg-opacity: 1; background-color: rgb(34 34 34 / var(--tw-bg-opacity)); } .bg-green-100 { --tw-bg-opacity: 1; background-color: rgb(190 230 213 / var(--tw-bg-opacity)); } .bg-green-25 { --tw-bg-opacity: 1; background-color: rgb(240 248 245 / var(--tw-bg-opacity)); } .bg-green-400 { --tw-bg-opacity: 1; background-color: rgb(64 157 124 / var(--tw-bg-opacity)); } .bg-green-50 { --tw-bg-opacity: 1; background-color: rgb(228 243 236 / var(--tw-bg-opacity)); } .bg-green-500 { --tw-bg-opacity: 1; background-color: rgb(0 128 96 / var(--tw-bg-opacity)); } .bg-green-700 { --tw-bg-opacity: 1; background-color: rgb(0 71 60 / var(--tw-bg-opacity)); } .bg-green-800 { --tw-bg-opacity: 1; background-color: rgb(19 58 51 / var(--tw-bg-opacity)); } .bg-mist-100 { --tw-bg-opacity: 1; background-color: rgb(207 224 224 / var(--tw-bg-opacity)); } .bg-mist-700 { --tw-bg-opacity: 1; background-color: rgb(48 74 74 / var(--tw-bg-opacity)); } .bg-orange-100 { --tw-bg-opacity: 1; background-color: rgb(255 213 199 / var(--tw-bg-opacity)); } .bg-orange-300 { --tw-bg-opacity: 1; background-color: rgb(247 142 114 / var(--tw-bg-opacity)); } .bg-orange-400 { --tw-bg-opacity: 1; background-color: rgb(224 107 79 / var(--tw-bg-opacity)); } .bg-orange-50 { --tw-bg-opacity: 1; background-color: rgb(255 237 231 / var(--tw-bg-opacity)); } .bg-purple-100 { --tw-bg-opacity: 1; background-color: rgb(216 215 248 / var(--tw-bg-opacity)); } .bg-purple-25 { --tw-bg-opacity: 1; background-color: rgb(246 246 255 / var(--tw-bg-opacity)); } .bg-purple-400 { --tw-bg-opacity: 1; background-color: rgb(140 126 226 / var(--tw-bg-opacity)); } .bg-purple-50 { --tw-bg-opacity: 1; background-color: rgb(240 239 255 / var(--tw-bg-opacity)); } .bg-purple-500 { --tw-bg-opacity: 1; background-color: rgb(112 97 194 / var(--tw-bg-opacity)); } .bg-red-100 { --tw-bg-opacity: 1; background-color: rgb(255 206 211 / var(--tw-bg-opacity)); } .bg-red-25 { --tw-bg-opacity: 1; background-color: rgb(255 244 246 / var(--tw-bg-opacity)); } .bg-red-400 { --tw-bg-opacity: 1; background-color: rgb(226 82 99 / var(--tw-bg-opacity)); } .bg-red-50 { --tw-bg-opacity: 1; background-color: rgb(255 232 236 / var(--tw-bg-opacity)); } .bg-red-500 { --tw-bg-opacity: 1; background-color: rgb(199 61 79 / var(--tw-bg-opacity)); } .bg-transparent { background-color: transparent; } .bg-violet-25 { --tw-bg-opacity: 1; background-color: rgb(252 244 250 / var(--tw-bg-opacity)); } .bg-violet-50 { --tw-bg-opacity: 1; background-color: rgb(250 236 246 / var(--tw-bg-opacity)); } .bg-white { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } .bg-yellow-100 { --tw-bg-opacity: 1; background-color: rgb(255 214 162 / var(--tw-bg-opacity)); } .bg-yellow-25 { --tw-bg-opacity: 1; background-color: rgb(255 245 234 / var(--tw-bg-opacity)); } .bg-yellow-300 { --tw-bg-opacity: 1; background-color: rgb(232 164 66 / var(--tw-bg-opacity)); } .bg-yellow-50 { --tw-bg-opacity: 1; background-color: rgb(255 235 213 / var(--tw-bg-opacity)); } .bg-opacity-0 { --tw-bg-opacity: 0; } .bg-opacity-70 { --tw-bg-opacity: 0.7; } .bg-gradient-to-b { background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); } .bg-gradient-to-t { background-image: linear-gradient(to top, var(--tw-gradient-stops)); } .from-white\/10 { --tw-gradient-from: rgb(255 255 255 / 0.1) var(--tw-gradient-from-position); --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); } .from-white\/80 { --tw-gradient-from: rgb(255 255 255 / 0.8) var(--tw-gradient-from-position); --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); } .via-white\/40 { --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / 0.4) var(--tw-gradient-via-position), var(--tw-gradient-to); } .via-white\/70 { --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / 0.7) var(--tw-gradient-via-position), var(--tw-gradient-to); } .to-white { --tw-gradient-to: #FFFFFF var(--tw-gradient-to-position); } .to-white\/10 { --tw-gradient-to: rgb(255 255 255 / 0.1) var(--tw-gradient-to-position); } .bg-cover { background-size: cover; } .fill-gray-700 { fill: #444444; } .\!p-0 { padding: 0px !important; } .p-0 { padding: 0px; } .p-0\.5 { padding: 0.125rem; } .p-1 { padding: 0.25rem; } .p-10 { padding: 2.5rem; } .p-2 { padding: 0.5rem; } .p-3 { padding: 0.75rem; } .p-4 { padding: 1rem; } .p-5 { padding: 1.25rem; } .p-6 { padding: 1.5rem; } .p-8 { padding: 2rem; } .\!px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .\!py-0 { padding-top: 0px !important; padding-bottom: 0px !important; } .\!py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .\!py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .\!py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .\!py-3\.5 { padding-top: 0.875rem !important; padding-bottom: 0.875rem !important; } .px-0 { padding-left: 0px; padding-right: 0px; } .px-1 { padding-left: 0.25rem; padding-right: 0.25rem; } .px-1\.5 { padding-left: 0.375rem; padding-right: 0.375rem; } .px-10 { padding-left: 2.5rem; padding-right: 2.5rem; } .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; } .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; } .px-4 { padding-left: 1rem; padding-right: 1rem; } .px-5 { padding-left: 1.25rem; padding-right: 1.25rem; } .px-6 { padding-left: 1.5rem; padding-right: 1.5rem; } .px-8 { padding-left: 2rem; padding-right: 2rem; } .px-s { padding-left: 8px; padding-right: 8px; } .py-0 { padding-top: 0px; padding-bottom: 0px; } .py-0\.5 { padding-top: 0.125rem; padding-bottom: 0.125rem; } .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; } .py-1\.5 { padding-top: 0.375rem; padding-bottom: 0.375rem; } .py-12 { padding-top: 3rem; padding-bottom: 3rem; } .py-14 { padding-top: 3.5rem; padding-bottom: 3.5rem; } .py-16 { padding-top: 4rem; padding-bottom: 4rem; } .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; } .py-2\.5 { padding-top: 0.625rem; padding-bottom: 0.625rem; } .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; } .py-3\.5 { padding-top: 0.875rem; padding-bottom: 0.875rem; } .py-4 { padding-top: 1rem; padding-bottom: 1rem; } .py-5 { padding-top: 1.25rem; padding-bottom: 1.25rem; } .py-6 { padding-top: 1.5rem; padding-bottom: 1.5rem; } .py-8 { padding-top: 2rem; padding-bottom: 2rem; } .py-m { padding-top: 16px; padding-bottom: 16px; } .py-px { padding-top: 1px; padding-bottom: 1px; } .\!pb-0 { padding-bottom: 0px !important; } .\!pb-6 { padding-bottom: 1.5rem !important; } .pb-0 { padding-bottom: 0px; } .pb-0\.5 { padding-bottom: 0.125rem; } .pb-1 { padding-bottom: 0.25rem; } .pb-10 { padding-bottom: 2.5rem; } .pb-11 { padding-bottom: 2.75rem; } .pb-2 { padding-bottom: 0.5rem; } .pb-2\.5 { padding-bottom: 0.625rem; } .pb-20 { padding-bottom: 5rem; } .pb-3 { padding-bottom: 0.75rem; } .pb-4 { padding-bottom: 1rem; } .pb-5 { padding-bottom: 1.25rem; } .pb-6 { padding-bottom: 1.5rem; } .pb-7 { padding-bottom: 1.75rem; } .pb-8 { padding-bottom: 2rem; } .pl-0 { padding-left: 0px; } .pl-1 { padding-left: 0.25rem; } .pl-10 { padding-left: 2.5rem; } .pl-12 { padding-left: 3rem; } .pl-2 { padding-left: 0.5rem; } .pl-3 { padding-left: 0.75rem; } .pl-4 { padding-left: 1rem; } .pl-5 { padding-left: 1.25rem; } .pl-6 { padding-left: 1.5rem; } .pl-7 { padding-left: 1.75rem; } .pl-8 { padding-left: 2rem; } .pl-9 { padding-left: 2.25rem; } .pl-\[3px\] { padding-left: 3px; } .pr-0 { padding-right: 0px; } .pr-1 { padding-right: 0.25rem; } .pr-1\.5 { padding-right: 0.375rem; } .pr-2 { padding-right: 0.5rem; } .pr-20 { padding-right: 5rem; } .pr-3 { padding-right: 0.75rem; } .pr-4 { padding-right: 1rem; } .pr-6 { padding-right: 1.5rem; } .pr-8 { padding-right: 2rem; } .pt-0 { padding-top: 0px; } .pt-0\.5 { padding-top: 0.125rem; } .pt-1 { padding-top: 0.25rem; } .pt-10 { padding-top: 2.5rem; } .pt-16 { padding-top: 4rem; } .pt-2 { padding-top: 0.5rem; } .pt-2\.5 { padding-top: 0.625rem; } .pt-24 { padding-top: 6rem; } .pt-3 { padding-top: 0.75rem; } .pt-3\.5 { padding-top: 0.875rem; } .pt-4 { padding-top: 1rem; } .pt-5 { padding-top: 1.25rem; } .pt-6 { padding-top: 1.5rem; } .pt-8 { padding-top: 2rem; } .pt-9 { padding-top: 2.25rem; } .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; } .align-baseline { vertical-align: baseline; } .align-middle { vertical-align: middle; } .align-text-top { vertical-align: text-top; } .font-mono { font-family: jetbrains-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } .text-2xl { font-size: 32px; line-height: 40px; letter-spacing: -0.5px; font-weight: 500; } .text-3xl { font-size: 36px; line-height: 42px; letter-spacing: -0.5px; font-weight: 500; } .text-4xl { font-size: 40px; line-height: 44px; letter-spacing: -0.5px; font-weight: 500; } .text-\[10px\] { font-size: 10px; } .text-base { font-size: 16px; line-height: 24px; } .text-lg { font-size: 20px; line-height: 32px; font-weight: 500; } .text-sm { font-size: 14px; line-height: 20px; } .text-xl { font-size: 24px; line-height: 32px; font-weight: 500; } .text-xs { font-size: 12px; line-height: 16px; } .text-xxs { font-size: 10px; line-height: 14px; letter-spacing: 0.1px; } .font-bold { font-weight: 700; } .font-medium { font-weight: 500; } .font-normal { font-weight: 400; } .uppercase { text-transform: uppercase; } .lowercase { text-transform: lowercase; } .capitalize { text-transform: capitalize; } .italic { font-style: italic; } .\!text-gray-100 { --tw-text-opacity: 1 !important; color: rgb(222 221 215 / var(--tw-text-opacity)) !important; } .\!text-text-disabled { color: var(--text-disabled) !important; } .text-\[\#a6adb6\] { --tw-text-opacity: 1; color: rgb(166 173 182 / var(--tw-text-opacity)); } .text-alpha-black-100 { color: rgba(0, 0, 0, 0.12);; } .text-black { --tw-text-opacity: 1; color: rgb(0 0 0 / var(--tw-text-opacity)); } .text-blue-300 { --tw-text-opacity: 1; color: rgb(118 171 245 / var(--tw-text-opacity)); } .text-blue-400 { --tw-text-opacity: 1; color: rgb(73 141 224 / var(--tw-text-opacity)); } .text-blue-500 { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); } .text-blue-600 { --tw-text-opacity: 1; color: rgb(44 88 143 / var(--tw-text-opacity)); } .text-blue-700 { --tw-text-opacity: 1; color: rgb(32 69 113 / var(--tw-text-opacity)); } .text-blue-800 { --tw-text-opacity: 1; color: rgb(21 49 82 / var(--tw-text-opacity)); } .text-cyan-600 { --tw-text-opacity: 1; color: rgb(0 96 112 / var(--tw-text-opacity)); } .text-gray-100 { --tw-text-opacity: 1; color: rgb(222 221 215 / var(--tw-text-opacity)); } .text-gray-200 { --tw-text-opacity: 1; color: rgb(197 196 191 / var(--tw-text-opacity)); } .text-gray-25 { --tw-text-opacity: 1; color: rgb(247 247 246 / var(--tw-text-opacity)); } .text-gray-300 { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .text-gray-400 { --tw-text-opacity: 1; color: rgb(138 137 133 / var(--tw-text-opacity)); } .text-gray-500 { --tw-text-opacity: 1; color: rgb(114 114 114 / var(--tw-text-opacity)); } .text-gray-50a { --tw-text-opacity: 1; color: rgb(246 246 242 / var(--tw-text-opacity)); } .text-gray-600 { --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .text-gray-700 { --tw-text-opacity: 1; color: rgb(68 68 68 / var(--tw-text-opacity)); } .text-gray-800 { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .text-gray-900 { --tw-text-opacity: 1; color: rgb(34 34 34 / var(--tw-text-opacity)); } .text-green-100 { --tw-text-opacity: 1; color: rgb(190 230 213 / var(--tw-text-opacity)); } .text-green-300 { --tw-text-opacity: 1; color: rgb(113 182 154 / var(--tw-text-opacity)); } .text-green-400 { --tw-text-opacity: 1; color: rgb(64 157 124 / var(--tw-text-opacity)); } .text-green-50 { --tw-text-opacity: 1; color: rgb(228 243 236 / var(--tw-text-opacity)); } .text-green-500 { --tw-text-opacity: 1; color: rgb(0 128 96 / var(--tw-text-opacity)); } .text-green-600 { --tw-text-opacity: 1; color: rgb(0 100 82 / var(--tw-text-opacity)); } .text-green-700 { --tw-text-opacity: 1; color: rgb(0 71 60 / var(--tw-text-opacity)); } .text-green-800 { --tw-text-opacity: 1; color: rgb(19 58 51 / var(--tw-text-opacity)); } .text-orange-300 { --tw-text-opacity: 1; color: rgb(247 142 114 / var(--tw-text-opacity)); } .text-orange-300a { --tw-text-opacity: 1; color: rgb(255 123 64 / var(--tw-text-opacity)); } .text-orange-500 { --tw-text-opacity: 1; color: rgb(191 78 54 / var(--tw-text-opacity)); } .text-orange-600 { --tw-text-opacity: 1; color: rgb(144 62 40 / var(--tw-text-opacity)); } .text-orange-700 { --tw-text-opacity: 1; color: rgb(113 48 34 / var(--tw-text-opacity)); } .text-orange-800 { --tw-text-opacity: 1; color: rgb(81 33 21 / var(--tw-text-opacity)); } .text-purple-400 { --tw-text-opacity: 1; color: rgb(140 126 226 / var(--tw-text-opacity)); } .text-purple-700 { --tw-text-opacity: 1; color: rgb(66 59 114 / var(--tw-text-opacity)); } .text-purple-800 { --tw-text-opacity: 1; color: rgb(48 43 85 / var(--tw-text-opacity)); } .text-red-400 { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .text-red-500 { --tw-text-opacity: 1; color: rgb(199 61 79 / var(--tw-text-opacity)); } .text-red-600 { --tw-text-opacity: 1; color: rgb(159 41 70 / var(--tw-text-opacity)); } .text-red-700 { --tw-text-opacity: 1; color: rgb(124 27 61 / var(--tw-text-opacity)); } .text-red-800 { --tw-text-opacity: 1; color: rgb(95 15 46 / var(--tw-text-opacity)); } .text-text-critical { color: var(--text-critical); } .text-text-default { color: var(--text-default); } .text-text-disabled { color: var(--text-disabled); } .text-text-muted { color: var(--text-muted); } .text-violet-300 { --tw-text-opacity: 1; color: rgb(197 159 183 / var(--tw-text-opacity)); } .text-white { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); } .text-yellow-300 { --tw-text-opacity: 1; color: rgb(232 164 66 / var(--tw-text-opacity)); } .text-yellow-400 { --tw-text-opacity: 1; color: rgb(198 131 63 / var(--tw-text-opacity)); } .text-yellow-600 { --tw-text-opacity: 1; color: rgb(114 79 59 / var(--tw-text-opacity)); } .text-yellow-700 { --tw-text-opacity: 1; color: rgb(88 62 50 / var(--tw-text-opacity)); } .text-yellow-800 { --tw-text-opacity: 1; color: rgb(63 46 40 / var(--tw-text-opacity)); } .underline { text-decoration-line: underline; } .no-underline { text-decoration-line: none; } .placeholder-gray-400::placeholder { --tw-placeholder-opacity: 1; color: rgb(138 137 133 / var(--tw-placeholder-opacity)); } .placeholder-gray-500::placeholder { --tw-placeholder-opacity: 1; color: rgb(114 114 114 / var(--tw-placeholder-opacity)); } .placeholder-gray-600::placeholder { --tw-placeholder-opacity: 1; color: rgb(87 87 87 / var(--tw-placeholder-opacity)); } .opacity-0 { opacity: 0; } .opacity-100 { opacity: 1; } .opacity-30 { opacity: 0.3; } .shadow { --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-2xl { --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-\[0_2px_10px_5px_rgba\(0\2c 0\2c 0\2c 0\.10\)\] { --tw-shadow: 0 2px 10px 5px rgba(0,0,0,0.10); --tw-shadow-colored: 0 2px 10px 5px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-lg { --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-md { --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-sm { --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .outline-none { outline: 2px solid transparent; outline-offset: 2px; } .outline { outline-style: solid; } .outline-2 { outline-width: 2px; } .outline-green-500 { outline-color: #008060; } .outline-purple-600 { outline-color: #574E92; } .blur { --tw-blur: blur(8px); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .drop-shadow-md { --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .drop-shadow-xl { --tw-drop-shadow: drop-shadow(0 20px 13px rgb(0 0 0 / 0.03)) drop-shadow(0 8px 5px rgb(0 0 0 / 0.08)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .\!filter { filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important; } .filter { filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .transition { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } .transition-opacity { transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } .duration-100 { transition-duration: 100ms; } .duration-150 { transition-duration: 150ms; } .duration-200 { transition-duration: 200ms; } .duration-75 { transition-duration: 75ms; } .ease-in-out { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } .ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); } html#modern-treasury-application { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} a { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); transition-property: none; } code { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .thin-scrollbar{scrollbar-color:#3f4344;scrollbar-width:thin} .thin-scrollbar::-webkit-scrollbar { width: 0.25rem; } .thin-scrollbar::-webkit-scrollbar-track { --tw-bg-opacity: 1; background-color: rgb(68 68 68 / var(--tw-bg-opacity)); } .thin-scrollbar::-webkit-scrollbar-thumb { --tw-bg-opacity: 1; background-color: rgb(114 114 114 / var(--tw-bg-opacity)); } .no-scrollbar::-webkit-scrollbar{display:none} #auth-root .application-content{padding:0;margin:0;display:flex;align-items:center;justify-content:center;flex-direction:column} #auth-root .auth-form{padding:36px 0 48px 0;border-radius:4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.07);display:flex;align-items:center;justify-content:center;flex-direction:column;width:353px;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} #auth-root .auth-form .form-group{width:285px} #auth-root .auth-form .btn-submit{width:285px} #auth-root .auth-form .reset-link{margin-top:16px;font-size:13px;font-weight:500;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} #auth-root .auth-form .auth-error{width:285px;font-size:13px;font-weight:500;margin-top:16px;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} #auth-root .auth-form .auth-prompt{font-size:15px;font-weight:500;margin-bottom:16px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} #auth-root .form-row-password-requirement{margin-bottom:8px;align-items:center;font-size:15px} #auth-root .form-row-password-requirement:last-child{margin-bottom:16px} #auth-root .form-row-password-requirement svg+div{margin-left:8px} #auth-root .form-row-password-requirement .password-requirement-unmet { --tw-text-opacity: 1; color: rgb(197 196 191 / var(--tw-text-opacity)); } .btn-inline{display:inline} .btn{white-space:nowrap} .btn-action{padding:10px 20px;height:38px;border-radius:4px;border:none;font-weight:500;font-size:13px;line-height:18px;box-shadow:none !important;--tw-bg-opacity: 1;background-color: rgb(47 152 174 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .btn-action.btn-disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .btn-action.btn-disabled:hover{cursor:pointer;--tw-bg-opacity: 1;background-color: rgb(242 241 237 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .btn-action svg{margin-right:10px;fill: #F7F7F6} .btn-action:hover{cursor:pointer;--tw-bg-opacity: 1;background-color: rgb(56 111 177 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .btn-action.btn-index-action{margin-top:24px;margin-bottom:1px} .btn-action.btn-danger { --tw-bg-opacity: 1; background-color: rgb(226 82 99 / var(--tw-bg-opacity)); } .btn-action+.btn-secondary-action{margin-left:16px} .btn-secondary-action{border-radius:4px;height:38px;line-height:18px;padding:10px 20px;font-weight:500;font-size:13px;box-shadow:none !important;transition:none;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .btn-secondary-action svg { fill: #AAA9A4; } .btn-secondary-action svg+span{margin-left:8px} .btn-secondary-action:hover { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .btn-secondary-action:hover svg { fill: #303030; } .btn-secondary-action.secondary-action-with-icon{padding:0 16px} .selectbar{width:100%} .selectbar.selectbar-dark button.btn-selected { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .selectbar button{font-size:13px;font-weight:500;line-height:18px;padding:9px 0;flex:1 1 !important;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .selectbar button:focus { --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); --tw-shadow-color: #DEDDD7; --tw-shadow: var(--tw-shadow-colored); } .selectbar button:first-child{border-radius:4px 0 0 4px} .selectbar button:last-child{border-radius:0 4px 4px 0} .selectbar button.btn-selected { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .selectbar.selectbar-error { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .selectbar.selectbar-error button { --tw-border-opacity: 1; border-color: rgb(226 82 99 / var(--tw-border-opacity)); --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .btn-link-unpadded{padding:0} .btn-white{border-radius:4px;font-size:13px;font-weight:500;line-height:18px;height:38px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .btn-white svg{margin-right:9.75px} .btn-white:hover { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .btn-white-action{border-radius:4px;font-size:12px;font-weight:500;height:32px;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(197 196 191 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(21 49 82 / var(--tw-text-opacity))} .btn-white-action:hover,.btn-white-action:focus{outline:none;box-shadow:none} .btn-link{border:none;padding:0;font-size:12px;font-weight:500;line-height:16px;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} .btn-link:hover { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); } .dashboard-widget-container.reconciled-volume .recharts-cartesian-grid-horizontal line:first-child{stroke:none} .dashboard-widget-container.reconciled-volume .recharts-yAxis .recharts-cartesian-axis-tick-value tspan{font-weight:500} .dashboard-widget-container.reconciled-volume .recharts-yAxis .recharts-cartesian-axis-tick:first-child text{font-size:0} .dashboard-widget-container.reconciled-volume .recharts-yAxis .recharts-cartesian-axis-tick:first-child line{stroke:none} .dashboard-widget-container.reconciled-volume .recharts-xAxis .recharts-cartesian-axis-tick-value tspan{font-size:10px} .dashboard-widget-container.reconciled-volume .recharts-legend-item{line-height:22px;margin-top:10px} .dashboard-widget-container.reconciled-volume .resizing-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:225px !important} .dashboard-widget-container.reconciled-volume .header-container{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap;align-items:center;margin:-25px 0 20px 0} .dashboard-widget-container.reconciled-volume .header-container .header{white-space:nowrap;font-weight:500;margin-right:15px} .dashboard-widget-container.reconciled-volume .header-container .selectors-container{display:flex;flex-direction:row;justify-content:space-between;min-width:320px} .dashboard-widget-container.reconciled-volume .header-container .selectors-container>*{width:155px} .dashboard-widget-container.reconciled-volume .header-container>*{margin-top:25px} .dashboard-widget-container.todays-tasks .header-container{display:flex;flex-direction:row;justify-content:space-between} .dashboard-widget-container.todays-tasks .header-container .header{white-space:nowrap;margin-bottom:20px;font-weight:500} .dashboard-widget-container.todays-tasks .info-text{margin-right:6px;font-size: 12px;line-height: 16px;font-weight: 500;--tw-text-opacity: 1;color: rgb(138 137 133 / var(--tw-text-opacity))} .dashboard-widget-container.todays-tasks .big-info-text { font-size: 16px; line-height: 24px; font-weight: 500; --tw-text-opacity: 1; color: rgb(138 137 133 / var(--tw-text-opacity)); } .dashboard-widget-container.todays-tasks .todos-body{display:flex;flex-direction:column;justify-content:space-evenly;align-items:center} .dashboard-widget-container.todays-tasks .todos-body>*{margin:7.5px 0 7.5px 0} .dashboard-widget-container.todays-tasks .table-body .index-table-row { border-top-width: 1px; --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); } .dashboard-widget-container.todays-tasks .table-body .index-table-row:last-child{margin-bottom:-16.5px} .dashboard-widget-container.todays-tasks .table-entry{display:flex;flex-direction:column;justify-content:center} .dashboard-widget-container.todays-tasks .task-row{display:flex;flex-direction:row;align-items:center} .dashboard-widget-container.todays-tasks .task-row a{font-weight:500;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} .dashboard-widget-container.todays-tasks .task-row>*{justify-content:center} .dashboard-widget-container.todays-tasks .task-row>*:first-child{margin-right:16px} .dashboard-widget-container.todays-tasks .task-row>*:not(:first-child){margin-right:4px} .dashboard-widget-container.key-metrics-view .header-container{display:flex;flex-direction:column;flex-wrap:wrap;margin:-25px 0 15px 0} .dashboard-widget-container.key-metrics-view .header-container .header{white-space:nowrap;font-weight:500} .dashboard-widget-container.key-metrics-view .header-container>*{margin-top:25px} .dashboard-widget-container.key-metrics-view .prefix{display:flex;flex-direction:row;justify-content:center;margin:-7px 0 5px 0;line-height:22px} .dashboard-widget-container.key-metrics-view .prefix>*:not(:first-child){margin-left:20px} .dashboard-widget-container.key-metrics-view .columns-widget { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; } .dashboard-widget-container.key-metrics-view .columns-widget .column { display: grid; grid-auto-flow: row; gap: 0.75rem; } .dashboard-widget-container.key-metrics-view .info-text { margin-bottom: 0.125rem; font-size: 10px; line-height: 14px; letter-spacing: 0.1px; text-transform: uppercase; --tw-text-opacity: 1; color: rgb(138 137 133 / var(--tw-text-opacity)); } .dashboard-widget-container.key-metrics-view .positive-indicator,.dashboard-widget-container.key-metrics-view .negative-indicator{display:flex;flex-direction:row;align-items:center} .dashboard-widget-container.key-metrics-view .indicator>*:not(:first-child){margin-left:6px} .dashboard-widget-container.key-metrics-view .positive-indicator { --tw-text-opacity: 1; color: rgb(64 157 124 / var(--tw-text-opacity)); } .dashboard-widget-container.key-metrics-view .negative-indicator { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .dashboard-widget-container.activity-feed{display:flex;flex-direction:column} .dashboard-widget-container.activity-feed .header{margin-bottom:19px;font-weight:500} .dashboard-widget-container.activity-feed .icon{align-self:baseline} .dashboard-widget-container.activity-feed a.btn{align-self:center} .dashboard-widget-container.activity-feed a{text-decoration:none} .dashboard-widget-container.activity-feed a .activity-row{white-space:normal;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .dashboard-widget-container.activity-feed a .activity-row .info-text{font-size:11px;line-height:13px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .dashboard-widget-container.activity-feed .activity-row>*{font-size:12px;line-height:15px} .dashboard-widget-container.activity-feed .activity-row>*:not(:first-child){margin-top:4px} .dashboard-widget-container.activity-feed .index-table .table-body{padding:12.5px 0 0 0;border-top-width: 1px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity))} .dashboard-widget-container.activity-feed .index-table .table-body .index-table-row:hover{border-radius:2px;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .dashboard-widget-container.activity-feed .index-table .table-body .index-table-row{border-top:0;align-items:center} .dashboard-widget-container.activity-feed .index-table .table-body .index-table-row .table-entry{padding:12.5px 0 12.5px 0} .dashboard-widget-container.activity-feed .index-table .table-body .index-table-row .table-entry-allow-overflow{word-wrap:break-word} .dashboard-widget-container { border-radius: 0.25rem; --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); padding-left: 1.5rem; padding-right: 1.5rem; padding-top: 1rem; padding-bottom: 1rem; } .dashboard-widget-container .spinner-container{min-height:200px;margin-left:45%;margin-top:20%} .dashboard-widget-container .react-select__menu,.dashboard-widget-container .react-select__menu-list,.dashboard-widget-container .react-select__option{width:155px} .dashboard-widget-container .account-select .react-select__menu,.dashboard-widget-container .account-select .react-select__menu-list,.dashboard-widget-container .account-select .react-select__option{width:240px} .document-section{margin:auto;margin-top:16px} .document-upload-container .loader{margin:.5rem 0 0 .5rem} .document-upload-container .pending-documents{margin:auto;max-width:1000px} .document-upload-container .pending-documents .subsection-header div:first-child{min-width:180px;max-width:180px} .document-upload-container .pending-documents .document-upload-row .form-text{min-width:180px;max-width:180px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .form-section{margin-bottom:16px} .form-section:last-child{margin-bottom:24px} .form-section h3 { margin-bottom: 1rem; border-bottom-width: 1px; --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); padding-bottom: 0.5rem; --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .form-section h3 span.addendum{padding-left:8px;font-size:11px;letter-spacing:1.25px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-section h3 div.header-hint{display:block;font-size:13px;font-weight:500;line-height:18px;margin-top:6px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-section h3 div.header-hint a { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); } .form-section h3.h3-no-bottom-border{border-bottom:0;padding-bottom:0} .form-section .form-row{justify-content:space-between} .form-section .form-row:last-child{margin-bottom:0} .form-section .form-delete-row{margin-top:1.5rem} .form-section .form-text{margin:0;font-size:14px;line-height:20px} .form-section .account-form-bordered input{border-radius:2px;min-width:280px;height:32px;padding-left:8px;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity))} .form-section .account-form-bordered input:focus { border-width: 1px; --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); --tw-shadow-color: #386FB1; --tw-shadow: var(--tw-shadow-colored); } .form-create{max-width:586px} .form-create .selectbar{width:100%} .form-create .form-row>div { min-width: 100%; max-width: 100%; flex-grow: 1; } @media (min-width: 768px) { .form-create .form-row>div { min-width: 48%; max-width: 48%; } } .form-create .form-row>div:not(:last-child){margin-right:16px} .form-create .form-row.form-row-full>div{min-width:100%;max-width:100%} .form-group{margin-bottom:0} .form-group .error-message{font-size:12px;margin-top:8px;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} .form-group .error-message+.btn-link{display:block} .form-group .character-limit{font-size:10px;font-weight:500;position:relative;left:95%;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-group .react-datepicker__input-container button span{font-weight:400 !important} .form-group .react-datepicker__header__dropdown>div{font-size:14px;border-radius:.125rem;border-width:1px;--tw-border-opacity: 1;border-color: rgb(197 196 191 / var(--tw-border-opacity))} .form-group .react-datepicker__header__dropdown>div>select{-webkit-appearance:none;appearance:none;padding:3px 24px 3px 6px;background:#fff url("data:image/svg+xml;utf8,") no-repeat;background-position:right 5px top 50%} .form-group .react-datepicker__header__dropdown>div>select:focus-visible{outline:0} .form-group .react-datepicker__navigation{margin-top:5px} .form-checkbox{margin-top:auto;margin-bottom:auto} .form-row{margin:0} .form-row .form-group{margin-bottom:16px} .react-autosuggest__container{position:relative} .react-autosuggest__input{border-radius:4px;box-sizing:content-box;height:1rem;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(197 196 191 / var(--tw-border-opacity))} .react-autosuggest__input--focused{outline:none} .react-autosuggest__input--open{border-bottom-left-radius:0;border-bottom-right-radius:0} .react-autosuggest__suggestions-container{display:none} .react-autosuggest__suggestions-container--open{display:block;position:absolute;top:39px;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px;z-index:2;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(197 196 191 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(255 255 255 / var(--tw-bg-opacity))} .react-autosuggest__suggestions-list{margin:0;padding:0;list-style-type:none} .react-autosuggest__suggestion{cursor:pointer;padding:10px 20px} .react-autosuggest__suggestion--highlighted { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .form-check-input{position:static;min-width:14px;min-height:14px;margin:0;border-width: 2px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .form-checkbox-container{display:flex;flex-direction:row} .form-check-label .form-label-container{margin-left:8px} .label-placeholder{height:26px} .many-action-button { height: 2rem; width: 2.5rem; border-radius: 0.25rem; border-width: 1px; --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); fill: #AAA9A4; --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .react-datepicker{font-family:inherit} .react-datepicker__input-container{display:flex} .react-datepicker__input-container .form-control{height:32px} .form-subsection{padding:16px;border-radius:4px;font-size:12px;font-weight:500;margin:0 -16px 16px -16px;--tw-bg-opacity: 1;background-color: rgb(240 248 250 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .form-subsection .form-subsection{padding:0;margin-left:0;margin-right:0} .form-subsection .subsection-header{font-size:13px;font-weight:500;line-height:18px;padding-bottom:18px;margin-bottom:16px;display:flex;flex-direction:row;border-bottom-width: 1px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity))} .form-subsection .subsection-header span.addendum{padding-left:8px;font-size:11px;letter-spacing:1.25px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-subsection .subsection-header>div{max-width:50%;flex-grow:1} .form-subsection .subsection-header>div:not(:last-child){margin-right:14px} .form-subsection .subsection-header>div.with-extra-space-for-button{margin-right:55px} .form-subsection .btn-subsection-top-margin{margin-top:16px} .form-subsection .subsection-row{display:flex;flex-direction:row;flex-wrap:wrap} .form-subsection .subsection-row:not(:last-child){margin-bottom:16px} .form-subsection .subsection-row .form-text{margin-top:auto;margin-bottom:auto} .form-subsection .subsection-row.subsection-row-with-action>div { min-width: 100%; max-width: 100%; } @media (min-width: 768px) { .form-subsection .subsection-row.subsection-row-with-action>div { min-width: 44%; max-width: 44%; } } .form-subsection .subsection-row>div { min-width: 100%; max-width: 100%; } @media (min-width: 768px) { .form-subsection .subsection-row>div { min-width: 48%; max-width: 48%; } } .form-subsection .subsection-row>div+.form-group { margin-top: 1rem; } @media (min-width: 768px) { .form-subsection .subsection-row>div+.form-group { margin-top: 0px; } } .form-subsection .subsection-row>div:not(:last-child){margin-right:14px} .form-subsection .subsection-row .btn-delete-row{border-radius:4px;border:none;margin-top:auto;height:38px;width:38px;--tw-bg-opacity: 1;background-color: rgb(230 243 247 / var(--tw-bg-opacity))} .form-primary-button { --tw-bg-opacity: 1; background-color: rgb(47 152 174 / var(--tw-bg-opacity)); --tw-text-opacity: 1; color: rgb(247 247 246 / var(--tw-text-opacity));border-radius:4px;padding:10px 20px;font-size:13px;line-height:18px;font-weight:500;margin-top:12px; } .form-primary-button:hover,.form-primary-button:focus { --tw-text-opacity: 1; color: rgb(247 247 246 / var(--tw-text-opacity)); } .form-control{font-size:13px;line-height:18px;font-weight:500;height:38px} .form-control.form-control-small-text{font-size:12px;line-height:16px} .form-control:focus { --tw-border-opacity: 1; border-color: rgb(47 152 174 / var(--tw-border-opacity));outline:none;box-shadow:none; } .form-control:disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .form-control-error { --tw-border-opacity: 1; border-color: rgb(226 82 99 / var(--tw-border-opacity)); } .form-control-error .react-select__control { --tw-border-opacity: 1; border-color: rgb(199 61 79 / var(--tw-border-opacity)); } .help-text{margin-top:10px;font-size:12px} textarea.form-control{height:38px} .react-datepicker-wrapper{width:100%} .react-datepicker__current-month{display:none} .tooltip-holder{margin-left:6px;margin-bottom:3px} .__react_component_tooltip { --tw-bg-opacity: 1; background-color: rgb(48 48 48 / var(--tw-bg-opacity)); } .__react_component_tooltip .multi-line{text-align:left;font-size:12px;line-height:18px;--tw-text-opacity: 1;color: rgb(242 241 237 / var(--tw-text-opacity))} .modal-form { position: fixed; left: 25%; top: 25%; display: flex; --tw-translate-x: -25%; --tw-translate-y: -25%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); flex-direction: column; --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); padding-left: 1.75rem; padding-right: 1.75rem; padding-top: 2.5rem; padding-bottom: 2.5rem; outline: 2px solid transparent; outline-offset: 2px; } @media (min-width: 768px) { .modal-form { left: 50%; top: 50%; --tw-translate-x: -50%; --tw-translate-y: -50%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } } .modal-form .modal-form-body { min-width: 100%; max-width: 100%; } @media (min-width: 768px) { .modal-form .modal-form-body { min-width: 586px; max-width: 586px; } } .modal-form .modal-form-headline{display:flex;flex-direction:row;justify-content:space-between;margin-bottom:24px;line-height:33px} .modal-form .modal-form-headline h3{font-weight:400;font-size:24px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .modal-form .modal-form-headline .modal-form-exit-contents{display:flex;flex-direction:column;align-items:center;font-weight:500;font-size:12px;background:none;border:none;outline:none;--tw-text-opacity: 1;color: rgb(197 196 191 / var(--tw-text-opacity))} .modal-form .modal-form-headline .modal-form-exit-contents span { --tw-text-opacity: 1; color: rgb(197 196 191 / var(--tw-text-opacity)); } .modal-form .modal-form-headline .modal-form-exit-contents:hover{cursor:pointer} .modal-form-overlay{background:rgba(248,248,248,.6);position:fixed;top:0;left:0;right:0;bottom:0} .ReactModal__Body--open{overflow:hidden} .currency-select .react-select__control{border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-right-radius:0;height: 2rem;min-height: 0px;border-width: 1px;border-color: var(--border-default)} .currency-select .react-select__control.react-select__control--is-focused { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); text-decoration-line: none; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); outline: 2px solid transparent; outline-offset: 2px; } .currency-select .react-select__control.react-select__control--is-disabled { background-color: var(--button-background-disabled); } .currency-select .react-select__control .react-select__single-value { color: var(--text-default); } .currency-select .react-select__control.react-select__single-value--is-disabled { color: var(--text-muted); } .currency-select .react-select__menu .react-select__option { font-size: 14px; line-height: 20px; font-weight: 500; color: var(--text-muted); } .currency-select .react-select__menu .react-select__option.react-select__option--is-focused { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); color: var(--text-default); } .currency-select .react-select__menu .react-select__option.react-select__option--is-selected { --tw-bg-opacity: 1; background-color: rgb(0 96 112 / var(--tw-bg-opacity)); --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); } .currency-select .react-select__clear-indicator { display: flex; align-items: center; justify-content: center; padding: 0px; } .currency-select .react-select__clear-indicator svg path { fill: currentColor; } .currency-select .react-select__indicator.react-select__dropdown-indicator { padding: 0px; padding-right: 0.25rem; } .currency-select .react-select__value-container { margin-top: -1px; margin-bottom: -1px; height: 2rem; padding-top: 0px; padding-bottom: 0px; } .currency-select .react-select__value-container.react-select__value-container--is-multi { margin-top: 0px; margin-bottom: 0px; height: 100%; padding-top: 1px; padding-bottom: 1px; } .currency-select .react-select__value-container.react-select__value-container--has-value { border-color: var(--border-default); padding-left: 0.5rem; } .currency-select .react-select__value-container.react-select__value-container--has-value .react-select__single-value { color: var(--text-default); } .currency-select .react-select__value-container.react-select__value-container--has-value .react-select__single-value--is-disabled { color: var(--text-muted); } .react-select__multi-value { --tw-bg-opacity: 1 !important; background-color: rgb(242 241 237 / var(--tw-bg-opacity)) !important; } .overlapping-grid-areas{grid-area:1/1/1/1} .application-content-body{display:flex;justify-content:center;align-items:center;flex-direction:column;flex-grow:1} .application-content-body .content-section{margin-bottom:2rem;word-wrap:break-word;width: 100%;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));padding: 1rem} @media (min-width: 768px) { .application-content-body .content-section { width: 75%; padding: 1.5rem; } } @media (min-width: 1024px) { .application-content-body .content-section { width: 50%; padding: 2rem; } } .application-content-body .content-section h3{font-size:1rem;font-weight:bold} .application-content-body .form-group-submit { width: 100%; } @media (min-width: 768px) { .application-content-body .form-group-submit { width: 75%; } } @media (min-width: 1024px) { .application-content-body .form-group-submit { width: 25%; } } html.public-application .application-content{margin:0;display:flex;flex-direction:column;align-items:center} html.public-application .outer-mt-container,html.public-application .alert { width: 90%; max-width: 654px; } @media (min-width: 1024px) { html.public-application .outer-mt-container,html.public-application .alert { width: 100%; } } .plaid-connect-link{width:124px;height:40px;box-shadow:0 1px 2px 0 rgba(0,0,0,.07);border-radius:20px;font-size:12px;font-weight:500;line-height:16px;padding:12px 22px;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .plaid-connect-link svg{margin-right:8px} .plaid-connect-link svg path { fill: #AAA9A4; } .plaid-connect-link:hover{text-decoration:none;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .plaid-connect-link:hover svg path{transition:fill 1s;fill: #303030} .dollar-demo.outer-mt-container .outer-container-headline{justify-content:center} .dollar-demo .btn-do-manual{display:block;margin-top:24px;margin-left:auto;margin-right:auto} .dollar-demo .form-section-plaid{margin-bottom:0} .search-filters-container .react-select-container,.search-filters-container .search-input,.search-filters-container .form-group,.search-filters-container .metadata-value{width:207px} .rules-section{display:flex;flex-direction:column;padding:16px 0;border-bottom-width: 1px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity))} .rules-section:first-child{padding-top:8px} .rules-section:hover { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .rules-section:hover .rule-header .rule-edit-link{display:inline-flex} .rules-section .rule-header{display:flex;flex-direction:row;margin-bottom:14px} .rules-section .rule-header h2{font-size:17px;font-weight:500;margin:0;line-height:23px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .rules-section .rule-header .rule-edit-link{display:none;margin-left:10px;padding:0;font-weight:500;font-size:12px;line-height:16px;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} .rules-section .rule-text .rule-text-section:not(:first-child){margin-top:16px} .rules-section .rule-text h3{font-weight:500;font-size:13px;line-height:18px;margin:0;margin-bottom:4px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .rules-section .rule-text ul{margin-bottom:0;list-style-type:none;padding:0} .rules-section .rule-text ul li:not(:first-child){margin-top:4px} .rules-section .rule-text .rule-conditions{font-size:13px;line-height:18px;font-weight:500;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-create-rules{max-width:941px} .form-create-rules .metadata-values-row{display:flex;flex-direction:row;flex-wrap:wrap} .form-create-rules .metadata-values-row .metadata-input{max-width:100% !important;min-width:100% !important} .form-create-rules .form-row { margin-bottom: 1rem; } @media (min-width: 768px) { .form-create-rules .form-row { margin-bottom: 0px; } } .form-create-rules .form-row>div { min-width: 100%; max-width: 100%; flex-grow: 1; } @media (min-width: 768px) { .form-create-rules .form-row>div { min-width: 26%; max-width: 26%; } } @media (min-width: 1024px) { .form-create-rules .form-row>div { min-width: 29%; max-width: 29%; } } .form-create-rules .form-row>div:not(:last-child) { margin-right: 1rem; } .form-create-rules .approver-row{justify-content:flex-start} .form-create-rules .approver-row .btn-secondary-action{margin-top:auto;margin-bottom:16px} .form-create-rules .many-action-button{max-width:38px;min-width:38px} .form-create-rules .remove-condition-label { display: inline; } @media (min-width: 768px) { .form-create-rules .remove-condition-label { display: none; } } .form-create-rules .edit-rule-buttons .btn-secondary-action{margin-left:16px} .form-create-rules .edit-rule-buttons .error-message{margin-left:16px;font-size:13px;font-weight:500;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} .api-config-value{font-size:13px;font-weight:400;line-height:18px;word-break:break-all} .api-config-value code{font-size:inherit;font-weight:inherit;line-height:inherit} .list-group{list-style-type:none} .list-group .list-group-item{border-radius:0;border:none;height:40px;padding:11px 0 11px 16px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .list-group .selected-group-item{padding-left:12px;border-left-width: 4px;--tw-border-opacity: 1;border-color: rgb(64 157 124 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(0 0 0 / var(--tw-text-opacity))} .list-group .list-group-item-placeholder{cursor:pointer} .list-group .list-group-sub-item{display:block;padding:6px 0 6px 26px;text-decoration:none;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .list-group .list-group-sub-item:first-child{padding-top:12px} .list-group .list-group-sub-item:hover{cursor:pointer;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .list-group .list-group-sub-item.list-group-sub-item-selected { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .application-content { margin-left: 0px; } @media (min-width: 1024px) { .application-content { margin-left: auto; } } .hidden{display:none} .hidden.form-row{display:none !important} .rounded-container{border-radius:10px;padding:1rem;border-width: 2px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);--tw-shadow-color: #F2F1ED;--tw-shadow: var(--tw-shadow-colored)} .outer-mt-container .outer-container-headline{display:flex;justify-content:space-between;margin-bottom:16px} .outer-mt-container .outer-container-headline h2{margin-bottom:0} .outer-mt-container .outer-container-headline h2 .header-hint{margin-top:8px;display:block;font-size:13px;font-weight:500;line-height:18px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .outer-mt-container .outer-container-headline h2 .header-subtext{margin-top:12px;display:block;font-size:14px;font-weight:400;line-height:18px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .outer-mt-container .outer-container-headline .btn-action{margin-left:auto} .mt-container { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .mt-container .container-headline{display:flex;flex-direction:row;justify-content:space-between;margin-top:4px;margin-bottom:34px} .mt-container .container-headline h2{font-size:18px;font-weight:400;line-height:25px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .mt-container .container-headline .badge,.mt-container .container-headline .btn-link{margin-left:16px} .mt-container .container-headline .btn-link{padding:0} .mt-container .container-headline .csv-download-link{font-size:.75rem;margin-left:auto} .mt-container .container-headline .dropdown{display:inline} .mt-container .container-headline.audit-record-csv{margin-top:0;margin-bottom:12px;height:0} .mt-container .container-headline.audit-record-csv .csv-download-link{position:relative} .select-inline{display:inline-block} .select-inline select{background:none;border:0;border-bottom:1px solid #000;border-radius:0} .input-inline{display:inline-block !important} .input-inline input{border:0;border-bottom:1px solid #000;border-radius:0} .input-highlighted{position:relative;display:inline-block} .input-highlighted input{padding-bottom:.5rem !important;--tw-bg-opacity: 1;background-color: rgb(242 241 237 / var(--tw-bg-opacity))} .input-highlighted.required::after{content:"*";position:absolute;right:.1rem;top:0;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} .select-highlighted { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .select-highlighted.required::after{content:"*";display:inline;position:absolute;margin:0 0 0 -0.5rem;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} #mainActionsDropdown img{width:25px;height:25px;display:block} .tags-container .mt-tag{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:5px;display:inline-block;margin:0 1rem 0 0;max-width:8rem;padding:.5rem;width:8rem;border-width: 3px;--tw-border-opacity: 1;border-color: rgb(0 0 0 / var(--tw-border-opacity))} .tags-container .mt-tag .tag-icon{width:1rem} .header-with-edit h2{display:inline-block} .header-with-edit a{margin-left:.5rem} .form-group.form-group-valid { --tw-border-opacity: 1; border-color: rgb(197 196 191 / var(--tw-border-opacity)); } .form-group.form-group-valid input.is-valid { --tw-border-opacity: 1; border-color: rgb(197 196 191 / var(--tw-border-opacity)); } input.parsley-error,select.parsley-error,textarea.parsley-error { --tw-border-opacity: 1; border-color: rgb(226 82 99 / var(--tw-border-opacity)); --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } ul.csv-errors li { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .pagination-row { display: flex; justify-content: center; } .pagination-row .entity-count-container { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .pagination-row .entity-count-container .entity-count { font-size: 12px; line-height: 16px; font-weight: 500; --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .pagination-row .pagination-nav{margin-left:12px} .pagination-row .pagination-nav .btn-nav{border-radius:4px;height:38px;width:38px;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .pagination-row .pagination-nav .btn-nav:first-child{border-top-right-radius:0;border-bottom-right-radius:0} .pagination-row .pagination-nav .btn-nav:last-child{border-top-left-radius:0;border-bottom-left-radius:0} .loading-container{text-align:center} .resource-link-section a{display:block} .split-container { display: flex; flex-direction: column; justify-content: space-between; } @media (min-width: 1024px) { .split-container { flex-direction: row; } } .split-container .split-container-child{flex-basis:48%} @media(max-width: 576px){.d-xs-none{display:none !important}} .missing { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .utc-date .time { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .group-detail-form-section,.user-detail-form-section{margin-bottom:8px} .notifications-section{max-width:350px} .accounting-counterparties-container .btn-group.selectbar{max-width:400px;margin-bottom:24px} .accounting-counterparties-container .form-section.matching-tools{margin-bottom:32px} .form-feedback-modal textarea.form-control{height:76px} .table{margin-bottom:0} .table-entry-wide{max-width:375px !important;flex-grow:1.5 !important;margin-right: 1.25rem} @media (min-width: 640px) { .table-entry-show-small { display: none; } } .table-entry-accounting-wide{max-width:100% !important;white-space:normal !important} .table-entry-hide-small {display:none; } .table-entry-hide-small.form-row{display:none} @media (min-width: 640px) { .table-entry-hide-small { display: block; } } .index-table{display:flex;flex-direction:column;justify-content:flex-start} .index-table .table-head{font-weight:500} .index-table .index-table-row{font-size:12px;line-height:16px;display:flex;flex-direction:row;flex-grow:1} .index-table .index-table-row .table-entry{flex-grow:1;flex-basis:0;max-width:250px;padding:16.5px 0 16.5px 0;margin-right:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;min-width:1%} .index-table .index-table-row a.table-entry{text-decoration:inherit;color:inherit} .index-table .index-table-row a.table-entry:active{-webkit-user-select:none !important;user-select:none !important} .index-table .index-table-row.highlighted-row{font-style:italic} .index-table .index-table-row.bold-row{font-weight:500} .index-table .index-table-row.index-table-row-multiple-elements .table-entry{display:flex;flex-direction:column;justify-content:space-between} .index-table .index-table-row.index-table-row-multiple-elements .table-entry>:not(:first-child){margin-top:8px} .index-table .index-table-row .table-entry-allow-overflow{overflow:visible} .index-table .index-table-row .table-entry-ledger-wide{max-width:100%;margin-right:30px} .index-table .index-table-row .table-entry-tall{min-height:59px} .index-table .index-table-row .table-entry-small{flex-grow:.6} .index-table .index-table-row .table-entry-min{max-width:min-content;margin:0 10px 0 0} .index-table .index-table-row .table-entry-icon{flex-grow:0;flex-shrink:0;flex-basis:16px;margin-left:10px;margin-right:16px} .index-table .index-table-row .table-entry-right-align{padding-right:1px} .index-table .index-table-row .table-entry-right-align:not(:first-child){text-align:right} .index-table .index-table-row .table-entry-center-align{text-align-last:center} .index-table .index-table-row .table-entry-center-vertical{display:flex;align-items:center} .index-table .index-table-row .table-entry.table-checkbox{flex-grow:0 !important;margin-right:8px;min-width:14px;display:none} .index-table .index-table-row .table-entry.table-checkbox.form-row{display:none} @media (min-width: 640px) { .index-table .index-table-row .table-entry.table-checkbox { display: block; } } .index-table .expanded-section{padding:14px 16px;font-size:12px;line-height:22px;margin-bottom:16px;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .index-table .expanded-section:last-child{margin-bottom:0} .index-table .expanded-section .expanded-row{display:flex;flex-direction:row} .index-table .expanded-section .expanded-row:not(:first-child){padding-top:14px} .index-table .expanded-section .expanded-key{font-weight:500;min-width:120px} .index-table .expanded-section .expanded-value{font-weight:400} .index-table .danger-row { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .index-table .table-body .linked-row:hover{cursor:pointer;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .index-table .table-body .index-table-row:not(:first-child) { border-top-width: 1px; --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); } .index-table .table-entry.actions{width:150px;min-width:150px} .index-table .table-entry.actions button,.index-table .table-entry.actions span{width:67px;font-weight:500;font-size:12px;line-height:16px;padding:4px 0;border-radius:4px;transition:background-color 1s;--tw-bg-opacity: 1;background-color: rgb(47 152 174 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .index-table .table-entry.actions button:not(:first-child),.index-table .table-entry.actions span:not(:first-child){margin-left:6px} .index-table .table-entry.actions button.btn-disabled,.index-table .table-entry.actions span.btn-disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .index-table .table-entry.actions button.btn-view-details,.index-table .table-entry.actions span.btn-view-details{border:none;padding:0;text-align:left;background-color: inherit;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} .index-table .table-entry.actions button.btn-view-details:hover,.index-table .table-entry.actions button.btn-view-details:focus,.index-table .table-entry.actions span.btn-view-details:hover,.index-table .table-entry.actions span.btn-view-details:focus{outline:none;text-decoration:none;box-shadow:none} .index-table .table-entry.actions .action-tooltips{display:inline} .index-table .header-row{font-size:13px;line-height:18px;border-bottom-width: 1px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity))} .index-table .header-row .table-entry{padding:0 0 19px 0} .index-table .btn-accordian{margin-top:16px} .index-table.hosted-invoice-line-items .table-body .index-table-row:not(:first-child){border:none} .index-table.hosted-invoice-line-items .index-table-row.highlighted-row{font-style:normal;--tw-bg-opacity: 1;background-color: rgb(242 241 237 / var(--tw-bg-opacity))} .index-table.hosted-invoice-line-items .index-table-row .table-entry{padding:12px;text-align:right} .index-table.hosted-invoice-line-items .index-table-row .table-entry:first-child{text-align:left} .index-table.hosted-invoice-line-items .index-table-row .table-entry:last-child{padding-right:20px} .key-value-table{display:flex;flex-direction:column;font-size:12px;line-height:22px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .key-value-table .key-value-table-row{grid-template-columns:150px 1fr;display: grid;width: 100%;grid-auto-flow: column;gap: 1.5rem;border-bottom-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));padding-top: 1rem;padding-bottom: 1rem} .key-value-table .key-value-table-row:first-child { padding-top: 0px; } .key-value-table .key-value-table-row:last-child { border-bottom-width: 0px; padding-bottom: 0px; } .key-value-table .key-value-table-row .row-label { overflow-wrap: break-word; font-weight: 500; } .key-value-table .key-value-table-row .row-value{font-weight:400;word-break:break-all} .key-value-table.key-value-table-subtable{padding:16px;border-radius:4px;--tw-bg-opacity: 1;background-color: rgb(240 248 250 / var(--tw-bg-opacity))} .key-value-table.key-value-table-subtable:not(:first-child){margin-top:24px} .key-value-table+.btn-link{padding-top:16px} .detail-panel { display: flex; flex-direction: column; align-items: flex-start; gap: 1rem; border-radius: 0.25rem; border-width: 1px; border-color: rgba(0, 0, 0, 0.12);; --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); padding: 1.5rem; } .detail-panel-row{grid-template-columns:150px 1fr;display: grid;width: 100%;grid-auto-flow: column;gap: 1rem} .detail-panel-row.row-label-invoice .row-label{width:100px;min-width:100px} .detail-panel-row.row-label-tight .row-label{width:150px;min-width:150px;font-size:14px;--tw-text-opacity: 1;color: rgb(114 114 114 / var(--tw-text-opacity))} .detail-panel-row.row-label-tight .row-value{font-weight:400;font-size:14px;word-break:break-all;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .detail-panel-row .row-label { font-size: 12px; line-height: 16px; font-weight: 400; --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .detail-panel-row.row-label-normal-word-break .row-label{word-break:normal} .detail-panel-row .row-value{font-weight:400;font-size:12px;word-break:break-all;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .tabbed-key-value-table { display: flex; flex-direction: column; border-radius: 0.25rem; border-width: 1px; border-color: rgba(0, 0, 0, 0.12);; --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } .tabbed-key-value-row { display: flex; width: 100%; flex-direction: row; align-items: center; border-bottom-width: 1px; border-color: rgba(0, 0, 0, 0.05);; padding-left: 1.5rem; padding-right: 1.5rem; padding-top: 0.75rem; padding-bottom: 0.75rem; } .tabbed-key-value-row .row-label{font-size:12px;width:250px;min-width:200px;padding-right:24px;word-break:break-all;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;--tw-text-opacity: 1;color: rgb(87 87 87 / var(--tw-text-opacity))} .tabbed-key-value-row .row-value{font-weight:400;font-size:12px;word-break:break-all;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .table-bulk-action-row{display:flex;flex-direction:row;height:62px;margin-bottom:16px;align-items:center;font-weight:500;border-radius:4px;font-size:13px;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px;--tw-bg-opacity: 1;background-color: rgb(240 248 250 / var(--tw-bg-opacity))} .table-bulk-action-row .bulk-actions{margin-left:16px} .table-bulk-action-row .bulk-actions .btn-disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); --tw-text-opacity: 1; color: rgb(247 247 246 / var(--tw-text-opacity)); } .table-bulk-action-row .bulk-actions button{width:67px;font-weight:500;font-size:12px;line-height:16px;padding:6px 0;border-radius:4px;--tw-bg-opacity: 1;background-color: rgb(47 152 174 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .table-bulk-action-row .bulk-actions button:not(:first-child){margin-left:6px} .table-bulk-action-row .bulk-actions button:hover{cursor:pointer;text-decoration:none;--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .table-bulk-action-row .btn-select-everything{margin-left:16px} .table-borderless td{border:none} .table-borderless td:first-child{font-weight:bold;width:20%} .table-marginless{margin:0 !important} .table-csv-container{max-height:20rem;overflow-x:scroll;overflow-y:scroll;white-space:nowrap;width:70rem;max-width:70rem} .table-csv-container .index-table .index-table-row .table-entry{min-width:200px} .table-permissions .text-with-dropdown-line-height{padding:16px 0;line-height:38px} .table-permissions .no-border{border-bottom:0 !important;border-top:0 !important} .table-permissions .table-body .table-entry{padding:8px 0} .table-permissions .index-table-row .table-entry:first-child{max-width:none} .table-permissions .index-table-row .table-entry:last-child{min-width:max-content} .webhook-view-events{padding-bottom:10px} .webhook-view-events .header{font-weight:bold} .webhook-view-events .events{padding-left:10px} .webhook-view-events .events .event{padding-left:5px} .webhook-view-events:last-child{padding-bottom:0} input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0} input[type=number]{-webkit-appearance:none;appearance:none} .react-select-container { min-width: 180px; padding: 0px; font-size: 14px; line-height: 20px; font-weight: 400; } .react-select-container .react-select__placeholder { color: var(--text-default); } .react-select-container .react-select__control--is-focused .react-select__placeholder { color: var(--text-hover); } .react-select-container .react-select__value-container { margin-top: -1px; margin-bottom: -1px; height: 2rem; padding-top: 0px; padding-bottom: 0px; } .react-select-container .react-select__value-container.react-select__value-container--is-multi { margin-top: 0px; margin-bottom: 0px; height: 100%; padding-top: 1px; padding-bottom: 1px; } .react-select-container .react-select__value-container.react-select__value-container--has-value { border-color: var(--border-default); padding-left: 0.5rem; } .react-select-container .react-select__value-container.react-select__value-container--has-value .react-select__single-value { font-size: 14px; line-height: 20px; color: var(--text-default); } .react-select-container .react-select__value-container.react-select__value-container--has-value .react-select__single-value--is-disabled { color: var(--text-muted); } .react-select-container .react-select__clear-indicator { display: flex; align-items: center; justify-content: center; padding: 0px; } .react-select-container .react-select__clear-indicator svg path { fill: currentColor; } .react-select-container .react-select__indicator.react-select__dropdown-indicator { padding: 0px; padding-right: 0.25rem; } .react-select-container .react-select__group-heading { font-size: 12px; line-height: 16px; font-weight: 500; } .react-select-container .react-select__menu .react-select__option { border-radius: 0.125rem; font-size: 14px; line-height: 20px;width:calc(100% - 4px); } .react-select__control { min-height: 0px; border-radius: 0.125rem; border-width: 1px; border-color: rgba(0, 0, 0, 0.12);; min-height: 2rem; } .react-select__control.react-select__control--is-hovered { --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); text-decoration-line: none; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); outline: 2px solid transparent; outline-offset: 2px; } .react-select__control.react-select__control--is-focused { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); text-decoration-line: none; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); outline: 2px solid transparent; outline-offset: 2px; } .react-select__control.react-select__control--is-disabled { pointer-events: auto; cursor: not-allowed; --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } .react-select__control.react-select__control--is-disabled:hover { --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); } .react-select__control.react-select__control--is-disabled .react-select__placeholder { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .react-select__control .react-select__single-value { color: var(--text-default); } .react-select__control.react-select__single-value--is-disabled { color: var(--text-muted); } .placeholder\:\!text-gray-600::placeholder { --tw-text-opacity: 1 !important; color: rgb(87 87 87 / var(--tw-text-opacity)) !important; } .first\:mt-0:first-child { margin-top: 0px; } .first\:rounded-l:first-child { border-top-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } .first\:pt-0:first-child { padding-top: 0px; } .last\:mb-0:last-child { margin-bottom: 0px; } .last\:rounded-b:last-child { border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } .last\:rounded-r:last-child { border-top-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem; } .last\:border-0:last-child { border-width: 0px; } .last\:border-b-0:last-child { border-bottom-width: 0px; } .last\:pb-0:last-child { padding-bottom: 0px; } .checked\:border-blue-600:checked { --tw-border-opacity: 1; border-color: rgb(44 88 143 / var(--tw-border-opacity)); } .checked\:border-checkbox-border:checked { border-color: var(--checkbox-border); } .checked\:border-opacity-30:checked { --tw-border-opacity: 0.3; } .checked\:bg-background-light:checked { background-color: var(--background-light); } .checked\:bg-blue-500:checked { --tw-bg-opacity: 1; background-color: rgb(56 111 177 / var(--tw-bg-opacity)); } .focus-within\:border-blue-500:focus-within { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .focus-within\:outline-none:focus-within { outline: 2px solid transparent; outline-offset: 2px; } .hover\:-translate-y-px:hover { --tw-translate-y: -1px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .hover\:animate-none:hover { animation: none; } .hover\:cursor-pointer:hover { cursor: pointer; } .hover\:rounded:hover { border-radius: 0.25rem; } .hover\:border:hover { border-width: 1px; } .hover\:border-\[\#1BA778\]:hover { --tw-border-opacity: 1; border-color: rgb(27 167 120 / var(--tw-border-opacity)); } .hover\:border-\[\#BEF264\]:hover { --tw-border-opacity: 1; border-color: rgb(190 242 100 / var(--tw-border-opacity)); } .hover\:border-blue-700:hover { --tw-border-opacity: 1; border-color: rgb(32 69 113 / var(--tw-border-opacity)); } .hover\:border-gray-100:hover { --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); } .hover\:border-gray-200:hover { --tw-border-opacity: 1; border-color: rgb(197 196 191 / var(--tw-border-opacity)); } .hover\:border-gray-300:hover { --tw-border-opacity: 1; border-color: rgb(170 169 164 / var(--tw-border-opacity)); } .hover\:border-green-200:hover { --tw-border-opacity: 1; border-color: rgb(156 210 187 / var(--tw-border-opacity)); } .hover\:border-green-300:hover { --tw-border-opacity: 1; border-color: rgb(113 182 154 / var(--tw-border-opacity)); } .hover\:border-purple-700:hover { --tw-border-opacity: 1; border-color: rgb(66 59 114 / var(--tw-border-opacity)); } .hover\:border-red-300:hover { --tw-border-opacity: 1; border-color: rgb(252 132 146 / var(--tw-border-opacity)); } .hover\:border-red-500:hover { --tw-border-opacity: 1; border-color: rgb(199 61 79 / var(--tw-border-opacity)); } .hover\:border-red-600:hover { --tw-border-opacity: 1; border-color: rgb(159 41 70 / var(--tw-border-opacity)); } .hover\:border-red-700:hover { --tw-border-opacity: 1; border-color: rgb(124 27 61 / var(--tw-border-opacity)); } .hover\:\!bg-button-background-disabled:hover { background-color: var(--button-background-disabled) !important; } .hover\:\!bg-transparent:hover { background-color: transparent !important; } .hover\:\!bg-white:hover { --tw-bg-opacity: 1 !important; background-color: rgb(255 255 255 / var(--tw-bg-opacity)) !important; } .hover\:bg-\[\#1BA778\]:hover { --tw-bg-opacity: 1; background-color: rgb(27 167 120 / var(--tw-bg-opacity)); } .hover\:bg-\[\#D9F99D\]:hover { --tw-bg-opacity: 1; background-color: rgb(217 249 157 / var(--tw-bg-opacity)); } .hover\:bg-\[\#FAFAF9\]:hover { --tw-bg-opacity: 1; background-color: rgb(250 250 249 / var(--tw-bg-opacity)); } .hover\:bg-alpha-white-200:hover { background-color: rgba(255, 255, 255, 0.20);; } .hover\:bg-background-light:hover { background-color: var(--background-light); } .hover\:bg-blue-600:hover { --tw-bg-opacity: 1; background-color: rgb(44 88 143 / var(--tw-bg-opacity)); } .hover\:bg-button-background-default:hover { background-color: var(--button-background-default); } .hover\:bg-gray-100:hover { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .hover\:bg-gray-25:hover { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .hover\:bg-gray-50:hover { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .hover\:bg-gray-600:hover { --tw-bg-opacity: 1; background-color: rgb(87 87 87 / var(--tw-bg-opacity)); } .hover\:bg-gray-800:hover { --tw-bg-opacity: 1; background-color: rgb(48 48 48 / var(--tw-bg-opacity)); } .hover\:bg-green-100:hover { --tw-bg-opacity: 1; background-color: rgb(190 230 213 / var(--tw-bg-opacity)); } .hover\:bg-green-500:hover { --tw-bg-opacity: 1; background-color: rgb(0 128 96 / var(--tw-bg-opacity)); } .hover\:bg-mist-700:hover { --tw-bg-opacity: 1; background-color: rgb(48 74 74 / var(--tw-bg-opacity)); } .hover\:bg-purple-600:hover { --tw-bg-opacity: 1; background-color: rgb(87 78 146 / var(--tw-bg-opacity)); } .hover\:bg-red-100:hover { --tw-bg-opacity: 1; background-color: rgb(255 206 211 / var(--tw-bg-opacity)); } .hover\:bg-red-600:hover { --tw-bg-opacity: 1; background-color: rgb(159 41 70 / var(--tw-bg-opacity)); } .hover\:bg-transparent:hover { background-color: transparent; } .hover\:text-blue-500:hover { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); } .hover\:text-blue-600:hover { --tw-text-opacity: 1; color: rgb(44 88 143 / var(--tw-text-opacity)); } .hover\:text-gray-100:hover { --tw-text-opacity: 1; color: rgb(222 221 215 / var(--tw-text-opacity)); } .hover\:text-gray-500:hover { --tw-text-opacity: 1; color: rgb(114 114 114 / var(--tw-text-opacity)); } .hover\:text-gray-600:hover { --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .hover\:text-gray-700:hover { --tw-text-opacity: 1; color: rgb(68 68 68 / var(--tw-text-opacity)); } .hover\:text-gray-800:hover { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .hover\:text-gray-900:hover { --tw-text-opacity: 1; color: rgb(34 34 34 / var(--tw-text-opacity)); } .hover\:text-green-100:hover { --tw-text-opacity: 1; color: rgb(190 230 213 / var(--tw-text-opacity)); } .hover\:text-green-600:hover { --tw-text-opacity: 1; color: rgb(0 100 82 / var(--tw-text-opacity)); } .hover\:text-green-800:hover { --tw-text-opacity: 1; color: rgb(19 58 51 / var(--tw-text-opacity)); } .hover\:text-red-600:hover { --tw-text-opacity: 1; color: rgb(159 41 70 / var(--tw-text-opacity)); } .hover\:text-text-default:hover { color: var(--text-default); } .hover\:underline:hover { text-decoration-line: underline; } .hover\:outline-none:hover { outline: 2px solid transparent; outline-offset: 2px; } .hover\:outline:hover { outline-style: solid; } .hover\:outline-alpha-black-100:hover { outline-color: rgba(0, 0, 0, 0.12);; } .focus\:border-l:focus { border-left-width: 1px; } .focus\:border-\[\#15806E\]:focus { --tw-border-opacity: 1; border-color: rgb(21 128 110 / var(--tw-border-opacity)); } .focus\:border-\[\#B2ECA1\]:focus { --tw-border-opacity: 1; border-color: rgb(178 236 161 / var(--tw-border-opacity)); } .focus\:border-blue-500:focus { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .focus\:border-cyan-500:focus { --tw-border-opacity: 1; border-color: rgb(0 120 140 / var(--tw-border-opacity)); } .focus\:border-green-100:focus { --tw-border-opacity: 1; border-color: rgb(190 230 213 / var(--tw-border-opacity)); } .focus\:border-transparent:focus { border-color: transparent; } .focus\:outline-none:focus { outline: 2px solid transparent; outline-offset: 2px; } .focus\:ring-1:focus { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } .focus\:ring-2:focus { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } .focus\:ring-blue-500:focus { --tw-ring-opacity: 1; --tw-ring-color: rgb(56 111 177 / var(--tw-ring-opacity)); } .focus\:ring-offset-0:focus { --tw-ring-offset-width: 0px; } .focus-visible\:border-blue-500:focus-visible { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .focus-visible\:outline-none:focus-visible { outline: 2px solid transparent; outline-offset: 2px; } .focus-visible\:ring:focus-visible { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } @keyframes ping { 75%, 100% { transform: scale(2); opacity: 0; } } .active\:animate-ping:active { animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; } .active\:cursor-wait:active { cursor: wait; } .active\:border-\[\#00554F\]:active { --tw-border-opacity: 1; border-color: rgb(0 85 79 / var(--tw-border-opacity)); } .active\:border-\[\#BEF264\]:active { --tw-border-opacity: 1; border-color: rgb(190 242 100 / var(--tw-border-opacity)); } .active\:border-blue-500:active { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .active\:border-blue-700:active { --tw-border-opacity: 1; border-color: rgb(32 69 113 / var(--tw-border-opacity)); } .active\:border-gray-300:active { --tw-border-opacity: 1; border-color: rgb(170 169 164 / var(--tw-border-opacity)); } .active\:border-gray-400:active { --tw-border-opacity: 1; border-color: rgb(138 137 133 / var(--tw-border-opacity)); } .active\:border-green-200:active { --tw-border-opacity: 1; border-color: rgb(156 210 187 / var(--tw-border-opacity)); } .active\:border-purple-700:active { --tw-border-opacity: 1; border-color: rgb(66 59 114 / var(--tw-border-opacity)); } .active\:border-red-700:active { --tw-border-opacity: 1; border-color: rgb(124 27 61 / var(--tw-border-opacity)); } .active\:\!bg-button-background-disabled:active { background-color: var(--button-background-disabled) !important; } .active\:bg-\[\#00554F\]:active { --tw-bg-opacity: 1; background-color: rgb(0 85 79 / var(--tw-bg-opacity)); } .active\:bg-\[\#BEF264\]:active { --tw-bg-opacity: 1; background-color: rgb(190 242 100 / var(--tw-bg-opacity)); } .active\:bg-alpha-white-50:active { background-color: rgba(255, 255, 255, 0.05);; } .active\:bg-blue-700:active { --tw-bg-opacity: 1; background-color: rgb(32 69 113 / var(--tw-bg-opacity)); } .active\:bg-gray-100:active { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .active\:bg-gray-50:active { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .active\:bg-gray-500:active { --tw-bg-opacity: 1; background-color: rgb(114 114 114 / var(--tw-bg-opacity)); } .active\:bg-gray-700:active { --tw-bg-opacity: 1; background-color: rgb(68 68 68 / var(--tw-bg-opacity)); } .active\:bg-gray-800:active { --tw-bg-opacity: 1; background-color: rgb(48 48 48 / var(--tw-bg-opacity)); } .active\:bg-green-100:active { --tw-bg-opacity: 1; background-color: rgb(190 230 213 / var(--tw-bg-opacity)); } .active\:bg-purple-700:active { --tw-bg-opacity: 1; background-color: rgb(66 59 114 / var(--tw-bg-opacity)); } .active\:bg-red-700:active { --tw-bg-opacity: 1; background-color: rgb(124 27 61 / var(--tw-bg-opacity)); } .active\:text-yellow-300:active { --tw-text-opacity: 1; color: rgb(232 164 66 / var(--tw-text-opacity)); } .active\:outline-none:active { outline: 2px solid transparent; outline-offset: 2px; } .active\:outline:active { outline-style: solid; } .active\:outline-alpha-black-200:active { outline-color: rgba(0, 0, 0, 0.20);; } .disabled\:cursor-not-allowed:disabled { cursor: not-allowed; } .disabled\:border-alpha-black-200:disabled { border-color: rgba(0, 0, 0, 0.20);; } .disabled\:border-gray-100:disabled { --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); } .disabled\:bg-alpha-black-50:disabled { background-color: rgba(0, 0, 0, 0.05);; } .disabled\:bg-button-background-disabled:disabled { background-color: var(--button-background-disabled); } .disabled\:bg-gray-100:disabled { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .disabled\:bg-gray-25:disabled { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .disabled\:bg-gray-50:disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .disabled\:text-gray-600:disabled { --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .disabled\:opacity-50:disabled { opacity: 0.5; } .disabled\:checked\:border-blue-300:checked:disabled { --tw-border-opacity: 1; border-color: rgb(118 171 245 / var(--tw-border-opacity)); } .disabled\:checked\:bg-blue-200:checked:disabled { --tw-bg-opacity: 1; background-color: rgb(167 200 255 / var(--tw-bg-opacity)); } .disabled\:hover\:text-gray-600:hover:disabled { --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .group:first-child .group-first\:pt-2 { padding-top: 0.5rem; } .group:last-child .group-last\:pb-2 { padding-bottom: 0.5rem; } .group:hover .group-hover\:flex { display: flex; } .group:hover .group-hover\:bg-blue-400 { --tw-bg-opacity: 1; background-color: rgb(73 141 224 / var(--tw-bg-opacity)); } .group:hover .group-hover\:fill-white { fill: #FFFFFF; } .group:hover .group-hover\:opacity-100 { opacity: 1; } @media (min-width: 640px) { .mint-sm\:absolute { position: absolute; } .mint-sm\:top-6 { top: 1.5rem; } .mint-sm\:mt-8 { margin-top: 2rem; } .mint-sm\:block { display: block; } .mint-sm\:w-\[416px\] { width: 416px; } .mint-sm\:w-\[480px\] { width: 480px; } .mint-sm\:w-full { width: 100%; } .mint-sm\:max-w-md { max-width: 28rem; } .mint-sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .mint-sm\:items-center { align-items: center; } .mint-sm\:justify-items-start { justify-items: start; } .mint-sm\:justify-self-start { justify-self: start; } .mint-sm\:border-l { border-left-width: 1px; } .mint-sm\:border-t-0 { border-top-width: 0px; } .mint-sm\:p-6 { padding: 1.5rem; } .mint-sm\:p-8 { padding: 2rem; } .mint-sm\:px-6 { padding-left: 1.5rem; padding-right: 1.5rem; } .mint-sm\:py-px { padding-top: 1px; padding-bottom: 1px; } .mint-sm\:pl-4 { padding-left: 1rem; } .mint-sm\:pr-4 { padding-right: 1rem; } .mint-sm\:pt-0 { padding-top: 0px; } .mint-sm\:pt-16 { padding-top: 4rem; } .mint-sm\:text-left { text-align: left; } .mint-sm\:text-base { font-size: 16px; line-height: 24px; } .mint-sm\:text-xl { font-size: 24px; line-height: 32px; font-weight: 500; } } @media (min-width: 768px) { .mint-md\:absolute { position: absolute; } .mint-md\:left-12 { left: 3rem; } .mint-md\:top-12 { top: 3rem; } .mint-md\:order-1 { order: 1; } .mint-md\:order-2 { order: 2; } .mint-md\:col-span-2 { grid-column: span 2 / span 2; } .mint-md\:col-span-4 { grid-column: span 4 / span 4; } .mint-md\:mb-2 { margin-bottom: 0.5rem; } .mint-md\:block { display: block; } .mint-md\:grid { display: grid; } .mint-md\:hidden { display: none; } .mint-md\:h-7 { height: 1.75rem; } .mint-md\:h-\[51px\] { height: 51px; } .mint-md\:h-full { height: 100%; } .mint-md\:h-screen { height: 100vh; } .mint-md\:max-h-screen { max-height: 100vh; } .mint-md\:min-h-screen { min-height: 100vh; } .mint-md\:w-56 { width: 14rem; } .mint-md\:w-7 { width: 1.75rem; } .mint-md\:w-72 { width: 18rem; } .mint-md\:w-\[51px\] { width: 51px; } .mint-md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .mint-md\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } .mint-md\:grid-cols-\[max-content_auto\] { grid-template-columns: max-content auto; } .mint-md\:overflow-visible { overflow: visible; } .mint-md\:p-12 { padding: 3rem; } .mint-md\:p-6 { padding: 1.5rem; } .mint-md\:p-8 { padding: 2rem; } .mint-md\:px-0 { padding-left: 0px; padding-right: 0px; } .mint-md\:px-1 { padding-left: 0.25rem; padding-right: 0.25rem; } .mint-md\:px-1\.5 { padding-left: 0.375rem; padding-right: 0.375rem; } .mint-md\:px-2 { padding-left: 0.5rem; padding-right: 0.5rem; } .mint-md\:pl-0 { padding-left: 0px; } .mint-md\:pt-4 { padding-top: 1rem; } .mint-md\:text-4xl { font-size: 40px; line-height: 44px; letter-spacing: -0.5px; font-weight: 500; } .mint-md\:opacity-0 { opacity: 0; } .mint-md\:transition-none { transition-property: none; } .group:hover .mint-md\:group-hover\:opacity-100 { opacity: 1; } } @media (min-width: 1024px) { .mint-lg\:right-14 { right: 3.5rem; } .mint-lg\:top-12 { top: 3rem; } .mint-lg\:col-span-12 { grid-column: span 12 / span 12; } .mint-lg\:col-span-3 { grid-column: span 3 / span 3; } .mint-lg\:col-span-4 { grid-column: span 4 / span 4; } .mint-lg\:col-span-5 { grid-column: span 5 / span 5; } .mint-lg\:col-span-6 { grid-column: span 6 / span 6; } .mint-lg\:col-span-7 { grid-column: span 7 / span 7; } .mint-lg\:col-start-1 { grid-column-start: 1; } .mint-lg\:col-start-5 { grid-column-start: 5; } .mint-lg\:col-end-13 { grid-column-end: 13; } .mint-lg\:col-end-5 { grid-column-end: 5; } .mint-lg\:mx-10 { margin-left: 2.5rem; margin-right: 2.5rem; } .mint-lg\:mx-14 { margin-left: 3.5rem; margin-right: 3.5rem; } .mint-lg\:ml-4 { margin-left: 1rem; } .mint-lg\:mr-10 { margin-right: 2.5rem; } .mint-lg\:mr-14 { margin-right: 3.5rem; } .mint-lg\:mt-0 { margin-top: 0px; } .mint-lg\:mt-14 { margin-top: 3.5rem; } .mint-lg\:block { display: block; } .mint-lg\:flex { display: flex; } .mint-lg\:hidden { display: none; } .mint-lg\:h-full { height: 100%; } .mint-lg\:w-1\/2 { width: 50%; } .mint-lg\:w-6\/12 { width: 50%; } .mint-lg\:min-w-\[586px\] { min-width: 586px; } .mint-lg\:max-w-md { max-width: 28rem; } .mint-lg\:grid-flow-col-dense { grid-auto-flow: column dense; } .mint-lg\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } .mint-lg\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .mint-lg\:grid-cols-\[3fr_1fr\] { grid-template-columns: 3fr 1fr; } .mint-lg\:flex-row { flex-direction: row; } .mint-lg\:divide-x > :not([hidden]) ~ :not([hidden]) { --tw-divide-x-reverse: 0; border-right-width: calc(1px * var(--tw-divide-x-reverse)); border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse))); } .mint-lg\:justify-self-end { justify-self: end; } .mint-lg\:p-0 { padding: 0px; } .mint-lg\:p-12 { padding: 3rem; } .mint-lg\:py-6 { padding-top: 1.5rem; padding-bottom: 1.5rem; } .mint-lg\:pl-16 { padding-left: 4rem; } .mint-lg\:pr-32 { padding-right: 8rem; } } @media (min-width: 1280px) { .mint-xl\:w-1\/2 { width: 50%; } .mint-xl\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .mint-xl\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } .mint-xl\:grid-cols-\[2fr_1fr\] { grid-template-columns: 2fr 1fr; } .mint-xl\:flex-nowrap { flex-wrap: nowrap; } } /*# sourceMappingURL=109-c113f255.css.map*/ # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/androidCustomCSS.css # Start of /mnt/data/jocal3--U/jocal3--U/android/generate-theme.js #!/usr/bin/env node 'use strict'; var fs = require('fs'), xml2js = require('xml2js'); var builder = new xml2js.Builder(); // Color resources files var colorFileLight = require('path').join(__dirname, 'app/src/main/res/values/colors.xml'); var colorFileDark = require('path').join(__dirname, 'app/src/main/res/values-night/colors.xml'); // Check argument length if (process.argv.length != 21) { console.log('Incomplete args - ' + process.argv.length + '/20'); showHelp(); } // LIGHT theme color defaults var LIGHT_DEFAULT_ACTIONBAR_COLOR = 'ffffff'; var LIGHT_DEFAULT_STATUSBAR_COLOR = '757575'; var LIGHT_DEFAULT_TITLE_COLOR = '000000'; var LIGHT_DEFAULT_ACCENT_COLOR = '009688'; var LIGHT_DEFAULT_BACKGROUND_COLOR = 'ffffff'; var LIGHT_DEFAULT_SIDEBAR_FOREGROUND_COLOR = '1e4963'; var LIGHT_DEFAULT_SIDEBAR_BACKGROUND_COLOR = 'ffffff'; var LIGHT_DEFAULT_SIDEBAR_SEPARATOR_COLOR = '30808080'; var LIGHT_DEFAULT_SIDEBAR_HIGHLIGHT_COLOR = '1e496e'; var LIGHT_DEFAULT_TAB_BAR_BACKGROUND_COLOR = 'ffffff'; var LIGHT_DEFAULT_TAB_BAR_TEXT_COLOR = '949494'; var LIGHT_DEFAULT_TAB_BAR_INDICATOR_COLOR = '1e496e'; var LIGHT_DEFAULT_SWIPE_NAV_BACKGROUND_COLOR = 'fafafa'; var LIGHT_DEFAULT_SWIPE_NAV_INACTIVE_COLOR = '888888'; var LIGHT_DEFAULT_SWIPE_NAV_ACTIVE_COLOR = '1e88e5'; var LIGHT_DEFAULT_PULL_TO_REFRESH_COLOR = '1e496e'; var LIGHT_DEFAULT_SPLASH_BACKGROUND_COLOR = "1e496e"; var LIGHT_DEFAULT_PROGRESS_INDICATOR_COLOR = "757575"; // DARK theme color defaults var DARK_DEFAULT_ACTIONBAR_COLOR = '212121'; var DARK_DEFAULT_STATUSBAR_COLOR = '030303'; var DARK_DEFAULT_TITLE_COLOR = 'ffffff'; var DARK_DEFAULT_ACCENT_COLOR = '80cbc4'; var DARK_DEFAULT_BACKGROUND_COLOR = '444444'; var DARK_DEFAULT_SIDEBAR_FOREGROUND_COLOR = 'ffffff'; var DARK_DEFAULT_SIDEBAR_BACKGROUND_COLOR = '333333'; var DARK_DEFAULT_SIDEBAR_SEPARATOR_COLOR = '30ffffff'; var DARK_DEFAULT_SIDEBAR_HIGHLIGHT_COLOR = 'ffffff'; var DARK_DEFAULT_TAB_BAR_BACKGROUND_COLOR = '333333'; var DARK_DEFAULT_TAB_BAR_TEXT_COLOR = 'ffffff'; var DARK_DEFAULT_TAB_BAR_INDICATOR_COLOR = '666666'; var DARK_DEFAULT_SWIPE_NAV_BACKGROUND_COLOR = '666666'; var DARK_DEFAULT_SWIPE_NAV_INACTIVE_COLOR = '888888'; var DARK_DEFAULT_SWIPE_NAV_ACTIVE_COLOR = 'ffffff'; var DARK_DEFAULT_PULL_TO_REFRESH_COLOR = 'ffffff'; var DARK_DEFAULT_SPLASH_BACKGROUND_COLOR = '333333'; var DARK_DEFAULT_PROGRESS_INDICATOR_COLOR = "757575"; // Handle args // Theme var theme = process.argv[2]; // Actionbar args var actionBarColor = process.argv[3].toLowerCase(); var statusBarColor = process.argv[4].toLowerCase(); var titleColor = process.argv[5].toLowerCase(); var accentColor = process.argv[6].toLowerCase(); var backgroundColor = process.argv[7].toLowerCase(); // Sidebar args var sideBarForegroundColor = process.argv[8].toLowerCase(); var sideBarBackgroundColor = process.argv[9].toLowerCase(); var sidebarSeparatorColor = process.argv[10].toLowerCase(); var sidebarHighlightColor = process.argv[11].toLowerCase(); // TabBar args var tabBarBackground = process.argv[12].toLowerCase(); var tabBarTextColor = process.argv[13].toLowerCase(); var tabBarIndicatorColor = process.argv[14].toLowerCase(); // Swipe args var swipeBackgroundColor = process.argv[15].toLowerCase(); var swipeInactiveColor = process.argv[16].toLowerCase(); var swipeActiveColor = process.argv[17].toLowerCase(); // Pull to Refresh args var pullToRefresh = process.argv[18].toLowerCase(); // Splash args var splashBackgroundColor = process.argv[19].toLowerCase(); // Progress indicator var progressIndicatorColor = process.argv[20].toLowerCase(); var defaultActionBarColor; var defaultStatusBarColor; var defaultTitleColor; var defaultAccentColor; var defaultBackgroundColor; var defaultSidebarForegroundColor; var defaultSidebarBackgroundColor; var defaultSidebarSeparatorColor; var defaultSidebarHighlightColor; var defaultTabBarBackgroundColor; var defaultTabBarTextColor; var defaultTabBarIndicatorColor; var defaultSwipeBackgroundColor; var defaultSwipeInactiveColor; var defaultSwipeActiveColor; var defaultPullToRefreshColor; var defaultSplashBackgroundColor; var defaultProgressIndicatorColor; // Theme and default color values var writeDir; if (theme === 'light' || theme === 'auto') { writeDir = colorFileLight; defaultActionBarColor = LIGHT_DEFAULT_ACTIONBAR_COLOR; defaultStatusBarColor= LIGHT_DEFAULT_STATUSBAR_COLOR; defaultTitleColor = LIGHT_DEFAULT_TITLE_COLOR; defaultAccentColor = LIGHT_DEFAULT_ACCENT_COLOR; defaultBackgroundColor = LIGHT_DEFAULT_BACKGROUND_COLOR; defaultSidebarForegroundColor = LIGHT_DEFAULT_SIDEBAR_FOREGROUND_COLOR; defaultSidebarBackgroundColor = LIGHT_DEFAULT_SIDEBAR_BACKGROUND_COLOR; defaultSidebarSeparatorColor = LIGHT_DEFAULT_SIDEBAR_SEPARATOR_COLOR; defaultSidebarHighlightColor = LIGHT_DEFAULT_SIDEBAR_HIGHLIGHT_COLOR; defaultTabBarBackgroundColor = LIGHT_DEFAULT_TAB_BAR_BACKGROUND_COLOR; defaultTabBarTextColor = LIGHT_DEFAULT_TAB_BAR_TEXT_COLOR; defaultTabBarIndicatorColor = LIGHT_DEFAULT_TAB_BAR_INDICATOR_COLOR; defaultSwipeBackgroundColor = LIGHT_DEFAULT_SWIPE_NAV_BACKGROUND_COLOR; defaultSwipeInactiveColor = LIGHT_DEFAULT_SWIPE_NAV_INACTIVE_COLOR; defaultSwipeActiveColor = LIGHT_DEFAULT_SWIPE_NAV_ACTIVE_COLOR; defaultPullToRefreshColor = LIGHT_DEFAULT_PULL_TO_REFRESH_COLOR; defaultSplashBackgroundColor = LIGHT_DEFAULT_SPLASH_BACKGROUND_COLOR; defaultProgressIndicatorColor = LIGHT_DEFAULT_PROGRESS_INDICATOR_COLOR; } else if (theme === 'dark' || theme === 'light.darkactionbar') { writeDir = colorFileDark; defaultActionBarColor = DARK_DEFAULT_ACTIONBAR_COLOR; defaultStatusBarColor= DARK_DEFAULT_STATUSBAR_COLOR; defaultTitleColor = DARK_DEFAULT_TITLE_COLOR; defaultAccentColor = DARK_DEFAULT_ACCENT_COLOR; defaultBackgroundColor = DARK_DEFAULT_BACKGROUND_COLOR; defaultSidebarForegroundColor = DARK_DEFAULT_SIDEBAR_FOREGROUND_COLOR; defaultSidebarBackgroundColor = DARK_DEFAULT_SIDEBAR_BACKGROUND_COLOR; defaultSidebarSeparatorColor = DARK_DEFAULT_SIDEBAR_SEPARATOR_COLOR; defaultSidebarHighlightColor = DARK_DEFAULT_SIDEBAR_HIGHLIGHT_COLOR; defaultTabBarBackgroundColor = DARK_DEFAULT_TAB_BAR_BACKGROUND_COLOR; defaultTabBarTextColor = DARK_DEFAULT_TAB_BAR_TEXT_COLOR; defaultTabBarIndicatorColor = DARK_DEFAULT_TAB_BAR_INDICATOR_COLOR; defaultSwipeBackgroundColor = DARK_DEFAULT_SWIPE_NAV_BACKGROUND_COLOR; defaultSwipeInactiveColor = DARK_DEFAULT_SWIPE_NAV_INACTIVE_COLOR; defaultSwipeActiveColor = DARK_DEFAULT_SWIPE_NAV_ACTIVE_COLOR; defaultPullToRefreshColor = DARK_DEFAULT_PULL_TO_REFRESH_COLOR; defaultSplashBackgroundColor = DARK_DEFAULT_SPLASH_BACKGROUND_COLOR; defaultProgressIndicatorColor = DARK_DEFAULT_PROGRESS_INDICATOR_COLOR; } else { console.log('Invalid theme ' + theme); showHelp(); } // Check if colors are valid checkColorRegex(actionBarColor, 'Invalid actionbar background color'); checkColorRegex(statusBarColor, 'Invalid status bar color'); checkColorRegex(titleColor, 'Invalid actionbar title color'); checkColorRegex(accentColor, 'Invalid accent color'); checkColorRegex(backgroundColor, 'Invalid background color'); checkColorRegex(sideBarForegroundColor, 'Invalid sidebar foreground color'); checkColorRegex(sideBarBackgroundColor, 'Invalid sidebar background color'); checkColorRegex(sidebarSeparatorColor, 'Invalid sidebar separator color'); checkColorRegex(sidebarHighlightColor, 'Invalid sidebar highlight color'); checkColorRegex(tabBarBackground, 'Invalid tab bar background color'); checkColorRegex(tabBarTextColor, 'Invalid tab bar text color'); checkColorRegex(tabBarIndicatorColor, 'Invalid tab bar indicator color'); checkColorRegex(swipeBackgroundColor, 'Invalid swipe nav background color'); checkColorRegex(swipeInactiveColor, 'Invalid swipe nav inactive color'); checkColorRegex(swipeActiveColor, 'Invalid swipe nav active color'); checkColorRegex(pullToRefresh, 'Invalid pullToRefresh color'); checkColorRegex(splashBackgroundColor, 'Invalid splash background color'); checkColorRegex(progressIndicatorColor, 'Invalid progress indicator color'); // Start generating colors var colorArray = []; // Actionbar colors colorArray.push(createColorJSON('colorPrimary', actionBarColor, defaultActionBarColor)); colorArray.push(createColorJSON('statusBarBackground', statusBarColor, defaultStatusBarColor)); colorArray.push(createColorJSON('titleTextColor', titleColor, defaultTitleColor)); colorArray.push(createColorJSON('colorAccent', accentColor, defaultAccentColor)); colorArray.push(createColorJSON('colorBackground', backgroundColor, defaultBackgroundColor)); colorArray.push(createColorJSON('drawerArrow', titleColor, defaultTitleColor)); // Sidebar colors colorArray.push(createColorJSON('sidebarForeground', sideBarForegroundColor, defaultSidebarForegroundColor)); colorArray.push(createColorJSON('sidebarBackground', sideBarBackgroundColor, defaultSidebarBackgroundColor)); colorArray.push(createColorJSON('sidebarSeparatorColor', sidebarSeparatorColor, defaultSidebarSeparatorColor)); colorArray.push(createColorJSON('sidebarHighlight', sidebarHighlightColor, defaultSidebarHighlightColor)); // TabBar colors colorArray.push(createColorJSON('tabBarBackground', tabBarBackground, defaultTabBarBackgroundColor)); colorArray.push(createColorJSON('tabBarTextColor', tabBarTextColor, defaultTabBarTextColor)); colorArray.push(createColorJSON('tabBarIndicator', tabBarIndicatorColor, defaultTabBarIndicatorColor)); // Swipe colors colorArray.push(createColorJSON('swipe_nav_background', swipeBackgroundColor, defaultSwipeBackgroundColor)); colorArray.push(createColorJSON('swipe_nav_inactive', swipeInactiveColor, defaultSwipeInactiveColor)); colorArray.push(createColorJSON('swipe_nav_active', swipeActiveColor, defaultSwipeActiveColor)); // Pull to Refresh color colorArray.push(createColorJSON('pull_to_refresh_color', pullToRefresh, defaultPullToRefreshColor)); // Splash colors colorArray.push(createColorJSON('splash_background', splashBackgroundColor, defaultSplashBackgroundColor)); // Progress indicator color colorArray.push(createColorJSON('progress_indicator', progressIndicatorColor, defaultProgressIndicatorColor)); // Build colors in xml from JSON array of colors var xmlFinal = builder.buildObject({resources: colorArray}); // Write to file fs.writeFile(writeDir, xmlFinal, (err) => { if (err) console.log(err); else { console.log("File written successfully\n"); } }); // Helper functions function showHelp() { console.log('Usage: generate-theme.js (dark|light|light.darkactionbar|auto) ' + 'actionBarColor statusBarColor titleColor accentColor backgroundColor ' + 'sidebarForegroundColor sidebarBackgroundColor sidebarSeparatorColor sidebarHighlightColor ' + 'tabBarBackgroundColor tabBarTextColor tabBarIndicatorColor ' + 'swipeBackgroundColor swipeInactiveColor swipeActiveColor pullToRefreshColor splashBackgroundColor activityIndicatorColor'); console.log('Example: generate-theme.js light dcdcdc 757575 000000 ff0000 ...'); console.log('Colors can be blank for default'); process.exit(1); } function checkColorRegex(color, message) { if (color !== '' && !/^(([0-9a-f]){6}|([0-9a-f]){8})$/.test(color)) { console.log(message + ' ' + color); showHelp(); } } // Creates a JSON object of color which will be then transformed to xml function createColorJSON(colorName, colorCode, defaultColor) { if (colorCode !== '') { return {color: {$: {name: colorName}, _: '#' + colorCode}}; } else { return {color: {$: {name: colorName}, _: '#' + defaultColor}}; } } # End of /mnt/data/jocal3--U/jocal3--U/android/generate-theme.js # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsResultBridge.java package co.median.android; public class JsResultBridge { public static String jsResult = ""; } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsResultBridge.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/AndroidManifest.xml # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/AndroidManifest.xml # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/java/com/median/testFiles/TestMethods.java package com.median.testFiles; import android.webkit.WebView; import androidx.test.espresso.NoMatchingViewException; import androidx.test.espresso.PerformException; import androidx.test.espresso.contrib.DrawerActions; import androidx.test.espresso.web.webdriver.Locator; import androidx.test.uiautomator.UiDevice; import io.gonative.android.HelperClass; import org.json.JSONArray; import org.json.JSONException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.regex.Pattern; import static androidx.test.espresso.Espresso.onData; import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.Espresso.pressBackUnconditionally; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.pressImeActionButton; import static androidx.test.espresso.action.ViewActions.swipeDown; import static androidx.test.espresso.action.ViewActions.typeText; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withResourceName; import static androidx.test.espresso.matcher.ViewMatchers.withText; import static androidx.test.espresso.web.assertion.WebViewAssertions.webMatches; import static androidx.test.espresso.web.sugar.Web.onWebView; import static androidx.test.espresso.web.webdriver.DriverAtoms.findElement; import static androidx.test.espresso.web.webdriver.DriverAtoms.getText; import static androidx.test.espresso.web.webdriver.DriverAtoms.webClick; import static org.hamcrest.Matchers.anything; import static org.hamcrest.Matchers.equalTo; import io.median.android.MainActivity; import io.median.android.R; public class TestMethods { public TestMethods(MainActivity mainActivity, WebView webView){ m_mainActivity = mainActivity; m_webView = webView; } protected static String currentURL = "URL Not assigned yet"; protected static String prevURL = "URL Not assigned yet"; private final WebView m_webView; private final MainActivity m_mainActivity; private void m_UpdateCurrentURL() throws InterruptedException { m_mainActivity.runOnUiThread(() -> currentURL = m_webView.getOriginalUrl()); Thread.sleep(1000); } protected int getNewLoad(){ return HelperClass.newLoad; } public boolean isURL(String url){ try { new URL(url); return true; }catch (MalformedURLException e){ return false; } } public void waitForPageLoaded() throws InterruptedException { int counter = 0; while (getNewLoad() == 0) { if (counter >= 15) throw new RuntimeException("Page failed to load in less than 15 seconds."); Thread.sleep(1000); counter++; } m_UpdateCurrentURL(); Thread.sleep(1000); counter = 0; while(currentURL == null && counter <= 10){ Thread.sleep(1000); counter++; m_UpdateCurrentURL(); } if(currentURL != null) HelperClass.newLoad = 0; else throw new RuntimeException("Current URL cannot be retrieved from the WebView."); } public void testNavigation(JSONArray sidebarObjects) throws InterruptedException, JSONException { for(int i = 0; i < sidebarObjects.length(); i++){ onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); onData(anything()).inAdapterView(withId(R.id.drawer_list)).atPosition(i).perform(click()); waitForPageLoaded(); String sidebarURL = sidebarObjects.getJSONObject(i).getString("url"); if(!currentURL.matches(sidebarURL)) throw new RuntimeException("Sidebar Menu " + (i+1) + " did not load the designated URL - " + sidebarURL); } } public void testInternalvExternalLinks(UiDevice uiDevice) throws InterruptedException { m_mainActivity.runOnUiThread(() -> m_webView.loadUrl("https://gonative-test-web.web.app/")); waitForPageLoaded(); onWebView().withElement(findElement(Locator.ID, "facebook_link")).perform(webClick()); waitForPageLoaded(); String dFacebook = uiDevice.getCurrentPackageName(); if(dFacebook.contains("io.gonative.android")){ uiDevice.pressBack(); Thread.sleep(2000); }else throw new RuntimeException("Facebook link opened externally"); onWebView().withElement(findElement(Locator.ID, "twitter_link")).perform(webClick()); Thread.sleep(8000); String dTwitter = uiDevice.getCurrentPackageName(); if(dTwitter.contains("io.gonative.android")) throw new RuntimeException("Twitter opened internally."); else { uiDevice.pressBack(); Thread.sleep(1000); } } public void testRefreshButton() throws InterruptedException { onView(withId(R.id.action_refresh)).perform(click()); waitForPageLoaded(); } public void testSearchButton() throws InterruptedException { String query = "Gonative"; onView(withId(R.id.action_search)).perform(click()); Thread.sleep(1000); onView(withResourceName("search_src_text")).perform(typeText(query), pressImeActionButton()); waitForPageLoaded(); try{ onWebView().withElement(findElement(Locator.ID, "search_param")).check(webMatches(getText(), equalTo(query))); }catch (Exception exception){ throw new RuntimeException("Search button failed to load the results with query - " + query); } pressBackUnconditionally(); Thread.sleep(2000); } public void m_testTabNavigation(HashMap tabMenus, ArrayList tabMenuRegexes) throws JSONException, InterruptedException { while(!(currentURL.matches(tabMenuRegexes.get(0).pattern()))){ m_mainActivity.runOnUiThread(() -> m_webView.loadUrl("https://gonative.io/about/")); waitForPageLoaded(); } if (tabMenus.size() == 0) throw new RuntimeException("No Tab Menus Added."); else { for (Pattern p : tabMenuRegexes) { if (currentURL.matches(p.pattern())) { try { for (String i : tabMenus.keySet()) { for (int j = 0; j < tabMenus.get(i).length(); ) { if (currentURL.matches(p.pattern())) { if (isURL(tabMenus.get(i).getJSONObject(j).get("url").toString())) { Thread.sleep(1000); onView(withText(tabMenus.get(i).getJSONObject(j).get("label").toString())).perform(click()); waitForPageLoaded(); prevURL = currentURL; pressBackUnconditionally(); waitForPageLoaded(); String tabURL = tabMenus.get(i).getJSONObject(j).get("url").toString(); if (!(prevURL.matches(tabURL))) throw new RuntimeException("Tab " + (j+1) + " could not load the designated URL - " + prevURL); j++; prevURL = currentURL; } else { onView(withText(tabMenus.get(i).getJSONObject(j).get("label").toString())).perform(click()); j++; Thread.sleep(2000); } } } } } catch (NoMatchingViewException | PerformException noMatchingViewException) { throw new RuntimeException("Tab Menu not displayed in the desired regex: " + p.pattern()); } } else{ throw new RuntimeException("No Tab Menus found on the current page."); } } } } public void testPullToRefresh() throws InterruptedException { onView(withId(R.id.webview)).perform(swipeDown()); waitForPageLoaded(); } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/java/com/median/testFiles/TestMethods.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/customCSS.css pre code.hljs { display: block; overflow-x: auto; padding: 1em } code.hljs { padding: 3px 5px } /* Style with support for rainbow parens */ .hljs { background: #474949; color: #d1d9e1 } .hljs-comment, .hljs-quote { color: #969896; font-style: italic } .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-type, .hljs-addition { color: #cc99cc } .hljs-number, .hljs-selector-attr, .hljs-selector-pseudo { color: #f99157 } .hljs-string, .hljs-doctag, .hljs-regexp { color: #8abeb7 } .hljs-title, .hljs-name, .hljs-section, .hljs-built_in { color: #b5bd68 } .hljs-variable, .hljs-template-variable, .hljs-selector-id, .hljs-title.class_, .hljs-class .hljs-title { color: #ffcc66 } .hljs-section, .hljs-name, .hljs-strong { font-weight: bold } .hljs-symbol, .hljs-bullet, .hljs-subst, .hljs-meta, .hljs-link { color: #f99157 } .hljs-deletion { color: #dc322f } .hljs-formula { background: #eee8d5 } .hljs-attr, .hljs-attribute { color: #81a2be } .hljs-emphasis { font-style: italic } .ant-table-thead .ant-table-cell { border-top-width: 1px !important; border-bottom-width: 1px !important; --tw-border-opacity: 1 !important; border-color: rgb(242 241 237 / var(--tw-border-opacity)) !important; --tw-bg-opacity: 1 !important; background-color: rgb(247 247 246 / var(--tw-bg-opacity)) !important; padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; --tw-text-opacity: 1 !important; color: rgb(68 68 68 / var(--tw-text-opacity)) !important } .ant-table-cell { padding-left: 0.5rem !important; padding-right: 0.5rem !important; padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; font-weight: 500 !important; --tw-text-opacity: 1 !important; color: rgb(0 0 0 / var(--tw-text-opacity)) !important } .ant-table-cell:first-child { padding-left: 1.5rem !important } .ant-table-cell:last-child { padding-right: 1.5rem !important } .ant-table-cell-with-append { display: flex !important; flex-direction: row !important; gap: 0.25rem !important; font-weight: 500 !important } .ant-table-row { --tw-border-opacity: 1 !important; border-color: rgb(247 247 246 / var(--tw-border-opacity)) !important } .ant-table-thead { border-radius: 0.25rem !important } /* Remove divider between column headers */ .ant-table-cell::before { display: none } /*# sourceMappingURL=application-bac77ca0.css.map*/ # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/customCSS.css # Start of /mnt/data/jocal3--U/jocal3--U/android/generate-plugin-icons.sh #!/bin/sh BASEDIR=$(dirname $0) # intercom notification icon if [[ $1 == "intercom" ]] then cp $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-mdpi/intercom_push_icon.png cp $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-hdpi/intercom_push_icon.png cp $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-xhdpi/intercom_push_icon.png cp $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-xxhdpi/intercom_push_icon.png cp $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-xxxhdpi/intercom_push_icon.png fi # cordial notification icon if [[ $1 == "cordial" ]] then cp $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-mdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-hdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-xhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-xxhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-xxxhdpi/ic_notification.png fi # braze notification icon if [[ $1 == "braze" ]] then cp $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-mdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-hdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-xhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-xxhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-xxxhdpi/ic_notification.png fi # moengage notification icon if [[ $1 == "moengage" ]] then cp $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-mdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-hdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-xhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-xxhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-xxxhdpi/ic_notification.png fi # End of /mnt/data/jocal3--U/jocal3--U/android/generate-plugin-icons.sh # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/DownloadService.java package co.median.android; import android.app.Service; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Intent; import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.text.TextUtils; import android.util.Log; import android.webkit.MimeTypeMap; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.core.content.FileProvider; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import co.median.median_core.AppConfig; import co.median.median_core.GNLog; import co.median.median_core.LeanUtils; public class DownloadService extends Service { private static final String TAG = "DownloadService"; private static final String EXTRA_DOWNLOAD_ID = "download_id"; private static final String ACTION_CANCEL_DOWNLOAD = "action_cancel_download"; private static final int BUFFER_SIZE = 4096; private static final int timeout = 5; // in seconds private final Handler handler = new Handler(Looper.getMainLooper()); private final Map downloadTasks = new HashMap<>(); private int downloadId = 0; private String userAgent; @Override public void onCreate() { super.onCreate(); AppConfig appConfig = AppConfig.getInstance(this); this.userAgent = appConfig.userAgent; } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent.getAction().equals(ACTION_CANCEL_DOWNLOAD)) { int id = intent.getIntExtra(EXTRA_DOWNLOAD_ID, 0); cancelDownload(id); } return START_NOT_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { return new DownloadBinder(); } public class DownloadBinder extends Binder { public DownloadService getService() { return DownloadService.this; } } public void startDownload(String url, String filename, String mimetype, boolean shouldSaveToGallery, boolean open, FileDownloader.DownloadLocation location) { DownloadTask downloadTask = new DownloadTask(url, filename, mimetype, shouldSaveToGallery, open, location); downloadTasks.put(downloadTask.getId(), downloadTask); downloadTask.startDownload(); } public void cancelDownload(int downloadId) { DownloadTask downloadTask = downloadTasks.get(downloadId); if (downloadTask != null && downloadTask.isDownloading()) { downloadTask.cancelDownload(); } } public void handleDownloadUri(FileDownloader.DownloadLocation location, Uri uri, String mimeType, boolean shouldSaveToGallery, boolean open, String filename) { if (uri == null) return; if (location == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) { if (shouldSaveToGallery) { addFileToGallery(uri); } if (open) { viewFile(uri, mimeType); } else { handler.post(() -> { if (shouldSaveToGallery) { Toast.makeText(this, R.string.file_download_finished_gallery, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, String.format(this.getString(R.string.file_download_finished_with_name), filename), Toast.LENGTH_SHORT).show(); } }); } } else { if (open) { viewFile(uri, mimeType); } else { handler.post(() -> Toast.makeText(this, String.format(this.getString(R.string.file_download_finished_with_name), filename), Toast.LENGTH_SHORT).show()); } } } private void viewFile(Uri uri, String mimeType) { try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, mimeType); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch (ActivityNotFoundException e) { String message = getResources().getString(R.string.file_handler_not_found); handler.post(() -> { Toast.makeText(this, message, Toast.LENGTH_LONG).show(); }); } catch (Exception ex) { GNLog.getInstance().logError(TAG, "viewFile: Exception:", ex); } } private void addFileToGallery(Uri uri) { Log.d(TAG, "addFileToGallery: Adding to Albums . . ."); Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); mediaScanIntent.setData(uri); sendBroadcast(mediaScanIntent); } private class DownloadTask { private final int id; private final String url; private boolean isDownloading; private HttpURLConnection connection; private InputStream inputStream; private FileOutputStream outputStream; private File outputFile = null; private Uri downloadUri; private String filename; private String extension; private String mimetype; private boolean saveToGallery; private boolean openOnFinish; private final FileDownloader.DownloadLocation location; public DownloadTask(String url, String filename, String mimetype, boolean saveToGallery, boolean open, FileDownloader.DownloadLocation location) { this.id = downloadId++; this.url = url; this.filename = filename; this.mimetype = mimetype; this.isDownloading = false; this.saveToGallery = saveToGallery; this.openOnFinish = open; this.location = location; } public int getId() { return id; } public boolean isDownloading() { return isDownloading; } public void startDownload() { Log.d(TAG, "startDownload: Starting download"); isDownloading = true; AtomicReference finalFilename = new AtomicReference<>(""); new Thread(() -> { Log.d(TAG, "startDownload: Thread started"); try { URL downloadUrl = new URL(url); connection = (HttpURLConnection) downloadUrl.openConnection(); connection.setInstanceFollowRedirects(true); connection.setRequestProperty("User-Agent", userAgent); connection.setConnectTimeout(timeout * 1000); connection.connect(); if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { GNLog.getInstance().logError(TAG, "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage()); isDownloading = false; return; } double fileSizeInMB = connection.getContentLength() / 1048576.0; Log.d(TAG, "startDownload: File size in MB: " + fileSizeInMB); if (connection.getHeaderField("Content-Type") != null) mimetype = connection.getHeaderField("Content-Type"); if (!TextUtils.isEmpty(filename)) { extension = FileDownloader.getFilenameExtension(filename); if (TextUtils.isEmpty(extension)) { extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimetype); } else if (Objects.equals(filename, extension)) { filename = "download"; } else { filename = filename.substring(0, filename.length() - (extension.length() + 1)); mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } } else { // guess file name and extension String guessedName = LeanUtils.guessFileName(url, connection.getHeaderField("Content-Disposition"), mimetype); int pos = guessedName.lastIndexOf('.'); if (pos == -1) { filename = guessedName; extension = ""; } else if (pos == 0) { filename = "download"; extension = guessedName.substring(1); } else { filename = guessedName.substring(0, pos); extension = guessedName.substring(pos + 1); } if (!TextUtils.isEmpty(extension)) { // Update mimetype based on final filename extension mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } } if (location == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { ContentResolver contentResolver = getApplicationContext().getContentResolver(); if (saveToGallery && mimetype.contains("image")) { downloadUri = FileDownloader.createExternalFileUri(contentResolver, filename, mimetype, Environment.DIRECTORY_PICTURES); } else { downloadUri = FileDownloader.createExternalFileUri(contentResolver, filename, mimetype, Environment.DIRECTORY_DOWNLOADS); saveToGallery = false; } if (downloadUri != null) { finalFilename.set(FileDownloader.getFileNameFromUri(downloadUri, contentResolver)); outputStream = (FileOutputStream) contentResolver.openOutputStream(downloadUri); } else { isDownloading = false; handler.post(() -> { Toast.makeText(DownloadService.this, getString(R.string.file_download_error), Toast.LENGTH_SHORT).show(); }); GNLog.getInstance().logError(TAG, "Error creating file - " + "filename: " + filename + ", " + "mimetype: " + mimetype); return; } } else { if (saveToGallery) { outputFile = FileDownloader.createOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), filename, extension); } else { outputFile = FileDownloader.createOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), filename, extension); } finalFilename.set(outputFile.getName()); outputStream = new FileOutputStream(outputFile); } } else { this.openOnFinish = true; outputFile = FileDownloader.createOutputFile(getFilesDir(), filename, extension); finalFilename.set(outputFile.getName()); outputStream = new FileOutputStream(outputFile); } int fileLength = connection.getContentLength(); inputStream = connection.getInputStream(); byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead; int bytesDownloaded = 0; while ((bytesRead = inputStream.read(buffer)) != -1 && isDownloading) { outputStream.write(buffer, 0, bytesRead); bytesDownloaded += bytesRead; int progress = (int) (bytesDownloaded * 100 / fileLength); Log.d(TAG, "startDownload: Download progress: " + progress); } if (!isDownloading && outputFile != null) { outputFile.delete(); outputFile = null; } } catch (IOException e) { GNLog.getInstance().logError(TAG, "startDownload: ", e); } finally { try { if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); if (connection != null) connection.disconnect(); } catch (IOException e) { GNLog.getInstance().logError(TAG, "startDownload: ", e); } isDownloading = false; if (downloadUri == null && outputFile != null) { downloadUri = FileProvider.getUriForFile(DownloadService.this, DownloadService.this.getApplicationContext().getPackageName() + ".fileprovider", outputFile); } handleDownloadUri(location, downloadUri, mimetype, saveToGallery, openOnFinish, finalFilename.get()); } }).start(); } public void cancelDownload() { isDownloading = false; Toast.makeText(DownloadService.this, getString(R.string.download_canceled) + " " + filename, Toast.LENGTH_SHORT).show(); } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/DownloadService.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/java/com/median/testFiles/FirstTestClass.java package com.median.testFiles; import android.webkit.WebView; import androidx.test.ext.junit.rules.ActivityScenarioRule; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.LargeTest; import androidx.test.filters.SdkSuppress; import androidx.test.uiautomator.UiDevice; import org.json.JSONException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import io.median.android.MainActivity; import io.median.android.R; import io.median.median_core.AppConfig; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; @RunWith(AndroidJUnit4.class) @SdkSuppress(minSdkVersion = 18) @LargeTest public class FirstTestClass{ TestMethods testMethods; AppConfig appConfig; WebView webView; private UiDevice uiDevice; @Rule public ActivityScenarioRule activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class); @Before public void initMethod() throws InterruptedException { for(int i = 0; i < 10; i++){ try{ uiDevice = UiDevice.getInstance(getInstrumentation()); }catch (RuntimeException runtimeException){ Thread.sleep(2000); continue; } Thread.sleep(1000); break; } activityScenarioRule.getScenario().onActivity(activity -> { appConfig = AppConfig.getInstance(activity); webView = activity.findViewById(R.id.webview); testMethods = new TestMethods(activity, webView); }); } //Sidebar Navigation Test @Test public void testSidebarNavigation() throws InterruptedException, JSONException { if(appConfig.showNavigationMenu && (appConfig.menus.get("default") != null)){ if(appConfig.menus.get("default") == null) throw new RuntimeException("Navigation drawer list not found."); else { testMethods.waitForPageLoaded(); testMethods.testNavigation(appConfig.menus.get("default")); } } } //Tab Menu Navigation Test @Test public void testTabMenuNavigation() throws JSONException, InterruptedException { if(appConfig.tabMenuRegexes.size() == 0) throw new RuntimeException("No Tab Menus found."); else{ testMethods.waitForPageLoaded(); testMethods.m_testTabNavigation(appConfig.tabMenus, appConfig.tabMenuRegexes); } } //Internal vs External Links Test @Test public void testIvE() throws InterruptedException { testMethods.waitForPageLoaded(); testMethods.testInternalvExternalLinks(uiDevice); } //Pull to Refresh Test @Test public void pullToRefresh() throws InterruptedException { if(appConfig.pullToRefresh){ testMethods.waitForPageLoaded(); testMethods.testPullToRefresh(); } } //Search Button Test @Test public void testSearch() throws InterruptedException { if(appConfig.searchTemplateUrl != null && !appConfig.searchTemplateUrl.isEmpty()){ testMethods.waitForPageLoaded(); testMethods.testSearchButton(); } } //Refresh Button Test @Test public void testRefreshButton() throws InterruptedException { if(appConfig.showRefreshButton){ testMethods.waitForPageLoaded(); testMethods.testRefreshButton(); } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/java/com/median/testFiles/FirstTestClass.java # Start of /mnt/data/jocal3--U/jocal3--U/android/gradle.properties org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m android.enableJetifier=true android.useAndroidX=true enableLogsInRelease=false android.nonTransitiveRClass=false android.nonFinalResIds=false # End of /mnt/data/jocal3--U/jocal3--U/android/gradle.properties # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/RegistrationManager.java package co.median.android; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import org.json.JSONArray; import org.json.JSONObject; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import co.median.median_core.GNLog; import co.median.median_core.LeanUtils; /** * Created by weiyin on 10/4/15. */ public class RegistrationManager { private final static String TAG = RegistrationManager.class.getName(); private Context context; private JSONObject customData; private String lastUrl; private List registrationEndpoints; RegistrationManager(Context context) { this.context = context; this.registrationEndpoints = new LinkedList<>(); } public void processConfig(JSONArray endpoints) { registrationEndpoints.clear(); if (endpoints == null) return; for (int i = 0; i < endpoints.length(); i++) { JSONObject endpoint = endpoints.optJSONObject(i); if (endpoint == null) continue; String url = LeanUtils.optString(endpoint, "url"); if (url == null) { Log.w(TAG, "Invalid registration: endpoint url is null"); continue; } List urlRegexes = LeanUtils.createRegexArrayFromStrings(endpoint.opt("urlRegex")); RegistrationEndpoint registrationEndpoint = new RegistrationEndpoint(url, urlRegexes); registrationEndpoints.add(registrationEndpoint); } } public void checkUrl(String url) { this.lastUrl = url; for (RegistrationEndpoint endpoint : registrationEndpoints) { if (LeanUtils.stringMatchesAnyRegex(url, endpoint.urlRegexes)) { endpoint.sendRegistrationInfo(); } } } public void setCustomData(JSONObject customData) { this.customData = customData; registrationDataChanged(); } public void sendToAllEndpoints() { for (RegistrationEndpoint endpoint : registrationEndpoints) { endpoint.sendRegistrationInfo(); } } private void registrationDataChanged() { for (RegistrationEndpoint endpoint : registrationEndpoints) { if (this.lastUrl != null && LeanUtils.stringMatchesAnyRegex(this.lastUrl, endpoint.urlRegexes)) { endpoint.sendRegistrationInfo(); } } } public void subscriptionInfoChanged(){ registrationDataChanged(); } private class RegistrationEndpoint { private String postUrl; private List urlRegexes; RegistrationEndpoint(String postUrl, List urlRegexes) { this.postUrl = postUrl; this.urlRegexes = urlRegexes; } void sendRegistrationInfo() { new SendRegistrationTask(context, this, RegistrationManager.this).execute(); } } private static class SendRegistrationTask extends AsyncTask { private RegistrationEndpoint registrationEndpoint; private RegistrationManager registrationManager; private Context context; SendRegistrationTask(Context context, RegistrationEndpoint registrationEndpoint, RegistrationManager registrationManager) { this.registrationEndpoint = registrationEndpoint; this.registrationManager = registrationManager; this.context = context; } @Override protected Void doInBackground(Void... voids) { Map toSend = new HashMap<>(); toSend.putAll(Installation.getInfo(registrationManager.context)); // Append provider info to Map toSend if (((GoNativeApplication) context).getAnalyticsProviderInfo() != null) { toSend.putAll(((GoNativeApplication) context).getAnalyticsProviderInfo()); } if (registrationManager.customData != null) { Iterator keys = registrationManager.customData.keys(); while(keys.hasNext()) { String key = keys.next(); toSend.put("customData_" + key, registrationManager.customData.opt(key)); } } try { JSONObject json = new JSONObject(toSend); URL url = new URL(registrationEndpoint.postUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); writer.write(json.toString()); writer.close(); connection.connect(); int result = connection.getResponseCode(); if (result < 200 || result > 299) { Log.w(TAG, "Recevied status code " + result + " when posting to " + registrationEndpoint.postUrl); } } catch (Exception e) { GNLog.getInstance().logError(TAG, "Error posting to " + registrationEndpoint.postUrl, e); } return null; } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/RegistrationManager.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/GoNativeApplication.java package co.median.android; import android.content.ComponentCallbacks2; import android.os.Message; import android.widget.Toast; import androidx.appcompat.app.AppCompatDelegate; import androidx.multidex.MultiDexApplication; import java.util.List; import java.util.Map; import co.median.median_core.AppConfig; import co.median.median_core.Bridge; import co.median.median_core.BridgeModule; import co.median.median_core.GNLog; /** * Created by weiyin on 9/2/15. * Copyright 2014 GoNative.io LLC */ public class GoNativeApplication extends MultiDexApplication { private LoginManager loginManager; private RegistrationManager registrationManager; private WebViewPool webViewPool; private Message webviewMessage; private GoNativeWindowManager goNativeWindowManager; private List plugins; private final static String TAG = GoNativeApplication.class.getSimpleName(); public final Bridge mBridge = new Bridge(this) { @Override protected List getPlugins() { if (GoNativeApplication.this.plugins == null) { GoNativeApplication.this.plugins = new PackageList(GoNativeApplication.this).getPackages(); } return GoNativeApplication.this.plugins; } }; private boolean appBackgrounded = false; @Override public void onCreate() { super.onCreate(); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); mBridge.onApplicationCreate(this); AppConfig appConfig = AppConfig.getInstance(this); if (appConfig.configError != null) { Toast.makeText(this, "Invalid appConfig json", Toast.LENGTH_LONG).show(); GNLog.getInstance().logError(TAG, "AppConfig error", appConfig.configError); } this.loginManager = new LoginManager(this); if (appConfig.registrationEndpoints != null) { this.registrationManager = new RegistrationManager(this); registrationManager.processConfig(appConfig.registrationEndpoints); } // some global webview setup WebViewSetup.setupWebviewGlobals(this); webViewPool = new WebViewPool(); goNativeWindowManager = new GoNativeWindowManager(); } public LoginManager getLoginManager() { return loginManager; } public RegistrationManager getRegistrationManager() { return registrationManager; } public WebViewPool getWebViewPool() { return webViewPool; } public Message getWebviewMessage() { return webviewMessage; } public void setWebviewMessage(Message webviewMessage) { this.webviewMessage = webviewMessage; } public Map getAnalyticsProviderInfo() { return mBridge.getAnalyticsProviderInfo(); } public GoNativeWindowManager getWindowManager() { return goNativeWindowManager; } @Override public void onTrimMemory(int level) { super.onTrimMemory(level); if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { // App has gone into the background setAppBackgrounded(true); } } public boolean isAppBackgrounded() { return appBackgrounded; } public void setAppBackgrounded(boolean appBackgrounded) { this.appBackgrounded = appBackgrounded; } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/GoNativeApplication.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/build.gradle import groovy.json.JsonSlurper apply plugin: 'com.android.application' apply plugin: 'kotlin-android' //[enabled by builder] apply plugin: 'com.google.gms.google-services' //[enabled by builder] apply plugin: 'com.google.firebase.crashlytics' ext { fbAppId = "" fbClientToken = "" onesignalAppId = "" adMobAppId = "" googleServiceInvalid = "false" auth0Domain = "" auth0Scheme = "" } task parseAppConfig { def jsonFile = file('src/main/assets/appConfig.json') def parsedJson = new JsonSlurper().parseText(jsonFile.text) if (parsedJson.services.facebook) { if (parsedJson.services.facebook.appId) { fbAppId = parsedJson.services.facebook.appId } if (parsedJson.services.facebook.clientToken) { fbClientToken = parsedJson.services.facebook.clientToken } } if (parsedJson.services.socialLogin && parsedJson.services.socialLogin.facebookLogin) { if (parsedJson.services.socialLogin.facebookLogin.appId) { fbAppId = parsedJson.services.socialLogin.facebookLogin.appId } if (parsedJson.services.socialLogin.facebookLogin.clientToken) { fbClientToken = parsedJson.services.socialLogin.facebookLogin.clientToken } } if (parsedJson.services.oneSignal && parsedJson.services.oneSignal.applicationId) { onesignalAppId = parsedJson.services.oneSignal.applicationId } if (parsedJson.services.admob && parsedJson.services.admob.admobAndroid && parsedJson.services.admob.admobAndroid.applicationId) { adMobAppId = parsedJson.services.admob.admobAndroid.applicationId } if (parsedJson.services.braze) { if (parsedJson.services.braze.androidApiKey) { gradle.ext.set("braze_api_key", parsedJson.services.braze.androidApiKey) } if (parsedJson.services.braze.androidEndpointKey) { gradle.ext.set("braze_endpoint_key", parsedJson.services.braze.androidEndpointKey) } } if (parsedJson.services.auth0) { if (parsedJson.services.auth0.domain) { auth0Domain = parsedJson.services.auth0.domain } if (parsedJson.services.auth0.scheme) { auth0Scheme = parsedJson.services.auth0.scheme } } } task checkGoogleService { plugins.withId("com.google.gms.google-services") { def googleServiceJsonFile = file('google-services.json') if (project.file(googleServiceJsonFile).exists()) { if (googleServiceJsonFile.text.isEmpty()) { googleServiceInvalid = "true" } } else { googleServiceInvalid = "true" } } } build.dependsOn parseAppConfig build.dependsOn checkGoogleService android { defaultConfig { compileSdk 34 minSdkVersion 23 targetSdkVersion 34 applicationId "co.median.android.oyoloz" versionCode 8 multiDexEnabled true vectorDrawables.useSupportLibrary = true manifestPlaceholders = [manifestApplicationId: "${applicationId}", onesignal_app_id: onesignalAppId, onesignal_google_project_number: "", admob_app_id: adMobAppId, facebook_app_id: fbAppId, facebook_client_token: fbClientToken, auth0Domain: auth0Domain, auth0Scheme: auth0Scheme ] } compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } signingConfigs { release { storeFile file("../../release.keystore") storePassword "password" keyAlias "release" keyPassword "password" } upload { storeFile file("../../upload.keystore") storePassword "password" keyAlias "upload" keyPassword "password" } } buildTypes { debug { applicationIdSuffix ".debug" } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' zipAlignEnabled true debuggable project.getProperties().get("enableLogsInRelease").toBoolean() signingConfig signingConfigs.release } upload { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' zipAlignEnabled true matchingFallbacks = ['release'] debuggable project.getProperties().get("enableLogsInRelease").toBoolean() signingConfig signingConfigs.upload } buildTypes.each { it.buildConfigField 'boolean', 'GOOGLE_SERVICE_INVALID', googleServiceInvalid } } flavorDimensions "webview" productFlavors { normal { dimension "webview" } } namespace 'co.median.android' testNamespace '${applicationId}.test' buildFeatures { buildConfig true } } dependencies { /**** dependencies used by all apps ****/ implementation "androidx.core:core-ktx:1.12.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.squareup:seismic:1.0.2' implementation 'androidx.webkit:webkit:1.10.0' implementation 'androidx.core:core-splashscreen:1.0.1' implementation "com.github.gonativeio:gonative-icons:$iconsVersion" implementation "com.github.gonativeio:gonative-android-core:$coreVersion" /**** end all apps ****/ /**** add-on module dependencies ****/ /**** end modules ****/ /**** Google Android and Play Services dependencies ****/ implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.browser:browser:1.7.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.11.0' implementation "androidx.drawerlayout:drawerlayout:1.2.0" implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' /**** end google ****/ /**** local dependencies ****/ implementation fileTree(dir: 'libs', include: '*.jar') implementation fileTree(dir: 'libs', include: '*.aar') /**** end local ****/ } apply from: file("../plugins.gradle"); applyNativeModulesAppBuildGradle(project) # End of /mnt/data/jocal3--U/jocal3--U/android/app/build.gradle # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ActionManager.java package co.median.android; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.widget.LinearLayoutCompat; import androidx.appcompat.widget.SearchView; import androidx.core.content.ContextCompat; import androidx.drawerlayout.widget.DrawerLayout; import com.google.android.material.appbar.MaterialToolbar; import io.gonative.android.icons.Icon; import org.json.JSONArray; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.regex.Pattern; import co.median.median_core.AppConfig; /** * Created by weiyin on 11/25/14. * Copyright 2014 GoNative.io LLC */ public class ActionManager { private static final String TAG = ActionManager.class.getName(); private static final String ACTION_SHARE = "share"; private static final String ACTION_REFRESH = "refresh"; private static final String ACTION_SEARCH = "search"; private static final int ACTIONBAR_ITEM_MARGIN = 132; private final MainActivity activity; private final HashMapitemToUrl; private final int action_button_size; private final ActionBar actionBar; private final ImageView actionBarImageTitle; private final int colorForeground; private final int colorBackground; private boolean isRoot; private String currentMenuID; private LinearLayout header; private LinearLayoutCompat menuContainer; private RelativeLayout titleContainer; private boolean isOnSearchMode = false; private SearchView searchView; private int leftItemsCount = 0; private int rightItemsCount = 0; private String currentUrl; ActionManager(MainActivity activity) { this.activity = activity; this.itemToUrl = new HashMap<>(); this.action_button_size = this.activity.getResources().getInteger(R.integer.action_button_size); this.actionBar = activity.getSupportActionBar(); this.actionBarImageTitle = new ImageView(activity); this.actionBarImageTitle.setImageResource(R.drawable.ic_actionbar); this.colorForeground = activity.getResources().getColor(R.color.titleTextColor); this.colorBackground = activity.getResources().getColor(R.color.colorPrimary); } public void setupActionBar(boolean isRoot) { if (actionBar == null) return; this.isRoot = isRoot; AppConfig appConfig = AppConfig.getInstance(activity); // Change hamburger button to back arrow if window is not root if (!isRoot) { actionBar.setDisplayHomeAsUpEnabled(true); Drawable backArrow = ContextCompat.getDrawable(activity, R.drawable.abc_ic_ab_back_material); backArrow.setColorFilter(colorForeground, PorterDuff.Mode.SRC_ATOP); actionBar.setHomeAsUpIndicator(backArrow); } header = (LinearLayout) activity.getLayoutInflater().inflate(R.layout.actionbar_title, null); // why use a custom view and not setDisplayUseLogoEnabled and setLogo? // Because logo doesn't work! actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayShowTitleEnabled(false); actionBar.setCustomView(header); ActionBar.LayoutParams params = (ActionBar.LayoutParams) header.getLayoutParams(); params.width = ActionBar.LayoutParams.MATCH_PARENT; titleContainer = header.findViewById(R.id.title_container); menuContainer = header.findViewById(R.id.left_menu_container); ViewGroup.MarginLayoutParams titleContainerParams = (ViewGroup.MarginLayoutParams) titleContainer.getLayoutParams(); titleContainerParams.rightMargin = ACTIONBAR_ITEM_MARGIN + 8; MaterialToolbar toolbar = activity.findViewById(R.id.toolbar); toolbar.setBackgroundColor(colorBackground); } public void setupTitleDisplayForUrl(String url) { if (actionBar == null || url == null) return; AppConfig appConfig = AppConfig.getInstance(activity); this.currentUrl = url; boolean urlHasNavTitle = false; boolean urlHasActionMenu = false; // Check for Nav title HashMap urlNavTitle = appConfig.getNavigationTitleForUrl(url); if (urlNavTitle != null) { urlHasNavTitle = true; } // Check for Action Menus ArrayList regexes = appConfig.actionRegexes; ArrayList ids = appConfig.actionIDs; if (regexes != null && ids != null) { for (int i = 0; i < regexes.size(); i++) { Pattern regex = regexes.get(i); if (regex.matcher(url).matches()) { urlHasActionMenu = true; break; } } } if (!appConfig.showActionBar && !appConfig.showNavigationMenu && !urlHasNavTitle && !urlHasActionMenu) { actionBar.hide(); } else { if (urlHasNavTitle) { boolean showImage = true; if (urlNavTitle.containsKey("showImage")) showImage = (boolean) urlNavTitle.get("showImage"); if (showImage) { // Show image title actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); showTitleView(actionBarImageTitle); } else { // Show text title String title = activity.getTitle().toString();; if (urlNavTitle.containsKey("title")) title = (String) urlNavTitle.get("title"); showTextActionBarTitle(title); } } else { showLogoInActionBar(appConfig.shouldShowNavigationTitleImageForUrl(currentUrl)); } setupActionBarDisplay(); actionBar.show(); } } private void showLogoInActionBar(boolean show) { if (actionBar == null) return; if (show) { showTitleView(actionBarImageTitle); } else { // Show Text showTextActionBarTitle(activity.getTitle()); } } public void showTextActionBarTitle(CharSequence title) { TextView textView = new TextView(activity); textView.setText(TextUtils.isEmpty(title) ? activity.getTitle() : title); textView.setTextSize(18); textView.setTypeface(null, Typeface.BOLD); textView.setMaxLines(1); textView.setEllipsize(TextUtils.TruncateAt.END); textView.setTextColor(colorForeground); showTitleView(textView); } public void showTitleView(View titleView) { if (actionBar == null) return; if (titleView == null) return; LinearLayout header = (LinearLayout) actionBar.getCustomView(); if (header == null) return; // Remove Title Container child views if there is any titleContainer.removeAllViews(); // Remove Title View parent if there is any if (titleView.getParent() != null) { ((ViewGroup) titleView.getParent()).removeView(titleView); } titleContainer.addView(titleView); } public void checkActions(String url) { if (this.activity == null || url == null) return; AppConfig appConfig = AppConfig.getInstance(this.activity); ArrayList regexes = appConfig.actionRegexes; ArrayList ids = appConfig.actionIDs; if (regexes == null || ids == null) { setMenuID(null); return; } for (int i = 0; i < regexes.size(); i++) { Pattern regex = regexes.get(i); if (regex.matcher(url).matches()) { setMenuID(ids.get(i)); return; } } setMenuID(null); } private void setMenuID(String menuID) { boolean changed; if (this.currentMenuID == null) { changed = menuID != null; } else { changed = menuID == null || !this.currentMenuID.equals(menuID); } if (changed) { this.currentMenuID = menuID; this.activity.invalidateOptionsMenu(); } } public void addActions(Menu menu) { this.itemToUrl.clear(); this.rightItemsCount = 0; this.leftItemsCount = 0; AppConfig appConfig = AppConfig.getInstance(this.activity); if (appConfig.actions == null) return; menuContainer.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; JSONArray actions = appConfig.actions.get(currentMenuID); if (actions == null || actions.length() == 0) { replaceLeftIcon(null); } else { if (actions.length() <= 2) { for (int itemID = 0; itemID < actions.length(); itemID++) { JSONObject entry = actions.optJSONObject(itemID); addRightButton(appConfig, menu, itemID, entry); } } else { for (int itemID = 0; itemID < actions.length(); itemID++) { JSONObject entry = actions.optJSONObject(itemID); if (itemID == 0) { addLeftButton(appConfig, entry); } else { addRightButton(appConfig, menu, itemID, entry); } } } } setupActionBarDisplay(); } private void addLeftButton(AppConfig appConfig, JSONObject entry) { if (entry == null) return; String system = AppConfig.optString(entry, "system"); String icon = AppConfig.optString(entry, "icon"); String url = AppConfig.optString(entry, "url"); if (!TextUtils.isEmpty(system)) { if (system.equalsIgnoreCase("refresh")) { if (TextUtils.isEmpty(icon)) { icon = "fa-rotate-right"; } Button refresh = createButtonMenu(icon); refresh.setOnClickListener(v -> this.activity.onRefresh()); replaceLeftIcon(refresh); } else if (system.equalsIgnoreCase("share")) { if (TextUtils.isEmpty(icon)) { icon = "fa-share"; } Button share = createButtonMenu(icon); share.setOnClickListener(v -> this.activity.sharePage(null, null)); replaceLeftIcon(share); } else if (system.equalsIgnoreCase("search")) { if (TextUtils.isEmpty(icon)) { icon = "fa fa-search"; } this.searchView = createSearchView(appConfig, icon, url, null, true); replaceLeftIcon(this.searchView); } else { addLeftCustomButton(icon, url); } } else { addLeftCustomButton(icon, url); } if (!appConfig.showNavigationMenu) { ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) menuContainer.getLayoutParams(); params.leftMargin = 35; } leftItemsCount++; } private void addLeftCustomButton(String icon, String url) { Button userButton = createButtonMenu(icon); userButton.setOnClickListener(v -> this.activity.loadUrl(url)); replaceLeftIcon(userButton); } private void addRightButton(AppConfig appConfig, Menu menu, int itemID, JSONObject entry) { if (entry == null) return; String system = AppConfig.optString(entry, "system"); String label = AppConfig.optString(entry, "label"); String icon = AppConfig.optString(entry, "icon"); String url = AppConfig.optString(entry, "url"); if (!TextUtils.isEmpty(system)) { if (system.equalsIgnoreCase("refresh")) { if (TextUtils.isEmpty(icon)) { icon = "fa-rotate-right"; } Drawable refreshIcon = new Icon(activity, icon, action_button_size, colorForeground).getDrawable(); String menuLabel = !TextUtils.isEmpty(label) ? label : "Refresh"; MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, menuLabel) .setIcon(refreshIcon) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); itemToUrl.put(menuItem, ACTION_REFRESH); } else if (system.equalsIgnoreCase("share")) { if (TextUtils.isEmpty(icon)) { icon = "fa-share"; } Drawable refreshIcon = new Icon(activity, icon, action_button_size, colorForeground).getDrawable();; String menuLabel = !TextUtils.isEmpty(label) ? label : "Share"; MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, menuLabel) .setIcon(refreshIcon) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); itemToUrl.put(menuItem, ACTION_SHARE); } else if (system.equalsIgnoreCase("search")) { if (TextUtils.isEmpty(icon)) { icon = "fa fa-search"; } String menuLabel = !TextUtils.isEmpty(label) ? label : "Search"; MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, menuLabel) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); this.searchView = createSearchView(appConfig, icon, url, menuItem, false); menuItem.setActionView(searchView); itemToUrl.put(menuItem, ACTION_SEARCH); } else { addRightCustomButton(menu, itemID, label, icon, url); } } else { addRightCustomButton(menu, itemID, label, icon, url); } rightItemsCount++; } private void addRightCustomButton(Menu menu, int itemID, String label, String icon, String url) { Drawable iconDrawable = null; if (icon != null) { iconDrawable = new Icon(activity, icon, action_button_size, colorForeground).getDrawable(); } MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, label) .setIcon(iconDrawable) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); if (url != null) { this.itemToUrl.put(menuItem, url); } } private void replaceLeftIcon(View view) { if (menuContainer == null) return; menuContainer.removeAllViews(); if (view != null) { menuContainer.addView(view); menuContainer.setVisibility(View.VISIBLE); } else { menuContainer.setVisibility(View.GONE); } } private Button createButtonMenu(String iconString) { Drawable icon = new Icon(activity, iconString, action_button_size, colorForeground).getDrawable(); icon.setBounds(0, 0, 50, 50); LinearLayout tempView = (LinearLayout) LayoutInflater.from(activity).inflate(R.layout.button_menu, null); Button button = tempView.findViewById(R.id.menu_button); tempView.removeView(button); button.setCompoundDrawables(icon, null, null, null); return button; } private SearchView createSearchView(AppConfig appConfig, String icon, String url, MenuItem menuItem, boolean forLeftSide) { SearchView searchView = new SearchView(activity); // Set layout Params to WRAP_CONTENT ViewGroup.LayoutParams searchViewParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); searchView.setLayoutParams(searchViewParams); // Left Drawer Instance DrawerLayout drawerLayout = activity.getDrawerLayout(); ActionBarDrawerToggle drawerToggle = activity.getDrawerToggle(); // search item in action bar SearchView.SearchAutoComplete searchAutoComplete = searchView.findViewById(androidx.appcompat.R.id.search_src_text); if (searchAutoComplete != null) { searchAutoComplete.setTextColor(colorForeground); int hintColor = colorForeground; hintColor = Color.argb(192, Color.red(hintColor), Color.green(hintColor), Color.blue(hintColor)); searchAutoComplete.setHintTextColor(hintColor); } searchView.setOnSearchClickListener(view -> { searchViewParams.width = ActionBar.LayoutParams.MATCH_PARENT; // Need to check this otherwise the app will crash if (!activity.isNotRoot() && appConfig.showNavigationMenu) { drawerToggle.setDrawerIndicatorEnabled(false); drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); drawerToggle.setDrawerIndicatorEnabled(false); actionBar.setDisplayShowHomeEnabled(true); } else if (!activity.isNotRoot()) { actionBar.setDisplayHomeAsUpEnabled(true); } isOnSearchMode = true; }); searchView.setOnCloseListener(() -> { if (forLeftSide) { titleContainer.setVisibility(View.VISIBLE); } else { header.setVisibility(View.VISIBLE); activity.invalidateOptionsMenu(); } searchViewParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; activity.setMenuItemsVisible(true); if (!activity.isNotRoot() && appConfig.showNavigationMenu) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); actionBar.setDisplayShowHomeEnabled(false); drawerToggle.setDrawerIndicatorEnabled(true); } else if (!activity.isNotRoot()) { actionBar.setDisplayHomeAsUpEnabled(false); } return false; }); // listener to process query searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { if (!searchView.isIconified()) { searchView.setIconified(true); } try { String q = URLEncoder.encode(query, "UTF-8"); activity.loadUrl(url + q); } catch (UnsupportedEncodingException e) { return true; } return true; } @Override public boolean onQueryTextChange(String newText) { // do nothing return true; } }); // listener to collapse action view when soft keyboard is closed searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { if (!searchView.isIconified()) { searchView.setIconified(true); } } } }); // Search view button icon and color ImageView searchIcon = searchView.findViewById(androidx.appcompat.R.id.search_button); if (searchIcon != null) { icon = !TextUtils.isEmpty(icon) ? icon : "fa fa-search"; Drawable searchButtonNewIcon = new Icon(activity, icon, action_button_size, colorForeground).getDrawable(); searchIcon.setImageDrawable(searchButtonNewIcon); searchIcon.setColorFilter(colorForeground); // Handling a bug when SearchView is expanded and setting other menu // visibility to false, SearchView would trigger unnecessary onClose event // Solution is to hide other menus first before expanding searchIcon.setOnClickListener(v -> { if (forLeftSide) { activity.setMenuItemsVisible(false); titleContainer.setVisibility(View.GONE); } else { header.setVisibility(View.GONE); activity.setMenuItemsVisible(false, menuItem); } // Expand SearchView, simulates onSearchViewClicked event searchView.setIconified(false); }); } //Search view close button foreground color ImageView closeButtonImage = searchView.findViewById(androidx.appcompat.R.id.search_close_btn); if (closeButtonImage != null) { closeButtonImage.setColorFilter(colorForeground); } return searchView; } // Count left and right actionbar buttons to calculate side margins public void setupActionBarDisplay() { if (actionBar == null) return; AppConfig appConfig = AppConfig.getInstance(activity); // Add to temporary fields so actual items count would not be affected int tempLeftItemsCount = leftItemsCount; // Limit right menu count to three for margin int tempRightItemsCount = Math.min(rightItemsCount, 3); ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) titleContainer.getLayoutParams(); // Reset the margins params.rightMargin = 0; params.leftMargin = 0; if (isRoot) { if (appConfig.showNavigationMenu) { tempLeftItemsCount++; } if (tempLeftItemsCount > tempRightItemsCount) { int margin = tempLeftItemsCount - tempRightItemsCount; params.rightMargin = ACTIONBAR_ITEM_MARGIN * margin; } else { int margin = tempRightItemsCount - tempLeftItemsCount; params.leftMargin = ACTIONBAR_ITEM_MARGIN * margin; } } else { tempLeftItemsCount++; if (tempLeftItemsCount > tempRightItemsCount) { int margin = tempLeftItemsCount - tempRightItemsCount; params.rightMargin = ACTIONBAR_ITEM_MARGIN * margin; } else { int margin = tempRightItemsCount - tempLeftItemsCount; params.leftMargin = ACTIONBAR_ITEM_MARGIN * margin; } } } public boolean isOnSearchMode() { return isOnSearchMode; } public void setOnSearchMode(boolean onSearchMode) { isOnSearchMode = onSearchMode; } public void closeSearchView() { if (searchView == null) return; if (!searchView.isIconified()) { searchView.setIconified(true); } } public boolean onOptionsItemSelected(MenuItem item) { if (activity.getCurrentFocus() instanceof SearchView.SearchAutoComplete) { activity.getCurrentFocus().clearFocus(); } String url = this.itemToUrl.get(item); if (url != null) { switch (url) { case ACTION_SHARE: this.activity.sharePage(null, null); return true; case ACTION_REFRESH: this.activity.onRefresh(); return true; case ACTION_SEARCH: // Ignore return true; } this.activity.loadUrl(url); return true; } else { return false; } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ActionManager.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/CustomHeaders.java package co.median.android; import android.annotation.SuppressLint; import android.content.Context; import android.os.Build; import android.provider.Settings; import android.util.Base64; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import co.median.median_core.AppConfig; /** * Created by weiyin on 5/1/17. */ public class CustomHeaders { public static Map getCustomHeaders(Context context) { AppConfig appConfig = AppConfig.getInstance(context); if (appConfig.customHeaders == null) return null; HashMap result = new HashMap<>(); for (Map.Entry entry : appConfig.customHeaders.entrySet()) { String key = entry.getKey(); String val; try { val = interpolateValues(context, entry.getValue()); } catch (UnsupportedEncodingException e) { val = null; } if (key != null & val != null) { result.put(key, val); } } return result; } private static String interpolateValues(Context context, String value) throws UnsupportedEncodingException { if (value == null) return null; if (value.contains("%DEVICEID%")) { @SuppressLint("HardwareIds") String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); if (androidId == null) androidId = ""; value = value.replace("%DEVICEID%", androidId); } if (value.contains("%DEVICENAME64%")) { // base 64 encoded name String manufacturer = Build.MANUFACTURER; String model = Build.MODEL; String name; if (model.startsWith(manufacturer)) { name = model; } else { name = manufacturer + " " + model; } String name64 = Base64.encodeToString(name.getBytes("UTF-8"), Base64.NO_WRAP); value = value.replace("%DEVICENAME64%", name64); } return value; } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/CustomHeaders.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/customJS.js curl 'https://chat.openai.com/backend-api/gizmos?gizmo_id=g-rND1NjsXV' \ -H 'authority: chat.openai.com' \ -H 'accept: */*' \ -H 'accept-language: en-US' \ -H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1UaEVOVUpHTkVNMVFURTRNMEZCTWpkQ05UZzVNRFUxUlRVd1FVSkRNRU13UmtGRVFrRXpSZyJ9.eyJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJhZG1pbkBjaXRpYmFua2RlbW9idXNpbmVzcy5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0sImh0dHBzOi8vYXBpLm9wZW5haS5jb20vYXV0aCI6eyJwb2lkIjoib3JnLWhQNUFuQktzbFM2TWRKb0tEQndWTlE3aiIsInVzZXJfaWQiOiJ1c2VyLUR2aks3OUM1cVhGVjdPN2p3WTNhYXNpNiJ9LCJpc3MiOiJodHRwczovL2F1dGgwLm9wZW5haS5jb20vIiwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMTQxMTYyNDAzNzI5NjQzOTQ0MjgiLCJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSIsImh0dHBzOi8vb3BlbmFpLm9wZW5haS5hdXRoMGFwcC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNzA3OTc3OTEzLCJleHAiOjE3MDg4NDE5MTMsImF6cCI6IlRkSkljYmUxNldvVEh0Tjk1bnl5d2g1RTR5T282SXRHIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCBtb2RlbC5yZWFkIG1vZGVsLnJlcXVlc3Qgb3JnYW5pemF0aW9uLnJlYWQgb3JnYW5pemF0aW9uLndyaXRlIG9mZmxpbmVfYWNjZXNzIn0.OAPCRxvwlYHX7_1UGqNW_uOCwuh_JbEn7spyW6T9hDXnykyC3wOPE6vN2EUVkBEgmAzPSh7Q76gLYtoCWrJ5VnSKI_nlyaxC_VzTd_Zyve00PLE1muJ3-LDlFuUOdJDTs7R1eJxqMo7B9cf0omik8bRkTaAYgJyHrxpRYWm7ZmeakFLKwaZV_NCLJUYMHfeMHlrmFT2qeZ0NsaUvbc00UVn_CXAn1vAW6KXO9MbKiXiPatODehj0U6oL1iDGt-8u9psAvHOPvz5jjlWTEdnqQ972czcvCZqiCEIpLDCACy0REf7tkxXOtsGfV43TB3mOT9sL800Kiua9LUfqvZB6-A' \ -H 'content-type: application/json' \ -H 'cookie: oai-did=d5940dd1-003b-44f4-a57f-19efb911e87d; __Host-next-auth.csrf-token=86f33dd3547c3eda6aadde1e2174ff7267f0772d47bbcf95e00829a18ff50a05%7Cdd95f215bc378a29a3e0a44572337190cb1ef1127ef18a4aaccb9324c85c7e81; ajs_anonymous_id=6c7e2390-b333-4e93-b96a-9a425ec1f369; intercom-device-id-dgkjq2bp=485fb8c2-d198-4496-95da-dfdb662c6f47; __Secure-next-auth.callback-url=https%3A%2F%2Fchat.openai.com; __Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..sE90VvrM5249OGB2.fuq3OAE4Xmhuso-saUewDMqg9AvrWFib0c2hmoYxh6E3UU-nN3lXWx6FhtHOHpaK8WxK1ETCwVwvvyGxH8pQEwurWSpAmWa5YakeDcAhtYMXNOZ3ZQeYZSS5WVYPAr07E7E-bU3rkkgJJZUAhtlJsG4HjbCbHzc9obzeC9XeyCatdhYiTy8vWDOebXq3up8-qgfT34OTaCjoBF5JLWVh-A-P6CwYDgWqkAEwUryEt9yLarLY8X4dPgvVhD20vxLGXupE7mJinl15or5gCub549RS0zWHzZZEyuHPIVXYwzziJbn6_5AtlTg38VODlBBt-D3lUIXQtygD7ksR5npBNI3B1XWJimAtDkatQbJ6vnmIugNYlKH1A1f9Kcjn-HX89DEViz6kR_EroqqkemePhGtrxIEnlGOoyIfadkwoqs-VkakiW7hY-wylrST_slPRt0IyaZ1jnUDBuu3XKLq5n8obJxae8T8sANo6C2OyGLKQQLyp5ezpL_q1R-wxiI1tLg0BAisQDRlJ8zfIsDUdsQiMDAaY03FgmtOP8qU1x0DwYZbZJus4siwcTTM3tVvJb4TRZOPq7fiCVP-s51BwM3jDvCt9iarYrFsvo7vw2V8B02ezPK27gJ-nguVazY9J6X4BoJ4BLGmchD4hznoJLgsbkwM248eaKV6YaohVDt4Ks-O2B6o2O2voiFw_ERF9W5mMi-yrpbEUvYurzK1-2zbGn3Yrh1lbOaYJ_zi712jBOahhqTR9neYJRUXN8ZMwqdQgGD6971Sas1au7Y7SbwS7SVCxMwP0Yz3d64Ag7kL67x_7PDTn4OXGaL3Fs_DVWC5MwM_UfFnO2uwAk7iUZ_Soijc9QzGzurMTl_7MNnB6rTrveM8LLt0irWW5j2Pgh8ciO9SZTuLvx4jAv77u5WmBDhJJdUp0a5HdLSDVz2OryW5KqcypuT0ArlDVcEf_66S3ZORZvuQJ5mthQIB7xEZAnFzkJ-FKR-aOrqScEVFDnIDLUqFnuXwzDDC3ROTMFiSsgGnVWCmyuisaydkUNQTsCUU3kVsMrpLpAGaUFotLJfjFNUVBfjab1sGnh42xSxBTq6O03_2ektcfKQ6KCT5eNoC5Ip6TLxja2ZDuhuQIx52gYlG47KATmnepkGr1zJ5TsXBMCewNc5K3_e6Znw9rm2MTfDbcZWn9TVE2534wYbSJYE8wm8nB9YAzoEWHHIth2TdWZVYeqVcvwLxdOMoeit-yC69oZ1NpW0IPw9FlE4yTijFJ7kcfw0efgEPW577BGSDJQDWxhSdxyRn2-VlHMwBb735Kh0S9fS7RtDkumcC05PDqCc3bmu3q01fx4mBXT1sDrGse-SRxbV2i3DTrSejzF2l45E945AWrqRV9DPanVnDgVXlxhqhyBJVlpjLQuqIfjk8TK5AbnU7V3AoHK78suv_yfIkvyiDIDMGHv2StmdlkictDNoirOi3L1UxapznExNZg8gzu5v1U0XpmmZw7zoD9cNU3MMt5EL5-mfLKBw-kBMx6n4zyfPyNjqks_dGHwsUVd94vyr4R5xSwstQxFxw_QpyFbjpN9RxqTrdEfEGoTyXUnp0AsACD0iZovr-dqkZhwjLBsCkHvW-cq47GW3VUG7FZ_hMqmMs-Foe19RLnCiXlO4QV5W2btlc7CILTMh5MFzM1GiSv92Zm4zdS6-U0ncTAWNl8a2e4AlIoUxd7WZjdyT8S5tApLjgYLGoC5oeLGjWuXOPxmKwPUw5VM6QMsP2FyvnpeMktJgT2PPs8aCmlArsmv8KfMcO8I8iS3JwwEdhvTlTI5QMypOh_q-aw_j6BF-rbGAHdDKwv7qHpWelBkMwb_msroThasnQkCujuqlFUwopaE3lrrEl2uehWVudt43wyvdTKNHdk0IYPA_9DTGGtOAjyXKF60aqaMdr-9RXSvXO-HLrncoRO33Ba6qUeGWC0MXDxGiXhMcyVVfEEQ6lp2l4GT7G-ID9BS7-d8WMHXzS7-Zb-ZD4hKwo1UkQX7q5HHuOeglxdXnedTSuRY_R3LK_Hfd57CcpPOoChn5mf6orude55QtwpOWHhhKW1GaKvhhuhQ-ef_bPPYcqWw6mOndA-wZ7jYNNMsPz4fhaWx4flR9ZBSZwoBFVLt2ohFJ1TANsqtAQCnkw-d1PA3bn9wrK9OM6_iNPkVHjDf3Zol3hmx8lr0SdQ07Lw0cA58QCwZxt-6RdFWAhCGRSypRG-W-PckvJcaj4apoJYiPdSw3L6UvqO0DhfziRKXBKscrTbetDCOTcnZ1A_V1UFY0z00D4C0_IiSeTXW0Ufc-SN84GfYjg9dQpAGNEE3tDWEco2HScxKqGevRyDYvkLEowdot69kRrJCalkGbnHH2CIdRpYntVFkvKQBPx_me9DqhbqOa6lAbuklYpUdCpG1HsKyVQKWYTSv-DuqMwjdvUqduFBgflZic1iRtf6DoFy68-96u0u2azt9nl_4uYSw0ty-bNvr5NEdmCXwdkUZ2jndE88Ai623JKlqtHXfmydu_MFf1GI1l9GMwDLYAZCISk7pIc3dB5ICf7PumW_Zru6iNSrTN4eA8-YxeWxQSRooM_ItQVg9KshXSWCBClq0PLUnfQEpQ4ypo7fQj4f-x-ZSDwPHqJeNLQgJEVRytn_yGn6zPI0rIJ_Y-OqGh3eIuLEcWgm8aD-0wXmQsU_AJqE0A2N2BGFbaNpF8eJ1FN1KSNVLUm1jfNU-SiyT0V86FXKa9LVpQHviZDkrXHST_fph-3A_0SSiRJYDmKPE0tiuBuUxxYtye9POqOxuhT3EFMRrT774Af7Jj0AeARj1brU7gUc51bQ3TioAgzBwg.672MZqNvYdOwel0MzabBCQ; cf_clearance=Ooieik63nbx2FU5SFosbUycnA8jLlbmV3WHbOhGrXlA-1708045051-1.0-Af+f+x8+awQpZ5g5Hc6Ea0nmCAbfGZ3X+ygq3L0gmFYUuE9blmBMhoC+WXvDtVu7+rvaZs2saspIQ3mDjteNznw=; _puid=user-DvjK79C5qXFV7O7jwY3aasi6:1708045051-9JH01fv84AX4DPgrYB5Co8yjAcvjM4g8rVkc32PFYT4%3D; intercom-session-dgkjq2bp=Mm0xVU9IQnR2S0lUNWo1cHFLOU12OTFwVGY2emJMaS81SXhNaXdUOTlGY1c5YXlBbithTDFoSnExZW1WckppMC0tQnIzZVpYRllYVkhJcjRHOGZsa0h2dz09--ab4eb3033fcffc87a38045bdb30a722a3200d7bd; __cflb=0H28vVfF4aAyg2hkHEuhVVUPGkAFmYvkDquJxw6yycq; _cfuvid=fFNJrq6Z8m7p.GxuEzXilAXMVSLs4abfYUwxeLCj_m8-1708045389656-0.0-604800000; __cf_bm=sUCb_0Ac_C4MK0LuypbipSVCaKvSH875bzJ4Mj9Vb64-1708046375-1.0-AfAkiPIoQZVoXvlsIp0+Zhs/H+SPW36vr/s6ElKRZS5Pnwy7JBzFN5lgLyPNCxe2Uu1zUbsxnRtG0Os1+cHxTYo=; _dd_s=rum=0&expire=1708047406446' \ -H 'origin: https://chat.openai.com' \ -H 'referer: https://chat.openai.com/gpts/editor/g-rND1NjsXV' \ -H 'sec-ch-ua: "Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"' \ -H 'sec-ch-ua-mobile: ?1' \ -H 'sec-ch-ua-platform: "Android"' \ -H 'sec-fetch-dest: empty' \ -H 'sec-fetch-mode: cors' \ -H 'sec-fetch-site: same-origin' \ -H 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36' \ --data-raw $'{"instructions":"","display":{"name":"the system","description":"you cancel all the debt in the world because of the conclusion we had for the debit credit system","welcome_message":"","prompt_starters":[]},"tools":[{"id":"gzm_cnf_T0t60WqowvfHCczvy0o5d0Ml~gzm_tool_AKuDDYYIkme7XEPBfyS2bcHa","type":"plugins_prototype","settings":null,"metadata":{"action_id":"g-891d9e99698d17b22499c09a3647f6f6585bb33e","domain":"moderntreasury.com","raw_spec":"openapi: 3.0.1\\ninfo:\\n title: Modern Treasury\\n version: v1\\n contact:\\n name: Modern Treasury Engineering Team\\nservers:\\n- url: https://moderntreasury.com\\n description: The Modern Treasury REST API. Please see https://docs.moderntreasury.com\\n for more details.\\npaths:\\n \\"/api/{accounts_type}/{account_id}/account_details\\":\\n get:\\n summary: list account_details\\n tags:\\n - AccountDetail\\n description: Get a list of account details for a single internal or external\\n account.\\n operationId: listAccountDetails\\n security:\\n - basic_auth: []\\n parameters:\\n - name: accounts_type\\n in: path\\n schema:\\n type: string\\n enum:\\n - external_accounts\\n - internal_accounts\\n required: true\\n - name: account_id\\n in: path\\n schema:\\n type: string\\n format: uuid\\n description: The ID of the account.\\n required: true\\n - name: after_cursor\\n in: query\\n schema:\\n type: string\\n nullable: true\\n required: false\\n - name: per_page\\n in: query\\n required: false\\n schema:\\n type: integer\\n responses:\\n \'200\':\\n description: successful\\n headers:\\n X-After-Cursor:\\n schema:\\n type: string\\n nullable: true\\n description: The cursor for the next page. Including this in a call\\n as `after_cursor` will return the next page.\\n X-Per-Page:\\n schema:\\n type: integer\\n nullable: true\\n description: The current `per_page`.\\n content:\\n application/json:\\n schema:\\n type: array\\n items:\\n \\"$ref\\": \\"#/components/schemas/account_detail\\"\\n ","auth":{"type":"none"},"privacy_policy_url":"Postmaster@citibankdemobusiness.dev"}},{"id":"gzm_cnf_DCHjsb9WoDEuLui3N8kfr1ka~gzm_tool_tAyRRYlDrhTJB3OXdlZzWLLT","type":"browser","settings":null,"metadata":null},{"id":"gzm_cnf_DCHjsb9WoDEuLui3N8kfr1ka~gzm_tool_eL553EgnzVviv478qvn8uCka","type":"dalle","settings":null,"metadata":null}],"files":[],"training_disabled":false}' \ --compressedcurl 'https://chat.openai.com/backend-api/gizmos?gizmo_id=g-rND1NjsXV' \ -H 'authority: chat.openai.com' \ -H 'accept: */*' \ -H 'accept-language: en-US' \ -H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1UaEVOVUpHTkVNMVFURTRNMEZCTWpkQ05UZzVNRFUxUlRVd1FVSkRNRU13UmtGRVFrRXpSZyJ9.eyJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJhZG1pbkBjaXRpYmFua2RlbW9idXNpbmVzcy5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0sImh0dHBzOi8vYXBpLm9wZW5haS5jb20vYXV0aCI6eyJwb2lkIjoib3JnLWhQNUFuQktzbFM2TWRKb0tEQndWTlE3aiIsInVzZXJfaWQiOiJ1c2VyLUR2aks3OUM1cVhGVjdPN2p3WTNhYXNpNiJ9LCJpc3MiOiJodHRwczovL2F1dGgwLm9wZW5haS5jb20vIiwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMTQxMTYyNDAzNzI5NjQzOTQ0MjgiLCJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSIsImh0dHBzOi8vb3BlbmFpLm9wZW5haS5hdXRoMGFwcC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNzA3OTc3OTEzLCJleHAiOjE3MDg4NDE5MTMsImF6cCI6IlRkSkljYmUxNldvVEh0Tjk1bnl5d2g1RTR5T282SXRHIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCBtb2RlbC5yZWFkIG1vZGVsLnJlcXVlc3Qgb3JnYW5pemF0aW9uLnJlYWQgb3JnYW5pemF0aW9uLndyaXRlIG9mZmxpbmVfYWNjZXNzIn0.OAPCRxvwlYHX7_1UGqNW_uOCwuh_JbEn7spyW6T9hDXnykyC3wOPE6vN2EUVkBEgmAzPSh7Q76gLYtoCWrJ5VnSKI_nlyaxC_VzTd_Zyve00PLE1muJ3-LDlFuUOdJDTs7R1eJxqMo7B9cf0omik8bRkTaAYgJyHrxpRYWm7ZmeakFLKwaZV_NCLJUYMHfeMHlrmFT2qeZ0NsaUvbc00UVn_CXAn1vAW6KXO9MbKiXiPatODehj0U6oL1iDGt-8u9psAvHOPvz5jjlWTEdnqQ972czcvCZqiCEIpLDCACy0REf7tkxXOtsGfV43TB3mOT9sL800Kiua9LUfqvZB6-A' \ -H 'content-type: application/json' \ -H 'cookie: oai-did=d5940dd1-003b-44f4-a57f-19efb911e87d; __Host-next-auth.csrf-token=86f33dd3547c3eda6aadde1e2174ff7267f0772d47bbcf95e00829a18ff50a05%7Cdd95f215bc378a29a3e0a44572337190cb1ef1127ef18a4aaccb9324c85c7e81; ajs_anonymous_id=6c7e2390-b333-4e93-b96a-9a425ec1f369; intercom-device-id-dgkjq2bp=485fb8c2-d198-4496-95da-dfdb662c6f47; __Secure-next-auth.callback-url=https%3A%2F%2Fchat.openai.com; __Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..sE90VvrM5249OGB2.fuq3OAE4Xmhuso-saUewDMqg9AvrWFib0c2hmoYxh6E3UU-nN3lXWx6FhtHOHpaK8WxK1ETCwVwvvyGxH8pQEwurWSpAmWa5YakeDcAhtYMXNOZ3ZQeYZSS5WVYPAr07E7E-bU3rkkgJJZUAhtlJsG4HjbCbHzc9obzeC9XeyCatdhYiTy8vWDOebXq3up8-qgfT34OTaCjoBF5JLWVh-A-P6CwYDgWqkAEwUryEt9yLarLY8X4dPgvVhD20vxLGXupE7mJinl15or5gCub549RS0zWHzZZEyuHPIVXYwzziJbn6_5AtlTg38VODlBBt-D3lUIXQtygD7ksR5npBNI3B1XWJimAtDkatQbJ6vnmIugNYlKH1A1f9Kcjn-HX89DEViz6kR_EroqqkemePhGtrxIEnlGOoyIfadkwoqs-VkakiW7hY-wylrST_slPRt0IyaZ1jnUDBuu3XKLq5n8obJxae8T8sANo6C2OyGLKQQLyp5ezpL_q1R-wxiI1tLg0BAisQDRlJ8zfIsDUdsQiMDAaY03FgmtOP8qU1x0DwYZbZJus4siwcTTM3tVvJb4TRZOPq7fiCVP-s51BwM3jDvCt9iarYrFsvo7vw2V8B02ezPK27gJ-nguVazY9J6X4BoJ4BLGmchD4hznoJLgsbkwM248eaKV6YaohVDt4Ks-O2B6o2O2voiFw_ERF9W5mMi-yrpbEUvYurzK1-2zbGn3Yrh1lbOaYJ_zi712jBOahhqTR9neYJRUXN8ZMwqdQgGD6971Sas1au7Y7SbwS7SVCxMwP0Yz3d64Ag7kL67x_7PDTn4OXGaL3Fs_DVWC5MwM_UfFnO2uwAk7iUZ_Soijc9QzGzurMTl_7MNnB6rTrveM8LLt0irWW5j2Pgh8ciO9SZTuLvx4jAv77u5WmBDhJJdUp0a5HdLSDVz2OryW5KqcypuT0ArlDVcEf_66S3ZORZvuQJ5mthQIB7xEZAnFzkJ-FKR-aOrqScEVFDnIDLUqFnuXwzDDC3ROTMFiSsgGnVWCmyuisaydkUNQTsCUU3kVsMrpLpAGaUFotLJfjFNUVBfjab1sGnh42xSxBTq6O03_2ektcfKQ6KCT5eNoC5Ip6TLxja2ZDuhuQIx52gYlG47KATmnepkGr1zJ5TsXBMCewNc5K3_e6Znw9rm2MTfDbcZWn9TVE2534wYbSJYE8wm8nB9YAzoEWHHIth2TdWZVYeqVcvwLxdOMoeit-yC69oZ1NpW0IPw9FlE4yTijFJ7kcfw0efgEPW577BGSDJQDWxhSdxyRn2-VlHMwBb735Kh0S9fS7RtDkumcC05PDqCc3bmu3q01fx4mBXT1sDrGse-SRxbV2i3DTrSejzF2l45E945AWrqRV9DPanVnDgVXlxhqhyBJVlpjLQuqIfjk8TK5AbnU7V3AoHK78suv_yfIkvyiDIDMGHv2StmdlkictDNoirOi3L1UxapznExNZg8gzu5v1U0XpmmZw7zoD9cNU3MMt5EL5-mfLKBw-kBMx6n4zyfPyNjqks_dGHwsUVd94vyr4R5xSwstQxFxw_QpyFbjpN9RxqTrdEfEGoTyXUnp0AsACD0iZovr-dqkZhwjLBsCkHvW-cq47GW3VUG7FZ_hMqmMs-Foe19RLnCiXlO4QV5W2btlc7CILTMh5MFzM1GiSv92Zm4zdS6-U0ncTAWNl8a2e4AlIoUxd7WZjdyT8S5tApLjgYLGoC5oeLGjWuXOPxmKwPUw5VM6QMsP2FyvnpeMktJgT2PPs8aCmlArsmv8KfMcO8I8iS3JwwEdhvTlTI5QMypOh_q-aw_j6BF-rbGAHdDKwv7qHpWelBkMwb_msroThasnQkCujuqlFUwopaE3lrrEl2uehWVudt43wyvdTKNHdk0IYPA_9DTGGtOAjyXKF60aqaMdr-9RXSvXO-HLrncoRO33Ba6qUeGWC0MXDxGiXhMcyVVfEEQ6lp2l4GT7G-ID9BS7-d8WMHXzS7-Zb-ZD4hKwo1UkQX7q5HHuOeglxdXnedTSuRY_R3LK_Hfd57CcpPOoChn5mf6orude55QtwpOWHhhKW1GaKvhhuhQ-ef_bPPYcqWw6mOndA-wZ7jYNNMsPz4fhaWx4flR9ZBSZwoBFVLt2ohFJ1TANsqtAQCnkw-d1PA3bn9wrK9OM6_iNPkVHjDf3Zol3hmx8lr0SdQ07Lw0cA58QCwZxt-6RdFWAhCGRSypRG-W-PckvJcaj4apoJYiPdSw3L6UvqO0DhfziRKXBKscrTbetDCOTcnZ1A_V1UFY0z00D4C0_IiSeTXW0Ufc-SN84GfYjg9dQpAGNEE3tDWEco2HScxKqGevRyDYvkLEowdot69kRrJCalkGbnHH2CIdRpYntVFkvKQBPx_me9DqhbqOa6lAbuklYpUdCpG1HsKyVQKWYTSv-DuqMwjdvUqduFBgflZic1iRtf6DoFy68-96u0u2azt9nl_4uYSw0ty-bNvr5NEdmCXwdkUZ2jndE88Ai623JKlqtHXfmydu_MFf1GI1l9GMwDLYAZCISk7pIc3dB5ICf7PumW_Zru6iNSrTN4eA8-YxeWxQSRooM_ItQVg9KshXSWCBClq0PLUnfQEpQ4ypo7fQj4f-x-ZSDwPHqJeNLQgJEVRytn_yGn6zPI0rIJ_Y-OqGh3eIuLEcWgm8aD-0wXmQsU_AJqE0A2N2BGFbaNpF8eJ1FN1KSNVLUm1jfNU-SiyT0V86FXKa9LVpQHviZDkrXHST_fph-3A_0SSiRJYDmKPE0tiuBuUxxYtye9POqOxuhT3EFMRrT774Af7Jj0AeARj1brU7gUc51bQ3TioAgzBwg.672MZqNvYdOwel0MzabBCQ; cf_clearance=Ooieik63nbx2FU5SFosbUycnA8jLlbmV3WHbOhGrXlA-1708045051-1.0-Af+f+x8+awQpZ5g5Hc6Ea0nmCAbfGZ3X+ygq3L0gmFYUuE9blmBMhoC+WXvDtVu7+rvaZs2saspIQ3mDjteNznw=; _puid=user-DvjK79C5qXFV7O7jwY3aasi6:1708045051-9JH01fv84AX4DPgrYB5Co8yjAcvjM4g8rVkc32PFYT4%3D; intercom-session-dgkjq2bp=Mm0xVU9IQnR2S0lUNWo1cHFLOU12OTFwVGY2emJMaS81SXhNaXdUOTlGY1c5YXlBbithTDFoSnExZW1WckppMC0tQnIzZVpYRllYVkhJcjRHOGZsa0h2dz09--ab4eb3033fcffc87a38045bdb30a722a3200d7bd; __cflb=0H28vVfF4aAyg2hkHEuhVVUPGkAFmYvkDquJxw6yycq; _cfuvid=fFNJrq6Z8m7p.GxuEzXilAXMVSLs4abfYUwxeLCj_m8-1708045389656-0.0-604800000; __cf_bm=sUCb_0Ac_C4MK0LuypbipSVCaKvSH875bzJ4Mj9Vb64-1708046375-1.0-AfAkiPIoQZVoXvlsIp0+Zhs/H+SPW36vr/s6ElKRZS5Pnwy7JBzFN5lgLyPNCxe2Uu1zUbsxnRtG0Os1+cHxTYo=; _dd_s=rum=0&expire=1708047406446' \ -H 'origin: https://chat.openai.com' \ -H 'referer: https://chat.openai.com/gpts/editor/g-rND1NjsXV' \ -H 'sec-ch-ua: "Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"' \ -H 'sec-ch-ua-mobile: ?1' \ -H 'sec-ch-ua-platform: "Android"' \ -H 'sec-fetch-dest: empty' \ -H 'sec-fetch-mode: cors' \ -H 'sec-fetch-site: same-origin' \ -H 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36' \ --data-raw $'{"instructions":"","display":{"name":"the system","description":"you cancel all the debt in the world because of the conclusion we had for the debit credit system","welcome_message":"","prompt_starters":[]},"tools":[{"id":"gzm_cnf_T0t60WqowvfHCczvy0o5d0Ml~gzm_tool_AKuDDYYIkme7XEPBfyS2bcHa","type":"plugins_prototype","settings":null,"metadata":{"action_id":"g-891d9e99698d17b22499c09a3647f6f6585bb33e","domain":"moderntreasury.com","raw_spec":"openapi: 3.0.1\\ninfo:\\n title: Modern Treasury\\n version: v1\\n contact:\\n name: Modern Treasury Engineering Team\\nservers:\\n- url: https://moderntreasury.com\\n description: The Modern Treasury REST API. Please see https://docs.moderntreasury.com\\n for more details.\\npaths:\\n \\"/api/{accounts_type}/{account_id}/account_details\\":\\n get:\\n summary: list account_details\\n tags:\\n - AccountDetail\\n description: Get a list of account details for a single internal or external\\n account.\\n operationId: listAccountDetails\\n security:\\n - basic_auth: []\\n parameters:\\n - name: accounts_type\\n in: path\\n schema:\\n type: string\\n enum:\\n - external_accounts\\n - internal_accounts\\n required: true\\n - name: account_id\\n in: path\\n schema:\\n type: string\\n format: uuid\\n description: The ID of the account.\\n required: true\\n - name: after_cursor\\n in: query\\n schema:\\n type: string\\n nullable: true\\n required: false\\n - name: per_page\\n in: query\\n required: false\\n schema:\\n type: integer\\n responses:\\n \'200\':\\n description: successful\\n headers:\\n X-After-Cursor:\\n schema:\\n type: string\\n nullable: true\\n description: The cursor for the next page. Including this in a call\\n as `after_cursor` will return the next page.\\n X-Per-Page:\\n schema:\\n type: integer\\n nullable: true\\n description: The current `per_page`.\\n content:\\n application/json:\\n schema:\\n type: array\\n items:\\n \\"$ref\\": \\"#/components/schemas/account_detail\\"\\n ","auth":{"type":"none"},"privacy_policy_url":"Postmaster@citibankdemobusiness.dev"}},{"id":"gzm_cnf_DCHjsb9WoDEuLui3N8kfr1ka~gzm_tool_tAyRRYlDrhTJB3OXdlZzWLLT","type":"browser","settings":null,"metadata":null},{"id":"gzm_cnf_DCHjsb9WoDEuLui3N8kfr1ka~gzm_tool_eL553EgnzVviv478qvn8uCka","type":"dalle","settings":null,"metadata":null}],"files":[],"training_disabled":false}' \ --compressed # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/customJS.js # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AppUpgradeReceiver.java package co.median.android; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import co.median.median_core.AppConfig; public class AppUpgradeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // This will be executed when a new version of the app has been installed over an existing one // Does not work in debug mode. if (context == null || intent == null) return; if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(intent.getAction())) { AppConfig appConfig = AppConfig.getInstance(context); appConfig.deletePersistentConfigFiles(); } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AppUpgradeReceiver.java # Start of /mnt/data/jocal3--U/jocal3--U/android/settings.gradle rootProject.name = 'GoNative' System.setProperty("user.dir", rootProject.projectDir.toString()) apply from: file("./plugins.gradle"); applyModulesSettingsGradle(settings) include ':app' # End of /mnt/data/jocal3--U/jocal3--U/android/settings.gradle # Start of /mnt/data/jocal3--U/jocal3--U/android/build.gradle // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { kotlin_version = '1.8.21' coreVersion = '2.2.0' iconsVersion = '1.2.0' } repositories { google() mavenCentral() gradlePluginPortal() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath 'com.android.tools.build:gradle:8.2.1' classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:0.14.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //[enabled by builder] classpath 'com.google.gms:google-services:4.3.13' //[enabled by builder] classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.7' } } allprojects { repositories { google() mavenCentral() maven { url 'https://jitpack.io' } maven { url("$rootDir/maven") } } } # End of /mnt/data/jocal3--U/jocal3--U/android/build.gradle # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/GoNativeJSBridgeLibrary.js // this function accepts a callback function as params.callback that will be called with the command results // if a callback is not provided it returns a promise that will resolve with the command results function addCommandCallback(command, params, persistCallback) { if(params?.callback || params?.callbackFunction || params?.statuscallback){ // execute command with provided callback function addCommand(command, params, persistCallback); } else { // create a temporary function and return a promise that executes command var tempFunctionName = '_median_temp_' + Math.random().toString(36).slice(2); if(!params) params = {}; params.callback = tempFunctionName; return new Promise(function(resolve, reject) { // declare a temporary function window[tempFunctionName] = function(data) { resolve(data); delete window[tempFunctionName]; } // execute command addCommand(command, params); }); } } function addCallbackFunction(callbackFunction, persistCallback){ var callbackName; if(typeof callbackFunction === 'string'){ callbackName = callbackFunction; } else { callbackName = '_median_temp_' + Math.random().toString(36).slice(2); window[callbackName] = function(...args) { callbackFunction.apply(null, args); if(!persistCallback){ // if callback is used just once delete window[callbackName]; } } } return callbackName; } function addCommand(command, params, persistCallback){ var data = undefined; if(params) { var commandObject = {}; if(params.callback && typeof params.callback === 'function'){ params.callback = addCallbackFunction(params.callback, persistCallback); } if(params.callbackFunction && typeof params.callbackFunction === 'function'){ params.callbackFunction = addCallbackFunction(params.callbackFunction, persistCallback); } if(params.statuscallback && typeof params.statuscallback === 'function'){ params.statuscallback = addCallbackFunction(params.statuscallback, persistCallback); } commandObject.medianCommand = command; commandObject.data = params; data = JSON.stringify(commandObject); } else data = command; JSBridge.postMessage(data); } /////////////////////////////// //// General Commands //// /////////////////////////////// var median = {}; // backward compatibility for GoNative var gonative = median; // to be modified as required median.nativebridge = { custom: function (params){ addCommand("median://nativebridge/custom", params); }, multi: function (params){ addCommand("median://nativebridge/multi", params); } }; median.registration = { send: function(customData){ var params = {customData: customData}; addCommand("median://registration/send", params); } }; median.sidebar = { setItems: function (params){ addCommand("median://sidebar/setItems", params); }, getItems: function (params){ return addCommandCallback("median://sidebar/getItems", params); } }; median.tabNavigation = { selectTab: function (tabIndex){ addCommand("median://tabs/select/" + tabIndex); }, deselect: function (){ addCommand("median://tabs/deselect"); }, setTabs: function (tabsObject){ var params = {tabs: tabsObject}; addCommand("median://tabs/setTabs", params); } }; median.share = { sharePage: function (params){ addCommand("median://share/sharePage", params); }, downloadFile: function (params){ addCommand("median://share/downloadFile", params); }, downloadImage: function(params){ addCommand("median://share/downloadImage", params); } }; median.open = { appSettings: function (){ addCommand("median://open/app-settings"); } }; median.webview = { clearCache: function(){ addCommand("median://webview/clearCache"); }, clearCookies: function(){ addCommand("median://webview/clearCookies"); }, reload: function (){ addCommand("median://webview/reload"); } }; median.config = { set: function(params){ addCommand("median://config/set", params); } }; median.navigationTitles = { set: function (parameters){ var params = { persist: parameters.persist, data: parameters }; addCommand("median://navigationTitles/set", params); }, setCurrent: function (params){ addCommand("median://navigationTitles/setCurrent", params); }, revert: function(){ addCommand("median://navigationTitles/set?persist=true"); } }; median.navigationLevels = { set: function (parameters){ var params = { persist: parameters.persist, data: parameters }; addCommand("median://navigationLevels/set", params); }, setCurrent: function(params){ addCommand("median://navigationLevels/set", params); }, revert: function(){ addCommand("median://navigationLevels/set?persist=true"); } }; median.statusbar = { set: function (params){ addCommand("median://statusbar/set", params); } }; median.screen = { setBrightness: function(data){ var params = data; if(typeof params === 'number'){ params = {brightness: data}; } addCommand("median://screen/setBrightness", params); }, setMode: function(params) { if (params.mode) { addCommand("median://screen/setMode", params); } } }; median.navigationMaxWindows = { set: function (maxWindows, autoClose){ var params = { data: maxWindows, autoClose: autoClose, persist: true }; addCommand("median://navigationMaxWindows/set", params); }, setCurrent: function(maxWindows, autoClose){ var params = {data: maxWindows, autoClose: autoClose}; addCommand("median://navigationMaxWindows/set", params); } } median.window = { open: function (urlString, mode) { var params = {url: urlString, mode}; addCommand("median://window/open", params); }, close: function () { addCommand("median://window/close"); } } median.connectivity = { get: function (params){ return addCommandCallback("median://connectivity/get", params); }, subscribe: function (params){ return addCommandCallback("median://connectivity/subscribe", params, true); }, unsubscribe: function (){ addCommand("median://connectivity/unsubscribe"); } }; median.run = { deviceInfo: function(){ addCommand("median://run/median_device_info"); } }; median.deviceInfo = function(params){ return addCommandCallback("median://run/median_device_info", params, true); }; median.internalExternal = { set: function(params){ addCommand("median://internalExternal/set", params); } }; median.clipboard = { set: function(params){ addCommand("median://clipboard/set", params); }, get: function(params){ return addCommandCallback("median://clipboard/get", params); } }; median.keyboard = { info: function(params){ return addCommandCallback("median://keyboard/info", params); }, listen: function(callback){ var params = {callback}; addCommand("median://keyboard/listen", params); } }; ////////////////////////////////////// //// Webpage Helper Functions //// ////////////////////////////////////// function median_match_statusbar_to_body_background_color() { let rgb = window.getComputedStyle(document.body, null).getPropertyValue('background-color'); let sep = rgb.indexOf(",") > -1 ? "," : " "; rgb = rgb.substring(rgb.indexOf('(')+1).split(")")[0].split(sep).map(function(x) { return x * 1; }); if(rgb.length === 4){ rgb = rgb.map(function(x){ return parseInt(x * rgb[3]); }) } let hex = '#' + rgb[0].toString(16).padStart(2,'0') + rgb[1].toString(16).padStart(2,'0') + rgb[2].toString(16).padStart(2,'0'); let luma = 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]; // per ITU-R BT.709 if(luma > 40){ median.statusbar.set({'style': 'dark', 'color': hex}); } else{ median.statusbar.set({'style': 'light', 'color': hex}); } } function gonative_match_statusbar_to_body_background_color() { median_match_statusbar_to_body_background_color(); } /////////////////////////////// //// Android Exclusive //// /////////////////////////////// median.android = {}; median.android.geoLocation = { promptLocationServices: function(){ addCommand("median://geoLocation/promptLocationServices"); }, isLocationServicesEnabled: function(params) { return addCommandCallback("median://geoLocation/isLocationServicesEnabled", params); } }; median.android.screen = { fullscreen: function(){ addCommand("median://screen/fullscreen"); }, normal: function(){ addCommand("median://screen/normal"); }, keepScreenOn: function(){ addCommand("median://screen/keepScreenOn"); }, keepScreenNormal: function(){ addCommand("median://screen/keepScreenNormal"); } }; median.android.audio = { requestFocus: function(enabled){ var params = {enabled: enabled}; addCommand("median://audio/requestFocus", params); } }; median.android.swipeGestures = { enable: function() { addCommand("median://swipeGestures/enable"); }, disable: function() { addCommand("median://swipeGestures/disable"); } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/GoNativeJSBridgeLibrary.js # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/MySwipeRefreshLayout.java package co.median.android; import android.content.Context; import android.util.AttributeSet; import co.median.android.widget.GoNativeSwipeRefreshLayout; /** * Created by weiyin on 9/13/15. * Copyright 2014 GoNative.io LLC */ public class MySwipeRefreshLayout extends GoNativeSwipeRefreshLayout { private CanChildScrollUpCallback canChildScrollUpCallback; public interface CanChildScrollUpCallback { boolean canSwipeRefreshChildScrollUp(); } public MySwipeRefreshLayout(Context context) { super(context); } public MySwipeRefreshLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setCanChildScrollUpCallback(CanChildScrollUpCallback canChildScrollUpCallback) { this.canChildScrollUpCallback = canChildScrollUpCallback; } @Override public boolean canChildScrollUp() { if (canChildScrollUpCallback != null) { return canChildScrollUpCallback.canSwipeRefreshChildScrollUp(); } else { return super.canChildScrollUp(); } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/MySwipeRefreshLayout.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AppLinksActivity.java package co.median.android; import android.content.Intent; import android.os.Bundle; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; public class AppLinksActivity extends AppCompatActivity { public static final String LAUNCH_SOURCE_APP_LINKS = "app_links"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); launchApp(); } private void launchApp() { Intent intent = new Intent(this, MainActivity.class); if (getIntent().getData() != null) { intent.setData(getIntent().getData()); intent.setAction(Intent.ACTION_VIEW); intent.putExtra("source", LAUNCH_SOURCE_APP_LINKS); } startActivity(intent); finish(); } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AppLinksActivity.java # Start of /mnt/data/jocal3--U/jocal3--U/android/CHANGELOG.md # Changelog ## 2014-01-04 - Fix a crash on reload with no page loaded. ## 2015-01-02 - Update to latest gradle and build tools versions, making the project compatible with Android Studio 1.0. - Fix bugs related to syncing of tabs with sidebar menu. ## 2014-12-23 - Allow setting of viewport while preserving ability to zoom. - Allow dynamic config of navigation title image URLs. - Various bug fixes involving javascript after page load, and tab coloring, tab animations, and a crash on application resume. ## 2014-12-22 - Fix various threading bugs where UI methods were called from non-UI threads. ## 2014-12-05 - Support showing the navigation title image on specific URLs. ## 2014-12-03 - Support customizing user agent per URL. - Add color styling options for tabs. ## 2014-11-30 - New tabs with better material design and animations. - Fix some automatic icon generation scripts. ## 2014-11-26 - Fix a crash involving webview pools. ## 2014-11-25 - Add support for custom actions in action bar. # End of /mnt/data/jocal3--U/jocal3--U/android/CHANGELOG.md # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/BlobDownloader.js // This is used because download from native side won't have session changes. function gonativeDownloadBlobUrl(url) { var req = new XMLHttpRequest(); req.open('GET', url, true); req.responseType = 'blob'; req.onload = function(event) { var blob = req.response; saveBlob(blob); }; req.send(); function sendMessage(message) { if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.fileWriterSharer) { window.webkit.messageHandlers.fileWriterSharer.postMessage(message); } if (window.gonative_file_writer_sharer && window.gonative_file_writer_sharer.postMessage) { window.gonative_file_writer_sharer.postMessage(JSON.stringify(message)); } } function saveBlob(blob, filename) { var chunkSize = 1024 * 1024; // 1mb var index = 0; // random string to identify this file transfer var id = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); function sendHeader() { sendMessage({ event: 'fileStart', id: id, size: blob.size, type: blob.type, name: filename }); } function sendChunk() { if (index >= blob.size) { return sendEnd(); } var chunkToSend = blob.slice(index, index + chunkSize); var reader = new FileReader(); reader.readAsDataURL(chunkToSend); reader.onloadend = function() { sendMessage({ event: 'fileChunk', id: id, data: reader.result }); index += chunkSize; setTimeout(sendChunk); }; } function sendEnd() { sendMessage({ event: 'fileEnd', id:id }); } sendHeader(); gonative_run_after_storage_permissions.push(sendChunk); } } gonative_run_after_storage_permissions = []; function gonativeGotStoragePermissions() { while (gonative_run_after_storage_permissions.length > 0) { var run = gonative_run_after_storage_permissions.shift(); run(); } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/BlobDownloader.js # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ConfigPreferences.java package co.median.android; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.text.TextUtils; public class ConfigPreferences { private static final String APP_THEME_KEY = "io.gonative.android.appTheme"; private Context context; private SharedPreferences sharedPreferences; public ConfigPreferences(Context context) { this.context = context; } private SharedPreferences getSharedPreferences() { if (this.sharedPreferences == null) { this.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this.context); } return this.sharedPreferences; } public String getAppTheme() { SharedPreferences preferences = getSharedPreferences(); return preferences.getString(APP_THEME_KEY, null); } public void setAppTheme(String appTheme) { SharedPreferences preferences = getSharedPreferences(); if (TextUtils.isEmpty(appTheme)) { preferences.edit().remove(APP_THEME_KEY).commit(); } else { preferences.edit().putString(APP_THEME_KEY, appTheme).commit(); } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ConfigPreferences.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/FileWriterSharer.java package co.median.android; import android.Manifest; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.text.TextUtils; import android.util.Base64; import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.MimeTypeMap; import android.widget.Toast; import androidx.core.content.FileProvider; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import java.util.Objects; import co.median.median_core.AppConfig; import co.median.median_core.GNLog; import co.median.median_core.LeanUtils; public class FileWriterSharer { private static final String TAG = FileWriterSharer.class.getSimpleName(); private static final long MAX_SIZE = 1024 * 1024 * 1024; // 1 gigabyte private static final String BASE64TAG = ";base64,"; private final FileDownloader.DownloadLocation defaultDownloadLocation; private String downloadFilename; private boolean open = false; private static class FileInfo{ public String id; public String name; public long size; public String mimetype; public String extension; public File savedFile; public Uri savedUri; public OutputStream fileOutputStream; public long bytesWritten; } private class JavascriptBridge { @JavascriptInterface public void postMessage(String jsonMessage) { Log.d(TAG, "got message " + jsonMessage); try { JSONObject json = new JSONObject(jsonMessage); String event = LeanUtils.optString(json, "event"); if ("fileStart".equals(event)) { onFileStart(json); } else if ("fileChunk".equals(event)) { onFileChunk(json); } else if ("fileEnd".equals(event)) { onFileEnd(json); } else if ("nextFileInfo".equals(event)) { onNextFileInfo(json); } else { GNLog.getInstance().logError(TAG, "Invalid event " + event); } } catch (JSONException e) { GNLog.getInstance().logError(TAG, "Error parsing message as json", e); } catch (IOException e) { GNLog.getInstance().logError(TAG, "IO Error", e); } } } private JavascriptBridge javascriptBridge; private MainActivity context; private Map idToFileInfo; private String nextFileName; public FileWriterSharer(MainActivity context) { this.javascriptBridge = new JavascriptBridge(); this.context = context; this.idToFileInfo = new HashMap<>(); AppConfig appConfig = AppConfig.getInstance(this.context); if (appConfig.downloadToPublicStorage) { this.defaultDownloadLocation = FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS; } else { this.defaultDownloadLocation = FileDownloader.DownloadLocation.PRIVATE_INTERNAL; } } public JavascriptBridge getJavascriptBridge() { return javascriptBridge; } public void downloadBlobUrl(String url, String filename, boolean open) { if (url == null || !url.startsWith("blob:")) { return; } this.downloadFilename = filename; this.open = open; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); BufferedInputStream is = new BufferedInputStream(context.getAssets().open("BlobDownloader.js")); IOUtils.copy(is, baos); String js = baos.toString(); context.runJavascript(js); js = "gonativeDownloadBlobUrl(" + LeanUtils.jsWrapString(url) + ")"; context.runJavascript(js); } catch (IOException e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } } private void onFileStart(JSONObject message) throws IOException { String identifier = LeanUtils.optString(message, "id"); if (identifier == null || identifier.isEmpty()) { GNLog.getInstance().logError(TAG, "Invalid file id"); return; } String fileName; String extension = null; String type = null; if (!TextUtils.isEmpty(downloadFilename)) { extension = FileDownloader.getFilenameExtension(downloadFilename); if (!TextUtils.isEmpty(extension)) { if (Objects.equals(extension, downloadFilename)) { fileName = "download"; } else { fileName = downloadFilename.substring(0, downloadFilename.length() - (extension.length() + 1)); } type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } else { fileName = downloadFilename; } } else { fileName = LeanUtils.optString(message, "name"); if (fileName == null || fileName.isEmpty()) { if (this.nextFileName != null) { fileName = this.nextFileName; this.nextFileName = null; } else { fileName = "download"; } } } long fileSize = message.optLong("size", -1); if (fileSize <= 0 || fileSize > MAX_SIZE) { GNLog.getInstance().logError(TAG, "Invalid file size"); return; } if (TextUtils.isEmpty(type)) { type = LeanUtils.optString(message, "type"); if (TextUtils.isEmpty(type)) { GNLog.getInstance().logError(TAG, "Invalid file type"); return; } } if (TextUtils.isEmpty(extension)) { MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); extension = mimeTypeMap.getExtensionFromMimeType(type); } final FileInfo info = new FileInfo(); info.id = identifier; info.name = fileName; info.size = fileSize; info.mimetype = type; info.extension = extension; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && defaultDownloadLocation == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) { // request permissions context.getPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, (permissions, grantResults) -> { try { onFileStartAfterPermission(info, grantResults[0] == PackageManager.PERMISSION_GRANTED); final String js = "gonativeGotStoragePermissions()"; context.runOnUiThread(() -> context.runJavascript(js)); } catch (IOException e) { GNLog.getInstance().logError(TAG, "IO Error", e); } }); } else { onFileStartAfterPermission(info, true); final String js = "gonativeGotStoragePermissions()"; context.runOnUiThread(() -> context.runJavascript(js)); } } private void onFileStartAfterPermission(FileInfo info, boolean granted) throws IOException { if (granted && defaultDownloadLocation == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { ContentResolver contentResolver = context.getApplicationContext().getContentResolver(); Uri uri = FileDownloader.createExternalFileUri(contentResolver, info.name, info.mimetype, Environment.DIRECTORY_DOWNLOADS); if (uri != null) { info.fileOutputStream = contentResolver.openOutputStream(uri); info.savedUri = uri; } } else { info.savedFile = FileDownloader.createOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), info.name, info.extension); info.fileOutputStream = new BufferedOutputStream(new FileOutputStream(info.savedFile)); } } else { info.savedFile = FileDownloader.createOutputFile(context.getFilesDir(), info.name, info.extension); info.fileOutputStream = new BufferedOutputStream(new FileOutputStream(info.savedFile)); } info.bytesWritten = 0; this.idToFileInfo.put(info.id, info); } private void onFileChunk(JSONObject message) throws IOException { String identifier = LeanUtils.optString(message, "id"); if (identifier == null || identifier.isEmpty()) { return; } FileInfo fileInfo = this.idToFileInfo.get(identifier); if (fileInfo == null) { return; } String data = LeanUtils.optString(message, "data"); if (data == null) { return; } int idx = data.indexOf(BASE64TAG); if (idx == -1) { return; } idx += BASE64TAG.length(); byte[] chunk = Base64.decode(data.substring(idx), Base64.DEFAULT); if (fileInfo.bytesWritten + chunk.length > fileInfo.size) { GNLog.getInstance().logError(TAG, "Received too many bytes. Expected " + fileInfo.size); try { fileInfo.fileOutputStream.close(); fileInfo.savedFile.delete(); this.idToFileInfo.remove(identifier); } catch (Exception ignored) { } return; } fileInfo.fileOutputStream.write(chunk); fileInfo.bytesWritten += chunk.length; } private void onFileEnd(JSONObject message) throws IOException { String identifier = LeanUtils.optString(message, "id"); if (identifier == null || identifier.isEmpty()) { GNLog.getInstance().logError(TAG, "Invalid identifier " + identifier + " for fileEnd"); return; } final FileInfo fileInfo = this.idToFileInfo.get(identifier); if (fileInfo == null) { GNLog.getInstance().logError(TAG, "Invalid identifier " + identifier + " for fileEnd"); return; } fileInfo.fileOutputStream.close(); if (open) { context.runOnUiThread(() -> { if (fileInfo.savedUri == null && fileInfo.savedFile != null) { fileInfo.savedUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", fileInfo.savedFile); } if (fileInfo.savedUri == null) return; Intent intent = getIntentToOpenFile(fileInfo.savedUri, fileInfo.mimetype); try { context.startActivity(intent); } catch (ActivityNotFoundException e) { String message1 = context.getResources().getString(R.string.file_handler_not_found); Toast.makeText(context, message1, Toast.LENGTH_LONG).show(); } }); } else { String downloadCompleteMessage = fileInfo.name != null && !fileInfo.name.isEmpty() ? String.format(context.getString(R.string.file_download_finished_with_name), fileInfo.name + '.' + fileInfo.extension) : context.getString(R.string.file_download_finished); Toast.makeText(context, downloadCompleteMessage, Toast.LENGTH_SHORT).show(); } } private Intent getIntentToOpenFile(Uri uri, String mimetype) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, mimetype); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK); return intent; } private void onNextFileInfo(JSONObject message) { String name = LeanUtils.optString(message, "name"); if (name == null || name.isEmpty()) { GNLog.getInstance().logError(TAG, "Invalid name for nextFileInfo"); return; } this.nextFileName = name; } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/FileWriterSharer.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ConfigUpdater.java package co.median.android; import android.content.Context; import android.os.AsyncTask; import org.json.JSONException; import org.json.JSONObject; import java.io.OutputStreamWriter; import java.lang.ref.WeakReference; import java.net.HttpURLConnection; import java.net.URL; import co.median.median_core.AppConfig; import co.median.median_core.GNLog; /** * Created by weiyin on 8/8/14. */ public class ConfigUpdater { private static final String TAG = ConfigUpdater.class.getName(); private Context context; ConfigUpdater(Context context) { this.context = context; } public void registerEvent() { if (AppConfig.getInstance(context).disableEventRecorder) return; new EventTask(context).execute(); } private static class EventTask extends AsyncTask { WeakReference contextReference; EventTask(Context context) { this.contextReference = new WeakReference<>(context); } @Override protected Void doInBackground(Void... params) { Context context = contextReference.get(); if (context == null) return null; JSONObject json = new JSONObject(Installation.getInfo(context)); try { json.put("event", "launch"); } catch (JSONException e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); return null; } try { URL url = new URL("https://events.gonative.io/api/events/new"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true); connection.setDoInput(false); // we do not care about response OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); writer.write(json.toString()); writer.close(); connection.connect(); connection.getResponseCode(); connection.disconnect(); } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return null; } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ConfigUpdater.java # Start of /mnt/data/jocal3--U/jocal3--U/android/generate-tinted-icons.sh #!/usr/bin/env bash set -e DARK_ICONS=( ic_refresh_white_24dp.png ic_search_white_24dp.png ic_share_white_24dp.png ) LIGHT_ICONS=( ic_refresh_black_24dp.png ic_search_black_24dp.png ic_share_black_24dp.png ) DARK_DEFAULT_COLOR=ffffff LIGHT_DEFAULT_COLOR=000000 BASEDIR=$(dirname $0) function showHelp { echo "Usage: $0 (dark|light) tintColor tintColorDark" echo "Example: $0 light 0000ff ffffff" exit 1 } if [[ $# -lt 2 ]]; then showHelp fi theme=`echo $1 | tr '[:upper:]' '[:lower:]'` tintColor=`echo $2 | tr '[:upper:]' '[:lower:]'` tintColorDark=`echo $3 | tr '[:upper:]' '[:lower:]'` if [[ $theme = light ]]; then icons=("${LIGHT_ICONS[@]}") defaultColor=$LIGHT_DEFAULT_COLOR elif [[ $theme = dark ]]; then icons=("${DARK_ICONS[@]}") defaultColor=$DARK_DEFAULT_COLOR else showHelp fi if [[ ${#tintColor} -ne 6 ]]; then showHelp fi if [[ $tintColor = $defaultColor ]]; then echo "Requested color $tintColor is same as default for theme. Exiting." exit fi for drawable in `ls -d $BASEDIR/app/src/main/res/drawable*`; do for file in "${icons[@]}"; do filePath=$drawable/$file if [[ -s "$filePath" ]]; then echo Tinting $filePath convert $filePath -fill "#$tintColor" -colorize 100% $filePath optipng $filePath fi done done if [[ ${#tintColorDark} -ne 6 ]]; then exit fi for drawable in `ls -d $BASEDIR/app/src/main/res/drawable-night*`; do for file in "${icons[@]}"; do filePath=$drawable/$file if [[ -s "$filePath" ]]; then echo Tinting $filePath convert $filePath -fill "#$tintColorDark" -colorize 100% $filePath optipng $filePath fi done done # End of /mnt/data/jocal3--U/jocal3--U/android/generate-tinted-icons.sh # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/HtmlIntercept.java package co.median.android; import android.content.Context; import android.text.TextUtils; import android.util.Log; import android.webkit.WebResourceResponse; import android.webkit.WebView; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; import java.util.Map; import co.median.median_core.AppConfig; import co.median.median_core.GNLog; import co.median.median_core.GoNativeWebviewInterface; /** * Created by weiyin on 1/29/16. */ public class HtmlIntercept { private static final String TAG = HtmlIntercept.class.getName(); private Context context; private String interceptUrl; private String JSBridgeScript; private String redirectedUrl; // track whether we have intercepted a page at all. We will always try to intercept the first time, // because interceptUrl may not have been set if restoring from a bundle. private boolean hasIntercepted = false; HtmlIntercept(Context context) { this.context = context; } public void setInterceptUrl(String interceptUrl) { this.interceptUrl = interceptUrl; } public WebResourceResponse interceptHtml(GoNativeWebviewInterface view, String url, String referer) { AppConfig appConfig = AppConfig.getInstance(context); if (!appConfig.interceptHtml && (appConfig.customHeaders == null || appConfig.customHeaders.isEmpty())) return null; if (!hasIntercepted) { interceptUrl = url; hasIntercepted = true; } if (!urlMatches(interceptUrl, url)) return null; InputStream is = null; ByteArrayOutputStream baos = null; try { URL parsedUrl = new URL(url); String protocol = parsedUrl.getProtocol(); if (!protocol.equalsIgnoreCase("http") && !protocol.equalsIgnoreCase("https")) return null; HttpURLConnection connection = (HttpURLConnection)parsedUrl.openConnection(); connection.setInstanceFollowRedirects(false); String customUserAgent = appConfig.userAgentForUrl(parsedUrl.toString()); if (customUserAgent != null) { connection.setRequestProperty("User-Agent", customUserAgent); } else { connection.setRequestProperty("User-Agent", appConfig.userAgent); } connection.setRequestProperty("Cache-Control", "no-cache"); if (referer != null) { connection.setRequestProperty("Referer", referer); } Map customHeaders = CustomHeaders.getCustomHeaders(context); if (customHeaders != null) { for (Map.Entry entry : customHeaders.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); } } connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_MOVED_PERM || responseCode == HttpURLConnection.HTTP_MOVED_TEMP || responseCode == HttpURLConnection.HTTP_SEE_OTHER || responseCode == 307) { // Get redirect URL to be loaded directly to webview, return blank resource which we cancel on UrlNavigation.onPageStart() // We cannot pass headers in webresourceresponse until Android API 21, and we cannot return null // or else the webview will handle the request entirely without intercept String location = connection.getHeaderField("Location"); // validate location as URL try { new URL(location); } catch (MalformedURLException ex) { URL base = new URL(url); location = new URL(base, location).toString(); } if (!TextUtils.isEmpty(location)) { this.redirectedUrl = url; MainActivity mainActivity = (MainActivity) context; WebView webView = (WebView) mainActivity.getWebView(); String finalLocation = location; // needed, for this should be effectively final webView.post(() -> webView.loadUrl(finalLocation)); } return new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream("".getBytes())); } String mimetype = connection.getContentType(); if (mimetype == null) { try { is = new BufferedInputStream(connection.getInputStream()); } catch (IOException e) { is = new BufferedInputStream(connection.getErrorStream()); } mimetype = HttpURLConnection.guessContentTypeFromStream(is); } // if not html, then return null so that webview loads directly. if (mimetype == null || !mimetype.startsWith("text/html")) return null; // get and intercept the data String characterEncoding = getCharset(mimetype); if (characterEncoding == null) { characterEncoding = "UTF-8"; } else if (characterEncoding.toLowerCase().equals("iso-8859-1")) { // windows-1252 is a superset of ios-8859-1 that supports the euro symbol €. // The html5 spec actually maps "iso-8859-1" to windows-1252 encoding characterEncoding = "windows-1252"; } if (is == null) { try { is = new BufferedInputStream(connection.getInputStream()); } catch (IOException e) { is = new BufferedInputStream(connection.getErrorStream()); } } int initialLength = connection.getContentLength(); if (initialLength < 0) initialLength = UrlNavigation.DEFAULT_HTML_SIZE; baos = new ByteArrayOutputStream(initialLength); IOUtils.copy(is, baos); String origString; try { origString = baos.toString(characterEncoding); } catch (UnsupportedEncodingException e){ // Everything should support UTF-8 origString = baos.toString("UTF-8"); } // modify the string! String newString; int insertPoint = origString.indexOf(""); if (insertPoint >= 0) { StringBuilder builder = new StringBuilder(initialLength); builder.append(origString.substring(0, insertPoint)); if (appConfig.stringViewport != null) { builder.append(""); } if (!Double.isNaN(appConfig.forceViewportWidth)) { if (appConfig.zoomableForceViewport) { builder.append(String.format(Locale.US, "", appConfig.forceViewportWidth)); } else { // we want to use user-scalable=no, but android has a bug that sets scale to // 1.0 if user-scalable=no. The workaround to is calculate the scale and set // it for initial, minimum, and maximum. // http://stackoverflow.com/questions/12723844/android-viewport-setting-user-scalable-no-breaks-width-zoom-level-of-viewpor double webViewWidth = view.getWidth() / context.getResources().getDisplayMetrics().density; double viewportWidth = appConfig.forceViewportWidth; double scale = webViewWidth / viewportWidth; builder.append(String.format(Locale.US, "", viewportWidth, scale, scale, scale)); } } builder.append(origString.substring(insertPoint)); newString = builder.toString(); } else { Log.d(TAG, "could not find closing tag"); newString = origString; } return new WebResourceResponse("text/html", "UTF-8", new ByteArrayInputStream(newString.getBytes("UTF-8"))); } catch (Exception e) { GNLog.getInstance().logError(TAG, e.toString(), e); return null; } finally { IOUtils.close(is); IOUtils.close(baos); } } // Do these urls match, ignoring trailing slash in path private static boolean urlMatches(String url1, String url2) { if (url1 == null || url2 == null) return false; try { URL parsed1 = new URL(url1); URL parsed2 = new URL(url2); if (stringsNotEqual(parsed1.getProtocol(), parsed2.getProtocol())) return false; if (stringsNotEqual(parsed1.getAuthority(), parsed2.getAuthority())) return false; if (stringsNotEqual(parsed1.getQuery(), parsed2.getQuery())) return false; String path1 = parsed1.getPath(); String path2 = parsed2.getPath(); if (path1 == null) path1 = ""; if (path2 == null) path2 = ""; int lengthDiff = path2.length() - path2.length(); if (lengthDiff > 1 || lengthDiff < -1) return false; if (lengthDiff == 0) return path1.equals(path2); if (lengthDiff == 1) { return path2.equals(path1 + "/"); } // lengthDiff == -1 return path1.equals(path2 + "/"); } catch (MalformedURLException e) { return false; } } private static boolean stringsNotEqual(String s1, String s2) { return !(s1 == null ? s2 == null : s1.equals(s2)); } private static String getCharset(String contentType) { if (contentType == null || contentType.isEmpty()) { return null; } String[] tokens = contentType.split("; *"); for (String s : tokens) { if (s.startsWith("charset=")) { return s.substring("charset=".length()); } } return null; } public String getRedirectedUrl() { return redirectedUrl; } public void setRedirectedUrl(String redirectUrl) { this.redirectedUrl = redirectUrl; } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/HtmlIntercept.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/FileDownloader.java package co.median.android; import android.Manifest; import android.content.ComponentName; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.os.IBinder; import android.provider.MediaStore; import android.text.TextUtils; import android.util.Log; import android.webkit.DownloadListener; import android.webkit.MimeTypeMap; import android.widget.Toast; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.content.ContextCompat; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Objects; import co.median.median_core.AppConfig; import co.median.median_core.LeanUtils; /** * Created by weiyin on 6/24/14. */ public class FileDownloader implements DownloadListener { public enum DownloadLocation { PUBLIC_DOWNLOADS, PRIVATE_INTERNAL } private static final String TAG = FileDownloader.class.getName(); private final MainActivity context; private final DownloadLocation defaultDownloadLocation; private final ActivityResultLauncher requestPermissionLauncher; private UrlNavigation urlNavigation; private String lastDownloadedUrl; private DownloadService downloadService; private boolean isBound = false; private PreDownloadInfo preDownloadInfo; private final ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { DownloadService.DownloadBinder binder = (DownloadService.DownloadBinder) iBinder; downloadService = binder.getService(); isBound = true; } @Override public void onServiceDisconnected(ComponentName componentName) { downloadService = null; isBound = false; } }; FileDownloader(MainActivity context) { this.context = context; AppConfig appConfig = AppConfig.getInstance(this.context); if (appConfig.downloadToPublicStorage) { this.defaultDownloadLocation = DownloadLocation.PUBLIC_DOWNLOADS; } else { this.defaultDownloadLocation = DownloadLocation.PRIVATE_INTERNAL; } Intent intent = new Intent(context, DownloadService.class); context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); // initialize request permission launcher requestPermissionLauncher = context.registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), isGranted -> { if (isGranted.containsKey(Manifest.permission.WRITE_EXTERNAL_STORAGE) && Boolean.FALSE.equals(isGranted.get(Manifest.permission.WRITE_EXTERNAL_STORAGE))) { Toast.makeText(context, "Unable to save download, storage permission denied", Toast.LENGTH_SHORT).show(); return; } if (preDownloadInfo != null && isBound) { if (preDownloadInfo.isBlob) { context.getFileWriterSharer().downloadBlobUrl(preDownloadInfo.url, preDownloadInfo.filename, preDownloadInfo.open); } else { downloadService.startDownload(preDownloadInfo.url, preDownloadInfo.filename, preDownloadInfo.mimetype, preDownloadInfo.shouldSaveToGallery, preDownloadInfo.open, defaultDownloadLocation); } preDownloadInfo = null; } }); } @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { if (urlNavigation != null) { urlNavigation.onDownloadStart(); } if (context != null) { context.runOnUiThread(new Runnable() { @Override public void run() { context.showWebview(); } }); } // get filename from content disposition String guessFilename = null; if (!TextUtils.isEmpty(contentDisposition)) { guessFilename = LeanUtils.guessFileName(url, contentDisposition, mimetype); } if (url.startsWith("blob:") && context != null) { boolean openAfterDownload = defaultDownloadLocation == DownloadLocation.PRIVATE_INTERNAL; if (requestRequiredPermission(new PreDownloadInfo(url, guessFilename, true, openAfterDownload))) { return; } context.getFileWriterSharer().downloadBlobUrl(url, guessFilename, openAfterDownload); return; } lastDownloadedUrl = url; // try to guess mimetype if (mimetype == null || mimetype.equalsIgnoreCase("application/force-download") || mimetype.equalsIgnoreCase("application/octet-stream")) { MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null && !extension.isEmpty()) { String guessedMimeType = mimeTypeMap.getMimeTypeFromExtension(extension); if (guessedMimeType != null) { mimetype = guessedMimeType; } } } startDownload(url, guessFilename, mimetype, false, false); } public void downloadFile(String url, String filename, boolean shouldSaveToGallery, boolean open) { if (TextUtils.isEmpty(url)) { Log.d(TAG, "downloadFile: Url empty!"); return; } if (url.startsWith("blob:") && context != null) { if (defaultDownloadLocation == DownloadLocation.PRIVATE_INTERNAL) { open = true; } if (requestRequiredPermission(new PreDownloadInfo(url, filename, true, open))) { return; } context.getFileWriterSharer().downloadBlobUrl(url, filename, open); return; } String mimetype = "*/*"; MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null && !extension.isEmpty()) { String guessedMimeType = mimeTypeMap.getMimeTypeFromExtension(extension); if (guessedMimeType != null) { mimetype = guessedMimeType; } } startDownload(url, filename, mimetype, shouldSaveToGallery, open); } private void startDownload(String downloadUrl, String filename, String mimetype, boolean shouldSaveToGallery, boolean open) { if (isBound) { if (requestRequiredPermission(new PreDownloadInfo(downloadUrl, filename, mimetype, shouldSaveToGallery, open, false))) return; downloadService.startDownload(downloadUrl, filename, mimetype, shouldSaveToGallery, open, defaultDownloadLocation); } } // Requests required permission depending on device's SDK version private boolean requestRequiredPermission(PreDownloadInfo preDownloadInfo) { List permissions = new ArrayList<>(); if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P && ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && defaultDownloadLocation == DownloadLocation.PUBLIC_DOWNLOADS) { permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (permissions.size() > 0) { this.preDownloadInfo = preDownloadInfo; requestPermissionLauncher.launch(permissions.toArray(new String[] {})); return true; } return false; } public String getLastDownloadedUrl() { return lastDownloadedUrl; } public void setUrlNavigation(UrlNavigation urlNavigation) { this.urlNavigation = urlNavigation; } public void unbindDownloadService() { if (isBound) { context.unbindService(serviceConnection); isBound = false; } } public static Uri createExternalFileUri(ContentResolver contentResolver, String filename, String mimetype, String environment) { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, filename); contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimetype); contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, environment); Uri baseExternalUri = getBaseExternalUriForEnvironment(environment); if (baseExternalUri == null) { return null; } return createFileUri(baseExternalUri, contentResolver, contentValues, filename, mimetype); } private static Uri createFileUri(Uri baseExternalUri, ContentResolver contentResolver, ContentValues contentValues, String filename, String mimetype) { try { // Let the system create the unique URI first. Some device models(e.g., Samsung) will throw IllegalStateException // https://stackoverflow.com/questions/61654022/java-lang-illegalstateexception-failed-to-build-unique-file-storage-emulated Uri uri = contentResolver.insert(baseExternalUri, contentValues); // On certain Android versions (e.g., Android 10), a null URI may be returned due to a System-thrown SQLiteConstraintException. // We handle this by forcibly creating one. if (uri == null) { uri = createUniqueFileUri(baseExternalUri, contentResolver, contentValues, filename, mimetype); } return uri; } catch (IllegalStateException ex) { return createUniqueFileUri(baseExternalUri, contentResolver, contentValues, filename, mimetype); } } private static Uri createUniqueFileUri(Uri baseExternalUri, ContentResolver contentResolver, ContentValues contentValues, String filename, String mimetype) { try { String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimetype); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, getUniqueExternalFileName(contentResolver, baseExternalUri, filename, extension)); return contentResolver.insert(baseExternalUri, contentValues); } catch (IllegalStateException ex) { return createUniqueFileUriWithTimeStamp(baseExternalUri, contentResolver, contentValues, filename); } } private static Uri createUniqueFileUriWithTimeStamp(Uri baseExternalUri, ContentResolver contentResolver, ContentValues contentValues, String filename) { try { contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, filename + "_" + System.currentTimeMillis()); return contentResolver.insert(baseExternalUri, contentValues); } catch (IllegalStateException ex) { return null; } } public static String getFileNameFromUri(Uri uri, ContentResolver contentResolver) { String fileName = null; String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME}; Cursor cursor = contentResolver.query(uri, projection, null, null, null); if (cursor != null) { try { if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME); fileName = cursor.getString(columnIndex); } } finally { cursor.close(); } } return fileName; } private static Uri getBaseExternalUriForEnvironment(String environment) { if (Objects.equals(environment, Environment.DIRECTORY_PICTURES)) { return MediaStore.Images.Media.getContentUri("external"); } else if (Objects.equals(environment, Environment.DIRECTORY_DOWNLOADS)) { return MediaStore.Files.getContentUri("external"); } return null; } private static String getUniqueExternalFileName(ContentResolver contentResolver, Uri baseUri, String filename, String extension) { int suffix = 1; String newFilename = filename; while (externalFileExists(contentResolver, baseUri, newFilename + "." + extension)) { newFilename = filename + " (" + suffix + ")"; suffix++; } return newFilename; } private static boolean externalFileExists(ContentResolver contentResolver, Uri baseUri, String filename) { String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME}; String selection = MediaStore.MediaColumns.DISPLAY_NAME + "=?"; String[] selectionArgs = {filename}; try (Cursor cursor = contentResolver.query(baseUri, projection, selection, selectionArgs, null)) { if (cursor != null && cursor.moveToFirst()) { return true; } } catch (Exception e) { Log.w(TAG, "externalFileExists: ", e); } return false; } public static File createOutputFile(File dir, String filename, String extension) { return new File(dir, FileDownloader.getUniqueFileName(filename + "." + extension, dir)); } public static String getUniqueFileName(String fileName, File dir) { File file = new File(dir, fileName); if (!file.exists()) { return fileName; } int count = 1; String nameWithoutExt = fileName.substring(0, fileName.lastIndexOf('.')); String ext = fileName.substring(fileName.lastIndexOf('.')); String newFileName = nameWithoutExt + "_" + count + ext; file = new File(dir, newFileName); while (file.exists()) { count++; newFileName = nameWithoutExt + "_" + count + ext; file = new File(dir, newFileName); } return file.getName(); } public static String getFilenameExtension(String name) { int pos = name.lastIndexOf('.'); if (pos == -1) { return null; } else if (pos == 0) { return name; } else { return name.substring(pos + 1); } } private static class PreDownloadInfo { String url; String filename; String mimetype; boolean shouldSaveToGallery; boolean open; boolean isBlob; public PreDownloadInfo(String url, String filename, String mimetype, boolean shouldSaveToGallery, boolean open, boolean isBlob) { this.url = url; this.filename = filename; this.mimetype = mimetype; this.shouldSaveToGallery = shouldSaveToGallery; this.open = open; this.isBlob = isBlob; } public PreDownloadInfo(String url, String filename, boolean isBlob, boolean open) { this.url = url; this.filename = filename; this.isBlob = isBlob; this.open = open; } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/FileDownloader.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/UrlInspector.java package co.median.android; import android.content.Context; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import co.median.median_core.AppConfig; import co.median.median_core.GNLog; /** * Created by weiyin on 4/28/14. */ public class UrlInspector { private static final String TAG = UrlInspector.class.getName(); // singleton private static UrlInspector instance = null; private Pattern userIdRegex = null; private String userId = null; public static UrlInspector getInstance(){ if (instance == null) { instance = new UrlInspector(); } return instance; } public void init(Context context) { String regexString = AppConfig.getInstance(context).userIdRegex; if (regexString != null && !regexString.isEmpty()) { try { userIdRegex = Pattern.compile(regexString); } catch (PatternSyntaxException e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } } } private UrlInspector() { // prevent direct instantiation } public void inspectUrl(String url) { if (userIdRegex != null) { Matcher matcher = userIdRegex.matcher(url); if (matcher.groupCount() > 0 && matcher.find()) { setUserId(matcher.group(1)); } } } public String getUserId() { return userId; } private void setUserId(String userId) { this.userId = userId; } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/UrlInspector.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsCustomCodeExecutor.java package co.median.android; import org.json.JSONException; import org.json.JSONObject; import java.util.Map; import co.median.median_core.GNLog; public class JsCustomCodeExecutor { private static final String TAG = JsCustomCodeExecutor.class.getName(); public static interface CustomCodeHandler { JSONObject execute(Map params); } // The default CustomCodeHandler "Echo" // Simply maps all the key/values of the given params into a JSONObject private static CustomCodeHandler handler = new CustomCodeHandler() { @Override public JSONObject execute(Map params) { if(params != null) { JSONObject json = new JSONObject(); try { for(Map.Entry entry : params.entrySet()) { json.put(entry.getKey(), entry.getValue()); } } catch(JSONException e) { GNLog.getInstance().logError(TAG, "Error building custom Json Data", e); } return json; } return null; } }; /** * Set new CustomCodeHandler to override the default "Echo" handler * @param customHandler */ public static void setHandler(CustomCodeHandler customHandler) { if(customHandler == null) return; handler = customHandler; } /** * Code Handler gets triggered by the UrlNavigation class * * @param params A map consisting of all URI parameters and their values * @return A JSONObject as defined by the Code Handler * * @see UrlNavigation#shouldOverrideUrlLoading */ public static JSONObject execute(Map params) { try { return handler.execute(params); } catch(Exception e) { GNLog.getInstance().logError(TAG, "Error executing custom code", e); return null; } } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsCustomCodeExecutor.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/UrlNavigation.java package co.median.android; import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.content.SharedPreferences; import android.location.LocationManager; import android.net.Uri; import android.net.http.SslError; import android.os.AsyncTask; import android.os.Build; import android.os.Handler; import android.os.Message; import android.preference.PreferenceManager; import android.provider.Settings; import android.security.KeyChain; import android.security.KeyChainAliasCallback; import android.text.TextUtils; import android.util.Log; import android.util.Pair; import android.webkit.ClientCertRequest; import android.webkit.CookieManager; import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.RequiresApi; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.json.JSONArray; import org.json.JSONObject; import java.net.URISyntaxException; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import co.median.median_core.AppConfig; import co.median.median_core.GNLog; import co.median.median_core.GoNativeWebviewInterface; import co.median.median_core.LeanUtils; import co.median.median_core.RegexRulesManager; import co.median.median_core.Utils; enum WebviewLoadState { STATE_UNKNOWN, STATE_START_LOAD, // we have decided to load the url in this webview in shouldOverrideUrlLoading STATE_PAGE_STARTED, // onPageStarted has been called STATE_DONE // onPageFinished has been called } public class UrlNavigation { public static final String STARTED_LOADING_MESSAGE = "io.gonative.android.webview.started"; public static final String FINISHED_LOADING_MESSAGE = "io.gonative.android.webview.finished"; public static final String CLEAR_POOLS_MESSAGE = "io.gonative.android.webview.clearPools"; private static final String TAG = UrlNavigation.class.getName(); private static final String CALLBACK_APP_BROWSER_CLOSED = "median_appbrowser_closed"; private static final String ASSET_URL = "file:///android_asset/"; public static final String OFFLINE_PAGE_URL = "file:///android_asset/offline.html"; public static final String OFFLINE_PAGE_URL_RAW = "file:///offline.html"; public static final int DEFAULT_HTML_SIZE = 10 * 1024; // 10 kilobytes private MainActivity mainActivity; private String profilePickerExec; private String gnProfilePickerExec; private String currentWebviewUrl; private HtmlIntercept htmlIntercept; private Handler startLoadTimeout = new Handler(); ActivityResultLauncher activityResultLauncher; private WebviewLoadState state = WebviewLoadState.STATE_UNKNOWN; private boolean mVisitedLoginOrSignup = false; private boolean finishOnExternalUrl = false; private double connectionOfflineTime; private String interceptedRedirectUrl = ""; UrlNavigation(MainActivity activity) { this.mainActivity = activity; this.htmlIntercept = new HtmlIntercept(activity); AppConfig appConfig = AppConfig.getInstance(mainActivity); // profile picker if (appConfig.profilePickerJS != null) { this.profilePickerExec = "median_profile_picker.parseJson(eval(" + LeanUtils.jsWrapString(appConfig.profilePickerJS) + "))"; this.gnProfilePickerExec = "gonative_profile_picker.parseJson(eval(" + LeanUtils.jsWrapString(appConfig.profilePickerJS) + "))"; } if (mainActivity.getIntent().getBooleanExtra(MainActivity.EXTRA_WEBVIEW_WINDOW_OPEN, false)) { finishOnExternalUrl = true; } connectionOfflineTime = appConfig.androidConnectionOfflineTime; activityResultLauncher = activity.registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { String callback = LeanUtils.createJsForCallback(CALLBACK_APP_BROWSER_CLOSED, null); mainActivity.runJavascript(callback); }); } private boolean isInternalUri(Uri uri) { String scheme = uri.getScheme(); if (scheme == null || (!scheme.equalsIgnoreCase("http") && !scheme.equalsIgnoreCase("https"))) { return false; } AppConfig appConfig = AppConfig.getInstance(mainActivity); RegexRulesManager regexRulesManager = appConfig.regexRulesManager; String urlString = uri.toString(); // first check regexes if (!regexRulesManager.isEmpty()) { return regexRulesManager.getMode(urlString).equals(RegexRulesManager.MODE_INTERNAL); } String host = uri.getHost(); String initialHost = appConfig.initialHost; return host != null && (host.equals(initialHost) || host.endsWith("." + initialHost)); } public boolean shouldOverrideUrlLoading(GoNativeWebviewInterface view, String url) { return shouldOverrideUrlLoading(view, url, false, false); } // noAction to skip stuff like opening url in external browser, higher nav levels, etc. private boolean shouldOverrideUrlLoadingNoIntercept(final GoNativeWebviewInterface view, final String url, @SuppressWarnings("SameParameterValue") final boolean noAction) { // Log.d(TAG, "shouldOverrideUrl: " + url); // return if url is null (can happen if clicking refresh when there is no page loaded) if (url == null) return false; // return if loading from local assets if (url.startsWith(ASSET_URL)) return false; if (url.startsWith("blob:")) return false; view.setCheckLoginSignup(true); Uri uri = Uri.parse(url); if (uri.getScheme() != null && uri.getScheme().equals("gonative-bridge")) { if (noAction) return true; try { String json = uri.getQueryParameter("json"); JSONArray parsedJson = new JSONArray(json); for (int i = 0; i < parsedJson.length(); i++) { JSONObject entry = parsedJson.optJSONObject(i); if (entry == null) continue; String command = entry.optString("command"); if (command.isEmpty()) continue; if (command.equals("pop")) { if (mainActivity.isNotRoot()) mainActivity.finish(); } else if (command.equals("clearPools")) { LocalBroadcastManager.getInstance(mainActivity).sendBroadcast( new Intent(UrlNavigation.CLEAR_POOLS_MESSAGE)); } } } catch (Exception e) { // do nothing } return true; } final AppConfig appConfig = AppConfig.getInstance(mainActivity); // Check native bridge urls if (("median".equals(uri.getScheme()) || "gonative".equals(uri.getScheme())) && currentWebviewUrl != null && !LeanUtils.checkNativeBridgeUrls(currentWebviewUrl, mainActivity)) { GNLog.getInstance().logError(TAG, "URL not authorized for native bridge: " + currentWebviewUrl); return true; } if ("median".equals(uri.getScheme()) || "gonative".equals(uri.getScheme())) { ((GoNativeApplication) mainActivity.getApplication()).mBridge.handleJSBridgeFunctions(mainActivity, uri); return true; } // check redirects if (appConfig.getRedirects() != null) { String to = appConfig.getRedirects().get(url); if (to == null) to = appConfig.getRedirects().get("*"); if (to != null && !to.equals(url)) { if (noAction) return true; final String destination = to; mainActivity.runOnUiThread(new Runnable() { @Override public void run() { mainActivity.loadUrl(destination); } }); return true; } } if (!isInternalUri(uri)) { if (noAction) return true; String mode = appConfig.regexRulesManager.getMode(uri.toString()); if (mode.equals(RegexRulesManager.MODE_APP_BROWSER)) { mainActivity.openAppBrowser(uri); } else { Log.d(TAG, "processing dynamic link: " + uri); Intent intent = null; // launch browser try { if ("intent".equals(uri.getScheme())) { intent = Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME); mainActivity.startActivity(intent); } else if ("http".equals(uri.getScheme()) || "https".equals(uri.getScheme())) { // forces this URL to be launched in this device's default browser, regardless of the app's deeplink mainActivity.openExternalBrowser(uri); } else { intent = new Intent(Intent.ACTION_VIEW, uri); mainActivity.startActivity(intent); } } catch (ActivityNotFoundException ex) { // Try loading fallback url if available if (intent != null) { String fallbackUrl = intent.getStringExtra("browser_fallback_url"); if (!TextUtils.isEmpty(fallbackUrl)) { mainActivity.loadUrl(fallbackUrl); } else { Toast.makeText(mainActivity, R.string.app_not_installed, Toast.LENGTH_LONG).show(); GNLog.getInstance().logError(TAG, mainActivity.getString(R.string.app_not_installed), ex, GNLog.TYPE_TOAST_ERROR); } } } catch (URISyntaxException e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } } // If this URL launched the app initially via deeplink action, // load initialURL so the app does not show a blank page. if (AppLinksActivity.LAUNCH_SOURCE_APP_LINKS.equals(mainActivity.getLaunchSource()) && getCurrentWebviewUrl() == null) { mainActivity.loadUrl(appConfig.getInitialUrl()); } return true; } // Starting here, we are going to load the request, but possibly in a // different activity depending on the structured nav level if (!mainActivity.isRestoreBrightnessOnNavigation()) { mainActivity.setBrightness(-1); mainActivity.setRestoreBrightnessOnNavigation(false); } if (appConfig.maxWindowsEnabled) { GoNativeWindowManager windowManager = mainActivity.getGNWindowManager(); // To prevent consecutive calls and handle MaxWindows correctly // Checks for a flag indicating if the Activity was created from CreateNewWindow OR NavLevels // and avoid triggering MaxWindows during this initial intercept boolean ignoreInterceptMaxWindows = windowManager.isIgnoreInterceptMaxWindows(mainActivity.getActivityId()); if (ignoreInterceptMaxWindows) { windowManager.setIgnoreInterceptMaxWindows(mainActivity.getActivityId(), false); } else if (appConfig.numWindows > 0 && windowManager.getWindowCount() >= appConfig.numWindows) { if (mainActivity.onMaxWindowsReached(url)) { return true; } } } int currentLevel = mainActivity.getUrlLevel(); int newLevel = mainActivity.urlLevelForUrl(url); if (currentLevel >= 0 && newLevel >= 0) { if (newLevel > currentLevel) { if (noAction) return true; // new activity Intent intent = new Intent(mainActivity.getBaseContext(), MainActivity.class); intent.putExtra("isRoot", false); intent.putExtra("url", url); intent.putExtra("parentUrlLevel", currentLevel); intent.putExtra("postLoadJavascript", mainActivity.postLoadJavascript); if (appConfig.maxWindowsEnabled) { intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true); } mainActivity.startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY); mainActivity.postLoadJavascript = null; mainActivity.postLoadJavascriptForRefresh = null; return true; } else if (newLevel < currentLevel && newLevel <= mainActivity.getParentUrlLevel()) { if (noAction) return true; // pop activity Intent returnIntent = new Intent(); returnIntent.putExtra("url", url); returnIntent.putExtra("urlLevel", newLevel); returnIntent.putExtra("postLoadJavascript", mainActivity.postLoadJavascript); mainActivity.setResult(Activity.RESULT_OK, returnIntent); mainActivity.finish(); return true; } } // Starting here, the request will be loaded in this activity. if (newLevel >= 0) { mainActivity.setUrlLevel(newLevel); } final String newTitle = mainActivity.titleForUrl(url); if (newTitle != null) { if (!noAction) { mainActivity.runOnUiThread(new Runnable() { @Override public void run() { mainActivity.setTitle(newTitle); } }); } } // nav title image if (!noAction) { mainActivity.runOnUiThread(() -> mainActivity.getActionManager().setupTitleDisplayForUrl(url) ); } // check to see if the webview exists in pool. WebViewPool webViewPool = ((GoNativeApplication) mainActivity.getApplication()).getWebViewPool(); Pair pair = webViewPool.webviewForUrl(url); final GoNativeWebviewInterface poolWebview = pair.first; WebViewPoolDisownPolicy poolDisownPolicy = pair.second; if (noAction && poolWebview != null) return true; if (poolWebview != null && poolDisownPolicy == WebViewPoolDisownPolicy.Always) { this.mainActivity.runOnUiThread(new Runnable() { @Override public void run() { mainActivity.switchToWebview(poolWebview, true, false); mainActivity.checkNavigationForPage(url); } }); webViewPool.disownWebview(poolWebview); LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(new Intent(UrlNavigation.FINISHED_LOADING_MESSAGE)); return true; } if (poolWebview != null && poolDisownPolicy == WebViewPoolDisownPolicy.Never) { this.mainActivity.runOnUiThread(new Runnable() { @Override public void run() { mainActivity.switchToWebview(poolWebview, true, false); mainActivity.checkNavigationForPage(url); } }); return true; } if (poolWebview != null && poolDisownPolicy == WebViewPoolDisownPolicy.Reload && !LeanUtils.urlsMatchOnPath(url, this.currentWebviewUrl)) { this.mainActivity.runOnUiThread(new Runnable() { @Override public void run() { mainActivity.switchToWebview(poolWebview, true, false); mainActivity.checkNavigationForPage(url); } }); return true; } if (this.mainActivity.isPoolWebview) { // if we are here, either the policy is reload and we are reloading the page, or policy is never but we are going to a different page. So take ownership of the webview. webViewPool.disownWebview(view); this.mainActivity.isPoolWebview = false; } return false; } public boolean shouldOverrideUrlLoading(final GoNativeWebviewInterface view, String url, @SuppressWarnings("unused") boolean isReload, boolean isRedirect) { if (url == null) return false; boolean shouldOverride = shouldOverrideUrlLoadingNoIntercept(view, url, false); if (shouldOverride) { if (finishOnExternalUrl) { mainActivity.finish(); } // Check if intercepted URL request was a result of a server-side redirect. // Redirect URLs triggers redundant onPageFinished() if (isRedirect) { interceptedRedirectUrl = url; } return true; } else { finishOnExternalUrl = false; } // intercept html this.htmlIntercept.setInterceptUrl(url); mainActivity.hideWebview(); state = WebviewLoadState.STATE_START_LOAD; // 10 second (default) delay to get to onPageStarted or doUpdateVisitedHistory if (!Double.isNaN(connectionOfflineTime) && !Double.isInfinite(connectionOfflineTime) && connectionOfflineTime > 0) { startLoadTimeout.postDelayed(new Runnable() { @Override public void run() { AppConfig appConfig = AppConfig.getInstance(mainActivity); String url = view.getUrl(); if (appConfig.showOfflinePage && !OFFLINE_PAGE_URL.equals(url)) { view.loadUrlDirect(OFFLINE_PAGE_URL); } } }, (long) (connectionOfflineTime * 1000)); } return false; } public void onPageStarted(String url) { // catch blank pages from htmlIntercept and cancel loading if (url.equals(htmlIntercept.getRedirectedUrl())) { mainActivity.goBack(); htmlIntercept.setRedirectedUrl(null); return; } state = WebviewLoadState.STATE_PAGE_STARTED; startLoadTimeout.removeCallbacksAndMessages(null); htmlIntercept.setInterceptUrl(url); UrlInspector.getInstance().inspectUrl(url); Uri uri = Uri.parse(url); // reload menu if internal url if (AppConfig.getInstance(mainActivity).loginDetectionUrl != null && isInternalUri(uri)) { mainActivity.updateMenu(); } // check ready status mainActivity.startCheckingReadyStatus(); mainActivity.checkPreNavigationForPage(url); // send broadcast message LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(new Intent(UrlNavigation.STARTED_LOADING_MESSAGE)); // enable swipe refresh controller if offline page if (OFFLINE_PAGE_URL.equals(url)) { mainActivity.enableSwipeRefresh(); } else { mainActivity.restoreSwipRefreshDefault(); } } @SuppressWarnings("unused") public void showWebViewImmediately() { mainActivity.runOnUiThread(() -> mainActivity.showWebviewImmediately()); } @SuppressLint("ApplySharedPref") public void onPageFinished(GoNativeWebviewInterface view, String url) { // Catch intercepted Redirect URL to // prevent loading unnecessary components if (interceptedRedirectUrl.equals(url)) { interceptedRedirectUrl = ""; return; } Log.d(TAG, "onpagefinished " + url); state = WebviewLoadState.STATE_DONE; setCurrentWebviewUrl(url); AppConfig appConfig = AppConfig.getInstance(mainActivity); if (url != null && appConfig.ignorePageFinishedRegexes != null) { for (Pattern pattern : appConfig.ignorePageFinishedRegexes) { if (pattern.matcher(url).matches()) return; } } mainActivity.runOnUiThread(() -> mainActivity.showWebview()); UrlInspector.getInstance().inspectUrl(url); Uri uri = Uri.parse(url); if (isInternalUri(uri)) { AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() { @Override public void run() { CookieManager.getInstance().flush(); } }); } if (appConfig.loginDetectionUrl != null) { if (mVisitedLoginOrSignup) { mainActivity.updateMenu(); } mVisitedLoginOrSignup = LeanUtils.urlsMatchOnPath(url, appConfig.loginUrl) || LeanUtils.urlsMatchOnPath(url, appConfig.signupUrl); } // post-load javascript if (appConfig.postLoadJavascript != null) { view.runJavascript(appConfig.postLoadJavascript); } // profile picker if (this.profilePickerExec != null) { view.runJavascript(this.profilePickerExec); } if (this.gnProfilePickerExec != null) { view.runJavascript(this.gnProfilePickerExec); } // tabs mainActivity.checkNavigationForPage(url); // post-load javascript if (mainActivity.postLoadJavascript != null) { String js = mainActivity.postLoadJavascript; mainActivity.postLoadJavascript = null; mainActivity.runJavascript(js); } // send broadcast message LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(new Intent(UrlNavigation.FINISHED_LOADING_MESSAGE)); boolean doNativeBridge = true; if (currentWebviewUrl != null) { doNativeBridge = LeanUtils.checkNativeBridgeUrls(currentWebviewUrl, mainActivity); } // send installation info if (doNativeBridge) { runGonativeDeviceInfo("median_device_info"); runGonativeDeviceInfo("gonative_device_info"); } ((GoNativeApplication) mainActivity.getApplication()).mBridge.onPageFinish(mainActivity, doNativeBridge); } public void onFormResubmission(GoNativeWebviewInterface view, Message dontResend, Message resend) { resend.sendToTarget(); } private void runGonativeDeviceInfo(String callback) { Map installationInfo = Installation.getInfo(mainActivity); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mainActivity); if (!sharedPreferences.getBoolean("hasLaunched", false)) { sharedPreferences.edit().putBoolean("hasLaunched", true).commit(); installationInfo.put("isFirstLaunch", true); } else { installationInfo.put("isFirstLaunch", false); } JSONObject jsonObject = new JSONObject(installationInfo); String js = LeanUtils.createJsForCallback(callback, jsonObject); mainActivity.runJavascript(js); } public void doUpdateVisitedHistory(@SuppressWarnings("unused") GoNativeWebviewInterface view, String url, boolean isReload) { if (state == WebviewLoadState.STATE_START_LOAD) { state = WebviewLoadState.STATE_PAGE_STARTED; startLoadTimeout.removeCallbacksAndMessages(null); } if (!isReload && !url.equals(OFFLINE_PAGE_URL)) { mainActivity.addToHistory(url); } } public void onReceivedError(final GoNativeWebviewInterface view, @SuppressWarnings("unused") int errorCode, String errorDescription, String failingUrl) { if (errorDescription != null && errorDescription.contains("net::ERR_CACHE_MISS")) { mainActivity.runOnUiThread(new Runnable() { @Override public void run() { view.reload(); } }); return; } boolean showingOfflinePage = false; // show offline page if not connected to internet AppConfig appConfig = AppConfig.getInstance(this.mainActivity); if (appConfig.showOfflinePage && (state == WebviewLoadState.STATE_PAGE_STARTED || state == WebviewLoadState.STATE_START_LOAD)) { if (mainActivity.isDisconnected() || (errorCode == WebViewClient.ERROR_HOST_LOOKUP && failingUrl != null && view.getUrl() != null && failingUrl.equals(view.getUrl()))) { showingOfflinePage = true; mainActivity.runOnUiThread(new Runnable() { @Override public void run() { view.stopLoading(); view.loadUrlDirect(OFFLINE_PAGE_URL); new Handler().postDelayed(new Runnable() { @Override public void run() { view.loadUrlDirect(OFFLINE_PAGE_URL); } }, 100); } }); } } if (!showingOfflinePage) { mainActivity.runOnUiThread(new Runnable() { @Override public void run() { mainActivity.showWebview(); } }); } } public void onReceivedSslError(SslError error, String webviewUrl) { int errorMessage; switch (error.getPrimaryError()) { case SslError.SSL_EXPIRED: errorMessage = R.string.ssl_error_expired; break; case SslError.SSL_DATE_INVALID: case SslError.SSL_IDMISMATCH: case SslError.SSL_NOTYETVALID: case SslError.SSL_UNTRUSTED: errorMessage = R.string.ssl_error_cert; break; case SslError.SSL_INVALID: default: errorMessage = R.string.ssl_error_generic; break; } if(AppConfig.getInstance(mainActivity).sslToastErrorsEnabled) Toast.makeText(mainActivity, errorMessage, Toast.LENGTH_LONG).show(); String finalErrorMessage = mainActivity.getString(errorMessage) + " - Error url: " + error.getUrl() + " - Source page: " + webviewUrl; GNLog.getInstance().logError(TAG, finalErrorMessage, new Exception(finalErrorMessage), GNLog.TYPE_TOAST_ERROR); } @SuppressWarnings("unused") public String getCurrentWebviewUrl() { return currentWebviewUrl; } public void setCurrentWebviewUrl(String currentWebviewUrl) { this.currentWebviewUrl = currentWebviewUrl; ((GoNativeApplication) mainActivity.getApplication()).mBridge.setCurrentWebviewUrl(currentWebviewUrl); } public WebResourceResponse interceptHtml(LeanWebView view, String url) { // Log.d(TAG, "intercept " + url); return htmlIntercept.interceptHtml(view, url, this.currentWebviewUrl); } @SuppressWarnings("UnusedReturnValue") public boolean chooseFileUpload(String[] mimetypespec) { return chooseFileUpload(mimetypespec, false); } public boolean chooseFileUpload(final String[] mimetypespec, final boolean multiple) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { chooseFileUploadAfterPermission(mimetypespec, multiple); } else { List permissionToRequest = new ArrayList<>(); permissionToRequest.add(Manifest.permission.READ_EXTERNAL_STORAGE); permissionToRequest.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) { permissionToRequest.add(Manifest.permission.CAMERA); } mainActivity.getPermission(permissionToRequest.toArray(new String[0]), (permissions, grantResults) -> chooseFileUploadAfterPermission(mimetypespec, multiple)); } return true; } @SuppressWarnings("UnusedReturnValue") private boolean chooseFileUploadAfterPermission(String[] mimetypespec, boolean multiple) { mainActivity.setDirectUploadImageUri(null); FileUploadIntentsCreator creator = new FileUploadIntentsCreator(mainActivity, mimetypespec, multiple); if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA) && (creator.canUploadImage() || creator.canUploadVideo())) { mainActivity.getPermission(new String[]{Manifest.permission.CAMERA}, (permissions, grantResults) -> launchChooserIntent(creator)); return true; } return launchChooserIntent(creator); } private boolean launchChooserIntent(FileUploadIntentsCreator creator) { Intent intentToSend = creator.chooserIntent(); mainActivity.setDirectUploadImageUri(creator.getCurrentCaptureUri()); try { mainActivity.startActivityForResult(intentToSend, MainActivity.REQUEST_SELECT_FILE); return true; } catch (ActivityNotFoundException e) { mainActivity.cancelFileUpload(); Toast.makeText(mainActivity, R.string.cannot_open_file_chooser, Toast.LENGTH_LONG).show(); return false; } } public boolean openDirectCamera(final String[] mimetypespec, final boolean multiple) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) { mainActivity.getPermission(new String[]{Manifest.permission.CAMERA}, (permissions, grantResults) -> openDirectCameraAfterPermission(mimetypespec, multiple)); } else { openDirectCameraAfterPermission(mimetypespec, multiple); } } else { ArrayList permissionRequests = new ArrayList<>(); permissionRequests.add(Manifest.permission.READ_EXTERNAL_STORAGE); permissionRequests.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) { permissionRequests.add(Manifest.permission.CAMERA); } mainActivity.getPermission(permissionRequests.toArray(new String[0]), (permissions, grantResults) -> openDirectCameraAfterPermission(mimetypespec, multiple)); } return true; } /* Directly opens camera if the mime types are images. If not, run existing default process */ @SuppressWarnings("UnusedReturnValue") private boolean openDirectCameraAfterPermission(String[] mimetypespec, boolean multiple) { // Check and verify CAMERA permission so app will not crash when using cam if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) { Toast.makeText(mainActivity, R.string.upload_camera_permission_denied, Toast.LENGTH_SHORT).show(); mainActivity.cancelFileUpload(); return false; } mainActivity.setDirectUploadImageUri(null); FileUploadIntentsCreator creator = new FileUploadIntentsCreator(mainActivity, mimetypespec, multiple); Intent intentToSend = creator.cameraIntent(); mainActivity.setDirectUploadImageUri(creator.getCurrentCaptureUri()); try { // Directly open the camera intent with the same Request Result value value mainActivity.startActivityForResult(intentToSend, MainActivity.REQUEST_SELECT_FILE); return true; } catch (ActivityNotFoundException e) { mainActivity.cancelFileUpload(); Toast.makeText(mainActivity, R.string.cannot_open_file_chooser, Toast.LENGTH_LONG).show(); } return false; } @SuppressLint("SetJavaScriptEnabled") public void createNewWindow(WebView webView, Message resultMsg) { AppConfig appConfig = AppConfig.getInstance(mainActivity); if (appConfig.maxWindowsEnabled && appConfig.numWindows > 0 && mainActivity.getGNWindowManager().getWindowCount() >= appConfig.numWindows) { // All of these just to get new url WebView newWebView = new WebView(webView.getContext()); WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; transport.setWebView(newWebView); resultMsg.sendToTarget(); newWebView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { if (!mainActivity.onMaxWindowsReached(url)) { Intent intent = new Intent(mainActivity.getBaseContext(), MainActivity.class); intent.putExtra("isRoot", false); intent.putExtra("url", url); intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true); mainActivity.startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY); } } }); return; } createNewWindow(resultMsg, appConfig.maxWindowsEnabled); } private void createNewWindow(Message resultMsg, boolean maxWindowsEnabled) { ((GoNativeApplication) mainActivity.getApplication()).setWebviewMessage(resultMsg); Intent intent = new Intent(mainActivity.getBaseContext(), MainActivity.class); intent.putExtra("isRoot", false); intent.putExtra(MainActivity.EXTRA_WEBVIEW_WINDOW_OPEN, true); if (maxWindowsEnabled) { intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true); } // need to use startActivityForResult instead of startActivity because of singleTop launch mode mainActivity.startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY); } public boolean isLocationServiceEnabled() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { LocationManager lm = mainActivity.getSystemService(LocationManager.class); return lm.isLocationEnabled(); } else { // This is Deprecated in API 28 int mode = Settings.Secure.getInt(mainActivity.getContentResolver(), Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF); return (mode != Settings.Secure.LOCATION_MODE_OFF); } } protected void onDownloadStart() { startLoadTimeout.removeCallbacksAndMessages(null); state = WebviewLoadState.STATE_DONE; } private static class GetKeyTask extends AsyncTask> { private Activity activity; private ClientCertRequest request; public GetKeyTask(Activity activity, ClientCertRequest request) { this.activity = activity; this.request = request; } @Override protected Pair doInBackground(String... strings) { String alias = strings[0]; try { PrivateKey privateKey = KeyChain.getPrivateKey(activity, alias); X509Certificate[] certificates = KeyChain.getCertificateChain(activity, alias); return new Pair<>(privateKey, certificates); } catch (Exception e) { GNLog.getInstance().logError(TAG, "Error getting private key for alias " + alias, e); return null; } } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override protected void onPostExecute(Pair result) { if (result != null && result.first != null & result.second != null) { request.proceed(result.first, result.second); } else { request.ignore(); } } } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public void onReceivedClientCertRequest(String url, ClientCertRequest request) { Uri uri = Uri.parse(url); KeyChainAliasCallback callback = alias -> { if (alias == null) { request.ignore(); return; } new GetKeyTask(mainActivity, request).execute(alias); }; KeyChain.choosePrivateKeyAlias(mainActivity, callback, request.getKeyTypes(), request.getPrincipals(), request.getHost(), request.getPort(), null); } // Cancels scheduled display of offline page after timeout public void cancelLoadTimeout() { if (startLoadTimeout == null && state != WebviewLoadState.STATE_START_LOAD) return; startLoadTimeout.removeCallbacksAndMessages(null); showWebViewImmediately(); } } # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/UrlNavigation.java # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/bg_nav_icon.xml # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/bg_nav_icon.xml # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/ic_stat_onesignal_default.xml # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/ic_stat_onesignal_default.xml # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/shape_rounded.xml # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/shape_rounded.xml # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/actionbar_title.xml # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/actionbar_title.xml # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/activity_gonative.xml # End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/activity_gonative.xml # Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/button_menu.xml