From 3bb2849a88f278a780f42ad31baabba2adc6fa86 Mon Sep 17 00:00:00 2001 From: David Kramer Date: Mon, 18 Jun 2018 13:06:34 -0600 Subject: [PATCH 001/815] Sends broadcast on app open to notify addon termux receivers --- .../java/com/termux/app/TermuxActivity.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index d50ab4304e..9478ca7cf0 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -17,6 +17,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; @@ -104,6 +105,8 @@ public final class TermuxActivity extends Activity implements ServiceConnection private static final String RELOAD_STYLE_ACTION = "com.termux.app.reload_style"; + private static final String BROADCAST_TERMUX_OPENED = "com.termux.app.OPENED"; + /** The main view of the activity showing the terminal. Initialized in onCreate(). */ @SuppressWarnings("NullableProblems") @NonNull @@ -334,6 +337,26 @@ public boolean onLongClick(View v) { checkForFontAndColors(); mBellSoundId = mBellSoundPool.load(this, R.raw.bell, 1); + + sendOpenedBroadcast(); + } + + /** + * Send a broadcast notifying Termux app has been opened + */ + void sendOpenedBroadcast() { + Intent broadcast = new Intent(BROADCAST_TERMUX_OPENED); + List matches = getPackageManager().queryBroadcastReceivers(broadcast, 0); + + // send broadcast to registered Termux receivers + // this technique is needed to work around broadcast changes that Oreo introduced + for (ResolveInfo info : matches) { + Intent explicitBroadcast = new Intent(broadcast); + ComponentName cname = new ComponentName(info.activityInfo.applicationInfo.packageName, + info.activityInfo.name); + explicitBroadcast.setComponent(cname); + sendBroadcast(explicitBroadcast); + } } void toggleShowExtraKeys() { From 2659c06c5dbf5ad61c87227cff3d0707829c1ee0 Mon Sep 17 00:00:00 2001 From: Leonid Plyushch Date: Thu, 30 Apr 2020 14:34:35 +0300 Subject: [PATCH 002/815] Remove irrelevant message from bootstrap installation error Bootstraps are no longer downloaded from the Internet. --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1fffd6621c..42ac4af8ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,7 +13,7 @@ Installing… Unable to install - Termux was unable to install the bootstrap packages.\n\nCheck your network connection and try again. + Termux was unable to install the bootstrap packages. Abort Try again Termux can only be installed on the primary user account. From 6dca19ae0011f9514efa6a5380fb5a097149351c Mon Sep 17 00:00:00 2001 From: Frieder Bluemle Date: Wed, 13 May 2020 23:57:16 -0700 Subject: [PATCH 003/815] Update Android Gradle plugin to 3.6.3 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e7af5e78d4..bc822d6bcd 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.1' + classpath 'com.android.tools.build:gradle:3.6.3' } } From 7e13b8aa2e232f17b3962bf174408fb1bc18b5b8 Mon Sep 17 00:00:00 2001 From: Hannes Achleitner Date: Sun, 17 May 2020 13:04:31 +0200 Subject: [PATCH 004/815] Verify Gradle --- .github/workflows/gradle-wrapper-validation.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/workflows/gradle-wrapper-validation.yml diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml new file mode 100644 index 0000000000..f552c8dc65 --- /dev/null +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -0,0 +1,10 @@ +name: "Validate Gradle Wrapper" +on: [push] + +jobs: + validation: + name: "Validation" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: gradle/wrapper-validation-action@v1 From 38a3319ca26c73a29faa6ccb6dd8f906d628d2d2 Mon Sep 17 00:00:00 2001 From: Hannes Achleitner Date: Sun, 17 May 2020 13:37:08 +0200 Subject: [PATCH 005/815] show result in pull request --- .github/workflows/gradle-wrapper-validation.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml index f552c8dc65..13dca3db33 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -1,5 +1,12 @@ name: "Validate Gradle Wrapper" -on: [push] + +on: + push: + branches: + - master + pull_request: + branches: + - master jobs: validation: From c4c4912a7e65c5a16bd78b9caf0aa81dd86004aa Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Sun, 24 May 2020 01:22:33 +0200 Subject: [PATCH 006/815] Avoid specifying ndk version --- app/build.gradle | 1 - terminal-emulator/build.gradle | 1 - 2 files changed, 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a743e23c3f..01061c4f76 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,6 @@ plugins { android { compileSdkVersion 28 - ndkVersion '21.0.6113669' dependencies { implementation "androidx.annotation:annotation:1.1.0" diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index 19128a218b..dd6da0a300 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -18,7 +18,6 @@ ext { android { compileSdkVersion 28 - ndkVersion '21.0.6113669' defaultConfig { minSdkVersion 21 From c2843897ac7738b27b7423adc34e219d136bdf5d Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Sun, 24 May 2020 01:27:01 +0200 Subject: [PATCH 007/815] Fix build by specifying ndkVersion --- app/build.gradle | 1 + terminal-emulator/build.gradle | 1 + 2 files changed, 2 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 01061c4f76..17e9611704 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,7 @@ plugins { android { compileSdkVersion 28 + ndkVersion '21.1.6352462' dependencies { implementation "androidx.annotation:annotation:1.1.0" diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index dd6da0a300..b0baa946ad 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -18,6 +18,7 @@ ext { android { compileSdkVersion 28 + ndkVersion '21.1.6352462' defaultConfig { minSdkVersion 21 From d212198e307c9f41beffed11fe1230cc94767f76 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sun, 24 May 2020 02:44:06 +0300 Subject: [PATCH 008/815] update bootstraps --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 17e9611704..9c3c253b7b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 21 - downloadBootstrap("aarch64", "9d362f1396e3a7d6987f09b8c3886c5aad514ab195ec7874a32000dc3b9cecde", version) - downloadBootstrap("arm", "3c2f2ca9424fc984a4df54a3f9b38db3413b635ba39b89dfd8c753418730f719", version) - downloadBootstrap("i686", "87afbd0fe6ebdc3abd9f2e5bc6136dbbf49991e485c9e9b03c4fe0149543ed7d", version) - downloadBootstrap("x86_64", "bc91e5524d516cbe34b2ef082f6ebda1146457c8fa0373d06f7a1bb0c7be41df", version) + def version = 22 + downloadBootstrap("aarch64", "d00cd85b773202924e0256af25c521744fcfa845a1120ecffe685a4a0baf44d6", version) + downloadBootstrap("arm", "24e86450e68e4636853d6489c25c6204ffa1cd7f406310ba956e7b1942126226", version) + downloadBootstrap("i686", "bc564abdc8f370c04c67b2da719bf8fa4fe387634ef2e41faf14de615d8852f3", version) + downloadBootstrap("x86_64", "f2cc605ca2399d9a1f0e112f1c3ab964f1118668d66312b53a8d41cfd72fae0b", version) } } From b6d7831646bb0ea0223946fdac2f5943610e8118 Mon Sep 17 00:00:00 2001 From: hannesa2 Date: Sun, 24 May 2020 02:05:24 +0200 Subject: [PATCH 009/815] Fix CI build and see result in pull request (#1565) --- .github/workflows/debug_build.yml | 8 +++++++- .github/workflows/run_tests.yml | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/debug_build.yml b/.github/workflows/debug_build.yml index 52d06aa07a..47ba0edd86 100644 --- a/.github/workflows/debug_build.yml +++ b/.github/workflows/debug_build.yml @@ -1,6 +1,12 @@ name: Build -on: push +on: + push: + branches: + - master + pull_request: + branches: + - master jobs: build: diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 8d208c160e..87ccc68611 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -1,6 +1,12 @@ name: Unit tests -on: push +on: + push: + branches: + - master + pull_request: + branches: + - master jobs: testing: From f794bfcadc0fcacdac42d38eae63fb7713f4656f Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sat, 6 Jun 2020 21:20:05 +0300 Subject: [PATCH 010/815] Handle all exceptions when loading termux.properties (#1590) * Catch all exceptions which can occur. * Print short description in toast message about occurred exception. --- app/src/main/java/com/termux/app/TermuxPreferences.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index 1fbac2b70e..a8ffadb147 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -162,8 +162,8 @@ void reloadFromProperties(Context context) { props.load(new InputStreamReader(in, StandardCharsets.UTF_8)); } } - } catch (IOException e) { - Toast.makeText(context, "Could not open properties file termux.properties.", Toast.LENGTH_LONG).show(); + } catch (Exception e) { + Toast.makeText(context, "Could not open properties file termux.properties: " + e.getMessage(), Toast.LENGTH_LONG).show(); Log.e("termux", "Error loading props", e); } From 9f438e29124f173d9b5853128393f9f8df229fe5 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sat, 6 Jun 2020 22:42:19 +0300 Subject: [PATCH 011/815] update bootstraps --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9c3c253b7b..bee88350a2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 22 - downloadBootstrap("aarch64", "d00cd85b773202924e0256af25c521744fcfa845a1120ecffe685a4a0baf44d6", version) - downloadBootstrap("arm", "24e86450e68e4636853d6489c25c6204ffa1cd7f406310ba956e7b1942126226", version) - downloadBootstrap("i686", "bc564abdc8f370c04c67b2da719bf8fa4fe387634ef2e41faf14de615d8852f3", version) - downloadBootstrap("x86_64", "f2cc605ca2399d9a1f0e112f1c3ab964f1118668d66312b53a8d41cfd72fae0b", version) + def version = 23 + downloadBootstrap("aarch64", "e19a965e53aa0a8aac978d67b675720a27aaae0bc9ffe140c2fc022167be3e7a", version) + downloadBootstrap("arm", "a02ed2ddc4602859c3d244f23ac84092dd3f5d0d04a9f0c68957b10666db2374", version) + downloadBootstrap("i686", "77365a6f149797fef1df0e3a3f6eb643c12a45f8111443760557bad7c05f4d50", version) + downloadBootstrap("x86_64", "cbcc590a3fa48dbe7c88ef328feaab3ed3659860377c555276ffeeed25d983b2", version) } } From 58440bc88d16c48de4c6385dda39f7aa5c4bba8b Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sun, 7 Jun 2020 03:56:44 +0300 Subject: [PATCH 012/815] update bootstraps again Added few more packages to bootstraps which are replacements to some busybox applets. --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bee88350a2..066136d4c9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 23 - downloadBootstrap("aarch64", "e19a965e53aa0a8aac978d67b675720a27aaae0bc9ffe140c2fc022167be3e7a", version) - downloadBootstrap("arm", "a02ed2ddc4602859c3d244f23ac84092dd3f5d0d04a9f0c68957b10666db2374", version) - downloadBootstrap("i686", "77365a6f149797fef1df0e3a3f6eb643c12a45f8111443760557bad7c05f4d50", version) - downloadBootstrap("x86_64", "cbcc590a3fa48dbe7c88ef328feaab3ed3659860377c555276ffeeed25d983b2", version) + def version = 24 + downloadBootstrap("aarch64", "2027cc81124d3b7de46e88e5d6a3666e72515820f694c6817bc39ace262fc0a1", version) + downloadBootstrap("arm", "a1a95d0ed28341cb9020e082049807da9ae36fb844a03077d3f7cf08f0a89b05", version) + downloadBootstrap("i686", "b28e4c6da2182d50b70c981cef92dca438f644c7d4f07b9bf10f1fd396f42762", version) + downloadBootstrap("x86_64", "7c9e074a2b0bc655bdefb10312b40e95a8523e4478a3e8c67a9bef8b15cdd8c6", version) } } From f39f06a540169994e8e53218e188de35a26010c0 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sun, 7 Jun 2020 22:36:14 +0300 Subject: [PATCH 013/815] update bootstraps again * Reduced archive size by using nano as preinstalled text editor instead of vim. * Updated command-not-found and termux-tools. --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 066136d4c9..f6dd7480f7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 24 - downloadBootstrap("aarch64", "2027cc81124d3b7de46e88e5d6a3666e72515820f694c6817bc39ace262fc0a1", version) - downloadBootstrap("arm", "a1a95d0ed28341cb9020e082049807da9ae36fb844a03077d3f7cf08f0a89b05", version) - downloadBootstrap("i686", "b28e4c6da2182d50b70c981cef92dca438f644c7d4f07b9bf10f1fd396f42762", version) - downloadBootstrap("x86_64", "7c9e074a2b0bc655bdefb10312b40e95a8523e4478a3e8c67a9bef8b15cdd8c6", version) + def version = 25 + downloadBootstrap("aarch64", "633baa1f7edfd81f6064338a68d1149aa203d4b24cbc4f7c64283aaca109609e", version) + downloadBootstrap("arm", "a581a22e0d79a0e8cef9395b1bd951ba066ac2d688522e17cca0b3e1c0649daa", version) + downloadBootstrap("i686", "8288e13f0a6ddeb2ff9406d8f968a8930a58e9318d09fadb2b7c8970a034cfdc", version) + downloadBootstrap("x86_64", "c99b80a18d6bbb64c24c5a64d6ee6b8d4306729ebd172662b807bcb4a46dd39a", version) } } From b086270a5a72278b3cc1fe1c1917264f61cff07a Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Sat, 29 Feb 2020 07:29:24 +0100 Subject: [PATCH 014/815] Support auto detection of dark theme By default it uses the system setting. If use-black-ui is set to either true or false, that overrides it. Fixes #1351 properly, fixes #1354 --- .../java/com/termux/app/TermuxPreferences.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index a8ffadb147..a23924533d 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -2,6 +2,7 @@ import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Configuration; import android.preference.PreferenceManager; import android.util.Log; import android.util.TypedValue; @@ -58,7 +59,7 @@ final static class KeyboardShortcut { private static final String CURRENT_SESSION_KEY = "current_session"; private static final String SCREEN_ALWAYS_ON_KEY = "screen_always_on"; - private String mUseDarkUI; + private boolean mUseDarkUI; private boolean mScreenAlwaysOn; private int mFontSize; @@ -129,7 +130,7 @@ boolean isScreenAlwaysOn() { } boolean isUsingBlackUI() { - return mUseDarkUI.toLowerCase().equals("true"); + return mUseDarkUI; } void setScreenAlwaysOn(Context context, boolean newValue) { @@ -179,7 +180,17 @@ void reloadFromProperties(Context context) { break; } - mUseDarkUI = props.getProperty("use-black-ui", "false"); + switch (props.getProperty("use-black-ui", "").toLowerCase()) { + case "true": + mUseDarkUI = true; + break; + case "false": + mUseDarkUI = false; + break; + default: + int nightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + mUseDarkUI = nightMode == Configuration.UI_MODE_NIGHT_YES; + } try { JSONArray arr = new JSONArray(props.getProperty("extra-keys", "[['ESC', 'TAB', 'CTRL', 'ALT', '-', 'DOWN', 'UP']]")); From 35842cf4a626ae6d57aadf62a7ace937cb4d18d0 Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Tue, 9 Jun 2020 10:59:59 +0200 Subject: [PATCH 015/815] Set orientation of HandleView in show (#1477) * Place long press menu above selection Previously, the long press menu would cover the first line of the selection. * Flip selection handle at different positions depending on drag direction When the selection handle changes direction, the selection jumps to the new point of the handle. When the handle changes direction at the same place when you come from the left as from the right, that makes it impossible to select the characters which are at the position where it changes direction. With this change the handle remains pointing towards the edge further into the line when you drag it from the edge and against the center. * Set orientation of HandleView when showing it When you hold down on a word that starts or ends at the edge of the screen, the handle will appear outside of the screen. This happens because the orientation was only switched when the handle is dragged, so when it is shown it just used the same orientation as it had for the last selection. Relates to #334, but not sure if it fixes it completely. --- .../java/com/termux/view/TerminalView.java | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index cc3df20e31..702bd2a413 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -973,12 +973,12 @@ public boolean isShowing() { return mContainer.isShowing(); } - private void checkChangedOrientation() { - if (!mIsDragging) { + private void checkChangedOrientation(int posX, boolean force) { + if (!mIsDragging && !force) { return; } long millis = SystemClock.currentThreadTimeMillis(); - if (millis - mLastTime < 50) { + if (millis - mLastTime < 50 && !force) { return; } mLastTime = millis; @@ -1003,10 +1003,7 @@ private void checkChangedOrientation() { return; } - final int[] coords = mTempCoords; - hostView.getLocationInWindow(coords); - final int posX = coords[0] + mPointX; - if (posX < clip.left) { + if (posX - mHandleWidth < clip.left) { changeOrientation(RIGHT); } else if (posX + mHandleWidth > clip.right) { changeOrientation(LEFT); @@ -1050,13 +1047,14 @@ private boolean isPositionVisible() { posY >= clip.top && posY <= clip.bottom; } - private void moveTo(int x, int y) { - mPointX = x; + private void moveTo(int x, int y, boolean forceOrientationCheck) { + float oldHotspotX = mHotspotX; + checkChangedOrientation(x, forceOrientationCheck); + mPointX = (int) (x - (isShowing() ? oldHotspotX : mHotspotX)); mPointY = y; - checkChangedOrientation(); if (isPositionVisible()) { int[] coords = null; - if (mContainer.isShowing()) { + if (isShowing()) { coords = mTempCoords; TerminalView.this.getLocationInWindow(coords); int x1 = coords[0] + mPointX; @@ -1138,10 +1136,10 @@ public boolean isDragging() { return mIsDragging; } - void positionAtCursor(final int cx, final int cy) { - int left = (int) (getPointX(cx) - mHotspotX); + void positionAtCursor(final int cx, final int cy, boolean forceOrientationCheck) { + int left = getPointX(cx); int bottom = getPointY(cy + 1); - moveTo(left, bottom); + moveTo(left, bottom, forceOrientationCheck); } } @@ -1162,9 +1160,8 @@ private class SelectionModifierCursorController implements CursorController { public void show() { mIsShowing = true; - updatePosition(); - mStartHandle.show(); - mEndHandle.show(); + mStartHandle.positionAtCursor(mSelX1, mSelY1, true); + mEndHandle.positionAtCursor(mSelX2 + 1, mSelY2, true); final ActionMode.Callback callback = new ActionMode.Callback() { @Override @@ -1240,7 +1237,7 @@ public void onDestroyActionMode(ActionMode mode) { public void onGetContentRect(ActionMode mode, View view, Rect outRect) { int x1 = Math.round(mSelX1 * mRenderer.mFontWidth); int x2 = Math.round(mSelX2 * mRenderer.mFontWidth); - int y1 = Math.round((mSelY1 - mTopRow) * mRenderer.mFontLineSpacing); + int y1 = Math.round((mSelY1 - 1 - mTopRow) * mRenderer.mFontLineSpacing); int y2 = Math.round((mSelY2 + 1 - mTopRow) * mRenderer.mFontLineSpacing); @@ -1395,9 +1392,9 @@ public void updatePosition() { return; } - mStartHandle.positionAtCursor(mSelX1, mSelY1); + mStartHandle.positionAtCursor(mSelX1, mSelY1, false); - mEndHandle.positionAtCursor(mSelX2 + 1, mSelY2); //bug + mEndHandle.positionAtCursor(mSelX2 + 1, mSelY2, false); if (mActionMode != null) { mActionMode.invalidate(); From 669c336e2f8ab90affc5d2844aaea7a45c62d861 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 9 Jun 2020 12:02:41 +0300 Subject: [PATCH 016/815] update ndk version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f6dd7480f7..53fd0ef8a4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,7 @@ plugins { android { compileSdkVersion 28 - ndkVersion '21.1.6352462' + ndkVersion '21.2.6472646' dependencies { implementation "androidx.annotation:annotation:1.1.0" From 9c32935ca28662a90c3754a1d9c7f602b3b8efda Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 9 Jun 2020 12:08:13 +0300 Subject: [PATCH 017/815] fix ndk version for terminal-emulator module --- terminal-emulator/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index b0baa946ad..a69359dcfd 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -18,7 +18,7 @@ ext { android { compileSdkVersion 28 - ndkVersion '21.1.6352462' + ndkVersion '21.2.6472646' defaultConfig { minSdkVersion 21 From 4d9c0c315eb6029cdc99314ae1a34b3f5ee103b9 Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Sat, 29 Feb 2020 14:43:46 +0100 Subject: [PATCH 018/815] Update notification icon to match launcher icon This is the launcher icon with a circle around it. I added the circle because the icon has a transparent background, so it looks a bit weird with just the >_. --- .../res/drawable/ic_service_notification.xml | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/drawable/ic_service_notification.xml b/app/src/main/res/drawable/ic_service_notification.xml index 314054d999..0fe78b4cee 100644 --- a/app/src/main/res/drawable/ic_service_notification.xml +++ b/app/src/main/res/drawable/ic_service_notification.xml @@ -1,33 +1,40 @@ + android:height="108dp" + android:width="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> - - + + - - + + + From 0af823607ac5d6ff282c4eee175e4a533176196c Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Tue, 9 Jun 2020 11:17:07 +0200 Subject: [PATCH 019/815] Improvements to extra keys (#1479) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make popup keys for extra keys row configurable This makes the keys you get when swiping up on a key configurable. You can configure such a key by using an array of strings instead of a single string in the row. The first entry will be the normal key and the second will be the extra key. This is a slightly breaking change, as people that have configured custom extra keys with "-" or "/" will have to change the config to keep the popup keys. The default config will remain the same in terms of functionality, i.e. it includes the same popup key for "-". * Make popup keys interact well with long press keys This stops the repeat action when the popup is shown, and makes sure the popup is closed when you release even if there has been some repeat actions. * Support configuring the style of the extra keys This adds a setting for choosing between the different ways to render key names that were already present in ExtraKeysView. The available setting values are "arrows-only", "arrows-all", "all", "none" and "default". Other values will fallback to "default". Can be used as a workaround for #1410 * Support using modifier keys with letter keys in extra keys This allows you to use the modifier keys on the extra keys rows, e.g. ctrl, together with another button on the extra keys rows, as long as that button is a normal letter and not a special key. Support for special keys will come in the next commit. * Support using modifier keys with special keys in extra keys This allows you to use the modifier keys on the extra keys rows together with a special key on the extra keys rows, e.g. CTRL+LEFT. Fixes #745, fixes most of #895 and possibly #154 * Support mapping extra keys to other actions This adds a setting called extra-keys-map which allows you to map a key on the extra keys rows to another action. The value is a json object where the key is the button text as configured in extra-keys and the value is the action. Multiple actions can be used, but if they are special characters (like ESC or LEFT) they have to be separated from the other characters with a space on each side. If you want an actual space character, use SPACE. For example if you want to add a key to go to the next active channel in weechat, you can use this: extra-keys-map = {"weechat next": "ESC a"} And then add "weechat next" to extra-keys. The name can of course be whatever you want. Or if you want the button for the UP arrow to show ⇧ instead of ↑, you can use this: extra-keys-map = {"⇧": "UP"} And put "⇧" in extra-keys instead of "UP". Modifier keys (ctrl, alt and shift) can't be used in this map yet. Support for ctrl and alt will come in the next commit. I think this fixes #1186 * Support CTRL and ALT in extra keys map This allows you to use CTRL and ALT in extra-keys-map. For example if you want a button to exit the terminal, you can use this: extra-keys-map = {"exit": "CTRL d"} And add "exit" to extra-keys. * Support a KEYBOARD button in extra keys This toggles showing the keyboard input method. * Support specifying macro keys in the extra-keys option Instead of specifying macros in the separate extra-keys-map option by matching the key name in the two options, you can now use "macro" instead of "key" in extra-keys, and it will be a macro, i.e. a sequence of multiple keys separated by space. * Remove option extra-keys-map Now that you can specify macro in extra-keys, there is no point in having this separate option. Instead of specifying the value to display as key, and the macro to perform in extra-keys-map, you would now specify the value to display in the display property and the macro to perform in the macro property. * Lookup display text when creating ExtraKeyButton This will make it easier to support key aliases for macros in the next commit. * Add support for a key to open the drawer Fixes (I think) #1325 --- .../java/com/termux/app/ExtraKeysInfos.java | 338 ++++++++++++++++++ .../java/com/termux/app/ExtraKeysView.java | 283 +++++---------- .../java/com/termux/app/TermuxActivity.java | 6 +- .../com/termux/app/TermuxPreferences.java | 32 +- .../java/com/termux/view/TerminalView.java | 14 +- 5 files changed, 460 insertions(+), 213 deletions(-) create mode 100644 app/src/main/java/com/termux/app/ExtraKeysInfos.java diff --git a/app/src/main/java/com/termux/app/ExtraKeysInfos.java b/app/src/main/java/com/termux/app/ExtraKeysInfos.java new file mode 100644 index 0000000000..86d97449bc --- /dev/null +++ b/app/src/main/java/com/termux/app/ExtraKeysInfos.java @@ -0,0 +1,338 @@ +package com.termux.app; + +import androidx.annotation.Nullable; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +public class ExtraKeysInfos { + + /** + * Matrix of buttons displayed + */ + private ExtraKeyButton[][] buttons; + + /** + * This corresponds to one of the CharMapDisplay below + */ + private String style = "default"; + + public ExtraKeysInfos(String propertiesInfo, String style) throws JSONException { + this.style = style; + + // Convert String propertiesInfo to Array of Arrays + JSONArray arr = new JSONArray(propertiesInfo); + Object[][] matrix = new Object[arr.length()][]; + for (int i = 0; i < arr.length(); i++) { + JSONArray line = arr.getJSONArray(i); + matrix[i] = new Object[line.length()]; + for (int j = 0; j < line.length(); j++) { + matrix[i][j] = line.get(j); + } + } + + // convert matrix to buttons + this.buttons = new ExtraKeyButton[matrix.length][]; + for (int i = 0; i < matrix.length; i++) { + this.buttons[i] = new ExtraKeyButton[matrix[i].length]; + for (int j = 0; j < matrix[i].length; j++) { + Object key = matrix[i][j]; + + JSONObject jobject = normalizeKeyConfig(key); + + ExtraKeyButton button; + + if(! jobject.has("popup")) { + // no popup + button = new ExtraKeyButton(getSelectedCharMap(), jobject); + } else { + // a popup + JSONObject popupJobject = normalizeKeyConfig(jobject.get("popup")); + ExtraKeyButton popup = new ExtraKeyButton(getSelectedCharMap(), popupJobject); + button = new ExtraKeyButton(getSelectedCharMap(), jobject, popup); + } + + this.buttons[i][j] = button; + } + } + } + + /** + * "hello" -> {"key": "hello"} + */ + private static JSONObject normalizeKeyConfig(Object key) throws JSONException { + JSONObject jobject; + if(key instanceof String) { + jobject = new JSONObject(); + jobject.put("key", key); + } else if(key instanceof JSONObject) { + jobject = (JSONObject) key; + } else { + throw new JSONException("An key in the extra-key matrix must be a string or an object"); + } + return jobject; + } + + public ExtraKeyButton[][] getMatrix() { + return buttons; + } + + /** + * HashMap that implements Python dict.get(key, default) function. + * Default java.util .get(key) is then the same as .get(key, null); + */ + static class CleverMap extends HashMap { + V get(K key, V defaultValue) { + if(containsKey(key)) + return get(key); + else + return defaultValue; + } + } + + static class CharDisplayMap extends CleverMap {} + + /** + * Keys are displayed in a natural looking way, like "→" for "RIGHT" + */ + static final CharDisplayMap classicArrowsDisplay = new CharDisplayMap() {{ + // classic arrow keys (for ◀ ▶ ▲ ▼ @see arrowVariationDisplay) + put("LEFT", "←"); // U+2190 ← LEFTWARDS ARROW + put("RIGHT", "→"); // U+2192 → RIGHTWARDS ARROW + put("UP", "↑"); // U+2191 ↑ UPWARDS ARROW + put("DOWN", "↓"); // U+2193 ↓ DOWNWARDS ARROW + }}; + + static final CharDisplayMap wellKnownCharactersDisplay = new CharDisplayMap() {{ + // well known characters // https://en.wikipedia.org/wiki/{Enter_key, Tab_key, Delete_key} + put("ENTER", "↲"); // U+21B2 ↲ DOWNWARDS ARROW WITH TIP LEFTWARDS + put("TAB", "↹"); // U+21B9 ↹ LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR + put("BKSP", "⌫"); // U+232B ⌫ ERASE TO THE LEFT sometimes seen and easy to understand + put("DEL", "⌦"); // U+2326 ⌦ ERASE TO THE RIGHT not well known but easy to understand + put("DRAWER", "☰"); // U+2630 ☰ TRIGRAM FOR HEAVEN not well known but easy to understand + put("KEYBOARD", "⌨"); // U+2328 ⌨ KEYBOARD not well known but easy to understand + }}; + + static final CharDisplayMap lessKnownCharactersDisplay = new CharDisplayMap() {{ + // https://en.wikipedia.org/wiki/{Home_key, End_key, Page_Up_and_Page_Down_keys} + // home key can mean "goto the beginning of line" or "goto first page" depending on context, hence the diagonal + put("HOME", "⇱"); // from IEC 9995 // U+21F1 ⇱ NORTH WEST ARROW TO CORNER + put("END", "⇲"); // from IEC 9995 // ⇲ // U+21F2 ⇲ SOUTH EAST ARROW TO CORNER + put("PGUP", "⇑"); // no ISO character exists, U+21D1 ⇑ UPWARDS DOUBLE ARROW will do the trick + put("PGDN", "⇓"); // no ISO character exists, U+21D3 ⇓ DOWNWARDS DOUBLE ARROW will do the trick + }}; + + static final CharDisplayMap arrowTriangleVariationDisplay = new CharDisplayMap() {{ + // alternative to classic arrow keys + put("LEFT", "◀"); // U+25C0 ◀ BLACK LEFT-POINTING TRIANGLE + put("RIGHT", "▶"); // U+25B6 ▶ BLACK RIGHT-POINTING TRIANGLE + put("UP", "▲"); // U+25B2 ▲ BLACK UP-POINTING TRIANGLE + put("DOWN", "▼"); // U+25BC ▼ BLACK DOWN-POINTING TRIANGLE + }}; + + static final CharDisplayMap notKnownIsoCharacters = new CharDisplayMap() {{ + // Control chars that are more clear as text // https://en.wikipedia.org/wiki/{Function_key, Alt_key, Control_key, Esc_key} + // put("FN", "FN"); // no ISO character exists + put("CTRL", "⎈"); // ISO character "U+2388 ⎈ HELM SYMBOL" is unknown to people and never printed on computers, however "U+25C7 ◇ WHITE DIAMOND" is a nice presentation, and "^" for terminal app and mac is often used + put("ALT", "⎇"); // ISO character "U+2387 ⎇ ALTERNATIVE KEY SYMBOL'" is unknown to people and only printed as the Option key "⌥" on Mac computer + put("ESC", "⎋"); // ISO character "U+238B ⎋ BROKEN CIRCLE WITH NORTHWEST ARROW" is unknown to people and not often printed on computers + }}; + + static final CharDisplayMap nicerLookingDisplay = new CharDisplayMap() {{ + // nicer looking for most cases + put("-", "―"); // U+2015 ― HORIZONTAL BAR + }}; + + /** + * Multiple maps are available to quickly change + * the style of the keys. + */ + + /** + * Some classic symbols everybody knows + */ + private static final CharDisplayMap defaultCharDisplay = new CharDisplayMap() {{ + putAll(classicArrowsDisplay); + putAll(wellKnownCharactersDisplay); + putAll(nicerLookingDisplay); + // all other characters are displayed as themselves + }}; + + /** + * Classic symbols and less known symbols + */ + private static final CharDisplayMap lotsOfArrowsCharDisplay = new CharDisplayMap() {{ + putAll(classicArrowsDisplay); + putAll(wellKnownCharactersDisplay); + putAll(lessKnownCharactersDisplay); // NEW + putAll(nicerLookingDisplay); + }}; + + /** + * Only arrows + */ + private static final CharDisplayMap arrowsOnlyCharDisplay = new CharDisplayMap() {{ + putAll(classicArrowsDisplay); + // putAll(wellKnownCharactersDisplay); // REMOVED + // putAll(lessKnownCharactersDisplay); // REMOVED + putAll(nicerLookingDisplay); + }}; + + /** + * Full Iso + */ + private static final CharDisplayMap fullIsoCharDisplay = new CharDisplayMap() {{ + putAll(classicArrowsDisplay); + putAll(wellKnownCharactersDisplay); + putAll(lessKnownCharactersDisplay); // NEW + putAll(nicerLookingDisplay); + putAll(notKnownIsoCharacters); // NEW + }}; + + /** + * Some people might call our keys differently + */ + static private final CharDisplayMap controlCharsAliases = new CharDisplayMap() {{ + put("ESCAPE", "ESC"); + put("CONTROL", "CTRL"); + put("RETURN", "ENTER"); // Technically different keys, but most applications won't see the difference + put("FUNCTION", "FN"); + // no alias for ALT + + // Directions are sometimes written as first and last letter for brevety + put("LT", "LEFT"); + put("RT", "RIGHT"); + put("DN", "DOWN"); + // put("UP", "UP"); well, "UP" is already two letters + + put("PAGEUP", "PGUP"); + put("PAGE_UP", "PGUP"); + put("PAGE UP", "PGUP"); + put("PAGE-UP", "PGUP"); + + // no alias for HOME + // no alias for END + + put("PAGEDOWN", "PGDN"); + put("PAGE_DOWN", "PGDN"); + put("PAGE-DOWN", "PGDN"); + + put("DELETE", "DEL"); + put("BACKSPACE", "BKSP"); + + // easier for writing in termux.properties + put("BACKSLASH", "\\"); + put("QUOTE", "\""); + put("APOSTROPHE", "'"); + }}; + + CharDisplayMap getSelectedCharMap() { + switch (style) { + case "arrows-only": + return arrowsOnlyCharDisplay; + case "arrows-all": + return lotsOfArrowsCharDisplay; + case "all": + return fullIsoCharDisplay; + case "none": + return new CharDisplayMap(); + default: + return defaultCharDisplay; + } + } + + /** + * Applies the 'controlCharsAliases' mapping to all the strings in *buttons* + * Modifies the array, doesn't return a new one. + */ + public static String replaceAlias(String key) { + return controlCharsAliases.get(key, key); + } +} + +class ExtraKeyButton { + + /** + * The key that will be sent to the terminal, either a control character + * defined in ExtraKeysView.keyCodesForString (LEFT, RIGHT, PGUP...) or + * some text. + */ + private String key; + + /** + * If the key is a macro, i.e. a sequence of keys separated by space. + */ + private boolean macro; + + /** + * The text that will be shown on the button. + */ + private String display; + + /** + * The information of the popup (triggered by swipe up). + */ + @Nullable + private ExtraKeyButton popup = null; + + public ExtraKeyButton(ExtraKeysInfos.CharDisplayMap charDisplayMap, JSONObject config) throws JSONException { + this(charDisplayMap, config, null); + } + + public ExtraKeyButton(ExtraKeysInfos.CharDisplayMap charDisplayMap, JSONObject config, ExtraKeyButton popup) throws JSONException { + String keyFromConfig = config.optString("key", null); + String macroFromConfig = config.optString("macro", null); + String[] keys; + if (keyFromConfig != null && macroFromConfig != null) { + throw new JSONException("Both key and macro can't be set for the same key"); + } else if (keyFromConfig != null) { + keys = new String[]{keyFromConfig}; + this.macro = false; + } else if (macroFromConfig != null) { + keys = macroFromConfig.split(" "); + this.macro = true; + } else { + throw new JSONException("All keys have to specify either key or macro"); + } + + for (int i = 0; i < keys.length; i++) { + keys[i] = ExtraKeysInfos.replaceAlias(keys[i]); + } + + this.key = String.join(" ", keys); + + String displayFromConfig = config.optString("display", null); + if (displayFromConfig != null) { + this.display = displayFromConfig; + } else { + this.display = Arrays.stream(keys) + .map(key -> charDisplayMap.get(key, key)) + .collect(Collectors.joining(" ")); + } + + this.popup = popup; + } + + public String getKey() { + return key; + } + + public boolean isMacro() { + return macro; + } + + public String getDisplay() { + return display; + } + + @Nullable + public ExtraKeyButton getPopup() { + return popup; + } +} diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index e2f76dc3eb..018c33c6ff 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -1,5 +1,6 @@ package com.termux.app; +import android.annotation.SuppressLint; import android.content.Context; import android.os.Build; import android.provider.Settings; @@ -13,19 +14,22 @@ import java.util.HashMap; import java.util.Arrays; +import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.GridLayout; import android.widget.PopupWindow; import android.widget.ToggleButton; import com.termux.R; -import com.termux.terminal.TerminalSession; import com.termux.view.TerminalView; +import androidx.drawerlayout.widget.DrawerLayout; + /** * A view showing extra keys (such as Escape, Ctrl, Alt) not normally available on an Android soft * keyboard. @@ -40,26 +44,9 @@ public final class ExtraKeysView extends GridLayout { public ExtraKeysView(Context context, AttributeSet attrs) { super(context, attrs); } - - /** - * HashMap that implements Python dict.get(key, default) function. - * Default java.util .get(key) is then the same as .get(key, null); - */ - static class CleverMap extends HashMap { - V get(K key, V defaultValue) { - if(containsKey(key)) - return get(key); - else - return defaultValue; - } - } - - static class CharDisplayMap extends CleverMap {} - - /** - * Keys are displayed in a natural looking way, like "→" for "RIGHT" - */ + static final Map keyCodesForString = new HashMap() {{ + put("SPACE", KeyEvent.KEYCODE_SPACE); put("ESC", KeyEvent.KEYCODE_ESCAPE); put("TAB", KeyEvent.KEYCODE_TAB); put("HOME", KeyEvent.KEYCODE_MOVE_HOME); @@ -87,45 +74,79 @@ static class CharDisplayMap extends CleverMap {} put("F11", KeyEvent.KEYCODE_F11); put("F12", KeyEvent.KEYCODE_F12); }}; - - static void sendKey(View view, String keyName) { + + private void sendKey(View view, String keyName, boolean forceCtrlDown, boolean forceLeftAltDown) { TerminalView terminalView = view.findViewById(R.id.terminal_view); - if (keyCodesForString.containsKey(keyName)) { + if ("KEYBOARD".equals(keyName)) { + InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(0, 0); + } else if ("DRAWER".equals(keyName)) { + DrawerLayout drawer = view.findViewById(R.id.drawer_layout); + drawer.openDrawer(Gravity.LEFT); + } else if (keyCodesForString.containsKey(keyName)) { int keyCode = keyCodesForString.get(keyName); - terminalView.onKeyDown(keyCode, new KeyEvent(KeyEvent.ACTION_UP, keyCode)); - // view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keyCode)); + int metaState = 0; + if (forceCtrlDown) { + metaState |= KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON; + } + if (forceLeftAltDown) { + metaState |= KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON; + } + KeyEvent keyEvent = new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState); + terminalView.onKeyDown(keyCode, keyEvent); } else { // not a control char - TerminalSession session = terminalView.getCurrentSession(); - if (session != null && keyName.length() > 0) - session.write(keyName); + keyName.codePoints().forEach(codePoint -> { + terminalView.inputCodePoint(codePoint, forceCtrlDown, forceLeftAltDown); + }); + } + } + + private void sendKey(View view, ExtraKeyButton buttonInfo) { + if (buttonInfo.isMacro()) { + String[] keys = buttonInfo.getKey().split(" "); + boolean ctrlDown = false; + boolean altDown = false; + for (String key : keys) { + if ("CTRL".equals(key)) { + ctrlDown = true; + } else if ("ALT".equals(key)) { + altDown = true; + } else { + sendKey(view, key, ctrlDown, altDown); + ctrlDown = false; + altDown = false; + } + } + } else { + sendKey(view, buttonInfo.getKey(), false, false); } } - + public enum SpecialButton { CTRL, ALT, FN } - + private static class SpecialButtonState { boolean isOn = false; ToggleButton button = null; } - + private Map specialButtons = new HashMap() {{ put(SpecialButton.CTRL, new SpecialButtonState()); put(SpecialButton.ALT, new SpecialButtonState()); put(SpecialButton.FN, new SpecialButtonState()); }}; - + private ScheduledExecutorService scheduledExecutor; private PopupWindow popupWindow; private int longPressCount; - + public boolean readSpecialButton(SpecialButton name) { SpecialButtonState state = specialButtons.get(name); if (state == null) throw new RuntimeException("Must be a valid special button (see source)"); - + if (! state.isOn) return false; @@ -166,145 +187,21 @@ void popup(View view, String text) { popupWindow.setFocusable(false); popupWindow.showAsDropDown(view, 0, -2 * height); } - - static final CharDisplayMap classicArrowsDisplay = new CharDisplayMap() {{ - // classic arrow keys (for ◀ ▶ ▲ ▼ @see arrowVariationDisplay) - put("LEFT", "←"); // U+2190 ← LEFTWARDS ARROW - put("RIGHT", "→"); // U+2192 → RIGHTWARDS ARROW - put("UP", "↑"); // U+2191 ↑ UPWARDS ARROW - put("DOWN", "↓"); // U+2193 ↓ DOWNWARDS ARROW - }}; - - static final CharDisplayMap wellKnownCharactersDisplay = new CharDisplayMap() {{ - // well known characters // https://en.wikipedia.org/wiki/{Enter_key, Tab_key, Delete_key} - put("ENTER", "↲"); // U+21B2 ↲ DOWNWARDS ARROW WITH TIP LEFTWARDS - put("TAB", "↹"); // U+21B9 ↹ LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR - put("BKSP", "⌫"); // U+232B ⌫ ERASE TO THE LEFT sometimes seen and easy to understand - put("DEL", "⌦"); // U+2326 ⌦ ERASE TO THE RIGHT not well known but easy to understand - }}; - static final CharDisplayMap lessKnownCharactersDisplay = new CharDisplayMap() {{ - // https://en.wikipedia.org/wiki/{Home_key, End_key, Page_Up_and_Page_Down_keys} - // home key can mean "goto the beginning of line" or "goto first page" depending on context, hence the diagonal - put("HOME", "⇱"); // from IEC 9995 // U+21F1 ⇱ NORTH WEST ARROW TO CORNER - put("END", "⇲"); // from IEC 9995 // ⇲ // U+21F2 ⇲ SOUTH EAST ARROW TO CORNER - put("PGUP", "⇑"); // no ISO character exists, U+21D1 ⇑ UPWARDS DOUBLE ARROW will do the trick - put("PGDN", "⇓"); // no ISO character exists, U+21D3 ⇓ DOWNWARDS DOUBLE ARROW will do the trick - }}; - - static final CharDisplayMap arrowTriangleVariationDisplay = new CharDisplayMap() {{ - // alternative to classic arrow keys - put("LEFT", "◀"); // U+25C0 ◀ BLACK LEFT-POINTING TRIANGLE - put("RIGHT", "▶"); // U+25B6 ▶ BLACK RIGHT-POINTING TRIANGLE - put("UP", "▲"); // U+25B2 ▲ BLACK UP-POINTING TRIANGLE - put("DOWN", "▼"); // U+25BC ▼ BLACK DOWN-POINTING TRIANGLE - }}; - - static final CharDisplayMap notKnownIsoCharacters = new CharDisplayMap() {{ - // Control chars that are more clear as text // https://en.wikipedia.org/wiki/{Function_key, Alt_key, Control_key, Esc_key} - // put("FN", "FN"); // no ISO character exists - put("CTRL", "⎈"); // ISO character "U+2388 ⎈ HELM SYMBOL" is unknown to people and never printed on computers, however "U+25C7 ◇ WHITE DIAMOND" is a nice presentation, and "^" for terminal app and mac is often used - put("ALT", "⎇"); // ISO character "U+2387 ⎇ ALTERNATIVE KEY SYMBOL'" is unknown to people and only printed as the Option key "⌥" on Mac computer - put("ESC", "⎋"); // ISO character "U+238B ⎋ BROKEN CIRCLE WITH NORTHWEST ARROW" is unknown to people and not often printed on computers - }}; - - static final CharDisplayMap nicerLookingDisplay = new CharDisplayMap() {{ - // nicer looking for most cases - put("-", "―"); // U+2015 ― HORIZONTAL BAR - }}; - - /** - * Keys are displayed in a natural looking way, like "→" for "RIGHT" or "↲" for ENTER - */ - public static final CharDisplayMap defaultCharDisplay = new CharDisplayMap() {{ - putAll(classicArrowsDisplay); - putAll(wellKnownCharactersDisplay); - putAll(nicerLookingDisplay); - // all other characters are displayed as themselves - }}; - - public static final CharDisplayMap lotsOfArrowsCharDisplay = new CharDisplayMap() {{ - putAll(classicArrowsDisplay); - putAll(wellKnownCharactersDisplay); - putAll(lessKnownCharactersDisplay); // NEW - putAll(nicerLookingDisplay); - }}; - - public static final CharDisplayMap arrowsOnlyCharDisplay = new CharDisplayMap() {{ - putAll(classicArrowsDisplay); - // putAll(wellKnownCharactersDisplay); // REMOVED - // putAll(lessKnownCharactersDisplay); // REMOVED - putAll(nicerLookingDisplay); - }}; - - public static final CharDisplayMap fullIsoCharDisplay = new CharDisplayMap() {{ - putAll(classicArrowsDisplay); - putAll(wellKnownCharactersDisplay); - putAll(lessKnownCharactersDisplay); // NEW - putAll(nicerLookingDisplay); - putAll(notKnownIsoCharacters); // NEW - }}; - - /** - * Some people might call our keys differently - */ - static final CharDisplayMap controlCharsAliases = new CharDisplayMap() {{ - put("ESCAPE", "ESC"); - put("CONTROL", "CTRL"); - put("RETURN", "ENTER"); // Technically different keys, but most applications won't see the difference - put("FUNCTION", "FN"); - // no alias for ALT - - // Directions are sometimes written as first and last letter for brevety - put("LT", "LEFT"); - put("RT", "RIGHT"); - put("DN", "DOWN"); - // put("UP", "UP"); well, "UP" is already two letters - - put("PAGEUP", "PGUP"); - put("PAGE_UP", "PGUP"); - put("PAGE UP", "PGUP"); - put("PAGE-UP", "PGUP"); - - // no alias for HOME - // no alias for END - - put("PAGEDOWN", "PGDN"); - put("PAGE_DOWN", "PGDN"); - put("PAGE-DOWN", "PGDN"); - - put("DELETE", "DEL"); - put("BACKSPACE", "BKSP"); - - // easier for writing in termux.properties - put("BACKSLASH", "\\"); - put("QUOTE", "\""); - put("APOSTROPHE", "'"); - }}; - - /** - * Applies the 'controlCharsAliases' mapping to all the strings in *buttons* - * Modifies the array, doesn't return a new one. - */ - void replaceAliases(String[][] buttons) { - for(int i = 0; i < buttons.length; i++) - for(int j = 0; j < buttons[i].length; j++) - buttons[i][j] = controlCharsAliases.get(buttons[i][j], buttons[i][j]); - } - /** * General util function to compute the longest column length in a matrix. */ - static int maximumLength(String[][] matrix) { + static int maximumLength(Object[][] matrix) { int m = 0; - for (String[] aMatrix : matrix) m = Math.max(m, aMatrix.length); + for (Object[] row : matrix) + m = Math.max(m, row.length); return m; } - + /** * Reload the view given parameters in termux.properties * - * @param buttons matrix of String as defined in termux.properties extrakeys + * @param infos matrix as defined in termux.properties extrakeys * Can Contain The Strings CTRL ALT TAB FN ENTER LEFT RIGHT UP DOWN or normal strings * Some aliases are possible like RETURN for ENTER, LT for LEFT and more (@see controlCharsAliases for the whole list). * Any string of length > 1 in total Uppercase will print a warning @@ -316,36 +213,36 @@ static int maximumLength(String[][] matrix) { * "−" will input a "−" character * "-_-" will input the string "-_-" */ - void reload(String[][] buttons, CharDisplayMap charDisplayMap) { + @SuppressLint("ClickableViewAccessibility") + void reload(ExtraKeysInfos infos) { + if(infos == null) + return; + for(SpecialButtonState state : specialButtons.values()) state.button = null; - + removeAllViews(); - - replaceAliases(buttons); // modifies the array - final int rows = buttons.length; - final int cols = maximumLength(buttons); + ExtraKeyButton[][] buttons = infos.getMatrix(); - setRowCount(rows); - setColumnCount(cols); + setRowCount(buttons.length); + setColumnCount(maximumLength(buttons)); - for (int row = 0; row < rows; row++) { + for (int row = 0; row < buttons.length; row++) { for (int col = 0; col < buttons[row].length; col++) { - final String buttonText = buttons[row][col]; - + final ExtraKeyButton buttonInfo = buttons[row][col]; + Button button; - if(Arrays.asList("CTRL", "ALT", "FN").contains(buttonText)) { - SpecialButtonState state = specialButtons.get(SpecialButton.valueOf(buttonText)); // for valueOf: https://stackoverflow.com/a/604426/1980630 + if(Arrays.asList("CTRL", "ALT", "FN").contains(buttonInfo.getKey())) { + SpecialButtonState state = specialButtons.get(SpecialButton.valueOf(buttonInfo.getKey())); // for valueOf: https://stackoverflow.com/a/604426/1980630 state.isOn = true; button = state.button = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); button.setClickable(true); } else { button = new Button(getContext(), null, android.R.attr.buttonBarButtonStyle); } - - final String displayedText = charDisplayMap.get(buttonText, buttonText); - button.setText(displayedText); + + button.setText(buttonInfo.getDisplay()); button.setTextColor(TEXT_COLOR); button.setPadding(0, 0, 0, 0); @@ -365,12 +262,12 @@ void reload(String[][] buttons, CharDisplayMap charDisplayMap) { } View root = getRootView(); - if(Arrays.asList("CTRL", "ALT", "FN").contains(buttonText)) { + if (Arrays.asList("CTRL", "ALT", "FN").contains(buttonInfo.getKey())) { ToggleButton self = (ToggleButton) finalButton; self.setChecked(self.isChecked()); self.setTextColor(self.isChecked() ? INTERESTING_COLOR : TEXT_COLOR); } else { - sendKey(root, buttonText); + sendKey(root, buttonInfo); } }); @@ -380,22 +277,26 @@ void reload(String[][] buttons, CharDisplayMap charDisplayMap) { case MotionEvent.ACTION_DOWN: longPressCount = 0; v.setBackgroundColor(BUTTON_PRESSED_COLOR); - if (Arrays.asList("UP", "DOWN", "LEFT", "RIGHT").contains(buttonText)) { + if (Arrays.asList("UP", "DOWN", "LEFT", "RIGHT", "BKSP", "DEL").contains(buttonInfo.getKey())) { + // autorepeat scheduledExecutor = Executors.newSingleThreadScheduledExecutor(); scheduledExecutor.scheduleWithFixedDelay(() -> { longPressCount++; - sendKey(root, buttonText); + sendKey(root, buttonInfo); }, 400, 80, TimeUnit.MILLISECONDS); } return true; case MotionEvent.ACTION_MOVE: - // These two keys have a Move-Up button appearing - if (Arrays.asList("/", "-").contains(buttonText)) { + if (buttonInfo.getPopup() != null) { if (popupWindow == null && event.getY() < 0) { + if (scheduledExecutor != null) { + scheduledExecutor.shutdownNow(); + scheduledExecutor = null; + } v.setBackgroundColor(BUTTON_COLOR); - String text = "-".equals(buttonText) ? "|" : "\\"; - popup(v, text); + String extraButtonDisplayedText = buttonInfo.getPopup().getDisplay(); + popup(v, extraButtonDisplayedText); } if (popupWindow != null && event.getY() > 0) { v.setBackgroundColor(BUTTON_PRESSED_COLOR); @@ -418,12 +319,14 @@ void reload(String[][] buttons, CharDisplayMap charDisplayMap) { scheduledExecutor.shutdownNow(); scheduledExecutor = null; } - if (longPressCount == 0) { - if (popupWindow != null && Arrays.asList("/", "-").contains(buttonText)) { + if (longPressCount == 0 || popupWindow != null) { + if (popupWindow != null) { popupWindow.setContentView(null); popupWindow.dismiss(); popupWindow = null; - sendKey(root, "-".equals(buttonText) ? "|" : "\\"); + if (buttonInfo.getPopup() != null) { + sendKey(root, buttonInfo.getPopup()); + } } else { v.performClick(); } diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index ae61b30217..946d693a3b 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -148,7 +148,7 @@ public void onReceive(Context context, Intent intent) { mSettings.reloadFromProperties(TermuxActivity.this); if (mExtraKeysView != null) { - mExtraKeysView.reload(mSettings.mExtraKeys, ExtraKeysView.defaultCharDisplay); + mExtraKeysView.reload(mSettings.mExtraKeys); } } } @@ -229,7 +229,7 @@ public void onCreate(Bundle bundle) { ViewGroup.LayoutParams layoutParams = viewPager.getLayoutParams(); - layoutParams.height = layoutParams.height * mSettings.mExtraKeys.length; + layoutParams.height = layoutParams.height * (mSettings.mExtraKeys == null ? 0 : mSettings.mExtraKeys.getMatrix().length); viewPager.setLayoutParams(layoutParams); viewPager.setAdapter(new PagerAdapter() { @@ -250,7 +250,7 @@ public Object instantiateItem(@NonNull ViewGroup collection, int position) { View layout; if (position == 0) { layout = mExtraKeysView = (ExtraKeysView) inflater.inflate(R.layout.extra_keys_main, collection, false); - mExtraKeysView.reload(mSettings.mExtraKeys, ExtraKeysView.defaultCharDisplay); + mExtraKeysView.reload(mSettings.mExtraKeys); } else { layout = inflater.inflate(R.layout.extra_keys_right, collection, false); final EditText editText = layout.findViewById(R.id.text_input); diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index a23924533d..3703cd0956 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -10,6 +10,7 @@ import com.termux.terminal.TerminalSession; import org.json.JSONArray; import org.json.JSONException; +import org.json.JSONObject; import java.io.File; import java.io.FileInputStream; @@ -19,7 +20,10 @@ import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Properties; import androidx.annotation.IntDef; @@ -70,7 +74,7 @@ final static class KeyboardShortcut { boolean mDisableVolumeVirtualKeys; boolean mShowExtraKeys; - String[][] mExtraKeys; + ExtraKeysInfos mExtraKeys; final List shortcuts = new ArrayList<>(); @@ -150,7 +154,7 @@ static TerminalSession getCurrentSession(TermuxActivity context) { } return null; } - + void reloadFromProperties(Context context) { File propsFile = new File(TermuxService.HOME_PATH + "/.termux/termux.properties"); if (!propsFile.exists()) @@ -192,21 +196,23 @@ void reloadFromProperties(Context context) { mUseDarkUI = nightMode == Configuration.UI_MODE_NIGHT_YES; } + String defaultExtraKeys = "[[ESC, TAB, CTRL, ALT, {key: '-', popup: '|'}, DOWN, UP]]"; + try { - JSONArray arr = new JSONArray(props.getProperty("extra-keys", "[['ESC', 'TAB', 'CTRL', 'ALT', '-', 'DOWN', 'UP']]")); - - mExtraKeys = new String[arr.length()][]; - for (int i = 0; i < arr.length(); i++) { - JSONArray line = arr.getJSONArray(i); - mExtraKeys[i] = new String[line.length()]; - for (int j = 0; j < line.length(); j++) { - mExtraKeys[i][j] = line.getString(j); - } - } + String extrakeyProp = props.getProperty("extra-keys", defaultExtraKeys); + String extraKeysStyle = props.getProperty("extra-keys-style", "default"); + mExtraKeys = new ExtraKeysInfos(extrakeyProp, extraKeysStyle); } catch (JSONException e) { Toast.makeText(context, "Could not load the extra-keys property from the config: " + e.toString(), Toast.LENGTH_LONG).show(); Log.e("termux", "Error loading props", e); - mExtraKeys = new String[0][]; + + try { + mExtraKeys = new ExtraKeysInfos(defaultExtraKeys, "default"); + } catch (JSONException e2) { + e2.printStackTrace(); + Toast.makeText(context, "Can't create default extra keys", Toast.LENGTH_LONG).show(); + mExtraKeys = null; + } } mBackIsEscape = "escape".equals(props.getProperty("back-key", "back")); diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index 702bd2a413..76f6380ef8 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -558,13 +558,13 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { } final int metaState = event.getMetaState(); - final boolean controlDownFromEvent = event.isCtrlPressed(); - final boolean leftAltDownFromEvent = (metaState & KeyEvent.META_ALT_LEFT_ON) != 0; + final boolean controlDown = event.isCtrlPressed() || mClient.readControlKey(); + final boolean leftAltDown = (metaState & KeyEvent.META_ALT_LEFT_ON) != 0 || mClient.readAltKey(); final boolean rightAltDownFromEvent = (metaState & KeyEvent.META_ALT_RIGHT_ON) != 0; int keyMod = 0; - if (controlDownFromEvent) keyMod |= KeyHandler.KEYMOD_CTRL; - if (event.isAltPressed()) keyMod |= KeyHandler.KEYMOD_ALT; + if (controlDown) keyMod |= KeyHandler.KEYMOD_CTRL; + if (event.isAltPressed() || leftAltDown) keyMod |= KeyHandler.KEYMOD_ALT; if (event.isShiftPressed()) keyMod |= KeyHandler.KEYMOD_SHIFT; if (!event.isFunctionPressed() && handleKeyCode(keyCode, keyMod)) { if (LOG_KEY_EVENTS) Log.i(EmulatorDebug.LOG_TAG, "handleKeyCode() took key event"); @@ -592,7 +592,7 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { if ((result & KeyCharacterMap.COMBINING_ACCENT) != 0) { // If entered combining accent previously, write it out: if (mCombiningAccent != 0) - inputCodePoint(mCombiningAccent, controlDownFromEvent, leftAltDownFromEvent); + inputCodePoint(mCombiningAccent, controlDown, leftAltDown); mCombiningAccent = result & KeyCharacterMap.COMBINING_ACCENT_MASK; } else { if (mCombiningAccent != 0) { @@ -600,7 +600,7 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { if (combinedChar > 0) result = combinedChar; mCombiningAccent = 0; } - inputCodePoint(result, controlDownFromEvent, leftAltDownFromEvent); + inputCodePoint(result, controlDown, leftAltDown); } if (mCombiningAccent != oldCombiningAccent) invalidate(); @@ -608,7 +608,7 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { return true; } - void inputCodePoint(int codePoint, boolean controlDownFromEvent, boolean leftAltDownFromEvent) { + public void inputCodePoint(int codePoint, boolean controlDownFromEvent, boolean leftAltDownFromEvent) { if (LOG_KEY_EVENTS) { Log.i(EmulatorDebug.LOG_TAG, "inputCodePoint(codePoint=" + codePoint + ", controlDownFromEvent=" + controlDownFromEvent + ", leftAltDownFromEvent=" + leftAltDownFromEvent + ")"); From 3e04ea4cb038e15a7ed8575362d332497a6a5291 Mon Sep 17 00:00:00 2001 From: Josh Home Date: Wed, 1 Apr 2020 15:03:39 -0400 Subject: [PATCH 020/815] Add Log file to view intent #1497 --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1fbdab95a9..608d34b884 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -79,6 +79,7 @@ + From 5f71e3e73ae9c0381650a922f45a241fc75a463a Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Fri, 28 Feb 2020 22:26:17 +0100 Subject: [PATCH 021/815] Join lines that fills the width when selecting urls Some terminal applications, like mutt and weechat, prints a newline at the end of each line even if text is wrapped. This causes urls which are wrapped to not be selectable in full. By ignoring newlines when the text fills the entire width of the screen, those urls can be selected. Many other terminal emulators do this as well. A drawback of this is that if a url happens to fill the width of the screen, the url selection will include the first word of the next line, but this doesn't happen that often so I think it's an okay tradeoff. Fixes #313 --- app/src/main/java/com/termux/app/TermuxActivity.java | 2 +- .../main/java/com/termux/terminal/TerminalBuffer.java | 11 ++++++++++- .../java/com/termux/terminal/ScreenBufferTest.java | 8 ++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 946d693a3b..129895394b 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -757,7 +757,7 @@ static LinkedHashSet extractUrls(String text) { } void showUrlSelection() { - String text = getCurrentTermSession().getEmulator().getScreen().getTranscriptText(); + String text = getCurrentTermSession().getEmulator().getScreen().getTranscriptTextWithFullLinesJoined(); LinkedHashSet urlSet = extractUrls(text); if (urlSet.isEmpty()) { new AlertDialog.Builder(this).setMessage(R.string.select_url_no_found).show(); diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalBuffer.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalBuffer.java index 4e6add838f..1e3af9dee5 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalBuffer.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalBuffer.java @@ -45,11 +45,19 @@ public String getTranscriptTextWithoutJoinedLines() { return getSelectedText(0, -getActiveTranscriptRows(), mColumns, mScreenRows, false).trim(); } + public String getTranscriptTextWithFullLinesJoined() { + return getSelectedText(0, -getActiveTranscriptRows(), mColumns, mScreenRows, true, true).trim(); + } + public String getSelectedText(int selX1, int selY1, int selX2, int selY2) { return getSelectedText(selX1, selY1, selX2, selY2, true); } public String getSelectedText(int selX1, int selY1, int selX2, int selY2, boolean joinBackLines) { + return getSelectedText(selX1, selY1, selX2, selY2, true, false); + } + + public String getSelectedText(int selX1, int selY1, int selX2, int selY2, boolean joinBackLines, boolean joinFullLines) { final StringBuilder builder = new StringBuilder(); final int columns = mColumns; @@ -87,7 +95,8 @@ public String getSelectedText(int selX1, int selY1, int selX2, int selY2, boolea } if (lastPrintingCharIndex != -1) builder.append(line, x1Index, lastPrintingCharIndex - x1Index + 1); - if ((!joinBackLines || !rowLineWrap) + boolean lineFillsWidth = lastPrintingCharIndex == x2Index - 1; + if ((!joinBackLines || !rowLineWrap) && (!joinFullLines || !lineFillsWidth) && row < selY2 && row < mScreenRows - 1) builder.append('\n'); } return builder.toString(); diff --git a/terminal-emulator/src/test/java/com/termux/terminal/ScreenBufferTest.java b/terminal-emulator/src/test/java/com/termux/terminal/ScreenBufferTest.java index 08de2905c7..23942bf517 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/ScreenBufferTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/ScreenBufferTest.java @@ -37,4 +37,12 @@ public void testGetSelectedText() { withTerminalSized(5, 3).enterString("ABCDE\r\nFGHIJ").assertLinesAre("ABCDE", "FGHIJ", " "); assertEquals("ABCDE\nFG", mTerminal.getSelectedText(0, 0, 1, 1)); } + + public void testGetSelectedTextJoinFullLines() { + withTerminalSized(5, 3).enterString("ABCDE\r\nFG"); + assertEquals("ABCDEFG", mTerminal.getScreen().getSelectedText(0, 0, 1, 1, true, true)); + + withTerminalSized(5, 3).enterString("ABC\r\nFG"); + assertEquals("ABC\nFG", mTerminal.getScreen().getSelectedText(0, 0, 1, 1, true, true)); + } } From db3ff7b24a2cb8c84b00cc5cec083361018569a1 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 9 Jun 2020 15:32:22 +0300 Subject: [PATCH 022/815] Provide a service for executing commands by third-party applications Re-implementation of https://github.com/termux/termux-app/pull/1029. If Termux has property "allow-external-apps" set to "true", a third-party program will be able to send intents for executing custom commands within Termux environment. Third-party program must declare permission "com.termux.permission.RUN_COMMAND". --- app/src/main/AndroidManifest.xml | 15 ++++ .../main/java/com/termux/app/RunCommand.java | 88 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 3 files changed, 105 insertions(+) create mode 100644 app/src/main/java/com/termux/app/RunCommand.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 608d34b884..bb6ced2c89 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,12 @@ + + @@ -114,6 +120,15 @@ android:name="com.termux.app.TermuxService" android:exported="false" /> + + + + + + = Build.VERSION_CODES.O) { + this.startForegroundService(execIntent); + } else { + this.startService(execIntent); + } + } + + return Service.START_NOT_STICKY; + } + + private boolean allowExternalApps() { + File propsFile = new File(TermuxService.HOME_PATH + "/.termux/termux.properties"); + if (!propsFile.exists()) + propsFile = new File(TermuxService.HOME_PATH + "/.config/termux/termux.properties"); + + Properties props = new Properties(); + try { + if (propsFile.isFile() && propsFile.canRead()) { + try (FileInputStream in = new FileInputStream(propsFile)) { + props.load(new InputStreamReader(in, StandardCharsets.UTF_8)); + } + } + } catch (Exception e) { + Log.e("termux", "Error loading props", e); + } + + return props.getProperty("allow-external-apps", "false").equals("true"); + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 42ac4af8ae..d3a16a54ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,6 +2,8 @@ Termux Termux user + Run commands in Termux environment + Allow third-party applications to execute arbitrary commands within Termux environment. New session Failsafe Keyboard From 5b32540635d9243e573f2ef3ca126150424ab712 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 9 Jun 2020 15:48:56 +0300 Subject: [PATCH 023/815] minor refactoring: RunCommand => RunCommandService --- app/src/main/AndroidManifest.xml | 2 +- .../termux/app/{RunCommand.java => RunCommandService.java} | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename app/src/main/java/com/termux/app/{RunCommand.java => RunCommandService.java} (94%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bb6ced2c89..b293037649 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -121,7 +121,7 @@ android:exported="false" /> diff --git a/app/src/main/java/com/termux/app/RunCommand.java b/app/src/main/java/com/termux/app/RunCommandService.java similarity index 94% rename from app/src/main/java/com/termux/app/RunCommand.java rename to app/src/main/java/com/termux/app/RunCommandService.java index a7776190a2..d3a601f27d 100644 --- a/app/src/main/java/com/termux/app/RunCommand.java +++ b/app/src/main/java/com/termux/app/RunCommandService.java @@ -30,7 +30,7 @@ * Sample intent for launching program "top" in equivalent of ADB command: * am startservice -a com.termux.RUN_COMMAND --es com.termux.RUN_COMMAND_PATH /data/data/com.termux/files/usr/bin/top */ -public class RunCommand extends Service { +public class RunCommandService extends Service { public static final String RUN_COMMAND_ACTION = "com.termux.RUN_COMMAND"; public static final String RUN_COMMAND_PATH = "com.termux.RUN_COMMAND_PATH"; @@ -38,10 +38,10 @@ public class RunCommand extends Service { public static final String RUN_COMMAND_WORKDIR = "com.termux.RUN_COMMAND_WORKDIR"; class LocalBinder extends Binder { - public final RunCommand service = RunCommand.this; + public final RunCommandService service = RunCommandService.this; } - private final IBinder mBinder = new RunCommand.LocalBinder(); + private final IBinder mBinder = new RunCommandService.LocalBinder(); @Override public IBinder onBind(Intent intent) { From 2c5534e2c1fc90ee2cd35099b39151b45d6ebc52 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 9 Jun 2020 16:06:56 +0300 Subject: [PATCH 024/815] RunCommandService: update information about usage --- .../java/com/termux/app/RunCommandService.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/termux/app/RunCommandService.java b/app/src/main/java/com/termux/app/RunCommandService.java index d3a601f27d..42174657f1 100644 --- a/app/src/main/java/com/termux/app/RunCommandService.java +++ b/app/src/main/java/com/termux/app/RunCommandService.java @@ -18,17 +18,15 @@ * When allow-external-apps property is set to "true", Termux is able to process execute intents * sent by third-party applications. * - * Third-party program must declare com.termux.permission.RUN_COMMAND permission. + * Third-party program must declare com.termux.permission.RUN_COMMAND permission and it should be + * granted by user. * - * Intent expects following configuration: - * - * Action: com.termux.RUN_COMMAND - * Program/script path (string): com.termux.RUN_COMMAND_PATH - * Program/script arguments (string): com.termux.RUN_COMMAND_ARGUMENTS - * Session working directory (string): com.termux.RUN_COMMAND_WORKDIR - * - * Sample intent for launching program "top" in equivalent of ADB command: - * am startservice -a com.termux.RUN_COMMAND --es com.termux.RUN_COMMAND_PATH /data/data/com.termux/files/usr/bin/top + * Sample code to run command "top": + * Intent intent = new Intent(); + * intent.setClassName("com.termux", "com.termux.app.RunCommandService"); + * intent.setAction("com.termux.RUN_COMMAND"); + * intent.putExtra("com.termux.RUN_COMMAND_PATH", "/data/data/com.termux/files/usr/bin/top"); + * startService(intent); */ public class RunCommandService extends Service { From 72981fb9816fa39462f88c8bfc382ed3761f4e31 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 9 Jun 2020 21:47:11 +0300 Subject: [PATCH 025/815] Use vector drawables for text selection handle https://github.com/termux/termux-app/issues/1036 --- .../text_select_handle_left_mtrl_alpha.png | Bin 2032 -> 0 bytes .../text_select_handle_right_mtrl_alpha.png | Bin 15200 -> 0 bytes .../text_select_handle_left_material.xml | 14 ++++++++++---- .../text_select_handle_right_material.xml | 14 ++++++++++---- 4 files changed, 20 insertions(+), 8 deletions(-) delete mode 100644 terminal-view/src/main/res/drawable-xxhdpi/text_select_handle_left_mtrl_alpha.png delete mode 100644 terminal-view/src/main/res/drawable-xxhdpi/text_select_handle_right_mtrl_alpha.png diff --git a/terminal-view/src/main/res/drawable-xxhdpi/text_select_handle_left_mtrl_alpha.png b/terminal-view/src/main/res/drawable-xxhdpi/text_select_handle_left_mtrl_alpha.png deleted file mode 100644 index 39818db88613816bb4d17a85de435af254937567..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2032 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 PyaQ{ksJ0B68@K)!N!r*i diff --git a/terminal-view/src/main/res/drawable/text_select_handle_left_material.xml b/terminal-view/src/main/res/drawable/text_select_handle_left_material.xml index 89733d5df0..576ff4a968 100644 --- a/terminal-view/src/main/res/drawable/text_select_handle_left_material.xml +++ b/terminal-view/src/main/res/drawable/text_select_handle_left_material.xml @@ -1,4 +1,10 @@ - - + + + diff --git a/terminal-view/src/main/res/drawable/text_select_handle_right_material.xml b/terminal-view/src/main/res/drawable/text_select_handle_right_material.xml index 21a2cb87d4..d049d3a8a9 100644 --- a/terminal-view/src/main/res/drawable/text_select_handle_right_material.xml +++ b/terminal-view/src/main/res/drawable/text_select_handle_right_material.xml @@ -1,4 +1,10 @@ - - + + + From 6cf742460c1d99027ab5c8393a3665a919dc684e Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 9 Jun 2020 22:54:19 +0300 Subject: [PATCH 026/815] extra keys: make popup & pressed button no longer transparent Fixes visual issue when popup overlaps text of upper row. --- app/src/main/java/com/termux/app/ExtraKeysView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 018c33c6ff..b568703333 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -39,7 +39,7 @@ public final class ExtraKeysView extends GridLayout { private static final int TEXT_COLOR = 0xFFFFFFFF; private static final int BUTTON_COLOR = 0x00000000; private static final int INTERESTING_COLOR = 0xFF80DEEA; - private static final int BUTTON_PRESSED_COLOR = 0x7FFFFFFF; + private static final int BUTTON_PRESSED_COLOR = 0xFF7F7F7F; public ExtraKeysView(Context context, AttributeSet attrs) { super(context, attrs); From 664ec43f94d3e7f3227b216a65bbae80c889114a Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 9 Jun 2020 23:08:23 +0300 Subject: [PATCH 027/815] version 0.95 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 53fd0ef8a4..63278dc0d8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion 24 targetSdkVersion 28 - versionCode 94 - versionName "0.94" + versionCode 95 + versionName "0.95" externalNativeBuild { ndkBuild { From 2224d917a331b2e77dd299b9d02c87d8f4ab7610 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 17 Jun 2020 14:08:58 +0300 Subject: [PATCH 028/815] update ndk version --- app/build.gradle | 2 +- terminal-emulator/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 63278dc0d8..be59ac90ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,7 @@ plugins { android { compileSdkVersion 28 - ndkVersion '21.2.6472646' + ndkVersion '21.3.6528147' dependencies { implementation "androidx.annotation:annotation:1.1.0" diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index a69359dcfd..d54d185e86 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -18,7 +18,7 @@ ext { android { compileSdkVersion 28 - ndkVersion '21.2.6472646' + ndkVersion '21.3.6528147' defaultConfig { minSdkVersion 21 From 8d302aa9fe03ebb61fa729cc03336fd49fb0db68 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 19 Jun 2020 22:13:16 +0300 Subject: [PATCH 029/815] fix am on Android R --- app/src/main/java/com/termux/app/BackgroundJob.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/termux/app/BackgroundJob.java b/app/src/main/java/com/termux/app/BackgroundJob.java index 2b1888aa04..92735feefb 100644 --- a/app/src/main/java/com/termux/app/BackgroundJob.java +++ b/app/src/main/java/com/termux/app/BackgroundJob.java @@ -148,6 +148,8 @@ static String[] buildEnvironment(boolean failSafe, String cwd) { // Samsung S7 - see https://plus.google.com/110070148244138185604/posts/gp8Lk3aCGp3. environment.add("EXTERNAL_STORAGE=" + System.getenv("EXTERNAL_STORAGE")); // ANDROID_RUNTIME_ROOT and ANDROID_TZDATA_ROOT are required for `am` to run on Android Q + addToEnvIfPresent(environment, "ANDROID_ART_ROOT"); + addToEnvIfPresent(environment, "ANDROID_I18N_ROOT"); addToEnvIfPresent(environment, "ANDROID_RUNTIME_ROOT"); addToEnvIfPresent(environment, "ANDROID_TZDATA_ROOT"); if (failSafe) { From fc04a93990eae1ac8b78d216b853f753b93a7bcf Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 19 Jun 2020 22:15:57 +0300 Subject: [PATCH 030/815] get rid of Android 5 legacy stuff We don't need LD_LIBRARY_PATH as of Android 7.0. --- .../java/com/termux/app/BackgroundJob.java | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/termux/app/BackgroundJob.java b/app/src/main/java/com/termux/app/BackgroundJob.java index 92735feefb..0e16607ccf 100644 --- a/app/src/main/java/com/termux/app/BackgroundJob.java +++ b/app/src/main/java/com/termux/app/BackgroundJob.java @@ -147,18 +147,17 @@ static String[] buildEnvironment(boolean failSafe, String cwd) { // EXTERNAL_STORAGE is needed for /system/bin/am to work on at least // Samsung S7 - see https://plus.google.com/110070148244138185604/posts/gp8Lk3aCGp3. environment.add("EXTERNAL_STORAGE=" + System.getenv("EXTERNAL_STORAGE")); - // ANDROID_RUNTIME_ROOT and ANDROID_TZDATA_ROOT are required for `am` to run on Android Q + + // These variables are needed if running on Android 10 and higher. addToEnvIfPresent(environment, "ANDROID_ART_ROOT"); addToEnvIfPresent(environment, "ANDROID_I18N_ROOT"); addToEnvIfPresent(environment, "ANDROID_RUNTIME_ROOT"); addToEnvIfPresent(environment, "ANDROID_TZDATA_ROOT"); + if (failSafe) { // Keep the default path so that system binaries can be used in the failsafe session. environment.add("PATH= " + System.getenv("PATH")); } else { - if (shouldAddLdLibraryPath()) { - environment.add("LD_LIBRARY_PATH=" + TermuxService.PREFIX_PATH + "/lib"); - } environment.add("LANG=en_US.UTF-8"); environment.add("PATH=" + TermuxService.PREFIX_PATH + "/bin:" + TermuxService.PREFIX_PATH + "/bin/applets"); environment.add("PWD=" + cwd); @@ -168,20 +167,6 @@ static String[] buildEnvironment(boolean failSafe, String cwd) { return environment.toArray(new String[0]); } - private static boolean shouldAddLdLibraryPath() { - try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(TermuxService.PREFIX_PATH + "/etc/apt/sources.list")))) { - String line; - while ((line = in.readLine()) != null) { - if (!line.startsWith("#") && line.contains("//termux.net stable")) { - return true; - } - } - } catch (IOException e) { - Log.e(LOG_TAG, "Error trying to read sources.list", e); - } - return false; - } - public static int getPid(Process p) { try { Field f = p.getClass().getDeclaredField("pid"); From 33def928cf9bada2a6d44101f20ee4d8d4e71085 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 19 Jun 2020 22:25:22 +0300 Subject: [PATCH 031/815] add DEX2OATBOOTCLASSPATH environment variable --- app/src/main/java/com/termux/app/BackgroundJob.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/termux/app/BackgroundJob.java b/app/src/main/java/com/termux/app/BackgroundJob.java index 0e16607ccf..d4d7b3c8fd 100644 --- a/app/src/main/java/com/termux/app/BackgroundJob.java +++ b/app/src/main/java/com/termux/app/BackgroundJob.java @@ -150,6 +150,7 @@ static String[] buildEnvironment(boolean failSafe, String cwd) { // These variables are needed if running on Android 10 and higher. addToEnvIfPresent(environment, "ANDROID_ART_ROOT"); + addToEnvIfPresent(environment, "DEX2OATBOOTCLASSPATH"); addToEnvIfPresent(environment, "ANDROID_I18N_ROOT"); addToEnvIfPresent(environment, "ANDROID_RUNTIME_ROOT"); addToEnvIfPresent(environment, "ANDROID_TZDATA_ROOT"); From 930029b5d273cfeebbd095c27d0720b78a03fa89 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Mon, 22 Jun 2020 00:48:36 +0200 Subject: [PATCH 032/815] export COLORTERM=truecolor --- app/src/main/java/com/termux/app/BackgroundJob.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/termux/app/BackgroundJob.java b/app/src/main/java/com/termux/app/BackgroundJob.java index d4d7b3c8fd..657cce7df6 100644 --- a/app/src/main/java/com/termux/app/BackgroundJob.java +++ b/app/src/main/java/com/termux/app/BackgroundJob.java @@ -139,6 +139,7 @@ static String[] buildEnvironment(boolean failSafe, String cwd) { List environment = new ArrayList<>(); environment.add("TERM=xterm-256color"); + environment.add("COLORTERM=truecolor"); environment.add("HOME=" + TermuxService.HOME_PATH); environment.add("PREFIX=" + TermuxService.PREFIX_PATH); environment.add("BOOTCLASSPATH=" + System.getenv("BOOTCLASSPATH")); From f33ebf810f9fb62931c07eca8134335fcc92ed99 Mon Sep 17 00:00:00 2001 From: Danny Lin Date: Fri, 3 Jul 2020 21:08:36 -0700 Subject: [PATCH 033/815] Fix selection rendering with alternate cursor styles There is currently a bug where selection rendering is broken if the active cursor shape is anything other than the default solid box. Selected text is normally highlighted by effectively rendering a cursor over all of the characters in the selection region, but if the cursor is a bar, the resulting selection highlight is too narrow to cover the full width of the selection. Similarly, if the cursor is an underline, all of the selected text will be underlined instead of highlighted. To fix this issue, treat selections different from cursors in the rendering logic and force the renderer to always use the block cursor style for rendering selections. That way, we get correct behavior regardless of what the current cursor shape is. --- .../java/com/termux/view/TerminalRenderer.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalRenderer.java b/terminal-view/src/main/java/com/termux/view/TerminalRenderer.java index 8c12ad55d9..7a1824413c 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalRenderer.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalRenderer.java @@ -86,6 +86,7 @@ public final void render(TerminalEmulator mEmulator, Canvas canvas, int topRow, long lastRunStyle = 0; boolean lastRunInsideCursor = false; + boolean lastRunInsideSelection = false; int lastRunStartColumn = -1; int lastRunStartIndex = 0; boolean lastRunFontWidthMismatch = false; @@ -98,7 +99,8 @@ public final void render(TerminalEmulator mEmulator, Canvas canvas, int topRow, final int charsForCodePoint = charIsHighsurrogate ? 2 : 1; final int codePoint = charIsHighsurrogate ? Character.toCodePoint(charAtIndex, line[currentCharIndex + 1]) : charAtIndex; final int codePointWcWidth = WcWidth.width(codePoint); - final boolean insideCursor = (column >= selx1 && column <= selx2) || (cursorX == column || (codePointWcWidth == 2 && cursorX == column + 1)); + final boolean insideCursor = (cursorX == column || (codePointWcWidth == 2 && cursorX == column + 1)); + final boolean insideSelection = column >= selx1 && column <= selx2; final long style = lineObject.getStyle(column); // Check if the measured text width for this code point is not the same as that expected by wcwidth(). @@ -109,20 +111,22 @@ public final void render(TerminalEmulator mEmulator, Canvas canvas, int topRow, currentCharIndex, charsForCodePoint); final boolean fontWidthMismatch = Math.abs(measuredCodePointWidth / mFontWidth - codePointWcWidth) > 0.01; - if (style != lastRunStyle || insideCursor != lastRunInsideCursor || fontWidthMismatch || lastRunFontWidthMismatch) { + if (style != lastRunStyle || insideCursor != lastRunInsideCursor || insideSelection != lastRunInsideSelection || fontWidthMismatch || lastRunFontWidthMismatch) { if (column == 0) { // Skip first column as there is nothing to draw, just record the current style. } else { final int columnWidthSinceLastRun = column - lastRunStartColumn; final int charsSinceLastRun = currentCharIndex - lastRunStartIndex; - int cursorColor = lastRunInsideCursor ? mEmulator.mColors.mCurrentColors[TextStyle.COLOR_INDEX_CURSOR] : 0; + int cursorColor = (lastRunInsideCursor || lastRunInsideSelection) ? mEmulator.mColors.mCurrentColors[TextStyle.COLOR_INDEX_CURSOR] : 0; + int cursorStyle = lastRunInsideSelection ? TerminalEmulator.CURSOR_STYLE_BLOCK : cursorShape; drawTextRun(canvas, line, palette, heightOffset, lastRunStartColumn, columnWidthSinceLastRun, lastRunStartIndex, charsSinceLastRun, measuredWidthForRun, - cursorColor, cursorShape, lastRunStyle, reverseVideo); + cursorColor, cursorStyle, lastRunStyle, reverseVideo); } measuredWidthForRun = 0.f; lastRunStyle = style; lastRunInsideCursor = insideCursor; + lastRunInsideSelection = insideSelection; lastRunStartColumn = column; lastRunStartIndex = currentCharIndex; lastRunFontWidthMismatch = fontWidthMismatch; @@ -139,9 +143,10 @@ public final void render(TerminalEmulator mEmulator, Canvas canvas, int topRow, final int columnWidthSinceLastRun = columns - lastRunStartColumn; final int charsSinceLastRun = currentCharIndex - lastRunStartIndex; - int cursorColor = lastRunInsideCursor ? mEmulator.mColors.mCurrentColors[TextStyle.COLOR_INDEX_CURSOR] : 0; + int cursorColor = (lastRunInsideCursor || lastRunInsideSelection) ? mEmulator.mColors.mCurrentColors[TextStyle.COLOR_INDEX_CURSOR] : 0; + int cursorStyle = lastRunInsideSelection ? TerminalEmulator.CURSOR_STYLE_BLOCK : cursorShape; drawTextRun(canvas, line, palette, heightOffset, lastRunStartColumn, columnWidthSinceLastRun, lastRunStartIndex, charsSinceLastRun, - measuredWidthForRun, cursorColor, cursorShape, lastRunStyle, reverseVideo); + measuredWidthForRun, cursorColor, cursorStyle, lastRunStyle, reverseVideo); } } From 0910844896475418dc28ebfd2d3bae43528d5b26 Mon Sep 17 00:00:00 2001 From: Danny Lin Date: Sat, 4 Jul 2020 01:15:14 -0700 Subject: [PATCH 034/815] Invert selected text instead of highlighting Highlighting text in the terminal often makes it hard to read, which can be problematic for users who want to adjust or review selections before copying them. For example, the default theme makes white and green text hard to read on its light gray selection background, and there are plenty of other themes where the choice of text and cursor colors would hinder selection readability. To fix this issue and make selected text more legible in nearly all combinations of colors, invert selected text instead of highlighting it. This is more common among terminal emulators anyway: Invert: xterm, fbcon, kitty, Konsole, Alacritty, Tilix, gnome-terminal (7) Highlight: Termux, Terminal.app, iTerm2, Windows Terminal (4) --- .../main/java/com/termux/view/TerminalRenderer.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalRenderer.java b/terminal-view/src/main/java/com/termux/view/TerminalRenderer.java index 7a1824413c..92df53f895 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalRenderer.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalRenderer.java @@ -117,11 +117,10 @@ public final void render(TerminalEmulator mEmulator, Canvas canvas, int topRow, } else { final int columnWidthSinceLastRun = column - lastRunStartColumn; final int charsSinceLastRun = currentCharIndex - lastRunStartIndex; - int cursorColor = (lastRunInsideCursor || lastRunInsideSelection) ? mEmulator.mColors.mCurrentColors[TextStyle.COLOR_INDEX_CURSOR] : 0; - int cursorStyle = lastRunInsideSelection ? TerminalEmulator.CURSOR_STYLE_BLOCK : cursorShape; + int cursorColor = lastRunInsideCursor ? mEmulator.mColors.mCurrentColors[TextStyle.COLOR_INDEX_CURSOR] : 0; drawTextRun(canvas, line, palette, heightOffset, lastRunStartColumn, columnWidthSinceLastRun, lastRunStartIndex, charsSinceLastRun, measuredWidthForRun, - cursorColor, cursorStyle, lastRunStyle, reverseVideo); + cursorColor, cursorShape, lastRunStyle, reverseVideo || lastRunInsideSelection); } measuredWidthForRun = 0.f; lastRunStyle = style; @@ -143,10 +142,9 @@ public final void render(TerminalEmulator mEmulator, Canvas canvas, int topRow, final int columnWidthSinceLastRun = columns - lastRunStartColumn; final int charsSinceLastRun = currentCharIndex - lastRunStartIndex; - int cursorColor = (lastRunInsideCursor || lastRunInsideSelection) ? mEmulator.mColors.mCurrentColors[TextStyle.COLOR_INDEX_CURSOR] : 0; - int cursorStyle = lastRunInsideSelection ? TerminalEmulator.CURSOR_STYLE_BLOCK : cursorShape; + int cursorColor = lastRunInsideCursor ? mEmulator.mColors.mCurrentColors[TextStyle.COLOR_INDEX_CURSOR] : 0; drawTextRun(canvas, line, palette, heightOffset, lastRunStartColumn, columnWidthSinceLastRun, lastRunStartIndex, charsSinceLastRun, - measuredWidthForRun, cursorColor, cursorStyle, lastRunStyle, reverseVideo); + measuredWidthForRun, cursorColor, cursorShape, lastRunStyle, reverseVideo || lastRunInsideSelection); } } From 51370799c765d1774abac61a6f2eedf09156d211 Mon Sep 17 00:00:00 2001 From: Egor Zhdanov Date: Tue, 14 Jul 2020 13:03:17 +0700 Subject: [PATCH 035/815] update notification icon --- .../res/drawable/ic_service_notification.xml | 48 +++++++------------ 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/drawable/ic_service_notification.xml b/app/src/main/res/drawable/ic_service_notification.xml index 0fe78b4cee..205dcfc0c3 100644 --- a/app/src/main/res/drawable/ic_service_notification.xml +++ b/app/src/main/res/drawable/ic_service_notification.xml @@ -1,40 +1,24 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> - - + + - - + - + + From 9e7029b76ad63091a5920fbec0d08fe94c1f5785 Mon Sep 17 00:00:00 2001 From: Agnostic Apollo Date: Thu, 30 Jul 2020 22:42:52 +0500 Subject: [PATCH 036/815] Receive "RUN_COMMAND_ARGUMENTS" extra for "RUN_COMMAND_ACTION" intent as a string array extra instead of a string extra since TermuxService expects it that way. Added "RUN_COMMAND_BACKGROUND" boolean extra so that Termux session can be started in background when running a command. Updated usage docs. Check #1029 for details. --- .../com/termux/app/RunCommandService.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/termux/app/RunCommandService.java b/app/src/main/java/com/termux/app/RunCommandService.java index 42174657f1..2a57864d89 100644 --- a/app/src/main/java/com/termux/app/RunCommandService.java +++ b/app/src/main/java/com/termux/app/RunCommandService.java @@ -15,18 +15,32 @@ import java.util.Properties; /** - * When allow-external-apps property is set to "true", Termux is able to process execute intents - * sent by third-party applications. + * When allow-external-apps property is set to "true" in ~/.termux/termux.properties, Termux + * is able to process execute intents sent by third-party applications. * * Third-party program must declare com.termux.permission.RUN_COMMAND permission and it should be * granted by user. + * Full path of command or script must be given in "RUN_COMMAND_PATH" extra. + * The "RUN_COMMAND_ARGUMENTS", "RUN_COMMAND_WORKDIR" and "RUN_COMMAND_BACKGROUND" extras are + * optional. The background mode defaults to false. * - * Sample code to run command "top": + * Sample code to run command "top" with java: * Intent intent = new Intent(); * intent.setClassName("com.termux", "com.termux.app.RunCommandService"); * intent.setAction("com.termux.RUN_COMMAND"); * intent.putExtra("com.termux.RUN_COMMAND_PATH", "/data/data/com.termux/files/usr/bin/top"); + * intent.putExtra("com.termux.RUN_COMMAND_ARGUMENTS", new String[]{"-n", "5"}); + * intent.putExtra("com.termux.RUN_COMMAND_WORKDIR", "/data/data/com.termux/files/home"); + * intent.putExtra("com.termux.RUN_COMMAND_BACKGROUND", false); * startService(intent); + * + * Sample code to run command "top" with "am startservice" command: + * am startservice --user 0 -n com.termux/com.termux.app.RunCommandService + * -a com.termux.RUN_COMMAND + * --es com.termux.RUN_COMMAND_PATH '/data/data/com.termux/files/usr/bin/top' + * --esa com.termux.RUN_COMMAND_ARGUMENTS '-n,5' + * --es com.termux.RUN_COMMAND_WORKDIR '/data/data/com.termux/files/home' + * --ez com.termux.RUN_COMMAND_BACKGROUND 'false' */ public class RunCommandService extends Service { @@ -34,6 +48,7 @@ public class RunCommandService extends Service { public static final String RUN_COMMAND_PATH = "com.termux.RUN_COMMAND_PATH"; public static final String RUN_COMMAND_ARGUMENTS = "com.termux.RUN_COMMAND_ARGUMENTS"; public static final String RUN_COMMAND_WORKDIR = "com.termux.RUN_COMMAND_WORKDIR"; + public static final String RUN_COMMAND_BACKGROUND = "com.termux.RUN_COMMAND_BACKGROUND"; class LocalBinder extends Binder { public final RunCommandService service = RunCommandService.this; @@ -52,8 +67,9 @@ public int onStartCommand(Intent intent, int flags, int startId) { Intent execIntent = new Intent(TermuxService.ACTION_EXECUTE, programUri); execIntent.setClass(this, TermuxService.class); - execIntent.putExtra(TermuxService.EXTRA_ARGUMENTS, intent.getStringExtra(RUN_COMMAND_ARGUMENTS)); + execIntent.putExtra(TermuxService.EXTRA_ARGUMENTS, intent.getStringArrayExtra(RUN_COMMAND_ARGUMENTS)); execIntent.putExtra(TermuxService.EXTRA_CURRENT_WORKING_DIRECTORY, intent.getStringExtra(RUN_COMMAND_WORKDIR)); + execIntent.putExtra(TermuxService.EXTRA_EXECUTE_IN_BACKGROUND, intent.getBooleanExtra(RUN_COMMAND_BACKGROUND, false)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { this.startForegroundService(execIntent); From b2ff0e4051867959de6d615a66df12aa700468d6 Mon Sep 17 00:00:00 2001 From: Agnostic Apollo Date: Thu, 30 Jul 2020 23:01:08 +0500 Subject: [PATCH 037/815] Changed static string "EXTRA_EXECUTE_IN_BACKGROUND" access to public --- app/src/main/java/com/termux/app/TermuxService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/TermuxService.java b/app/src/main/java/com/termux/app/TermuxService.java index bbaf87c548..514910b3bf 100644 --- a/app/src/main/java/com/termux/app/TermuxService.java +++ b/app/src/main/java/com/termux/app/TermuxService.java @@ -63,7 +63,7 @@ public final class TermuxService extends Service implements SessionChangedCallba public static final String EXTRA_ARGUMENTS = "com.termux.execute.arguments"; public static final String EXTRA_CURRENT_WORKING_DIRECTORY = "com.termux.execute.cwd"; - private static final String EXTRA_EXECUTE_IN_BACKGROUND = "com.termux.execute.background"; + public static final String EXTRA_EXECUTE_IN_BACKGROUND = "com.termux.execute.background"; /** This service is only bound from inside the same process and never uses IPC. */ class LocalBinder extends Binder { From debbe4480945ec9db59ea9fdec88abfbf479e29c Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Thu, 30 Jul 2020 23:47:26 +0300 Subject: [PATCH 038/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index be59ac90ae..7704727b2a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 25 - downloadBootstrap("aarch64", "633baa1f7edfd81f6064338a68d1149aa203d4b24cbc4f7c64283aaca109609e", version) - downloadBootstrap("arm", "a581a22e0d79a0e8cef9395b1bd951ba066ac2d688522e17cca0b3e1c0649daa", version) - downloadBootstrap("i686", "8288e13f0a6ddeb2ff9406d8f968a8930a58e9318d09fadb2b7c8970a034cfdc", version) - downloadBootstrap("x86_64", "c99b80a18d6bbb64c24c5a64d6ee6b8d4306729ebd172662b807bcb4a46dd39a", version) + def version = 26 + downloadBootstrap("aarch64", "c7830de73aa437933aef1957bdea29640afa34ca292fd7e27a6bdd1c9271bfe3", version) + downloadBootstrap("arm", "d6c250d853ef235da6f64ee946018cfaca1ca5a416d2ce0bdd82d97c35972bc5", version) + downloadBootstrap("i686", "d1b272e022a6bbee9d6bff024f1e42d26c58d0d3dfe64ca68846b94b40db352d", version) + downloadBootstrap("x86_64", "866793074541aa1ead0927affc8f1b5279a2cf9d683688a8379e6090754e077e", version) } } From 6f24628fd221d8aeeddc125d686d27a23894865d Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Thu, 30 Jul 2020 23:56:27 +0300 Subject: [PATCH 039/815] version 0.96 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7704727b2a..d0781f5ead 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion 24 targetSdkVersion 28 - versionCode 95 - versionName "0.95" + versionCode 96 + versionName "0.96" externalNativeBuild { ndkBuild { From 04268f4c20e4fb87b8c5c0bd44dd5111979635d0 Mon Sep 17 00:00:00 2001 From: cn Date: Tue, 4 Aug 2020 20:36:14 +0800 Subject: [PATCH 040/815] move sdk version configs to gradle.properties (#1685) --- app/build.gradle | 8 ++++---- gradle.properties | 5 +++++ terminal-emulator/build.gradle | 8 ++++---- terminal-view/build.gradle | 6 +++--- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d0781f5ead..1570764573 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,8 +3,8 @@ plugins { } android { - compileSdkVersion 28 - ndkVersion '21.3.6528147' + compileSdkVersion project.properties.compileSdkVersion.toInteger() + ndkVersion project.properties.ndkVersion dependencies { implementation "androidx.annotation:annotation:1.1.0" @@ -15,8 +15,8 @@ android { defaultConfig { applicationId "com.termux" - minSdkVersion 24 - targetSdkVersion 28 + minSdkVersion project.properties.minSdkVersion.toInteger() + targetSdkVersion project.properties.targetSdkVersion.toInteger() versionCode 96 versionName "0.96" diff --git a/gradle.properties b/gradle.properties index e9645a397d..945ab5d248 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,3 +14,8 @@ # org.gradle.parallel=true org.gradle.jvmargs=-Xmx2048M android.useAndroidX=true + +minSdkVersion=24 +targetSdkVersion=28 +ndkVersion=21.3.6528147 +compileSdkVersion=28 diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index d54d185e86..4b37b79226 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -17,12 +17,12 @@ ext { } android { - compileSdkVersion 28 - ndkVersion '21.3.6528147' + compileSdkVersion project.properties.compileSdkVersion.toInteger() + ndkVersion project.properties.ndkVersion defaultConfig { - minSdkVersion 21 - targetSdkVersion 28 + minSdkVersion project.properties.minSdkVersion.toInteger() + targetSdkVersion project.properties.targetSdkVersion.toInteger() externalNativeBuild { ndkBuild { diff --git a/terminal-view/build.gradle b/terminal-view/build.gradle index 3aad164402..6c672ddbdd 100644 --- a/terminal-view/build.gradle +++ b/terminal-view/build.gradle @@ -17,7 +17,7 @@ ext { } android { - compileSdkVersion 28 + compileSdkVersion project.properties.compileSdkVersion.toInteger() dependencies { implementation "androidx.annotation:annotation:1.1.0" @@ -25,8 +25,8 @@ android { } defaultConfig { - minSdkVersion 21 - targetSdkVersion 28 + minSdkVersion project.properties.minSdkVersion.toInteger() + targetSdkVersion project.properties.targetSdkVersion.toInteger() testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } From 507527336234adb9146aad40a3d5160f71ea2c91 Mon Sep 17 00:00:00 2001 From: hannesa2 Date: Tue, 4 Aug 2020 14:36:41 +0200 Subject: [PATCH 041/815] Android Studio 4.0.1 (#1687) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bc822d6bcd..d803478dbb 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' + classpath 'com.android.tools.build:gradle:4.0.1' } } From b68bd107c11f24c70c702bd989844a68a20a8a6c Mon Sep 17 00:00:00 2001 From: hannesa2 Date: Tue, 4 Aug 2020 14:37:18 +0200 Subject: [PATCH 042/815] Gradle 6.5.1 (#1686) --- gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 ++ gradlew.bat | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f3d88b1c2faf2fc91d853cd5d4242b5547257070..62d4c053550b91381bbd28b1afc82d634bf73a8a 100644 GIT binary patch delta 12524 zcmY*pqN z|ERss*;ReIR@Lg&r_R7IT-GRDbpR4NMKNcwFgy&*A|eco1PnBHRth?SBneiw6$UT&^LVJ0?Naa`KfV(>F!Ez}~S z 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 delta 12163 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a2bf1313b8..bb8b2fc26b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7d95..fbd7c51583 100755 --- a/gradlew +++ b/gradlew @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index 9109989e3c..a9f778a7a9 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -84,6 +84,7 @@ set CMD_LINE_ARGS=%* set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% From bd7ed289811a570601cdfa4e3998996856df37d9 Mon Sep 17 00:00:00 2001 From: lucy phipps Date: Fri, 7 Aug 2020 06:57:39 +0100 Subject: [PATCH 043/815] update WcWidth.java, add note about c version --- .../java/com/termux/terminal/WcWidth.java | 671 ++++++++++-------- 1 file changed, 364 insertions(+), 307 deletions(-) diff --git a/terminal-emulator/src/main/java/com/termux/terminal/WcWidth.java b/terminal-emulator/src/main/java/com/termux/terminal/WcWidth.java index 35410e3e98..25660b30e8 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/WcWidth.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/WcWidth.java @@ -4,212 +4,225 @@ * Implementation of wcwidth(3) for Unicode 9. * * Implementation from https://github.com/jquast/wcwidth but we return 0 for unprintable characters. + * + * IMPORTANT: + * Must be kept in sync with the following: + * https://github.com/termux/wcwidth + * https://github.com/termux/libandroid-support + * https://github.com/termux/termux-packages/tree/master/libandroid-support */ public final class WcWidth { // From https://github.com/jquast/wcwidth/blob/master/wcwidth/table_zero.py - // t commit 0d7de112202cc8b2ebe9232ff4a5c954f19d561a (2016-07-02): + // at commit b29897e5a1b403a0e36f7fc991614981cbc42475 (2020-07-14): private static final int[][] ZERO_WIDTH = { - {0x0300, 0x036f}, // Combining Grave Accent ..Combining Latin Small Le - {0x0483, 0x0489}, // Combining Cyrillic Titlo..Combining Cyrillic Milli - {0x0591, 0x05bd}, // Hebrew Accent Etnahta ..Hebrew Point Meteg - {0x05bf, 0x05bf}, // Hebrew Point Rafe ..Hebrew Point Rafe - {0x05c1, 0x05c2}, // Hebrew Point Shin Dot ..Hebrew Point Sin Dot - {0x05c4, 0x05c5}, // Hebrew Mark Upper Dot ..Hebrew Mark Lower Dot - {0x05c7, 0x05c7}, // Hebrew Point Qamats Qata..Hebrew Point Qamats Qata - {0x0610, 0x061a}, // Arabic Sign Sallallahou ..Arabic Small Kasra - {0x064b, 0x065f}, // Arabic Fathatan ..Arabic Wavy Hamza Below - {0x0670, 0x0670}, // Arabic Letter Superscrip..Arabic Letter Superscrip - {0x06d6, 0x06dc}, // Arabic Small High Ligatu..Arabic Small High Seen - {0x06df, 0x06e4}, // Arabic Small High Rounde..Arabic Small High Madda - {0x06e7, 0x06e8}, // Arabic Small High Yeh ..Arabic Small High Noon - {0x06ea, 0x06ed}, // Arabic Empty Centre Low ..Arabic Small Low Meem - {0x0711, 0x0711}, // Syriac Letter Superscrip..Syriac Letter Superscrip - {0x0730, 0x074a}, // Syriac Pthaha Above ..Syriac Barrekh - {0x07a6, 0x07b0}, // Thaana Abafili ..Thaana Sukun - {0x07eb, 0x07f3}, // Nko Combining Sh||t High..Nko Combining Double Dot - {0x0816, 0x0819}, // Samaritan Mark In ..Samaritan Mark Dagesh - {0x081b, 0x0823}, // Samaritan Mark Epentheti..Samaritan Vowel Sign A - {0x0825, 0x0827}, // Samaritan Vowel Sign Sho..Samaritan Vowel Sign U - {0x0829, 0x082d}, // Samaritan Vowel Sign Lon..Samaritan Mark Nequdaa - {0x0859, 0x085b}, // Mandaic Affrication Mark..Mandaic Gemination Mark - {0x08d4, 0x08e1}, // (nil) .. - {0x08e3, 0x0902}, // Arabic Turned Damma Belo..Devanagari Sign Anusvara - {0x093a, 0x093a}, // Devanagari Vowel Sign Oe..Devanagari Vowel Sign Oe - {0x093c, 0x093c}, // Devanagari Sign Nukta ..Devanagari Sign Nukta - {0x0941, 0x0948}, // Devanagari Vowel Sign U ..Devanagari Vowel Sign Ai - {0x094d, 0x094d}, // Devanagari Sign Virama ..Devanagari Sign Virama - {0x0951, 0x0957}, // Devanagari Stress Sign U..Devanagari Vowel Sign Uu - {0x0962, 0x0963}, // Devanagari Vowel Sign Vo..Devanagari Vowel Sign Vo - {0x0981, 0x0981}, // Bengali Sign Candrabindu..Bengali Sign Candrabindu - {0x09bc, 0x09bc}, // Bengali Sign Nukta ..Bengali Sign Nukta - {0x09c1, 0x09c4}, // Bengali Vowel Sign U ..Bengali Vowel Sign Vocal - {0x09cd, 0x09cd}, // Bengali Sign Virama ..Bengali Sign Virama - {0x09e2, 0x09e3}, // Bengali Vowel Sign Vocal..Bengali Vowel Sign Vocal - {0x0a01, 0x0a02}, // Gurmukhi Sign Adak Bindi..Gurmukhi Sign Bindi - {0x0a3c, 0x0a3c}, // Gurmukhi Sign Nukta ..Gurmukhi Sign Nukta - {0x0a41, 0x0a42}, // Gurmukhi Vowel Sign U ..Gurmukhi Vowel Sign Uu - {0x0a47, 0x0a48}, // Gurmukhi Vowel Sign Ee ..Gurmukhi Vowel Sign Ai - {0x0a4b, 0x0a4d}, // Gurmukhi Vowel Sign Oo ..Gurmukhi Sign Virama - {0x0a51, 0x0a51}, // Gurmukhi Sign Udaat ..Gurmukhi Sign Udaat - {0x0a70, 0x0a71}, // Gurmukhi Tippi ..Gurmukhi Addak - {0x0a75, 0x0a75}, // Gurmukhi Sign Yakash ..Gurmukhi Sign Yakash - {0x0a81, 0x0a82}, // Gujarati Sign Candrabind..Gujarati Sign Anusvara - {0x0abc, 0x0abc}, // Gujarati Sign Nukta ..Gujarati Sign Nukta - {0x0ac1, 0x0ac5}, // Gujarati Vowel Sign U ..Gujarati Vowel Sign Cand - {0x0ac7, 0x0ac8}, // Gujarati Vowel Sign E ..Gujarati Vowel Sign Ai - {0x0acd, 0x0acd}, // Gujarati Sign Virama ..Gujarati Sign Virama - {0x0ae2, 0x0ae3}, // Gujarati Vowel Sign Voca..Gujarati Vowel Sign Voca - {0x0b01, 0x0b01}, // ||iya Sign Candrabindu ..||iya Sign Candrabindu - {0x0b3c, 0x0b3c}, // ||iya Sign Nukta ..||iya Sign Nukta - {0x0b3f, 0x0b3f}, // ||iya Vowel Sign I ..||iya Vowel Sign I - {0x0b41, 0x0b44}, // ||iya Vowel Sign U ..||iya Vowel Sign Vocalic - {0x0b4d, 0x0b4d}, // ||iya Sign Virama ..||iya Sign Virama - {0x0b56, 0x0b56}, // ||iya Ai Length Mark ..||iya Ai Length Mark - {0x0b62, 0x0b63}, // ||iya Vowel Sign Vocalic..||iya Vowel Sign Vocalic - {0x0b82, 0x0b82}, // Tamil Sign Anusvara ..Tamil Sign Anusvara - {0x0bc0, 0x0bc0}, // Tamil Vowel Sign Ii ..Tamil Vowel Sign Ii - {0x0bcd, 0x0bcd}, // Tamil Sign Virama ..Tamil Sign Virama - {0x0c00, 0x0c00}, // Telugu Sign Combining Ca..Telugu Sign Combining Ca - {0x0c3e, 0x0c40}, // Telugu Vowel Sign Aa ..Telugu Vowel Sign Ii - {0x0c46, 0x0c48}, // Telugu Vowel Sign E ..Telugu Vowel Sign Ai - {0x0c4a, 0x0c4d}, // Telugu Vowel Sign O ..Telugu Sign Virama - {0x0c55, 0x0c56}, // Telugu Length Mark ..Telugu Ai Length Mark - {0x0c62, 0x0c63}, // Telugu Vowel Sign Vocali..Telugu Vowel Sign Vocali - {0x0c81, 0x0c81}, // Kannada Sign Candrabindu..Kannada Sign Candrabindu - {0x0cbc, 0x0cbc}, // Kannada Sign Nukta ..Kannada Sign Nukta - {0x0cbf, 0x0cbf}, // Kannada Vowel Sign I ..Kannada Vowel Sign I - {0x0cc6, 0x0cc6}, // Kannada Vowel Sign E ..Kannada Vowel Sign E - {0x0ccc, 0x0ccd}, // Kannada Vowel Sign Au ..Kannada Sign Virama - {0x0ce2, 0x0ce3}, // Kannada Vowel Sign Vocal..Kannada Vowel Sign Vocal - {0x0d01, 0x0d01}, // Malayalam Sign Candrabin..Malayalam Sign Candrabin - {0x0d41, 0x0d44}, // Malayalam Vowel Sign U ..Malayalam Vowel Sign Voc - {0x0d4d, 0x0d4d}, // Malayalam Sign Virama ..Malayalam Sign Virama - {0x0d62, 0x0d63}, // Malayalam Vowel Sign Voc..Malayalam Vowel Sign Voc - {0x0dca, 0x0dca}, // Sinhala Sign Al-lakuna ..Sinhala Sign Al-lakuna - {0x0dd2, 0x0dd4}, // Sinhala Vowel Sign Ketti..Sinhala Vowel Sign Ketti - {0x0dd6, 0x0dd6}, // Sinhala Vowel Sign Diga ..Sinhala Vowel Sign Diga - {0x0e31, 0x0e31}, // Thai Character Mai Han-a..Thai Character Mai Han-a - {0x0e34, 0x0e3a}, // Thai Character Sara I ..Thai Character Phinthu - {0x0e47, 0x0e4e}, // Thai Character Maitaikhu..Thai Character Yamakkan - {0x0eb1, 0x0eb1}, // Lao Vowel Sign Mai Kan ..Lao Vowel Sign Mai Kan - {0x0eb4, 0x0eb9}, // Lao Vowel Sign I ..Lao Vowel Sign Uu - {0x0ebb, 0x0ebc}, // Lao Vowel Sign Mai Kon ..Lao Semivowel Sign Lo - {0x0ec8, 0x0ecd}, // Lao Tone Mai Ek ..Lao Niggahita - {0x0f18, 0x0f19}, // Tibetan Astrological Sig..Tibetan Astrological Sig - {0x0f35, 0x0f35}, // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung - {0x0f37, 0x0f37}, // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung - {0x0f39, 0x0f39}, // Tibetan Mark Tsa -phru ..Tibetan Mark Tsa -phru - {0x0f71, 0x0f7e}, // Tibetan Vowel Sign Aa ..Tibetan Sign Rjes Su Nga - {0x0f80, 0x0f84}, // Tibetan Vowel Sign Rever..Tibetan Mark Halanta - {0x0f86, 0x0f87}, // Tibetan Sign Lci Rtags ..Tibetan Sign Yang Rtags - {0x0f8d, 0x0f97}, // Tibetan Subjoined Sign L..Tibetan Subjoined Letter - {0x0f99, 0x0fbc}, // Tibetan Subjoined Letter..Tibetan Subjoined Letter - {0x0fc6, 0x0fc6}, // Tibetan Symbol Padma Gda..Tibetan Symbol Padma Gda - {0x102d, 0x1030}, // Myanmar Vowel Sign I ..Myanmar Vowel Sign Uu - {0x1032, 0x1037}, // Myanmar Vowel Sign Ai ..Myanmar Sign Dot Below - {0x1039, 0x103a}, // Myanmar Sign Virama ..Myanmar Sign Asat - {0x103d, 0x103e}, // Myanmar Consonant Sign M..Myanmar Consonant Sign M - {0x1058, 0x1059}, // Myanmar Vowel Sign Vocal..Myanmar Vowel Sign Vocal - {0x105e, 0x1060}, // Myanmar Consonant Sign M..Myanmar Consonant Sign M - {0x1071, 0x1074}, // Myanmar Vowel Sign Geba ..Myanmar Vowel Sign Kayah - {0x1082, 0x1082}, // Myanmar Consonant Sign S..Myanmar Consonant Sign S - {0x1085, 0x1086}, // Myanmar Vowel Sign Shan ..Myanmar Vowel Sign Shan - {0x108d, 0x108d}, // Myanmar Sign Shan Counci..Myanmar Sign Shan Counci - {0x109d, 0x109d}, // Myanmar Vowel Sign Aiton..Myanmar Vowel Sign Aiton - {0x135d, 0x135f}, // Ethiopic Combining Gemin..Ethiopic Combining Gemin - {0x1712, 0x1714}, // Tagalog Vowel Sign I ..Tagalog Sign Virama - {0x1732, 0x1734}, // Hanunoo Vowel Sign I ..Hanunoo Sign Pamudpod - {0x1752, 0x1753}, // Buhid Vowel Sign I ..Buhid Vowel Sign U - {0x1772, 0x1773}, // Tagbanwa Vowel Sign I ..Tagbanwa Vowel Sign U - {0x17b4, 0x17b5}, // Khmer Vowel Inherent Aq ..Khmer Vowel Inherent Aa - {0x17b7, 0x17bd}, // Khmer Vowel Sign I ..Khmer Vowel Sign Ua - {0x17c6, 0x17c6}, // Khmer Sign Nikahit ..Khmer Sign Nikahit - {0x17c9, 0x17d3}, // Khmer Sign Muusikatoan ..Khmer Sign Bathamasat - {0x17dd, 0x17dd}, // Khmer Sign Atthacan ..Khmer Sign Atthacan - {0x180b, 0x180d}, // Mongolian Free Variation..Mongolian Free Variation - {0x1885, 0x1886}, // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal - {0x18a9, 0x18a9}, // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal - {0x1920, 0x1922}, // Limbu Vowel Sign A ..Limbu Vowel Sign U - {0x1927, 0x1928}, // Limbu Vowel Sign E ..Limbu Vowel Sign O - {0x1932, 0x1932}, // Limbu Small Letter Anusv..Limbu Small Letter Anusv - {0x1939, 0x193b}, // Limbu Sign Mukphreng ..Limbu Sign Sa-i - {0x1a17, 0x1a18}, // Buginese Vowel Sign I ..Buginese Vowel Sign U - {0x1a1b, 0x1a1b}, // Buginese Vowel Sign Ae ..Buginese Vowel Sign Ae - {0x1a56, 0x1a56}, // Tai Tham Consonant Sign ..Tai Tham Consonant Sign - {0x1a58, 0x1a5e}, // Tai Tham Sign Mai Kang L..Tai Tham Consonant Sign - {0x1a60, 0x1a60}, // Tai Tham Sign Sakot ..Tai Tham Sign Sakot - {0x1a62, 0x1a62}, // Tai Tham Vowel Sign Mai ..Tai Tham Vowel Sign Mai - {0x1a65, 0x1a6c}, // Tai Tham Vowel Sign I ..Tai Tham Vowel Sign Oa B - {0x1a73, 0x1a7c}, // Tai Tham Vowel Sign Oa A..Tai Tham Sign Khuen-lue - {0x1a7f, 0x1a7f}, // Tai Tham Combining Crypt..Tai Tham Combining Crypt - {0x1ab0, 0x1abe}, // Combining Doubled Circum..Combining Parentheses Ov - {0x1b00, 0x1b03}, // Balinese Sign Ulu Ricem ..Balinese Sign Surang - {0x1b34, 0x1b34}, // Balinese Sign Rerekan ..Balinese Sign Rerekan - {0x1b36, 0x1b3a}, // Balinese Vowel Sign Ulu ..Balinese Vowel Sign Ra R - {0x1b3c, 0x1b3c}, // Balinese Vowel Sign La L..Balinese Vowel Sign La L - {0x1b42, 0x1b42}, // Balinese Vowel Sign Pepe..Balinese Vowel Sign Pepe - {0x1b6b, 0x1b73}, // Balinese Musical Symbol ..Balinese Musical Symbol - {0x1b80, 0x1b81}, // Sundanese Sign Panyecek ..Sundanese Sign Panglayar - {0x1ba2, 0x1ba5}, // Sundanese Consonant Sign..Sundanese Vowel Sign Pan - {0x1ba8, 0x1ba9}, // Sundanese Vowel Sign Pam..Sundanese Vowel Sign Pan - {0x1bab, 0x1bad}, // Sundanese Sign Virama ..Sundanese Consonant Sign - {0x1be6, 0x1be6}, // Batak Sign Tompi ..Batak Sign Tompi - {0x1be8, 0x1be9}, // Batak Vowel Sign Pakpak ..Batak Vowel Sign Ee - {0x1bed, 0x1bed}, // Batak Vowel Sign Karo O ..Batak Vowel Sign Karo O - {0x1bef, 0x1bf1}, // Batak Vowel Sign U F|| S..Batak Consonant Sign H - {0x1c2c, 0x1c33}, // Lepcha Vowel Sign E ..Lepcha Consonant Sign T - {0x1c36, 0x1c37}, // Lepcha Sign Ran ..Lepcha Sign Nukta - {0x1cd0, 0x1cd2}, // Vedic Tone Karshana ..Vedic Tone Prenkha - {0x1cd4, 0x1ce0}, // Vedic Sign Yajurvedic Mi..Vedic Tone Rigvedic Kash - {0x1ce2, 0x1ce8}, // Vedic Sign Visarga Svari..Vedic Sign Visarga Anuda - {0x1ced, 0x1ced}, // Vedic Sign Tiryak ..Vedic Sign Tiryak - {0x1cf4, 0x1cf4}, // Vedic Tone Candra Above ..Vedic Tone Candra Above - {0x1cf8, 0x1cf9}, // Vedic Tone Ring Above ..Vedic Tone Double Ring A - {0x1dc0, 0x1df5}, // Combining Dotted Grave A..Combining Up Tack Above - {0x1dfb, 0x1dff}, // (nil) ..Combining Right Arrowhea - {0x20d0, 0x20f0}, // Combining Left Harpoon A..Combining Asterisk Above - {0x2cef, 0x2cf1}, // Coptic Combining Ni Abov..Coptic Combining Spiritu - {0x2d7f, 0x2d7f}, // Tifinagh Consonant Joine..Tifinagh Consonant Joine - {0x2de0, 0x2dff}, // Combining Cyrillic Lette..Combining Cyrillic Lette - {0x302a, 0x302d}, // Ideographic Level Tone M..Ideographic Entering Ton - {0x3099, 0x309a}, // Combining Katakana-hirag..Combining Katakana-hirag - {0xa66f, 0xa672}, // Combining Cyrillic Vzmet..Combining Cyrillic Thous - {0xa674, 0xa67d}, // Combining Cyrillic Lette..Combining Cyrillic Payer - {0xa69e, 0xa69f}, // Combining Cyrillic Lette..Combining Cyrillic Lette - {0xa6f0, 0xa6f1}, // Bamum Combining Mark Koq..Bamum Combining Mark Tuk - {0xa802, 0xa802}, // Syloti Nagri Sign Dvisva..Syloti Nagri Sign Dvisva - {0xa806, 0xa806}, // Syloti Nagri Sign Hasant..Syloti Nagri Sign Hasant - {0xa80b, 0xa80b}, // Syloti Nagri Sign Anusva..Syloti Nagri Sign Anusva - {0xa825, 0xa826}, // Syloti Nagri Vowel Sign ..Syloti Nagri Vowel Sign - {0xa8c4, 0xa8c5}, // Saurashtra Sign Virama .. - {0xa8e0, 0xa8f1}, // Combining Devanagari Dig..Combining Devanagari Sig - {0xa926, 0xa92d}, // Kayah Li Vowel Ue ..Kayah Li Tone Calya Plop - {0xa947, 0xa951}, // Rejang Vowel Sign I ..Rejang Consonant Sign R - {0xa980, 0xa982}, // Javanese Sign Panyangga ..Javanese Sign Layar - {0xa9b3, 0xa9b3}, // Javanese Sign Cecak Telu..Javanese Sign Cecak Telu - {0xa9b6, 0xa9b9}, // Javanese Vowel Sign Wulu..Javanese Vowel Sign Suku - {0xa9bc, 0xa9bc}, // Javanese Vowel Sign Pepe..Javanese Vowel Sign Pepe - {0xa9e5, 0xa9e5}, // Myanmar Sign Shan Saw ..Myanmar Sign Shan Saw - {0xaa29, 0xaa2e}, // Cham Vowel Sign Aa ..Cham Vowel Sign Oe - {0xaa31, 0xaa32}, // Cham Vowel Sign Au ..Cham Vowel Sign Ue - {0xaa35, 0xaa36}, // Cham Consonant Sign La ..Cham Consonant Sign Wa - {0xaa43, 0xaa43}, // Cham Consonant Sign Fina..Cham Consonant Sign Fina - {0xaa4c, 0xaa4c}, // Cham Consonant Sign Fina..Cham Consonant Sign Fina - {0xaa7c, 0xaa7c}, // Myanmar Sign Tai Laing T..Myanmar Sign Tai Laing T - {0xaab0, 0xaab0}, // Tai Viet Mai Kang ..Tai Viet Mai Kang - {0xaab2, 0xaab4}, // Tai Viet Vowel I ..Tai Viet Vowel U - {0xaab7, 0xaab8}, // Tai Viet Mai Khit ..Tai Viet Vowel Ia - {0xaabe, 0xaabf}, // Tai Viet Vowel Am ..Tai Viet Tone Mai Ek - {0xaac1, 0xaac1}, // Tai Viet Tone Mai Tho ..Tai Viet Tone Mai Tho - {0xaaec, 0xaaed}, // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign - {0xaaf6, 0xaaf6}, // Meetei Mayek Virama ..Meetei Mayek Virama - {0xabe5, 0xabe5}, // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign - {0xabe8, 0xabe8}, // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign - {0xabed, 0xabed}, // Meetei Mayek Apun Iyek ..Meetei Mayek Apun Iyek - {0xfb1e, 0xfb1e}, // Hebrew Point Judeo-spani..Hebrew Point Judeo-spani - {0xfe00, 0xfe0f}, // Variation Select||-1 ..Variation Select||-16 - {0xfe20, 0xfe2f}, // Combining Ligature Left ..Combining Cyrillic Titlo + {0x00300, 0x0036f}, // Combining Grave Accent ..Combining Latin Small Le + {0x00483, 0x00489}, // Combining Cyrillic Titlo..Combining Cyrillic Milli + {0x00591, 0x005bd}, // Hebrew Accent Etnahta ..Hebrew Point Meteg + {0x005bf, 0x005bf}, // Hebrew Point Rafe ..Hebrew Point Rafe + {0x005c1, 0x005c2}, // Hebrew Point Shin Dot ..Hebrew Point Sin Dot + {0x005c4, 0x005c5}, // Hebrew Mark Upper Dot ..Hebrew Mark Lower Dot + {0x005c7, 0x005c7}, // Hebrew Point Qamats Qata..Hebrew Point Qamats Qata + {0x00610, 0x0061a}, // Arabic Sign Sallallahou ..Arabic Small Kasra + {0x0064b, 0x0065f}, // Arabic Fathatan ..Arabic Wavy Hamza Below + {0x00670, 0x00670}, // Arabic Letter Superscrip..Arabic Letter Superscrip + {0x006d6, 0x006dc}, // Arabic Small High Ligatu..Arabic Small High Seen + {0x006df, 0x006e4}, // Arabic Small High Rounde..Arabic Small High Madda + {0x006e7, 0x006e8}, // Arabic Small High Yeh ..Arabic Small High Noon + {0x006ea, 0x006ed}, // Arabic Empty Centre Low ..Arabic Small Low Meem + {0x00711, 0x00711}, // Syriac Letter Superscrip..Syriac Letter Superscrip + {0x00730, 0x0074a}, // Syriac Pthaha Above ..Syriac Barrekh + {0x007a6, 0x007b0}, // Thaana Abafili ..Thaana Sukun + {0x007eb, 0x007f3}, // Nko Combining Short High..Nko Combining Double Dot + {0x007fd, 0x007fd}, // Nko Dantayalan ..Nko Dantayalan + {0x00816, 0x00819}, // Samaritan Mark In ..Samaritan Mark Dagesh + {0x0081b, 0x00823}, // Samaritan Mark Epentheti..Samaritan Vowel Sign A + {0x00825, 0x00827}, // Samaritan Vowel Sign Sho..Samaritan Vowel Sign U + {0x00829, 0x0082d}, // Samaritan Vowel Sign Lon..Samaritan Mark Nequdaa + {0x00859, 0x0085b}, // Mandaic Affrication Mark..Mandaic Gemination Mark + {0x008d3, 0x008e1}, // Arabic Small Low Waw ..Arabic Small High Sign S + {0x008e3, 0x00902}, // Arabic Turned Damma Belo..Devanagari Sign Anusvara + {0x0093a, 0x0093a}, // Devanagari Vowel Sign Oe..Devanagari Vowel Sign Oe + {0x0093c, 0x0093c}, // Devanagari Sign Nukta ..Devanagari Sign Nukta + {0x00941, 0x00948}, // Devanagari Vowel Sign U ..Devanagari Vowel Sign Ai + {0x0094d, 0x0094d}, // Devanagari Sign Virama ..Devanagari Sign Virama + {0x00951, 0x00957}, // Devanagari Stress Sign U..Devanagari Vowel Sign Uu + {0x00962, 0x00963}, // Devanagari Vowel Sign Vo..Devanagari Vowel Sign Vo + {0x00981, 0x00981}, // Bengali Sign Candrabindu..Bengali Sign Candrabindu + {0x009bc, 0x009bc}, // Bengali Sign Nukta ..Bengali Sign Nukta + {0x009c1, 0x009c4}, // Bengali Vowel Sign U ..Bengali Vowel Sign Vocal + {0x009cd, 0x009cd}, // Bengali Sign Virama ..Bengali Sign Virama + {0x009e2, 0x009e3}, // Bengali Vowel Sign Vocal..Bengali Vowel Sign Vocal + {0x009fe, 0x009fe}, // Bengali Sandhi Mark ..Bengali Sandhi Mark + {0x00a01, 0x00a02}, // Gurmukhi Sign Adak Bindi..Gurmukhi Sign Bindi + {0x00a3c, 0x00a3c}, // Gurmukhi Sign Nukta ..Gurmukhi Sign Nukta + {0x00a41, 0x00a42}, // Gurmukhi Vowel Sign U ..Gurmukhi Vowel Sign Uu + {0x00a47, 0x00a48}, // Gurmukhi Vowel Sign Ee ..Gurmukhi Vowel Sign Ai + {0x00a4b, 0x00a4d}, // Gurmukhi Vowel Sign Oo ..Gurmukhi Sign Virama + {0x00a51, 0x00a51}, // Gurmukhi Sign Udaat ..Gurmukhi Sign Udaat + {0x00a70, 0x00a71}, // Gurmukhi Tippi ..Gurmukhi Addak + {0x00a75, 0x00a75}, // Gurmukhi Sign Yakash ..Gurmukhi Sign Yakash + {0x00a81, 0x00a82}, // Gujarati Sign Candrabind..Gujarati Sign Anusvara + {0x00abc, 0x00abc}, // Gujarati Sign Nukta ..Gujarati Sign Nukta + {0x00ac1, 0x00ac5}, // Gujarati Vowel Sign U ..Gujarati Vowel Sign Cand + {0x00ac7, 0x00ac8}, // Gujarati Vowel Sign E ..Gujarati Vowel Sign Ai + {0x00acd, 0x00acd}, // Gujarati Sign Virama ..Gujarati Sign Virama + {0x00ae2, 0x00ae3}, // Gujarati Vowel Sign Voca..Gujarati Vowel Sign Voca + {0x00afa, 0x00aff}, // Gujarati Sign Sukun ..Gujarati Sign Two-circle + {0x00b01, 0x00b01}, // Oriya Sign Candrabindu ..Oriya Sign Candrabindu + {0x00b3c, 0x00b3c}, // Oriya Sign Nukta ..Oriya Sign Nukta + {0x00b3f, 0x00b3f}, // Oriya Vowel Sign I ..Oriya Vowel Sign I + {0x00b41, 0x00b44}, // Oriya Vowel Sign U ..Oriya Vowel Sign Vocalic + {0x00b4d, 0x00b4d}, // Oriya Sign Virama ..Oriya Sign Virama + {0x00b55, 0x00b56}, // (nil) ..Oriya Ai Length Mark + {0x00b62, 0x00b63}, // Oriya Vowel Sign Vocalic..Oriya Vowel Sign Vocalic + {0x00b82, 0x00b82}, // Tamil Sign Anusvara ..Tamil Sign Anusvara + {0x00bc0, 0x00bc0}, // Tamil Vowel Sign Ii ..Tamil Vowel Sign Ii + {0x00bcd, 0x00bcd}, // Tamil Sign Virama ..Tamil Sign Virama + {0x00c00, 0x00c00}, // Telugu Sign Combining Ca..Telugu Sign Combining Ca + {0x00c04, 0x00c04}, // Telugu Sign Combining An..Telugu Sign Combining An + {0x00c3e, 0x00c40}, // Telugu Vowel Sign Aa ..Telugu Vowel Sign Ii + {0x00c46, 0x00c48}, // Telugu Vowel Sign E ..Telugu Vowel Sign Ai + {0x00c4a, 0x00c4d}, // Telugu Vowel Sign O ..Telugu Sign Virama + {0x00c55, 0x00c56}, // Telugu Length Mark ..Telugu Ai Length Mark + {0x00c62, 0x00c63}, // Telugu Vowel Sign Vocali..Telugu Vowel Sign Vocali + {0x00c81, 0x00c81}, // Kannada Sign Candrabindu..Kannada Sign Candrabindu + {0x00cbc, 0x00cbc}, // Kannada Sign Nukta ..Kannada Sign Nukta + {0x00cbf, 0x00cbf}, // Kannada Vowel Sign I ..Kannada Vowel Sign I + {0x00cc6, 0x00cc6}, // Kannada Vowel Sign E ..Kannada Vowel Sign E + {0x00ccc, 0x00ccd}, // Kannada Vowel Sign Au ..Kannada Sign Virama + {0x00ce2, 0x00ce3}, // Kannada Vowel Sign Vocal..Kannada Vowel Sign Vocal + {0x00d00, 0x00d01}, // Malayalam Sign Combining..Malayalam Sign Candrabin + {0x00d3b, 0x00d3c}, // Malayalam Sign Vertical ..Malayalam Sign Circular + {0x00d41, 0x00d44}, // Malayalam Vowel Sign U ..Malayalam Vowel Sign Voc + {0x00d4d, 0x00d4d}, // Malayalam Sign Virama ..Malayalam Sign Virama + {0x00d62, 0x00d63}, // Malayalam Vowel Sign Voc..Malayalam Vowel Sign Voc + {0x00d81, 0x00d81}, // (nil) ..(nil) + {0x00dca, 0x00dca}, // Sinhala Sign Al-lakuna ..Sinhala Sign Al-lakuna + {0x00dd2, 0x00dd4}, // Sinhala Vowel Sign Ketti..Sinhala Vowel Sign Ketti + {0x00dd6, 0x00dd6}, // Sinhala Vowel Sign Diga ..Sinhala Vowel Sign Diga + {0x00e31, 0x00e31}, // Thai Character Mai Han-a..Thai Character Mai Han-a + {0x00e34, 0x00e3a}, // Thai Character Sara I ..Thai Character Phinthu + {0x00e47, 0x00e4e}, // Thai Character Maitaikhu..Thai Character Yamakkan + {0x00eb1, 0x00eb1}, // Lao Vowel Sign Mai Kan ..Lao Vowel Sign Mai Kan + {0x00eb4, 0x00ebc}, // Lao Vowel Sign I ..Lao Semivowel Sign Lo + {0x00ec8, 0x00ecd}, // Lao Tone Mai Ek ..Lao Niggahita + {0x00f18, 0x00f19}, // Tibetan Astrological Sig..Tibetan Astrological Sig + {0x00f35, 0x00f35}, // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung + {0x00f37, 0x00f37}, // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung + {0x00f39, 0x00f39}, // Tibetan Mark Tsa -phru ..Tibetan Mark Tsa -phru + {0x00f71, 0x00f7e}, // Tibetan Vowel Sign Aa ..Tibetan Sign Rjes Su Nga + {0x00f80, 0x00f84}, // Tibetan Vowel Sign Rever..Tibetan Mark Halanta + {0x00f86, 0x00f87}, // Tibetan Sign Lci Rtags ..Tibetan Sign Yang Rtags + {0x00f8d, 0x00f97}, // Tibetan Subjoined Sign L..Tibetan Subjoined Letter + {0x00f99, 0x00fbc}, // Tibetan Subjoined Letter..Tibetan Subjoined Letter + {0x00fc6, 0x00fc6}, // Tibetan Symbol Padma Gda..Tibetan Symbol Padma Gda + {0x0102d, 0x01030}, // Myanmar Vowel Sign I ..Myanmar Vowel Sign Uu + {0x01032, 0x01037}, // Myanmar Vowel Sign Ai ..Myanmar Sign Dot Below + {0x01039, 0x0103a}, // Myanmar Sign Virama ..Myanmar Sign Asat + {0x0103d, 0x0103e}, // Myanmar Consonant Sign M..Myanmar Consonant Sign M + {0x01058, 0x01059}, // Myanmar Vowel Sign Vocal..Myanmar Vowel Sign Vocal + {0x0105e, 0x01060}, // Myanmar Consonant Sign M..Myanmar Consonant Sign M + {0x01071, 0x01074}, // Myanmar Vowel Sign Geba ..Myanmar Vowel Sign Kayah + {0x01082, 0x01082}, // Myanmar Consonant Sign S..Myanmar Consonant Sign S + {0x01085, 0x01086}, // Myanmar Vowel Sign Shan ..Myanmar Vowel Sign Shan + {0x0108d, 0x0108d}, // Myanmar Sign Shan Counci..Myanmar Sign Shan Counci + {0x0109d, 0x0109d}, // Myanmar Vowel Sign Aiton..Myanmar Vowel Sign Aiton + {0x0135d, 0x0135f}, // Ethiopic Combining Gemin..Ethiopic Combining Gemin + {0x01712, 0x01714}, // Tagalog Vowel Sign I ..Tagalog Sign Virama + {0x01732, 0x01734}, // Hanunoo Vowel Sign I ..Hanunoo Sign Pamudpod + {0x01752, 0x01753}, // Buhid Vowel Sign I ..Buhid Vowel Sign U + {0x01772, 0x01773}, // Tagbanwa Vowel Sign I ..Tagbanwa Vowel Sign U + {0x017b4, 0x017b5}, // Khmer Vowel Inherent Aq ..Khmer Vowel Inherent Aa + {0x017b7, 0x017bd}, // Khmer Vowel Sign I ..Khmer Vowel Sign Ua + {0x017c6, 0x017c6}, // Khmer Sign Nikahit ..Khmer Sign Nikahit + {0x017c9, 0x017d3}, // Khmer Sign Muusikatoan ..Khmer Sign Bathamasat + {0x017dd, 0x017dd}, // Khmer Sign Atthacan ..Khmer Sign Atthacan + {0x0180b, 0x0180d}, // Mongolian Free Variation..Mongolian Free Variation + {0x01885, 0x01886}, // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal + {0x018a9, 0x018a9}, // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal + {0x01920, 0x01922}, // Limbu Vowel Sign A ..Limbu Vowel Sign U + {0x01927, 0x01928}, // Limbu Vowel Sign E ..Limbu Vowel Sign O + {0x01932, 0x01932}, // Limbu Small Letter Anusv..Limbu Small Letter Anusv + {0x01939, 0x0193b}, // Limbu Sign Mukphreng ..Limbu Sign Sa-i + {0x01a17, 0x01a18}, // Buginese Vowel Sign I ..Buginese Vowel Sign U + {0x01a1b, 0x01a1b}, // Buginese Vowel Sign Ae ..Buginese Vowel Sign Ae + {0x01a56, 0x01a56}, // Tai Tham Consonant Sign ..Tai Tham Consonant Sign + {0x01a58, 0x01a5e}, // Tai Tham Sign Mai Kang L..Tai Tham Consonant Sign + {0x01a60, 0x01a60}, // Tai Tham Sign Sakot ..Tai Tham Sign Sakot + {0x01a62, 0x01a62}, // Tai Tham Vowel Sign Mai ..Tai Tham Vowel Sign Mai + {0x01a65, 0x01a6c}, // Tai Tham Vowel Sign I ..Tai Tham Vowel Sign Oa B + {0x01a73, 0x01a7c}, // Tai Tham Vowel Sign Oa A..Tai Tham Sign Khuen-lue + {0x01a7f, 0x01a7f}, // Tai Tham Combining Crypt..Tai Tham Combining Crypt + {0x01ab0, 0x01ac0}, // Combining Doubled Circum..(nil) + {0x01b00, 0x01b03}, // Balinese Sign Ulu Ricem ..Balinese Sign Surang + {0x01b34, 0x01b34}, // Balinese Sign Rerekan ..Balinese Sign Rerekan + {0x01b36, 0x01b3a}, // Balinese Vowel Sign Ulu ..Balinese Vowel Sign Ra R + {0x01b3c, 0x01b3c}, // Balinese Vowel Sign La L..Balinese Vowel Sign La L + {0x01b42, 0x01b42}, // Balinese Vowel Sign Pepe..Balinese Vowel Sign Pepe + {0x01b6b, 0x01b73}, // Balinese Musical Symbol ..Balinese Musical Symbol + {0x01b80, 0x01b81}, // Sundanese Sign Panyecek ..Sundanese Sign Panglayar + {0x01ba2, 0x01ba5}, // Sundanese Consonant Sign..Sundanese Vowel Sign Pan + {0x01ba8, 0x01ba9}, // Sundanese Vowel Sign Pam..Sundanese Vowel Sign Pan + {0x01bab, 0x01bad}, // Sundanese Sign Virama ..Sundanese Consonant Sign + {0x01be6, 0x01be6}, // Batak Sign Tompi ..Batak Sign Tompi + {0x01be8, 0x01be9}, // Batak Vowel Sign Pakpak ..Batak Vowel Sign Ee + {0x01bed, 0x01bed}, // Batak Vowel Sign Karo O ..Batak Vowel Sign Karo O + {0x01bef, 0x01bf1}, // Batak Vowel Sign U For S..Batak Consonant Sign H + {0x01c2c, 0x01c33}, // Lepcha Vowel Sign E ..Lepcha Consonant Sign T + {0x01c36, 0x01c37}, // Lepcha Sign Ran ..Lepcha Sign Nukta + {0x01cd0, 0x01cd2}, // Vedic Tone Karshana ..Vedic Tone Prenkha + {0x01cd4, 0x01ce0}, // Vedic Sign Yajurvedic Mi..Vedic Tone Rigvedic Kash + {0x01ce2, 0x01ce8}, // Vedic Sign Visarga Svari..Vedic Sign Visarga Anuda + {0x01ced, 0x01ced}, // Vedic Sign Tiryak ..Vedic Sign Tiryak + {0x01cf4, 0x01cf4}, // Vedic Tone Candra Above ..Vedic Tone Candra Above + {0x01cf8, 0x01cf9}, // Vedic Tone Ring Above ..Vedic Tone Double Ring A + {0x01dc0, 0x01df9}, // Combining Dotted Grave A..Combining Wide Inverted + {0x01dfb, 0x01dff}, // Combining Deletion Mark ..Combining Right Arrowhea + {0x020d0, 0x020f0}, // Combining Left Harpoon A..Combining Asterisk Above + {0x02cef, 0x02cf1}, // Coptic Combining Ni Abov..Coptic Combining Spiritu + {0x02d7f, 0x02d7f}, // Tifinagh Consonant Joine..Tifinagh Consonant Joine + {0x02de0, 0x02dff}, // Combining Cyrillic Lette..Combining Cyrillic Lette + {0x0302a, 0x0302d}, // Ideographic Level Tone M..Ideographic Entering Ton + {0x03099, 0x0309a}, // Combining Katakana-hirag..Combining Katakana-hirag + {0x0a66f, 0x0a672}, // Combining Cyrillic Vzmet..Combining Cyrillic Thous + {0x0a674, 0x0a67d}, // Combining Cyrillic Lette..Combining Cyrillic Payer + {0x0a69e, 0x0a69f}, // Combining Cyrillic Lette..Combining Cyrillic Lette + {0x0a6f0, 0x0a6f1}, // Bamum Combining Mark Koq..Bamum Combining Mark Tuk + {0x0a802, 0x0a802}, // Syloti Nagri Sign Dvisva..Syloti Nagri Sign Dvisva + {0x0a806, 0x0a806}, // Syloti Nagri Sign Hasant..Syloti Nagri Sign Hasant + {0x0a80b, 0x0a80b}, // Syloti Nagri Sign Anusva..Syloti Nagri Sign Anusva + {0x0a825, 0x0a826}, // Syloti Nagri Vowel Sign ..Syloti Nagri Vowel Sign + {0x0a82c, 0x0a82c}, // (nil) ..(nil) + {0x0a8c4, 0x0a8c5}, // Saurashtra Sign Virama ..Saurashtra Sign Candrabi + {0x0a8e0, 0x0a8f1}, // Combining Devanagari Dig..Combining Devanagari Sig + {0x0a8ff, 0x0a8ff}, // Devanagari Vowel Sign Ay..Devanagari Vowel Sign Ay + {0x0a926, 0x0a92d}, // Kayah Li Vowel Ue ..Kayah Li Tone Calya Plop + {0x0a947, 0x0a951}, // Rejang Vowel Sign I ..Rejang Consonant Sign R + {0x0a980, 0x0a982}, // Javanese Sign Panyangga ..Javanese Sign Layar + {0x0a9b3, 0x0a9b3}, // Javanese Sign Cecak Telu..Javanese Sign Cecak Telu + {0x0a9b6, 0x0a9b9}, // Javanese Vowel Sign Wulu..Javanese Vowel Sign Suku + {0x0a9bc, 0x0a9bd}, // Javanese Vowel Sign Pepe..Javanese Consonant Sign + {0x0a9e5, 0x0a9e5}, // Myanmar Sign Shan Saw ..Myanmar Sign Shan Saw + {0x0aa29, 0x0aa2e}, // Cham Vowel Sign Aa ..Cham Vowel Sign Oe + {0x0aa31, 0x0aa32}, // Cham Vowel Sign Au ..Cham Vowel Sign Ue + {0x0aa35, 0x0aa36}, // Cham Consonant Sign La ..Cham Consonant Sign Wa + {0x0aa43, 0x0aa43}, // Cham Consonant Sign Fina..Cham Consonant Sign Fina + {0x0aa4c, 0x0aa4c}, // Cham Consonant Sign Fina..Cham Consonant Sign Fina + {0x0aa7c, 0x0aa7c}, // Myanmar Sign Tai Laing T..Myanmar Sign Tai Laing T + {0x0aab0, 0x0aab0}, // Tai Viet Mai Kang ..Tai Viet Mai Kang + {0x0aab2, 0x0aab4}, // Tai Viet Vowel I ..Tai Viet Vowel U + {0x0aab7, 0x0aab8}, // Tai Viet Mai Khit ..Tai Viet Vowel Ia + {0x0aabe, 0x0aabf}, // Tai Viet Vowel Am ..Tai Viet Tone Mai Ek + {0x0aac1, 0x0aac1}, // Tai Viet Tone Mai Tho ..Tai Viet Tone Mai Tho + {0x0aaec, 0x0aaed}, // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign + {0x0aaf6, 0x0aaf6}, // Meetei Mayek Virama ..Meetei Mayek Virama + {0x0abe5, 0x0abe5}, // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign + {0x0abe8, 0x0abe8}, // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign + {0x0abed, 0x0abed}, // Meetei Mayek Apun Iyek ..Meetei Mayek Apun Iyek + {0x0fb1e, 0x0fb1e}, // Hebrew Point Judeo-spani..Hebrew Point Judeo-spani + {0x0fe00, 0x0fe0f}, // Variation Selector-1 ..Variation Selector-16 + {0x0fe20, 0x0fe2f}, // Combining Ligature Left ..Combining Cyrillic Titlo {0x101fd, 0x101fd}, // Phaistos Disc Sign Combi..Phaistos Disc Sign Combi {0x102e0, 0x102e0}, // Coptic Epact Thousands M..Coptic Epact Thousands M {0x10376, 0x1037a}, // Combining Old Permic Let..Combining Old Permic Let @@ -219,6 +232,9 @@ public final class WcWidth { {0x10a38, 0x10a3a}, // Kharoshthi Sign Bar Abov..Kharoshthi Sign Dot Belo {0x10a3f, 0x10a3f}, // Kharoshthi Virama ..Kharoshthi Virama {0x10ae5, 0x10ae6}, // Manichaean Abbreviation ..Manichaean Abbreviation + {0x10d24, 0x10d27}, // Hanifi Rohingya Sign Har..Hanifi Rohingya Sign Tas + {0x10eab, 0x10eac}, // (nil) ..(nil) + {0x10f46, 0x10f50}, // Sogdian Combining Dot Be..Sogdian Combining Stroke {0x11001, 0x11001}, // Brahmi Sign Anusvara ..Brahmi Sign Anusvara {0x11038, 0x11046}, // Brahmi Vowel Sign Aa ..Brahmi Virama {0x1107f, 0x11081}, // Brahmi Number Joiner ..Kaithi Sign Anusvara @@ -230,23 +246,25 @@ public final class WcWidth { {0x11173, 0x11173}, // Mahajani Sign Nukta ..Mahajani Sign Nukta {0x11180, 0x11181}, // Sharada Sign Candrabindu..Sharada Sign Anusvara {0x111b6, 0x111be}, // Sharada Vowel Sign U ..Sharada Vowel Sign O - {0x111ca, 0x111cc}, // Sharada Sign Nukta ..Sharada Extra Sh||t Vowe + {0x111c9, 0x111cc}, // Sharada Sandhi Mark ..Sharada Extra Short Vowe + {0x111cf, 0x111cf}, // (nil) ..(nil) {0x1122f, 0x11231}, // Khojki Vowel Sign U ..Khojki Vowel Sign Ai {0x11234, 0x11234}, // Khojki Sign Anusvara ..Khojki Sign Anusvara {0x11236, 0x11237}, // Khojki Sign Nukta ..Khojki Sign Shadda - {0x1123e, 0x1123e}, // (nil) .. + {0x1123e, 0x1123e}, // Khojki Sign Sukun ..Khojki Sign Sukun {0x112df, 0x112df}, // Khudawadi Sign Anusvara ..Khudawadi Sign Anusvara {0x112e3, 0x112ea}, // Khudawadi Vowel Sign U ..Khudawadi Sign Virama {0x11300, 0x11301}, // Grantha Sign Combining A..Grantha Sign Candrabindu - {0x1133c, 0x1133c}, // Grantha Sign Nukta ..Grantha Sign Nukta + {0x1133b, 0x1133c}, // Combining Bindu Below ..Grantha Sign Nukta {0x11340, 0x11340}, // Grantha Vowel Sign Ii ..Grantha Vowel Sign Ii {0x11366, 0x1136c}, // Combining Grantha Digit ..Combining Grantha Digit {0x11370, 0x11374}, // Combining Grantha Letter..Combining Grantha Letter - {0x11438, 0x1143f}, // (nil) .. - {0x11442, 0x11444}, // (nil) .. - {0x11446, 0x11446}, // (nil) .. + {0x11438, 0x1143f}, // Newa Vowel Sign U ..Newa Vowel Sign Ai + {0x11442, 0x11444}, // Newa Sign Virama ..Newa Sign Anusvara + {0x11446, 0x11446}, // Newa Sign Nukta ..Newa Sign Nukta + {0x1145e, 0x1145e}, // Newa Sandhi Mark ..Newa Sandhi Mark {0x114b3, 0x114b8}, // Tirhuta Vowel Sign U ..Tirhuta Vowel Sign Vocal - {0x114ba, 0x114ba}, // Tirhuta Vowel Sign Sh||t..Tirhuta Vowel Sign Sh||t + {0x114ba, 0x114ba}, // Tirhuta Vowel Sign Short..Tirhuta Vowel Sign Short {0x114bf, 0x114c0}, // Tirhuta Sign Candrabindu..Tirhuta Sign Anusvara {0x114c2, 0x114c3}, // Tirhuta Sign Virama ..Tirhuta Sign Nukta {0x115b2, 0x115b5}, // Siddham Vowel Sign U ..Siddham Vowel Sign Vocal @@ -263,16 +281,43 @@ public final class WcWidth { {0x1171d, 0x1171f}, // Ahom Consonant Sign Medi..Ahom Consonant Sign Medi {0x11722, 0x11725}, // Ahom Vowel Sign I ..Ahom Vowel Sign Uu {0x11727, 0x1172b}, // Ahom Vowel Sign Aw ..Ahom Sign Killer - {0x11c30, 0x11c36}, // (nil) .. - {0x11c38, 0x11c3d}, // (nil) .. - {0x11c3f, 0x11c3f}, // (nil) .. - {0x11c92, 0x11ca7}, // (nil) .. - {0x11caa, 0x11cb0}, // (nil) .. - {0x11cb2, 0x11cb3}, // (nil) .. - {0x11cb5, 0x11cb6}, // (nil) .. + {0x1182f, 0x11837}, // Dogra Vowel Sign U ..Dogra Sign Anusvara + {0x11839, 0x1183a}, // Dogra Sign Virama ..Dogra Sign Nukta + {0x1193b, 0x1193c}, // (nil) ..(nil) + {0x1193e, 0x1193e}, // (nil) ..(nil) + {0x11943, 0x11943}, // (nil) ..(nil) + {0x119d4, 0x119d7}, // Nandinagari Vowel Sign U..Nandinagari Vowel Sign V + {0x119da, 0x119db}, // Nandinagari Vowel Sign E..Nandinagari Vowel Sign A + {0x119e0, 0x119e0}, // Nandinagari Sign Virama ..Nandinagari Sign Virama + {0x11a01, 0x11a0a}, // Zanabazar Square Vowel S..Zanabazar Square Vowel L + {0x11a33, 0x11a38}, // Zanabazar Square Final C..Zanabazar Square Sign An + {0x11a3b, 0x11a3e}, // Zanabazar Square Cluster..Zanabazar Square Cluster + {0x11a47, 0x11a47}, // Zanabazar Square Subjoin..Zanabazar Square Subjoin + {0x11a51, 0x11a56}, // Soyombo Vowel Sign I ..Soyombo Vowel Sign Oe + {0x11a59, 0x11a5b}, // Soyombo Vowel Sign Vocal..Soyombo Vowel Length Mar + {0x11a8a, 0x11a96}, // Soyombo Final Consonant ..Soyombo Sign Anusvara + {0x11a98, 0x11a99}, // Soyombo Gemination Mark ..Soyombo Subjoiner + {0x11c30, 0x11c36}, // Bhaiksuki Vowel Sign I ..Bhaiksuki Vowel Sign Voc + {0x11c38, 0x11c3d}, // Bhaiksuki Vowel Sign E ..Bhaiksuki Sign Anusvara + {0x11c3f, 0x11c3f}, // Bhaiksuki Sign Virama ..Bhaiksuki Sign Virama + {0x11c92, 0x11ca7}, // Marchen Subjoined Letter..Marchen Subjoined Letter + {0x11caa, 0x11cb0}, // Marchen Subjoined Letter..Marchen Vowel Sign Aa + {0x11cb2, 0x11cb3}, // Marchen Vowel Sign U ..Marchen Vowel Sign E + {0x11cb5, 0x11cb6}, // Marchen Sign Anusvara ..Marchen Sign Candrabindu + {0x11d31, 0x11d36}, // Masaram Gondi Vowel Sign..Masaram Gondi Vowel Sign + {0x11d3a, 0x11d3a}, // Masaram Gondi Vowel Sign..Masaram Gondi Vowel Sign + {0x11d3c, 0x11d3d}, // Masaram Gondi Vowel Sign..Masaram Gondi Vowel Sign + {0x11d3f, 0x11d45}, // Masaram Gondi Vowel Sign..Masaram Gondi Virama + {0x11d47, 0x11d47}, // Masaram Gondi Ra-kara ..Masaram Gondi Ra-kara + {0x11d90, 0x11d91}, // Gunjala Gondi Vowel Sign..Gunjala Gondi Vowel Sign + {0x11d95, 0x11d95}, // Gunjala Gondi Sign Anusv..Gunjala Gondi Sign Anusv + {0x11d97, 0x11d97}, // Gunjala Gondi Virama ..Gunjala Gondi Virama + {0x11ef3, 0x11ef4}, // Makasar Vowel Sign I ..Makasar Vowel Sign U {0x16af0, 0x16af4}, // Bassa Vah Combining High..Bassa Vah Combining High {0x16b30, 0x16b36}, // Pahawh Hmong Mark Cim Tu..Pahawh Hmong Mark Cim Ta + {0x16f4f, 0x16f4f}, // Miao Sign Consonant Modi..Miao Sign Consonant Modi {0x16f8f, 0x16f92}, // Miao Tone Right ..Miao Tone Below + {0x16fe4, 0x16fe4}, // (nil) ..(nil) {0x1bc9d, 0x1bc9e}, // Duployan Thick Letter Se..Duployan Double Mark {0x1d167, 0x1d169}, // Musical Symbol Combining..Musical Symbol Combining {0x1d17b, 0x1d182}, // Musical Symbol Combining..Musical Symbol Combining @@ -285,97 +330,103 @@ public final class WcWidth { {0x1da84, 0x1da84}, // Signwriting Location Hea..Signwriting Location Hea {0x1da9b, 0x1da9f}, // Signwriting Fill Modifie..Signwriting Fill Modifie {0x1daa1, 0x1daaf}, // Signwriting Rotation Mod..Signwriting Rotation Mod - {0x1e000, 0x1e006}, // (nil) .. - {0x1e008, 0x1e018}, // (nil) .. - {0x1e01b, 0x1e021}, // (nil) .. - {0x1e023, 0x1e024}, // (nil) .. - {0x1e026, 0x1e02a}, // (nil) .. + {0x1e000, 0x1e006}, // Combining Glagolitic Let..Combining Glagolitic Let + {0x1e008, 0x1e018}, // Combining Glagolitic Let..Combining Glagolitic Let + {0x1e01b, 0x1e021}, // Combining Glagolitic Let..Combining Glagolitic Let + {0x1e023, 0x1e024}, // Combining Glagolitic Let..Combining Glagolitic Let + {0x1e026, 0x1e02a}, // Combining Glagolitic Let..Combining Glagolitic Let + {0x1e130, 0x1e136}, // Nyiakeng Puachue Hmong T..Nyiakeng Puachue Hmong T + {0x1e2ec, 0x1e2ef}, // Wancho Tone Tup ..Wancho Tone Koini {0x1e8d0, 0x1e8d6}, // Mende Kikakui Combining ..Mende Kikakui Combining - {0x1e944, 0x1e94a}, // (nil) .. - {0xe0100, 0xe01ef}, // Variation Select||-17 ..Variation Select||-256 + {0x1e944, 0x1e94a}, // Adlam Alif Lengthener ..Adlam Nukta + {0xe0100, 0xe01ef}, // Variation Selector-17 ..Variation Selector-256 }; // https://github.com/jquast/wcwidth/blob/master/wcwidth/table_wide.py - // at commit 0d7de112202cc8b2ebe9232ff4a5c954f19d561a (2016-07-02): + // at commit b29897e5a1b403a0e36f7fc991614981cbc42475 (2020-07-14): private static final int[][] WIDE_EASTASIAN = { - {0x1100, 0x115f}, // Hangul Choseong Kiyeok ..Hangul Choseong Filler - {0x231a, 0x231b}, // Watch ..Hourglass - {0x2329, 0x232a}, // Left-pointing Angle Brac..Right-pointing Angle Bra - {0x23e9, 0x23ec}, // Black Right-pointing Dou..Black Down-pointing Doub - {0x23f0, 0x23f0}, // Alarm Clock ..Alarm Clock - {0x23f3, 0x23f3}, // Hourglass With Flowing S..Hourglass With Flowing S - {0x25fd, 0x25fe}, // White Medium Small Squar..Black Medium Small Squar - {0x2614, 0x2615}, // Umbrella With Rain Drops..Hot Beverage - {0x2648, 0x2653}, // Aries ..Pisces - {0x267f, 0x267f}, // Wheelchair Symbol ..Wheelchair Symbol - {0x2693, 0x2693}, // Anch|| ..Anch|| - {0x26a1, 0x26a1}, // High Voltage Sign ..High Voltage Sign - {0x26aa, 0x26ab}, // Medium White Circle ..Medium Black Circle - {0x26bd, 0x26be}, // Soccer Ball ..Baseball - {0x26c4, 0x26c5}, // Snowman Without Snow ..Sun Behind Cloud - {0x26ce, 0x26ce}, // Ophiuchus ..Ophiuchus - {0x26d4, 0x26d4}, // No Entry ..No Entry - {0x26ea, 0x26ea}, // Church ..Church - {0x26f2, 0x26f3}, // Fountain ..Flag In Hole - {0x26f5, 0x26f5}, // Sailboat ..Sailboat - {0x26fa, 0x26fa}, // Tent ..Tent - {0x26fd, 0x26fd}, // Fuel Pump ..Fuel Pump - {0x2705, 0x2705}, // White Heavy Check Mark ..White Heavy Check Mark - {0x270a, 0x270b}, // Raised Fist ..Raised Hand - {0x2728, 0x2728}, // Sparkles ..Sparkles - {0x274c, 0x274c}, // Cross Mark ..Cross Mark - {0x274e, 0x274e}, // Negative Squared Cross M..Negative Squared Cross M - {0x2753, 0x2755}, // Black Question Mark ||na..White Exclamation Mark O - {0x2757, 0x2757}, // Heavy Exclamation Mark S..Heavy Exclamation Mark S - {0x2795, 0x2797}, // Heavy Plus Sign ..Heavy Division Sign - {0x27b0, 0x27b0}, // Curly Loop ..Curly Loop - {0x27bf, 0x27bf}, // Double Curly Loop ..Double Curly Loop - {0x2b1b, 0x2b1c}, // Black Large Square ..White Large Square - {0x2b50, 0x2b50}, // White Medium Star ..White Medium Star - {0x2b55, 0x2b55}, // Heavy Large Circle ..Heavy Large Circle - {0x2e80, 0x2e99}, // Cjk Radical Repeat ..Cjk Radical Rap - {0x2e9b, 0x2ef3}, // Cjk Radical Choke ..Cjk Radical C-simplified - {0x2f00, 0x2fd5}, // Kangxi Radical One ..Kangxi Radical Flute - {0x2ff0, 0x2ffb}, // Ideographic Description ..Ideographic Description - {0x3000, 0x303e}, // Ideographic Space ..Ideographic Variation In - {0x3041, 0x3096}, // Hiragana Letter Small A ..Hiragana Letter Small Ke - {0x3099, 0x30ff}, // Combining Katakana-hirag..Katakana Digraph Koto - {0x3105, 0x312d}, // Bopomofo Letter B ..Bopomofo Letter Ih - {0x3131, 0x318e}, // Hangul Letter Kiyeok ..Hangul Letter Araeae - {0x3190, 0x31ba}, // Ideographic Annotation L..Bopomofo Letter Zy - {0x31c0, 0x31e3}, // Cjk Stroke T ..Cjk Stroke Q - {0x31f0, 0x321e}, // Katakana Letter Small Ku..Parenthesized K||ean Cha - {0x3220, 0x3247}, // Parenthesized Ideograph ..Circled Ideograph Koto - {0x3250, 0x32fe}, // Partnership Sign ..Circled Katakana Wo - {0x3300, 0x4dbf}, // Square Apaato .. - {0x4e00, 0xa48c}, // Cjk Unified Ideograph-4e..Yi Syllable Yyr - {0xa490, 0xa4c6}, // Yi Radical Qot ..Yi Radical Ke - {0xa960, 0xa97c}, // Hangul Choseong Tikeut-m..Hangul Choseong Ssangyeo - {0xac00, 0xd7a3}, // Hangul Syllable Ga ..Hangul Syllable Hih - {0xf900, 0xfaff}, // Cjk Compatibility Ideogr.. - {0xfe10, 0xfe19}, // Presentation F||m F|| Ve..Presentation F||m F|| Ve - {0xfe30, 0xfe52}, // Presentation F||m F|| Ve..Small Full Stop - {0xfe54, 0xfe66}, // Small Semicolon ..Small Equals Sign - {0xfe68, 0xfe6b}, // Small Reverse Solidus ..Small Commercial At - {0xff01, 0xff60}, // Fullwidth Exclamation Ma..Fullwidth Right White Pa - {0xffe0, 0xffe6}, // Fullwidth Cent Sign ..Fullwidth Won Sign - {0x16fe0, 0x16fe0}, // (nil) .. - {0x17000, 0x187ec}, // (nil) .. - {0x18800, 0x18af2}, // (nil) .. - {0x1b000, 0x1b001}, // Katakana Letter Archaic ..Hiragana Letter Archaic + {0x01100, 0x0115f}, // Hangul Choseong Kiyeok ..Hangul Choseong Filler + {0x0231a, 0x0231b}, // Watch ..Hourglass + {0x02329, 0x0232a}, // Left-pointing Angle Brac..Right-pointing Angle Bra + {0x023e9, 0x023ec}, // Black Right-pointing Dou..Black Down-pointing Doub + {0x023f0, 0x023f0}, // Alarm Clock ..Alarm Clock + {0x023f3, 0x023f3}, // Hourglass With Flowing S..Hourglass With Flowing S + {0x025fd, 0x025fe}, // White Medium Small Squar..Black Medium Small Squar + {0x02614, 0x02615}, // Umbrella With Rain Drops..Hot Beverage + {0x02648, 0x02653}, // Aries ..Pisces + {0x0267f, 0x0267f}, // Wheelchair Symbol ..Wheelchair Symbol + {0x02693, 0x02693}, // Anchor ..Anchor + {0x026a1, 0x026a1}, // High Voltage Sign ..High Voltage Sign + {0x026aa, 0x026ab}, // Medium White Circle ..Medium Black Circle + {0x026bd, 0x026be}, // Soccer Ball ..Baseball + {0x026c4, 0x026c5}, // Snowman Without Snow ..Sun Behind Cloud + {0x026ce, 0x026ce}, // Ophiuchus ..Ophiuchus + {0x026d4, 0x026d4}, // No Entry ..No Entry + {0x026ea, 0x026ea}, // Church ..Church + {0x026f2, 0x026f3}, // Fountain ..Flag In Hole + {0x026f5, 0x026f5}, // Sailboat ..Sailboat + {0x026fa, 0x026fa}, // Tent ..Tent + {0x026fd, 0x026fd}, // Fuel Pump ..Fuel Pump + {0x02705, 0x02705}, // White Heavy Check Mark ..White Heavy Check Mark + {0x0270a, 0x0270b}, // Raised Fist ..Raised Hand + {0x02728, 0x02728}, // Sparkles ..Sparkles + {0x0274c, 0x0274c}, // Cross Mark ..Cross Mark + {0x0274e, 0x0274e}, // Negative Squared Cross M..Negative Squared Cross M + {0x02753, 0x02755}, // Black Question Mark Orna..White Exclamation Mark O + {0x02757, 0x02757}, // Heavy Exclamation Mark S..Heavy Exclamation Mark S + {0x02795, 0x02797}, // Heavy Plus Sign ..Heavy Division Sign + {0x027b0, 0x027b0}, // Curly Loop ..Curly Loop + {0x027bf, 0x027bf}, // Double Curly Loop ..Double Curly Loop + {0x02b1b, 0x02b1c}, // Black Large Square ..White Large Square + {0x02b50, 0x02b50}, // White Medium Star ..White Medium Star + {0x02b55, 0x02b55}, // Heavy Large Circle ..Heavy Large Circle + {0x02e80, 0x02e99}, // Cjk Radical Repeat ..Cjk Radical Rap + {0x02e9b, 0x02ef3}, // Cjk Radical Choke ..Cjk Radical C-simplified + {0x02f00, 0x02fd5}, // Kangxi Radical One ..Kangxi Radical Flute + {0x02ff0, 0x02ffb}, // Ideographic Description ..Ideographic Description + {0x03000, 0x0303e}, // Ideographic Space ..Ideographic Variation In + {0x03041, 0x03096}, // Hiragana Letter Small A ..Hiragana Letter Small Ke + {0x03099, 0x030ff}, // Combining Katakana-hirag..Katakana Digraph Koto + {0x03105, 0x0312f}, // Bopomofo Letter B ..Bopomofo Letter Nn + {0x03131, 0x0318e}, // Hangul Letter Kiyeok ..Hangul Letter Araeae + {0x03190, 0x031e3}, // Ideographic Annotation L..Cjk Stroke Q + {0x031f0, 0x0321e}, // Katakana Letter Small Ku..Parenthesized Korean Cha + {0x03220, 0x03247}, // Parenthesized Ideograph ..Circled Ideograph Koto + {0x03250, 0x04dbf}, // Partnership Sign ..(nil) + {0x04e00, 0x0a48c}, // Cjk Unified Ideograph-4e..Yi Syllable Yyr + {0x0a490, 0x0a4c6}, // Yi Radical Qot ..Yi Radical Ke + {0x0a960, 0x0a97c}, // Hangul Choseong Tikeut-m..Hangul Choseong Ssangyeo + {0x0ac00, 0x0d7a3}, // Hangul Syllable Ga ..Hangul Syllable Hih + {0x0f900, 0x0faff}, // Cjk Compatibility Ideogr..(nil) + {0x0fe10, 0x0fe19}, // Presentation Form For Ve..Presentation Form For Ve + {0x0fe30, 0x0fe52}, // Presentation Form For Ve..Small Full Stop + {0x0fe54, 0x0fe66}, // Small Semicolon ..Small Equals Sign + {0x0fe68, 0x0fe6b}, // Small Reverse Solidus ..Small Commercial At + {0x0ff01, 0x0ff60}, // Fullwidth Exclamation Ma..Fullwidth Right White Pa + {0x0ffe0, 0x0ffe6}, // Fullwidth Cent Sign ..Fullwidth Won Sign + {0x16fe0, 0x16fe4}, // Tangut Iteration Mark ..(nil) + {0x16ff0, 0x16ff1}, // (nil) ..(nil) + {0x17000, 0x187f7}, // (nil) ..(nil) + {0x18800, 0x18cd5}, // Tangut Component-001 ..(nil) + {0x18d00, 0x18d08}, // (nil) ..(nil) + {0x1b000, 0x1b11e}, // Katakana Letter Archaic ..Hentaigana Letter N-mu-m + {0x1b150, 0x1b152}, // Hiragana Letter Small Wi..Hiragana Letter Small Wo + {0x1b164, 0x1b167}, // Katakana Letter Small Wi..Katakana Letter Small N + {0x1b170, 0x1b2fb}, // Nushu Character-1b170 ..Nushu Character-1b2fb {0x1f004, 0x1f004}, // Mahjong Tile Red Dragon ..Mahjong Tile Red Dragon {0x1f0cf, 0x1f0cf}, // Playing Card Black Joker..Playing Card Black Joker {0x1f18e, 0x1f18e}, // Negative Squared Ab ..Negative Squared Ab {0x1f191, 0x1f19a}, // Squared Cl ..Squared Vs {0x1f200, 0x1f202}, // Square Hiragana Hoka ..Squared Katakana Sa - {0x1f210, 0x1f23b}, // Squared Cjk Unified Ideo.. - {0x1f240, 0x1f248}, // T||toise Shell Bracketed..T||toise Shell Bracketed + {0x1f210, 0x1f23b}, // Squared Cjk Unified Ideo..Squared Cjk Unified Ideo + {0x1f240, 0x1f248}, // Tortoise Shell Bracketed..Tortoise Shell Bracketed {0x1f250, 0x1f251}, // Circled Ideograph Advant..Circled Ideograph Accept + {0x1f260, 0x1f265}, // Rounded Symbol For Fu ..Rounded Symbol For Cai {0x1f300, 0x1f320}, // Cyclone ..Shooting Star {0x1f32d, 0x1f335}, // Hot Dog ..Cactus {0x1f337, 0x1f37c}, // Tulip ..Baby Bottle - {0x1f37e, 0x1f393}, // Bottle With Popping C||k..Graduation Cap - {0x1f3a0, 0x1f3ca}, // Carousel H||se ..Swimmer + {0x1f37e, 0x1f393}, // Bottle With Popping Cork..Graduation Cap + {0x1f3a0, 0x1f3ca}, // Carousel Horse ..Swimmer {0x1f3cf, 0x1f3d3}, // Cricket Bat And Ball ..Table Tennis Paddle And {0x1f3e0, 0x1f3f0}, // House Building ..European Castle {0x1f3f4, 0x1f3f4}, // Waving Black Flag ..Waving Black Flag @@ -383,27 +434,33 @@ public final class WcWidth { {0x1f440, 0x1f440}, // Eyes ..Eyes {0x1f442, 0x1f4fc}, // Ear ..Videocassette {0x1f4ff, 0x1f53d}, // Prayer Beads ..Down-pointing Small Red - {0x1f54b, 0x1f54e}, // Kaaba ..Men||ah With Nine Branch + {0x1f54b, 0x1f54e}, // Kaaba ..Menorah With Nine Branch {0x1f550, 0x1f567}, // Clock Face One Oclock ..Clock Face Twelve-thirty - {0x1f57a, 0x1f57a}, // (nil) .. + {0x1f57a, 0x1f57a}, // Man Dancing ..Man Dancing {0x1f595, 0x1f596}, // Reversed Hand With Middl..Raised Hand With Part Be - {0x1f5a4, 0x1f5a4}, // (nil) .. + {0x1f5a4, 0x1f5a4}, // Black Heart ..Black Heart {0x1f5fb, 0x1f64f}, // Mount Fuji ..Person With Folded Hands {0x1f680, 0x1f6c5}, // Rocket ..Left Luggage {0x1f6cc, 0x1f6cc}, // Sleeping Accommodation ..Sleeping Accommodation - {0x1f6d0, 0x1f6d2}, // Place Of W||ship .. + {0x1f6d0, 0x1f6d2}, // Place Of Worship ..Shopping Trolley + {0x1f6d5, 0x1f6d7}, // Hindu Temple ..(nil) {0x1f6eb, 0x1f6ec}, // Airplane Departure ..Airplane Arriving - {0x1f6f4, 0x1f6f6}, // (nil) .. - {0x1f910, 0x1f91e}, // Zipper-mouth Face .. - {0x1f920, 0x1f927}, // (nil) .. - {0x1f930, 0x1f930}, // (nil) .. - {0x1f933, 0x1f93e}, // (nil) .. - {0x1f940, 0x1f94b}, // (nil) .. - {0x1f950, 0x1f95e}, // (nil) .. - {0x1f980, 0x1f991}, // Crab .. - {0x1f9c0, 0x1f9c0}, // Cheese Wedge ..Cheese Wedge - {0x20000, 0x2fffd}, // Cjk Unified Ideograph-20.. - {0x30000, 0x3fffd}, // (nil) .. + {0x1f6f4, 0x1f6fc}, // Scooter ..(nil) + {0x1f7e0, 0x1f7eb}, // Large Orange Circle ..Large Brown Square + {0x1f90c, 0x1f93a}, // (nil) ..Fencer + {0x1f93c, 0x1f945}, // Wrestlers ..Goal Net + {0x1f947, 0x1f978}, // First Place Medal ..(nil) + {0x1f97a, 0x1f9cb}, // Face With Pleading Eyes ..(nil) + {0x1f9cd, 0x1f9ff}, // Standing Person ..Nazar Amulet + {0x1fa70, 0x1fa74}, // Ballet Shoes ..(nil) + {0x1fa78, 0x1fa7a}, // Drop Of Blood ..Stethoscope + {0x1fa80, 0x1fa86}, // Yo-yo ..(nil) + {0x1fa90, 0x1faa8}, // Ringed Planet ..(nil) + {0x1fab0, 0x1fab6}, // (nil) ..(nil) + {0x1fac0, 0x1fac2}, // (nil) ..(nil) + {0x1fad0, 0x1fad6}, // (nil) ..(nil) + {0x20000, 0x2fffd}, // Cjk Unified Ideograph-20..(nil) + {0x30000, 0x3fffd}, // (nil) ..(nil) }; From 70580abd50aa6e7bdc541d7bac6025c82947c749 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 7 Aug 2020 15:39:11 +0300 Subject: [PATCH 044/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1570764573..a732b907cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 26 - downloadBootstrap("aarch64", "c7830de73aa437933aef1957bdea29640afa34ca292fd7e27a6bdd1c9271bfe3", version) - downloadBootstrap("arm", "d6c250d853ef235da6f64ee946018cfaca1ca5a416d2ce0bdd82d97c35972bc5", version) - downloadBootstrap("i686", "d1b272e022a6bbee9d6bff024f1e42d26c58d0d3dfe64ca68846b94b40db352d", version) - downloadBootstrap("x86_64", "866793074541aa1ead0927affc8f1b5279a2cf9d683688a8379e6090754e077e", version) + def version = 27 + downloadBootstrap("aarch64", "517fb3aa215f7b96961f9377822d7f1b5e86c831efb4ab096ed65d0b1cdf02e9", version) + downloadBootstrap("arm", "94d17183afdd017cf8ab885b9103a370b16bec1d3cb641884511d545ee009b90", version) + downloadBootstrap("i686", "7f27723d2f0afbe7e90f203b3ca2e80871a8dfa08b136229476aa5e7ba3e988f", version) + downloadBootstrap("x86_64", "b19b2721bae5fb3a3fb0754c49611ce4721221e1e7997e7fd98940776ad88c3d", version) } } From 619552ec5c1a6fd1dfb0eb735b67d645c5dc19ff Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 7 Aug 2020 15:39:44 +0300 Subject: [PATCH 045/815] version 0.98 (v0.97 is non-release, so updating from 0.96 to 0.98) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a732b907cc..112bd108bd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion project.properties.minSdkVersion.toInteger() targetSdkVersion project.properties.targetSdkVersion.toInteger() - versionCode 96 - versionName "0.96" + versionCode 98 + versionName "0.98" externalNativeBuild { ndkBuild { From 5a70be152346958009fda0419d77502c6e52391b Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sat, 8 Aug 2020 02:15:14 +0300 Subject: [PATCH 046/815] terminal emulator: flush remaining process output data when terminating session --- .../java/com/termux/terminal/TerminalSession.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java index a8c08a8d2b..a0c5b855b6 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalSession.java @@ -110,13 +110,13 @@ private static FileDescriptor wrapFileDescriptor(int fileDescriptor) { @Override public void handleMessage(Message msg) { - if (msg.what == MSG_NEW_INPUT && isRunning()) { - int bytesRead = mProcessToTerminalIOQueue.read(mReceiveBuffer, false); - if (bytesRead > 0) { - mEmulator.append(mReceiveBuffer, bytesRead); - notifyScreenUpdate(); - } - } else if (msg.what == MSG_PROCESS_EXITED) { + int bytesRead = mProcessToTerminalIOQueue.read(mReceiveBuffer, false); + if (bytesRead > 0) { + mEmulator.append(mReceiveBuffer, bytesRead); + notifyScreenUpdate(); + } + + if (msg.what == MSG_PROCESS_EXITED) { int exitCode = (Integer) msg.obj; cleanupResources(exitCode); mChangeCallback.onSessionFinished(TerminalSession.this); From 332f1104a3e35123a8f9500b367072adb9c48c3a Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Sun, 9 Aug 2020 00:07:35 +0200 Subject: [PATCH 047/815] Update drawerlayout library --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 112bd108bd..7ad7cb9a57 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ android { dependencies { implementation "androidx.annotation:annotation:1.1.0" implementation "androidx.viewpager:viewpager:1.0.0" - implementation "androidx.drawerlayout:drawerlayout:1.0.0" + implementation "androidx.drawerlayout:drawerlayout:1.1.0" implementation project(":terminal-view") } From b486d29d2342583dbaad42787ae47cd7a8d499b4 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 14 Aug 2020 14:50:34 +0300 Subject: [PATCH 048/815] fix RUN_COMMAND permission description See https://github.com/termux/termux-app/issues/1713. --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d3a16a54ed..ff6fcc203e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,7 +3,7 @@ Termux Termux user Run commands in Termux environment - Allow third-party applications to execute arbitrary commands within Termux environment. + execute arbitrary commands within Termux environment New session Failsafe Keyboard From 784affe39cf609bf1d062e6163be8b39e6ed2aa9 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 14 Aug 2020 15:03:14 +0300 Subject: [PATCH 049/815] linter: fix wakelock log tag See https://github.com/termux/termux-app/issues/1670. --- app/src/main/java/com/termux/app/TermuxService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/TermuxService.java b/app/src/main/java/com/termux/app/TermuxService.java index 514910b3bf..955ce8656b 100644 --- a/app/src/main/java/com/termux/app/TermuxService.java +++ b/app/src/main/java/com/termux/app/TermuxService.java @@ -106,7 +106,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { } else if (ACTION_LOCK_WAKE.equals(action)) { if (mWakeLock == null) { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, EmulatorDebug.LOG_TAG); + mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, EmulatorDebug.LOG_TAG + ":service-wakelock"); mWakeLock.acquire(); // http://tools.android.com/tech-docs/lint-in-studio-2-3#TOC-WifiManager-Leak From db2f50c76e61b25d5ff17168407d17f3c05aec71 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 14 Aug 2020 15:08:32 +0300 Subject: [PATCH 050/815] extra keys: use TextUtils.join instead of String.join String.join() is available only on Android API 26+ but our current minimal is 24. See https://github.com/termux/termux-app/issues/1670. --- app/src/main/java/com/termux/app/ExtraKeysInfos.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysInfos.java b/app/src/main/java/com/termux/app/ExtraKeysInfos.java index 86d97449bc..1274c22441 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysInfos.java +++ b/app/src/main/java/com/termux/app/ExtraKeysInfos.java @@ -1,5 +1,7 @@ package com.termux.app; +import android.text.TextUtils; + import androidx.annotation.Nullable; import org.json.JSONArray; @@ -305,7 +307,7 @@ public ExtraKeyButton(ExtraKeysInfos.CharDisplayMap charDisplayMap, JSONObject c keys[i] = ExtraKeysInfos.replaceAlias(keys[i]); } - this.key = String.join(" ", keys); + this.key = TextUtils.join(" ", keys); String displayFromConfig = config.optString("display", null); if (displayFromConfig != null) { From 531c32f3c91b9ea9edf1c84a0867fbc5de31948e Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sun, 16 Aug 2020 22:56:55 +0300 Subject: [PATCH 051/815] CI: do builds for android-10 branch --- .github/workflows/debug_build.yml | 2 ++ .github/workflows/gradle-wrapper-validation.yml | 2 ++ .github/workflows/run_tests.yml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/.github/workflows/debug_build.yml b/.github/workflows/debug_build.yml index 47ba0edd86..0aa761a713 100644 --- a/.github/workflows/debug_build.yml +++ b/.github/workflows/debug_build.yml @@ -4,9 +4,11 @@ on: push: branches: - master + - android-10 pull_request: branches: - master + - android-10 jobs: build: diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml index 13dca3db33..7c8edafc63 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -4,9 +4,11 @@ on: push: branches: - master + - android-10 pull_request: branches: - master + - android-10 jobs: validation: diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 87ccc68611..2647499554 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -4,9 +4,11 @@ on: push: branches: - master + - android-10 pull_request: branches: - master + - android-10 jobs: testing: From ba9c118b5029895b5aa36c3aec96be0dab68f638 Mon Sep 17 00:00:00 2001 From: blackcat-917 <53786619+blackcat-917@users.noreply.github.com> Date: Fri, 21 Aug 2020 23:17:45 +0200 Subject: [PATCH 052/815] readme: fix a copy-paste typo (#1720) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f1db39db24..3cf831b390 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ terminal emulation). For the packages installable inside the app, see ## Installation -Termux:Widget application can be obtained from: +Termux application can be obtained from: - [Google Play](https://play.google.com/store/apps/details?id=com.termux) - [F-Droid](https://f-droid.org/en/packages/com.termux/) From 382da7e8f7374d9c073abe0a6ad94c0174830074 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 26 Aug 2020 20:04:17 +0300 Subject: [PATCH 053/815] terminal view: provide a workaroud for issue with some keyboards Issue https://github.com/termux/termux-app/issues/686. Note that there can be a better workaround which I don't know... --- .../java/com/termux/view/TerminalView.java | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index 76f6380ef8..b612c5107c 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -44,6 +44,12 @@ import com.termux.terminal.TerminalSession; import com.termux.terminal.WcWidth; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Properties; + /** View displaying and interacting with a {@link TerminalSession}. */ public final class TerminalView extends View { @@ -246,14 +252,36 @@ public boolean attachSession(TerminalSession session) { @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { - // Using InputType.NULL is the most correct input type and avoids issues with other hacks. - // - // Previous keyboard issues: - // https://github.com/termux/termux-packages/issues/25 - // https://github.com/termux/termux-app/issues/87. - // https://github.com/termux/termux-app/issues/126. - // https://github.com/termux/termux-app/issues/137 (japanese chars and TYPE_NULL). - outAttrs.inputType = InputType.TYPE_NULL; + File propsFile = new File(getContext().getFilesDir() + "/home/.termux/termux.properties"); + if (!propsFile.exists()) + propsFile = new File(getContext().getFilesDir() + "/home/.config/termux/termux.properties"); + + Properties props = new Properties(); + try { + if (propsFile.isFile() && propsFile.canRead()) { + try (FileInputStream in = new FileInputStream(propsFile)) { + props.load(new InputStreamReader(in, StandardCharsets.UTF_8)); + } + } + } catch (Exception e) { + Log.e("termux", "Error loading props", e); + } + + if (props.getProperty("enforce-char-based-input", "false").equals("true")) { + // Some keyboards seems do not reset the internal state on TYPE_NULL. + // Affects mostly Samsung stock keyboards. + // https://github.com/termux/termux-app/issues/686 + outAttrs.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + } else { + // Using InputType.NULL is the most correct input type and avoids issues with other hacks. + // + // Previous keyboard issues: + // https://github.com/termux/termux-packages/issues/25 + // https://github.com/termux/termux-app/issues/87. + // https://github.com/termux/termux-app/issues/126. + // https://github.com/termux/termux-app/issues/137 (japanese chars and TYPE_NULL). + outAttrs.inputType = InputType.TYPE_NULL; + } // Note that IME_ACTION_NONE cannot be used as that makes it impossible to input newlines using the on-screen // keyboard on Android TV (see https://github.com/termux/termux-app/issues/221). From b95823d7a8ff5a48751eacdcd3c4f0f9cb503af7 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 26 Aug 2020 20:27:47 +0300 Subject: [PATCH 054/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7ad7cb9a57..a3bb45e2f8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 27 - downloadBootstrap("aarch64", "517fb3aa215f7b96961f9377822d7f1b5e86c831efb4ab096ed65d0b1cdf02e9", version) - downloadBootstrap("arm", "94d17183afdd017cf8ab885b9103a370b16bec1d3cb641884511d545ee009b90", version) - downloadBootstrap("i686", "7f27723d2f0afbe7e90f203b3ca2e80871a8dfa08b136229476aa5e7ba3e988f", version) - downloadBootstrap("x86_64", "b19b2721bae5fb3a3fb0754c49611ce4721221e1e7997e7fd98940776ad88c3d", version) + def version = 28 + downloadBootstrap("aarch64", "8f8c8af1d6c50bd0d6ecd5a1df8d5b0c3122a945b6febd0de0308504b4075ed0", version) + downloadBootstrap("arm", "179465f403a73fec6534363b11cb38eed3b6b3d8e9d922d8e55dc8a06813240d", version) + downloadBootstrap("i686", "2100ebf36befde73b08efaa7e3ccc9c218a8b5e7d69db06e16e364ab8b7dfbd5", version) + downloadBootstrap("x86_64", "3f5192f63595426370aa69f102fac07ae00c12154878eddec24e8406e640a67f", version) } } From a108b2bd6b9cfdf58be80326003d6fbd59e82bce Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 26 Aug 2020 20:40:29 +0300 Subject: [PATCH 055/815] gradle 6.6.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- gradlew.bat | 21 +++------------------ 4 files changed, 5 insertions(+), 20 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch delta 6656 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 Yte!%o?r4GTrVtxD61Ym!|5fq-1K$0e!T1w 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bb8b2fc26b..12d38de6a4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index fbd7c51583..4f906e0c81 100755 --- a/gradlew +++ b/gradlew @@ -130,7 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index a9f778a7a9..ac1b06f938 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +64,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From 850faa25ddad64c82a5768ff921c2cc1bb71bc34 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 26 Aug 2020 20:51:05 +0300 Subject: [PATCH 056/815] version 0.99 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a3bb45e2f8..b23556e12a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion project.properties.minSdkVersion.toInteger() targetSdkVersion project.properties.targetSdkVersion.toInteger() - versionCode 98 - versionName "0.98" + versionCode 99 + versionName "0.99" externalNativeBuild { ndkBuild { From cba80b6c0b29525536b52bdddd02845833d6cf15 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 1 Sep 2020 03:38:53 +0300 Subject: [PATCH 057/815] add gradle distribution sha256 --- gradle/wrapper/gradle-wrapper.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 12d38de6a4..590ccdcb9a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip +distributionSha256Sum=7873ed5287f47ca03549ab8dcb6dc877ac7f0e3d7b1eb12685161d10080910ac zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 216cc10f3c679335dbe4c4a2e09bb4e85e395370 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sat, 12 Sep 2020 19:05:46 +0000 Subject: [PATCH 058/815] Revert "add gradle distribution sha256" Was initially added to try fix F-Droid builds but appears missing distribution sha256 is not a cause of the issue. F-Droid maintains own set of Gradle SHA-256 checksums. This reverts commit cba80b6c0b29525536b52bdddd02845833d6cf15. --- gradle/wrapper/gradle-wrapper.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 590ccdcb9a..12d38de6a4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip -distributionSha256Sum=7873ed5287f47ca03549ab8dcb6dc877ac7f0e3d7b1eb12685161d10080910ac zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 8faa5b21515851cd2d8dfcae109abace80b49701 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Sat, 12 Sep 2020 21:23:33 +0200 Subject: [PATCH 059/815] TerminalEmulator: fix bug in DECRQM handling Reported in https://github.com/termux/termux-app/issues/1752 --- .../src/main/java/com/termux/terminal/TerminalEmulator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java index 4e74b9e5f5..6aae59a319 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -748,7 +748,7 @@ public void processCodePoint(int b) { value = (mScreen == mAltBuffer) ? 1 : 2; } else { int internalBit = mapDecSetBitToInternalBit(mode); - if (internalBit == -1) { + if (internalBit != -1) { value = isDecsetInternalBitSet(internalBit) ? 1 : 2; // 1=set, 2=reset. } else { Log.e(EmulatorDebug.LOG_TAG, "Got DECRQM for unrecognized private DEC mode=" + mode); From f91168eff44d528e82588b7e6d9f786a1ba0a1bc Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Fri, 18 Sep 2020 22:20:23 +0500 Subject: [PATCH 060/815] Fix issue where termux crashes occasionally in android >= 8 because "startForeground()" function is not being called before running "startForegroundService()" in RunCommandService. --- .../com/termux/app/RunCommandService.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/app/src/main/java/com/termux/app/RunCommandService.java b/app/src/main/java/com/termux/app/RunCommandService.java index 2a57864d89..d4af178b27 100644 --- a/app/src/main/java/com/termux/app/RunCommandService.java +++ b/app/src/main/java/com/termux/app/RunCommandService.java @@ -1,6 +1,10 @@ package com.termux.app; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.app.Service; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Binder; @@ -8,6 +12,8 @@ import android.os.IBinder; import android.util.Log; +import com.termux.R; + import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; @@ -50,6 +56,9 @@ public class RunCommandService extends Service { public static final String RUN_COMMAND_WORKDIR = "com.termux.RUN_COMMAND_WORKDIR"; public static final String RUN_COMMAND_BACKGROUND = "com.termux.RUN_COMMAND_BACKGROUND"; + private static final String NOTIFICATION_CHANNEL_ID = "termux_run_command_notification_channel"; + private static final int NOTIFICATION_ID = 1338; + class LocalBinder extends Binder { public final RunCommandService service = RunCommandService.this; } @@ -61,7 +70,15 @@ public IBinder onBind(Intent intent) { return mBinder; } + @Override + public void onCreate() { + runStartForeground(); + } + public int onStartCommand(Intent intent, int flags, int startId) { + // Run again in case service is already started and onCreate() is not called + runStartForeground(); + if (allowExternalApps() && RUN_COMMAND_ACTION.equals(intent.getAction())) { Uri programUri = new Uri.Builder().scheme("com.termux.file").path(intent.getStringExtra(RUN_COMMAND_PATH)).build(); @@ -78,9 +95,56 @@ public int onStartCommand(Intent intent, int flags, int startId) { } } + runStopForeground(); + return Service.START_NOT_STICKY; } + private void runStartForeground() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + setupNotificationChannel(); + startForeground(NOTIFICATION_ID, buildNotification()); + } + } + + private void runStopForeground() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + stopForeground(true); + } + } + + private Notification buildNotification() { + Notification.Builder builder = new Notification.Builder(this); + builder.setContentTitle(getText(R.string.application_name) + " Run Command"); + builder.setSmallIcon(R.drawable.ic_service_notification); + + // Use a low priority: + builder.setPriority(Notification.PRIORITY_LOW); + + // No need to show a timestamp: + builder.setShowWhen(false); + + // Background color for small notification icon: + builder.setColor(0xFF607D8B); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + builder.setChannelId(NOTIFICATION_CHANNEL_ID); + } + + return builder.build(); + } + + private void setupNotificationChannel() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; + + String channelName = "Termux Run Command"; + int importance = NotificationManager.IMPORTANCE_LOW; + + NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, importance); + NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + manager.createNotificationChannel(channel); + } + private boolean allowExternalApps() { File propsFile = new File(TermuxService.HOME_PATH + "/.termux/termux.properties"); if (!propsFile.exists()) From 52ce6cc94bbe59dc8d95cae00e83a2c663963ee3 Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Fri, 18 Sep 2020 22:21:31 +0500 Subject: [PATCH 061/815] Add support for "$PREFIX/" and "~/" prefix in "RUN_COMMAND" intent extras for paths. --- .../java/com/termux/app/RunCommandService.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/app/RunCommandService.java b/app/src/main/java/com/termux/app/RunCommandService.java index d4af178b27..e0e9b55d99 100644 --- a/app/src/main/java/com/termux/app/RunCommandService.java +++ b/app/src/main/java/com/termux/app/RunCommandService.java @@ -80,12 +80,12 @@ public int onStartCommand(Intent intent, int flags, int startId) { runStartForeground(); if (allowExternalApps() && RUN_COMMAND_ACTION.equals(intent.getAction())) { - Uri programUri = new Uri.Builder().scheme("com.termux.file").path(intent.getStringExtra(RUN_COMMAND_PATH)).build(); + Uri programUri = new Uri.Builder().scheme("com.termux.file").path(parsePath(intent.getStringExtra(RUN_COMMAND_PATH))).build(); Intent execIntent = new Intent(TermuxService.ACTION_EXECUTE, programUri); execIntent.setClass(this, TermuxService.class); execIntent.putExtra(TermuxService.EXTRA_ARGUMENTS, intent.getStringArrayExtra(RUN_COMMAND_ARGUMENTS)); - execIntent.putExtra(TermuxService.EXTRA_CURRENT_WORKING_DIRECTORY, intent.getStringExtra(RUN_COMMAND_WORKDIR)); + execIntent.putExtra(TermuxService.EXTRA_CURRENT_WORKING_DIRECTORY, parsePath(intent.getStringExtra(RUN_COMMAND_WORKDIR))); execIntent.putExtra(TermuxService.EXTRA_EXECUTE_IN_BACKGROUND, intent.getBooleanExtra(RUN_COMMAND_BACKGROUND, false)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -163,4 +163,14 @@ private boolean allowExternalApps() { return props.getProperty("allow-external-apps", "false").equals("true"); } + + /** Replace "$PREFIX/" or "~/" prefix with termux absolute paths */ + private String parsePath(String path) { + if(path != null && !path.isEmpty()) { + path = path.replaceAll("^\\$PREFIX\\/", TermuxService.PREFIX_PATH + "/"); + path = path.replaceAll("^~\\/", TermuxService.HOME_PATH + "/"); + } + + return path; + } } From 9aae665bfca0ea401ef4582165c3686d347ef9d7 Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Fri, 18 Sep 2020 22:21:58 +0500 Subject: [PATCH 062/815] Fix issue where termux session does not come to foreground automatically in android >= 10 unless user manually clicks termux notification for "RUN_COMMAND" intents and "Termux:Tasker" plugin actions that have background mode "false" because of new restrictions of starting activities from background. This is done by adding "android.permission.SYSTEM_ALERT_WINDOW" permission in AndroidManifest.xml so that the user may optionally grant "Draw Over Apps" permission to termux to fix the issue. --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b293037649..2347586652 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,6 +21,7 @@ + Date: Fri, 18 Sep 2020 22:22:35 +0500 Subject: [PATCH 063/815] Update RunCommandService docs. --- .../java/com/termux/app/RunCommandService.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/app/RunCommandService.java b/app/src/main/java/com/termux/app/RunCommandService.java index e0e9b55d99..4ade0fdcd1 100644 --- a/app/src/main/java/com/termux/app/RunCommandService.java +++ b/app/src/main/java/com/termux/app/RunCommandService.java @@ -26,9 +26,21 @@ * * Third-party program must declare com.termux.permission.RUN_COMMAND permission and it should be * granted by user. - * Full path of command or script must be given in "RUN_COMMAND_PATH" extra. + * + * Absolute path of command or script must be given in "RUN_COMMAND_PATH" extra. * The "RUN_COMMAND_ARGUMENTS", "RUN_COMMAND_WORKDIR" and "RUN_COMMAND_BACKGROUND" extras are - * optional. The background mode defaults to false. + * optional. The workdir defaults to termux home. The background mode defaults to "false". + * The command path and workdir can optionally be prefixed with "$PREFIX/" or "~/" if an absolute + * path is not to be given. + * + * To automatically bring to foreground and start termux commands that were started with + * background mode "false" in android >= 10 without user having to click the notification manually, + * requires termux to be granted draw over apps permission due to new restrictions + * of starting activities from the background, this also applies to Termux:Tasker plugin. + * + * To reduce the chance of termux being killed by android even further due to violation of not + * being able to call startForeground() within ~5s of service start in android >= 8, the user + * may disable battery optimizations for termux. * * Sample code to run command "top" with java: * Intent intent = new Intent(); From 7063a3a9da3cc1534c190b79ecf40b144fd6663f Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Fri, 18 Sep 2020 22:25:05 +0500 Subject: [PATCH 064/815] Add @override annotation to onStartCommand() function of RunCommandService. --- app/src/main/java/com/termux/app/RunCommandService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/termux/app/RunCommandService.java b/app/src/main/java/com/termux/app/RunCommandService.java index 4ade0fdcd1..8079091a85 100644 --- a/app/src/main/java/com/termux/app/RunCommandService.java +++ b/app/src/main/java/com/termux/app/RunCommandService.java @@ -87,6 +87,7 @@ public void onCreate() { runStartForeground(); } + @Override public int onStartCommand(Intent intent, int flags, int startId) { // Run again in case service is already started and onCreate() is not called runStartForeground(); From 665adb68950d9490e2927068798d6650ff1566a2 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Mon, 28 Sep 2020 00:46:38 +0300 Subject: [PATCH 065/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b23556e12a..0ee0a0b405 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 28 - downloadBootstrap("aarch64", "8f8c8af1d6c50bd0d6ecd5a1df8d5b0c3122a945b6febd0de0308504b4075ed0", version) - downloadBootstrap("arm", "179465f403a73fec6534363b11cb38eed3b6b3d8e9d922d8e55dc8a06813240d", version) - downloadBootstrap("i686", "2100ebf36befde73b08efaa7e3ccc9c218a8b5e7d69db06e16e364ab8b7dfbd5", version) - downloadBootstrap("x86_64", "3f5192f63595426370aa69f102fac07ae00c12154878eddec24e8406e640a67f", version) + def version = 29 + downloadBootstrap("aarch64", "1b67ba2302efc20952c00d607a3a169e86cf8ecb66b0c6e16bee9997289119e1", version) + downloadBootstrap("arm", "0dd87a5902b6b7ee4d4499a10da99a3ea605ba020ad1cc77cad16b3267ac13c2", version) + downloadBootstrap("i686", "66cf79273a2ee87730010febe258bec02abf4c4d4c6f89b1b174619baa3c5a0e", version) + downloadBootstrap("x86_64", "e9541c02e4e7df4860d76098e4f477e09952ae65323216f692d668425842bf00", version) } } From 25523ae2248541c355096022e17690bda83ca2cd Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Mon, 28 Sep 2020 00:52:44 +0300 Subject: [PATCH 066/815] fix bootstrap archive checksum for arm Due to leading zero issues, SHA-256 checksum for ARM variant will have 63 characters instead of correct 64... --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0ee0a0b405..f3f14ba4aa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -135,7 +135,7 @@ task downloadBootstraps(){ doLast { def version = 29 downloadBootstrap("aarch64", "1b67ba2302efc20952c00d607a3a169e86cf8ecb66b0c6e16bee9997289119e1", version) - downloadBootstrap("arm", "0dd87a5902b6b7ee4d4499a10da99a3ea605ba020ad1cc77cad16b3267ac13c2", version) + downloadBootstrap("arm", "dd87a5902b6b7ee4d4499a10da99a3ea605ba020ad1cc77cad16b3267ac13c2", version) downloadBootstrap("i686", "66cf79273a2ee87730010febe258bec02abf4c4d4c6f89b1b174619baa3c5a0e", version) downloadBootstrap("x86_64", "e9541c02e4e7df4860d76098e4f477e09952ae65323216f692d668425842bf00", version) } From af95a99854247da901c3b8170aed7257e5285ae0 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Mon, 28 Sep 2020 00:59:52 +0300 Subject: [PATCH 067/815] version 0.100 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f3f14ba4aa..c38b79dce5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion project.properties.minSdkVersion.toInteger() targetSdkVersion project.properties.targetSdkVersion.toInteger() - versionCode 99 - versionName "0.99" + versionCode 100 + versionName "0.100" externalNativeBuild { ndkBuild { From 63bfe9584883f792d933304fe8cb35c2cd96560a Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Mon, 28 Sep 2020 03:28:49 +0300 Subject: [PATCH 068/815] update bootstrap archives again Fixes faulty dpkg https://github.com/termux/termux-packages/issues/5858. --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c38b79dce5..92ed30fa2f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 29 - downloadBootstrap("aarch64", "1b67ba2302efc20952c00d607a3a169e86cf8ecb66b0c6e16bee9997289119e1", version) - downloadBootstrap("arm", "dd87a5902b6b7ee4d4499a10da99a3ea605ba020ad1cc77cad16b3267ac13c2", version) - downloadBootstrap("i686", "66cf79273a2ee87730010febe258bec02abf4c4d4c6f89b1b174619baa3c5a0e", version) - downloadBootstrap("x86_64", "e9541c02e4e7df4860d76098e4f477e09952ae65323216f692d668425842bf00", version) + def version = 30 + downloadBootstrap("aarch64", "7a90034285c614d23fa450547a5e2aec77d4242c9891ad662bf0c6fd3bd7ef4e", version) + downloadBootstrap("arm", "f030869ce9a43f84d88560d7ac5153ee4f7e517bca0b37ab01df3e1acba0fe37", version) + downloadBootstrap("i686", "1ea9b63f21602231140d58a5545cfbc6bc2ded56ef2b3c31cba2759d913eef00", version) + downloadBootstrap("x86_64", "a50eb8a4dd02b7898bbd4a9653a25c14b56c1737409ce7f64110fd33c2c69382", version) } } From 5b6fd9b88c3bebb68b88a187e8a5d31012037088 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Mon, 28 Sep 2020 03:30:21 +0300 Subject: [PATCH 069/815] version 0.101 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 92ed30fa2f..a27be57c0a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion project.properties.minSdkVersion.toInteger() targetSdkVersion project.properties.targetSdkVersion.toInteger() - versionCode 100 - versionName "0.100" + versionCode 101 + versionName "0.101" externalNativeBuild { ndkBuild { From 564079c7e939b356ed0347661e3333e76f2baaae Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Thu, 1 Oct 2020 01:08:39 +0300 Subject: [PATCH 070/815] update .gitattributes --- .gitattributes | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index f74a80db47..21c2769ab9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,5 @@ -* text=auto -*.bat eol=crlf -*.sh eol=lf +* text=auto +*.bat eol=crlf +*.gradle eol=lf +*.mk eol=lf +*.sh eol=lf From 8c80efb904b023cfafab23083df8d5881f201dd3 Mon Sep 17 00:00:00 2001 From: Fabian Henneke Date: Tue, 21 Jul 2020 12:28:48 +0200 Subject: [PATCH 071/815] Add an "Autofill password" context menu action --- .../java/com/termux/app/TermuxActivity.java | 16 +++++++++++++ app/src/main/res/layout/drawer_layout.xml | 4 +++- app/src/main/res/values/strings.xml | 1 + .../java/com/termux/view/TerminalView.java | 23 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 129895394b..593c7726b5 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -38,6 +38,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.autofill.AutofillManager; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.EditText; @@ -92,6 +93,7 @@ public final class TermuxActivity extends Activity implements ServiceConnection private static final int CONTEXTMENU_STYLING_ID = 6; private static final int CONTEXTMENU_HELP_ID = 8; private static final int CONTEXTMENU_TOGGLE_KEEP_SCREEN_ON = 9; + private static final int CONTEXTMENU_AUTOFILL_ID = 10; private static final int MAX_SESSIONS = 8; @@ -655,6 +657,12 @@ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuIn menu.add(Menu.NONE, CONTEXTMENU_SELECT_URL_ID, Menu.NONE, R.string.select_url); menu.add(Menu.NONE, CONTEXTMENU_SHARE_TRANSCRIPT_ID, Menu.NONE, R.string.select_all_and_share); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + AutofillManager autofillManager = getSystemService(AutofillManager.class); + if (autofillManager != null && autofillManager.isEnabled()) { + menu.add(Menu.NONE, CONTEXTMENU_AUTOFILL_ID, Menu.NONE, R.string.autofill_password); + } + } menu.add(Menu.NONE, CONTEXTMENU_RESET_TERMINAL_ID, Menu.NONE, R.string.reset_terminal); menu.add(Menu.NONE, CONTEXTMENU_KILL_PROCESS_ID, Menu.NONE, getResources().getString(R.string.kill_process, getCurrentTermSession().getPid())).setEnabled(currentSession.isRunning()); menu.add(Menu.NONE, CONTEXTMENU_STYLING_ID, Menu.NONE, R.string.style_terminal); @@ -870,6 +878,14 @@ public boolean onContextItemSelected(MenuItem item) { } return true; } + case CONTEXTMENU_AUTOFILL_ID: { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + AutofillManager autofillManager = getSystemService(AutofillManager.class); + if (autofillManager != null && autofillManager.isEnabled()) { + autofillManager.requestAutofill(mTerminalView); + } + } + } default: return super.onContextItemSelected(item); } diff --git a/app/src/main/res/layout/drawer_layout.xml b/app/src/main/res/layout/drawer_layout.xml index c5117f14db..71d36996da 100644 --- a/app/src/main/res/layout/drawer_layout.xml +++ b/app/src/main/res/layout/drawer_layout.xml @@ -19,7 +19,9 @@ android:layout_marginLeft="3dp" android:focusableInTouchMode="true" android:scrollbarThumbVertical="@drawable/terminal_scroll_shape" - android:scrollbars="vertical" /> + android:scrollbars="vertical" + android:importantForAutofill="no" + android:autofillHints="password" /> Terminal transcript Help Keep screen on + Autofill password Installing… Unable to install diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index b612c5107c..301f33fe3b 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -31,12 +31,15 @@ import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; +import android.view.autofill.AutofillValue; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.widget.PopupWindow; import android.widget.Scroller; +import androidx.annotation.RequiresApi; + import com.termux.terminal.EmulatorDebug; import com.termux.terminal.KeyHandler; import com.termux.terminal.TerminalBuffer; @@ -1540,4 +1543,24 @@ private void updateFloatingToolbarVisibility(MotionEvent event) { } } } + + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public void autofill(AutofillValue value) { + if (value.isText()) { + mTermSession.write(value.getTextValue().toString()); + } + } + + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public int getAutofillType() { + return AUTOFILL_TYPE_TEXT; + } + + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public AutofillValue getAutofillValue() { + return AutofillValue.forText(""); + } } From dfc4595ec53139bd32ead2069850a8e7064e6cec Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Fri, 2 Oct 2020 10:30:18 +0200 Subject: [PATCH 072/815] version 0.102 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a27be57c0a..52a6c8d714 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion project.properties.minSdkVersion.toInteger() targetSdkVersion project.properties.targetSdkVersion.toInteger() - versionCode 101 - versionName "0.101" + versionCode 102 + versionName "0.102" externalNativeBuild { ndkBuild { From ad64dd7c3dcec93d94c135fee4bab5e90965a72b Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Mon, 12 Oct 2020 20:39:28 +0300 Subject: [PATCH 073/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 52a6c8d714..ac5df08627 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 30 - downloadBootstrap("aarch64", "7a90034285c614d23fa450547a5e2aec77d4242c9891ad662bf0c6fd3bd7ef4e", version) - downloadBootstrap("arm", "f030869ce9a43f84d88560d7ac5153ee4f7e517bca0b37ab01df3e1acba0fe37", version) - downloadBootstrap("i686", "1ea9b63f21602231140d58a5545cfbc6bc2ded56ef2b3c31cba2759d913eef00", version) - downloadBootstrap("x86_64", "a50eb8a4dd02b7898bbd4a9653a25c14b56c1737409ce7f64110fd33c2c69382", version) + def version = 31 + downloadBootstrap("aarch64", "e9149cb01735f04b180434093dfb8e703015f8a66044acaead7cbff1e536a990", version) + downloadBootstrap("arm", "8e5776074c58b3e94b1336f2ec0e840057fce9c089faee6683ae5c136441da7b", version) + downloadBootstrap("i686", "f89be9d0197fb9c6b498922ff0f95562fd17b63c934617858f959b8e452ade27", version) + downloadBootstrap("x86_64", "9aa97647afc085fae4e8485458a7d15f23db6e1e3601727f014af8b8eb4519a9", version) } } From 2f04a6186b105d88e8f315cab110162ca3590343 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 17 Nov 2020 20:03:10 +0200 Subject: [PATCH 074/815] add READ_LOGS permission * https://github.com/termux/termux-app/issues/873 * https://github.com/termux/termux-app/issues/1821 --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2347586652..51147f14a1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,6 +22,7 @@ + Date: Tue, 17 Nov 2020 20:07:24 +0200 Subject: [PATCH 075/815] add permission WRITE_SECURE_SETTINGS https://github.com/termux/termux-api/issues/211 --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 51147f14a1..33d0ede61f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + Date: Tue, 17 Nov 2020 20:35:55 +0200 Subject: [PATCH 076/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ac5df08627..8fa1fc96f1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 31 - downloadBootstrap("aarch64", "e9149cb01735f04b180434093dfb8e703015f8a66044acaead7cbff1e536a990", version) - downloadBootstrap("arm", "8e5776074c58b3e94b1336f2ec0e840057fce9c089faee6683ae5c136441da7b", version) - downloadBootstrap("i686", "f89be9d0197fb9c6b498922ff0f95562fd17b63c934617858f959b8e452ade27", version) - downloadBootstrap("x86_64", "9aa97647afc085fae4e8485458a7d15f23db6e1e3601727f014af8b8eb4519a9", version) + def version = 32 + downloadBootstrap("aarch64", "8cce8a916a3a8db38f7d1880b697708662fb9b555b35098c8c3b8ee1639a847b", version) + downloadBootstrap("arm", "f313b819e90c7bedf3b45941d8a64c0cec73e2c2b8030a00565306d3011f25cc", version) + downloadBootstrap("i686", "89ff9d63f9bccfbc1406b70fe1c9a18b124456772ebb3fe0078ecdb2bc21acae", version) + downloadBootstrap("x86_64", "37e07f73592adbab5bfe2a5185f56b29f9e331aa172d13f0d57bdb2c0ef62d69", version) } } From e1f799f9a1f9e4dd8eaab4c8b3205b73c7455424 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 17 Nov 2020 20:40:40 +0200 Subject: [PATCH 077/815] version 0.103 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8fa1fc96f1..09aee06c90 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion project.properties.minSdkVersion.toInteger() targetSdkVersion project.properties.targetSdkVersion.toInteger() - versionCode 102 - versionName "0.102" + versionCode 103 + versionName "0.103" externalNativeBuild { ndkBuild { From 20aac6aa72e958b9ef61eb6d8e58ca81e7793551 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 18 Nov 2020 03:04:38 +0200 Subject: [PATCH 078/815] copy FUNDING.yml from termux-packages repo --- .github/FUNDING.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..7871554d6e --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +patreon: termux +custom: https://paypal.me/fornwall From 4066c5df4214e14b256af7d989b3edd43371a684 Mon Sep 17 00:00:00 2001 From: Lucy Phipps Date: Tue, 24 Nov 2020 19:01:02 +0000 Subject: [PATCH 079/815] don't add $PREFIX/bin/applets to $PATH busybox doesn't use that folder anymore, and is deprecated anyway --- app/src/main/java/com/termux/app/BackgroundJob.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/BackgroundJob.java b/app/src/main/java/com/termux/app/BackgroundJob.java index 657cce7df6..3df100260d 100644 --- a/app/src/main/java/com/termux/app/BackgroundJob.java +++ b/app/src/main/java/com/termux/app/BackgroundJob.java @@ -161,7 +161,7 @@ static String[] buildEnvironment(boolean failSafe, String cwd) { environment.add("PATH= " + System.getenv("PATH")); } else { environment.add("LANG=en_US.UTF-8"); - environment.add("PATH=" + TermuxService.PREFIX_PATH + "/bin:" + TermuxService.PREFIX_PATH + "/bin/applets"); + environment.add("PATH=" + TermuxService.PREFIX_PATH + "/bin"); environment.add("PWD=" + cwd); environment.add("TMPDIR=" + TermuxService.PREFIX_PATH + "/tmp"); } From 8925ae67bb0fe4b6f96aff94a95ca0dbb80d3835 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 11 Dec 2020 17:35:28 +0200 Subject: [PATCH 080/815] update readme --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 3cf831b390..291a96c6e6 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,15 @@ Note that this repository is for the app itself (the user interface and the terminal emulation). For the packages installable inside the app, see [termux/termux-packages](https://github.com/termux/termux-packages) +*** + +**@termux is looking for Termux Application maintainer for implementing new features +fixing bugs and reviewing pull requests since current one (@fornwall) is inactive.** + +Issue https://github.com/termux/termux-app/issues/1072 needs extra attention. + +*** + ## Installation Termux application can be obtained from: From 2820f6a7b8b8ca9e28306f5de01ef745cda61bc1 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 11 Dec 2020 17:36:14 +0200 Subject: [PATCH 081/815] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 291a96c6e6..8f43c191e4 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ terminal emulation). For the packages installable inside the app, see *** -**@termux is looking for Termux Application maintainer for implementing new features +**@termux is looking for Termux Application maintainer for implementing new features, fixing bugs and reviewing pull requests since current one (@fornwall) is inactive.** Issue https://github.com/termux/termux-app/issues/1072 needs extra attention. From 1b3283bd69610b509733aac49ef0c758c4e9a73c Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Fri, 11 Dec 2020 20:07:40 +0200 Subject: [PATCH 082/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 09aee06c90..063ec219e4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 32 - downloadBootstrap("aarch64", "8cce8a916a3a8db38f7d1880b697708662fb9b555b35098c8c3b8ee1639a847b", version) - downloadBootstrap("arm", "f313b819e90c7bedf3b45941d8a64c0cec73e2c2b8030a00565306d3011f25cc", version) - downloadBootstrap("i686", "89ff9d63f9bccfbc1406b70fe1c9a18b124456772ebb3fe0078ecdb2bc21acae", version) - downloadBootstrap("x86_64", "37e07f73592adbab5bfe2a5185f56b29f9e331aa172d13f0d57bdb2c0ef62d69", version) + def version = 33 + downloadBootstrap("aarch64", "e8dbab424774db8d6cb3d85836dd910855aaef15bbd50e6a0fae6dc6587f7e66", version) + downloadBootstrap("arm", "19c496bc9a867d8b6fac536d4bd518ff288dd381fa89544136051710f7651db3", version) + downloadBootstrap("i686", "109fd6ca643a54480233152a7b8f42ed8f9ae5adf6fc4da6db4966632df3a180", version) + downloadBootstrap("x86_64", "e1182fd8d3d423ea351b93baf3bc853a25185df002da42725b9a5e09a30dfda1", version) } } From 6b0d531758358b70cc5235488ef6ee7d2d3ea657 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Thu, 17 Dec 2020 20:27:20 +0200 Subject: [PATCH 083/815] Revert "update readme" --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 8f43c191e4..3cf831b390 100644 --- a/README.md +++ b/README.md @@ -14,15 +14,6 @@ Note that this repository is for the app itself (the user interface and the terminal emulation). For the packages installable inside the app, see [termux/termux-packages](https://github.com/termux/termux-packages) -*** - -**@termux is looking for Termux Application maintainer for implementing new features, -fixing bugs and reviewing pull requests since current one (@fornwall) is inactive.** - -Issue https://github.com/termux/termux-app/issues/1072 needs extra attention. - -*** - ## Installation Termux application can be obtained from: From 5ca67dd8851b5631703ea24866fde97e24781874 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 29 Dec 2020 13:40:25 +0200 Subject: [PATCH 084/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 063ec219e4..1199864127 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,11 +133,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 33 - downloadBootstrap("aarch64", "e8dbab424774db8d6cb3d85836dd910855aaef15bbd50e6a0fae6dc6587f7e66", version) - downloadBootstrap("arm", "19c496bc9a867d8b6fac536d4bd518ff288dd381fa89544136051710f7651db3", version) - downloadBootstrap("i686", "109fd6ca643a54480233152a7b8f42ed8f9ae5adf6fc4da6db4966632df3a180", version) - downloadBootstrap("x86_64", "e1182fd8d3d423ea351b93baf3bc853a25185df002da42725b9a5e09a30dfda1", version) + def version = 34 + downloadBootstrap("aarch64", "7f56e8ee5573a8351925ff4010c6dea240cd56194ba0b9a686c3d8289859a05", version) + downloadBootstrap("arm", "fa41377fb07cac2e4c15f32f3e7ea8116d60efadc1261176acb42646a71637f0", version) + downloadBootstrap("i686", "61dcae560e706f808e524b8c3b234c47ea0e2bf6c6b0d5edebe53e6fdb956fe1", version) + downloadBootstrap("x86_64", "1b616a4d591809874a06b06f309441320a0b9781e8ef5c148123530303b2533d", version) } } From d267843e36cf6a8039f3f1c50fec2113f4a8a260 Mon Sep 17 00:00:00 2001 From: Kevin LeBlanc Date: Sun, 20 Dec 2020 23:35:32 +0100 Subject: [PATCH 085/815] Don't exclude hidden files from document provider (#1220) Credit to @johnmellor for requesting the document provider in the first place via #79, mentioning this limitation in a comment on that issue, and creating a commit like this one to address it. --- .../com/termux/filepicker/TermuxDocumentsProvider.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/termux/filepicker/TermuxDocumentsProvider.java b/app/src/main/java/com/termux/filepicker/TermuxDocumentsProvider.java index 6a84904033..cbecfd705e 100644 --- a/app/src/main/java/com/termux/filepicker/TermuxDocumentsProvider.java +++ b/app/src/main/java/com/termux/filepicker/TermuxDocumentsProvider.java @@ -91,9 +91,7 @@ public Cursor queryChildDocuments(String parentDocumentId, String[] projection, final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION); final File parent = getFileForDocId(parentDocumentId); for (File file : parent.listFiles()) { - if (!file.getName().startsWith(".")) { - includeFile(result, null, file); - } + includeFile(result, null, file); } return result; } @@ -177,8 +175,7 @@ public Cursor querySearchDocuments(String rootId, String query, String[] project } catch (IOException e) { isInsideHome = true; } - final boolean isHidden = file.getName().startsWith("."); - if (isInsideHome && !isHidden) { + if (isInsideHome) { if (file.isDirectory()) { Collections.addAll(pending, file.listFiles()); } else { From cb13a5a5314f1093a6f828a930aecc448453657c Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Tue, 29 Dec 2020 13:45:18 +0200 Subject: [PATCH 086/815] version 0.104 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1199864127..f503e02c73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion project.properties.minSdkVersion.toInteger() targetSdkVersion project.properties.targetSdkVersion.toInteger() - versionCode 103 - versionName "0.103" + versionCode 104 + versionName "0.104" externalNativeBuild { ndkBuild { From eaea0f74a511c8f54ce636d4e7d53f5f36ae6d78 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Fri, 1 Jan 2021 16:59:59 +0100 Subject: [PATCH 087/815] Fix github links for terminal-{emulator,view} jcenter packages --- terminal-emulator/build.gradle | 4 ++-- terminal-view/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index 4b37b79226..cadd7e5a71 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -11,8 +11,8 @@ ext { libraryName = 'TerminalEmulator' artifact = 'terminal-emulator' libraryDescription = 'The terminal emulator used in Termux' - siteUrl = 'https://github.com/termux/termux' - gitUrl = 'https://github.com/termux/termux.git' + siteUrl = 'https://github.com/termux/termux-app' + gitUrl = 'https://github.com/termux/termux-app.git' libraryVersion = '0.52' } diff --git a/terminal-view/build.gradle b/terminal-view/build.gradle index 6c672ddbdd..791f2f9fdb 100644 --- a/terminal-view/build.gradle +++ b/terminal-view/build.gradle @@ -11,8 +11,8 @@ ext { libraryName = 'TerminalView' artifact = 'terminal-view' libraryDescription = 'The terminal view used in Termux' - siteUrl = 'https://github.com/termux/termux' - gitUrl = 'https://github.com/termux/termux.git' + siteUrl = 'https://github.com/termux/termux-app' + gitUrl = 'https://github.com/termux/termux-app.git' libraryVersion = '0.50' } From 43bbef9a11a483a106dbfab2daf45bd6c62837f2 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Fri, 1 Jan 2021 17:14:04 +0100 Subject: [PATCH 088/815] Update plugins and gradle to latest versions --- app/build.gradle | 6 +++--- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- terminal-emulator/build.gradle | 6 +++--- terminal-view/build.gradle | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f503e02c73..b41d0fa255 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ android { dependencies { implementation "androidx.annotation:annotation:1.1.0" implementation "androidx.viewpager:viewpager:1.0.0" - implementation "androidx.drawerlayout:drawerlayout:1.1.0" + implementation "androidx.drawerlayout:drawerlayout:1.1.1" implementation project(":terminal-view") } @@ -72,8 +72,8 @@ android { } dependencies { - testImplementation 'junit:junit:4.13' - testImplementation 'org.robolectric:robolectric:4.3.1' + testImplementation 'junit:junit:4.13.1' + testImplementation 'org.robolectric:robolectric:4.4' } task versionName { diff --git a/build.gradle b/build.gradle index d803478dbb..82454a202b 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:4.1.1' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 12d38de6a4..4d9ca16491 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index cadd7e5a71..4673ab3e90 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -1,6 +1,6 @@ plugins { - id "com.jfrog.bintray" version "1.7.3" - id "com.github.dcendents.android-maven" version "2.0" + id "com.jfrog.bintray" version "1.8.5" + id "com.github.dcendents.android-maven" version "2.1" } apply plugin: 'com.android.library' @@ -61,7 +61,7 @@ tasks.withType(Test) { } dependencies { - testImplementation 'junit:junit:4.13' + testImplementation 'junit:junit:4.13.1' } apply from: '../scripts/bintray-publish.gradle' diff --git a/terminal-view/build.gradle b/terminal-view/build.gradle index 791f2f9fdb..35a78ad7fb 100644 --- a/terminal-view/build.gradle +++ b/terminal-view/build.gradle @@ -1,6 +1,6 @@ plugins { - id "com.jfrog.bintray" version "1.7.3" - id "com.github.dcendents.android-maven" version "2.0" + id "com.jfrog.bintray" version "1.8.5" + id "com.github.dcendents.android-maven" version "2.1" } apply plugin: 'com.android.library' @@ -44,7 +44,7 @@ android { } dependencies { - testImplementation 'junit:junit:4.13' + testImplementation 'junit:junit:4.13.1' } apply from: '../scripts/bintray-publish.gradle' From 7fe5bd32c8fbca2dae8a99dc43197c329ce748ac Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Fri, 1 Jan 2021 17:14:26 +0100 Subject: [PATCH 089/815] Update ndk to r22 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 945ab5d248..4cb3411fac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,5 +17,5 @@ android.useAndroidX=true minSdkVersion=24 targetSdkVersion=28 -ndkVersion=21.3.6528147 +ndkVersion=22.0.7026061 compileSdkVersion=28 From b1d4c0c7fedcd073623d61aae05ab1340fe4fbb4 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Fri, 1 Jan 2021 17:41:18 +0100 Subject: [PATCH 090/815] app: disable test for "ProtectedPermissions" Needed for tests to pass after READ_LOGS and WRITE_SECURE_SETTINGS were added to AndroidManifest.xml. --- app/build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index b41d0fa255..cc2d6098fd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,6 +64,10 @@ android { } } + lintOptions { + disable 'ProtectedPermissions' + } + testOptions { unitTests { includeAndroidResources = true From fc30eba2477fbe7bf37ad6369d3e8a5b23ff9fb7 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Fri, 1 Jan 2021 17:47:15 +0100 Subject: [PATCH 091/815] terminal-view: silence warning from use of SHOW_AS_ACTION_ALWAYS ``` Prefer "SHOW_AS_ACTION_IF_ROOM" instead of "SHOW_AS_ACTION_ALWAYS" ``` --- terminal-view/src/main/java/com/termux/view/TerminalView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index 301f33fe3b..b9df06f946 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -1197,7 +1197,7 @@ public void show() { final ActionMode.Callback callback = new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { - int show = MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT; + int show = MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT; ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); menu.add(Menu.NONE, 1, Menu.NONE, R.string.copy_text).setShowAsAction(show); From b895cbbb1e2367a918a1d95c7c341664f1b2f5ba Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Fri, 1 Jan 2021 18:10:09 +0100 Subject: [PATCH 092/815] app: set importantForAutofill="no" for extra keys input field Fixes warning "extra_keys_right.xml:2: Missing autofillHints attribute". --- app/src/main/res/layout/extra_keys_right.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/extra_keys_right.xml b/app/src/main/res/layout/extra_keys_right.xml index c2513bf990..ef01c71a18 100644 --- a/app/src/main/res/layout/extra_keys_right.xml +++ b/app/src/main/res/layout/extra_keys_right.xml @@ -7,6 +7,7 @@ android:imeOptions="actionSend|flagNoFullscreen" android:maxLines="1" android:inputType="text" + android:importantForAutofill="no" android:textColor="@android:color/white" android:textColorHighlight="@android:color/darker_gray" android:paddingTop="0dp" From b467b68f7b47a2c65fc4530221223f07bcd9a37d Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Fri, 1 Jan 2021 17:27:05 +0100 Subject: [PATCH 093/815] terminal-view: mv code to get properties to its own function --- .../java/com/termux/view/TerminalView.java | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index b9df06f946..84285bcad0 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -255,20 +255,7 @@ public boolean attachSession(TerminalSession session) { @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { - File propsFile = new File(getContext().getFilesDir() + "/home/.termux/termux.properties"); - if (!propsFile.exists()) - propsFile = new File(getContext().getFilesDir() + "/home/.config/termux/termux.properties"); - - Properties props = new Properties(); - try { - if (propsFile.isFile() && propsFile.canRead()) { - try (FileInputStream in = new FileInputStream(propsFile)) { - props.load(new InputStreamReader(in, StandardCharsets.UTF_8)); - } - } - } catch (Exception e) { - Log.e("termux", "Error loading props", e); - } + Properties props = getProperties(); if (props.getProperty("enforce-char-based-input", "false").equals("true")) { // Some keyboards seems do not reset the internal state on TYPE_NULL. @@ -1544,6 +1531,34 @@ private void updateFloatingToolbarVisibility(MotionEvent event) { } } + private Properties getProperties() { + File propsFile; + Properties props = new Properties(); + String possiblePropLocations[] = { + getContext().getFilesDir() + "/home/.termux/termux.properties", + getContext().getFilesDir() + "/home/.config/termux/termux.properties" + }; + + propsFile = new File(possiblePropLocations[0]); + int i = 1; + while (!propsFile.exists() && i <= possiblePropLocations.length) { + propsFile = new File(possiblePropLocations[i]); + i += 1; + } + + try { + if (propsFile.isFile() && propsFile.canRead()) { + try (FileInputStream in = new FileInputStream(propsFile)) { + props.load(new InputStreamReader(in, StandardCharsets.UTF_8)); + } + } + } catch (Exception e) { + Log.e("termux", "Error loading props", e); + } + + return props; + } + @RequiresApi(api = Build.VERSION_CODES.O) @Override public void autofill(AutofillValue value) { From f1e973f0d2000957a21387a8ee2f65bd08c776fb Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Tue, 7 Jul 2020 18:04:47 +0200 Subject: [PATCH 094/815] terminal-view: add "ctrl-space-workaround" property Makes it possible to run ctrl+space with hardware keyboards on devices/ROMs where it otherwise is broken. On devices where it already works this workaround breaks ctrl+space though. Where to add this fix was investigated and found by @5bodnar. --- .../src/main/java/com/termux/view/TerminalView.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index 84285bcad0..433925239d 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -539,6 +539,8 @@ public boolean onTouchEvent(MotionEvent ev) { @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { + Properties props = getProperties(); + if (LOG_KEY_EVENTS) Log.i(EmulatorDebug.LOG_TAG, "onKeyPreIme(keyCode=" + keyCode + ", event=" + event + ")"); if (keyCode == KeyEvent.KEYCODE_BACK) { @@ -554,6 +556,11 @@ public boolean onKeyPreIme(int keyCode, KeyEvent event) { return onKeyUp(keyCode, event); } } + } else if (props.getProperty("ctrl-space-workaround", "false").equals("true") && + keyCode == KeyEvent.KEYCODE_SPACE && event.isCtrlPressed()) { + /* ctrl + space does not work on some ROMs without this workaround. + However, this breaks it on devices where it works out of the box. */ + return onKeyDown(keyCode, event); } return super.onKeyPreIme(keyCode, event); } From 538a1d5cdf286bb11ba46285217524cd41d52448 Mon Sep 17 00:00:00 2001 From: Lucy Phipps Date: Wed, 30 Dec 2020 01:35:45 +0000 Subject: [PATCH 095/815] F-Droid URL for Termux:Styling --- app/src/main/java/com/termux/app/TermuxActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 593c7726b5..e7a87dc5ba 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -861,7 +861,7 @@ public boolean onContextItemSelected(MenuItem item) { // The startActivity() call is not documented to throw IllegalArgumentException. // However, crash reporting shows that it sometimes does, so catch it here. new AlertDialog.Builder(this).setMessage(R.string.styling_not_installed) - .setPositiveButton(R.string.styling_install, (dialog, which) -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.termux.styling")))).setNegativeButton(android.R.string.cancel, null).show(); + .setPositiveButton(R.string.styling_install, (dialog, which) -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://f-droid.org/en/packages/com.termux.styling/")))).setNegativeButton(android.R.string.cancel, null).show(); } return true; } From a0298285e3897f53f632f1c1435064bf5b97efc6 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Sat, 2 Jan 2021 08:57:48 +0100 Subject: [PATCH 096/815] terminal-emulator: tests: avoid error about methods not being mocked unitTests.returnDefaultValues = true fixes it. More info: http://g.co/androidstudio/not-mocked --- terminal-emulator/build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index 4673ab3e90..87fa1e563e 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -52,6 +52,10 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + testOptions { + unitTests.returnDefaultValues = true + } } tasks.withType(Test) { From 7d31b7f480ad0df5b27d9415e603cfbe166fbc0e Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Sat, 2 Jan 2021 09:01:28 +0100 Subject: [PATCH 097/815] terminal-emulator: tests: change spaces to tabs for consistency --- .../com/termux/terminal/ByteQueueTest.java | 6 +- .../ControlSequenceIntroducerTest.java | 46 ++++++------- .../termux/terminal/CursorAndScreenTest.java | 30 ++++----- .../com/termux/terminal/KeyHandlerTest.java | 26 ++++---- .../java/com/termux/terminal/ResizeTest.java | 4 +- .../com/termux/terminal/ScrollRegionTest.java | 40 ++++++------ .../com/termux/terminal/TerminalTest.java | 64 +++++++++---------- .../com/termux/terminal/TerminalTestCase.java | 20 +++--- .../com/termux/terminal/TextStyleTest.java | 34 +++++----- .../java/com/termux/terminal/WcWidthTest.java | 46 ++++++------- 10 files changed, 158 insertions(+), 158 deletions(-) diff --git a/terminal-emulator/src/test/java/com/termux/terminal/ByteQueueTest.java b/terminal-emulator/src/test/java/com/termux/terminal/ByteQueueTest.java index 1eb0278bf5..44a605bddc 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/ByteQueueTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/ByteQueueTest.java @@ -17,13 +17,13 @@ private static void assertArrayEquals(byte[] expected, byte[] actual) { public void testCompleteWrites() throws Exception { ByteQueue q = new ByteQueue(10); - assertTrue(q.write(new byte[]{1, 2, 3}, 0, 3)); + assertTrue(q.write(new byte[]{1, 2, 3}, 0, 3)); byte[] arr = new byte[10]; assertEquals(3, q.read(arr, true)); assertArrayEquals(new byte[]{1, 2, 3}, new byte[]{arr[0], arr[1], arr[2]}); - assertTrue(q.write(new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 0, 10)); + assertTrue(q.write(new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 0, 10)); assertEquals(10, q.read(arr, true)); assertArrayEquals(new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, arr); } @@ -43,7 +43,7 @@ public void testQueueWraparound() throws Exception { public void testWriteNotesClosing() throws Exception { ByteQueue q = new ByteQueue(10); q.close(); - assertFalse(q.write(new byte[]{1, 2, 3}, 0, 3)); + assertFalse(q.write(new byte[]{1, 2, 3}, 0, 3)); } public void testReadNonBlocking() throws Exception { diff --git a/terminal-emulator/src/test/java/com/termux/terminal/ControlSequenceIntroducerTest.java b/terminal-emulator/src/test/java/com/termux/terminal/ControlSequenceIntroducerTest.java index 62e898c06b..5a12edd749 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/ControlSequenceIntroducerTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/ControlSequenceIntroducerTest.java @@ -35,31 +35,31 @@ public void testCsiSGRParameters() { withTerminalSized(3, 2).enterString("\033[0;38;2;255;255;255;48;2;0;0;0;1;2;3;4;5;7;8;9mabc").assertLinesAre("abc", " "); } - /** CSI Ps b Repeat the preceding graphic character Ps times (REP). */ - public void testRepeat() { - withTerminalSized(3, 2).enterString("a\033[b").assertLinesAre("aa ", " "); - withTerminalSized(3, 2).enterString("a\033[2b").assertLinesAre("aaa", " "); - // When no char has been output we ignore REP: - withTerminalSized(3, 2).enterString("\033[b").assertLinesAre(" ", " "); - // This shows that REP outputs the last emitted code point and not the one relative to the - // current cursor position: - withTerminalSized(5, 2).enterString("abcde\033[2G\033[2b\n").assertLinesAre("aeede", " "); - } + /** CSI Ps b Repeat the preceding graphic character Ps times (REP). */ + public void testRepeat() { + withTerminalSized(3, 2).enterString("a\033[b").assertLinesAre("aa ", " "); + withTerminalSized(3, 2).enterString("a\033[2b").assertLinesAre("aaa", " "); + // When no char has been output we ignore REP: + withTerminalSized(3, 2).enterString("\033[b").assertLinesAre(" ", " "); + // This shows that REP outputs the last emitted code point and not the one relative to the + // current cursor position: + withTerminalSized(5, 2).enterString("abcde\033[2G\033[2b\n").assertLinesAre("aeede", " "); + } - /** CSI 3 J Clear scrollback (xterm, libvte; non-standard). */ - public void testCsi3J() { - withTerminalSized(3, 2).enterString("a\r\nb\r\nc\r\nd"); - assertEquals("a\nb\nc\nd", mTerminal.getScreen().getTranscriptText()); - enterString("\033[3J"); - assertEquals("c\nd", mTerminal.getScreen().getTranscriptText()); + /** CSI 3 J Clear scrollback (xterm, libvte; non-standard). */ + public void testCsi3J() { + withTerminalSized(3, 2).enterString("a\r\nb\r\nc\r\nd"); + assertEquals("a\nb\nc\nd", mTerminal.getScreen().getTranscriptText()); + enterString("\033[3J"); + assertEquals("c\nd", mTerminal.getScreen().getTranscriptText()); - withTerminalSized(3, 2).enterString("Lorem_ipsum"); - assertEquals("Lorem_ipsum", mTerminal.getScreen().getTranscriptText()); - enterString("\033[3J"); - assertEquals("ipsum", mTerminal.getScreen().getTranscriptText()); + withTerminalSized(3, 2).enterString("Lorem_ipsum"); + assertEquals("Lorem_ipsum", mTerminal.getScreen().getTranscriptText()); + enterString("\033[3J"); + assertEquals("ipsum", mTerminal.getScreen().getTranscriptText()); - withTerminalSized(3, 2).enterString("w\r\nx\r\ny\r\nz\033[?1049h\033[3J\033[?1049l"); - assertEquals("y\nz", mTerminal.getScreen().getTranscriptText()); - } + withTerminalSized(3, 2).enterString("w\r\nx\r\ny\r\nz\033[?1049h\033[3J\033[?1049l"); + assertEquals("y\nz", mTerminal.getScreen().getTranscriptText()); + } } diff --git a/terminal-emulator/src/test/java/com/termux/terminal/CursorAndScreenTest.java b/terminal-emulator/src/test/java/com/termux/terminal/CursorAndScreenTest.java index 121cb22318..8a65e66d00 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/CursorAndScreenTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/CursorAndScreenTest.java @@ -18,7 +18,7 @@ public void testDeleteLinesKeepsStyles() { assertLinesAre("ABCDE", "FGHIJ", "KLMNO", "PQRST", "UVWXY"); for (int row = 0; row < 5; row++) { for (int col = 0; col < 5; col++) { - long s = getStyleAt(row, col); + long s = getStyleAt(row, col); Assert.assertEquals(col, TextStyle.decodeForeColor(s)); Assert.assertEquals(row, TextStyle.decodeBackColor(s)); } @@ -43,7 +43,7 @@ public void testDeleteLinesKeepsStyles() { for (int col = 0; col < 5; col++) { int wantedForeground = (row == 1 || row == 2) ? 98 : col; int wantedBackground = (row == 1 || row == 2) ? 99 : (row == 0 ? 2 : row); - long s = getStyleAt(row, col); + long s = getStyleAt(row, col); Assert.assertEquals(wantedForeground, TextStyle.decodeForeColor(s)); Assert.assertEquals(wantedBackground, TextStyle.decodeBackColor(s)); } @@ -159,11 +159,11 @@ public void testReportCursorPosition() { } } - /** - * See comments on horizontal tab handling in TerminalEmulator.java. - * - * We do not want to color already written cells when tabbing over them. - */ + /** + * See comments on horizontal tab handling in TerminalEmulator.java. + *

+ * We do not want to color already written cells when tabbing over them. + */ public void DISABLED_testHorizontalTabColorsBackground() { withTerminalSized(10, 3).enterString("\033[48;5;15m").enterString("\t"); assertCursorAt(0, 8); @@ -214,14 +214,14 @@ public void testClearingOfAutowrap() { " -"); } - public void testBackspaceAcrossWrappedLines() { - // Backspace should not go to previous line if not auto-wrapped: - withTerminalSized(3, 3).enterString("hi\r\n\b\byou").assertLinesAre("hi ", "you", " "); - // Backspace should go to previous line if auto-wrapped: - withTerminalSized(3, 3).enterString("hi y").assertLinesAre("hi ", "y ", " ").enterString("\b\b#").assertLinesAre("hi#", "y ", " "); - // Initial backspace should do nothing: - withTerminalSized(3, 3).enterString("\b\b\b\bhi").assertLinesAre("hi ", " ", " "); - } + public void testBackspaceAcrossWrappedLines() { + // Backspace should not go to previous line if not auto-wrapped: + withTerminalSized(3, 3).enterString("hi\r\n\b\byou").assertLinesAre("hi ", "you", " "); + // Backspace should go to previous line if auto-wrapped: + withTerminalSized(3, 3).enterString("hi y").assertLinesAre("hi ", "y ", " ").enterString("\b\b#").assertLinesAre("hi#", "y ", " "); + // Initial backspace should do nothing: + withTerminalSized(3, 3).enterString("\b\b\b\bhi").assertLinesAre("hi ", " ", " "); + } public void testCursorSaveRestoreLocation() { // DEC save/restore diff --git a/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java b/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java index 9e3ee02691..0826c7fc07 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java @@ -174,18 +174,18 @@ public void testKeyCodes() { assertKeysEquals("\033[23;2~", KeyHandler.getCode(KeyEvent.KEYCODE_F11, KeyHandler.KEYMOD_SHIFT, false, false)); assertKeysEquals("\033[24;2~", KeyHandler.getCode(KeyEvent.KEYCODE_F12, KeyHandler.KEYMOD_SHIFT, false, false)); - assertKeysEquals("0", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_0, 0, false, false)); - assertKeysEquals("1", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_1, 0, false, false)); - assertKeysEquals("2", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_2, 0, false, false)); - assertKeysEquals("3", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_3, 0, false, false)); - assertKeysEquals("4", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_4, 0, false, false)); - assertKeysEquals("5", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_5, 0, false, false)); - assertKeysEquals("6", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_6, 0, false, false)); - assertKeysEquals("7", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_7, 0, false, false)); - assertKeysEquals("8", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_8, 0, false, false)); - assertKeysEquals("9", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_9, 0, false, false)); - assertKeysEquals(",", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_COMMA, 0, false, false)); - assertKeysEquals(".", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_DOT, 0, false, false)); - } + assertKeysEquals("0", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_0, 0, false, false)); + assertKeysEquals("1", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_1, 0, false, false)); + assertKeysEquals("2", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_2, 0, false, false)); + assertKeysEquals("3", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_3, 0, false, false)); + assertKeysEquals("4", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_4, 0, false, false)); + assertKeysEquals("5", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_5, 0, false, false)); + assertKeysEquals("6", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_6, 0, false, false)); + assertKeysEquals("7", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_7, 0, false, false)); + assertKeysEquals("8", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_8, 0, false, false)); + assertKeysEquals("9", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_9, 0, false, false)); + assertKeysEquals(",", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_COMMA, 0, false, false)); + assertKeysEquals(".", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_DOT, 0, false, false)); + } } diff --git a/terminal-emulator/src/test/java/com/termux/terminal/ResizeTest.java b/terminal-emulator/src/test/java/com/termux/terminal/ResizeTest.java index d0251da8f6..fa4a702473 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/ResizeTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/ResizeTest.java @@ -93,7 +93,7 @@ public void testVerticalResize() { enterString("\033[2J"); for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { - long style = getStyleAt(r, c); + long style = getStyleAt(r, c); assertEquals(119, TextStyle.decodeForeColor(style)); assertEquals(129, TextStyle.decodeBackColor(style)); } @@ -105,7 +105,7 @@ public void testVerticalResize() { // After resize, screen should still be same color: for (int r = 0; r < rows - 2; r++) { for (int c = 0; c < cols; c++) { - long style = getStyleAt(r, c); + long style = getStyleAt(r, c); assertEquals(119, TextStyle.decodeForeColor(style)); assertEquals(129, TextStyle.decodeBackColor(style)); } diff --git a/terminal-emulator/src/test/java/com/termux/terminal/ScrollRegionTest.java b/terminal-emulator/src/test/java/com/termux/terminal/ScrollRegionTest.java index bbb5e7ac73..cc01c0454b 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/ScrollRegionTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/ScrollRegionTest.java @@ -107,24 +107,24 @@ public void testScrollDownBelowScrollRegion() { assertLinesAre("1 ", "2 ", "3 ", "QQ", "YY"); } - /** See https://github.com/termux/termux-app/issues/1340 */ - public void testScrollRegionDoesNotLimitCursorMovement() { - withTerminalSized(6, 4) - .enterString("\033[4;7r\033[3;1Haaa\033[Axxx") - .assertLinesAre( - " ", - " xxx", - "aaa ", - " " - ); - - withTerminalSized(6, 4) - .enterString("\033[1;3r\033[3;1Haaa\033[Bxxx") - .assertLinesAre( - " ", - " ", - "aaa ", - " xxx" - ); - } + /** See https://github.com/termux/termux-app/issues/1340 */ + public void testScrollRegionDoesNotLimitCursorMovement() { + withTerminalSized(6, 4) + .enterString("\033[4;7r\033[3;1Haaa\033[Axxx") + .assertLinesAre( + " ", + " xxx", + "aaa ", + " " + ); + + withTerminalSized(6, 4) + .enterString("\033[1;3r\033[3;1Haaa\033[Bxxx") + .assertLinesAre( + " ", + " ", + "aaa ", + " xxx" + ); + } } diff --git a/terminal-emulator/src/test/java/com/termux/terminal/TerminalTest.java b/terminal-emulator/src/test/java/com/termux/terminal/TerminalTest.java index 8c11497999..af63fda104 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/TerminalTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/TerminalTest.java @@ -159,7 +159,7 @@ public void testSelectGraphics() { assertEquals(119, mTerminal.mForeColor); assertEquals(129, mTerminal.mBackColor); - // Invalid parameter: + // Invalid parameter: enterString("\033[48;8;129m"); assertEquals(119, mTerminal.mForeColor); assertEquals(129, mTerminal.mBackColor); @@ -169,30 +169,30 @@ public void testSelectGraphics() { assertEquals(178, mTerminal.mForeColor); assertEquals(179, mTerminal.mBackColor); - // 24 bit colors: - enterString(("\033[0m")); // Reset fg and bg colors. - enterString("\033[38;2;255;127;2m"); - int expectedForeground = 0xff000000 | (255 << 16) | (127 << 8) | 2; - assertEquals(expectedForeground, mTerminal.mForeColor); - assertEquals(TextStyle.COLOR_INDEX_BACKGROUND, mTerminal.mBackColor); - enterString("\033[48;2;1;2;254m"); - int expectedBackground = 0xff000000 | (1 << 16) | (2 << 8) | 254; - assertEquals(expectedForeground, mTerminal.mForeColor); - assertEquals(expectedBackground, mTerminal.mBackColor); - - // 24 bit colors, set fg and bg at once: - enterString(("\033[0m")); // Reset fg and bg colors. - assertEquals(TextStyle.COLOR_INDEX_FOREGROUND, mTerminal.mForeColor); - assertEquals(TextStyle.COLOR_INDEX_BACKGROUND, mTerminal.mBackColor); - enterString("\033[38;2;255;127;2;48;2;1;2;254m"); - assertEquals(expectedForeground, mTerminal.mForeColor); - assertEquals(expectedBackground, mTerminal.mBackColor); - - // 24 bit colors, invalid input: - enterString("\033[38;2;300;127;2;48;2;1;300;254m"); - assertEquals(expectedForeground, mTerminal.mForeColor); - assertEquals(expectedBackground, mTerminal.mBackColor); - } + // 24 bit colors: + enterString(("\033[0m")); // Reset fg and bg colors. + enterString("\033[38;2;255;127;2m"); + int expectedForeground = 0xff000000 | (255 << 16) | (127 << 8) | 2; + assertEquals(expectedForeground, mTerminal.mForeColor); + assertEquals(TextStyle.COLOR_INDEX_BACKGROUND, mTerminal.mBackColor); + enterString("\033[48;2;1;2;254m"); + int expectedBackground = 0xff000000 | (1 << 16) | (2 << 8) | 254; + assertEquals(expectedForeground, mTerminal.mForeColor); + assertEquals(expectedBackground, mTerminal.mBackColor); + + // 24 bit colors, set fg and bg at once: + enterString(("\033[0m")); // Reset fg and bg colors. + assertEquals(TextStyle.COLOR_INDEX_FOREGROUND, mTerminal.mForeColor); + assertEquals(TextStyle.COLOR_INDEX_BACKGROUND, mTerminal.mBackColor); + enterString("\033[38;2;255;127;2;48;2;1;2;254m"); + assertEquals(expectedForeground, mTerminal.mForeColor); + assertEquals(expectedBackground, mTerminal.mBackColor); + + // 24 bit colors, invalid input: + enterString("\033[38;2;300;127;2;48;2;1;300;254m"); + assertEquals(expectedForeground, mTerminal.mForeColor); + assertEquals(expectedBackground, mTerminal.mBackColor); + } public void testBackgroundColorErase() { final int rows = 3; @@ -200,7 +200,7 @@ public void testBackgroundColorErase() { withTerminalSized(cols, rows); for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { - long style = getStyleAt(r, c); + long style = getStyleAt(r, c); assertEquals(TextStyle.COLOR_INDEX_FOREGROUND, TextStyle.decodeForeColor(style)); assertEquals(TextStyle.COLOR_INDEX_BACKGROUND, TextStyle.decodeBackColor(style)); } @@ -213,7 +213,7 @@ public void testBackgroundColorErase() { enterString("\033[2J"); for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { - long style = getStyleAt(r, c); + long style = getStyleAt(r, c); assertEquals(119, TextStyle.decodeForeColor(style)); assertEquals(129, TextStyle.decodeBackColor(style)); } @@ -224,7 +224,7 @@ public void testBackgroundColorErase() { enterString("\033[2L"); for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { - long style = getStyleAt(r, c); + long style = getStyleAt(r, c); assertEquals((r == 0 || r == 1) ? 139 : 129, TextStyle.decodeBackColor(style)); } } @@ -289,9 +289,9 @@ public void testAutomargins() throws UnsupportedEncodingException { withTerminalSized(3, 3).enterString("abc\r ").assertLinesAre(" bc", " ", " ").assertCursorAt(0, 1); } - public void testTab() { - withTerminalSized(11, 2).enterString("01234567890\r\tXX").assertLinesAre("01234567XX0", " "); - withTerminalSized(11, 2).enterString("01234567890\033[44m\r\tXX").assertLinesAre("01234567XX0", " "); - } + public void testTab() { + withTerminalSized(11, 2).enterString("01234567890\r\tXX").assertLinesAre("01234567XX0", " "); + withTerminalSized(11, 2).enterString("01234567890\033[44m\r\tXX").assertLinesAre("01234567XX0", " "); + } } diff --git a/terminal-emulator/src/test/java/com/termux/terminal/TerminalTestCase.java b/terminal-emulator/src/test/java/com/termux/terminal/TerminalTestCase.java index 12c8befec3..5e5bde92f6 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/TerminalTestCase.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/TerminalTestCase.java @@ -18,7 +18,7 @@ public static class MockTerminalOutput extends TerminalOutput { public final List titleChanges = new ArrayList<>(); public final List clipboardPuts = new ArrayList<>(); public int bellsRung = 0; - public int colorsChanged = 0; + public int colorsChanged = 0; @Override public void write(byte[] data, int offset, int count) { @@ -26,10 +26,10 @@ public void write(byte[] data, int offset, int count) { } public String getOutputAndClear() { - String result = new String(baos.toByteArray(), StandardCharsets.UTF_8); - baos.reset(); - return result; - } + String result = new String(baos.toByteArray(), StandardCharsets.UTF_8); + baos.reset(); + return result; + } @Override public void titleChanged(String oldTitle, String newTitle) { @@ -46,11 +46,11 @@ public void onBell() { bellsRung++; } - @Override - public void onColorsChanged() { - colorsChanged++; - } - } + @Override + public void onColorsChanged() { + colorsChanged++; + } + } public TerminalEmulator mTerminal; public MockTerminalOutput mOutput; diff --git a/terminal-emulator/src/test/java/com/termux/terminal/TextStyleTest.java b/terminal-emulator/src/test/java/com/termux/terminal/TextStyleTest.java index 153458e04d..6ec7a34e3d 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/TextStyleTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/TextStyleTest.java @@ -22,23 +22,23 @@ public void testEncodingSingle() { } } - public void testEncoding24Bit() { - int[] values = {255, 240, 127, 1, 0}; - for (int red : values) { - for (int green : values) { - for (int blue : values) { - int argb = 0xFF000000 | (red << 16) | (green << 8) | blue; - long encoded = TextStyle.encode(argb, 0, 0); - assertEquals(argb, TextStyle.decodeForeColor(encoded)); - encoded = TextStyle.encode(0, argb, 0); - assertEquals(argb, TextStyle.decodeBackColor(encoded)); - } - } - } - } + public void testEncoding24Bit() { + int[] values = {255, 240, 127, 1, 0}; + for (int red : values) { + for (int green : values) { + for (int blue : values) { + int argb = 0xFF000000 | (red << 16) | (green << 8) | blue; + long encoded = TextStyle.encode(argb, 0, 0); + assertEquals(argb, TextStyle.decodeForeColor(encoded)); + encoded = TextStyle.encode(0, argb, 0); + assertEquals(argb, TextStyle.decodeBackColor(encoded)); + } + } + } + } - public void testEncodingCombinations() { + public void testEncodingCombinations() { for (int f1 : ALL_EFFECTS) { for (int f2 : ALL_EFFECTS) { int combined = f1 | f2; @@ -54,9 +54,9 @@ public void testEncodingStrikeThrough() { } public void testEncodingProtected() { - long encoded = TextStyle.encode(TextStyle.COLOR_INDEX_FOREGROUND, TextStyle.COLOR_INDEX_BACKGROUND, + long encoded = TextStyle.encode(TextStyle.COLOR_INDEX_FOREGROUND, TextStyle.COLOR_INDEX_BACKGROUND, TextStyle.CHARACTER_ATTRIBUTE_STRIKETHROUGH); - assertEquals(0, (TextStyle.decodeEffect(encoded) & TextStyle.CHARACTER_ATTRIBUTE_PROTECTED)); + assertEquals(0, (TextStyle.decodeEffect(encoded) & TextStyle.CHARACTER_ATTRIBUTE_PROTECTED)); encoded = TextStyle.encode(TextStyle.COLOR_INDEX_FOREGROUND, TextStyle.COLOR_INDEX_BACKGROUND, TextStyle.CHARACTER_ATTRIBUTE_STRIKETHROUGH | TextStyle.CHARACTER_ATTRIBUTE_PROTECTED); assertTrue((TextStyle.decodeEffect(encoded) & TextStyle.CHARACTER_ATTRIBUTE_PROTECTED) != 0); diff --git a/terminal-emulator/src/test/java/com/termux/terminal/WcWidthTest.java b/terminal-emulator/src/test/java/com/termux/terminal/WcWidthTest.java index 60e4ace410..c0d9a0bcad 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/WcWidthTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/WcWidthTest.java @@ -15,12 +15,12 @@ public void testPrintableAscii() { } } - public void testSomeWidthOne() { - assertWidthIs(1, 'å'); - assertWidthIs(1, 'ä'); - assertWidthIs(1, 'ö'); - assertWidthIs(1, 0x23F2); - } + public void testSomeWidthOne() { + assertWidthIs(1, 'å'); + assertWidthIs(1, 'ä'); + assertWidthIs(1, 'ö'); + assertWidthIs(1, 0x23F2); + } public void testSomeWide() { assertWidthIs(2, 'A'); @@ -44,18 +44,18 @@ public void testSomeNonWide() { } public void testCombining() { - assertWidthIs(0, 0x0302); - assertWidthIs(0, 0x0308); - assertWidthIs(0, 0xFE0F); - } - - public void testWordJoiner() { - // https://en.wikipedia.org/wiki/Word_joiner - // The word joiner (WJ) is a code point in Unicode used to separate words when using scripts - // that do not use explicit spacing. It is encoded since Unicode version 3.2 - // (released in 2002) as U+2060 WORD JOINER (HTML ⁠). - // The word joiner does not produce any space, and prohibits a line break at its position. - assertWidthIs(0, 0x2060); + assertWidthIs(0, 0x0302); + assertWidthIs(0, 0x0308); + assertWidthIs(0, 0xFE0F); + } + + public void testWordJoiner() { + // https://en.wikipedia.org/wiki/Word_joiner + // The word joiner (WJ) is a code point in Unicode used to separate words when using scripts + // that do not use explicit spacing. It is encoded since Unicode version 3.2 + // (released in 2002) as U+2060 WORD JOINER (HTML ⁠). + // The word joiner does not produce any space, and prohibits a line break at its position. + assertWidthIs(0, 0x2060); } public void testSofthyphen() { @@ -72,10 +72,10 @@ public void testHangul() { assertWidthIs(1, 0x11A3); } - public void testEmojis() { - assertWidthIs(2, 0x1F428); // KOALA. - assertWidthIs(2, 0x231a); // WATCH. - assertWidthIs(2, 0x1F643); // UPSIDE-DOWN FACE (Unicode 8). - } + public void testEmojis() { + assertWidthIs(2, 0x1F428); // KOALA. + assertWidthIs(2, 0x231a); // WATCH. + assertWidthIs(2, 0x1F643); // UPSIDE-DOWN FACE (Unicode 8). + } } From 38114784f1a8f88f4477e2109bb944b5e4979ceb Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 6 Jan 2021 14:23:15 +0200 Subject: [PATCH 098/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cc2d6098fd..c24c580be0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -137,11 +137,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 34 - downloadBootstrap("aarch64", "7f56e8ee5573a8351925ff4010c6dea240cd56194ba0b9a686c3d8289859a05", version) - downloadBootstrap("arm", "fa41377fb07cac2e4c15f32f3e7ea8116d60efadc1261176acb42646a71637f0", version) - downloadBootstrap("i686", "61dcae560e706f808e524b8c3b234c47ea0e2bf6c6b0d5edebe53e6fdb956fe1", version) - downloadBootstrap("x86_64", "1b616a4d591809874a06b06f309441320a0b9781e8ef5c148123530303b2533d", version) + def version = 35 + downloadBootstrap("aarch64", "6707cc641cde13dc2f24e819cd8ca3f1a9a003577523c25beff72690588594f5", version) + downloadBootstrap("arm", "eadc9afb52900dc744fdb39ed0c3dbb87ad8ce6190b27946467df7aeab353fa7", version) + downloadBootstrap("i686", "b674ef43c8388dd19e0d25b024b5792c8532ee0ddcc49f90c0716042724fa905", version) + downloadBootstrap("x86_64", "86043eb76efededbdf5644686a899f4d762703fe18e23fb906a2482d593d7549", version) } } From 922898263275776b3a7e8e8870d5c88de78a3409 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 6 Jan 2021 14:28:28 +0200 Subject: [PATCH 099/815] remove restrictions from viewable file types Fixes https://github.com/termux/termux-app/issues/1872 and similar issues. --- app/src/main/AndroidManifest.xml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 33d0ede61f..455f5c39e6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -83,16 +83,15 @@ - + + + + - - - - - + From a56cba68432e5147f11faa70e8c34b647bc1996d Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 6 Jan 2021 14:31:56 +0200 Subject: [PATCH 100/815] version 0.105 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c24c580be0..7eaad4173e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion project.properties.minSdkVersion.toInteger() targetSdkVersion project.properties.targetSdkVersion.toInteger() - versionCode 104 - versionName "0.104" + versionCode 105 + versionName "0.105" externalNativeBuild { ndkBuild { From 7b4a69f839fa5fc65821a1ca55bba80ac4356522 Mon Sep 17 00:00:00 2001 From: rakslice Date: Sat, 16 Jan 2021 19:22:01 -0800 Subject: [PATCH 101/815] when num lock is off, have numpad keys works as their numlock-off functions (arrows/home/end/pgup/pgdn/insert/delete) --- .../java/com/termux/terminal/KeyHandler.java | 77 ++++++++++++++++--- .../com/termux/terminal/KeyHandlerTest.java | 36 ++++++--- .../java/com/termux/view/TerminalView.java | 1 + 3 files changed, 92 insertions(+), 22 deletions(-) diff --git a/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java b/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java index a4d0f1ac87..97e2637f14 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java @@ -59,6 +59,7 @@ public final class KeyHandler { public static final int KEYMOD_ALT = 0x80000000; public static final int KEYMOD_CTRL = 0x40000000; public static final int KEYMOD_SHIFT = 0x20000000; + public static final int KEYMOD_NUM_LOCK = 0x10000000; private static final Map TERMCAP_TO_KEYCODE = new HashMap<>(); @@ -145,10 +146,16 @@ static String getCodeFromTermcap(String termcap, boolean cursorKeysApplication, keyMod |= KEYMOD_ALT; keyCode &= ~KEYMOD_ALT; } + if ((keyCode & KEYMOD_NUM_LOCK) != 0) { + keyMod |= KEYMOD_NUM_LOCK; + keyCode &= ~KEYMOD_NUM_LOCK; + } return getCode(keyCode, keyMod, cursorKeysApplication, keypadApplication); } public static String getCode(int keyCode, int keyMode, boolean cursorApp, boolean keypadApplication) { + boolean numLockOn = (keyMode & KEYMOD_NUM_LOCK) != 0; + keyMode &= ~KEYMOD_NUM_LOCK; switch (keyCode) { case KEYCODE_DPAD_CENTER: return "\015"; @@ -249,31 +256,81 @@ public static String getCode(int keyCode, int keyMode, boolean cursorApp, boolea case KEYCODE_NUMPAD_COMMA: return ","; case KEYCODE_NUMPAD_DOT: - return keypadApplication ? "\033On" : "."; + if (numLockOn) { + return keypadApplication ? "\033On" : "."; + } else { + // DELETE + return transformForModifiers("\033[3", keyMode, '~'); + } case KEYCODE_NUMPAD_SUBTRACT: return keypadApplication ? transformForModifiers("\033O", keyMode, 'm') : "-"; case KEYCODE_NUMPAD_DIVIDE: return keypadApplication ? transformForModifiers("\033O", keyMode, 'o') : "/"; case KEYCODE_NUMPAD_0: - return keypadApplication ? transformForModifiers("\033O", keyMode, 'p') : "0"; + if (numLockOn) { + return keypadApplication ? transformForModifiers("\033O", keyMode, 'p') : "0"; + } else { + // INSERT + return transformForModifiers("\033[2", keyMode, '~'); + } case KEYCODE_NUMPAD_1: - return keypadApplication ? transformForModifiers("\033O", keyMode, 'q') : "1"; + if (numLockOn) { + return keypadApplication ? transformForModifiers("\033O", keyMode, 'q') : "1"; + } else { + // END + return (keyMode == 0) ? (cursorApp ? "\033OF" : "\033[F") : transformForModifiers("\033[1", keyMode, 'F'); + } case KEYCODE_NUMPAD_2: - return keypadApplication ? transformForModifiers("\033O", keyMode, 'r') : "2"; + if (numLockOn) { + return keypadApplication ? transformForModifiers("\033O", keyMode, 'r') : "2"; + } else { + // DOWN + return (keyMode == 0) ? (cursorApp ? "\033OB" : "\033[B") : transformForModifiers("\033[1", keyMode, 'B'); + } case KEYCODE_NUMPAD_3: - return keypadApplication ? transformForModifiers("\033O", keyMode, 's') : "3"; + if (numLockOn) { + return keypadApplication ? transformForModifiers("\033O", keyMode, 's') : "3"; + } else { + // PGDN + return "\033[6~"; + } case KEYCODE_NUMPAD_4: - return keypadApplication ? transformForModifiers("\033O", keyMode, 't') : "4"; + if (numLockOn) { + return keypadApplication ? transformForModifiers("\033O", keyMode, 't') : "4"; + } else { + // LEFT + return (keyMode == 0) ? (cursorApp ? "\033OD" : "\033[D") : transformForModifiers("\033[1", keyMode, 'D'); + } case KEYCODE_NUMPAD_5: return keypadApplication ? transformForModifiers("\033O", keyMode, 'u') : "5"; case KEYCODE_NUMPAD_6: - return keypadApplication ? transformForModifiers("\033O", keyMode, 'v') : "6"; + if (numLockOn) { + return keypadApplication ? transformForModifiers("\033O", keyMode, 'v') : "6"; + } else { + // RIGHT + return (keyMode == 0) ? (cursorApp ? "\033OC" : "\033[C") : transformForModifiers("\033[1", keyMode, 'C'); + } case KEYCODE_NUMPAD_7: - return keypadApplication ? transformForModifiers("\033O", keyMode, 'w') : "7"; + if (numLockOn) { + return keypadApplication ? transformForModifiers("\033O", keyMode, 'w') : "7"; + } else { + // HOME + return (keyMode == 0) ? (cursorApp ? "\033OH" : "\033[H") : transformForModifiers("\033[1", keyMode, 'H'); + } case KEYCODE_NUMPAD_8: - return keypadApplication ? transformForModifiers("\033O", keyMode, 'x') : "8"; + if (numLockOn) { + return keypadApplication ? transformForModifiers("\033O", keyMode, 'x') : "8"; + } else { + // UP + return (keyMode == 0) ? (cursorApp ? "\033OA" : "\033[A") : transformForModifiers("\033[1", keyMode, 'A'); + } case KEYCODE_NUMPAD_9: - return keypadApplication ? transformForModifiers("\033O", keyMode, 'y') : "9"; + if (numLockOn) { + return keypadApplication ? transformForModifiers("\033O", keyMode, 'y') : "9"; + } else { + // PGUP + return "\033[5~"; + } case KEYCODE_NUMPAD_EQUALS: return keypadApplication ? transformForModifiers("\033O", keyMode, 'X') : "="; } diff --git a/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java b/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java index 0826c7fc07..15b23761a8 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java @@ -174,18 +174,30 @@ public void testKeyCodes() { assertKeysEquals("\033[23;2~", KeyHandler.getCode(KeyEvent.KEYCODE_F11, KeyHandler.KEYMOD_SHIFT, false, false)); assertKeysEquals("\033[24;2~", KeyHandler.getCode(KeyEvent.KEYCODE_F12, KeyHandler.KEYMOD_SHIFT, false, false)); - assertKeysEquals("0", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_0, 0, false, false)); - assertKeysEquals("1", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_1, 0, false, false)); - assertKeysEquals("2", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_2, 0, false, false)); - assertKeysEquals("3", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_3, 0, false, false)); - assertKeysEquals("4", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_4, 0, false, false)); - assertKeysEquals("5", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_5, 0, false, false)); - assertKeysEquals("6", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_6, 0, false, false)); - assertKeysEquals("7", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_7, 0, false, false)); - assertKeysEquals("8", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_8, 0, false, false)); - assertKeysEquals("9", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_9, 0, false, false)); - assertKeysEquals(",", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_COMMA, 0, false, false)); - assertKeysEquals(".", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_DOT, 0, false, false)); + assertKeysEquals("0", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_0, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals("1", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_1, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals("2", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_2, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals("3", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_3, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals("4", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_4, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals("5", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_5, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals("6", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_6, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals("7", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_7, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals("8", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_8, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals("9", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_9, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals(",", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_COMMA, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + assertKeysEquals(".", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_DOT, KeyHandler.KEYMOD_NUM_LOCK, false, false)); + + assertKeysEquals("\033[2~", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_0, 0, false, false)); + assertKeysEquals("\033[F", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_1, 0, false, false)); + assertKeysEquals("\033[B", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_2, 0, false, false)); + assertKeysEquals("\033[6~", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_3, 0, false, false)); + assertKeysEquals("\033[D", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_4, 0, false, false)); + assertKeysEquals("5", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_5, 0, false, false)); + assertKeysEquals("\033[C", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_6, 0, false, false)); + assertKeysEquals("\033[H", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_7, 0, false, false)); + assertKeysEquals("\033[A", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_8, 0, false, false)); + assertKeysEquals("\033[5~", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_9, 0, false, false)); + assertKeysEquals("\033[3~", KeyHandler.getCode(KeyEvent.KEYCODE_NUMPAD_DOT, 0, false, false)); } } diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index 433925239d..c8bc82072e 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -591,6 +591,7 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { if (controlDown) keyMod |= KeyHandler.KEYMOD_CTRL; if (event.isAltPressed() || leftAltDown) keyMod |= KeyHandler.KEYMOD_ALT; if (event.isShiftPressed()) keyMod |= KeyHandler.KEYMOD_SHIFT; + if (event.isNumLockOn()) keyMod |= KeyHandler.KEYMOD_NUM_LOCK; if (!event.isFunctionPressed() && handleKeyCode(keyCode, keyMod)) { if (LOG_KEY_EVENTS) Log.i(EmulatorDebug.LOG_TAG, "handleKeyCode() took key event"); return true; From 78cdaef6d249833905868a2d64257691b6dbbdb4 Mon Sep 17 00:00:00 2001 From: rakslice Date: Sat, 16 Jan 2021 19:53:22 -0800 Subject: [PATCH 102/815] only send PF1 for num lock when in application mode --- .../src/main/java/com/termux/terminal/KeyHandler.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java b/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java index 97e2637f14..254f5e3a7c 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java @@ -235,8 +235,11 @@ public static String getCode(int keyCode, int keyMode, boolean cursorApp, boolea // Just do what xterm and gnome-terminal does: return prefix + (((keyMode & KEYMOD_CTRL) == 0) ? "\u007F" : "\u0008"); case KEYCODE_NUM_LOCK: - return "\033OP"; - + if (keypadApplication) { + return "\033OP"; + } else { + return null; + } case KEYCODE_SPACE: // If ctrl is not down, return null so that it goes through normal input processing (which may e.g. cause a // combining accent to be written): From fe584940e121a7ae500d9ea1f126aa13bf6d8527 Mon Sep 17 00:00:00 2001 From: rakslice Date: Sat, 16 Jan 2021 19:54:11 -0800 Subject: [PATCH 103/815] fix TerminalView possiblePropLocations IOBE --- terminal-view/src/main/java/com/termux/view/TerminalView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index c8bc82072e..cd9663234c 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -1549,7 +1549,7 @@ private Properties getProperties() { propsFile = new File(possiblePropLocations[0]); int i = 1; - while (!propsFile.exists() && i <= possiblePropLocations.length) { + while (!propsFile.exists() && i < possiblePropLocations.length) { propsFile = new File(possiblePropLocations[i]); i += 1; } From 05bb399893994d6cd596687fa7b4fedc294ef2b4 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sun, 17 Jan 2021 19:40:29 +0200 Subject: [PATCH 104/815] terminal-view: fix array indexing --- terminal-view/src/main/java/com/termux/view/TerminalView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index 433925239d..41fe31dafc 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -1547,8 +1547,8 @@ private Properties getProperties() { }; propsFile = new File(possiblePropLocations[0]); - int i = 1; - while (!propsFile.exists() && i <= possiblePropLocations.length) { + int i = 0; + while (!propsFile.exists() && i < possiblePropLocations.length) { propsFile = new File(possiblePropLocations[i]); i += 1; } From 92570bee06fc86573354d5c1f0e3eb61d7f0d864 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sun, 17 Jan 2021 19:45:19 +0200 Subject: [PATCH 105/815] version 0.106 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7eaad4173e..591d83ea2b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.termux" minSdkVersion project.properties.minSdkVersion.toInteger() targetSdkVersion project.properties.targetSdkVersion.toInteger() - versionCode 105 - versionName "0.105" + versionCode 106 + versionName "0.106" externalNativeBuild { ndkBuild { From 32c3ffd57b3a9042d2083e030af1c583c77a2180 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Sun, 17 Jan 2021 20:01:05 +0200 Subject: [PATCH 106/815] readme: still need to clarify that app is "not maintained" Please note that I do not review changes made by project collaborators. Before submitting changes to branch 'master' ensure they are working properly. I may not find the issue and fix it in time, like in case with v0.105 release. --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 3cf831b390..8f43c191e4 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,15 @@ Note that this repository is for the app itself (the user interface and the terminal emulation). For the packages installable inside the app, see [termux/termux-packages](https://github.com/termux/termux-packages) +*** + +**@termux is looking for Termux Application maintainer for implementing new features, +fixing bugs and reviewing pull requests since current one (@fornwall) is inactive.** + +Issue https://github.com/termux/termux-app/issues/1072 needs extra attention. + +*** + ## Installation Termux application can be obtained from: From b5d491a54ca20f1e46f470c29b95c380f36dde5d Mon Sep 17 00:00:00 2001 From: David Kramer Date: Wed, 27 Jan 2021 18:37:06 -0600 Subject: [PATCH 107/815] Implement full screen and add FullScreenWorkAround to fix ExtraKeysView not displaying properly and inconsistently between various devices --- .../com/termux/app/FullScreenWorkAround.java | 136 ++++++++++++++++++ .../java/com/termux/app/TermuxActivity.java | 10 ++ .../com/termux/app/TermuxPreferences.java | 45 ++++++ 3 files changed, 191 insertions(+) create mode 100644 app/src/main/java/com/termux/app/FullScreenWorkAround.java diff --git a/app/src/main/java/com/termux/app/FullScreenWorkAround.java b/app/src/main/java/com/termux/app/FullScreenWorkAround.java new file mode 100644 index 0000000000..3f282cd42b --- /dev/null +++ b/app/src/main/java/com/termux/app/FullScreenWorkAround.java @@ -0,0 +1,136 @@ +package com.termux.app; + +import android.content.Context; +import android.graphics.Rect; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; + +import static com.termux.terminal.EmulatorDebug.LOG_TAG; + +/** + * Work around for fullscreen mode in Termux to fix ExtraKeysView not being visible. + * This class is derived from: + * https://stackoverflow.com/questions/7417123/android-how-to-adjust-layout-in-full-screen-mode-when-softkeyboard-is-visible + * and has some additional tweaks + * --- + * For more information, see https://issuetracker.google.com/issues/36911528 + */ +public class FullScreenWorkAround { + /** + * TODO add documentation so user can know available options and know they may need to experiment + * for their specific device + */ + private static final int WORK_AROUND_METHOD_1 = 1; + private static final int WORK_AROUND_METHOD_2 = 2; + private static final int WORK_AROUND_METHOD_3 = 3; + + private int mWorkAroundMethod; + + private View mChildOfContent; + private int mUsableHeightPrevious; + private ViewGroup.LayoutParams mViewGroupLayoutParams; + + private int mStatusBarHeight; + private int mExtraKeysHeight; + + + public static void apply(TermuxActivity activity, ExtraKeysView view, int workAroundMethod) { + new FullScreenWorkAround(activity, view, workAroundMethod); + } + + private FullScreenWorkAround(TermuxActivity activity, ExtraKeysView view, int workAroundMethod) { + ViewGroup content = activity.findViewById(android.R.id.content); + mChildOfContent = content.getChildAt(0); + mViewGroupLayoutParams = mChildOfContent.getLayoutParams(); + mStatusBarHeight = lookupStatusBarHeight(activity); + mWorkAroundMethod = workAroundMethod; + + // ExtraKeysView height is 0 at this point, so we need this to get actual size + view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + mExtraKeysHeight = view.getMeasuredHeight(); + + // only needed one time so we can remove + view.getViewTreeObserver().removeOnGlobalLayoutListener(this); + + // now that we have ExtraKeysView height, we can apply this work-around so that we can see ExtraKeysView when keyboard + // is shown and dismissed + mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(FullScreenWorkAround.this::possiblyResizeChildOfContent); + } + }); + } + + private void possiblyResizeChildOfContent() { + int usableHeightNow = computeUsableHeight(); + if (usableHeightNow != mUsableHeightPrevious) { + int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); + int heightDifference = usableHeightSansKeyboard - usableHeightNow; + if (heightDifference > (usableHeightSansKeyboard / 4)) { + // keyboard probably just became visible + + // ensures that usable layout space does not extend behind the + // soft keyboard, causing the extra keys to not be visible + int adjustedHeight = mViewGroupLayoutParams.height; + + // height adjustment does not behave consistently between devices so you may need to do + // a bit of trial and error to see if one of these works for your device + int workAroundMethod = getWorkAroundMethod(); + + switch (workAroundMethod) { + case WORK_AROUND_METHOD_1: + // tested w/ Pixel (emulator) + adjustedHeight = (usableHeightSansKeyboard - heightDifference) + getExtraKeysHeight() + (getStatusBarHeight() / 2); + break; + case WORK_AROUND_METHOD_2: + // tested w/ Samsung S7 and OnePlus 6T + adjustedHeight = (usableHeightSansKeyboard - heightDifference); + break; + case WORK_AROUND_METHOD_3: + // tested w/ Sony Xperia XZ + adjustedHeight = (usableHeightSansKeyboard - heightDifference) + getExtraKeysHeight(); + break; + default: + Log.w(LOG_TAG, "Unknown / Unsupported workAroundMethod for height offset: [" + workAroundMethod + "]"); + // TODO may need to add more cases for other devices as they're tested.. + } + mViewGroupLayoutParams.height = adjustedHeight; + } else { + // keyboard probably just became hidden + mViewGroupLayoutParams.height = usableHeightSansKeyboard; + } + mChildOfContent.requestLayout(); + mUsableHeightPrevious = usableHeightNow; + } + } + + private int computeUsableHeight() { + Rect r = new Rect(); + mChildOfContent.getWindowVisibleDisplayFrame(r); + return (r.bottom - r.top); + } + + private int getExtraKeysHeight() { + return mExtraKeysHeight; + } + + private int getStatusBarHeight() { + return mStatusBarHeight; + } + + private int lookupStatusBarHeight(Context context) { + int height = 0; + int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + height = context.getResources().getDimensionPixelSize(resourceId); + } + return height; + } + + private int getWorkAroundMethod() { + return mWorkAroundMethod; + } +} + diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index d46a2da219..77ef1d8c40 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -222,6 +222,10 @@ public void onCreate(Bundle bundle) { ); } + if (mSettings.isUsingFullScreen()) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + mTerminalView = findViewById(R.id.terminal_view); mTerminalView.setOnKeyListener(new TermuxViewClient(this)); @@ -256,6 +260,12 @@ public Object instantiateItem(@NonNull ViewGroup collection, int position) { if (position == 0) { layout = mExtraKeysView = (ExtraKeysView) inflater.inflate(R.layout.extra_keys_main, collection, false); mExtraKeysView.reload(mSettings.mExtraKeys); + + // apply extra keys fix if enabled in prefs + if (mSettings.isUsingFullScreen() && mSettings.isUsingFullScreenWorkAround()) { + FullScreenWorkAround.apply(TermuxActivity.this, mExtraKeysView, mSettings.getFullScreenWorkAroundMethod()); + } + } else { layout = inflater.inflate(R.layout.extra_keys_right, collection, false); final EditText editText = layout.findViewById(R.id.text_input); diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index 3703cd0956..e1d68333f3 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -28,6 +28,8 @@ import androidx.annotation.IntDef; +import static com.termux.terminal.EmulatorDebug.LOG_TAG; + final class TermuxPreferences { @IntDef({BELL_VIBRATE, BELL_BEEP, BELL_IGNORE}) @@ -67,6 +69,10 @@ final static class KeyboardShortcut { private boolean mScreenAlwaysOn; private int mFontSize; + private boolean mUseFullScreen; + private boolean mUseFullScreenWorkAround; + private int mFullScreenWorkAroundMethod; + @AsciiBellBehaviour int mBellBehaviour = BELL_VIBRATE; @@ -137,6 +143,18 @@ boolean isUsingBlackUI() { return mUseDarkUI; } + boolean isUsingFullScreen() { + return mUseFullScreen; + } + + boolean isUsingFullScreenWorkAround() { + return mUseFullScreenWorkAround; + } + + int getFullScreenWorkAroundMethod() { + return mFullScreenWorkAroundMethod; + } + void setScreenAlwaysOn(Context context, boolean newValue) { mScreenAlwaysOn = newValue; PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(SCREEN_ALWAYS_ON_KEY, newValue).apply(); @@ -196,6 +214,33 @@ void reloadFromProperties(Context context) { mUseDarkUI = nightMode == Configuration.UI_MODE_NIGHT_YES; } + switch (props.getProperty("fullscreen", "").toLowerCase()) { + case "true": + mUseFullScreen = true; + break; + case "false": + default: + mUseFullScreen = false; + } + + switch (props.getProperty("use-fullscreen-workaround", "").toLowerCase()) { + case "true": + mUseFullScreenWorkAround = true; + break; + case "false": + default: + mUseFullScreenWorkAround = false; + } + + String workAroundMethodStr = props.getProperty("fullscreen-workaround-method", ""); + if (workAroundMethodStr != null && !workAroundMethodStr.isEmpty()) { + try { + mFullScreenWorkAroundMethod = Integer.parseInt(workAroundMethodStr); + } catch (Exception ex) { + Log.e(LOG_TAG, "fullscreen-workaround-method error: " + ex.getMessage()); + } + } + String defaultExtraKeys = "[[ESC, TAB, CTRL, ALT, {key: '-', popup: '|'}, DOWN, UP]]"; try { From 096dedffb1dbc028be7818c4fbe47caecf33b73a Mon Sep 17 00:00:00 2001 From: David Kramer Date: Thu, 28 Jan 2021 06:51:23 -0600 Subject: [PATCH 108/815] Remove height offset workarounds / config * Use WindowInsetsListener to get nav bar height and use that instead for calculating adjusted height for extra keys view --- .../com/termux/app/FullScreenWorkAround.java | 92 +++---------------- .../java/com/termux/app/TermuxActivity.java | 23 ++++- .../com/termux/app/TermuxPreferences.java | 14 --- 3 files changed, 29 insertions(+), 100 deletions(-) diff --git a/app/src/main/java/com/termux/app/FullScreenWorkAround.java b/app/src/main/java/com/termux/app/FullScreenWorkAround.java index 3f282cd42b..006918ee0f 100644 --- a/app/src/main/java/com/termux/app/FullScreenWorkAround.java +++ b/app/src/main/java/com/termux/app/FullScreenWorkAround.java @@ -1,13 +1,8 @@ package com.termux.app; -import android.content.Context; import android.graphics.Rect; -import android.util.Log; import android.view.View; import android.view.ViewGroup; -import android.view.ViewTreeObserver; - -import static com.termux.terminal.EmulatorDebug.LOG_TAG; /** * Work around for fullscreen mode in Termux to fix ExtraKeysView not being visible. @@ -18,49 +13,23 @@ * For more information, see https://issuetracker.google.com/issues/36911528 */ public class FullScreenWorkAround { - /** - * TODO add documentation so user can know available options and know they may need to experiment - * for their specific device - */ - private static final int WORK_AROUND_METHOD_1 = 1; - private static final int WORK_AROUND_METHOD_2 = 2; - private static final int WORK_AROUND_METHOD_3 = 3; - - private int mWorkAroundMethod; - private View mChildOfContent; private int mUsableHeightPrevious; private ViewGroup.LayoutParams mViewGroupLayoutParams; - private int mStatusBarHeight; - private int mExtraKeysHeight; + private int mNavBarHeight; - public static void apply(TermuxActivity activity, ExtraKeysView view, int workAroundMethod) { - new FullScreenWorkAround(activity, view, workAroundMethod); + public static void apply(TermuxActivity activity) { + new FullScreenWorkAround(activity); } - private FullScreenWorkAround(TermuxActivity activity, ExtraKeysView view, int workAroundMethod) { + private FullScreenWorkAround(TermuxActivity activity) { ViewGroup content = activity.findViewById(android.R.id.content); mChildOfContent = content.getChildAt(0); mViewGroupLayoutParams = mChildOfContent.getLayoutParams(); - mStatusBarHeight = lookupStatusBarHeight(activity); - mWorkAroundMethod = workAroundMethod; - - // ExtraKeysView height is 0 at this point, so we need this to get actual size - view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - mExtraKeysHeight = view.getMeasuredHeight(); - - // only needed one time so we can remove - view.getViewTreeObserver().removeOnGlobalLayoutListener(this); - - // now that we have ExtraKeysView height, we can apply this work-around so that we can see ExtraKeysView when keyboard - // is shown and dismissed - mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(FullScreenWorkAround.this::possiblyResizeChildOfContent); - } - }); + mNavBarHeight = activity.getNavBarHeight(); + mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this::possiblyResizeChildOfContent); } private void possiblyResizeChildOfContent() { @@ -73,30 +42,7 @@ private void possiblyResizeChildOfContent() { // ensures that usable layout space does not extend behind the // soft keyboard, causing the extra keys to not be visible - int adjustedHeight = mViewGroupLayoutParams.height; - - // height adjustment does not behave consistently between devices so you may need to do - // a bit of trial and error to see if one of these works for your device - int workAroundMethod = getWorkAroundMethod(); - - switch (workAroundMethod) { - case WORK_AROUND_METHOD_1: - // tested w/ Pixel (emulator) - adjustedHeight = (usableHeightSansKeyboard - heightDifference) + getExtraKeysHeight() + (getStatusBarHeight() / 2); - break; - case WORK_AROUND_METHOD_2: - // tested w/ Samsung S7 and OnePlus 6T - adjustedHeight = (usableHeightSansKeyboard - heightDifference); - break; - case WORK_AROUND_METHOD_3: - // tested w/ Sony Xperia XZ - adjustedHeight = (usableHeightSansKeyboard - heightDifference) + getExtraKeysHeight(); - break; - default: - Log.w(LOG_TAG, "Unknown / Unsupported workAroundMethod for height offset: [" + workAroundMethod + "]"); - // TODO may need to add more cases for other devices as they're tested.. - } - mViewGroupLayoutParams.height = adjustedHeight; + mViewGroupLayoutParams.height = (usableHeightSansKeyboard - heightDifference) + getNavBarHeight(); } else { // keyboard probably just became hidden mViewGroupLayoutParams.height = usableHeightSansKeyboard; @@ -106,31 +52,15 @@ private void possiblyResizeChildOfContent() { } } + private int getNavBarHeight() { + return mNavBarHeight; + } + private int computeUsableHeight() { Rect r = new Rect(); mChildOfContent.getWindowVisibleDisplayFrame(r); return (r.bottom - r.top); } - private int getExtraKeysHeight() { - return mExtraKeysHeight; - } - - private int getStatusBarHeight() { - return mStatusBarHeight; - } - - private int lookupStatusBarHeight(Context context) { - int height = 0; - int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); - if (resourceId > 0) { - height = context.getResources().getDimensionPixelSize(resourceId); - } - return height; - } - - private int getWorkAroundMethod() { - return mWorkAroundMethod; - } } diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 77ef1d8c40..5839d10a56 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -134,6 +134,8 @@ public final class TermuxActivity extends Activity implements ServiceConnection boolean mIsUsingBlackUI; + int mNavBarHeight; + final SoundPool mBellSoundPool = new SoundPool.Builder().setMaxStreams(1).setAudioAttributes( new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION).build()).build(); @@ -214,18 +216,25 @@ public void onCreate(Bundle bundle) { super.onCreate(bundle); + setContentView(R.layout.drawer_layout); + View content = findViewById(android.R.id.content); + content.setOnApplyWindowInsetsListener((v, insets) -> { + mNavBarHeight = insets.getSystemWindowInsetBottom(); + return insets; + }); + + if (mSettings.isUsingFullScreen()) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + if (mIsUsingBlackUI) { findViewById(R.id.left_drawer).setBackgroundColor( getResources().getColor(android.R.color.background_dark) ); } - if (mSettings.isUsingFullScreen()) { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - mTerminalView = findViewById(R.id.terminal_view); mTerminalView.setOnKeyListener(new TermuxViewClient(this)); @@ -263,7 +272,7 @@ public Object instantiateItem(@NonNull ViewGroup collection, int position) { // apply extra keys fix if enabled in prefs if (mSettings.isUsingFullScreen() && mSettings.isUsingFullScreenWorkAround()) { - FullScreenWorkAround.apply(TermuxActivity.this, mExtraKeysView, mSettings.getFullScreenWorkAroundMethod()); + FullScreenWorkAround.apply(TermuxActivity.this); } } else { @@ -341,6 +350,10 @@ public void onPageSelected(int position) { sendOpenedBroadcast(); } + public int getNavBarHeight() { + return mNavBarHeight; + } + /** * Send a broadcast notifying Termux app has been opened */ diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index e1d68333f3..1d85b72780 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -71,7 +71,6 @@ final static class KeyboardShortcut { private boolean mUseFullScreen; private boolean mUseFullScreenWorkAround; - private int mFullScreenWorkAroundMethod; @AsciiBellBehaviour int mBellBehaviour = BELL_VIBRATE; @@ -151,10 +150,6 @@ boolean isUsingFullScreenWorkAround() { return mUseFullScreenWorkAround; } - int getFullScreenWorkAroundMethod() { - return mFullScreenWorkAroundMethod; - } - void setScreenAlwaysOn(Context context, boolean newValue) { mScreenAlwaysOn = newValue; PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(SCREEN_ALWAYS_ON_KEY, newValue).apply(); @@ -232,15 +227,6 @@ void reloadFromProperties(Context context) { mUseFullScreenWorkAround = false; } - String workAroundMethodStr = props.getProperty("fullscreen-workaround-method", ""); - if (workAroundMethodStr != null && !workAroundMethodStr.isEmpty()) { - try { - mFullScreenWorkAroundMethod = Integer.parseInt(workAroundMethodStr); - } catch (Exception ex) { - Log.e(LOG_TAG, "fullscreen-workaround-method error: " + ex.getMessage()); - } - } - String defaultExtraKeys = "[[ESC, TAB, CTRL, ALT, {key: '-', popup: '|'}, DOWN, UP]]"; try { From 0e94d520940679e54644e602b487369d6bed891a Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 02:56:53 +0200 Subject: [PATCH 109/815] readme: remove links to Google Play and Nethunter stores Both offer outdated builds. --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 8f43c191e4..0eecba0068 100644 --- a/README.md +++ b/README.md @@ -25,11 +25,7 @@ Issue https://github.com/termux/termux-app/issues/1072 needs extra attention. ## Installation -Termux application can be obtained from: - -- [Google Play](https://play.google.com/store/apps/details?id=com.termux) -- [F-Droid](https://f-droid.org/en/packages/com.termux/) -- [Kali Nethunter Store](https://store.nethunter.com/en/packages/com.termux/) +Termux application can be obtained from [F-Droid](https://f-droid.org/en/packages/com.termux/). Additionally we provide per-commit debug builds for those who want to try out the latest features or test their pull request. This build can be obtained From 7be1fe5555d0673a5b17ad6bb34bc18627de7684 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 15:49:03 +0200 Subject: [PATCH 110/815] icon: add regular png icon for compatibility with some launchers See https://github.com/termux/termux-app/issues/991. Adaptive icon will continue to be automatically used if supported. --- app/src/main/AndroidManifest.xml | 5 +-- app/src/main/res/drawable/ic_launcher.xml | 34 ------------------ .../ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1454 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 1609 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1122 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 1199 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1847 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 2108 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3238 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 3748 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 3556 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 4497 bytes art/ic_launcher2.png | Bin 0 -> 10167 bytes art/ic_launcher2_round.png | Bin 0 -> 13356 bytes 16 files changed, 8 insertions(+), 36 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_launcher.xml rename app/src/main/res/{drawable-anydpi-v26 => mipmap-anydpi-v26}/ic_launcher.xml (100%) create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 art/ic_launcher2.png create mode 100644 art/ic_launcher2_round.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 455f5c39e6..035fc8dafa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,7 +11,7 @@ @@ -28,7 +28,8 @@ - - - - - - - - - diff --git a/app/src/main/res/drawable-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from app/src/main/res/drawable-anydpi-v26/ic_launcher.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000000..6192469fc4 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..afdebcef32eba155be9570a357e5a6a8b85820e3 GIT binary patch literal 1454 zcmV;f1yTBmP)*$2MdZgWT;LSM2k3T6^c+H)C#RSm|Xe=O&XFE7e~Rh;NZt% z)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HIM~n$;Ji;9VI^55 zJ|`YG>4L z)|5Tqat9cCGGtSBr65hAPypV~=$mrDz%9_X=JnRv$LRx*p{`Olz`-FfR;288pLh3m z_V(|YR)0TKlX9Dx7F>1!000JJOGiWi{{a60|De66lK=n!32;bRa{vGh*8l(w*8xH( zn|J^K1II~3K~#9!?Oab!;y@gI?Us;T35gpKIqbn8C%=IwI2q#6KNk*u4x@YrW6+aF zz4!$d)J}_f|iR z*Bt+#0f>mu4T+2M9s+>42z^)1LB^5@{m6oYj70%J6~Hv@o-m4<0H6)_4!c-^B0zWR zq2c%YUqhi#gLEyI%T2f2?XeNv);b{=3^odd!lR~XYA^Tp_DXi!Wsvqi9F0b6vMe{X z9w>^^-q_eEGY}kIfdFXR+uLPh0D^u0#F_4Rex>-EYE z1W8XI09qgrcr6x-b&^P9;786h6pco!vMjeu{OFc}K8_e%49N?5n3O)*ZA!0?2CyX zsi{iT<6RpU)MG#i0{cI{1*nZvFL~&*$5kL)hHhwEc|0hj;T^TU(Xo<>jxv z?>{^|G}hPGzciao#}e0Q;Um7|+T$;*j3C>;ZZH^pIXXHL4d2n;UbE{vCO@20gTNM; zeFQHY4p$^eQk_tzR4V!E_4;SK0`Z49&7p|UQ>Qt|sEg3^$~nl$i_nwqImq}SLa#`` zLB<77hcbr-BONLSAVa%13?c&{*V$^MX!nLebZNqqdb{~9sTbgB;T;mw!aLxF1uO~+ z0K7Cs-_jHSFK#jrczK)wzzZx52wtLV08DI=H#_^Ui7FHL7vj)T+@mUjcmMzZ07*qo IM6N<$f~19wPyhe` literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5bcc560229c7c522b5769f29442ae0568c985c GIT binary patch literal 1609 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f6fa3a54e27154d3a7a2274284d0b7c5c1c932 GIT binary patch literal 1199 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8226e698e4fb1baee32abfb82a2fdde17a2469 GIT binary patch literal 2108 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 Sf<*?u1sLm_>*4RhAN>#Hur-VT literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c7fab15426171d85f596c0d7ce9326178e84df GIT binary patch literal 3748 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..981c54053c7f6c8026a6c54fe7009d4b7db3079a GIT binary patch literal 4497 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 KO$bJaxc>upK!|$) literal 0 HcmV?d00001 diff --git a/art/ic_launcher2.png b/art/ic_launcher2.png new file mode 100644 index 0000000000000000000000000000000000000000..40affe360860c40791c1966e0195fd8c783822bf GIT binary patch literal 10167 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 Date: Wed, 3 Feb 2021 15:56:38 +0200 Subject: [PATCH 111/815] documents provider: fix application icon reference --- .../java/com/termux/filepicker/TermuxDocumentsProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/filepicker/TermuxDocumentsProvider.java b/app/src/main/java/com/termux/filepicker/TermuxDocumentsProvider.java index cbecfd705e..b72442ac27 100644 --- a/app/src/main/java/com/termux/filepicker/TermuxDocumentsProvider.java +++ b/app/src/main/java/com/termux/filepicker/TermuxDocumentsProvider.java @@ -75,7 +75,7 @@ public Cursor queryRoots(String[] projection) throws FileNotFoundException { row.add(Root.COLUMN_TITLE, applicationName); row.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES); row.add(Root.COLUMN_AVAILABLE_BYTES, BASE_DIR.getFreeSpace()); - row.add(Root.COLUMN_ICON, R.drawable.ic_launcher); + row.add(Root.COLUMN_ICON, R.mipmap.ic_launcher); return result; } @@ -262,7 +262,7 @@ private void includeFile(MatrixCursor result, String docId, File file) row.add(Document.COLUMN_MIME_TYPE, mimeType); row.add(Document.COLUMN_LAST_MODIFIED, file.lastModified()); row.add(Document.COLUMN_FLAGS, flags); - row.add(Document.COLUMN_ICON, R.drawable.ic_launcher); + row.add(Document.COLUMN_ICON, R.mipmap.ic_launcher); } } From 58b7a26b33c654a0e40504d79aec552519ee5887 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 16:43:17 +0200 Subject: [PATCH 112/815] add basic metadata for F-Droid. Fixes https://github.com/termux/termux-app/issues/622. --- .../android/en-US/full_description.txt | 13 +++++++++++++ .../metadata/android/en-US/images/icon.png | Bin 0 -> 3556 bytes .../en-US/images/phoneScreenshots/1.jpg | Bin 0 -> 141057 bytes .../en-US/images/phoneScreenshots/2.jpg | Bin 0 -> 120386 bytes .../en-US/images/phoneScreenshots/3.jpg | Bin 0 -> 98625 bytes .../en-US/images/phoneScreenshots/4.jpg | Bin 0 -> 162046 bytes .../android/en-US/short_description.txt | 1 + 7 files changed, 14 insertions(+) create mode 100644 fastlane/metadata/android/en-US/full_description.txt create mode 100644 fastlane/metadata/android/en-US/images/icon.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg create mode 100644 fastlane/metadata/android/en-US/short_description.txt diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 0000000000..beb4173995 --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,13 @@ +Termux is a terminal emulator application enhanced with a large set of command line utilities ported to Android OS. The main goal is to bring a Linux command line experience to users of mobile devices with no rooting or other special setup required. + +* Enjoy the Bash and Zsh shells. +* Edit files with nano and vim. +* Access servers over SSH. +* Compile C/C++ code with clang. +* Use the Python console as a pocket calculator. +* Check out projects with Git and Subversion. +* Run text-based games with frotz. + +At first start a small base system is being configured. The GNU Bash, Coreutils, Findutils and other core utilities are available out-of-box. Additionally, we provide more than 1000 other packages installable by using the 'pkg' utility which currently is a frontend for the 'apt' package manager. All provided software has been patched and compiled with Android NDK to provide max compatibility with Android OS. + +To learn more about application usage tips and tricks, long-press anywhere on the terminal and select the Help menu option to access Termux Wiki. This resource is also accessible directly in a web browser: https://wiki.termux.com/wiki/Main_Page. diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ce8bcf07de165b0dab766c0c3af84b1499028d GIT binary patch literal 3556 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac0d54b5c98ad50d8a4f8d179d537c79a3cf65ab GIT binary patch literal 141057 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�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≀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

j!fvd`?GRNdZ`){{Nik}<1ai;me% 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 z%0D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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7a00fa75a58b94f3b324add78c008b6511253051 GIT binary patch literal 98625 zcmeFY2UJttw=cR85G#s;bWrIay@ZbC10+b0(1cJ#q?6Ez5{eB_>St(50!RrELQz_P z2&lA=st{@*^xk_fFaFCo=iYbD|J*z7yW_n##+}(~?cZK&u3q+>S#zKCpNs;R!8&?6 z0396w(9wRt$=LZ`?Po5I0HCKQ4x9l1;1nQBcM4#lAz_+x31|4t21wCd7|lI&vA6TF z0{{j9_><|k56H;L$(;K1cP?dG0R2C(;8_5;o^=YiLF0K!bH7PZ=Bb=LNZHO&?um*6 zNKxj$CjdAN(9_ZXt;Ewbel9x3zu|5g=KcpBqG8d0@SLJyx>J8IdyB1Q%8eKYn{_F*oOINP2Tw-CldX0zu zDk~Qo3k$~$4lZ6^et!O|>^B8(@(J?r@$;R~GNGd-Wjf8oeC7-@A1ezh-~Tk7d;?g{ z0H1(|^mI3YQ!I4!EOaOJ01vGNr|9W^kJvwnp79g|(`mXhv{>cKz$rR<`cn+_ry1!P ze>2dXq6ZjQ7_Z#8D$9EFj?rnmmuv!ZUhmVHC0~?}ya04F7oIFONaq=8TSp?zURu6sK-CSK`DUsn^~rE`J!;ak!Aw`I&=rhAFlv;9MT1YiX$v zQE!eUII%zj@ZeE@%KvmMX!mA(OweA^~M z_@&cu3@&bNH$TC4>)+Ij&YGIgeg9dw;@ZC(4*5b(u7BiqZT~~Xmxyuub8@@StsK(f z-yD*@2*kR6-%PUJt08yv2UN0)`P^#7r*<*36bHEeujMl`3aE zA7`pFtJx2~HapNIzuC~{t)i&HohMTDK2F-4{l*fbR-`=X^-w#zAJdz#B%mM6Vvn|{ zS&J1UF#M!{b!KA5EZKg`_hpdWv=6ro`hH=S!^4I!URw_OKAwPszO-IH!bhozRit;8 zC;m*QfhYrZ@O z4&N`$=GA*O1IRoSIXmlqB64TFaHCT2ttkDFU91+kz|27fdS~fRw<*SiO7f}t0#pdg zlX2*mSEoiN=sla&oi;QUmf9>Yn=9=Q8(yr36Ca*!!e4Asv;be673i|mu~MuX#cNgf}ly*drJZllZaEw@)SqC4*t#vH(l>tNL8B(le z^hDRann6tY!&!EjT%nNsG!TQ&%LPl;PhaL{>+996XIqITo9r!LmzpqfgBsOt!r}KW zSF-mtTIV>g&YupFLz+7LZukHAr4jZTE)@N`0ks<7D%D~2U;}>r@nf&l`l}m16~X(b zKR2ZK?wz{&{*?@)pBwCewabQG_T$^TvGWy70t-!Z77e*Bb$65&jq4K`l!jZ_8JucE zAVX%QVH!d$h*C+2-h;$_lh5_Hf2>?!;@L1Scj@}Py2H@wy+ ziO7uc6JTt+Tk?mD%-3ugJ&ubBDialZ6DmArT!ruPR4V7vrm+ii&v~xPw*h;>{kWmz zc_$-s2>F=%>^Ko|<%^la zdtM4QlPb0wy&g4va&192XSX!JKDr%%Z1;PvcwYL8L4_>mJ8CW8W2Fh_t>q9qW5e7z zgVp&#anWk#HnP*27{~eFxxF~l$`2iK7i_B0JptUr6fRn2ywCpYrFomT%1mv@23zm4 zqNHLeoqO)9MOop;&mF`AD|VXsbK1IAjL7`AVZP_2zCY;-@w`47(!?*FBF3a=kfWE= zlzx9nSo&^m)a7$>EMfaQE9(uC4qb7#n-`v~R@j&{5cx7|ywbXIOOOidjnX6 zpZ{yRaAi@UwAa4$#qD3$`}@wFz4AOfjsLpWX5r8s)@1M5+f(h!&zgBPQ%5`kr!y?z z#(LHj3rq0&Kg}J#0rVqkwXPjOS_TJj_g~*6yW>H0dgk0G04M+Z{6cr%_l3Ap=Tw$6 zW*@vQ^w*CEfcH&24H8?UdvQexxSpHYmM+lCV&eIE_WnbL=TyIu~m zCr2cb4Z9}$5_>0`JY1QZK8QUA9J$x_{Xez1C~W;&j~bQ*$xBxA(V~ELSaDmI#7!OrfR|X-pnwy_(%38+$v35JgLq~ zr5eKe>y4aM+Wt~^1QUHiId~>Ce%jgIg7Zy4uT5KUHuvM6cIZ7;7N|JP;}-R3d!lcK zJ*AWw#ZSKZ`PB6ADBe4Uok7lj-{@NL98B^36Os59j(S+0CoEW5`7c)0dqKqQ5R3h9 zA6oss;)wRO#KYd2I5^%lIT>bIvq!!Ekk#j>#_oQ1A0-%PpQlmKT`l(h^youA`6k4f zt#(%HTjif`z3K8}7H9?EZgyujwA<@W3{bA z+mpdt8&;jkjc1nm#!dLN4IA-x8rVmf}`G}hx`e6yR?#tCh@i-AAPsIrEe^1>HL)bd7a~h~$wXIt1|j=0?E$~x z0~6x@QNwn|PT&2f@4Lk&nW>+FZ)^tlv?<-LqnH1F@a2Z~Wx%IO;d{Hi6!w@qD6TQKx^0pZq(F^!4;vH~y_6sKed; zewX!|ev8f*91y0)wEH8P;{kjCD4+}61+D`ofHzuA9 z19$@NG>+%A=ZAni&DW(p!2v%S&;O17tv_E=0YIbXmg#)ejdbGCM)6}`^fE*wL$O1|<)#VLv_B7KOrqldp_CXha?>fUSpa^=Ev8wRI_s2bxxV6_MJ3@BD|hTxjl5n$|64U_?9)Hk z{?G0I2R+bV>KNT#7H0niqL%a%v-jCXx_Vt7wNv8OcXXwiH>YZu+-qqR)6w{|W2I)O z=99{wOyFM{EcSkm27TZn(`!fP>s*?pmNeDHY)=~#UhSPR15FfxgHI-Z>n zUof07()-tSI&>&kMZ~E>=Wn{h$TB84x zK4*S8bR$0;n7`{<`lLuOE~?9V9)#4d={P=}p6=V)LqRL}Z!5*8_LLVCW5)bY2eg~Vdera0D!S0 ziTv!yD0Y5samjMq+o-zI_FcHqQy4IcTn+o$mK0`oBnY zIp;1ptio|2+#pZI>mF~eK&^aV^PX!kX_WE4Bn}PE3Od^u-2U@uFChVMk_m0McscsJs#m`3 ziapLMT=D(L3Y?xx_qAcyXq`7NfZ^-9T)<`|Z~smE73+3tR$R?!*Y_bg%arpDA1)>t znIMtzb3GK~_8lPv_j}!UzXEij(7e@0MAi2Y*Z7Q{i4Y9CXv6Yo>d|&}k*CVP>KHl+ z@ke5go(nt)8n|BfwSk(0XZ;bt5pT+7Xtn~x{2Yhr+2%n9?O_(mA--%QYnQSUv~;y9 z_yoAbzi?x#WW$WG~bhw3sn z_Y;5H3y?N~FAK?+YMDm|_I%kY?*KvxCk|~?v zas|a_J_AENLMc!^32%}|%tV|CUc8Ju5JuWi4cAU#GwXh5R`9HIf@3wouvk;w7Ad1z zdrzeXo-!M%+TOg>A{#d$O7IBWS(4c4KOFq{WG2xy0G$asZ<1y%3c8l*pMZ7W4P~$O}*)73$$+8Q!a!-iMr~fjy!lSZ z{FP1EgkyYW2)Cm5TL3s~;b`}+rQ}Tao8)*)FSl*#u8D|Hl2J)TNq zYi&+T?I<|n_vCCacrbs55^wKH9Ftg$SgSeM39@T->%@l_j*|_Pk^_ycjAb!11{{ZJ zGQC~CNsO*&D_BTY0Z?0<=#*8L*9E6ijaL^Mm?YP6l@Z&KyYzis%J0@9;p z4T^~uxhuA~JMyOJ@FFJr!k}#H1{X`Hp0?j*>b0)XO73f_BchHY88szFbEJdu@FR82 zEJmrQZk2XxQ*G5AE*$zP{LTzxZE9N2;nwBSX;4-!*mtD?&J z>`Yt3x*u;#A22V3pMAc5fiqmYzwfo5XW7`hR}(!Xlh|?)>QFj_9%>P)Zotk(2pE&_ zFpN6^g2_%DrNefdyV>3EM1iOHi`#L={Lgik`}SEC~2NI(1Vtk4JLF=qQMf)g2pdsFZ}YPzhtYDRHH>D*HI(h*6YD%7OB@~`lVtN zu%5pB+vr%F)MgrI?H-QW`qwz84g7-x8!QL<5N=UHQmRDAOn8031`Bm~d&i9rl7ihY zSp+keJH$o_)EJ{9wuw(Y(zPy;cX5qO}M)2~&?gfTa*$P5d#VD-9bU%|wM`59~xPBt;CO@dw*@VTAyio6o$k zOw;(y!?2sK60d5e7Ekr*&MxVO_pm-)-Ow{oqKv{e!}G?%8z(#uKnoH&VDq7JDAnEy z-v#-MhfuRohX$4fdcC=WNDoxtx1DzlPh<_?dL#)6(ty;&8Cs1|p{}K)U2u^GTOXpP z<3{|ZQ*>LER-&wFgpn~iw4yPk8ZVII~+*Fn*b?;^GOxK$cZ>i8IPtbZJnwkEZ{bUtVQkMHDydk2iyG9z-TaSlOw z@ZqHcB6T1e*P*DC-8c^+AY`pgmAhhET<6ufNvNYlo6|o(_@+nw$dma|mx}|p>+JX> zp>j_EF^vP#ZuR!S#Sp6rIUXB7cSXqv&xluu9lRUud}HN%ZBPQWLejV2ukm@3>#doB z9Nj$chy^GTg4)iiv_%qQueCp;+gICHJ{IUc0dkX;jkT09BRbXs;|l6H_KQ_MNU!ST zK&7~n@rsG+usSP)^$PHM8kn7|#GRHE4B@O&o#BU6HN#l!>r{2O}^#+)XYi}sca~Pw0Qgf^*Yi8CA#J#OkYLa z;1Db--A2s#kKh)~Y;>Nl+}cXAm?CYrq@Vt^Wp=jJtr)tXmQ@4aTlCybu2lA(Dqq_V z2|3%8xKbk{GN~;7JP`%P_#5NTfSSR2peb*<<#;FYyuRukSoA@`IGi|Z6)Z2>^-)t5 zE2FS2dP}3bXaBg^Rux`wAax)el(Oro?3ms5S*08?19{`zfSc8(iojP$k&|d$lTOPS z?hmu-wk{F%cVi!xKdlxMkMnXNd3Y6jc?9)c181*g3_viSXB}dS=7Gf!fTU)PvdElYm3bOVk9F`%er_0Y#X*3Y;pI}|PSb=jA z;igh8+*fLrnR`{(EXc>P{TNN<__UIPtHU|=O?c-eZvH~747oB3ZyM8< zIh`EHdF(KT}1L=#DCi-CZ_m-W=3zkbL(`AL2HAKl)>}G!8VF_ z>?%FW31C)}rxTgugN3AZj9FfzyeTaDzN2u+1*hvQ=}44U&(us2H*szZRjCk1ac5;L z)ea(-`7}1GZ%tPEU%h&dMMsTwO`%7ddA8LDZIzTolw#hdKCyAh-3PUQDJ=b55ehYQ zeHfL2Z!wIfZYPXz3oYIX@Na;Rddhe`jCZaCvy5FVW61b=tyRCDQHL969FO1ASm$`7x=!}_IFsq60)LaQ#d*`vp_s9 z$vix#rcAd|uvS=o@|bV(XfvGP;(E(Oj2zQ&PQo!NP&01Lf89oMNRjsU>$>=JxYhW% zQXCh;1`|Qj{~oe}Fnrm&u{bEvUd3M2-Dxs+kA=(AdR?D@q8-{NLtr~KON-+<4_dUo zUC=$U+{e>p%(Z0~2BnfS`Q($M_e2`@Bua4e(O!mkrVTH?#zDl>GND2Oz#k~#FbCM2@=xUqO042e(wIy-~LjiKdY{&90I?X*JI_MN=+CaDQmVk;+DG5 zw{P?Pv8$bD#Rp@PVd1!h`%T^ynAF^}rRS7Gg!`k#<+MLOs>`%!_*vkfdATcK_QMal zn39o25A?YXG*x{fb5ThgCrYk|Afz4Kmwt3@Ca*^t97!4QWX)F{l(p2F*y1Rksjv!0<2pRGH6P@veB6$^eA;k~HH9P+h6X05G}!EO9SVnzgAl z);7jn_`~HpvRSHN>F2SFipTH)u_PizUi1V2Wcjz;=Cgcc06^7TyE5@(ix7$kK9yxol@+mbFT z{63EO-$$o(tfPw(r!V8#UG5rTZF$#R3WmFN0e_yNY;}F|Zn*NV=#a&IjB(O-tjkj6 zit8$jrn{|Hw)(Wq$o$+;F(rV+S|j(-`ri8J>$F;ect%VgdsTDUt>(!O;-Jtt7xyv| zrTp!p5IwJm6<)UaeCF8hj)ME`O@w$j1BT=kk|0VzOuKx$*d*QahzF#-DHzu2>D~_C2Crc!)vD{!+cCEmLR@P76q`PrL>;J94B8&u z!9jr!JnkdMAqb{7|s4uvUnr>h!> z6=bhm!{`wR1qX#4XWWl&%#YMPI5L~xuf226$<6IGVrL*$^R~r;Bs^(i^H8S36^gqn z?XslS;Z0kA?FY|DB+p`n-xA)CjA{;j`0S5Dmd2o`3wiGb+$}^UK(uyAuRr&ojr{EH zgPqI=nOA#_e~gP8c)W3K5kI>V*gHs!a7@YbV^%Y9@-8sihmIzl!Tpf<9*C@2&!QXf zF+g_KIG}&L&Wwl_4eZx_B39#Frr*3tvUS=(xSPe;p>KWiw&Lg}C7X zA98oOezsCrF3}cC#)~eAnndCFvoZxK8{o#Kt{D6`*CTKq`As?-L>8qdOo3Au%Sl}m z-?^Rv2o7H3mvx(V=4U1}i~V~3SS-I4&xWB?AF=PL6O*5vg1}kzwCGtV>E=$>FBv~?rdPly+H?tOgbX8co(jmx7qz>um@kMc!Zys4#U z{7rnLw2R=N0jWB%FTm=VfFW?Pjy}&*IXFsujK`@LQk9#M*noajf-Ub4MVQ(AS3}$2mGe>T6QOpcc%L>diR z8i$hXbN*OZlCPBBli+qoPsiIp%tG_5M~NHhmA_EM$aDCJdao1k}yu!)<~&5 zHlAYh3p%JMI7rw@w&>n$RJ+lW!hes^tT-K-qN@r`YD*YO!3@<(5|l{EHJc22z8-&? zr;8XWrYptyqX$L{PXH;yp^xqDwI-V$xtqQGh=;~Gdo3QWO4GXvUoDC6EO1*FZ@tRG z)EO0^UKC1N`aXZ) zl}_9=2(9l)=WGUN80l&E#9_Bh^>9cI(VdZ3HkVAh1IXeX-sTXMpmR{TrKg@k9LZME z=1}=%q03N4O-KqkliSAI$Y9lKa2325`*CzCY1%lOIwT@W{OM2@@{+82xtrAoQuOxBKrge7NR^es7Vms%=8Y_vJ1tk9G0-M&7a>de;?aaZ(dJDz?F; zdCt`+R4o5)+=Amsrch0@WRcTk;U$#Bx_i?kwnb63%1_B-wmYVqmuwS{wCSsw>~hlS zi>3SMYZ_XAOXHj|-VAJQ!pfF0uQNy-?1Z#ek9vPYSYLkpxib8IshzTpSCGSmAdcPD z$90aXrjS$lH1HsZ66Nq?xtBt`8qnL%qiL7>`NO>1uX;!-WnWQ1 zFe@#RSR?1yej!JyBfzKeN4|jQ_R}N5)Ykq_<(a-qf|wH6FP<~J1cUA_F2enB;nj!X z4yC<~a}Y7T+zu;PVjZ+rjUX3iGq#Q$%(T*!;t23{5--FiC_0zTt(P4;vDc!;nPixB z$ei2PQjIveT5j05SY}Oeno!LAdm;AJhTS~&&Tx{a-?kH3AAi__wSD{GshwM<=D^8}-6F{#r$kiI1 zaBlTA9&D1>l0dZ76AD@qK`kTAKJ&Z)7!$FrtIxB2I85?$zmK?Pnj4kEV1*T>Nqif~ zL%Pn9V=u!KfOZY@^bb_2kYi0;=Y5xEM_hAebx}LZv1OlxeZw2Twq8c_)S5s+<;k%^TTu| zCuq=0ylKzw25d*7hUN1Chiq) zf)@%(Ay|OHu#{x~fuO;5U|w0>AkgW~qmL~RXriQw((+)L`D^l5UskRODPNk=}u&Qe&#H0GQMqpNe9<2YA|;1&;GTd-52uzI>PcQbbM7?W;hs#Qwc2_(}nd~+(c zHEY!3it2+{US5~JJVifMk7?T4dLvMMu%k=qOv<9_lqnTq``Ti+eJkCYyxlfarlwEl z!8tYGFIB0Qi~A|vFv$JxPVJ66OsKZ(gYB%Lh+NZLp;l(XvJqdix}Q{*FD7ABLHf!O z7Q)u|=$NXaOcoSJpx_hWJaG{{$)v#aa5hBruMG{Y7{5`h9hWzy*gL}dDeg1nt5rOl z^e*mSPNhd`n&{3-&8xUT8!p=Gp6iMi1q@NMHa4)<0*k}Nyfo%$=ZU5+Jbw(IyS!MQ z+)ov25L4uAjr8t!HJ|ZwWMX47q)F>JO0#{JBE$GnI9mugLI#$S0f7Y}9~)MNci)#b z28HIt>nIezHBUCftLT{erzw=%bSxnE=sNE7s2cqB`AVmWtlPQO9wB1_9?~K4CK)9u z5ja@TGPhFw?%DqXlZ0lnW#xPrV;N@*%}6Pqa@-Td#My|6JQn-jQ$jVzDfIf?(onCW zt(e668N~p!7gacm>=tx99*&cgPnvwzV(L7CuQy&0%V|{SjxFvounj&y(q+CbvXfD@ zm7K+#e@D10k52d_106{aQCZB3124-Mt<*AnN-j|j^21-{Ew?6j6rE&{o0wGb*dXiIQFME^&Za4kI(jXG?;aJ zyoX~^-!~;0wK97oxwAUV^MLcqhnT*o_;Pz*yo#lGr#Z6J+}rBPvd-nx1CgC6jtP&F z*#i1?{hSvUJL1-2x{LVt;?^hN52#f)eu~5`+}B*dRsc|1x`-K-+xND9rJP)lbAA{sQSB~B9vK^HdcpNp&H6#k z`Mgp`VN5Y3jVs2uc8H$DsPW$N=0nmz+j{#jEcY|f3#2eQ`9p8Az^JOI<(ADi%3byKUU0{l9!u_o#K7805l zDf+{OU%@FJ>0d0(;)U~c3dBYV#cTGKO>%BsW_<F?fXIJOMLt6OS5%bK8PO(JZ;YOf`clJ@es!jMdZ)j2GG6!6hpqxs z;cX><4}_ts`8H)}(Z__MDt&j)YR;*M9rQ)_5~oW0D!c*5*1l4+!Z`e5rfjymuFuQ0 zT`4)J9pU!ZESG*p;7|2dUT~a=eeslm^01G7q!A@Lv)UuDcR|5LWm&`VBh@mIXaV&h zO5#Bt@5li>9VO};W@ZVNXiN;VSM&%2&d~ctSq~+r^ z&#r^#SK7U-I`eq%{YULSm%ou&^(-*VbaglPiQOfO;&O*e?A)zLlK-)PW@nW-Ti)8T zEcSXPFTMpX#IZqS-;&ynZu)e3VcxPktsNhZMlYkrYw(KGJ`5Ck+{0OtRJ%!Lc$#FSkX(vVVYc%DP)dwU;@ok;s zN07BSCpZ)&!ZFf?af{7J-d`DUv)uEu)$M977J7?&8+J2#+d-6|T*KWn61)sDC>U&! z6w7gQ4QwErx)_&Q6+vOLLtVu#8V9@H4`wMP5(OEmlFy#uO-=K}x(nEj;@u~l8?vc` z5wNA8<1@^fG;3G`p-xSwREHRxUY_iLcQ)2T1=oc?Vzj4zhm#bWf_uG%`lO&CShGO6^)%(Q~yW>%o4v>?wi*&$?Bza)jTQO;l>f zkZHNCn9lO>u{ykJztPzCVpzLaix=gM6T9+}Xf`G`d5Gce37|7)WkzVKX!Lv)<)0%~ z8gJh*WZO-m$Zx*JKDC$*%n48Lxo0QBtph?M)=Rndee_$VOEI^7^LW`E2J+%P_oBsn zpdR*4j@y&lxDa?jM`LutWX0E3jc7*a_Evi`N=&fNDBR0wEWAO3mmnl<^zQ!u0h!McdT?gi`VSO*V0yJkS-i=1}`YaGVcQcbY zeOE$R)+h3SQJ{474$U|%>%q^fm<7uo5s1kk8g_*$nu}u#;THVXN3+_^l$t#-ar~$t zVVp5@cDO^*wlglWs(LqP$aN~rmiCp_Q%OkmeW{1ojM}bWydfEFnOa@SmKzN=soZ&J zPmEc7N{u^Wky5oxse&C;yi}9zkblrcb#P6PtV2K(YF&!Y@TO(MB~#`NbRlKupah7o zz019jz|<2!IAxbhS63yND@o4;-xmQ^6yj{OQp&(N*Q}(X*F-;CMyj{29>~<2z6p+U z5-sv}VcT-;CRj9=4;z5e zZoY{ZA>@`WlN4_46;xpk+s|LkEorl1fAT1zIQC+ait+*G%T@O1h6$|yjF@|aj+#OB zhe8(f(Iju!pS;}AkQckseI`fqO|n9!ZC*W|EZOr0Kcv=P$9Y8}Nk-Li$Ut_~&6ica zpm&*}a}vyxUFOLn9VRoZUkC5E7WfM1)Xnrqr2MhXI&U&)3vyhBnQwbcJI|H2f+-lS zqR{?l$sLjw4c&2(R{7L?h6g0crs;%o7c!Pw*nM+ysiV_iFhI32om@Eu3H6NcSj{ReNE}{Md(f4nokH zrhhVvI{)t5W|5A3RHjg`jhunvQT*`cPNrE;S~TtK+1hw#fY*sLqiuhg} z*z2Q=kzy~_gL_=f^9JGN%Y(y%fv}*ZmtFhDhj&|OwnKXFD{8-S?4KY~4yg_!?HZF+TV%7fh z)(OBTJF-dGapq6+tibAAx{TvgZuWpix)ibYZa#|r)CD&~k4frChNh|T0)rbLP zb;`(di!M!enQxn*yKJs1J&zK4L6XF46Q+wQ)+-S%8Z+YG=XqA>!}`N+=G$-Ds|YPa z>Rl$*O1>|uqCIJLeH4_MSvj=`PC!%_GTB=CaN+~b{%A}|x!;Xf)A1hHM3;dgF!3}o zGu2V0*DblhFCou_c(D>}whdRJeJenp=Tf%I-f3WUk7|BpKTo|IIjo;Fr6tOfpA^}) zaRI?6o1oVsWA?^DxZ7MbdogjU?oXDBX_@UeG~lUK;Ed2u(^K%mixNV9BSOP&3{j`G zIFp_zrK{YvlD;;+vzz^aQ$C7e{VN5hME0E#RjSZP?CC3S2uo_+k`m9yg+-f9IEaAf z3J8<~wVi>32#XF=5&z}k?Y%g;p$UZ+*!+S?P8q!59T-GBzgUK{UYlmJZ0?1pmmUS0 zNoA!3#8Ypni%3?k3=fk0%}ZPl&?D8EkssG8hRif;x@W{%v6#3WQVGEO?~i@tOyqfd z<#r5AlCy`&VdQ=fWYz=t3jvN_}BhQa!dnR2&nLq?tfxjEr_Xf~zu_ z{{&A=mGM?7UTbg-0ZUguBanPZ);p&AgtO=|AKh-V1+nV2uMV8|j`iSz7^`v0W7-!Z zbJT0WHyqRO;XNjun`slKm->v4Ht+qIR$k=eGm6%0ls8L`N;U=`WW|*x?lfU!j0n(B z6S7N=Z|`*SDA|gO-hYmG2q`)N>S*?uw+DpcCdxo}`kgytEyPW8h#YI?3A%LyqP6xa z5H;?IHd%-dHb#;Q8eCc_w{>RBj30$R9 zXO)+Pq?F)<1M&{4N zC{aEzaWgFn(5!Am9NIW9D-&f+$XR?axfk;sGhNz+x5539(uJK8Oj9f!_*FvL`b<4N>cFX7 zW{IO&Ty+(EFPJ^A8R>nY>7L*2*FShgf5b(Z5NU$_ViJF|o{z_OY^(mHMMuyF#k-On zEDIn-_NQG{@PfH!gO>HTgolGj=VWU@n)I|>4>2l&F6(eMImj+8eVQg*b)1PAi9N#D9HOi})$8+aZ5T$1Axb zKV?cqMGN%(nbi4j8-}t?&~K`)S>1vwqGGhwN30lbUxrbZX&E84)81O-%-e05Dg=q_ z_T1Z|Sx5z4UagE#quDRoL%pJUvNMI_yK3eHmxQX&iGk>i@YVXpO?()vpCJMXJR_P)a>4Z@}{7vRnTh65D_#~$szNf z<^FB<YJoAI3zzQs-Z0Bd zF@0xk?>*>+P_(H_7~ai}8xHyxd#nn>+U~&UHm{yC9KN`ukwSnW`pSEVHhroPlubGJ zr=bg(BG(8eC6M+2(+b6EI;T#=oe#5!TK2cEaU4*uh{PE&r4;nUo|qJTS3dgc2G4?G z`;)4c9&uRM5KaQ6gt<;vIS;3YUGMajh2)_NN@gj8YF<9D<&{d0q5Qo+tCTuq_D)x1 znjt!&u7+r=6>ObSscS3S^u+W1n>>R?EjcNgmw_o>zxlGuFHNT^iG?r^P7r~zInJDI zD8Lvjc_687gCTq(H6PcMtrXRzuE{|YxnkOND&UH&eZ*h2p`Dp_ipqYv-itNbo}S%L4MDzgALF_JuB5{KVkDO2lrPd zz2_3R3^AHw{nGojGnhWd?c&;FDu996a~-v z0+hG;xtfHvO&`ra*RDiX4H_N2&DDxBxW7N>z6&gIIdWDrhuPoa2`NvoxOMLp1Q(Z3 zFj8k9wuy0zRIUU`wwK(>GawUGkrQ7;xDWg->C0WLn6rO4NBK0E=1!?A>OxZVD)mHv zpo|CLi`f+GA&v0UBCV?J4wle`JR2`h%wWP4d!rnZ6uDyP1u*|4Dgzuno&m z-J0zN?_j48axT^@EAX2lW2t#3K*tlUEvLi!K>zHY8y6(rtSRQuYKj-r9-vw)kxTRr zZqKTQoY#PNUad1ODF`R@>agpz$Wg{Z$Vtgoo${GqWBEVH9qLH4@D+Bas2U}dbg@>@7L-OyPcUhif#Kv*P) zrdUWRAxoc-rXv04JT~=U!@UdOmMZSuYb@?x@DC}W3=Ej< z4T5S;fIXv%xx-sq#6Ju#LORO%iYz#+MMPWOLQepQjf;=2n7rM8*H5deGrG_Dv~D}> zM%modu*R$UW=g=pP?u$!?j%f5iC+%0`NbVqRf-EXIMB=tOFW1J~`+?8D3So zaQbEUUZUZ-?%B#8$dX8deK{`|0@cGR`T+8DFNS8p!nLOPif}PPVUmo1>%oPPPDp-! zofU6giPn;~5s6TIAD*%0YJ7-a<~6&I6C0{Yc&LxtYb-WxA9LzDKu1<(ICP-NYI?>y zcx+q3i#D$TxY=AcmK!G72$9Tbl*}$nNn8PLri5p?$H~pnU%ba24$1S47r&!ec2;=M ztQG_xD*B!od)0e!P_8A5s#=m0tain#mgw+F)lo~b-g!7I4_e^dQ*RcP4%u<2O zc=kzJF)_YP!QUNk;^pmS43R8zq^#(z8CHCm9lSTLSm@rf?ee1|KZ#q7B5S>#kU~mG zdlk^3#UI`Fh1*md>^=4zBtoiMDtBm=$M%WVnp)yC2yl0>QFW2qZ#kWEDD`cgYeA%! zvqAJ%<}1A6MZ@WPev`-8o&SrrGmlGh-}k+(R<#)zMd_wa|J zFCKV!hTri0d_M1=$UlBd>G;@7SGBZj`nq0|Gl)Bxs>wg01sjHSQCn7p)n>r_H}%7v z$=22ACd=#bHP_ko_Nf#OFUSv(2&gX0$MF4S;w8t&TM^cJ(e`RPv$+QCw*B9j3A00- zJHKL~pEs0DUBeH;K2u~M1*>YR8|_GQ2UZ}J&v%YyC?-c2bg9A6IA(OfpB@fHtF<%D zJpQ8lalQVviF=Lr+Rqj=doED7>V&Z2ZsBR$h0OB|Yjop*3#f+1Ho~tg+`;X(yHFGR z$q<|8KANSk2j1)?_{($WV}>Gq$4u%F-X?X|>46b$oh=Ql7KUhDUEEi(k_07SbV!{Y zxg7zYlZ1Sd_jnZyA!ZVDkU;){|%3 zMiFuqG@vP5*8_4wuNvc8v*?b=$bDNF&Dx+?Dmd+R0ygNu2Gzp3En?#?W2+(+gq%BPEd>Ri?30;++jyDpy+3DQ-ruG?dNO?lc-sqzc<&b@YqM$2 zwz;|I=^D8WEujx$l1KDIJLnTZUv^ne>~|gMh8EMHPLXn?7{}DXRB~92$WQmt%y6(c zB7ISXwe!ZASS5E81F#D^$z1oxagEvg?GRCbppg@S`12D(B)P=b-Nf^+_bfb zef>&%p}v|7y3ex3ji4gsQ(DI8e@AT%Bz#ktrCZ>j*~5jk?Fp!*ip`C8_y3;`?*G_} zwsG6Wdk#Du@4J58VLiLgEd4-iFG3*bzrn2V-}_Z4_ltqsvr@`H((B3amcq6mLAPK4 z-6?ox?p6AK*`*(*Y$lo3M@|d_eq|8bE@vYSUF zK6&iqX}CkO{SLk>Bw4<%|6U8w-}xOiNFYP1h|CWNflm;(hr8T&@83UCHlQqg{ zYa^=Dct`YCkbLJ~YW(j$Z9A&_{#x+y5M-4OEWtL~bp{CW9?h~J=V-nklrkw#lyT?_ z#~Feub~hps&D)yZ`{#wsdXP&VgR{Wa;XV%&2GlETW-PlNjrZ($+&FN?(mZaL5%s)z zvBPco(qyh{*uBsN7S_=Z0-?dyX-rc2yr`Ey6U1@88NTMdd(Ru%o(`1Xql*ERss+=_=F9Kr zisYV){o}qG=KtlM-g^z47j%mJIj`^vF3)~Km5^usNH`)xqf-q!hd1f2F8U{2P}9%m z{B1i(ELPDB15KQ@dDK_-P2=6apV9y3FGb#^Nx5);Qd0$NF_`L{XuskM4d&d*YLEP| zntFU9oVX$JZi`tc>Hw;z%TR0Z0^h_vf!|`^Zv<{JpWR<`ifHK(bjk4d#6YPNb5zZ+ z49f{Ow>Z5_4TO(}v9Xb`wMiJRRM*Bg+M_SO)w7Rmd3ywE-R9q$w6&mzw960lz_YHAaJKv<#SXh)S)9={Q7=0!i~D=Bl55-8!)Dew3eS%vT1j z<`hz;G)pJY+^3dMNz#wYpayNVnR zT{19F4e<(0N2&8kyI>t1YBJpo+6Fw-a%n=}w5O%dU0N1fCUH+ioQnlqWiPGvWB@jF zQyd5-JXd%wwo~+J%OY`7+~W=06&T^i&9GE_ELIIR%3Uh{xp(7JX@y1VSoZ__Uwa3X zN`h@eAzC>CVQO+jOI@bh+q!FOsh$!g61<+o8-% zBJb*S^ST?(@&)` z^8C`3^rRc02LMPyX4SkV4#pQypbt-I`t0XhdA9Y1iYj37iyTkk5;o$CkD2Q5 zmEAYCWAk6tphpa{{}9_Y=UzZv=ig1$o7q&cZ#Ov#>$^J9K{d*G-43{^5QW8wWQ|f02b;d- zosW^;ez`?L#yP~mPB1x5DD*KsM)wJu_v+d_QmO0+)S5ny{u0Vw3zd`CBFlId9(E3} zqZ!*JUOZR%G1?Y2bw}-eg(g3x3*r%MwsYQR*Krkaur1Zbv-T7un=DgGudohx2bp%C z_UydEMNsD?1C8WL0tk{QyNCG$`k}LhbrEUhYVT8a(n#$F%Fyy_-f$R!BuzQCl+ofA z*V9)LG4)(tLOLp?e(l%lYbcLQSWe%?8YgY$7?8UJe~mq=Sif@QdF1{DVsaJOY2N@$ghR{FGDzsgMVORAzA4 z`8VGz7JR4yYgI%Vi1$b{Iyg0@yHu%jEMl3#3K#^^KgGrqTx*9I?B~RU(e#x{y*B+MnT*!oMmyd@O4<*TQnEt|SDl z+%7-A7@4E&a+j|kpY;wU`@VWFG^zpT3K$q?yl*7Z{gsYSnkl2$GJVSN`1b>^sdh2l zv1W3~a6@~JpLN@qutgeU9yM-#iudY~Oiw=5()0kAnV+XyVC!}j6`tV;Yn|J(cXt#C zsey)3O4M$2He$bsaKRTl_vVj*##WUM`O$Y*=^!-foo8}pW-pP&+$JI}SpPyOjLJly zI;XBPN_;l@rs9^@5Bx4RyZNh++$}GQ`w8y{@-PHRx(N=PLE2RUac=`AA3u%A?!2-X z&xq3_Nia!h3+EHiuc*D{mWJJKKlQL(HsFnCC$6s(n%zmhL;IimMC*IaNU3J8YSh#K z7VCRu-t0m!GJo<)_$`dwbBgxU7S!UgAvOe*)49G`vmfm2t^0AFkk?je_k_}EXA>J{ zsO*`YQn9%-d;GswqWdI$<&s2lW4LP7AnH@>Fxgf;J8QDO1*e(a&WV-8iQen(%9}Jp zCVCrdQ4}g3X&BIrj-`P53R4Or6|Cuh>x;fmDRw)#U5{-DoToyer(@na&jRJ%<-w5K zN~#s7U*}&MQPZ%NP9e?nOD9qOsJRGIKV6mMm3{`=ji}YB<%#|^UW&J`j$Y?D(CM-H+#o8|@&Zw?3 zl%HZZH;47-pB8y4f7y9-iymPg zhalyT#%FYvq8dkQ9TJAKQxRWbW%8qCJf~1JZL;;iOCHG>l55u;9C*J^JSUr=D{pFk zSWgj|{YG%%^kpIphOi$~CK`QnuZcjCP@R49C>JP=YGU7a1x}>yuE|LuRxC$!atoHt z)r7CqthV2KKfom9T_&NJ!UX(%+ppb`kl-J_?SE07t@BLX1V8T?~{izn?n z~x|ma+CC=}DW&Xph z95gfqX_63o=(aQuEb0ytWt$x_JCvRW%}V={Lq?}-)AX_ZhlM+&9bXQeO1+J;ONbp5 zNpmXuBUaLscRekP9oIT!3~GSYP*nSRLdo2cGM#!w>p&WGDp6NP`ymC(aG;_2JN!<^<_1jzFNa#Zr?Pg zTXNf5^Gj)bUAVGFNYz+lec&) zaBzJ&RQ%SGZ<6qk?o$QT=`EB_d-57U0BW5CYI!+FQDjhy17l20&CfBx@55!WSIJ)G z@s0)){8ahD0X6xpMyuXBgQgOzO|nxX@2=PyTJ8ctU;CW6IFRo^< zoG|{@KWdX=+ZGL_ovtw?u(4Is)(0GH*G~O;BJzQjJN|ln^GTre1`T2q8XKDiy(NbJ zdUvO-u=Oss~skH^mtdc3Q7%BJhj|T^@_a1n4F9- zsT;XoM&q8dDO7z3mm*Fn5{f{zOa4Lqe!~`GdtKZBS+(>}S#_CepWrq+4Hw%X`a2<_ z=I0-}6saW})q4icK#(|o~0q0D49Dw}VxlxmP(jpM4xcXJyfI4>l{j?aZZHht&8^ms!1X;Y@f z7Px*Kp+QtrR_HRT>8n^#W69g^wck!E#N70I@i)udRPleStRB5p z&%cU4iV7x-RDJcc!N#Cpy!+uVEC)a4$;O+CKO`IlWa0nRh9$*LU8XyVyMnc;s;SPQ zNcuz$D<@-Tnan%DAp90;dT_)T3m3gV`8OE3YhwE|ey4w27R$b8!HK+N-Svi90WbSEC|cSthC*LtPH8 zFona(IB);)7^kbjo3H@|38k3H5$(J{Fd{WVKAUB_A#RgdZoQZCZO@y<=hbWbxvuu; zLZh11U$ows{fsiP_bf4yQjxl4_fVuiJeauAyhl>Y=0I`Q60sZHBdY2g3tA^_cxmk| z2>2R<#k|glCgAar9es@jc$(F(6G7Quk~1CBe&;Zm9)@>(3j5n6G@_xG7n%7k44NV^p< zT@P0N{z*TS*c4I_Gy!L{L$yt*7IQw;!H5;7d%TddR+mXHuJzIeJT+`TKd^(vY16pW zQo6*RX7>liTa-3N$m}-AU;y7=MKJ|#FkC?7AhbfK+=-U0ZQg^@$hDUdaOgE)C4^q0 z?yBRdIP>B(Guj$PsYxm!GNFVqfLWB0=;*FQ} z{dbP4CbyL{sqf*5+R1!hH`66DQvlwrn$e8qSoUoy{VIH$Jn6mu>GXoxlfs8>uTryS zR4ldi0beky(EDf2{@>-|uV70|4yD5Tj5@d$13td}8@2ZwQpfqooRm=HJS5QOvwKKH z%!dK}TE!X;`;!}A<5*V;TH5ubE%`!r{&~RcxH0k*Yu;D`zPnj;=H0s?qYiMIDd4(^kgZ-Xl`qJe0<3u)6ue(@)QwU5Kpq-E#XC5ov(& z&6q9>GQO#3cQMrUa2uy~F)$64Xu_5UPwsY`?cJ2c;YV$Ft4(VT4L+X=f5LpqnY>Ju z>7MN?-q2~EhkUhg3s3XATSSk9{)%!tjB&2y;_4P|L*=TnD^-ndm7o1~VRLm`lbD$6 z_}fI3HXIx?U`*C+LyY*#tA?0aw?}G0CN(Z+f(bWa$&N)s-BKl~-HC57siO$zPl^BlnFUb7}@h9jWy&l<071ywVzki#=S#BtxUIcD;da>y>!1+;wpZ;1>siPmLhD^`scg;u z$hB%uB6r-<`!2I2GU@VXEy30itJyxX{}gC3`T5MKnaa2eq7bU+r*Zz+?PVMi|0=+av zyW`DAYy%$-=|>)pfw=eX{AQE2Z}S|QUu~D*_&Lqmx;Lxq179DSS~ua_l}9aM6qCof z*}N}Xij!mKnuJjk$|o=;s~&F-G21i9P{=Ws8IXsF-aPahU*LbTy}Xg^&;>Fooh2WB zUnt(}Kj5`PU2H$Kw1xPebrv<~*7N>nG{BNGyfZGRbjyQUVgcaPAcov*yo+nU?%opr zj0=MM_USb)W*`;pPxf!QNrBdbb_;j1z4J~=9h=Ovr(Qsnu5_EuT4N>2!x>8ZG2=p$ zL*fM!nx|_T$irE~uc?)mj_lPX#+F!6FHMvFa&$7O!vmNFl0L_V+W8|Z6tri0G5J`_ zg=EW)t8ZlBhR$}0j;7}ksiD`+lKS!s=sr2Y+Cc;iQ*A4&Q1r2vp|-OB{wBson7{J{ z^{ebeZ}J3$d z(5-%l)wNOF!d~XuK7-34OyvzxTLiadpR+&S9bRMoK4t>3=&%h)ZcbI|P=2&*x(=(v z0$S#H*JW>G3(ca-fi#w|v+6;h9|=|O>Q{m$?!-_-yp&1dFP#q-s*cH4(`^^r03Tai zem=Rcrozitr1%7&LRd{7zb3Gw>FY{T;62?T8P6qO{a0k0_9CM*P>KRzMLj*Hcbl>o2nd_fgNX5_`rBgnm zCeQr4J*Bx#oq9|7+A%@m0LdgUMc|fz)2@z=iS@*mGuX|l_FhI!(6h=K%`6R2xnb>e zBi`#}Y_id#D;wh=P*_j-iur!QkG>8{1&5^6>z!@=PPqVnyZU6O3Vhx0T2S1rhTRU8 zj`CcNZiA0k=RlRsn69?S4QYf@jCh=;>lkaB))fpgNk;*&lky8Z9jwi1{%oq5>rZ)? ztsj%V(Z_%>;*SyA@^Zg;cTdsZ>N_HVMqq$dm2DnlgJZFtA__~nu1BaUAWq$wU2=QO zmrYuDq(;g_2iqf|ko>i~GUNE!?Dakpgff3M=+nP4zWKXtw+A&d+_uZNB`NPAnX%z2 z8U{&?FpOLYz(dfl)q2bOO+MMexo{haahe7@9T+kqe@=C_*L?)6*;D>pPlx^ixo-$< z0X-Gpe9`=1%N=Dg zyLd|17MdM~*6OQ!uU{Tyad|uGHl^*X6QeuOJ(HoB;n};C@5BB>4BpXc3{)zLUK8w( zC>g~1@%wQc-_CdP&#auQ_vWZMOCe1NwCZbF(Dpu@el;5s=;9wyD-M6!rXR4|gW46l zl;B5;WBShGW7F4rdYkQm$%_vq^0%47QcRD$DLXBVPAf3Q(S25gb?56QE8^d*F%yVj|TA?)dR4~8b;sPU)R!6lRv)Yc&=mWkC8f%`fQ_Y>CC zrVKbbS_=lGl4(vlKR!sTTYrm2%@5vUd7M+vJ%0u*(?_dV4(+Dj6&p8kN8EVP?wTNV z9-~o<2pQQ)$m;9Ixz30xaS(--ZC!eliz%lsdbxid$jb$p7YCu>iWR=sm;_kG@`V4H z1&#RC)7GO>2KIm(KOtt|SR$fk-C+n%G*9AJK3LtU`OJ|a_$8CUK*wm%dOT-t&-&bz zx3r^$pZORVfjO??$8fDWjSm^@S1T3H`sscgd)4Cov?bVyPkc*J)3~*)yW@S>&+o*< z6fcmbA>#0?ypgYXxNheF@yjr)EFuz?d=wxnm&HnGUM9GB9!9Fw==X+^9LRg9IXoyp zG}eDl>234K@Lo;N{6OX733z5_lN~ZbO)`~R%-Mde&7^S`VFZXSO_-F0KSO5EsMjOf zpGjDA1D1r1iu8q18w$$y{U_=!C*KaLEuEf0k~i!X4AQYRb7NxLDkl4U633jki$9K2 zlWp%7B!FAJbacI1wum_Bgum_L~j!BwE7x1%29CQ^0ULdd0hd6yE@{Om+OJCcv$4hFe>Iw^I;o$m?1iGnY97xx|S=f{2#??FsmQbH5#sxN0xT+UenvNr_Q8ceuavCLi9mIr&8 zoJw*Scv{UTFndWbBB(o;oHRffhr!x)nr`;h^=|GlhQNUWy%O=$I$@wjdH_Z-V z)7f;`>(Rw(Pqj|H;Sns*y!#+}n=5x0ENo$4@W^r1Eq?fJiUYB9rol0=a)(e<+a+8r z+wRAAN{Xf>=6V$Ik7{T4f$^MTn>G+IC|a5Qf@@xM*d^bV^Y;y5Fsc=`ypSwY@C_>F zXZBygfb5Xk7P0N!(>~|Bo=L8N%uh!4KPZ{ic&BJ8pUc*5nuli3VLFCI>Q&Yrth%o} z;i}5Cai_PVxcjNpOvRVR^;L!yO^DFA_38WqOP!DcA7CY|2Z=5wg@>h?3aP%c>HKzF zJ0w7~owg91o9AhE$ewPr_7rM_G!F*(7VgmSpQ}9jq$72*1I=O1_L~yDO1ktJs(U0e z!Fo4&{c?fA!UbY6N4TDRxOOya$5J#;hU=JNnTplXSLyqy;MARJ;u~!HD7k8E?Wtu( z9!UzCR%RNAp92Qt_=wT+M;)&!_NyfR)X_~jo1T@G`c~x_Q!p3Ax(EBQH$m1~w*}cj z2qkD*!k)F;;?cLr*RM}l*?-ZGB*T$am!l~%-0TFj!R!*kbt3Rf+?l`YdH$8BhHNwW zYbVX*^LS`W{L@ZojBhxO}Ko)K#H@FpGv|xD|;!j(!{tM1F zpEFJvKeiIs%{5-en0Y&nm!o}W0+>^1tBljmrv6s!AZN!MYWqfdK~TIxFoSQ#$Rfzm_o+`#NKAW!*Y+dRH;N&)`T1B+Y8Soel{qrSfKXHRfWu zUrZ3lJ)+_pv^l{2o}4g%a0CuZ0H1b@C6LC;k9CD441M@1abZ+53LmAyC^0EWbp*17 z1rBVVk7QG3Fm1wvtya}J9p*)W1y1&v^5W7g!fMxv-NFs0kNW1=eL(CdCl^M#nLFJc z-{eZfL4vW2)nhw;0|;Ij7TwbB?iag0gnB-u@6N3yl&K5MlUgH0I%5$;ov(#volb6A zx>WEj*FBiy9iBV*4f}}*4Nh2Pn9TnG!r_YH+tv%PEvAx$crH7-HO4j&uFR;_7Hs&s zj{Svj^e*T*Cf|?v@vG8{6PTkr0B%Uji4=h~TE&ZuBeSFnt3Nho>n%AZ`84?glqc$C zw0eUEkmNb|pv0k1z9&H8t|C^27q*X*eF>MQ4o=$x00vJ*2O=B@(v1+mnBE)j21+aJ z+LYuEIqsKB5Kv`k>Wlc`GJH0$E6Y$U%pu-ya>N`tu@D%j>dBufKNh z@?3w_Qbo0A8Q1X>Su;escf2!!w&PohAKDZh%i5 zsgfYK+61f*W|@?ALs9W+Y2+Qd19AnGmx+($LZ=QPX*PF)A{s<-oR&b76{RuNNS4ivjb6h@Y96vKt@kg1IR^51wIq zLLtX?sq5<1dcW}GCA&VH;xPekC8flte>9NWr6fJCHaP=NoZR=L{R#VA5O~&p84aKs zj&YWkQ(nvWUt-_U;yIVwk;I=Y1|}A2`1?6x6a34uDMxsf*@i=to0rVXrCg=HZ9$Uf={O2pE7 zv*~G`eQ`uYH^tP#Ay!34>0!!3Igqvava?j8n;vKc+5hZwysf1@459C>$mKR{5uq*X z`F-o_ElzpgTq=#4Lnj7?EKN0xEc)ClTn;ONbj0koGrD+1pSoSutF^<}y!&ZR4XJtO z#kYQk#W*5X&Bf;(@;li+dtZ$k##}M>(6md51LJf~0#Qlz8Z!DTqJ0e{tiM;^EXt&x zO`LRfndpq_4KD|G5wH|_(;A9!z0ph~=|;E@X{*OM)(0FsIey;#G=_)vw;64W#^J$T z2D6V#HlEp{Zs|XwoXlTC*0PrOXHH;(&zdd<7Zo(Zh^2+>F zoUf@}$D{4RXhTg~Du?5@6*KQ3gr)W5D0)~Q;YaV^^@z5a>c)4*!Gt61 zND_?;Xq)O_~1 z*fz2@`1q7c)7RtRIOm{;siF8}c?16D#QHN?KlCe4m|vO`uTt@;QGZWy+cV{t*Ml|J zzk9+Ng&Ke`#X;Yb5!=~K`l@){aj)RSn+%fL&VgfT?J*^Bvpkq^{{fgBA-}l{~EA&e2V=ZuY%{V>35XHxx?(KCeLYxMo?{Efxi!~ zV#=*&W!`x9pJyx|HmL&o;}zHc&>x?bn{KOE;Jj>W)Vex1mqM5$v=dzb&B^x9zX!GA7(`gV^#ZZ0-EX?@60 zJep&wVKB_h8fGTqg~`E@s>RkHysm6O51s%*!UtAg1o@rZl@iV|M;9MG!`#8=Nf)@2wYVI;wgH;RLpU;)u%eP>#nWm| z%qZUC{1rAHGieu6G?&U8tHc2rShr@{taap4ymiu;Y!0m7@o!OuGIvj!K=kbNPDA|LP`f~>S9wf(kdEjuxhvTeYT1rrk zK)1u62|EvS90^Ggog6i;MW(3yEeN|rJmo2PVA_!D%liPQ$O}KEW)-%yA>D(vQ$psS zdppIK*ge`)@(eD;kO6}y8YU<7;321@s|JrmS2cij4_SE;ZyVt8)`BI`(DlpVjrKrH zK=ujXp3V3s`LwLa1R68m1shm=WayAU*#idxRQe@1&FC%bA|Jnj57}KtWm6J(lnG)@ z@PcAfZXJT8M8Z&8wYG!*pnTI~$-7-|0o5VCc~Z!XC&V^&p!yn_yf;WtnZ?DwDGcEy zj~M$g1IaSAb1_tzx!As0yo;ePCoE-9R{Ow+bGI)|K;)8lHEg%>~% zI}&b;&K9oWDlM|QUe73|-Uv^E`<&x(4S%w9fDzG#o;ZP~>1OWWibANa?suES!7=H< z&B>-@ZHshkg}l&c4$=ug8Gy_+z{^15E?;ch+Xa;^wab5q4c_^h1L60{Pr6vrb0^v{ zM_}3H@3BuXM1<`t!I^$N67rufbnxz83Id<#G&C;H)Yii*L}`G^`xjZbHR+| ze#~->)*N^Jxxz=q>lzbxtO6c3NmV6loyZ{_^g>9W|_CaBiTPjEP=ADYEupPWEKkj0s+tzS*;^DvH#)U!-6p zUqPABI?b1rC&LounJFo8+4PEr8Nmjh<%-SF6M;>Vp*Pw{km_rO-EaLiHH^)cM?cG5 zG+nml9z}_3y@L?I^9%;vPojza)5xUd!O_5ha%-n%;+JV7QMLJ zD*6*wuLB5Uuz518jl1C+&}^DEq&FHY*D=GApYC%Fw++N`m?yuf!EN%PAG9#)6&9Y@ee-U(#x}81Q7o2u;^GI?YRLfs{ zmv(OdXjK|rr`BQ)JnGy$)Oy(D@*@=7Ug0&JNxc8fAp;kR z6m%U8i2)F$>G4HnH5CD_5P#H{{uKX>aS52jgHQ1``>LJt@T-JhC+nA8{hpPtxsPa^ zWb^c$+jBHimjFMiXSb=vtZiumA`8FWX&0tdf0kSwViom4lSu=J_r|`};jrAKF~!7h zjz0!nBJGIllq)_N^mfYrEqO@o7Pz4?bos^(bpT1!`5F2wurGO+WlG3&o;_YbAfqP% zDRF6i`B?tVwK})!i;+7IP@#Cj4Pozfq%|hLPdIzV(5#2Gjr!ofai0E_yZ^7Ym8f~` zkzhX#V;5@FCLRlj{ z$T*`K=RFE`&mJbNuVS4Xrka-b=Q1Lk=U}!(sHp?YAsR6)805UdX|Cj&f~_4;TrB0~7zU*!z^JK28W4z%jAha2kHC-@cx=b<($q$8`CS1P zJhVAr;deQ=pnVqXfJ?^kSeUqj<%Sw;n?zDc|w6|DtpcYdRPC7Tp* z2;Mdx^ny3Djy<;(>71yUI>pXg$4X~&X;$n*xU*TyHCv4qW+n+_TfJ!>`!-$Zr>HWS z%5oe+!XK*1r8&p>WGCQ7aoIhCoeQjEJ46=lPi|2rudg%WulhM_!M~hRJRM6`Z*Jh~ z%NS+1BO&3Acx1Ts{fN<&T^K%_w3`wV|*G||jO!5ins-@Ki6%B6)HC2LBOpmW{e$&)bF($msjtm{#? zjw==MdH)=^zY{O^0}nd6uNC42CTo<{`$bF?z-)pqjhFisw69Gm%U#Jo<^dzw!T~QC z3Xy;xsw3j(^qOT~A#Y2ftPVX+glnfg-i18hX%|J0 zosMOtd|3v&oUtpCk~}4gj8C4pED(JD&{i@^RtLG)HoJf5UAxeAE7UGOkC)^gl{?5E zGoom?oy7IT4B&1l45sJOV!DcI;QgpiRDGq(c-%=y!2t)y$WFgkOO$cW+2#=k@;*eW zAc$Foz`K~VTom8$Fjf|E?j^NuKQ!9bwmSzOQ{s>8)}CDgmiuV7eTBTVGqI5am4o{~ zj%tJjb|WO0SQ^^2*`bdkDRl?3eWpX5F{E$o7G}?i@3a6mFya0<(9{+6c4ub&iI4$V z%K2!DSvDSRxo5sKtt)GV+*c+}$%$Ucmq1u1%2XK{lTBQm`_yV?DwZpz(q?Bn$GJb- zN8#{;MW_A{tI3&!RfY`t4;B3(*3dvdo&R-weDdX`OWvCP?IiVMBT)BI0@nSG(yGpW zV0FUa@(C^kTwIxXOdtxxWpfL(UmN!B^UOApp{mmD4%^XOI*x{jhAHb8M=Za!=P;^J z8xiJtr+~l`>LeaC0}?{pf?OLbU(tro9^H7&-eS>8D&Zxp$SL$J>xAJ9XzPc6%kW7? zNH|acXPD_7uyxC2yt{NI{BcaJhw5Yv zB0sxbz|tF04(4+5QF3*PM}EjNpL{BF1>xazyMwvsfxuR;K{9!WCGU^K&Tj|poXK5?N@@6tgr2Y zWO{4Wt5u=}^{nc$yf%TGbH*W+E<3V}6)Jml#O^oDnPxs8v8JwC4f#`oBF6mu)zt zrY8Xqp_C6A=1lb3Da15huoMaYvRwS+pMKc?w|{QqEol2bmTgPBZFb3Cy#YhgsyA4= zUc>`WE(iL=ivpX(AE>m2KQL=ZbGA<%%=xn9%tl(wac7X)Qy=y=Uudhl_EG8AC{>y0 zz|~nTFWdRRw`Eund&o!53-K_?<7L(ETAiR+yM$5)9{4M6I&qofXXVJdWo~+50TY*g z1QT)Fgnb!}Ht0y4uC(sC(KBl-Ol^1S%&G1OLC!4VOhI}XWQJD)>JKsfx&C(&G*U>8 z8fjY51&sgDG1+@`&wiBVj2V^N(v$qtT&2>i0!H|>)Q|j;;aun-5vOhm&CcntLufm9 z2@Aa|gBUBHN6R-+#_`!SO`oT(Q$MaM7ncqA+tQoT5)j(`54bbUM}5cr9+qeuzqE~GHxRDBk?%n@WUY-z zjo$2TNof6gMzzoR&_frd9iGtx>FIqb?`SEwqvEvVw%@O&A>$00YIbnw(7G)spuh6o z1B0$ts-8(uWz~T%Bhr~h$H+TZ%-S4TFM`_`CgI7Xe1|=!!1>vEJV+0!M?QJl>8s!p z|D>YA`@H}OA;TAt}tEJnd%i!$U06t+N3vX0-vB-rfM`SAp))QgFd6( zfMlNEP+4;h!!5D(TbReBXU7pJ>2fS-3J`e=)0pY&T7AK%LsafLrN3;_m{FhMQ6&3+ z9L^)(+55Sm%}fr3a;{3CTJRp3yht6M`CGAQ=^kb3Oxy(B)*(*xMoUe|1JzUls}~al zCXnW$)lp6%OkzF=tef)CUgxb+a~tih$tYIg0ZCzprp;a`_ttxRnkEf(vSQ|CPI(Te z%vHEvF8i7N7j=!xl52&U^%&`gS0*JBWzR>rh6k>4W{_6NEzf>T+VY7g`0MECQ3?MC z)GW3_;vOdajg)wFt>OpP6E3QDy!+MAlhmIYa5;noD1oAw%_lm#_QLDo zr)FOri3t=GEDI)mJXa{VE05b6o6i<})@%>TBg0Ok`-FNFC9@^Q-R3k@nl`zF+D1-p zqsf43gYy6sl-h)EpT1=Jh~MuLNyV2kc3F!*0R+Zt$nt5d1^F;1xfR?PI#Wxgot2|) zu_>aGunC*_y;_@>w(@=p{yx~2@3)Zi(QXM$%Rj!LsK<6VkyRYS%e$u-@~+toX>|avsT(5UiLTzU2X^Y3MMF|%!5p2gZ~OO zZ-o<_eJq*9u zbScl1wij4V5SB{X1+n%t;HSd3&>2b^v&IsTmm3MMEGdrAoaRlr7lH?DpZ54E!Lm!r zrI{4R?bM=_qYCqIl(CJtEsp|VEx{+!JC+bQ4Q4WSzsHAD(=6o_hi(cqIFxfaCV^#Y zVTc}=NGMd=erlYy_sNxTNeV2Vz|K|Ivgn9o`LnXph`454);{UOCnlt0)qZNx&3}7? zkTnBEyP8tG5|)Tjf64akGEu4;3^3Dbiycz0$0WxlK<;=Na?Qr~o|&?r0C>vKxZ@RZ zSE`_=)8GsZ&{=D*iQMdEt)O2*82B42CRcndWPC3ig0x;|YpZj6E5aQREI)m1rxm{Y zcjrB^4t(c{ll!FiBJ6LKu>Wt}`rp410GH}N-9Vh2?D!A3RMyWwxc!Ns$rLuc&4KNyoWstmswD^}cedSmP~8I?HM9F#huGK+q$&ZnL)#-sIk5I=_OY>mNEKCgxRj?Tw7dq%DD@^1i0D>kWN4zwS))H)o`M zAuJ0z0S&_2qzHTq#c=;_t3>b+DNA}+1{YN$;;N@x4>;S3V1J4zG_jD`zoC3@VlWa| z#IB-wDHmWZH)Ero#6tgj&cL@l6x90BCR!9D#k;FxP=FH-z7Eycts-Z1Hyu zrvgz7YrW|%GU5TEt?{>i#%iQ^-4;X8?Q#>v)ACDg9i74AU3yl&0WRHyWDR!|}(V=h4ed?;3y^=k@P2-9M#0mWAO>dgJ3`7Jr_c z@P{K%EVS9*=7mRWhis<_-tGe&51jx9A@$#93#XKd>1R{CR`xKCi08I};jV*BJ8l{g zveEU;?hE{0hGJZemkhgDFwtTG4sQKutMJ@(f@{I`V8SwvK?7e4PQ`y=!9(Ak; z4k}&5QRxEGn}}tANiYEdp%;~A2%#707Hm`{p@jrg2qA=kw1gHSC?H)z?@I5zH~-sn z&dhn9b7s!(`S5?<_x)f#B>5$Kuf6uQ*1Ffd*ShcPA_Qd%6fN{!2SHPl9E_A^jZs-8 zWTYZJpdZ%EV)V}k^hf*~v1}+P<{nF@go$8ncxwmdWEdLNSLpH$a+ys= zKnkln#<6F117@<%lSsK!M9 z|H5q8ox+s>fPcRlAu3j34yb-zcj-Uf|CTO&21w}p-+Za%Xh$XMwXBJ9!LUwue^KNr zpwZ5)1zju~>9x^`ag=zfdu0mV+o^$Hi8aM1!L9*2a)p`w?$Tr zEBIU1+CO!lLfw!iDjsT=h?~O(5C$W20v5GoekHfJY+_BC?t8Ju@3k{K9;Bp~z^a_k zH~D$PjEFa~N*J*M&S;m&l*f4+lr!^YcFe~m=~RLK8)%)b_3AyPd)sf3u=2bQ#F}i< zcKwuei39lkl_{kT=!|44gL-Ho)qr(0gqOOfMfBPapnL)!gZ`J zi*}lkl(bCS8-}XI>n#(G?>!MN!Helota|%mJF)Pk1JL#obrqI(YKN9{{TNKf>ExQ` z7nXgLK?^MeZ`Ve-d8aaaU|ocES|B`DyFI3)-=P->2XY>b+KXPLt*@FsUp1L4C3yjI z6>E0Qxr!4&>Pp{vC{d#IyTme1uhHfcyRYU%vqo*+GYh9!Q=M@LmPQM-V)c~*d?UCf zU99bLU!B5aMV-f&_>RG!fRskh_YfpV;gt6tl^kLp1bauI=YBxpJG-eDSIt z1L9$x+L@00B?S$^=Tu$O&oM5$-Wt2xBRTW)V~5U&+>FRcSv~1aQZK5{a*_=XL(eJ~ zyY)AF7ZFSZTNuJEg}j%vxu6}`QAE>cV9z6=*`AJ)q?k|Qe4*|JlWI(W)P5LpkoI55 zeOQWDZ)&JV>w6;+WkxizE+CalQMPA#&(@}9+zXC+qjSEh*rc)!o|=0ooyc!t5@3il zKf{G%9&&$7@-o|af&&O&5c-OddZ|v6efyI>e$5y$)(_%kyErAqTHHm#hx#+bD={MZsa_=*9m0*9{|?eu19!h+>u!A2snoRduGtwTEHdG%#F@OM-HO# zK;K%XVog994oVDGGRZx%kG2w>IpKsK(6F==YYj!R!t;>AjDjS9sez~X0vyC%lS;kw zr1cc_SOEco_?l}V3al{VzV?e0Wh<8tAIkhVfh+pyUE6eZ0GN)b?p5*yYwHEg&N*ZP z+J1*<=68%pYC-5@neD$Ulm((|l4qwrr6i6K__E4_jCnXaRBCU!=sKK45~W(vGmJHq z-)oRs=Z%DUj6(SxLwj8Zf~rdSNid?!rqJcQy&65W;TcaSywZ3Y(RV>r6ehJ40G%5f z+KIH$bsDVLdCa9l>6!f*Sk|UhVcTc(*2;Yq-*NvY z=2h$Q^zuOI_1+j=uMcCz4i=x|IE_;~-~`C47#J&>WI(Q1HeS9p^t3tAX`ui0#8vVex=na&fC#zyQ|~-8{{+dO$w%9kR7zRQVwc0H!f`s-%Zuf9wA)YBGr19>4FCs8n-^n<=C-Bx@BI!WCDS zEk7-KE$vKU`)7~6#Lxu*8C$o((!`(k<$1kGx#N8`mtuVkBHxu4i)HX?ORu5b^_UNX zNZ!fGsgrF^Zh`G(ttxNw$IR*Udul4M?0%zB4F+Wvty=0l zGe;X_1zx$7sl>BMx=D{0TjtJ)_B0#ZMr!KYJ{~>sHO-JE>+eZ8-|6dU}JRvCh zu)>kSq5lB_Y&(~vZ(E$R1LClaAHo( zJNQMD7xwLxSW)vB?1a;a$~D+tTTZ_lkU@4p=@h#KUs%NX9C1b7Y;>tG)Ay`h+2e~1 ziX8XI@TYAl#nNklUnCz?uLiJ4WX<8%Cfd3vM~xy?X8{RXtD=G;-<~g?JM&^SBdTd+ zL{!5tn&>s_l}4{BtjIq8$Tdiz5}^jqjwuZ?2LlSF_ImCqCqD0`0)%OXZ(wkfNY$p+ zV2G4W1Bd_7?hb?KPx<18xp`eT95DUvAO#uizr1+;qjt-0=^5%?+`e_=}Zfp$WGSuu$nDD zDt-Ic$~zQWS%Xl-s7NYTBi)WZH{9@wFv`30Od(bxw;PWx$R=cC<2GnTiWP(dmnP^M zb@?Tpy{U$GvxMOa8$2Mw z-MS;~M!^FzNJ*=1rOqZBRcVp_v(HxfU(-l8PQ{dvB;qo5q);|HRq?tT<{N?nag_${ zSY%rSW(WsR?JTI8D)r^30!pchbrWrmB4Qmiut~6ENltLGS1MPjCvp7F=O7FnQTDnm0bo+aj(U5Y8%TirA#2q;I4$zxtPlZiqb(V}#;CntaHxd6)n+PF zWpd4*&6XY9!)db-=}y*6>mA6M9YUG?DQUzJ(5%@SI(Dp|t#j&Lrq`S2kt))g!tIP= z-~m@uYJ1RU&0QY^l2YVIX;kRYq)^#km_a%t=<3}AQrY7J2tp^Zkv+*N$dS$iJ3S2H z^dw6q3@rIrB)K&Dp6N7R2_Z~co^jH<>oqb%f>{_aMZJ>uW;+fT9r}<~;Nnh^(4~YK zL^tD;8!pU-REU^5Nk=X>giB7l!l;VNM2LlxCb3vk-OTqPX@9+*omo_BBbS7J4`vDI zFZAMzF0Uqhui&!)#u}N|nHo9vG|lH{M!4@^iYu4VnDTkUhlWTsfv>9!tjDvt{O!5J z;y*rjJgj=?`j;FHTp*B)dyk3WBbHGvOuvgF%9}R8a`%8uJ9Mnr9KHHQ>|sEvSGKyT z!!APgx~_fQGFnnnrZ$4Gz9feX5=e5wbD6=rgN&<&nNAkywAV4noz8%QLuDMHTj$z5 zJ}?qL7LjDA@jSI$59 zHE3?Hs+3toYb=p!@|a2YMmTHyR-p>0AN$0tRRsWvP1jQnJO;FfKUH#iU94!5J;9y?lBT3CG}q}*bPauA{UNzUN=fv=y(LJBa{rxAlA5E5x7FWly5)lZka z59uTz`&dSRQi;Jb^eVezmApIU^B(a{6xLn>n5_I`k|LFQ7#Q~+wC~nA&(COodg{(R z92V$9+D0OHf)Kv@m|VA*s3X}9`y4z>_JMa<4sPm zkEO-{25Ma{Qq9c+UnIOruMi&S`uY0jsTGZkROn3GhbE*|YouxGC_oZVU z*VHPeOAqB_*f$qb#tO(s3-NuvJ+e*O!cNzU(?!6}bd-Hdfv`+*W zXeV`(pW#`hB>wp1xoH(*$Ys?p8XZK#6J`Lpl88aD!k8Z=uo@`Pigj_sq*Gb5WPO?D=L{cz__a+XWC#x&wrN$lq@`p_+4qdg}0Q(dNR?Wq!rT6gp4G`u3Og;V-jfx&}FBNx3cOt3Z~ zX)23DIrY|6F6{uXOb8q;6_+;Fp4>h^DJ^R?TK;zO0{e47VjLl+yUlO#IAR7*Z+7aH zw!k~uZLaSdR;p9G`bqxqv4jYO`K#FUNwJG*Mf1tqq*}&E^CX+=hhvt$U*FV3Ha`KZHYjj#m5hQ%^1&;xUgwUl}K;ZJFk$|iSKlidL!8L^_z5h6HU77S*g zWOIutSV8v}QF(eoZ#Z zW=vNeUl;Cc_kdNDl$)M$r(k1>w$s1d{2Vkjm5TPOmZ{}84y_uxjO#ohMh`Aw>mgpm zEko16z{0FaN6ThuTvMN@VA#8mSf2W-AWB)cm{W4}(ya>PH=$WmqW3dnEPh@LgS$Yb zdFJ2oZ1kLV7h+knz83O~pHahxw7qI9xmJBQ*L<8)T-nQX(40cN&dUK@a zE}rK|RS3^uY0R9+3OVzg+6P04f?>t8*|G&J*ktYAtu!h#LEumdS&gx8sMXhi%AUej z7du6;#f`{Vao;zmZ?C8wc@{fIa|J$0+$O1 zI}>>h%>iN0S_|QG^7k07PwVphzEWDI-!1#*`Cx@qn8GDf%|RP|O4MI6wvv)kBi}@0_tyEh4@CG3Jy!%I(B0tB?CCxgvoN513^;HWXk)1X$ z?Wv}ujsW7SSPJj5RoaiiJ;EVz?Y$V^0Amy@@Z{V9tUan zr62349eo$_-|g~ti`uPIf(`0D@WBTpI!;g3pjjkqc@tW1r~{6Hi|VKwN3AEWuK7M~ z^Dm*^6Blbt$7Ur@5X&30=Wgpxo-orj8FP0MI6YZ&7pp4mTGj2=7o%G>^#G*YsG2G_ zp0;f)QbumUuHE64Y(iVPl#ilxON$rgKQ}!l6~?7d-gcbgf_z_*V#SI8D^dY%I7@r! zfE4!kXq@n*Z)!f*v-{7!fx1V=JDn}YjPk>tg$NA3Cr-F{R3iJTvx4lz{QqE>ywJp! z#x9E)Nr=!mqw!lSMcW;Yfs-X-!Xqr#(_Ujjl=d3OC@p(A)YN5PDMArUo$EFb4lWZP zwrz5svp__KGqj_~PpfqGcd|hF^q~n>&aTL%4Ybx~4F_%`4Yi`Er?V+?o1$N7?0u>X z0hW4xze-$LB%W=(E3MtX*0x0ZkHKd1IrMH@4BD)Feg4)F!E?a25ySnthszYOC$0?@ z9*NPOZsnE$b{9tTFl9t-D4^oTufDVKYB|WPWh^9oI`gZfM0S&VXbefDxRk`ig{{X1 zU6_s#c~`ekr_d)1Hi8>l9M!e8zZrlQ7En(+xaJ-G@vCO)8n-M4;_b-S%Mfq(S+kOH zuWhVRZZ|#Ss+|xh5wSLD1PJI^NP!zE8k9kn<=xUo6^>4hN(f9dyLGhHvm^$l;PqzJrc|eKzn1n# zE_PIz`|T81tg6snM%!ikitlUjEw%P=9jCLoA6(=fhqC(C>{?3}p)#%y3vS*-2APN~ zm{N=e+WAX~O)c@yHp|S2lV@CRK5DSJmnu=vcLvRa)EbZiyIP)f>YP`;MM13irsp!e zk1L%=*ak)A85lq*!M9R8=WlU@JfVht@|>upz+!*x34!2q9LMMcQF(uXw7`nC>CvYj zVZD&xSXG6XzIEXWfZz(|k^kFWZ&52_bti;>-K#G|KQ!d303h;Ryz{RNUWZ7Of&p8i zXFPOCGv7eeE`5l^&(VN-xzjwOpN6{4LHxXuETrpT zXmeF1L~ET=o$C4}%G_0hbIMZsdIsKUE3?IG%H|RCsOCY&RWQBpPz2j7DqYs!@M^58 zt0l6EpLGg{Omlp_%v@_;vbt8f*rnpkw(8+Q0a%M;7*`5>K$Q+Zu^`o^vRy^qbv z(!lq{7VnTro~VzA_63q}K0lb)@26_DZ4UP11*}T@#0l=ClE{0`8`efZ2IbxwYFEN3 zi{o8e9aW`KhZ2ESz?67|V8kU|$K)ar4=cQo&nt_XU8uj+NeSm+Ed@#eIyIh3nIiUQ za`*+Cmc6Idb9rSYy}sRTc_Fz%9)cj4X~Y&ov>d;%G|l5P&gDBQQdXxSNWE<41HPhk z9z(g|>eS+c7jC+u>Q=H*Fhc>h1zwKCihs#4ipZoUwqS~~z*VodUG92;h+I>v)zVU;ZpsBUGcK#9%bc({ z8iuu_iqZK*`&t1B#z{5I&f$t+AU@4lwZlG=n&==;mI0ETJ=SVzdzS{h=JH$H74BBv z&1l2^qO9hT-oYwG56t@3S@Oc6 zIq5A39Nd~pVVI7IUT1CfUW|&FNdTzXVRF4BF$E&`+;-2rYtVMjy`zIILsHYV!RaB4 z1DZFx!Zx6MiFMK}qr0t^CaD(wYwq$$*eeBxmkrF^4+#C3AiI&aO!dI7Dzq3eXr49T zH(@Baf+gtTYt;Am`u}}TTPyyS5mJ9r^5=N=45sQ0sT~U$If6yY z*v;^1@*PR<%sEaxhQz(8k-qNf9;|bv$@2=#6A+~B2Lx$#n~T2-(y~b%w9Xc?xP!mH z+SXbAeV<&5ehW)(`Cg_9Q~5jfYVJg|DDhc!8QN9*>DeXdp5^RB^_3pRy6;T(@~t*M zhUNBEvbm+Bs3Z`;Uu(9{9CRS?b5FiV#bi&>ty>}!?J>!1LPS1)_1OW&>2ILN#qsJB z+iaI&?nj6Sn-CBBzuGK3SG1*D-e=Wz-vw4>4aneGouPg>^^78prt@P*9WVwKQmVqm z>GRAN-eDa$8iOjAGKAZw!&jW?vc(`r@z`U4U%sltWuphmM{=57GUU zJj-hMUepYas?tUQ`@hkTS&4gFjdWg9e1ob93%r=Z%XF>iUKgM#8+h3y4iUg#rpdJf z2BC2uT%$)xj3wQ!L*eOpmd2^gZ?w64lJZ<1<)P^_;C%PSyr}5B;}we}u71=JTvYOPs_}Us=TK2t?0Wgnu^m-A=VwDS#@hd*YkYi=#Xb1+bkY2W zo6$lkhS4vQwzP(Gxx53#`)8_SkiOP1Ad@79X*uPMq8YBew312w}FL3Ok`|NiH9pQLCF71 zwMqSokG)DMMB(+&rUtGfSo>LOE*BZae-b*FO=2VtSP->GsWR>QFlqt6-whSsqoIO~`%DSp{@_e=bOy&*1ZPksaUMy6iuFLLc~V5g)PWvmcv01fCx;sG5c z*em%NX;OzGssgMXzzxrfPd!pK(3ma0zM%N-u-@KFWV5MZ{7C(Y!#sOP{QHS6b~H&o zNCOrn_XJ!b=@1J+qn&s8tg?>^S1niy{fv1<(s_N!FeLW*qv%M2$n0G3aDo7h-jQ&n zSB&)Z4Vd)?I(xByRNQri$XE`V4_LD>u9d~+?Tit?I>;Mo_F}ujd?KAVfCOn7F&S1~Qa2x}IYmgE~CmAz85 zpq>Au!M#h(ClXv`y%vEp883d=y8?@B-*7&p(UG>*pv9-Hj6Vx35tg=KbOS7%BTs30 z`9{{D_L|Mr1ugySa!b%v&OPE)g_CG4_r9bN+ZNpHNVlj~-tX#+N}qr=ETahPqNiG&c=P2ntgeXyEQwdUKHbEtL;w zdml@ii=HrSL6bYi$-hv-u=|O5yFGYTYgQ_K{vNGktSC*p1;;!E{E2WfqKIkH#mGtn zV?_`!kc${wlA}&e9&dLnR6dHpe@WYO!X`mFkuLPZw*gr=SDb*cU6+Qs$d(uU^LjU@rbgp@;?nsYM;Thp$r`xK*sqpJTrE$bNtIa=!#;0>g@eM?ebu$pubv2A z=_cQ^vI=k6tnRx@4+*|I+D6ugG`!lhJ(82c2MVo=W`GbaWMgYAK1K3qDb& z?pQVKs@l4nCcl!fHvExsy!&+ds#IAP0%52Ha!iw5z`MleW5*jb`COKC+^3uO|2T? zEvxeJhm)Y!Mbd!K?b%|DxlX90XdgNu$dx4D7ely$J{A)zoDU<4(C~g>FtLw5&lK#P zJGs&%<($gt_k~Rc_c3Pb3B$R(HWRx~A}k=@4#XksRB3=TW=V0^mg;8q zROh(#Sq$;U2_#v)$zxn&c1h>y*sM!f{^aMHJ(&tg_Z$tc4uuImPq55@mViZU5GUj1x8n)u@!1 zw~`x0j`OO5za2gbbXT@&f>O@hMg4XSp^?N#)SE}m+F*-_i?m;cPp9?aEM*4oJ~MT) z%)dIxIpklg2J`9-&BCW1sQ~0eiG_KcXOFYz|Mg=5^neMntOhbJ9cy8Aaj3NfYjdbf zS&{i9k@i0)_GNbl{q1!CSP-NbTuefD3s=$m9xQQ`#;jaAkell@AkvAa9@^~yoc=o7yV z8|8Gsr?#iW{l$Yq=3h`A!1(H=MngUhV93Jkh+Pl zxqSEws?HTn5+1|(+$@hJ6Ng@39FSgZWoJ71m4ep$`Q5gD%G=30e39}ukeZ%j$#nSK zSJi5h=-T|lu(UIdXT^7}@Y4^`1>>RjW>WX1xxX@t1hSBBdY@lsbtNHd#a%qU3hqEp z5NCDbr_g4FU^=g1qz0)JT~%A`I=E>(_=)`@=$v^FCsb;_jUe(jkjCEg5HXH_cE*cY^_Qz05;|2&YkTHu-M|2WV1@LM*#B0If0X+JfgcF` zK;Q=gKM?qVzz+m|An*f$9|-(F;0FRf5cq+>4+MT7@B@J#2>d|c2LeA3_<_I=1b!g! z1A!k1{J)04f%_Aw+PA&4Jyl?yVUZfdeAK|CFR7uWsdQI>$&U&q?QJ~telhXv##dBP zy`WgFJB)a-vrwgv(x$;b5yVbdsAOqrAg{n-?cFoBg@rm&)Gz}d?5xkAU_!Rf z(7>qo$H9=yy~vIWnX}DV3~C39vFSXsqY}4!*!FTaNyqRF-%MLLF1CnTI@3HnuOryj ze|9QJ)nK*-6Sh<2Z$MY4PVdz2yTj7c-k3dQpo?^)n{?`)yKbJQgr5ZHPmfS$y`yw{OWva%^cHG|Hh3I_sml{|1T!;bT@>b* zZ3}YzECNg8=7f1ZsWy*E?0qbMFZnQq=W*5TOmjD^RSr^wP&|M6pIvfa%oF~Euqkn+ zULfz7UMxJTuB7*wX7R8t_LhSvWh_;!N~fX;nZ6s|)t&8iIF8kzxP`W%kR-x;y}9Ok ziswlU)11+r(y;@LVpUqc)&_8owNm29p~kQY6l`2IkQiDutJq|KcU`e~1XEsQzH3)F z8(N!xMe9Bw+Hi^}EJ(=E-f>-SWn|H*y>(Zk6unkl(h$z0hk5v_H1W9p8lOqC?PkWs zDN7D&8^cSy$eI%l>qJ}G_&%*$Izay7&)bq1kz6h9Nf%6Pjb+fnFPlt6U;jF-Qh%lu z)~JTX=wYBP=e~ioQ|2$}Ox&D))$D(3C*#2bp3ZB`GaFXx+#CR zXR^Sl4wrsDGxB}$8js+1*VCSR(JO^gI$5dDGDc6N6r#jMf9j``2IzBY$}7&P3Drbj z$96>l4^O?)Druz!rn`Wy(TDcEm#b&c=*%+J8I7D(OLie5yJTofPb@r?D4fe@ZOrHm zjIpYI?KMBiwz0!BJdv#<`_E=Pkh%hGsTQ(;lhrWzJBLzv1gvW3QT~BkjEPRQ8?7gP zn@Vgcbq7P(7u`|ebW!gSA6yaH%c|v|x^PErjpsampbfLjn_l(`(b{35qt059eK`;V zW^PKjh6mTWd;?uR;|sC(%BSi=fJip)3*4QjlW5cZ0w%itJTfi3I0$}Rs!(K&T56xo zt(&OR!W>=`SpB@!6uB$>4K%zkm})rv{7mN!yG@q>vMr1X%Vq}`TWNPdsZ0F~f(?5M zcW9M~L6jQY^$|i`Y4?Tp_z`7}=gg0Rnv=}_mxA(wpF6_qr-ZNAed#HI6I5u$^I@uk z;1UzP$rr3CSwWY9fk7gl^UO@|m@uk;am4u>h^4z27d^$Cb3FG?jDTDS|0Qi|l3yb^i%aWhQL(?qn;THQfc}EC;Wtnq>{suz59BRN#oJ=7An(!%lA@|&>1(OQs)}W7jUlWi zV(V5Vl~*F*GE#dHJs%b@z#6;f&rFNhHW>{gSm)S-q0Ut#FWlI=|E($h_}^CCGnQ*R z;%vFZ3wk1*l=@=&y#{^dt((0L>zH1O$@-cg4pSHx)1juVrM>Nmj43V6%Nuy#;?Wmx zVppUXMmqK~%mR|;E2*h5xfGDdK$a7hEhQlgu{Nuv=u}N~Icm*c#3g*|*IMSG?X!|z zmxlS&XNv0fBBQro)N=m`$~6R;mOI$JNH^1aCY4k2#eXs!Vpp90%5+NBz$cVw zZ?DprmSn|(>4wnO`%yt`d=7;Db)19JnPpPLeg$Q7k)A}V->YD@OK17W+AR_IU}sx4 zMIaJhoEEoQ(m7bxSt2;e5%ub09l>H%-nV2hS6aZ>qQ|MWH+a-#L6w|0*?*L*C}KGU zCl>zHXWqL#PIa%v@J!&9Y8*y2H|#FFR}D2p zyWy4l(K2{yX^kI8Tv}&go|&;Jt_g3Ks+7LV-44vDte~cj@;TAL56&syK=qdgr}u1K zTeh~()#X9j?VrA3Bf=EOv{A(3N~#F!kqvfufHeYyHIg0MGvNfkIu|eOWU(%CMrn4i zG-zEeqTe6duwa(8koUCG3MXF4F_qMl)HT$DR4o3^i1NovEoH^~qjp>oZp+9nz7TR^ z>K18|$!2(h1$Ec}-!NFT;IuKn*IqE@9oE`CB6)NC`d~#iyXK)JYe%1ksfn|(3;I}! zH{vd}93pQuCxh}D4rULO{(MI0d~H7a^~CB}v00c&UWw%?*8rqcJtNUugwUu^tzk%I zPXx%Fr!10?>Q#k(O_MRVORi27LvoM^36*Yt1MF;_>@&9B@O7f+^Jxv8=k4ZE-f7f= zU9Oe8bm6(-#y*auUH*`=T%k9BvDKKAU;G9-wbdQuFuf}zADA!RAXyTNY%RNkE*2YT zvQ)wqzg>Cq{7rbr#tUtTfw$ezP%G3X4CQ&vX64l0MZ;bGl%l3W)(J45F}Asc{I#U! z9kFm?!MC4r|BUaO2%i(uohzfN)tm-|QIWT?L$izmI!4XA!A&)t1}DK!0pfG_!C>p9 z{`<7-!*@CpJ8Vr-Va%f!F<}^_t3Ha=Jr|KWSn8qoSY_}!x;`y4B-L=8ufU6o>c)Gk zJe{BMo3_9xv@xT)+3Ss;nJa@eUlzs?)DdR&%gud+d!dz&&Q?{4YxPK*6t=GTmNGA2 z4*AWdW^^kd$V2tTmb|&0;MwWp!_?$EN9yghTd0r@lX2gmokmBwiRIM5t5&Kymthb& zcPnom9}Ln=vb6k~`^$ec{sHtv&bgiQ9V@Tfhj}{mR_>HH_sj~(!_{4{6-7M$r7p9B z@|<|IaVDeA9c~b{-Ceo`-JE%?42xAbi_DfVG@$U_;PFA0)>&;A3zzoPc8f%Q{5&yb zs+J$I%cm`8(wDrkIRE(TjL!I(b(3+`bWiwODqOiTTob3 zt5xswL;c__S(HD`>|JckOOL7xhD9iTsNI^99j?F@9|?<{M~n!?lIH`tfn* zS@4s|^vHWAL?pk==0cbgNzk$r7mvD!56c_wl!Kah(wny6Hi6SwDfJl0` z>jAgD7@LTK5X3i-r|Q18Z=ke8sCb8-M;MYZ*GZzoSK*7vt$lqK1OJ`+?=ZMkP}Y&( z^Oq;QEos9)v0R zYMn|?o`&?M2$cFhBs+yvn-5aS+YMRDS26aa2}ci-mZ~BgPC+mUBK^as>0%XgOzzE| z`CEV3gx|lo_a}=6#9-n9n z!I3~0bPjDMmjdS<1dhLuyAkt%^Ir?({4yxdZZ4m0`V?~waX{EV$m%BVb&>A#yx;{_*h6GR+UigsTrOZ~uITNtTyXa>bHw+y=kwi>c>E!oES}MvNvw@rbYczhH2^Ntk z5QTDsj=grMf=`XzIl}k#2|oUU2uDoe?#I{X*EBi1cEHypWNa4&qd#In;axjAwu{1` z-~TvbSP4C^4wY-G2umZegx}UjqoVNXl8DwH`=1!3j$Dr9`<@ zVhhiGRsYHFYPIyO4bwZ55^e{6a`QmFnEu`Xe+>rEzESD?Zoe)Z)W0|^E>`;L(IKb% z$i}k^URXly1K<`#2mT`nH{&?K?icE$FBQn%6_Kv5gFOZOwuEst`?dCE(0=2Cu6A(i!^}@duYq3wW0v1%6K0%U zzn{r9-F5R=jurR8V4lvm??Is7Q!e(4sJi|Nw^lE0c+Tk*`|^+9LHDzAw6;$;;s(gu zpe&IuCTqcV=Uv#^{X%~O9sJ#cIJN^X^fBey$g!^EMfgv=lUyiga0AN>*Zy$;=VJY~ zrW~iTz*O0%>)b|&jGQ|&%R22ccP4(nJcz#pbnNXP6+f^4&k9_x&Y3NH@$r%?b?L|l zu=U%uID52^IfDrJ>H7aD|Iiupy^5D?$4xTq@Bg}Uey@Tr!qi4T;?3{Z2Z6X^5t*9E z_@9`xCE1SEoF4lM|G{%FUjGxGQ)lRJ&3FX+$9}p7x)%R%e(C(l1&zIHkncBnwAcp` z-7tRddVTkY#s%wT50)7$h4`wPYL!IW^XxA!EcRVkRJue#*eC2X!qZa@mv@BGg=@aN zFjkEVcy)J4RSVV`!@w{YrR8t421<;-fuc!UGSdq1*C3F|5F_Byu^p3~JI7^mv>w_# zS)F(X0v+S-mL@dh=OhaDF9pO8j%e4qootjhy*a6_>Bzm?sTM_QoJ3mUWJ3{ysR#S0 zRpmY#v_tPolxt@EyKI_g_70x)Cgxk>c(8`itfB<>7}5S4as?S6Pm>RDg@@f^PV7Kv@|iNQauw zzp+NHcQ{%=t?Fekh4xF1DW~@Jgv#*nZHPK9_Ae?zRwTYsRB9DEPj93;wc=Xk-y~GQ z0u0ci!4kWZ8$1NjQLpibkw%P*YxYAaCp@>_kGjo5Y9Vdf)U#!KThZ>kWM)mjX}uESi!H_+>2D@jcYvoN<-&enh-<%Jaw+qq$ZwuAvcjbZjQzJc_S1^$}N5<0<^YxOg?+U;m|XkKbi zvT@uv@AmnWdCT@*^uq;Uj2$$PIWRc#tMHeAokzl;{ZDAuU)st~#pt_RD7nmLU;S7Y z6O6#yF1=8OStt(|Up?FQzDtu*Ha=;%&KwnLAMjiuZx1fL)MQsYF&@$?G%EBI_iULt z8NGz5{i^vpOmINPURG7)pCF8QG1wv+WxJg-0iL$ts1drfjEB{BS(H23QzvO0p5i?# zbocB0@EDgdNaCmO)M-I{s1UfDM<=uUJ@Gsh&9=9jGoKX1OUA-TJ6eq6S-^SUnrO2aE zNyF~wY8TEOZ1MeasU(ij_Jp!v<;;w^9v8X!{_>_iUrx)fbGLi9!1dy{J-shxr6-}P z+=G3seHHh=1|8s*Y?CW{SLOfIB-Hdy&<(kScja&RZae_71t{TjZa8dAflIGz5^MV6 zJMRKC{8wbVF=SzHHj9;%6TY2yYb>00ta;8(8v1l^vgVn>!Q5M)By$OZV+F_oxzI9Y z(rD1&DfmZy%G0dji-6cpph3Y1|DbH8EsvR~%2nl|GQ+(?6)bH7U7k3J7K>q2;ULeN z@?4RL90=g{7S}BI+)1#gVTYJL>}yaaCU-4@UNAYN-KL$00@_M#;9)u zdc(iO7k&fLoIg(tUiMmVd$O}v8gc+t-SOexu57V&hwdKo>iR14Cr?~SDM0M8i?Tk} zv2Gf+NSKUh6^n{tX7S$-@~6lKY#Cf&qK>jguFcY0GL*UT%7yQ>?!E1*st^_tIBc^qnBhmJqYI5q~|5b?cUoZCb0slzIU5-$moC#0%=p z?%g9pW1Xo1W){(VRkuN2$>En3#cz)rEMOp-ql`gDZ!In=wzWNf#=Gcx;AY6dp}jNE zPIE`B+@)LtQVG<;cSL74Xkf`{Si3#plkKV?pf_)9tuC&;=OY1<0D;aAmzI4BE%WtF z{P}zvV6FDaoWMEonj1%&Re8XX0hsd#JX(sIwBqd}5n&#^Xn%E!tkT)W%VJ)0hR++9 zf2$Hjkwp9A142F|mailwz*8}qA+aKaGM9#!XAC}omzS?_o^-$1Kat;wD^ZALXUp>-l)6Lo*5ONVi zqBZ!9*1;4VoYhjW%yjT!jn;3V!4;<2iGg2%X^)k%eo52p8^}58w$~mOP?x#0)x2%z zxqs;1UrvOAp4xD-u9kK^AZpVeMD*F-E1e7O?=8z#s6H;E<5y^E zRmZtd>iUJcc+QbuUb$|f*bE{W9Ss{FUfWe_oT<4At$R6H>2{OuiR zIabM~3Nia-^1x^w)PTG5<{01_Wdw`4mw+<1G!mM`wc|S z`Qn7bSPo0x#UnKmsGXMfzzj8dSF%YmHH#IiUacShbY&--x~O;wc9wRs6i_B}zt!V4 zM{98FTFKONV(%UdTh#kdKKcy=PDH3}I%URf6eNxFlzy3YMIA^49eV&cQQsZE=eqCL zH-GxO^P=j*k$opBf`?B5&{&qfXd5!Y6z?HRG`g+a*|AwzzHNcJWq;|JZl-(R2<^g* zjp{bt51-NH-Go|751iTM^_N{5+8L~@F1!301bPy=TK+4GTe)NNr@N`sCIxwt_qN(+ zFFgS5e`eWYiZe^c=$EhHg}+ueH-?;gm6W67ch%nTR0p}}=HvO^h5UZ|=F%c$q@mpV zyB-Y|p|QA)jcjC+j1C{{0w+E*&gpXb9y&dXv95fk7cs(XzAYC31yr`_Df^92C{&Dh z9hFe@u_|_rj;a?nWtHgHus%AtJ=zIfW8~51J*<}@mpo_k`C=Vl@&g-#lQw19z-W`b z%eX07|2M}_>nRVwKO4?A#fcRI9U!fk@9Et2A53CNIUmb5`yP z!}aB_pF#RGmRGwK7#z}+QW~-#p-bi4Xwh9^K0e?+X^gfn=-ipzjvw&6ndSvpxWl?D z#MKK)5sJktW{4Vf+&Gl!8Qs$$D02NKJm3z`B5H$AO=jm#{M6w5ubZrA!>2=x%ZoY9 zAAmAA-2qqb?RU$1VC-eY; z_)S1}_uXB6p7;H}Kfd{6GLxCPbIaT__nzN5XSxn3wxZc9@b^BFu8HTsF)BD{HGT^7 z-&*<&KWP0i=D*dhG*ukCL6=B(#R&VMj1OEJNeAS<BVIrRs5p#i!w5LN9cC==onOE4qIDJLMs&HixEp*n)uUp%fyG`YH zn_$eg?H%|6Ms$|M9ZQsTmwb0SuEB^y%v~a4+0=`CRjvnL4qN{O$Obph59vAU%J z&K5OZGbJ|6jPmbwQs{C+oy~?NG(<=85LZls!#u30cuqNC5;Yn{B^#8;<8)=%hm%%D zeV3a@bR5Itz9xGwJVdkf_LPN=gsoYR+|=v-rObVyFxP(i_nPVKL<@7ptb;}u9*fB- z2dPtft(%{eVR7+Px5f9 z^3v`1P1m*C$YiXN;(DTWm-^g1+F+Tvv2=>jY@Z8bFO77KI+uk`1vMl~u4sAX;Rdc$ z8NLHj@pHHDvqR#=jt83Ko^D(KaO_i^2wxX(S4p9^FDgzjV%Z(h&_AH&)PkUR*0X2& zP^oi3-l76ht$^ym0rvb4!2lmNtJ&n=fM{H64DetTfy&;J7KhmRf{llTk0z~oTKBo`Q(Te)KPiA8?kd*r zA^9#y$I+`*yhv=tuiw1`&X;sd-|g*utrr`HDcXlB8HA^5+Igs&?b4XazTLV}L_Ob# z;vd6?gEH@9X%C7e+c3b1T?aiYy;3%l5CYD3%$?8O+ZMQk+$}~d5AQ2lC_U!VsZUeS z^>-P7F7Jq07xBr;y&V>kQw}Jrm>st!#Yv2bi~-=BDE-f|$enlKoap2|aq2g*xBNA& zk}5J6MGAD>RPS0g`0Mhng-!BgMHk7qDw(zDYZTpfgv%WSEXqiPIv5PZq?@fE8a5N? zou|ds*Nmw;*3+;fc3U8?-Y6kDr*^IVUk{s(co>zG;6j80e;4Yykv`^a7I+zr@5-dbY zZReuw61GxF>}pe4RMja%4FGliTW676yaw+h#>pwcS#}B+PpZuQcK|`|G-^_`s-vJg zbUZ)%U_NEP^)V{9;`Cb+O09PDGkkJcE7*PReW|*To`D&s$1IUu1@E%lG5Uo#mf7^# zvr%`JU|ua|NILlO_P5ufngwdz8e0V`*;kaeufgeL!ZHgkwdY`qZiyvMwkZv+-q9$> zkES>+zRS?p{y)U(aYb-?rpTjxzgsO~f8HGfznHmox+!+0I2&-xj$jutzVCssaf2JS zwAH-G_`O%hycKO`1N^Bl3OF&pQ?G} z)YTOgtnd5pjjjpl{mxlEeCNOi}jEiFu3XHX3ehR z6M{!Erf(x{qqN1dVg~IsD(Oz!<83?sAuQ=14jEZe(wfDO%@5j`!CR1PlW3E2pg*T{ zP`s|IaHM@M!{Z6|EmB@3HoF~6fMBL5-K(Ypzpmmujh}|!Vi~K@d~?Seub^psk)?X> zr3$o-TVNMbVaMyu&98qm+GJDBR6HrJcP{t={);v|2+-H6EJf=JBteI>)wL? zq8M=mv6b{rF?vS}+3F-{6?3aIenr84qllg_7EA{qpvP;O?hN6l%g41lwiNo^ZXB+` zHylNYNmiRZN<+0&?{dWQ5_%_G>Rbp-*2a*!m{lsyKM#Yp_|j+0%C5JAPw5{${lq8T zGzSkPao*{rdQ4#pjGjD(V^KZMJgdlgcyMN5?C_#rbmK4*gF@%@D{GShx%wH(77w&YlR+Qcg@@t#VGdK91< zEgJv25A$xASYN>24+~huiMO}(8zMLQYXV`x?E__F=I@Bl_KCJQxb8XFgpNh!aMwKn z6C)~KLGvm9P?Ej&iEmYKU(+7j;hN?TrWTpr^jH@#`tQmpZzPMvgRNVw|?weTN`~Mm#-o zN|vTdI)Z8|yh}Wyo3r%dDywQ1^uthfh4<0<0A-G9f8we{4^lpK6+(gs6dW^Y7(x z1nzifYGm#wppK7u1WrO~_dspZ;qqCR0-6v&NGIw+@%FM1yZq8|Ekn~H*)d~IcJ&CV z(GkDRjL!6;>zUr)&p+kgwJ=}Ep@C4eF{0iYc6~w+_@lnY$=?OtrZ{cwo=_DU{h00O z0)n+hX@X5;ZM$_*RWpn{Iv2CfkoARe!JR8FK*dkPxMo5$uKh*#3GW-#NgUiQn?LeZ zqj^a_baLuctmQIv=!@(?n>wqr2T_bq-2C9{s~Pxj(cW3midNU8znWR~BWsNi$^=%G z%e~t-Yafa(H^1mTDY*SM?3}p&DB%V7uhOXu_v?}}5B3}7I6Mf+rV0nl+%52?;B3{Y1K#`knjdR zbOX;M31V^mev^MsSZyri0eBujaz2*wS0_H5X9{_TmtxBQ@zxxqe)vpE2)v#BpT+!J z4lHb<;7{@z!VX!XEK_+<_GF?oV#0w?t# z61nf_ACFHfQ}v#|GH~^T>{9r?tPx`3F7UH0rO?j}Z}aYV_Ahi_DpxgM;6_^vscyRs zDs^~;w5@JGRn`bk|Y|z z(k(AF`lh_U*K*veQK{Bh-iyhbj6PR&jW#sF?<&E+ZC!jK6FDPeRu^-Um?tafy$DOz z2^aWySye{8DwKlg89~BnMW|QR<&U}1QzlD}`*Hw>B$#V4X32|E$9}fu5qbVbwjoT>39<78R=N#)3hXV4{|e`Pj(?(WoLy(otG^n6kex1GGk{QJ7IhDe8{4NUDafq zet#kOA6pG<$qTEtGmXHRy>8~awL1CHoaQwdX%9k9r8`cm$c8orL7;$P@Ht&S4A?wO zKfi*nX10LN2K8b$7@`%hWoFDlwdjHMyUBme8xrq+U3GwFm+ zL#1)5Q9Uhd>BOz;dhKs)n?*v5x?YXGT3qm`nK$ypLK?=xNi2sjBx zr12AkqbW7M8xFmXo~8^m;wWj9=Pj&@DI5Ka8s6U}bx2?2`YfE)l|HlpZ;B}m!LH3{ z&i9W$?v9Wvc+8oKX~bBsV$Z!e=U?B<{%o9#9cq&~?1d@&%xpaNQs5!T@dol276jO4 zLzQ!fViaN^mf&psPlQAS>hbV52L$7Y0~JU)Y@S8*71$YAEU-D~(Nvl6yuLGq&RkxF=>2DXytB6jLZz&C)eVvWr{eMe6M zBGO0_f%Cr(K{0gZ~=O+ z|D&h^nTk+sI7JA3j%%L&vsh*av&8i4{U~=xT1p8rudMN@dcxP{>st(I%@!_6JLtWN z`Z91@C({7_%dQrX%$ZV@v5G+(n3RD3O7&73fYUs_!jLS3&M$uyr}T?$36w7|Le8=Y z7f|u3qF%2?{*mq1a-CQYVeF^+7VUFq<2u6An|~jsSzFg_EUr+62A%U)>(&(7=9%cH zj{gaAI4ZYb-02tTIk|Baw2{bRcjU)DyRINT%jmHw)P_mp2Rl`yh>ElAfc1!(q-U!I zm7;Q8qkWjc%n1k#96(xv14v$te;`zXC}N1xC5lGG8ZXuLRdtKx)?_r{<32|YH6&H? zlO@#R3;IdV`q#lLLU9%^BQM69$ux-x73Hk#1<`}h_1qoc_~|Ef-vEZ+@JgxU_<1$> z8Lyj(4p(M^d*`HAZ7TaKx4{tp7B7P&W%6~`0$?1ZkruWB%v-}6biX~65CVg++?seE&JI(#Ej{~jXUd0=I@(xH+b zQ=A3h`Nr$hf9Yo=9|IAb%+5PBzM35?#{S8!jkjw8HgrQV;D^4R)H~V)A>`N6s3a6Y zR{?Uf;!KDo-EZ}BDa9!#F977O8jqAtJj)-dQy4Bc(l z@B9okcujZR^DUw#{A2;O?s@9%%;oT;?n~pI>lhc;j}R%Fh*C(c3{3{h{=>d{^a6xy zl&yYhC+=9@#G23BjeP!wfMY#V>aTtQywduLAw{u#t$IS{Xq-^)qg-l zhQ|OK0Y7W=Z1jwBN;Fg-Jpdm&e%*?4ndI#_r~uB74Rg^Ax3cEOD(L7__c>yE<#wbC z(4~9N8E>7eNfiiw6sn4H4)+RO+0I6%_IY2jHydZ4;dS`bG+Gut@`>r{iTHP|5*jUn zSw<0wOKWU7KUHRvqjb5nKe-Y~P?T2$xMNl~I20Q`%pnq*w`?#UPIhH&>>3FZ)sw44 zf+U4Qe|v|gc$TzVqy;oD?y8&@b1(KFZVQ`bH@{q>s)6~^ecHE-C7^9#_AL~&dZx(T z6>l7!uy2*!snOgDJD9PlAcs3BZ6$0c-s*-2Lg3nxBZf|T0LM?%HrZv*;Lk)a4(X=! z?IvQ9+GL9I5*;;zQ8j9a#xx%B_639Wuv4M1r1RN>i9$TYs!lUA6*A#c7^smnH*O;G?gO8(ZP@^RFJE42>)ipGs)#;r>kF=>hi3L~MI z*j$GQxx$@_C6cSh4vE2E_35;PiCmGfU0KYZmuhNaD}6SunjgS|YE3Ra7b&j3)~6dA zJ%O$t%Cy!Y=S3u?VVOpk`O>DMe*-z-0SxznQ>#m-=z7%*uWB0m%`!Q;kv_B{T0`(! zIA5{SDe5#EB@+YoRg7e2<2v1oJ=K&kXYIUeJ>qXR^& zc|==zN$s3Wx+Y>{WEJPoYdR7Go|aQio{zS}C=8@d{L-9*(0Z;4(>?!uTrF`AUJP&+U!to7q)mQcdL4K zY*Oq#*|$DH^e;;8PhTs891oBf?OU+Nu=-N3K5XW>faH)k+5K<8cI^HfEtkiF5$#$hFN;0n7ehYeL&8`k6XoEhFAA&H!PSSvLvZFa8avw)UV<*`!kL7xrRiK=y=KN zPE6VFEuJ(U#CjHTIgMo28LnkVh*%EJHrkb~=w*$ME^(D!fA$CwGpjs0d@0scHR9ex zA{+|SWk?=#5_IrEI%z0XD>h29?w=1ch@{Y(cOP`u4B5|xd7&@cO(HgRMQ%h|gk#)a zbzNz)3uiSQu3gt!5aw__0IhVf%v-s|U>38o7Ge3#KHwmbW269kub4-7ic|o&%;P9I zsm^0@(5p;QO23vKRe)P0d}on$QUWHHpp^>~Ps*;K%AWNCzx}%p)r}vMP-vYcN#q`B;~eWK*i;qF z*`nA_!zPSqY=)50-rs*jgZ1vIIw6I(@M6Ye!3X~wf(?jD)YqI!d*pQyN_Vh05ems$ zGMeOk`qfRPnM1BRT{m|`)I#4kwJQ&(mtp!qZBGgsnWZ>a=2Kccd1h|7%I z7hV++Ox!oj*lWaXP?{G5YCoZky61myaHdr_ud+#>KoS(3cs4hJYhAr;=(1;P;lZH9 zI{_Eem=ZDGW; z#P=Wxb7ra@Dz+G#fc4=O5!ZspXR+tP9uX|7dfT|vrMhoT2U z!qsv46|>g`J>BERH)5N_E|x!{ZELmhc#^bBT~z~uEIfC;_1(G>KVw-KrkOOG$lq@8 zpiz9H;07lz4|YlAOD_>LV}q390%pn*1}8ke#Td}S(@vVsrR%S z=YpReMO$z0R*v}xJqCac-5yE9IsEzo*|Q-EylokNfXE;PPWA|qjxIYH^p=&bvBB^g zbJ6^&Q@bWNDWS*$-v_srcJXtZF-khBmI zKb3AmU1V3wIu*O?o z_;AhbB`=B7J;tv=d(88R9oga!*EJP!x4!}RiVj>v?D969{4-v3=P0;^nqiS}&U3sK zP6C^e;c*GAD2uwrJ;~2kJPQXp+*DhfAKwZ^ZzeD4MpcXsIfOo(!xw_X@6X8xDI0M4 z8YoOVdju-wM>hM`*hw7Ip+Rb0dC*0a_narE;VhRpy9+DR{<2M4?9_s*MqcBF9(k*- zG^$fYGhj{6>&6WwzPh=;~F zfv((P_wWh!A`weB1ONP(f=EnmbeW5YmuQmtq*31~mcAHD3jj#HfH!T6zE!_BdNokZ z(|kKp`cE6!Q?hf3IC5m6q$)(*Y^OtWv(o2UsYJW|Py&gvT6`<2aApS~Dq47Bi864hMSL9?`b-wkJJFMTNY5KZese?qN|C6qRg zSVYfqq(#nlI&Yc`eK;uB4BOE{G_Ms0mQf-oOybcwJN$`bTVA*03yf<|+YED#cZ;Fx z4Mr5I&Y9A@d{Sc!N)_S}#hm))XOfo0>MU`Z7<3m&MRO z6TM-QS=LRM(gahtT46*SZo=0><>P{)*2Mn)dIPh4U;YeTdrvdvZC;>LoyQ@gt8r zL;SqjLON{Z#48EuG{!klk8!jhYs>nKP(6=iC^&Vko*CDOX-Yp;i@BGZr~!FzD-POR z9-T(d)P0}SuHB6xexZBO95(cXr~o=g`q3#o(Rx$vyQ&KS=s3lcy=n$7QE7{htTKez z^5D(uqe#?M(#EQ}{J4GE!9$0^lT0dh_DWi9|fYX2-d&YMuQz6TbzCb2z#Kp!$B3*24q z+LNR&cK)w+O`j|z$W9ohsU%xVOpf6xn#|)zoYJ;RV-Np#3H|M^#_=5aeLR`f5h3qD z?4_2W{-MZrs->b7E<5qy|CI2~S^;co{~mBW7QtC$3qI^@^7H)wf2NiCuH+^3|E3my zRQX9Sd<*cZXKCb))`Z^h24Nb+L4a5NUCDvT)&HtJex&rblTT_-a?05%Oc>t9^R)jj znw?hpu-UO9ZJ9-RW5CHR&a4)IUzSFL(+5u2_kSt;QI>htYBkbJ+(`fuKM*_;tR;1X z#xoQ!x1*jMwGrtcV$(~~?g{~8k<#40*Z6<88?A-P)w{U!#-&6b{Q#6p+n3_ltxb%B zQ!82j&yC+B5duE?uv&jCcr|#05>Zw;k@v@??vnGZvaiU-z%AFGZ^hkU zqGnJ-aM%-80RU4+bqV*3v2XGhBH-7T;g8ZYKToRiK3k9~|N13xQb&MU?W|P76>cU^ z@ECysG5(%E-8zjvr|{ahkgU%77-$Y5-i6=@Wv)4W+}r2Zm;HJ4bY8V|R;@@~wG`-I zeLP)DA#29ERpCDt_y29a!3==;&c4`eODY96CaJ?~KFYhvV z1NeJuN*`ANgv`_`=~eZoJF2_xZVjZaA1f!PjSl(kS6fkxWcL^f#~26~pHXrw;99#OX6szhE!+D9z7mV`8hf~alQv}sw=g_ z7+8bc)2D0q4|f%;Xsc48`uI^b-H`bK-izhO3-`p3<9@P1xHG0(b9}=E7XJ-+O2V4u zo9w@twmfRDS-8Cu)AzVqR>b0wr>G06^2Daq(gTNbW1^1QCZUQL%~`8H_E}oL{(c8b z0}85_<%T(BUfAIcHamlgXHT9v&pvEom%f0fRbZEtI;;blU}?nr-~Hp{q^&sF%3M|_ zN5_;+OSnDa)5}Ud=vO_0V#u!0WmeU94aB-9gwPHZ*-4-OkQSp7XsFT)gJff^CvK)c zeD_|hS{@{H@&Q+FkcrAj{TMv}C(r6#PQ#v^^~byGWigGti_Mn#i!m0MgX2pHTv^eR zf*Q+xHlf^k=eSZIOtYz}4(v8Z6tCL2P1Qe-cs!HcQEJ}lQNq_Jgg6^Q$X3l=nw5d! z#CW*4S9KVLzt$CAg4T_Qo$#yD$d8Ca;+9nLEMSdjxvef-#s4ZE3V@Wr`>?#Aol(^U z|5=$9^+1ql-@z zD!kTgyNU|cD5AlDC5ofYpLC9%c9gBXsg~pzyTOEfGyT=yOc;f!mFX#Bwq@YX?)Md@wN;ub8V#0cuS8+=fw%1 zW(1{l5mSZGaAnz-p2eDsbiGFwH)Qx!W?68|2B6J50WD{4TP&HdR(3LI`=0j)W92ub zC7Ourv=-8pv*&U;uY9HSL%9Ap_ZqxriQ`-$>2fsbXdoS$b^E$Npe1?hm*XBzo9A)3Nu4hnPsT1MvMt|& ziNG)4izHD})6HnSCTLbUzWvm}|1&f)$!V$+aXH#$at<}JAy=pIBv386wFvFPH$xjQ z?E9W&q8K*0#_&`P?<_!ih~KXIN#W5DxDYS@7F65O(oL4dI&VD{BY1lD$(yl^cBl8; zZ>-k}aURO=yqO-Y73Az7*zG*Zg)aYLKm0caeS9gAqt28v>kZQ|vSQHw8!+T!RYB#& zTlqDr*ZX}NU!aMipK`QZfs?6cpT*9FIr$5jF`Am1dVP$x^Geul`V3eF<2^#h2D2fF zhl!$mftp?zGoly!MwL_z|NyD^16SJq)u~(t$buO)jnw$%C?+T zh_nz}E!c6F&->t*voP;&`VBB^tHSf*XPId;t)6UUuG$BhkUYUlq^hU=R6yk);fi3` z`@nElIiv%}8mLGaa5~R_;*DD1q!UX8q%p&019!3jkK+I8)8d1Nq{MnrN;6d5G(Jiu zePs$E`OiZ>_cpHuU!0_E8Qo+120YJL4(V=H((w{dKj0bjP6DYa%6nd;Jnq@YI9zVXF}2rYgpjJpQfGO_(u54Li|@#&y#xB=n8o*Bwil0 zZe;Xmb`ypMEvV&9(}C$|M&ERG^YM5{P%ozt)z zB}w(V#!S4}K{t9EIk`pM(P@8R7WvSg+rM>LxVYU3Jq(AeiR6I7{3ogl;sgHV9M?^x z=bLMMa25S&<})fteQ7%@<{9U+eWVKV^Kfa8?nHWW>}Xw13I{wRu;@`Q6bDnU^us8c z-GkmtEkqWaIvFq7BC8$%|Hr6&boN zdGOa{r;;Vn{a#sKn?cuy_Ed2PFBbaHce{xF-W}P?{>B4p2<{LS04D%I$1F3Os?CPl zTBFpx&!?nUpjTSy>Sy6J5d&RK^WjD~p+Cz++xrg3*jy1@4sJ;6jYq^;n4z}g&P7?j^fwHKF0VQYE6Im=U>}&);-&G{}#8k zL3l+#S?d6S4Z@Muqv1S4#FDjwse+{hJ*KZYH_GF9Kpm!3-|8L;(~e2Hu~(@5Jn-r= z`^d7Loc*+y*V!56+P>#j$*f*3E|@ijqI*S&s2+<}sJmccv;2bGCAUpO0l_X93Kbf)o~eihW+Tknf;6J@psn_g zS1l`kGn~AwCO;Y;{)rrSG9Oep{zCf&078~@FW^sAd< zjYhrNd&-Q$snCPaX6B|ySRx!jgFRLoTLNqNMK z#Lps)e+cRxjB*d%&6)btH_{aP4gl~vV+J!~8ql+sS9vP~rA?NP*B^tk3Mqh={zJ%) z&Zqu^d)-@zNoiOoj%ZNyA7brgx)kW2@>fmqUu4zc=Ks(fQ;5Q@W+hB+tLAI$N*EB= zVQ31k`M&BpEpuNbiUv}|WASNv_4=kNho|ocG)i+@*JTZ&X!ERgyx_`E*k;_sZuX+P zFsZI+uc*m4U=_Xn+jf*VgBM5hApMA}z!!Tx6NeyW|6#bieusgiscYxnoqhF$LdkOP zsYB{Meix> zAnnWs@=ZK2mip_P%qzoiJLIB1vjTgKjAM87Xwj&((m=zQnUTg~ngFfdiBqEX_WmOi zID5UGB1!uVfyCU$X%D{vCm;2~KJ`uJ4ZH7naM|tO{=HVrwyY?x_@MgoCKpbg$l#Rm-R;m_1)z% zf<^xrLItU0iFBrRDMIQb*hbuVo7NPrEEGImD$c+Z_K}>hX6~-_0{v_&4fhJLonVl% zKZjJ5kN@fTL73{OeNZRaD>>}f42mIB%;j%@7AW}`?>P)%ujf_f!AJx zwrapH+=zY0JDe(sjQ5JL9RlmvJ0=&J3og@)9Z<~HOg`XpQ?gn0^UCtHhY%)jMulnA zeGSseSjvzevZ|A0b;m-@!z>N6-*&(-cfJ8iJB-plL`NKbVhi$8!{_*95oM?CBNd>O5gZ(!X|lk8TS?MqxKZ`jlnQvaKCgg9>lM_O8{U= zTXuruKwmt(G$TVE?8adFk|ET2kM(Ht7eu80xD=)ZOo>yA@| zrr0=a*@W#$c#cSPa^60<+({m@lm7G#c(iwr5()~oUun|8V7y?cJz~v4 z`n2fy{Qbund$7+mrqcAQ1)e#3Z_^f)>isK|_esg_;+ffBTx+HNCJ;{i)z$V`^VPN- z5jrtziAL7X*|0||qUUH`Uq77NGee%DO`f(mxI68Avx7hQ)%DF)tbk$VJjAFXpt619 zVLK#SGscJyk*8`_=fbJ4eZYxYeEp8#P&NEFC%nCwdpp3WJ>4s}=rfRq!$nrtcu;W_ z^Sk5;&!eGyr~%D`b2u#gQWU|Np)JAEw6}&s>~-}#4mPupX3zmopbE_YPdp%f+mp7O zEd4ASt!@XEO)hP(L%dI^rDblmIyuL9T`$8*FgwhX2ed@J>k)`sHf3$DV2aA0^?sH0 zyN>A-ODtdDhon%SkYo^=4vq4|z!Bv?ysbcYe>Wt-tLfapM8To$ip$YsQ65o@ihx{8 z&V@P?{?KuDdHH>pLdN|?7@Yr=t*GG+(in51n@k0k6t z>@E-EtL`+80vZq9vJFa$FF$oI_1#T{#OuE`n^#qiwvx7yAB^_wv?+W2-uqK(vE*%>S-HXbVX<0R7PL z>#yJ-@fez^b2r%KIm)-Suuy-vC@F#Gf~bV@j(?>JF2$}Z*MuYfcA}o{ZvM9F463Nt zF8AMAFjxMHM5JciEqle(B6qv7K6jY54uC57l=OLa)weoy0QIR;A*fjUlT2nzfCM0V z9)`RQ;S2Kr8Xi|@Y!n?jgJ!OL`{5y0(#&0Gpfb@*a4pYb0>pa1?ueEhqA@34DM!Z| zZAV)evsUk0cgUskcIVxgaqu^j8-|6P#|mvlRDsC=XSG20u=N@|$Gw2x|I0#Ph&TT; ztQPyq4~{;+FXsk+3{JEtDxN9e$E8QhcM}Ugm+b1JDI^{j{h_x4$;Y7)gN6wD&i#P< zmrB3uvp{@tWP?>_YR=Pt!VDiq0(8G4#cP;alJ-ce@?q>APKXIBT50ZW_D*D#VT~gIFA)GPx+7GOG=Y_ z?E5eQ#C1fGe^Rg`$bPfFtaqKL;V^!ThKh4)Me-ZawiSONxSZqyV@$b9k}pen|D&=K zj?fi{jv^KN1gDDL!8`3^6nIW>M4fz6d=B>xY7X`KV=TYkeVr2#{>Xa!K|Ei6)bUR& zm%aDglU38x;I3oGbwIEZUP8xMkk%2wr5VmSxZ~YZ@9sl)i*HpCsZ#SHj64$PG zr>PXt+tQ^UQB8os>~BR4)n4&ors0cjy+|n;75|J`?-DO85K8^mKw5`w1^EE`DdJOw%Iz zW!^sDQEF4iAsHjSe^U#Uu?_})J1oKfvcY{w@XyK{Fs!h)&3GdLnp9mqZ7fjgxcui{ z1()JTwSw=Q?19$NQ}yFHN_+SGsA-Pc<@B$2lPrymDF-Xwum*z0n>>EcuS$I9)lUe> zUz^|EQ}0Ss2_dn2`zYO${-xU3|E95jJPJE&J@ixiQg2o45X8BK4h|8uv!b~p?N5&# z0pN9DB-yFtsW}m8eUJZGLeBpz(!B4lbty5?+5GW8Lxx|FwvQF z)}93p5yq)fVNK@pmXF;fRNflbj_?R$v1YZ+X3WL02Qle+?>df2Q0X`9u4=zX@A`jB-$cu}vF?lLe#speF zsTMH^oy`4{VC}tL*V4Jy0wA+)sRc?Wg@$sPf;@+@F*4}1`i)y+4mrk`KX})D$Bk4{ z|Ea#gs>pbjJEQ=pAA<^>mY;eM@-ZOR?^U%l_v{eUWi#x(u|Hbp#2;IS?es^6@H7)_ zPS$6?-;oEs+GP4(8Ns-!m26B+hWjSrWM4ku*$3#pXUTPW;hB5lb9>#EW{`5e`48!V z^&s2eo76I-h#*PgmKNzzw(-Hypvtxhk~HwB&vIZyS(mL=yA1Jp1AF?NMpre1fbLCW@LXv_+{uNkO+GrahN^&PWTh7tR=T#9x6P>d{D`|T26AW4(f z*0~H=Wj~=H(zkZzqHS;s>;&f82|6&w!-inheq4wxs-mpv#^0UX2wCU?*T}jx$vX}D ziVNBV+DyX?ol`;;2OX5$%W!}yK6ex(^pRd9OHOcL?BC zUi3uY>anoDMn_Nvqa(Qg5gp;EfP?v$v!KXaNes2$$N78L_(`EDb?WDuuwj*S9u$5^ ziL2_MTO1Ay6$&=YpMG(mVK4)ht!C1R4r0|>T;p!jP~vWRpN9Nx^`ylE4&k2r`U{Pt zF76%_FX^0oEo6D?nQ0eo>)WvjNNyZbhp;$hL_#dt4DeHbNw*Wm{)_462v%u zfsJ?0zB@c}vNg%E;@(I~chOCF#%H=s--vh%RcrTm73-@8R|fLT;}mW))oeK~7g%uG zhKx3zfVMcD*LqMowy z*kR6&Km4BtfO%bSjT{1J1O^LxFxX4*sxwuNAq#!PyYuc*D9H>xp4sFT*yAJzTSqQa z*(a6~=T#PsOSxC|oA%rAuI@k4X`Je@h-sxg{k*}L)>t%KGiV}Oca*i#`Jn3YyDj0S zOL-H;F%qGjeC;1spio|DvlAG8K25 zQTTYD$8`?j`0J;iCwO;~i86{l)65Viy2(dvN9ga$`fRvVmJqak?&S5nV#uoSHG>ml zrHyk8$qHg6y6gMeN?Kc)r$>V0-%`}LRA-R*124t8ex+6JH(f%oOB#XTa7 zUmO$zh6SQM(3lie?~{vRbJ4=(LF#d`GzgZ=B4$tA@=O$`9?9?CfN;bg#PRz~;RrgX zOjVA8YAdLuj;N44eL%;-!-IhR^vscKQ{CvH%9%G3l0I&`qBb>c&FkS2J#-MseYeAV3?Sc4u~E7d(S@MQPpm&c zAB>Ku{SuH_xyj0PbW^g+wbpkQPJ2x?ifDM(POM!-MYddy)~#S?0y}!xWwQtK1)@UD zapFC!a2m);?p`bX{VCzh7ZiEi^XR~+Q<&^cwse4COEARy$Gi=1t9(dm1-a=F?B>*A zP-`)ETg?jeHhH(`jav1Vq}b)-OG&-E)=Ks}ddi8vBP4?P8c4Loc0Chnd-&sM-%R)K z)NvOGJuWC~T%QF!L@o!}(o*ouO@yc(B+Gg!7evKCaZ?^GrNSwxBXP1`Dutj~r-l1- z#<&F4$C#JzHP7kS%eRU_zSRFUBHV+JHYU=^4Zp)4K6 z{17qdY+$NYWw=_Zq@=$lzrN-X)lEUk_#u}=IZvrgcC>0)viU$3(&BIhY8d1Y=3+BE zR!&NjnIL#(0sa&PkJ@`N=A1B%ON?|1n`zLNuq5mL1`y_d19-M57w0@8D|lq)H=wiE z7g<|lWM$RUvu<0I375T6HWjh5L|nJ^9HNJ`JhP@{Vaj`g3t1Cbe+K~nB3DlKC2nSJ zh%C425c}-G?2yLFi8q?gz=X_T0}go;kD*Vv--yTcDn)%XpVaM%jt^G6oq@0dSr8FV zQPoTY2Q*7&u*?JcR3hY&ii?x3P4J|A+ec2WR%YT+W7OoiTflKkl!97!6US1s2mL1r z&YEb!3PptNE{-DecU_HAPcZf%>b_Aa3ss~x)mD%dC#rrB!6&-Qq_cP>u`!#jn)7vE zqAH1cN@nlO+p*z2XtHlG$2nay1l-iA^(u&i03h%$JRgkK`Xb$lRo(@JY;;l=z3$iJ z>|y!1F3Yd3211a!D|Q?kvc76M5nnR1yja{fo}U`l+lE0%J{{dQiWm z;uSc8KJ6JgzFg#oIDYC@FSUF&k9gp_A~olPePlq`ss+5@Nt8|q-}_{Ny=Ox5gV$kt z33(v_#@TUC28>=UN;tQD1IFPrIylzreYp+dvfP#H_5&+LYilKBNO`DA$tvi%^$#5z zEl=Xv?8_f7ruXiOzu94K7{Mi~_LTm9Db|EfSIJOJ+Qk~}F(`U6Ft@|Ds3W1$T=ptM z<~r9RMd+m3hhgNrYzfk|8yhs4#6DdTER%$wV9W1`w(cD2L3$~DneqNLgCph^c~g!Q zeTEI&tO#+~A$xcJZKp4RW;3I*mqOmQ0=lStR_iR+T5jN6y=M~-Z5772Fi3v{AzT#qI9YfXN<&2wN{*$X38zOQAn;~zuTd>Bq zK1DGjV8GvX$gN+*)QkbY6XT(JAbjw6QM6q+BXlZQdABtc(S&iq@VGYS!qEP31br4Q zO)^Q{94^Oe$uA?=7)JK8Rug4!wPEA>bx){0hq5(YHOz`TwWxlGy3%*iHMSomDr~>c z3QOd~2BZbLVXyhZQsW}$lOeN?IQB|@U7_rVtigF)z+UTRLlBMrTyJ*@I)}u5fFt%v zvn_(81M5vfQ(^+I4q29=h6ZQHfdi-7WUp1j>ts=%@-jAqc91-sA-w|j*YQN_Z;UPr`ym9TIY5tn zS;1iXrqN_2G)&oFQ^C2*OdN+hp6xI02{VGPuz@jfC#{s$aZ`8GV~hCerr$)c$)!}Z zf6m@?4m5dmMdI$l;4{I{^-|fhV&@%pK)RsvDM_G#9TaK?rZ4SdW8f#oqU?nv0`n}@ z^(@nx6tm(|M?Et;hsV&X0++1k8rFhvSqFC4Qf@d#+`8<<+&6twXbo1?bFLwor=AFh z=gh(n{^}0$W6T8h{Nqa@rxj?UtNEN2(eRp1vMI|kI|JB9h@FXo*Z-N>{2o*F3-3Q z6+@RayjA|4w<*WfOVY5x6Y~UnZt}N|of|9!O}UB%&Iv@w{J}>uk<9hhbfLP)I=xxY z8AG_fyI$1U4y**tkdOX7y#D@m&89QMOIV)beo?V~BUmD%wxD(JH-L&_?n`P^rwt}w zQg$cWu6Q%%V40)?#}Z2chGVbOYI>M?5*$%5U!n?qNd-z7fS5}H9y30#tsbi2Q=$XR z)6&j78LI0ZjEN|;@>*P`4$j>-Nn6Gd_3v>_YVIdssAstzqP~IqNRe_qR-KN+uGuG->vt(nQsr5fa=vr8m6vs=CwAu?Z;aN$Lh;!J-rskFH`d^?jgs(>dEEoX=hR=Z*LZ}Y zUW5o&VoDOjx?|J3t;z~lM)OgdCRx6+GWVmy0!C@H^RYVxB?n%e(pidNbfaq!86oZ# z2O&{&1q+YxP~F`Op@zy@1jvW}5$L#UkGI7T#_ot6Td4@ef=|1ZVpwlup0+enx^N5| zjV2)`zCTk}vjqk^`TM8l|OOzX40F#5daPTu1oLmHMNOm+)Z9 z&x{e=ztOv;1crsfuTL0$S6G8Ca73^0y5Ql`>n(19O=^R~5U1r36mmsK{)wJod`)lK zFw26Z3yJ5!EPXR?Sn~!^t6g9iw!C-Jst46h95XGh#|UvQEDY6+#9G^Ys`c;UB}2T- zp4urK+^(3p4l=+W+U>u!AcwWW!J5+Mp{W%cSLEGrgJuMkbyQMPsG_d#3cmd#$Tw!ac{1wm z)!N9z=R|9Pu#;bZo;-Q^pjGchg5&RU<3nbwE@fsbML7=J`%)j~Nv;QrDGS8UG1E)% zOe{}XoEng8lC1{cqQ8iI+*Qhnn@gDg1{{Cv7PjVlNQNsr+%gDXjWJWnSe58oCSgO- zp^(_oOJ}VuL^4pS;SoD%ml0{hzl&mf^Gj-rtc@wwdwE*Z18w)lDO&}*Mk0zNPfMmU zO5=T})bSr;xO40Ke3R2_F0rp?TNXDF0K*A_<3FC2JFOoe=PzAN6N0ejM--}f@YF9m za5_mC%L=x$s<0<>>g>BnUz^!=U`P+HiN!Hgb|cfSJQ=my>*B7RN65*zL(d517IeZk z3`TC>dn_~D5i&{h|Fn1AaZM%L|5B79h%OsN5TdITQF;>uqPt6wF49CwL<9^iLJ$-J z!CpXEX`x9}N<=Aw^cIv30Te_813{`t3xpm5?*Vs79iw zk4*1fPzYxlugkD@lgOxQl2+P<$MO}Y9ky2~`gwlxLSEB=Z7 zHv8-GV=_4dyCAP==cfu0yyTi@`cFAo99k6H$dSDQ_ zYx9%n4<(th)vDb(rQ>9cB-F}YT;|iE9NGbY2}{#h+aIvVkpb5R+A{`W_FBdz z24VoK8!$7=_oXPvP#f2Y8yx&pm$Y*rcY;qx(PgB}{8+w57gzO)Q{pb-wp<^p z@U9PG;2g0Q)XlvgGHzsx$!GhO_GpRqAi%R~_DG97PBwXd^~CyqbkJg1w7XdB%@aY{ z!jtb@_ek&PEIPoQ)aei@n3cW>^xXHkJ{IWC72p|d_YMz;*~tXX%B>Ds-M42&YNOTa z+~~kj8%|`=Vs)iQsJ)kIdEVA_};Pf>vcC&{|_$#3A&!RjN z!X_V<^pzw{(`(3}5e|Sk+sNZ^HiK)4=kUK&(Km&8o>iI04$MR!&zfc`l_Q;V%*S`e z;Fvh7KJZQ1?~1Nrgtr2L@Q4BLac}{|#7}{Z=kGiQZLs{;(7EsH#dDtvH#0{-OfvWJ z8>@Lw?cc!9NOgweb;+FVu(ZnW8jtmwz8Sm*bqAz07e;^If7`G>hB1d7>ZIBhHH!gQ zCew#ram~%OI=RlZk!-WGNg2M#h{xKz9q9hF$ zd}{$I;4BBP)-e9@Q5?_SA6Pm6Iop3;uDB7`#+#A*>f=ERU4YMnfTn=sbmfo6$tWcL z@C!clm0LZ)hA6%8(`et~e9>y7%hX9bmD4%G9K1=MMaR11OEV~D!Jy(}L1hs17bKID z)m&QD_`C(SVG7l_0z5{XUD{qpR9Q~-e<(aI?Y{Z$yi9liigBE--BV_;K%CJV+cMz+ zs^3GOW8!GokDyY1o$-cWP~4TIfKC0BxD~*(?A2$^Uk{P3$-;Z62(cx~V)E=d=kD&_ z!Jc90`jvd)+&s5kh2!Yw3n9b|yCxVfMA2}Qr@?FTV+HTuP)-2cJ-=^nC+)|8#4(!M4#M=672w7)imsD!Pim^QoZa`z7iGZjdExTLaxoH@BEFroS#5!f~6f-oj-uagbPPBw}gxj<`V`jz)uI$1;F1gG`}?eXB2nh>aDOsUwySFUJSuoc|@VpVB?O25da=7#i^_2Q0R%GprJ=i$_*~iWNYGk;iQP1^_q5XdD zW5xN!4C*Gqa)q9AxpD=$kg8(;W%z)Fbn5~Hl9v}ZA z@1tcAQLVI|65J&B^O(VyfQaW3T2dLH2RJWcH%%n8vX5q|n>J8<)xzf%pU^`O0kTQN z;|cdA-Yc6T)y1^h;O2f(ZWqd?_Un*xH7ruSTc=Nt;*=;8%6E(rkewMy$oeRAt$u^B=)o?DE|g2D z=h?J+*?E0KjeQM{hsIZcxgPdij@3U$9o6k9kc^jo;r58^Yf*o8o*n?t@_=J z=Av0P#J5)h##u~P2Z?hX=m!A1bXst=Amt#Js>)m`tTpsa$Rp2^IC?jJxMoD#R9c;Z zx&UzZg1r7Zb(g3@?glBt2lhl7&J=o1&c>EW-%~pg6<%b77Ine#k{T(+TY$8{oZ4(` zBtb^^P5$}$g@@8kS4Rbggu1)>5d;VNPk~H*%lfQgQ2yoRNJ1q~RVM&@-mGs%&>=+I z@3WgV?N210pF{P+0oPas$#lfd$LE3rWWr{BqH_~8qZAagyC0@wMW$Lcn$8utM*bYp z?qyRPnNM$&m8?#%53aVi%T;DbjF0yg7YL~wg;LKk#AgHp*p}5`NoCK@4YMt8h9)iF zS2~a{Y#~)O25+}sGAc~5M<`Z~>9*(QZ{-cuJ0qNDg|@xiQ-&j#?cOe^8Pt%C1QmGG zC1HI-vw|3fod!H-lDGBtQ~0*~Z5Mo^d1Bc0mqBTnVXJxR@qpgT*G0;9FUq0b#w}h> zlNcz>@Fc&s&KT`#_sLCkzFvK=)k@w4NpNT^8yKBX(iicF8IXNz;Ujxb16^3N#_j7{c(ETO?NV~-Ue^95RN&Rzu(4vT(w$+ zU~FHz4IkM=cw%%bdwyRBPS6NjeR!u9s)a44#^`6rG`7G zj;Y#5oql_aH!omFFjC&9d6t;FL{@3p>gse3`y2utM6Cb~h517Sy8gRG7|G*8-D~ie z^B3(t`TVv^o10=WKAeP^7NA2Y7nbY+qCx|(6-yxL4av*8) zLg%yNagkxp;{&$nWLmtVi>idXr<<=aU9WWO-9FFQaI|@8SU3JPB*ocTHw0^pB~ggj z$^DyzwJc97bcQZFQM;D7d;iWk;_qJwHt%NnC0m%$%VR;_w~3>PIw~4Rf-8HbXLw@{ zc1zBBFGXx%pPqH&L_F~;#UoX;2cq?x(q6ZX3BT*i4;j4O;iMX$=$;oaYkOA4%49m= zrQEB^;b0A$kc{KjJKy#7M$Y?jsuA`PA_kR18=Xfg%2SlPynC}=XHH{pLbo9z&scgn zm`kIhW<(GomCnM<-cYYnN z@f_J{aoK=zw6Mm=$Uz_@{T15z-Eksi=ES3Fb$z7+WPVSxy={@*gY+QXj&6%k{OoH% z+{V5_@I$IWzE^(j(G*E!o7_EBTLo*GQY;k9x>zF1r+fUoP=~p<^_kJRAJwjiCI&v( z@xtmDe$%8)|I*x~T4=7n{uO1!^;-12u3XCdy&3nG8I1PAM~2e;Sy>;T6ZwmLBU&3( zmgNyi%h|!Zem^u|Ofs1HRs4GG!lP8?5nW+5#3C-XJh!%KV6#Oy)~}U`mwmiegHN9T zSga2N>~W4mDN`G6SfQ=xIGK_*SpmY8s#MEEXfDl6H1wPTs^+6sV5MsjYHUw{!29JZJFwS=;(ahvE-*2B@H-Ae zLqGj1qbhd7UfNS@_@)JlmlUSGR)FClxSfZ9@3YPzD;&h#K`dpNj?eW!TDl}x!Pw}c znjw8~6q6L0Av;tO5Krp72`GY-t049$Y#s})kaNhquq5abjE3!mFCq>gdssE>KJTpI zcCCxZfFv!xi8rR&s%x}$oT^A= zC&h*cmN`LG&Qko`$&mT^xN*%qli=sB=O=H!|4_f*N19Qi%wlz;RuH`c$SoK6Ukl(6 zx?Zcq*5P;Ty&s{lgW^5p=+d*tuf`!p%*V>jOs7oQr8i-^S%B0oRhwOw5!V?-x1{(@ zxVcX$p4%1(Vltf7x?&2VTjT?oqv~{h6GTl&_Xm$5CpWSWmAsLe$hN^K!AaJ1p~vsb z!8sg8uPh0ux(L+pFFrW*GKZ|#z>Y}F6TxJtQllq#r-F@H{6O>&7yM9xdv9T!v`tJq zDQA}KmhV(tG*V2uCE;+gLV6OB3oTek&MxuRJ9*5nXRaz^sBi42Tw+C9bA*5O`%9!O z=#_h}qX`W-oKMLcw3PVqj1+U*s|l^t!4mqN8z!gZqDOy39F7+@+o?nCE4`3o&Kd-b6xY@`Z$C|r zTu`2aiCJ5a6yMlcxPv&jZHxAb4%<)2)#P%eZ--+EkdeIbuAD7)4{U;l0}UVRbvtS&G) z2wabBo5=LQDQ1!HUBmFpmsICj-72D4*PhyuMQkHnetpp=6g{E;%EMGdXiHz+JCBh~ z!IgHX?9QTRvMS#CHHH{k#AH7JA+24B;_`1;>Iwi#uE>Hf@9drFvJ*_nr{a4gpO2QH zS^Vh_>0|CC;wV}kuI$6WlUv!&8deCkh6e^mewNc6KIi6cTZv=eF8G$I(*=b^(jYfp zo$ta|c5{%pO}8?yreCNdGz!5HnQ}Sy$me=hzB2QfmmUSGaktOw`4;-U;t+bm5$Uu8YM>k4h)SI~Qle&olQ zT+KuQtw*wUlBune@N@USZR5}48+mNZz=Mfcxxj~(zQgtCPlwkzSgvO_$>)Xb$6PkgbC$OYp z(0pPZ2+JBNJ3xOoJcTQs_$g4-dl8d7POm``>TM@VZUd2P8Ny}weST$A608<$8Ed6# z?{gVJH|sw)FV$@bQwJ}Ht6sjS_vm%ibm)6X(xXeP1(cua#X?uuor9189{ zI;1&6W;_Z8$WJ?aLu!%@bwFXmu}oQES!jUxGocVGm&n?#*}jc7kBVY&Ck!lAP$^Q2 z5RHa~I|AI^1^M_2O#TPcIhjG|^##<+)NusqY`IBpRmo>|*(H^RfNMsc%l2^Adl^zg zpSf?mFSDAK^uy5vWq%y=K*2t9!+57C4@}6!=vRRRm!ONEx$QnTUmd*RkhN9wXKtu? zhOE#bkO9Xay(%ZT+#XSVT|jCPQhpoiYmLaAqH0O7qZAZgeldFc-5dW`yMoXE*>DypF@7=NI(SDXSEOx7Su~O!sbdfhq~F1Sq_f| z2|q$B8O9c45ME3R<*<1wytzdaS36xT5@BatlsDZjl$o*|0-m~?Y457|MGO1C*Ae{k zn0BEsN6BQ>lX~QKUzbwNX>aa`Z1>11;pDRxmnlt}e8WfPG$(v9`nU+k=uw=k8K||> z>uXf%#_uWw-2ymXG}0>EZl>FkDe6suw&M2^#bAC1yJa9ZYfi@xiSN_tHkiat^vGR^ zhacKDq^hcGIE4zrPLNM;{J_+){uTbk9&oo*fftUuMO8oa>P^aoh)p;>9}nv5D&bWW zW?M{ZUIA3KXOow%d?7EVp{ZVcAH!iw1JF*~)EA0d8^&>XIaOf=XfkG`Vt0K-CjG~< zY(Xd7L6Zqmk?`RQrcGC5SW$yPablUW(gL zq<6!+&j9e^8$rRAx}Y66TIf0zzr>mQ5|&=F0?@p$j)7aOhREXC0RM uzK}yOR>*%k(~%}$-Db3Fo@plmB8ogn@YCFn!HY1eW7#GCzt1l#9e)EU+>e?7 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c76a52beec7075ebedc57b74dddc4df79ad3cb98 GIT binary patch literal 162046 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 NLzwwLIjO95{SVCwrBDC> literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 0000000000..85f80a0dba --- /dev/null +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +Terminal emulator app with a large set of command line utilities From 2ef45c85b2b52550c7294ca16579211f3b10e037 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 16:59:34 +0200 Subject: [PATCH 113/815] terminal-emulator: bump library version Needs to be updated on Bintray: https://bintray.com/termux/maven/terminal-emulator --- terminal-emulator/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index 87fa1e563e..1e27cf64c8 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -13,7 +13,7 @@ ext { libraryDescription = 'The terminal emulator used in Termux' siteUrl = 'https://github.com/termux/termux-app' gitUrl = 'https://github.com/termux/termux-app.git' - libraryVersion = '0.52' + libraryVersion = '0.106' } android { From fa5117a098c982d7fbaf21c5f3ce36c3d3941cae Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 17:02:29 +0200 Subject: [PATCH 114/815] terminal-view: bump library version Needs to be updated on Bintray: https://bintray.com/termux/maven/terminal-view --- terminal-view/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terminal-view/build.gradle b/terminal-view/build.gradle index 35a78ad7fb..338563f723 100644 --- a/terminal-view/build.gradle +++ b/terminal-view/build.gradle @@ -13,7 +13,7 @@ ext { libraryDescription = 'The terminal view used in Termux' siteUrl = 'https://github.com/termux/termux-app' gitUrl = 'https://github.com/termux/termux-app.git' - libraryVersion = '0.50' + libraryVersion = '0.106' } android { From a7eb17317837868f4ac8962dd48459c608ee3653 Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Sat, 23 Jan 2021 20:05:07 +0000 Subject: [PATCH 115/815] app: enable split apk builds Currently we build a single APK which handles the four supported ABIs. Therefore each user, downloads 50-75% more than they need - adding towards both client/server-side network as well as device storage. Use a split APK approach - it costs nothing from build and server-side storage POV. Note: We're removing ndk:abiFilters - they're incompatible/superseded by the splits:abi:include list. Signed-off-by: Emil Velikov --- app/build.gradle | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 591d83ea2b..7d90f98cdd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,9 +25,14 @@ android { cFlags "-std=c11", "-Wall", "-Wextra", "-Werror", "-Os", "-fno-stack-protector", "-Wl,--gc-sections" } } + } + + splits { + abi { + enable true - ndk { - abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' + reset () + include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' } } From 5b084f08512e5507e9831e35ba00ff8915492b13 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 17:53:08 +0200 Subject: [PATCH 116/815] github actions: include split apks to artifact archive --- .github/workflows/debug_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/debug_build.yml b/.github/workflows/debug_build.yml index 0aa761a713..97b313bb9b 100644 --- a/.github/workflows/debug_build.yml +++ b/.github/workflows/debug_build.yml @@ -23,4 +23,4 @@ jobs: uses: actions/upload-artifact@v1 with: name: termux-app - path: ./app/build/outputs/apk/debug/app-debug.apk + path: ./app/build/outputs/apk/debug/app-*-debug.apk From f3a3a89f93f5347b7110d9e2f13b64f205790878 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 18:15:03 +0200 Subject: [PATCH 117/815] github actions: use hardcoded list of debug apks --- .github/workflows/debug_build.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/debug_build.yml b/.github/workflows/debug_build.yml index 97b313bb9b..d79848680e 100644 --- a/.github/workflows/debug_build.yml +++ b/.github/workflows/debug_build.yml @@ -23,4 +23,8 @@ jobs: uses: actions/upload-artifact@v1 with: name: termux-app - path: ./app/build/outputs/apk/debug/app-*-debug.apk + path: | + app/build/outputs/apk/debug/app-armeabi-v7a-debug.apk + app/build/outputs/apk/debug/app-x86_64-debug.apk + app/build/outputs/apk/debug/app-x86-debug.apk + app/build/outputs/apk/debug/app-arm64-v8a-debug.apk From fec61d315f575853a2f9d966e7b603013b04c71e Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 18:59:22 +0200 Subject: [PATCH 118/815] github actions: debug_build.yml is fixed now? --- .github/workflows/debug_build.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/debug_build.yml b/.github/workflows/debug_build.yml index d79848680e..6818a7d2e2 100644 --- a/.github/workflows/debug_build.yml +++ b/.github/workflows/debug_build.yml @@ -23,8 +23,4 @@ jobs: uses: actions/upload-artifact@v1 with: name: termux-app - path: | - app/build/outputs/apk/debug/app-armeabi-v7a-debug.apk - app/build/outputs/apk/debug/app-x86_64-debug.apk - app/build/outputs/apk/debug/app-x86-debug.apk - app/build/outputs/apk/debug/app-arm64-v8a-debug.apk + path: ./app/build/outputs/apk/debug From 407e4e003ad64fd9fae4631323e4eed3ca420774 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 19:05:19 +0200 Subject: [PATCH 119/815] github actions: update actions/upload-artifact to v2 --- .github/workflows/debug_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/debug_build.yml b/.github/workflows/debug_build.yml index 6818a7d2e2..0439523ebf 100644 --- a/.github/workflows/debug_build.yml +++ b/.github/workflows/debug_build.yml @@ -20,7 +20,7 @@ jobs: run: | ./gradlew assembleDebug - name: Store generated APK file - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v2 with: name: termux-app path: ./app/build/outputs/apk/debug From 496da3f877c5f8f3ea52429b36719de6de95211d Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 20:22:38 +0200 Subject: [PATCH 120/815] introduce a property for configuring default working directory Issue https://github.com/termux/termux-app/issues/1192. --- app/src/main/java/com/termux/app/TermuxActivity.java | 9 ++++++++- .../main/java/com/termux/app/TermuxPreferences.java | 11 ++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 5839d10a56..280d93782a 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -652,7 +652,14 @@ void addNewSession(boolean failSafe, String sessionName) { .setPositiveButton(android.R.string.ok, null).show(); } else { TerminalSession currentSession = getCurrentTermSession(); - String workingDirectory = (currentSession == null) ? null : currentSession.getCwd(); + + String workingDirectory; + if (currentSession == null) { + workingDirectory = mSettings.mDefaultWorkingDir; + } else { + workingDirectory = currentSession.getCwd(); + } + TerminalSession newSession = mTermService.createTermSession(null, null, workingDirectory, failSafe); if (sessionName != null) { newSession.mSessionName = sessionName; diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index 1d85b72780..bb2a417eed 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -78,6 +78,7 @@ final static class KeyboardShortcut { boolean mBackIsEscape; boolean mDisableVolumeVirtualKeys; boolean mShowExtraKeys; + String mDefaultWorkingDir; ExtraKeysInfos mExtraKeys; @@ -113,7 +114,7 @@ static int clamp(int value, int min, int max) { } catch (NumberFormatException | ClassCastException e) { mFontSize = defaultFontSize; } - mFontSize = clamp(mFontSize, MIN_FONTSIZE, MAX_FONTSIZE); + mFontSize = clamp(mFontSize, MIN_FONTSIZE, MAX_FONTSIZE); } boolean toggleShowExtraKeys(Context context) { @@ -227,6 +228,14 @@ void reloadFromProperties(Context context) { mUseFullScreenWorkAround = false; } + mDefaultWorkingDir = props.getProperty("default-working-directory", TermuxService.HOME_PATH); + File workDir = new File(mDefaultWorkingDir); + if (!workDir.exists() || !workDir.isDirectory()) { + // Fallback to home directory if user configured working directory is not exist + // or is a regular file. + mDefaultWorkingDir = TermuxService.HOME_PATH; + } + String defaultExtraKeys = "[[ESC, TAB, CTRL, ALT, {key: '-', popup: '|'}, DOWN, UP]]"; try { From 01929397cf4f4a990a7616ccf672ae054f2dd4f7 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 20:27:13 +0200 Subject: [PATCH 121/815] TermuxPreferences: get rid of unnecessary switch()'es --- .../com/termux/app/TermuxPreferences.java | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index bb2a417eed..d3df7fc335 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -210,23 +210,8 @@ void reloadFromProperties(Context context) { mUseDarkUI = nightMode == Configuration.UI_MODE_NIGHT_YES; } - switch (props.getProperty("fullscreen", "").toLowerCase()) { - case "true": - mUseFullScreen = true; - break; - case "false": - default: - mUseFullScreen = false; - } - - switch (props.getProperty("use-fullscreen-workaround", "").toLowerCase()) { - case "true": - mUseFullScreenWorkAround = true; - break; - case "false": - default: - mUseFullScreenWorkAround = false; - } + mUseFullScreen = "true".equals(props.getProperty("fullscreen", "false").toLowerCase()); + mUseFullScreenWorkAround = "true".equals(props.getProperty("use-fullscreen-workaround", "false").toLowerCase()); mDefaultWorkingDir = props.getProperty("default-working-directory", TermuxService.HOME_PATH); File workDir = new File(mDefaultWorkingDir); From e03858f0659c108f12d44b5c162586a66d351765 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 22:39:13 +0200 Subject: [PATCH 122/815] export app version in environment variable --- app/src/main/java/com/termux/app/BackgroundJob.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/termux/app/BackgroundJob.java b/app/src/main/java/com/termux/app/BackgroundJob.java index 3df100260d..cfb11cd4c6 100644 --- a/app/src/main/java/com/termux/app/BackgroundJob.java +++ b/app/src/main/java/com/termux/app/BackgroundJob.java @@ -6,6 +6,8 @@ import android.os.Bundle; import android.util.Log; +import com.termux.BuildConfig; + import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; @@ -138,6 +140,7 @@ static String[] buildEnvironment(boolean failSafe, String cwd) { List environment = new ArrayList<>(); + environment.add("TERMUX_VERSION=" + BuildConfig.VERSION_NAME); environment.add("TERM=xterm-256color"); environment.add("COLORTERM=truecolor"); environment.add("HOME=" + TermuxService.HOME_PATH); From 6d1b0efd3b245145d9444386aa9e9f56080df600 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 3 Feb 2021 23:15:26 +0200 Subject: [PATCH 123/815] update bootstrap archives --- app/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7d90f98cdd..e18adcc6d0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -142,11 +142,11 @@ clean { task downloadBootstraps(){ doLast { - def version = 35 - downloadBootstrap("aarch64", "6707cc641cde13dc2f24e819cd8ca3f1a9a003577523c25beff72690588594f5", version) - downloadBootstrap("arm", "eadc9afb52900dc744fdb39ed0c3dbb87ad8ce6190b27946467df7aeab353fa7", version) - downloadBootstrap("i686", "b674ef43c8388dd19e0d25b024b5792c8532ee0ddcc49f90c0716042724fa905", version) - downloadBootstrap("x86_64", "86043eb76efededbdf5644686a899f4d762703fe18e23fb906a2482d593d7549", version) + def version = 36 + downloadBootstrap("aarch64", "9b1ee77b3e66bbb5e0ec9d766894aa9c1441f68b2bd4152e3ea54101de3c76d5", version) + downloadBootstrap("arm", "eac7c2b322a1217f28a2b540afe4f994147abee571e9fed330d5430b08d6707b", version) + downloadBootstrap("i686", "990dd1aaf5b6499bee5ed473dd5a0e18ecbc0493646b299238ac0dd0d9963396", version) + downloadBootstrap("x86_64", "a321eba39c4bb0fb2aa35f17ccff57bf8fcf0e973b0a0569f6d24bd02314e4ed", version) } } From 2b6e9ade075d9365ae5bc4092ee51e2845f8c8c5 Mon Sep 17 00:00:00 2001 From: Vincent Deville Date: Wed, 13 Jan 2021 17:08:35 +0100 Subject: [PATCH 124/815] ExtraKeysView: Handle multiple and popup SpecialButtons --- .../java/com/termux/app/ExtraKeysView.java | 83 +++++++++++++------ 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index b568703333..7b875f75c2 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -6,6 +6,8 @@ import android.provider.Settings; import android.util.AttributeSet; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.ScheduledExecutorService; @@ -13,6 +15,7 @@ import java.util.Map; import java.util.HashMap; import java.util.Arrays; +import java.util.stream.Collectors; import android.view.Gravity; import android.view.HapticFeedbackConstants; @@ -129,15 +132,30 @@ public enum SpecialButton { private static class SpecialButtonState { boolean isOn = false; - ToggleButton button = null; + boolean isActive = false; + List buttons = new ArrayList<>(); + + void toggle(boolean value) { + isActive = value; + buttons.forEach(button -> { + button.setChecked(value); + button.setTextColor(value ? INTERESTING_COLOR : TEXT_COLOR); + }); + } } - private Map specialButtons = new HashMap() {{ + private final Map specialButtons = new HashMap() {{ put(SpecialButton.CTRL, new SpecialButtonState()); put(SpecialButton.ALT, new SpecialButtonState()); put(SpecialButton.FN, new SpecialButtonState()); }}; + private final List specialButtonsKeys = specialButtons.keySet().stream().map(Enum::name).collect(Collectors.toList()); + + private boolean isSpecialButton(ExtraKeyButton button) { + return specialButtonsKeys.contains(button.getKey()); + } + private ScheduledExecutorService scheduledExecutor; private PopupWindow popupWindow; private int longPressCount; @@ -147,30 +165,40 @@ public boolean readSpecialButton(SpecialButton name) { if (state == null) throw new RuntimeException("Must be a valid special button (see source)"); - if (! state.isOn) + if (!state.isOn) return false; - if (state.button == null) { + if (!state.isActive) { return false; } - if (state.button.isPressed()) - return true; - - if (! state.button.isChecked()) - return false; + state.toggle(false); - state.button.setChecked(false); - state.button.setTextColor(TEXT_COLOR); return true; } - void popup(View view, String text) { + private ToggleButton createSpecialButton(String buttonKey, boolean needUpdate) { + SpecialButtonState state = specialButtons.get(SpecialButton.valueOf(buttonKey)); + state.isOn = true; + ToggleButton toggleButton = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); + toggleButton.setTextColor(state.isActive ? INTERESTING_COLOR : TEXT_COLOR); + if (needUpdate) { + state.buttons.add(toggleButton); + } + return toggleButton; + } + + void popup(View view, ExtraKeyButton extraButton) { int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); - Button button = new Button(getContext(), null, android.R.attr.buttonBarButtonStyle); - button.setText(text); - button.setTextColor(TEXT_COLOR); + Button button; + if(isSpecialButton(extraButton)) { + button = createSpecialButton(extraButton.getKey(), false); + } else { + button = new Button(getContext(), null, android.R.attr.buttonBarButtonStyle); + button.setTextColor(TEXT_COLOR); + } + button.setText(extraButton.getDisplay()); button.setPadding(0, 0, 0, 0); button.setMinHeight(0); button.setMinWidth(0); @@ -219,7 +247,7 @@ void reload(ExtraKeysInfos infos) { return; for(SpecialButtonState state : specialButtons.values()) - state.button = null; + state.buttons = new ArrayList<>(); removeAllViews(); @@ -233,10 +261,8 @@ void reload(ExtraKeysInfos infos) { final ExtraKeyButton buttonInfo = buttons[row][col]; Button button; - if(Arrays.asList("CTRL", "ALT", "FN").contains(buttonInfo.getKey())) { - SpecialButtonState state = specialButtons.get(SpecialButton.valueOf(buttonInfo.getKey())); // for valueOf: https://stackoverflow.com/a/604426/1980630 - state.isOn = true; - button = state.button = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); + if(isSpecialButton(buttonInfo)) { + button = createSpecialButton(buttonInfo.getKey(), true); button.setClickable(true); } else { button = new Button(getContext(), null, android.R.attr.buttonBarButtonStyle); @@ -262,10 +288,9 @@ void reload(ExtraKeysInfos infos) { } View root = getRootView(); - if (Arrays.asList("CTRL", "ALT", "FN").contains(buttonInfo.getKey())) { - ToggleButton self = (ToggleButton) finalButton; - self.setChecked(self.isChecked()); - self.setTextColor(self.isChecked() ? INTERESTING_COLOR : TEXT_COLOR); + if (isSpecialButton(buttonInfo)) { + SpecialButtonState state = specialButtons.get(SpecialButton.valueOf(buttonInfo.getKey())); + state.toggle(!state.isActive); } else { sendKey(root, buttonInfo); } @@ -295,8 +320,7 @@ void reload(ExtraKeysInfos infos) { scheduledExecutor = null; } v.setBackgroundColor(BUTTON_COLOR); - String extraButtonDisplayedText = buttonInfo.getPopup().getDisplay(); - popup(v, extraButtonDisplayedText); + popup(v, buttonInfo.getPopup()); } if (popupWindow != null && event.getY() > 0) { v.setBackgroundColor(BUTTON_PRESSED_COLOR); @@ -325,7 +349,12 @@ void reload(ExtraKeysInfos infos) { popupWindow.dismiss(); popupWindow = null; if (buttonInfo.getPopup() != null) { - sendKey(root, buttonInfo.getPopup()); + if (isSpecialButton(buttonInfo.getPopup())) { + SpecialButtonState state = specialButtons.get(SpecialButton.valueOf(buttonInfo.getPopup().getKey())); + state.toggle(!state.isActive); + } else { + sendKey(root, buttonInfo.getPopup()); + } } } else { v.performClick(); From 866da75fa943172012f9b1b863b774c8bbc88ca1 Mon Sep 17 00:00:00 2001 From: Vincent Deville Date: Thu, 14 Jan 2021 10:05:44 +0100 Subject: [PATCH 125/815] ExtraKeysView: Use Set instead of List for special buttons keys --- app/src/main/java/com/termux/app/ExtraKeysView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 7b875f75c2..480b0123cc 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.ScheduledExecutorService; @@ -150,7 +151,7 @@ void toggle(boolean value) { put(SpecialButton.FN, new SpecialButtonState()); }}; - private final List specialButtonsKeys = specialButtons.keySet().stream().map(Enum::name).collect(Collectors.toList()); + private final Set specialButtonsKeys = specialButtons.keySet().stream().map(Enum::name).collect(Collectors.toSet()); private boolean isSpecialButton(ExtraKeyButton button) { return specialButtonsKeys.contains(button.getKey()); From a4381b78272b206c5ec369d487f52a27f00ff5b4 Mon Sep 17 00:00:00 2001 From: Vincent Deville Date: Thu, 14 Jan 2021 15:54:01 +0100 Subject: [PATCH 126/815] ExtraKeysView: SpecialButtons use Button instead of ToggleButton --- .../java/com/termux/app/ExtraKeysView.java | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 480b0123cc..e475e32a14 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -27,7 +27,6 @@ import android.widget.Button; import android.widget.GridLayout; import android.widget.PopupWindow; -import android.widget.ToggleButton; import com.termux.R; import com.termux.view.TerminalView; @@ -134,14 +133,11 @@ public enum SpecialButton { private static class SpecialButtonState { boolean isOn = false; boolean isActive = false; - List buttons = new ArrayList<>(); + List