@blocklet/launcher-workflow 2.1.108 → 2.2.0

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.
Files changed (48) hide show
  1. package/es/assets/images/blocklet-server.svg +10 -0
  2. package/es/assets/images/check-reverse.svg +5 -0
  3. package/es/assets/images/check.svg +5 -0
  4. package/es/assets/images/checkbox-checked.svg +5 -0
  5. package/es/assets/images/checkbox-unchecked.svg +3 -0
  6. package/es/assets/images/next.svg +8 -0
  7. package/es/assets/images/prev.svg +8 -0
  8. package/es/assets/images/space.svg +9 -0
  9. package/es/assets/images/uncheck-reverse.svg +4 -0
  10. package/es/assets/images/uncheck.svg +4 -0
  11. package/es/checkout.js +573 -0
  12. package/es/components/agreement.js +5 -0
  13. package/es/components/checkbox.js +94 -0
  14. package/es/components/confirm.js +95 -0
  15. package/es/components/in-progress-session.js +96 -0
  16. package/es/components/launch-dedicated.js +290 -0
  17. package/es/components/launch-serverless.js +113 -0
  18. package/es/components/layout/body.js +41 -0
  19. package/es/components/layout/footer.js +21 -0
  20. package/es/components/layout/header.js +25 -0
  21. package/es/components/layout/index.js +24 -0
  22. package/es/components/plan.js +445 -0
  23. package/es/contexts/locale.js +2 -0
  24. package/es/contexts/request.js +71 -0
  25. package/es/contexts/session.js +13 -0
  26. package/es/contexts/workflow.js +64 -0
  27. package/es/hooks/query.js +4 -0
  28. package/es/launch.js +36 -0
  29. package/es/locales/en.js +135 -0
  30. package/es/locales/index.js +8 -0
  31. package/es/locales/zh.js +134 -0
  32. package/es/purchase.js +631 -0
  33. package/es/util.js +165 -0
  34. package/lib/checkout.js +5 -5
  35. package/lib/components/checkbox.js +2 -2
  36. package/lib/components/in-progress-session.js +4 -4
  37. package/lib/components/launch-dedicated.js +3 -3
  38. package/lib/components/launch-serverless.js +1 -1
  39. package/lib/components/layout/body.js +2 -2
  40. package/lib/components/layout/footer.js +2 -2
  41. package/lib/components/layout/index.js +2 -2
  42. package/lib/components/plan.js +6 -6
  43. package/lib/contexts/request.js +2 -2
  44. package/lib/locales/en.js +7 -2
  45. package/lib/locales/index.js +15 -9
  46. package/lib/locales/zh.js +7 -2
  47. package/lib/purchase.js +4 -4
  48. package/package.json +32 -7
package/es/checkout.js ADDED
@@ -0,0 +1,573 @@
1
+ /* eslint-disable react-hooks/exhaustive-deps */
2
+ import Dialog from '@arcblock/ux/lib/Dialog';
3
+ import { BLOCKLET_SERVER_OWNERSHIP_NFT, NFT_TYPE_SERVERLESS } from '@blocklet/launcher-util/es/constant';
4
+ import { getBlockletDisplayName } from '@blocklet/launcher-util/es/util';
5
+ import Button from '@blocklet/launcher-ux/lib/button';
6
+ import useMobile from '@blocklet/launcher-ux/lib/use-mobile';
7
+ import Payment from '@blocklet/payment/lib/payment';
8
+ import styled from '@emotion/styled';
9
+ import Grid from '@mui/material/Grid';
10
+ import Skeleton from '@mui/material/Skeleton';
11
+ import dsbridge from 'dsbridge';
12
+ import get from 'lodash.get';
13
+ import PropTypes from 'prop-types';
14
+ import React, { useEffect } from 'react';
15
+ import { useNavigate, useSearchParams } from 'react-router-dom';
16
+ import useAsync from 'react-use/lib/useAsync';
17
+ import useSetState from 'react-use/lib/useSetState';
18
+ import joinURL from 'url-join';
19
+ import Confirm from '@arcblock/ux/lib/Dialog/confirm';
20
+ import ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';
21
+ import formatError from '@blocklet/launcher-util/es/format-error';
22
+ var SpaceIcon = function SpaceIcon(props) {
23
+ return /*#__PURE__*/_jsxs("svg", {
24
+ ...props,
25
+ children: [/*#__PURE__*/_jsx("rect", {
26
+ width: "40",
27
+ height: "40",
28
+ rx: "8",
29
+ fill: "url(#a)"
30
+ }), /*#__PURE__*/_jsxs("defs", {
31
+ children: [/*#__PURE__*/_jsx("pattern", {
32
+ id: "a",
33
+ patternContentUnits: "objectBoundingBox",
34
+ width: "1",
35
+ height: "1",
36
+ children: /*#__PURE__*/_jsx("use", {
37
+ xlinkHref: "#b",
38
+ transform: "scale(.00833)"
39
+ })
40
+ }), /*#__PURE__*/_jsx("image", {
41
+ id: "b",
42
+ width: "120",
43
+ height: "120",
44
+ xlinkHref: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAIAAAC2BqGFAAAMP2lDQ1BJQ0MgUHJvZmlsZQAASImVVwdYU8kWnluSkEAIEEBASuhNEKkBpITQAkgvgo2QBAglxISgYkcXFVy7WMCGrooodkDsiJ1FsWFfLKgo62LBrrxJAV33le+d75t7//vPmf+cOXduGQBoJ7hicR6qBUC+qFASHxbEGJ2axiA9BQgYCmjAC9C5PKmYFRsbBaANnP9u725Ab2hXneRa/+z/r6bNF0h5ACCxEGfwpbx8iA8AgFfxxJJCAIhy3nJSoViOYQO6EpggxPPlOEuJq+Q4Q4n3KHwS49kQtwCgpsHlSrIA0LwMeUYRLwtqaPZC7CLiC0UA0BgQ++fnF/AhTofYDvqIIZbrMzN+0Mn6m2bGoCaXmzWIlXNRmFqwUCrO4075P8vxvy0/TzYQwwY2jWxJeLx8zrBuN3MLIuVYA+IeUUZ0DMQ6EH8Q8hX+EKOUbFl4ktIfNeZJ2bBmQB9iFz43OBJiY4hDRXnRUSo+I1MYyoEYrhB0srCQkwixAcTzBdKQBJXPRklBvCoWWp8pYbNU/DmuRBFXHuu+LDeJpdJ/nS3gqPQxzeLsxBSIKRBbFQmToyHWhNhZmpsQqfIZWZzNjh7wkcji5flbQRwvEIUFKfWxokxJaLzKvyxfOjBfbGO2kBOtwvsKsxPDlfXBWnhcRf5wLthlgYiVNKAjkI6OGpgLXxAcopw79kwgSkpQ6XwQFwbFK8fiFHFerMoftxDkhcl5C4jdpUUJqrF4ciFckEp9PFNcGJuozBMvzuFGxCrzwZeAKMAGwYABZLBlgAKQA4RtPQ098ErZEwq4QAKygAA4qZiBESmKHhE8JoBi8CdEAiAdHBek6BWAIsh/HWSVRyeQqegtUozIBU8gzgeRIA9eyxSjRIPRksFjyAj/EZ0LGw/mmwebvP/f8wPsd4YFmSgVIxuIyKANeBJDiMHEcGIo0R43wv1xXzwKHgNhc8WZuPfAPL77E54Q2gkPCdcJnYRbE4Qlkp+yHAU6oX6oqhYZP9YCt4GaHngQ7gfVoTKujxsBJ9wdxmHhATCyB2TZqrzlVWH8pP23GfxwN1R+ZBcySh5CDiTb/TxS00HTY1BFXusf66PMNWOw3uzBnp/js3+oPh+eI3/2xOZj+7Gz2EnsPHYEawAM7DjWiLViR+V4cHU9VqyugWjxinxyoY7wH/EG7qy8klKXWpduly/KvkLBZPk7GrALxFMkwqzsQgYLfhEEDI6I5zyM4eri6gaA/PuifH29iVN8NxD91u/cnD8A8Dve399/+DsXcRyAvV7w8T/0nbNjwk+HOgDnDvFkkiIlh8sPBPiWoMEnzRCYAktgB+fjCjyBLwgEISACxIBEkArGw+yz4TqXgElgGpgNSkE5WAJWgrVgA9gMtoNdYB9oAEfASXAGXASXwXVwB66eLvAC9IJ34DOCICSEitARQ8QMsUYcEVeEifgjIUgUEo+kIulIFiJCZMg0ZA5SjixD1iKbkBpkL3IIOYmcR9qRW8gDpBt5jXxCMVQD1UVNUBt0OMpEWWgkmoiOQ7PQiWgxOhddhK5Gq9GdaD16Er2IXkc70RdoHwYwdUwfM8ecMCbGxmKwNCwTk2AzsDKsAqvG6rAmeJ+vYp1YD/YRJ+J0nIE7wRUcjifhPHwiPgNfiK/Ft+P1eAt+FX+A9+LfCFSCMcGR4EPgEEYTsgiTCKWECsJWwkHCafgsdRHeEYlEfaIt0Qs+i6nEHOJU4kLiOuJu4gliO/ERsY9EIhmSHEl+pBgSl1RIKiWtIe0kHSddIXWRPqipq5mpuaqFqqWpidRK1CrUdqgdU7ui9lTtM1mLbE32IceQ+eQp5MXkLeQm8iVyF/kzRZtiS/GjJFJyKLMpqyl1lNOUu5Q36urqFure6nHqQvVZ6qvV96ifU3+g/lFDR8NBg60xVkOmsUhjm8YJjVsab6hUqg01kJpGLaQuotZQT1HvUz9o0jWdNTmafM2ZmpWa9ZpXNF/SyDRrGos2nlZMq6Dtp12i9WiRtWy02FpcrRlalVqHtDq0+rTp2iO0Y7TztRdq79A+r/1Mh6RjoxOiw9eZq7NZ55TOIzpGt6Sz6Tz6HPoW+ml6ly5R11aXo5ujW667S7dNt1dPR89dL1lvsl6l3lG9Tn1M30afo5+nv1h/n/4N/U9DTIawhgiGLBhSN+TKkPcGQw0CDQQGZQa7Da4bfDJkGIYY5houNWwwvGeEGzkYxRlNMlpvdNqoZ6juUN+hvKFlQ/cNvW2MGjsYxxtPNd5s3GrcZ2JqEmYiNlljcsqkx1TfNNA0x3SF6THTbjO6mb+Z0GyF2XGz5ww9BouRx1jNaGH0mhubh5vLzDeZt5l/trC1SLIosdhtcc+SYsm0zLRcYdls2WtlZjXKappVrdVta7I10zrbepX1Wev3NrY2KTbzbBpsntka2HJsi21rbe/aUe0C7CbaVdtdsyfaM+1z7dfZX3ZAHTwcsh0qHS45oo6ejkLHdY7twwjDvIeJhlUP63DScGI5FTnVOj1w1neOci5xbnB+OdxqeNrwpcPPDv/m4uGS57LF5c4InRERI0pGNI147ergynOtdL3mRnULdZvp1uj2yt3RXeC+3v2mB91jlMc8j2aPr55enhLPOs9uLyuvdK8qrw6mLjOWuZB5zpvgHeQ90/uI90cfT59Cn30+f/k6+eb67vB9NtJ2pGDklpGP/Cz8uH6b/Dr9Gf7p/hv9OwPMA7gB1QEPAy0D+YFbA5+y7Fk5rJ2sl0EuQZKgg0Hv2T7s6ewTwVhwWHBZcFuITkhSyNqQ+6EWoVmhtaG9YR5hU8NOhBPCI8OXhndwTDg8Tg2nN8IrYnpES6RGZELk2siHUQ5RkqimUeioiFHLR92Nto4WRTfEgBhOzPKYe7G2sRNjD8cR42LjKuOexI+InxZ/NoGeMCFhR8K7xKDExYl3kuySZEnNybTksck1ye9TglOWpXSOHj56+uiLqUapwtTGNFJactrWtL4xIWNWjuka6zG2dOyNcbbjJo87P95ofN74oxNoE7gT9qcT0lPSd6R/4cZwq7l9GZyMqoxeHpu3iveCH8hfwe8W+AmWCZ5m+mUuy3yW5Ze1PKs7OyC7IrtHyBauFb7KCc/ZkPM+NyZ3W25/Xkre7ny1/PT8QyIdUa6opcC0YHJBu9hRXCrunOgzceXEXkmkZKsUkY6TNhbqwh/5Vpmd7BfZgyL/osqiD5OSJ+2frD1ZNLl1isOUBVOeFocW/zYVn8qb2jzNfNrsaQ+ms6ZvmoHMyJjRPNNy5tyZXbPCZm2fTZmdO/v3EpeSZSVv56TMaZprMnfW3Ee/hP1SW6pZKintmOc7b8N8fL5wftsCtwVrFnwr45ddKHcpryj/spC38MKvI35d/Wv/osxFbYs9F69fQlwiWnJjacDS7cu0lxUve7R81PL6FYwVZSverpyw8nyFe8WGVZRVslWdq6NWN66xWrNkzZe12WuvVwZV7q4yrlpQ9X4df92V9YHr6zaYbCjf8GmjcOPNTWGb6qttqis2EzcXbX6yJXnL2d+Yv9VsNdpavvXrNtG2zu3x21tqvGpqdhjvWFyL1spqu3eO3Xl5V/Cuxjqnuk279XeX7wF7ZHue703fe2Nf5L7m/cz9dQesD1QdpB8sq0fqp9T3NmQ3dDamNrYfijjU3OTbdPCw8+FtR8yPVB7VO7r4GOXY3GP9x4uP950Qn+g5mXXyUfOE5junRp+61hLX0nY68vS5M6FnTp1lnT1+zu/ckfM+5w9dYF5ouOh5sb7Vo/Xg7x6/H2zzbKu/5HWp8bL35ab2ke3HrgRcOXk1+OqZa5xrF69HX2+/kXTjZsfYjs6b/JvPbuXdenW76PbnO7PuEu6W3dO6V3Hf+H71H/Z/7O707Dz6IPhB68OEh3ce8R69eCx9/KVr7hPqk4qnZk9rnrk+O9Id2n35+ZjnXS/ELz73lP6p/WfVS7uXB/4K/Ku1d3Rv1yvJq/7XC98Yvtn21v1tc19s3/13+e8+vy/7YPhh+0fmx7OfUj49/TzpC+nL6q/2X5u+RX6725/f3y/mSriKXwEMNjQzE4DX2wCgpgJAh/szyhjl/k9hiHLPqkDgP2HlHlFhngDUwf/3uB74d9MBwJ4tcPsF9WljAYilApDoDVA3t8E2sFdT7CvlRoT7gI2crxn5GeDfmHLP+UPeP5+BXNUd/Hz+F5X1fHhQBzWEAAAAOGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAACoAIABAAAAAEAAAB4oAMABAAAAAEAAAB4AAAAACsqd9QAADKNSURBVHgBrX0JkGVndd7rbaZ7ZrpnumfVjEbbjMQgCSEWCQkkxYAQqFImhhiJpMo4hYyr4tgxIFFl49jYoZxQZbYYKkkZBDFUBSQos9kJaLEAbUhIrBJCaNesmunp7tl7prd833eW/7/vvZ5RnNzpuff853znO+c/93/n3vf6vX496751V09rkY2GMPoRhwWJoU9XKGjUuMNYo1wmJnBxNIqeVg9ooDMyxwWmf7B/2foVSdhV6OkJNI/tTO0uNdbg7YhqDGZLTrqIExQVsIg9rU39A70Y23xyVo4wRhplcTMPLhYmSdCmIYUKg1wiHR1rTJEhococU4qfYjfC9nEVRuICN5NAZHyLeiIeT2ymf3Jy8Za5EIzRSX1kZKFPtjmDDk22LEd39yYYGFNgX+bNpAPnx0yaYzO7xQYZzLU5bhdirYW+4ItkNidGuQObSaWiKfAsOgvWt0ofyTaBOVposdA2uRLGzO5fSkF1JIlAeIDbOHQdsYrBGLnviFJMktp9Ch6SBTRIMbQxcEgjUswpNCCLe4rZM2hPpEEhdqVjp8fBll8b0oe9TChMEFIOnY7UhrEgOA91rI4JJSaFoJFLg5sPbdtwDDEQaRNKzg4xcBOfJZSRSwG1riiMv5un4tGgwjmrHyKX9qOohdEuq9zdTa0j0JZod6BrA6qck7tRIUMmSwpK1FzaIKXWwDTxNrtMrFQtp13hK5HmWEJt6m6eqYPX/0UPsSjaW9k9VJeI0aNlMrvNqgot0a+NkAu0C5+5tVE0cVm19hA5Jh4oHBzbJPAUEt713BhFwaQErkJXpLRDaJzO7pCEs0PZtbSZa7tbFJr07oyj/SQZBQtOjJWgYaRd/s5hBx80kNClukEE/np+LieWJDYTxRK2NtZyBDQdo/gWhhdxLNO1eCd14dwVDLeVCmfoRk7s0WWrHjU5q2J1d3Nw6toqVV0tFTXgDFTHilFTB75QxFEhOEgFcuuSXprrnMKLLrxDCBuElCspzDwmmMACriEmey7A44SaKo+JLj26iTgpc0ZNIfkoRJRU1rBKrovlaiabbja9HLsw2NN8FKadkSvfpgiLqpClkJl4/Ecii3guou7gNh6qja6amlP0N300wrrWzYS5YV+5dcCNR/d6YSPc4oWmeQybpxCzDCaM7ZGlsAEGxVBvz5WrR6/ZsObwkp67Dh/6ybGj7lJhugZu5l+jLTGj6dTTWmwmNbnMv+zFYUB4so/EWYxCN1m4JpuM7QrinYlhsBADj6OWJa8QoYt8bVy0dK23YqFzEOh4xdjoNevGBnu5nFf19b1t5arLly//0uTE1NwcGQLbLnNMY2PT9FSFsJXADSAHMUuPUAdqxyrOAvt0ROT9pQItRKHNp2JBaEOb0MwkjN2XnvlxH0k2MzI7dEHaLYTCC7Bl+dDVa1dj32RpbegfeN/a9VjXWN0sN2iDsA1pQzMaypZCB8wya7BgwPMC7lSfIpC6k1UXVQ53FLryo9rTNXakrii+ZzwGNR2lwMstdlAbE8yotQ0rMEVuwtsx9+KnEdvYQP87Nq3fsnyZDbF/6uixuw4eOHsdlvOyVX1cJRcPLTtrydIfHzv63SOHktATrLmqpC17rbVARCY+v4xXewWGPiFXQBNh5JK2YnPqXN4cdazoDtc2RZcQXkxZwowjNoZtSyoNxht4G2FvisG+XrTjK1evsl4B/bG5+dv37b9nYgqv3u052vfY8WOvXzH8iiGeA3QSk61x68zGqWZVFt9YAd2RAVIS68gpCfQIpVkT80BppUAWVdm1Kfes+8Zd0hGh7HRsisloaTNSoHjUSQuVLA2zQfVYcjHKaUMypETxVatG/sVpa7PEsN0+PnH3+NT0/Dzk+mVSLOp/PTqGHpL+j01Pf/vQgal5NW5oK+bE1ALtVWo0FZci1S4ALF7odiDLqpdJe9Z+4x8rvkpshPTwMHeckIravFl34m2k1sFxk1petUrylmVDb1rXaMfoFbfufGHyxIzoCKoLbbFfMbT89StWWCcxDRv3ETVuG9eBTFPtYfR1LcnzdkC7p0FsdpqlV6biM9GBGvRsGhhg64iy4NjcnElKyYmoLZWP2PFwRCK6D1GadDJD93LLPNTb+9bT1r561UiyTczMoMRPHznmGrI6s2UsPYnRoFHZX1sxjAZiYGvc6NowUSM/M9V7ZUWjIyQ1we2eBgEm77Jqwko2IAugWrS4otNMNWvS3EyBvYLGsZlP7UG8+ZSj2W2VN3LvaQ319V6xevSqNVU7np+/fe/+u/dPGVET39O/NH7DEkEieE8269C0cDfy7cMHHjs+3TVdm0vkBoj6tWm9O6QxKW3RaKgEuJNQEB0SfsPihTbypkvlXYltpLWl8FMbFh1jYJAywk3b9aevH11Smuzd+ydv2zth7bgdrbFah69cBQGbLR+MuOZP6x/4V6OjjU4yrVvAbNzGW+0zIa91l8AJqdwwSWuTlkJ3CPA9m/r7e9Z+/U7ejpTC1ESVay16E475dfX1FSG32pdV4XjT0NK3blhb7o57Wk8dOfbNPft2HTue58hSCW8cmWb/YJ9+Z1ip6dA+A9yQtDVudJL7jx6ZXuAVtW0zf1PGXUhAIs5is0RgbI4q4HDXEStaPVo3OeZQfIiosq9E+dKWW4cRrlZPWZrmob6ea9atuWL1qnSfOMF2jOteamrBAunkQq0RCbn4ODKZDjLFlNGdnz1xHM06G/evLR++eHAZG/e0GncVwzxNoRuyqtrkd0tKGENHL5tl1reAzaXsuaI5ErNgZEihphaseCKUBcsoxcYSMI1IURDh0Y6vWbcafVnm1vTc/D37J7+/fwpCgIPGnUr9zAWtY/n64TiRETyODWcNRvv6cJ20O26zonF/fmrcn7uHQx75+FYB+Ji0LYX2FAOAozDcFXCxqkdboaVkjECmYJbiZERRZdNDZ1XoEsVVPVtWDF2/aUPdjh+aOvjN3ftY4tza/JtDjBCFhV6ntxvU3QkMTXDb+KWDg9cOj7Q37voWUDmoy3MqisVJkrXB3BjIyXf2AHNzE6XWUSrKKmMzRbOSBeSsesJHuWKsREfxsNAaWzJw3ebTSjtutXDTdtvecTRl+De8LINUdYSteMEsdFkbcDN/oJLCPX45PY0fdRK/40Yb2TY4+IMjR3DHnbQ2rSg3fnWCf7rCOqWFaCc3d+sDTLkbSk/BfT4ZxfL1pNtZHZy5UXCodLWdt25rRq9ZvzpnjnaMWzesZWDtXKrXytN2bVnWdIFq6DiQotGsGpDwa+F2G40bXRsVh3Kw1YuuAvm7hxuNW3fJIAWjiUkAWmy2by+MWyx/Q1WQeK2jJEbyXGcVsiAEIC03BbVlWSHM1to4NKgqc3hsbu6e/VPfH5/MdqxJoNyYj8fhQYTtIao8AMHIYnnEOnCRIRlWx9hNzs197cAUVvG1wyu3LR0EEe6+Ue62K6SqYGmR0f934QvePNqslGQ9iyi042wKmIevs5J2EpnQnAUX00l7zcSJE//96R2TMzMFp9oZTdQtYkQWMfZjgJtVLiAlgaEfjcWcvL8kw9Ts3JemJrCW3zayiviOreGcnKbF3s+1CcXZ7JGA9J6M3kDjQMarYrJ43HRgohIrQNho0ZY2CEymokNT5usVROCMG9AgwglbxmbH3gQjSlkeCXF/cFIVoFp2BG0IURJbYCcJ9wDFMYg0ZsJSmJYjk2BNgcgysHTkbdrq928GLFinQ2a1V83W4IZj7ds+spipVbmbeCHKDNyhxlRynpWGjoNQ+LEUNjLgUZMqWKrCj3Jzg4V4bl1R3T3Z45PV3hLWpE2j1LqlNEBxa3OoA9VyLJ82eFuyVcngzFGTo+kdNoc2jLJxFyBaU4bgK9NUXuuaIbG10mUm5rcTpiFfF1yqYEStc3bNFV2jEqPfx5iD9th1BOkIaYoOdQSgAf950us1nCum4SigeY4M9L/3jNPftmrU/LHPbIoLJY0qR3O3fbrUylPJQciV3YntHonaWNf9GKh8Hc6AhIHcfr9rDwhYLFt4JShEy0PqsNm8LUQ4emAdGknQXyAP6ZkttN5z9qabzj1zpJ8X8LevGv2jnTt2zpwgOjaTm5FV88xDieTEijoYaO+iLfnzGbQWhye3CD75KCgek14U3GFAiEgDtlNvNSjIKh1V4AvL4nyvXb3qxnPPeO1YeXnk0mUr/vHcbV+bmvjUvr0oN1wjMdHZqqNK6hLBwvmzkCqVKgvTJl2VFVdn8QkEyZ1W2NA3HFv9BqmUTZEs0njqHJhOe/M2hAwwO77JI3WSuY2rw5ZXnMEGE22bhwY/fP45b1m/Jul2TB9HAxnp64PmbavGLl2+4m/3j//txDjIsQUBjioKb5ek86Oh3CaPahdYqmq5gqSoDqJXiAgWrcfu5omLoamxFzZ5KsENli4p7UlplX7TtR5VciUGueVXGyoZLeKmc8+488pXZpUPzsz+2S+euvy+h3/jqSf+bmrSWDYNLPngho1Y3dm4kVhZeCQM0jhG+PZjjW23xdiLWc5eGPyY9oYeK8pXtNkRqTuQBkuTa5APPPEIb/qwGr8MjVDNQbud49DpiOJ++PwtWM7p95lnd370V88dnJ3Fi0o7T5z4453bP733hS+edc6mJUuAQbk/snHza5Yt/3R0kqBTnRvkyB1GbvVkXQVteqYgsO0S5oIuX1x67mg+Ziz0WFH9vqpCacCKOcSmwUZw6qaWSxogYNPe8BhFNJlsRzxBr109etN5Z9bt+L6JqT/86ePbjx1veC200Jrf8MQvsZD/YO16Kzc6CX7QRr6wf3yHGjdZQerkIsCEncimXnIo/O7maQe+IFOqgR4IwQpRApvv6wAAnulcUCbRgP/auK7JZy7dmIPLHXgwZ3Mx38rYGhkYwE3F7559eiq3H53+w589jkKbBjNoBFKiX5uavPPwwXeNrUG5DfbbY2uuHh759L4X0F4K3pOXQo6Re0Yr6VHlGFlrucBdYptiZvGoaYZMeNxHgysKUQuJc0Ew9X5dx8LF1LZ62l1yHKCuipvOO+uh178mq4x2/NEnnrvkuw9kleGFKYCjQaPBwdk5lPUNv/pl3bj/88bNaNzbBocKnlKMajkTqkIELmztY+qzpOwcWHiGwd5+CClu/ZTNw5SN/kts++Z4HmzmAARB3vxlDk1v+RpB7l+3etV/efm2zctKO/6bZ3agyqg1nZtMzZHIgwid5I93bccC/8jG07Nxf/2cc3EL6I0b+bJvmIOK0IXOE4bFe8ziGBDZFtdeHOM+BAaP46h+ziRCG7td6yp18LUfdYcDZT5qCsDYu+Wox7+ZUVyUGPfI6Xff/qmP/upZ7KO+KE2pdcwn4SEkZqH14JHDb3hSjXtNo3FjyeOHDgTLwWYYHDpW/Tv1FTl13eaUWJ4dlc9R6dvCu0ltoD123HhieLRMujAbzg1+MBq6cTNX56OiFhdaI0v6P3DeWdkoYEc7/tNfPPntPeMEczPaBquRiquhN4eyX2hhXT945Mhvr16Dfm3631+7HpdN1BomTy8ffu5pnM4csSKRZF8kshoBbVwNtlTTRQJ6dLeFgnWnCdl0my4xAi03uDNlw7uu1DUUZpbD755z+sNvuCyrzHb8q2ffcPdDVZXBStrg11H5mASD/bgBh4jjJ6jFe5L/tGfXG5/4pSpLIG4B0bjvPHcb3qAlfPoUGknUmw17T2QxbLhautizFGpRlQd0ftcBJQek1xG7xJkgdbDmMfDeRLxB1d4BFQu6xIcv2HrhyvJJ7i/v2IMq7zg6Hbjm0fktf+ZmaShAx7IxsAJ59j0t3OT90a7tDxw9/AfRSVDuO7fyufunx/25exXSnIvCwrnW+GG0sdkK1iWibIlYggTzf/6GBZPB0L0pYisTtHG3PaAZ0u/53Ftol89YNvi1113caMfjU3+Fdhy3buAwaJJ5MOdf+PyrL7xweIXF6u33m6W/3L3rjoMHi0t3CnYS/KCN4CfvuN84vPILE9mpFL5BxIEHXyy3bvWovFDvcj+ahQYvaKvSWpAIhSO2komGvnMMGYzFYHLpGejtPX94+bbNy5foUxFwQa/4D48+ecv2Pe4udPI7Wc3PsAvXVi93pPHq4ZUodA4pWGxTJamGeCJz56GD/27terzyBwVeLUHjPjI//+j0Mf9VS4nNiMZlHMbHfWLMUIcrIKKw6Q0i/jC3pWG8BhTGgLG3I8wpGLTsadB/PWogGfKilcNv37TuolXDVmWU+K8ef/ZVd/ygVLlJal62r8gX6ieKRd9qXT2Cd5+yixYlRPspqiKhk3xw13Y8n3zw6GHTLu/tvXTZ8quWr8D7bKhxJjv4wJAsqUWq1bVsuGovoyP6hq5/V/OsWNGjHcrNHgAwNJEVpYmVecvwst/bcsZVa0fPG15uxvvGp975wM9wxTuu95NTWeFNNgX2yK423vSSsy4cKZ3dCLFf2tuLuwu9TEp47UJMjlOgtnVofu7rU5M7Z2ZeunTQXgUc6u1b3d8/2t+/Z2Zmel53AkJq13DGwHOr1bVcHF2CcbhXHwPpMEGhHhL+2dwNGeoOP6WAt8tcj7fLDJcPngD3v/eM/5sHfy6Hyrsup2RTYN+2LbaiAcPLpA8cwfLkpafmI0OOjbGKDCOuh383NfH4+RcRiW2BH4fBGxDuP3r4rkOHykkiC7biDCmJZTrFzsB89a65GW9TZ6NT0ePtMleuHcPnAAlv0hzgGw1sM0OE7eCs/SCvHOjHjWD9vDF4/IiG++CRQw8ewWcOm8wZLULV5ekGZc74PMfrV4zgIwR3HT7ob2InT1KUGLzSpQV0BWKBy96ag18Mm0g4QaFFbfhkCZwdY0SQlRi1Ng+8wfn7+ybwKLzGL2JcbtjEZPxBKpbrN29AB793/xReCA0DXslb9dfNZ+dGXu9xF/HFs7dibeJV0x0n/DdbYMBt3NUrRx48fJjvQl9ks5RgnJqb/fjePdeuXIVmghT1OcZRLPCvH5jEG25s1dgjpmaqp1/OQI2QjDoCid8ZZrh86KUmqOJIR9XfamH7LSuWYRVjnyGeOnz0lu278e6v163h9b1jS3634HXnv754mw0eOXAY93yPHjiM0te3gx0kDcXbV43hB7U+ODeH9zO+cWSlNV88I/+tZ54m1HKtJ9IgaE3Ozf7PifFX4m2+eC+kfi159pKl71u7ATck+LAXrFEoEtkEIHFdG7OFWJzfn4LTh+7plFkkZ2pKrfHW0N/YtP6C6gkISnzbnnHsO5iMp3uMD7zkrGTH05n6GU3qX4zw++v8ldIEo4Nfunw5LpiNwF0nKh+0C/yge1y+YoV9LAzrGp9jvP/IYfRuQFQop7cplR7i425V9CcsDMwS26tbncX20locRUGLuGrtGNpF9gp8DhAlvnvfRCMLzq+xWaIRgtZrT1uLxdsA/X8dfGTTZvzqCyvda92eUVswvlhhDRpL+xXL/HOM146svHz5CiztHx870llI1q+maR/TFj3azwtr3eZVM5h8yeqV6BW4u0gT6osqo9apoWBFNVVML47QWqAFPCk3yIvZb5+exq9agLxweLm97+CUXmji71q9Bl2FyJyc5dEojzH5cy50bdyWoOLvXr3G3lWtxr3q7CVL1Enic4xWrJypXjpqBDLWLDSKwlPpgXmrFID6uLB1xXK24+rWDV3iy8+zHXdxqIqqomush05McwFr+SR3FBkbV8jPPL/7s8/vgpDKy0dXXnfauus2rkvNYgJexsMvt7iosSF2l1zdtc04NcuLJD/HODxs5UYnwQ/aCN5Yresk+fAflPTFSkvyJld5mdQcgIuapweTwAdP3nzauivX4uLmehQXJX760FE7PXRPm+TGzsxQNS8f125Y24B1Gzx6+MgNP3ls+zQXcr3dP3kAP9/eN/HJC7aefHXjwvjG4ZF8Ga/UOrOqedvkhRbahTVulNuMly9b8dKlQ+ok/jZJZ/J6BwW0UUXdjdXxeE20hw+1afmTC7aiI4tg4djs/Hd2j//lo09hOScAhMEZYRY76mVVkS/8+588htuMxYDQo8q/+dAjnVVOl+/s2w9AvdLTlMKn9vL3hzmkkHk3tMUCu/3IzpmhjWB15821dZK3ryy/tQAGq4jENXnIftvbZjNr6SVc0Y78/t6Jv3z0idt2j5dEgFaA8FJui+6YdPxuhi8wve2+Hz+/2MukrRbW8smLCDacjM88v2uxgKjyp/buQdSY8otdEWXdsH70xueL8LD4b+P70MGrcNFxg5jQEszlKHTlBxH92tq0R3Arvb+xc2/7Rc+sojb+Ooq7FkwYlTpCHZiZfft9P8ZvWBpIDW7dtfcka7nGf/b53V3Ph1W5RlLummXk1Q4OuGpN0O6ZE2gaNSxdU6C1HjTetlsbAFMhVG4vSU0tGi3jptZGjeWTAPC3GUjMqFjRf/rIkwlM4ebti67TxJiAKt+ya2+bEu+zwVqW0q70Hq9MtEhCaVgWcke+SlagNseqqHA3hjZIc0XDmDwqStSyzas5ozTW7iXzCpxI6nASfVI4HJjNF0MK/pFDuGl9sdsvDncDe0QeJDYy6EIdEzZ8B1p3v7B54jWBY3GwHzJU/s1Cm6OZtcdKOOkWraWGhRzHDgIYaKMvHzf22OlAvcimkX52f53DIlR5qD5oqfFQKqBKqvCmraoqm3KuHFKEtcM5dN0KnY7uVwWqTCHCauFDUR1P6lkZ61Mf7iv79Up8DP+fjjH9OFahjTcMnVFsembXvukLVbtvGRdfezdpJzudE88TWCC1pWgNkbAApaJChlgXFz2kA4pb45PfHQeRHy+onkY1TaKu+G1sVSjIClAnY+oEx0O4qk+hsHNge78e+aDV6k2p4E8h2V12gpqZLJJuohtCghcWXrumcUNqsOs2nvrpTBK+ZS0+NtrYhvv68EqeVBnJAJgCL48NNAa1AnIMUaIQ6SFfuabWhcYYg3SEzPdHp13ezV03G1LsOD2G076bS5O0OVpofWDb2R94ydlNLUe/c8amTmVXDZ6O46fNhCeEXzxnK57CuR6JRW5R5RinZ4XJOnUBhb8IZS+glPiYzUKxR+cgw5XMIKWjtAB3Xw7tzu1j0DSZBFi8yjBvHlz6F+d1OQFt1OgweBbeprQha71l60sHUeuI3yWJrq6RboW3QkGhIsgLEgECYaejDJBoS0X5I7CpWiSsq9Wxic2T2gUPu9EFaRyrTOTGtbzt7C4MofqdMzbeeM7mGHU5ospfffWFp3uL6Abo6/uvZ559+gDfr962oRL1lkkyyzIocurS7oVMA+iKbJKPuaKz7AVTxzfn2qbnjZZlrZYTFB26WAJwwY+Zcf3rHxw4c8R/R94WsB6+/5wzPnH+uVjdtdJktIvbL3v5BStOQYJXSgen5+eO+y+lmIGSqBO1flhrOsOZJk+Pgd2FRQzvOGq6cOI4X4/2Zw+GSa5GMNjCwHtfdBAqqK0s8IBaNFUnx5iZyB0l7u3v6x3oxVtLPvT4029ZN3bKuwu8FoofvFZ33+QBfFgId36bBgev37julI6W/1f37sPrIZDnT8z1DfYjdCTemJ+lXlSRcE7I8tfcCqpIiYfKZcOyICh02O2cFr9ukjmahXiOVb0abITY12gBcDs50Ns30Md378gNT50/89yuG7ecUfsvJne94i0GrvWffH6nDefnF+aPziCH/qH+Hvx55GaC0QyRXGw1gOXqMltAi1rrrwNEFnvCQon/A2KyFB272uYveFdL1+E1yFW9ffi7U/19S/iObJrxXyi8nL9jussrSh2B/4mKTzy3g08aq4zmZ+ZnDp2YnZ7peE7qJa6wCmrjdm0jn2KkpFFR8cQ1zirvLWUup7TBFoNCAQ2x8mtoHRq63t7evqX9Pbhr9w6iUyQQFvV7H3nC8Trg91V4lbnWvEgZXeUHUwfrl/Gg+cTzO3ypRjJgQxZoI7NH2l5gsdkDR6GCV4OGdpG8iBEOu5DVozFQE8DscU4RxJboKcrtUchkjUDzqR53dRqijQUTD4R4APEXJXv3H5yZu3+KvzRBdUC6eWgpLoP4ZVVNs5iM4n7i2R0379zNS83CAprM+cuWvXnN2Fde2IepKi4nyWnnrJBuvjkteGHkfLihBgk1zcn25lgcGCiCidEvhsqAYPz2QwdPKLAdMeTMzFNQhjYV8+rt6+1dUl6vMNqoNdAst/2yBcobfvqYxcCpthOGx/v7H30CjeVzL992krs3eN28Y8/Hn90eC5mLBGfr/smDN+/i6/2aD6cD2rp2TNyS17Rnj832L+1baDxTxuQ8X+YWM00vKmOzKWvPiVLNgakpW48WnDWzatiQe4xf5KaHhOeAFoFGgSqzV/iWjxMf06BSW0g/YdARSJt54sXPy+59OIrovvXhK3v2/vkTzxQAfbGRVf+4FKDDXoQ2MExjdugkJw6dmJuea837+fByOPbUB4ts2TuaKlPXhaYywAZsZOW+jYOT0NE4sWTwLvE+lBgLE6oA4F2K129a73OV0iwesEGqQYQGAD/f3htvF+lAfmU3Xu8XKJcFqfHfC4uBnTOLJWLacWv4Z+ecmXxGMXd8dubozJx9IEy8OmOJEnE1qkWL0g3PhLCieSgbRlSU/+bZBBU4gZ47745R4ng7Pj0OxLsD8KavT77sJbdf/orTB5daQk7B8+GLVzFNnRCSYIDe7fiOw336g2NU28lW6jw9lhn1hRh6US/csGnDva9++bs3+ht37AFhjXBhbgFtZObwCQgGJnUdV1OuFSYbJpEpKPyCbt1LJnJBX/KEOMwgi/ATg/XbvxR3p72QbDIKs4DfcOOjr9uP+d3bBSMrHvxnl37iZeeh3HTDJnaUAlMiv2dn3qVCi63o+6cOWkcnldLmkQPSOVklAXLZypH/9YqLsJbzyc5t+yfe89gThrJaU55fwD0JKh5/yjRSM/J6z7zL2KJD4Wn4sSefsFQmeGmhMXXbVPeKreLF07yBPrzaqmLFHEWGNgLlLTteuHXHC/ibJu85a5N9iB495LVjK2/ZuffjTz2X/LZ44G8TYmQWDgRc8IdmZ3F963x9Tn0jLjleCrtYkFjZRNYLvI352HlbLqv+RPUPDhz8xHM7f5AfzmjMASd/YW5mDj+43vQtLVf1zDlrSU3UL+K5DgamseDfWlFbY64yi0tIOjY21gL3FX14Jh16TNUG0DBpxKAE7d88s/PbL+y/ceuZ+CPGQKPiN2094/pN6z725PO37tKbtchhpQo+L5xTvftnv1xpn37gLahvB+bmLPXUGIdBGBjePS08Zb9h02k3nL4hVzF6BUp8867dfh8if4Itmp07DKRH416Ynce1vc+eu0d0Q+coheBJBYX6T/2050x7BKNcbbidQKPQExBNzfOFrA/pGpPXGm5kwRsK3vvzxz/25HOfe+X59jkJNe7z3rJ+9Yd++VT5jR9XpC6kOGieFhbvAMEPZOoqvYGsppIZ2+LbhN+xfu2fbz0rSwwrnivevHPPQX9vBsPZNCtPE/G49ljzc/ML+IPIJ3r6hwbaf1kSmIxK5+YGTf33Oiyx9AusTyKGKC/eTKOp6vJjUmaLWca6hocejDiqC7Bu6NdvuvdH+Guw+NM91knesm41fvBnjT/21PN4qiKniJVHT4oH/Le6KHAJJz3XMPXKAV3ifWdtvrzuFVMHb3z8qe3H/d1lRLLI9sizYHwwaLkEi4emEpfHE0eO47WaBfu9jXkQSJ7FNjP2IiVDCm5gqdKPkR3ChawqgzZ0Dk4e6V1JDnv8SjIMxFt27rn0uw9+7InnqNZ23ab1X73kZe/YuI4njzgxVDRSAkoVopdOTF3B2Xzxt4A+vm3LrRdfkFXGKbzup4++46eP4vm9cSusuyIklaRhPZPSZl7jIaNrzx6fQdGNoX3vPO3q8oyisli2oeDVCOdZjSImWYIUyRL1U2vpOoUwrA7GVkYZPvrkc6/53oO37PQezU5y4XkPXHUJ/7ZP0GbN6QElT5v993BiguwOw/39WMX3X/bKd2zw5+5ox3/x5LOvfeBHeK7oYDAIjp2lJO5QJcgVTb0tuwU8e5+fn50rT+KBEpDeIE1ZbBjpD2YXEOMKVYA9vb34VKYyClsQFVASS4WdEYmNtsrDnuObhe9Ret/PH7/0ew/mLSDK/bmLX4qKd32ln8nxVFWRnYkHrN/bLrno/Wdvzo58847dl9//o8/u2G0eOT3OMR5qVHrafoDC8w89j5IRW82FE8I2iyc3x2bwZBJ2bnFsl/OFf8P4I4UoBsLJ60GjaF/0SFFpIFFvKhpz2VsVKJDBstPA5ml+cmYMbrqPRJVf870fonvcuNUbN2T82D0J30mjWObBPZjtfl0TQwTc+aG+9f0fbrHx1Ly8falKQ6JocgqiLomVKTKW4RVT0+JkFFheuCHBs/c+PVljrYrF8hQIN2hD//K34vRZdTULPJPGs2i2Y0Xvab3ZPtTWar16bOWjBw/zfY6wKImSXxBRExHtTsujSa8dr1lIuPJt/eLQEb6GNzubnyrE7Tauk9A8qveGGW2TqgeL94Nbz/zItvKXrtCOb/j54x9/Zvs+vD0+i8qoJZr0VhJmkltApGroYWG+0L1u1cibV4/iFwfw2n38xGP6agI8wUEvgY5Fyw0QBOnhx6F7Rr/0nWYkdmPetwWIwFbrTy7YUn+W4qGJA7e9sB/vRYcR/2IFGJZ4evPITRATfSwlDFqWBisB+bfusLSxotMHS57vkj42rdmluvWeMzfipdRsFDgln92++7Pb8cEAvrmfOejQPRHXKnBQBr9s4WZGmM4eGvrnq8c2Ll1Cam3/MD5xLz/179dmFrq3p39JP5ttbvgKp4ElKjRUxuwlDhqWwuA8XLVuFO9Fz3JjUfOjKy/wFXrAdOYEDh8OgonH0NsqY48MRFgcL6eeN69f/R+3nWO3gEK28C5e3AJaudElPnnBuadXf6/t1t17P/SrZ/Acss5GcavckFCmVHK2gJ4NJ8KEYkIyjg70/+a6tedU4Z6Znr5zcuppvboAuD04iZUvbgHxsk923VJoWHnRYzvWAzrzoRs2rk5wjS0dwGdYLhkrb1XBor59z/hDuKArb4GtpAoqT5HZw87snGxZ7x5CJotmovRs3Fu8cZsz3nOOTwrV7Ri/sf3409vxHB2ABpmecJhXra8LiTQiZpEqnh58CO6K0ZVoF/klafis6t+PT/zo0GF5aioM5CeGbMGI39v1LWH79UKzvvZE2kuiQI4mUXrCjsywqN95xmn1Jzjx4tE3d+3Ft1sJXU+E0/RJ6rpny5labArBHRCxgGQwhVuwbPF8/bqNpZMYBnvcFKPEeLIDWhBgayuodIxDeoUTJsBpTki1XKB71cjwr69dXZf43qkD9x44VL74KDjBblHIbzG4ZNlJ8FIJHpd9y/DXDbiQZVZgS6hREekzUzSNH04ewF84x5/wH9LrD+sGl+BzRGMDA7umj8Pq0XNmwe7nsalXfqFyz8yGWaDz4iI5OTN73vCybMcn8Hc2Dh35vZ89/r39+nCKHMkvujIZhk5S0trAkTbfeHglB9TnLBvCnfgVq1baRQ8adInP797ziyNHZ+0OL5dGRW/sHsTo8MvJ2flhJDF2620ezuy1W+ZVJg5sIIRHJ6k/1onqo2vjNDiIh4JXII01eS5DJk2MPfQaNQk9vqFTX+DC37ph/heNrJianXlo6tBhXfEePnDw9n2T/PaAKlaKFqKx3GjTVgWDTj2ER3wc+OqxUazlgLV2HT/xD/v2P938Vb17B0kEcmocwkINX4WPQhdLydIupn6CjMLqpmSlx6Nj9dIl+GoK3PYFooVpf2PXvkcOHAoq4WGOI8UqEYj+wDdEwNCj0KPLV6Hy+7SO3rFvYnRgAN9CO4Z3LsR2x/jE7fahXWbFzlDoye5XCBOJoGPZGQ0+EPW60ZVXjpbvoUOLuGNi8p4pWzfteIXoUPo5E7+MkE5fqkIrM81Us2eWFjkP4VApvM1ltlgI/3brGXZPwvm0WnYLqO98DP86utK0OFQDkk18oTXU34tvemp8n9bMLL6yDPfa5oJaX7lm1RXVX5RGb0G5+Q0vWWuFyxB2bjXPEJkozwGCv3T5sl9fvwbdD4WyAtwzeQBV9nac56aaiqUtQlDAYNzk0/1uOd9e6JIKJyuzqURKCoX2+MUUMRPWWsANyZuQrn16WfrbXxj/4cRBVKFE8aTFyvxio8gxv09rwxi+StIMx+bxfVr6Ahc9000PJLZqoP9Na8fqr5vcffz4F3bsmZjR36IAVyNpo/dwyYOvBX3j6lE0pTC0njk2/fd796Nj5DKS4OWzLL2oHPCfx4nZMDK0EYOFHr3lNloDYY5+01Mpnc+D2H1ImONoNEP9fbgwonfnJLGob2fjtm8Tqm7sLKq5Y7/Qwp3MW09bs2lokBdslQU3jugJuJ8ROaGckly4JnRdwnfUXr0GN/ilkzx84BBWt5U78c7IAwNDj17xpjVjaBfScYcFgbeCoNDS0DUrQxeLWykBYxokC61jaDA9pM2l0AL6rl7UoSePZB0oRgauwOQZjfzcjy1Zglq/enQkYC2U+388uwu3JbBbXgQTSx+249M35PdpQY9v0sKXPeV37xm/zZsFcE/zBmEP2gh+stwo2cMHeZ0kvWpUPLTScG6uGFtZ37qhV+Ane4Xy4qxyatIweaZR6CRyGCodYzkTbiv6O5AcEkg4UYkhg7AsQUJEBtagspm7kzEAPp7/zs3+jW9mxArF30HgWiOMmMG+nivXjF21ZhRfUc1ALX733m1796NdcGBulLiJmyp6pkmzRkHwPeJXZyeREoFw8XxIl+W4r2htWT74jtPWocuLkju243F9LWiQ4sgQjvDCQoMtc9BAKiGN3708Jcdv4or+sr3WkRHMXcu+QZlhWSKjq0hJzDOiABHc80TjvmbD6vyCPWhxC4gfEGHJv3Xj2vj8cw/uwfn1hvg+Lb1ZCwBeq0AXMw7Bx5G0AgqH3eiSfjy78Z4rIC6h38Kd+IkZ5ID3mJ1jf9lXzk8fPXb7+OTTx44JiJ0WsE+gnk49Mc/HVeGJM9B2DQSA3aMHKxqvdaDQcKxTlqflXqupcZPDvdCuJ9aaO/SVjjI6A2ptt4DGgefueHTjSw5p1vbUYX4zNV+o0sYq84Riq7KL3Kgq4YUiUGAJr1o5gtWdnQQ61NSqL44e3IPesX/SFjusCKLHiaTgZgQvH/U2fQXJ4EZGAt+kMDrzAIl6tApNEHmKGySbCJeUqV2lgZgAkF8eaCLKIUo+INCN4qWSuOMOCM07p4/jGyTxtxKorM9tAVW1pofCcOe5UcHlb8niDDkNan3l2KpsSvJs4eFyz8SBeyb4je6qo3IWZwTMKfv1Ns8BobkFypSwWEGUVOB0VI/OQjMS1X5qxULPtjk6QyDjfDB6ZVIw6rhVtYOIdY1y41EMOHoFesjd45MKot5Tgc1VVRM1JRFqRxcMO5R6HJBFji304jetGcWdifniVwHf2rN/0j8R7aWqSKsIdSZZU+ZUwU0GspkGMEwPSuFV6C99JzVU8pESVDmRUFammKIildA+LGvKInHP4Dpqhz/yiNdJUGLU2rSZBlEYKA17cGCg0A0GeomQWgnU2CZv7VyBcr91w5q7J6ae0Z9RIFu6hAQF9A2yMJGlBPGABpalsSPY+d3HCy21jGSzBz4jhCyTLTkpmaNfpEhoGagQhjQqjwESbuQLiCw+CH3GCqO5mC8ziU0iQGoUWhZkcvYK53lZpqEnjAG4DrDRLTZbYVQ6xg21HjalLTclCgq7kIjVp0gGkvsRMnq0f5uxTiWpmQEbHTeuNI61of/xkc0tBRt5qMTyMiuC4IGbXIyVODtNwc2EuHKJ0z+WQg0XAaQHXkZFZwaeQ2RidjEoJ8MZSlG1g12JRVymkVtQSUE9XVjlxCgTJ2I6SkmRdeYYzbM1DjDK11zwCmkwxZGEhV5OsVMsDiKOySyDnWAD4hdoJY2gZR6kjbGOTIZ6hjRfyMTpKZ+bnDRiJUPq3VXsQYMiAWiTJI+DFauNwW2eg0EdJ0rLDSJMYhLExvJlthRicUQ0qGDidFoLfAONGHzt0EYf24yxqMzLs68gQahUwtkWBUZY8uZCCylFG2fGTaHno8HCWvbILzfxCM9EDGZGKPkosIF5yDFxmmYSIQRBxFc8GrpezcX56GaccklXakNPfiYcD+/QWwjs9WTMtPUeHEqN7ozjkaw4ZKxrZwDbSw8Xuul/OTiHHUSfYDchH+i5OpiflKLxFKjR1DD2Uglm+gIXzC0sPmkxVO2ktjkpBfr6/yga9ZSZSlbSORwji8mJIDMd6Ms9NnNSI8Vn7bTVnAazPttWUKOgyZedsJYXRYXxKEbMPeKZMWYczsyMVgKIMXomq4RNa5aKVCJ2ZKnVGJHN17UzcGIG0kEY8SomCWitaGR0F5NDw+wbQFt2NGsWwvnpNGKDW2290IYuTEwork/JHlHoCSX/R40sSA6F5A7/LaYAcFC2MlchLYKwcjE2ja1wfiZMH/vkNncrMNNS3RouTkVD6CFSVrEok4TH2IzUR3owmDX1XgBHVGpvlXUaCNT4nKGcIpoBLTPVldaObBAgHGjViArNwT2MA2ZOUmjShCeV0ruLr0jT0iAPtgq62EZ/L5nHx8GMMilM5hJUXDpCNWiEFYRqp7Ox4xAXla4tMGfaJUxNmzIEIaoeDQ2yJyImJLSQhtZY2SgR27nSfOLRpLxkUXEx5AD//ZD+Kp4lbQwsJyQbWCoi82ChJ5v4pS+SE9OFW22ADBdvWxnBWCouJFO87IJhPqkVkY8KmtrKE4F8Wjz6x98KmkgFdR7z1OOX0UTWOYOSpmokgDxhCCJLP0bNI1CeVOhVJA0iWwwgMvsSDSia8R8MDbVSsHzb9FpLbTqLIR+jr9KACLQjfDo0a0V6LhWdIwDgejGDUseKZpIMoh2F2Fxh+Zo5GjchNV4MUKROgu+KngopvTqaAHxLem43FybqcOpNpMkSJhkf1NpY7VRTI72WiM/PcDRUhZNSUMbi5jAeVV6BMWIA6Ko0NCYc3S79Aic94Ma3oE9lQTb3SNooyWowOzJpf8IWerLZVkJZNpGEExgoBuXokmfKdc3JcW5s1ZIDbEPxwpoVkZn+cpE6PTgrpIqxS0wDo3oWCVaKjEiEfLJI5ChTjioZrfz9zJm36Z0IKnPt978qLIzvdLCMNFfOmZsfbMB0LacQfMxJw8j/LIhAQRDHdHRFUIoqBmHjkdy+Ob/n1zAxQxRE96zuUPzMXXetxMjAXUFUQVJPpE2I/gXrcenCmdIYB4zDKe7p8KLS/wH36Hq47B4U3wAAAABJRU5ErkJggg=="
45
+ })]
46
+ })]
47
+ });
48
+ };
49
+ SpaceIcon.defaultProps = {
50
+ width: "40",
51
+ height: "40",
52
+ fill: "none",
53
+ xmlns: "http://www.w3.org/2000/svg",
54
+ xmlnsXlink: "http://www.w3.org/1999/xlink"
55
+ };
56
+ import Agreement from './components/agreement';
57
+ import Checkbox from './components/checkbox';
58
+ import Layout from './components/layout';
59
+ import Body from './components/layout/body';
60
+ import Footer from './components/layout/footer';
61
+ import Header from './components/layout/header';
62
+ import { useLocaleContext } from './contexts/locale';
63
+ import useRequest from './contexts/request';
64
+ import { useSessionContext } from './contexts/session';
65
+ import { useWorkflowContext } from './contexts/workflow';
66
+ import { BLOCKLET_STORE_URL, getPrice, launchSession } from './util';
67
+ import { jsx as _jsx } from "react/jsx-runtime";
68
+ import { jsxs as _jsxs } from "react/jsx-runtime";
69
+ import { Fragment as _Fragment } from "react/jsx-runtime";
70
+ function CheckoutPage({
71
+ blocklet
72
+ }) {
73
+ const {
74
+ t,
75
+ locale
76
+ } = useLocaleContext();
77
+ const {
78
+ session,
79
+ events
80
+ } = useSessionContext();
81
+ const [params] = useSearchParams();
82
+ const [state, setState] = useSetState({
83
+ error: '',
84
+ showAgreement: false,
85
+ showPayment: false,
86
+ showAgreeHint: false,
87
+ showPaidDialog: {
88
+ open: false,
89
+ nftId: ''
90
+ },
91
+ agreed: true,
92
+ paying: false,
93
+ planId: params.get('planId'),
94
+ sessionId: params.get('sessionId'),
95
+ paymentMethod: params.get('paymentMethod')
96
+ });
97
+ const navigate = useNavigate();
98
+ const {
99
+ create,
100
+ api: launchSessionAPI
101
+ } = useRequest();
102
+ const {
103
+ mobileSize,
104
+ isMobile
105
+ } = useMobile();
106
+ const {
107
+ routerPrefix,
108
+ didPayPrefix,
109
+ embed,
110
+ isPurchaseOnly
111
+ } = useWorkflowContext();
112
+ const api = create({
113
+ baseURL: didPayPrefix
114
+ });
115
+ useEffect(() => {
116
+ if (isPurchaseOnly) {
117
+ return;
118
+ }
119
+ if (session.user) {
120
+ launchSession.connect(launchSessionAPI, routerPrefix, state.sessionId, session.user.did);
121
+ }
122
+ }, [session.user]);
123
+ const enableBlockletAgreement = !!blocklet;
124
+ const context = useAsync(async () => {
125
+ const [{
126
+ data: {
127
+ data: paymentMethods
128
+ }
129
+ }, {
130
+ data: {
131
+ data: plan
132
+ }
133
+ }] = await Promise.all([api.get('/payment-methods'), api.get(`/plans/${state.planId}`)]);
134
+ if (!plan || paymentMethods.length === 0) {
135
+ throw new Error(t('purchase.noProducts'));
136
+ }
137
+ if (paymentMethods.length > 0 && !state.paymentMethod) {
138
+ setState({
139
+ paymentMethod: paymentMethods[0]._id
140
+ });
141
+ }
142
+ return {
143
+ paymentMethods,
144
+ plan
145
+ };
146
+ });
147
+
148
+ // 用户退出的时候自动重新创建启动会话
149
+ useEffect(() => {
150
+ if (isPurchaseOnly) {
151
+ return;
152
+ }
153
+ events.on('logout', () => {
154
+ const metaUrl = params.get('blocklet_meta_url');
155
+ launchSession.create(launchSessionAPI, routerPrefix, metaUrl, (err, launch) => {
156
+ setState({
157
+ sessionId: launch._id
158
+ });
159
+ params.set('sessionId', launch._id);
160
+ const type = get(context.value?.plan, 'extra.type') || 'serverless';
161
+ launchSession.select(launchSessionAPI, routerPrefix, launch._id, type, state.planId);
162
+ });
163
+ });
164
+ }, []);
165
+ const switchPayment = method => {
166
+ setState({
167
+ paymentMethod: method
168
+ });
169
+ };
170
+ const handleCancelPay = () => {
171
+ setState({
172
+ showPayment: false,
173
+ paying: false
174
+ });
175
+ };
176
+ const handlePay = () => {
177
+ if (enableBlockletAgreement && !state.agreed) {
178
+ setState({
179
+ showAgreeHint: true
180
+ });
181
+ setTimeout(() => {
182
+ setState({
183
+ showAgreeHint: false
184
+ });
185
+ }, 2000);
186
+ return;
187
+ }
188
+ setState({
189
+ showPayment: true,
190
+ paying: true
191
+ });
192
+ };
193
+ const handleConnected = result => {
194
+ if (isPurchaseOnly) {
195
+ session.refresh();
196
+ return;
197
+ }
198
+ launchSession.connect(launchSessionAPI, routerPrefix, state.sessionId, result.did, () => {
199
+ session.refresh();
200
+ });
201
+ };
202
+ const handlePaid = ({
203
+ nftId,
204
+ nftState
205
+ }) => {
206
+ if ((nftState.tags || []).includes(NFT_TYPE_SERVERLESS)) {
207
+ if (!embed) {
208
+ setState({
209
+ showPaidDialog: {
210
+ open: true,
211
+ nftId
212
+ }
213
+ });
214
+ handleCancelPay();
215
+ return;
216
+ }
217
+ params.set('launchType', 'serverless');
218
+ }
219
+ if (isPurchaseOnly && !(nftState.tags || []).includes(BLOCKLET_SERVER_OWNERSHIP_NFT)) {
220
+ handleCancelPay();
221
+ dsbridge.call('arcClosePage');
222
+ return;
223
+ }
224
+ handleCancelPay();
225
+ navigate({
226
+ pathname: joinURL(routerPrefix, `/launch/${nftId}`),
227
+ search: params.toString()
228
+ });
229
+ };
230
+ const handlePayFailed = () => {
231
+ // TODO: Toast 错误
232
+ handleCancelPay();
233
+ };
234
+ const calculateTotalPayment = prices => {
235
+ if (!state.paymentMethod) {
236
+ return '';
237
+ }
238
+ const providerName = paymentMethods?.find(x => x._id === state.paymentMethod)?.provider.name;
239
+ return getPrice(prices, providerName);
240
+ };
241
+ const toggleAgreement = () => setState({
242
+ agreed: !state.agreed
243
+ });
244
+ const {
245
+ paymentMethods,
246
+ plan
247
+ } = context.value || {};
248
+ const paymentMethod = paymentMethods?.find(x => x._id === state.paymentMethod);
249
+ const providerName = paymentMethod?.provider.name;
250
+ return /*#__PURE__*/_jsxs(Container, {
251
+ mobileSize: mobileSize,
252
+ enableBlockletAgreement: enableBlockletAgreement,
253
+ children: [/*#__PURE__*/_jsx(Header, {
254
+ title: t('checkout.pageTitle')
255
+ }), context.error && /*#__PURE__*/_jsx(Body, {
256
+ children: /*#__PURE__*/_jsx(ResultMessage, {
257
+ variant: "error",
258
+ title: t('common.error'),
259
+ subTitle: formatError(context.error)
260
+ })
261
+ }), !context.error && /*#__PURE__*/_jsxs(_Fragment, {
262
+ children: [/*#__PURE__*/_jsxs(Body, {
263
+ children: [/*#__PURE__*/_jsx("div", {
264
+ className: "header",
265
+ children: t('common.details')
266
+ }), context.loading ? /*#__PURE__*/_jsx(Skeleton, {
267
+ className: "skeleton",
268
+ sx: {
269
+ width: '100%',
270
+ height: '100%'
271
+ }
272
+ }) : /*#__PURE__*/_jsxs("div", {
273
+ className: "space details",
274
+ children: [/*#__PURE__*/_jsxs("div", {
275
+ className: "basic",
276
+ children: [/*#__PURE__*/_jsx(SpaceIcon, {}), /*#__PURE__*/_jsxs("div", {
277
+ className: "basic-info",
278
+ children: [/*#__PURE__*/_jsx("div", {
279
+ className: "title",
280
+ children: plan.name[locale]
281
+ }), /*#__PURE__*/_jsx("div", {
282
+ className: "sub-title",
283
+ children: t('common.space')
284
+ })]
285
+ })]
286
+ }), /*#__PURE__*/_jsx("div", {
287
+ className: "price",
288
+ children: getPrice(plan.prices, providerName)
289
+ })]
290
+ }), /*#__PURE__*/_jsx("div", {
291
+ className: "divider"
292
+ }), context.loading ? /*#__PURE__*/_jsx(Skeleton, {
293
+ className: "skeleton",
294
+ sx: {
295
+ width: '100%',
296
+ height: '100%'
297
+ }
298
+ }) : /*#__PURE__*/_jsxs("div", {
299
+ className: "total-order space",
300
+ children: [/*#__PURE__*/_jsx("div", {
301
+ children: t('checkout.orderTotal')
302
+ }), /*#__PURE__*/_jsx("div", {
303
+ children: getPrice(plan?.prices || [], providerName)
304
+ })]
305
+ }), /*#__PURE__*/_jsxs("div", {
306
+ className: "total-payment space",
307
+ children: [/*#__PURE__*/_jsx("div", {
308
+ children: t('checkout.paymentTotal')
309
+ }), /*#__PURE__*/_jsx("div", {
310
+ children: calculateTotalPayment(plan?.prices || [])
311
+ })]
312
+ }), /*#__PURE__*/_jsx("div", {
313
+ className: "payment-method space",
314
+ children: context.loading ? /*#__PURE__*/_jsx(Skeleton, {
315
+ className: "skeleton",
316
+ sx: {
317
+ width: '100%',
318
+ height: '100%'
319
+ }
320
+ }) : /*#__PURE__*/_jsxs("div", {
321
+ className: "body",
322
+ children: [/*#__PURE__*/_jsx("div", {
323
+ className: "payment-method__title",
324
+ children: t('checkout.paymentMethod.title')
325
+ }), /*#__PURE__*/_jsx("div", {
326
+ className: "payment-method__list",
327
+ children: /*#__PURE__*/_jsx(Grid, {
328
+ container: true,
329
+ spacing: 3,
330
+ justifyContent: "flex-start",
331
+ children: paymentMethods.map(method => /*#__PURE__*/_jsx(Grid, {
332
+ item: true,
333
+ xs: 12,
334
+ sm: 12,
335
+ md: 3,
336
+ lg: 2,
337
+ xl: 2,
338
+ children: /*#__PURE__*/_jsx(Checkbox, {
339
+ label: method.currency.displayName[locale] || method.currency.displayName.en,
340
+ checked: state.paymentMethod === method._id,
341
+ onClick: () => switchPayment(method._id)
342
+ })
343
+ }, method._id))
344
+ })
345
+ })]
346
+ })
347
+ })]
348
+ }), !context.loading && /*#__PURE__*/_jsxs(Footer, {
349
+ className: "footer",
350
+ children: [enableBlockletAgreement && /*#__PURE__*/_jsx("div", {
351
+ className: "agreement",
352
+ children: /*#__PURE__*/_jsx(Checkbox, {
353
+ checked: state.agreed,
354
+ showHint: state.showAgreeHint,
355
+ onClick: () => toggleAgreement(),
356
+ label: /*#__PURE__*/_jsxs("div", {
357
+ style: {
358
+ display: 'flex',
359
+ alignItems: 'center'
360
+ },
361
+ children: [t('common.agreeTo'), /*#__PURE__*/_jsx("span", {
362
+ className: "agreement-label",
363
+ onClick: e => {
364
+ e.stopPropagation();
365
+ setState({
366
+ showAgreement: true
367
+ });
368
+ },
369
+ children: t('checkout.agreement', {
370
+ name: getBlockletDisplayName(blocklet)
371
+ })
372
+ })]
373
+ })
374
+ })
375
+ }), /*#__PURE__*/_jsxs("div", {
376
+ className: "actions",
377
+ children: [isMobile && /*#__PURE__*/_jsx(Button, {
378
+ className: "button-previous",
379
+ variant: "outlined",
380
+ onClick: () => navigate(-1),
381
+ children: t('common.previous')
382
+ }), /*#__PURE__*/_jsx(Button, {
383
+ loading: state.paying,
384
+ className: "button-pay",
385
+ disabled: state.paying || state.showPayment || !state.planId || !state.paymentMethod,
386
+ variant: "contained",
387
+ onClick: handlePay,
388
+ children: t('common.pay')
389
+ })]
390
+ })]
391
+ })]
392
+ }), state.showPayment && /*#__PURE__*/_jsx(Payment, {
393
+ baseURL: didPayPrefix,
394
+ method: paymentMethod,
395
+ userDid: session?.user?.did,
396
+ productId: state.planId,
397
+ useSocket: false,
398
+ onConnect: handleConnected,
399
+ onComplete: handlePaid,
400
+ onFailed: handlePayFailed,
401
+ onCancel: handleCancelPay,
402
+ metadata: {
403
+ sessionId: state.sessionId
404
+ }
405
+ }), /*#__PURE__*/_jsx(Confirm, {
406
+ open: state.showPaidDialog.open,
407
+ disableEscapeKeyDown: true,
408
+ title: t('purchase.serverlessDialog.title'),
409
+ confirmButton: {
410
+ text: t('purchase.serverlessDialog.redirectToStoreButton')
411
+ },
412
+ PaperProps: {
413
+ style: {
414
+ maxWidth: 1200,
415
+ minWidth: isMobile ? undefined : 600
416
+ }
417
+ },
418
+ onCancel: () => setState({
419
+ showPaidDialog: {
420
+ open: false,
421
+ nftId: ''
422
+ }
423
+ }),
424
+ showCancelButton: false,
425
+ onConfirm: () => {
426
+ const url = new URL(BLOCKLET_STORE_URL);
427
+ url.searchParams.set('launcher_nft_id', state.showPaidDialog.nftId);
428
+ window.location = url.href;
429
+ },
430
+ children: /*#__PURE__*/_jsx("div", {
431
+ children: t('purchase.serverlessDialog.purchaseServerlessSuccess')
432
+ })
433
+ }), /*#__PURE__*/_jsx(Dialog, {
434
+ open: state.showAgreement,
435
+ title: t('common.agreement'),
436
+ onClose: () => setState({
437
+ showAgreement: false
438
+ }),
439
+ children: /*#__PURE__*/_jsx(Agreement, {})
440
+ })]
441
+ });
442
+ }
443
+ CheckoutPage.propTypes = {
444
+ blocklet: PropTypes.object
445
+ };
446
+ CheckoutPage.defaultProps = {
447
+ blocklet: null
448
+ };
449
+ const Container = styled(Layout)`
450
+ .header {
451
+ font-weight: bolder;
452
+ font-size: 1.2em;
453
+ }
454
+
455
+ .divider {
456
+ margin-top: 20px;
457
+ border: 1.2px solid #f6f6f6;
458
+ }
459
+
460
+ .skeleton {
461
+ height: 64px;
462
+ }
463
+
464
+ .space {
465
+ margin-top: 18px;
466
+ }
467
+
468
+ .total-order {
469
+ display: flex;
470
+ justify-content: space-between;
471
+ align-items: center;
472
+ font-weight: bolder;
473
+ }
474
+
475
+ .total-payment {
476
+ display: flex;
477
+ justify-content: space-between;
478
+ align-items: center;
479
+ color: ${props => props.theme.palette.primary.main};
480
+ font-size: 22px;
481
+ font-weight: bolder;
482
+ }
483
+
484
+ .details {
485
+ display: flex;
486
+ justify-content: space-between;
487
+ align-items: center;
488
+ height: 40px;
489
+
490
+ .basic {
491
+ display: flex;
492
+ height: 40px;
493
+
494
+ .basic-info {
495
+ display: flex;
496
+ flex-direction: column;
497
+ justify-content: space-between;
498
+ margin-left: 8px;
499
+
500
+ .title {
501
+ font-weight: bolder;
502
+ }
503
+
504
+ .sub-title {
505
+ color: grey;
506
+ font-size: 0.8em;
507
+ }
508
+ }
509
+ }
510
+
511
+ .period {
512
+ display: flex;
513
+ align-items: center;
514
+
515
+ .info-icon {
516
+ color: grey;
517
+ margin-left: 8px;
518
+ }
519
+ }
520
+ }
521
+
522
+ .payment-method {
523
+ background-color: #fbfbfb;
524
+ padding: 18px;
525
+
526
+ .payment-method__title {
527
+ color: #9397a1;
528
+ }
529
+
530
+ .payment-method__list {
531
+ margin-top: 8px;
532
+ }
533
+ }
534
+
535
+ .footer {
536
+ display: flex;
537
+ align-items: center;
538
+ justify-content: ${props => props.enableBlockletAgreement ? 'space-between' : 'flex-end'};
539
+
540
+ .agreement {
541
+ .agreement-label {
542
+ margin-left: 4px;
543
+ color: ${props => props.theme.palette.primary.main};
544
+ text-decoration: underline;
545
+ }
546
+ }
547
+
548
+ @media (min-width: ${props => props.mobileSize}) {
549
+ .actions {
550
+ .button-pay {
551
+ width: 200px;
552
+ }
553
+ }
554
+ }
555
+
556
+ @media (max-width: ${props => props.mobileSize}) {
557
+ flex-direction: column;
558
+ align-items: center;
559
+
560
+ .actions {
561
+ display: flex;
562
+ justify-content: space-between;
563
+ width: 100%;
564
+ margin-top: 20px;
565
+
566
+ & > button {
567
+ width: 48%;
568
+ }
569
+ }
570
+ }
571
+ }
572
+ `;
573
+ export default CheckoutPage;
@@ -0,0 +1,5 @@
1
+ import BlockletAgreement from '@arcblock/license/lib/blocklet';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ export default function Agreement() {
4
+ return /*#__PURE__*/_jsx(BlockletAgreement, {});
5
+ }