@rabbitio/ui-kit 1.0.0-beta.8 → 1.0.0-beta.80

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 (398) hide show
  1. package/.gitlab-ci.yml +29 -0
  2. package/.husky/commit-msg +19 -0
  3. package/.husky/pre-push +1 -0
  4. package/CHANGELOG.md +0 -0
  5. package/README.md +27 -18
  6. package/coverage/base.css +224 -0
  7. package/coverage/block-navigation.js +87 -0
  8. package/coverage/clover.xml +16372 -0
  9. package/coverage/coverage-final.json +154 -0
  10. package/coverage/favicon.png +0 -0
  11. package/coverage/index.html +1151 -0
  12. package/coverage/prettify.css +1 -0
  13. package/coverage/prettify.js +2 -0
  14. package/coverage/sort-arrow-sprite.png +0 -0
  15. package/coverage/sorter.js +196 -0
  16. package/coverage/ui-kit/index.html +116 -0
  17. package/coverage/ui-kit/index.js.html +88 -0
  18. package/coverage/ui-kit/src/common-apis/adapters/axiosAdapter.js.html +190 -0
  19. package/coverage/ui-kit/src/common-apis/adapters/index.html +131 -0
  20. package/coverage/ui-kit/src/common-apis/adapters/qrUtils.js.html +139 -0
  21. package/coverage/ui-kit/src/common-apis/amountUtils.js.html +1162 -0
  22. package/coverage/ui-kit/src/common-apis/errorUtils.js.html +211 -0
  23. package/coverage/ui-kit/src/common-apis/external-apis/apiGroups.js.html +250 -0
  24. package/coverage/ui-kit/src/common-apis/external-apis/index.html +131 -0
  25. package/coverage/ui-kit/src/common-apis/external-apis/ipAddressProviders.js.html +352 -0
  26. package/coverage/ui-kit/src/common-apis/fiatCurrenciesService.js.html +544 -0
  27. package/coverage/ui-kit/src/common-apis/globalConstants.jsx.html +94 -0
  28. package/coverage/ui-kit/src/common-apis/index.html +161 -0
  29. package/coverage/ui-kit/src/common-apis/models/blockchain.js.html +115 -0
  30. package/coverage/ui-kit/src/common-apis/models/coin.js.html +544 -0
  31. package/coverage/ui-kit/src/common-apis/models/index.html +146 -0
  32. package/coverage/ui-kit/src/common-apis/models/protocol.js.html +100 -0
  33. package/coverage/ui-kit/src/common-apis/utils/cache.js.html +811 -0
  34. package/coverage/ui-kit/src/common-apis/utils/emailAPI.js.html +133 -0
  35. package/coverage/ui-kit/src/common-apis/utils/index.html +161 -0
  36. package/coverage/ui-kit/src/common-apis/utils/logging/index.html +131 -0
  37. package/coverage/ui-kit/src/common-apis/utils/logging/logger.js.html +208 -0
  38. package/coverage/ui-kit/src/common-apis/utils/logging/logsStorage.js.html +268 -0
  39. package/coverage/ui-kit/src/common-apis/utils/postponeExecution.js.html +118 -0
  40. package/coverage/ui-kit/src/common-apis/utils/safeStringify.js.html +235 -0
  41. package/coverage/ui-kit/src/index.html +116 -0
  42. package/coverage/ui-kit/src/index.js.html +337 -0
  43. package/coverage/ui-kit/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js.html +1570 -0
  44. package/coverage/ui-kit/src/robust-api-caller/cachedRobustExternalApiCallerService.js.html +526 -0
  45. package/coverage/ui-kit/src/robust-api-caller/cancelProcessing.js.html +172 -0
  46. package/coverage/ui-kit/src/robust-api-caller/concurrentCalculationsMetadataHolder.js.html +310 -0
  47. package/coverage/ui-kit/src/robust-api-caller/externalApiProvider.js.html +553 -0
  48. package/coverage/ui-kit/src/robust-api-caller/externalServicesStatsCollector.js.html +319 -0
  49. package/coverage/ui-kit/src/robust-api-caller/index.html +206 -0
  50. package/coverage/ui-kit/src/robust-api-caller/robustExternalAPICallerService.js.html +997 -0
  51. package/coverage/ui-kit/src/swaps-lib/external-apis/index.html +146 -0
  52. package/coverage/ui-kit/src/swaps-lib/external-apis/letsExchangeSwapProvider.js.html +1513 -0
  53. package/coverage/ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +1558 -0
  54. package/coverage/ui-kit/src/swaps-lib/external-apis/swapspaceSwapProvider.js.html +1735 -0
  55. package/coverage/ui-kit/src/swaps-lib/models/baseSwapCreationInfo.js.html +223 -0
  56. package/coverage/ui-kit/src/swaps-lib/models/existingSwap.js.html +304 -0
  57. package/coverage/ui-kit/src/swaps-lib/models/existingSwapWithFiatData.js.html +469 -0
  58. package/coverage/ui-kit/src/swaps-lib/models/index.html +146 -0
  59. package/coverage/ui-kit/src/swaps-lib/services/index.html +116 -0
  60. package/coverage/ui-kit/src/swaps-lib/services/publicSwapService.js.html +2098 -0
  61. package/coverage/ui-kit/src/swaps-lib/utils/index.html +116 -0
  62. package/coverage/ui-kit/src/swaps-lib/utils/swapUtils.js.html +670 -0
  63. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/arrowIcon.jsx.html +124 -0
  64. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/arrowTosca.jsx.html +127 -0
  65. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/arrowWhite.jsx.html +127 -0
  66. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/darkRectangle.jsx.html +106 -0
  67. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/determinedError.jsx.html +439 -0
  68. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx.html +202 -0
  69. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/index.html +251 -0
  70. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/infoIcon.jsx.html +133 -0
  71. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx.html +247 -0
  72. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx.html +163 -0
  73. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/walletIcon.jsx.html +151 -0
  74. package/coverage/ui-kit/src/ui-kit/components/atoms/AssetIcon/AssetIcon.jsx.html +256 -0
  75. package/coverage/ui-kit/src/ui-kit/components/atoms/AssetIcon/index.html +116 -0
  76. package/coverage/ui-kit/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx.html +289 -0
  77. package/coverage/ui-kit/src/ui-kit/components/atoms/AssetSelection/index.html +116 -0
  78. package/coverage/ui-kit/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx.html +187 -0
  79. package/coverage/ui-kit/src/ui-kit/components/atoms/BackgroundTitle/index.html +116 -0
  80. package/coverage/ui-kit/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx.html +238 -0
  81. package/coverage/ui-kit/src/ui-kit/components/atoms/InformationMessage/index.html +116 -0
  82. package/coverage/ui-kit/src/ui-kit/components/atoms/Input/Input.jsx.html +634 -0
  83. package/coverage/ui-kit/src/ui-kit/components/atoms/Input/index.html +116 -0
  84. package/coverage/ui-kit/src/ui-kit/components/atoms/LoadingDots/LoadingDots.jsx.html +196 -0
  85. package/coverage/ui-kit/src/ui-kit/components/atoms/LoadingDots/index.html +116 -0
  86. package/coverage/ui-kit/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx.html +277 -0
  87. package/coverage/ui-kit/src/ui-kit/components/atoms/NoticeIcon/index.html +116 -0
  88. package/coverage/ui-kit/src/ui-kit/components/atoms/QrCode/QrCode.jsx.html +235 -0
  89. package/coverage/ui-kit/src/ui-kit/components/atoms/QrCode/index.html +116 -0
  90. package/coverage/ui-kit/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx.html +175 -0
  91. package/coverage/ui-kit/src/ui-kit/components/atoms/RateSelector/index.html +116 -0
  92. package/coverage/ui-kit/src/ui-kit/components/atoms/SupportChat/SupportChat.jsx.html +217 -0
  93. package/coverage/ui-kit/src/ui-kit/components/atoms/SupportChat/index.html +116 -0
  94. package/coverage/ui-kit/src/ui-kit/components/atoms/Textarea/Textarea.jsx.html +529 -0
  95. package/coverage/ui-kit/src/ui-kit/components/atoms/Textarea/index.html +116 -0
  96. package/coverage/ui-kit/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx.html +508 -0
  97. package/coverage/ui-kit/src/ui-kit/components/atoms/TitleBox/index.html +116 -0
  98. package/coverage/ui-kit/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx.html +316 -0
  99. package/coverage/ui-kit/src/ui-kit/components/atoms/Tooltip/index.html +116 -0
  100. package/coverage/ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx.html +313 -0
  101. package/coverage/ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/index.html +116 -0
  102. package/coverage/ui-kit/src/ui-kit/components/atoms/Validation/Validation.jsx.html +208 -0
  103. package/coverage/ui-kit/src/ui-kit/components/atoms/Validation/index.html +116 -0
  104. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Button/Button.jsx.html +712 -0
  105. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Button/index.html +116 -0
  106. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Close/Close.jsx.html +259 -0
  107. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Close/index.html +116 -0
  108. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx.html +421 -0
  109. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/index.html +116 -0
  110. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx.html +415 -0
  111. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/index.html +116 -0
  112. package/coverage/ui-kit/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx.html +1060 -0
  113. package/coverage/ui-kit/src/ui-kit/components/molecules/AmountInput/index.html +116 -0
  114. package/coverage/ui-kit/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx.html +1618 -0
  115. package/coverage/ui-kit/src/ui-kit/components/molecules/CoinPicker/index.html +116 -0
  116. package/coverage/ui-kit/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx.html +190 -0
  117. package/coverage/ui-kit/src/ui-kit/components/molecules/LineWithIconLink/index.html +116 -0
  118. package/coverage/ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx.html +181 -0
  119. package/coverage/ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/index.html +116 -0
  120. package/coverage/ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx.html +283 -0
  121. package/coverage/ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/index.html +116 -0
  122. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/Dialog.jsx.html +1567 -0
  123. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx.html +451 -0
  124. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/index.html +116 -0
  125. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx.html +1699 -0
  126. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/index.html +116 -0
  127. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/index.html +116 -0
  128. package/coverage/ui-kit/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx.html +4075 -0
  129. package/coverage/ui-kit/src/ui-kit/components/organisms/SwapForm/index.html +116 -0
  130. package/coverage/ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx.html +316 -0
  131. package/coverage/ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/index.html +116 -0
  132. package/coverage/ui-kit/src/ui-kit/hooks/index.html +146 -0
  133. package/coverage/ui-kit/src/ui-kit/hooks/useCallHandlingErrors.js.html +151 -0
  134. package/coverage/ui-kit/src/ui-kit/hooks/useIsHydrated.js.html +121 -0
  135. package/coverage/ui-kit/src/ui-kit/hooks/useReferredState.js.html +157 -0
  136. package/coverage/ui-kit/src/ui-kit/utils/index.html +161 -0
  137. package/coverage/ui-kit/src/ui-kit/utils/inputValueProviders.js.html +235 -0
  138. package/coverage/ui-kit/src/ui-kit/utils/textUtils.js.html +139 -0
  139. package/coverage/ui-kit/src/ui-kit/utils/uiUtils.js.html +121 -0
  140. package/coverage/ui-kit/src/ui-kit/utils/urlQueryUtils.js.html +271 -0
  141. package/coverage/ui-kit/stories/atoms/BackgroundTitle.stories.jsx.html +202 -0
  142. package/coverage/ui-kit/stories/atoms/LinesOfText.stories.jsx.html +283 -0
  143. package/coverage/ui-kit/stories/atoms/LoadingDots.stories.jsx.html +226 -0
  144. package/coverage/ui-kit/stories/atoms/QrCode.stories.jsx.html +175 -0
  145. package/coverage/ui-kit/stories/atoms/RateSelector.stories.jsx.html +136 -0
  146. package/coverage/ui-kit/stories/atoms/Validation.stories.jsx.html +178 -0
  147. package/coverage/ui-kit/stories/atoms/buttons/Button.stories.jsx.html +883 -0
  148. package/coverage/ui-kit/stories/atoms/buttons/Close.stories.jsx.html +211 -0
  149. package/coverage/ui-kit/stories/atoms/buttons/LinkButton.stories.jsx.html +301 -0
  150. package/coverage/ui-kit/stories/atoms/buttons/index.html +146 -0
  151. package/coverage/ui-kit/stories/atoms/index.html +191 -0
  152. package/coverage/ui-kit/stories/molecules/LineWithIconLink.stories.jsx.html +154 -0
  153. package/coverage/ui-kit/stories/molecules/TitledLineWithIconLink.stories.jsx.html +160 -0
  154. package/coverage/ui-kit/stories/molecules/index.html +131 -0
  155. package/coverage/ui-kit/stories/organisms/Dialog/Dialog.stories.jsx.html +523 -0
  156. package/coverage/ui-kit/stories/organisms/Dialog/DialogButtons/DialogButtons.stories.jsx.html +328 -0
  157. package/coverage/ui-kit/stories/organisms/Dialog/DialogButtons/index.html +116 -0
  158. package/coverage/ui-kit/stories/organisms/Dialog/DialogStep/DialogStep.stories.jsx.html +337 -0
  159. package/coverage/ui-kit/stories/organisms/Dialog/DialogStep/index.html +116 -0
  160. package/coverage/ui-kit/stories/organisms/Dialog/index.html +116 -0
  161. package/coverage/ui-kit/stories/stubs/exampleContent.jsx.html +145 -0
  162. package/coverage/ui-kit/stories/stubs/index.html +116 -0
  163. package/coverage/ui-kit/stories/templates/DeterminedErrorDialogStep.stories.jsx.html +190 -0
  164. package/coverage/ui-kit/stories/templates/index.html +116 -0
  165. package/coverage/ui-kit/storybook-static/138.56b7edc4.iframe.bundle.js.html +85 -0
  166. package/coverage/ui-kit/storybook-static/312.6f62bbd9.iframe.bundle.js.html +85 -0
  167. package/coverage/ui-kit/storybook-static/341.57a15f57.iframe.bundle.js.html +85 -0
  168. package/coverage/ui-kit/storybook-static/595.2e40d981.iframe.bundle.js.html +85 -0
  169. package/coverage/ui-kit/storybook-static/607.3ea32459.iframe.bundle.js.html +85 -0
  170. package/coverage/ui-kit/storybook-static/609.949af3f6.iframe.bundle.js.html +85 -0
  171. package/coverage/ui-kit/storybook-static/693.1acf0184.iframe.bundle.js.html +85 -0
  172. package/coverage/ui-kit/storybook-static/797.c87cdf19.iframe.bundle.js.html +85 -0
  173. package/coverage/ui-kit/storybook-static/862.c15e3c9c.iframe.bundle.js.html +85 -0
  174. package/coverage/ui-kit/storybook-static/87.0a1bfeb1.iframe.bundle.js.html +85 -0
  175. package/coverage/ui-kit/storybook-static/893.e21210d8.iframe.bundle.js.html +85 -0
  176. package/coverage/ui-kit/storybook-static/996.10688684.iframe.bundle.js.html +85 -0
  177. package/coverage/ui-kit/storybook-static/atoms-BackgroundTitle-stories.1a5386a1.iframe.bundle.js.html +85 -0
  178. package/coverage/ui-kit/storybook-static/atoms-LinesOfText-stories.7043a48b.iframe.bundle.js.html +85 -0
  179. package/coverage/ui-kit/storybook-static/atoms-LoadingDots-stories.662d6a83.iframe.bundle.js.html +85 -0
  180. package/coverage/ui-kit/storybook-static/atoms-QrCode-stories.e10363b6.iframe.bundle.js.html +85 -0
  181. package/coverage/ui-kit/storybook-static/atoms-RateSelector-stories.da7b9f1f.iframe.bundle.js.html +85 -0
  182. package/coverage/ui-kit/storybook-static/atoms-Validation-stories.d561b311.iframe.bundle.js.html +85 -0
  183. package/coverage/ui-kit/storybook-static/atoms-buttons-Button-stories.d336c1a5.iframe.bundle.js.html +85 -0
  184. package/coverage/ui-kit/storybook-static/atoms-buttons-Close-stories.0a902a7c.iframe.bundle.js.html +85 -0
  185. package/coverage/ui-kit/storybook-static/atoms-buttons-LinkButton-stories.ca93ab6b.iframe.bundle.js.html +85 -0
  186. package/coverage/ui-kit/storybook-static/index.html +536 -0
  187. package/coverage/ui-kit/storybook-static/main.75ff1c31.iframe.bundle.js.html +85 -0
  188. package/coverage/ui-kit/storybook-static/molecules-LineWithIconLink-stories.2d2d5753.iframe.bundle.js.html +85 -0
  189. package/coverage/ui-kit/storybook-static/molecules-TitledLineWithIconLink-stories.1383fe3f.iframe.bundle.js.html +85 -0
  190. package/coverage/ui-kit/storybook-static/organisms-Dialog-Dialog-stories.4e6da717.iframe.bundle.js.html +85 -0
  191. package/coverage/ui-kit/storybook-static/organisms-Dialog-DialogButtons-DialogButtons-stories.b79c32a3.iframe.bundle.js.html +85 -0
  192. package/coverage/ui-kit/storybook-static/organisms-Dialog-DialogStep-DialogStep-stories.74896048.iframe.bundle.js.html +85 -0
  193. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/@storybook/addon-backgrounds/dist/index.html +116 -0
  194. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/@storybook/addon-backgrounds/dist/preview.js.html +118 -0
  195. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/@storybook/components/dist/formatter-SWP5E3XI.mjs.html +118 -0
  196. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/@storybook/components/dist/index.html +116 -0
  197. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/buffer/index.html +116 -0
  198. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/buffer/index.js.html +118 -0
  199. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/markdown-to-jsx/dist/index.html +116 -0
  200. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/markdown-to-jsx/dist/index.modern.js.html +118 -0
  201. package/coverage/ui-kit/storybook-static/runtime~main.b108a22d.iframe.bundle.js.html +85 -0
  202. package/coverage/ui-kit/storybook-static/sb-addons/actions-9/index.html +116 -0
  203. package/coverage/ui-kit/storybook-static/sb-addons/actions-9/manager-bundle.js.html +94 -0
  204. package/coverage/ui-kit/storybook-static/sb-addons/essentials-backgrounds-2/index.html +116 -0
  205. package/coverage/ui-kit/storybook-static/sb-addons/essentials-backgrounds-2/manager-bundle.js.html +121 -0
  206. package/coverage/ui-kit/storybook-static/sb-addons/essentials-controls-1/index.html +116 -0
  207. package/coverage/ui-kit/storybook-static/sb-addons/essentials-controls-1/manager-bundle.js.html +274 -0
  208. package/coverage/ui-kit/storybook-static/sb-addons/essentials-measure-4/index.html +116 -0
  209. package/coverage/ui-kit/storybook-static/sb-addons/essentials-measure-4/manager-bundle.js.html +94 -0
  210. package/coverage/ui-kit/storybook-static/sb-addons/essentials-outline-5/index.html +116 -0
  211. package/coverage/ui-kit/storybook-static/sb-addons/essentials-outline-5/manager-bundle.js.html +94 -0
  212. package/coverage/ui-kit/storybook-static/sb-addons/essentials-toolbars-3/index.html +116 -0
  213. package/coverage/ui-kit/storybook-static/sb-addons/essentials-toolbars-3/manager-bundle.js.html +94 -0
  214. package/coverage/ui-kit/storybook-static/sb-addons/interactions-7/index.html +116 -0
  215. package/coverage/ui-kit/storybook-static/sb-addons/interactions-7/manager-bundle.js.html +121 -0
  216. package/coverage/ui-kit/storybook-static/sb-addons/links-0/index.html +116 -0
  217. package/coverage/ui-kit/storybook-static/sb-addons/links-0/manager-bundle.js.html +94 -0
  218. package/coverage/ui-kit/storybook-static/sb-addons/onboarding-6/index.html +116 -0
  219. package/coverage/ui-kit/storybook-static/sb-addons/onboarding-6/manager-bundle.js.html +1588 -0
  220. package/coverage/ui-kit/storybook-static/sb-addons/viewport-8/index.html +116 -0
  221. package/coverage/ui-kit/storybook-static/sb-addons/viewport-8/manager-bundle.js.html +94 -0
  222. package/coverage/ui-kit/storybook-static/sb-manager/WithTooltip-V3YHNWJZ-LVYLGZW2.js.html +88 -0
  223. package/coverage/ui-kit/storybook-static/sb-manager/chunk-2IXBUOFS.js.html +106 -0
  224. package/coverage/ui-kit/storybook-static/sb-manager/chunk-INSKDKQB.js.html +1129 -0
  225. package/coverage/ui-kit/storybook-static/sb-manager/chunk-NGTUFCUO.js.html +112 -0
  226. package/coverage/ui-kit/storybook-static/sb-manager/chunk-UUEAOBSN.js.html +1303 -0
  227. package/coverage/ui-kit/storybook-static/sb-manager/chunk-ZEU7PDD3.js.html +88 -0
  228. package/coverage/ui-kit/storybook-static/sb-manager/formatter-SWP5E3XI-7BGIK6BL.js.html +553 -0
  229. package/coverage/ui-kit/storybook-static/sb-manager/globals-module-info.js.html +88 -0
  230. package/coverage/ui-kit/storybook-static/sb-manager/globals.js.html +88 -0
  231. package/coverage/ui-kit/storybook-static/sb-manager/index.html +281 -0
  232. package/coverage/ui-kit/storybook-static/sb-manager/index.js.html +88 -0
  233. package/coverage/ui-kit/storybook-static/sb-manager/runtime.js.html +88 -0
  234. package/coverage/ui-kit/storybook-static/sb-manager/syntaxhighlighter-V7JZZA35-DXZCI2WR.js.html +88 -0
  235. package/coverage/ui-kit/storybook-static/sb-preview/globals.js.html +88 -0
  236. package/coverage/ui-kit/storybook-static/sb-preview/index.html +131 -0
  237. package/coverage/ui-kit/storybook-static/sb-preview/runtime.js.html +421 -0
  238. package/coverage/ui-kit/storybook-static/templates-DeterminedErrorDialogStep-stories.3cc14214.iframe.bundle.js.html +85 -0
  239. package/dist/global.css +197 -0
  240. package/dist/global.css.map +1 -0
  241. package/dist/index.cjs +10864 -21
  242. package/dist/index.cjs.map +1 -1
  243. package/dist/index.css +2212 -8491
  244. package/dist/index.css.map +1 -1
  245. package/dist/index.modern.js +8354 -22
  246. package/dist/index.modern.js.map +1 -1
  247. package/dist/index.module.js +10784 -23
  248. package/dist/index.module.js.map +1 -1
  249. package/dist/index.umd.js +10855 -25
  250. package/dist/index.umd.js.map +1 -1
  251. package/index.js +1 -1
  252. package/package.json +36 -9
  253. package/src/common-apis/adapters/axiosAdapter.js +35 -0
  254. package/src/common-apis/adapters/qrUtils.js +18 -0
  255. package/src/common-apis/amountUtils.js +359 -0
  256. package/src/common-apis/errorUtils.js +42 -0
  257. package/src/common-apis/external-apis/apiGroups.js +55 -0
  258. package/src/common-apis/external-apis/ipAddressProviders.js +89 -0
  259. package/src/common-apis/fiatCurrenciesService.js +153 -0
  260. package/src/common-apis/globalConstants.jsx +3 -0
  261. package/src/common-apis/models/blockchain.js +10 -0
  262. package/src/common-apis/models/coin.js +153 -0
  263. package/src/common-apis/models/protocol.js +5 -0
  264. package/src/common-apis/tests/amountUtils/composeRateText.test.js +152 -0
  265. package/src/common-apis/tests/integration/external-apis/ipAddressProviders/getClientIpAddress.test.js +12 -0
  266. package/src/common-apis/utils/cache.js +242 -0
  267. package/src/common-apis/utils/emailAPI.js +16 -0
  268. package/src/common-apis/utils/logging/logger.js +41 -0
  269. package/src/common-apis/utils/logging/logsStorage.js +61 -0
  270. package/src/common-apis/utils/postponeExecution.js +11 -0
  271. package/src/common-apis/utils/safeStringify.js +50 -0
  272. package/src/index.js +84 -0
  273. package/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js +495 -0
  274. package/src/robust-api-caller/cachedRobustExternalApiCallerService.js +147 -0
  275. package/src/robust-api-caller/cancelProcessing.js +29 -0
  276. package/src/robust-api-caller/concurrentCalculationsMetadataHolder.js +75 -0
  277. package/src/robust-api-caller/externalApiProvider.js +156 -0
  278. package/src/robust-api-caller/externalServicesStatsCollector.js +78 -0
  279. package/src/robust-api-caller/robustExternalAPICallerService.js +304 -0
  280. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/_performCallAttempt.test.js +533 -0
  281. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/callExternalAPI.test.js +532 -0
  282. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/constructor.test.js +19 -0
  283. package/src/swaps-lib/external-apis/letsExchangeSwapProvider.js +476 -0
  284. package/src/swaps-lib/external-apis/swapProvider.js +491 -0
  285. package/src/swaps-lib/external-apis/swapspaceSwapProvider.js +550 -0
  286. package/src/swaps-lib/models/baseSwapCreationInfo.js +46 -0
  287. package/src/swaps-lib/models/existingSwap.js +73 -0
  288. package/src/swaps-lib/models/existingSwapWithFiatData.js +128 -0
  289. package/src/swaps-lib/services/publicSwapService.js +671 -0
  290. package/src/swaps-lib/test/external-apis/swapProvider/getAllSupportedCurrencies.test.js +63 -0
  291. package/src/swaps-lib/test/external-apis/swapProvider/getDepositCurrencies.test.js +73 -0
  292. package/src/swaps-lib/test/external-apis/swapProvider/getWithdrawalCurrencies.test.js +102 -0
  293. package/src/swaps-lib/test/external-apis/swapProvider/removeProtocolNameFromCoinName.test.js +152 -0
  294. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +538 -0
  295. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/createSwap.test.js +1249 -0
  296. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/getSwapInfo.test.js +1700 -0
  297. package/src/swaps-lib/test/utils/swapUtils/safeHandleRequestsLimitExceeding.test.js +80 -0
  298. package/src/swaps-lib/utils/swapUtils.js +195 -0
  299. package/{styles → src/ui-kit/assets/styles}/_functions.scss +5 -0
  300. package/{styles → src/ui-kit/assets/styles}/_mixins.scss +2 -2
  301. package/{styles → src/ui-kit/assets/styles}/_placeholder.scss +3 -3
  302. package/{styles → src/ui-kit/assets/styles}/_variables.scss +17 -15
  303. package/src/ui-kit/assets/styles/fonts/NunitoSans-Bold.ttf +0 -0
  304. package/src/ui-kit/assets/styles/fonts/NunitoSans-ExtraBold.ttf +0 -0
  305. package/src/ui-kit/assets/styles/fonts/NunitoSans-Light.ttf +0 -0
  306. package/src/ui-kit/assets/styles/fonts/NunitoSans-Regular.ttf +0 -0
  307. package/src/ui-kit/assets/styles/fonts/NunitoSans-SemiBold.ttf +0 -0
  308. package/src/ui-kit/assets/styles/global.scss +165 -0
  309. package/src/ui-kit/assets/styles/index.scss +10 -0
  310. package/src/ui-kit/assets/wrappedImages/arrowIcon.jsx +13 -0
  311. package/src/ui-kit/assets/wrappedImages/arrowTosca.jsx +14 -0
  312. package/src/ui-kit/assets/wrappedImages/arrowWhite.jsx +14 -0
  313. package/src/ui-kit/assets/wrappedImages/darkRectangle.jsx +7 -0
  314. package/src/ui-kit/assets/wrappedImages/determinedError.jsx +118 -0
  315. package/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx +39 -0
  316. package/src/ui-kit/assets/wrappedImages/infoIcon.jsx +16 -0
  317. package/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx +54 -0
  318. package/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx +26 -0
  319. package/src/ui-kit/assets/wrappedImages/walletIcon.jsx +22 -0
  320. package/src/ui-kit/components/atoms/AssetIcon/AssetIcon.jsx +57 -0
  321. package/{stories → src/ui-kit/components}/atoms/AssetIcon/asset-icon.module.scss +1 -1
  322. package/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx +68 -0
  323. package/src/ui-kit/components/atoms/AssetSelection/asset-selection.module.scss +56 -0
  324. package/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx +34 -0
  325. package/src/ui-kit/components/atoms/BackgroundTitle/background-title.module.scss +52 -0
  326. package/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx +51 -0
  327. package/src/ui-kit/components/atoms/InformationMessage/information-message.module.scss +38 -0
  328. package/src/ui-kit/components/atoms/Input/Input.jsx +183 -0
  329. package/src/ui-kit/components/atoms/Input/input.module.scss +107 -0
  330. package/{stories → src/ui-kit/components}/atoms/LoadingDots/LoadingDots.jsx +8 -28
  331. package/{stories → src/ui-kit/components}/atoms/LoadingDots/LoadingDots.module.scss +3 -2
  332. package/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx +64 -0
  333. package/src/ui-kit/components/atoms/NoticeIcon/notice-icon.module.scss +14 -0
  334. package/src/ui-kit/components/atoms/QrCode/QrCode.jsx +50 -0
  335. package/src/ui-kit/components/atoms/QrCode/qr-code.module.scss +15 -0
  336. package/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx +30 -0
  337. package/src/ui-kit/components/atoms/RateSelector/rate-selector.module.scss +47 -0
  338. package/{stories → src/ui-kit/components}/atoms/SupportChat/SupportChat.jsx +5 -1
  339. package/src/ui-kit/components/atoms/Textarea/Textarea.jsx +148 -0
  340. package/src/ui-kit/components/atoms/Textarea/textarea.module.scss +71 -0
  341. package/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx +141 -0
  342. package/src/ui-kit/components/atoms/TitleBox/title-box.module.scss +32 -0
  343. package/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx +77 -0
  344. package/src/ui-kit/components/atoms/Tooltip/tooltip.module.scss +237 -0
  345. package/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx +76 -0
  346. package/src/ui-kit/components/atoms/TwoLinesOfText/lines-of-text.module.scss +65 -0
  347. package/src/ui-kit/components/atoms/Validation/Validation.jsx +41 -0
  348. package/src/ui-kit/components/atoms/Validation/validation.module.scss +15 -0
  349. package/{stories → src/ui-kit/components}/atoms/buttons/Button/Button.jsx +24 -50
  350. package/{stories → src/ui-kit/components}/atoms/buttons/Button/Button.module.scss +1 -1
  351. package/src/ui-kit/components/atoms/buttons/Close/Close.jsx +58 -0
  352. package/src/ui-kit/components/atoms/buttons/Close/close.module.scss +75 -0
  353. package/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx +112 -0
  354. package/src/ui-kit/components/atoms/buttons/LinkButton/link-button.module.scss +49 -0
  355. package/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx +110 -0
  356. package/src/ui-kit/components/atoms/buttons/RadioButtonWithText/radio-button-with-text.module.scss +86 -0
  357. package/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx +325 -0
  358. package/src/ui-kit/components/molecules/AmountInput/amount-input.module.scss +199 -0
  359. package/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx +511 -0
  360. package/src/ui-kit/components/molecules/CoinPicker/coin-picker.module.scss +207 -0
  361. package/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx +35 -0
  362. package/src/ui-kit/components/molecules/LineWithIconLink/line-with-icon-link.module.scss +25 -0
  363. package/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx +32 -0
  364. package/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx +66 -0
  365. package/src/ui-kit/components/organisms/Dialog/Dialog.jsx +494 -0
  366. package/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx +122 -0
  367. package/src/ui-kit/components/organisms/Dialog/DialogButtons/dialog-buttons.module.scss +25 -0
  368. package/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx +538 -0
  369. package/src/ui-kit/components/organisms/Dialog/DialogStep/dialog-step.module.scss +381 -0
  370. package/src/ui-kit/components/organisms/Dialog/dialog.module.scss +226 -0
  371. package/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx +1330 -0
  372. package/src/ui-kit/components/organisms/SwapForm/swap-form.module.scss +134 -0
  373. package/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx +77 -0
  374. package/src/ui-kit/hooks/useCallHandlingErrors.js +22 -0
  375. package/src/ui-kit/hooks/useIsHydrated.js +12 -0
  376. package/src/ui-kit/hooks/useReferredState.js +24 -0
  377. package/src/ui-kit/tests/utils/inputValueProviders/provideFormatOfFloatValueByInputString.test.js +132 -0
  378. package/src/ui-kit/tests/utils/urlQueryUtils/getQueryParameterValues.test.js +65 -0
  379. package/src/ui-kit/tests/utils/urlQueryUtils/saveQueryParameterAndValues.test.js +104 -0
  380. package/src/ui-kit/utils/inputValueProviders.js +50 -0
  381. package/src/ui-kit/utils/textUtils.js +18 -0
  382. package/src/ui-kit/utils/uiUtils.js +12 -0
  383. package/src/ui-kit/utils/urlQueryUtils.js +62 -0
  384. package/stories/stubs/exampleContent.jsx +20 -0
  385. package/stories/atoms/AssetIcon/AssetIcon.jsx +0 -55
  386. package/stories/index.js +0 -4
  387. package/styles/_global-classes.scss +0 -433
  388. package/styles/fonts/NunitoSans-Bold.ttf +0 -0
  389. package/styles/fonts/NunitoSans-ExtraBold.ttf +0 -0
  390. package/styles/fonts/NunitoSans-Light.ttf +0 -0
  391. package/styles/fonts/NunitoSans-Regular.ttf +0 -0
  392. package/styles/fonts/NunitoSans-SemiBold.ttf +0 -0
  393. package/styles/global-styles-index.scss +0 -74
  394. package/styles/index.scss +0 -33
  395. /package/{styles → src/ui-kit/assets/styles}/colors/_light-colors.scss +0 -0
  396. /package/{styles → src/ui-kit/assets/styles}/colors/_solid-colors.scss +0 -0
  397. /package/{styles → src/ui-kit/assets/styles}/size/_margin-size.scss +0 -0
  398. /package/{styles → src/ui-kit/assets/styles}/size/_padding-size.scss +0 -0
@@ -0,0 +1,2098 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for ui-kit/src/swaps-lib/services/publicSwapService.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ui-kit/src/swaps-lib/services</a> publicSwapService.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/671</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/671</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
738
+ <span class="cline-any cline-no">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-no">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-no">&nbsp;</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-no">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-no">&nbsp;</span>
757
+ <span class="cline-any cline-no">&nbsp;</span>
758
+ <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-no">&nbsp;</span>
760
+ <span class="cline-any cline-no">&nbsp;</span>
761
+ <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-no">&nbsp;</span>
764
+ <span class="cline-any cline-no">&nbsp;</span>
765
+ <span class="cline-any cline-no">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-no">&nbsp;</span>
770
+ <span class="cline-any cline-no">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-no">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-no">&nbsp;</span>
778
+ <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-no">&nbsp;</span>
783
+ <span class="cline-any cline-no">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-no">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-no">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-no">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-no">&nbsp;</span>
795
+ <span class="cline-any cline-no">&nbsp;</span>
796
+ <span class="cline-any cline-no">&nbsp;</span>
797
+ <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-no">&nbsp;</span>
799
+ <span class="cline-any cline-no">&nbsp;</span>
800
+ <span class="cline-any cline-no">&nbsp;</span>
801
+ <span class="cline-any cline-no">&nbsp;</span>
802
+ <span class="cline-any cline-no">&nbsp;</span>
803
+ <span class="cline-any cline-no">&nbsp;</span>
804
+ <span class="cline-any cline-no">&nbsp;</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-no">&nbsp;</span>
807
+ <span class="cline-any cline-no">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-no">&nbsp;</span>
811
+ <span class="cline-any cline-no">&nbsp;</span>
812
+ <span class="cline-any cline-no">&nbsp;</span>
813
+ <span class="cline-any cline-no">&nbsp;</span>
814
+ <span class="cline-any cline-no">&nbsp;</span>
815
+ <span class="cline-any cline-no">&nbsp;</span>
816
+ <span class="cline-any cline-no">&nbsp;</span>
817
+ <span class="cline-any cline-no">&nbsp;</span>
818
+ <span class="cline-any cline-no">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-no">&nbsp;</span>
821
+ <span class="cline-any cline-no">&nbsp;</span>
822
+ <span class="cline-any cline-no">&nbsp;</span>
823
+ <span class="cline-any cline-no">&nbsp;</span>
824
+ <span class="cline-any cline-no">&nbsp;</span>
825
+ <span class="cline-any cline-no">&nbsp;</span>
826
+ <span class="cline-any cline-no">&nbsp;</span>
827
+ <span class="cline-any cline-no">&nbsp;</span>
828
+ <span class="cline-any cline-no">&nbsp;</span>
829
+ <span class="cline-any cline-no">&nbsp;</span>
830
+ <span class="cline-any cline-no">&nbsp;</span>
831
+ <span class="cline-any cline-no">&nbsp;</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-no">&nbsp;</span>
834
+ <span class="cline-any cline-no">&nbsp;</span>
835
+ <span class="cline-any cline-no">&nbsp;</span>
836
+ <span class="cline-any cline-no">&nbsp;</span>
837
+ <span class="cline-any cline-no">&nbsp;</span>
838
+ <span class="cline-any cline-no">&nbsp;</span>
839
+ <span class="cline-any cline-no">&nbsp;</span>
840
+ <span class="cline-any cline-no">&nbsp;</span>
841
+ <span class="cline-any cline-no">&nbsp;</span>
842
+ <span class="cline-any cline-no">&nbsp;</span>
843
+ <span class="cline-any cline-no">&nbsp;</span>
844
+ <span class="cline-any cline-no">&nbsp;</span>
845
+ <span class="cline-any cline-no">&nbsp;</span>
846
+ <span class="cline-any cline-no">&nbsp;</span>
847
+ <span class="cline-any cline-no">&nbsp;</span>
848
+ <span class="cline-any cline-no">&nbsp;</span>
849
+ <span class="cline-any cline-no">&nbsp;</span>
850
+ <span class="cline-any cline-no">&nbsp;</span>
851
+ <span class="cline-any cline-no">&nbsp;</span>
852
+ <span class="cline-any cline-no">&nbsp;</span>
853
+ <span class="cline-any cline-no">&nbsp;</span>
854
+ <span class="cline-any cline-no">&nbsp;</span>
855
+ <span class="cline-any cline-no">&nbsp;</span>
856
+ <span class="cline-any cline-no">&nbsp;</span>
857
+ <span class="cline-any cline-no">&nbsp;</span>
858
+ <span class="cline-any cline-no">&nbsp;</span>
859
+ <span class="cline-any cline-no">&nbsp;</span>
860
+ <span class="cline-any cline-no">&nbsp;</span>
861
+ <span class="cline-any cline-no">&nbsp;</span>
862
+ <span class="cline-any cline-no">&nbsp;</span>
863
+ <span class="cline-any cline-no">&nbsp;</span>
864
+ <span class="cline-any cline-no">&nbsp;</span>
865
+ <span class="cline-any cline-no">&nbsp;</span>
866
+ <span class="cline-any cline-no">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-no">&nbsp;</span>
869
+ <span class="cline-any cline-no">&nbsp;</span>
870
+ <span class="cline-any cline-no">&nbsp;</span>
871
+ <span class="cline-any cline-no">&nbsp;</span>
872
+ <span class="cline-any cline-no">&nbsp;</span>
873
+ <span class="cline-any cline-no">&nbsp;</span>
874
+ <span class="cline-any cline-no">&nbsp;</span>
875
+ <span class="cline-any cline-no">&nbsp;</span>
876
+ <span class="cline-any cline-no">&nbsp;</span>
877
+ <span class="cline-any cline-no">&nbsp;</span>
878
+ <span class="cline-any cline-no">&nbsp;</span>
879
+ <span class="cline-any cline-no">&nbsp;</span>
880
+ <span class="cline-any cline-no">&nbsp;</span>
881
+ <span class="cline-any cline-no">&nbsp;</span>
882
+ <span class="cline-any cline-no">&nbsp;</span>
883
+ <span class="cline-any cline-no">&nbsp;</span>
884
+ <span class="cline-any cline-no">&nbsp;</span>
885
+ <span class="cline-any cline-no">&nbsp;</span>
886
+ <span class="cline-any cline-no">&nbsp;</span>
887
+ <span class="cline-any cline-no">&nbsp;</span>
888
+ <span class="cline-any cline-no">&nbsp;</span>
889
+ <span class="cline-any cline-no">&nbsp;</span>
890
+ <span class="cline-any cline-no">&nbsp;</span>
891
+ <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-no">&nbsp;</span>
893
+ <span class="cline-any cline-no">&nbsp;</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-no">&nbsp;</span>
897
+ <span class="cline-any cline-no">&nbsp;</span>
898
+ <span class="cline-any cline-no">&nbsp;</span>
899
+ <span class="cline-any cline-no">&nbsp;</span>
900
+ <span class="cline-any cline-no">&nbsp;</span>
901
+ <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-no">&nbsp;</span>
903
+ <span class="cline-any cline-no">&nbsp;</span>
904
+ <span class="cline-any cline-no">&nbsp;</span>
905
+ <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-no">&nbsp;</span>
907
+ <span class="cline-any cline-no">&nbsp;</span>
908
+ <span class="cline-any cline-no">&nbsp;</span>
909
+ <span class="cline-any cline-no">&nbsp;</span>
910
+ <span class="cline-any cline-no">&nbsp;</span>
911
+ <span class="cline-any cline-no">&nbsp;</span>
912
+ <span class="cline-any cline-no">&nbsp;</span>
913
+ <span class="cline-any cline-no">&nbsp;</span>
914
+ <span class="cline-any cline-no">&nbsp;</span>
915
+ <span class="cline-any cline-no">&nbsp;</span>
916
+ <span class="cline-any cline-no">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-no">&nbsp;</span>
919
+ <span class="cline-any cline-no">&nbsp;</span>
920
+ <span class="cline-any cline-no">&nbsp;</span>
921
+ <span class="cline-any cline-no">&nbsp;</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-no">&nbsp;</span>
927
+ <span class="cline-any cline-no">&nbsp;</span>
928
+ <span class="cline-any cline-no">&nbsp;</span>
929
+ <span class="cline-any cline-no">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-no">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-no">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-no">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-no">&nbsp;</span>
949
+ <span class="cline-any cline-no">&nbsp;</span>
950
+ <span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-no">&nbsp;</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-no">&nbsp;</span>
954
+ <span class="cline-any cline-no">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-no">&nbsp;</span>
957
+ <span class="cline-any cline-no">&nbsp;</span>
958
+ <span class="cline-any cline-no">&nbsp;</span>
959
+ <span class="cline-any cline-no">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-no">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-no">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-no">&nbsp;</span>
971
+ <span class="cline-any cline-no">&nbsp;</span>
972
+ <span class="cline-any cline-no">&nbsp;</span>
973
+ <span class="cline-any cline-no">&nbsp;</span>
974
+ <span class="cline-any cline-no">&nbsp;</span>
975
+ <span class="cline-any cline-no">&nbsp;</span>
976
+ <span class="cline-any cline-no">&nbsp;</span>
977
+ <span class="cline-any cline-no">&nbsp;</span>
978
+ <span class="cline-any cline-no">&nbsp;</span>
979
+ <span class="cline-any cline-no">&nbsp;</span>
980
+ <span class="cline-any cline-no">&nbsp;</span>
981
+ <span class="cline-any cline-no">&nbsp;</span>
982
+ <span class="cline-any cline-no">&nbsp;</span>
983
+ <span class="cline-any cline-no">&nbsp;</span>
984
+ <span class="cline-any cline-no">&nbsp;</span>
985
+ <span class="cline-any cline-no">&nbsp;</span>
986
+ <span class="cline-any cline-no">&nbsp;</span>
987
+ <span class="cline-any cline-no">&nbsp;</span>
988
+ <span class="cline-any cline-no">&nbsp;</span>
989
+ <span class="cline-any cline-no">&nbsp;</span>
990
+ <span class="cline-any cline-no">&nbsp;</span>
991
+ <span class="cline-any cline-no">&nbsp;</span>
992
+ <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-no">&nbsp;</span>
994
+ <span class="cline-any cline-no">&nbsp;</span>
995
+ <span class="cline-any cline-no">&nbsp;</span>
996
+ <span class="cline-any cline-no">&nbsp;</span>
997
+ <span class="cline-any cline-no">&nbsp;</span>
998
+ <span class="cline-any cline-no">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-no">&nbsp;</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-no">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-no">&nbsp;</span>
1007
+ <span class="cline-any cline-no">&nbsp;</span>
1008
+ <span class="cline-any cline-no">&nbsp;</span>
1009
+ <span class="cline-any cline-no">&nbsp;</span>
1010
+ <span class="cline-any cline-no">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-no">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-no">&nbsp;</span>
1018
+ <span class="cline-any cline-no">&nbsp;</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-no">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-no">&nbsp;</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-no">&nbsp;</span>
1029
+ <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-no">&nbsp;</span>
1031
+ <span class="cline-any cline-no">&nbsp;</span>
1032
+ <span class="cline-any cline-no">&nbsp;</span>
1033
+ <span class="cline-any cline-no">&nbsp;</span>
1034
+ <span class="cline-any cline-no">&nbsp;</span>
1035
+ <span class="cline-any cline-no">&nbsp;</span>
1036
+ <span class="cline-any cline-no">&nbsp;</span>
1037
+ <span class="cline-any cline-no">&nbsp;</span>
1038
+ <span class="cline-any cline-no">&nbsp;</span>
1039
+ <span class="cline-any cline-no">&nbsp;</span>
1040
+ <span class="cline-any cline-no">&nbsp;</span>
1041
+ <span class="cline-any cline-no">&nbsp;</span>
1042
+ <span class="cline-any cline-no">&nbsp;</span>
1043
+ <span class="cline-any cline-no">&nbsp;</span>
1044
+ <span class="cline-any cline-no">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-no">&nbsp;</span>
1047
+ <span class="cline-any cline-no">&nbsp;</span>
1048
+ <span class="cline-any cline-no">&nbsp;</span>
1049
+ <span class="cline-any cline-no">&nbsp;</span>
1050
+ <span class="cline-any cline-no">&nbsp;</span>
1051
+ <span class="cline-any cline-no">&nbsp;</span>
1052
+ <span class="cline-any cline-no">&nbsp;</span>
1053
+ <span class="cline-any cline-no">&nbsp;</span>
1054
+ <span class="cline-any cline-no">&nbsp;</span>
1055
+ <span class="cline-any cline-no">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-no">&nbsp;</span>
1058
+ <span class="cline-any cline-no">&nbsp;</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-no">&nbsp;</span>
1061
+ <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-no">&nbsp;</span>
1065
+ <span class="cline-any cline-no">&nbsp;</span>
1066
+ <span class="cline-any cline-no">&nbsp;</span>
1067
+ <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-no">&nbsp;</span>
1069
+ <span class="cline-any cline-no">&nbsp;</span>
1070
+ <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-no">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-no">&nbsp;</span>
1076
+ <span class="cline-any cline-no">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-no">&nbsp;</span>
1084
+ <span class="cline-any cline-no">&nbsp;</span>
1085
+ <span class="cline-any cline-no">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-no">&nbsp;</span>
1089
+ <span class="cline-any cline-no">&nbsp;</span>
1090
+ <span class="cline-any cline-no">&nbsp;</span>
1091
+ <span class="cline-any cline-no">&nbsp;</span>
1092
+ <span class="cline-any cline-no">&nbsp;</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-no">&nbsp;</span>
1096
+ <span class="cline-any cline-no">&nbsp;</span>
1097
+ <span class="cline-any cline-no">&nbsp;</span>
1098
+ <span class="cline-any cline-no">&nbsp;</span>
1099
+ <span class="cline-any cline-no">&nbsp;</span>
1100
+ <span class="cline-any cline-no">&nbsp;</span>
1101
+ <span class="cline-any cline-no">&nbsp;</span>
1102
+ <span class="cline-any cline-no">&nbsp;</span>
1103
+ <span class="cline-any cline-no">&nbsp;</span>
1104
+ <span class="cline-any cline-no">&nbsp;</span>
1105
+ <span class="cline-any cline-no">&nbsp;</span>
1106
+ <span class="cline-any cline-no">&nbsp;</span>
1107
+ <span class="cline-any cline-no">&nbsp;</span>
1108
+ <span class="cline-any cline-no">&nbsp;</span>
1109
+ <span class="cline-any cline-no">&nbsp;</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-no">&nbsp;</span>
1113
+ <span class="cline-any cline-no">&nbsp;</span>
1114
+ <span class="cline-any cline-no">&nbsp;</span>
1115
+ <span class="cline-any cline-no">&nbsp;</span>
1116
+ <span class="cline-any cline-no">&nbsp;</span>
1117
+ <span class="cline-any cline-no">&nbsp;</span>
1118
+ <span class="cline-any cline-no">&nbsp;</span>
1119
+ <span class="cline-any cline-no">&nbsp;</span>
1120
+ <span class="cline-any cline-no">&nbsp;</span>
1121
+ <span class="cline-any cline-no">&nbsp;</span>
1122
+ <span class="cline-any cline-no">&nbsp;</span>
1123
+ <span class="cline-any cline-no">&nbsp;</span>
1124
+ <span class="cline-any cline-no">&nbsp;</span>
1125
+ <span class="cline-any cline-no">&nbsp;</span>
1126
+ <span class="cline-any cline-no">&nbsp;</span>
1127
+ <span class="cline-any cline-no">&nbsp;</span>
1128
+ <span class="cline-any cline-no">&nbsp;</span>
1129
+ <span class="cline-any cline-no">&nbsp;</span>
1130
+ <span class="cline-any cline-no">&nbsp;</span>
1131
+ <span class="cline-any cline-no">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-no">&nbsp;</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-no">&nbsp;</span>
1144
+ <span class="cline-any cline-no">&nbsp;</span>
1145
+ <span class="cline-any cline-no">&nbsp;</span>
1146
+ <span class="cline-any cline-no">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-no">&nbsp;</span>
1149
+ <span class="cline-any cline-no">&nbsp;</span>
1150
+ <span class="cline-any cline-no">&nbsp;</span>
1151
+ <span class="cline-any cline-no">&nbsp;</span>
1152
+ <span class="cline-any cline-no">&nbsp;</span>
1153
+ <span class="cline-any cline-no">&nbsp;</span>
1154
+ <span class="cline-any cline-no">&nbsp;</span>
1155
+ <span class="cline-any cline-no">&nbsp;</span>
1156
+ <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-no">&nbsp;</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-no">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-no">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-no">&nbsp;</span>
1172
+ <span class="cline-any cline-no">&nbsp;</span>
1173
+ <span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-no">&nbsp;</span>
1176
+ <span class="cline-any cline-no">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-no">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-no">&nbsp;</span>
1197
+ <span class="cline-any cline-no">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-no">&nbsp;</span>
1207
+ <span class="cline-any cline-no">&nbsp;</span>
1208
+ <span class="cline-any cline-no">&nbsp;</span>
1209
+ <span class="cline-any cline-no">&nbsp;</span>
1210
+ <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-no">&nbsp;</span>
1212
+ <span class="cline-any cline-no">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-no">&nbsp;</span>
1216
+ <span class="cline-any cline-no">&nbsp;</span>
1217
+ <span class="cline-any cline-no">&nbsp;</span>
1218
+ <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-no">&nbsp;</span>
1220
+ <span class="cline-any cline-no">&nbsp;</span>
1221
+ <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-no">&nbsp;</span>
1223
+ <span class="cline-any cline-no">&nbsp;</span>
1224
+ <span class="cline-any cline-no">&nbsp;</span>
1225
+ <span class="cline-any cline-no">&nbsp;</span>
1226
+ <span class="cline-any cline-no">&nbsp;</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-no">&nbsp;</span>
1234
+ <span class="cline-any cline-no">&nbsp;</span>
1235
+ <span class="cline-any cline-no">&nbsp;</span>
1236
+ <span class="cline-any cline-no">&nbsp;</span>
1237
+ <span class="cline-any cline-no">&nbsp;</span>
1238
+ <span class="cline-any cline-no">&nbsp;</span>
1239
+ <span class="cline-any cline-no">&nbsp;</span>
1240
+ <span class="cline-any cline-no">&nbsp;</span>
1241
+ <span class="cline-any cline-no">&nbsp;</span>
1242
+ <span class="cline-any cline-no">&nbsp;</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-no">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-no">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-no">&nbsp;</span>
1251
+ <span class="cline-any cline-no">&nbsp;</span>
1252
+ <span class="cline-any cline-no">&nbsp;</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-no">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-no">&nbsp;</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-no">&nbsp;</span>
1262
+ <span class="cline-any cline-no">&nbsp;</span>
1263
+ <span class="cline-any cline-no">&nbsp;</span>
1264
+ <span class="cline-any cline-no">&nbsp;</span>
1265
+ <span class="cline-any cline-no">&nbsp;</span>
1266
+ <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-no">&nbsp;</span>
1270
+ <span class="cline-any cline-no">&nbsp;</span>
1271
+ <span class="cline-any cline-no">&nbsp;</span>
1272
+ <span class="cline-any cline-no">&nbsp;</span>
1273
+ <span class="cline-any cline-no">&nbsp;</span>
1274
+ <span class="cline-any cline-no">&nbsp;</span>
1275
+ <span class="cline-any cline-no">&nbsp;</span>
1276
+ <span class="cline-any cline-no">&nbsp;</span>
1277
+ <span class="cline-any cline-no">&nbsp;</span>
1278
+ <span class="cline-any cline-no">&nbsp;</span>
1279
+ <span class="cline-any cline-no">&nbsp;</span>
1280
+ <span class="cline-any cline-no">&nbsp;</span>
1281
+ <span class="cline-any cline-no">&nbsp;</span>
1282
+ <span class="cline-any cline-no">&nbsp;</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-no">&nbsp;</span>
1285
+ <span class="cline-any cline-no">&nbsp;</span>
1286
+ <span class="cline-any cline-no">&nbsp;</span>
1287
+ <span class="cline-any cline-no">&nbsp;</span>
1288
+ <span class="cline-any cline-no">&nbsp;</span>
1289
+ <span class="cline-any cline-no">&nbsp;</span>
1290
+ <span class="cline-any cline-no">&nbsp;</span>
1291
+ <span class="cline-any cline-no">&nbsp;</span>
1292
+ <span class="cline-any cline-no">&nbsp;</span>
1293
+ <span class="cline-any cline-no">&nbsp;</span>
1294
+ <span class="cline-any cline-no">&nbsp;</span>
1295
+ <span class="cline-any cline-no">&nbsp;</span>
1296
+ <span class="cline-any cline-no">&nbsp;</span>
1297
+ <span class="cline-any cline-no">&nbsp;</span>
1298
+ <span class="cline-any cline-no">&nbsp;</span>
1299
+ <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-no">&nbsp;</span>
1301
+ <span class="cline-any cline-no">&nbsp;</span>
1302
+ <span class="cline-any cline-no">&nbsp;</span>
1303
+ <span class="cline-any cline-no">&nbsp;</span>
1304
+ <span class="cline-any cline-no">&nbsp;</span>
1305
+ <span class="cline-any cline-no">&nbsp;</span>
1306
+ <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-no">&nbsp;</span>
1309
+ <span class="cline-any cline-no">&nbsp;</span>
1310
+ <span class="cline-any cline-no">&nbsp;</span>
1311
+ <span class="cline-any cline-no">&nbsp;</span>
1312
+ <span class="cline-any cline-no">&nbsp;</span>
1313
+ <span class="cline-any cline-no">&nbsp;</span>
1314
+ <span class="cline-any cline-no">&nbsp;</span>
1315
+ <span class="cline-any cline-no">&nbsp;</span>
1316
+ <span class="cline-any cline-no">&nbsp;</span>
1317
+ <span class="cline-any cline-no">&nbsp;</span>
1318
+ <span class="cline-any cline-no">&nbsp;</span>
1319
+ <span class="cline-any cline-no">&nbsp;</span>
1320
+ <span class="cline-any cline-no">&nbsp;</span>
1321
+ <span class="cline-any cline-no">&nbsp;</span>
1322
+ <span class="cline-any cline-no">&nbsp;</span>
1323
+ <span class="cline-any cline-no">&nbsp;</span>
1324
+ <span class="cline-any cline-no">&nbsp;</span>
1325
+ <span class="cline-any cline-no">&nbsp;</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-no">&nbsp;</span>
1328
+ <span class="cline-any cline-no">&nbsp;</span>
1329
+ <span class="cline-any cline-no">&nbsp;</span>
1330
+ <span class="cline-any cline-no">&nbsp;</span>
1331
+ <span class="cline-any cline-no">&nbsp;</span>
1332
+ <span class="cline-any cline-no">&nbsp;</span>
1333
+ <span class="cline-any cline-no">&nbsp;</span>
1334
+ <span class="cline-any cline-no">&nbsp;</span>
1335
+ <span class="cline-any cline-no">&nbsp;</span>
1336
+ <span class="cline-any cline-no">&nbsp;</span>
1337
+ <span class="cline-any cline-no">&nbsp;</span>
1338
+ <span class="cline-any cline-no">&nbsp;</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-no">&nbsp;</span>
1341
+ <span class="cline-any cline-no">&nbsp;</span>
1342
+ <span class="cline-any cline-no">&nbsp;</span>
1343
+ <span class="cline-any cline-no">&nbsp;</span>
1344
+ <span class="cline-any cline-no">&nbsp;</span>
1345
+ <span class="cline-any cline-no">&nbsp;</span>
1346
+ <span class="cline-any cline-no">&nbsp;</span>
1347
+ <span class="cline-any cline-no">&nbsp;</span>
1348
+ <span class="cline-any cline-no">&nbsp;</span>
1349
+ <span class="cline-any cline-no">&nbsp;</span>
1350
+ <span class="cline-any cline-no">&nbsp;</span>
1351
+ <span class="cline-any cline-no">&nbsp;</span>
1352
+ <span class="cline-any cline-no">&nbsp;</span>
1353
+ <span class="cline-any cline-no">&nbsp;</span>
1354
+ <span class="cline-any cline-no">&nbsp;</span>
1355
+ <span class="cline-any cline-no">&nbsp;</span>
1356
+ <span class="cline-any cline-no">&nbsp;</span>
1357
+ <span class="cline-any cline-no">&nbsp;</span>
1358
+ <span class="cline-any cline-no">&nbsp;</span>
1359
+ <span class="cline-any cline-no">&nbsp;</span>
1360
+ <span class="cline-any cline-no">&nbsp;</span>
1361
+ <span class="cline-any cline-no">&nbsp;</span>
1362
+ <span class="cline-any cline-no">&nbsp;</span>
1363
+ <span class="cline-any cline-no">&nbsp;</span>
1364
+ <span class="cline-any cline-no">&nbsp;</span>
1365
+ <span class="cline-any cline-no">&nbsp;</span>
1366
+ <span class="cline-any cline-no">&nbsp;</span>
1367
+ <span class="cline-any cline-no">&nbsp;</span>
1368
+ <span class="cline-any cline-no">&nbsp;</span>
1369
+ <span class="cline-any cline-no">&nbsp;</span>
1370
+ <span class="cline-any cline-no">&nbsp;</span>
1371
+ <span class="cline-any cline-no">&nbsp;</span>
1372
+ <span class="cline-any cline-no">&nbsp;</span>
1373
+ <span class="cline-any cline-no">&nbsp;</span>
1374
+ <span class="cline-any cline-no">&nbsp;</span>
1375
+ <span class="cline-any cline-no">&nbsp;</span>
1376
+ <span class="cline-any cline-no">&nbsp;</span>
1377
+ <span class="cline-any cline-no">&nbsp;</span>
1378
+ <span class="cline-any cline-no">&nbsp;</span>
1379
+ <span class="cline-any cline-no">&nbsp;</span>
1380
+ <span class="cline-any cline-no">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1382
+ <span class="cline-any cline-no">&nbsp;</span>
1383
+ <span class="cline-any cline-no">&nbsp;</span>
1384
+ <span class="cline-any cline-no">&nbsp;</span>
1385
+ <span class="cline-any cline-no">&nbsp;</span>
1386
+ <span class="cline-any cline-no">&nbsp;</span>
1387
+ <span class="cline-any cline-no">&nbsp;</span>
1388
+ <span class="cline-any cline-no">&nbsp;</span>
1389
+ <span class="cline-any cline-no">&nbsp;</span>
1390
+ <span class="cline-any cline-no">&nbsp;</span>
1391
+ <span class="cline-any cline-no">&nbsp;</span>
1392
+ <span class="cline-any cline-no">&nbsp;</span>
1393
+ <span class="cline-any cline-no">&nbsp;</span>
1394
+ <span class="cline-any cline-no">&nbsp;</span>
1395
+ <span class="cline-any cline-no">&nbsp;</span>
1396
+ <span class="cline-any cline-no">&nbsp;</span>
1397
+ <span class="cline-any cline-no">&nbsp;</span>
1398
+ <span class="cline-any cline-no">&nbsp;</span>
1399
+ <span class="cline-any cline-no">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1401
+ <span class="cline-any cline-no">&nbsp;</span>
1402
+ <span class="cline-any cline-no">&nbsp;</span>
1403
+ <span class="cline-any cline-no">&nbsp;</span>
1404
+ <span class="cline-any cline-no">&nbsp;</span>
1405
+ <span class="cline-any cline-no">&nbsp;</span>
1406
+ <span class="cline-any cline-no">&nbsp;</span>
1407
+ <span class="cline-any cline-no">&nbsp;</span>
1408
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import { BigNumber } from "bignumber.js";</span></span></span>
1409
+ <span class="cstat-no" title="statement not covered" >import EventBusInstance from "eventbusjs";</span>
1410
+ <span class="cstat-no" title="statement not covered" ></span>
1411
+ <span class="cstat-no" title="statement not covered" >import { FiatCurrenciesService } from "../../common-apis/fiatCurrenciesService.js";</span>
1412
+ <span class="cstat-no" title="statement not covered" >import { improveAndRethrow } from "../../common-apis/errorUtils.js";</span>
1413
+ <span class="cstat-no" title="statement not covered" >import { safeStringify } from "../../common-apis/utils/safeStringify.js";</span>
1414
+ <span class="cstat-no" title="statement not covered" >import { Logger } from "../../common-apis/utils/logging/logger.js";</span>
1415
+ <span class="cstat-no" title="statement not covered" >import { Coin } from "../../common-apis/models/coin.js";</span>
1416
+ <span class="cstat-no" title="statement not covered" >import { AmountUtils } from "../../common-apis/amountUtils.js";</span>
1417
+ <span class="cstat-no" title="statement not covered" >import { BaseSwapCreationInfo } from "../models/baseSwapCreationInfo.js";</span>
1418
+ <span class="cstat-no" title="statement not covered" >import { SwapUtils } from "../utils/swapUtils.js";</span>
1419
+ <span class="cstat-no" title="statement not covered" >import { SwapspaceSwapProvider } from "../external-apis/swapspaceSwapProvider.js";</span>
1420
+ <span class="cstat-no" title="statement not covered" >import { SwapProvider } from "../external-apis/swapProvider.js";</span>
1421
+ <span class="cstat-no" title="statement not covered" >import { LetsExchangeSwapProvider } from "../external-apis/letsExchangeSwapProvider.js";</span>
1422
+ <span class="cstat-no" title="statement not covered" ></span>
1423
+ <span class="cstat-no" title="statement not covered" >export class PublicSwapService {</span>
1424
+ <span class="cstat-no" title="statement not covered" > static PUBLIC_SWAP_CREATED_EVENT = "publicSwapCreatedEvent";</span>
1425
+ <span class="cstat-no" title="statement not covered" ></span>
1426
+ <span class="cstat-no" title="statement not covered" > static PUBLIC_SWAPS_COMMON_ERRORS = {</span>
1427
+ <span class="cstat-no" title="statement not covered" > REQUESTS_LIMIT_EXCEEDED: "requestsLimitExceeded",</span>
1428
+ <span class="cstat-no" title="statement not covered" > };</span>
1429
+ <span class="cstat-no" title="statement not covered" ></span>
1430
+ <span class="cstat-no" title="statement not covered" > static PUBLIC_SWAP_DETAILS_FAIL_REASONS = {</span>
1431
+ <span class="cstat-no" title="statement not covered" > AMOUNT_LESS_THAN_MIN_SWAPPABLE: "amountLessThanMinSwappable",</span>
1432
+ <span class="cstat-no" title="statement not covered" > AMOUNT_HIGHER_THAN_MAX_SWAPPABLE: "amountHigherThanMaxSwappable",</span>
1433
+ <span class="cstat-no" title="statement not covered" > PAIR_NOT_SUPPORTED: "pairNotSupported",</span>
1434
+ <span class="cstat-no" title="statement not covered" > NO_FIXED_BUT_HAVE_FLOATING_PUBLIC_SWAP_OPTION: "noFixedButHaveFloatingPublicSwapOption",</span>
1435
+ <span class="cstat-no" title="statement not covered" > NO_FLOATING_BUT_HAVE_FIXED_PUBLIC_SWAP_OPTION: "noFloatingButHaveFixedPublicSwapOption",</span>
1436
+ <span class="cstat-no" title="statement not covered" > };</span>
1437
+ <span class="cstat-no" title="statement not covered" ></span>
1438
+ <span class="cstat-no" title="statement not covered" > static _fiatDecimalsCount = FiatCurrenciesService.getCurrencyDecimalCountByCode("USD");</span>
1439
+ <span class="cstat-no" title="statement not covered" ></span>
1440
+ <span class="cstat-no" title="statement not covered" > constructor(apiKeysProxyUrl, cache) {</span>
1441
+ <span class="cstat-no" title="statement not covered" > this._swapProvider = new SwapspaceSwapProvider(apiKeysProxyUrl, cache, () =&gt; null, false);</span>
1442
+ <span class="cstat-no" title="statement not covered" > this._fixedSwapProvider = new LetsExchangeSwapProvider(apiKeysProxyUrl, cache, () =&gt; null, false);</span>
1443
+ <span class="cstat-no" title="statement not covered" > }</span>
1444
+ <span class="cstat-no" title="statement not covered" ></span>
1445
+ <span class="cstat-no" title="statement not covered" > async initialize() {</span>
1446
+ <span class="cstat-no" title="statement not covered" > try {</span>
1447
+ <span class="cstat-no" title="statement not covered" > await Promise.all([this._swapProvider.initialize(), this._fixedSwapProvider.initialize()]);</span>
1448
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1449
+ <span class="cstat-no" title="statement not covered" > Logger.logError(e, "PublicSwapService.initialize");</span>
1450
+ <span class="cstat-no" title="statement not covered" > }</span>
1451
+ <span class="cstat-no" title="statement not covered" > }</span>
1452
+ <span class="cstat-no" title="statement not covered" ></span>
1453
+ <span class="cstat-no" title="statement not covered" > /**</span>
1454
+ <span class="cstat-no" title="statement not covered" > * Gets all currencies across all partners. Useful for sitemap or supported currencies count/list.</span>
1455
+ <span class="cstat-no" title="statement not covered" > *</span>
1456
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;{result: boolean, coins: Coin[]}|{result: boolean, reason: string}&gt;}</span>
1457
+ <span class="cstat-no" title="statement not covered" > */</span>
1458
+ <span class="cstat-no" title="statement not covered" > async getAllSupportedCurrenciesListForPublicSwap() {</span>
1459
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "getAllSupportedCurrenciesListForPublicSwap";</span>
1460
+ <span class="cstat-no" title="statement not covered" > try {</span>
1461
+ <span class="cstat-no" title="statement not covered" > await this.initialize();</span>
1462
+ <span class="cstat-no" title="statement not covered" > const result = await Promise.all([</span>
1463
+ <span class="cstat-no" title="statement not covered" > this._fixedSwapProvider.getAllSupportedCurrencies(),</span>
1464
+ <span class="cstat-no" title="statement not covered" > this._swapProvider.getAllSupportedCurrencies(),</span>
1465
+ <span class="cstat-no" title="statement not covered" > ]);</span>
1466
+ <span class="cstat-no" title="statement not covered" > const allCoins = [...(result[0].coins ?? [])];</span>
1467
+ <span class="cstat-no" title="statement not covered" > (result[1].coins ?? []).forEach(c =&gt; {</span>
1468
+ <span class="cstat-no" title="statement not covered" > if (!allCoins.find(existingCoin =&gt; existingCoin.ticker === c.ticker)) {</span>
1469
+ <span class="cstat-no" title="statement not covered" > allCoins.push(c);</span>
1470
+ <span class="cstat-no" title="statement not covered" > }</span>
1471
+ <span class="cstat-no" title="statement not covered" > });</span>
1472
+ <span class="cstat-no" title="statement not covered" > if (</span>
1473
+ <span class="cstat-no" title="statement not covered" > result[0].reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED ||</span>
1474
+ <span class="cstat-no" title="statement not covered" > result[1].reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED</span>
1475
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1476
+ <span class="cstat-no" title="statement not covered" > SwapUtils.safeHandleRequestsLimitExceeding();</span>
1477
+ <span class="cstat-no" title="statement not covered" > // TODO: [dev] improve this during the whitebit integration. task_id=20e7e41211b540d081bf98f392a34b2c</span>
1478
+ <span class="cstat-no" title="statement not covered" > // return {</span>
1479
+ <span class="cstat-no" title="statement not covered" > // result: false,</span>
1480
+ <span class="cstat-no" title="statement not covered" > // reason: PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,</span>
1481
+ <span class="cstat-no" title="statement not covered" > // };</span>
1482
+ <span class="cstat-no" title="statement not covered" > } else if (result[0].reason || result[1].reason) {</span>
1483
+ <span class="cstat-no" title="statement not covered" > console.log("Failed to get all supported coins", result[0].reason, result[1].reason);</span>
1484
+ <span class="cstat-no" title="statement not covered" > }</span>
1485
+ <span class="cstat-no" title="statement not covered" > Logger.log(`Retrieved ${result?.coins?.length} supported currencies for swap`, loggerSource);</span>
1486
+ <span class="cstat-no" title="statement not covered" > return { result: true, coins: allCoins };</span>
1487
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1488
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "getAllSupportedCurrenciesListForPublicSwap");</span>
1489
+ <span class="cstat-no" title="statement not covered" > }</span>
1490
+ <span class="cstat-no" title="statement not covered" > }</span>
1491
+ <span class="cstat-no" title="statement not covered" ></span>
1492
+ <span class="cstat-no" title="statement not covered" > async getDepositCurrenciesListForPublicSwap(fixed = false) {</span>
1493
+ <span class="cstat-no" title="statement not covered" > try {</span>
1494
+ <span class="cstat-no" title="statement not covered" > return await this._getCurrenciesListForPublicSwap(false, fixed);</span>
1495
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1496
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "getDepositCurrenciesListForPublicSwap");</span>
1497
+ <span class="cstat-no" title="statement not covered" > }</span>
1498
+ <span class="cstat-no" title="statement not covered" > }</span>
1499
+ <span class="cstat-no" title="statement not covered" ></span>
1500
+ <span class="cstat-no" title="statement not covered" > async getWithdrawCurrenciesListForPublicSwap(fixed = false) {</span>
1501
+ <span class="cstat-no" title="statement not covered" > try {</span>
1502
+ <span class="cstat-no" title="statement not covered" > return await this._getCurrenciesListForPublicSwap(true, fixed);</span>
1503
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1504
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "getWithdrawCurrenciesListForPublicSwap");</span>
1505
+ <span class="cstat-no" title="statement not covered" > }</span>
1506
+ <span class="cstat-no" title="statement not covered" > }</span>
1507
+ <span class="cstat-no" title="statement not covered" ></span>
1508
+ <span class="cstat-no" title="statement not covered" > async _getCurrenciesListForPublicSwap(withdraw = false, fixed = false) {</span>
1509
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "getCurrenciesListForPublicSwap";</span>
1510
+ <span class="cstat-no" title="statement not covered" > try {</span>
1511
+ <span class="cstat-no" title="statement not covered" > const provider = fixed ? this._fixedSwapProvider : this._swapProvider;</span>
1512
+ <span class="cstat-no" title="statement not covered" > const result = withdraw ? await provider.getWithdrawalCurrencies() : await provider.getDepositCurrencies();</span>
1513
+ <span class="cstat-no" title="statement not covered" > if (result.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {</span>
1514
+ <span class="cstat-no" title="statement not covered" > SwapUtils.safeHandleRequestsLimitExceeding();</span>
1515
+ <span class="cstat-no" title="statement not covered" > return {</span>
1516
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1517
+ <span class="cstat-no" title="statement not covered" > reason: PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,</span>
1518
+ <span class="cstat-no" title="statement not covered" > };</span>
1519
+ <span class="cstat-no" title="statement not covered" > }</span>
1520
+ <span class="cstat-no" title="statement not covered" > Logger.log(</span>
1521
+ <span class="cstat-no" title="statement not covered" > `Retrieved ${result?.coins?.length} supported currencies for swap (withdraw=${withdraw})`,</span>
1522
+ <span class="cstat-no" title="statement not covered" > loggerSource</span>
1523
+ <span class="cstat-no" title="statement not covered" > );</span>
1524
+ <span class="cstat-no" title="statement not covered" > return { result: true, coins: result.coins };</span>
1525
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1526
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, loggerSource);</span>
1527
+ <span class="cstat-no" title="statement not covered" > }</span>
1528
+ <span class="cstat-no" title="statement not covered" > }</span>
1529
+ <span class="cstat-no" title="statement not covered" ></span>
1530
+ <span class="cstat-no" title="statement not covered" > /**</span>
1531
+ <span class="cstat-no" title="statement not covered" > * Retrieves initial data for swapping two coins.</span>
1532
+ <span class="cstat-no" title="statement not covered" > *</span>
1533
+ <span class="cstat-no" title="statement not covered" > * Always FLOATING rate, FIXED is not supported - if you want to change it the default rate - all</span>
1534
+ <span class="cstat-no" title="statement not covered" > * the swaps code logic should be verified to align with this change.</span>
1535
+ <span class="cstat-no" title="statement not covered" > *</span>
1536
+ <span class="cstat-no" title="statement not covered" > * @param fromCoin {Coin}</span>
1537
+ <span class="cstat-no" title="statement not covered" > * @param toCoin {Coin}</span>
1538
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;{</span>
1539
+ <span class="cstat-no" title="statement not covered" > * result: true,</span>
1540
+ <span class="cstat-no" title="statement not covered" > * min: string,</span>
1541
+ <span class="cstat-no" title="statement not covered" > * fiatMin: (number|null),</span>
1542
+ <span class="cstat-no" title="statement not covered" > * max: string,</span>
1543
+ <span class="cstat-no" title="statement not covered" > * fiatMax: (number|null),</span>
1544
+ <span class="cstat-no" title="statement not covered" > * rate: (string|null)</span>
1545
+ <span class="cstat-no" title="statement not covered" > * }|{</span>
1546
+ <span class="cstat-no" title="statement not covered" > * result: false,</span>
1547
+ <span class="cstat-no" title="statement not covered" > * reason: string</span>
1548
+ <span class="cstat-no" title="statement not covered" > * }&gt;}</span>
1549
+ <span class="cstat-no" title="statement not covered" > */</span>
1550
+ <span class="cstat-no" title="statement not covered" > async getInitialPublicSwapData(fromCoin, toCoin) {</span>
1551
+ <span class="cstat-no" title="statement not covered" > try {</span>
1552
+ <span class="cstat-no" title="statement not covered" > const result = await SwapUtils.getInitialSwapData(this._swapProvider, fromCoin, toCoin);</span>
1553
+ <span class="cstat-no" title="statement not covered" > if (!result.result) {</span>
1554
+ <span class="cstat-no" title="statement not covered" > if (result.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {</span>
1555
+ <span class="cstat-no" title="statement not covered" > SwapUtils.safeHandleRequestsLimitExceeding();</span>
1556
+ <span class="cstat-no" title="statement not covered" > return {</span>
1557
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1558
+ <span class="cstat-no" title="statement not covered" > reason: PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,</span>
1559
+ <span class="cstat-no" title="statement not covered" > };</span>
1560
+ <span class="cstat-no" title="statement not covered" > }</span>
1561
+ <span class="cstat-no" title="statement not covered" > if (result.reason === SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED) {</span>
1562
+ <span class="cstat-no" title="statement not covered" > return {</span>
1563
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1564
+ <span class="cstat-no" title="statement not covered" > reason: PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.PAIR_NOT_SUPPORTED,</span>
1565
+ <span class="cstat-no" title="statement not covered" > };</span>
1566
+ <span class="cstat-no" title="statement not covered" > }</span>
1567
+ <span class="cstat-no" title="statement not covered" > }</span>
1568
+ <span class="cstat-no" title="statement not covered" > return result;</span>
1569
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1570
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "getInitialPublicSwapData");</span>
1571
+ <span class="cstat-no" title="statement not covered" > }</span>
1572
+ <span class="cstat-no" title="statement not covered" > }</span>
1573
+ <span class="cstat-no" title="statement not covered" ></span>
1574
+ <span class="cstat-no" title="statement not covered" > /**</span>
1575
+ <span class="cstat-no" title="statement not covered" > * Retrieves swap details that can be used to create swap.</span>
1576
+ <span class="cstat-no" title="statement not covered" > *</span>
1577
+ <span class="cstat-no" title="statement not covered" > * @param fromCoin {Coin}</span>
1578
+ <span class="cstat-no" title="statement not covered" > * @param toCoin {Coin}</span>
1579
+ <span class="cstat-no" title="statement not covered" > * @param amountCoins {string}</span>
1580
+ <span class="cstat-no" title="statement not covered" > * @param [fixed=false] {boolean|null} null means fixed or float doesn't matter</span>
1581
+ <span class="cstat-no" title="statement not covered" > * @param [withoutFiat=false] {boolean} pass true if you don't need the fiat equivalent - this will diminish requests count</span>
1582
+ <span class="cstat-no" title="statement not covered" > * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount.</span>
1583
+ <span class="cstat-no" title="statement not covered" > * False means the amount is the sending amount.</span>
1584
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;{</span>
1585
+ <span class="cstat-no" title="statement not covered" > * result: false,</span>
1586
+ <span class="cstat-no" title="statement not covered" > * reason: string,</span>
1587
+ <span class="cstat-no" title="statement not covered" > * min: (string|null),</span>
1588
+ <span class="cstat-no" title="statement not covered" > * max: (string|null),</span>
1589
+ <span class="cstat-no" title="statement not covered" > * rate: (string|undefined),</span>
1590
+ <span class="cstat-no" title="statement not covered" > * fiatMin: (number|null),</span>
1591
+ <span class="cstat-no" title="statement not covered" > * fiatMax: (number|null)</span>
1592
+ <span class="cstat-no" title="statement not covered" > * }|{</span>
1593
+ <span class="cstat-no" title="statement not covered" > * result: true,</span>
1594
+ <span class="cstat-no" title="statement not covered" > * swapCreationInfo: BaseSwapCreationInfo</span>
1595
+ <span class="cstat-no" title="statement not covered" > * }&gt;}</span>
1596
+ <span class="cstat-no" title="statement not covered" > */</span>
1597
+ <span class="cstat-no" title="statement not covered" > async getPublicSwapDetails(</span>
1598
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1599
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1600
+ <span class="cstat-no" title="statement not covered" > amountCoins,</span>
1601
+ <span class="cstat-no" title="statement not covered" > fixed = false,</span>
1602
+ <span class="cstat-no" title="statement not covered" > withoutFiat = false,</span>
1603
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive = false</span>
1604
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1605
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "getPublicSwapDetails";</span>
1606
+ <span class="cstat-no" title="statement not covered" > try {</span>
1607
+ <span class="cstat-no" title="statement not covered" > if (amountIsToReceive &amp;&amp; !fixed) {</span>
1608
+ <span class="cstat-no" title="statement not covered" > throw new Error("Estimating allowed only for fixed rate.");</span>
1609
+ <span class="cstat-no" title="statement not covered" > }</span>
1610
+ <span class="cstat-no" title="statement not covered" ></span>
1611
+ <span class="cstat-no" title="statement not covered" > const coinUsdtRate = withoutFiat</span>
1612
+ <span class="cstat-no" title="statement not covered" > ? null</span>
1613
+ <span class="cstat-no" title="statement not covered" > : (</span>
1614
+ <span class="cstat-no" title="statement not covered" > await (fixed ? this._fixedSwapProvider : this._swapProvider).getCoinToUSDTRate(</span>
1615
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive ? toCoin : fromCoin</span>
1616
+ <span class="cstat-no" title="statement not covered" > )</span>
1617
+ <span class="cstat-no" title="statement not covered" > )?.rate ?? null;</span>
1618
+ <span class="cstat-no" title="statement not covered" > const details = await (fixed ? this._fixedSwapProvider : this._swapProvider).getSwapInfo(</span>
1619
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1620
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1621
+ <span class="cstat-no" title="statement not covered" > amountCoins,</span>
1622
+ <span class="cstat-no" title="statement not covered" > fixed,</span>
1623
+ <span class="cstat-no" title="statement not covered" > coinUsdtRate,</span>
1624
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive</span>
1625
+ <span class="cstat-no" title="statement not covered" > );</span>
1626
+ <span class="cstat-no" title="statement not covered" ></span>
1627
+ <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line no-console</span>
1628
+ <span class="cstat-no" title="statement not covered" > console.log("getSwapInfo result: ", details);</span>
1629
+ <span class="cstat-no" title="statement not covered" ></span>
1630
+ <span class="cstat-no" title="statement not covered" > const min =</span>
1631
+ <span class="cstat-no" title="statement not covered" > details.smallestMin != null &amp;&amp; BigNumber(details.smallestMin).gt("0") ? details.smallestMin : null;</span>
1632
+ <span class="cstat-no" title="statement not covered" > const max =</span>
1633
+ <span class="cstat-no" title="statement not covered" > details.greatestMax != null &amp;&amp; BigNumber(details.greatestMax).gt("0") ? details.greatestMax : null;</span>
1634
+ <span class="cstat-no" title="statement not covered" > let fiatMin = null,</span>
1635
+ <span class="cstat-no" title="statement not covered" > fiatMax = null;</span>
1636
+ <span class="cstat-no" title="statement not covered" > if (coinUsdtRate != null) {</span>
1637
+ <span class="cstat-no" title="statement not covered" > if (min != null) {</span>
1638
+ <span class="cstat-no" title="statement not covered" > fiatMin = BigNumber(min).times(coinUsdtRate).toFixed(PublicSwapService._fiatDecimalsCount);</span>
1639
+ <span class="cstat-no" title="statement not covered" > }</span>
1640
+ <span class="cstat-no" title="statement not covered" > if (max != null) {</span>
1641
+ <span class="cstat-no" title="statement not covered" > fiatMax = BigNumber(max).times(coinUsdtRate).toFixed(PublicSwapService._fiatDecimalsCount);</span>
1642
+ <span class="cstat-no" title="statement not covered" > }</span>
1643
+ <span class="cstat-no" title="statement not covered" > }</span>
1644
+ <span class="cstat-no" title="statement not covered" ></span>
1645
+ <span class="cstat-no" title="statement not covered" > const composeFailResult = reason =&gt; ({</span>
1646
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1647
+ <span class="cstat-no" title="statement not covered" > reason: reason,</span>
1648
+ <span class="cstat-no" title="statement not covered" > min: min ?? null,</span>
1649
+ <span class="cstat-no" title="statement not covered" > fiatMin: fiatMin,</span>
1650
+ <span class="cstat-no" title="statement not covered" > max: max ?? null,</span>
1651
+ <span class="cstat-no" title="statement not covered" > fiatMax: fiatMax,</span>
1652
+ <span class="cstat-no" title="statement not covered" > rate: details.rate ?? null,</span>
1653
+ <span class="cstat-no" title="statement not covered" > });</span>
1654
+ <span class="cstat-no" title="statement not covered" ></span>
1655
+ <span class="cstat-no" title="statement not covered" > if (!details.result) {</span>
1656
+ <span class="cstat-no" title="statement not covered" > if (details?.reason === SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED) {</span>
1657
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.PAIR_NOT_SUPPORTED);</span>
1658
+ <span class="cstat-no" title="statement not covered" > } else if (details?.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {</span>
1659
+ <span class="cstat-no" title="statement not covered" > SwapUtils.safeHandleRequestsLimitExceeding();</span>
1660
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED);</span>
1661
+ <span class="cstat-no" title="statement not covered" > } else if (details?.reason === SwapProvider.NO_SWAPS_REASONS.NO_FLOATING_BUT_HAVE_FIXED) {</span>
1662
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(</span>
1663
+ <span class="cstat-no" title="statement not covered" > PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.NO_FLOATING_BUT_HAVE_FIXED_PUBLIC_SWAP_OPTION</span>
1664
+ <span class="cstat-no" title="statement not covered" > );</span>
1665
+ <span class="cstat-no" title="statement not covered" > } else if (details?.reason === SwapProvider.NO_SWAPS_REASONS.NO_FIXED_BUT_HAVE_FLOATING) {</span>
1666
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(</span>
1667
+ <span class="cstat-no" title="statement not covered" > PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.NO_FIXED_BUT_HAVE_FLOATING_PUBLIC_SWAP_OPTION</span>
1668
+ <span class="cstat-no" title="statement not covered" > );</span>
1669
+ <span class="cstat-no" title="statement not covered" > }</span>
1670
+ <span class="cstat-no" title="statement not covered" > }</span>
1671
+ <span class="cstat-no" title="statement not covered" ></span>
1672
+ <span class="cstat-no" title="statement not covered" > const amountBigNumber = BigNumber(amountCoins);</span>
1673
+ <span class="cstat-no" title="statement not covered" > if (typeof min === "string" &amp;&amp; amountBigNumber.lt(min)) {</span>
1674
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(</span>
1675
+ <span class="cstat-no" title="statement not covered" > PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.AMOUNT_LESS_THAN_MIN_SWAPPABLE</span>
1676
+ <span class="cstat-no" title="statement not covered" > );</span>
1677
+ <span class="cstat-no" title="statement not covered" > } else if (typeof max === "string" &amp;&amp; amountBigNumber.gt(max)) {</span>
1678
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(</span>
1679
+ <span class="cstat-no" title="statement not covered" > PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.AMOUNT_HIGHER_THAN_MAX_SWAPPABLE</span>
1680
+ <span class="cstat-no" title="statement not covered" > );</span>
1681
+ <span class="cstat-no" title="statement not covered" > }</span>
1682
+ <span class="cstat-no" title="statement not covered" ></span>
1683
+ <span class="cstat-no" title="statement not covered" > const fromAmountCoins = amountIsToReceive</span>
1684
+ <span class="cstat-no" title="statement not covered" > ? AmountUtils.trim(amountBigNumber.div(details.rate), fromCoin.digits)</span>
1685
+ <span class="cstat-no" title="statement not covered" > : amountCoins;</span>
1686
+ <span class="cstat-no" title="statement not covered" > const toAmountCoins = amountIsToReceive</span>
1687
+ <span class="cstat-no" title="statement not covered" > ? amountCoins</span>
1688
+ <span class="cstat-no" title="statement not covered" > : AmountUtils.trim(amountBigNumber.times(details.rate), toCoin.digits);</span>
1689
+ <span class="cstat-no" title="statement not covered" > const result = {</span>
1690
+ <span class="cstat-no" title="statement not covered" > result: true,</span>
1691
+ <span class="cstat-no" title="statement not covered" > swapCreationInfo: new BaseSwapCreationInfo(</span>
1692
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1693
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1694
+ <span class="cstat-no" title="statement not covered" > fromAmountCoins,</span>
1695
+ <span class="cstat-no" title="statement not covered" > toAmountCoins,</span>
1696
+ <span class="cstat-no" title="statement not covered" > details.rate,</span>
1697
+ <span class="cstat-no" title="statement not covered" > details.rawSwapData,</span>
1698
+ <span class="cstat-no" title="statement not covered" > min,</span>
1699
+ <span class="cstat-no" title="statement not covered" > fiatMin,</span>
1700
+ <span class="cstat-no" title="statement not covered" > max,</span>
1701
+ <span class="cstat-no" title="statement not covered" > fiatMax,</span>
1702
+ <span class="cstat-no" title="statement not covered" > details.durationMinutesRange,</span>
1703
+ <span class="cstat-no" title="statement not covered" > details.fixed,</span>
1704
+ <span class="cstat-no" title="statement not covered" > details.isRefundAddressRequired</span>
1705
+ <span class="cstat-no" title="statement not covered" > ),</span>
1706
+ <span class="cstat-no" title="statement not covered" > };</span>
1707
+ <span class="cstat-no" title="statement not covered" > Logger.log(</span>
1708
+ <span class="cstat-no" title="statement not covered" > `Result: ${safeStringify({</span>
1709
+ <span class="cstat-no" title="statement not covered" > result: result.result,</span>
1710
+ <span class="cstat-no" title="statement not covered" > swapCreationInfo: {</span>
1711
+ <span class="cstat-no" title="statement not covered" > ...result.swapCreationInfo,</span>
1712
+ <span class="cstat-no" title="statement not covered" > fromCoin: result?.swapCreationInfo?.fromCoin?.ticker,</span>
1713
+ <span class="cstat-no" title="statement not covered" > toCoin: result?.swapCreationInfo?.toCoin?.ticker,</span>
1714
+ <span class="cstat-no" title="statement not covered" > },</span>
1715
+ <span class="cstat-no" title="statement not covered" > })}`,</span>
1716
+ <span class="cstat-no" title="statement not covered" > loggerSource</span>
1717
+ <span class="cstat-no" title="statement not covered" > );</span>
1718
+ <span class="cstat-no" title="statement not covered" ></span>
1719
+ <span class="cstat-no" title="statement not covered" > return result;</span>
1720
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1721
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, loggerSource);</span>
1722
+ <span class="cstat-no" title="statement not covered" > }</span>
1723
+ <span class="cstat-no" title="statement not covered" > }</span>
1724
+ <span class="cstat-no" title="statement not covered" ></span>
1725
+ <span class="cstat-no" title="statement not covered" > /**</span>
1726
+ <span class="cstat-no" title="statement not covered" > * Creates swap by given params.</span>
1727
+ <span class="cstat-no" title="statement not covered" > *</span>
1728
+ <span class="cstat-no" title="statement not covered" > * @param fromCoin {Coin}</span>
1729
+ <span class="cstat-no" title="statement not covered" > * @param toCoin {Coin}</span>
1730
+ <span class="cstat-no" title="statement not covered" > * @param amount {string}</span>
1731
+ <span class="cstat-no" title="statement not covered" > * @param swapCreationInfo {BaseSwapCreationInfo}</span>
1732
+ <span class="cstat-no" title="statement not covered" > * @param toAddress {string}</span>
1733
+ <span class="cstat-no" title="statement not covered" > * @param refundAddress {string}</span>
1734
+ <span class="cstat-no" title="statement not covered" > * @param clientIp {string}</span>
1735
+ <span class="cstat-no" title="statement not covered" > * @param [toCurrencyExtraId] {string}</span>
1736
+ <span class="cstat-no" title="statement not covered" > * @param [refundExtraId] {string}</span>
1737
+ <span class="cstat-no" title="statement not covered" > * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount.</span>
1738
+ <span class="cstat-no" title="statement not covered" > * False means the amount is the sending amount.</span>
1739
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;{</span>
1740
+ <span class="cstat-no" title="statement not covered" > * result: true,</span>
1741
+ <span class="cstat-no" title="statement not covered" > * fiatCurrencyCode: string,</span>
1742
+ <span class="cstat-no" title="statement not covered" > * toCoin: Coin,</span>
1743
+ <span class="cstat-no" title="statement not covered" > * fromAmountFiat: (number|null),</span>
1744
+ <span class="cstat-no" title="statement not covered" > * address: string,</span>
1745
+ <span class="cstat-no" title="statement not covered" > * durationMinutesRange: string,</span>
1746
+ <span class="cstat-no" title="statement not covered" > * fromAmount: string,</span>
1747
+ <span class="cstat-no" title="statement not covered" > * toAmount: string,</span>
1748
+ <span class="cstat-no" title="statement not covered" > * toAmountFiat: (number|null),</span>
1749
+ <span class="cstat-no" title="statement not covered" > * fiatCurrencyDecimals: number,</span>
1750
+ <span class="cstat-no" title="statement not covered" > * fromCoin: Coin,</span>
1751
+ <span class="cstat-no" title="statement not covered" > * rate: string,</span>
1752
+ <span class="cstat-no" title="statement not covered" > * swapId: string,</span>
1753
+ <span class="cstat-no" title="statement not covered" > * fromCurrencyExtraId: string,</span>
1754
+ <span class="cstat-no" title="statement not covered" > * fixed: boolean</span>
1755
+ <span class="cstat-no" title="statement not covered" > * }|{</span>
1756
+ <span class="cstat-no" title="statement not covered" > * result: false,</span>
1757
+ <span class="cstat-no" title="statement not covered" > * reason: string</span>
1758
+ <span class="cstat-no" title="statement not covered" > * }&gt;}</span>
1759
+ <span class="cstat-no" title="statement not covered" > */</span>
1760
+ <span class="cstat-no" title="statement not covered" > async createPublicSwap(</span>
1761
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1762
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1763
+ <span class="cstat-no" title="statement not covered" > amount,</span>
1764
+ <span class="cstat-no" title="statement not covered" > swapCreationInfo,</span>
1765
+ <span class="cstat-no" title="statement not covered" > toAddress,</span>
1766
+ <span class="cstat-no" title="statement not covered" > refundAddress,</span>
1767
+ <span class="cstat-no" title="statement not covered" > clientIp,</span>
1768
+ <span class="cstat-no" title="statement not covered" > toCurrencyExtraId,</span>
1769
+ <span class="cstat-no" title="statement not covered" > refundExtraId,</span>
1770
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive = false</span>
1771
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1772
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "createPublicSwap";</span>
1773
+ <span class="cstat-no" title="statement not covered" > try {</span>
1774
+ <span class="cstat-no" title="statement not covered" > if (</span>
1775
+ <span class="cstat-no" title="statement not covered" > !(fromCoin instanceof Coin) ||</span>
1776
+ <span class="cstat-no" title="statement not covered" > !(toCoin instanceof Coin) ||</span>
1777
+ <span class="cstat-no" title="statement not covered" > typeof amount !== "string" ||</span>
1778
+ <span class="cstat-no" title="statement not covered" > typeof toAddress !== "string" ||</span>
1779
+ <span class="cstat-no" title="statement not covered" > (swapCreationInfo.isRefundAddressRequired &amp;&amp;</span>
1780
+ <span class="cstat-no" title="statement not covered" > (typeof refundAddress !== "string" || refundAddress.length === 0)) ||</span>
1781
+ <span class="cstat-no" title="statement not covered" > !(swapCreationInfo instanceof BaseSwapCreationInfo)</span>
1782
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1783
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Wrong input: ${fromCoin.ticker} ${toCoin.ticker} ${amount} ${swapCreationInfo}`);</span>
1784
+ <span class="cstat-no" title="statement not covered" > }</span>
1785
+ <span class="cstat-no" title="statement not covered" > Logger.log(</span>
1786
+ <span class="cstat-no" title="statement not covered" > `Start: ${amount} ${fromCoin.ticker} -&gt; ${toCoin.ticker}. Details: ${safeStringify({</span>
1787
+ <span class="cstat-no" title="statement not covered" > ...swapCreationInfo,</span>
1788
+ <span class="cstat-no" title="statement not covered" > fromCoin: swapCreationInfo?.fromCoin?.ticker,</span>
1789
+ <span class="cstat-no" title="statement not covered" > toCoin: swapCreationInfo?.toCoin?.ticker,</span>
1790
+ <span class="cstat-no" title="statement not covered" > })}`,</span>
1791
+ <span class="cstat-no" title="statement not covered" > loggerSource</span>
1792
+ <span class="cstat-no" title="statement not covered" > );</span>
1793
+ <span class="cstat-no" title="statement not covered" ></span>
1794
+ <span class="cstat-no" title="statement not covered" > const result = await (swapCreationInfo.fixed ? this._fixedSwapProvider : this._swapProvider).createSwap(</span>
1795
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1796
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1797
+ <span class="cstat-no" title="statement not covered" > amount,</span>
1798
+ <span class="cstat-no" title="statement not covered" > toAddress,</span>
1799
+ <span class="cstat-no" title="statement not covered" > refundAddress,</span>
1800
+ <span class="cstat-no" title="statement not covered" > swapCreationInfo.rawSwapData,</span>
1801
+ <span class="cstat-no" title="statement not covered" > clientIp,</span>
1802
+ <span class="cstat-no" title="statement not covered" > swapCreationInfo.fixed,</span>
1803
+ <span class="cstat-no" title="statement not covered" > toCurrencyExtraId,</span>
1804
+ <span class="cstat-no" title="statement not covered" > refundExtraId,</span>
1805
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive</span>
1806
+ <span class="cstat-no" title="statement not covered" > );</span>
1807
+ <span class="cstat-no" title="statement not covered" > Logger.log(</span>
1808
+ <span class="cstat-no" title="statement not covered" > `Created:${safeStringify({</span>
1809
+ <span class="cstat-no" title="statement not covered" > ...result,</span>
1810
+ <span class="cstat-no" title="statement not covered" > fromCoin: fromCoin?.ticker,</span>
1811
+ <span class="cstat-no" title="statement not covered" > toCoin: toCoin?.ticker,</span>
1812
+ <span class="cstat-no" title="statement not covered" > })}`,</span>
1813
+ <span class="cstat-no" title="statement not covered" > loggerSource</span>
1814
+ <span class="cstat-no" title="statement not covered" > );</span>
1815
+ <span class="cstat-no" title="statement not covered" > if (!result?.result) {</span>
1816
+ <span class="cstat-no" title="statement not covered" > if (result?.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {</span>
1817
+ <span class="cstat-no" title="statement not covered" > SwapUtils.safeHandleRequestsLimitExceeding();</span>
1818
+ <span class="cstat-no" title="statement not covered" > return {</span>
1819
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1820
+ <span class="cstat-no" title="statement not covered" > reason: PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,</span>
1821
+ <span class="cstat-no" title="statement not covered" > };</span>
1822
+ <span class="cstat-no" title="statement not covered" > }</span>
1823
+ <span class="cstat-no" title="statement not covered" > if (result?.reason === SwapProvider.CREATION_FAIL_REASONS.RETRIABLE_FAIL) {</span>
1824
+ <span class="cstat-no" title="statement not covered" > // TODO: [feature, high] implement retrying if one partner fail and we have another partners task_id=a07e367e488f4a4899613ac9056fa359</span>
1825
+ <span class="cstat-no" title="statement not covered" > // return {</span>
1826
+ <span class="cstat-no" title="statement not covered" > // result: false,</span>
1827
+ <span class="cstat-no" title="statement not covered" > // reason: PublicSwapService.SWAP_CREATION_FAIL_REASONS.RETRIABLE_FAIL,</span>
1828
+ <span class="cstat-no" title="statement not covered" > // };</span>
1829
+ <span class="cstat-no" title="statement not covered" > }</span>
1830
+ <span class="cstat-no" title="statement not covered" > }</span>
1831
+ <span class="cstat-no" title="statement not covered" > if (result.result &amp;&amp; result?.swapId) {</span>
1832
+ <span class="cstat-no" title="statement not covered" > let fromAmountFiat = null,</span>
1833
+ <span class="cstat-no" title="statement not covered" > toAmountFiat = null;</span>
1834
+ <span class="cstat-no" title="statement not covered" > try {</span>
1835
+ <span class="cstat-no" title="statement not covered" > const fromCoinUsdtRate = (await this._swapProvider.getCoinToUSDTRate(fromCoin))?.rate ?? null;</span>
1836
+ <span class="cstat-no" title="statement not covered" > const toCoinUsdtRate = (await this._swapProvider.getCoinToUSDTRate(fromCoin))?.rate ?? null;</span>
1837
+ <span class="cstat-no" title="statement not covered" > if (fromCoinUsdtRate != null &amp;&amp; result.fromAmount != null) {</span>
1838
+ <span class="cstat-no" title="statement not covered" > fromAmountFiat = BigNumber(result.fromAmount)</span>
1839
+ <span class="cstat-no" title="statement not covered" > .times(fromCoinUsdtRate)</span>
1840
+ <span class="cstat-no" title="statement not covered" > .toFixed(PublicSwapService._fiatDecimalsCount);</span>
1841
+ <span class="cstat-no" title="statement not covered" > }</span>
1842
+ <span class="cstat-no" title="statement not covered" > if (toCoinUsdtRate != null &amp;&amp; result.toAmount != null) {</span>
1843
+ <span class="cstat-no" title="statement not covered" > toAmountFiat = BigNumber(result.toAmount)</span>
1844
+ <span class="cstat-no" title="statement not covered" > .times(toCoinUsdtRate)</span>
1845
+ <span class="cstat-no" title="statement not covered" > .toFixed(PublicSwapService._fiatDecimalsCount);</span>
1846
+ <span class="cstat-no" title="statement not covered" > }</span>
1847
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1848
+ <span class="cstat-no" title="statement not covered" > Logger.logError(e, loggerSource, "Failed to calculate fiat amounts for result");</span>
1849
+ <span class="cstat-no" title="statement not covered" > }</span>
1850
+ <span class="cstat-no" title="statement not covered" ></span>
1851
+ <span class="cstat-no" title="statement not covered" > // TODO: feature, cirtical] add GA event. task_id=091004f1b6b748b29ddece6a130df904</span>
1852
+ <span class="cstat-no" title="statement not covered" > EventBusInstance.dispatch(</span>
1853
+ <span class="cstat-no" title="statement not covered" > PublicSwapService.PUBLIC_SWAP_CREATED_EVENT,</span>
1854
+ <span class="cstat-no" title="statement not covered" > null,</span>
1855
+ <span class="cstat-no" title="statement not covered" > fromCoin.ticker,</span>
1856
+ <span class="cstat-no" title="statement not covered" > toCoin.ticker,</span>
1857
+ <span class="cstat-no" title="statement not covered" > fromAmountFiat</span>
1858
+ <span class="cstat-no" title="statement not covered" > );</span>
1859
+ <span class="cstat-no" title="statement not covered" ></span>
1860
+ <span class="cstat-no" title="statement not covered" > const toReturn = {</span>
1861
+ <span class="cstat-no" title="statement not covered" > result: true,</span>
1862
+ <span class="cstat-no" title="statement not covered" > swapId: result.swapId,</span>
1863
+ <span class="cstat-no" title="statement not covered" > fromCoin: fromCoin,</span>
1864
+ <span class="cstat-no" title="statement not covered" > toCoin: toCoin,</span>
1865
+ <span class="cstat-no" title="statement not covered" > fromAmount: result.fromAmount,</span>
1866
+ <span class="cstat-no" title="statement not covered" > toAmount: result.toAmount,</span>
1867
+ <span class="cstat-no" title="statement not covered" > fromAmountFiat: fromAmountFiat,</span>
1868
+ <span class="cstat-no" title="statement not covered" > toAmountFiat: toAmountFiat,</span>
1869
+ <span class="cstat-no" title="statement not covered" > fiatCurrencyCode: "USD",</span>
1870
+ <span class="cstat-no" title="statement not covered" > fiatCurrencyDecimals: PublicSwapService._fiatDecimalsCount,</span>
1871
+ <span class="cstat-no" title="statement not covered" > rate: result.rate,</span>
1872
+ <span class="cstat-no" title="statement not covered" > durationMinutesRange: swapCreationInfo.durationMinutesRange,</span>
1873
+ <span class="cstat-no" title="statement not covered" > address: result.fromAddress, // CRITICAL: this is the address to send coins to swaps provider</span>
1874
+ <span class="cstat-no" title="statement not covered" > fromCurrencyExtraId: result.fromCurrencyExtraId ?? "", // CRITICAL: this is the extra ID for address to send coins to swaps provider</span>
1875
+ <span class="cstat-no" title="statement not covered" > fixed: result.fixed,</span>
1876
+ <span class="cstat-no" title="statement not covered" > };</span>
1877
+ <span class="cstat-no" title="statement not covered" ></span>
1878
+ <span class="cstat-no" title="statement not covered" > this._savePublicSwapIdLocally(result.swapId);</span>
1879
+ <span class="cstat-no" title="statement not covered" ></span>
1880
+ <span class="cstat-no" title="statement not covered" > Logger.log(</span>
1881
+ <span class="cstat-no" title="statement not covered" > `Returning: ${safeStringify({</span>
1882
+ <span class="cstat-no" title="statement not covered" > ...toReturn,</span>
1883
+ <span class="cstat-no" title="statement not covered" > fromCoin: fromCoin?.ticker,</span>
1884
+ <span class="cstat-no" title="statement not covered" > toCoin: toCoin?.ticker,</span>
1885
+ <span class="cstat-no" title="statement not covered" > })}`,</span>
1886
+ <span class="cstat-no" title="statement not covered" > loggerSource</span>
1887
+ <span class="cstat-no" title="statement not covered" > );</span>
1888
+ <span class="cstat-no" title="statement not covered" > return toReturn;</span>
1889
+ <span class="cstat-no" title="statement not covered" > }</span>
1890
+ <span class="cstat-no" title="statement not covered" ></span>
1891
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Unexpected result from provider ${safeStringify(result)}`);</span>
1892
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1893
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, loggerSource);</span>
1894
+ <span class="cstat-no" title="statement not covered" > }</span>
1895
+ <span class="cstat-no" title="statement not covered" > }</span>
1896
+ <span class="cstat-no" title="statement not covered" ></span>
1897
+ <span class="cstat-no" title="statement not covered" > /**</span>
1898
+ <span class="cstat-no" title="statement not covered" > * Retrieves swap details and status for existing swaps by their ids.</span>
1899
+ <span class="cstat-no" title="statement not covered" > *</span>
1900
+ <span class="cstat-no" title="statement not covered" > * @param swapIds {string[]}</span>
1901
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;{</span>
1902
+ <span class="cstat-no" title="statement not covered" > * result: true,</span>
1903
+ <span class="cstat-no" title="statement not covered" > * swaps: ExistingSwapWithFiatData[]</span>
1904
+ <span class="cstat-no" title="statement not covered" > * }|{</span>
1905
+ <span class="cstat-no" title="statement not covered" > * result: false,</span>
1906
+ <span class="cstat-no" title="statement not covered" > * reason: string</span>
1907
+ <span class="cstat-no" title="statement not covered" > * }&gt;}</span>
1908
+ <span class="cstat-no" title="statement not covered" > * error reason is one of PUBLIC_SWAPS_COMMON_ERRORS</span>
1909
+ <span class="cstat-no" title="statement not covered" > */</span>
1910
+ <span class="cstat-no" title="statement not covered" > async getPublicExistingSwapDetailsAndStatus(swapIds) {</span>
1911
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "getPublicExistingSwapDetailsAndStatus";</span>
1912
+ <span class="cstat-no" title="statement not covered" > try {</span>
1913
+ <span class="cstat-no" title="statement not covered" > const result = await SwapUtils.getExistingSwapsDetailsWithFiatAmounts(</span>
1914
+ <span class="cstat-no" title="statement not covered" > [this._swapProvider, this._fixedSwapProvider],</span>
1915
+ <span class="cstat-no" title="statement not covered" > swapIds</span>
1916
+ <span class="cstat-no" title="statement not covered" > );</span>
1917
+ <span class="cstat-no" title="statement not covered" > if (!result?.result) {</span>
1918
+ <span class="cstat-no" title="statement not covered" > if (result.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {</span>
1919
+ <span class="cstat-no" title="statement not covered" > SwapUtils.safeHandleRequestsLimitExceeding();</span>
1920
+ <span class="cstat-no" title="statement not covered" > return {</span>
1921
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1922
+ <span class="cstat-no" title="statement not covered" > reason: PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,</span>
1923
+ <span class="cstat-no" title="statement not covered" > };</span>
1924
+ <span class="cstat-no" title="statement not covered" > }</span>
1925
+ <span class="cstat-no" title="statement not covered" > throw new Error("Unknown reason: " + result?.reason);</span>
1926
+ <span class="cstat-no" title="statement not covered" > }</span>
1927
+ <span class="cstat-no" title="statement not covered" ></span>
1928
+ <span class="cstat-no" title="statement not covered" > return result;</span>
1929
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1930
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, loggerSource);</span>
1931
+ <span class="cstat-no" title="statement not covered" > }</span>
1932
+ <span class="cstat-no" title="statement not covered" > }</span>
1933
+ <span class="cstat-no" title="statement not covered" ></span>
1934
+ <span class="cstat-no" title="statement not covered" > /**</span>
1935
+ <span class="cstat-no" title="statement not covered" > * Retrieves the whole available swaps history by ids saved locally.</span>
1936
+ <span class="cstat-no" title="statement not covered" > *</span>
1937
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;{</span>
1938
+ <span class="cstat-no" title="statement not covered" > * result: true,</span>
1939
+ <span class="cstat-no" title="statement not covered" > * swaps: ExistingSwapWithFiatData[]</span>
1940
+ <span class="cstat-no" title="statement not covered" > * }|{</span>
1941
+ <span class="cstat-no" title="statement not covered" > * result: false,</span>
1942
+ <span class="cstat-no" title="statement not covered" > * reason: string</span>
1943
+ <span class="cstat-no" title="statement not covered" > * }&gt;}</span>
1944
+ <span class="cstat-no" title="statement not covered" > */</span>
1945
+ <span class="cstat-no" title="statement not covered" > async getPublicSwapsHistory() {</span>
1946
+ <span class="cstat-no" title="statement not covered" > try {</span>
1947
+ <span class="cstat-no" title="statement not covered" > const swapIds = this._getPublicSwapIdsSavedLocally();</span>
1948
+ <span class="cstat-no" title="statement not covered" > if (swapIds.length) {</span>
1949
+ <span class="cstat-no" title="statement not covered" > return await this.getPublicExistingSwapDetailsAndStatus(swapIds);</span>
1950
+ <span class="cstat-no" title="statement not covered" > }</span>
1951
+ <span class="cstat-no" title="statement not covered" > return { result: true, swaps: [] };</span>
1952
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1953
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "getPublicSwapsHistory");</span>
1954
+ <span class="cstat-no" title="statement not covered" > }</span>
1955
+ <span class="cstat-no" title="statement not covered" > }</span>
1956
+ <span class="cstat-no" title="statement not covered" ></span>
1957
+ <span class="cstat-no" title="statement not covered" > /**</span>
1958
+ <span class="cstat-no" title="statement not covered" > * @param swapId {string}</span>
1959
+ <span class="cstat-no" title="statement not covered" > * @private</span>
1960
+ <span class="cstat-no" title="statement not covered" > */</span>
1961
+ <span class="cstat-no" title="statement not covered" > _savePublicSwapIdLocally(swapId) {</span>
1962
+ <span class="cstat-no" title="statement not covered" > if (typeof window !== "undefined") {</span>
1963
+ <span class="cstat-no" title="statement not covered" > try {</span>
1964
+ <span class="cstat-no" title="statement not covered" > const saved = localStorage.getItem("publicSwapIds");</span>
1965
+ <span class="cstat-no" title="statement not covered" > const ids = typeof saved === "string" &amp;&amp; saved.length &gt; 0 ? saved.split(",") : [];</span>
1966
+ <span class="cstat-no" title="statement not covered" > ids.push(swapId);</span>
1967
+ <span class="cstat-no" title="statement not covered" > localStorage.setItem("publicSwapIds", ids.join(","));</span>
1968
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1969
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "_savePublicSwapIdLocally");</span>
1970
+ <span class="cstat-no" title="statement not covered" > }</span>
1971
+ <span class="cstat-no" title="statement not covered" > }</span>
1972
+ <span class="cstat-no" title="statement not covered" > }</span>
1973
+ <span class="cstat-no" title="statement not covered" ></span>
1974
+ <span class="cstat-no" title="statement not covered" > /**</span>
1975
+ <span class="cstat-no" title="statement not covered" > * @private</span>
1976
+ <span class="cstat-no" title="statement not covered" > * @return {string[]}</span>
1977
+ <span class="cstat-no" title="statement not covered" > */</span>
1978
+ <span class="cstat-no" title="statement not covered" > _getPublicSwapIdsSavedLocally() {</span>
1979
+ <span class="cstat-no" title="statement not covered" > if (typeof window !== "undefined") {</span>
1980
+ <span class="cstat-no" title="statement not covered" > try {</span>
1981
+ <span class="cstat-no" title="statement not covered" > const saved = localStorage.getItem("publicSwapIds");</span>
1982
+ <span class="cstat-no" title="statement not covered" > return typeof saved === "string" &amp;&amp; saved.length &gt; 0 ? saved.split(",") : [];</span>
1983
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1984
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "_getPublicSwapIdsSavedLocally");</span>
1985
+ <span class="cstat-no" title="statement not covered" > }</span>
1986
+ <span class="cstat-no" title="statement not covered" > }</span>
1987
+ <span class="cstat-no" title="statement not covered" > }</span>
1988
+ <span class="cstat-no" title="statement not covered" ></span>
1989
+ <span class="cstat-no" title="statement not covered" > /**</span>
1990
+ <span class="cstat-no" title="statement not covered" > * @param coinOrTicker {Coin|string}</span>
1991
+ <span class="cstat-no" title="statement not covered" > * @param [isFixed=true] {boolean} rate type</span>
1992
+ <span class="cstat-no" title="statement not covered" > * @return {string} icon URL (ready to use)</span>
1993
+ <span class="cstat-no" title="statement not covered" > */</span>
1994
+ <span class="cstat-no" title="statement not covered" > getAssetIconUrl(coinOrTicker, isFixed = false) {</span>
1995
+ <span class="cstat-no" title="statement not covered" > // TODO: [feature, high] improve this logic - currently hacked to show better icons from fixed provider. task_id=3b6b8c2a9df04a86aaff2e070424b64f</span>
1996
+ <span class="cstat-no" title="statement not covered" > return this._fixedSwapProvider.getIconUrl(coinOrTicker);</span>
1997
+ <span class="cstat-no" title="statement not covered" > }</span>
1998
+ <span class="cstat-no" title="statement not covered" ></span>
1999
+ <span class="cstat-no" title="statement not covered" > /**</span>
2000
+ <span class="cstat-no" title="statement not covered" > * @param ticker {string}</span>
2001
+ <span class="cstat-no" title="statement not covered" > * @param [fixed=false] {boolean}</span>
2002
+ <span class="cstat-no" title="statement not covered" > * @return {Coin|null}</span>
2003
+ <span class="cstat-no" title="statement not covered" > */</span>
2004
+ <span class="cstat-no" title="statement not covered" > getCoinByTickerIfPresent(ticker, fixed = false) {</span>
2005
+ <span class="cstat-no" title="statement not covered" > return !fixed</span>
2006
+ <span class="cstat-no" title="statement not covered" > ? this._swapProvider.getCoinByTickerIfPresent(ticker)</span>
2007
+ <span class="cstat-no" title="statement not covered" > : this._fixedSwapProvider.getCoinByTickerIfPresent(ticker);</span>
2008
+ <span class="cstat-no" title="statement not covered" > }</span>
2009
+ <span class="cstat-no" title="statement not covered" ></span>
2010
+ <span class="cstat-no" title="statement not covered" > /**</span>
2011
+ <span class="cstat-no" title="statement not covered" > * TODO: [feature, moderate] add other fiat currencies support. task_id=5490e21b8b9c4f89a2247b28db3c9e0a</span>
2012
+ <span class="cstat-no" title="statement not covered" > * @param asset {Coin}</span>
2013
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;string|null&gt;}</span>
2014
+ <span class="cstat-no" title="statement not covered" > */</span>
2015
+ <span class="cstat-no" title="statement not covered" > async getAssetToUsdtRate(asset) {</span>
2016
+ <span class="cstat-no" title="statement not covered" > try {</span>
2017
+ <span class="cstat-no" title="statement not covered" > let result = await this._swapProvider.getCoinToUSDTRate(asset);</span>
2018
+ <span class="cstat-no" title="statement not covered" > if (result?.rate == null) {</span>
2019
+ <span class="cstat-no" title="statement not covered" > result = await this._fixedSwapProvider.getCoinToUSDTRate(asset);</span>
2020
+ <span class="cstat-no" title="statement not covered" > }</span>
2021
+ <span class="cstat-no" title="statement not covered" > return result?.rate ?? null;</span>
2022
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
2023
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "getAssetToUsdtRate");</span>
2024
+ <span class="cstat-no" title="statement not covered" > }</span>
2025
+ <span class="cstat-no" title="statement not covered" > }</span>
2026
+ <span class="cstat-no" title="statement not covered" ></span>
2027
+ <span class="cstat-no" title="statement not covered" > /**</span>
2028
+ <span class="cstat-no" title="statement not covered" > * @param asset {Coin}</span>
2029
+ <span class="cstat-no" title="statement not covered" > * @param address {string}</span>
2030
+ <span class="cstat-no" title="statement not covered" > * @param [fixed=false] {boolean}</span>
2031
+ <span class="cstat-no" title="statement not covered" > * @return {boolean}</span>
2032
+ <span class="cstat-no" title="statement not covered" > */</span>
2033
+ <span class="cstat-no" title="statement not covered" > isAddressValidForAsset(asset, address, fixed = false) {</span>
2034
+ <span class="cstat-no" title="statement not covered" > try {</span>
2035
+ <span class="cstat-no" title="statement not covered" > return !fixed</span>
2036
+ <span class="cstat-no" title="statement not covered" > ? this._swapProvider.isAddressValidForAsset(asset, address)</span>
2037
+ <span class="cstat-no" title="statement not covered" > : this._fixedSwapProvider.isAddressValidForAsset(asset, address);</span>
2038
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
2039
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "isAddressValidForAsset");</span>
2040
+ <span class="cstat-no" title="statement not covered" > }</span>
2041
+ <span class="cstat-no" title="statement not covered" > }</span>
2042
+ <span class="cstat-no" title="statement not covered" ></span>
2043
+ <span class="cstat-no" title="statement not covered" > /**</span>
2044
+ <span class="cstat-no" title="statement not covered" > * Retrieves token by contract address.</span>
2045
+ <span class="cstat-no" title="statement not covered" > *</span>
2046
+ <span class="cstat-no" title="statement not covered" > * @param addressString {string}</span>
2047
+ <span class="cstat-no" title="statement not covered" > * @param [fixed=false] {boolean}</span>
2048
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;Coin|null&gt;}</span>
2049
+ <span class="cstat-no" title="statement not covered" > */</span>
2050
+ <span class="cstat-no" title="statement not covered" > async getTokenByContractAddress(addressString, fixed = false) {</span>
2051
+ <span class="cstat-no" title="statement not covered" > try {</span>
2052
+ <span class="cstat-no" title="statement not covered" > if (!addressString) return null;</span>
2053
+ <span class="cstat-no" title="statement not covered" > const addressLowerCase = addressString.toLowerCase();</span>
2054
+ <span class="cstat-no" title="statement not covered" > const allCoins = await (fixed ? this._fixedSwapProvider : this._swapProvider).getAllSupportedCurrencies();</span>
2055
+ <span class="cstat-no" title="statement not covered" > if (allCoins.result) {</span>
2056
+ <span class="cstat-no" title="statement not covered" > return allCoins.coins.find(</span>
2057
+ <span class="cstat-no" title="statement not covered" > coin =&gt; coin.tokenAddress &amp;&amp; coin.tokenAddress.toLowerCase() === addressLowerCase</span>
2058
+ <span class="cstat-no" title="statement not covered" > );</span>
2059
+ <span class="cstat-no" title="statement not covered" > }</span>
2060
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
2061
+ <span class="cstat-no" title="statement not covered" > Logger.logError(e, "getTokenByContractAddress");</span>
2062
+ <span class="cstat-no" title="statement not covered" > }</span>
2063
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2064
+ <span class="cstat-no" title="statement not covered" > }</span>
2065
+ <span class="cstat-no" title="statement not covered" ></span>
2066
+ <span class="cstat-no" title="statement not covered" > /**</span>
2067
+ <span class="cstat-no" title="statement not covered" > * @param asset {Coin}</span>
2068
+ <span class="cstat-no" title="statement not covered" > * @param [fixed=false] {boolean}</span>
2069
+ <span class="cstat-no" title="statement not covered" > * @return {string|null}</span>
2070
+ <span class="cstat-no" title="statement not covered" > */</span>
2071
+ <span class="cstat-no" title="statement not covered" > getExtraIdNameIfPresentForAsset(asset, fixed = false) {</span>
2072
+ <span class="cstat-no" title="statement not covered" > try {</span>
2073
+ <span class="cstat-no" title="statement not covered" > return (fixed ? this._fixedSwapProvider : this._swapProvider).getExtraIdNameIfPresent(asset);</span>
2074
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
2075
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "getExtraIdNameIfPresentForAsset");</span>
2076
+ <span class="cstat-no" title="statement not covered" > }</span>
2077
+ <span class="cstat-no" title="statement not covered" > }</span>
2078
+ <span class="cstat-no" title="statement not covered" >}</span>
2079
+ &nbsp;</pre></td></tr></table></pre>
2080
+
2081
+ <div class='push'></div><!-- for sticky footer -->
2082
+ </div><!-- /wrapper -->
2083
+ <div class='footer quiet pad2 space-top1 center small'>
2084
+ Code coverage generated by
2085
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2086
+ at 2024-07-05T22:41:43.517Z
2087
+ </div>
2088
+ <script src="../../../../prettify.js"></script>
2089
+ <script>
2090
+ window.onload = function () {
2091
+ prettyPrint();
2092
+ };
2093
+ </script>
2094
+ <script src="../../../../sorter.js"></script>
2095
+ <script src="../../../../block-navigation.js"></script>
2096
+ </body>
2097
+ </html>
2098
+