@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,2644 @@
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/changeNowSwapProvider.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> changeNowSwapProvider.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">85.69% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>731/853</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">86.32% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>202/234</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">76.92% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>10/13</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">85.69% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>731/853</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 high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a></td><td class="line-coverage quiet"><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">1x</span>
927
+ <span class="cline-any cline-yes">1x</span>
928
+ <span class="cline-any cline-yes">1x</span>
929
+ <span class="cline-any cline-yes">1x</span>
930
+ <span class="cline-any cline-yes">1x</span>
931
+ <span class="cline-any cline-yes">1x</span>
932
+ <span class="cline-any cline-yes">1x</span>
933
+ <span class="cline-any cline-yes">1x</span>
934
+ <span class="cline-any cline-yes">1x</span>
935
+ <span class="cline-any cline-yes">1x</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">1x</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">1x</span>
954
+ <span class="cline-any cline-yes">1x</span>
955
+ <span class="cline-any cline-yes">1x</span>
956
+ <span class="cline-any cline-yes">1x</span>
957
+ <span class="cline-any cline-yes">1x</span>
958
+ <span class="cline-any cline-yes">1x</span>
959
+ <span class="cline-any cline-yes">1x</span>
960
+ <span class="cline-any cline-yes">1x</span>
961
+ <span class="cline-any cline-yes">1x</span>
962
+ <span class="cline-any cline-yes">1x</span>
963
+ <span class="cline-any cline-yes">1x</span>
964
+ <span class="cline-any cline-yes">1x</span>
965
+ <span class="cline-any cline-yes">1x</span>
966
+ <span class="cline-any cline-yes">1x</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">1x</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-yes">1x</span>
984
+ <span class="cline-any cline-yes">1x</span>
985
+ <span class="cline-any cline-yes">1x</span>
986
+ <span class="cline-any cline-yes">1x</span>
987
+ <span class="cline-any cline-yes">1x</span>
988
+ <span class="cline-any cline-yes">1x</span>
989
+ <span class="cline-any cline-yes">1x</span>
990
+ <span class="cline-any cline-yes">1x</span>
991
+ <span class="cline-any cline-yes">1x</span>
992
+ <span class="cline-any cline-yes">1x</span>
993
+ <span class="cline-any cline-yes">1x</span>
994
+ <span class="cline-any cline-yes">1x</span>
995
+ <span class="cline-any cline-yes">1x</span>
996
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1006
+ <span class="cline-any cline-yes">1x</span>
1007
+ <span class="cline-any cline-yes">1x</span>
1008
+ <span class="cline-any cline-yes">1x</span>
1009
+ <span class="cline-any cline-yes">1x</span>
1010
+ <span class="cline-any cline-yes">1x</span>
1011
+ <span class="cline-any cline-yes">1x</span>
1012
+ <span class="cline-any cline-yes">1x</span>
1013
+ <span class="cline-any cline-yes">1x</span>
1014
+ <span class="cline-any cline-yes">1x</span>
1015
+ <span class="cline-any cline-yes">1x</span>
1016
+ <span class="cline-any cline-yes">1x</span>
1017
+ <span class="cline-any cline-yes">1x</span>
1018
+ <span class="cline-any cline-yes">1x</span>
1019
+ <span class="cline-any cline-yes">1x</span>
1020
+ <span class="cline-any cline-yes">1x</span>
1021
+ <span class="cline-any cline-yes">1x</span>
1022
+ <span class="cline-any cline-yes">1x</span>
1023
+ <span class="cline-any cline-yes">1x</span>
1024
+ <span class="cline-any cline-yes">1x</span>
1025
+ <span class="cline-any cline-yes">1x</span>
1026
+ <span class="cline-any cline-yes">1x</span>
1027
+ <span class="cline-any cline-yes">1x</span>
1028
+ <span class="cline-any cline-yes">1x</span>
1029
+ <span class="cline-any cline-yes">1x</span>
1030
+ <span class="cline-any cline-yes">1x</span>
1031
+ <span class="cline-any cline-yes">1x</span>
1032
+ <span class="cline-any cline-yes">1x</span>
1033
+ <span class="cline-any cline-yes">1x</span>
1034
+ <span class="cline-any cline-yes">1x</span>
1035
+ <span class="cline-any cline-yes">1x</span>
1036
+ <span class="cline-any cline-yes">1x</span>
1037
+ <span class="cline-any cline-yes">1x</span>
1038
+ <span class="cline-any cline-yes">1x</span>
1039
+ <span class="cline-any cline-yes">1x</span>
1040
+ <span class="cline-any cline-yes">1x</span>
1041
+ <span class="cline-any cline-yes">1x</span>
1042
+ <span class="cline-any cline-yes">1x</span>
1043
+ <span class="cline-any cline-yes">1x</span>
1044
+ <span class="cline-any cline-yes">1x</span>
1045
+ <span class="cline-any cline-yes">1x</span>
1046
+ <span class="cline-any cline-yes">1x</span>
1047
+ <span class="cline-any cline-yes">1x</span>
1048
+ <span class="cline-any cline-yes">78x</span>
1049
+ <span class="cline-any cline-yes">78x</span>
1050
+ <span class="cline-any cline-yes">78x</span>
1051
+ <span class="cline-any cline-yes">78x</span>
1052
+ <span class="cline-any cline-yes">78x</span>
1053
+ <span class="cline-any cline-yes">78x</span>
1054
+ <span class="cline-any cline-yes">78x</span>
1055
+ <span class="cline-any cline-yes">78x</span>
1056
+ <span class="cline-any cline-yes">78x</span>
1057
+ <span class="cline-any cline-yes">78x</span>
1058
+ <span class="cline-any cline-yes">78x</span>
1059
+ <span class="cline-any cline-yes">78x</span>
1060
+ <span class="cline-any cline-yes">78x</span>
1061
+ <span class="cline-any cline-yes">78x</span>
1062
+ <span class="cline-any cline-yes">78x</span>
1063
+ <span class="cline-any cline-yes">78x</span>
1064
+ <span class="cline-any cline-yes">78x</span>
1065
+ <span class="cline-any cline-yes">78x</span>
1066
+ <span class="cline-any cline-yes">78x</span>
1067
+ <span class="cline-any cline-yes">78x</span>
1068
+ <span class="cline-any cline-yes">78x</span>
1069
+ <span class="cline-any cline-yes">78x</span>
1070
+ <span class="cline-any cline-yes">78x</span>
1071
+ <span class="cline-any cline-yes">78x</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-yes">1x</span>
1084
+ <span class="cline-any cline-yes">1x</span>
1085
+ <span class="cline-any cline-yes">1x</span>
1086
+ <span class="cline-any cline-yes">1x</span>
1087
+ <span class="cline-any cline-yes">1x</span>
1088
+ <span class="cline-any cline-yes">1x</span>
1089
+ <span class="cline-any cline-yes">1x</span>
1090
+ <span class="cline-any cline-yes">1x</span>
1091
+ <span class="cline-any cline-yes">1x</span>
1092
+ <span class="cline-any cline-yes">1x</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-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-no">&nbsp;</span>
1100
+ <span class="cline-any cline-no">&nbsp;</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">4x</span>
1105
+ <span class="cline-any cline-yes">4x</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">3x</span>
1109
+ <span class="cline-any cline-yes">3x</span>
1110
+ <span class="cline-any cline-yes">3x</span>
1111
+ <span class="cline-any cline-yes">3x</span>
1112
+ <span class="cline-any cline-yes">3x</span>
1113
+ <span class="cline-any cline-yes">3x</span>
1114
+ <span class="cline-any cline-yes">4x</span>
1115
+ <span class="cline-any cline-yes">2x</span>
1116
+ <span class="cline-any cline-yes">2x</span>
1117
+ <span class="cline-any cline-yes">2x</span>
1118
+ <span class="cline-any cline-yes">2x</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-no">&nbsp;</span>
1125
+ <span class="cline-any cline-no">&nbsp;</span>
1126
+ <span class="cline-any cline-no">&nbsp;</span>
1127
+ <span class="cline-any cline-no">&nbsp;</span>
1128
+ <span class="cline-any cline-no">&nbsp;</span>
1129
+ <span class="cline-any cline-no">&nbsp;</span>
1130
+ <span class="cline-any cline-no">&nbsp;</span>
1131
+ <span class="cline-any cline-no">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-no">&nbsp;</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-no">&nbsp;</span>
1144
+ <span class="cline-any cline-no">&nbsp;</span>
1145
+ <span class="cline-any cline-no">&nbsp;</span>
1146
+ <span class="cline-any cline-no">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-no">&nbsp;</span>
1149
+ <span class="cline-any cline-no">&nbsp;</span>
1150
+ <span class="cline-any cline-no">&nbsp;</span>
1151
+ <span class="cline-any cline-no">&nbsp;</span>
1152
+ <span class="cline-any cline-no">&nbsp;</span>
1153
+ <span class="cline-any cline-no">&nbsp;</span>
1154
+ <span class="cline-any cline-no">&nbsp;</span>
1155
+ <span class="cline-any cline-no">&nbsp;</span>
1156
+ <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-no">&nbsp;</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-no">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-no">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-no">&nbsp;</span>
1172
+ <span class="cline-any cline-no">&nbsp;</span>
1173
+ <span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-no">&nbsp;</span>
1176
+ <span class="cline-any cline-no">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-no">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-no">&nbsp;</span>
1197
+ <span class="cline-any cline-no">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-no">&nbsp;</span>
1207
+ <span class="cline-any cline-yes">1x</span>
1208
+ <span class="cline-any cline-yes">1x</span>
1209
+ <span class="cline-any cline-yes">1x</span>
1210
+ <span class="cline-any cline-yes">1x</span>
1211
+ <span class="cline-any cline-yes">1x</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">4x</span>
1215
+ <span class="cline-any cline-yes">2x</span>
1216
+ <span class="cline-any cline-yes">2x</span>
1217
+ <span class="cline-any cline-yes">4x</span>
1218
+ <span class="cline-any cline-yes">1x</span>
1219
+ <span class="cline-any cline-yes">1x</span>
1220
+ <span class="cline-any cline-yes">4x</span>
1221
+ <span class="cline-any cline-yes">4x</span>
1222
+ <span class="cline-any cline-yes">4x</span>
1223
+ <span class="cline-any cline-yes">1x</span>
1224
+ <span class="cline-any cline-yes">1x</span>
1225
+ <span class="cline-any cline-yes">3x</span>
1226
+ <span class="cline-any cline-yes">3x</span>
1227
+ <span class="cline-any cline-yes">4x</span>
1228
+ <span class="cline-any cline-yes">4x</span>
1229
+ <span class="cline-any cline-yes">4x</span>
1230
+ <span class="cline-any cline-yes">4x</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-yes">3x</span>
1234
+ <span class="cline-any cline-yes">3x</span>
1235
+ <span class="cline-any cline-yes">3x</span>
1236
+ <span class="cline-any cline-yes">3x</span>
1237
+ <span class="cline-any cline-yes">3x</span>
1238
+ <span class="cline-any cline-yes">3x</span>
1239
+ <span class="cline-any cline-yes">3x</span>
1240
+ <span class="cline-any cline-yes">4x</span>
1241
+ <span class="cline-any cline-yes">2x</span>
1242
+ <span class="cline-any cline-yes">2x</span>
1243
+ <span class="cline-any cline-yes">1x</span>
1244
+ <span class="cline-any cline-yes">1x</span>
1245
+ <span class="cline-any cline-yes">1x</span>
1246
+ <span class="cline-any cline-yes">1x</span>
1247
+ <span class="cline-any cline-yes">1x</span>
1248
+ <span class="cline-any cline-yes">2x</span>
1249
+ <span class="cline-any cline-yes">2x</span>
1250
+ <span class="cline-any cline-yes">1x</span>
1251
+ <span class="cline-any cline-yes">1x</span>
1252
+ <span class="cline-any cline-yes">1x</span>
1253
+ <span class="cline-any cline-yes">1x</span>
1254
+ <span class="cline-any cline-yes">1x</span>
1255
+ <span class="cline-any cline-yes">1x</span>
1256
+ <span class="cline-any cline-yes">1x</span>
1257
+ <span class="cline-any cline-yes">4x</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-yes">4x</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">21x</span>
1265
+ <span class="cline-any cline-yes">21x</span>
1266
+ <span class="cline-any cline-yes">21x</span>
1267
+ <span class="cline-any cline-yes">21x</span>
1268
+ <span class="cline-any cline-yes">21x</span>
1269
+ <span class="cline-any cline-yes">21x</span>
1270
+ <span class="cline-any cline-yes">21x</span>
1271
+ <span class="cline-any cline-yes">21x</span>
1272
+ <span class="cline-any cline-yes">21x</span>
1273
+ <span class="cline-any cline-yes">21x</span>
1274
+ <span class="cline-any cline-yes">21x</span>
1275
+ <span class="cline-any cline-yes">21x</span>
1276
+ <span class="cline-any cline-yes">21x</span>
1277
+ <span class="cline-any cline-yes">21x</span>
1278
+ <span class="cline-any cline-yes">21x</span>
1279
+ <span class="cline-any cline-yes">20x</span>
1280
+ <span class="cline-any cline-yes">21x</span>
1281
+ <span class="cline-any cline-yes">2x</span>
1282
+ <span class="cline-any cline-yes">2x</span>
1283
+ <span class="cline-any cline-yes">19x</span>
1284
+ <span class="cline-any cline-yes">19x</span>
1285
+ <span class="cline-any cline-yes">19x</span>
1286
+ <span class="cline-any cline-yes">19x</span>
1287
+ <span class="cline-any cline-yes">21x</span>
1288
+ <span class="cline-any cline-yes">21x</span>
1289
+ <span class="cline-any cline-yes">21x</span>
1290
+ <span class="cline-any cline-yes">21x</span>
1291
+ <span class="cline-any cline-yes">21x</span>
1292
+ <span class="cline-any cline-yes">15x</span>
1293
+ <span class="cline-any cline-yes">21x</span>
1294
+ <span class="cline-any cline-yes">4x</span>
1295
+ <span class="cline-any cline-yes">4x</span>
1296
+ <span class="cline-any cline-yes">4x</span>
1297
+ <span class="cline-any cline-yes">4x</span>
1298
+ <span class="cline-any cline-yes">4x</span>
1299
+ <span class="cline-any cline-yes">4x</span>
1300
+ <span class="cline-any cline-yes">4x</span>
1301
+ <span class="cline-any cline-yes">15x</span>
1302
+ <span class="cline-any cline-yes">15x</span>
1303
+ <span class="cline-any cline-yes">15x</span>
1304
+ <span class="cline-any cline-yes">15x</span>
1305
+ <span class="cline-any cline-yes">15x</span>
1306
+ <span class="cline-any cline-yes">15x</span>
1307
+ <span class="cline-any cline-yes">15x</span>
1308
+ <span class="cline-any cline-yes">15x</span>
1309
+ <span class="cline-any cline-yes">15x</span>
1310
+ <span class="cline-any cline-yes">15x</span>
1311
+ <span class="cline-any cline-yes">15x</span>
1312
+ <span class="cline-any cline-yes">15x</span>
1313
+ <span class="cline-any cline-yes">15x</span>
1314
+ <span class="cline-any cline-yes">15x</span>
1315
+ <span class="cline-any cline-yes">21x</span>
1316
+ <span class="cline-any cline-yes">21x</span>
1317
+ <span class="cline-any cline-yes">21x</span>
1318
+ <span class="cline-any cline-yes">21x</span>
1319
+ <span class="cline-any cline-yes">21x</span>
1320
+ <span class="cline-any cline-yes">21x</span>
1321
+ <span class="cline-any cline-yes">13x</span>
1322
+ <span class="cline-any cline-yes">13x</span>
1323
+ <span class="cline-any cline-yes">3x</span>
1324
+ <span class="cline-any cline-yes">3x</span>
1325
+ <span class="cline-any cline-yes">3x</span>
1326
+ <span class="cline-any cline-yes">3x</span>
1327
+ <span class="cline-any cline-yes">13x</span>
1328
+ <span class="cline-any cline-yes">3x</span>
1329
+ <span class="cline-any cline-yes">3x</span>
1330
+ <span class="cline-any cline-yes">3x</span>
1331
+ <span class="cline-any cline-yes">3x</span>
1332
+ <span class="cline-any cline-yes">21x</span>
1333
+ <span class="cline-any cline-yes">1x</span>
1334
+ <span class="cline-any cline-yes">1x</span>
1335
+ <span class="cline-any cline-yes">1x</span>
1336
+ <span class="cline-any cline-yes">1x</span>
1337
+ <span class="cline-any cline-yes">1x</span>
1338
+ <span class="cline-any cline-yes">1x</span>
1339
+ <span class="cline-any cline-yes">1x</span>
1340
+ <span class="cline-any cline-yes">21x</span>
1341
+ <span class="cline-any cline-yes">1x</span>
1342
+ <span class="cline-any cline-yes">1x</span>
1343
+ <span class="cline-any cline-yes">15x</span>
1344
+ <span class="cline-any cline-yes">21x</span>
1345
+ <span class="cline-any cline-yes">1x</span>
1346
+ <span class="cline-any cline-yes">1x</span>
1347
+ <span class="cline-any cline-yes">1x</span>
1348
+ <span class="cline-any cline-yes">1x</span>
1349
+ <span class="cline-any cline-yes">1x</span>
1350
+ <span class="cline-any cline-yes">1x</span>
1351
+ <span class="cline-any cline-yes">1x</span>
1352
+ <span class="cline-any cline-yes">21x</span>
1353
+ <span class="cline-any cline-yes">1x</span>
1354
+ <span class="cline-any cline-yes">1x</span>
1355
+ <span class="cline-any cline-yes">1x</span>
1356
+ <span class="cline-any cline-yes">1x</span>
1357
+ <span class="cline-any cline-yes">1x</span>
1358
+ <span class="cline-any cline-yes">1x</span>
1359
+ <span class="cline-any cline-yes">1x</span>
1360
+ <span class="cline-any cline-yes">13x</span>
1361
+ <span class="cline-any cline-yes">13x</span>
1362
+ <span class="cline-any cline-yes">13x</span>
1363
+ <span class="cline-any cline-yes">13x</span>
1364
+ <span class="cline-any cline-yes">21x</span>
1365
+ <span class="cline-any cline-yes">21x</span>
1366
+ <span class="cline-any cline-yes">21x</span>
1367
+ <span class="cline-any cline-yes">21x</span>
1368
+ <span class="cline-any cline-yes">21x</span>
1369
+ <span class="cline-any cline-yes">2x</span>
1370
+ <span class="cline-any cline-yes">21x</span>
1371
+ <span class="cline-any cline-yes">11x</span>
1372
+ <span class="cline-any cline-yes">11x</span>
1373
+ <span class="cline-any cline-yes">13x</span>
1374
+ <span class="cline-any cline-yes">13x</span>
1375
+ <span class="cline-any cline-yes">13x</span>
1376
+ <span class="cline-any cline-yes">13x</span>
1377
+ <span class="cline-any cline-yes">13x</span>
1378
+ <span class="cline-any cline-yes">21x</span>
1379
+ <span class="cline-any cline-yes">2x</span>
1380
+ <span class="cline-any cline-yes">2x</span>
1381
+ <span class="cline-any cline-yes">2x</span>
1382
+ <span class="cline-any cline-yes">2x</span>
1383
+ <span class="cline-any cline-yes">10x</span>
1384
+ <span class="cline-any cline-yes">10x</span>
1385
+ <span class="cline-any cline-yes">21x</span>
1386
+ <span class="cline-any cline-yes">21x</span>
1387
+ <span class="cline-any cline-yes">21x</span>
1388
+ <span class="cline-any cline-yes">21x</span>
1389
+ <span class="cline-any cline-yes">21x</span>
1390
+ <span class="cline-any cline-yes">21x</span>
1391
+ <span class="cline-any cline-yes">21x</span>
1392
+ <span class="cline-any cline-yes">21x</span>
1393
+ <span class="cline-any cline-yes">21x</span>
1394
+ <span class="cline-any cline-yes">21x</span>
1395
+ <span class="cline-any cline-yes">21x</span>
1396
+ <span class="cline-any cline-yes">21x</span>
1397
+ <span class="cline-any cline-yes">21x</span>
1398
+ <span class="cline-any cline-yes">21x</span>
1399
+ <span class="cline-any cline-yes">21x</span>
1400
+ <span class="cline-any cline-yes">21x</span>
1401
+ <span class="cline-any cline-yes">21x</span>
1402
+ <span class="cline-any cline-yes">21x</span>
1403
+ <span class="cline-any cline-yes">21x</span>
1404
+ <span class="cline-any cline-yes">21x</span>
1405
+ <span class="cline-any cline-yes">21x</span>
1406
+ <span class="cline-any cline-yes">21x</span>
1407
+ <span class="cline-any cline-yes">21x</span>
1408
+ <span class="cline-any cline-yes">21x</span>
1409
+ <span class="cline-any cline-yes">21x</span>
1410
+ <span class="cline-any cline-yes">21x</span>
1411
+ <span class="cline-any cline-yes">21x</span>
1412
+ <span class="cline-any cline-yes">21x</span>
1413
+ <span class="cline-any cline-yes">21x</span>
1414
+ <span class="cline-any cline-yes">21x</span>
1415
+ <span class="cline-any cline-yes">21x</span>
1416
+ <span class="cline-any cline-yes">21x</span>
1417
+ <span class="cline-any cline-yes">5x</span>
1418
+ <span class="cline-any cline-no">&nbsp;</span>
1419
+ <span class="cline-any cline-no">&nbsp;</span>
1420
+ <span class="cline-any cline-no">&nbsp;</span>
1421
+ <span class="cline-any cline-no">&nbsp;</span>
1422
+ <span class="cline-any cline-no">&nbsp;</span>
1423
+ <span class="cline-any cline-no">&nbsp;</span>
1424
+ <span class="cline-any cline-no">&nbsp;</span>
1425
+ <span class="cline-any cline-yes">5x</span>
1426
+ <span class="cline-any cline-yes">5x</span>
1427
+ <span class="cline-any cline-yes">5x</span>
1428
+ <span class="cline-any cline-yes">21x</span>
1429
+ <span class="cline-any cline-yes">1x</span>
1430
+ <span class="cline-any cline-yes">1x</span>
1431
+ <span class="cline-any cline-yes">42x</span>
1432
+ <span class="cline-any cline-yes">42x</span>
1433
+ <span class="cline-any cline-yes">42x</span>
1434
+ <span class="cline-any cline-yes">42x</span>
1435
+ <span class="cline-any cline-yes">42x</span>
1436
+ <span class="cline-any cline-yes">42x</span>
1437
+ <span class="cline-any cline-yes">42x</span>
1438
+ <span class="cline-any cline-yes">42x</span>
1439
+ <span class="cline-any cline-yes">42x</span>
1440
+ <span class="cline-any cline-yes">42x</span>
1441
+ <span class="cline-any cline-yes">42x</span>
1442
+ <span class="cline-any cline-yes">42x</span>
1443
+ <span class="cline-any cline-yes">42x</span>
1444
+ <span class="cline-any cline-yes">42x</span>
1445
+ <span class="cline-any cline-yes">42x</span>
1446
+ <span class="cline-any cline-yes">42x</span>
1447
+ <span class="cline-any cline-yes">42x</span>
1448
+ <span class="cline-any cline-yes">42x</span>
1449
+ <span class="cline-any cline-yes">38x</span>
1450
+ <span class="cline-any cline-yes">42x</span>
1451
+ <span class="cline-any cline-yes">6x</span>
1452
+ <span class="cline-any cline-yes">6x</span>
1453
+ <span class="cline-any cline-yes">36x</span>
1454
+ <span class="cline-any cline-yes">42x</span>
1455
+ <span class="cline-any cline-yes">1x</span>
1456
+ <span class="cline-any cline-yes">1x</span>
1457
+ <span class="cline-any cline-yes">35x</span>
1458
+ <span class="cline-any cline-yes">35x</span>
1459
+ <span class="cline-any cline-yes">35x</span>
1460
+ <span class="cline-any cline-yes">35x</span>
1461
+ <span class="cline-any cline-yes">35x</span>
1462
+ <span class="cline-any cline-yes">35x</span>
1463
+ <span class="cline-any cline-yes">42x</span>
1464
+ <span class="cline-any cline-yes">2x</span>
1465
+ <span class="cline-any cline-yes">2x</span>
1466
+ <span class="cline-any cline-yes">2x</span>
1467
+ <span class="cline-any cline-yes">2x</span>
1468
+ <span class="cline-any cline-yes">2x</span>
1469
+ <span class="cline-any cline-yes">2x</span>
1470
+ <span class="cline-any cline-yes">33x</span>
1471
+ <span class="cline-any cline-yes">33x</span>
1472
+ <span class="cline-any cline-yes">33x</span>
1473
+ <span class="cline-any cline-yes">33x</span>
1474
+ <span class="cline-any cline-yes">33x</span>
1475
+ <span class="cline-any cline-yes">33x</span>
1476
+ <span class="cline-any cline-yes">33x</span>
1477
+ <span class="cline-any cline-yes">33x</span>
1478
+ <span class="cline-any cline-yes">33x</span>
1479
+ <span class="cline-any cline-yes">33x</span>
1480
+ <span class="cline-any cline-yes">33x</span>
1481
+ <span class="cline-any cline-yes">33x</span>
1482
+ <span class="cline-any cline-yes">42x</span>
1483
+ <span class="cline-any cline-yes">2x</span>
1484
+ <span class="cline-any cline-yes">2x</span>
1485
+ <span class="cline-any cline-yes">2x</span>
1486
+ <span class="cline-any cline-yes">2x</span>
1487
+ <span class="cline-any cline-yes">2x</span>
1488
+ <span class="cline-any cline-yes">2x</span>
1489
+ <span class="cline-any cline-yes">42x</span>
1490
+ <span class="cline-any cline-yes">6x</span>
1491
+ <span class="cline-any cline-yes">6x</span>
1492
+ <span class="cline-any cline-yes">6x</span>
1493
+ <span class="cline-any cline-yes">6x</span>
1494
+ <span class="cline-any cline-yes">6x</span>
1495
+ <span class="cline-any cline-yes">6x</span>
1496
+ <span class="cline-any cline-yes">6x</span>
1497
+ <span class="cline-any cline-yes">2x</span>
1498
+ <span class="cline-any cline-yes">2x</span>
1499
+ <span class="cline-any cline-yes">2x</span>
1500
+ <span class="cline-any cline-yes">2x</span>
1501
+ <span class="cline-any cline-yes">2x</span>
1502
+ <span class="cline-any cline-yes">2x</span>
1503
+ <span class="cline-any cline-yes">6x</span>
1504
+ <span class="cline-any cline-yes">29x</span>
1505
+ <span class="cline-any cline-yes">29x</span>
1506
+ <span class="cline-any cline-yes">29x</span>
1507
+ <span class="cline-any cline-yes">29x</span>
1508
+ <span class="cline-any cline-yes">29x</span>
1509
+ <span class="cline-any cline-yes">29x</span>
1510
+ <span class="cline-any cline-yes">29x</span>
1511
+ <span class="cline-any cline-yes">42x</span>
1512
+ <span class="cline-any cline-yes">42x</span>
1513
+ <span class="cline-any cline-yes">29x</span>
1514
+ <span class="cline-any cline-yes">42x</span>
1515
+ <span class="cline-any cline-yes">1x</span>
1516
+ <span class="cline-any cline-yes">42x</span>
1517
+ <span class="cline-any cline-yes">28x</span>
1518
+ <span class="cline-any cline-yes">28x</span>
1519
+ <span class="cline-any cline-yes">42x</span>
1520
+ <span class="cline-any cline-yes">2x</span>
1521
+ <span class="cline-any cline-yes">2x</span>
1522
+ <span class="cline-any cline-yes">2x</span>
1523
+ <span class="cline-any cline-yes">2x</span>
1524
+ <span class="cline-any cline-yes">2x</span>
1525
+ <span class="cline-any cline-no">&nbsp;</span>
1526
+ <span class="cline-any cline-no">&nbsp;</span>
1527
+ <span class="cline-any cline-yes">2x</span>
1528
+ <span class="cline-any cline-yes">42x</span>
1529
+ <span class="cline-any cline-yes">42x</span>
1530
+ <span class="cline-any cline-yes">42x</span>
1531
+ <span class="cline-any cline-yes">29x</span>
1532
+ <span class="cline-any cline-yes">29x</span>
1533
+ <span class="cline-any cline-yes">29x</span>
1534
+ <span class="cline-any cline-yes">29x</span>
1535
+ <span class="cline-any cline-yes">29x</span>
1536
+ <span class="cline-any cline-yes">29x</span>
1537
+ <span class="cline-any cline-yes">29x</span>
1538
+ <span class="cline-any cline-yes">26x</span>
1539
+ <span class="cline-any cline-yes">26x</span>
1540
+ <span class="cline-any cline-yes">26x</span>
1541
+ <span class="cline-any cline-yes">26x</span>
1542
+ <span class="cline-any cline-yes">26x</span>
1543
+ <span class="cline-any cline-yes">42x</span>
1544
+ <span class="cline-any cline-yes">6x</span>
1545
+ <span class="cline-any cline-yes">6x</span>
1546
+ <span class="cline-any cline-yes">6x</span>
1547
+ <span class="cline-any cline-yes">6x</span>
1548
+ <span class="cline-any cline-yes">6x</span>
1549
+ <span class="cline-any cline-yes">6x</span>
1550
+ <span class="cline-any cline-yes">6x</span>
1551
+ <span class="cline-any cline-yes">6x</span>
1552
+ <span class="cline-any cline-no">&nbsp;</span>
1553
+ <span class="cline-any cline-no">&nbsp;</span>
1554
+ <span class="cline-any cline-no">&nbsp;</span>
1555
+ <span class="cline-any cline-no">&nbsp;</span>
1556
+ <span class="cline-any cline-no">&nbsp;</span>
1557
+ <span class="cline-any cline-no">&nbsp;</span>
1558
+ <span class="cline-any cline-no">&nbsp;</span>
1559
+ <span class="cline-any cline-yes">6x</span>
1560
+ <span class="cline-any cline-yes">6x</span>
1561
+ <span class="cline-any cline-yes">6x</span>
1562
+ <span class="cline-any cline-yes">6x</span>
1563
+ <span class="cline-any cline-yes">6x</span>
1564
+ <span class="cline-any cline-yes">6x</span>
1565
+ <span class="cline-any cline-yes">6x</span>
1566
+ <span class="cline-any cline-yes">20x</span>
1567
+ <span class="cline-any cline-yes">42x</span>
1568
+ <span class="cline-any cline-yes">42x</span>
1569
+ <span class="cline-any cline-yes">42x</span>
1570
+ <span class="cline-any cline-yes">42x</span>
1571
+ <span class="cline-any cline-yes">42x</span>
1572
+ <span class="cline-any cline-yes">42x</span>
1573
+ <span class="cline-any cline-yes">42x</span>
1574
+ <span class="cline-any cline-yes">42x</span>
1575
+ <span class="cline-any cline-yes">18x</span>
1576
+ <span class="cline-any cline-yes">18x</span>
1577
+ <span class="cline-any cline-yes">42x</span>
1578
+ <span class="cline-any cline-yes">42x</span>
1579
+ <span class="cline-any cline-yes">42x</span>
1580
+ <span class="cline-any cline-yes">42x</span>
1581
+ <span class="cline-any cline-yes">42x</span>
1582
+ <span class="cline-any cline-yes">42x</span>
1583
+ <span class="cline-any cline-yes">42x</span>
1584
+ <span class="cline-any cline-yes">42x</span>
1585
+ <span class="cline-any cline-yes">42x</span>
1586
+ <span class="cline-any cline-yes">42x</span>
1587
+ <span class="cline-any cline-yes">42x</span>
1588
+ <span class="cline-any cline-yes">42x</span>
1589
+ <span class="cline-any cline-yes">42x</span>
1590
+ <span class="cline-any cline-yes">42x</span>
1591
+ <span class="cline-any cline-yes">42x</span>
1592
+ <span class="cline-any cline-yes">42x</span>
1593
+ <span class="cline-any cline-yes">12x</span>
1594
+ <span class="cline-any cline-yes">12x</span>
1595
+ <span class="cline-any cline-no">&nbsp;</span>
1596
+ <span class="cline-any cline-no">&nbsp;</span>
1597
+ <span class="cline-any cline-no">&nbsp;</span>
1598
+ <span class="cline-any cline-no">&nbsp;</span>
1599
+ <span class="cline-any cline-no">&nbsp;</span>
1600
+ <span class="cline-any cline-no">&nbsp;</span>
1601
+ <span class="cline-any cline-yes">12x</span>
1602
+ <span class="cline-any cline-yes">12x</span>
1603
+ <span class="cline-any cline-yes">2x</span>
1604
+ <span class="cline-any cline-yes">2x</span>
1605
+ <span class="cline-any cline-yes">2x</span>
1606
+ <span class="cline-any cline-yes">2x</span>
1607
+ <span class="cline-any cline-yes">2x</span>
1608
+ <span class="cline-any cline-yes">2x</span>
1609
+ <span class="cline-any cline-yes">2x</span>
1610
+ <span class="cline-any cline-yes">10x</span>
1611
+ <span class="cline-any cline-yes">10x</span>
1612
+ <span class="cline-any cline-yes">10x</span>
1613
+ <span class="cline-any cline-yes">42x</span>
1614
+ <span class="cline-any cline-yes">1x</span>
1615
+ <span class="cline-any cline-yes">1x</span>
1616
+ <span class="cline-any cline-yes">12x</span>
1617
+ <span class="cline-any cline-yes">12x</span>
1618
+ <span class="cline-any cline-yes">12x</span>
1619
+ <span class="cline-any cline-yes">1x</span>
1620
+ <span class="cline-any cline-yes">1x</span>
1621
+ <span class="cline-any cline-yes">11x</span>
1622
+ <span class="cline-any cline-yes">10x</span>
1623
+ <span class="cline-any cline-yes">12x</span>
1624
+ <span class="cline-any cline-yes">23x</span>
1625
+ <span class="cline-any cline-yes">23x</span>
1626
+ <span class="cline-any cline-yes">23x</span>
1627
+ <span class="cline-any cline-yes">23x</span>
1628
+ <span class="cline-any cline-yes">23x</span>
1629
+ <span class="cline-any cline-yes">23x</span>
1630
+ <span class="cline-any cline-yes">23x</span>
1631
+ <span class="cline-any cline-yes">23x</span>
1632
+ <span class="cline-any cline-yes">2x</span>
1633
+ <span class="cline-any cline-yes">2x</span>
1634
+ <span class="cline-any cline-yes">20x</span>
1635
+ <span class="cline-any cline-yes">23x</span>
1636
+ <span class="cline-any cline-yes">23x</span>
1637
+ <span class="cline-any cline-yes">23x</span>
1638
+ <span class="cline-any cline-yes">23x</span>
1639
+ <span class="cline-any cline-yes">23x</span>
1640
+ <span class="cline-any cline-yes">23x</span>
1641
+ <span class="cline-any cline-yes">1x</span>
1642
+ <span class="cline-any cline-yes">23x</span>
1643
+ <span class="cline-any cline-yes">19x</span>
1644
+ <span class="cline-any cline-yes">19x</span>
1645
+ <span class="cline-any cline-yes">19x</span>
1646
+ <span class="cline-any cline-yes">23x</span>
1647
+ <span class="cline-any cline-yes">23x</span>
1648
+ <span class="cline-any cline-yes">23x</span>
1649
+ <span class="cline-any cline-yes">23x</span>
1650
+ <span class="cline-any cline-yes">23x</span>
1651
+ <span class="cline-any cline-yes">23x</span>
1652
+ <span class="cline-any cline-yes">23x</span>
1653
+ <span class="cline-any cline-yes">23x</span>
1654
+ <span class="cline-any cline-yes">23x</span>
1655
+ <span class="cline-any cline-yes">23x</span>
1656
+ <span class="cline-any cline-yes">23x</span>
1657
+ <span class="cline-any cline-yes">23x</span>
1658
+ <span class="cline-any cline-yes">23x</span>
1659
+ <span class="cline-any cline-yes">23x</span>
1660
+ <span class="cline-any cline-yes">23x</span>
1661
+ <span class="cline-any cline-yes">23x</span>
1662
+ <span class="cline-any cline-yes">23x</span>
1663
+ <span class="cline-any cline-yes">23x</span>
1664
+ <span class="cline-any cline-yes">23x</span>
1665
+ <span class="cline-any cline-yes">23x</span>
1666
+ <span class="cline-any cline-yes">23x</span>
1667
+ <span class="cline-any cline-yes">23x</span>
1668
+ <span class="cline-any cline-yes">23x</span>
1669
+ <span class="cline-any cline-yes">23x</span>
1670
+ <span class="cline-any cline-yes">23x</span>
1671
+ <span class="cline-any cline-yes">20x</span>
1672
+ <span class="cline-any cline-yes">20x</span>
1673
+ <span class="cline-any cline-yes">20x</span>
1674
+ <span class="cline-any cline-yes">23x</span>
1675
+ <span class="cline-any cline-yes">23x</span>
1676
+ <span class="cline-any cline-yes">23x</span>
1677
+ <span class="cline-any cline-yes">39x</span>
1678
+ <span class="cline-any cline-yes">23x</span>
1679
+ <span class="cline-any cline-yes">23x</span>
1680
+ <span class="cline-any cline-yes">23x</span>
1681
+ <span class="cline-any cline-yes">23x</span>
1682
+ <span class="cline-any cline-yes">23x</span>
1683
+ <span class="cline-any cline-yes">23x</span>
1684
+ <span class="cline-any cline-yes">23x</span>
1685
+ <span class="cline-any cline-no">&nbsp;</span>
1686
+ <span class="cline-any cline-no">&nbsp;</span>
1687
+ <span class="cline-any cline-no">&nbsp;</span>
1688
+ <span class="cline-any cline-yes">23x</span>
1689
+ <span class="cline-any cline-yes">1x</span>
1690
+ <span class="cline-any cline-yes">1x</span>
1691
+ <span class="cline-any cline-yes">1x</span>
1692
+ <span class="cline-any cline-yes">20x</span>
1693
+ <span class="cline-any cline-yes">20x</span>
1694
+ <span class="cline-any cline-yes">20x</span>
1695
+ <span class="cline-any cline-yes">20x</span>
1696
+ <span class="cline-any cline-yes">20x</span>
1697
+ <span class="cline-any cline-yes">20x</span>
1698
+ <span class="cline-any cline-yes">20x</span>
1699
+ <span class="cline-any cline-yes">20x</span>
1700
+ <span class="cline-any cline-yes">20x</span>
1701
+ <span class="cline-any cline-yes">20x</span>
1702
+ <span class="cline-any cline-yes">20x</span>
1703
+ <span class="cline-any cline-yes">23x</span>
1704
+ <span class="cline-any cline-yes">23x</span>
1705
+ <span class="cline-any cline-yes">23x</span>
1706
+ <span class="cline-any cline-yes">23x</span>
1707
+ <span class="cline-any cline-yes">23x</span>
1708
+ <span class="cline-any cline-yes">23x</span>
1709
+ <span class="cline-any cline-yes">23x</span>
1710
+ <span class="cline-any cline-yes">23x</span>
1711
+ <span class="cline-any cline-yes">23x</span>
1712
+ <span class="cline-any cline-yes">23x</span>
1713
+ <span class="cline-any cline-yes">23x</span>
1714
+ <span class="cline-any cline-yes">23x</span>
1715
+ <span class="cline-any cline-yes">23x</span>
1716
+ <span class="cline-any cline-yes">23x</span>
1717
+ <span class="cline-any cline-yes">23x</span>
1718
+ <span class="cline-any cline-yes">23x</span>
1719
+ <span class="cline-any cline-yes">23x</span>
1720
+ <span class="cline-any cline-yes">23x</span>
1721
+ <span class="cline-any cline-yes">1x</span>
1722
+ <span class="cline-any cline-yes">1x</span>
1723
+ <span class="cline-any cline-yes">23x</span>
1724
+ <span class="cline-any cline-yes">23x</span>
1725
+ <span class="cline-any cline-yes">12x</span>
1726
+ <span class="cline-any cline-yes">1x</span>
1727
+ <span class="cline-any cline-yes">1x</span>
1728
+ <span class="cline-any cline-yes">1x</span>
1729
+ <span class="cline-any cline-yes">1x</span>
1730
+ <span class="cline-any cline-no">&nbsp;</span>
1731
+ <span class="cline-any cline-no">&nbsp;</span>
1732
+ <span class="cline-any cline-yes">12x</span>
1733
+ <span class="cline-any cline-yes">1x</span>
1734
+ <span class="cline-any cline-yes">1x</span>
1735
+ <span class="cline-any cline-yes">20x</span>
1736
+ <span class="cline-any cline-yes">20x</span>
1737
+ <span class="cline-any cline-yes">20x</span>
1738
+ <span class="cline-any cline-yes">7x</span>
1739
+ <span class="cline-any cline-no">&nbsp;</span>
1740
+ <span class="cline-any cline-no">&nbsp;</span>
1741
+ <span class="cline-any cline-yes">7x</span>
1742
+ <span class="cline-any cline-yes">20x</span>
1743
+ <span class="cline-any cline-yes">1x</span>
1744
+ <span class="cline-any cline-yes">20x</span>
1745
+ <span class="cline-any cline-yes">1x</span>
1746
+ <span class="cline-any cline-yes">20x</span>
1747
+ <span class="cline-any cline-yes">6x</span>
1748
+ <span class="cline-any cline-yes">20x</span>
1749
+ <span class="cline-any cline-yes">2x</span>
1750
+ <span class="cline-any cline-yes">20x</span>
1751
+ <span class="cline-any cline-yes">1x</span>
1752
+ <span class="cline-any cline-yes">20x</span>
1753
+ <span class="cline-any cline-yes">1x</span>
1754
+ <span class="cline-any cline-yes">20x</span>
1755
+ <span class="cline-any cline-yes">1x</span>
1756
+ <span class="cline-any cline-yes">20x</span>
1757
+ <span class="cline-any cline-no">&nbsp;</span>
1758
+ <span class="cline-any cline-yes">20x</span>
1759
+ <span class="cline-any cline-yes">20x</span>
1760
+ <span class="cline-any cline-yes">1x</span>
1761
+ <span class="cline-any cline-yes">1x</span>
1762
+ <span class="cline-any cline-yes">1x</span>
1763
+ <span class="cline-any cline-yes">1x</span>
1764
+ <span class="cline-any cline-yes">1x</span>
1765
+ <span class="cline-any cline-yes">1x</span>
1766
+ <span class="cline-any cline-yes">1x</span>
1767
+ <span class="cline-any cline-yes">1x</span>
1768
+ <span class="cline-any cline-yes">1x</span>
1769
+ <span class="cline-any cline-yes">1x</span>
1770
+ <span class="cline-any cline-yes">1x</span>
1771
+ <span class="cline-any cline-yes">1x</span>
1772
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import axios from "axios";
1773
+ import BigNumber from "bignumber.js";
1774
+ &nbsp;
1775
+ import { improveAndRethrow } from "../../common-apis/utils/errorUtils.js";
1776
+ import { DEFAULT_CRYPTO_DECIMAL_COUNT, FALLBACK_ASSET_ICON_URL } from "../../common-apis/globalConstants.jsx";
1777
+ import { Logger } from "../../common-apis/utils/logging/logger.js";
1778
+ import { Coin } from "../../common-apis/models/coin.js";
1779
+ import { Protocol } from "../../common-apis/models/protocol.js";
1780
+ import { safeStringify } from "../../common-apis/utils/safeStringify.js";
1781
+ import { AmountUtils } from "../../common-apis/utils/amountUtils.js";
1782
+ import { toRabbitTicker } from "../../common-apis/utils/rabbitTicker.js";
1783
+ &nbsp;
1784
+ import { SwapProvider } from "./swapProvider.js";
1785
+ import { SwapProviderCoinInfo } from "../models/swapProviderCoinInfo.js";
1786
+ import { ExistingSwap } from "../models/existingSwap.js";
1787
+ import { Partner, KYC_LEVELS } from "../models/partner.js";
1788
+ import { createRobustTimeoutSetupForAxios } from "./utils.js";
1789
+ import { detectIpBanFromProviderResponse } from "./retriableErrorsUtils.js";
1790
+ &nbsp;
1791
+ /**
1792
+ * Network remapping
1793
+ *
1794
+ * ChangeNOW returns their own `network` values (e.g., `eth`, `trx`, `bsc`).
1795
+ * We keep using those values when calling ChangeNOW, but we remap them into
1796
+ * Rabbit protocols for internal coin identity (ticker) and `Protocol`.
1797
+ *
1798
+ * provider: { ticker, network } → internal: toRabbitTicker(ticker, protocolSuffix)
1799
+ *
1800
+ * where `protocolSuffix` is taken from the table below (NETWORK_TO_RABBIT_PROTOCOL).
1801
+ */
1802
+ &nbsp;
1803
+ // ChangeNOW network → Rabbit protocol (UPPERCASE values)
1804
+ const NETWORK_TO_RABBIT_PROTOCOL = Object.freeze({
1805
+ ada: "ADA",
1806
+ akt: "AKT",
1807
+ algo: "ALGO",
1808
+ amb: "AMB",
1809
+ apt: "APT",
1810
+ arbitrum: "ARBITRUM",
1811
+ atom: "ATOM",
1812
+ avaxc: "AVAX-C",
1813
+ baby: "BABY",
1814
+ band: "BAND",
1815
+ base: "BASE",
1816
+ bch: "BCH",
1817
+ bera: "BERA",
1818
+ brise: "BRISE",
1819
+ bsc: "BEP20",
1820
+ bsv: "BSV",
1821
+ btc: "BTC",
1822
+ celo: "CELO",
1823
+ chz: "CHZ",
1824
+ core: "CORE",
1825
+ coreum: "COREUM",
1826
+ cro: "CRO",
1827
+ cspr: "CSPR",
1828
+ dash: "DASH",
1829
+ dcr: "DCR",
1830
+ dgb: "DGB",
1831
+ divi: "DIVI",
1832
+ doge: "DOGE",
1833
+ dot: "DOT",
1834
+ egld: "EGLD",
1835
+ etc: "ETC",
1836
+ eth: "ERC20",
1837
+ ethw: "ETHW",
1838
+ fet: "FET",
1839
+ fil: "FIL",
1840
+ flr: "FLR",
1841
+ ftn: "FTN",
1842
+ hbar: "HBAR",
1843
+ icx: "ICX",
1844
+ inj: "INJ",
1845
+ iotx: "IOTX",
1846
+ joy: "JOY",
1847
+ kaia: "KAIA",
1848
+ kas: "KAS",
1849
+ kava: "KAVA",
1850
+ klv: "KLV",
1851
+ kmd: "KMD",
1852
+ lna: "LINEA",
1853
+ ltc: "LTC",
1854
+ luna: "LUNA",
1855
+ lunc: "LUNC",
1856
+ manta: "MANTA",
1857
+ matic: "POLYGON",
1858
+ nano: "NANO",
1859
+ near: "NEAR",
1860
+ one: "ONE",
1861
+ ont: "ONT",
1862
+ op: "OP",
1863
+ opbnb: "OPBNB",
1864
+ osmo: "OSMO",
1865
+ pivx: "PIVX",
1866
+ pulse: "PLS",
1867
+ qtum: "QTUM",
1868
+ rvn: "RVN",
1869
+ sei: "SEI",
1870
+ sol: "SOL",
1871
+ sonic: "SONIC",
1872
+ strk: "STRK",
1873
+ stx: "STX",
1874
+ sui: "SUI",
1875
+ sxp: "SXP",
1876
+ sys: "SYSEVM",
1877
+ theta: "THETA",
1878
+ tia: "TIA",
1879
+ ton: "TON",
1880
+ trx: "TRC20",
1881
+ vet: "VET",
1882
+ waves: "WAVES",
1883
+ wemix: "WEMIX",
1884
+ xch: "XCH",
1885
+ xdc: "XDC",
1886
+ xec: "XEC",
1887
+ xlm: "XLM",
1888
+ xmr: "XMR",
1889
+ xrp: "XRP",
1890
+ xtz: "XTZ",
1891
+ xvg: "XVG",
1892
+ zec: "ZEC",
1893
+ zil: "ZIL",
1894
+ zksync: "ZKSYNC",
1895
+ xchain: "AVAX-X",
1896
+ cchain: "AVAX-C",
1897
+ });
1898
+ &nbsp;
1899
+ export class ChangeNowSwapProvider extends SwapProvider {
1900
+ constructor(
1901
+ apiKeysProxyUrl = null,
1902
+ cache,
1903
+ customCoinBuilder = <span class="fstat-no" title="function not covered" >(ticker, network) =&gt; null,</span>
1904
+ useRestrictedCoinsSet = true,
1905
+ apiKey = null
1906
+ ) {
1907
+ super("changenow", cache, customCoinBuilder, useRestrictedCoinsSet, false, true);
1908
+ this._apiKey = apiKey;
1909
+ this._URL = apiKey ? "https://api.changenow.io/v2" : `${apiKeysProxyUrl}/${this.id}`;
1910
+ this._commonHeaders = apiKey ? { "x-changenow-api-key": apiKey } : {};
1911
+ this._axiosGetPreset = {
1912
+ headers: this._commonHeaders,
1913
+ validateStatus: <span class="fstat-no" title="function not covered" >status =&gt; [200, 400, 404].includes(status),</span>
1914
+ };
1915
+ this._axiosPostPreset = {
1916
+ headers: { ...this._commonHeaders, "Content-Type": "application/json" },
1917
+ validateStatus: <span class="fstat-no" title="function not covered" >status =&gt; [200, 201, 400, 404].includes(status),</span>
1918
+ };
1919
+ &nbsp;
1920
+ // ChangeNOW doesn't auto-expire swaps; we consider them expired after 4 hours.
1921
+ this._swapExpirationMs = 4 * 60 * 60 * 1000;
1922
+ &nbsp;
1923
+ this._partners = [];
1924
+ }
1925
+ &nbsp;
1926
+ getSwapCreationInfoTtlMs() {
1927
+ return 110000;
1928
+ }
1929
+ &nbsp;
1930
+ _mapProviderAssetToRabbitIdentity(providerCode, providerNetwork) {
1931
+ const loggerSource = "ChangeNow::_mapProviderAssetToRabbitIdentity";
1932
+ try {
1933
+ const providerCodeUppercase = (providerCode <span class="branch-0 cbranch-no" title="branch not covered" >?? "")</span>.toString().toUpperCase();
1934
+ const providerNetworkLowercase = (providerNetwork ?? "").toString().toLowerCase();
1935
+ const providerNetworkUppercase = providerNetworkLowercase.toUpperCase();
1936
+ &nbsp;
1937
+ const isNative =
1938
+ providerCodeUppercase.length &gt; 0 &amp;&amp;
1939
+ providerNetworkUppercase.length &gt; 0 <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp;</span>
1940
+ providerCodeUppercase === providerNetworkUppercase;
1941
+ &nbsp;
1942
+ let protocolSuffix = "";
1943
+ if (!isNative) {
1944
+ protocolSuffix = NETWORK_TO_RABBIT_PROTOCOL[providerNetworkLowercase] ?? providerNetworkUppercase;
1945
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
1946
+ <span class="cstat-no" title="statement not covered" > protocolSuffix = providerCodeUppercase;</span>
1947
+ <span class="cstat-no" title="statement not covered" > }</span>
1948
+ &nbsp;
1949
+ const rabbitTicker = toRabbitTicker(providerCodeUppercase, protocolSuffix);
1950
+ return { isNative, protocolSuffix, rabbitTicker };
1951
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1952
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(error, loggerSource);</span>
1953
+ <span class="cstat-no" title="statement not covered" > }</span>
1954
+ }
1955
+ &nbsp;
1956
+ async _fetchSupportedCurrenciesIfNeeded() {
1957
+ const loggerSource = "ChangeNow::_fetchSupportedCurrenciesIfNeeded";
1958
+ if (!this._shouldCoinsListBeLoaded()) {
1959
+ return;
1960
+ }
1961
+ try {
1962
+ const response = await axios.get(`${this._URL}/exchange/currencies`, {
1963
+ ...this._axiosGetPreset,
1964
+ ...createRobustTimeoutSetupForAxios(),
1965
+ params: {},
1966
+ });
1967
+ if (response.status !== 200 || !Array.isArray(response.data)) {
1968
+ throw new Error(
1969
+ `Unexpected /exchange/currencies response: ${response.status}, ${safeStringify(response.data)}`
1970
+ );
1971
+ }
1972
+ &nbsp;
1973
+ const providerCurrencies = response.data;
1974
+ &nbsp;
1975
+ const mappedCoins = providerCurrencies
1976
+ .map(providerCurrencyMetadata =&gt; {
1977
+ <span class="cstat-no" title="statement not covered" > try {</span>
1978
+ <span class="cstat-no" title="statement not covered" > const providerCode = providerCurrencyMetadata?.ticker;</span>
1979
+ <span class="cstat-no" title="statement not covered" > const providerNetwork = providerCurrencyMetadata?.network;</span>
1980
+ <span class="cstat-no" title="statement not covered" ></span>
1981
+ <span class="cstat-no" title="statement not covered" > if (typeof providerCode !== "string" || typeof providerNetwork !== "string") return null;</span>
1982
+ <span class="cstat-no" title="statement not covered" ></span>
1983
+ <span class="cstat-no" title="statement not covered" > const providerCodeUppercase = providerCode.toUpperCase();</span>
1984
+ <span class="cstat-no" title="statement not covered" ></span>
1985
+ <span class="cstat-no" title="statement not covered" > const { isNative, protocolSuffix, rabbitTicker } = this._mapProviderAssetToRabbitIdentity(</span>
1986
+ <span class="cstat-no" title="statement not covered" > providerCode,</span>
1987
+ <span class="cstat-no" title="statement not covered" > providerNetwork</span>
1988
+ <span class="cstat-no" title="statement not covered" > );</span>
1989
+ <span class="cstat-no" title="statement not covered" ></span>
1990
+ <span class="cstat-no" title="statement not covered" > const ticker = rabbitTicker;</span>
1991
+ <span class="cstat-no" title="statement not covered" > const protocolModel = isNative ? null : new Protocol(protocolSuffix);</span>
1992
+ <span class="cstat-no" title="statement not covered" ></span>
1993
+ <span class="cstat-no" title="statement not covered" > // Build Coin either via custom builder or ad-hoc if allowed</span>
1994
+ <span class="cstat-no" title="statement not covered" > let coinObject =</span>
1995
+ <span class="cstat-no" title="statement not covered" > this._customCoinBuilder != null</span>
1996
+ <span class="cstat-no" title="statement not covered" > ? this._customCoinBuilder(ticker, protocolSuffix || "")</span>
1997
+ <span class="cstat-no" title="statement not covered" > : null;</span>
1998
+ <span class="cstat-no" title="statement not covered" ></span>
1999
+ <span class="cstat-no" title="statement not covered" > if (!coinObject &amp;&amp; !this.useRestrictedCoinsSet) {</span>
2000
+ <span class="cstat-no" title="statement not covered" > const defaultDecimalPlacesForCoinNotSupportedOOB = DEFAULT_CRYPTO_DECIMAL_COUNT;</span>
2001
+ <span class="cstat-no" title="statement not covered" > const contract = providerCurrencyMetadata.tokenContract || null;</span>
2002
+ <span class="cstat-no" title="statement not covered" ></span>
2003
+ <span class="cstat-no" title="statement not covered" > const name = this.removeProtocolNameFromCoinName(</span>
2004
+ <span class="cstat-no" title="statement not covered" > providerCurrencyMetadata?.name,</span>
2005
+ <span class="cstat-no" title="statement not covered" > providerCodeUppercase,</span>
2006
+ <span class="cstat-no" title="statement not covered" > protocolSuffix</span>
2007
+ <span class="cstat-no" title="statement not covered" > );</span>
2008
+ <span class="cstat-no" title="statement not covered" ></span>
2009
+ <span class="cstat-no" title="statement not covered" > coinObject = new Coin(</span>
2010
+ <span class="cstat-no" title="statement not covered" > name,</span>
2011
+ <span class="cstat-no" title="statement not covered" > ticker,</span>
2012
+ <span class="cstat-no" title="statement not covered" > providerCodeUppercase,</span>
2013
+ <span class="cstat-no" title="statement not covered" > defaultDecimalPlacesForCoinNotSupportedOOB,</span>
2014
+ <span class="cstat-no" title="statement not covered" > null,</span>
2015
+ <span class="cstat-no" title="statement not covered" > "",</span>
2016
+ <span class="cstat-no" title="statement not covered" > null,</span>
2017
+ <span class="cstat-no" title="statement not covered" > null,</span>
2018
+ <span class="cstat-no" title="statement not covered" > 1,</span>
2019
+ <span class="cstat-no" title="statement not covered" > null,</span>
2020
+ <span class="cstat-no" title="statement not covered" > [],</span>
2021
+ <span class="cstat-no" title="statement not covered" > 60000,</span>
2022
+ <span class="cstat-no" title="statement not covered" > null,</span>
2023
+ <span class="cstat-no" title="statement not covered" > protocolModel,</span>
2024
+ <span class="cstat-no" title="statement not covered" > contract,</span>
2025
+ <span class="cstat-no" title="statement not covered" > false</span>
2026
+ <span class="cstat-no" title="statement not covered" > );</span>
2027
+ <span class="cstat-no" title="statement not covered" > }</span>
2028
+ <span class="cstat-no" title="statement not covered" > if (!coinObject) return null;</span>
2029
+ <span class="cstat-no" title="statement not covered" ></span>
2030
+ <span class="cstat-no" title="statement not covered" > const hasExtraId = providerCurrencyMetadata.isExtraIdSupported === true;</span>
2031
+ <span class="cstat-no" title="statement not covered" > const extraId = providerCurrencyMetadata.extraIdName ?? null;</span>
2032
+ <span class="cstat-no" title="statement not covered" > const depositAvailable = providerCurrencyMetadata.sell === true;</span>
2033
+ <span class="cstat-no" title="statement not covered" > const withdrawalAvailable = providerCurrencyMetadata.buy === true;</span>
2034
+ <span class="cstat-no" title="statement not covered" > const popularity = providerCurrencyMetadata.featured ? 1 : 0;</span>
2035
+ <span class="cstat-no" title="statement not covered" > const validationRegex = providerCurrencyMetadata.validationRegexp ?? null;</span>
2036
+ <span class="cstat-no" title="statement not covered" > const iconUrl = providerCurrencyMetadata.image ?? FALLBACK_ASSET_ICON_URL;</span>
2037
+ <span class="cstat-no" title="statement not covered" ></span>
2038
+ <span class="cstat-no" title="statement not covered" > return new SwapProviderCoinInfo(</span>
2039
+ <span class="cstat-no" title="statement not covered" > coinObject,</span>
2040
+ <span class="cstat-no" title="statement not covered" > providerCode,</span>
2041
+ <span class="cstat-no" title="statement not covered" > providerNetwork,</span>
2042
+ <span class="cstat-no" title="statement not covered" > hasExtraId,</span>
2043
+ <span class="cstat-no" title="statement not covered" > extraId,</span>
2044
+ <span class="cstat-no" title="statement not covered" > popularity,</span>
2045
+ <span class="cstat-no" title="statement not covered" > iconUrl,</span>
2046
+ <span class="cstat-no" title="statement not covered" > depositAvailable,</span>
2047
+ <span class="cstat-no" title="statement not covered" > withdrawalAvailable,</span>
2048
+ <span class="cstat-no" title="statement not covered" > validationRegex,</span>
2049
+ <span class="cstat-no" title="statement not covered" > true</span>
2050
+ <span class="cstat-no" title="statement not covered" > );</span>
2051
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2052
+ <span class="cstat-no" title="statement not covered" > Logger.logError(</span>
2053
+ <span class="cstat-no" title="statement not covered" > error,</span>
2054
+ <span class="cstat-no" title="statement not covered" > `${loggerSource} while processing provider currency ${safeStringify(</span>
2055
+ <span class="cstat-no" title="statement not covered" > providerCurrencyMetadata</span>
2056
+ <span class="cstat-no" title="statement not covered" > )}`</span>
2057
+ <span class="cstat-no" title="statement not covered" > );</span>
2058
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2059
+ <span class="cstat-no" title="statement not covered" > }</span>
2060
+ })
2061
+ .filter(Boolean);
2062
+ &nbsp;
2063
+ this._supportedCoins = mappedCoins;
2064
+ this._supportedCoinsLastUpdateTimestamp = Date.now();
2065
+ this._putPopularCoinsFirst();
2066
+ await super._fetchSupportedCurrenciesIfNeeded();
2067
+ } catch (error) {
2068
+ improveAndRethrow(error, loggerSource);
2069
+ }
2070
+ }
2071
+ &nbsp;
2072
+ async _validateAddressWithProvider(network, baseCode, address, extraId = null) {
2073
+ const loggerSource = "ChangeNow::_validateAddressWithProvider";
2074
+ try {
2075
+ if (!this._apiKey) {
2076
+ return this.isAddressValidForAsset({ ticker: baseCode }, address);
2077
+ }
2078
+ &nbsp;
2079
+ // `/validate/address`: use network as `currency`
2080
+ const currencyParameter = typeof network === "string" ? network.toLowerCase() <span class="branch-0 cbranch-no" title="branch not covered" >: null;</span>
2081
+ const parameters = { currency: currencyParameter, address };
2082
+ &nbsp;
2083
+ if (extraId) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2084
+ <span class="cstat-no" title="statement not covered" > parameters.extraId = extraId;</span>
2085
+ <span class="cstat-no" title="statement not covered" > }</span>
2086
+ &nbsp;
2087
+ const response = await axios.get(`${this._URL}/validate/address`, {
2088
+ ...this._axiosGetPreset,
2089
+ ...createRobustTimeoutSetupForAxios(),
2090
+ params: parameters,
2091
+ });
2092
+ &nbsp;
2093
+ if (response.status === 200 &amp;&amp; typeof response.data === "object") {
2094
+ const isValid = response.data?.result === true;
2095
+ if (!isValid) {
2096
+ Logger.log(
2097
+ `Address validation failed: ${address}, reason: ${response.data?.message}`,
2098
+ loggerSource
2099
+ );
2100
+ }
2101
+ return isValid;
2102
+ }
2103
+ &nbsp;
2104
+ // Unexpected response: return true to avoid blocking the swap.
2105
+ Logger.log(
2106
+ `Unexpected address validation response for ${address}: ${safeStringify(response.data)}`,
2107
+ loggerSource
2108
+ );
2109
+ return true;
2110
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
2111
+ <span class="cstat-no" title="statement not covered" > Logger.logError(error, loggerSource);</span>
2112
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2113
+ <span class="cstat-no" title="statement not covered" > }</span>
2114
+ }
2115
+ &nbsp;
2116
+ async getSwapInfo(
2117
+ fromCoin,
2118
+ toCoin,
2119
+ amountCoins,
2120
+ fixed = false,
2121
+ fromCoinToUsdRate = null,
2122
+ amountIsToReceive = false,
2123
+ bannedPartners = [],
2124
+ whitelistedPartners = null
2125
+ ) {
2126
+ const loggerSource = "ChangeNow::getSwapInfo";
2127
+ try {
2128
+ if (
2129
+ !(fromCoin instanceof Coin) ||
2130
+ !(toCoin instanceof Coin) ||
2131
+ typeof amountCoins !== "string" ||
2132
+ BigNumber(amountCoins).lte("0")
2133
+ ) {
2134
+ throw new Error(`Invalid swap parameters: ${amountCoins} ${fromCoin?.ticker} -&gt; ${toCoin?.ticker}`);
2135
+ }
2136
+ await this._fetchSupportedCurrenciesIfNeeded();
2137
+ const fromInfo = this._supportedCoins.find(info =&gt; info.coin.ticker === fromCoin.ticker);
2138
+ const toInfo = this._supportedCoins.find(info =&gt; info.coin.ticker === toCoin.ticker);
2139
+ if (
2140
+ !fromInfo ||
2141
+ !toInfo ||
2142
+ !fromInfo.deposit ||
2143
+ !fromInfo.isAvailable ||
2144
+ !toInfo.withdrawal ||
2145
+ !toInfo.isAvailable
2146
+ ) {
2147
+ return {
2148
+ result: false,
2149
+ reason: SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED,
2150
+ smallestMin: null,
2151
+ greatestMax: null,
2152
+ };
2153
+ }
2154
+ const fromCode = fromInfo.code;
2155
+ const toCode = toInfo.code;
2156
+ const fromNetwork = fromInfo.network;
2157
+ const toNetwork = toInfo.network;
2158
+ &nbsp;
2159
+ let minAmount = null;
2160
+ let maxAmount = null;
2161
+ try {
2162
+ const rangeResponse = await axios.get(`${this._URL}/exchange/range`, {
2163
+ ...this._axiosGetPreset,
2164
+ ...createRobustTimeoutSetupForAxios(),
2165
+ params: {
2166
+ fromCurrency: fromCode,
2167
+ toCurrency: toCode,
2168
+ ...(fromNetwork ? { fromNetwork } : {}),
2169
+ ...(toNetwork ? { toNetwork } : {}),
2170
+ ...(fixed ? { flow: "fixed-rate" } : {}),
2171
+ },
2172
+ });
2173
+ if (rangeResponse.status === 200 &amp;&amp; typeof rangeResponse.data === "object") {
2174
+ const data = rangeResponse.data;
2175
+ if (data.minAmount != null &amp;&amp; BigNumber(data.minAmount).gt("0")) {
2176
+ minAmount = BigNumber(
2177
+ AmountUtils.trim(data.minAmount, amountIsToReceive <span class="branch-0 cbranch-no" title="branch not covered" >? toCoin.digits </span>: fromCoin.digits)
2178
+ ).toString();
2179
+ }
2180
+ if (data.maxAmount != null &amp;&amp; BigNumber(data.maxAmount).gt("0")) {
2181
+ maxAmount = BigNumber(
2182
+ AmountUtils.trim(data.maxAmount, amountIsToReceive <span class="branch-0 cbranch-no" title="branch not covered" >? toCoin.digits </span>: fromCoin.digits)
2183
+ ).toString();
2184
+ }
2185
+ } else {
2186
+ Logger.log(
2187
+ `Unexpected /exchange/range response: ${rangeResponse.status}, ${safeStringify(
2188
+ rangeResponse.data
2189
+ )}`,
2190
+ loggerSource
2191
+ );
2192
+ }
2193
+ } catch (error) {
2194
+ Logger.logError(error, `${loggerSource} while fetching range`);
2195
+ }
2196
+ const requestedAmount = BigNumber(amountCoins);
2197
+ if (minAmount != null &amp;&amp; requestedAmount.lt(minAmount)) {
2198
+ return {
2199
+ result: false,
2200
+ reason: SwapProvider.NO_SWAPS_REASONS.TOO_LOW,
2201
+ smallestMin: minAmount,
2202
+ greatestMax: maxAmount,
2203
+ };
2204
+ }
2205
+ if (maxAmount != null &amp;&amp; requestedAmount.gt(maxAmount)) {
2206
+ return {
2207
+ result: false,
2208
+ reason: SwapProvider.NO_SWAPS_REASONS.TOO_HIGH,
2209
+ smallestMin: minAmount,
2210
+ greatestMax: maxAmount,
2211
+ };
2212
+ }
2213
+ &nbsp;
2214
+ const estimateParameters = {
2215
+ fromCurrency: fromCode,
2216
+ toCurrency: toCode,
2217
+ ...(fromNetwork ? { fromNetwork } : {}),
2218
+ ...(toNetwork ? { toNetwork } : {}),
2219
+ flow: fixed ? "fixed-rate" : "standard",
2220
+ };
2221
+ if (amountIsToReceive) {
2222
+ estimateParameters.toAmount = amountCoins;
2223
+ } else {
2224
+ estimateParameters.fromAmount = amountCoins;
2225
+ }
2226
+ const estimateResponse = await axios.get(`${this._URL}/exchange/estimated-amount`, {
2227
+ ...this._axiosGetPreset,
2228
+ ...createRobustTimeoutSetupForAxios(),
2229
+ params: estimateParameters,
2230
+ });
2231
+ if (estimateResponse.status !== 200 || typeof estimateResponse.data !== "object") {
2232
+ throw new Error(
2233
+ `Unexpected estimate response: ${estimateResponse.status} ${safeStringify(estimateResponse.data)}`
2234
+ );
2235
+ }
2236
+ const estimation = estimateResponse.data;
2237
+ const fromAmountResult =
2238
+ estimation.fromAmount != null ? BigNumber(estimation.fromAmount).toString() : amountCoins;
2239
+ const toAmountResult =
2240
+ estimation.toAmount != null ? BigNumber(estimation.toAmount).toString() <span class="branch-0 cbranch-no" title="branch not covered" >: amountCoins;</span>
2241
+ const rateValue = BigNumber(toAmountResult).div(BigNumber(fromAmountResult)).toString();
2242
+ const durationMinutesRange = estimation.transactionSpeedForecast ?? "";
2243
+ const rateId = estimation.rateId ?? null;
2244
+ const rawSwapData = {
2245
+ fromAmount: fromAmountResult,
2246
+ toAmount: toAmountResult,
2247
+ rate: rateValue,
2248
+ rateId,
2249
+ fromCode,
2250
+ toCode,
2251
+ fromNetwork,
2252
+ toNetwork,
2253
+ };
2254
+ return {
2255
+ result: true,
2256
+ min: minAmount,
2257
+ max: maxAmount,
2258
+ smallestMin: minAmount,
2259
+ greatestMax: maxAmount,
2260
+ rate: rateValue,
2261
+ durationMinutesRange: durationMinutesRange ? `${durationMinutesRange}` : "",
2262
+ fixed: !!fixed,
2263
+ /**
2264
+ * changeNow never requires a refund address (confirmed by support 26.08.2025).
2265
+ */
2266
+ isRefundAddressRequired: false,
2267
+ rawSwapData,
2268
+ };
2269
+ } catch (error) {
2270
+ if (error?.response<span class="branch-0 cbranch-no" title="branch not covered" >?.status </span>=== 429) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2271
+ <span class="cstat-no" title="statement not covered" > return {</span>
2272
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
2273
+ <span class="cstat-no" title="statement not covered" > reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,</span>
2274
+ <span class="cstat-no" title="statement not covered" > smallestMin: null,</span>
2275
+ <span class="cstat-no" title="statement not covered" > greatestMax: null,</span>
2276
+ <span class="cstat-no" title="statement not covered" > };</span>
2277
+ <span class="cstat-no" title="statement not covered" > }</span>
2278
+ Logger.logError(error, loggerSource);
2279
+ improveAndRethrow(error, loggerSource);
2280
+ }
2281
+ }
2282
+ &nbsp;
2283
+ async createSwap(
2284
+ fromCoin,
2285
+ toCoin,
2286
+ amount,
2287
+ toAddress,
2288
+ refundAddress,
2289
+ proprietarySwapEstimationData,
2290
+ clientIpAddress,
2291
+ fixed,
2292
+ toCurrencyExtraId = "",
2293
+ refundExtraId = "",
2294
+ amountIsToReceive = false
2295
+ ) {
2296
+ const loggerSource = "ChangeNow::createSwap";
2297
+ try {
2298
+ if (
2299
+ !(fromCoin instanceof Coin) ||
2300
+ !(toCoin instanceof Coin) ||
2301
+ typeof amount !== "string" ||
2302
+ BigNumber(amount).lte("0")
2303
+ ) {
2304
+ throw new Error(`Invalid swap parameters: ${amount} ${fromCoin?.ticker} -&gt; ${toCoin?.ticker}`);
2305
+ }
2306
+ &nbsp;
2307
+ if (typeof toAddress !== "string" || !toAddress.trim()) {
2308
+ throw new Error(`Invalid destination address: ${safeStringify(toAddress)}`);
2309
+ }
2310
+ &nbsp;
2311
+ await this._fetchSupportedCurrenciesIfNeeded();
2312
+ &nbsp;
2313
+ const fromInfo = this._supportedCoins.find(info =&gt; info.coin.ticker === fromCoin.ticker);
2314
+ const toInfo = this._supportedCoins.find(info =&gt; info.coin.ticker === toCoin.ticker);
2315
+ &nbsp;
2316
+ if (!fromInfo || !toInfo) {
2317
+ throw new Error(
2318
+ `Internal inconsistency: supported coin info not found (${
2319
+ !fromInfo ? `from=${fromCoin?.ticker}` : ""
2320
+ }${!fromInfo &amp;&amp; !toInfo <span class="branch-0 cbranch-no" title="branch not covered" >? ", " </span>: ""}${!toInfo ? `to=${toCoin?.ticker}` : ""})`
2321
+ );
2322
+ }
2323
+ &nbsp;
2324
+ const fromCode = fromInfo.code;
2325
+ const toCode = toInfo.code;
2326
+ const fromNetwork = fromInfo.network;
2327
+ const toNetwork = toInfo.network;
2328
+ &nbsp;
2329
+ const addressValid = await this._validateAddressWithProvider(
2330
+ toNetwork,
2331
+ toCode,
2332
+ toAddress,
2333
+ toCurrencyExtraId
2334
+ );
2335
+ if (!addressValid) {
2336
+ return {
2337
+ result: false,
2338
+ reason: SwapProvider.CREATION_FAIL_REASONS.RETRIABLE_FAIL,
2339
+ partner: this.id,
2340
+ };
2341
+ }
2342
+ if (refundAddress &amp;&amp; refundAddress.trim()) {
2343
+ const refundValid = await this._validateAddressWithProvider(
2344
+ fromNetwork,
2345
+ fromCode,
2346
+ refundAddress,
2347
+ refundExtraId
2348
+ );
2349
+ if (!refundValid) {
2350
+ return {
2351
+ result: false,
2352
+ reason: SwapProvider.CREATION_FAIL_REASONS.RETRIABLE_FAIL,
2353
+ partner: this.id,
2354
+ };
2355
+ }
2356
+ }
2357
+ &nbsp;
2358
+ const payload = {
2359
+ fromCurrency: fromCode,
2360
+ toCurrency: toCode,
2361
+ address: toAddress,
2362
+ };
2363
+ &nbsp;
2364
+ if (fromNetwork) payload.fromNetwork = fromNetwork;
2365
+ if (toNetwork) payload.toNetwork = toNetwork;
2366
+ &nbsp;
2367
+ if (amountIsToReceive) {
2368
+ payload.toAmount = amount;
2369
+ } else {
2370
+ payload.fromAmount = amount;
2371
+ }
2372
+ if (fixed) {
2373
+ payload.flow = "fixed-rate";
2374
+ const rateId = proprietarySwapEstimationData?.rateId <span class="branch-0 cbranch-no" title="branch not covered" >?? null;</span>
2375
+ if (rateId) {
2376
+ payload.rateId = rateId;
2377
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
2378
+ <span class="cstat-no" title="statement not covered" > throw new Error("Fixed-rate flow requires rateId from estimation");</span>
2379
+ <span class="cstat-no" title="statement not covered" > }</span>
2380
+ }
2381
+ if (toCurrencyExtraId) payload.extraId = toCurrencyExtraId;
2382
+ if (refundAddress) payload.refundAddress = refundAddress;
2383
+ if (refundExtraId) payload.refundExtraId = refundExtraId;
2384
+ &nbsp;
2385
+ Logger.log(`Sending ChangeNOW create payload: ${safeStringify(payload)}`, loggerSource);
2386
+ &nbsp;
2387
+ const response = await axios.post(`${this._URL}/exchange`, payload, {
2388
+ ...this._axiosPostPreset,
2389
+ ...createRobustTimeoutSetupForAxios(),
2390
+ });
2391
+ &nbsp;
2392
+ Logger.log(`ChangeNOW create response: ${safeStringify(response.data)}`, loggerSource);
2393
+ &nbsp;
2394
+ const data = response.data;
2395
+ &nbsp;
2396
+ if (response.status !== 200 &amp;&amp; response.status !== 201) {
2397
+ const errorMessageFromProvider =
2398
+ data?.error <span class="branch-0 cbranch-no" title="branch not covered" >|| data?.message <span class="branch-0 cbranch-no" title="branch not covered" ></span>|| `Unexpected response status ${response.status}`;</span>
2399
+ Logger.log(
2400
+ `ChangeNOW swap creation failed. status=${response.status}, message=${errorMessageFromProvider}`,
2401
+ loggerSource
2402
+ );
2403
+ &nbsp;
2404
+ if (detectIpBanFromProviderResponse(response)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2405
+ <span class="cstat-no" title="statement not covered" > return {</span>
2406
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
2407
+ <span class="cstat-no" title="statement not covered" > reason: SwapProvider.CREATION_FAIL_REASONS.RETRIABLE_FAIL,</span>
2408
+ <span class="cstat-no" title="statement not covered" > errorCode: SwapProvider.RETRIABLE_SWAP_CREATION_ERRORS.IP_BANNED,</span>
2409
+ <span class="cstat-no" title="statement not covered" > partner: this.id,</span>
2410
+ <span class="cstat-no" title="statement not covered" > };</span>
2411
+ <span class="cstat-no" title="statement not covered" > }</span>
2412
+ &nbsp;
2413
+ return {
2414
+ result: false,
2415
+ reason: SwapProvider.CREATION_FAIL_REASONS.RETRIABLE_FAIL,
2416
+ partner: this.id,
2417
+ };
2418
+ }
2419
+ &nbsp;
2420
+ const swapId = data?.id ?? null;
2421
+ const payinAddress = data?.payinAddress ?? null;
2422
+ const payinExtraId = data?.payinExtraId ?? null;
2423
+ const returnedFromAmount = data?.fromAmount ?? null;
2424
+ const returnedToAmount = data?.toAmount ?? null;
2425
+ &nbsp;
2426
+ const computedRate =
2427
+ proprietarySwapEstimationData?.rate ||
2428
+ (returnedFromAmount &amp;&amp; returnedToAmount
2429
+ ? BigNumber(returnedToAmount).div(BigNumber(returnedFromAmount)).toString()
2430
+ : null);
2431
+ &nbsp;
2432
+ return {
2433
+ result: true,
2434
+ swapId: swapId,
2435
+ fromCoin,
2436
+ fromAmount: returnedFromAmount != null ? BigNumber(returnedFromAmount).toString() : undefined,
2437
+ fromAddress: payinAddress,
2438
+ toCoin,
2439
+ toAmount: returnedToAmount != null ? BigNumber(returnedToAmount).toString() : undefined,
2440
+ toAddress: toAddress,
2441
+ fromCurrencyExtraId: payinExtraId,
2442
+ rate: computedRate,
2443
+ fixed: !!fixed,
2444
+ };
2445
+ } catch (error) {
2446
+ const status = error?.response?.status;
2447
+ if (status === 429) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2448
+ <span class="cstat-no" title="statement not covered" > return {</span>
2449
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
2450
+ <span class="cstat-no" title="statement not covered" > reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,</span>
2451
+ <span class="cstat-no" title="statement not covered" > partner: this.id,</span>
2452
+ <span class="cstat-no" title="statement not covered" > };</span>
2453
+ <span class="cstat-no" title="statement not covered" > }</span>
2454
+ &nbsp;
2455
+ if (detectIpBanFromProviderResponse(error)) {
2456
+ return {
2457
+ result: false,
2458
+ reason: SwapProvider.CREATION_FAIL_REASONS.RETRIABLE_FAIL,
2459
+ errorCode: SwapProvider.RETRIABLE_SWAP_CREATION_ERRORS.IP_BANNED,
2460
+ partner: this.id,
2461
+ };
2462
+ }
2463
+ &nbsp;
2464
+ improveAndRethrow(error, loggerSource);
2465
+ }
2466
+ }
2467
+ &nbsp;
2468
+ async getExistingSwapsDetailsAndStatus(swapIds) {
2469
+ const loggerSource = "ChangeNow::getExistingSwapsDetailsAndStatus";
2470
+ try {
2471
+ if (!Array.isArray(swapIds) || swapIds.length === 0) {
2472
+ return { result: true, swaps: [] };
2473
+ }
2474
+ await this._fetchSupportedCurrenciesIfNeeded();
2475
+ const swaps = new Array(swapIds.length).fill(null);
2476
+ for (let index = 0; index &lt; swapIds.length; index++) {
2477
+ const id = swapIds[index];
2478
+ try {
2479
+ const response = await axios.get(`${this._URL}/exchange/by-id`, {
2480
+ ...this._axiosGetPreset,
2481
+ ...createRobustTimeoutSetupForAxios(),
2482
+ params: { id },
2483
+ });
2484
+ if (response.status !== 200 || typeof response.data !== "object") {
2485
+ continue;
2486
+ }
2487
+ const transactionData = response.data;
2488
+ const statusRaw = (transactionData.status <span class="branch-0 cbranch-no" title="branch not covered" >|| "")</span>.toLowerCase();
2489
+ &nbsp;
2490
+ const createdAtMilliseconds =
2491
+ transactionData.createdAt != null ? new Date(transactionData.createdAt).getTime() : null;
2492
+ let expiresAtMilliseconds;
2493
+ if (transactionData.validUntil != null) {
2494
+ expiresAtMilliseconds = new Date(transactionData.validUntil).getTime();
2495
+ } else {
2496
+ expiresAtMilliseconds =
2497
+ createdAtMilliseconds != null ? createdAtMilliseconds + this._swapExpirationMs : null;
2498
+ }
2499
+ const isExpiredByTime = expiresAtMilliseconds != null ? expiresAtMilliseconds &lt; Date.now() : false;
2500
+ const status = this._mapChangeNowStatusToRabbitStatus(statusRaw, isExpiredByTime);
2501
+ &nbsp;
2502
+ const fromAmountRaw = transactionData.amountFrom ?? transactionData.expectedAmountFrom ?? null;
2503
+ const toAmountRaw = transactionData.amountTo ?? transactionData.expectedAmountTo ?? null;
2504
+ const fromAmountString = fromAmountRaw != null ? BigNumber(fromAmountRaw).toString() : null;
2505
+ const toAmountString = toAmountRaw != null ? BigNumber(toAmountRaw).toString() : null;
2506
+ const computedRate =
2507
+ fromAmountString != null &amp;&amp; toAmountString != null
2508
+ ? BigNumber(toAmountString).div(BigNumber(fromAmountString)).toString()
2509
+ : null;
2510
+ const payinAddress = transactionData.payinAddress <span class="branch-0 cbranch-no" title="branch not covered" >?? null;</span>
2511
+ const payinTransactionHash = transactionData.payinHash ?? null;
2512
+ const payoutAddress = transactionData.payoutAddress <span class="branch-0 cbranch-no" title="branch not covered" >?? null;</span>
2513
+ const payoutTransactionHash = transactionData.payoutHash ?? null;
2514
+ &nbsp;
2515
+ // Determine from/to currency codes and networks.
2516
+ const fromCurrencyCode = transactionData.fromCurrency <span class="branch-0 cbranch-no" title="branch not covered" >?? null;</span>
2517
+ const toCurrencyCode = transactionData.toCurrency <span class="branch-0 cbranch-no" title="branch not covered" >?? null;</span>
2518
+ const fromNetwork = transactionData.fromNetwork ?? null;
2519
+ const toNetwork = transactionData.toNetwork ?? null;
2520
+ &nbsp;
2521
+ // Try exact match by code+network
2522
+ const fromInfo = this._supportedCoins.find(
2523
+ info =&gt;
2524
+ fromCurrencyCode &amp;&amp;
2525
+ info.code === fromCurrencyCode &amp;&amp;
2526
+ (!fromNetwork <span class="branch-0 cbranch-no" title="branch not covered" >|| info.network === fromNetwork)</span>
2527
+ );
2528
+ const toInfoMatch = this._supportedCoins.find(
2529
+ info =&gt;
2530
+ toCurrencyCode &amp;&amp; info.code === toCurrencyCode &amp;&amp; (!toNetwork <span class="branch-0 cbranch-no" title="branch not covered" >|| info.network === toNetwork)</span>
2531
+ );
2532
+ &nbsp;
2533
+ // Create placeholder coins if asset was removed from the list
2534
+ let fromCoinObject = fromInfo ? fromInfo.coin <span class="branch-0 cbranch-no" title="branch not covered" >: null;</span>
2535
+ let toCoinObject = toInfoMatch ? toInfoMatch.coin : null;
2536
+ &nbsp;
2537
+ if (!fromCoinObject <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; fromCurrencyCode)</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2538
+ <span class="cstat-no" title="statement not covered" > const { rabbitTicker } = this._mapProviderAssetToRabbitIdentity(fromCurrencyCode, fromNetwork);</span>
2539
+ <span class="cstat-no" title="statement not covered" > fromCoinObject = { ticker: rabbitTicker, digits: DEFAULT_CRYPTO_DECIMAL_COUNT };</span>
2540
+ <span class="cstat-no" title="statement not covered" > }</span>
2541
+ if (!toCoinObject &amp;&amp; toCurrencyCode) {
2542
+ const { rabbitTicker } = this._mapProviderAssetToRabbitIdentity(toCurrencyCode, toNetwork);
2543
+ toCoinObject = { ticker: rabbitTicker, digits: DEFAULT_CRYPTO_DECIMAL_COUNT };
2544
+ }
2545
+ &nbsp;
2546
+ const isFixed = transactionData.validUntil != null; // validUntil denotes fixed‑rate swap
2547
+ &nbsp;
2548
+ const existingSwap = new ExistingSwap(
2549
+ id,
2550
+ status,
2551
+ createdAtMilliseconds,
2552
+ expiresAtMilliseconds,
2553
+ -1,
2554
+ computedRate,
2555
+ isFixed,
2556
+ transactionData.refundAddress ?? null,
2557
+ payinAddress,
2558
+ fromCoinObject,
2559
+ fromAmountString,
2560
+ payinTransactionHash,
2561
+ null,
2562
+ toCoinObject,
2563
+ toAmountString,
2564
+ payoutTransactionHash,
2565
+ null,
2566
+ payoutAddress,
2567
+ this.id,
2568
+ transactionData.payinExtraId ?? null,
2569
+ transactionData.payoutExtraId ?? null,
2570
+ transactionData.refundExtraId ?? null
2571
+ );
2572
+ swaps[index] = existingSwap;
2573
+ } catch (error) {
2574
+ Logger.logError(error, `${loggerSource} for id ${id}`);
2575
+ }
2576
+ }
2577
+ return { result: true, swaps };
2578
+ } catch (error) {
2579
+ Logger.logError(error, loggerSource);
2580
+ if (error?.response?.status === 429) {
2581
+ return { result: false, reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED };
2582
+ }
2583
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > improveAndRethrow(error, loggerSource);</span></span>
2584
+ <span class="cstat-no" title="statement not covered" > }</span>
2585
+ }
2586
+ &nbsp;
2587
+ _mapChangeNowStatusToRabbitStatus(status, isExpiredByTime) {
2588
+ switch (status) {
2589
+ case "new":
2590
+ case "waiting":
2591
+ if (isExpiredByTime) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2592
+ <span class="cstat-no" title="statement not covered" > return SwapProvider.SWAP_STATUSES.EXPIRED;</span>
2593
+ <span class="cstat-no" title="statement not covered" > }</span>
2594
+ return SwapProvider.SWAP_STATUSES.WAITING_FOR_PAYMENT;
2595
+ case "confirming":
2596
+ return SwapProvider.SWAP_STATUSES.CONFIRMING;
2597
+ case "exchanging":
2598
+ return SwapProvider.SWAP_STATUSES.EXCHANGING;
2599
+ case "sending":
2600
+ return SwapProvider.SWAP_STATUSES.EXCHANGING;
2601
+ case "finished":
2602
+ return SwapProvider.SWAP_STATUSES.COMPLETED;
2603
+ case "failed":
2604
+ return SwapProvider.SWAP_STATUSES.FAILED;
2605
+ case "refunded":
2606
+ return SwapProvider.SWAP_STATUSES.REFUNDED;
2607
+ case "verifying":
2608
+ return SwapProvider.SWAP_STATUSES.VERIFYING;
2609
+ <span class="branch-0 cbranch-no" title="branch not covered" > default:</span>
2610
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Unknown ChangeNOW status: ${status}`);</span>
2611
+ }
2612
+ }
2613
+ &nbsp;
2614
+ async getPartnersList() {
2615
+ return [
2616
+ new Partner(
2617
+ this.id,
2618
+ "ChangeNOW",
2619
+ "https://storage.swapspace.co/static/wrzph_gI7rsmSgYt3x5f1kAuz.svg",
2620
+ KYC_LEVELS.LOW
2621
+ ),
2622
+ ];
2623
+ }
2624
+ }
2625
+ &nbsp;</pre></td></tr></table></pre>
2626
+
2627
+ <div class='push'></div><!-- for sticky footer -->
2628
+ </div><!-- /wrapper -->
2629
+ <div class='footer quiet pad2 space-top1 center small'>
2630
+ Code coverage generated by
2631
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2632
+ at 2025-12-04T13:25:46.227Z
2633
+ </div>
2634
+ <script src="../../../../prettify.js"></script>
2635
+ <script>
2636
+ window.onload = function () {
2637
+ prettyPrint();
2638
+ };
2639
+ </script>
2640
+ <script src="../../../../sorter.js"></script>
2641
+ <script src="../../../../block-navigation.js"></script>
2642
+ </body>
2643
+ </html>
2644
+