diff --git a/.eslintignore b/.eslintignore index f1ff06d..35afa45 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,2 @@ -lib/ \ No newline at end of file +lib/ +babel.config.js \ No newline at end of file diff --git a/README.md b/README.md index 736edcd..9cf118e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # React Native WebView - a Modern, Cross-Platform WebView for React Native -[![star this repo](http://githubbadges.com/star.svg?user=react-native-community&repo=react-native-webview&style=flat)](https://github.com/react-native-community/react-native-webview) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![All Contributors](https://img.shields.io/badge/all_contributors-13-orange.svg?style=flat-square)](#contributors) [![Known Vulnerabilities](https://snyk.io/test/github/react-native-community/react-native-webview/badge.svg?style=flat-square)](https://snyk.io/test/github/react-native-community/react-native-webview) + +[![star this repo](http://githubbadges.com/star.svg?user=react-native-community&repo=react-native-webview&style=flat)](https://github.com/react-native-community/react-native-webview) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![All Contributors](https://img.shields.io/badge/all_contributors-13-orange.svg?style=flat-square)](#contributors) [![Known Vulnerabilities](https://snyk.io/test/github/react-native-community/react-native-webview/badge.svg?style=flat-square)](https://snyk.io/test/github/react-native-community/react-native-webview) **React Native WebView** is a modern, well-supported, and cross-platform WebView for React Native. It is intended to be a replacement for the built-in WebView (which will be [removed from core](https://github.com/react-native-community/discussions-and-proposals/pull/3)). ## Core Maintainers - Sponsoring companies + _This project is maintained for free by these people using both their free time and their company work time._ - [Thibault Malbranche](https://github.com/Titozzz) ([Twitter @titozzz](https://twitter.com/titozzz)) from [Brigad](https://brigad.co/about) @@ -43,17 +45,15 @@ This project follows [semantic versioning](https://semver.org/). We do not hesit Import the `WebView` component from `react-native-webview` and use it like so: ```jsx -import React, { Component } from "react"; -import { StyleSheet, Text, View } from "react-native"; -import { WebView } from "react-native-webview"; +import React, { Component } from 'react'; +import { StyleSheet, Text, View } from 'react-native'; +import { WebView } from 'react-native-webview'; // ... class MyWebComponent extends Component { render() { return ( - + ); } } @@ -64,7 +64,6 @@ For more, read the [API Reference](./docs/Reference.md) and [Guide](./docs/Guide ## Common issues - If you're getting `Invariant Violation: Native component for "RNCWKWebView does not exist"` it likely means you forgot to run `react-native link` or there was some error with the linking process -- There's a [problem](https://stackoverflow.com/questions/52872045/rendering-webview-on-android-device-overlaps-previous-siblings-from-same-parent) on some Android devices where the webview could overlap previous siblings from same parent. To fix this, wrap the WebView in a View with style `overflow: hidden`. ## Contributing diff --git a/babel.config.js b/babel.config.js index 71e4dc3..60dc277 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,12 +1,10 @@ -module.exports = function (api) { - api && api.cache(false); - return { - env: { - test: { - presets: [ - "module:metro-react-native-babel-preset" - ], - } - } - }; - } +module.exports = function(api) { + api && api.cache(false); + return { + env: { + test: { + presets: ['module:metro-react-native-babel-preset'], + }, + }, + }; +}; diff --git a/jest.config.js b/jest.config.js index 6281efa..15bbd8e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -164,12 +164,6 @@ module.exports = { // timers: "real", // A map from regular expressions to paths to transformers - transform: { - '^.+\\.ts(x)?$': 'ts-jest', - '^.+\\.js$': 'babel-jest', - '^.+\\.(bmp|gif|jpg|jpeg|mp4|png|psd|svg|webp)$': - '/node_modules/react-native/jest/assetFileTransformer.js', - }, // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation // transformIgnorePatterns: [ diff --git a/package.json b/package.json index 1846048..2dbcd4a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,6 @@ "react": "16.8.3", "react-native": "0.59.1", "semantic-release": "15.10.3", - "ts-jest": "24.0.0", "typescript": "3.3.3333" }, "repository": { diff --git a/src/WebView.android.tsx b/src/WebView.android.tsx index 94e25ca..412bcba 100644 --- a/src/WebView.android.tsx +++ b/src/WebView.android.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { - ActivityIndicator, Image, requireNativeComponent, UIManager as NotTypedUIManager, @@ -17,6 +16,8 @@ import { defaultOriginWhitelist, createOnShouldStartLoadWithRequest, getViewManagerConfig, + defaultRenderError, + defaultRenderLoading, } from './WebViewShared'; import { WebViewErrorEvent, @@ -38,12 +39,6 @@ const RNCWebView = requireNativeComponent( ) as typeof NativeWebViewAndroid; const { resolveAssetSource } = Image; -const defaultRenderLoading = () => ( - - - -); - /** * Renders a native WebView. */ @@ -228,6 +223,7 @@ class WebView extends React.Component { nativeConfig = {}, ...otherProps } = this.props; + let otherView = null; if (this.state.viewState === 'LOADING') { @@ -235,16 +231,18 @@ class WebView extends React.Component { } else if (this.state.viewState === 'ERROR') { const errorEvent = this.state.lastErrorEvent; invariant(errorEvent != null, 'lastErrorEvent expected to be non-null'); - otherView - = renderError - && renderError(errorEvent.domain, errorEvent.code, errorEvent.description); + otherView = (renderError || defaultRenderError)( + errorEvent.domain, + errorEvent.code, + errorEvent.description, + ); } else if (this.state.viewState !== 'IDLE') { console.error( `RNCWebView invalid state encountered: ${this.state.viewState}`, ); } - const webViewStyles = [styles.container, style]; + const webViewStyles = [styles.container, styles.webView, style]; if ( this.state.viewState === 'LOADING' || this.state.viewState === 'ERROR' diff --git a/src/WebView.ios.tsx b/src/WebView.ios.tsx index 77d4868..9e3c2be 100644 --- a/src/WebView.ios.tsx +++ b/src/WebView.ios.tsx @@ -1,7 +1,5 @@ import React from 'react'; import { - ActivityIndicator, - Text, UIManager as NotTypedUIManager, View, requireNativeComponent, @@ -16,6 +14,8 @@ import { defaultOriginWhitelist, createOnShouldStartLoadWithRequest, getViewManagerConfig, + defaultRenderError, + defaultRenderLoading, } from './WebViewShared'; import { WebViewErrorEvent, @@ -60,24 +60,6 @@ const RNCWKWebView: typeof NativeWebViewIOS = requireNativeComponent( 'RNCWKWebView', ); -const defaultRenderLoading = () => ( - - - -); -const defaultRenderError = ( - errorDomain: string | undefined, - errorCode: number, - errorDesc: string, -) => ( - - Error loading page - {`Domain: ${errorDomain}`} - {`Error Code: ${errorCode}`} - {`Description: ${errorDesc}`} - -); - class WebView extends React.Component { static defaultProps = { useWebKit: true, diff --git a/src/WebView.styles.ts b/src/WebView.styles.ts index eaa9692..2bc2ff9 100644 --- a/src/WebView.styles.ts +++ b/src/WebView.styles.ts @@ -11,26 +11,28 @@ interface Styles { loadingProgressBar: ViewStyle; } -const BGWASH = 'rgba(255,255,255,0.8)'; - const styles = StyleSheet.create({ container: { flex: 1, + overflow: 'hidden', + backgroundColor: 'white', }, errorContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', - backgroundColor: BGWASH, + backgroundColor: 'white', }, hidden: { height: 0, flex: 0, // disable 'flex:1' when hiding a View + display: 'none', }, loadingView: { flex: 1, justifyContent: 'center', alignItems: 'center', + backgroundColor: 'white', }, loadingProgressBar: { height: 20, diff --git a/src/WebViewShared.ts b/src/WebViewShared.tsx similarity index 71% rename from src/WebViewShared.ts rename to src/WebViewShared.tsx index 6c240d8..db4d2dc 100644 --- a/src/WebViewShared.ts +++ b/src/WebViewShared.tsx @@ -1,10 +1,18 @@ import escapeStringRegexp from 'escape-string-regexp'; -import { Linking, UIManager as NotTypedUIManager } from 'react-native'; +import React from 'react'; +import { + Linking, + UIManager as NotTypedUIManager, + View, + ActivityIndicator, + Text, +} from 'react-native'; import { WebViewNavigationEvent, OnShouldStartLoadWithRequest, CustomUIManager, } from './WebViewTypes'; +import styles from './WebView.styles'; const UIManager = NotTypedUIManager as CustomUIManager; @@ -66,8 +74,28 @@ const getViewManagerConfig = ( return UIManager.getViewManagerConfig(viewManagerName); }; +const defaultRenderLoading = () => ( + + + +); +const defaultRenderError = ( + errorDomain: string | undefined, + errorCode: number, + errorDesc: string, +) => ( + + Error loading page + {`Domain: ${errorDomain}`} + {`Error Code: ${errorCode}`} + {`Description: ${errorDesc}`} + +); + export { defaultOriginWhitelist, createOnShouldStartLoadWithRequest, getViewManagerConfig, + defaultRenderLoading, + defaultRenderError, }; diff --git a/yarn.lock b/yarn.lock index d5ce495..92ccb86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1774,13 +1774,6 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -1798,7 +1791,7 @@ buffer-crc32@^0.2.13: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-from@1.x, buffer-from@^1.0.0: +buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -2509,7 +2502,7 @@ debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -3300,7 +3293,7 @@ fast-glob@^2.0.2, fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= @@ -4072,7 +4065,7 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -5087,7 +5080,7 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@2.x, json5@^2.1.0: +json5@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== @@ -5313,11 +5306,6 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -5326,33 +5314,11 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@*, lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - lodash._root@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" @@ -5403,11 +5369,6 @@ lodash.padstart@^4.1.0: resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -5505,11 +5466,6 @@ make-dir@^1.0.0, make-dir@^1.3.0: dependencies: pify "^3.0.0" -make-error@1.x: - version "1.3.5" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" - integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== - "make-fetch-happen@^2.5.0 || 3 || 4", make-fetch-happen@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" @@ -6145,7 +6101,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -7662,7 +7618,7 @@ readable-stream@~1.1.10: isarray "0.0.1" string_decoder "~0.10.x" -readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= @@ -7881,7 +7837,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: +resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== @@ -8078,7 +8034,7 @@ semver-regex@^1.0.0: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" integrity sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk= -"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1: +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== @@ -8859,21 +8815,6 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -ts-jest@24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.0.tgz#3f26bf2ec1fa584863a5a9c29bd8717d549efbf6" - integrity sha512-o8BO3TkMREpAATaFTrXkovMsCpBl2z4NDBoLJuWZcJJj1ijI49UnvDMfVpj+iogn/Jl8Pbhuei5nc/Ti+frEHw== - dependencies: - bs-logger "0.x" - buffer-from "1.x" - fast-json-stable-stringify "2.x" - json5 "2.x" - make-error "1.x" - mkdirp "0.x" - resolve "1.x" - semver "^5.5" - yargs-parser "10.x" - tslib@^1.8.1, tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -9402,13 +9343,6 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@10.x: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"