@rabbitio/ui-kit 1.0.0-beta.12 → 1.0.0-beta.121

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 (402) hide show
  1. package/.env.example +1 -0
  2. package/.gitlab-ci.yml +29 -0
  3. package/.husky/commit-msg +19 -0
  4. package/.husky/pre-push +1 -0
  5. package/README.md +14 -4
  6. package/coverage/base.css +224 -0
  7. package/coverage/block-navigation.js +87 -0
  8. package/coverage/clover.xml +19749 -0
  9. package/coverage/coverage-final.json +122 -0
  10. package/coverage/favicon.png +0 -0
  11. package/coverage/index.html +1001 -0
  12. package/coverage/prettify.css +1 -0
  13. package/coverage/prettify.js +2 -0
  14. package/coverage/rabbit-ui-kit/index.html +116 -0
  15. package/coverage/rabbit-ui-kit/index.js.html +88 -0
  16. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/googleAnalyticsAdapter.js.html +151 -0
  17. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/index.html +146 -0
  18. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/metrikaAdapter.js.html +172 -0
  19. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/mixpanelAdapter.js.html +199 -0
  20. package/coverage/rabbit-ui-kit/src/common-apis/adapters/axiosAdapter.js.html +190 -0
  21. package/coverage/rabbit-ui-kit/src/common-apis/adapters/index.html +131 -0
  22. package/coverage/rabbit-ui-kit/src/common-apis/adapters/qrUtils.js.html +139 -0
  23. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/apiGroups.js.html +253 -0
  24. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/emailAPI.js.html +133 -0
  25. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/index.html +146 -0
  26. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/ipAddressProviders.js.html +391 -0
  27. package/coverage/rabbit-ui-kit/src/common-apis/globalConstants.jsx.html +94 -0
  28. package/coverage/rabbit-ui-kit/src/common-apis/index.html +116 -0
  29. package/coverage/rabbit-ui-kit/src/common-apis/models/blockchain.js.html +115 -0
  30. package/coverage/rabbit-ui-kit/src/common-apis/models/coin.js.html +829 -0
  31. package/coverage/rabbit-ui-kit/src/common-apis/models/index.html +146 -0
  32. package/coverage/rabbit-ui-kit/src/common-apis/models/protocol.js.html +100 -0
  33. package/coverage/rabbit-ui-kit/src/common-apis/services/fiatCurrenciesService.js.html +544 -0
  34. package/coverage/rabbit-ui-kit/src/common-apis/services/index.html +116 -0
  35. package/coverage/rabbit-ui-kit/src/common-apis/utils/amountUtils.js.html +1234 -0
  36. package/coverage/rabbit-ui-kit/src/common-apis/utils/cache.js.html +811 -0
  37. package/coverage/rabbit-ui-kit/src/common-apis/utils/errorUtils.js.html +211 -0
  38. package/coverage/rabbit-ui-kit/src/common-apis/utils/index.html +191 -0
  39. package/coverage/rabbit-ui-kit/src/common-apis/utils/logging/index.html +131 -0
  40. package/coverage/rabbit-ui-kit/src/common-apis/utils/logging/logger.js.html +211 -0
  41. package/coverage/rabbit-ui-kit/src/common-apis/utils/logging/logsStorage.js.html +268 -0
  42. package/coverage/rabbit-ui-kit/src/common-apis/utils/postponeExecution.js.html +118 -0
  43. package/coverage/rabbit-ui-kit/src/common-apis/utils/rabbitTicker.js.html +157 -0
  44. package/coverage/rabbit-ui-kit/src/common-apis/utils/safeStringify.js.html +235 -0
  45. package/coverage/rabbit-ui-kit/src/index.html +116 -0
  46. package/coverage/rabbit-ui-kit/src/index.js.html +388 -0
  47. package/coverage/rabbit-ui-kit/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js.html +1660 -0
  48. package/coverage/rabbit-ui-kit/src/robust-api-caller/cachedRobustExternalApiCallerService.js.html +526 -0
  49. package/coverage/rabbit-ui-kit/src/robust-api-caller/cancelProcessing.js.html +172 -0
  50. package/coverage/rabbit-ui-kit/src/robust-api-caller/concurrentCalculationsMetadataHolder.js.html +310 -0
  51. package/coverage/rabbit-ui-kit/src/robust-api-caller/externalApiProvider.js.html +553 -0
  52. package/coverage/rabbit-ui-kit/src/robust-api-caller/externalServicesStatsCollector.js.html +319 -0
  53. package/coverage/rabbit-ui-kit/src/robust-api-caller/index.html +206 -0
  54. package/coverage/rabbit-ui-kit/src/robust-api-caller/robustExternalAPICallerService.js.html +997 -0
  55. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/changeHeroSwapProvider.js.html +2800 -0
  56. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/changeNowSwapProvider.js.html +2644 -0
  57. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/exolixSwapProvider.js.html +1942 -0
  58. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/goexmeSwapProvider.js.html +2389 -0
  59. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/index.html +236 -0
  60. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/letsExchangeSwapProvider.js.html +1666 -0
  61. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/retriableErrorsUtils.js.html +274 -0
  62. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +1888 -0
  63. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/swapspaceSwapProvider.js.html +1981 -0
  64. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/utils.js.html +163 -0
  65. package/coverage/rabbit-ui-kit/src/swaps-lib/models/baseSwapCreationInfo.js.html +319 -0
  66. package/coverage/rabbit-ui-kit/src/swaps-lib/models/existingSwap.js.html +514 -0
  67. package/coverage/rabbit-ui-kit/src/swaps-lib/models/existingSwapWithFiatData.js.html +529 -0
  68. package/coverage/rabbit-ui-kit/src/swaps-lib/models/index.html +176 -0
  69. package/coverage/rabbit-ui-kit/src/swaps-lib/models/partner.js.html +166 -0
  70. package/coverage/rabbit-ui-kit/src/swaps-lib/models/swapProviderCoinInfo.js.html +337 -0
  71. package/coverage/rabbit-ui-kit/src/swaps-lib/services/index.html +116 -0
  72. package/coverage/rabbit-ui-kit/src/swaps-lib/services/publicSwapService.js.html +1654 -0
  73. package/coverage/rabbit-ui-kit/src/swaps-lib/utils/index.html +116 -0
  74. package/coverage/rabbit-ui-kit/src/swaps-lib/utils/swapUtils.js.html +706 -0
  75. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/arrowIcon.jsx.html +124 -0
  76. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/arrowTosca.jsx.html +127 -0
  77. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/arrowWhite.jsx.html +127 -0
  78. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/darkRectangle.jsx.html +106 -0
  79. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/determinedError.jsx.html +439 -0
  80. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx.html +202 -0
  81. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/index.html +281 -0
  82. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/infoIcon.jsx.html +133 -0
  83. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/messageIcon.jsx.html +346 -0
  84. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx.html +247 -0
  85. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx.html +163 -0
  86. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/supportDialogImage.jsx.html +268 -0
  87. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/walletIcon.jsx.html +151 -0
  88. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetIcon/AssetIcon.jsx.html +256 -0
  89. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetIcon/index.html +116 -0
  90. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx.html +289 -0
  91. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetSelection/index.html +116 -0
  92. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx.html +187 -0
  93. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/BackgroundTitle/index.html +116 -0
  94. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx.html +238 -0
  95. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/InformationMessage/index.html +116 -0
  96. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Input/Input.jsx.html +634 -0
  97. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Input/index.html +116 -0
  98. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/LoadingDots/LoadingDots.jsx.html +196 -0
  99. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/LoadingDots/index.html +116 -0
  100. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx.html +277 -0
  101. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/NoticeIcon/index.html +116 -0
  102. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/QrCode/QrCode.jsx.html +199 -0
  103. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/QrCode/index.html +116 -0
  104. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx.html +175 -0
  105. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/RateSelector/index.html +116 -0
  106. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/SupportChat/SupportChat.jsx.html +217 -0
  107. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/SupportChat/index.html +116 -0
  108. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Textarea/Textarea.jsx.html +529 -0
  109. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Textarea/index.html +116 -0
  110. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx.html +508 -0
  111. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TitleBox/index.html +116 -0
  112. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx.html +316 -0
  113. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Tooltip/index.html +116 -0
  114. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx.html +313 -0
  115. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/index.html +116 -0
  116. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Validation/Validation.jsx.html +202 -0
  117. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Validation/index.html +116 -0
  118. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Button/Button.jsx.html +733 -0
  119. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Button/index.html +116 -0
  120. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Close/Close.jsx.html +259 -0
  121. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Close/index.html +116 -0
  122. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx.html +433 -0
  123. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/index.html +116 -0
  124. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx.html +415 -0
  125. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/index.html +116 -0
  126. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx.html +1429 -0
  127. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/AmountInput/index.html +116 -0
  128. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx.html +1474 -0
  129. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/CoinPicker/index.html +116 -0
  130. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/ColoredNotice/ColoredNotice.jsx.html +241 -0
  131. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/ColoredNotice/index.html +116 -0
  132. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx.html +190 -0
  133. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LineWithIconLink/index.html +116 -0
  134. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LogoCarousel/LogoCarousel.jsx.html +307 -0
  135. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LogoCarousel/index.html +116 -0
  136. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/SearchableCoinsList.jsx.html +427 -0
  137. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/index.html +116 -0
  138. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx.html +181 -0
  139. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/index.html +116 -0
  140. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx.html +283 -0
  141. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/index.html +116 -0
  142. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/Dialog.jsx.html +1567 -0
  143. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx.html +481 -0
  144. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/index.html +116 -0
  145. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx.html +1747 -0
  146. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/index.html +116 -0
  147. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/index.html +116 -0
  148. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx.html +4375 -0
  149. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/SwapForm/index.html +116 -0
  150. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/WaitlistSubscription.jsx.html +559 -0
  151. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/index.html +116 -0
  152. package/coverage/rabbit-ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx.html +316 -0
  153. package/coverage/rabbit-ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/index.html +116 -0
  154. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/index.html +146 -0
  155. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/useCallHandlingErrors.js.html +166 -0
  156. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/useIsHydrated.js.html +121 -0
  157. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/useReferredState.js.html +157 -0
  158. package/coverage/rabbit-ui-kit/src/ui-kit/utils/index.html +176 -0
  159. package/coverage/rabbit-ui-kit/src/ui-kit/utils/inputValueProviders.js.html +235 -0
  160. package/coverage/rabbit-ui-kit/src/ui-kit/utils/searchCoins.js.html +259 -0
  161. package/coverage/rabbit-ui-kit/src/ui-kit/utils/textUtils.js.html +139 -0
  162. package/coverage/rabbit-ui-kit/src/ui-kit/utils/uiUtils.js.html +121 -0
  163. package/coverage/rabbit-ui-kit/src/ui-kit/utils/urlQueryUtils.js.html +271 -0
  164. package/coverage/rabbit-ui-kit/stories/atoms/BackgroundTitle.stories.jsx.html +202 -0
  165. package/coverage/rabbit-ui-kit/stories/atoms/LinesOfText.stories.jsx.html +283 -0
  166. package/coverage/rabbit-ui-kit/stories/atoms/LoadingDots.stories.jsx.html +226 -0
  167. package/coverage/rabbit-ui-kit/stories/atoms/QrCode.stories.jsx.html +175 -0
  168. package/coverage/rabbit-ui-kit/stories/atoms/RateSelector.stories.jsx.html +136 -0
  169. package/coverage/rabbit-ui-kit/stories/atoms/Validation.stories.jsx.html +178 -0
  170. package/coverage/rabbit-ui-kit/stories/atoms/buttons/Button.stories.jsx.html +883 -0
  171. package/coverage/rabbit-ui-kit/stories/atoms/buttons/Close.stories.jsx.html +211 -0
  172. package/coverage/rabbit-ui-kit/stories/atoms/buttons/LinkButton.stories.jsx.html +301 -0
  173. package/coverage/rabbit-ui-kit/stories/atoms/buttons/index.html +146 -0
  174. package/coverage/rabbit-ui-kit/stories/atoms/index.html +191 -0
  175. package/coverage/rabbit-ui-kit/stories/molecules/AmountInput.stories.jsx.html +289 -0
  176. package/coverage/rabbit-ui-kit/stories/molecules/CoinPicker.stories.jsx.html +322 -0
  177. package/coverage/rabbit-ui-kit/stories/molecules/ColoredNotice.stories.jsx.html +178 -0
  178. package/coverage/rabbit-ui-kit/stories/molecules/LineWithIconLink.stories.jsx.html +154 -0
  179. package/coverage/rabbit-ui-kit/stories/molecules/LogoCarousel.stories.jsx.html +235 -0
  180. package/coverage/rabbit-ui-kit/stories/molecules/TitledLineWithIconLink.stories.jsx.html +160 -0
  181. package/coverage/rabbit-ui-kit/stories/molecules/index.html +191 -0
  182. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/Dialog.stories.jsx.html +523 -0
  183. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogButtons/DialogButtons.stories.jsx.html +328 -0
  184. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogButtons/index.html +116 -0
  185. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogStep/DialogStep.stories.jsx.html +337 -0
  186. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogStep/index.html +116 -0
  187. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/index.html +116 -0
  188. package/coverage/rabbit-ui-kit/stories/organisms/WaitlistSubscription.stories.jsx.html +151 -0
  189. package/coverage/rabbit-ui-kit/stories/organisms/index.html +116 -0
  190. package/coverage/rabbit-ui-kit/stories/stubs/coins.jsx.html +6880 -0
  191. package/coverage/rabbit-ui-kit/stories/stubs/exampleContent.jsx.html +145 -0
  192. package/coverage/rabbit-ui-kit/stories/stubs/index.html +131 -0
  193. package/coverage/rabbit-ui-kit/stories/templates/DeterminedErrorDialogStep.stories.jsx.html +190 -0
  194. package/coverage/rabbit-ui-kit/stories/templates/index.html +116 -0
  195. package/coverage/sort-arrow-sprite.png +0 -0
  196. package/coverage/sorter.js +196 -0
  197. package/dist/global.css +197 -0
  198. package/dist/global.css.map +1 -0
  199. package/dist/index.cjs +15089 -1593
  200. package/dist/index.cjs.map +1 -1
  201. package/dist/index.css +2352 -8493
  202. package/dist/index.css.map +1 -1
  203. package/dist/index.modern.js +11801 -1298
  204. package/dist/index.modern.js.map +1 -1
  205. package/dist/index.module.js +15003 -1594
  206. package/dist/index.module.js.map +1 -1
  207. package/dist/index.umd.js +15081 -1596
  208. package/dist/index.umd.js.map +1 -1
  209. package/package.json +35 -9
  210. package/raw +1000 -0
  211. package/src/common-apis/adapters/analyticsAdapters/googleAnalyticsAdapter.js +22 -0
  212. package/src/common-apis/adapters/analyticsAdapters/metrikaAdapter.js +29 -0
  213. package/src/common-apis/adapters/analyticsAdapters/mixpanelAdapter.js +38 -0
  214. package/src/common-apis/adapters/axiosAdapter.js +35 -0
  215. package/src/common-apis/adapters/qrUtils.js +18 -0
  216. package/src/common-apis/external-apis/apiGroups.js +56 -0
  217. package/src/common-apis/external-apis/emailAPI.js +16 -0
  218. package/src/common-apis/external-apis/ipAddressProviders.js +102 -0
  219. package/src/common-apis/globalConstants.jsx +3 -0
  220. package/src/{common → common-apis}/models/coin.js +98 -7
  221. package/src/{common → common-apis/services}/fiatCurrenciesService.js +4 -12
  222. package/src/common-apis/tests/integration/external-apis/ipAddressProviders/getClientIpAddress.test.js +18 -0
  223. package/src/common-apis/tests/units/utils/amountUtils/composeRateText.test.js +152 -0
  224. package/src/{common → common-apis/utils}/amountUtils.js +100 -140
  225. package/src/{common → common-apis}/utils/cache.js +15 -41
  226. package/src/{common → common-apis/utils}/errorUtils.js +15 -0
  227. package/src/{common → common-apis}/utils/logging/logger.js +7 -13
  228. package/src/common-apis/utils/postponeExecution.js +11 -0
  229. package/src/common-apis/utils/rabbitTicker.js +24 -0
  230. package/src/index.js +91 -14
  231. package/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js +525 -0
  232. package/src/robust-api-caller/cachedRobustExternalApiCallerService.js +147 -0
  233. package/src/robust-api-caller/cancelProcessing.js +29 -0
  234. package/src/robust-api-caller/concurrentCalculationsMetadataHolder.js +75 -0
  235. package/src/robust-api-caller/externalApiProvider.js +156 -0
  236. package/src/robust-api-caller/externalServicesStatsCollector.js +78 -0
  237. package/src/robust-api-caller/robustExternalAPICallerService.js +304 -0
  238. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/_performCallAttempt.test.js +533 -0
  239. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/callExternalAPI.test.js +532 -0
  240. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/constructor.test.js +19 -0
  241. package/src/swaps-lib/external-apis/changeHeroSwapProvider.js +905 -0
  242. package/src/swaps-lib/external-apis/changeNowSwapProvider.js +853 -0
  243. package/src/swaps-lib/external-apis/exolixSwapProvider.js +619 -0
  244. package/src/swaps-lib/external-apis/goexmeSwapProvider.js +768 -0
  245. package/src/swaps-lib/external-apis/letsExchangeSwapProvider.js +527 -0
  246. package/src/swaps-lib/external-apis/retriableErrorsUtils.js +63 -0
  247. package/src/swaps-lib/external-apis/swapProvider.js +457 -25
  248. package/src/swaps-lib/external-apis/swapspaceSwapProvider.js +320 -486
  249. package/src/swaps-lib/external-apis/utils.js +26 -0
  250. package/src/swaps-lib/models/baseSwapCreationInfo.js +78 -0
  251. package/src/swaps-lib/models/existingSwap.js +101 -16
  252. package/src/swaps-lib/models/existingSwapWithFiatData.js +148 -0
  253. package/src/swaps-lib/models/partner.js +27 -0
  254. package/src/swaps-lib/models/swapProviderCoinInfo.js +84 -0
  255. package/src/swaps-lib/services/publicSwapService.js +523 -0
  256. package/src/swaps-lib/test/external-apis/changeHeroSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +155 -0
  257. package/src/swaps-lib/test/external-apis/changeHeroSwapProvider/createSwap.test.js +702 -0
  258. package/src/swaps-lib/test/external-apis/changeHeroSwapProvider/getExistingSwapsDetailsAndStatus.test.js +501 -0
  259. package/src/swaps-lib/test/external-apis/changeHeroSwapProvider/getSwapInfo.test.js +425 -0
  260. package/src/swaps-lib/test/external-apis/changeNowSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +83 -0
  261. package/src/swaps-lib/test/external-apis/changeNowSwapProvider/_providerHelpers.test.js +54 -0
  262. package/src/swaps-lib/test/external-apis/changeNowSwapProvider/_validateAddressWithProvider.test.js +49 -0
  263. package/src/swaps-lib/test/external-apis/changeNowSwapProvider/createSwap.test.js +938 -0
  264. package/src/swaps-lib/test/external-apis/changeNowSwapProvider/getExistingSwapsDetailsAndStatus.test.js +353 -0
  265. package/src/swaps-lib/test/external-apis/changeNowSwapProvider/getSwapInfo.test.js +342 -0
  266. package/src/swaps-lib/test/external-apis/exolixSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +34 -0
  267. package/src/swaps-lib/test/external-apis/exolixSwapProvider/createSwap.test.js +1081 -0
  268. package/src/swaps-lib/test/external-apis/exolixSwapProvider/getSwapInfo.test.js +611 -0
  269. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/_convertCurrencyMeta.test.js +95 -0
  270. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +75 -0
  271. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/createSwap.test.js +225 -0
  272. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/getExistingSwapsDetailsAndStatus.test.js +175 -0
  273. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/getSwapInfo.test.js +177 -0
  274. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/helpers.test.js +26 -0
  275. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/PairSupport.int.test.js +69 -0
  276. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/_fetchSupportedCurrenciesIfNeeded.int.test.js +307 -0
  277. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/createSwap.int.test.js +335 -0
  278. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/getSwapInfo.int.test.js +154 -0
  279. package/src/swaps-lib/test/external-apis/swapProvider/getAllSupportedCurrencies.test.js +63 -0
  280. package/src/swaps-lib/test/external-apis/swapProvider/getDepositCurrencies.test.js +73 -0
  281. package/src/swaps-lib/test/external-apis/swapProvider/getWithdrawalCurrencies.test.js +102 -0
  282. package/src/swaps-lib/test/external-apis/swapProvider/removeProtocolNameFromCoinName.test.js +152 -0
  283. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +536 -0
  284. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/createSwap.test.js +1359 -0
  285. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/getExistingSwapsDetailsAndStatus.test.js +136 -0
  286. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/getSwapInfo.test.js +1743 -0
  287. package/src/swaps-lib/test/utils/swapUtils/isIpBannedProviderError.test.js +150 -0
  288. package/src/swaps-lib/test/utils/swapUtils/safeHandleRequestsLimitExceeding.test.js +80 -0
  289. package/src/swaps-lib/utils/swapUtils.js +207 -0
  290. package/{styles → src/ui-kit/assets/styles}/_functions.scss +5 -0
  291. package/{styles → src/ui-kit/assets/styles}/_mixins.scss +2 -2
  292. package/{styles → src/ui-kit/assets/styles}/_placeholder.scss +3 -3
  293. package/{styles → src/ui-kit/assets/styles}/_variables.scss +17 -15
  294. package/src/ui-kit/assets/styles/fonts/NunitoSans-Bold.ttf +0 -0
  295. package/src/ui-kit/assets/styles/fonts/NunitoSans-ExtraBold.ttf +0 -0
  296. package/src/ui-kit/assets/styles/fonts/NunitoSans-Light.ttf +0 -0
  297. package/src/ui-kit/assets/styles/fonts/NunitoSans-Regular.ttf +0 -0
  298. package/src/ui-kit/assets/styles/fonts/NunitoSans-SemiBold.ttf +0 -0
  299. package/src/ui-kit/assets/styles/global.scss +171 -0
  300. package/src/ui-kit/assets/styles/index.scss +10 -0
  301. package/src/ui-kit/assets/wrappedImages/arrowIcon.jsx +13 -0
  302. package/src/ui-kit/assets/wrappedImages/arrowTosca.jsx +14 -0
  303. package/src/ui-kit/assets/wrappedImages/arrowWhite.jsx +14 -0
  304. package/src/ui-kit/assets/wrappedImages/darkRectangle.jsx +7 -0
  305. package/src/ui-kit/assets/wrappedImages/determinedError.jsx +118 -0
  306. package/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx +39 -0
  307. package/src/ui-kit/assets/wrappedImages/infoIcon.jsx +16 -0
  308. package/src/ui-kit/assets/wrappedImages/messageIcon.jsx +87 -0
  309. package/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx +54 -0
  310. package/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx +26 -0
  311. package/src/ui-kit/assets/wrappedImages/supportDialogImage.jsx +61 -0
  312. package/src/ui-kit/assets/wrappedImages/walletIcon.jsx +22 -0
  313. package/src/{components → ui-kit/components}/atoms/AssetIcon/AssetIcon.jsx +16 -14
  314. package/src/{components → ui-kit/components}/atoms/AssetIcon/asset-icon.module.scss +1 -1
  315. package/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx +68 -0
  316. package/src/ui-kit/components/atoms/AssetSelection/asset-selection.module.scss +56 -0
  317. package/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx +34 -0
  318. package/src/ui-kit/components/atoms/BackgroundTitle/background-title.module.scss +52 -0
  319. package/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx +51 -0
  320. package/src/ui-kit/components/atoms/InformationMessage/information-message.module.scss +38 -0
  321. package/src/ui-kit/components/atoms/Input/Input.jsx +183 -0
  322. package/src/ui-kit/components/atoms/Input/input.module.scss +107 -0
  323. package/src/{components → ui-kit/components}/atoms/LoadingDots/LoadingDots.jsx +8 -28
  324. package/src/{components → ui-kit/components}/atoms/LoadingDots/LoadingDots.module.scss +3 -2
  325. package/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx +64 -0
  326. package/src/ui-kit/components/atoms/NoticeIcon/notice-icon.module.scss +14 -0
  327. package/src/ui-kit/components/atoms/QrCode/QrCode.jsx +38 -0
  328. package/src/ui-kit/components/atoms/QrCode/qr-code.module.scss +8 -0
  329. package/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx +30 -0
  330. package/src/ui-kit/components/atoms/RateSelector/rate-selector.module.scss +47 -0
  331. package/src/{components → ui-kit/components}/atoms/SupportChat/SupportChat.jsx +5 -1
  332. package/src/ui-kit/components/atoms/Textarea/Textarea.jsx +148 -0
  333. package/src/ui-kit/components/atoms/Textarea/textarea.module.scss +71 -0
  334. package/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx +141 -0
  335. package/src/ui-kit/components/atoms/TitleBox/title-box.module.scss +32 -0
  336. package/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx +77 -0
  337. package/src/ui-kit/components/atoms/Tooltip/tooltip.module.scss +237 -0
  338. package/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx +76 -0
  339. package/src/ui-kit/components/atoms/TwoLinesOfText/lines-of-text.module.scss +65 -0
  340. package/src/ui-kit/components/atoms/Validation/Validation.jsx +39 -0
  341. package/src/ui-kit/components/atoms/Validation/validation.module.scss +19 -0
  342. package/src/{components → ui-kit/components}/atoms/buttons/Button/Button.jsx +26 -45
  343. package/src/{components → ui-kit/components}/atoms/buttons/Button/Button.module.scss +1 -1
  344. package/src/ui-kit/components/atoms/buttons/Close/Close.jsx +58 -0
  345. package/src/ui-kit/components/atoms/buttons/Close/close.module.scss +75 -0
  346. package/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx +116 -0
  347. package/src/ui-kit/components/atoms/buttons/LinkButton/link-button.module.scss +53 -0
  348. package/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx +110 -0
  349. package/src/ui-kit/components/atoms/buttons/RadioButtonWithText/radio-button-with-text.module.scss +86 -0
  350. package/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx +448 -0
  351. package/src/ui-kit/components/molecules/AmountInput/amount-input.module.scss +233 -0
  352. package/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx +463 -0
  353. package/src/ui-kit/components/molecules/CoinPicker/coin-picker.module.scss +207 -0
  354. package/src/ui-kit/components/molecules/ColoredNotice/ColoredNotice.jsx +52 -0
  355. package/src/ui-kit/components/molecules/ColoredNotice/colored-notice.module.scss +36 -0
  356. package/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx +35 -0
  357. package/src/ui-kit/components/molecules/LineWithIconLink/line-with-icon-link.module.scss +25 -0
  358. package/src/ui-kit/components/molecules/LogoCarousel/LogoCarousel.jsx +74 -0
  359. package/src/ui-kit/components/molecules/LogoCarousel/logo-carousel.module.scss +106 -0
  360. package/src/ui-kit/components/molecules/SearchableCoinsList/SearchableCoinsList.jsx +114 -0
  361. package/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx +32 -0
  362. package/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx +66 -0
  363. package/src/ui-kit/components/organisms/Dialog/Dialog.jsx +494 -0
  364. package/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx +132 -0
  365. package/src/ui-kit/components/organisms/Dialog/DialogButtons/dialog-buttons.module.scss +25 -0
  366. package/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx +554 -0
  367. package/src/ui-kit/components/organisms/Dialog/DialogStep/dialog-step.module.scss +382 -0
  368. package/src/ui-kit/components/organisms/Dialog/dialog.module.scss +226 -0
  369. package/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx +1430 -0
  370. package/src/ui-kit/components/organisms/SwapForm/swap-form.module.scss +134 -0
  371. package/src/ui-kit/components/organisms/WaitlistSubscription/WaitlistSubscription.jsx +158 -0
  372. package/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx +77 -0
  373. package/src/ui-kit/hooks/useCallHandlingErrors.js +27 -0
  374. package/src/ui-kit/hooks/useIsHydrated.js +12 -0
  375. package/src/ui-kit/hooks/useReferredState.js +24 -0
  376. package/src/ui-kit/tests/utils/inputValueProviders/provideFormatOfFloatValueByInputString.test.js +146 -0
  377. package/src/ui-kit/tests/utils/urlQueryUtils/getQueryParameterValues.test.js +65 -0
  378. package/src/ui-kit/tests/utils/urlQueryUtils/saveQueryParameterAndValues.test.js +104 -0
  379. package/src/ui-kit/utils/inputValueProviders.js +50 -0
  380. package/src/ui-kit/utils/searchCoins.js +58 -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/font.scss +40 -0
  385. package/stories/stubs/coins.jsx +2266 -0
  386. package/stories/stubs/exampleContent.jsx +20 -0
  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/src/{common → common-apis}/models/blockchain.js +0 -0
  396. /package/src/{common → common-apis}/models/protocol.js +0 -0
  397. /package/src/{common → common-apis}/utils/logging/logsStorage.js +0 -0
  398. /package/src/{common → common-apis}/utils/safeStringify.js +0 -0
  399. /package/{styles → src/ui-kit/assets/styles}/colors/_light-colors.scss +0 -0
  400. /package/{styles → src/ui-kit/assets/styles}/colors/_solid-colors.scss +0 -0
  401. /package/{styles → src/ui-kit/assets/styles}/size/_margin-size.scss +0 -0
  402. /package/{styles → src/ui-kit/assets/styles}/size/_padding-size.scss +0 -0
@@ -0,0 +1,1888 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for rabbit-ui-kit/src/swaps-lib/external-apis/swapProvider.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">rabbit-ui-kit/src/swaps-lib/external-apis</a> swapProvider.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">75.87% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>456/601</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">93.87% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>46/49</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">41.66% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>10/24</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">75.87% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>456/601</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 medium'></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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
668
+ <span class="cline-any cline-yes">1x</span>
669
+ <span class="cline-any cline-yes">1x</span>
670
+ <span class="cline-any cline-yes">1x</span>
671
+ <span class="cline-any cline-yes">1x</span>
672
+ <span class="cline-any cline-yes">1x</span>
673
+ <span class="cline-any cline-yes">1x</span>
674
+ <span class="cline-any cline-yes">1x</span>
675
+ <span class="cline-any cline-yes">1x</span>
676
+ <span class="cline-any cline-yes">1x</span>
677
+ <span class="cline-any cline-yes">1x</span>
678
+ <span class="cline-any cline-yes">456x</span>
679
+ <span class="cline-any cline-yes">456x</span>
680
+ <span class="cline-any cline-yes">456x</span>
681
+ <span class="cline-any cline-yes">456x</span>
682
+ <span class="cline-any cline-yes">456x</span>
683
+ <span class="cline-any cline-yes">456x</span>
684
+ <span class="cline-any cline-yes">456x</span>
685
+ <span class="cline-any cline-yes">456x</span>
686
+ <span class="cline-any cline-yes">456x</span>
687
+ <span class="cline-any cline-yes">456x</span>
688
+ <span class="cline-any cline-yes">456x</span>
689
+ <span class="cline-any cline-yes">456x</span>
690
+ <span class="cline-any cline-yes">456x</span>
691
+ <span class="cline-any cline-yes">456x</span>
692
+ <span class="cline-any cline-yes">456x</span>
693
+ <span class="cline-any cline-yes">1x</span>
694
+ <span class="cline-any cline-yes">1x</span>
695
+ <span class="cline-any cline-yes">1x</span>
696
+ <span class="cline-any cline-yes">456x</span>
697
+ <span class="cline-any cline-yes">456x</span>
698
+ <span class="cline-any cline-yes">456x</span>
699
+ <span class="cline-any cline-yes">456x</span>
700
+ <span class="cline-any cline-yes">456x</span>
701
+ <span class="cline-any cline-yes">456x</span>
702
+ <span class="cline-any cline-yes">456x</span>
703
+ <span class="cline-any cline-yes">456x</span>
704
+ <span class="cline-any cline-yes">456x</span>
705
+ <span class="cline-any cline-yes">456x</span>
706
+ <span class="cline-any cline-yes">456x</span>
707
+ <span class="cline-any cline-yes">456x</span>
708
+ <span class="cline-any cline-yes">456x</span>
709
+ <span class="cline-any cline-yes">456x</span>
710
+ <span class="cline-any cline-yes">456x</span>
711
+ <span class="cline-any cline-yes">456x</span>
712
+ <span class="cline-any cline-yes">456x</span>
713
+ <span class="cline-any cline-yes">1x</span>
714
+ <span class="cline-any cline-yes">1x</span>
715
+ <span class="cline-any cline-yes">32x</span>
716
+ <span class="cline-any cline-yes">32x</span>
717
+ <span class="cline-any cline-yes">32x</span>
718
+ <span class="cline-any cline-yes">32x</span>
719
+ <span class="cline-any cline-yes">32x</span>
720
+ <span class="cline-any cline-yes">32x</span>
721
+ <span class="cline-any cline-yes">32x</span>
722
+ <span class="cline-any cline-yes">32x</span>
723
+ <span class="cline-any cline-yes">32x</span>
724
+ <span class="cline-any cline-yes">32x</span>
725
+ <span class="cline-any cline-yes">32x</span>
726
+ <span class="cline-any cline-yes">32x</span>
727
+ <span class="cline-any cline-yes">32x</span>
728
+ <span class="cline-any cline-yes">32x</span>
729
+ <span class="cline-any cline-yes">32x</span>
730
+ <span class="cline-any cline-yes">32x</span>
731
+ <span class="cline-any cline-yes">32x</span>
732
+ <span class="cline-any cline-yes">32x</span>
733
+ <span class="cline-any cline-yes">32x</span>
734
+ <span class="cline-any cline-yes">32x</span>
735
+ <span class="cline-any cline-yes">32x</span>
736
+ <span class="cline-any cline-yes">32x</span>
737
+ <span class="cline-any cline-yes">32x</span>
738
+ <span class="cline-any cline-yes">32x</span>
739
+ <span class="cline-any cline-yes">32x</span>
740
+ <span class="cline-any cline-yes">32x</span>
741
+ <span class="cline-any cline-yes">32x</span>
742
+ <span class="cline-any cline-yes">32x</span>
743
+ <span class="cline-any cline-yes">32x</span>
744
+ <span class="cline-any cline-yes">32x</span>
745
+ <span class="cline-any cline-yes">32x</span>
746
+ <span class="cline-any cline-yes">32x</span>
747
+ <span class="cline-any cline-yes">32x</span>
748
+ <span class="cline-any cline-yes">32x</span>
749
+ <span class="cline-any cline-yes">32x</span>
750
+ <span class="cline-any cline-yes">32x</span>
751
+ <span class="cline-any cline-yes">32x</span>
752
+ <span class="cline-any cline-yes">32x</span>
753
+ <span class="cline-any cline-yes">32x</span>
754
+ <span class="cline-any cline-yes">32x</span>
755
+ <span class="cline-any cline-yes">32x</span>
756
+ <span class="cline-any cline-yes">32x</span>
757
+ <span class="cline-any cline-yes">32x</span>
758
+ <span class="cline-any cline-yes">1x</span>
759
+ <span class="cline-any cline-yes">1x</span>
760
+ <span class="cline-any cline-yes">1x</span>
761
+ <span class="cline-any cline-yes">1x</span>
762
+ <span class="cline-any cline-yes">1x</span>
763
+ <span class="cline-any cline-yes">1x</span>
764
+ <span class="cline-any cline-yes">1x</span>
765
+ <span class="cline-any cline-yes">1x</span>
766
+ <span class="cline-any cline-yes">1x</span>
767
+ <span class="cline-any cline-yes">1x</span>
768
+ <span class="cline-any cline-yes">1x</span>
769
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
773
+ <span class="cline-any cline-yes">1x</span>
774
+ <span class="cline-any cline-yes">1x</span>
775
+ <span class="cline-any cline-yes">1x</span>
776
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
780
+ <span class="cline-any cline-yes">1x</span>
781
+ <span class="cline-any cline-yes">1x</span>
782
+ <span class="cline-any cline-yes">1x</span>
783
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
787
+ <span class="cline-any cline-yes">1x</span>
788
+ <span class="cline-any cline-yes">1x</span>
789
+ <span class="cline-any cline-yes">1x</span>
790
+ <span class="cline-any cline-yes">1x</span>
791
+ <span class="cline-any cline-yes">1x</span>
792
+ <span class="cline-any cline-yes">1x</span>
793
+ <span class="cline-any cline-yes">14x</span>
794
+ <span class="cline-any cline-yes">14x</span>
795
+ <span class="cline-any cline-yes">14x</span>
796
+ <span class="cline-any cline-yes">14x</span>
797
+ <span class="cline-any cline-yes">14x</span>
798
+ <span class="cline-any cline-yes">14x</span>
799
+ <span class="cline-any cline-yes">14x</span>
800
+ <span class="cline-any cline-yes">14x</span>
801
+ <span class="cline-any cline-yes">14x</span>
802
+ <span class="cline-any cline-yes">14x</span>
803
+ <span class="cline-any cline-yes">14x</span>
804
+ <span class="cline-any cline-yes">14x</span>
805
+ <span class="cline-any cline-yes">14x</span>
806
+ <span class="cline-any cline-yes">14x</span>
807
+ <span class="cline-any cline-yes">14x</span>
808
+ <span class="cline-any cline-yes">14x</span>
809
+ <span class="cline-any cline-yes">14x</span>
810
+ <span class="cline-any cline-yes">14x</span>
811
+ <span class="cline-any cline-yes">14x</span>
812
+ <span class="cline-any cline-yes">14x</span>
813
+ <span class="cline-any cline-yes">14x</span>
814
+ <span class="cline-any cline-yes">14x</span>
815
+ <span class="cline-any cline-yes">14x</span>
816
+ <span class="cline-any cline-yes">14x</span>
817
+ <span class="cline-any cline-yes">14x</span>
818
+ <span class="cline-any cline-yes">14x</span>
819
+ <span class="cline-any cline-yes">14x</span>
820
+ <span class="cline-any cline-yes">14x</span>
821
+ <span class="cline-any cline-yes">14x</span>
822
+ <span class="cline-any cline-yes">14x</span>
823
+ <span class="cline-any cline-yes">14x</span>
824
+ <span class="cline-any cline-yes">14x</span>
825
+ <span class="cline-any cline-yes">4x</span>
826
+ <span class="cline-any cline-yes">4x</span>
827
+ <span class="cline-any cline-yes">4x</span>
828
+ <span class="cline-any cline-yes">4x</span>
829
+ <span class="cline-any cline-yes">4x</span>
830
+ <span class="cline-any cline-yes">1x</span>
831
+ <span class="cline-any cline-yes">1x</span>
832
+ <span class="cline-any cline-yes">1x</span>
833
+ <span class="cline-any cline-yes">1x</span>
834
+ <span class="cline-any cline-yes">3x</span>
835
+ <span class="cline-any cline-yes">3x</span>
836
+ <span class="cline-any cline-yes">4x</span>
837
+ <span class="cline-any cline-yes">4x</span>
838
+ <span class="cline-any cline-yes">3x</span>
839
+ <span class="cline-any cline-yes">3x</span>
840
+ <span class="cline-any cline-yes">3x</span>
841
+ <span class="cline-any cline-yes">3x</span>
842
+ <span class="cline-any cline-yes">3x</span>
843
+ <span class="cline-any cline-yes">1x</span>
844
+ <span class="cline-any cline-yes">1x</span>
845
+ <span class="cline-any cline-yes">1x</span>
846
+ <span class="cline-any cline-yes">14x</span>
847
+ <span class="cline-any cline-yes">14x</span>
848
+ <span class="cline-any cline-yes">1x</span>
849
+ <span class="cline-any cline-yes">1x</span>
850
+ <span class="cline-any cline-yes">12x</span>
851
+ <span class="cline-any cline-yes">12x</span>
852
+ <span class="cline-any cline-yes">12x</span>
853
+ <span class="cline-any cline-yes">2x</span>
854
+ <span class="cline-any cline-yes">12x</span>
855
+ <span class="cline-any cline-yes">12x</span>
856
+ <span class="cline-any cline-yes">1x</span>
857
+ <span class="cline-any cline-yes">1x</span>
858
+ <span class="cline-any cline-yes">1x</span>
859
+ <span class="cline-any cline-yes">1x</span>
860
+ <span class="cline-any cline-yes">1x</span>
861
+ <span class="cline-any cline-yes">1x</span>
862
+ <span class="cline-any cline-yes">1x</span>
863
+ <span class="cline-any cline-yes">1x</span>
864
+ <span class="cline-any cline-yes">4x</span>
865
+ <span class="cline-any cline-yes">4x</span>
866
+ <span class="cline-any cline-yes">1x</span>
867
+ <span class="cline-any cline-yes">1x</span>
868
+ <span class="cline-any cline-yes">1x</span>
869
+ <span class="cline-any cline-yes">1x</span>
870
+ <span class="cline-any cline-yes">1x</span>
871
+ <span class="cline-any cline-yes">1x</span>
872
+ <span class="cline-any cline-yes">1x</span>
873
+ <span class="cline-any cline-yes">1x</span>
874
+ <span class="cline-any cline-yes">4x</span>
875
+ <span class="cline-any cline-yes">4x</span>
876
+ <span class="cline-any cline-yes">4x</span>
877
+ <span class="cline-any cline-yes">4x</span>
878
+ <span class="cline-any cline-yes">4x</span>
879
+ <span class="cline-any cline-yes">4x</span>
880
+ <span class="cline-any cline-yes">4x</span>
881
+ <span class="cline-any cline-yes">4x</span>
882
+ <span class="cline-any cline-yes">4x</span>
883
+ <span class="cline-any cline-yes">2x</span>
884
+ <span class="cline-any cline-yes">1x</span>
885
+ <span class="cline-any cline-yes">1x</span>
886
+ <span class="cline-any cline-yes">1x</span>
887
+ <span class="cline-any cline-yes">1x</span>
888
+ <span class="cline-any cline-yes">1x</span>
889
+ <span class="cline-any cline-yes">1x</span>
890
+ <span class="cline-any cline-yes">1x</span>
891
+ <span class="cline-any cline-yes">4x</span>
892
+ <span class="cline-any cline-yes">1x</span>
893
+ <span class="cline-any cline-yes">1x</span>
894
+ <span class="cline-any cline-yes">1x</span>
895
+ <span class="cline-any cline-yes">1x</span>
896
+ <span class="cline-any cline-yes">1x</span>
897
+ <span class="cline-any cline-yes">1x</span>
898
+ <span class="cline-any cline-yes">1x</span>
899
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
919
+ <span class="cline-any cline-yes">1x</span>
920
+ <span class="cline-any cline-yes">1x</span>
921
+ <span class="cline-any cline-yes">1x</span>
922
+ <span class="cline-any cline-yes">1x</span>
923
+ <span class="cline-any cline-yes">1x</span>
924
+ <span class="cline-any cline-yes">1x</span>
925
+ <span class="cline-any cline-yes">1x</span>
926
+ <span class="cline-any cline-yes">4x</span>
927
+ <span class="cline-any cline-yes">4x</span>
928
+ <span class="cline-any cline-yes">4x</span>
929
+ <span class="cline-any cline-yes">4x</span>
930
+ <span class="cline-any cline-yes">4x</span>
931
+ <span class="cline-any cline-yes">4x</span>
932
+ <span class="cline-any cline-yes">4x</span>
933
+ <span class="cline-any cline-yes">4x</span>
934
+ <span class="cline-any cline-yes">4x</span>
935
+ <span class="cline-any cline-yes">2x</span>
936
+ <span class="cline-any cline-yes">1x</span>
937
+ <span class="cline-any cline-yes">1x</span>
938
+ <span class="cline-any cline-yes">1x</span>
939
+ <span class="cline-any cline-yes">1x</span>
940
+ <span class="cline-any cline-yes">1x</span>
941
+ <span class="cline-any cline-yes">1x</span>
942
+ <span class="cline-any cline-yes">1x</span>
943
+ <span class="cline-any cline-yes">4x</span>
944
+ <span class="cline-any cline-yes">1x</span>
945
+ <span class="cline-any cline-yes">1x</span>
946
+ <span class="cline-any cline-yes">1x</span>
947
+ <span class="cline-any cline-yes">1x</span>
948
+ <span class="cline-any cline-yes">1x</span>
949
+ <span class="cline-any cline-yes">1x</span>
950
+ <span class="cline-any cline-yes">1x</span>
951
+ <span class="cline-any cline-yes">1x</span>
952
+ <span class="cline-any cline-yes">1x</span>
953
+ <span class="cline-any cline-yes">5x</span>
954
+ <span class="cline-any cline-yes">5x</span>
955
+ <span class="cline-any cline-yes">5x</span>
956
+ <span class="cline-any cline-yes">5x</span>
957
+ <span class="cline-any cline-yes">5x</span>
958
+ <span class="cline-any cline-yes">5x</span>
959
+ <span class="cline-any cline-yes">5x</span>
960
+ <span class="cline-any cline-yes">5x</span>
961
+ <span class="cline-any cline-yes">5x</span>
962
+ <span class="cline-any cline-yes">5x</span>
963
+ <span class="cline-any cline-yes">5x</span>
964
+ <span class="cline-any cline-yes">5x</span>
965
+ <span class="cline-any cline-yes">5x</span>
966
+ <span class="cline-any cline-yes">2x</span>
967
+ <span class="cline-any cline-yes">1x</span>
968
+ <span class="cline-any cline-yes">1x</span>
969
+ <span class="cline-any cline-yes">1x</span>
970
+ <span class="cline-any cline-yes">1x</span>
971
+ <span class="cline-any cline-yes">1x</span>
972
+ <span class="cline-any cline-yes">1x</span>
973
+ <span class="cline-any cline-yes">1x</span>
974
+ <span class="cline-any cline-yes">5x</span>
975
+ <span class="cline-any cline-yes">1x</span>
976
+ <span class="cline-any cline-yes">1x</span>
977
+ <span class="cline-any cline-yes">1x</span>
978
+ <span class="cline-any cline-yes">1x</span>
979
+ <span class="cline-any cline-yes">1x</span>
980
+ <span class="cline-any cline-yes">1x</span>
981
+ <span class="cline-any cline-yes">1x</span>
982
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
998
+ <span class="cline-any cline-yes">1x</span>
999
+ <span class="cline-any cline-yes">1x</span>
1000
+ <span class="cline-any cline-yes">1x</span>
1001
+ <span class="cline-any cline-yes">1x</span>
1002
+ <span class="cline-any cline-yes">1x</span>
1003
+ <span class="cline-any cline-yes">1x</span>
1004
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1049
+ <span class="cline-any cline-yes">1x</span>
1050
+ <span class="cline-any cline-yes">1x</span>
1051
+ <span class="cline-any cline-yes">1x</span>
1052
+ <span class="cline-any cline-yes">1x</span>
1053
+ <span class="cline-any cline-yes">1x</span>
1054
+ <span class="cline-any cline-yes">1x</span>
1055
+ <span class="cline-any cline-yes">1x</span>
1056
+ <span class="cline-any cline-yes">1x</span>
1057
+ <span class="cline-any cline-yes">1x</span>
1058
+ <span class="cline-any cline-yes">1x</span>
1059
+ <span class="cline-any cline-yes">1x</span>
1060
+ <span class="cline-any cline-yes">1x</span>
1061
+ <span class="cline-any cline-yes">1x</span>
1062
+ <span class="cline-any cline-yes">1x</span>
1063
+ <span class="cline-any cline-yes">1x</span>
1064
+ <span class="cline-any cline-yes">1x</span>
1065
+ <span class="cline-any cline-yes">1x</span>
1066
+ <span class="cline-any cline-yes">1x</span>
1067
+ <span class="cline-any cline-yes">1x</span>
1068
+ <span class="cline-any cline-yes">1x</span>
1069
+ <span class="cline-any cline-yes">1x</span>
1070
+ <span class="cline-any cline-yes">1x</span>
1071
+ <span class="cline-any cline-yes">1x</span>
1072
+ <span class="cline-any cline-yes">1x</span>
1073
+ <span class="cline-any cline-yes">1x</span>
1074
+ <span class="cline-any cline-yes">1x</span>
1075
+ <span class="cline-any cline-yes">1x</span>
1076
+ <span class="cline-any cline-yes">1x</span>
1077
+ <span class="cline-any cline-yes">1x</span>
1078
+ <span class="cline-any cline-yes">1x</span>
1079
+ <span class="cline-any cline-yes">1x</span>
1080
+ <span class="cline-any cline-yes">1x</span>
1081
+ <span class="cline-any cline-yes">1x</span>
1082
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1095
+ <span class="cline-any cline-yes">1x</span>
1096
+ <span class="cline-any cline-yes">1x</span>
1097
+ <span class="cline-any cline-yes">1x</span>
1098
+ <span class="cline-any cline-yes">1x</span>
1099
+ <span class="cline-any cline-yes">1x</span>
1100
+ <span class="cline-any cline-yes">1x</span>
1101
+ <span class="cline-any cline-yes">1x</span>
1102
+ <span class="cline-any cline-yes">1x</span>
1103
+ <span class="cline-any cline-yes">1x</span>
1104
+ <span class="cline-any cline-yes">1x</span>
1105
+ <span class="cline-any cline-yes">1x</span>
1106
+ <span class="cline-any cline-yes">1x</span>
1107
+ <span class="cline-any cline-yes">1x</span>
1108
+ <span class="cline-any cline-yes">1x</span>
1109
+ <span class="cline-any cline-yes">1x</span>
1110
+ <span class="cline-any cline-yes">1x</span>
1111
+ <span class="cline-any cline-yes">1x</span>
1112
+ <span class="cline-any cline-yes">1x</span>
1113
+ <span class="cline-any cline-yes">1x</span>
1114
+ <span class="cline-any cline-yes">1x</span>
1115
+ <span class="cline-any cline-yes">1x</span>
1116
+ <span class="cline-any cline-yes">1x</span>
1117
+ <span class="cline-any cline-yes">1x</span>
1118
+ <span class="cline-any cline-yes">1x</span>
1119
+ <span class="cline-any cline-yes">1x</span>
1120
+ <span class="cline-any cline-yes">1x</span>
1121
+ <span class="cline-any cline-yes">1x</span>
1122
+ <span class="cline-any cline-yes">1x</span>
1123
+ <span class="cline-any cline-yes">1x</span>
1124
+ <span class="cline-any cline-yes">1x</span>
1125
+ <span class="cline-any cline-yes">1x</span>
1126
+ <span class="cline-any cline-yes">1x</span>
1127
+ <span class="cline-any cline-yes">1x</span>
1128
+ <span class="cline-any cline-yes">1x</span>
1129
+ <span class="cline-any cline-yes">1x</span>
1130
+ <span class="cline-any cline-yes">1x</span>
1131
+ <span class="cline-any cline-yes">1x</span>
1132
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1148
+ <span class="cline-any cline-yes">1x</span>
1149
+ <span class="cline-any cline-yes">1x</span>
1150
+ <span class="cline-any cline-yes">1x</span>
1151
+ <span class="cline-any cline-yes">1x</span>
1152
+ <span class="cline-any cline-yes">1x</span>
1153
+ <span class="cline-any cline-yes">1x</span>
1154
+ <span class="cline-any cline-yes">1x</span>
1155
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1159
+ <span class="cline-any cline-yes">1x</span>
1160
+ <span class="cline-any cline-yes">1x</span>
1161
+ <span class="cline-any cline-yes">1x</span>
1162
+ <span class="cline-any cline-yes">1x</span>
1163
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1172
+ <span class="cline-any cline-yes">1x</span>
1173
+ <span class="cline-any cline-yes">1x</span>
1174
+ <span class="cline-any cline-yes">1x</span>
1175
+ <span class="cline-any cline-yes">1x</span>
1176
+ <span class="cline-any cline-yes">1x</span>
1177
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1193
+ <span class="cline-any cline-yes">1x</span>
1194
+ <span class="cline-any cline-yes">1x</span>
1195
+ <span class="cline-any cline-yes">1x</span>
1196
+ <span class="cline-any cline-yes">1x</span>
1197
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1213
+ <span class="cline-any cline-yes">1x</span>
1214
+ <span class="cline-any cline-yes">33x</span>
1215
+ <span class="cline-any cline-yes">31x</span>
1216
+ <span class="cline-any cline-yes">31x</span>
1217
+ <span class="cline-any cline-yes">31x</span>
1218
+ <span class="cline-any cline-yes">31x</span>
1219
+ <span class="cline-any cline-yes">31x</span>
1220
+ <span class="cline-any cline-yes">31x</span>
1221
+ <span class="cline-any cline-yes">31x</span>
1222
+ <span class="cline-any cline-yes">31x</span>
1223
+ <span class="cline-any cline-yes">31x</span>
1224
+ <span class="cline-any cline-yes">31x</span>
1225
+ <span class="cline-any cline-yes">30x</span>
1226
+ <span class="cline-any cline-yes">31x</span>
1227
+ <span class="cline-any cline-yes">29x</span>
1228
+ <span class="cline-any cline-yes">29x</span>
1229
+ <span class="cline-any cline-yes">29x</span>
1230
+ <span class="cline-any cline-yes">29x</span>
1231
+ <span class="cline-any cline-yes">29x</span>
1232
+ <span class="cline-any cline-yes">31x</span>
1233
+ <span class="cline-any cline-yes">31x</span>
1234
+ <span class="cline-any cline-yes">31x</span>
1235
+ <span class="cline-any cline-yes">31x</span>
1236
+ <span class="cline-any cline-yes">31x</span>
1237
+ <span class="cline-any cline-yes">31x</span>
1238
+ <span class="cline-any cline-yes">31x</span>
1239
+ <span class="cline-any cline-yes">31x</span>
1240
+ <span class="cline-any cline-yes">31x</span>
1241
+ <span class="cline-any cline-yes">31x</span>
1242
+ <span class="cline-any cline-yes">31x</span>
1243
+ <span class="cline-any cline-yes">31x</span>
1244
+ <span class="cline-any cline-yes">31x</span>
1245
+ <span class="cline-any cline-yes">31x</span>
1246
+ <span class="cline-any cline-yes">31x</span>
1247
+ <span class="cline-any cline-yes">31x</span>
1248
+ <span class="cline-any cline-yes">31x</span>
1249
+ <span class="cline-any cline-yes">31x</span>
1250
+ <span class="cline-any cline-yes">31x</span>
1251
+ <span class="cline-any cline-yes">31x</span>
1252
+ <span class="cline-any cline-yes">31x</span>
1253
+ <span class="cline-any cline-yes">31x</span>
1254
+ <span class="cline-any cline-yes">2x</span>
1255
+ <span class="cline-any cline-yes">2x</span>
1256
+ <span class="cline-any cline-yes">2x</span>
1257
+ <span class="cline-any cline-yes">31x</span>
1258
+ <span class="cline-any cline-yes">33x</span>
1259
+ <span class="cline-any cline-yes">33x</span>
1260
+ <span class="cline-any cline-yes">1x</span>
1261
+ <span class="cline-any cline-yes">1x</span>
1262
+ <span class="cline-any cline-yes">1x</span>
1263
+ <span class="cline-any cline-yes">1x</span>
1264
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1268
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Logger } from "../../common-apis/utils/logging/logger.js";
1269
+ import { improveAndRethrow } from "../../common-apis/utils/errorUtils.js";
1270
+ import { Coin } from "../../common-apis/models/coin.js";
1271
+ import { FALLBACK_ASSET_ICON_URL } from "../../common-apis/globalConstants.jsx";
1272
+ import { BigNumber } from "bignumber.js";
1273
+ import { SwapProviderCoinInfo } from "../models/swapProviderCoinInfo.js";
1274
+ &nbsp;
1275
+ // TODO: [refactoring, moderate] extract structure of _supportedCoins into model class
1276
+ export class SwapProvider {
1277
+ /** @type {string} */
1278
+ id;
1279
+ /** @type {SwapProviderCoinInfo[]} */
1280
+ _supportedCoins;
1281
+ /** @type {number} */
1282
+ _supportedCoinsLastUpdateTimestamp;
1283
+ /** @type {number} */
1284
+ _maxRateDigits;
1285
+ /** @type {boolean} */
1286
+ useRestrictedCoinsSet;
1287
+ /** @type {function} */
1288
+ _customCoinBuilder;
1289
+ /** @type {Cache} */
1290
+ cache;
1291
+ /** @type {boolean} */
1292
+ isAggregator;
1293
+ /** @type {boolean} */
1294
+ isReceiveAmountEstimationSupported;
1295
+ &nbsp;
1296
+ constructor(
1297
+ id,
1298
+ cache,
1299
+ customCoinBuilder = <span class="fstat-no" title="function not covered" >(coin, network) =&gt; null,</span>
1300
+ useRestrictedCoinsSet = true,
1301
+ isAggregator = false,
1302
+ isReceiveAmountEstimationSupported = false
1303
+ ) {
1304
+ this.id = id;
1305
+ this._supportedCoins = [];
1306
+ this._supportedCoinsLastUpdateTimestamp = 0;
1307
+ this._maxRateDigits = 20;
1308
+ this.useRestrictedCoinsSet = useRestrictedCoinsSet;
1309
+ this._customCoinBuilder = customCoinBuilder;
1310
+ this._cache = cache;
1311
+ this.isAggregator = isAggregator;
1312
+ this.isReceiveAmountEstimationSupported = isReceiveAmountEstimationSupported;
1313
+ }
1314
+ &nbsp;
1315
+ static COINS_EXPIRATION_TIME_MS = 5 * 60 * 1000;
1316
+ &nbsp;
1317
+ static COMMON_ERRORS = {
1318
+ REQUESTS_LIMIT_EXCEEDED: "requestsLimitExceeded",
1319
+ };
1320
+ &nbsp;
1321
+ static NO_SWAPS_REASONS = {
1322
+ TOO_LOW: "tooLow",
1323
+ TOO_HIGH: "tooHigh",
1324
+ NOT_SUPPORTED: "notSupported",
1325
+ NO_FIXED_BUT_HAVE_FLOATING: "noFixedButHaveFloating",
1326
+ NO_FLOATING_BUT_HAVE_FIXED: "noFloatingButHaveFixed",
1327
+ };
1328
+ &nbsp;
1329
+ /**
1330
+ * Creation error code.
1331
+ *
1332
+ * RETRIABLE_FAIL — use this when a provider returns a recognizable, client‑correctable error
1333
+ * (most often HTTP 4xx), e.g. invalid address/extraId, amount out of provider limits,
1334
+ * temporarily unsupported pair/flow, etc.
1335
+ *
1336
+ */
1337
+ static CREATION_FAIL_REASONS = {
1338
+ RETRIABLE_FAIL: "retriableFail",
1339
+ };
1340
+ &nbsp;
1341
+ /**
1342
+ * Specific retriable creation error identifiers (provider‑agnostic).
1343
+ * Use together with `reason: CREATION_FAIL_REASONS.RETRIABLE_FAIL`.
1344
+ */
1345
+ static RETRIABLE_SWAP_CREATION_ERRORS = {
1346
+ IP_BANNED: "ipBanned",
1347
+ };
1348
+ &nbsp;
1349
+ static SWAP_STATUSES = {
1350
+ WAITING_FOR_PAYMENT: "waiting_for_payment",
1351
+ CONFIRMING: "confirming",
1352
+ PAYMENT_RECEIVED: "payment_received",
1353
+ VERIFYING: "verifying",
1354
+ EXCHANGING: "exchanging",
1355
+ COMPLETED: "completed",
1356
+ REFUNDED: "refunded",
1357
+ EXPIRED: "expired",
1358
+ FAILED: "failed",
1359
+ };
1360
+ &nbsp;
1361
+ /**
1362
+ * Returns provider-specific identifiers exactly the way they defined in the provider API.
1363
+ * Usually providers have 2 identifiers - ticker/code/coin id and network/protocol.
1364
+ * So by default we return this set based in the coin info instance.
1365
+ * Should be redefined for dedicated providers if their ids logic differ.
1366
+ *
1367
+ * @param info {SwapProviderCoinInfo}
1368
+ * @return {{code: string, network: string|null}} null network means the coin is the major for its network like BTC and ETH
1369
+ */
1370
+ <span class="fstat-no" title="function not covered" > getIdsByCoinInfo(info) {</span>
1371
+ <span class="cstat-no" title="statement not covered" > return { code: info.code, network: info.network };</span>
1372
+ <span class="cstat-no" title="statement not covered" > }</span>
1373
+ &nbsp;
1374
+ /**
1375
+ * @return {Promise&lt;void&gt;}
1376
+ */
1377
+ <span class="fstat-no" title="function not covered" > async initialize() {</span>
1378
+ <span class="cstat-no" title="statement not covered" > await this._fetchSupportedCurrenciesIfNeeded();</span>
1379
+ <span class="cstat-no" title="statement not covered" > }</span>
1380
+ &nbsp;
1381
+ /**
1382
+ * @return {number} milliseconds TTL
1383
+ */
1384
+ <span class="fstat-no" title="function not covered" > getSwapCreationInfoTtlMs() {</span>
1385
+ <span class="cstat-no" title="statement not covered" > throw new Error("Not implemented in base");</span>
1386
+ <span class="cstat-no" title="statement not covered" > }</span>
1387
+ &nbsp;
1388
+ /**
1389
+ * This method sort internal list putting popular (as provider thinks) coins to the top.
1390
+ * This is just for users of this API if they don't care about the sorting - we just improve a list a bit this way.
1391
+ * @private
1392
+ */
1393
+ _putPopularCoinsFirst() {
1394
+ const popularCoinsList = [
1395
+ "HMSTRTON",
1396
+ "BTC",
1397
+ "ETH",
1398
+ "USDTERC20",
1399
+ "USDTTRC20",
1400
+ "USDCERC20",
1401
+ "XRP",
1402
+ "TON",
1403
+ "XMR",
1404
+ "TRX",
1405
+ "DAIERC20",
1406
+ "DOGE",
1407
+ "BNB",
1408
+ "PEPEERC20",
1409
+ "NOTTON",
1410
+ "SOL",
1411
+ "DOT",
1412
+ "LTC",
1413
+ "SHIBERC20",
1414
+ "AVAX",
1415
+ "UNIERC20",
1416
+ "LINKERC20",
1417
+ "MATIC",
1418
+ "BUSDBEP20",
1419
+ "AAVEERC20",
1420
+ "ATOM",
1421
+ "RUNE",
1422
+ "ADA",
1423
+ ];
1424
+ &nbsp;
1425
+ this._supportedCoins.sort((i1, i2) =&gt; {
1426
+ const isInPopularList1 = popularCoinsList.includes(i1.coin.ticker);
1427
+ const isInPopularList2 = popularCoinsList.includes(i2.coin.ticker);
1428
+ &nbsp;
1429
+ // If both are in the popularCoinsList, sort by their index in the list
1430
+ if (isInPopularList1 &amp;&amp; isInPopularList2) {
1431
+ const index1 = popularCoinsList.indexOf(i1.coin.ticker);
1432
+ const index2 = popularCoinsList.indexOf(i2.coin.ticker);
1433
+ return index1 - index2;
1434
+ }
1435
+ &nbsp;
1436
+ // Sort by whether the coin is in the popularCoinsList
1437
+ if (isInPopularList1 <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; !isInPopularList2)</span> <span class="branch-0 cbranch-no" title="branch not covered" >return -1;</span>
1438
+ if (!isInPopularList1 &amp;&amp; isInPopularList2) <span class="branch-0 cbranch-no" title="branch not covered" >return 1;</span>
1439
+ &nbsp;
1440
+ // If both are not in the popularCoinsList, use the isPopular flag - partners can fill it
1441
+ let p1 = i1.isPopular;
1442
+ let p2 = i2.isPopular;
1443
+ if (p1 !== p2) return p2 - p1;
1444
+ &nbsp;
1445
+ // By default, sort by the coin ticker
1446
+ return i1.coin.ticker.localeCompare(i2.coin.ticker);
1447
+ });
1448
+ }
1449
+ &nbsp;
1450
+ _shouldCoinsListBeLoaded() {
1451
+ return (
1452
+ !this._supportedCoins?.length ||
1453
+ !this._supportedCoinsLastUpdateTimestamp ||
1454
+ this._supportedCoinsLastUpdateTimestamp + SwapProvider.COINS_EXPIRATION_TIME_MS &lt; Date.now()
1455
+ );
1456
+ }
1457
+ &nbsp;
1458
+ /**
1459
+ * Should fill _supportedCoins with array of coins.
1460
+ *
1461
+ * @return {Promise&lt;void&gt;}
1462
+ * @private
1463
+ */
1464
+ async _fetchSupportedCurrenciesIfNeeded() {
1465
+ return;
1466
+ }
1467
+ &nbsp;
1468
+ /**
1469
+ * Retrieves all currencies supported by this swap provider.
1470
+ * Returns one of SwapProvider.COMMON_ERRORS in case of processable fail.
1471
+ *
1472
+ * @return {Promise&lt;({ result: true, coins: Coin[] }|{ result: false, reason: string })&gt;}
1473
+ */
1474
+ async getAllSupportedCurrencies() {
1475
+ const loggerSource = "getAllSupportedCurrencies";
1476
+ try {
1477
+ await this._fetchSupportedCurrenciesIfNeeded();
1478
+ Logger.log(`We have ${this._supportedCoins?.length} supported coins returning`, loggerSource);
1479
+ return {
1480
+ result: true,
1481
+ coins: this._supportedCoins.map(item =&gt; item.coin),
1482
+ };
1483
+ } catch (e) {
1484
+ if (e?.response?.status === 429) {
1485
+ return {
1486
+ result: false,
1487
+ reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,
1488
+ };
1489
+ }
1490
+ improveAndRethrow(e, loggerSource);
1491
+ }
1492
+ }
1493
+ &nbsp;
1494
+ /**
1495
+ * Retrieves all currencies supported by this swap provider with raw details.
1496
+ * Returns one of SwapProvider.COMMON_ERRORS in case of processable fail.
1497
+ *
1498
+ * @return {Promise&lt;({ result: true, coinsInfo: SwapProviderCoinInfo[] }|{ result: false, reason: string })&gt;}
1499
+ */
1500
+ <span class="fstat-no" title="function not covered" > async getAllSupportedCurrenciesWithRawDetails() {</span>
1501
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "getAllSupportedCurrenciesWithRawDetails";</span>
1502
+ <span class="cstat-no" title="statement not covered" > try {</span>
1503
+ <span class="cstat-no" title="statement not covered" > await this._fetchSupportedCurrenciesIfNeeded();</span>
1504
+ <span class="cstat-no" title="statement not covered" > Logger.log(`We have ${this._supportedCoins?.length} supported coins returning`, loggerSource);</span>
1505
+ <span class="cstat-no" title="statement not covered" > return {</span>
1506
+ <span class="cstat-no" title="statement not covered" > result: true,</span>
1507
+ <span class="cstat-no" title="statement not covered" > coinsInfo: [...this._supportedCoins],</span>
1508
+ <span class="cstat-no" title="statement not covered" > };</span>
1509
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1510
+ <span class="cstat-no" title="statement not covered" > if (e?.response?.status === 429) {</span>
1511
+ <span class="cstat-no" title="statement not covered" > return {</span>
1512
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1513
+ <span class="cstat-no" title="statement not covered" > reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,</span>
1514
+ <span class="cstat-no" title="statement not covered" > };</span>
1515
+ <span class="cstat-no" title="statement not covered" > }</span>
1516
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, loggerSource);</span>
1517
+ <span class="cstat-no" title="statement not covered" > }</span>
1518
+ <span class="cstat-no" title="statement not covered" > }</span>
1519
+ &nbsp;
1520
+ /**
1521
+ * Retrieves all deposit currencies supported by this swap provider.
1522
+ * Returns one of SwapProvider.COMMON_ERRORS in case of processable fail.
1523
+ *
1524
+ * @return {Promise&lt;({ result: true, coins: Coin[] }|{ result: false, reason: string })&gt;}
1525
+ */
1526
+ async getDepositCurrencies() {
1527
+ const loggerSource = "getDepositCurrencies";
1528
+ try {
1529
+ await this._fetchSupportedCurrenciesIfNeeded();
1530
+ Logger.log(`We have ${this._supportedCoins?.length} supported coins, getting depositable`, loggerSource);
1531
+ return {
1532
+ result: true,
1533
+ coins: this._supportedCoins.filter(item =&gt; item.deposit).map(item =&gt; item.coin),
1534
+ };
1535
+ } catch (e) {
1536
+ if (e?.response?.status === 429) {
1537
+ return {
1538
+ result: false,
1539
+ reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,
1540
+ };
1541
+ }
1542
+ improveAndRethrow(e, loggerSource);
1543
+ }
1544
+ }
1545
+ &nbsp;
1546
+ /**
1547
+ * Retrieves all withdrawable currencies supported by this swap provider.
1548
+ * Returns one of SwapProvider.COMMON_ERRORS in case of processable fail.
1549
+ *
1550
+ * @param [exceptCurrency=null] {Coin|null}
1551
+ * @return {Promise&lt;({ result: true, coins: Coin[] }|{ result: false, reason: string })&gt;}
1552
+ */
1553
+ async getWithdrawalCurrencies(exceptCurrency = null) {
1554
+ const loggerSource = "getWithdrawalCurrencies";
1555
+ try {
1556
+ await this._fetchSupportedCurrenciesIfNeeded();
1557
+ Logger.log(`We have ${this._supportedCoins?.length} supported coins, getting withdrawable`, loggerSource);
1558
+ return {
1559
+ result: true,
1560
+ coins: this._supportedCoins
1561
+ .filter(
1562
+ item =&gt; item.withdrawal &amp;&amp; (!exceptCurrency || item.coin?.ticker !== exceptCurrency?.ticker)
1563
+ )
1564
+ .map(item =&gt; item.coin),
1565
+ };
1566
+ } catch (e) {
1567
+ if (e?.response?.status === 429) {
1568
+ return {
1569
+ result: false,
1570
+ reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,
1571
+ };
1572
+ }
1573
+ improveAndRethrow(e, loggerSource);
1574
+ }
1575
+ }
1576
+ &nbsp;
1577
+ /**
1578
+ * Retrieves URL for coin icon or fallback if not found.
1579
+ *
1580
+ * @param coinOrTicker {Coin|string} coin or rabbit-format of coin ticker
1581
+ * @return {string}
1582
+ */
1583
+ <span class="fstat-no" title="function not covered" > getIconUrl(coinOrTicker) {</span>
1584
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "getIconUrl";</span>
1585
+ <span class="cstat-no" title="statement not covered" > try {</span>
1586
+ <span class="cstat-no" title="statement not covered" > let coin = coinOrTicker;</span>
1587
+ <span class="cstat-no" title="statement not covered" > if (!(coinOrTicker instanceof Coin)) {</span>
1588
+ <span class="cstat-no" title="statement not covered" > coin = this._supportedCoins.find(i =&gt; i.coin.ticker === coinOrTicker)?.coin;</span>
1589
+ <span class="cstat-no" title="statement not covered" > }</span>
1590
+ <span class="cstat-no" title="statement not covered" > return (</span>
1591
+ <span class="cstat-no" title="statement not covered" > this._supportedCoins.find(item =&gt; item.coin?.ticker === coin?.ticker)?.iconURL ??</span>
1592
+ <span class="cstat-no" title="statement not covered" > FALLBACK_ASSET_ICON_URL</span>
1593
+ <span class="cstat-no" title="statement not covered" > );</span>
1594
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1595
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, loggerSource);</span>
1596
+ <span class="cstat-no" title="statement not covered" > }</span>
1597
+ <span class="cstat-no" title="statement not covered" > }</span>
1598
+ &nbsp;
1599
+ /**
1600
+ * Retrieves coin to USDT rate.
1601
+ *
1602
+ * @param coinOrTicker {Coin|string}
1603
+ * @return {{result: true, rate: string}|null}
1604
+ */
1605
+ <span class="fstat-no" title="function not covered" > async getCoinToUSDTRate(coinOrTicker) {</span>
1606
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "getCoinToUSDTRate";</span>
1607
+ <span class="cstat-no" title="statement not covered" > try {</span>
1608
+ <span class="cstat-no" title="statement not covered" > if (!coinOrTicker) return null;</span>
1609
+ <span class="cstat-no" title="statement not covered" > await this._fetchSupportedCurrenciesIfNeeded();</span>
1610
+ <span class="cstat-no" title="statement not covered" > const ticker = coinOrTicker instanceof Coin ? coinOrTicker.ticker : coinOrTicker;</span>
1611
+ <span class="cstat-no" title="statement not covered" > const coin = this.getCoinByTickerIfPresent(ticker);</span>
1612
+ <span class="cstat-no" title="statement not covered" > if (!coin) return null;</span>
1613
+ <span class="cstat-no" title="statement not covered" ></span>
1614
+ <span class="cstat-no" title="statement not covered" > // Using USDT TRC20 as usually fee in this network is smaller than ERC20 and this network is widely used for USDT</span>
1615
+ <span class="cstat-no" title="statement not covered" > const usdtTrc20 = this._supportedCoins.find(i =&gt; i.coin.ticker === "USDTTRC20")?.coin;</span>
1616
+ <span class="cstat-no" title="statement not covered" > if (!usdtTrc20) {</span>
1617
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1618
+ <span class="cstat-no" title="statement not covered" > }</span>
1619
+ <span class="cstat-no" title="statement not covered" > const cached = this._cache.get("swapspace_usdt_rate_" + ticker);</span>
1620
+ <span class="cstat-no" title="statement not covered" > if (cached != null) {</span>
1621
+ <span class="cstat-no" title="statement not covered" > return {</span>
1622
+ <span class="cstat-no" title="statement not covered" > result: true,</span>
1623
+ <span class="cstat-no" title="statement not covered" > rate: cached,</span>
1624
+ <span class="cstat-no" title="statement not covered" > };</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" > Logger.log("Loading USDT-&gt;coin rate as not found in cache:", ticker);</span>
1628
+ <span class="cstat-no" title="statement not covered" > const result = await this.getSwapInfo(usdtTrc20, coin, "5000", false);</span>
1629
+ <span class="cstat-no" title="statement not covered" > if (!result.result) {</span>
1630
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1631
+ <span class="cstat-no" title="statement not covered" > }</span>
1632
+ <span class="cstat-no" title="statement not covered" ></span>
1633
+ <span class="cstat-no" title="statement not covered" > // This calculation is not precise as we cannot recognize the actual fee and network fee. Just approximate.</span>
1634
+ <span class="cstat-no" title="statement not covered" > const standardSwapspaceFeeMultiplier = 1.004; // standard market fee is about 0.4% usually</span>
1635
+ <span class="cstat-no" title="statement not covered" > const rate = BigNumber(1).div(BigNumber(result.rate).times(standardSwapspaceFeeMultiplier)).toString();</span>
1636
+ <span class="cstat-no" title="statement not covered" > this._cache.put(</span>
1637
+ <span class="cstat-no" title="statement not covered" > "swap_usdt_rate_" + ticker,</span>
1638
+ <span class="cstat-no" title="statement not covered" > rate,</span>
1639
+ <span class="cstat-no" title="statement not covered" > 10 * 60000 // 15 minutes</span>
1640
+ <span class="cstat-no" title="statement not covered" > );</span>
1641
+ <span class="cstat-no" title="statement not covered" > return {</span>
1642
+ <span class="cstat-no" title="statement not covered" > result: true,</span>
1643
+ <span class="cstat-no" title="statement not covered" > rate: rate,</span>
1644
+ <span class="cstat-no" title="statement not covered" > };</span>
1645
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1646
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, loggerSource);</span>
1647
+ <span class="cstat-no" title="statement not covered" > }</span>
1648
+ <span class="cstat-no" title="statement not covered" > }</span>
1649
+ &nbsp;
1650
+ /**
1651
+ * Retrieves estimation for swapping giving coins amount.
1652
+ * null min or max signals there is no corresponding limitation. undefined means that the limits were not retrieved.
1653
+ * For fail result on of SwapProvider.NO_SWAPS_REASONS or SwapProvider.COMMON_ERRORS reasons will be returned.
1654
+ *
1655
+ * WARNING: MUST return NOT_SUPPORTED error code for any case when pair is not available/supported (Should not throw random errors for this case)
1656
+ * @param fromCoin {Coin}
1657
+ * @param toCoin {Coin}
1658
+ * @param amountCoins {string}
1659
+ * @param [fixed=false] {boolean|null} null means fixed or float doesn't matter
1660
+ * @param [fromCoinToUsdRate=null] pass if you want to increase the min amount returned
1661
+ * by provider with some fixed "insurance" amount to cover min amount fluctuations.
1662
+ * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount. False means the amount is the sending amount.
1663
+ * @param [bannedPartners=[]] {string[]} list of ids of banned partners to be excluded from list, suitable only for swap aggregators
1664
+ * @param [whitelistedPartners=null] {string[]|null} list of ids of whitelisted partners. Banned whitelisted partner will not be used for estimation.
1665
+ * @return {Promise&lt;({
1666
+ * result: false,
1667
+ * reason: string,
1668
+ * smallestMin: (string|null|undefined),
1669
+ * greatestMax: (string|null|undefined),
1670
+ * }|{
1671
+ * result: true,
1672
+ * min: (string|null),
1673
+ * max: (string|null),
1674
+ * smallestMin: (string|null),
1675
+ * greatestMax: (string|null),
1676
+ * rate: (string|null),
1677
+ * durationMinutesRange: string,
1678
+ * fixed: boolean,
1679
+ * isRefundAddressRequired: boolean,
1680
+ * [rawSwapData]: Object
1681
+ * })&gt;}
1682
+ */
1683
+ <span class="fstat-no" title="function not covered" > async getSwapInfo(</span>
1684
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1685
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1686
+ <span class="cstat-no" title="statement not covered" > amountCoins,</span>
1687
+ <span class="cstat-no" title="statement not covered" > fixed = false,</span>
1688
+ <span class="cstat-no" title="statement not covered" > fromCoinToUsdRate = null,</span>
1689
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive = false,</span>
1690
+ <span class="cstat-no" title="statement not covered" > bannedPartners = [],</span>
1691
+ <span class="cstat-no" title="statement not covered" > whitelistedPartners = null</span>
1692
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1693
+ <span class="cstat-no" title="statement not covered" > throw new Error("Not implemented in base");</span>
1694
+ <span class="cstat-no" title="statement not covered" > }</span>
1695
+ &nbsp;
1696
+ /**
1697
+ * For fail result we return one of SwapProvider.CREATION_FAIL_REASONS or SwapProvider.COMMON_ERRORS.*
1698
+ *
1699
+ * Adapters SHOULD use specific retriable codes where applicable:
1700
+ * return reason = SwapProvider.CREATION_FAIL_REASONS.RETRIABLE_FAIL and, optionally,
1701
+ * set errorCode = one of SwapProvider.RETRIABLE_SWAP_CREATION_ERRORS.
1702
+ *
1703
+ * @param fromCoin {Coin}
1704
+ * @param toCoin {Coin}
1705
+ * @param amount {string}
1706
+ * @param toAddress {string}
1707
+ * @param refundAddress {string}
1708
+ * @param proprietarySwapEstimationData {Object|null}
1709
+ * @param clientIpAddress {string}
1710
+ * @param fixed {boolean}
1711
+ * @param [toCurrencyExtraId=""] {string} optional extra ID
1712
+ * @param [refundExtraId=""] {string} optional extra ID for refund address
1713
+ * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount. False means the amount is the sending amount.
1714
+ * @return {Promise&lt;({
1715
+ * result: true,
1716
+ * swapId: string,
1717
+ * fromCoin: Coin,
1718
+ * fromAmount: string,
1719
+ * fromAddress: string,
1720
+ * toCoin: Coin,
1721
+ * toAmount: string,
1722
+ * toAddress: string,
1723
+ * rate: string,
1724
+ * fromCurrencyExtraId: string|undefined,
1725
+ * fixed: boolean
1726
+ * }|{
1727
+ * result: false,
1728
+ * reason: string,
1729
+ * partner: string,
1730
+ * [errorCode]: string
1731
+ * })&gt;}
1732
+ */
1733
+ <span class="fstat-no" title="function not covered" > async createSwap(</span>
1734
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1735
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1736
+ <span class="cstat-no" title="statement not covered" > amount,</span>
1737
+ <span class="cstat-no" title="statement not covered" > toAddress,</span>
1738
+ <span class="cstat-no" title="statement not covered" > refundAddress,</span>
1739
+ <span class="cstat-no" title="statement not covered" > proprietarySwapEstimationData,</span>
1740
+ <span class="cstat-no" title="statement not covered" > clientIpAddress,</span>
1741
+ <span class="cstat-no" title="statement not covered" > fixed,</span>
1742
+ <span class="cstat-no" title="statement not covered" > toCurrencyExtraId = "",</span>
1743
+ <span class="cstat-no" title="statement not covered" > refundExtraId = "",</span>
1744
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive = false</span>
1745
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1746
+ <span class="cstat-no" title="statement not covered" > throw new Error("Not implemented in base");</span>
1747
+ <span class="cstat-no" title="statement not covered" > }</span>
1748
+ &nbsp;
1749
+ /**
1750
+ * Retrieves details and status for swaps by given ids.
1751
+ * If some swap is not found by id then there is no item in return list.
1752
+ *
1753
+ * @param swapIds {string[]}
1754
+ * @return {Promise&lt;{result: false, reason: string}|{result:true, swaps: ExistingSwap[]}&gt;}
1755
+ */
1756
+ <span class="fstat-no" title="function not covered" > async getExistingSwapsDetailsAndStatus(swapIds) {</span>
1757
+ <span class="cstat-no" title="statement not covered" > throw new Error("Not implemented in base");</span>
1758
+ <span class="cstat-no" title="statement not covered" > }</span>
1759
+ &nbsp;
1760
+ /**
1761
+ * @param ticker {string}
1762
+ * @return {Coin|null}
1763
+ */
1764
+ <span class="fstat-no" title="function not covered" > getCoinByTickerIfPresent(ticker) {</span>
1765
+ <span class="cstat-no" title="statement not covered" > try {</span>
1766
+ <span class="cstat-no" title="statement not covered" > const item = this._supportedCoins.find(i =&gt; i.coin.ticker === ticker);</span>
1767
+ <span class="cstat-no" title="statement not covered" > return item?.coin ?? null;</span>
1768
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1769
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "getCoinByTickerIfPresent");</span>
1770
+ <span class="cstat-no" title="statement not covered" > }</span>
1771
+ <span class="cstat-no" title="statement not covered" > }</span>
1772
+ &nbsp;
1773
+ /**
1774
+ * @param asset {Coin}
1775
+ * @param address {string}
1776
+ * @return {boolean}
1777
+ */
1778
+ <span class="fstat-no" title="function not covered" > isAddressValidForAsset(asset, address) {</span>
1779
+ <span class="cstat-no" title="statement not covered" > try {</span>
1780
+ <span class="cstat-no" title="statement not covered" > const assetData = this._supportedCoins.find(i =&gt; i.coin?.ticker === asset?.ticker);</span>
1781
+ <span class="cstat-no" title="statement not covered" > if (assetData) {</span>
1782
+ <span class="cstat-no" title="statement not covered" > let corrected = assetData.validationRegexp.trim();</span>
1783
+ <span class="cstat-no" title="statement not covered" > corrected = corrected[0] === "/" ? corrected.slice(1) : corrected;</span>
1784
+ <span class="cstat-no" title="statement not covered" > corrected =</span>
1785
+ <span class="cstat-no" title="statement not covered" > corrected[corrected.length - 1] === "/" ? corrected.slice(0, corrected.length - 1) : corrected;</span>
1786
+ <span class="cstat-no" title="statement not covered" > return address.match(corrected) != null;</span>
1787
+ <span class="cstat-no" title="statement not covered" > }</span>
1788
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1789
+ <span class="cstat-no" title="statement not covered" > Logger.logError(e, "isAddressValidForAsset");</span>
1790
+ <span class="cstat-no" title="statement not covered" > }</span>
1791
+ <span class="cstat-no" title="statement not covered" > return false;</span>
1792
+ <span class="cstat-no" title="statement not covered" > }</span>
1793
+ &nbsp;
1794
+ /**
1795
+ * @param asset {Coin}
1796
+ * @return {string|null}
1797
+ */
1798
+ <span class="fstat-no" title="function not covered" > getExtraIdNameIfPresent(asset) {</span>
1799
+ <span class="cstat-no" title="statement not covered" > try {</span>
1800
+ <span class="cstat-no" title="statement not covered" > const assetData = this._supportedCoins.find(i =&gt; i.coin?.ticker === asset?.ticker);</span>
1801
+ <span class="cstat-no" title="statement not covered" > if (assetData?.hasExtraId) {</span>
1802
+ <span class="cstat-no" title="statement not covered" > if (assetData?.extraIdName == null || assetData?.extraIdName === "") {</span>
1803
+ <span class="cstat-no" title="statement not covered" > // We return some default name if the extraIdName is empty</span>
1804
+ <span class="cstat-no" title="statement not covered" > return "ID";</span>
1805
+ <span class="cstat-no" title="statement not covered" > }</span>
1806
+ <span class="cstat-no" title="statement not covered" > return assetData?.extraIdName;</span>
1807
+ <span class="cstat-no" title="statement not covered" > }</span>
1808
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1809
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1810
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "getExtraIdNameIfPresent");</span>
1811
+ <span class="cstat-no" title="statement not covered" > }</span>
1812
+ <span class="cstat-no" title="statement not covered" > }</span>
1813
+ &nbsp;
1814
+ removeProtocolNameFromCoinName(coinName, tickerPrintable, protocolName) {
1815
+ if (coinName) {
1816
+ const originalName = coinName;
1817
+ if (tickerPrintable) {
1818
+ coinName = coinName.replaceAll(new RegExp(`\\(${tickerPrintable}\\)`, "gi"), "");
1819
+ }
1820
+ if (protocolName) {
1821
+ coinName = coinName
1822
+ .replaceAll(new RegExp(`\\(${protocolName}\\)`, "gi"), "")
1823
+ .replaceAll(new RegExp(`^${protocolName} `, "gi"), "");
1824
+ if (
1825
+ !coinName.match(new RegExp(` on ${protocolName}$`, "gi")) &amp;&amp;
1826
+ !coinName.match(new RegExp(` on ${protocolName} `, "gi"))
1827
+ ) {
1828
+ // Removing protocol name without braces only if there is no "on &lt;protocol&gt;" phrase in the coin name
1829
+ coinName = coinName
1830
+ .replaceAll(new RegExp(` ${protocolName}$`, "gi"), "")
1831
+ .replaceAll(new RegExp(` ${protocolName} `, "gi"), " ");
1832
+ }
1833
+ }
1834
+ coinName = coinName.replaceAll(/ +/g, " ").trim();
1835
+ &nbsp;
1836
+ const defaultNames = [
1837
+ "token",
1838
+ "network",
1839
+ "protocol",
1840
+ "coin",
1841
+ "mainnet",
1842
+ "chain",
1843
+ "project",
1844
+ "cash",
1845
+ "finance",
1846
+ "wrapped",
1847
+ "blockchain",
1848
+ "network",
1849
+ ];
1850
+ const lowerCoinName = coinName.toLowerCase();
1851
+ const isBecameDefaultName = defaultNames.find(
1852
+ defName =&gt; lowerCoinName === defName || lowerCoinName === `the ${defName}`
1853
+ );
1854
+ if (coinName === "" || isBecameDefaultName) {
1855
+ // Rolling back to original name if our processing leads in empty name or one of the default words
1856
+ coinName = originalName;
1857
+ }
1858
+ }
1859
+ return coinName;
1860
+ }
1861
+ &nbsp;
1862
+ /**
1863
+ * @return {Promise&lt;Partner[]&gt;}
1864
+ */
1865
+ <span class="fstat-no" title="function not covered" > async getPartnersList() {</span>
1866
+ <span class="cstat-no" title="statement not covered" > return [];</span>
1867
+ <span class="cstat-no" title="statement not covered" > }</span>
1868
+ }
1869
+ &nbsp;</pre></td></tr></table></pre>
1870
+
1871
+ <div class='push'></div><!-- for sticky footer -->
1872
+ </div><!-- /wrapper -->
1873
+ <div class='footer quiet pad2 space-top1 center small'>
1874
+ Code coverage generated by
1875
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1876
+ at 2025-12-04T13:25:46.227Z
1877
+ </div>
1878
+ <script src="../../../../prettify.js"></script>
1879
+ <script>
1880
+ window.onload = function () {
1881
+ prettyPrint();
1882
+ };
1883
+ </script>
1884
+ <script src="../../../../sorter.js"></script>
1885
+ <script src="../../../../block-navigation.js"></script>
1886
+ </body>
1887
+ </html>
1888
+