@blocklet/launcher-workflow 2.2.22 → 2.2.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/checkout.js +2 -1
- package/es/contexts/request.js +2 -1
- package/es/purchase.js +34 -43
- package/lib/checkout.js +2 -1
- package/lib/contexts/request.js +2 -1
- package/lib/purchase.js +34 -43
- package/package.json +15 -15
package/es/checkout.js
CHANGED
|
@@ -401,7 +401,8 @@ function CheckoutPage({
|
|
|
401
401
|
onCancel: handleCancelPay,
|
|
402
402
|
metadata: {
|
|
403
403
|
sessionId: state.sessionId,
|
|
404
|
-
currentUserDid: session?.user?.did
|
|
404
|
+
currentUserDid: session?.user?.did,
|
|
405
|
+
forceSwitch: !session?.user
|
|
405
406
|
}
|
|
406
407
|
}), /*#__PURE__*/_jsx(Confirm, {
|
|
407
408
|
open: state.showPaidDialog.open,
|
package/es/contexts/request.js
CHANGED
package/es/purchase.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/* eslint-disable react-hooks/exhaustive-deps */
|
|
2
|
-
import Connect, { useSecurity } from '@arcblock/did-connect/lib/Connect';
|
|
3
2
|
import Button from '@arcblock/ux/lib/Button';
|
|
4
3
|
import Center from '@arcblock/ux/lib/Center';
|
|
5
4
|
import CompactLayout from '@blocklet/launcher-layout/lib/compact-layout';
|
|
@@ -17,9 +16,10 @@ import { Link, useNavigate, useSearchParams } from 'react-router-dom';
|
|
|
17
16
|
import useMeasure from 'react-use/lib/useMeasure';
|
|
18
17
|
import useSetState from 'react-use/lib/useSetState';
|
|
19
18
|
import joinURL from 'url-join';
|
|
20
|
-
import '@
|
|
19
|
+
import { API_DID_PREFIX } from '@arcblock/did-connect/lib/constant';
|
|
21
20
|
import ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';
|
|
22
21
|
import formatError from '@blocklet/launcher-util/es/format-error';
|
|
22
|
+
import '@splidejs/splide/dist/css/splide.min.css';
|
|
23
23
|
var NextIcon = function NextIcon(props) {
|
|
24
24
|
return /*#__PURE__*/_jsx("svg", {
|
|
25
25
|
...props,
|
|
@@ -80,19 +80,18 @@ function PurchasePage({
|
|
|
80
80
|
} = useLocaleContext();
|
|
81
81
|
const {
|
|
82
82
|
create,
|
|
83
|
-
api: launchSessionAPI
|
|
83
|
+
api: launchSessionAPI,
|
|
84
|
+
baseURL
|
|
84
85
|
} = useRequest();
|
|
85
86
|
const {
|
|
86
87
|
isMobile
|
|
87
88
|
} = useMobile();
|
|
88
|
-
const {
|
|
89
|
-
decrypt
|
|
90
|
-
} = useSecurity();
|
|
91
89
|
const navigate = useNavigate();
|
|
92
90
|
const {
|
|
93
91
|
session,
|
|
94
92
|
storage,
|
|
95
|
-
events
|
|
93
|
+
events,
|
|
94
|
+
connectApi
|
|
96
95
|
} = useSessionContext();
|
|
97
96
|
const [params, setParams] = useSearchParams();
|
|
98
97
|
const {
|
|
@@ -112,7 +111,6 @@ function PurchasePage({
|
|
|
112
111
|
paymentMethod: params.get('paymentMethod'),
|
|
113
112
|
sessionId: params.get('sessionId'),
|
|
114
113
|
planId: params.get('planId'),
|
|
115
|
-
showRedeem: false,
|
|
116
114
|
showMorePrompt: false,
|
|
117
115
|
arrows: false,
|
|
118
116
|
perPage: 100,
|
|
@@ -333,24 +331,41 @@ function PurchasePage({
|
|
|
333
331
|
}
|
|
334
332
|
}
|
|
335
333
|
const handleRedeem = () => {
|
|
336
|
-
|
|
337
|
-
|
|
334
|
+
connectApi.openPopup({
|
|
335
|
+
useSocket: false,
|
|
336
|
+
locale,
|
|
337
|
+
action: 'redeem',
|
|
338
|
+
prefix: `${window.location.origin}${joinURL(baseURL || '', API_DID_PREFIX)}`,
|
|
339
|
+
onSuccess: handleRedeemed,
|
|
340
|
+
checkTimeout: 60 * 5000,
|
|
341
|
+
showDownload: false,
|
|
342
|
+
extraParams: {
|
|
343
|
+
planId: state.planId || state.plans[0]._id,
|
|
344
|
+
sessionId: state.sessionId,
|
|
345
|
+
forceSwitch: !session?.user
|
|
346
|
+
},
|
|
347
|
+
messages: {
|
|
348
|
+
title: t('redeem.dialog.title'),
|
|
349
|
+
scan: t('redeem.dialog.scan'),
|
|
350
|
+
confirm: t('redeem.dialog.confirm'),
|
|
351
|
+
success: t('redeem.dialog.success')
|
|
352
|
+
},
|
|
353
|
+
baseUrl: window.location.origin
|
|
354
|
+
}, {
|
|
355
|
+
locale
|
|
338
356
|
});
|
|
339
357
|
};
|
|
340
|
-
const handleRedeemed =
|
|
341
|
-
|
|
358
|
+
const handleRedeemed = ({
|
|
359
|
+
sessionToken,
|
|
342
360
|
nftId,
|
|
343
361
|
type,
|
|
344
362
|
sessionId
|
|
345
|
-
}
|
|
363
|
+
}) => {
|
|
346
364
|
if (type === NFT_TYPE_SERVERLESS) {
|
|
347
365
|
params.set('launchType', 'serverless');
|
|
348
366
|
}
|
|
349
|
-
if (
|
|
350
|
-
storage.setToken(
|
|
351
|
-
if (extraParams?.sourceAppPid) {
|
|
352
|
-
await session.loginFederatedMaster();
|
|
353
|
-
}
|
|
367
|
+
if (sessionToken) {
|
|
368
|
+
storage.setToken(sessionToken);
|
|
354
369
|
session.refresh();
|
|
355
370
|
}
|
|
356
371
|
if (sessionId) {
|
|
@@ -503,31 +518,7 @@ function PurchasePage({
|
|
|
503
518
|
})
|
|
504
519
|
})]
|
|
505
520
|
})
|
|
506
|
-
}), session.user && /*#__PURE__*/_jsx(InProgressSession, {})
|
|
507
|
-
open: true,
|
|
508
|
-
popup: true,
|
|
509
|
-
useSocket: false,
|
|
510
|
-
locale: locale,
|
|
511
|
-
action: "redeem",
|
|
512
|
-
prefix: "/did",
|
|
513
|
-
checkFn: create().get,
|
|
514
|
-
onSuccess: handleRedeemed,
|
|
515
|
-
onClose: () => setState({
|
|
516
|
-
showRedeem: false
|
|
517
|
-
}),
|
|
518
|
-
checkTimeout: 60 * 5000,
|
|
519
|
-
showDownload: false,
|
|
520
|
-
extraParams: {
|
|
521
|
-
planId: state.planId || state.plans[0]._id,
|
|
522
|
-
sessionId: state.sessionId
|
|
523
|
-
},
|
|
524
|
-
messages: {
|
|
525
|
-
title: t('redeem.dialog.title'),
|
|
526
|
-
scan: t('redeem.dialog.scan'),
|
|
527
|
-
confirm: t('redeem.dialog.confirm'),
|
|
528
|
-
success: t('redeem.dialog.success')
|
|
529
|
-
}
|
|
530
|
-
})]
|
|
521
|
+
}), session.user && /*#__PURE__*/_jsx(InProgressSession, {})]
|
|
531
522
|
});
|
|
532
523
|
}
|
|
533
524
|
const Container = styled(Layout)`
|
package/lib/checkout.js
CHANGED
|
@@ -419,7 +419,8 @@ function CheckoutPage(_ref) {
|
|
|
419
419
|
onCancel: handleCancelPay,
|
|
420
420
|
metadata: {
|
|
421
421
|
sessionId: state.sessionId,
|
|
422
|
-
currentUserDid: session === null || session === void 0 || (_session$user2 = session.user) === null || _session$user2 === void 0 ? void 0 : _session$user2.did
|
|
422
|
+
currentUserDid: session === null || session === void 0 || (_session$user2 = session.user) === null || _session$user2 === void 0 ? void 0 : _session$user2.did,
|
|
423
|
+
forceSwitch: !(session !== null && session !== void 0 && session.user)
|
|
423
424
|
}
|
|
424
425
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_confirm.default, {
|
|
425
426
|
open: state.showPaidDialog.open,
|
package/lib/contexts/request.js
CHANGED
package/lib/purchase.js
CHANGED
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var _Connect = _interopRequireWildcard(require("@arcblock/did-connect/lib/Connect"));
|
|
8
7
|
var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
|
|
9
8
|
var _Center = _interopRequireDefault(require("@arcblock/ux/lib/Center"));
|
|
10
9
|
var _compactLayout = _interopRequireDefault(require("@blocklet/launcher-layout/lib/compact-layout"));
|
|
@@ -22,9 +21,10 @@ var _reactRouterDom = require("react-router-dom");
|
|
|
22
21
|
var _useMeasure = _interopRequireDefault(require("react-use/lib/useMeasure"));
|
|
23
22
|
var _useSetState = _interopRequireDefault(require("react-use/lib/useSetState"));
|
|
24
23
|
var _urlJoin = _interopRequireDefault(require("url-join"));
|
|
25
|
-
require("@
|
|
24
|
+
var _constant2 = require("@arcblock/did-connect/lib/constant");
|
|
26
25
|
var _launchResultMessage = _interopRequireDefault(require("@blocklet/launcher-layout/lib/launch-result-message"));
|
|
27
26
|
var _formatError = _interopRequireDefault(require("@blocklet/launcher-util/es/format-error"));
|
|
27
|
+
require("@splidejs/splide/dist/css/splide.min.css");
|
|
28
28
|
var _inProgressSession = _interopRequireDefault(require("./components/in-progress-session"));
|
|
29
29
|
var _layout = _interopRequireDefault(require("./components/layout"));
|
|
30
30
|
var _body = _interopRequireDefault(require("./components/layout/body"));
|
|
@@ -39,9 +39,9 @@ var _util = require("./util");
|
|
|
39
39
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
40
40
|
var _templateObject;
|
|
41
41
|
/* eslint-disable react-hooks/exhaustive-deps */
|
|
42
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
43
42
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
44
43
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
44
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
45
45
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
46
46
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
47
47
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
@@ -94,19 +94,18 @@ function PurchasePage(_ref) {
|
|
|
94
94
|
} = (0, _locale.useLocaleContext)();
|
|
95
95
|
const {
|
|
96
96
|
create,
|
|
97
|
-
api: launchSessionAPI
|
|
97
|
+
api: launchSessionAPI,
|
|
98
|
+
baseURL
|
|
98
99
|
} = (0, _request.default)();
|
|
99
100
|
const {
|
|
100
101
|
isMobile
|
|
101
102
|
} = (0, _useMobile.default)();
|
|
102
|
-
const {
|
|
103
|
-
decrypt
|
|
104
|
-
} = (0, _Connect.useSecurity)();
|
|
105
103
|
const navigate = (0, _reactRouterDom.useNavigate)();
|
|
106
104
|
const {
|
|
107
105
|
session,
|
|
108
106
|
storage,
|
|
109
|
-
events
|
|
107
|
+
events,
|
|
108
|
+
connectApi
|
|
110
109
|
} = (0, _session.useSessionContext)();
|
|
111
110
|
const [params, setParams] = (0, _reactRouterDom.useSearchParams)();
|
|
112
111
|
const {
|
|
@@ -126,7 +125,6 @@ function PurchasePage(_ref) {
|
|
|
126
125
|
paymentMethod: params.get('paymentMethod'),
|
|
127
126
|
sessionId: params.get('sessionId'),
|
|
128
127
|
planId: params.get('planId'),
|
|
129
|
-
showRedeem: false,
|
|
130
128
|
showMorePrompt: false,
|
|
131
129
|
arrows: false,
|
|
132
130
|
perPage: 100,
|
|
@@ -351,13 +349,33 @@ function PurchasePage(_ref) {
|
|
|
351
349
|
}
|
|
352
350
|
}
|
|
353
351
|
const handleRedeem = () => {
|
|
354
|
-
|
|
355
|
-
|
|
352
|
+
connectApi.openPopup({
|
|
353
|
+
useSocket: false,
|
|
354
|
+
locale,
|
|
355
|
+
action: 'redeem',
|
|
356
|
+
prefix: "".concat(window.location.origin).concat((0, _urlJoin.default)(baseURL || '', _constant2.API_DID_PREFIX)),
|
|
357
|
+
onSuccess: handleRedeemed,
|
|
358
|
+
checkTimeout: 60 * 5000,
|
|
359
|
+
showDownload: false,
|
|
360
|
+
extraParams: {
|
|
361
|
+
planId: state.planId || state.plans[0]._id,
|
|
362
|
+
sessionId: state.sessionId,
|
|
363
|
+
forceSwitch: !(session !== null && session !== void 0 && session.user)
|
|
364
|
+
},
|
|
365
|
+
messages: {
|
|
366
|
+
title: t('redeem.dialog.title'),
|
|
367
|
+
scan: t('redeem.dialog.scan'),
|
|
368
|
+
confirm: t('redeem.dialog.confirm'),
|
|
369
|
+
success: t('redeem.dialog.success')
|
|
370
|
+
},
|
|
371
|
+
baseUrl: window.location.origin
|
|
372
|
+
}, {
|
|
373
|
+
locale
|
|
356
374
|
});
|
|
357
375
|
};
|
|
358
|
-
const handleRedeemed =
|
|
376
|
+
const handleRedeemed = _ref3 => {
|
|
359
377
|
let {
|
|
360
|
-
|
|
378
|
+
sessionToken,
|
|
361
379
|
nftId,
|
|
362
380
|
type,
|
|
363
381
|
sessionId
|
|
@@ -365,11 +383,8 @@ function PurchasePage(_ref) {
|
|
|
365
383
|
if (type === _constant.NFT_TYPE_SERVERLESS) {
|
|
366
384
|
params.set('launchType', 'serverless');
|
|
367
385
|
}
|
|
368
|
-
if (
|
|
369
|
-
storage.setToken(
|
|
370
|
-
if (extraParams !== null && extraParams !== void 0 && extraParams.sourceAppPid) {
|
|
371
|
-
await session.loginFederatedMaster();
|
|
372
|
-
}
|
|
386
|
+
if (sessionToken) {
|
|
387
|
+
storage.setToken(sessionToken);
|
|
373
388
|
session.refresh();
|
|
374
389
|
}
|
|
375
390
|
if (sessionId) {
|
|
@@ -522,31 +537,7 @@ function PurchasePage(_ref) {
|
|
|
522
537
|
})
|
|
523
538
|
})]
|
|
524
539
|
})
|
|
525
|
-
}), session.user && /*#__PURE__*/(0, _jsxRuntime.jsx)(_inProgressSession.default, {})
|
|
526
|
-
open: true,
|
|
527
|
-
popup: true,
|
|
528
|
-
useSocket: false,
|
|
529
|
-
locale: locale,
|
|
530
|
-
action: "redeem",
|
|
531
|
-
prefix: "/did",
|
|
532
|
-
checkFn: create().get,
|
|
533
|
-
onSuccess: handleRedeemed,
|
|
534
|
-
onClose: () => setState({
|
|
535
|
-
showRedeem: false
|
|
536
|
-
}),
|
|
537
|
-
checkTimeout: 60 * 5000,
|
|
538
|
-
showDownload: false,
|
|
539
|
-
extraParams: {
|
|
540
|
-
planId: state.planId || state.plans[0]._id,
|
|
541
|
-
sessionId: state.sessionId
|
|
542
|
-
},
|
|
543
|
-
messages: {
|
|
544
|
-
title: t('redeem.dialog.title'),
|
|
545
|
-
scan: t('redeem.dialog.scan'),
|
|
546
|
-
confirm: t('redeem.dialog.confirm'),
|
|
547
|
-
success: t('redeem.dialog.success')
|
|
548
|
-
}
|
|
549
|
-
})]
|
|
540
|
+
}), session.user && /*#__PURE__*/(0, _jsxRuntime.jsx)(_inProgressSession.default, {})]
|
|
550
541
|
});
|
|
551
542
|
}
|
|
552
543
|
const Container = (0, _styled.default)(_layout.default)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n .container-inner {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n }\n\n .plan-list {\n display: flex;\n justify-content: center;\n align-items: center;\n\n @media (min-width: 900px) {\n margin-top: 20px;\n }\n\n @media (min-width: 680px) and (max-width: 899px) {\n justify-content: center;\n }\n\n .toc {\n min-width: 180px;\n margin-right: 20px;\n }\n\n button.splide__pagination__page.is-active {\n background: #9397a1;\n }\n }\n\n .splide__pagination-custom {\n bottom: -24px;\n }\n\n .footer {\n display: flex;\n justify-content: ", ";\n align-item: center;\n margin-top: auto;\n padding-top: 16px;\n padding-bottom: ", ";\n\n > * {\n margin: 0 8px;\n ", " {\n margin: 0 16px;\n }\n }\n\n @media (max-width: ", "px) {\n flex-direction: column;\n align-items: center;\n }\n\n .footer-left {\n display: flex;\n gap: 16px;\n align-items: center;\n justify-content: space-between;\n\n .select-space {\n order: 1;\n color: #000;\n\n &:hover {\n text-decoration: underline !important;\n }\n }\n\n .redeem-button {\n order: 1;\n }\n\n @media (max-width: ", "px) {\n width: 100%;\n flex-direction: column;\n\n .redeem-button {\n width: 100%;\n order: 2;\n }\n }\n }\n\n .button-next {\n min-width: 200px;\n\n @media (max-width: ", "px) {\n width: 100%;\n margin-top: 20px;\n }\n }\n }\n"])), props => props.embed ? 'space-between' : 'flex-end', props => props.embed ? '0' : '16px', props => props.theme.breakpoints.up('md'), props => props.theme.breakpoints.values.sm, props => props.theme.breakpoints.values.sm, props => props.theme.breakpoints.values.sm);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blocklet/launcher-workflow",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.23",
|
|
4
4
|
"description": "Purchase components for Launcher UI",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -41,20 +41,20 @@
|
|
|
41
41
|
"react": ">=18.1.0"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@arcblock/did-connect": "^2.
|
|
45
|
-
"@arcblock/icons": "^2.
|
|
46
|
-
"@arcblock/license": "^2.
|
|
47
|
-
"@arcblock/react-hooks": "^2.
|
|
48
|
-
"@arcblock/ux": "^2.
|
|
49
|
-
"@blocklet/launcher-layout": "2.2.
|
|
50
|
-
"@blocklet/launcher-util": "2.2.
|
|
51
|
-
"@blocklet/launcher-ux": "2.2.
|
|
52
|
-
"@blocklet/payment": "^1.13.
|
|
44
|
+
"@arcblock/did-connect": "^2.8.5",
|
|
45
|
+
"@arcblock/icons": "^2.8.5",
|
|
46
|
+
"@arcblock/license": "^2.8.5",
|
|
47
|
+
"@arcblock/react-hooks": "^2.8.5",
|
|
48
|
+
"@arcblock/ux": "^2.8.5",
|
|
49
|
+
"@blocklet/launcher-layout": "2.2.23",
|
|
50
|
+
"@blocklet/launcher-util": "2.2.23",
|
|
51
|
+
"@blocklet/launcher-ux": "2.2.23",
|
|
52
|
+
"@blocklet/payment": "^1.13.38",
|
|
53
53
|
"@emotion/react": "^11.11.1",
|
|
54
54
|
"@emotion/styled": "^11.11.0",
|
|
55
|
-
"@mui/icons-material": "^5.14.
|
|
56
|
-
"@mui/material": "^5.14.
|
|
57
|
-
"@ocap/util": "^1.18.
|
|
55
|
+
"@mui/icons-material": "^5.14.15",
|
|
56
|
+
"@mui/material": "^5.14.15",
|
|
57
|
+
"@ocap/util": "^1.18.93",
|
|
58
58
|
"@splidejs/react-splide": "^0.7.12",
|
|
59
59
|
"@splidejs/splide": "^4.1.4",
|
|
60
60
|
"@splidejs/splide-extension-grid": "^0.4.1",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"lodash.throttle": "^4.1.1",
|
|
71
71
|
"prop-types": "^15.8.1",
|
|
72
72
|
"react-lottie-player": "^1.5.5",
|
|
73
|
-
"react-router-dom": "^6.
|
|
73
|
+
"react-router-dom": "^6.17.0",
|
|
74
74
|
"react-use": "^17.4.0",
|
|
75
75
|
"url-join": "^4.0.1"
|
|
76
76
|
},
|
|
@@ -101,5 +101,5 @@
|
|
|
101
101
|
"require": "./lib/locales/index.js"
|
|
102
102
|
}
|
|
103
103
|
},
|
|
104
|
-
"gitHead": "
|
|
104
|
+
"gitHead": "c045106ef5846625efd3b845e3e3b16616593855"
|
|
105
105
|
}
|