detox 19.9.0 → 19.9.3-prerelease.0
Sign up to get free protection for your applications and to get access to all the features.
- package/Detox-android/com/wix/detox/{19.9.0/detox-19.9.0-javadoc.jar → 19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar} +0 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{19.9.0/detox-19.9.0-sources.jar → 19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar} +0 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{19.9.0/detox-19.9.0.aar → 19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar} +0 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar.md5 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar.sha1 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar.sha256 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{19.9.0/detox-19.9.0.pom → 19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom} +1 -1
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom.md5 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom.sha1 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom.sha256 +1 -0
- package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom.sha512 +1 -0
- package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
- package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
- package/Detox-ios-src.tbz +0 -0
- package/Detox-ios.tbz +0 -0
- package/android/detox/proguard-rules-app.pro +4 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/RN66Workaround.kt +13 -4
- package/package.json +2 -2
- package/src/devices/common/drivers/android/tools/MonitoredInstrumentation.js +1 -1
- package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +3 -1
- package/src/utils/environment.js +30 -15
- package/src/utils/errorUtils.js +4 -3
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0-javadoc.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0-javadoc.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0-javadoc.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0-javadoc.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0-sources.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0-sources.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0-sources.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0-sources.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0.aar.md5 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0.aar.sha1 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0.aar.sha256 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0.aar.sha512 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0.pom.md5 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0.pom.sha1 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0.pom.sha256 +0 -1
- package/Detox-android/com/wix/detox/19.9.0/detox-19.9.0.pom.sha512 +0 -1
Binary file
|
package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.md5
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
c9921528354783f19858dcebaa91aa9b
|
package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.sha1
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
d21ba3698393757099c6b579069c4f0a3efe6914
|
package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.sha256
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2e27d12cadbff6d1f4bf0f372304e89159326824f8073395004dbc399c6c8621
|
package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.sha512
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
b6cde42b4b05e635f4008e7463dc8b0504ff7cf42044d95c9116defcf405b4041dd40941a6ca24392a86abee7985b0cd3c0b157b02ee6054813cb9097dcecea1
|
Binary file
|
package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.md5
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
a9da4f6f70a3e49bc001fb967bf68364
|
package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.sha1
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
f2ddac5c451f94a2d4708da17f1ae989ad8765f2
|
package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.sha256
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ecc7409545488a86124c3b08521103b375030ea780a63668d3d0dd8391b8e556
|
package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.sha512
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
f146fcbb1460ca2d0e870cd54eecce926a88b4f742d4dac50440c6626a689c0d8fd152267f120768af4237c290cff1d1e858d232b4a74447c3bd21baf084f4a4
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
f00a26db2932c0f5dd9e4ea695c5f55c
|
@@ -0,0 +1 @@
|
|
1
|
+
39dba13a0e694adb108fc6bb4d15b58b21a4eed5
|
@@ -0,0 +1 @@
|
|
1
|
+
c9897fd212cfefb379527e059f6f29a94f29c4681b3659e26f8f08b22e20d1ea
|
@@ -0,0 +1 @@
|
|
1
|
+
f12faacdbbcf214aba48971b1054310eca06c2a69d403404376b087d86beb76345e383bc6d452f6af8ec25b050895700bd930f8a33c9439153a972a179b3c763
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<modelVersion>4.0.0</modelVersion>
|
4
4
|
<groupId>com.wix</groupId>
|
5
5
|
<artifactId>detox</artifactId>
|
6
|
-
<version>19.9.0</version>
|
6
|
+
<version>19.9.3-prerelease.0</version>
|
7
7
|
<packaging>aar</packaging>
|
8
8
|
<name>Detox</name>
|
9
9
|
<description>Gray box end-to-end testing and automation library for mobile apps</description>
|
@@ -0,0 +1 @@
|
|
1
|
+
a765d464fcaef42e8caff137de8d635c
|
@@ -0,0 +1 @@
|
|
1
|
+
00a980a61b3b2cea782cc10be620ad08f83ce69f
|
@@ -0,0 +1 @@
|
|
1
|
+
246f80766f6b9c4d4a4255fdec9b09540a0fab9e56d7d2ad71a363935de5bcbf
|
@@ -0,0 +1 @@
|
|
1
|
+
a18048b41a07e0dc793b8340714cc3fe86c72269683b4302a41bc5b1100c3750e9a28874cc01b474818ead5c83ee8bb56475865167ddcb96ba9bb10566368697
|
@@ -3,11 +3,11 @@
|
|
3
3
|
<groupId>com.wix</groupId>
|
4
4
|
<artifactId>detox</artifactId>
|
5
5
|
<versioning>
|
6
|
-
<latest>19.9.0</latest>
|
7
|
-
<release>19.9.0</release>
|
6
|
+
<latest>19.9.3-prerelease.0</latest>
|
7
|
+
<release>19.9.3-prerelease.0</release>
|
8
8
|
<versions>
|
9
|
-
<version>19.9.0</version>
|
9
|
+
<version>19.9.3-prerelease.0</version>
|
10
10
|
</versions>
|
11
|
-
<lastUpdated>
|
11
|
+
<lastUpdated>20220816093537</lastUpdated>
|
12
12
|
</versioning>
|
13
13
|
</metadata>
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2245911d915896d8d4c6e171bcbb5c49
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
124069f7c432842c7ca1f5778350bae5fc2f61a7
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
b884f3860bfd26a38a9780ccb875911191aa4f596235d4de2b7703dbb6ed21fc
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
ca6716f7744d90a3779336b55729441cf5b2c7dd822bdf57105cbba6b73ffdab17782c983828f97a4a0b914bc9759e256283d98debb4384b148cd88174de9036
|
package/Detox-ios-src.tbz
CHANGED
Binary file
|
package/Detox-ios.tbz
CHANGED
Binary file
|
@@ -6,6 +6,10 @@
|
|
6
6
|
-keep class com.facebook.react.ReactNativeHost { *; }
|
7
7
|
-keep class com.facebook.react.ReactInstanceManager { *; }
|
8
8
|
-keep class com.facebook.react.ReactInstanceManager** { *; }
|
9
|
+
-keep class com.facebook.react.ReactInstanceEventListener { *; }
|
10
|
+
|
11
|
+
-keep class com.facebook.react.views.slider.ReactSlider { *; }
|
12
|
+
-keep class com.reactnativecommunity.slider.ReactSlider { *; }
|
9
13
|
-keep class com.reactnativecommunity.asyncstorage.** { *; }
|
10
14
|
|
11
15
|
-keep class kotlin.jvm.** { *; }
|
@@ -2,6 +2,7 @@ package com.wix.detox.reactnative.idlingresources.uimodule
|
|
2
2
|
|
3
3
|
import android.util.Log
|
4
4
|
import android.view.View
|
5
|
+
import com.facebook.react.uimanager.IllegalViewOperationException
|
5
6
|
import com.wix.detox.common.DetoxLog.Companion.LOG_TAG
|
6
7
|
import com.wix.detox.reactnative.ReactNativeInfo
|
7
8
|
import java.lang.ref.WeakReference
|
@@ -19,9 +20,7 @@ class RN66Workaround {
|
|
19
20
|
fun isScarceUISwitchCommandStuckInQueue(uiManagerModuleReflected: UIManagerModuleReflected): Boolean {
|
20
21
|
var isStuckSwitchOperation = false
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
if (rnVersion.minor >= 66 && uiManagerModuleReflected.getUIOpsCount() >= 1) {
|
23
|
+
if (isRelevantRNVersion() && uiManagerModuleReflected.getUIOpsCount() >= 1) {
|
25
24
|
val nextUIOperation = uiManagerModuleReflected.getNextUIOpReflected()
|
26
25
|
val view = getUIOpView(uiManagerModuleReflected, nextUIOperation)
|
27
26
|
val isReactSwitch = isReactSwitch(view)
|
@@ -46,10 +45,20 @@ class RN66Workaround {
|
|
46
45
|
return isStuckSwitchOperation
|
47
46
|
}
|
48
47
|
|
48
|
+
private fun isRelevantRNVersion(): Boolean {
|
49
|
+
val rnVersion = ReactNativeInfo.rnVersion()
|
50
|
+
return rnVersion.minor == 66 || (rnVersion.minor == 67 && rnVersion.patch < 4)
|
51
|
+
}
|
52
|
+
|
49
53
|
private fun getUIOpView(uiManagerModuleReflected: UIManagerModuleReflected, uiOperation: DispatchCommandOperationReflected?): View? {
|
50
54
|
val nativeViewHierarchyManager = uiManagerModuleReflected.nativeViewHierarchyManager() ?: return null
|
51
55
|
val tag = uiOperation?.tag ?: return null
|
52
|
-
return
|
56
|
+
return try {
|
57
|
+
nativeViewHierarchyManager.getViewClass(tag)
|
58
|
+
} catch(e: IllegalViewOperationException) {
|
59
|
+
Log.e(LOG_TAG, "failed to get view from tag ", e.cause)
|
60
|
+
null
|
61
|
+
}
|
53
62
|
}
|
54
63
|
|
55
64
|
private fun isReactSwitch(view: View?) = try {
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "detox",
|
3
3
|
"description": "E2E tests and automation for mobile",
|
4
|
-
"version": "19.9.0",
|
4
|
+
"version": "19.9.3-prerelease.0",
|
5
5
|
"bin": {
|
6
6
|
"detox": "local-cli/cli.js"
|
7
7
|
},
|
@@ -177,5 +177,5 @@
|
|
177
177
|
}
|
178
178
|
}
|
179
179
|
},
|
180
|
-
"gitHead": "
|
180
|
+
"gitHead": "4e60f0247a71e37509f3514767be4747b0985f31"
|
181
181
|
}
|
@@ -77,7 +77,7 @@ class MonitoredInstrumentation {
|
|
77
77
|
'while it was waiting for "ready" message (over WebSocket) ' +
|
78
78
|
'from the instrumentation process.',
|
79
79
|
debugInfo: this.instrumentationStackTrace
|
80
|
-
? `Native stacktrace dump
|
80
|
+
? `Native stacktrace dump:\n${this.instrumentationStackTrace}`
|
81
81
|
: '',
|
82
82
|
});
|
83
83
|
}
|
@@ -246,7 +246,9 @@ class AppleSimUtils {
|
|
246
246
|
// ```
|
247
247
|
// This workaround is done to ignore the error above, as we do not care if the app was running before, we just
|
248
248
|
// want to make sure it isn't now.
|
249
|
-
if (err.code === 3 &&
|
249
|
+
if (err.code === 3 &&
|
250
|
+
(err.stderr.includes(`the app is not currently running`) ||
|
251
|
+
err.stderr.includes(`The operation couldn’t be completed. found nothing to terminate`))) {
|
250
252
|
return;
|
251
253
|
}
|
252
254
|
|
package/src/utils/environment.js
CHANGED
@@ -78,7 +78,7 @@ function getAndroidEmulatorPath() {
|
|
78
78
|
return legacyPath;
|
79
79
|
}
|
80
80
|
|
81
|
-
|
81
|
+
throwSdkBinIntegrityError(sdkRoot, 'emulator/emulator');
|
82
82
|
}
|
83
83
|
|
84
84
|
async function getAaptPath() {
|
@@ -88,23 +88,33 @@ async function getAaptPath() {
|
|
88
88
|
}
|
89
89
|
|
90
90
|
const latestBuildTools = await getLatestBuildToolsPath(sdkRoot);
|
91
|
-
|
91
|
+
if (!latestBuildTools) {
|
92
|
+
throwSdkIntegrityError('Failed to find the "aapt" tool under the Android SDK: No build-tools are installed!');
|
93
|
+
}
|
94
|
+
|
95
|
+
const defaultPath = which('aapt', latestBuildTools);
|
92
96
|
if (defaultPath) {
|
93
97
|
return defaultPath;
|
94
98
|
}
|
95
99
|
|
96
|
-
|
100
|
+
throwSdkToolPathError(`${latestBuildTools}/aapt`);
|
97
101
|
}
|
98
102
|
|
99
103
|
async function getLatestBuildToolsPath(sdkRoot) {
|
100
|
-
if (!sdkRoot)
|
104
|
+
if (!sdkRoot) {
|
105
|
+
return '';
|
106
|
+
}
|
101
107
|
|
102
108
|
const buildToolsDir = path.join(sdkRoot, 'build-tools');
|
103
|
-
if (!fs.existsSync(buildToolsDir))
|
109
|
+
if (!fs.existsSync(buildToolsDir)) {
|
110
|
+
return '';
|
111
|
+
}
|
104
112
|
|
105
113
|
const buildToolsVersions = await fsext.getDirectories(buildToolsDir);
|
106
114
|
const latestBuildToolsVersion = _.last(buildToolsVersions);
|
107
|
-
if (!latestBuildToolsVersion)
|
115
|
+
if (!latestBuildToolsVersion) {
|
116
|
+
return '';
|
117
|
+
}
|
108
118
|
|
109
119
|
return path.join(buildToolsDir, latestBuildToolsVersion);
|
110
120
|
}
|
@@ -120,7 +130,7 @@ function getAdbPath() {
|
|
120
130
|
return defaultPath;
|
121
131
|
}
|
122
132
|
|
123
|
-
|
133
|
+
throwSdkBinIntegrityError(sdkRoot, 'platform-tools/adb');
|
124
134
|
}
|
125
135
|
|
126
136
|
function getGmsaasPath() {
|
@@ -142,15 +152,20 @@ function throwMissingAvdError(avdName, avdPath, avdIniPath) {
|
|
142
152
|
);
|
143
153
|
}
|
144
154
|
|
145
|
-
function
|
146
|
-
const executablePath = path.join(sdkRoot,
|
147
|
-
|
148
|
-
|
155
|
+
function throwSdkBinIntegrityError(sdkRoot, relativeBinPath) {
|
156
|
+
const executablePath = path.join(sdkRoot, relativeBinPath);
|
157
|
+
throwSdkToolPathError(executablePath);
|
158
|
+
}
|
149
159
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
160
|
+
function throwSdkToolPathError(sdkToolPath) {
|
161
|
+
const name = path.basename(sdkToolPath);
|
162
|
+
const dir = path.dirname(sdkToolPath);
|
163
|
+
|
164
|
+
throwSdkIntegrityError(`There was no "${name}" executable file in directory: ${dir}`);
|
165
|
+
}
|
166
|
+
|
167
|
+
function throwSdkIntegrityError(errMessage) {
|
168
|
+
throw new DetoxRuntimeError(`${errMessage}\nCheck the integrity of your Android SDK.`);
|
154
169
|
}
|
155
170
|
|
156
171
|
function throwMissingGmsaasError() {
|
package/src/utils/errorUtils.js
CHANGED
@@ -16,11 +16,12 @@ function filterErrorStack(error, predicate) {
|
|
16
16
|
}
|
17
17
|
|
18
18
|
function replaceErrorStack(source, target) {
|
19
|
-
const sourceStack = source.stack ||
|
20
|
-
const targetStack = target.stack || target.message;
|
19
|
+
const sourceStack = (source.stack || '');
|
21
20
|
const sourceMessage = sourceStack.replace(CLEAN_AT, '');
|
22
|
-
const targetMessage = targetStack.replace(CLEAN_AT, '');
|
23
21
|
const actualSourceStack = sourceStack.slice(sourceMessage.length);
|
22
|
+
|
23
|
+
const targetMessage = target.message || target.stack.replace(CLEAN_AT, '');
|
24
|
+
|
24
25
|
target.stack = targetMessage + actualSourceStack;
|
25
26
|
return target;
|
26
27
|
}
|
@@ -1 +0,0 @@
|
|
1
|
-
5ab3b2caf273681ecb01c3a125ef417f
|
@@ -1 +0,0 @@
|
|
1
|
-
eb4040ada71ccb1050cab9b5e755ff83791d4a39
|
@@ -1 +0,0 @@
|
|
1
|
-
ae666fd6178d7c81e549450c5874a07604fd14988436e45526071fa43043e061
|
@@ -1 +0,0 @@
|
|
1
|
-
f6f987d885a2975deb085c30211d5ae5fd2f3bfd9e7b87537aed1c017a439e6fb59fe2c65119e7581f36d8fca570629c7f02a3709a5a7014580d5299237fbd0b
|
@@ -1 +0,0 @@
|
|
1
|
-
8168ce2f62008b352b7912c7494b44e2
|
@@ -1 +0,0 @@
|
|
1
|
-
6c478ca17616be344363b47be51ae3cd565a7d1e
|
@@ -1 +0,0 @@
|
|
1
|
-
280ed7cc988d683fca37ec69b7d09f1922148c655de34e473101cbcdd30c2593
|
@@ -1 +0,0 @@
|
|
1
|
-
514f843d3398f32c481b2fdc868d457f7a323ca6963e6007486d72d3577ac7d083ff2c05598e823067ad900ecf5167199ad5c61aab879e613e2becba89b0c883
|
@@ -1 +0,0 @@
|
|
1
|
-
6d3f9250a50b2297577f126aa0253833
|
@@ -1 +0,0 @@
|
|
1
|
-
e8a6d8b30ca550020ddcc21a061ea5cb360515d8
|
@@ -1 +0,0 @@
|
|
1
|
-
bc528b332ad97156496b6d44e60005884f2d9ffe79808319e4a844b65cad9810
|
@@ -1 +0,0 @@
|
|
1
|
-
d3b944c0bedc48769416f46594853b759776b04befafc96314f2023f01f94607b43a22f2ebffe2ccd2c1c9144357d8e8888b600bfed1c8550263ff1c63d1f22f
|
@@ -1 +0,0 @@
|
|
1
|
-
3b4fab7ecd725791870c6e4eb635f0d2
|
@@ -1 +0,0 @@
|
|
1
|
-
13dae48f94fca5e145502af8cf488b395201f59e
|
@@ -1 +0,0 @@
|
|
1
|
-
cd4f6484c2f129367407435232f2065edae2562dbdb861fcefa9d40675a04f75
|
@@ -1 +0,0 @@
|
|
1
|
-
afe8148d581769b9292c92aa9ae48f5e8671c7c0f1950b35eb552c831e5b8ace7f54f1a2ac2604a43e2a6ae380cab441935059494963820b1f15c53ad94e2b1d
|