@kaspernj/api-maker 1.0.2011 → 1.0.2012

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 (410) hide show
  1. package/{.eslintrc.cjs → .eslintrc.js} +10 -1
  2. package/README.md +35 -0
  3. package/android/build.gradle +43 -0
  4. package/android/src/main/AndroidManifest.xml +2 -0
  5. package/android/src/main/java/expo/modules/api_maker/ApiMakerModule.kt +50 -0
  6. package/android/src/main/java/expo/modules/api_maker/ApiMakerView.kt +30 -0
  7. package/build/api.js +120 -0
  8. package/build/attribute-not-loaded-error.js +2 -0
  9. package/build/base-component.js +5 -0
  10. package/build/base-error.js +33 -0
  11. package/build/base-model/attribute.js +25 -0
  12. package/build/base-model/column.js +11 -0
  13. package/build/base-model/reflection.js +14 -0
  14. package/build/base-model/scope.js +11 -0
  15. package/build/base-model.js +828 -0
  16. package/build/bootstrap/attribute-row.js +135 -0
  17. package/build/bootstrap/attribute-rows.js +31 -0
  18. package/build/bootstrap/card.js +138 -0
  19. package/build/bootstrap/checkbox.js +97 -0
  20. package/build/bootstrap/checkboxes.js +183 -0
  21. package/build/bootstrap/index.js +2 -0
  22. package/build/bootstrap/input.js +129 -0
  23. package/build/bootstrap/invalid-feedback.js +27 -0
  24. package/build/bootstrap/paginate.js +150 -0
  25. package/build/bootstrap/radio-buttons.js +72 -0
  26. package/build/bootstrap/select.js +88 -0
  27. package/build/bootstrap/sort-link.js +131 -0
  28. package/build/cable-connection-pool.js +128 -0
  29. package/build/cable-subscription-pool.js +207 -0
  30. package/build/cable-subscription.js +21 -0
  31. package/build/cache-key-generator.js +81 -0
  32. package/build/can-can.js +134 -0
  33. package/build/channels-consumer.js +9 -0
  34. package/build/collection-loader.js +48 -0
  35. package/build/collection.js +280 -0
  36. package/build/command-submit-data.js +81 -0
  37. package/build/commands-pool.js +195 -0
  38. package/build/compose.js +9 -0
  39. package/build/config.js +62 -0
  40. package/build/custom-error.js +5 -0
  41. package/build/data-set-to-attributes.js +10 -0
  42. package/build/deserializer.js +56 -0
  43. package/build/destroy-error.js +5 -0
  44. package/build/devise.js +112 -0
  45. package/build/draggable-sort/controller.js +136 -0
  46. package/build/draggable-sort/index.js +114 -0
  47. package/build/draggable-sort/item.js +188 -0
  48. package/build/error-logger.js +101 -0
  49. package/build/error-messages.js +13 -0
  50. package/build/event-connection.js +32 -0
  51. package/build/event-emitter-listener.js +15 -0
  52. package/build/event-model-class.js +24 -0
  53. package/build/events.js +5 -0
  54. package/build/flash-message.js +79 -0
  55. package/build/form.js +83 -0
  56. package/build/history-expo.js +20 -0
  57. package/build/history-react-native.js +20 -0
  58. package/build/history.js +3 -0
  59. package/build/index.js +3 -0
  60. package/build/inputs/attachment.js +133 -0
  61. package/build/inputs/auto-submit.js +36 -0
  62. package/build/inputs/checkbox.js +138 -0
  63. package/build/inputs/checkboxes.js +112 -0
  64. package/build/inputs/id-for-component.js +15 -0
  65. package/build/inputs/input-wrapper.js +19 -0
  66. package/build/inputs/input.js +243 -0
  67. package/build/inputs/money.js +179 -0
  68. package/build/inputs/name-for-component.js +13 -0
  69. package/build/inputs/select.js +93 -0
  70. package/build/instance-of-class-name.js +23 -0
  71. package/build/key-value-store.js +53 -0
  72. package/build/link.js +73 -0
  73. package/build/logger.js +30 -0
  74. package/build/modal.js +38 -0
  75. package/build/model-class-require.js +13 -0
  76. package/build/model-events.js +30 -0
  77. package/build/model-name.js +28 -0
  78. package/build/model-prop-type.js +101 -0
  79. package/build/model-recipes-loader.js +32 -0
  80. package/build/model-recipes-model-loader.js +357 -0
  81. package/build/models-response-reader.js +40 -0
  82. package/build/models.js +8 -0
  83. package/build/money-formatter.js +78 -0
  84. package/build/not-loaded-error.js +2 -0
  85. package/build/params.js +61 -0
  86. package/build/preloaded.js +38 -0
  87. package/build/resize-observer.js +11 -0
  88. package/build/result.js +13 -0
  89. package/build/router/route.js +270 -0
  90. package/build/router/switch.js +72 -0
  91. package/build/router.js +59 -0
  92. package/build/routes-native.js +202 -0
  93. package/build/routes.js +50 -0
  94. package/build/run-last.js +35 -0
  95. package/build/serializer.js +63 -0
  96. package/build/services.js +20 -0
  97. package/build/session-status-updater.js +134 -0
  98. package/build/source-maps-loader.js +184 -0
  99. package/build/super-admin/config-reader.js +85 -0
  100. package/build/super-admin/edit-page/edit-attribute-checkbox.js +85 -0
  101. package/build/super-admin/edit-page/edit-attribute-content.js +55 -0
  102. package/build/super-admin/edit-page/edit-attribute-input.js +79 -0
  103. package/build/super-admin/edit-page/edit-attribute.js +77 -0
  104. package/build/super-admin/edit-page.js +123 -0
  105. package/build/super-admin/has-edit-config.js +12 -0
  106. package/build/super-admin/index-page.js +25 -0
  107. package/build/super-admin/index.js +181 -0
  108. package/build/super-admin/layout/header/index.js +161 -0
  109. package/build/super-admin/layout/index.js +164 -0
  110. package/build/super-admin/layout/menu/index.js +206 -0
  111. package/build/super-admin/layout/menu/menu-content.js +46 -0
  112. package/build/super-admin/layout/menu/menu-item.js +84 -0
  113. package/build/super-admin/layout/no-access.js +27 -0
  114. package/build/super-admin/model-class-table.js +61 -0
  115. package/build/super-admin/models.js +8 -0
  116. package/build/super-admin/show-nav.js +51 -0
  117. package/build/super-admin/show-page/belongs-to-attribute-row.js +29 -0
  118. package/build/super-admin/show-page/index.js +141 -0
  119. package/build/super-admin/show-reflection-actions.js +47 -0
  120. package/build/super-admin/show-reflection-link.js +48 -0
  121. package/build/super-admin/show-reflection-page.js +48 -0
  122. package/build/table/column-content.js +117 -0
  123. package/build/table/column-identifier.js +18 -0
  124. package/build/table/column-visible.js +7 -0
  125. package/build/table/components/column.js +21 -0
  126. package/build/table/components/flat-list.js +21 -0
  127. package/build/table/components/header.js +26 -0
  128. package/build/table/components/row.js +26 -0
  129. package/build/table/filters/attribute-element.js +44 -0
  130. package/build/table/filters/filter-form.js +402 -0
  131. package/build/table/filters/filter.js +90 -0
  132. package/build/table/filters/index.js +184 -0
  133. package/build/table/filters/load-search-modal.js +175 -0
  134. package/build/table/filters/reflection-element.js +37 -0
  135. package/build/table/filters/save-search-modal.js +88 -0
  136. package/build/table/filters/scope-element.js +42 -0
  137. package/build/table/header-column-content.js +68 -0
  138. package/build/table/header-column.js +144 -0
  139. package/build/table/header-select.js +105 -0
  140. package/build/table/model-callback-args.js +10 -0
  141. package/build/table/model-column.js +97 -0
  142. package/build/table/model-row.js +193 -0
  143. package/build/table/select-calculator.js +63 -0
  144. package/build/table/settings/column-row.js +97 -0
  145. package/build/table/settings/download-action.js +79 -0
  146. package/build/table/settings/index.js +92 -0
  147. package/build/table/table-settings.js +219 -0
  148. package/build/table/table.js +972 -0
  149. package/build/table/use-sorting.js +34 -0
  150. package/build/table/widths.js +75 -0
  151. package/build/table/worker-plugins-check-all-checkbox.js +125 -0
  152. package/build/table/worker-plugins-checkbox.js +115 -0
  153. package/build/translated-attributes.js +10 -0
  154. package/build/translated-collections.js +12 -0
  155. package/build/updated-attribute.js +76 -0
  156. package/build/url-encode.js +15 -0
  157. package/build/use-breakpoint.js +62 -0
  158. package/build/use-can-can.js +55 -0
  159. package/build/use-collection.js +225 -0
  160. package/build/use-created-event.js +52 -0
  161. package/build/use-current-user.js +76 -0
  162. package/build/use-destroyed-event.js +60 -0
  163. package/build/use-event-emitter.js +13 -0
  164. package/build/use-event-listener.js +16 -0
  165. package/build/use-input.js +137 -0
  166. package/build/use-model-event.js +60 -0
  167. package/build/use-model.js +169 -0
  168. package/build/use-resize-observer.js +23 -0
  169. package/build/use-router.js +104 -0
  170. package/build/use-screen-layout.js +39 -0
  171. package/build/use-updated-event.js +60 -0
  172. package/build/use-validation-errors.js +30 -0
  173. package/build/utils/card.js +51 -0
  174. package/build/utils/checkbox.js +78 -0
  175. package/build/utils/checkboxes.js +163 -0
  176. package/build/utils/default-style.js +18 -0
  177. package/build/utils/icon.js +23 -0
  178. package/build/utils/invalid-feedback.js +19 -0
  179. package/build/utils/modal.js +62 -0
  180. package/build/utils/text.js +19 -0
  181. package/build/validation-error.js +28 -0
  182. package/build/validation-errors.js +98 -0
  183. package/build/with-api-maker.js +29 -0
  184. package/build/with-collection.js +14 -0
  185. package/build/with-current-user.js +10 -0
  186. package/build/with-model.js +15 -0
  187. package/build/with-router.js +22 -0
  188. package/expo-module.config.json +17 -0
  189. package/ios/ApiMaker.podspec +29 -0
  190. package/ios/ApiMakerModule.swift +48 -0
  191. package/ios/ApiMakerView.swift +38 -0
  192. package/link.sh +8 -0
  193. package/package.json +49 -46
  194. package/src/{api.mjs → api.js} +38 -37
  195. package/src/base-component.jsx +5 -0
  196. package/src/{base-error.mjs → base-error.js} +4 -6
  197. package/src/base-model/attribute.js +33 -0
  198. package/src/base-model/column.js +13 -0
  199. package/src/base-model/reflection.js +15 -0
  200. package/src/base-model/scope.js +12 -0
  201. package/src/{base-model.mjs → base-model.js} +302 -144
  202. package/src/bootstrap/attribute-row.jsx +135 -0
  203. package/src/bootstrap/attribute-rows.jsx +27 -0
  204. package/src/bootstrap/card.jsx +149 -0
  205. package/src/bootstrap/checkbox.jsx +86 -0
  206. package/src/bootstrap/checkboxes.jsx +185 -0
  207. package/src/bootstrap/index.js +0 -0
  208. package/src/bootstrap/input.jsx +173 -0
  209. package/src/bootstrap/invalid-feedback.jsx +31 -0
  210. package/src/bootstrap/paginate.jsx +187 -0
  211. package/src/bootstrap/radio-buttons.jsx +87 -0
  212. package/src/bootstrap/select.jsx +110 -0
  213. package/src/bootstrap/sort-link.jsx +106 -0
  214. package/src/{cable-connection-pool.mjs → cable-connection-pool.js} +16 -36
  215. package/src/{cable-subscription-pool.mjs → cable-subscription-pool.js} +26 -21
  216. package/src/{cable-subscription.mjs → cable-subscription.js} +6 -4
  217. package/src/cache-key-generator.js +100 -0
  218. package/src/{can-can.mjs → can-can.js} +13 -12
  219. package/src/channels-consumer.js +10 -0
  220. package/src/collection-loader.jsx +58 -224
  221. package/src/{collection.mjs → collection.js} +98 -44
  222. package/src/{command-submit-data.mjs → command-submit-data.js} +2 -7
  223. package/src/{commands-pool.mjs → commands-pool.js} +57 -41
  224. package/src/compose.js +11 -0
  225. package/src/{config.mjs → config.js} +6 -2
  226. package/src/{custom-error.mjs → custom-error.js} +1 -1
  227. package/src/data-set-to-attributes.js +13 -0
  228. package/src/{deserializer.mjs → deserializer.js} +3 -3
  229. package/src/destroy-error.js +7 -0
  230. package/src/devise.js +129 -0
  231. package/src/draggable-sort/controller.js +137 -0
  232. package/src/draggable-sort/index.jsx +108 -0
  233. package/src/draggable-sort/item.jsx +174 -0
  234. package/src/{error-logger.mjs → error-logger.js} +12 -7
  235. package/src/{error-messages.mjs → error-messages.js} +1 -0
  236. package/src/event-connection.jsx +1 -1
  237. package/src/event-emitter-listener.jsx +8 -27
  238. package/src/event-model-class.jsx +2 -4
  239. package/src/events.js +7 -0
  240. package/src/flash-message.js +70 -0
  241. package/src/form.jsx +91 -0
  242. package/src/history-expo.js +23 -0
  243. package/src/history-react-native.js +25 -0
  244. package/src/history.js +3 -0
  245. package/src/index.js +3 -0
  246. package/src/inputs/attachment.jsx +108 -0
  247. package/src/inputs/auto-submit.js +37 -0
  248. package/src/inputs/checkbox.jsx +125 -0
  249. package/src/inputs/checkboxes.jsx +116 -0
  250. package/src/inputs/id-for-component.js +15 -0
  251. package/src/inputs/input-wrapper.jsx +16 -0
  252. package/src/inputs/input.jsx +260 -0
  253. package/src/inputs/money.jsx +187 -0
  254. package/src/inputs/name-for-component.js +15 -0
  255. package/src/inputs/select.jsx +104 -0
  256. package/src/{key-value-store.mjs → key-value-store.js} +1 -1
  257. package/src/link.jsx +54 -9
  258. package/src/logger.js +38 -0
  259. package/src/modal.jsx +37 -0
  260. package/src/model-class-require.js +17 -0
  261. package/src/{model-events.mjs → model-events.js} +1 -1
  262. package/src/{model-name.mjs → model-name.js} +8 -8
  263. package/src/{model-recipes-loader.mjs → model-recipes-loader.js} +1 -1
  264. package/src/{model-recipes-model-loader.mjs → model-recipes-model-loader.js} +5 -5
  265. package/src/{models-response-reader.mjs → models-response-reader.js} +3 -4
  266. package/src/models.js +7 -0
  267. package/src/{models.mjs.erb → models.js.erb} +6 -3
  268. package/src/{money-formatter.mjs → money-formatter.js} +5 -4
  269. package/src/{params.mjs → params.js} +17 -7
  270. package/src/{preloaded.mjs → preloaded.js} +2 -2
  271. package/src/resize-observer.jsx +10 -0
  272. package/src/result.js +13 -0
  273. package/src/router/route.jsx +246 -0
  274. package/src/router/switch.jsx +76 -0
  275. package/src/router.jsx +23 -21
  276. package/src/{routes-native.mjs → routes-native.js} +12 -6
  277. package/src/{routes.mjs → routes.js} +1 -1
  278. package/src/run-last.js +39 -0
  279. package/src/{serializer.mjs → serializer.js} +2 -2
  280. package/src/{services.mjs → services.js} +1 -1
  281. package/src/session-status-updater.js +172 -0
  282. package/src/{source-maps-loader.mjs → source-maps-loader.js} +54 -28
  283. package/src/super-admin/config-reader.jsx +93 -0
  284. package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +81 -0
  285. package/src/super-admin/edit-page/edit-attribute-content.jsx +57 -0
  286. package/src/super-admin/edit-page/edit-attribute-input.jsx +71 -0
  287. package/src/super-admin/edit-page/edit-attribute.jsx +81 -0
  288. package/src/super-admin/edit-page.jsx +117 -0
  289. package/src/super-admin/has-edit-config.js +15 -0
  290. package/src/super-admin/index-page.jsx +23 -0
  291. package/src/super-admin/index.jsx +197 -0
  292. package/src/super-admin/layout/header/index.jsx +144 -0
  293. package/src/super-admin/layout/header/style.scss +45 -0
  294. package/src/super-admin/layout/index.jsx +154 -0
  295. package/src/super-admin/layout/menu/index.jsx +171 -0
  296. package/src/super-admin/layout/menu/menu-content.jsx +43 -0
  297. package/src/super-admin/layout/menu/menu-item.jsx +70 -0
  298. package/src/super-admin/layout/menu/style.scss +11 -0
  299. package/src/super-admin/layout/no-access.jsx +26 -0
  300. package/src/super-admin/model-class-table.jsx +66 -0
  301. package/src/super-admin/models.js +11 -0
  302. package/src/super-admin/show-nav.jsx +44 -0
  303. package/src/super-admin/show-page/belongs-to-attribute-row.jsx +30 -0
  304. package/src/super-admin/show-page/index.jsx +141 -0
  305. package/src/super-admin/show-reflection-actions.jsx +49 -0
  306. package/src/super-admin/show-reflection-link.jsx +40 -0
  307. package/src/super-admin/show-reflection-page.jsx +47 -0
  308. package/src/super-admin/stylesheets/variables.scss +11 -0
  309. package/src/table/column-content.jsx +122 -0
  310. package/src/table/column-identifier.js +23 -0
  311. package/src/table/column-visible.js +7 -0
  312. package/src/table/components/column.jsx +19 -0
  313. package/src/table/components/flat-list.jsx +19 -0
  314. package/src/table/components/header.jsx +21 -0
  315. package/src/table/components/row.jsx +23 -0
  316. package/src/table/filters/attribute-element.jsx +47 -0
  317. package/src/table/filters/filter-form.jsx +407 -0
  318. package/src/table/filters/filter.jsx +70 -0
  319. package/src/table/filters/index.jsx +170 -0
  320. package/src/table/filters/load-search-modal.jsx +146 -0
  321. package/src/table/filters/reflection-element.jsx +38 -0
  322. package/src/table/filters/save-search-modal.jsx +74 -0
  323. package/src/table/filters/scope-element.jsx +44 -0
  324. package/src/table/header-column-content.jsx +55 -0
  325. package/src/table/header-column.jsx +129 -0
  326. package/src/table/header-select.jsx +73 -0
  327. package/src/table/model-callback-args.js +10 -0
  328. package/src/table/model-column.jsx +82 -0
  329. package/src/table/model-row.jsx +136 -0
  330. package/src/table/select-calculator.js +65 -0
  331. package/src/table/settings/column-row.jsx +93 -0
  332. package/src/table/settings/download-action.jsx +68 -0
  333. package/src/table/settings/index.jsx +65 -0
  334. package/src/table/table-settings.js +263 -0
  335. package/src/table/table.jsx +950 -0
  336. package/src/table/use-sorting.js +35 -0
  337. package/src/table/variables.scss +11 -0
  338. package/src/table/widths.jsx +87 -0
  339. package/src/table/worker-plugins-check-all-checkbox.jsx +112 -0
  340. package/src/table/worker-plugins-checkbox.jsx +104 -0
  341. package/src/translated-attributes.js +11 -0
  342. package/src/{translated-collections.mjs → translated-collections.js} +3 -2
  343. package/src/updated-attribute.jsx +1 -1
  344. package/src/url-encode.js +18 -0
  345. package/src/use-breakpoint.js +76 -0
  346. package/src/use-can-can.js +55 -0
  347. package/src/use-collection.js +280 -0
  348. package/src/use-created-event.js +55 -0
  349. package/src/use-current-user.js +88 -0
  350. package/src/use-destroyed-event.js +60 -0
  351. package/src/use-event-emitter.js +15 -0
  352. package/src/use-event-listener.js +19 -0
  353. package/src/use-input.js +157 -0
  354. package/src/use-model-event.js +60 -0
  355. package/src/use-model.js +189 -0
  356. package/src/use-resize-observer.js +24 -0
  357. package/src/use-router.jsx +128 -0
  358. package/src/use-screen-layout.js +49 -0
  359. package/src/use-updated-event.js +60 -0
  360. package/src/use-validation-errors.js +33 -0
  361. package/src/utils/card.jsx +49 -0
  362. package/src/utils/checkbox.jsx +80 -0
  363. package/src/utils/checkboxes.jsx +158 -0
  364. package/src/utils/default-style.jsx +25 -0
  365. package/src/utils/icon.jsx +21 -0
  366. package/src/utils/invalid-feedback.jsx +20 -0
  367. package/src/utils/modal.jsx +60 -0
  368. package/src/utils/text.jsx +16 -0
  369. package/src/{validation-error.mjs → validation-error.js} +9 -5
  370. package/src/{validation-errors.mjs → validation-errors.js} +15 -27
  371. package/src/with-api-maker.jsx +31 -0
  372. package/src/with-collection.jsx +17 -0
  373. package/src/with-current-user.jsx +7 -25
  374. package/src/with-model.jsx +16 -0
  375. package/src/with-router.jsx +7 -129
  376. package/__tests__/base-model.test.js +0 -71
  377. package/__tests__/cable-connection-pool.test.js +0 -227
  378. package/__tests__/cable-subscription-pool.test.js +0 -26
  379. package/__tests__/can-can.test.js +0 -34
  380. package/__tests__/collection.test.js +0 -51
  381. package/__tests__/custom-error.test.js +0 -13
  382. package/__tests__/model-name.test.js +0 -34
  383. package/__tests__/model-prop-type.test.js +0 -113
  384. package/__tests__/params.test.js +0 -40
  385. package/__tests__/routes-native.test.js +0 -103
  386. package/__tests__/routes.test.js +0 -46
  387. package/__tests__/serializer.test.js +0 -30
  388. package/__tests__/support/task.js +0 -27
  389. package/__tests__/support/user.js +0 -32
  390. package/index.js +0 -1
  391. package/jest.config.js +0 -4
  392. package/src/can-can-loader.jsx +0 -54
  393. package/src/channels-consumer.mjs +0 -3
  394. package/src/destroy-error.mjs +0 -7
  395. package/src/devise.mjs +0 -122
  396. package/src/event-created.jsx +0 -65
  397. package/src/event-destroyed.jsx +0 -29
  398. package/src/event-listener.jsx +0 -38
  399. package/src/event-updated.jsx +0 -74
  400. package/src/logger.mjs +0 -25
  401. package/src/model-class-require.mjs +0 -10
  402. package/src/model-load-wrapper.jsx +0 -116
  403. package/src/result.mjs +0 -29
  404. package/src/session-status-updater.mjs +0 -116
  405. package/webpack.config.js +0 -15
  406. /package/src/{attribute-not-loaded-error.mjs → attribute-not-loaded-error.js} +0 -0
  407. /package/src/{instance-of-class-name.mjs → instance-of-class-name.js} +0 -0
  408. /package/src/{model-prop-type.mjs → model-prop-type.js} +0 -0
  409. /package/src/{not-loaded-error.mjs → not-loaded-error.js} +0 -0
  410. /package/src/{translated-collections-data.mjs.erb → translated-collections-data.js.erb} +0 -0
@@ -0,0 +1,202 @@
1
+ import { dig, digg, digs } from "diggerize";
2
+ import * as inflection from "inflection";
3
+ import qs from "qs";
4
+ import urlEncode from "./url-encode";
5
+ export default class ApiMakerRoutesNative {
6
+ constructor({
7
+ getLocale
8
+ }) {
9
+ this.getLocale = getLocale;
10
+ this.routeDefinitions = [];
11
+ this.routeTranslationParts = {};
12
+ }
13
+ loadRouteDefinitions(routeDefinitions, routeDefinitionArgs) {
14
+ for (const routeDefinition of digg(routeDefinitions, "routes")) {
15
+ const {
16
+ name,
17
+ path
18
+ } = digs(routeDefinition, "name", "path");
19
+ const rawPathParts = path.split("/");
20
+ const pathMethodName = `${inflection.camelize(name, true)}Path`;
21
+ const urlMethodName = `${inflection.camelize(name, true)}Url`;
22
+ if (routeDefinitionArgs && routeDefinitionArgs.localized) {
23
+ const localizedRoutes = {};
24
+ for (const locale in this.routeTranslationParts) {
25
+ let variableCount = 0;
26
+ const localizedPathParts = [{
27
+ type: "pathPart",
28
+ name: ""
29
+ }, {
30
+ type: "pathPart",
31
+ name: locale
32
+ }];
33
+ for (let i = 1; i < rawPathParts.length; i++) {
34
+ const pathPart = rawPathParts[i];
35
+ const variableMatch = pathPart.match(/^:([A-z_]+)$/);
36
+ if (variableMatch) {
37
+ localizedPathParts.push({
38
+ type: "variable",
39
+ count: variableCount++
40
+ });
41
+ } else if (pathPart) {
42
+ const name = this.i18n.t(`routes.${pathPart}`, null, {
43
+ default: pathPart,
44
+ locale
45
+ });
46
+ localizedPathParts.push({
47
+ type: "pathPart",
48
+ name
49
+ });
50
+ }
51
+ }
52
+ localizedRoutes[locale] = localizedPathParts;
53
+ }
54
+ this[pathMethodName] = (...args) => this.translateRoute({
55
+ args,
56
+ localizedRoutes
57
+ });
58
+ this[urlMethodName] = (...args) => this.translateRoute({
59
+ args,
60
+ localizedRoutes,
61
+ url: true
62
+ });
63
+ } else {
64
+ let variableCount = 0;
65
+ const pathParts = rawPathParts.map(pathPart => {
66
+ const variableMatch = pathPart.match(/^:([A-z_]+)$/);
67
+ if (variableMatch) {
68
+ return {
69
+ type: "variable",
70
+ count: variableCount
71
+ };
72
+ } else {
73
+ return {
74
+ type: "pathPart",
75
+ name: pathPart
76
+ };
77
+ }
78
+ });
79
+ this[pathMethodName] = (...args) => this.translateRoute({
80
+ args,
81
+ pathParts
82
+ });
83
+ this[urlMethodName] = (...args) => this.translateRoute({
84
+ args,
85
+ pathParts,
86
+ url: true
87
+ });
88
+ }
89
+ }
90
+ }
91
+ loadRouteTranslations(i18n) {
92
+ this.i18n = i18n;
93
+ const locales = digg(i18n, "locales");
94
+ for (const locale in locales) {
95
+ const routeTranslations = dig(locales, locale, "routes");
96
+ if (!routeTranslations) continue;
97
+ if (!(locale in this.routeTranslationParts)) this.routeTranslationParts[locale] = {};
98
+ for (const key in routeTranslations) {
99
+ this.routeTranslationParts[locale][key] = routeTranslations[key];
100
+ }
101
+ }
102
+ }
103
+ translateRoute({
104
+ args,
105
+ localizedRoutes,
106
+ pathParts,
107
+ url
108
+ }) {
109
+ let options;
110
+
111
+ // Extract options from args if any
112
+ const lastArg = args[args.length - 1];
113
+ if (lastArg && typeof lastArg == "object") {
114
+ options = args.pop();
115
+ } else {
116
+ options = {};
117
+ }
118
+
119
+ // Take locale from options if given or fall back to fallback
120
+ const {
121
+ locale,
122
+ host,
123
+ port,
124
+ protocol,
125
+ ...restOptions
126
+ } = options;
127
+ if (localizedRoutes) {
128
+ // Put together route with variables and static translated parts (which were translated and cached previously)
129
+ let translatedRoute = digg(localizedRoutes, locale || this.getLocale()).map(pathPart => {
130
+ if (pathPart.type == "pathPart") {
131
+ return pathPart.name;
132
+ } else if (pathPart.type == "variable") {
133
+ // Args might not contain the right amount of variables, so dont change this to 'digg'
134
+ return dig(args, digg(pathPart, "count"));
135
+ } else {
136
+ throw new Error(`Unhandled path part type: ${pathPart.type}`);
137
+ }
138
+ }).join("/");
139
+ if (restOptions && Object.keys(restOptions).length > 0) {
140
+ translatedRoute += `?${qs.stringify(restOptions, {
141
+ encoder: urlEncode
142
+ })}`;
143
+ }
144
+ if (url) return this.addHostToRoute({
145
+ host,
146
+ port,
147
+ protocol,
148
+ translatedRoute
149
+ });
150
+ return translatedRoute;
151
+ } else if (pathParts) {
152
+ // Put together route with variables and static translated parts (which were translated and cached previously)
153
+ let translatedRoute = pathParts.map(pathPart => {
154
+ if (pathPart.type == "pathPart") {
155
+ return pathPart.name;
156
+ } else if (pathPart.type == "variable") {
157
+ return digg(args, digg(pathPart, "count"));
158
+ } else {
159
+ throw new Error(`Unhandled path part type: ${pathPart.type}`);
160
+ }
161
+ }).join("/");
162
+ if (restOptions && Object.keys(restOptions).length > 0) {
163
+ translatedRoute += `?${qs.stringify(restOptions, {
164
+ encoder: urlEncode
165
+ })}`;
166
+ }
167
+ if (url) return this.addHostToRoute({
168
+ host,
169
+ port,
170
+ protocol,
171
+ translatedRoute
172
+ });
173
+ return translatedRoute;
174
+ }
175
+ throw new Error("Unhandled state");
176
+ }
177
+ addHostToRoute({
178
+ host,
179
+ port,
180
+ protocol,
181
+ translatedRoute
182
+ }) {
183
+ let fullUrl = "";
184
+ const hostToUse = host || globalThis.location && globalThis.location.host;
185
+ const portToUse = port || globalThis.location && globalThis.location.port;
186
+ if (!hostToUse) throw new Error("Unable to detect host");
187
+ if (protocol) {
188
+ fullUrl += `${protocol}://`;
189
+ } else if (globalThis.location && globalThis.location.protocol) {
190
+ fullUrl += `${globalThis.location.protocol}//`;
191
+ } else {
192
+ fullUrl += "https://";
193
+ }
194
+ fullUrl += hostToUse;
195
+ if (portToUse && (protocol == "http" && portToUse != 80 || protocol == "https" && port != 443)) {
196
+ fullUrl += `:${portToUse}`;
197
+ }
198
+ fullUrl += translatedRoute;
199
+ return fullUrl;
200
+ }
201
+ }
202
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkaWciLCJkaWdnIiwiZGlncyIsImluZmxlY3Rpb24iLCJxcyIsInVybEVuY29kZSIsIkFwaU1ha2VyUm91dGVzTmF0aXZlIiwiY29uc3RydWN0b3IiLCJnZXRMb2NhbGUiLCJyb3V0ZURlZmluaXRpb25zIiwicm91dGVUcmFuc2xhdGlvblBhcnRzIiwibG9hZFJvdXRlRGVmaW5pdGlvbnMiLCJyb3V0ZURlZmluaXRpb25BcmdzIiwicm91dGVEZWZpbml0aW9uIiwibmFtZSIsInBhdGgiLCJyYXdQYXRoUGFydHMiLCJzcGxpdCIsInBhdGhNZXRob2ROYW1lIiwiY2FtZWxpemUiLCJ1cmxNZXRob2ROYW1lIiwibG9jYWxpemVkIiwibG9jYWxpemVkUm91dGVzIiwibG9jYWxlIiwidmFyaWFibGVDb3VudCIsImxvY2FsaXplZFBhdGhQYXJ0cyIsInR5cGUiLCJpIiwibGVuZ3RoIiwicGF0aFBhcnQiLCJ2YXJpYWJsZU1hdGNoIiwibWF0Y2giLCJwdXNoIiwiY291bnQiLCJpMThuIiwidCIsImRlZmF1bHQiLCJhcmdzIiwidHJhbnNsYXRlUm91dGUiLCJ1cmwiLCJwYXRoUGFydHMiLCJtYXAiLCJsb2FkUm91dGVUcmFuc2xhdGlvbnMiLCJsb2NhbGVzIiwicm91dGVUcmFuc2xhdGlvbnMiLCJrZXkiLCJvcHRpb25zIiwibGFzdEFyZyIsInBvcCIsImhvc3QiLCJwb3J0IiwicHJvdG9jb2wiLCJyZXN0T3B0aW9ucyIsInRyYW5zbGF0ZWRSb3V0ZSIsIkVycm9yIiwiam9pbiIsIk9iamVjdCIsImtleXMiLCJzdHJpbmdpZnkiLCJlbmNvZGVyIiwiYWRkSG9zdFRvUm91dGUiLCJmdWxsVXJsIiwiaG9zdFRvVXNlIiwiZ2xvYmFsVGhpcyIsImxvY2F0aW9uIiwicG9ydFRvVXNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlcy1uYXRpdmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWcsIGRpZ2csIGRpZ3N9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgcXMgZnJvbSBcInFzXCJcbmltcG9ydCB1cmxFbmNvZGUgZnJvbSBcIi4vdXJsLWVuY29kZVwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyUm91dGVzTmF0aXZlIHtcbiAgY29uc3RydWN0b3IgKHtnZXRMb2NhbGV9KSB7XG4gICAgdGhpcy5nZXRMb2NhbGUgPSBnZXRMb2NhbGVcbiAgICB0aGlzLnJvdXRlRGVmaW5pdGlvbnMgPSBbXVxuICAgIHRoaXMucm91dGVUcmFuc2xhdGlvblBhcnRzID0ge31cbiAgfVxuXG4gIGxvYWRSb3V0ZURlZmluaXRpb25zIChyb3V0ZURlZmluaXRpb25zLCByb3V0ZURlZmluaXRpb25BcmdzKSB7XG4gICAgZm9yIChjb25zdCByb3V0ZURlZmluaXRpb24gb2YgZGlnZyhyb3V0ZURlZmluaXRpb25zLCBcInJvdXRlc1wiKSkge1xuICAgICAgY29uc3Qge25hbWUsIHBhdGh9ID0gZGlncyhyb3V0ZURlZmluaXRpb24sIFwibmFtZVwiLCBcInBhdGhcIilcbiAgICAgIGNvbnN0IHJhd1BhdGhQYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpXG4gICAgICBjb25zdCBwYXRoTWV0aG9kTmFtZSA9IGAke2luZmxlY3Rpb24uY2FtZWxpemUobmFtZSwgdHJ1ZSl9UGF0aGBcbiAgICAgIGNvbnN0IHVybE1ldGhvZE5hbWUgPSBgJHtpbmZsZWN0aW9uLmNhbWVsaXplKG5hbWUsIHRydWUpfVVybGBcblxuICAgICAgaWYgKHJvdXRlRGVmaW5pdGlvbkFyZ3MgJiYgcm91dGVEZWZpbml0aW9uQXJncy5sb2NhbGl6ZWQpIHtcbiAgICAgICAgY29uc3QgbG9jYWxpemVkUm91dGVzID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGxvY2FsZSBpbiB0aGlzLnJvdXRlVHJhbnNsYXRpb25QYXJ0cykge1xuICAgICAgICAgIGxldCB2YXJpYWJsZUNvdW50ID0gMFxuXG4gICAgICAgICAgY29uc3QgbG9jYWxpemVkUGF0aFBhcnRzID0gW1xuICAgICAgICAgICAge3R5cGU6IFwicGF0aFBhcnRcIiwgbmFtZTogXCJcIn0sXG4gICAgICAgICAgICB7dHlwZTogXCJwYXRoUGFydFwiLCBuYW1lOiBsb2NhbGV9XG4gICAgICAgICAgXVxuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByYXdQYXRoUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0ID0gcmF3UGF0aFBhcnRzW2ldXG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZU1hdGNoID0gcGF0aFBhcnQubWF0Y2goL146KFtBLXpfXSspJC8pXG5cbiAgICAgICAgICAgIGlmICh2YXJpYWJsZU1hdGNoKSB7XG4gICAgICAgICAgICAgIGxvY2FsaXplZFBhdGhQYXJ0cy5wdXNoKHt0eXBlOiBcInZhcmlhYmxlXCIsIGNvdW50OiB2YXJpYWJsZUNvdW50Kyt9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoUGFydCkge1xuICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5pMThuLnQoYHJvdXRlcy4ke3BhdGhQYXJ0fWAsIG51bGwsIHtkZWZhdWx0OiBwYXRoUGFydCwgbG9jYWxlfSlcblxuICAgICAgICAgICAgICBsb2NhbGl6ZWRQYXRoUGFydHMucHVzaCh7dHlwZTogXCJwYXRoUGFydFwiLCBuYW1lfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2NhbGl6ZWRSb3V0ZXNbbG9jYWxlXSA9IGxvY2FsaXplZFBhdGhQYXJ0c1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1twYXRoTWV0aG9kTmFtZV0gPSAoLi4uYXJncykgPT4gdGhpcy50cmFuc2xhdGVSb3V0ZSh7YXJncywgbG9jYWxpemVkUm91dGVzfSlcbiAgICAgICAgdGhpc1t1cmxNZXRob2ROYW1lXSA9ICguLi5hcmdzKSA9PiB0aGlzLnRyYW5zbGF0ZVJvdXRlKHthcmdzLCBsb2NhbGl6ZWRSb3V0ZXMsIHVybDogdHJ1ZX0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdmFyaWFibGVDb3VudCA9IDBcblxuICAgICAgICBjb25zdCBwYXRoUGFydHMgPSByYXdQYXRoUGFydHMubWFwKChwYXRoUGFydCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhcmlhYmxlTWF0Y2ggPSBwYXRoUGFydC5tYXRjaCgvXjooW0Etel9dKykkLylcblxuICAgICAgICAgIGlmICh2YXJpYWJsZU1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4ge3R5cGU6IFwidmFyaWFibGVcIiwgY291bnQ6IHZhcmlhYmxlQ291bnR9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7dHlwZTogXCJwYXRoUGFydFwiLCBuYW1lOiBwYXRoUGFydH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpc1twYXRoTWV0aG9kTmFtZV0gPSAoLi4uYXJncykgPT4gdGhpcy50cmFuc2xhdGVSb3V0ZSh7YXJncywgcGF0aFBhcnRzfSlcbiAgICAgICAgdGhpc1t1cmxNZXRob2ROYW1lXSA9ICguLi5hcmdzKSA9PiB0aGlzLnRyYW5zbGF0ZVJvdXRlKHthcmdzLCBwYXRoUGFydHMsIHVybDogdHJ1ZX0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9hZFJvdXRlVHJhbnNsYXRpb25zIChpMThuKSB7XG4gICAgdGhpcy5pMThuID0gaTE4blxuICAgIGNvbnN0IGxvY2FsZXMgPSBkaWdnKGkxOG4sIFwibG9jYWxlc1wiKVxuXG4gICAgZm9yIChjb25zdCBsb2NhbGUgaW4gbG9jYWxlcykge1xuICAgICAgY29uc3Qgcm91dGVUcmFuc2xhdGlvbnMgPSBkaWcobG9jYWxlcywgbG9jYWxlLCBcInJvdXRlc1wiKVxuXG4gICAgICBpZiAoIXJvdXRlVHJhbnNsYXRpb25zKSBjb250aW51ZVxuICAgICAgaWYgKCEobG9jYWxlIGluIHRoaXMucm91dGVUcmFuc2xhdGlvblBhcnRzKSkgdGhpcy5yb3V0ZVRyYW5zbGF0aW9uUGFydHNbbG9jYWxlXSA9IHt9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHJvdXRlVHJhbnNsYXRpb25zKSB7XG4gICAgICAgIHRoaXMucm91dGVUcmFuc2xhdGlvblBhcnRzW2xvY2FsZV1ba2V5XSA9IHJvdXRlVHJhbnNsYXRpb25zW2tleV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVSb3V0ZSAoe2FyZ3MsIGxvY2FsaXplZFJvdXRlcywgcGF0aFBhcnRzLCB1cmx9KSB7XG4gICAgbGV0IG9wdGlvbnNcblxuICAgIC8vIEV4dHJhY3Qgb3B0aW9ucyBmcm9tIGFyZ3MgaWYgYW55XG4gICAgY29uc3QgbGFzdEFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXVxuXG4gICAgaWYgKGxhc3RBcmcgJiYgdHlwZW9mIGxhc3RBcmcgPT0gXCJvYmplY3RcIikge1xuICAgICAgb3B0aW9ucyA9IGFyZ3MucG9wKClcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgLy8gVGFrZSBsb2NhbGUgZnJvbSBvcHRpb25zIGlmIGdpdmVuIG9yIGZhbGwgYmFjayB0byBmYWxsYmFja1xuICAgIGNvbnN0IHtsb2NhbGUsIGhvc3QsIHBvcnQsIHByb3RvY29sLCAuLi5yZXN0T3B0aW9uc30gPSBvcHRpb25zXG5cbiAgICBpZiAobG9jYWxpemVkUm91dGVzKSB7XG4gICAgICAvLyBQdXQgdG9nZXRoZXIgcm91dGUgd2l0aCB2YXJpYWJsZXMgYW5kIHN0YXRpYyB0cmFuc2xhdGVkIHBhcnRzICh3aGljaCB3ZXJlIHRyYW5zbGF0ZWQgYW5kIGNhY2hlZCBwcmV2aW91c2x5KVxuICAgICAgbGV0IHRyYW5zbGF0ZWRSb3V0ZSA9IGRpZ2cobG9jYWxpemVkUm91dGVzLCBsb2NhbGUgfHwgdGhpcy5nZXRMb2NhbGUoKSlcbiAgICAgICAgLm1hcCgocGF0aFBhcnQpID0+IHtcbiAgICAgICAgICBpZiAocGF0aFBhcnQudHlwZSA9PSBcInBhdGhQYXJ0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoUGFydC5uYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChwYXRoUGFydC50eXBlID09IFwidmFyaWFibGVcIikge1xuICAgICAgICAgICAgLy8gQXJncyBtaWdodCBub3QgY29udGFpbiB0aGUgcmlnaHQgYW1vdW50IG9mIHZhcmlhYmxlcywgc28gZG9udCBjaGFuZ2UgdGhpcyB0byAnZGlnZydcbiAgICAgICAgICAgIHJldHVybiBkaWcoYXJncywgZGlnZyhwYXRoUGFydCwgXCJjb3VudFwiKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgcGF0aCBwYXJ0IHR5cGU6ICR7cGF0aFBhcnQudHlwZX1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIvXCIpXG5cbiAgICAgIGlmIChyZXN0T3B0aW9ucyAmJiBPYmplY3Qua2V5cyhyZXN0T3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICB0cmFuc2xhdGVkUm91dGUgKz0gYD8ke3FzLnN0cmluZ2lmeShyZXN0T3B0aW9ucywge2VuY29kZXI6IHVybEVuY29kZX0pfWBcbiAgICAgIH1cblxuICAgICAgaWYgKHVybCkgcmV0dXJuIHRoaXMuYWRkSG9zdFRvUm91dGUoe2hvc3QsIHBvcnQsIHByb3RvY29sLCB0cmFuc2xhdGVkUm91dGV9KVxuXG4gICAgICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlXG4gICAgfSBlbHNlIGlmIChwYXRoUGFydHMpIHtcbiAgICAgIC8vIFB1dCB0b2dldGhlciByb3V0ZSB3aXRoIHZhcmlhYmxlcyBhbmQgc3RhdGljIHRyYW5zbGF0ZWQgcGFydHMgKHdoaWNoIHdlcmUgdHJhbnNsYXRlZCBhbmQgY2FjaGVkIHByZXZpb3VzbHkpXG4gICAgICBsZXQgdHJhbnNsYXRlZFJvdXRlID0gcGF0aFBhcnRzXG4gICAgICAgIC5tYXAoKHBhdGhQYXJ0KSA9PiB7XG4gICAgICAgICAgaWYgKHBhdGhQYXJ0LnR5cGUgPT0gXCJwYXRoUGFydFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aFBhcnQubmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAocGF0aFBhcnQudHlwZSA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkaWdnKGFyZ3MsIGRpZ2cocGF0aFBhcnQsIFwiY291bnRcIikpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIHBhdGggcGFydCB0eXBlOiAke3BhdGhQYXJ0LnR5cGV9YClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiL1wiKVxuXG4gICAgICBpZiAocmVzdE9wdGlvbnMgJiYgT2JqZWN0LmtleXMocmVzdE9wdGlvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdHJhbnNsYXRlZFJvdXRlICs9IGA/JHtxcy5zdHJpbmdpZnkocmVzdE9wdGlvbnMsIHtlbmNvZGVyOiB1cmxFbmNvZGV9KX1gXG4gICAgICB9XG5cbiAgICAgIGlmICh1cmwpIHJldHVybiB0aGlzLmFkZEhvc3RUb1JvdXRlKHtob3N0LCBwb3J0LCBwcm90b2NvbCwgdHJhbnNsYXRlZFJvdXRlfSlcblxuICAgICAgcmV0dXJuIHRyYW5zbGF0ZWRSb3V0ZVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBzdGF0ZVwiKVxuICB9XG5cbiAgYWRkSG9zdFRvUm91dGUgKHtob3N0LCBwb3J0LCBwcm90b2NvbCwgdHJhbnNsYXRlZFJvdXRlfSkge1xuICAgIGxldCBmdWxsVXJsID0gXCJcIlxuXG4gICAgY29uc3QgaG9zdFRvVXNlID0gaG9zdCB8fCBnbG9iYWxUaGlzLmxvY2F0aW9uICYmIGdsb2JhbFRoaXMubG9jYXRpb24uaG9zdFxuICAgIGNvbnN0IHBvcnRUb1VzZSA9IHBvcnQgfHwgZ2xvYmFsVGhpcy5sb2NhdGlvbiAmJiBnbG9iYWxUaGlzLmxvY2F0aW9uLnBvcnRcblxuICAgIGlmICghaG9zdFRvVXNlKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZGV0ZWN0IGhvc3RcIilcblxuICAgIGlmIChwcm90b2NvbCkge1xuICAgICAgZnVsbFVybCArPSBgJHtwcm90b2NvbH06Ly9gXG4gICAgfSBlbHNlIGlmIChnbG9iYWxUaGlzLmxvY2F0aW9uICYmIGdsb2JhbFRoaXMubG9jYXRpb24ucHJvdG9jb2wpIHtcbiAgICAgIGZ1bGxVcmwgKz0gYCR7Z2xvYmFsVGhpcy5sb2NhdGlvbi5wcm90b2NvbH0vL2BcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsbFVybCArPSBcImh0dHBzOi8vXCJcbiAgICB9XG5cbiAgICBmdWxsVXJsICs9IGhvc3RUb1VzZVxuXG4gICAgaWYgKHBvcnRUb1VzZSAmJiAoKHByb3RvY29sID09IFwiaHR0cFwiICYmIHBvcnRUb1VzZSAhPSA4MCkgfHwgKHByb3RvY29sID09IFwiaHR0cHNcIiAmJiBwb3J0ICE9IDQ0MykpKSB7XG4gICAgICBmdWxsVXJsICs9IGA6JHtwb3J0VG9Vc2V9YFxuICAgIH1cblxuICAgIGZ1bGxVcmwgKz0gdHJhbnNsYXRlZFJvdXRlXG5cbiAgICByZXR1cm4gZnVsbFVybFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLEdBQUcsRUFBRUMsSUFBSSxFQUFFQyxJQUFJLFFBQU8sV0FBVztBQUN6QyxPQUFPLEtBQUtDLFVBQVUsTUFBTSxZQUFZO0FBQ3hDLE9BQU9DLEVBQUUsTUFBTSxJQUFJO0FBQ25CLE9BQU9DLFNBQVMsTUFBTSxjQUFjO0FBRXBDLGVBQWUsTUFBTUMsb0JBQW9CLENBQUM7RUFDeENDLFdBQVdBLENBQUU7SUFBQ0M7RUFBUyxDQUFDLEVBQUU7SUFDeEIsSUFBSSxDQUFDQSxTQUFTLEdBQUdBLFNBQVM7SUFDMUIsSUFBSSxDQUFDQyxnQkFBZ0IsR0FBRyxFQUFFO0lBQzFCLElBQUksQ0FBQ0MscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0VBQ2pDO0VBRUFDLG9CQUFvQkEsQ0FB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
@@ -0,0 +1,50 @@
1
+ import { digg } from "diggerize";
2
+ import * as inflection from "inflection";
3
+ export default class ApiMakerRoutes {
4
+ constructor({
5
+ jsRoutes,
6
+ locale,
7
+ routeDefinitions
8
+ }) {
9
+ if (!jsRoutes) throw new Error("'jsRoutes' wasn't given");
10
+ this.jsRoutes = jsRoutes;
11
+ this.routeDefinitions = routeDefinitions;
12
+ for (const routeDefinition of digg(this, "routeDefinitions", "routes")) {
13
+ let testRouteNamePath, testRouteNameUrl;
14
+ const routeNamePath = inflection.camelize(`${digg(routeDefinition, "name")}_path`, true);
15
+ const routeNameUrl = inflection.camelize(`${digg(routeDefinition, "name")}_url`, true);
16
+ if (locale) {
17
+ testRouteNamePath = inflection.camelize(`${digg(routeDefinition, "name")}_${locale}_path`, true);
18
+ testRouteNameUrl = inflection.camelize(`${digg(routeDefinition, "name")}_${locale}_url`, true);
19
+ } else {
20
+ testRouteNamePath = inflection.camelize(`${digg(routeDefinition, "name")}_path`, true);
21
+ testRouteNameUrl = inflection.camelize(`${digg(routeDefinition, "name")}_url`, true);
22
+ }
23
+ if (!(testRouteNamePath in this.jsRoutes)) {
24
+ throw new Error(`No such path in JS routes: ${testRouteNamePath}: ${Object.keys(this.jsRoutes).join(", ")}`);
25
+ }
26
+ this[routeNamePath] = (...args) => {
27
+ let routeNamePathToUse;
28
+ if (locale) {
29
+ routeNamePathToUse = inflection.camelize(`${digg(routeDefinition, "name")}_${I18n.locale}_path`, true);
30
+ } else {
31
+ routeNamePathToUse = routeNamePath;
32
+ }
33
+ return this.jsRoutes[routeNamePathToUse](...args);
34
+ };
35
+ if (!(testRouteNameUrl in this.jsRoutes)) {
36
+ throw new Error(`No such URL in JS routes: ${testRouteNameUrl}: ${Object.keys(this.jsRoutes).join(", ")}`);
37
+ }
38
+ this[routeNameUrl] = (...args) => {
39
+ let routeNameUrlToUse;
40
+ if (locale) {
41
+ routeNameUrlToUse = inflection.camelize(`${digg(routeDefinition, "name")}_${I18n.locale}_url`, true);
42
+ } else {
43
+ routeNameUrlToUse = routeNameUrl;
44
+ }
45
+ return this.jsRoutes[routeNameUrlToUse](...args);
46
+ };
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkaWdnIiwiaW5mbGVjdGlvbiIsIkFwaU1ha2VyUm91dGVzIiwiY29uc3RydWN0b3IiLCJqc1JvdXRlcyIsImxvY2FsZSIsInJvdXRlRGVmaW5pdGlvbnMiLCJFcnJvciIsInJvdXRlRGVmaW5pdGlvbiIsInRlc3RSb3V0ZU5hbWVQYXRoIiwidGVzdFJvdXRlTmFtZVVybCIsInJvdXRlTmFtZVBhdGgiLCJjYW1lbGl6ZSIsInJvdXRlTmFtZVVybCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwiYXJncyIsInJvdXRlTmFtZVBhdGhUb1VzZSIsIkkxOG4iLCJyb3V0ZU5hbWVVcmxUb1VzZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9yb3V0ZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcGlNYWtlclJvdXRlcyB7XG4gIGNvbnN0cnVjdG9yICh7anNSb3V0ZXMsIGxvY2FsZSwgcm91dGVEZWZpbml0aW9uc30pIHtcbiAgICBpZiAoIWpzUm91dGVzKSB0aHJvdyBuZXcgRXJyb3IoXCInanNSb3V0ZXMnIHdhc24ndCBnaXZlblwiKVxuXG4gICAgdGhpcy5qc1JvdXRlcyA9IGpzUm91dGVzXG4gICAgdGhpcy5yb3V0ZURlZmluaXRpb25zID0gcm91dGVEZWZpbml0aW9uc1xuXG4gICAgZm9yIChjb25zdCByb3V0ZURlZmluaXRpb24gb2YgZGlnZyh0aGlzLCBcInJvdXRlRGVmaW5pdGlvbnNcIiwgXCJyb3V0ZXNcIikpIHtcbiAgICAgIGxldCB0ZXN0Um91dGVOYW1lUGF0aCwgdGVzdFJvdXRlTmFtZVVybFxuXG4gICAgICBjb25zdCByb3V0ZU5hbWVQYXRoID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShgJHtkaWdnKHJvdXRlRGVmaW5pdGlvbiwgXCJuYW1lXCIpfV9wYXRoYCwgdHJ1ZSlcbiAgICAgIGNvbnN0IHJvdXRlTmFtZVVybCA9IGluZmxlY3Rpb24uY2FtZWxpemUoYCR7ZGlnZyhyb3V0ZURlZmluaXRpb24sIFwibmFtZVwiKX1fdXJsYCwgdHJ1ZSlcblxuICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICB0ZXN0Um91dGVOYW1lUGF0aCA9IGluZmxlY3Rpb24uY2FtZWxpemUoYCR7ZGlnZyhyb3V0ZURlZmluaXRpb24sIFwibmFtZVwiKX1fJHtsb2NhbGV9X3BhdGhgLCB0cnVlKVxuICAgICAgICB0ZXN0Um91dGVOYW1lVXJsID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShgJHtkaWdnKHJvdXRlRGVmaW5pdGlvbiwgXCJuYW1lXCIpfV8ke2xvY2FsZX1fdXJsYCwgdHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRlc3RSb3V0ZU5hbWVQYXRoID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShgJHtkaWdnKHJvdXRlRGVmaW5pdGlvbiwgXCJuYW1lXCIpfV9wYXRoYCwgdHJ1ZSlcbiAgICAgICAgdGVzdFJvdXRlTmFtZVVybCA9IGluZmxlY3Rpb24uY2FtZWxpemUoYCR7ZGlnZyhyb3V0ZURlZmluaXRpb24sIFwibmFtZVwiKX1fdXJsYCwgdHJ1ZSlcbiAgICAgIH1cblxuICAgICAgaWYgKCEodGVzdFJvdXRlTmFtZVBhdGggaW4gdGhpcy5qc1JvdXRlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIHBhdGggaW4gSlMgcm91dGVzOiAke3Rlc3RSb3V0ZU5hbWVQYXRofTogJHtPYmplY3Qua2V5cyh0aGlzLmpzUm91dGVzKS5qb2luKFwiLCBcIil9YClcbiAgICAgIH1cblxuICAgICAgdGhpc1tyb3V0ZU5hbWVQYXRoXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGxldCByb3V0ZU5hbWVQYXRoVG9Vc2VcblxuICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgcm91dGVOYW1lUGF0aFRvVXNlID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShgJHtkaWdnKHJvdXRlRGVmaW5pdGlvbiwgXCJuYW1lXCIpfV8ke0kxOG4ubG9jYWxlfV9wYXRoYCwgdHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByb3V0ZU5hbWVQYXRoVG9Vc2UgPSByb3V0ZU5hbWVQYXRoXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5qc1JvdXRlc1tyb3V0ZU5hbWVQYXRoVG9Vc2VdKC4uLmFyZ3MpXG4gICAgICB9XG5cbiAgICAgIGlmICghKHRlc3RSb3V0ZU5hbWVVcmwgaW4gdGhpcy5qc1JvdXRlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIFVSTCBpbiBKUyByb3V0ZXM6ICR7dGVzdFJvdXRlTmFtZVVybH06ICR7T2JqZWN0LmtleXModGhpcy5qc1JvdXRlcykuam9pbihcIiwgXCIpfWApXG4gICAgICB9XG5cbiAgICAgIHRoaXNbcm91dGVOYW1lVXJsXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGxldCByb3V0ZU5hbWVVcmxUb1VzZVxuXG4gICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICByb3V0ZU5hbWVVcmxUb1VzZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYCR7ZGlnZyhyb3V0ZURlZmluaXRpb24sIFwibmFtZVwiKX1fJHtJMThuLmxvY2FsZX1fdXJsYCwgdHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByb3V0ZU5hbWVVcmxUb1VzZSA9IHJvdXRlTmFtZVVybFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuanNSb3V0ZXNbcm91dGVOYW1lVXJsVG9Vc2VdKC4uLmFyZ3MpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLElBQUksUUFBTyxXQUFXO0FBQzlCLE9BQU8sS0FBS0MsVUFBVSxNQUFNLFlBQVk7QUFFeEMsZUFBZSxNQUFNQyxjQUFjLENBQUM7RUFDbENDLFdBQVdBLENBQUU7SUFBQ0MsUUFBUTtJQUFFQyxNQUFNO0lBQUVDO0VBQWdCLENBQUMsRUFBRTtJQUNqRCxJQUFJLENBQUNGLFFBQVEsRUFBRSxNQUFNLElBQUlHLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQztJQUV6RCxJQUFJLENBQUNILFFBQVEsR0FBR0EsUUFBUTtJQUN4QixJQUFJLENBQUNFLGdCQUFnQixHQUFHQSxnQkFBZ0I7SUFFeEMsS0FBSyxNQUFNRSxlQUFlLElBQUlSLElBQUksQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLEVBQUU7TUFDdEUsSUFBSVMsaUJBQWlCLEVBQUVDLGdCQUFnQjtNQUV2QyxNQUFNQyxhQUFhLEdBQUdWLFVBQVUsQ0FBQ1csUUFBUSxDQUFDLEdBQUdaLElBQUksQ0FBQ1EsZUFBZSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO01BQ3hGLE1BQU1LLFlBQVksR0FBR1osVUFBVSxDQUFDVyxRQUFRLENBQUMsR0FBR1osSUFBSSxDQUFDUSxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7TUFFdEYsSUFBSUgsTUFBTSxFQUFFO1FBQ1ZJLGlCQUFpQixHQUFHUixVQUFVLENBQUNXLFFBQVEsQ0FBQyxHQUFHWixJQUFJLENBQUNRLGVBQWUsRUFBRSxNQUFNLENBQUMsSUFBSUgsTUFBTSxPQUFPLEVBQUUsSUFBSSxDQUFDO1FBQ2hHSyxnQkFBZ0IsR0FBR1QsVUFBVSxDQUFDVyxRQUFRLENBQUMsR0FBR1osSUFBSSxDQUFDUSxlQUFlLEVBQUUsTUFBTSxDQUFDLElBQUlILE1BQU0sTUFBTSxFQUFFLElBQUksQ0FBQztNQUNoRyxDQUFDLE1BQU07UUFDTEksaUJBQWlCLEdBQUdSLFVBQVUsQ0FBQ1csUUFBUSxDQUFDLEdBQUdaLElBQUksQ0FBQ1EsZUFBZSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO1FBQ3RGRSxnQkFBZ0IsR0FBR1QsVUFBVSxDQUFDVyxRQUFRLENBQUMsR0FBR1osSUFBSSxDQUFDUSxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7TUFDdEY7TUFFQSxJQUFJLEVBQUVDLGlCQUFpQixJQUFJLElBQUksQ0FBQ0wsUUFBUSxDQUFDLEVBQUU7UUFDekMsTUFBTSxJQUFJRyxLQUFLLENBQUMsOEJBQThCRSxpQkFBaUIsS0FBS0ssTUFBTSxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDWCxRQUFRLENBQUMsQ0FBQ1ksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7TUFDOUc7TUFFQSxJQUFJLENBQUNMLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBR00sSUFBSSxLQUFLO1FBQ2pDLElBQUlDLGtCQUFrQjtRQUV0QixJQUFJYixNQUFNLEVBQUU7VUFDVmEsa0JBQWtCLEdBQUdqQixVQUFVLENBQUNXLFFBQVEsQ0FBQyxHQUFHWixJQUFJLENBQUNRLGVBQWUsRUFBRSxNQUFNLENBQUMsSUFBSVcsSUFBSSxDQUFDZCxNQUFNLE9BQU8sRUFBRSxJQUFJLENBQUM7UUFDeEcsQ0FBQyxNQUFNO1VBQ0xhLGtCQUFrQixHQUFHUCxhQUFhO1FBQ3BDO1FBRUEsT0FBTyxJQUFJLENBQUNQLFFBQVEsQ0FBQ2Msa0JBQWtCLENBQUMsQ0FBQyxHQUFHRCxJQUFJLENBQUM7TUFDbkQsQ0FBQztNQUVELElBQUksRUFBRVAsZ0JBQWdCLElBQUksSUFBSSxDQUFDTixRQUFRLENBQUMsRUFBRTtRQUN4QyxNQUFNLElBQUlHLEtBQUssQ0FBQyw2QkFBNkJHLGdCQUFnQixLQUFLSSxNQUFNLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUNYLFFBQVEsQ0FBQyxDQUFDWSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztNQUM1RztNQUVBLElBQUksQ0FBQ0gsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHSSxJQUFJLEtBQUs7UUFDaEMsSUFBSUcsaUJBQWlCO1FBRXJCLElBQUlmLE1BQU0sRUFBRTtVQUNWZSxpQkFBaUIsR0FBR25CLFVBQVUsQ0FBQ1csUUFBUSxDQUFDLEdBQUdaLElBQUksQ0FBQ1EsZUFBZSxFQUFFLE1BQU0sQ0FBQyxJQUFJVyxJQUFJLENBQUNkLE1BQU0sTUFBTSxFQUFFLElBQUksQ0FBQztRQUN0RyxDQUFDLE1BQU07VUFDTGUsaUJBQWlCLEdBQUdQLFlBQVk7UUFDbEM7UUFFQSxPQUFPLElBQUksQ0FBQ1QsUUFBUSxDQUFDZ0IsaUJBQWlCLENBQUMsQ0FBQyxHQUFHSCxJQUFJLENBQUM7TUFDbEQsQ0FBQztJQUNIO0VBQ0Y7QUFDRiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,35 @@
1
+ export default class RunLast {
2
+ constructor(callback) {
3
+ if (!callback) throw new Error("Empty callback given");
4
+ this.callback = callback;
5
+ }
6
+
7
+ // Try to batch calls to backend while waiting for the event-queue-call to clear any other jobs before the request and reset on every flush call
8
+ // If only waiting a single time, then other event-queue-jobs might be before us and queue other jobs that might queue calls to the backend
9
+ queue() {
10
+ this.flushTriggerCount = 0;
11
+ this.clearTimeout();
12
+ this.flushTrigger();
13
+ }
14
+ flushTrigger = () => {
15
+ if (this.flushTriggerCount >= 10) {
16
+ this.run();
17
+ } else {
18
+ this.flushTriggerCount++;
19
+ this.flushTriggerQueue();
20
+ }
21
+ };
22
+ flushTriggerQueue() {
23
+ this.flushTimeout = setTimeout(this.flushTrigger, 0);
24
+ }
25
+ clearTimeout() {
26
+ if (this.flushTimeout) {
27
+ clearTimeout(this.flushTimeout);
28
+ }
29
+ }
30
+ run() {
31
+ this.clearTimeout();
32
+ this.callback();
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSdW5MYXN0IiwiY29uc3RydWN0b3IiLCJjYWxsYmFjayIsIkVycm9yIiwicXVldWUiLCJmbHVzaFRyaWdnZXJDb3VudCIsImNsZWFyVGltZW91dCIsImZsdXNoVHJpZ2dlciIsInJ1biIsImZsdXNoVHJpZ2dlclF1ZXVlIiwiZmx1c2hUaW1lb3V0Iiwic2V0VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW4tbGFzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBSdW5MYXN0IHtcbiAgY29uc3RydWN0b3IoY2FsbGJhY2spIHtcbiAgICBpZiAoIWNhbGxiYWNrKSB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSBjYWxsYmFjayBnaXZlblwiKVxuXG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvLyBUcnkgdG8gYmF0Y2ggY2FsbHMgdG8gYmFja2VuZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZXZlbnQtcXVldWUtY2FsbCB0byBjbGVhciBhbnkgb3RoZXIgam9icyBiZWZvcmUgdGhlIHJlcXVlc3QgYW5kIHJlc2V0IG9uIGV2ZXJ5IGZsdXNoIGNhbGxcbiAgLy8gSWYgb25seSB3YWl0aW5nIGEgc2luZ2xlIHRpbWUsIHRoZW4gb3RoZXIgZXZlbnQtcXVldWUtam9icyBtaWdodCBiZSBiZWZvcmUgdXMgYW5kIHF1ZXVlIG90aGVyIGpvYnMgdGhhdCBtaWdodCBxdWV1ZSBjYWxscyB0byB0aGUgYmFja2VuZFxuICBxdWV1ZSgpIHtcbiAgICB0aGlzLmZsdXNoVHJpZ2dlckNvdW50ID0gMFxuICAgIHRoaXMuY2xlYXJUaW1lb3V0KClcbiAgICB0aGlzLmZsdXNoVHJpZ2dlcigpXG4gIH1cblxuICBmbHVzaFRyaWdnZXIgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuZmx1c2hUcmlnZ2VyQ291bnQgPj0gMTApIHtcbiAgICAgIHRoaXMucnVuKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mbHVzaFRyaWdnZXJDb3VudCsrXG4gICAgICB0aGlzLmZsdXNoVHJpZ2dlclF1ZXVlKClcbiAgICB9XG4gIH1cblxuICBmbHVzaFRyaWdnZXJRdWV1ZSgpIHtcbiAgICB0aGlzLmZsdXNoVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5mbHVzaFRyaWdnZXIsIDApXG4gIH1cblxuICBjbGVhclRpbWVvdXQoKSB7XG4gICAgaWYgKHRoaXMuZmx1c2hUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5mbHVzaFRpbWVvdXQpXG4gICAgfVxuICB9XG5cbiAgcnVuKCkge1xuICAgIHRoaXMuY2xlYXJUaW1lb3V0KClcbiAgICB0aGlzLmNhbGxiYWNrKClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLE1BQU1BLE9BQU8sQ0FBQztFQUMzQkMsV0FBV0EsQ0FBQ0MsUUFBUSxFQUFFO0lBQ3BCLElBQUksQ0FBQ0EsUUFBUSxFQUFFLE1BQU0sSUFBSUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDO0lBRXRELElBQUksQ0FBQ0QsUUFBUSxHQUFHQSxRQUFRO0VBQzFCOztFQUVBO0VBQ0E7RUFDQUUsS0FBS0EsQ0FBQSxFQUFHO0lBQ04sSUFBSSxDQUFDQyxpQkFBaUIsR0FBRyxDQUFDO0lBQzFCLElBQUksQ0FBQ0MsWUFBWSxDQUFDLENBQUM7SUFDbkIsSUFBSSxDQUFDQyxZQUFZLENBQUMsQ0FBQztFQUNyQjtFQUVBQSxZQUFZLEdBQUdBLENBQUEsS0FBTTtJQUNuQixJQUFJLElBQUksQ0FBQ0YsaUJBQWlCLElBQUksRUFBRSxFQUFFO01BQ2hDLElBQUksQ0FBQ0csR0FBRyxDQUFDLENBQUM7SUFDWixDQUFDLE1BQU07TUFDTCxJQUFJLENBQUNILGlCQUFpQixFQUFFO01BQ3hCLElBQUksQ0FBQ0ksaUJBQWlCLENBQUMsQ0FBQztJQUMxQjtFQUNGLENBQUM7RUFFREEsaUJBQWlCQSxDQUFBLEVBQUc7SUFDbEIsSUFBSSxDQUFDQyxZQUFZLEdBQUdDLFVBQVUsQ0FBQyxJQUFJLENBQUNKLFlBQVksRUFBRSxDQUFDLENBQUM7RUFDdEQ7RUFFQUQsWUFBWUEsQ0FBQSxFQUFHO0lBQ2IsSUFBSSxJQUFJLENBQUNJLFlBQVksRUFBRTtNQUNyQkosWUFBWSxDQUFDLElBQUksQ0FBQ0ksWUFBWSxDQUFDO0lBQ2pDO0VBQ0Y7RUFFQUYsR0FBR0EsQ0FBQSxFQUFHO0lBQ0osSUFBSSxDQUFDRixZQUFZLENBQUMsQ0FBQztJQUNuQixJQUFJLENBQUNKLFFBQVEsQ0FBQyxDQUFDO0VBQ2pCO0FBQ0YiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,63 @@
1
+ import { digg } from "diggerize";
2
+ export default class Serializer {
3
+ static serialize(arg) {
4
+ const serialize = new Serializer(arg);
5
+ return serialize.serialize();
6
+ }
7
+ constructor(arg) {
8
+ this.arg = arg;
9
+ }
10
+ serialize() {
11
+ return this.serializeArgument(this.arg);
12
+ }
13
+ serializeArgument(arg) {
14
+ if (typeof arg == "object" && arg && arg.constructor.apiMakerType == "BaseModel") {
15
+ return {
16
+ api_maker_type: "model",
17
+ model_class_name: digg(arg.modelClassData(), "name"),
18
+ model_id: arg.id()
19
+ };
20
+ } else if (typeof arg == "function" && arg.apiMakerType == "BaseModel") {
21
+ return {
22
+ api_maker_type: "resource",
23
+ name: digg(arg.modelClassData(), "name")
24
+ };
25
+ } else if (arg instanceof Date) {
26
+ let offsetNumber = parseInt(arg.getTimezoneOffset() / 60 * 100, 10);
27
+ offsetNumber = -offsetNumber;
28
+ let offset = `${offsetNumber}`;
29
+ while (offset.length < 4) {
30
+ offset = `0${offset}`;
31
+ }
32
+ return {
33
+ api_maker_type: "datetime",
34
+ value: `${arg.getFullYear()}-${arg.getMonth() + 1}-${arg.getDate()} ${arg.getHours()}:${arg.getMinutes()}:${arg.getSeconds()}+${offset}`
35
+ };
36
+ } else if (Array.isArray(arg)) {
37
+ return this.serializeArray(arg);
38
+ } else if (typeof arg == "object" && arg && arg.constructor && arg.constructor.apiMakerType == "Collection") {
39
+ return {
40
+ api_maker_type: "collection",
41
+ value: this.serializeObject(arg)
42
+ };
43
+ } else if (typeof arg == "object" && arg !== null && arg.constructor.name == "Object") {
44
+ return this.serializeObject(arg);
45
+ } else {
46
+ return arg;
47
+ }
48
+ }
49
+ serializeArray(arg) {
50
+ return arg.map(value => this.serializeArgument(value));
51
+ }
52
+ serializeObject(arg) {
53
+ const newObject = {};
54
+ for (const key in arg) {
55
+ const value = arg[key];
56
+ const newValue = this.serializeArgument(value);
57
+ const newKey = this.serializeArgument(key);
58
+ newObject[newKey] = newValue;
59
+ }
60
+ return newObject;
61
+ }
62
+ }
63
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkaWdnIiwiU2VyaWFsaXplciIsInNlcmlhbGl6ZSIsImFyZyIsImNvbnN0cnVjdG9yIiwic2VyaWFsaXplQXJndW1lbnQiLCJhcGlNYWtlclR5cGUiLCJhcGlfbWFrZXJfdHlwZSIsIm1vZGVsX2NsYXNzX25hbWUiLCJtb2RlbENsYXNzRGF0YSIsIm1vZGVsX2lkIiwiaWQiLCJuYW1lIiwiRGF0ZSIsIm9mZnNldE51bWJlciIsInBhcnNlSW50IiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJvZmZzZXQiLCJsZW5ndGgiLCJ2YWx1ZSIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsIkFycmF5IiwiaXNBcnJheSIsInNlcmlhbGl6ZUFycmF5Iiwic2VyaWFsaXplT2JqZWN0IiwibWFwIiwibmV3T2JqZWN0Iiwia2V5IiwibmV3VmFsdWUiLCJuZXdLZXkiXSwic291cmNlcyI6WyIuLi9zcmMvc2VyaWFsaXplci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJpYWxpemVyIHtcbiAgc3RhdGljIHNlcmlhbGl6ZSAoYXJnKSB7XG4gICAgY29uc3Qgc2VyaWFsaXplID0gbmV3IFNlcmlhbGl6ZXIoYXJnKVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZS5zZXJpYWxpemUoKVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGFyZykge1xuICAgIHRoaXMuYXJnID0gYXJnXG4gIH1cblxuICBzZXJpYWxpemUgKCkge1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUFyZ3VtZW50KHRoaXMuYXJnKVxuICB9XG5cbiAgc2VyaWFsaXplQXJndW1lbnQgKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnID09IFwib2JqZWN0XCIgJiYgYXJnICYmIGFyZy5jb25zdHJ1Y3Rvci5hcGlNYWtlclR5cGUgPT0gXCJCYXNlTW9kZWxcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBpX21ha2VyX3R5cGU6IFwibW9kZWxcIixcbiAgICAgICAgbW9kZWxfY2xhc3NfbmFtZTogZGlnZyhhcmcubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpLFxuICAgICAgICBtb2RlbF9pZDogYXJnLmlkKClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT0gXCJmdW5jdGlvblwiICYmIGFyZy5hcGlNYWtlclR5cGUgPT0gXCJCYXNlTW9kZWxcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBpX21ha2VyX3R5cGU6IFwicmVzb3VyY2VcIixcbiAgICAgICAgbmFtZTogZGlnZyhhcmcubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBsZXQgb2Zmc2V0TnVtYmVyID0gcGFyc2VJbnQoKGFyZy5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjApICogMTAwLCAxMClcblxuICAgICAgb2Zmc2V0TnVtYmVyID0gLW9mZnNldE51bWJlclxuXG4gICAgICBsZXQgb2Zmc2V0ID0gYCR7b2Zmc2V0TnVtYmVyfWBcblxuICAgICAgd2hpbGUgKG9mZnNldC5sZW5ndGggPCA0KSB7XG4gICAgICAgIG9mZnNldCA9IGAwJHtvZmZzZXR9YFxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcGlfbWFrZXJfdHlwZTogXCJkYXRldGltZVwiLFxuICAgICAgICB2YWx1ZTogYCR7YXJnLmdldEZ1bGxZZWFyKCl9LSR7YXJnLmdldE1vbnRoKCkgKyAxfS0ke2FyZy5nZXREYXRlKCl9ICR7YXJnLmdldEhvdXJzKCl9OiR7YXJnLmdldE1pbnV0ZXMoKX06JHthcmcuZ2V0U2Vjb25kcygpfSske29mZnNldH1gXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUFycmF5KGFyZylcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT0gXCJvYmplY3RcIiAmJiBhcmcgJiYgYXJnLmNvbnN0cnVjdG9yICYmIGFyZy5jb25zdHJ1Y3Rvci5hcGlNYWtlclR5cGUgPT0gXCJDb2xsZWN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFwaV9tYWtlcl90eXBlOiBcImNvbGxlY3Rpb25cIixcbiAgICAgICAgdmFsdWU6IHRoaXMuc2VyaWFsaXplT2JqZWN0KGFyZylcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT0gXCJvYmplY3RcIiAmJiBhcmcgIT09IG51bGwgJiYgYXJnLmNvbnN0cnVjdG9yLm5hbWUgPT0gXCJPYmplY3RcIikge1xuICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplT2JqZWN0KGFyZylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFyZ1xuICAgIH1cbiAgfVxuXG4gIHNlcmlhbGl6ZUFycmF5IChhcmcpIHtcbiAgICByZXR1cm4gYXJnLm1hcCgodmFsdWUpID0+IHRoaXMuc2VyaWFsaXplQXJndW1lbnQodmFsdWUpKVxuICB9XG5cbiAgc2VyaWFsaXplT2JqZWN0IChhcmcpIHtcbiAgICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXJnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFyZ1trZXldXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuc2VyaWFsaXplQXJndW1lbnQodmFsdWUpXG4gICAgICBjb25zdCBuZXdLZXkgPSB0aGlzLnNlcmlhbGl6ZUFyZ3VtZW50KGtleSlcblxuICAgICAgbmV3T2JqZWN0W25ld0tleV0gPSBuZXdWYWx1ZVxuICAgIH1cblxuICAgIHJldHVybiBuZXdPYmplY3RcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFRQSxJQUFJLFFBQU8sV0FBVztBQUU5QixlQUFlLE1BQU1DLFVBQVUsQ0FBQztF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
@@ -0,0 +1,20 @@
1
+ import CommandsPool from "./commands-pool";
2
+ const shared = {};
3
+ export default class ApiMakerServices {
4
+ static current() {
5
+ if (!shared.currentApiMakerService) shared.currentApiMakerService = new ApiMakerServices();
6
+ return shared.currentApiMakerService;
7
+ }
8
+ sendRequest(serviceName, args) {
9
+ return CommandsPool.addCommand({
10
+ args: {
11
+ service_args: args,
12
+ service_name: serviceName
13
+ },
14
+ command: "services",
15
+ collectionName: "calls",
16
+ type: "service"
17
+ });
18
+ }
19
+ }
20
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb21tYW5kc1Bvb2wiLCJzaGFyZWQiLCJBcGlNYWtlclNlcnZpY2VzIiwiY3VycmVudCIsImN1cnJlbnRBcGlNYWtlclNlcnZpY2UiLCJzZW5kUmVxdWVzdCIsInNlcnZpY2VOYW1lIiwiYXJncyIsImFkZENvbW1hbmQiLCJzZXJ2aWNlX2FyZ3MiLCJzZXJ2aWNlX25hbWUiLCJjb21tYW5kIiwiY29sbGVjdGlvbk5hbWUiLCJ0eXBlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZpY2VzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb21tYW5kc1Bvb2wgZnJvbSBcIi4vY29tbWFuZHMtcG9vbFwiXG5cbmNvbnN0IHNoYXJlZCA9IHt9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyU2VydmljZXMge1xuICBzdGF0aWMgY3VycmVudCAoKSB7XG4gICAgaWYgKCFzaGFyZWQuY3VycmVudEFwaU1ha2VyU2VydmljZSkgc2hhcmVkLmN1cnJlbnRBcGlNYWtlclNlcnZpY2UgPSBuZXcgQXBpTWFrZXJTZXJ2aWNlcygpXG5cbiAgICByZXR1cm4gc2hhcmVkLmN1cnJlbnRBcGlNYWtlclNlcnZpY2VcbiAgfVxuXG4gIHNlbmRSZXF1ZXN0IChzZXJ2aWNlTmFtZSwgYXJncykge1xuICAgIHJldHVybiBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZCh7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIHNlcnZpY2VfYXJnczogYXJncyxcbiAgICAgICAgc2VydmljZV9uYW1lOiBzZXJ2aWNlTmFtZVxuICAgICAgfSxcbiAgICAgIGNvbW1hbmQ6IFwic2VydmljZXNcIixcbiAgICAgIGNvbGxlY3Rpb25OYW1lOiBcImNhbGxzXCIsXG4gICAgICB0eXBlOiBcInNlcnZpY2VcIlxuICAgIH0pXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsWUFBWSxNQUFNLGlCQUFpQjtBQUUxQyxNQUFNQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRWpCLGVBQWUsTUFBTUMsZ0JBQWdCLENBQUM7RUFDcEMsT0FBT0MsT0FBT0EsQ0FBQSxFQUFJO0lBQ2hCLElBQUksQ0FBQ0YsTUFBTSxDQUFDRyxzQkFBc0IsRUFBRUgsTUFBTSxDQUFDRyxzQkFBc0IsR0FBRyxJQUFJRixnQkFBZ0IsQ0FBQyxDQUFDO0lBRTFGLE9BQU9ELE1BQU0sQ0FBQ0csc0JBQXNCO0VBQ3RDO0VBRUFDLFdBQVdBLENBQUVDLFdBQVcsRUFBRUMsSUFBSSxFQUFFO0lBQzlCLE9BQU9QLFlBQVksQ0FBQ1EsVUFBVSxDQUFDO01BQzdCRCxJQUFJLEVBQUU7UUFDSkUsWUFBWSxFQUFFRixJQUFJO1FBQ2xCRyxZQUFZLEVBQUVKO01BQ2hCLENBQUM7TUFDREssT0FBTyxFQUFFLFVBQVU7TUFDbkJDLGNBQWMsRUFBRSxPQUFPO01BQ3ZCQyxJQUFJLEVBQUU7SUFDUixDQUFDLENBQUM7RUFDSjtBQUNGIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,134 @@
1
+ import config from "./config";
2
+ import Devise from "./devise";
3
+ import * as inflection from "inflection";
4
+ import Logger from "./logger";
5
+ import wakeEvent from "wake-event";
6
+ const logger = new Logger({
7
+ name: "ApiMaker / SessionStatusUpdater"
8
+ });
9
+ const shared = {};
10
+
11
+ // logger.setDebug(true)
12
+
13
+ export default class ApiMakerSessionStatusUpdater {
14
+ static current(args) {
15
+ if (!shared.apiMakerSessionStatusUpdater) {
16
+ shared.apiMakerSessionStatusUpdater = new ApiMakerSessionStatusUpdater(args);
17
+ }
18
+ return shared.apiMakerSessionStatusUpdater;
19
+ }
20
+ constructor(args = {}) {
21
+ this.events = {};
22
+ this.timeout = args.timeout || 600000;
23
+ if ("useMetaElement" in args) {
24
+ this.useMetaElement = args.useMetaElement;
25
+ } else if (typeof document != "undefined") {
26
+ this.useMetaElement = true;
27
+ } else {
28
+ this.useMetaElement = false;
29
+ }
30
+ if (typeof window != "undefined") {
31
+ this.connectOnlineEvent();
32
+ }
33
+ this.connectWakeEvent();
34
+ }
35
+ connectOnlineEvent() {
36
+ window.addEventListener("online", this.updateSessionStatus, false);
37
+ }
38
+ connectWakeEvent() {
39
+ wakeEvent(this.updateSessionStatus);
40
+ }
41
+ async getCsrfToken() {
42
+ if (this.csrfToken) {
43
+ logger.debug(`Get CSRF token from set variable: ${this.csrfToken}`);
44
+ return this.csrfToken;
45
+ }
46
+ if (this.useMetaElement) {
47
+ const csrfTokenElement = document.querySelector("meta[name='csrf-token']");
48
+ if (csrfTokenElement) {
49
+ logger.debug(() => `Get CSRF token from meta element: ${csrfTokenElement.getAttribute("content")}`);
50
+ this.csrfToken = csrfTokenElement.getAttribute("content");
51
+ return this.csrfToken;
52
+ }
53
+ }
54
+ logger.debug("Updating session status because no CSRF token set yet");
55
+ await this.updateSessionStatus();
56
+ if (this.csrfToken) {
57
+ logger.debug(() => `Returning CSRF token after updating session status: ${this.csrfToken}`);
58
+ return this.csrfToken;
59
+ }
60
+ throw new Error("CSRF token hasn't been set");
61
+ }
62
+ sessionStatus() {
63
+ return new Promise(resolve => {
64
+ const host = config.getHost();
65
+ let requestPath = "";
66
+ if (host) requestPath += host;
67
+ requestPath += "/api_maker/session_statuses";
68
+ const xhr = new XMLHttpRequest();
69
+ xhr.open("POST", requestPath, true);
70
+ xhr.onload = () => {
71
+ const response = JSON.parse(xhr.responseText);
72
+ resolve(response);
73
+ };
74
+ xhr.send();
75
+ });
76
+ }
77
+ onSignedOut(callback) {
78
+ this.addEvent("onSignedOut", callback);
79
+ }
80
+ startTimeout() {
81
+ logger.debug("startTimeout");
82
+ if (this.updateTimeout) clearTimeout(this.updateTimeout);
83
+ this.updateTimeout = setTimeout(() => {
84
+ this.startTimeout();
85
+ this.updateSessionStatus();
86
+ }, this.timeout);
87
+ }
88
+ stopTimeout() {
89
+ if (this.updateTimeout) clearTimeout(this.updateTimeout);
90
+ }
91
+ updateSessionStatus = async () => {
92
+ logger.debug("updateSessionStatus");
93
+ const result = await this.sessionStatus();
94
+ logger.debug(() => `Result: ${JSON.stringify(result, null, 2)}`);
95
+ this.updateMetaElementsFromResult(result);
96
+ this.updateUserSessionsFromResult(result);
97
+ };
98
+ updateMetaElementsFromResult(result) {
99
+ logger.debug("updateMetaElementsFromResult");
100
+ this.csrfToken = result.csrf_token;
101
+ if (this.useMetaElement) {
102
+ const csrfTokenElement = document.querySelector("meta[name='csrf-token']");
103
+ if (csrfTokenElement) {
104
+ logger.debug(() => `Changing token from "${csrfTokenElement.getAttribute("content")}" to "${result.csrf_token}"`);
105
+ csrfTokenElement.setAttribute("content", result.csrf_token);
106
+ } else {
107
+ logger.debug("csrf token element couldn't be found");
108
+ }
109
+ }
110
+ }
111
+ updateUserSessionsFromResult(result) {
112
+ for (const scopeName in result.scopes) {
113
+ this.updateUserSessionScopeFromResult(scopeName, result.scopes[scopeName]);
114
+ }
115
+ }
116
+ updateUserSessionScopeFromResult(scopeName, scope) {
117
+ const deviseIsSignedInMethodName = `is${inflection.camelize(scopeName)}SignedIn`;
118
+ if (!(deviseIsSignedInMethodName in Devise)) {
119
+ throw new Error(`No such method in Devise: ${deviseIsSignedInMethodName}`);
120
+ }
121
+ const currentlySignedIn = Devise[deviseIsSignedInMethodName]();
122
+ const signedInOnBackend = scope.signed_in;
123
+ if (currentlySignedIn && !signedInOnBackend) {
124
+ logger.debug(() => `${inflection.camelize(scopeName)} signed in on frontend but not in backend!`);
125
+ Devise.setSignedOut({
126
+ scope: scopeName
127
+ });
128
+ Devise.callSignOutEvent({
129
+ scope: scopeName
130
+ });
131
+ }
132
+ }
133
+ }
134
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb25maWciLCJEZXZpc2UiLCJpbmZsZWN0aW9uIiwiTG9nZ2VyIiwid2FrZUV2ZW50IiwibG9nZ2VyIiwibmFtZSIsInNoYXJlZCIsIkFwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXIiLCJjdXJyZW50IiwiYXJncyIsImFwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXIiLCJjb25zdHJ1Y3RvciIsImV2ZW50cyIsInRpbWVvdXQiLCJ1c2VNZXRhRWxlbWVudCIsImRvY3VtZW50Iiwid2luZG93IiwiY29ubmVjdE9ubGluZUV2ZW50IiwiY29ubmVjdFdha2VFdmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVTZXNzaW9uU3RhdHVzIiwiZ2V0Q3NyZlRva2VuIiwiY3NyZlRva2VuIiwiZGVidWciLCJjc3JmVG9rZW5FbGVtZW50IiwicXVlcnlTZWxlY3RvciIsImdldEF0dHJpYnV0ZSIsIkVycm9yIiwic2Vzc2lvblN0YXR1cyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaG9zdCIsImdldEhvc3QiLCJyZXF1ZXN0UGF0aCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0Iiwic2VuZCIsIm9uU2lnbmVkT3V0IiwiY2FsbGJhY2siLCJhZGRFdmVudCIsInN0YXJ0VGltZW91dCIsInVwZGF0ZVRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0Iiwic3RvcFRpbWVvdXQiLCJyZXN1bHQiLCJzdHJpbmdpZnkiLCJ1cGRhdGVNZXRhRWxlbWVudHNGcm9tUmVzdWx0IiwidXBkYXRlVXNlclNlc3Npb25zRnJvbVJlc3VsdCIsImNzcmZfdG9rZW4iLCJzZXRBdHRyaWJ1dGUiLCJzY29wZU5hbWUiLCJzY29wZXMiLCJ1cGRhdGVVc2VyU2Vzc2lvblNjb3BlRnJvbVJlc3VsdCIsInNjb3BlIiwiZGV2aXNlSXNTaWduZWRJbk1ldGhvZE5hbWUiLCJjYW1lbGl6ZSIsImN1cnJlbnRseVNpZ25lZEluIiwic2lnbmVkSW5PbkJhY2tlbmQiLCJzaWduZWRfaW4iLCJzZXRTaWduZWRPdXQiLCJjYWxsU2lnbk91dEV2ZW50Il0sInNvdXJjZXMiOlsiLi4vc3JjL3Nlc3Npb24tc3RhdHVzLXVwZGF0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi9jb25maWdcIlxuaW1wb3J0IERldmlzZSBmcm9tIFwiLi9kZXZpc2VcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuL2xvZ2dlclwiXG5pbXBvcnQgd2FrZUV2ZW50IGZyb20gXCJ3YWtlLWV2ZW50XCJcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7bmFtZTogXCJBcGlNYWtlciAvIFNlc3Npb25TdGF0dXNVcGRhdGVyXCJ9KVxuY29uc3Qgc2hhcmVkID0ge31cblxuLy8gbG9nZ2VyLnNldERlYnVnKHRydWUpXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXIge1xuICBzdGF0aWMgY3VycmVudChhcmdzKSB7XG4gICAgaWYgKCFzaGFyZWQuYXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlcikge1xuICAgICAgc2hhcmVkLmFwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXIgPSBuZXcgQXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlcihhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBzaGFyZWQuYXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlclxuICB9XG5cbiAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5ldmVudHMgPSB7fVxuICAgIHRoaXMudGltZW91dCA9IGFyZ3MudGltZW91dCB8fCA2MDAwMDBcblxuICAgIGlmIChcInVzZU1ldGFFbGVtZW50XCIgaW4gYXJncykge1xuICAgICAgdGhpcy51c2VNZXRhRWxlbWVudCA9IGFyZ3MudXNlTWV0YUVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnVzZU1ldGFFbGVtZW50ID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZU1ldGFFbGVtZW50ID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLmNvbm5lY3RPbmxpbmVFdmVudCgpXG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0V2FrZUV2ZW50KClcbiAgfVxuXG4gIGNvbm5lY3RPbmxpbmVFdmVudCgpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMsIGZhbHNlKVxuICB9XG5cbiAgY29ubmVjdFdha2VFdmVudCgpIHtcbiAgICB3YWtlRXZlbnQodGhpcy51cGRhdGVTZXNzaW9uU3RhdHVzKVxuICB9XG5cbiAgYXN5bmMgZ2V0Q3NyZlRva2VuKCkge1xuICAgIGlmICh0aGlzLmNzcmZUb2tlbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBHZXQgQ1NSRiB0b2tlbiBmcm9tIHNldCB2YXJpYWJsZTogJHt0aGlzLmNzcmZUb2tlbn1gKVxuXG4gICAgICByZXR1cm4gdGhpcy5jc3JmVG9rZW5cbiAgICB9XG5cbiAgICBpZiAodGhpcy51c2VNZXRhRWxlbWVudCkge1xuICAgICAgY29uc3QgY3NyZlRva2VuRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKVxuXG4gICAgICBpZiAoY3NyZlRva2VuRWxlbWVudCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYEdldCBDU1JGIHRva2VuIGZyb20gbWV0YSBlbGVtZW50OiAke2NzcmZUb2tlbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKX1gKVxuXG4gICAgICAgIHRoaXMuY3NyZlRva2VuID0gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3NyZlRva2VuXG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKFwiVXBkYXRpbmcgc2Vzc2lvbiBzdGF0dXMgYmVjYXVzZSBubyBDU1JGIHRva2VuIHNldCB5ZXRcIilcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMoKVxuXG4gICAgaWYgKHRoaXMuY3NyZlRva2VuKSB7XG4gICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYFJldHVybmluZyBDU1JGIHRva2VuIGFmdGVyIHVwZGF0aW5nIHNlc3Npb24gc3RhdHVzOiAke3RoaXMuY3NyZlRva2VufWApXG5cbiAgICAgIHJldHVybiB0aGlzLmNzcmZUb2tlblxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkNTUkYgdG9rZW4gaGFzbid0IGJlZW4gc2V0XCIpXG4gIH1cblxuICBzZXNzaW9uU3RhdHVzKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IGNvbmZpZy5nZXRIb3N0KClcbiAgICAgIGxldCByZXF1ZXN0UGF0aCA9IFwiXCJcblxuICAgICAgaWYgKGhvc3QpIHJlcXVlc3RQYXRoICs9IGhvc3RcblxuICAgICAgcmVxdWVzdFBhdGggKz0gXCIvYXBpX21ha2VyL3Nlc3Npb25fc3RhdHVzZXNcIlxuXG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIHJlcXVlc3RQYXRoLCB0cnVlKVxuICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpXG4gICAgICAgIHJlc29sdmUocmVzcG9uc2UpXG4gICAgICB9XG4gICAgICB4aHIuc2VuZCgpXG4gICAgfSlcbiAgfVxuXG4gIG9uU2lnbmVkT3V0KGNhbGxiYWNrKSB7XG4gICAgdGhpcy5hZGRFdmVudChcIm9uU2lnbmVkT3V0XCIsIGNhbGxiYWNrKVxuICB9XG5cbiAgc3RhcnRUaW1lb3V0KCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInN0YXJ0VGltZW91dFwiKVxuXG4gICAgaWYgKHRoaXMudXBkYXRlVGltZW91dClcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZGF0ZVRpbWVvdXQpXG5cbiAgICB0aGlzLnVwZGF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXJ0VGltZW91dCgpXG4gICAgICAgIHRoaXMudXBkYXRlU2Vzc2lvblN0YXR1cygpXG4gICAgICB9LFxuICAgICAgdGhpcy50aW1lb3V0XG4gICAgKVxuICB9XG5cbiAgc3RvcFRpbWVvdXQoKSB7XG4gICAgaWYgKHRoaXMudXBkYXRlVGltZW91dClcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZGF0ZVRpbWVvdXQpXG4gIH1cblxuICB1cGRhdGVTZXNzaW9uU3RhdHVzID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInVwZGF0ZVNlc3Npb25TdGF0dXNcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2Vzc2lvblN0YXR1cygpXG5cbiAgICBsb2dnZXIuZGVidWcoKCkgPT4gYFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpfWApXG4gICAgdGhpcy51cGRhdGVNZXRhRWxlbWVudHNGcm9tUmVzdWx0KHJlc3VsdClcbiAgICB0aGlzLnVwZGF0ZVVzZXJTZXNzaW9uc0Zyb21SZXN1bHQocmVzdWx0KVxuICB9XG5cbiAgdXBkYXRlTWV0YUVsZW1lbnRzRnJvbVJlc3VsdChyZXN1bHQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJ1cGRhdGVNZXRhRWxlbWVudHNGcm9tUmVzdWx0XCIpXG5cbiAgICB0aGlzLmNzcmZUb2tlbiA9IHJlc3VsdC5jc3JmX3Rva2VuXG5cbiAgICBpZiAodGhpcy51c2VNZXRhRWxlbWVudCkge1xuICAgICAgY29uc3QgY3NyZlRva2VuRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKVxuXG4gICAgICBpZiAoY3NyZlRva2VuRWxlbWVudCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYENoYW5naW5nIHRva2VuIGZyb20gXCIke2NzcmZUb2tlbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKX1cIiB0byBcIiR7cmVzdWx0LmNzcmZfdG9rZW59XCJgKVxuICAgICAgICBjc3JmVG9rZW5FbGVtZW50LnNldEF0dHJpYnV0ZShcImNvbnRlbnRcIiwgcmVzdWx0LmNzcmZfdG9rZW4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJjc3JmIHRva2VuIGVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmRcIilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVVc2VyU2Vzc2lvbnNGcm9tUmVzdWx0KHJlc3VsdCkge1xuICAgIGZvciAoY29uc3Qgc2NvcGVOYW1lIGluIHJlc3VsdC5zY29wZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlclNlc3Npb25TY29wZUZyb21SZXN1bHQoc2NvcGVOYW1lLCByZXN1bHQuc2NvcGVzW3Njb3BlTmFtZV0pXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVXNlclNlc3Npb25TY29wZUZyb21SZXN1bHQoc2NvcGVOYW1lLCBzY29wZSkge1xuICAgIGNvbnN0IGRldmlzZUlzU2lnbmVkSW5NZXRob2ROYW1lID0gYGlzJHtpbmZsZWN0aW9uLmNhbWVsaXplKHNjb3BlTmFtZSl9U2lnbmVkSW5gXG5cbiAgICBpZiAoIShkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZSBpbiBEZXZpc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggbWV0aG9kIGluIERldmlzZTogJHtkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRseVNpZ25lZEluID0gRGV2aXNlW2RldmlzZUlzU2lnbmVkSW5NZXRob2ROYW1lXSgpXG4gICAgY29uc3Qgc2lnbmVkSW5PbkJhY2tlbmQgPSBzY29wZS5zaWduZWRfaW5cblxuICAgIGlmIChjdXJyZW50bHlTaWduZWRJbiAmJiAhc2lnbmVkSW5PbkJhY2tlbmQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgJHtpbmZsZWN0aW9uLmNhbWVsaXplKHNjb3BlTmFtZSl9IHNpZ25lZCBpbiBvbiBmcm9udGVuZCBidXQgbm90IGluIGJhY2tlbmQhYClcblxuICAgICAgRGV2aXNlLnNldFNpZ25lZE91dCh7c2NvcGU6IHNjb3BlTmFtZX0pXG4gICAgICBEZXZpc2UuY2FsbFNpZ25PdXRFdmVudCh7c2NvcGU6IHNjb3BlTmFtZX0pXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE1BQU0sTUFBTSxVQUFVO0FBQzdCLE9BQU9DLE1BQU0sTUFBTSxVQUFVO0FBQzdCLE9BQU8sS0FBS0MsVUFBVSxNQUFNLFlBQVk7QUFDeEMsT0FBT0MsTUFBTSxNQUFNLFVBQVU7QUFDN0IsT0FBT0MsU0FBUyxNQUFNLFlBQVk7QUFFbEMsTUFBTUMsTUFBTSxHQUFHLElBQUlGLE1BQU0sQ0FBQztFQUFDRyxJQUFJLEVBQUU7QUFBaUMsQ0FBQyxDQUFDO0FBQ3BFLE1BQU1DLE1BQU0sR0FBRyxDQUFDLENBQUM7O0FBRWpCOztBQUVBLGVBQWUsTUFBTUMsNEJBQTRCLENBQUM7RUFDaEQsT0FBT0MsT0FBT0EsQ0FBQ0MsSUFBSSxFQUFFO0lBQ25CLElBQUksQ0FBQ0gsTUFBTSxDQUFDSSw0QkFBNEIsRUFBRTtNQUN4Q0osTUFBTSxDQUFDSSw0QkFBNEIsR0FBRyxJQUFJSCw0QkFBNEIsQ0FBQ0UsSUFBSSxDQUFDO0lBQzlFO0lBRUEsT0FBT0gsTUFBTSxDQUFDSSw0QkFBNEI7RUFDNUM7RUFFQUMsV0FBV0EsQ0FBQ0YsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ3JCLElBQUksQ0FBQ0csTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNoQixJQUFJLENBQUNDLE9BQU8sR0FBR0osSUFBSSxDQUFDSSxPQUFPLElBQUksTUFBTTtJQUVyQyxJQUFJLGdCQUFnQixJQUFJSixJQUFJLEVBQUU7TUFDNUIsSUFBSSxDQUFDSyxjQUFjLEdBQUdMLElBQUksQ0FBQ0ssY0FBYztJQUMzQyxDQUFDLE1BQU0sSUFBSSxPQUFPQyxRQUFRLElBQUksV0FBVyxFQUFFO01BQ3pDLElBQUksQ0FBQ0QsY0FBYyxHQUFHLElBQUk7SUFDNUIsQ0FBQyxNQUFNO01BQ0wsSUFBSSxDQUFDQSxjQUFjLEdBQUcsS0FBSztJQUM3QjtJQUVBLElBQUksT0FBT0UsTUFBTSxJQUFJLFdBQVcsRUFBRTtNQUNoQyxJQUFJLENBQUNDLGtCQUFrQixDQUFDLENBQUM7SUFDM0I7SUFFQSxJQUFJLENBQUNDLGdCQUFnQixDQUFDLENBQUM7RUFDekI7RUFFQUQsa0JBQWtCQSxDQUFBLEVBQUc7SUFDbkJELE1BQU0sQ0FBQ0csZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQ0MsbUJBQW1CLEVBQUUsS0FBSyxDQUFDO0VBQ3BFO0VBRUFGLGdCQUFnQkEsQ0FBQSxFQUFHO0lBQ2pCZixTQUFTLENBQUMsSUFBSSxDQUFDaUIsbUJBQW1CLENBQUM7RUFDckM7RUFFQSxNQUFNQyxZQUFZQSxDQUFBLEVBQUc7SUFDbkIsSUFBSSxJQUFJLENBQUNDLFNBQVMsRUFBRTtNQUNsQmxCLE1BQU0sQ0FBQ21CLEtBQUssQ0FBQyxxQ0FBcUMsSUFBSSxDQUFDRCxTQUFTLEVBQUUsQ0FBQztNQUVuRSxPQUFPLElBQUksQ0FBQ0EsU0FBUztJQUN2QjtJQUVBLElBQUksSUFBSSxDQUFDUixjQUFjLEVBQUU7TUFDdkIsTUFBTVUsZ0JBQWdCLEdBQUdULFFBQVEsQ0FBQ1UsYUFBYSxDQUFDLHlCQUF5QixDQUFDO01BRTFFLElBQUlELGdCQUFnQixFQUFFO1FBQ3BCcEIsTUFBTSxDQUFDbUIsS0FBSyxDQUFDLE1BQU0scUNBQXFDQyxnQkFBZ0IsQ0FBQ0UsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFFbkcsSUFBSSxDQUFDSixTQUFTLEdBQUdFLGdCQUFnQixDQUFDRSxZQUFZLENBQUMsU0FBUyxDQUFDO1FBRXpELE9BQU8sSUFBSSxDQUFDSixTQUFTO01BQ3ZCO0lBQ0Y7SUFFQWxCLE1BQU0sQ0FBQ21CLEtBQUssQ0FBQyx1REFBdUQsQ0FBQztJQUNyRSxNQUFNLElBQUksQ0FBQ0gsbUJBQW1CLENBQUMsQ0FBQztJQUVoQyxJQUFJLElBQUksQ0FBQ0UsU0FBUyxFQUFFO01BQ2xCbEIsTUFBTSxDQUFDbUIsS0FBSyxDQUFDLE1BQU0sdURBQXVELElBQUksQ0FBQ0QsU0FBUyxFQUFFLENBQUM7TUFFM0YsT0FBTyxJQUFJLENBQUNBLFNBQVM7SUFDdkI7SUFFQSxNQUFNLElBQUlLLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQztFQUMvQztFQUVBQyxhQUFhQSxDQUFBLEVBQUc7SUFDZCxPQUFPLElBQUlDLE9BQU8sQ0FBRUMsT0FBTyxJQUFLO01BQzlCLE1BQU1DLElBQUksR0FBR2hDLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQyxDQUFDO01BQzdCLElBQUlDLFdBQVcsR0FBRyxFQUFFO01BRXBCLElBQUlGLElBQUksRUFBRUUsV0FBVyxJQUFJRixJQUFJO01BRTdCRSxXQUFXLElBQUksNkJBQTZCO01BRTVDLE1BQU1DLEdBQUcsR0FBRyxJQUFJQyxjQUFjLENBQUMsQ0FBQztNQUNoQ0QsR0FBRyxDQUFDRSxJQUFJLENBQUMsTUFBTSxFQUFFSCxXQUFXLEVBQUUsSUFBSSxDQUFDO01BQ25DQyxHQUFHLENBQUNHLE1BQU0sR0FBRyxNQUFNO1FBQ2pCLE1BQU1DLFFBQVEsR0FBR0MsSUFBSSxDQUFDQyxLQUFLLENBQUNOLEdBQUcsQ0FBQ08sWUFBWSxDQUFDO1FBQzdDWCxPQUFPLENBQUNRLFFBQVEsQ0FBQztNQUNuQixDQUFDO01BQ0RKLEdBQUcsQ0FBQ1EsSUFBSSxDQUFDLENBQUM7SUFDWixDQUFDLENBQUM7RUFDSjtFQUVBQyxXQUFXQSxDQUFDQyxRQUFRLEVBQUU7SUFDcEIsSUFBSSxDQUFDQyxRQUFRLENBQUMsYUFBYSxFQUFFRCxRQUFRLENBQUM7RUFDeEM7RUFFQUUsWUFBWUEsQ0FBQSxFQUFHO0lBQ2IxQyxNQUFNLENBQUNtQixLQUFLLENBQUMsY0FBYyxDQUFDO0lBRTVCLElBQUksSUFBSSxDQUFDd0IsYUFBYSxFQUNwQkMsWUFBWSxDQUFDLElBQUksQ0FBQ0QsYUFBYSxDQUFDO0lBRWxDLElBQUksQ0FBQ0EsYUFBYSxHQUFHRSxVQUFVLENBQzdCLE1BQU07TUFDSixJQUFJLENBQUNILFlBQVksQ0FBQyxDQUFDO01BQ25CLElBQUksQ0FBQzFCLG1CQUFtQixDQUFDLENBQUM7SUFDNUIsQ0FBQyxFQUNELElBQUksQ0FBQ1AsT0FDUCxDQUFDO0VBQ0g7RUFFQXFDLFdBQVdBLENBQUEsRUFBRztJQUNaLElBQUksSUFBSSxDQUFDSCxhQUFhLEVBQ3BCQyxZQUFZLENBQUMsSUFBSSxDQUFDRCxhQUFhLENBQUM7RUFDcEM7RUFFQTNCLG1CQUFtQixHQUFHLE1BQUFBLENBQUEsS0FBWTtJQUNoQ2hCLE1BQU0sQ0FBQ21CLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQztJQUVuQyxNQUFNNEIsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDdkIsYUFBYSxDQUFDLENBQUM7SUFFekN4QixNQUFNLENBQUNtQixLQUFLLENBQUMsTUFBTSxXQUFXZ0IsSUFBSSxDQUFDYSxTQUFTLENBQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNoRSxJQUFJLENBQUNFLDRCQUE0QixDQUFDRixNQUFNLENBQUM7SUFDekMsSUFBSSxDQUFDRyw0QkFBNEIsQ0FBQ0gsTUFBTSxDQUFDO0VBQzNDLENBQUM7RUFFREUsNEJBQTRCQSxDQUFDRixNQUFNLEVBQUU7SUFDbkMvQyxNQUFNLENBQUNtQixLQUFLLENBQUMsOEJBQThCLENBQUM7SUFFNUMsSUFBSSxDQUFDRCxTQUFTLEdBQUc2QixNQUFNLENBQUNJLFVBQVU7SUFFbEMsSUFBSSxJQUFJLENBQUN6QyxjQUFjLEVBQUU7TUFDdkIsTUFBTVUsZ0JBQWdCLEdBQUdULFFBQVEsQ0FBQ1UsYUFBYSxDQUFDLHlCQUF5QixDQUFDO01BRTFFLElBQUlELGdCQUFnQixFQUFFO1FBQ3BCcEIsTUFBTSxDQUFDbUIsS0FBSyxDQUFDLE1BQU0sd0JBQXdCQyxnQkFBZ0IsQ0FBQ0UsWUFBWSxDQUFDLFNBQVMsQ0FBQyxTQUFTeUIsTUFBTSxDQUFDSSxVQUFVLEdBQUcsQ0FBQztRQUNqSC9CLGdCQUFnQixDQUFDZ0MsWUFBWSxDQUFDLFNBQVMsRUFBRUwsTUFBTSxDQUFDSSxVQUFVLENBQUM7TUFDN0QsQ0FBQyxNQUFNO1FBQ0xuRCxNQUFNLENBQUNtQixLQUFLLENBQUMsc0NBQXNDLENBQUM7TUFDdEQ7SUFDRjtFQUNGO0VBRUErQiw0QkFBNEJBLENBQUNILE1BQU0sRUFBRTtJQUNuQyxLQUFLLE1BQU1NLFNBQVMsSUFBSU4sTUFBTSxDQUFDTyxNQUFNLEVBQUU7TUFDckMsSUFBSSxDQUFDQyxnQ0FBZ0MsQ0FBQ0YsU0FBUyxFQUFFTixNQUFNLENBQUNPLE1BQU0sQ0FBQ0QsU0FBUyxDQUFDLENBQUM7SUFDNUU7RUFDRjtFQUVBRSxnQ0FBZ0NBLENBQUNGLFNBQVMsRUFBRUcsS0FBSyxFQUFFO0lBQ2pELE1BQU1DLDBCQUEwQixHQUFHLEtBQUs1RCxVQUFVLENBQUM2RCxRQUFRLENBQUNMLFNBQVMsQ0FBQyxVQUFVO0lBRWhGLElBQUksRUFBRUksMEJBQTBCLElBQUk3RCxNQUFNLENBQUMsRUFBRTtNQUMzQyxNQUFNLElBQUkyQixLQUFLLENBQUMsNkJBQTZCa0MsMEJBQTBCLEVBQUUsQ0FBQztJQUM1RTtJQUVBLE1BQU1FLGlCQUFpQixHQUFHL0QsTUFBTSxDQUFDNkQsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0lBQzlELE1BQU1HLGlCQUFpQixHQUFHSixLQUFLLENBQUNLLFNBQVM7SUFFekMsSUFBSUYsaUJBQWlCLElBQUksQ0FBQ0MsaUJBQWlCLEVBQUU7TUFDM0M1RCxNQUFNLENBQUNtQixLQUFLLENBQUMsTUFBTSxHQUFHdEIsVUFBVSxDQUFDNkQsUUFBUSxDQUFDTCxTQUFTLENBQUMsNENBQTRDLENBQUM7TUFFakd6RCxNQUFNLENBQUNrRSxZQUFZLENBQUM7UUFBQ04sS0FBSyxFQUFFSDtNQUFTLENBQUMsQ0FBQztNQUN2Q3pELE1BQU0sQ0FBQ21FLGdCQUFnQixDQUFDO1FBQUNQLEtBQUssRUFBRUg7TUFBUyxDQUFDLENBQUM7SUFDN0M7RUFDRjtBQUNGIiwiaWdub3JlTGlzdCI6W119