@airtable/blocks 1.9.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 (291) hide show
  1. package/CHANGELOG.md +10 -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 +4 -2
  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 +5 -14
  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 +2 -1
  19. package/dist/cjs/models/mutations.js +20 -163
  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 +10 -8
  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 +42 -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 +57 -11
  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 +2 -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 +2 -1
  220. package/dist/cjs/viewport.js +2 -1
  221. package/dist/cjs/warning.js +2 -1
  222. package/dist/cjs/watchable.js +17 -2
  223. package/dist/types/src/models/base.d.ts +2 -1
  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 +3 -13
  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/mutations.d.ts.map +1 -1
  233. package/dist/types/src/models/query_manager.d.ts +2 -0
  234. package/dist/types/src/models/query_manager.d.ts.map +1 -0
  235. package/dist/types/src/models/record.d.ts +12 -3
  236. package/dist/types/src/models/record.d.ts.map +1 -1
  237. package/dist/types/src/models/record_query_result.d.ts +3 -2
  238. package/dist/types/src/models/record_query_result.d.ts.map +1 -1
  239. package/dist/types/src/models/record_store.d.ts.map +1 -1
  240. package/dist/types/src/models/table.d.ts +2 -1
  241. package/dist/types/src/models/table.d.ts.map +1 -1
  242. package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
  243. package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
  244. package/dist/types/src/models/view_data_store.d.ts +0 -1
  245. package/dist/types/src/models/view_data_store.d.ts.map +1 -1
  246. package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
  247. package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
  248. package/dist/types/src/private_utils.d.ts +24 -1
  249. package/dist/types/src/private_utils.d.ts.map +1 -1
  250. package/dist/types/src/sdk.d.ts.map +1 -1
  251. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts +11 -11
  252. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -1
  253. package/dist/types/src/types/airtable_interface.d.ts +48 -20
  254. package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
  255. package/dist/types/src/types/block_query_spec.d.ts +139 -0
  256. package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
  257. package/dist/types/src/types/field.d.ts +7 -1
  258. package/dist/types/src/types/field.d.ts.map +1 -1
  259. package/dist/types/src/types/table.d.ts +0 -2
  260. package/dist/types/src/types/table.d.ts.map +1 -1
  261. package/dist/types/src/types/view.d.ts +3 -8
  262. package/dist/types/src/types/view.d.ts.map +1 -1
  263. package/dist/types/src/ui/cell_renderer.d.ts +1 -1
  264. package/dist/types/src/ui/color_palette.d.ts +1 -1
  265. package/dist/types/src/ui/control_sizes.d.ts +1 -1
  266. package/dist/types/src/ui/field_icon.d.ts +1 -1
  267. package/dist/types/src/ui/heading.d.ts +1 -1
  268. package/dist/types/src/ui/icon.d.ts +1 -1
  269. package/dist/types/src/ui/icon_config.d.ts +33 -31
  270. package/dist/types/src/ui/icon_config.d.ts.map +1 -1
  271. package/dist/types/src/ui/input.d.ts +10 -10
  272. package/dist/types/src/ui/link.d.ts +1 -1
  273. package/dist/types/src/ui/link.d.ts.map +1 -1
  274. package/dist/types/src/ui/record_card.d.ts +1 -1
  275. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts +1 -1
  276. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts.map +1 -1
  277. package/dist/types/src/ui/text.d.ts +1 -1
  278. package/dist/types/src/ui/theme/default_theme/index.d.ts +1 -1
  279. package/dist/types/src/ui/theme/theme_context.d.ts +1 -1
  280. package/dist/types/src/ui/theme/use_theme.d.ts +1 -1
  281. package/dist/types/src/ui/use_global_config.d.ts +1 -1
  282. package/dist/types/src/watchable.d.ts.map +1 -1
  283. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +7 -5
  284. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -1
  285. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts +18 -11
  286. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -1
  287. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts +51 -0
  288. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts.map +1 -0
  289. package/dist/types/test/test_helpers.d.ts +2 -0
  290. package/dist/types/test/test_helpers.d.ts.map +1 -1
  291. package/package.json +2 -1
@@ -6,12 +6,20 @@ require("core-js/modules/es.symbol");
6
6
 
7
7
  require("core-js/modules/es.symbol.description");
8
8
 
9
+ require("core-js/modules/es.array.concat");
10
+
11
+ require("core-js/modules/es.array.filter");
12
+
13
+ require("core-js/modules/es.array.includes");
14
+
9
15
  require("core-js/modules/es.array.iterator");
10
16
 
11
17
  require("core-js/modules/es.object.to-string");
12
18
 
13
19
  require("core-js/modules/es.promise");
14
20
 
21
+ require("core-js/modules/es.string.includes");
22
+
15
23
  require("core-js/modules/es.string.starts-with");
16
24
 
17
25
  require("core-js/modules/web.dom-collections.iterator");
@@ -29,9 +37,11 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
29
37
 
30
38
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
31
39
 
40
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
41
+
32
42
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
33
43
 
34
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
44
+ var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
35
45
 
36
46
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
37
47
 
@@ -47,6 +57,8 @@ var _error_utils = require("../error_utils");
47
57
 
48
58
  var _color_utils = _interopRequireDefault(require("../color_utils"));
49
59
 
60
+ var _block_query_spec = require("../types/block_query_spec");
61
+
50
62
  var _abstract_model = _interopRequireDefault(require("./abstract_model"));
51
63
 
52
64
  var _object_pool = _interopRequireDefault(require("./object_pool"));
@@ -80,6 +92,23 @@ var WatchableColorInViewKeyPrefix = 'colorInView:';
80
92
  * - `'colorInView:' + someViewId`
81
93
  */
82
94
 
95
+ function _isKeySubscribeableViaRecordQuery(key) {
96
+ switch (key) {
97
+ case WatchableRecordKeys.name:
98
+ case WatchableRecordKeys.commentCount:
99
+ case WatchableRecordKeys.cellValues:
100
+ return true;
101
+
102
+ default:
103
+ if (key.startsWith(WatchableCellValueInFieldKeyPrefix)) {
104
+ return true;
105
+ }
106
+
107
+ break;
108
+ }
109
+
110
+ return false;
111
+ }
83
112
  /**
84
113
  * Model class representing a record in a table.
85
114
  *
@@ -88,6 +117,8 @@ var WatchableColorInViewKeyPrefix = 'colorInView:';
88
117
  *
89
118
  * @docsPath models/Record
90
119
  */
120
+
121
+
91
122
  var Record =
92
123
  /*#__PURE__*/
93
124
  function (_AbstractModel) {
@@ -115,9 +146,16 @@ function (_AbstractModel) {
115
146
  _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Record).call(this, sdk, recordId));
116
147
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_parentRecordStore", void 0);
117
148
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_parentTable", void 0);
149
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_queryManager", void 0);
118
150
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "__linkedRecordsQueryResultPool", void 0);
151
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_onRecordColorChange", (viewDataStore, key, recordIds) => {
152
+ if (recordIds.includes(_this.id)) {
153
+ _this._onChange(WatchableColorInViewKeyPrefix + viewDataStore.viewId);
154
+ }
155
+ });
119
156
  _this._parentRecordStore = parentRecordStore;
120
157
  _this._parentTable = parentTable;
158
+ _this._queryManager = sdk._queryManager;
121
159
  _this.__linkedRecordsQueryResultPool = new _object_pool.default(_linked_records_query_result.default);
122
160
  return _this;
123
161
  }
@@ -127,6 +165,33 @@ function (_AbstractModel) {
127
165
 
128
166
 
129
167
  (0, _createClass2.default)(Record, [{
168
+ key: "_assertExistsAndLoaded",
169
+
170
+ /**
171
+ * @internal
172
+ */
173
+ value: function _assertExistsAndLoaded() {
174
+ // Access data in order to throw if the Record has been deleted / isn't loaded
175
+ var data = this._dataOrNullIfDeleted;
176
+
177
+ if (data === null) {
178
+ throw this._spawnErrorForDeletion();
179
+ }
180
+ }
181
+ /**
182
+ * The table that this record belongs to. Should never change because records aren't moved between tables.
183
+ *
184
+ * @internal (since we may not be able to return parent model instances in the immutable models world)
185
+ * @example
186
+ * ```js
187
+ * import {useRecords} from '@airtable/blocks/ui';
188
+ * const records = useRecords(myTable);
189
+ * console.log(records[0].parentTable.id === myTable.id);
190
+ * // => true
191
+ * ```
192
+ */
193
+
194
+ }, {
130
195
  key: "_getFieldMatching",
131
196
 
132
197
  /**
@@ -156,18 +221,20 @@ function (_AbstractModel) {
156
221
  }, {
157
222
  key: "_getRawCellValue",
158
223
  value: function _getRawCellValue(field) {
159
- (0, _error_utils.invariant)(this._parentRecordStore.areCellValuesLoadedForFieldId(field.id), 'Cell values for field %s are not loaded', field.id);
160
- var cellValuesByFieldId = this._data.cellValuesByFieldId;
224
+ this._assertExistsAndLoaded(); // TODO: (#proj-blocks-sdk-record-limits) Consider a new API that allows determining
225
+ // if the cell value is loaded + getting the cellValue in one call?
161
226
 
162
- if (!cellValuesByFieldId) {
163
- return null;
164
- }
165
227
 
166
- var cellValue = cellValuesByFieldId[field.id] !== undefined ? cellValuesByFieldId[field.id] : null;
228
+ var isCellValueLoadedForField = this._parentRecordStore.isRecordCellValueLoadedForFieldId(this._id, field.id);
229
+
230
+ (0, _error_utils.invariant)(isCellValueLoadedForField, 'Cell value for field %s and record %s is not loaded', field.id, this._id);
231
+
232
+ var cellValue = this._parentRecordStore.getRecordCellValueByFieldId(this._id, field.id);
167
233
 
168
234
  if (typeof cellValue === 'object' && cellValue !== null) {
169
235
  // Copy non-primitives.
170
- // TODO(kasra): maybe freezeDeep instead?
236
+ // TODO: (#proj-blocks-sdk-record-limits): getRecordCellValueByFieldId returns
237
+ // deeply frozen objects, in a later sdk version we can drop cloning deeply.
171
238
  return (0, _private_utils.cloneDeep)(cellValue);
172
239
  } else {
173
240
  return cellValue;
@@ -278,9 +345,8 @@ function (_AbstractModel) {
278
345
  }, {
279
346
  key: "getCellValueAsString",
280
347
  value: function getCellValueAsString(fieldOrFieldIdOrFieldName) {
281
- var field = this._getFieldMatching(fieldOrFieldIdOrFieldName);
348
+ var field = this._getFieldMatching(fieldOrFieldIdOrFieldName); // getRawCellValue performs invariant check that cell value at the field is loaded
282
349
 
283
- (0, _error_utils.invariant)(this._parentRecordStore.areCellValuesLoadedForFieldId(field.id), 'Cell values for field %s are not loaded', field.id);
284
350
 
285
351
  var cellValue = this._getRawCellValue(field);
286
352
 
@@ -443,73 +509,256 @@ function (_AbstractModel) {
443
509
  */
444
510
 
445
511
  }, {
446
- key: "__triggerOnChangeForDirtyPaths",
512
+ key: "_constructBlockFieldSelectionSpec",
447
513
 
448
514
  /**
449
515
  * @internal
450
516
  */
451
- value: function __triggerOnChangeForDirtyPaths(dirtyPaths) {
452
- var cellValuesByFieldId = dirtyPaths.cellValuesByFieldId,
453
- commentCount = dirtyPaths.commentCount;
454
-
455
- if (cellValuesByFieldId && !(0, _private_utils.isObjectEmpty)(cellValuesByFieldId)) {
456
- // TODO: don't trigger changes for fields that aren't supposed to be loaded
457
- // (in some cases, e.g. record created, liveapp will send cell values
458
- // that we're not subscribed to).
459
- this._onChange(WatchableRecordKeys.cellValues, Object.keys(cellValuesByFieldId));
460
-
461
- if (cellValuesByFieldId[this.parentTable.primaryField.id]) {
462
- this._onChange(WatchableRecordKeys.name);
517
+ value: function _constructBlockFieldSelectionSpec(fieldSelection) {
518
+ return {
519
+ sourceType: _block_query_spec.BlockQuerySourceType.TABLE,
520
+ sourceTableId: this.parentTable.id,
521
+ recordSelection: {
522
+ recordIds: [this.id],
523
+ fieldSelection
463
524
  }
525
+ };
526
+ }
527
+ /**
528
+ * @internal
529
+ */
464
530
 
465
- for (var _i = 0, _Object$keys = Object.keys(cellValuesByFieldId); _i < _Object$keys.length; _i++) {
466
- var fieldId = _Object$keys[_i];
531
+ }, {
532
+ key: "_findMatchingBlockSubscriptionChanges",
533
+ value: function _findMatchingBlockSubscriptionChanges(changes, changeTypeToMatch) {
534
+ return changes.filter(change => change.type === changeTypeToMatch && change.tableId === this.parentTable.id);
535
+ }
536
+ /**
537
+ * @internal
538
+ */
539
+
540
+ }, {
541
+ key: "_constructBlockQuerySpecAndCallbackForWatchableKey",
542
+ value: function _constructBlockQuerySpecAndCallbackForWatchableKey(key, callbackForRegistration, context) {
543
+ var fieldSelectionDefinition;
544
+
545
+ var onChangeCallback = () => {
546
+ callbackForRegistration.call(context, this, key);
547
+ };
548
+
549
+ switch (key) {
550
+ case WatchableRecordKeys.name:
551
+ fieldSelectionDefinition = {
552
+ type: _block_query_spec.BlockFieldSelectionSpecType.SPECIFIED_FIELDS,
553
+ fieldIds: [this.parentTable.primaryField.id]
554
+ };
555
+ break;
556
+
557
+ case WatchableRecordKeys.commentCount:
558
+ fieldSelectionDefinition = {
559
+ type: _block_query_spec.BlockFieldSelectionSpecType.SPECIFIED_FIELDS,
560
+ fieldIds: [],
561
+ shouldIncludeCommentCount: true
562
+ };
563
+ break;
564
+
565
+ case WatchableRecordKeys.cellValues:
566
+ // TODO: (#proj-blocks-sdk-record-limits) In the future don't fetch all fields from table
567
+ // old code exhibit this behavior though: https://github.com/Hyperbase/blocks-sdk/blob/aba6fa7b7f8ccc1e364b409ca466d0281f8e9a69/packages/sdk/src/models/record.ts#L414-L416
568
+ // In the future a "subscribe to updates, but don't fetch more data" might be useful here.
569
+ fieldSelectionDefinition = {
570
+ type: _block_query_spec.BlockFieldSelectionSpecType.ALL_FIELDS_FROM_TABLE
571
+ };
572
+
573
+ onChangeCallback = changes => {
574
+ var modifiedCellValuesChanges = this._findMatchingBlockSubscriptionChanges(changes, _block_query_spec.BlockQuerySubscriptionChangeType.MODIFIED_CELL_VALUES_FOR_TABLE); // We do not currently simulate "on load" callback for registration
575
+ // but still handle it.
576
+
577
+
578
+ if (modifiedCellValuesChanges.length === 0) {
579
+ callbackForRegistration.call(context, this, key);
580
+ return;
581
+ }
582
+
583
+ var fieldIdsModified = [];
584
+ var _iteratorNormalCompletion3 = true;
585
+ var _didIteratorError3 = false;
586
+ var _iteratorError3 = undefined;
587
+
588
+ try {
589
+ for (var _iterator3 = modifiedCellValuesChanges[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
590
+ var modifiedCellValuesChange = _step3.value;
591
+ (0, _error_utils.invariant)(modifiedCellValuesChange.type === _block_query_spec.BlockQuerySubscriptionChangeType.MODIFIED_CELL_VALUES_FOR_TABLE, 'Modified cell value change is not a supported type in record');
592
+ var fieldIdsByRecordId = modifiedCellValuesChange.fieldIdsByRecordId;
593
+ var fieldIdsForThisRecord = fieldIdsByRecordId[this.id];
594
+
595
+ if (fieldIdsForThisRecord) {
596
+ fieldIdsModified = fieldIdsModified.concat(fieldIdsForThisRecord);
597
+ }
598
+ }
599
+ } catch (err) {
600
+ _didIteratorError3 = true;
601
+ _iteratorError3 = err;
602
+ } finally {
603
+ try {
604
+ if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
605
+ _iterator3.return();
606
+ }
607
+ } finally {
608
+ if (_didIteratorError3) {
609
+ throw _iteratorError3;
610
+ }
611
+ }
612
+ }
613
+
614
+ callbackForRegistration.call(context, this, key, fieldIdsModified);
615
+ };
616
+
617
+ break;
618
+
619
+ default:
620
+ // The else cases should be impossible to reach - they indicate a SDK error.
621
+ // istanbul ignore else
622
+ if (key.startsWith(WatchableCellValueInFieldKeyPrefix)) {
623
+ var fieldId = key.substring(WatchableCellValueInFieldKeyPrefix.length); // Assert that fieldId is validly formatted, not that it is a valid fieldId in this table
624
+
625
+ (0, _error_utils.invariant)((0, _private_utils.isFieldId)(fieldId), 'fieldId passed as watchable fieldId is not a valid format' + fieldId);
626
+ fieldSelectionDefinition = {
627
+ type: _block_query_spec.BlockFieldSelectionSpecType.SPECIFIED_FIELDS,
628
+ fieldIds: [fieldId]
629
+ };
630
+
631
+ onChangeCallback = changes => {
632
+ // We could check if something else changed in the changes array,
633
+ // but our query subscription is targeting only the field in this record
634
+ callbackForRegistration.call(context, this, key, fieldId);
635
+ };
636
+ } else if (key.startsWith(WatchableColorInViewKeyPrefix)) {
637
+ throw (0, _error_utils.spawnError)('WatchableColorInViewKeyPrefix must be handled outside of query system');
638
+ } else {
639
+ throw (0, _error_utils.spawnError)('invalid record (un)watch key %s', key);
640
+ }
467
641
 
468
- this._onChange(WatchableCellValueInFieldKeyPrefix + fieldId, fieldId);
469
- }
470
642
  }
471
643
 
472
- if (commentCount) {
473
- this._onChange(WatchableRecordKeys.commentCount);
644
+ return {
645
+ querySpecToSubscribeWith: this._constructBlockFieldSelectionSpec(fieldSelectionDefinition),
646
+ onChangeCallback
647
+ };
648
+ }
649
+ /** @inheritdoc */
650
+
651
+ }, {
652
+ key: "watch",
653
+ value: function watch(keys, callbackForRegistration, context) {
654
+ var validKeys = this._getWatchableValidKeysOrThrow(keys, 'watch');
655
+
656
+ var _iteratorNormalCompletion4 = true;
657
+ var _didIteratorError4 = false;
658
+ var _iteratorError4 = undefined;
659
+
660
+ try {
661
+ for (var _iterator4 = validKeys[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
662
+ var key = _step4.value;
663
+
664
+ if (_isKeySubscribeableViaRecordQuery(key)) {
665
+ var _this$_constructBlock = this._constructBlockQuerySpecAndCallbackForWatchableKey(key, callbackForRegistration, context),
666
+ querySpecToSubscribeWith = _this$_constructBlock.querySpecToSubscribeWith,
667
+ onChangeCallback = _this$_constructBlock.onChangeCallback;
668
+
669
+ this._queryManager.watchWithQuerySpec(querySpecToSubscribeWith, this, key, onChangeCallback, callbackForRegistration, context);
670
+ } else {
671
+ // fallback to regular watch logic
672
+ (0, _error_utils.invariant)(key.startsWith(WatchableColorInViewKeyPrefix), 'Unexpected key in watch: %s', key);
673
+ var viewId = key.substring(WatchableColorInViewKeyPrefix.length);
674
+
675
+ this._parentRecordStore.getViewDataStore(viewId).watch('recordColors', this._onRecordColorChange);
676
+
677
+ (0, _get2.default)((0, _getPrototypeOf2.default)(Record.prototype), "watch", this).call(this, key, callbackForRegistration, context);
678
+ }
679
+ }
680
+ } catch (err) {
681
+ _didIteratorError4 = true;
682
+ _iteratorError4 = err;
683
+ } finally {
684
+ try {
685
+ if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
686
+ _iterator4.return();
687
+ }
688
+ } finally {
689
+ if (_didIteratorError4) {
690
+ throw _iteratorError4;
691
+ }
692
+ }
474
693
  }
694
+
695
+ return validKeys;
475
696
  }
476
- /**
477
- * @internal
478
- */
697
+ /** @inheritdoc */
479
698
 
480
699
  }, {
481
- key: "__triggerOnChangeForRecordColorInViewId",
482
- value: function __triggerOnChangeForRecordColorInViewId(viewId) {
483
- this._onChange(WatchableColorInViewKeyPrefix + viewId);
700
+ key: "unwatch",
701
+ value: function unwatch(keys, callbackForRegistration, context) {
702
+ // We warn instead of throw here because we used to warn instead of throw and don't
703
+ // want to make a breaking change.
704
+ var validKeys = this._getWatchableValidKeysOrThrow(keys, 'unwatch', true);
705
+
706
+ var _iteratorNormalCompletion5 = true;
707
+ var _didIteratorError5 = false;
708
+ var _iteratorError5 = undefined;
709
+
710
+ try {
711
+ for (var _iterator5 = validKeys[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
712
+ var key = _step5.value;
713
+
714
+ if (_isKeySubscribeableViaRecordQuery(key)) {
715
+ this._queryManager.unwatchFromQueryKey(key, callbackForRegistration, context);
716
+ } else {
717
+ // fallback to regular watch logic
718
+ (0, _error_utils.invariant)(key.startsWith(WatchableColorInViewKeyPrefix), 'Unexpected key in unwatch: %s', key);
719
+ var viewId = key.substring(WatchableColorInViewKeyPrefix.length);
720
+
721
+ this._parentRecordStore.getViewDataStore(viewId).unwatch('recordColors', this._onRecordColorChange);
722
+
723
+ (0, _get2.default)((0, _getPrototypeOf2.default)(Record.prototype), "unwatch", this).call(this, key, callbackForRegistration, context);
724
+ }
725
+ }
726
+ } catch (err) {
727
+ _didIteratorError5 = true;
728
+ _iteratorError5 = err;
729
+ } finally {
730
+ try {
731
+ if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
732
+ _iterator5.return();
733
+ }
734
+ } finally {
735
+ if (_didIteratorError5) {
736
+ throw _iteratorError5;
737
+ }
738
+ }
739
+ }
740
+
741
+ return validKeys;
484
742
  }
743
+ /** @internal */
744
+
485
745
  }, {
486
746
  key: "_dataOrNullIfDeleted",
487
747
  get: function get() {
488
- var _recordsById$this$_id;
489
-
490
748
  var tableData = this._baseData.tablesById[this.parentTable.id];
491
749
 
492
750
  if (!tableData) {
493
751
  return null;
494
752
  }
495
753
 
496
- var recordsById = tableData.recordsById;
497
- (0, _error_utils.invariant)(recordsById, 'Record data is not loaded');
498
- return (_recordsById$this$_id = recordsById[this._id]) !== null && _recordsById$this$_id !== void 0 ? _recordsById$this$_id : null;
499
- }
500
- /**
501
- * The table that this record belongs to. Should never change because records aren't moved between tables.
502
- *
503
- * @internal (since we may not be able to return parent model instances in the immutable models world)
504
- * @example
505
- * ```js
506
- * import {useRecords} from '@airtable/blocks/ui';
507
- * const records = useRecords(myTable);
508
- * console.log(records[0].parentTable.id === myTable.id);
509
- * // => true
510
- * ```
511
- */
754
+ var isRecordLoaded = this._parentRecordStore.isRecordLoaded(this._id);
755
+
756
+ (0, _error_utils.invariant)(isRecordLoaded, 'Record data is not loaded');
757
+
758
+ var isRecordDeleted = this._parentRecordStore.isRecordDeleted(this._id);
512
759
 
760
+ return isRecordDeleted ? null : true;
761
+ }
513
762
  }, {
514
763
  key: "parentTable",
515
764
  get: function get() {
@@ -551,7 +800,9 @@ function (_AbstractModel) {
551
800
  }, {
552
801
  key: "commentCount",
553
802
  get: function get() {
554
- return this._data.commentCount;
803
+ this._assertExistsAndLoaded();
804
+
805
+ return this._parentRecordStore.getRecordCommentCount(this._id);
555
806
  }
556
807
  /**
557
808
  * The created time of this record.
@@ -567,7 +818,9 @@ function (_AbstractModel) {
567
818
  }, {
568
819
  key: "createdTime",
569
820
  get: function get() {
570
- return new Date(this._data.createdTime);
821
+ this._assertExistsAndLoaded();
822
+
823
+ return this._parentRecordStore.getRecordCreatedTime(this._id);
571
824
  }
572
825
  }]);
573
826
  return Record;
@@ -575,4 +828,5 @@ function (_AbstractModel) {
575
828
 
576
829
  (0, _defineProperty2.default)(Record, "_className", 'Record');
577
830
  var _default = Record;
578
- exports.default = _default;
831
+ exports.default = _default;
832
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvcmVjb3JkLnRzIl0sIm5hbWVzIjpbIldhdGNoYWJsZVJlY29yZEtleXMiLCJPYmplY3QiLCJmcmVlemUiLCJuYW1lIiwiY29tbWVudENvdW50IiwiY2VsbFZhbHVlcyIsIldhdGNoYWJsZUNlbGxWYWx1ZUluRmllbGRLZXlQcmVmaXgiLCJXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCIsIl9pc0tleVN1YnNjcmliZWFibGVWaWFSZWNvcmRRdWVyeSIsImtleSIsInN0YXJ0c1dpdGgiLCJSZWNvcmQiLCJzZGsiLCJwYXJlbnRSZWNvcmRTdG9yZSIsInBhcmVudFRhYmxlIiwicmVjb3JkSWQiLCJ2aWV3RGF0YVN0b3JlIiwicmVjb3JkSWRzIiwiaW5jbHVkZXMiLCJpZCIsIl9vbkNoYW5nZSIsInZpZXdJZCIsIl9wYXJlbnRSZWNvcmRTdG9yZSIsIl9wYXJlbnRUYWJsZSIsIl9xdWVyeU1hbmFnZXIiLCJfX2xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdFBvb2wiLCJPYmplY3RQb29sIiwiTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IiwiZGF0YSIsIl9kYXRhT3JOdWxsSWZEZWxldGVkIiwiX3NwYXduRXJyb3JGb3JEZWxldGlvbiIsImZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUiLCJfX2dldEZpZWxkTWF0Y2hpbmciLCJ2aWV3T3JWaWV3SWRPclZpZXdOYW1lIiwiX19nZXRWaWV3TWF0Y2hpbmciLCJmaWVsZCIsIl9hc3NlcnRFeGlzdHNBbmRMb2FkZWQiLCJpc0NlbGxWYWx1ZUxvYWRlZEZvckZpZWxkIiwiaXNSZWNvcmRDZWxsVmFsdWVMb2FkZWRGb3JGaWVsZElkIiwiX2lkIiwiY2VsbFZhbHVlIiwiZ2V0UmVjb3JkQ2VsbFZhbHVlQnlGaWVsZElkIiwiX2dldEZpZWxkTWF0Y2hpbmciLCJfZ2V0UmF3Q2VsbFZhbHVlIiwidHlwZSIsIkZpZWxkVHlwZSIsIk1VTFRJUExFX0xPT0tVUF9WQUxVRVMiLCJfc2RrIiwiX19haXJ0YWJsZUludGVyZmFjZSIsInNka0luaXREYXRhIiwiaXNVc2luZ05ld0xvb2t1cENlbGxWYWx1ZUZvcm1hdCIsImNlbGxWYWx1ZUZvck1pZ3JhdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsImxpbmtlZFJlY29yZElkcyIsImxpbmtlZFJlY29yZElkIiwidmFsdWVzQnlMaW5rZWRSZWNvcmRJZCIsInZhbHVlIiwidiIsInB1c2giLCJ1bmRlZmluZWQiLCJhaXJ0YWJsZUludGVyZmFjZSIsImFwcEludGVyZmFjZSIsIl9fYXBwSW50ZXJmYWNlIiwiZmllbGRUeXBlUHJvdmlkZXIiLCJjb252ZXJ0Q2VsbFZhbHVlVG9TdHJpbmciLCJfZGF0YSIsImF0dGFjaG1lbnRJZCIsImF0dGFjaG1lbnRVcmwiLCJ1cmxDb25zdHJ1Y3RvciIsImdldEF0dGFjaG1lbnRDbGllbnRVcmwiLCJ2aWV3IiwiX2dldFZpZXdNYXRjaGluZyIsImdldFZpZXdEYXRhU3RvcmUiLCJnZXRSZWNvcmRDb2xvciIsImNvbG9yIiwiZ2V0Q29sb3JJblZpZXciLCJjb2xvclV0aWxzIiwiZ2V0SGV4Rm9yQ29sb3IiLCJvcHRzIiwibGlua2VkVGFibGVJZCIsIm9wdGlvbnMiLCJsaW5rZWRUYWJsZSIsImJhc2UiLCJnZXRUYWJsZUJ5SWQiLCJsaW5rZWRSZWNvcmRTdG9yZSIsIl9fZ2V0UmVjb3JkU3RvcmUiLCJub3JtYWxpemVkT3B0cyIsIlJlY29yZFF1ZXJ5UmVzdWx0IiwiX25vcm1hbGl6ZU9wdHMiLCJnZXRPYmplY3RGb3JSZXVzZSIsInF1ZXJ5UmVzdWx0Iiwic2VsZWN0TGlua2VkUmVjb3Jkc0Zyb21DZWxsIiwibG9hZERhdGFBc3luYyIsImZpZWxkU2VsZWN0aW9uIiwic291cmNlVHlwZSIsIkJsb2NrUXVlcnlTb3VyY2VUeXBlIiwiVEFCTEUiLCJzb3VyY2VUYWJsZUlkIiwicmVjb3JkU2VsZWN0aW9uIiwiY2hhbmdlcyIsImNoYW5nZVR5cGVUb01hdGNoIiwiZmlsdGVyIiwiY2hhbmdlIiwidGFibGVJZCIsImNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uIiwiY29udGV4dCIsImZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiIsIm9uQ2hhbmdlQ2FsbGJhY2siLCJjYWxsIiwiQmxvY2tGaWVsZFNlbGVjdGlvblNwZWNUeXBlIiwiU1BFQ0lGSUVEX0ZJRUxEUyIsImZpZWxkSWRzIiwicHJpbWFyeUZpZWxkIiwic2hvdWxkSW5jbHVkZUNvbW1lbnRDb3VudCIsIkFMTF9GSUVMRFNfRlJPTV9UQUJMRSIsIm1vZGlmaWVkQ2VsbFZhbHVlc0NoYW5nZXMiLCJfZmluZE1hdGNoaW5nQmxvY2tTdWJzY3JpcHRpb25DaGFuZ2VzIiwiQmxvY2tRdWVyeVN1YnNjcmlwdGlvbkNoYW5nZVR5cGUiLCJNT0RJRklFRF9DRUxMX1ZBTFVFU19GT1JfVEFCTEUiLCJsZW5ndGgiLCJmaWVsZElkc01vZGlmaWVkIiwibW9kaWZpZWRDZWxsVmFsdWVzQ2hhbmdlIiwiZmllbGRJZHNCeVJlY29yZElkIiwiZmllbGRJZHNGb3JUaGlzUmVjb3JkIiwiY29uY2F0IiwiZmllbGRJZCIsInN1YnN0cmluZyIsInF1ZXJ5U3BlY1RvU3Vic2NyaWJlV2l0aCIsIl9jb25zdHJ1Y3RCbG9ja0ZpZWxkU2VsZWN0aW9uU3BlYyIsImtleXMiLCJ2YWxpZEtleXMiLCJfZ2V0V2F0Y2hhYmxlVmFsaWRLZXlzT3JUaHJvdyIsIl9jb25zdHJ1Y3RCbG9ja1F1ZXJ5U3BlY0FuZENhbGxiYWNrRm9yV2F0Y2hhYmxlS2V5Iiwid2F0Y2hXaXRoUXVlcnlTcGVjIiwid2F0Y2giLCJfb25SZWNvcmRDb2xvckNoYW5nZSIsInVud2F0Y2hGcm9tUXVlcnlLZXkiLCJ1bndhdGNoIiwidGFibGVEYXRhIiwiX2Jhc2VEYXRhIiwidGFibGVzQnlJZCIsImlzUmVjb3JkTG9hZGVkIiwiaXNSZWNvcmREZWxldGVkIiwiZ2V0UmVjb3JkVXJsIiwiZ2V0Q2VsbFZhbHVlQXNTdHJpbmciLCJnZXRSZWNvcmRDb21tZW50Q291bnQiLCJnZXRSZWNvcmRDcmVhdGVkVGltZSIsIkFic3RyYWN0TW9kZWwi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QUs4SCxvQkFBTCxDQUEwQixLQUFLbkksV0FBTCxDQUFpQm1HLFlBQTNDLENBQVA7QUFDSDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7d0JBWTJCO0FBQ3ZCLFdBQUs3RSxzQkFBTDs7QUFFQSxhQUFPLEtBQUtkLGtCQUFMLENBQXdCNEgscUJBQXhCLENBQThDLEtBQUszRyxHQUFuRCxDQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozt3QkFVd0I7QUFDcEIsV0FBS0gsc0JBQUw7O0FBRUEsYUFBTyxLQUFLZCxrQkFBTCxDQUF3QjZILG9CQUF4QixDQUE2QyxLQUFLNUcsR0FBbEQsQ0FBUDtBQUNIOzs7RUF4WGdCNkcsdUI7OzhCQUFmekksTSxnQkFFa0IsUTtlQTJsQlRBLE0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAYWlydGFibGUvYmxvY2tzL21vZGVsczogUmVjb3JkICovIC8qKiAqL1xuaW1wb3J0IHtDb2xvcn0gZnJvbSAnLi4vY29sb3JzJztcbmltcG9ydCBTZGsgZnJvbSAnLi4vc2RrJztcbmltcG9ydCB7UmVjb3JkSWR9IGZyb20gJy4uL3R5cGVzL3JlY29yZCc7XG5pbXBvcnQge0ZpZWxkVHlwZSwgRmllbGRJZH0gZnJvbSAnLi4vdHlwZXMvZmllbGQnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3R5cGVzL3ZpZXcnO1xuaW1wb3J0IHtcbiAgICBpc0VudW1WYWx1ZSxcbiAgICBjbG9uZURlZXAsXG4gICAgT2JqZWN0VmFsdWVzLFxuICAgIEZsb3dBbnlPYmplY3QsXG4gICAgRmxvd0FueUZ1bmN0aW9uLFxuICAgIGlzRmllbGRJZCxcbn0gZnJvbSAnLi4vcHJpdmF0ZV91dGlscyc7XG5pbXBvcnQge2ludmFyaWFudCwgc3Bhd25FcnJvcn0gZnJvbSAnLi4vZXJyb3JfdXRpbHMnO1xuaW1wb3J0IGNvbG9yVXRpbHMgZnJvbSAnLi4vY29sb3JfdXRpbHMnO1xuaW1wb3J0IHtcbiAgICBCbG9ja0ZpZWxkU2VsZWN0aW9uU3BlY1R5cGUsXG4gICAgQmxvY2tRdWVyeVNwZWMsXG4gICAgQmxvY2tRdWVyeVNvdXJjZVR5cGUsXG4gICAgQmxvY2tRdWVyeVN1YnNjcmlwdGlvbkNoYW5nZSxcbiAgICBCbG9ja1F1ZXJ5U3Vic2NyaXB0aW9uQ2hhbmdlVHlwZSxcbiAgICBCbG9ja1F1ZXJ5U3Vic2NyaXB0aW9uT25DaGFuZ2VDYWxsYmFjayxcbiAgICBCbG9ja0ZpZWxkU2VsZWN0aW9uU3BlYyxcbn0gZnJvbSAnLi4vdHlwZXMvYmxvY2tfcXVlcnlfc3BlYyc7XG5pbXBvcnQgQWJzdHJhY3RNb2RlbCBmcm9tICcuL2Fic3RyYWN0X21vZGVsJztcbmltcG9ydCBGaWVsZCBmcm9tICcuL2ZpZWxkJztcbmltcG9ydCBPYmplY3RQb29sIGZyb20gJy4vb2JqZWN0X3Bvb2wnO1xuaW1wb3J0IFRhYmxlIGZyb20gJy4vdGFibGUnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCBSZWNvcmRRdWVyeVJlc3VsdCwge1JlY29yZFF1ZXJ5UmVzdWx0T3B0c30gZnJvbSAnLi9yZWNvcmRfcXVlcnlfcmVzdWx0JztcbmltcG9ydCBMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHQgZnJvbSAnLi9saW5rZWRfcmVjb3Jkc19xdWVyeV9yZXN1bHQnO1xuaW1wb3J0IFJlY29yZFN0b3JlIGZyb20gJy4vcmVjb3JkX3N0b3JlJztcbmltcG9ydCB7UXVlcnlNYW5hZ2VyfSBmcm9tICcuL3F1ZXJ5X21hbmFnZXInO1xuaW1wb3J0IFZpZXdEYXRhU3RvcmUgZnJvbSAnLi92aWV3X2RhdGFfc3RvcmUnO1xuXG5jb25zdCBXYXRjaGFibGVSZWNvcmRLZXlzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgbmFtZTogJ25hbWUnIGFzIGNvbnN0LFxuICAgIGNvbW1lbnRDb3VudDogJ2NvbW1lbnRDb3VudCcgYXMgY29uc3QsXG4gICAgLy8gVE9ETyhrYXNyYSk6IHRoZXNlIGtleXMgZG9uJ3QgaGF2ZSBtYXRjaGluZyBnZXR0ZXJzIChub3QgdGhhdCB0aGV5IHNob3VsZFxuICAgIC8vIGl0J3MganVzdCBpbmNvbnNpc3RlbnQuLi4pXG4gICAgY2VsbFZhbHVlczogJ2NlbGxWYWx1ZXMnIGFzIGNvbnN0LFxufSk7XG4vLyBUT0RPOiBsb2FkIGNlbGwgdmFsdWVzIGluIGZpZWxkIHdoZW4gdGhpcyBpcyB3YXRjaGVkPyBUaGlzIHdpbGxcbi8vIGNhdXNlIHRoZSBDZWxsUmVuZGVyZXIgY29tcG9uZW50IHRvIGxvYWQgY2VsbCB2YWx1ZXMsIHdoaWNoIHNlZW1zIG9rYXksXG4vLyBidXQgbmVlZHMgYSBsaXR0bGUgbW9yZSB0aG91Z2h0LlxuY29uc3QgV2F0Y2hhYmxlQ2VsbFZhbHVlSW5GaWVsZEtleVByZWZpeCA9ICdjZWxsVmFsdWVJbkZpZWxkOic7XG4vLyBUT0RPOiBsb2FkIHZpZXcgZGF0YSB3aGVuIHRoaXMgaXMgd2F0Y2hlZC4gc2VlIHByZXZpb3VzIGNvbW1lbnQuXG5jb25zdCBXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCA9ICdjb2xvckluVmlldzonO1xuLyoqXG4gKiBBbnkga2V5IHdpdGhpbiByZWNvcmQgdGhhdCBjYW4gYmUgd2F0Y2hlZDpcbiAqIC0gYCduYW1lJ2BcbiAqIC0gYCdjb21tZW50Q291bnQnYFxuICogLSBgJ2NlbGxWYWx1ZXMnYFxuICogLSBgJ2NlbGxWYWx1ZUluRmllbGQ6JyArIHNvbWVGaWVsZElkYFxuICogLSBgJ2NvbG9ySW5WaWV3OicgKyBzb21lVmlld0lkYFxuICovXG50eXBlIFdhdGNoYWJsZVJlY29yZEtleSA9IE9iamVjdFZhbHVlczx0eXBlb2YgV2F0Y2hhYmxlUmVjb3JkS2V5cz4gfCBzdHJpbmc7XG5cbi8qKlxuICogVE9ETzogKCNwcm9qLWJsb2Nrcy1zZGstcmVjb3JkLWxpbWl0cykgUmVjb3JkIHNob3VsZCBwcm9iYWJseSBub3QgYmUgYW4gQWJzdHJhY3RNb2RlbCxcbiAqIGluIHRoZSBtZWFudGltZSBpdCB3aWxsIHJldHVybiB0cnVlIGlmIGl0J3MgbG9hZGVkLCB0aHJvd2luZy9yZXR1cm5pbmcgbnVsbFxuICogaWYgaXQncyBub3QgbG9hZGVkIChyZXR1cm5pbmcgbnVsbCAvIHRocm93aW5nIGlzIGhvdyBBYnN0cmFjdE1vZGVsIHdvcmtzKS5cbiAqL1xudHlwZSBSZWNvcmRTdG9yZUlzTG9hZGVkID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2lzS2V5U3Vic2NyaWJlYWJsZVZpYVJlY29yZFF1ZXJ5KGtleTogV2F0Y2hhYmxlUmVjb3JkS2V5KTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBXYXRjaGFibGVSZWNvcmRLZXlzLm5hbWU6XG4gICAgICAgIGNhc2UgV2F0Y2hhYmxlUmVjb3JkS2V5cy5jb21tZW50Q291bnQ6XG4gICAgICAgIGNhc2UgV2F0Y2hhYmxlUmVjb3JkS2V5cy5jZWxsVmFsdWVzOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoV2F0Y2hhYmxlQ2VsbFZhbHVlSW5GaWVsZEtleVByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTW9kZWwgY2xhc3MgcmVwcmVzZW50aW5nIGEgcmVjb3JkIGluIGEgdGFibGUuXG4gKlxuICogRG8gbm90IGluc3RhbnRpYXRlLiBZb3UgY2FuIGdldCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBieSBjYWxsaW5nIGB0YWJsZS5zZWxlY3RSZWNvcmRzYFxuICogb3IgYHZpZXcuc2VsZWN0UmVjb3Jkc2AgYW5kIHVzaW5nIHRoZSByZXN1bHRpbmcge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fS5cbiAqXG4gKiBAZG9jc1BhdGggbW9kZWxzL1JlY29yZFxuICovXG5jbGFzcyBSZWNvcmQgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsPFJlY29yZFN0b3JlSXNMb2FkZWQsIFdhdGNoYWJsZVJlY29yZEtleT4ge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX2NsYXNzTmFtZSA9ICdSZWNvcmQnO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX2lzV2F0Y2hhYmxlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc0VudW1WYWx1ZShXYXRjaGFibGVSZWNvcmRLZXlzLCBrZXkpIHx8XG4gICAgICAgICAgICBrZXkuc3RhcnRzV2l0aChXYXRjaGFibGVDZWxsVmFsdWVJbkZpZWxkS2V5UHJlZml4KSB8fFxuICAgICAgICAgICAga2V5LnN0YXJ0c1dpdGgoV2F0Y2hhYmxlQ29sb3JJblZpZXdLZXlQcmVmaXgpXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcGFyZW50UmVjb3JkU3RvcmU6IFJlY29yZFN0b3JlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcGFyZW50VGFibGU6IFRhYmxlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBfcXVlcnlNYW5hZ2VyOiBRdWVyeU1hbmFnZXI7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9fbGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0UG9vbDogT2JqZWN0UG9vbDxcbiAgICAgICAgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0LFxuICAgICAgICB0eXBlb2YgTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0XG4gICAgPjtcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNkazogU2RrLCBwYXJlbnRSZWNvcmRTdG9yZTogUmVjb3JkU3RvcmUsIHBhcmVudFRhYmxlOiBUYWJsZSwgcmVjb3JkSWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihzZGssIHJlY29yZElkKTtcblxuICAgICAgICB0aGlzLl9wYXJlbnRSZWNvcmRTdG9yZSA9IHBhcmVudFJlY29yZFN0b3JlO1xuICAgICAgICB0aGlzLl9wYXJlbnRUYWJsZSA9IHBhcmVudFRhYmxlO1xuICAgICAgICB0aGlzLl9xdWVyeU1hbmFnZXIgPSBzZGsuX3F1ZXJ5TWFuYWdlcjtcbiAgICAgICAgdGhpcy5fX2xpbmtlZFJlY29yZHNRdWVyeVJlc3VsdFBvb2wgPSBuZXcgT2JqZWN0UG9vbChMaW5rZWRSZWNvcmRzUXVlcnlSZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBfZGF0YU9yTnVsbElmRGVsZXRlZCgpOiBSZWNvcmRTdG9yZUlzTG9hZGVkIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRoaXMuX2Jhc2VEYXRhLnRhYmxlc0J5SWRbdGhpcy5wYXJlbnRUYWJsZS5pZF07XG4gICAgICAgIGlmICghdGFibGVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1JlY29yZExvYWRlZCA9IHRoaXMuX3BhcmVudFJlY29yZFN0b3JlLmlzUmVjb3JkTG9hZGVkKHRoaXMuX2lkKTtcbiAgICAgICAgaW52YXJpYW50KGlzUmVjb3JkTG9hZGVkLCAnUmVjb3JkIGRhdGEgaXMgbm90IGxvYWRlZCcpO1xuICAgICAgICBjb25zdCBpc1JlY29yZERlbGV0ZWQgPSB0aGlzLl9wYXJlbnRSZWNvcmRTdG9yZS5pc1JlY29yZERlbGV0ZWQodGhpcy5faWQpO1xuICAgICAgICByZXR1cm4gaXNSZWNvcmREZWxldGVkID8gbnVsbCA6IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2Fzc2VydEV4aXN0c0FuZExvYWRlZCgpOiB2b2lkIHtcbiAgICAgICAgLy8gQWNjZXNzIGRhdGEgaW4gb3JkZXIgdG8gdGhyb3cgaWYgdGhlIFJlY29yZCBoYXMgYmVlbiBkZWxldGVkIC8gaXNuJ3QgbG9hZGVkXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9kYXRhT3JOdWxsSWZEZWxldGVkO1xuICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgdGhpcy5fc3Bhd25FcnJvckZvckRlbGV0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFibGUgdGhhdCB0aGlzIHJlY29yZCBiZWxvbmdzIHRvLiBTaG91bGQgbmV2ZXIgY2hhbmdlIGJlY2F1c2UgcmVjb3JkcyBhcmVuJ3QgbW92ZWQgYmV0d2VlbiB0YWJsZXMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWwgKHNpbmNlIHdlIG1heSBub3QgYmUgYWJsZSB0byByZXR1cm4gcGFyZW50IG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgaW1tdXRhYmxlIG1vZGVscyB3b3JsZClcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHt1c2VSZWNvcmRzfSBmcm9tICdAYWlydGFibGUvYmxvY2tzL3VpJztcbiAgICAgKiBjb25zdCByZWNvcmRzID0gdXNlUmVjb3JkcyhteVRhYmxlKTtcbiAgICAgKiBjb25zb2xlLmxvZyhyZWNvcmRzWzBdLnBhcmVudFRhYmxlLmlkID09PSBteVRhYmxlLmlkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IHBhcmVudFRhYmxlKCk6IFRhYmxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhYmxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZ2V0RmllbGRNYXRjaGluZyhmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lOiBGaWVsZCB8IHN0cmluZyk6IEZpZWxkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50VGFibGUuX19nZXRGaWVsZE1hdGNoaW5nKGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZ2V0Vmlld01hdGNoaW5nKHZpZXdPclZpZXdJZE9yVmlld05hbWU6IFZpZXcgfCBzdHJpbmcpOiBWaWV3IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50VGFibGUuX19nZXRWaWV3TWF0Y2hpbmcodmlld09yVmlld0lkT3JWaWV3TmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICpcbiAgICAgKiBGb3IgdXNlIHdoZW4gd2UgbmVlZCB0aGUgcmF3IHB1YmxpYyBBUEkgY2VsbCB2YWx1ZS4gU3BlY2lmaWNhbGx5IG1ha2VzIGEgZGlmZmVyZW5jZVxuICAgICAqIGZvciBsb29rdXAgZmllbGRzLCB3aGVyZSB3ZSB0cmFuc2xhdGUgdGhlIGZvcm1hdCB0byBhIGJsb2Nrcy1zcGVjaWZpYyBmb3JtYXQgaW4gZ2V0Q2VsbFZhbHVlLlxuICAgICAqIFRoYXQgZm9ybWF0IGlzIGluY29tcGF0aWJsZSB3aXRoIGZpZWxkVHlwZVByb3ZpZGVyIG1ldGhvZHMsIHdoaWNoIGV4cGVjdCB0aGUgcHVibGljIEFQSVxuICAgICAqIGZvcm1hdCAtIHVzZSBfZ2V0UmF3Q2VsbFZhbHVlIGluc3RlYWQuXG4gICAgICovXG4gICAgX2dldFJhd0NlbGxWYWx1ZShmaWVsZDogRmllbGQpOiB1bmtub3duIHtcbiAgICAgICAgdGhpcy5fYXNzZXJ0RXhpc3RzQW5kTG9hZGVkKCk7XG5cbiAgICAgICAgLy8gVE9ETzogKCNwcm9qLWJsb2Nrcy1zZGstcmVjb3JkLWxpbWl0cykgQ29uc2lkZXIgYSBuZXcgQVBJIHRoYXQgYWxsb3dzIGRldGVybWluaW5nXG4gICAgICAgIC8vIGlmIHRoZSBjZWxsIHZhbHVlIGlzIGxvYWRlZCArIGdldHRpbmcgdGhlIGNlbGxWYWx1ZSBpbiBvbmUgY2FsbD9cbiAgICAgICAgY29uc3QgaXNDZWxsVmFsdWVMb2FkZWRGb3JGaWVsZCA9IHRoaXMuX3BhcmVudFJlY29yZFN0b3JlLmlzUmVjb3JkQ2VsbFZhbHVlTG9hZGVkRm9yRmllbGRJZChcbiAgICAgICAgICAgIHRoaXMuX2lkLFxuICAgICAgICAgICAgZmllbGQuaWQsXG4gICAgICAgICk7XG4gICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgIGlzQ2VsbFZhbHVlTG9hZGVkRm9yRmllbGQsXG4gICAgICAgICAgICAnQ2VsbCB2YWx1ZSBmb3IgZmllbGQgJXMgYW5kIHJlY29yZCAlcyBpcyBub3QgbG9hZGVkJyxcbiAgICAgICAgICAgIGZpZWxkLmlkLFxuICAgICAgICAgICAgdGhpcy5faWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gdGhpcy5fcGFyZW50UmVjb3JkU3RvcmUuZ2V0UmVjb3JkQ2VsbFZhbHVlQnlGaWVsZElkKHRoaXMuX2lkLCBmaWVsZC5pZCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjZWxsVmFsdWUgPT09ICdvYmplY3QnICYmIGNlbGxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ29weSBub24tcHJpbWl0aXZlcy5cbiAgICAgICAgICAgIC8vIFRPRE86ICgjcHJvai1ibG9ja3Mtc2RrLXJlY29yZC1saW1pdHMpOiBnZXRSZWNvcmRDZWxsVmFsdWVCeUZpZWxkSWQgcmV0dXJuc1xuICAgICAgICAgICAgLy8gZGVlcGx5IGZyb3plbiBvYmplY3RzLCBpbiBhIGxhdGVyIHNkayB2ZXJzaW9uIHdlIGNhbiBkcm9wIGNsb25pbmcgZGVlcGx5LlxuICAgICAgICAgICAgcmV0dXJuIGNsb25lRGVlcChjZWxsVmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjZWxsIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBmb3IgdGhpcyByZWNvcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSBUaGUgZmllbGQgKG9yIGZpZWxkIElEIG9yIGZpZWxkIG5hbWUpIHdob3NlIGNlbGwgdmFsdWUgeW91J2QgbGlrZSB0byBnZXQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNlbGxWYWx1ZSA9IG15UmVjb3JkLmdldENlbGxWYWx1ZShteVNpbmdsZUxpbmVUZXh0RmllbGQpO1xuICAgICAqIGNvbnNvbGUubG9nKGNlbGxWYWx1ZSk7XG4gICAgICogLy8gPT4gJ2NlbGwgdmFsdWUnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0Q2VsbFZhbHVlKGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWU6IEZpZWxkIHwgRmllbGRJZCB8IHN0cmluZyk6IHVua25vd24ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2dldEZpZWxkTWF0Y2hpbmcoZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSk7XG4gICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHRoaXMuX2dldFJhd0NlbGxWYWx1ZShmaWVsZCk7XG5cbiAgICAgICAgLy8gSEFDSzogbWlncmF0ZSB0byBuZXcgcHVibGljIGxvb2t1cCBjZWxsIHZhbHVlIGZvcm1hdCBpZiBuZWVkZWRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGNlbGxWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGNlbGxWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gRmllbGRUeXBlLk1VTFRJUExFX0xPT0tVUF9WQUxVRVMgJiZcbiAgICAgICAgICAgICF0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS5zZGtJbml0RGF0YS5pc1VzaW5nTmV3TG9va3VwQ2VsbFZhbHVlRm9ybWF0XG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgY2VsbFZhbHVlRm9yTWlncmF0aW9uOiBBcnJheTx7bGlua2VkUmVjb3JkSWQ6IFJlY29yZElkOyB2YWx1ZTogdW5rbm93bn0+ID0gW107XG4gICAgICAgICAgICBpbnZhcmlhbnQoQXJyYXkuaXNBcnJheSgoY2VsbFZhbHVlIGFzIGFueSkubGlua2VkUmVjb3JkSWRzKSwgJ2xpbmtlZFJlY29yZElkcycpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5rZWRSZWNvcmRJZCBvZiAoY2VsbFZhbHVlIGFzIGFueSkubGlua2VkUmVjb3JkSWRzKSB7XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KHR5cGVvZiBsaW5rZWRSZWNvcmRJZCA9PT0gJ3N0cmluZycsICdsaW5rZWRSZWNvcmRJZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHt2YWx1ZXNCeUxpbmtlZFJlY29yZElkfSA9IGNlbGxWYWx1ZSBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc0J5TGlua2VkUmVjb3JkSWQgJiYgdHlwZW9mIHZhbHVlc0J5TGlua2VkUmVjb3JkSWQgPT09ICdvYmplY3QnLFxuICAgICAgICAgICAgICAgICAgICAndmFsdWVzQnlMaW5rZWRSZWNvcmRJZCcsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzQnlMaW5rZWRSZWNvcmRJZFtsaW5rZWRSZWNvcmRJZF07XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFZhbHVlRm9yTWlncmF0aW9uLnB1c2goe2xpbmtlZFJlY29yZElkLCB2YWx1ZTogdn0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbFZhbHVlRm9yTWlncmF0aW9uLnB1c2goe2xpbmtlZFJlY29yZElkLCB2YWx1ZX0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjZWxsVmFsdWVGb3JNaWdyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2VsbFZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjZWxsIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBmb3IgdGhpcyByZWNvcmQsIGZvcm1hdHRlZCBhcyBhIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUgVGhlIGZpZWxkIChvciBmaWVsZCBJRCBvciBmaWVsZCBuYW1lKSB3aG9zZSBjZWxsIHZhbHVlIHlvdSdkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBzdHJpbmdWYWx1ZSA9IG15UmVjb3JkLmdldENlbGxWYWx1ZUFzU3RyaW5nKG15TnVtYmVyRmllbGQpO1xuICAgICAqIGNvbnNvbGUubG9nKHN0cmluZ1ZhbHVlKTtcbiAgICAgKiAvLyA9PiAnNDInXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0Q2VsbFZhbHVlQXNTdHJpbmcoZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZTogRmllbGQgfCBGaWVsZElkIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9nZXRGaWVsZE1hdGNoaW5nKGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUpO1xuXG4gICAgICAgIC8vIGdldFJhd0NlbGxWYWx1ZSBwZXJmb3JtcyBpbnZhcmlhbnQgY2hlY2sgdGhhdCBjZWxsIHZhbHVlIGF0IHRoZSBmaWVsZCBpcyBsb2FkZWRcbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gdGhpcy5fZ2V0UmF3Q2VsbFZhbHVlKGZpZWxkKTtcblxuICAgICAgICBpZiAoY2VsbFZhbHVlID09PSBudWxsIHx8IGNlbGxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhaXJ0YWJsZUludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlO1xuICAgICAgICAgICAgY29uc3QgYXBwSW50ZXJmYWNlID0gdGhpcy5fc2RrLl9fYXBwSW50ZXJmYWNlO1xuICAgICAgICAgICAgcmV0dXJuIGFpcnRhYmxlSW50ZXJmYWNlLmZpZWxkVHlwZVByb3ZpZGVyLmNvbnZlcnRDZWxsVmFsdWVUb1N0cmluZyhcbiAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgY2VsbFZhbHVlLFxuICAgICAgICAgICAgICAgIGZpZWxkLl9kYXRhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgVVJMIHRoYXQgaXMgc3VpdGFibGUgZm9yIHJlbmRlcmluZyBhbiBhdHRhY2htZW50IG9uIHRoZSBjdXJyZW50IGNsaWVudC5cbiAgICAgKiBUaGUgVVJMIHRoYXQgaXMgcmV0dXJuZWQgd2lsbCBvbmx5IHdvcmsgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudElkIFRoZSBJRCBvZiB0aGUgYXR0YWNobWVudC5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudFVybCBUaGUgYXR0YWNobWVudCdzIFVSTCAod2hpY2ggaXMgbm90IHN1aXRhYmxlIGZvciByZW5kZXJpbmcgb24gdGhlIGNsaWVudCkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBSZWNvcmRBdHRhY2htZW50cyhwcm9wcykge1xuICAgICAqICAgICBjb25zdCB7cmVjb3JkLCBhdHRhY2htZW50RmllbGR9ID0gcHJvcHM7XG4gICAgICogICAgIGNvbnN0IGF0dGFjaG1lbnRDZWxsVmFsdWUgPSByZWNvcmQuZ2V0Q2VsbFZhbHVlKGF0dGFjaG1lbnRGaWVsZCk7XG4gICAgICogICAgIGlmIChhdHRhY2htZW50Q2VsbFZhbHVlID09PSBudWxsKSB7XG4gICAgICogICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgKiAgICAgfVxuICAgICAqICAgICByZXR1cm4gKFxuICAgICAqICAgICAgICAgPGRpdj5cbiAgICAgKiAgICAgICAgICAgICB7YXR0YWNobWVudENlbGxWYWx1ZS5tYXAoYXR0YWNobWVudE9iaiA9PiB7XG4gICAgICogICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFVybCA9XG4gICAgICogICAgICAgICAgICAgICAgICAgICByZWNvcmQuZ2V0QXR0YWNobWVudENsaWVudFVybEZyb21DZWxsVmFsdWVVcmwoXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudE9iai5pZCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50T2JqLnVybFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgKiAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIDxpbWcga2V5PXthdHRhY2htZW50T2JqLmlkfSBzcmM9e2NsaWVudFVybH0gd2lkdGg9ezIwMH0gLz5cbiAgICAgKiAgICAgICAgICAgICAgICAgKTtcbiAgICAgKiAgICAgICAgICAgICB9KX1cbiAgICAgKiAgICAgICAgIDwvZGl2PlxuICAgICAqICAgICApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRBdHRhY2htZW50Q2xpZW50VXJsRnJvbUNlbGxWYWx1ZVVybChhdHRhY2htZW50SWQ6IHN0cmluZywgYXR0YWNobWVudFVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYWlydGFibGVJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYXBwSW50ZXJmYWNlID0gdGhpcy5fc2RrLl9fYXBwSW50ZXJmYWNlO1xuICAgICAgICByZXR1cm4gYWlydGFibGVJbnRlcmZhY2UudXJsQ29uc3RydWN0b3IuZ2V0QXR0YWNobWVudENsaWVudFVybChcbiAgICAgICAgICAgIGFwcEludGVyZmFjZSxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRVcmwsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbG9yIG9mIHRoaXMgcmVjb3JkIGluIGEgZ2l2ZW4gdmlldywgb3IgbnVsbCBpZiB0aGUgcmVjb3JkIGhhcyBubyBjb2xvciBpbiB0aGF0XG4gICAgICogdmlldy5cbiAgICAgKlxuICAgICAqIENhbiBiZSB3YXRjaGVkIHdpdGggdGhlICdjb2xvckluVmlldzoke1ZpZXdJZH0nIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aWV3T3JWaWV3SWRPclZpZXdOYW1lIFRoZSB2aWV3IChvciB2aWV3IElEIG9yIHZpZXcgbmFtZSkgdG8gdXNlIGZvciByZWNvcmQgY29sb3JpbmcuXG4gICAgICovXG4gICAgZ2V0Q29sb3JJblZpZXcodmlld09yVmlld0lkT3JWaWV3TmFtZTogVmlldyB8IFZpZXdJZCB8IHN0cmluZyk6IENvbG9yIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl9nZXRWaWV3TWF0Y2hpbmcodmlld09yVmlld0lkT3JWaWV3TmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFJlY29yZFN0b3JlLmdldFZpZXdEYXRhU3RvcmUodmlldy5pZCkuZ2V0UmVjb3JkQ29sb3IodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIENTUyBoZXggc3RyaW5nIGZvciB0aGlzIHJlY29yZCBpbiBhIGdpdmVuIHZpZXcsIG9yIG51bGwgaWYgdGhlIHJlY29yZCBoYXMgbm8gY29sb3JcbiAgICAgKiBpbiB0aGF0IHZpZXcuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgd2F0Y2hlZCB3aXRoIHRoZSAnY29sb3JJblZpZXc6JHtWaWV3SWR9JyBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlld09yVmlld0lkT3JWaWV3TmFtZSBUaGUgdmlldyAob3IgdmlldyBJRCBvciB2aWV3IG5hbWUpIHRvIHVzZSBmb3IgcmVjb3JkIGNvbG9yaW5nLlxuICAgICAqL1xuICAgIGdldENvbG9ySGV4SW5WaWV3KHZpZXdPclZpZXdJZE9yVmlld05hbWU6IFZpZXcgfCBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmdldENvbG9ySW5WaWV3KHZpZXdPclZpZXdJZE9yVmlld05hbWUpO1xuICAgICAgICBpZiAoIWNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3JVdGlscy5nZXRIZXhGb3JDb2xvcihjb2xvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdCByZWNvcmRzIHJlZmVyZW5jZWQgaW4gYSBgbXVsdGlwbGVSZWNvcmRMaW5rc2AgY2VsbCB2YWx1ZS4gUmV0dXJucyBhIHF1ZXJ5IHJlc3VsdFxuICAgICAqIGNvbnRhaW5pbmcgdGhlIHJlY29yZHMgaW4gdGhlIGdpdmVuIGBtdWx0aXBsZVJlY29yZExpbmtzYCBmaWVsZC5cbiAgICAgKiBTZWUge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fSBmb3IgbW9yZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lIFRoZSBgbXVsdGlwbGVSZWNvcmRMaW5rc2AgZmllbGQgKG9yIGZpZWxkIElEIG9yIGZpZWxkIG5hbWUpIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIGZvciB0aGUgcXVlcnksIHN1Y2ggYXMgc29ydHMgYW5kIGZpZWxkcy5cbiAgICAgKi9cbiAgICBzZWxlY3RMaW5rZWRSZWNvcmRzRnJvbUNlbGwoXG4gICAgICAgIGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWU6IEZpZWxkIHwgRmllbGRJZCB8IHN0cmluZyxcbiAgICAgICAgb3B0czogUmVjb3JkUXVlcnlSZXN1bHRPcHRzID0ge30sXG4gICAgKTogTGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9nZXRGaWVsZE1hdGNoaW5nKGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUpO1xuICAgICAgICBjb25zdCBsaW5rZWRUYWJsZUlkID0gZmllbGQub3B0aW9ucyAmJiBmaWVsZC5vcHRpb25zLmxpbmtlZFRhYmxlSWQ7XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgbGlua2VkVGFibGVJZCA9PT0gJ3N0cmluZycsICdsaW5rZWRUYWJsZUlkIG11c3QgYmUgc2V0Jyk7XG5cbiAgICAgICAgY29uc3QgbGlua2VkVGFibGUgPSB0aGlzLl9zZGsuYmFzZS5nZXRUYWJsZUJ5SWQobGlua2VkVGFibGVJZCk7XG4gICAgICAgIGNvbnN0IGxpbmtlZFJlY29yZFN0b3JlID0gdGhpcy5fc2RrLmJhc2UuX19nZXRSZWNvcmRTdG9yZShsaW5rZWRUYWJsZUlkKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkT3B0cyA9IFJlY29yZFF1ZXJ5UmVzdWx0Ll9ub3JtYWxpemVPcHRzKFxuICAgICAgICAgICAgbGlua2VkVGFibGUsXG4gICAgICAgICAgICBsaW5rZWRSZWNvcmRTdG9yZSxcbiAgICAgICAgICAgIG9wdHMsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLl9fbGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0UG9vbC5nZXRPYmplY3RGb3JSZXVzZShcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRPcHRzLFxuICAgICAgICAgICAgdGhpcy5fc2RrLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgYW5kIGxvYWQgcmVjb3JkcyByZWZlcmVuY2VkIGluIGEgYG11bHRpcGxlUmVjb3JkTGlua3NgIGNlbGwgdmFsdWUuIFJldHVybnMgYSBxdWVyeSByZXN1bHRcbiAgICAgKiBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlY29yZHMgaW4gdGhlIGdpdmVuIGBtdWx0aXBsZVJlY29yZExpbmtzYCBmaWVsZC5cbiAgICAgKiBTZWUge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fSBmb3IgbW9yZS5cbiAgICAgKlxuICAgICAqIFJlbWVtYmVyIHRvIGNhbGwgYHF1ZXJ5UmVzdWx0LnVubG9hZERhdGFgIG9uY2UgeW91J3JlIGZpbmlzaGVkIHdpdGggdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUgVGhlIGBtdWx0aXBsZVJlY29yZExpbmtzYCBmaWVsZCAob3IgZmllbGQgSUQgb3IgZmllbGQgbmFtZSkgdG8gdXNlLlxuICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgZm9yIHRoZSBxdWVyeSwgc3VjaCBhcyBzb3J0cyBhbmQgZmllbGRzLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbGVjdExpbmtlZFJlY29yZHNGcm9tQ2VsbEFzeW5jKFxuICAgICAgICBmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lOiBGaWVsZCB8IEZpZWxkSWQgfCBzdHJpbmcsXG4gICAgICAgIG9wdHM6IFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyA9IHt9LFxuICAgICk6IFByb21pc2U8TGlua2VkUmVjb3Jkc1F1ZXJ5UmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gdGhpcy5zZWxlY3RMaW5rZWRSZWNvcmRzRnJvbUNlbGwoZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSwgb3B0cyk7XG4gICAgICAgIGF3YWl0IHF1ZXJ5UmVzdWx0LmxvYWREYXRhQXN5bmMoKTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5UmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgcmVjb3JkLiBZb3UgY2FuIHZpc2l0IHRoaXMgVVJMIGluIHRoZSBicm93c2VyIHRvIGJlIHRha2VuIHRvIHRoZSByZWNvcmQgaW4gdGhlIEFpcnRhYmxlIFVJLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnNvbGUubG9nKG15UmVjb3JkLnVybCk7XG4gICAgICogLy8gPT4gJ2h0dHBzOi8vYWlydGFibGUuY29tL3RibHh4eHh4eHh4eHh4eHh4L3JlY3h4eHh4eHh4eHh4eHh4J1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlLnVybENvbnN0cnVjdG9yLmdldFJlY29yZFVybChcbiAgICAgICAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICB0aGlzLnBhcmVudFRhYmxlLmlkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBjZWxsIHZhbHVlIGluIHRoaXMgcmVjb3JkLCBmb3JtYXR0ZWQgYXMgYSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zb2xlLmxvZyhteVJlY29yZC5uYW1lKTtcbiAgICAgKiAvLyA9PiAnNDInXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2VsbFZhbHVlQXNTdHJpbmcodGhpcy5wYXJlbnRUYWJsZS5wcmltYXJ5RmllbGQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbW1lbnRzIG9uIHRoaXMgcmVjb3JkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvbW1lbnRDb3VudCA9IG15UmVjb3JkLmNvbW1lbnRDb3VudDtcbiAgICAgKiBjb25zdCBpc1Npbmd1bGFyID0gY29tbWVudENvdW50ID09PSAxO1xuICAgICAqIGNvbnNvbGUubG9nKFxuICAgICAqICAgICBgVGhpcyByZWNvcmQgaGFzICR7Y29tbWVudENvdW50fSBjb21tZW50JHtpc1Npbmd1bGFyID8gJycgOiAncyd9YFxuICAgICAqICk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGNvbW1lbnRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICB0aGlzLl9hc3NlcnRFeGlzdHNBbmRMb2FkZWQoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UmVjb3JkU3RvcmUuZ2V0UmVjb3JkQ29tbWVudENvdW50KHRoaXMuX2lkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNyZWF0ZWQgdGltZSBvZiB0aGlzIHJlY29yZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zb2xlLmxvZyhgXG4gICAgICogICAgIFRoaXMgcmVjb3JkIHdhcyBjcmVhdGVkIGF0ICR7bXlSZWNvcmQuY3JlYXRlZFRpbWUudG9JU09TdHJpbmcoKX1cbiAgICAgKiBgKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgY3JlYXRlZFRpbWUoKTogRGF0ZSB7XG4gICAgICAgIHRoaXMuX2Fzc2VydEV4aXN0c0FuZExvYWRlZCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRSZWNvcmRTdG9yZS5nZXRSZWNvcmRDcmVhdGVkVGltZSh0aGlzLl9pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NvbnN0cnVjdEJsb2NrRmllbGRTZWxlY3Rpb25TcGVjKGZpZWxkU2VsZWN0aW9uOiBCbG9ja0ZpZWxkU2VsZWN0aW9uU3BlYyk6IEJsb2NrUXVlcnlTcGVjIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVR5cGU6IEJsb2NrUXVlcnlTb3VyY2VUeXBlLlRBQkxFLFxuICAgICAgICAgICAgc291cmNlVGFibGVJZDogdGhpcy5wYXJlbnRUYWJsZS5pZCxcbiAgICAgICAgICAgIHJlY29yZFNlbGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIHJlY29yZElkczogW3RoaXMuaWRdLFxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZmluZE1hdGNoaW5nQmxvY2tTdWJzY3JpcHRpb25DaGFuZ2VzKFxuICAgICAgICBjaGFuZ2VzOiBBcnJheTxCbG9ja1F1ZXJ5U3Vic2NyaXB0aW9uQ2hhbmdlPixcbiAgICAgICAgY2hhbmdlVHlwZVRvTWF0Y2g6IEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2VUeXBlLFxuICAgICk6IEFycmF5PEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2U+IHtcbiAgICAgICAgcmV0dXJuIGNoYW5nZXMuZmlsdGVyKFxuICAgICAgICAgICAgY2hhbmdlID0+IGNoYW5nZS50eXBlID09PSBjaGFuZ2VUeXBlVG9NYXRjaCAmJiBjaGFuZ2UudGFibGVJZCA9PT0gdGhpcy5wYXJlbnRUYWJsZS5pZCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfY29uc3RydWN0QmxvY2tRdWVyeVNwZWNBbmRDYWxsYmFja0ZvcldhdGNoYWJsZUtleShcbiAgICAgICAga2V5OiBXYXRjaGFibGVSZWNvcmRLZXksXG4gICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uOiBGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IHVua25vd24gfCBudWxsLFxuICAgICk6IHtcbiAgICAgICAgcXVlcnlTcGVjVG9TdWJzY3JpYmVXaXRoOiBCbG9ja1F1ZXJ5U3BlYztcbiAgICAgICAgb25DaGFuZ2VDYWxsYmFjazogQmxvY2tRdWVyeVN1YnNjcmlwdGlvbk9uQ2hhbmdlQ2FsbGJhY2s7XG4gICAgfSB7XG4gICAgICAgIGxldCBmaWVsZFNlbGVjdGlvbkRlZmluaXRpb246IEJsb2NrRmllbGRTZWxlY3Rpb25TcGVjO1xuICAgICAgICBsZXQgb25DaGFuZ2VDYWxsYmFjazogQmxvY2tRdWVyeVN1YnNjcmlwdGlvbk9uQ2hhbmdlQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFja0ZvclJlZ2lzdHJhdGlvbi5jYWxsKGNvbnRleHQsIHRoaXMsIGtleSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgV2F0Y2hhYmxlUmVjb3JkS2V5cy5uYW1lOlxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQmxvY2tGaWVsZFNlbGVjdGlvblNwZWNUeXBlLlNQRUNJRklFRF9GSUVMRFMsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkSWRzOiBbdGhpcy5wYXJlbnRUYWJsZS5wcmltYXJ5RmllbGQuaWRdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdhdGNoYWJsZVJlY29yZEtleXMuY29tbWVudENvdW50OlxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQmxvY2tGaWVsZFNlbGVjdGlvblNwZWNUeXBlLlNQRUNJRklFRF9GSUVMRFMsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkSWRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSW5jbHVkZUNvbW1lbnRDb3VudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBXYXRjaGFibGVSZWNvcmRLZXlzLmNlbGxWYWx1ZXM6XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogKCNwcm9qLWJsb2Nrcy1zZGstcmVjb3JkLWxpbWl0cykgSW4gdGhlIGZ1dHVyZSBkb24ndCBmZXRjaCBhbGwgZmllbGRzIGZyb20gdGFibGVcbiAgICAgICAgICAgICAgICAvLyBvbGQgY29kZSBleGhpYml0IHRoaXMgYmVoYXZpb3IgdGhvdWdoOiBodHRwczovL2dpdGh1Yi5jb20vSHlwZXJiYXNlL2Jsb2Nrcy1zZGsvYmxvYi9hYmE2ZmE3YjdmOGNjYzFlMzY0YjQwOWNhNDY2ZDAyODFmOGU5YTY5L3BhY2thZ2VzL3Nkay9zcmMvbW9kZWxzL3JlY29yZC50cyNMNDE0LUw0MTZcbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgZnV0dXJlIGEgXCJzdWJzY3JpYmUgdG8gdXBkYXRlcywgYnV0IGRvbid0IGZldGNoIG1vcmUgZGF0YVwiIG1pZ2h0IGJlIHVzZWZ1bCBoZXJlLlxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQmxvY2tGaWVsZFNlbGVjdGlvblNwZWNUeXBlLkFMTF9GSUVMRFNfRlJPTV9UQUJMRSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgb25DaGFuZ2VDYWxsYmFjayA9IChjaGFuZ2VzOiBBcnJheTxCbG9ja1F1ZXJ5U3Vic2NyaXB0aW9uQ2hhbmdlPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZENlbGxWYWx1ZXNDaGFuZ2VzID0gdGhpcy5fZmluZE1hdGNoaW5nQmxvY2tTdWJzY3JpcHRpb25DaGFuZ2VzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2VUeXBlLk1PRElGSUVEX0NFTExfVkFMVUVTX0ZPUl9UQUJMRSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgY3VycmVudGx5IHNpbXVsYXRlIFwib24gbG9hZFwiIGNhbGxiYWNrIGZvciByZWdpc3RyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHN0aWxsIGhhbmRsZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkQ2VsbFZhbHVlc0NoYW5nZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0ZvclJlZ2lzdHJhdGlvbi5jYWxsKGNvbnRleHQsIHRoaXMsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGRJZHNNb2RpZmllZDogQXJyYXk8RmllbGRJZD4gPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1vZGlmaWVkQ2VsbFZhbHVlc0NoYW5nZSBvZiBtb2RpZmllZENlbGxWYWx1ZXNDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRDZWxsVmFsdWVzQ2hhbmdlLnR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2VUeXBlLk1PRElGSUVEX0NFTExfVkFMVUVTX0ZPUl9UQUJMRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTW9kaWZpZWQgY2VsbCB2YWx1ZSBjaGFuZ2UgaXMgbm90IGEgc3VwcG9ydGVkIHR5cGUgaW4gcmVjb3JkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7ZmllbGRJZHNCeVJlY29yZElkfSA9IG1vZGlmaWVkQ2VsbFZhbHVlc0NoYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkSWRzRm9yVGhpc1JlY29yZCA9IGZpZWxkSWRzQnlSZWNvcmRJZFt0aGlzLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZElkc0ZvclRoaXNSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkc01vZGlmaWVkID0gZmllbGRJZHNNb2RpZmllZC5jb25jYXQoZmllbGRJZHNGb3JUaGlzUmVjb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uLmNhbGwoY29udGV4dCwgdGhpcywga2V5LCBmaWVsZElkc01vZGlmaWVkKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIFRoZSBlbHNlIGNhc2VzIHNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIHJlYWNoIC0gdGhleSBpbmRpY2F0ZSBhIFNESyBlcnJvci5cbiAgICAgICAgICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChXYXRjaGFibGVDZWxsVmFsdWVJbkZpZWxkS2V5UHJlZml4KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZElkID0ga2V5LnN1YnN0cmluZyhXYXRjaGFibGVDZWxsVmFsdWVJbkZpZWxkS2V5UHJlZml4Lmxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgZmllbGRJZCBpcyB2YWxpZGx5IGZvcm1hdHRlZCwgbm90IHRoYXQgaXQgaXMgYSB2YWxpZCBmaWVsZElkIGluIHRoaXMgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNGaWVsZElkKGZpZWxkSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpZWxkSWQgcGFzc2VkIGFzIHdhdGNoYWJsZSBmaWVsZElkIGlzIG5vdCBhIHZhbGlkIGZvcm1hdCcgKyBmaWVsZElkLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEJsb2NrRmllbGRTZWxlY3Rpb25TcGVjVHlwZS5TUEVDSUZJRURfRklFTERTLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZHM6IFtmaWVsZElkXSxcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZUNhbGxiYWNrID0gKGNoYW5nZXM6IEFycmF5PEJsb2NrUXVlcnlTdWJzY3JpcHRpb25DaGFuZ2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZCBjaGVjayBpZiBzb21ldGhpbmcgZWxzZSBjaGFuZ2VkIGluIHRoZSBjaGFuZ2VzIGFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG91ciBxdWVyeSBzdWJzY3JpcHRpb24gaXMgdGFyZ2V0aW5nIG9ubHkgdGhlIGZpZWxkIGluIHRoaXMgcmVjb3JkXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0ZvclJlZ2lzdHJhdGlvbi5jYWxsKGNvbnRleHQsIHRoaXMsIGtleSwgZmllbGRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCBtdXN0IGJlIGhhbmRsZWQgb3V0c2lkZSBvZiBxdWVyeSBzeXN0ZW0nLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoJ2ludmFsaWQgcmVjb3JkICh1bil3YXRjaCBrZXkgJXMnLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeVNwZWNUb1N1YnNjcmliZVdpdGg6IHRoaXMuX2NvbnN0cnVjdEJsb2NrRmllbGRTZWxlY3Rpb25TcGVjKFxuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0aW9uRGVmaW5pdGlvbixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBvbkNoYW5nZUNhbGxiYWNrLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIHdhdGNoKFxuICAgICAgICBrZXlzOiBXYXRjaGFibGVSZWNvcmRLZXkgfCBSZWFkb25seUFycmF5PFdhdGNoYWJsZVJlY29yZEtleT4sXG4gICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uOiBGbG93QW55RnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ/OiBGbG93QW55T2JqZWN0IHwgbnVsbCxcbiAgICApOiBBcnJheTxXYXRjaGFibGVSZWNvcmRLZXk+IHtcbiAgICAgICAgY29uc3QgdmFsaWRLZXlzID0gdGhpcy5fZ2V0V2F0Y2hhYmxlVmFsaWRLZXlzT3JUaHJvdyhrZXlzLCAnd2F0Y2gnKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGlmIChfaXNLZXlTdWJzY3JpYmVhYmxlVmlhUmVjb3JkUXVlcnkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlTcGVjVG9TdWJzY3JpYmVXaXRoLFxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZUNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIH0gPSB0aGlzLl9jb25zdHJ1Y3RCbG9ja1F1ZXJ5U3BlY0FuZENhbGxiYWNrRm9yV2F0Y2hhYmxlS2V5KFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVlcnlNYW5hZ2VyLndhdGNoV2l0aFF1ZXJ5U3BlYyhcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlTcGVjVG9TdWJzY3JpYmVXaXRoLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlQ2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIHJlZ3VsYXIgd2F0Y2ggbG9naWNcblxuICAgICAgICAgICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgICAgICAgICAga2V5LnN0YXJ0c1dpdGgoV2F0Y2hhYmxlQ29sb3JJblZpZXdLZXlQcmVmaXgpLFxuICAgICAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCBrZXkgaW4gd2F0Y2g6ICVzJyxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld0lkID0ga2V5LnN1YnN0cmluZyhXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeC5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50UmVjb3JkU3RvcmVcbiAgICAgICAgICAgICAgICAgICAgLmdldFZpZXdEYXRhU3RvcmUodmlld0lkKVxuICAgICAgICAgICAgICAgICAgICAud2F0Y2goJ3JlY29yZENvbG9ycycsIHRoaXMuX29uUmVjb3JkQ29sb3JDaGFuZ2UpO1xuXG4gICAgICAgICAgICAgICAgc3VwZXIud2F0Y2goa2V5LCBjYWxsYmFja0ZvclJlZ2lzdHJhdGlvbiwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsaWRLZXlzO1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIHVud2F0Y2goXG4gICAgICAgIGtleXM6IFdhdGNoYWJsZVJlY29yZEtleSB8IFJlYWRvbmx5QXJyYXk8V2F0Y2hhYmxlUmVjb3JkS2V5PixcbiAgICAgICAgY2FsbGJhY2tGb3JSZWdpc3RyYXRpb246IEZsb3dBbnlGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IEZsb3dBbnlPYmplY3QgfCBudWxsLFxuICAgICk6IEFycmF5PFdhdGNoYWJsZVJlY29yZEtleT4ge1xuICAgICAgICAvLyBXZSB3YXJuIGluc3RlYWQgb2YgdGhyb3cgaGVyZSBiZWNhdXNlIHdlIHVzZWQgdG8gd2FybiBpbnN0ZWFkIG9mIHRocm93IGFuZCBkb24ndFxuICAgICAgICAvLyB3YW50IHRvIG1ha2UgYSBicmVha2luZyBjaGFuZ2UuXG4gICAgICAgIGNvbnN0IHZhbGlkS2V5cyA9IHRoaXMuX2dldFdhdGNoYWJsZVZhbGlkS2V5c09yVGhyb3coa2V5cywgJ3Vud2F0Y2gnLCB0cnVlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGlmIChfaXNLZXlTdWJzY3JpYmVhYmxlVmlhUmVjb3JkUXVlcnkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXJ5TWFuYWdlci51bndhdGNoRnJvbVF1ZXJ5S2V5KGtleSwgY2FsbGJhY2tGb3JSZWdpc3RyYXRpb24sIGNvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmYWxsYmFjayB0byByZWd1bGFyIHdhdGNoIGxvZ2ljXG4gICAgICAgICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgICAgICAgICBrZXkuc3RhcnRzV2l0aChXYXRjaGFibGVDb2xvckluVmlld0tleVByZWZpeCksXG4gICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGtleSBpbiB1bndhdGNoOiAlcycsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdJZCA9IGtleS5zdWJzdHJpbmcoV2F0Y2hhYmxlQ29sb3JJblZpZXdLZXlQcmVmaXgubGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudFJlY29yZFN0b3JlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRWaWV3RGF0YVN0b3JlKHZpZXdJZClcbiAgICAgICAgICAgICAgICAgICAgLnVud2F0Y2goJ3JlY29yZENvbG9ycycsIHRoaXMuX29uUmVjb3JkQ29sb3JDaGFuZ2UpO1xuXG4gICAgICAgICAgICAgICAgc3VwZXIudW53YXRjaChrZXksIGNhbGxiYWNrRm9yUmVnaXN0cmF0aW9uLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWxpZEtleXM7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vblJlY29yZENvbG9yQ2hhbmdlID0gKFxuICAgICAgICB2aWV3RGF0YVN0b3JlOiBWaWV3RGF0YVN0b3JlLFxuICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgcmVjb3JkSWRzOiBBcnJheTxSZWNvcmRJZD4sXG4gICAgKSA9PiB7XG4gICAgICAgIGlmIChyZWNvcmRJZHMuaW5jbHVkZXModGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKFdhdGNoYWJsZUNvbG9ySW5WaWV3S2V5UHJlZml4ICsgdmlld0RhdGFTdG9yZS52aWV3SWQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVjb3JkO1xuIl19
@@ -114,4 +114,5 @@ var modes = {
114
114
  }
115
115
 
116
116
  };
117
- exports.modes = modes;
117
+ exports.modes = modes;
118
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvcmVjb3JkX2NvbG9yaW5nLnRzIl0sIm5hbWVzIjpbIk1vZGVUeXBlcyIsIk5PTkUiLCJCWV9TRUxFQ1RfRklFTEQiLCJCWV9WSUVXIiwic2VyaWFsaXplIiwibW9kZSIsInJlc3VsdCIsInR5cGUiLCJzZWxlY3RGaWVsZCIsImlkIiwidmlldyIsIm1vZGVzIiwibm9uZSIsImJ5U2VsZWN0RmllbGQiLCJieVZpZXciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFBd0Q7QUFLeEQ7O0FBQ0E7Ozs7OztBQU1PLElBQU1BLFNBQVMsR0FBRztBQUNyQjs7O0FBR0FDLEVBQUFBLElBQUksRUFBRSxNQUplOztBQUtyQjs7O0FBR0FDLEVBQUFBLGVBQWUsRUFBRSxlQVJJOztBQVNyQjs7O0FBR0FDLEVBQUFBLE9BQU8sRUFBRTtBQVpZLENBQWxCO0FBZVA7Ozs7OztBQWlDTyxJQUFNQyxTQUFTLEdBQUlDLElBQUQsSUFBMkI7QUFDaEQsTUFBSUMsTUFBTSxHQUFHRCxJQUFJLENBQUNFLElBQWxCOztBQUNBLE1BQUlGLElBQUksQ0FBQ0UsSUFBTCxLQUFjUCxTQUFTLENBQUNFLGVBQTVCLEVBQTZDO0FBQ3pDSSxJQUFBQSxNQUFNLGVBQVFELElBQUksQ0FBQ0csV0FBTCxDQUFpQkMsRUFBekIsQ0FBTjtBQUNILEdBRkQsTUFFTyxJQUFJSixJQUFJLENBQUNFLElBQUwsS0FBY1AsU0FBUyxDQUFDRyxPQUE1QixFQUFxQztBQUN4Q0csSUFBQUEsTUFBTSxlQUFRRCxJQUFJLENBQUNLLElBQUwsQ0FBVUQsRUFBbEIsQ0FBTjtBQUNIOztBQUNELFNBQU9ILE1BQVA7QUFDSCxDQVJNO0FBVVA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJPLElBQU1LLEtBQUssR0FBRztBQUNqQjs7Ozs7QUFLQUMsRUFBQUEsSUFBSSxHQUFzQjtBQUN0QixXQUFPO0FBQ0hMLE1BQUFBLElBQUksRUFBRVAsU0FBUyxDQUFDQztBQURiLEtBQVA7QUFHSCxHQVZnQjs7QUFXakI7Ozs7OztBQU1BWSxFQUFBQSxhQUFhLENBQUNMLFdBQUQsRUFBbUQ7QUFDNUQsV0FBTztBQUNIRCxNQUFBQSxJQUFJLEVBQUVQLFNBQVMsQ0FBQ0UsZUFEYjtBQUVITSxNQUFBQTtBQUZHLEtBQVA7QUFJSCxHQXRCZ0I7O0FBdUJqQjs7Ozs7O0FBTUFNLEVBQUFBLE1BQU0sQ0FBQ0osSUFBRCxFQUFvQztBQUN0QyxXQUFPO0FBQ0hILE1BQUFBLElBQUksRUFBRVAsU0FBUyxDQUFDRyxPQURiO0FBRUhPLE1BQUFBO0FBRkcsS0FBUDtBQUlIOztBQWxDZ0IsQ0FBZCIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzOiBSZWNvcmQgQ29sb3JpbmcgKi8gLyoqICovXG5pbXBvcnQge09iamVjdFZhbHVlc30gZnJvbSAnLi4vcHJpdmF0ZV91dGlscyc7XG5pbXBvcnQgRmllbGQgZnJvbSAnLi9maWVsZCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG4vLyBUT0RPKGVtbWEpOiB1cGRhdGUgdGhpcyB0byBiZSBhbiBlbnVtXG4vKipcbiAqIEFuIGVudW0gb2YgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB7QGxpbmsgcmVjb3JkQ29sb3JpbmcubW9kZXN9XG4gKlxuICogQGhpZGRlblxuICogQGFsaWFzIHJlY29yZENvbG9yaW5nLk1vZGVUeXBlc1xuICovXG5leHBvcnQgY29uc3QgTW9kZVR5cGVzID0ge1xuICAgIC8qKlxuICAgICAqIEBhbGlhcyByZWNvcmRDb2xvcmluZy5Nb2RlVHlwZXMuTk9ORVxuICAgICAqL1xuICAgIE5PTkU6ICdub25lJyBhcyBjb25zdCxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgcmVjb3JkQ29sb3JpbmcuTW9kZVR5cGVzLkJZX1NFTEVDVF9GSUVMRFxuICAgICAqL1xuICAgIEJZX1NFTEVDVF9GSUVMRDogJ2J5U2VsZWN0RmllbGQnIGFzIGNvbnN0LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyByZWNvcmRDb2xvcmluZy5Nb2RlVHlwZXMuQllfVklFV1xuICAgICAqL1xuICAgIEJZX1ZJRVc6ICdieVZpZXcnIGFzIGNvbnN0LFxufTtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB0eXBlIFJlY29yZENvbG9yTW9kZVR5cGUgPSBPYmplY3RWYWx1ZXM8dHlwZW9mIE1vZGVUeXBlcz47XG5cbi8qKiAqL1xuaW50ZXJmYWNlIE5vUmVjb3JkQ29sb3JNb2RlIHtcbiAgICAvKiogKi9cbiAgICB0eXBlOiB0eXBlb2YgTW9kZVR5cGVzLk5PTkU7XG59XG5cbi8qKiAqL1xuaW50ZXJmYWNlIEJ5U2VsZWN0RmllbGRSZWNvcmRDb2xvck1vZGUge1xuICAgIC8qKiAqL1xuICAgIHR5cGU6IHR5cGVvZiBNb2RlVHlwZXMuQllfU0VMRUNUX0ZJRUxEO1xuICAgIC8qKiAqL1xuICAgIHNlbGVjdEZpZWxkOiBGaWVsZDtcbn1cblxuLyoqICovXG5pbnRlcmZhY2UgQnlWaWV3UmVjb3JkQ29sb3JNb2RlIHtcbiAgICAvKiogKi9cbiAgICB0eXBlOiB0eXBlb2YgTW9kZVR5cGVzLkJZX1ZJRVc7XG4gICAgLyoqICovXG4gICAgdmlldzogVmlldztcbn1cblxuLyoqICovXG5leHBvcnQgdHlwZSBSZWNvcmRDb2xvck1vZGUgPVxuICAgIHwgTm9SZWNvcmRDb2xvck1vZGVcbiAgICB8IEJ5U2VsZWN0RmllbGRSZWNvcmRDb2xvck1vZGVcbiAgICB8IEJ5Vmlld1JlY29yZENvbG9yTW9kZTtcblxuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZSA9IChtb2RlOiBSZWNvcmRDb2xvck1vZGUpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gbW9kZS50eXBlO1xuICAgIGlmIChtb2RlLnR5cGUgPT09IE1vZGVUeXBlcy5CWV9TRUxFQ1RfRklFTEQpIHtcbiAgICAgICAgcmVzdWx0ICs9IGAtJHttb2RlLnNlbGVjdEZpZWxkLmlkfWA7XG4gICAgfSBlbHNlIGlmIChtb2RlLnR5cGUgPT09IE1vZGVUeXBlcy5CWV9WSUVXKSB7XG4gICAgICAgIHJlc3VsdCArPSBgLSR7bW9kZS52aWV3LmlkfWA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFJlY29yZCBjb2xvcmluZyBjb25maWcgY3JlYXRvcnMuXG4gKlxuICogQGFsaWFzIHJlY29yZENvbG9yaW5nLm1vZGVzXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIGltcG9ydCB7cmVjb3JkQ29sb3Jpbmd9IGZyb20gJ0BhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzJztcbiAqIGltcG9ydCB7dXNlUmVjb3Jkc30gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy91aSc7XG4gKlxuICogLy8gbm8gcmVjb3JkIGNvbG9yaW5nOlxuICogY29uc3QgcmVjb3JkQ29sb3JNb2RlID0gcmVjb3JkQ29sb3JpbmcubW9kZXMubm9uZSgpO1xuICogLy8gY29sb3IgYnkgc2VsZWN0IGZpZWxkOlxuICogY29uc3QgcmVjb3JkQ29sb3JNb2RlID0gcmVjb3JkQ29sb3JpbmcubW9kZXMuYnlTZWxlY3RGaWVsZChzb21lU2VsZWN0RmllbGQpO1xuICogLy8gY29sb3IgZnJvbSB2aWV3OlxuICogY29uc3QgcmVjb3JkQ29sb3JNb2RlID0gcmVjb3JkQ29sb3JpbmcubW9kZXMuYnlWaWV3KHNvbWVWaWV3KTtcbiAqXG4gKiAvLyB3aXRoIHVzZVJlY29yZHM6XG4gKiBjb25zdCBxdWVyeVJlc3VsdCA9IHVzZVJlY29yZHModGFibGUsIHsgcmVjb3JkQ29sb3JNb2RlIH0pXG4gKlxuICogLy8gd2l0aCBhIHF1ZXJ5IHJlc3VsdDpcbiAqIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gdGFibGUuc2VsZWN0UmVjb3Jkcyh7IHJlY29yZENvbG9yTW9kZSB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgbW9kZXMgPSB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBSZWNvcmRDb2xvck1vZGV9IHRoYXQgcmVwcmVzZW50cyBubyByZWNvcmQgY29sb3JpbmcuXG4gICAgICpcbiAgICAgKiBAYWxpYXMgcmVjb3JkQ29sb3JpbmcubW9kZXMubm9uZVxuICAgICAqL1xuICAgIG5vbmUoKTogTm9SZWNvcmRDb2xvck1vZGUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogTW9kZVR5cGVzLk5PTkUsXG4gICAgICAgIH07XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFJlY29yZENvbG9yTW9kZX0gdGhhdCBjb2xvcnMgcmVjb3JkcyBieSB0aGUgc3BlY2lmaWVkIFNlbGVjdCBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBhbGlhcyByZWNvcmRDb2xvcmluZy5tb2Rlcy5ieVNlbGVjdEZpZWxkXG4gICAgICogQHBhcmFtIHNlbGVjdEZpZWxkXG4gICAgICovXG4gICAgYnlTZWxlY3RGaWVsZChzZWxlY3RGaWVsZDogRmllbGQpOiBCeVNlbGVjdEZpZWxkUmVjb3JkQ29sb3JNb2RlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IE1vZGVUeXBlcy5CWV9TRUxFQ1RfRklFTEQsXG4gICAgICAgICAgICBzZWxlY3RGaWVsZCxcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgUmVjb3JkQ29sb3JNb2RlfSB0aGF0IGNvbG9ycyByZWNvcmRzIGJ5IHRoZSBzcGVjaWZpZWQgVmlldy5cbiAgICAgKlxuICAgICAqIEBhbGlhcyByZWNvcmRDb2xvcmluZy5tb2Rlcy5ieVZpZXdcbiAgICAgKiBAcGFyYW0gdmlld1xuICAgICAqL1xuICAgIGJ5Vmlldyh2aWV3OiBWaWV3KTogQnlWaWV3UmVjb3JkQ29sb3JNb2RlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IE1vZGVUeXBlcy5CWV9WSUVXLFxuICAgICAgICAgICAgdmlldyxcbiAgICAgICAgfTtcbiAgICB9LFxufTtcbiJdfQ==