@airtable/blocks 1.8.0 → 1.10.0-experimental-48096ae-20211116

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 (304) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/dist/cjs/color_utils.js +2 -1
  3. package/dist/cjs/colors.js +2 -1
  4. package/dist/cjs/error_utils.js +19 -1
  5. package/dist/cjs/event_tracker.js +2 -1
  6. package/dist/cjs/global_config.js +2 -1
  7. package/dist/cjs/index.js +2 -1
  8. package/dist/cjs/injected/airtable_interface.js +2 -1
  9. package/dist/cjs/models/abstract_model.js +2 -1
  10. package/dist/cjs/models/abstract_model_with_async_data.js +2 -1
  11. package/dist/cjs/models/base.js +18 -6
  12. package/dist/cjs/models/create_aggregators.js +2 -1
  13. package/dist/cjs/models/cursor.js +4 -1
  14. package/dist/cjs/models/field.js +148 -28
  15. package/dist/cjs/models/grouped_record_query_result.js +7 -15
  16. package/dist/cjs/models/linked_records_query_result.js +77 -28
  17. package/dist/cjs/models/models.js +2 -1
  18. package/dist/cjs/models/mutation_constants.js +5 -2
  19. package/dist/cjs/models/mutations.js +69 -177
  20. package/dist/cjs/models/object_pool.js +2 -1
  21. package/dist/cjs/models/query_manager.js +328 -0
  22. package/dist/cjs/models/record.js +310 -56
  23. package/dist/cjs/models/record_coloring.js +2 -1
  24. package/dist/cjs/models/record_query_result.js +6 -2
  25. package/dist/cjs/models/record_store.js +556 -766
  26. package/dist/cjs/models/session.js +2 -1
  27. package/dist/cjs/models/table.js +24 -14
  28. package/dist/cjs/models/table_or_view_query_result.js +482 -415
  29. package/dist/cjs/models/view.js +2 -1
  30. package/dist/cjs/models/view_data_store.js +245 -296
  31. package/dist/cjs/models/view_metadata_query_result.js +2 -1
  32. package/dist/cjs/perform_record_action.js +2 -1
  33. package/dist/cjs/private_utils.js +52 -1
  34. package/dist/cjs/sdk.js +13 -2
  35. package/dist/cjs/settings_button.js +2 -1
  36. package/dist/cjs/stats/block_stats.js +2 -1
  37. package/dist/cjs/testing/abstract_mock_airtable_interface.js +367 -0
  38. package/dist/cjs/types/aggregators.js +2 -1
  39. package/dist/cjs/types/airtable_interface.js +2 -1
  40. package/dist/cjs/types/attachment.js +2 -1
  41. package/dist/cjs/types/backend_fetch_types.js +2 -1
  42. package/dist/cjs/types/base.js +2 -1
  43. package/dist/cjs/types/block.js +2 -1
  44. package/dist/cjs/types/block_query_spec.js +86 -0
  45. package/dist/cjs/types/collaborator.js +2 -1
  46. package/dist/cjs/types/cursor.js +2 -1
  47. package/dist/cjs/types/field.js +2 -1
  48. package/dist/cjs/types/global_config.js +2 -1
  49. package/dist/cjs/types/mutations.js +3 -1
  50. package/dist/cjs/types/permission_levels.js +2 -1
  51. package/dist/cjs/types/record.js +2 -1
  52. package/dist/cjs/types/record_action_data.js +2 -1
  53. package/dist/cjs/types/stat.js +2 -1
  54. package/dist/cjs/types/table.js +2 -1
  55. package/dist/cjs/types/undo_redo.js +2 -1
  56. package/dist/cjs/types/view.js +2 -1
  57. package/dist/cjs/types/viewport.js +2 -1
  58. package/dist/cjs/ui/base_provider.js +2 -1
  59. package/dist/cjs/ui/baymax_utils.js +2 -1
  60. package/dist/cjs/ui/block_wrapper.js +2 -1
  61. package/dist/cjs/ui/box.js +2 -1
  62. package/dist/cjs/ui/button.js +2 -1
  63. package/dist/cjs/ui/cell_renderer.js +2 -1
  64. package/dist/cjs/ui/choice_token.js +2 -1
  65. package/dist/cjs/ui/collaborator_token.js +2 -1
  66. package/dist/cjs/ui/color_palette.js +2 -1
  67. package/dist/cjs/ui/color_palette_synced.js +2 -1
  68. package/dist/cjs/ui/confirmation_dialog.js +2 -1
  69. package/dist/cjs/ui/control_sizes.js +2 -1
  70. package/dist/cjs/ui/create_detect_element_resize.js +2 -1
  71. package/dist/cjs/ui/css_helpers.js +2 -1
  72. package/dist/cjs/ui/dialog.js +2 -1
  73. package/dist/cjs/ui/dialog_close_button.js +2 -1
  74. package/dist/cjs/ui/expand_record.js +2 -1
  75. package/dist/cjs/ui/expand_record_list.js +2 -1
  76. package/dist/cjs/ui/expand_record_picker_async.js +2 -1
  77. package/dist/cjs/ui/field_icon.js +2 -1
  78. package/dist/cjs/ui/field_picker.js +2 -1
  79. package/dist/cjs/ui/field_picker_synced.js +2 -1
  80. package/dist/cjs/ui/form_field.js +2 -1
  81. package/dist/cjs/ui/geometry/geometry.js +2 -1
  82. package/dist/cjs/ui/geometry/point.js +2 -1
  83. package/dist/cjs/ui/geometry/rect.js +2 -1
  84. package/dist/cjs/ui/geometry/size.js +2 -1
  85. package/dist/cjs/ui/global_alert.js +2 -1
  86. package/dist/cjs/ui/global_config_synced_component_helpers.js +2 -1
  87. package/dist/cjs/ui/heading.js +2 -1
  88. package/dist/cjs/ui/icon.js +2 -1
  89. package/dist/cjs/ui/icon_config.js +6 -3
  90. package/dist/cjs/ui/initialize_block.js +2 -1
  91. package/dist/cjs/ui/input.js +2 -1
  92. package/dist/cjs/ui/input_synced.js +2 -1
  93. package/dist/cjs/ui/key_codes.js +2 -1
  94. package/dist/cjs/ui/label.js +2 -1
  95. package/dist/cjs/ui/link.js +2 -1
  96. package/dist/cjs/ui/loader.js +2 -1
  97. package/dist/cjs/ui/modal.js +2 -1
  98. package/dist/cjs/ui/model_picker_select.js +2 -1
  99. package/dist/cjs/ui/popover.js +2 -1
  100. package/dist/cjs/ui/progress_bar.js +2 -1
  101. package/dist/cjs/ui/record_card.js +2 -1
  102. package/dist/cjs/ui/record_card_list.js +2 -1
  103. package/dist/cjs/ui/remote_utils.js +2 -1
  104. package/dist/cjs/ui/sdk_context.js +2 -1
  105. package/dist/cjs/ui/select.js +2 -1
  106. package/dist/cjs/ui/select_and_select_buttons_helpers.js +2 -1
  107. package/dist/cjs/ui/select_buttons.js +2 -1
  108. package/dist/cjs/ui/select_buttons_synced.js +2 -1
  109. package/dist/cjs/ui/select_synced.js +2 -1
  110. package/dist/cjs/ui/switch.js +2 -1
  111. package/dist/cjs/ui/switch_synced.js +2 -1
  112. package/dist/cjs/ui/synced.js +2 -1
  113. package/dist/cjs/ui/system/all_styles_set.js +2 -1
  114. package/dist/cjs/ui/system/appearance/appearance_set.js +2 -1
  115. package/dist/cjs/ui/system/appearance/background_color.js +2 -1
  116. package/dist/cjs/ui/system/appearance/border.js +2 -1
  117. package/dist/cjs/ui/system/appearance/border_radius.js +2 -1
  118. package/dist/cjs/ui/system/appearance/box_shadow.js +2 -1
  119. package/dist/cjs/ui/system/appearance/opacity.js +2 -1
  120. package/dist/cjs/ui/system/dimensions/dimensions_set.js +2 -1
  121. package/dist/cjs/ui/system/dimensions/height.js +2 -1
  122. package/dist/cjs/ui/system/dimensions/max_height.js +2 -1
  123. package/dist/cjs/ui/system/dimensions/max_width.js +2 -1
  124. package/dist/cjs/ui/system/dimensions/min_height.js +2 -1
  125. package/dist/cjs/ui/system/dimensions/min_width.js +2 -1
  126. package/dist/cjs/ui/system/dimensions/width.js +2 -1
  127. package/dist/cjs/ui/system/display.js +2 -1
  128. package/dist/cjs/ui/system/flex_container/align_content.js +2 -1
  129. package/dist/cjs/ui/system/flex_container/align_items.js +2 -1
  130. package/dist/cjs/ui/system/flex_container/flex_container_set.js +2 -1
  131. package/dist/cjs/ui/system/flex_container/flex_direction.js +2 -1
  132. package/dist/cjs/ui/system/flex_container/flex_wrap.js +2 -1
  133. package/dist/cjs/ui/system/flex_container/justify_content.js +2 -1
  134. package/dist/cjs/ui/system/flex_container/justify_items.js +2 -1
  135. package/dist/cjs/ui/system/flex_item/align_self.js +2 -1
  136. package/dist/cjs/ui/system/flex_item/flex.js +2 -1
  137. package/dist/cjs/ui/system/flex_item/flex_basis.js +2 -1
  138. package/dist/cjs/ui/system/flex_item/flex_grow.js +2 -1
  139. package/dist/cjs/ui/system/flex_item/flex_item_set.js +2 -1
  140. package/dist/cjs/ui/system/flex_item/flex_shrink.js +2 -1
  141. package/dist/cjs/ui/system/flex_item/justify_self.js +2 -1
  142. package/dist/cjs/ui/system/flex_item/order.js +2 -1
  143. package/dist/cjs/ui/system/index.js +2 -1
  144. package/dist/cjs/ui/system/overflow.js +2 -1
  145. package/dist/cjs/ui/system/position/bottom.js +2 -1
  146. package/dist/cjs/ui/system/position/left.js +2 -1
  147. package/dist/cjs/ui/system/position/position.js +2 -1
  148. package/dist/cjs/ui/system/position/position_set.js +2 -1
  149. package/dist/cjs/ui/system/position/right.js +2 -1
  150. package/dist/cjs/ui/system/position/top.js +2 -1
  151. package/dist/cjs/ui/system/position/z_index.js +2 -1
  152. package/dist/cjs/ui/system/spacing/margin.js +2 -1
  153. package/dist/cjs/ui/system/spacing/padding.js +2 -1
  154. package/dist/cjs/ui/system/spacing/spacing_set.js +2 -1
  155. package/dist/cjs/ui/system/typography/font_family.js +2 -1
  156. package/dist/cjs/ui/system/typography/font_size.js +2 -1
  157. package/dist/cjs/ui/system/typography/font_style.js +2 -1
  158. package/dist/cjs/ui/system/typography/font_weight.js +2 -1
  159. package/dist/cjs/ui/system/typography/letter_spacing.js +2 -1
  160. package/dist/cjs/ui/system/typography/line_height.js +2 -1
  161. package/dist/cjs/ui/system/typography/text_align.js +2 -1
  162. package/dist/cjs/ui/system/typography/text_color.js +2 -1
  163. package/dist/cjs/ui/system/typography/text_decoration.js +2 -1
  164. package/dist/cjs/ui/system/typography/text_transform.js +2 -1
  165. package/dist/cjs/ui/system/typography/typography_set.js +2 -1
  166. package/dist/cjs/ui/system/utils/create_responsive_prop_type.js +2 -1
  167. package/dist/cjs/ui/system/utils/create_style_prop_types.js +2 -1
  168. package/dist/cjs/ui/system/utils/csstype.js +2 -1
  169. package/dist/cjs/ui/system/utils/ensure_numbers_are_within_scale.js +2 -1
  170. package/dist/cjs/ui/system/utils/get_style_props_for_responsive_prop.js +2 -1
  171. package/dist/cjs/ui/system/utils/types.js +2 -1
  172. package/dist/cjs/ui/table_picker.js +2 -1
  173. package/dist/cjs/ui/table_picker_synced.js +2 -1
  174. package/dist/cjs/ui/text.js +2 -1
  175. package/dist/cjs/ui/text_button.js +2 -1
  176. package/dist/cjs/ui/theme/default_theme/button_variants.js +2 -1
  177. package/dist/cjs/ui/theme/default_theme/control_sizes.js +2 -1
  178. package/dist/cjs/ui/theme/default_theme/heading_styles.js +2 -1
  179. package/dist/cjs/ui/theme/default_theme/index.js +2 -1
  180. package/dist/cjs/ui/theme/default_theme/input_variants.js +2 -1
  181. package/dist/cjs/ui/theme/default_theme/link_variants.js +2 -1
  182. package/dist/cjs/ui/theme/default_theme/select_buttons_variants.js +2 -1
  183. package/dist/cjs/ui/theme/default_theme/select_variants.js +2 -1
  184. package/dist/cjs/ui/theme/default_theme/switch_variants.js +2 -1
  185. package/dist/cjs/ui/theme/default_theme/text_button_variants.js +2 -1
  186. package/dist/cjs/ui/theme/default_theme/text_styles.js +2 -1
  187. package/dist/cjs/ui/theme/default_theme/tokens.js +2 -1
  188. package/dist/cjs/ui/theme/theme_context.js +2 -1
  189. package/dist/cjs/ui/theme/use_theme.js +2 -1
  190. package/dist/cjs/ui/tooltip.js +2 -1
  191. package/dist/cjs/ui/types/aria_props.js +2 -1
  192. package/dist/cjs/ui/types/data_attributes_prop.js +2 -1
  193. package/dist/cjs/ui/types/tooltip_anchor_props.js +2 -1
  194. package/dist/cjs/ui/ui.js +2 -1
  195. package/dist/cjs/ui/unstable_standalone_ui.js +2 -1
  196. package/dist/cjs/ui/use_array_identity.js +2 -1
  197. package/dist/cjs/ui/use_base.js +2 -1
  198. package/dist/cjs/ui/use_cursor.js +2 -1
  199. package/dist/cjs/ui/use_form_field.js +2 -1
  200. package/dist/cjs/ui/use_global_config.js +3 -2
  201. package/dist/cjs/ui/use_loadable.js +2 -1
  202. package/dist/cjs/ui/use_record_action_data.js +2 -1
  203. package/dist/cjs/ui/use_records.js +7 -2
  204. package/dist/cjs/ui/use_session.js +2 -1
  205. package/dist/cjs/ui/use_settings_button.js +2 -1
  206. package/dist/cjs/ui/use_styled_system.js +2 -1
  207. package/dist/cjs/ui/use_synced.js +2 -1
  208. package/dist/cjs/ui/use_text_color_for_background_color.js +2 -1
  209. package/dist/cjs/ui/use_view_metadata.js +2 -1
  210. package/dist/cjs/ui/use_viewport.js +2 -1
  211. package/dist/cjs/ui/use_watchable.js +2 -1
  212. package/dist/cjs/ui/view_picker.js +2 -1
  213. package/dist/cjs/ui/view_picker_synced.js +2 -1
  214. package/dist/cjs/ui/viewport_constraint.js +2 -1
  215. package/dist/cjs/ui/with_hooks.js +2 -1
  216. package/dist/cjs/ui/with_styled_system.js +2 -1
  217. package/dist/cjs/undo_redo.js +2 -1
  218. package/dist/cjs/unstable_private_utils.js +2 -1
  219. package/dist/cjs/unstable_testing_utils.js +3 -2
  220. package/dist/cjs/viewport.js +2 -1
  221. package/dist/cjs/warning.js +2 -1
  222. package/dist/cjs/watchable.js +125 -72
  223. package/dist/types/src/models/base.d.ts +10 -3
  224. package/dist/types/src/models/base.d.ts.map +1 -1
  225. package/dist/types/src/models/cursor.d.ts +2 -0
  226. package/dist/types/src/models/cursor.d.ts.map +1 -1
  227. package/dist/types/src/models/field.d.ts +65 -1
  228. package/dist/types/src/models/field.d.ts.map +1 -1
  229. package/dist/types/src/models/grouped_record_query_result.d.ts +3 -3
  230. package/dist/types/src/models/grouped_record_query_result.d.ts.map +1 -1
  231. package/dist/types/src/models/linked_records_query_result.d.ts.map +1 -1
  232. package/dist/types/src/models/mutation_constants.d.ts +1 -0
  233. package/dist/types/src/models/mutation_constants.d.ts.map +1 -1
  234. package/dist/types/src/models/mutations.d.ts.map +1 -1
  235. package/dist/types/src/models/query_manager.d.ts +2 -0
  236. package/dist/types/src/models/query_manager.d.ts.map +1 -0
  237. package/dist/types/src/models/record.d.ts +12 -3
  238. package/dist/types/src/models/record.d.ts.map +1 -1
  239. package/dist/types/src/models/record_query_result.d.ts +3 -2
  240. package/dist/types/src/models/record_query_result.d.ts.map +1 -1
  241. package/dist/types/src/models/record_store.d.ts.map +1 -1
  242. package/dist/types/src/models/table.d.ts +8 -4
  243. package/dist/types/src/models/table.d.ts.map +1 -1
  244. package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
  245. package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
  246. package/dist/types/src/models/view_data_store.d.ts +0 -1
  247. package/dist/types/src/models/view_data_store.d.ts.map +1 -1
  248. package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
  249. package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
  250. package/dist/types/src/private_utils.d.ts +30 -1
  251. package/dist/types/src/private_utils.d.ts.map +1 -1
  252. package/dist/types/src/sdk.d.ts.map +1 -1
  253. package/dist/types/src/testing/{mock_airtable_interface.d.ts → abstract_mock_airtable_interface.d.ts} +20 -15
  254. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -0
  255. package/dist/types/src/types/airtable_interface.d.ts +48 -20
  256. package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
  257. package/dist/types/src/types/block_query_spec.d.ts +139 -0
  258. package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
  259. package/dist/types/src/types/field.d.ts +80 -44
  260. package/dist/types/src/types/field.d.ts.map +1 -1
  261. package/dist/types/src/types/mutations.d.ts +31 -3
  262. package/dist/types/src/types/mutations.d.ts.map +1 -1
  263. package/dist/types/src/types/table.d.ts +0 -2
  264. package/dist/types/src/types/table.d.ts.map +1 -1
  265. package/dist/types/src/types/view.d.ts +3 -8
  266. package/dist/types/src/types/view.d.ts.map +1 -1
  267. package/dist/types/src/ui/cell_renderer.d.ts +1 -1
  268. package/dist/types/src/ui/color_palette.d.ts +1 -1
  269. package/dist/types/src/ui/control_sizes.d.ts +1 -1
  270. package/dist/types/src/ui/field_icon.d.ts +1 -1
  271. package/dist/types/src/ui/heading.d.ts +1 -1
  272. package/dist/types/src/ui/icon.d.ts +1 -1
  273. package/dist/types/src/ui/icon_config.d.ts +33 -31
  274. package/dist/types/src/ui/icon_config.d.ts.map +1 -1
  275. package/dist/types/src/ui/input.d.ts +10 -10
  276. package/dist/types/src/ui/link.d.ts +1 -1
  277. package/dist/types/src/ui/link.d.ts.map +1 -1
  278. package/dist/types/src/ui/record_card.d.ts +1 -1
  279. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts +1 -1
  280. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts.map +1 -1
  281. package/dist/types/src/ui/text.d.ts +1 -1
  282. package/dist/types/src/ui/theme/default_theme/index.d.ts +1 -1
  283. package/dist/types/src/ui/theme/theme_context.d.ts +1 -1
  284. package/dist/types/src/ui/theme/use_theme.d.ts +1 -1
  285. package/dist/types/src/ui/use_global_config.d.ts +1 -1
  286. package/dist/types/src/unstable_testing_utils.d.ts +1 -1
  287. package/dist/types/src/unstable_testing_utils.d.ts.map +1 -1
  288. package/dist/types/src/watchable.d.ts.map +1 -1
  289. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +121 -0
  290. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -0
  291. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts +2 -2
  292. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts.map +1 -1
  293. package/dist/types/test/airtable_interface_mocks/{mock_airtable_interface_internal.d.ts → mock_airtable_interface.d.ts} +26 -18
  294. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -0
  295. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts +51 -0
  296. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts.map +1 -0
  297. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts +2 -2
  298. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts.map +1 -1
  299. package/dist/types/test/test_helpers.d.ts +2 -0
  300. package/dist/types/test/test_helpers.d.ts.map +1 -1
  301. package/package.json +2 -1
  302. package/dist/cjs/testing/mock_airtable_interface.js +0 -317
  303. package/dist/types/src/testing/mock_airtable_interface.d.ts.map +0 -1
  304. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface_internal.d.ts.map +0 -1
@@ -29,6 +29,8 @@ Object.defineProperty(exports, "__esModule", {
29
29
  });
30
30
  exports.default = exports.getLinkedTableId = void 0;
31
31
 
32
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
33
+
32
34
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
33
35
 
34
36
  require("regenerator-runtime/runtime");
@@ -53,8 +55,12 @@ var _field = require("../types/field");
53
55
 
54
56
  var _error_utils = require("../error_utils");
55
57
 
58
+ var _block_query_spec = require("../types/block_query_spec");
59
+
56
60
  var _record_query_result = _interopRequireDefault(require("./record_query_result"));
57
61
 
62
+ var _record_store = require("./record_store");
63
+
58
64
  /** @module @airtable/blocks/models: RecordQueryResult */
59
65
 
60
66
  /** */
@@ -118,6 +124,8 @@ function (_RecordQueryResult) {
118
124
 
119
125
  /** @internal */
120
126
 
127
+ /** @internal */
128
+
121
129
  /** @internal */
122
130
  function LinkedRecordsQueryResult(record, field, normalizedOpts, sdk) {
123
131
  var _this;
@@ -134,6 +142,7 @@ function (_RecordQueryResult) {
134
142
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_computedRecordIdsSet", null);
135
143
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_computedFilteredSortedRecordIds", null);
136
144
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_cellValueChangeHandlerByFieldId", {});
145
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_recordStoreQueryId", null);
137
146
  (0, _error_utils.invariant)(record.parentTable === field.parentTable, 'record and field must belong to the same table');
138
147
  _this._record = record;
139
148
  _this._field = field;
@@ -279,7 +288,7 @@ function (_RecordQueryResult) {
279
288
  }, {
280
289
  key: "_loadDataAsync",
281
290
  value: function _loadDataAsync() {
282
- var initiallyLoaded, changedKeys, fieldIds, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, fieldId;
291
+ var initiallyLoaded, _ref, _ref2, recordStoreQueryId, changedKeys, fieldIds, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, fieldId;
283
292
 
284
293
  return _regenerator.default.async(function _loadDataAsync$(_context2) {
285
294
  while (1) {
@@ -291,11 +300,21 @@ function (_RecordQueryResult) {
291
300
 
292
301
  this._watchLinkedQueryResult();
293
302
 
294
- initiallyLoaded = this._linkedQueryResult.isDataLoaded;
303
+ initiallyLoaded = this._linkedQueryResult.isDataLoaded; // https://airtable.com/appahuJQw7qfQTBBU/tblSbpimM8Spp9txp/viweAFIus3MhU9Gxa/recNjFYJpeV23LPhH?blocks=hide
304
+ // TODO: (#proj-blocks-sdk-record-limits) Currently queries all cell values in a table
305
+ // when loading linked record data. Must add a LinkedRecord query type in the future.
306
+ // Since _loadDataAsync can only be called once, this recordStoreQueryId is only set once,
307
+ // although it is guaranteed to be stable if needed (so long as this._field.id is stable)
308
+
295
309
  _context2.next = 6;
296
- return _regenerator.default.awrap(Promise.all([this._sdk.base.__getRecordStore(this._record.parentTable.id).loadCellValuesInFieldIdsAsync([this._field.id]), this._linkedQueryResult.loadDataAsync(), this._loadRecordColorsAsync()]));
310
+ return _regenerator.default.awrap(Promise.all([this._sdk.base.__getRecordStore(this._record.parentTable.id).loadAllCellValuesInFieldIdsAsync([this._field.id]), this._linkedQueryResult.loadDataAsync(), this._loadRecordColorsAsync()]));
297
311
 
298
312
  case 6:
313
+ _ref = _context2.sent;
314
+ _ref2 = (0, _slicedToArray2.default)(_ref, 1);
315
+ recordStoreQueryId = _ref2[0];
316
+ this._recordStoreQueryId = recordStoreQueryId;
317
+
299
318
  this._invalidateComputedData();
300
319
 
301
320
  changedKeys = ['records', 'recordIds', 'recordColors']; // If the linked query result was not initially loaded, then the
@@ -311,55 +330,55 @@ function (_RecordQueryResult) {
311
330
  _iteratorNormalCompletion3 = true;
312
331
  _didIteratorError3 = false;
313
332
  _iteratorError3 = undefined;
314
- _context2.prev = 13;
333
+ _context2.prev = 17;
315
334
 
316
335
  for (_iterator3 = fieldIds[Symbol.iterator](); !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
317
336
  fieldId = _step3.value;
318
337
  changedKeys.push(_record_query_result.default.WatchableCellValuesInFieldKeyPrefix + fieldId);
319
338
  }
320
339
 
321
- _context2.next = 21;
340
+ _context2.next = 25;
322
341
  break;
323
342
 
324
- case 17:
325
- _context2.prev = 17;
326
- _context2.t0 = _context2["catch"](13);
343
+ case 21:
344
+ _context2.prev = 21;
345
+ _context2.t0 = _context2["catch"](17);
327
346
  _didIteratorError3 = true;
328
347
  _iteratorError3 = _context2.t0;
329
348
 
330
- case 21:
331
- _context2.prev = 21;
332
- _context2.prev = 22;
349
+ case 25:
350
+ _context2.prev = 25;
351
+ _context2.prev = 26;
333
352
 
334
353
  if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
335
354
  _iterator3.return();
336
355
  }
337
356
 
338
- case 24:
339
- _context2.prev = 24;
357
+ case 28:
358
+ _context2.prev = 28;
340
359
 
341
360
  if (!_didIteratorError3) {
342
- _context2.next = 27;
361
+ _context2.next = 31;
343
362
  break;
344
363
  }
345
364
 
346
365
  throw _iteratorError3;
347
366
 
348
- case 27:
349
- return _context2.finish(24);
367
+ case 31:
368
+ return _context2.finish(28);
350
369
 
351
- case 28:
352
- return _context2.finish(21);
370
+ case 32:
371
+ return _context2.finish(25);
353
372
 
354
- case 29:
373
+ case 33:
355
374
  return _context2.abrupt("return", changedKeys);
356
375
 
357
- case 30:
376
+ case 34:
358
377
  case "end":
359
378
  return _context2.stop();
360
379
  }
361
380
  }
362
- }, null, this, [[13, 17, 21, 29], [22,, 24, 28]]);
381
+ }, null, this, [[17, 21, 25, 33], [26,, 28, 32]]);
363
382
  }
364
383
  /** @internal */
365
384
 
@@ -376,7 +395,9 @@ function (_RecordQueryResult) {
376
395
 
377
396
  this._unwatchLinkedQueryResult();
378
397
 
379
- this._sdk.base.__getRecordStore(this._record.parentTable.id).unloadCellValuesInFieldIds([this._field.id]);
398
+ (0, _error_utils.invariant)(this._recordStoreQueryId, 'Unsubscribing from linked record record store without queryId');
399
+
400
+ this._originRecordStore.unloadCellValuesForQueryIdsThatAreSubscribedToAllCells([this._recordStoreQueryId]);
380
401
 
381
402
  this._linkedQueryResult.unloadData();
382
403
 
@@ -448,7 +469,12 @@ function (_RecordQueryResult) {
448
469
  // result
449
470
 
450
471
 
451
- this._originRecordStore.watch('recordIds', this._onOriginRecordsChange, this); // if the linked field in the origin table is deleted, we need to
472
+ this._originRecordStore.watchWithRecordQueryResult({
473
+ recordQueryResult: this,
474
+ keys: _record_store.WatchableRecordStoreKeys.recordIds,
475
+ callbackForRegistration: this._onOriginRecordsChange,
476
+ context: this
477
+ }); // if the linked field in the origin table is deleted, we need to
452
478
  // invalidate this result
453
479
 
454
480
 
@@ -592,11 +618,12 @@ function (_RecordQueryResult) {
592
618
  if (Array.isArray(recordIds)) {
593
619
  var recordIdsSet = this._getOrGenerateRecordIdsSet();
594
620
 
595
- var filteredRecordIds = recordIds.filter(id => typeof id === 'string' && recordIdsSet[id] === true);
621
+ var filteredRecordIds = recordIds.filter(id => typeof id === 'string' && recordIdsSet[id] === true); // There should always be a filteredRecordIds found for this query
622
+ // type - not finding any is a fundamental mistake in our query engine
596
623
 
597
- if (filteredRecordIds.length) {
598
- this._onChange(_record_query_result.default.WatchableCellValuesInFieldKeyPrefix + fieldId, filteredRecordIds);
599
- }
624
+ (0, _error_utils.invariant)(filteredRecordIds.length, 'Filtered record change on incorrect record, query engine issue');
625
+
626
+ this._onChange(_record_query_result.default.WatchableCellValuesInFieldKeyPrefix + fieldId, filteredRecordIds);
600
627
  } else {
601
628
  this._onChange(_record_query_result.default.WatchableCellValuesInFieldKeyPrefix + fieldId);
602
629
  }
@@ -776,6 +803,27 @@ function (_RecordQueryResult) {
776
803
  (0, _error_utils.invariant)(recordIdsSet, 'recordIdsSet must exist');
777
804
  return recordIdsSet;
778
805
  }
806
+ /**
807
+ * This allows a record query result to specify the source of the query
808
+ * eg: View, Table, Linked record when watching fields.
809
+ * This scopes the watch to those fields + rows in the query.
810
+ *
811
+ * @internal
812
+ */
813
+
814
+ }, {
815
+ key: "__constructQuerySpecForBlockFieldSelectionSpec",
816
+ value: function __constructQuerySpecForBlockFieldSelectionSpec(fieldSelection) {
817
+ // The origin tableId is always the one referred to here as we must watch the origin record for deletion
818
+ var originTableId = this._record.parentTable.id;
819
+ return {
820
+ sourceType: _block_query_spec.BlockQuerySourceType.TABLE,
821
+ sourceTableId: originTableId,
822
+ recordSelection: {
823
+ fieldSelection
824
+ }
825
+ };
826
+ }
779
827
  }, {
780
828
  key: "isValid",
781
829
  get: function get() {
@@ -894,4 +942,5 @@ function (_RecordQueryResult) {
894
942
 
895
943
  (0, _defineProperty2.default)(LinkedRecordsQueryResult, "_className", 'LinkedRecordsQueryResult');
896
944
  var _default = LinkedRecordsQueryResult;
897
- exports.default = _default;
945
+ exports.default = _default;
946
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvbGlua2VkX3JlY29yZHNfcXVlcnlfcmVzdWx0LnRzIl0sIm5hbWVzIjpbImdldExpbmtlZFRhYmxlSWQiLCJmaWVsZCIsIm9wdGlvbnMiLCJsaW5rZWRUYWJsZUlkIiwiTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IiwicmVjb3JkIiwibm9ybWFsaXplZE9wdHMiLCJzZGsiLCJwYXJlbnRUYWJsZSIsIl9yZWNvcmQiLCJfZmllbGQiLCJfbGlua2VkVGFibGUiLCJ0YWJsZSIsIl9vcmlnaW5SZWNvcmRTdG9yZSIsIl9zZGsiLCJiYXNlIiwiX19nZXRSZWNvcmRTdG9yZSIsImlkIiwiX2xpbmtlZFJlY29yZFN0b3JlIiwicmVjb3JkU3RvcmUiLCJfbGlua2VkUXVlcnlSZXN1bHQiLCJfX3RhYmxlT3JWaWV3UXVlcnlSZXN1bHRQb29sIiwiZ2V0T2JqZWN0Rm9yUmV1c2UiLCJrZXlzIiwiY2FsbGJhY2siLCJjb250ZXh0IiwiaXNWYWxpZCIsInZhbGlkS2V5cyIsImtleSIsIlJlY29yZFF1ZXJ5UmVzdWx0IiwiV2F0Y2hhYmxlS2V5cyIsImNlbGxWYWx1ZXMiLCJfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXNJZk5lZWRlZEFmdGVyV2F0Y2giLCJzdGFydHNXaXRoIiwiV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXgiLCJmaWVsZElkIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiX3dhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZElmTmVlZGVkQWZ0ZXJXYXRjaCIsImFycmF5S2V5cyIsIkFycmF5IiwiaXNBcnJheSIsIl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSWZQb3NzaWJsZUJlZm9yZVVud2F0Y2giLCJfdW53YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlc0luRmllbGRJZlBvc3NpYmxlQmVmb3JlVW53YXRjaCIsImlzRGF0YUxvYWRlZCIsImxvYWREYXRhQXN5bmMiLCJ1bmxvYWREYXRhIiwiX19saW5rZWRSZWNvcmRzUXVlcnlSZXN1bHRQb29sIiwicmVnaXN0ZXJPYmplY3RGb3JSZXVzZVN0cm9uZyIsIl93YXRjaE9yaWdpbiIsIl93YXRjaExpbmtlZFF1ZXJ5UmVzdWx0IiwiaW5pdGlhbGx5TG9hZGVkIiwiUHJvbWlzZSIsImFsbCIsImxvYWRBbGxDZWxsVmFsdWVzSW5GaWVsZElkc0FzeW5jIiwiX2xvYWRSZWNvcmRDb2xvcnNBc3luYyIsInJlY29yZFN0b3JlUXVlcnlJZCIsIl9yZWNvcmRTdG9yZVF1ZXJ5SWQiLCJfaW52YWxpZGF0ZUNvbXB1dGVkRGF0YSIsImNoYW5nZWRLZXlzIiwicHVzaCIsImZpZWxkSWRzIiwiX25vcm1hbGl6ZWRPcHRzIiwiZmllbGRJZHNPck51bGxJZkFsbEZpZWxkcyIsImZpZWxkcyIsIm1hcCIsInVucmVnaXN0ZXJPYmplY3RGb3JSZXVzZVN0cm9uZyIsIl91bndhdGNoT3JpZ2luIiwiX3Vud2F0Y2hMaW5rZWRRdWVyeVJlc3VsdCIsInVubG9hZENlbGxWYWx1ZXNGb3JRdWVyeUlkc1RoYXRBcmVTdWJzY3JpYmVkVG9BbGxDZWxscyIsIl91bmxvYWRSZWNvcmRDb2xvcnMiLCJfY2VsbFZhbHVlc1dhdGNoQ291bnQiLCJfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXMiLCJfdW53YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlcyIsIl9jZWxsVmFsdWVXYXRjaENvdW50QnlGaWVsZElkIiwiX3dhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZCIsIl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZCIsIndhdGNoIiwiX29uT3JpZ2luQ2VsbFZhbHVlQ2hhbmdlIiwiX29uT3JpZ2luRmllbGRDb25maWdDaGFuZ2UiLCJ3YXRjaFdpdGhSZWNvcmRRdWVyeVJlc3VsdCIsInJlY29yZFF1ZXJ5UmVzdWx0IiwiV2F0Y2hhYmxlUmVjb3JkU3RvcmVLZXlzIiwicmVjb3JkSWRzIiwiY2FsbGJhY2tGb3JSZWdpc3RyYXRpb24iLCJfb25PcmlnaW5SZWNvcmRzQ2hhbmdlIiwiX29uT3JpZ2luRmllbGRzQ2hhbmdlIiwidW53YXRjaCIsIl9vbkxpbmtlZFJlY29yZElkc0NoYW5nZSIsIl9vbkxpbmtlZENlbGxWYWx1ZXNDaGFuZ2UiLCJfZ2V0T25MaW5rZWRDZWxsVmFsdWVzSW5GaWVsZENoYW5nZSIsIl9vbkNoYW5nZSIsInF1ZXJ5UmVzdWx0IiwiY2hhbmdlcyIsInJlY29yZElkc1NldCIsIl9nZXRPckdlbmVyYXRlUmVjb3JkSWRzU2V0IiwiZmlsdGVyIiwiX2NlbGxWYWx1ZUNoYW5nZUhhbmRsZXJCeUZpZWxkSWQiLCJmaWx0ZXJlZFJlY29yZElkcyIsImlzRGVsZXRlZCIsIl9pc1ZhbGlkIiwidHlwZSIsIkZpZWxkVHlwZSIsIk1VTFRJUExFX1JFQ09SRF9MSU5LUyIsIl9pbnZhbGlkYXRlUXVlcnlSZXN1bHQiLCJfdW5sb2FkRGF0YSIsIk9iamVjdCIsIl9jb21wdXRlZFJlY29yZElkc1NldCIsIl9jb21wdXRlZEZpbHRlcmVkU29ydGVkUmVjb3JkSWRzIiwiX2dlbmVyYXRlQ29tcHV0ZWREYXRhIiwicmF3Q2VsbFZhbHVlIiwiZ2V0Q2VsbFZhbHVlIiwiY2VsbFZhbHVlIiwibGlua2VkUmVjb3JkIiwicmVjb3JkSWQiLCJoYXNSZWNvcmQiLCJzb3J0cyIsIl9nZW5lcmF0ZUNvbXB1dGVkRGF0YUlmTmVlZGVkIiwiZmllbGRTZWxlY3Rpb24iLCJvcmlnaW5UYWJsZUlkIiwic291cmNlVHlwZSIsIkJsb2NrUXVlcnlTb3VyY2VUeXBlIiwiVEFCTEUiLCJzb3VyY2VUYWJsZUlkIiwicmVjb3JkU2VsZWN0aW9uIiwiZ2V0UmVjb3JkQnlJZElmRXhpc3RzIiwiX3NlcmlhbGl6ZWRPcHRzIiwiX2NoYW5nZVdhdGNoZXJzQnlLZXkiLCJjb3VudEJ5RmllbGRJZCIsIndhdGNoS2V5cyIsIndhdGNoS2V5Iiwic2xpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7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Q0MsVUFBMUQsS0FBeUUsRUFBMUUsRUFBOEVNLE1BQXJGO0FBQ0g7Ozt3QkFpQnNFO0FBQ25FLFVBQU0yRixjQUEwQyxHQUFHLEVBQW5EO0FBQ0EsVUFBTUMsU0FBUyxHQUFHdkIsTUFBTSxDQUFDbkYsSUFBUCxDQUFZLEtBQUt3RyxvQkFBakIsRUFBdUMvQixNQUF2QyxDQUE4Q3BFLEdBQUcsSUFBSTtBQUNuRSxlQUFPQSxHQUFHLENBQUNLLFVBQUosQ0FBZUosNkJBQWtCSyxtQ0FBakMsQ0FBUDtBQUNILE9BRmlCLENBQWxCO0FBRm1FO0FBQUE7QUFBQTs7QUFBQTtBQUtuRSw4QkFBdUIrRixTQUF2QixtSUFBa0M7QUFBQSxjQUF2QkMsUUFBdUI7QUFDOUIsY0FBTS9GLE9BQU8sR0FBRytGLFFBQVEsQ0FBQ0MsS0FBVCxDQUNadEcsNkJBQWtCSyxtQ0FBbEIsQ0FBc0RHLE1BRDFDLENBQWhCO0FBR0EyRixVQUFBQSxjQUFjLENBQUM3RixPQUFELENBQWQsR0FBMEIsS0FBSzRGLG9CQUFMLENBQTBCRyxRQUExQixFQUFvQzdGLE1BQTlEO0FBQ0g7QUFWa0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFZbkUsYUFBTzJGLGNBQVA7QUFDSDs7O3dCQThIK0Q7QUFDNUQsVUFBSSxLQUFLdkgsT0FBTCxDQUFhMEYsU0FBYixJQUEwQixLQUFLakYsa0JBQUwsQ0FBd0JpRixTQUF0RCxFQUFpRTtBQUM3RCxlQUFPLElBQVA7QUFDSDs7QUFFRCxhQUFPLEVBQVA7QUFDSDs7O0VBN2JrQ3RFLDRCOzs4QkFBakN6Qix3QixnQkFFa0IsMEI7ZUEycEJUQSx3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzOiBSZWNvcmRRdWVyeVJlc3VsdCAqLyAvKiogKi9cbmltcG9ydCB7RmllbGRUeXBlLCBGaWVsZElkfSBmcm9tICcuLi90eXBlcy9maWVsZCc7XG5pbXBvcnQgU2RrIGZyb20gJy4uL3Nkayc7XG5pbXBvcnQge0Zsb3dBbnlGdW5jdGlvbiwgRmxvd0FueU9iamVjdCwgT2JqZWN0TWFwfSBmcm9tICcuLi9wcml2YXRlX3V0aWxzJztcbmltcG9ydCB7aW52YXJpYW50fSBmcm9tICcuLi9lcnJvcl91dGlscyc7XG5pbXBvcnQge1JlY29yZElkfSBmcm9tICcuLi90eXBlcy9yZWNvcmQnO1xuaW1wb3J0IHtcbiAgICBCbG9ja1F1ZXJ5SWQsXG4gICAgQmxvY2tRdWVyeVNwZWMsXG4gICAgQmxvY2tRdWVyeVNvdXJjZVR5cGUsXG4gICAgQmxvY2tGaWVsZFNlbGVjdGlvblNwZWMsXG59IGZyb20gJy4uL3R5cGVzL2Jsb2NrX3F1ZXJ5X3NwZWMnO1xuaW1wb3J0IFJlY29yZFF1ZXJ5UmVzdWx0LCB7XG4gICAgV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXksXG4gICAgTm9ybWFsaXplZFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyxcbn0gZnJvbSAnLi9yZWNvcmRfcXVlcnlfcmVzdWx0JztcbmltcG9ydCBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0IGZyb20gJy4vdGFibGVfb3Jfdmlld19xdWVyeV9yZXN1bHQnO1xuXG5pbXBvcnQgVGFibGUgZnJvbSAnLi90YWJsZSc7XG5pbXBvcnQgRmllbGQgZnJvbSAnLi9maWVsZCc7XG5pbXBvcnQgUmVjb3JkIGZyb20gJy4vcmVjb3JkJztcbmltcG9ydCBSZWNvcmRTdG9yZSwge1dhdGNoYWJsZVJlY29yZFN0b3JlS2V5c30gZnJvbSAnLi9yZWNvcmRfc3RvcmUnO1xuXG5leHBvcnQgY29uc3QgZ2V0TGlua2VkVGFibGVJZCA9IChmaWVsZDogRmllbGQpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBmaWVsZC5vcHRpb25zO1xuICAgIGNvbnN0IGxpbmtlZFRhYmxlSWQgPSBvcHRpb25zICYmIG9wdGlvbnMubGlua2VkVGFibGVJZDtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGxpbmtlZFRhYmxlSWQgPT09ICdzdHJpbmcnLCAnbGlua2VkVGFibGVJZCBtdXN0IGV4aXN0Jyk7XG5cbiAgICByZXR1cm4gbGlua2VkVGFibGVJZDtcbn07XG5cbi8qKiBpbnRlcm5hbCAqL1xuaW50ZXJmYWNlIExpbmtlZFJlY29yZHNRdWVyeVJlc3VsdERhdGEge31cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2V0IG9mIHJlY29yZHMgZnJvbSBhIExpbmtlZFJlY29yZCBjZWxsIHZhbHVlLiBTZWUge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fSBmb3IgbWFpblxuICogZG9jdW1lbnRhdGlvbi5cbiAqXG4gKiBEbyBub3QgaW5zdGFudGlhdGUuIFlvdSBjYW4gZ2V0IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGJ5IGNhbGxpbmdcbiAqIGByZWNvcmQuc2VsZWN0TGlua2VkUmVjb3Jkc0Zyb21DZWxsYC5cbiAqXG4gKiBAZG9jc1BhdGggbW9kZWxzL3F1ZXJ5IHJlc3VsdHMvTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0XG4gKi9cbmNsYXNzIExpbmtlZFJlY29yZHNRdWVyeVJlc3VsdCBleHRlbmRzIFJlY29yZFF1ZXJ5UmVzdWx0PExpbmtlZFJlY29yZHNRdWVyeVJlc3VsdERhdGE+IHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgc3RhdGljIF9jbGFzc05hbWUgPSAnTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0JztcblxuICAgIC8vIHRoZSByZWNvcmQgY29udGFpbmluZyB0aGUgbGlua2VkLXJlY29yZCBjZWxsIHRoaXMgaXMgYSBxdWVyeSBvZi5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlY29yZDogUmVjb3JkO1xuICAgIC8vIHRoZSBjZWxsJ3MgZmllbGQgaW4gdGhlIHJlY29yZFxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZmllbGQ6IEZpZWxkO1xuICAgIC8vIHRoZSB0YWJsZSB3ZSdyZSBsaW5raW5nIHRvXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9saW5rZWRUYWJsZTogVGFibGU7XG4gICAgLy8gdGhlIHJlY29yZHMgc3RvcmUgZm9yIHRoZSBvcmlnaW4gdGFibGVcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29yaWdpblJlY29yZFN0b3JlOiBSZWNvcmRTdG9yZTtcbiAgICAvLyB0aGUgcmVjb3JkcyBzdG9yZSBmb3IgdGhlIGxpbmtlZCB0YWJsZVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfbGlua2VkUmVjb3JkU3RvcmU6IFJlY29yZFN0b3JlO1xuICAgIC8vIGEgUmVjb3JkUXVlcnlSZXN1bHQgY29udGFpbmluZyBhbGwgdGhlIHJvd3MgaW4gdGhlIGxpbmtlZCB0YWJsZVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfbGlua2VkUXVlcnlSZXN1bHQ6IFRhYmxlT3JWaWV3UXVlcnlSZXN1bHQ7XG4gICAgLy8gaXMgdGhlIHF1ZXJ5IHJlc3VsdCBjdXJyZW50bHkgdmFsaWQuIGlmIHRoZSBmaWVsZCBjb25maWcgY2hhbmdlcyB0byBsaW5rXG4gICAgLy8gdG8gYW5vdGhlciB0YWJsZSBvciBub3QgYmUgYSBsaW5rZWQgcmVjb3JkIGZpZWxkIGF0IGFsbCwgaXNWYWxpZCB3aWxsXG4gICAgLy8gYmVjb21lIGZhbHNlLiBvbmNlIGEgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IGhhcyBiZWNvbWUgaW52YWxpZCwgaXQgd2lsbFxuICAgIC8vIG5vdCBiZWNvbWUgdmFsaWQgYWdhaW4uXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9pc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcbiAgICAvLyBhIGxhemlseS1nZW5lcmF0ZWQgc2V0IG9mIHRoZSByZWNvcmQgaWRzIGluIHRoZSByZXN1bHQgc2V0LlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfY29tcHV0ZWRSZWNvcmRJZHNTZXQ6IHtba2V5OiBzdHJpbmddOiB0cnVlIHwgdm9pZH0gfCBudWxsID0gbnVsbDtcbiAgICAvLyBhIGxhemlseS1nZW5lcmF0ZWQgYXJyYXkgb2YgdGhlIHJlY29yZCBpZHMgaW4gdGhlIHF1ZXJ5IHJlc3VsdC5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2NvbXB1dGVkRmlsdGVyZWRTb3J0ZWRSZWNvcmRJZHM6IEFycmF5PHN0cmluZz4gfCBudWxsID0gbnVsbDtcbiAgICAvLyBob3cgbWFueSB0aW1lcyBoYXMgZWFjaCAnY2VsbFZhbHVlc0luRmllbGQ6JEZpZWxkSWQnIGJlZW4gd2F0Y2hlZD9cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2NlbGxWYWx1ZUNoYW5nZUhhbmRsZXJCeUZpZWxkSWQ6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogKFxuICAgICAgICAgICAgYXJnMTogVGFibGVPclZpZXdRdWVyeVJlc3VsdCxcbiAgICAgICAgICAgIGtleTogc3RyaW5nLFxuICAgICAgICAgICAgcmVjb3JkSWRzOiBBcnJheTxSZWNvcmRJZD4gfCB2b2lkLFxuICAgICAgICApID0+IHZvaWQ7XG4gICAgfSA9IHt9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcmVjb3JkU3RvcmVRdWVyeUlkOiBCbG9ja1F1ZXJ5SWQgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcmVjb3JkOiBSZWNvcmQsXG4gICAgICAgIGZpZWxkOiBGaWVsZCxcbiAgICAgICAgbm9ybWFsaXplZE9wdHM6IE5vcm1hbGl6ZWRSZWNvcmRRdWVyeVJlc3VsdE9wdHMsXG4gICAgICAgIHNkazogU2RrLFxuICAgICkge1xuICAgICAgICBzdXBlcihzZGssIG5vcm1hbGl6ZWRPcHRzKTtcblxuICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICByZWNvcmQucGFyZW50VGFibGUgPT09IGZpZWxkLnBhcmVudFRhYmxlLFxuICAgICAgICAgICAgJ3JlY29yZCBhbmQgZmllbGQgbXVzdCBiZWxvbmcgdG8gdGhlIHNhbWUgdGFibGUnLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX3JlY29yZCA9IHJlY29yZDtcbiAgICAgICAgdGhpcy5fZmllbGQgPSBmaWVsZDtcbiAgICAgICAgdGhpcy5fbGlua2VkVGFibGUgPSBub3JtYWxpemVkT3B0cy50YWJsZTtcbiAgICAgICAgdGhpcy5fb3JpZ2luUmVjb3JkU3RvcmUgPSB0aGlzLl9zZGsuYmFzZS5fX2dldFJlY29yZFN0b3JlKHRoaXMuX3JlY29yZC5wYXJlbnRUYWJsZS5pZCk7XG4gICAgICAgIHRoaXMuX2xpbmtlZFJlY29yZFN0b3JlID0gbm9ybWFsaXplZE9wdHMucmVjb3JkU3RvcmU7XG5cbiAgICAgICAgLy8gd2UgY291bGQgcmVseSBvbiBSZWNvcmRRdWVyeVJlc3VsdCdzIHJldXNlIHBvb2wgdG8gbWFrZSBzdXJlIHdlIGdldCBiYWNrXG4gICAgICAgIC8vIHRoZSBzYW1lIFJlY29yZFF1ZXJ5UmVzdWx0IGV2ZXJ5IHRpbWUsIGJ1dCB0aGF0IHdvdWxkIG1ha2UgaXQgbXVjaCBoYXJkZXJcbiAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHdlIHVud2F0Y2ggZXZlcnl0aGluZyBmcm9tIHRoZSBvbGQgUmVjb3JkUXVlcnlSZXN1bHQgaWYgZS5nLlxuICAgICAgICAvLyB0aGUgZmllbGQgY29uZmlnIGNoYW5nZXMgdG8gcG9pbnQgYXQgYSBkaWZmZXJlbnQgdGFibGVcbiAgICAgICAgdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQgPSB0aGlzLl9saW5rZWRUYWJsZS5fX3RhYmxlT3JWaWV3UXVlcnlSZXN1bHRQb29sLmdldE9iamVjdEZvclJldXNlKFxuICAgICAgICAgICAgdGhpcy5fc2RrLFxuICAgICAgICAgICAgdGhpcy5fbGlua2VkVGFibGUsXG4gICAgICAgICAgICBub3JtYWxpemVkT3B0cyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgcXVlcnkgcmVzdWx0IGN1cnJlbnRseSB2YWxpZD8gVGhpcyB2YWx1ZSBhbHdheXMgc3RhcnRzIGFzICd0cnVlJyxcbiAgICAgKiBidXQgY2FuIGJlY29tZSBmYWxzZSBpZiB0aGUgcmVjb3JkIGZyb20gd2hpY2ggdGhpcyByZXN1bHQgd2FzIGNyZWF0ZWQgaXNcbiAgICAgKiBkZWxldGVkLCBpZiB0aGUgZmllbGQgaXMgZGVsZXRlZCwgaWYgdGhlIGZpZWxkIGNvbmZpZyBjaGFuZ2VzIHRvIGxpbmsgdG9cbiAgICAgKiBhIGRpZmZlcmVudCB0YWJsZSwgb3IgaWYgdGhlIGZpZWxkIGNvbmZpZyBjaGFuZ2VzIHRvIGxpbmsgdG8gYSB0eXBlXG4gICAgICogb3RoZXIgdGhhbiBNVUxUSVBMRV9SRUNPUkRfTElOS1MuIE9uY2UgYGlzVmFsaWRgIGhhcyBiZWNvbWUgZmFsc2UsIGl0XG4gICAgICogd2lsbCBuZXZlciBiZWNvbWUgdHJ1ZSBhZ2Fpbi4gTWFueSBmaWVsZHMgd2lsbCB0aHJvdyBvbiBhdHRlbXB0aW5nIHRvXG4gICAgICogYWNjZXNzIHRoZW0sIGFuZCB3YXRjaGVzIHdpbGwgbm8gbG9uZ2VyIGZpcmUuXG4gICAgICovXG4gICAgZ2V0IGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0YWJsZSB0aGF0IHJlY29yZHMgaW4gdGhpcyBSZWNvcmRRdWVyeVJlc3VsdCBhcmUgcGFydCBvZlxuICAgICAqXG4gICAgICogQGludGVybmFsIChzaW5jZSB3ZSBtYXkgbm90IGJlIGFibGUgdG8gcmV0dXJuIHBhcmVudCBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIGltbXV0YWJsZSBtb2RlbHMgd29ybGQpXG4gICAgICovXG4gICAgZ2V0IHBhcmVudFRhYmxlKCk6IFRhYmxlIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNWYWxpZCwgJ0xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdCBpcyBubyBsb25nZXIgdmFsaWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmtlZFRhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9yZGVyZWQgYXJyYXkgb2YgYWxsIHRoZSBsaW5rZWQgcmVjb3JkIGlkcy4gV2F0Y2hhYmxlLlxuICAgICAqL1xuICAgIGdldCByZWNvcmRJZHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzVmFsaWQsICdMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHQgaXMgbm8gbG9uZ2VyIHZhbGlkJyk7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzRGF0YUxvYWRlZCwgJ0xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdCBkYXRhIGlzIG5vdCBsb2FkZWQnKTtcblxuICAgICAgICAvLyByZWNvcmQgaWRzIGFyZSBsYXppbHkgZ2VuZXJhdGVkXG4gICAgICAgIHRoaXMuX2dlbmVyYXRlQ29tcHV0ZWREYXRhSWZOZWVkZWQoKTtcblxuICAgICAgICBpbnZhcmlhbnQodGhpcy5fY29tcHV0ZWRGaWx0ZXJlZFNvcnRlZFJlY29yZElkcywgJ25vIHJlY29yZElkcycpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcHV0ZWRGaWx0ZXJlZFNvcnRlZFJlY29yZElkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcmRlcmVkIGFycmF5IG9mIGFsbCB0aGUgbGlua2VkIHJlY29yZHMuIFdhdGNoYWJsZS5cbiAgICAgKi9cbiAgICBnZXQgcmVjb3JkcygpOiBBcnJheTxSZWNvcmQ+IHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNWYWxpZCwgJ0xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdCBpcyBubyBsb25nZXIgdmFsaWQnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRJZHMubWFwKHJlY29yZElkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuX2xpbmtlZFJlY29yZFN0b3JlLmdldFJlY29yZEJ5SWRJZkV4aXN0cyhyZWNvcmRJZCk7XG4gICAgICAgICAgICBpbnZhcmlhbnQocmVjb3JkLCAnTm8gcmVjb3JkIGZvciBpZDogJXMnLCByZWNvcmRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGRzIHRoYXQgd2VyZSB1c2VkIHRvIGNyZWF0ZSB0aGlzIExpbmtlZFJlY29yZHNRdWVyeVJlc3VsdC5cbiAgICAgKi9cbiAgICBnZXQgZmllbGRzKCk6IEFycmF5PEZpZWxkPiB8IG51bGwge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IGlzIG5vIGxvbmdlciB2YWxpZCcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9saW5rZWRRdWVyeVJlc3VsdC5maWVsZHM7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgd2F0Y2goXG4gICAgICAgIGtleXM6IFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5IHwgUmVhZG9ubHlBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4sXG4gICAgICAgIGNhbGxiYWNrOiBGbG93QW55RnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ/OiBGbG93QW55T2JqZWN0IHwgbnVsbCxcbiAgICApOiBBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4ge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnY2Fubm90IHdhdGNoIGFuIGludmFsaWQgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0Jyk7XG5cbiAgICAgICAgY29uc3QgdmFsaWRLZXlzID0gc3VwZXIud2F0Y2goa2V5cywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUtleXMuY2VsbFZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSWZOZWVkZWRBZnRlcldhdGNoKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVDZWxsVmFsdWVzSW5GaWVsZEtleVByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZElkID0ga2V5LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgUmVjb3JkUXVlcnlSZXN1bHQuV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXgubGVuZ3RoLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXNJbkZpZWxkSWZOZWVkZWRBZnRlcldhdGNoKGZpZWxkSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZEtleXM7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgdW53YXRjaChcbiAgICAgICAga2V5czogV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXkgfCBSZWFkb25seUFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PixcbiAgICAgICAgY2FsbGJhY2s6IEZsb3dBbnlGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IEZsb3dBbnlPYmplY3QgfCBudWxsLFxuICAgICk6IEFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PiB7XG4gICAgICAgIGNvbnN0IGFycmF5S2V5cyA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgUmVhZG9ubHlBcnJheTxcbiAgICAgICAgICAgIFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5XG4gICAgICAgID47XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgYXJyYXlLZXlzKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVLZXlzLmNlbGxWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSWZQb3NzaWJsZUJlZm9yZVVud2F0Y2goKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkSWQgPSBrZXkuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVDZWxsVmFsdWVzSW5GaWVsZEtleVByZWZpeC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZElmUG9zc2libGVCZWZvcmVVbndhdGNoKGZpZWxkSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLnVud2F0Y2goYXJyYXlLZXlzLCBjYWxsYmFjaywgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgYXN5bmMgbG9hZERhdGFBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgc3VwZXIubG9hZERhdGFBc3luYygpO1xuXG4gICAgICAgIC8vIFRoaXMgY29uZGl0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmlzdGljYWxseSByZXByb2R1Y2VkIGluIHRoZSB0ZXN0aW5nXG4gICAgICAgIC8vIGVudmlyb25tZW50LlxuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0YUxvYWRlZCkge1xuICAgICAgICAgICAgLy8gZGF0YSBzdGlsbCBtaWdodCBub3QgYmUgbG9hZGVkIGFmdGVyIHRoZSBwcm9taXNlIHJlc29sdmVzIGlmIHRoZVxuICAgICAgICAgICAgLy8gbGlua2VkIHRhYmxlIGNoYW5nZWQuIGluIHRoYXQgY2FzZSwgY2FsbCBhZ2FpbjpcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZERhdGFBc3luYygpO1xuICAgICAgICAgICAgLy8gdGhlcmUgaGFzIHRvIGJlIGFuIHVubG9hZERhdGEgY2FsbCBmb3IgZXZlcnkgbG9hZERhdGFBc3luYyBjYWxsLlxuICAgICAgICAgICAgLy8gY2FsbCBpdCBoZXJlIHRvIG9mZnNldCBjYWxsaW5nIGxvYWREYXRhQXN5bmMgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgdGhpcy51bmxvYWREYXRhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgYXN5bmMgX2xvYWREYXRhQXN5bmMoKTogUHJvbWlzZTxBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4+IHtcbiAgICAgICAgdGhpcy5fcmVjb3JkLl9fbGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0UG9vbC5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nKHRoaXMpO1xuICAgICAgICB0aGlzLl93YXRjaE9yaWdpbigpO1xuICAgICAgICB0aGlzLl93YXRjaExpbmtlZFF1ZXJ5UmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxseUxvYWRlZCA9IHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LmlzRGF0YUxvYWRlZDtcblxuICAgICAgICAvLyBodHRwczovL2FpcnRhYmxlLmNvbS9hcHBhaHVKUXc3cWZRVEJCVS90YmxTYnBpbU04U3BwOXR4cC92aXdlQUZJdXMzTWhVOUd4YS9yZWNOakZZSnBlVjIzTFBoSD9ibG9ja3M9aGlkZVxuICAgICAgICAvLyBUT0RPOiAoI3Byb2otYmxvY2tzLXNkay1yZWNvcmQtbGltaXRzKSBDdXJyZW50bHkgcXVlcmllcyBhbGwgY2VsbCB2YWx1ZXMgaW4gYSB0YWJsZVxuICAgICAgICAvLyB3aGVuIGxvYWRpbmcgbGlua2VkIHJlY29yZCBkYXRhLiBNdXN0IGFkZCBhIExpbmtlZFJlY29yZCBxdWVyeSB0eXBlIGluIHRoZSBmdXR1cmUuXG4gICAgICAgIC8vIFNpbmNlIF9sb2FkRGF0YUFzeW5jIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLCB0aGlzIHJlY29yZFN0b3JlUXVlcnlJZCBpcyBvbmx5IHNldCBvbmNlLFxuICAgICAgICAvLyBhbHRob3VnaCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSBpZiBuZWVkZWQgKHNvIGxvbmcgYXMgdGhpcy5fZmllbGQuaWQgaXMgc3RhYmxlKVxuICAgICAgICBjb25zdCBbcmVjb3JkU3RvcmVRdWVyeUlkXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuX3Nkay5iYXNlXG4gICAgICAgICAgICAgICAgLl9fZ2V0UmVjb3JkU3RvcmUodGhpcy5fcmVjb3JkLnBhcmVudFRhYmxlLmlkKVxuICAgICAgICAgICAgICAgIC5sb2FkQWxsQ2VsbFZhbHVlc0luRmllbGRJZHNBc3luYyhbdGhpcy5fZmllbGQuaWRdKSxcbiAgICAgICAgICAgIHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LmxvYWREYXRhQXN5bmMoKSxcbiAgICAgICAgICAgIHRoaXMuX2xvYWRSZWNvcmRDb2xvcnNBc3luYygpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5fcmVjb3JkU3RvcmVRdWVyeUlkID0gcmVjb3JkU3RvcmVRdWVyeUlkO1xuXG4gICAgICAgIHRoaXMuX2ludmFsaWRhdGVDb21wdXRlZERhdGEoKTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VkS2V5cyA9IFsncmVjb3JkcycsICdyZWNvcmRJZHMnLCAncmVjb3JkQ29sb3JzJ107XG5cbiAgICAgICAgLy8gSWYgdGhlIGxpbmtlZCBxdWVyeSByZXN1bHQgd2FzIG5vdCBpbml0aWFsbHkgbG9hZGVkLCB0aGVuIHRoZVxuICAgICAgICAvLyBgY2VsbFZhbHVlc2AgZXZlbnQgd2lsbCBiZSBlbWl0dGVkIHZpYSBgX29uTGlua2VkQ2VsbFZhbHVlc0NoYW5nZWAuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgaXQgbXVzdCBiZSBleHBsaWNpdGx5IGluY2x1ZGVkIGhlcmUgaW4gb3JkZXIgdG8gcHJvbW90ZVxuICAgICAgICAvLyBjb25zaXN0ZW5jeS5cbiAgICAgICAgaWYgKGluaXRpYWxseUxvYWRlZCkge1xuICAgICAgICAgICAgY2hhbmdlZEtleXMucHVzaCgnY2VsbFZhbHVlcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRJZHMgPVxuICAgICAgICAgICAgdGhpcy5fbm9ybWFsaXplZE9wdHMuZmllbGRJZHNPck51bGxJZkFsbEZpZWxkcyB8fFxuICAgICAgICAgICAgdGhpcy5wYXJlbnRUYWJsZS5maWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLmlkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkSWQgb2YgZmllbGRJZHMpIHtcbiAgICAgICAgICAgIGNoYW5nZWRLZXlzLnB1c2goUmVjb3JkUXVlcnlSZXN1bHQuV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXggKyBmaWVsZElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGFuZ2VkS2V5cztcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3VubG9hZERhdGEoKSB7XG4gICAgICAgIC8vIFRoZSBpbnZlcnNlIG9mIHRoaXMgY29uZGl0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmlzdGljYWxseSByZXByb2R1Y2VkXG4gICAgICAgIC8vIGluIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50LlxuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvcmQuX19saW5rZWRSZWNvcmRzUXVlcnlSZXN1bHRQb29sLnVucmVnaXN0ZXJPYmplY3RGb3JSZXVzZVN0cm9uZyh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3Vud2F0Y2hPcmlnaW4oKTtcbiAgICAgICAgICAgIHRoaXMuX3Vud2F0Y2hMaW5rZWRRdWVyeVJlc3VsdCgpO1xuXG4gICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVjb3JkU3RvcmVRdWVyeUlkLFxuICAgICAgICAgICAgICAgICdVbnN1YnNjcmliaW5nIGZyb20gbGlua2VkIHJlY29yZCByZWNvcmQgc3RvcmUgd2l0aG91dCBxdWVyeUlkJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5SZWNvcmRTdG9yZS51bmxvYWRDZWxsVmFsdWVzRm9yUXVlcnlJZHNUaGF0QXJlU3Vic2NyaWJlZFRvQWxsQ2VsbHMoW1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZFN0b3JlUXVlcnlJZCxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQudW5sb2FkRGF0YSgpO1xuICAgICAgICAgICAgdGhpcy5fdW5sb2FkUmVjb3JkQ29sb3JzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVDb21wdXRlZERhdGEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoZSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGlzIHF1ZXJ5IHJlc3VsdCBpbiBPYmplY3RQb29sXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IF9fcG9vbEtleSgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcmlhbGl6ZWRPcHRzfTo6JHt0aGlzLl9maWVsZC5pZH06OiR7dGhpcy5fbGlua2VkVGFibGUuaWR9Ojoke3RoaXMuaXNWYWxpZH1gO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgX2NlbGxWYWx1ZXNXYXRjaENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAodGhpcy5fY2hhbmdlV2F0Y2hlcnNCeUtleVtSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVLZXlzLmNlbGxWYWx1ZXNdIHx8IFtdKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF93YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlc0lmTmVlZGVkQWZ0ZXJXYXRjaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxWYWx1ZXNXYXRjaENvdW50ID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl93YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSWZQb3NzaWJsZUJlZm9yZVVud2F0Y2goKSB7XG4gICAgICAgIGlmICh0aGlzLl9jZWxsVmFsdWVzV2F0Y2hDb3VudCA9PT0gMSAmJiB0aGlzLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Vud2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgX2NlbGxWYWx1ZVdhdGNoQ291bnRCeUZpZWxkSWQoKTogUmVhZG9ubHk8e1trZXk6IHN0cmluZ106IG51bWJlcn0+IHtcbiAgICAgICAgY29uc3QgY291bnRCeUZpZWxkSWQ6IE9iamVjdE1hcDxGaWVsZElkLCBudW1iZXI+ID0ge307XG4gICAgICAgIGNvbnN0IHdhdGNoS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2NoYW5nZVdhdGNoZXJzQnlLZXkpLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGtleS5zdGFydHNXaXRoKFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3Qgd2F0Y2hLZXkgb2Ygd2F0Y2hLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZElkID0gd2F0Y2hLZXkuc2xpY2UoXG4gICAgICAgICAgICAgICAgUmVjb3JkUXVlcnlSZXN1bHQuV2F0Y2hhYmxlQ2VsbFZhbHVlc0luRmllbGRLZXlQcmVmaXgubGVuZ3RoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvdW50QnlGaWVsZElkW2ZpZWxkSWRdID0gdGhpcy5fY2hhbmdlV2F0Y2hlcnNCeUtleVt3YXRjaEtleV0ubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdW50QnlGaWVsZElkO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXNJbkZpZWxkSWZOZWVkZWRBZnRlcldhdGNoKGZpZWxkSWQ6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5fY2VsbFZhbHVlV2F0Y2hDb3VudEJ5RmllbGRJZFtmaWVsZElkXSA9PT0gMSAmJiB0aGlzLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZChmaWVsZElkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfdW53YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlc0luRmllbGRJZlBvc3NpYmxlQmVmb3JlVW53YXRjaChmaWVsZElkOiBzdHJpbmcpIHtcbiAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgdGhpcy5fY2VsbFZhbHVlV2F0Y2hDb3VudEJ5RmllbGRJZFtmaWVsZElkXSxcbiAgICAgICAgICAgIFwiY2VsbFZhbHVlc0luRmllbGQ6JXMgb3Zlci1mcmVlJ2RcIixcbiAgICAgICAgICAgIGZpZWxkSWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NlbGxWYWx1ZVdhdGNoQ291bnRCeUZpZWxkSWRbZmllbGRJZF0gPT09IDEgJiYgdGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZChmaWVsZElkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfd2F0Y2hPcmlnaW4oKSB7XG4gICAgICAgIC8vIGlmIHRoZSBjZWxsIHZhbHVlcyBpbiB0aGUgcmVjb3JkIGNoYW5nZSwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIG91clxuICAgICAgICAvLyBjYWNoZWQgZGF0YSBhbmQgbm90aWZ5IHdhdGNoZXJzXG4gICAgICAgIHRoaXMuX3JlY29yZC53YXRjaChcbiAgICAgICAgICAgIGBjZWxsVmFsdWVJbkZpZWxkOiR7dGhpcy5fZmllbGQuaWR9YCxcbiAgICAgICAgICAgIHRoaXMuX29uT3JpZ2luQ2VsbFZhbHVlQ2hhbmdlLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGNvbmZpZyBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgY2FjaGVkIGRhdGEsXG4gICAgICAgIC8vIGFuZCBwb3RlbnRpYWxseSBzdGFydCB3YXRjaGluZyBhIGRpZmZlcmVudCB0YWJsZVxuICAgICAgICB0aGlzLl9maWVsZC53YXRjaCgndHlwZScsIHRoaXMuX29uT3JpZ2luRmllbGRDb25maWdDaGFuZ2UsIHRoaXMpO1xuICAgICAgICB0aGlzLl9maWVsZC53YXRjaCgnb3B0aW9ucycsIHRoaXMuX29uT3JpZ2luRmllbGRDb25maWdDaGFuZ2UsIHRoaXMpO1xuICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyByZWNvcmQgaXMgZGVsZXRlZCwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoaXNcbiAgICAgICAgLy8gcmVzdWx0XG4gICAgICAgIHRoaXMuX29yaWdpblJlY29yZFN0b3JlLndhdGNoV2l0aFJlY29yZFF1ZXJ5UmVzdWx0KHtcbiAgICAgICAgICAgIHJlY29yZFF1ZXJ5UmVzdWx0OiB0aGlzLFxuICAgICAgICAgICAga2V5czogV2F0Y2hhYmxlUmVjb3JkU3RvcmVLZXlzLnJlY29yZElkcyxcbiAgICAgICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uOiB0aGlzLl9vbk9yaWdpblJlY29yZHNDaGFuZ2UsXG4gICAgICAgICAgICBjb250ZXh0OiB0aGlzLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgdGhlIGxpbmtlZCBmaWVsZCBpbiB0aGUgb3JpZ2luIHRhYmxlIGlzIGRlbGV0ZWQsIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGlzIHJlc3VsdFxuICAgICAgICB0aGlzLl9yZWNvcmQucGFyZW50VGFibGUud2F0Y2goJ2ZpZWxkcycsIHRoaXMuX29uT3JpZ2luRmllbGRzQ2hhbmdlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3Vud2F0Y2hPcmlnaW4oKSB7XG4gICAgICAgIHRoaXMuX3JlY29yZC51bndhdGNoKFxuICAgICAgICAgICAgYGNlbGxWYWx1ZUluRmllbGQ6JHt0aGlzLl9maWVsZC5pZH1gLFxuICAgICAgICAgICAgdGhpcy5fb25PcmlnaW5DZWxsVmFsdWVDaGFuZ2UsXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9maWVsZC51bndhdGNoKCd0eXBlJywgdGhpcy5fb25PcmlnaW5GaWVsZENvbmZpZ0NoYW5nZSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX2ZpZWxkLnVud2F0Y2goJ29wdGlvbnMnLCB0aGlzLl9vbk9yaWdpbkZpZWxkQ29uZmlnQ2hhbmdlLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fb3JpZ2luUmVjb3JkU3RvcmUudW53YXRjaCgncmVjb3JkSWRzJywgdGhpcy5fb25PcmlnaW5SZWNvcmRzQ2hhbmdlLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fcmVjb3JkLnBhcmVudFRhYmxlLnVud2F0Y2goJ2ZpZWxkcycsIHRoaXMuX29uT3JpZ2luRmllbGRzQ2hhbmdlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3dhdGNoTGlua2VkUXVlcnlSZXN1bHQoKSB7XG4gICAgICAgIC8vIGluIHRoZSBsaW5rZWQgdGFibGUsIGFsbCB3ZSBjYXJlIGFib3V0IGlzIHRoZSBzZXQgb2YgcmVjb3JkSWRzLlxuICAgICAgICAvLyB0aGlzIHdhdGNoIGZpcmUgd2hlbiB0aGV5J3JlIGFkZGVkL3JlbW92ZWQgYW5kIHdoZW4gdGhleSBjaGFuZ2VcbiAgICAgICAgLy8gb3JkZXIuIHdlIG9ubHkgY2FyZSBhYm91dCBvcmRlciwgYmVjYXVzZSBhZGQvcmVtb3ZlIGlzIGhhbmRsZWQgYnlcbiAgICAgICAgLy8gd2F0Y2hpbmcgdGhlIG9yaWdpbiByZWNvcmRcbiAgICAgICAgdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQud2F0Y2goJ3JlY29yZElkcycsIHRoaXMuX29uTGlua2VkUmVjb3JkSWRzQ2hhbmdlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3Vud2F0Y2hMaW5rZWRRdWVyeVJlc3VsdCgpIHtcbiAgICAgICAgdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQudW53YXRjaCgncmVjb3JkSWRzJywgdGhpcy5fb25MaW5rZWRSZWNvcmRJZHNDaGFuZ2UsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXMoKSB7XG4gICAgICAgIHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LndhdGNoKCdjZWxsVmFsdWVzJywgdGhpcy5fb25MaW5rZWRDZWxsVmFsdWVzQ2hhbmdlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3Vud2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXMoKSB7XG4gICAgICAgIHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LnVud2F0Y2goJ2NlbGxWYWx1ZXMnLCB0aGlzLl9vbkxpbmtlZENlbGxWYWx1ZXNDaGFuZ2UsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfd2F0Y2hMaW5rZWRRdWVyeUNlbGxWYWx1ZXNJbkZpZWxkKGZpZWxkSWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9saW5rZWRRdWVyeVJlc3VsdC53YXRjaChcbiAgICAgICAgICAgIFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4ICsgZmllbGRJZCxcbiAgICAgICAgICAgIHRoaXMuX2dldE9uTGlua2VkQ2VsbFZhbHVlc0luRmllbGRDaGFuZ2UoZmllbGRJZCksXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfdW53YXRjaExpbmtlZFF1ZXJ5Q2VsbFZhbHVlc0luRmllbGQoZmllbGRJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xpbmtlZFF1ZXJ5UmVzdWx0LnVud2F0Y2goXG4gICAgICAgICAgICBSZWNvcmRRdWVyeVJlc3VsdC5XYXRjaGFibGVDZWxsVmFsdWVzSW5GaWVsZEtleVByZWZpeCArIGZpZWxkSWQsXG4gICAgICAgICAgICB0aGlzLl9nZXRPbkxpbmtlZENlbGxWYWx1ZXNJbkZpZWxkQ2hhbmdlKGZpZWxkSWQpLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29uTGlua2VkUmVjb3JkSWRzQ2hhbmdlKCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnd2F0Y2gga2V5IGNoYW5nZSBldmVudCB3aGlsc3QgaW52YWxpZCcpO1xuICAgICAgICBpZiAoIXRoaXMuaXNEYXRhTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbnZhbGlkYXRlQ29tcHV0ZWREYXRhKCk7XG5cbiAgICAgICAgLy8gd2UgZG9uJ3QgYWN0dWFsbHkga25vdyBhdCB0aGlzIHN0YWdlIHdoZXRoZXIgYW55dGhpbmcgY2hhbmdlZCBvclxuICAgICAgICAvLyBub3QuIGl0IG1heSBoYXZlIGRvbmUgdGhvdWdoLCBzbyBub3RpZnkgd2F0Y2hlcnNcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZHMnKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZElkcycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbW9kZWwgZG9lc24ndCB1c2UgdGhlIGBfZGF0YWAgY29tcHV0ZWQgcHJvcGVydHkgaXQgaW5oZXJpdHMgZnJvbVxuICAgICAqIEFic3RyYWN0TW9kZWwuIEl0IGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBtZXRob2Qgb25seSBzbyB0aGF0IGludGVybmFsXG4gICAgICogY2hlY2tzIGZvciBtb2RlbCBkZWxldGlvbiBiZWhhdmUgYXBwcm9wcmlhdGVseSAodGhlIGRhdGEgaXRzZWxmIGlzXG4gICAgICogaW5jb25zZXF1ZW50aWFsKS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBfZGF0YU9yTnVsbElmRGVsZXRlZCgpOiBMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHREYXRhIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvcmQuaXNEZWxldGVkIHx8IHRoaXMuX2xpbmtlZFJlY29yZFN0b3JlLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbkxpbmtlZENlbGxWYWx1ZXNDaGFuZ2UoXG4gICAgICAgIHF1ZXJ5UmVzdWx0OiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0LFxuICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgY2hhbmdlcz86IHtmaWVsZElkcz86IEFycmF5PEZpZWxkSWQ+OyByZWNvcmRJZHM/OiBBcnJheTxSZWNvcmRJZD59LFxuICAgICkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnd2F0Y2gga2V5IGNoYW5nZSBldmVudCB3aGlsc3QgaW52YWxpZCcpO1xuXG4gICAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMuZmllbGRJZHMgJiYgY2hhbmdlcy5yZWNvcmRJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZElkc1NldCA9IHRoaXMuX2dldE9yR2VuZXJhdGVSZWNvcmRJZHNTZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZElkcyA9IGNoYW5nZXMucmVjb3JkSWRzLmZpbHRlcihpZCA9PiByZWNvcmRJZHNTZXRbaWRdID09PSB0cnVlKTtcbiAgICAgICAgICAgIGlmIChyZWNvcmRJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ2NlbGxWYWx1ZXMnLCB7ZmllbGRJZHM6IGNoYW5nZXMuZmllbGRJZHMsIHJlY29yZElkc30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ2NlbGxWYWx1ZXMnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZ2V0T25MaW5rZWRDZWxsVmFsdWVzSW5GaWVsZENoYW5nZShcbiAgICAgICAgZmllbGRJZDogc3RyaW5nLFxuICAgICk6IChhcmcxOiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0LCBrZXk6IHN0cmluZywgcmVjb3JkSWRzOiBBcnJheTxSZWNvcmRJZD4gfCB2b2lkKSA9PiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jZWxsVmFsdWVDaGFuZ2VIYW5kbGVyQnlGaWVsZElkW2ZpZWxkSWRdKSB7XG4gICAgICAgICAgICB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VIYW5kbGVyQnlGaWVsZElkW2ZpZWxkSWRdID0gKFxuICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0OiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0LFxuICAgICAgICAgICAgICAgIGtleTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJlY29yZElkczogQXJyYXk8UmVjb3JkSWQ+IHwgdm9pZCxcbiAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgIGludmFyaWFudCh0aGlzLmlzVmFsaWQsICd3YXRjaCBrZXkgY2hhbmdlIGV2ZW50IHdoaWxzdCBpbnZhbGlkJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgbGlua2VkIHJlY29yZCBtYXkgZmluaXNoIGxvYWRpbmcgYmVmb3JlIGl0cyBwYXJlbnQuIEluXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBjYXNlLCB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzIHdpbGwgYmUgdHJpZ2dlcmVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgIC8vIGBfbG9hZERhdGFBc3luY2AgbWV0aG9kLlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0RhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRoZSBgZWxzZWAgYnJhbmNoIHdpbGwgb25seSBiZSByZWFjaGVkIHdoZW4gdGhlIHVuZGVybHlpbmdcbiAgICAgICAgICAgICAgICAvLyBgUmVjb3JkT3JWaWV3UXVlcnlSZXN1bHRgIGlzIGxvYWRlZCwgdW5sb2FkZWQsIGFuZCB0aGVuXG4gICAgICAgICAgICAgICAgLy8gbG9hZGVkIGFnYWluLiBCZWNhdXNlIHRoYXQgcXVlcnkgcmVzdWx0IGlzIG5vdCBkaXJlY3RseVxuICAgICAgICAgICAgICAgIC8vIGV4cG9zZWQgdG8gY29uc3VtZXJzLCB0aGUgY29uZGl0aW9uIGNhbiBvbmx5IGJlIG1ldCB3aGVuIHRoZVxuICAgICAgICAgICAgICAgIC8vIFNESyBpcyBtaXN1c2VkIChlLmcuIHJlcGVhdGVkbHkgZnJlZWluZyByZWxhdGVkIHF1ZXJ5XG4gICAgICAgICAgICAgICAgLy8gcmVzdWx0cykuIFRoZSBgZWxzZWAgYnJhbmNoIGF0dGVtcHRzIHRvIGhhbmRsZSB0aGF0XG4gICAgICAgICAgICAgICAgLy8gc2l0dWF0aW9uIGluIGEgbG9naWNhbCB3YXksIGJ1dCBpdCBpcyBub3QgdGVzdGVkIGJlY2F1c2UgaXRcbiAgICAgICAgICAgICAgICAvLyBpcyBmdW5kYW1lbnRhbGx5IGludmFsaWQuXG4gICAgICAgICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWNvcmRJZHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZElkc1NldCA9IHRoaXMuX2dldE9yR2VuZXJhdGVSZWNvcmRJZHNTZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRSZWNvcmRJZHMgPSByZWNvcmRJZHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiByZWNvcmRJZHNTZXRbaWRdID09PSB0cnVlLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIGEgZmlsdGVyZWRSZWNvcmRJZHMgZm91bmQgZm9yIHRoaXMgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSAtIG5vdCBmaW5kaW5nIGFueSBpcyBhIGZ1bmRhbWVudGFsIG1pc3Rha2UgaW4gb3VyIHF1ZXJ5IGVuZ2luZVxuICAgICAgICAgICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFJlY29yZElkcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAnRmlsdGVyZWQgcmVjb3JkIGNoYW5nZSBvbiBpbmNvcnJlY3QgcmVjb3JkLCBxdWVyeSBlbmdpbmUgaXNzdWUnLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4ICsgZmllbGRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkUmVjb3JkSWRzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKFJlY29yZFF1ZXJ5UmVzdWx0LldhdGNoYWJsZUNlbGxWYWx1ZXNJbkZpZWxkS2V5UHJlZml4ICsgZmllbGRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VIYW5kbGVyQnlGaWVsZElkW2ZpZWxkSWRdO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb25PcmlnaW5DZWxsVmFsdWVDaGFuZ2UoKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzVmFsaWQsICd3YXRjaCBrZXkgY2hhbmdlIGV2ZW50IHdoaWxzdCBpbnZhbGlkJyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0YUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdoZW4gdGhlIG9yaWdpbiBjZWxsIHZhbHVlIChsaXN0aW5nIGFsbCB0aGUgbGlua2VkIHJlY29yZHMpIGNoYW5nZXMsXG4gICAgICAgIC8vIGludmFsaWRhdGUgYWxsIHRoZSBkYXRhIHdlIGhhdmUgc3RvcmVkIC0gd2UgbmVlZCB0byBjb21wbGV0ZWx5XG4gICAgICAgIC8vIHJlZ2VuZXJhdGUgaXRcbiAgICAgICAgdGhpcy5faW52YWxpZGF0ZUNvbXB1dGVkRGF0YSgpO1xuXG4gICAgICAgIC8vIG5vdGlmeSB3YXRjaGVycyB0aGF0IG91ciBzZXQgb2YgbGlua2VkIHJlY29yZHMgaGFzIGNoYW5nZWRcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZHMnKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZElkcycpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb25PcmlnaW5SZWNvcmRzQ2hhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5fcmVjb3JkLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbk9yaWdpbkZpZWxkc0NoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbk9yaWdpbkZpZWxkQ29uZmlnQ2hhbmdlKCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1ZhbGlkLCAnd2F0Y2gga2V5IGNoYW5nZSBldmVudCB3aGlsc3QgaW52YWxpZCcpO1xuXG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLl9maWVsZC50eXBlO1xuXG4gICAgICAgIGlmICh0eXBlICE9PSBGaWVsZFR5cGUuTVVMVElQTEVfUkVDT1JEX0xJTktTKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUXVlcnlSZXN1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmtlZFRhYmxlSWQgPSBnZXRMaW5rZWRUYWJsZUlkKHRoaXMuX2ZpZWxkKTtcbiAgICAgICAgaWYgKGxpbmtlZFRhYmxlSWQgIT09IHRoaXMuX2xpbmtlZFRhYmxlLmlkKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUXVlcnlSZXN1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaW52YWxpZGF0ZVF1ZXJ5UmVzdWx0KCkge1xuICAgICAgICBpZiAodGhpcy5pc0RhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VubG9hZERhdGEoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2VsbFZhbHVlc1dhdGNoQ291bnQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmaWVsZElkIG9mIE9iamVjdC5rZXlzKHRoaXMuX2NlbGxWYWx1ZVdhdGNoQ291bnRCeUZpZWxkSWQpKSB7XG4gICAgICAgICAgICB0aGlzLl91bndhdGNoTGlua2VkUXVlcnlDZWxsVmFsdWVzSW5GaWVsZChmaWVsZElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZHMnKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoJ3JlY29yZElkcycpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaW52YWxpZGF0ZUNvbXB1dGVkRGF0YSgpIHtcbiAgICAgICAgdGhpcy5fY29tcHV0ZWRSZWNvcmRJZHNTZXQgPSBudWxsO1xuICAgICAgICB0aGlzLl9jb21wdXRlZEZpbHRlcmVkU29ydGVkUmVjb3JkSWRzID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2dlbmVyYXRlQ29tcHV0ZWREYXRhSWZOZWVkZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29tcHV0ZWRSZWNvcmRJZHNTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlbmVyYXRlQ29tcHV0ZWREYXRhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2dlbmVyYXRlQ29tcHV0ZWREYXRhKCkge1xuICAgICAgICBjb25zdCByZWNvcmRJZHNTZXQ6IE9iamVjdE1hcDxSZWNvcmRJZCwgdHJ1ZT4gPSB7fTtcbiAgICAgICAgY29uc3QgcmF3Q2VsbFZhbHVlID0gdGhpcy5fcmVjb3JkLmdldENlbGxWYWx1ZSh0aGlzLl9maWVsZCk7XG4gICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJhd0NlbGxWYWx1ZSA9PT0gbnVsbCA/IFtdIDogcmF3Q2VsbFZhbHVlO1xuICAgICAgICBpbnZhcmlhbnQoQXJyYXkuaXNBcnJheShjZWxsVmFsdWUpLCAnY2VsbFZhbHVlIHNob3VsZCBiZSBhcnJheScpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGlua2VkUmVjb3JkIG9mIGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgICAgIGxpbmtlZFJlY29yZCAmJiB0eXBlb2YgbGlua2VkUmVjb3JkID09PSAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgICAnbGlua2VkIHJlY29yZCBzaG91bGQgYmUgb2JqZWN0JyxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlY29yZElkID0gbGlua2VkUmVjb3JkLmlkO1xuICAgICAgICAgICAgaW52YXJpYW50KHR5cGVvZiByZWNvcmRJZCA9PT0gJ3N0cmluZycsICdpZCBzaG91bGQgYmUgcHJlc2VudCcpO1xuXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVzZSB0aGUgcXVlcnkgcmVzdWx0IGFzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yXG4gICAgICAgICAgICAvLyByZWNvcmRJZHMsIHNpbmNlIHdoZW4gdGhlIGNsaWVudCBkZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGxpbmtlZFxuICAgICAgICAgICAgLy8gdGFibGUsIHdlIHVwZGF0ZSBpdCBvcHRpbWlzdGljYWxseSBidXQgdGhlIG9yaWdpbiBjZWxsIHZhbHVlXG4gICAgICAgICAgICAvLyBkb2Vzbid0IHVwZGF0ZSB1bnRpbCByZWNlaXZpbmcgdGhlIHB1c2ggcGF5bG9hZC5cbiAgICAgICAgICAgIGlmICh0aGlzLl9saW5rZWRRdWVyeVJlc3VsdC5oYXNSZWNvcmQocmVjb3JkSWQpKSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkSWRzU2V0W3JlY29yZElkXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb21wdXRlZFJlY29yZElkc1NldCA9IHJlY29yZElkc1NldDtcblxuICAgICAgICBpZiAodGhpcy5fbm9ybWFsaXplZE9wdHMuc29ydHMgJiYgdGhpcy5fbm9ybWFsaXplZE9wdHMuc29ydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyB3aGVuIHNvcnRzIGFyZSBwcmVzZW50LCByZWNvcmQgb3JkZXIgY29tZXMgZnJvbSB0aGUgcXVlcnkgcmVzdWx0XG4gICAgICAgICAgICB0aGlzLl9jb21wdXRlZEZpbHRlcmVkU29ydGVkUmVjb3JkSWRzID0gdGhpcy5fbGlua2VkUXVlcnlSZXN1bHQucmVjb3JkSWRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICByZWNvcmRJZCA9PiByZWNvcmRJZHNTZXRbcmVjb3JkSWRdID09PSB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdpdGggbm8gc29ydHMsIHJlY29yZCBvcmRlciBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgY2VsbCBpbiB0aGVcbiAgICAgICAgICAgIC8vIG1haW4gQWlydGFibGUgVUkuIFNpbmNlIHdlIGdlbmVyYXRlZCByZWNvcmRJZHNTZXQgYnkgaXRlcmF0aW5nXG4gICAgICAgICAgICAvLyBvdmVyIHRoZSBjZWxsIHZhbHVlLCB3ZSdyZSBndWFyYW50ZWVkIHRoYXQgdGhlIGtleSBvcmRlciBtYXRjaGVzXG4gICAgICAgICAgICAvLyB0aGUgbGlua2VkIHJlY29yZCBvcmRlciBpbiB0aGUgY2VsbC5cbiAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVkRmlsdGVyZWRTb3J0ZWRSZWNvcmRJZHMgPSBPYmplY3Qua2V5cyhyZWNvcmRJZHNTZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRPckdlbmVyYXRlUmVjb3JkSWRzU2V0KCkge1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZUNvbXB1dGVkRGF0YUlmTmVlZGVkKCk7XG4gICAgICAgIGNvbnN0IHJlY29yZElkc1NldCA9IHRoaXMuX2NvbXB1dGVkUmVjb3JkSWRzU2V0O1xuICAgICAgICBpbnZhcmlhbnQocmVjb3JkSWRzU2V0LCAncmVjb3JkSWRzU2V0IG11c3QgZXhpc3QnKTtcbiAgICAgICAgcmV0dXJuIHJlY29yZElkc1NldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGFsbG93cyBhIHJlY29yZCBxdWVyeSByZXN1bHQgdG8gc3BlY2lmeSB0aGUgc291cmNlIG9mIHRoZSBxdWVyeVxuICAgICAqIGVnOiBWaWV3LCBUYWJsZSwgTGlua2VkIHJlY29yZCB3aGVuIHdhdGNoaW5nIGZpZWxkcy5cbiAgICAgKiBUaGlzIHNjb3BlcyB0aGUgd2F0Y2ggdG8gdGhvc2UgZmllbGRzICsgcm93cyBpbiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfX2NvbnN0cnVjdFF1ZXJ5U3BlY0ZvckJsb2NrRmllbGRTZWxlY3Rpb25TcGVjKFxuICAgICAgICBmaWVsZFNlbGVjdGlvbjogQmxvY2tGaWVsZFNlbGVjdGlvblNwZWMsXG4gICAgKTogQmxvY2tRdWVyeVNwZWMge1xuICAgICAgICAvLyBUaGUgb3JpZ2luIHRhYmxlSWQgaXMgYWx3YXlzIHRoZSBvbmUgcmVmZXJyZWQgdG8gaGVyZSBhcyB3ZSBtdXN0IHdhdGNoIHRoZSBvcmlnaW4gcmVjb3JkIGZvciBkZWxldGlvblxuICAgICAgICBjb25zdCBvcmlnaW5UYWJsZUlkID0gdGhpcy5fcmVjb3JkLnBhcmVudFRhYmxlLmlkO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2VUeXBlOiBCbG9ja1F1ZXJ5U291cmNlVHlwZS5UQUJMRSxcbiAgICAgICAgICAgIHNvdXJjZVRhYmxlSWQ6IG9yaWdpblRhYmxlSWQsXG4gICAgICAgICAgICByZWNvcmRTZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBmaWVsZFNlbGVjdGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHQ7XG4iXX0=
@@ -148,4 +148,5 @@ Object.defineProperty(exports, 'aggregators', {
148
148
 
149
149
  return initializedAggregators;
150
150
  }
151
- });
151
+ });
152
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvbW9kZWxzLnRzIl0sIm5hbWVzIjpbImluaXRpYWxpemVkQWdncmVnYXRvcnMiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJlbnVtZXJhYmxlIiwiZ2V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBakJBOztBQUNBOztBQUFlO0FBc0JmLElBQUlBLHNCQUFpRCxHQUFHLElBQXhEO0FBQ0FDLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsT0FBdEIsRUFBK0IsYUFBL0IsRUFBOEM7QUFDMUNDLEVBQUFBLFVBQVUsRUFBRSxJQUQ4QjtBQUUxQ0MsRUFBQUEsR0FBRyxFQUFFLE1BQU07QUFDUCxRQUFJLENBQUNMLHNCQUFMLEVBQTZCO0FBQ3pCQSxNQUFBQSxzQkFBc0IsR0FBRyxrQ0FBekI7QUFDSDs7QUFDRCxXQUFPQSxzQkFBUDtBQUNIO0FBUHlDLENBQTlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaXN0YW5idWwgaWdub3JlIGZpbGVcbi8qKiBAaWdub3JlICovIC8qKiAqL1xuaW1wb3J0ICogYXMgcmVjb3JkQ29sb3JpbmcgZnJvbSAnLi9yZWNvcmRfY29sb3JpbmcnO1xuaW1wb3J0IGNyZWF0ZUFnZ3JlZ2F0b3JzIGZyb20gJy4vY3JlYXRlX2FnZ3JlZ2F0b3JzJztcbmV4cG9ydCB7RmllbGRUeXBlLCBGaWVsZENvbmZpZ30gZnJvbSAnLi4vdHlwZXMvZmllbGQnO1xuZXhwb3J0IHtWaWV3VHlwZX0gZnJvbSAnLi4vdHlwZXMvdmlldyc7XG5leHBvcnQge2RlZmF1bHQgYXMgQmFzZX0gZnJvbSAnLi9iYXNlJztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBUYWJsZX0gZnJvbSAnLi90YWJsZSc7XG5leHBvcnQge2RlZmF1bHQgYXMgRmllbGR9IGZyb20gJy4vZmllbGQnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIFZpZXd9IGZyb20gJy4vdmlldyc7XG5leHBvcnQge2RlZmF1bHQgYXMgUmVjb3JkfSBmcm9tICcuL3JlY29yZCc7XG5leHBvcnQge2RlZmF1bHQgYXMgUmVjb3JkUXVlcnlSZXN1bHR9IGZyb20gJy4vcmVjb3JkX3F1ZXJ5X3Jlc3VsdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgVGFibGVPclZpZXdRdWVyeVJlc3VsdH0gZnJvbSAnLi90YWJsZV9vcl92aWV3X3F1ZXJ5X3Jlc3VsdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0fSBmcm9tICcuL2dyb3VwZWRfcmVjb3JkX3F1ZXJ5X3Jlc3VsdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0fSBmcm9tICcuL2xpbmtlZF9yZWNvcmRzX3F1ZXJ5X3Jlc3VsdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgVmlld01ldGFkYXRhUXVlcnlSZXN1bHR9IGZyb20gJy4vdmlld19tZXRhZGF0YV9xdWVyeV9yZXN1bHQnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIFNlc3Npb259IGZyb20gJy4vc2Vzc2lvbic7XG5leHBvcnQge2RlZmF1bHQgYXMgQ3Vyc29yfSBmcm9tICcuL2N1cnNvcic7XG5leHBvcnQge3JlY29yZENvbG9yaW5nfTtcblxuLy8gSEFDSzogYWdncmVnYXRvcnMgbmVlZCBhaXJ0YWJsZV9pbnRlcmZhY2UgdG8gaW5pdGlhbGl6ZSAtIHJlYWxseSwgdGhleSBzaG91bGQgYmUgYSBwcm9wZXJ0eSBvZlxuLy8gYmFzZSBpbnN0ZWFkIG9mIGhlcmUuIHRvIHdvcmsgYXJvdW5kIHRoYXQsIHRoZXkncmUgaW5pdGlhbGl6ZWQgbGF6aWx5IGZvciBub3c6XG5leHBvcnQgZGVjbGFyZSB2YXIgYWdncmVnYXRvcnM6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUFnZ3JlZ2F0b3JzPjtcbmxldCBpbml0aWFsaXplZEFnZ3JlZ2F0b3JzOiBudWxsIHwgdHlwZW9mIGFnZ3JlZ2F0b3JzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnYWdncmVnYXRvcnMnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgaWYgKCFpbml0aWFsaXplZEFnZ3JlZ2F0b3JzKSB7XG4gICAgICAgICAgICBpbml0aWFsaXplZEFnZ3JlZ2F0b3JzID0gY3JlYXRlQWdncmVnYXRvcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZWRBZ2dyZWdhdG9ycztcbiAgICB9LFxufSk7XG4iXX0=
@@ -3,11 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.MAX_NUM_FIELDS_PER_TABLE = exports.MAX_TABLE_NAME_LENGTH = exports.MAX_FIELD_NAME_LENGTH = void 0;
6
+ exports.MAX_NUM_FIELDS_PER_TABLE = exports.MAX_TABLE_NAME_LENGTH = exports.MAX_FIELD_DESCRIPTION_LENGTH = exports.MAX_FIELD_NAME_LENGTH = void 0;
7
7
  // Mirrored from clientServerSharedConfigSettings
8
8
  var MAX_FIELD_NAME_LENGTH = 255;
9
9
  exports.MAX_FIELD_NAME_LENGTH = MAX_FIELD_NAME_LENGTH;
10
+ var MAX_FIELD_DESCRIPTION_LENGTH = 20000;
11
+ exports.MAX_FIELD_DESCRIPTION_LENGTH = MAX_FIELD_DESCRIPTION_LENGTH;
10
12
  var MAX_TABLE_NAME_LENGTH = 255;
11
13
  exports.MAX_TABLE_NAME_LENGTH = MAX_TABLE_NAME_LENGTH;
12
14
  var MAX_NUM_FIELDS_PER_TABLE = 500;
13
- exports.MAX_NUM_FIELDS_PER_TABLE = MAX_NUM_FIELDS_PER_TABLE;
15
+ exports.MAX_NUM_FIELDS_PER_TABLE = MAX_NUM_FIELDS_PER_TABLE;
16
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvbXV0YXRpb25fY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbIk1BWF9GSUVMRF9OQU1FX0xFTkdUSCIsIk1BWF9GSUVMRF9ERVNDUklQVElPTl9MRU5HVEgiLCJNQVhfVEFCTEVfTkFNRV9MRU5HVEgiLCJNQVhfTlVNX0ZJRUxEU19QRVJfVEFCTEUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ08sSUFBTUEscUJBQXFCLEdBQUcsR0FBOUI7O0FBQ0EsSUFBTUMsNEJBQTRCLEdBQUcsS0FBckM7O0FBQ0EsSUFBTUMscUJBQXFCLEdBQUcsR0FBOUI7O0FBQ0EsSUFBTUMsd0JBQXdCLEdBQUcsR0FBakMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBNaXJyb3JlZCBmcm9tIGNsaWVudFNlcnZlclNoYXJlZENvbmZpZ1NldHRpbmdzXG5leHBvcnQgY29uc3QgTUFYX0ZJRUxEX05BTUVfTEVOR1RIID0gMjU1O1xuZXhwb3J0IGNvbnN0IE1BWF9GSUVMRF9ERVNDUklQVElPTl9MRU5HVEggPSAyMDAwMDtcbmV4cG9ydCBjb25zdCBNQVhfVEFCTEVfTkFNRV9MRU5HVEggPSAyNTU7XG5leHBvcnQgY29uc3QgTUFYX05VTV9GSUVMRFNfUEVSX1RBQkxFID0gNTAwO1xuIl19