@worktile/theia 18.0.16 → 19.0.0

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 (367) hide show
  1. package/constants/node-types.d.ts +1 -0
  2. package/core/toolbar-item/base-toolbar-item.d.ts +2 -2
  3. package/fesm2022/worktile-theia.mjs +262 -281
  4. package/fesm2022/worktile-theia.mjs.map +1 -1
  5. package/package.json +4 -6
  6. package/plugins/code/code.component.scss +1 -2
  7. package/plugins/image/image.component.d.ts +1 -1
  8. package/plugins/mention/suggestion.component.d.ts +1 -1
  9. package/esm2022/components/action/prevent-default.mjs +0 -21
  10. package/esm2022/components/column-resize/column-resize-notifier.mjs +0 -31
  11. package/esm2022/components/column-resize/column-resize.directive.mjs +0 -124
  12. package/esm2022/components/column-resize/event-dispatcher.mjs +0 -56
  13. package/esm2022/components/column-resize/overlay-handle.component.mjs +0 -144
  14. package/esm2022/components/column-resize/resize-ref.mjs +0 -26
  15. package/esm2022/components/column-resize/resizing.store.mjs +0 -92
  16. package/esm2022/components/column-resize/selectors.mjs +0 -4
  17. package/esm2022/components/contextmenu/contextmenu.component.mjs +0 -99
  18. package/esm2022/components/conversion-hint/conversion-hint.component.mjs +0 -56
  19. package/esm2022/components/element/element.component.mjs +0 -23
  20. package/esm2022/components/index.mjs +0 -24
  21. package/esm2022/components/inline-toolbar/inline-toolbar.component.mjs +0 -131
  22. package/esm2022/components/listbox/listbox.mjs +0 -380
  23. package/esm2022/components/listbox/listbox.type.mjs +0 -5
  24. package/esm2022/components/plugin-menu/plugin-menu.component.mjs +0 -272
  25. package/esm2022/components/table-select/table-select.component.mjs +0 -49
  26. package/esm2022/components/template/template.component.mjs +0 -62
  27. package/esm2022/components/text/text.component.mjs +0 -57
  28. package/esm2022/components/toolbar/toolbar.component.mjs +0 -262
  29. package/esm2022/components/toolbar-dropdown/toolbar-dropdown.component.mjs +0 -137
  30. package/esm2022/components/toolbar-group/toolbar-group.component.mjs +0 -125
  31. package/esm2022/components/toolbar-item/toolbar-item.component.mjs +0 -80
  32. package/esm2022/constants/auto-format-rules.mjs +0 -167
  33. package/esm2022/constants/code.mjs +0 -85
  34. package/esm2022/constants/color-select.mjs +0 -3
  35. package/esm2022/constants/default.mjs +0 -11
  36. package/esm2022/constants/error.mjs +0 -7
  37. package/esm2022/constants/index.mjs +0 -9
  38. package/esm2022/constants/node-types.mjs +0 -136
  39. package/esm2022/constants/plugin-menu.mjs +0 -311
  40. package/esm2022/constants/selector.mjs +0 -3
  41. package/esm2022/constants/toolbar.mjs +0 -53
  42. package/esm2022/core/create-plugin.mjs +0 -5
  43. package/esm2022/core/create-toolbar.mjs +0 -55
  44. package/esm2022/core/index.mjs +0 -6
  45. package/esm2022/core/toolbar-item/base-toolbar-item.mjs +0 -95
  46. package/esm2022/core/utils/combine-plugins.mjs +0 -10
  47. package/esm2022/core/utils/flatten-deep-plugins.mjs +0 -19
  48. package/esm2022/core/utils/get-plugin-options.mjs +0 -3
  49. package/esm2022/core/utils/get-plugin.mjs +0 -2
  50. package/esm2022/core/utils/get-plugins.mjs +0 -4
  51. package/esm2022/core/utils/index.mjs +0 -12
  52. package/esm2022/core/utils/merge-array.mjs +0 -18
  53. package/esm2022/core/utils/merge-deep-plugins.mjs +0 -14
  54. package/esm2022/core/utils/merge-options.mjs +0 -25
  55. package/esm2022/core/utils/nested-structure-by-key.mjs +0 -11
  56. package/esm2022/core/utils/plugin-menu.mjs +0 -63
  57. package/esm2022/core/utils/plugins-by-key.mjs +0 -10
  58. package/esm2022/core/with-theia.mjs +0 -25
  59. package/esm2022/custom-types.mjs +0 -2
  60. package/esm2022/editor.component.mjs +0 -488
  61. package/esm2022/editor.module.mjs +0 -18
  62. package/esm2022/i18n/i18n.mjs +0 -10
  63. package/esm2022/i18n/i18n.service.mjs +0 -46
  64. package/esm2022/i18n/i18n.token.mjs +0 -9
  65. package/esm2022/i18n/index.mjs +0 -10
  66. package/esm2022/i18n/locales/de-de.mjs +0 -102
  67. package/esm2022/i18n/locales/en-us.mjs +0 -102
  68. package/esm2022/i18n/locales/ja-jp.mjs +0 -102
  69. package/esm2022/i18n/locales/ru-ru.mjs +0 -102
  70. package/esm2022/i18n/locales/zh-hans.mjs +0 -102
  71. package/esm2022/i18n/locales/zh-hant.mjs +0 -102
  72. package/esm2022/interfaces/auto-format.mjs +0 -2
  73. package/esm2022/interfaces/editor.mjs +0 -26
  74. package/esm2022/interfaces/element.mjs +0 -2
  75. package/esm2022/interfaces/image.mjs +0 -3
  76. package/esm2022/interfaces/index.mjs +0 -11
  77. package/esm2022/interfaces/plugins/index.mjs +0 -6
  78. package/esm2022/interfaces/plugins/no-infer.mjs +0 -2
  79. package/esm2022/interfaces/plugins/plugin-key.mjs +0 -42
  80. package/esm2022/interfaces/plugins/plugin-menu.mjs +0 -19
  81. package/esm2022/interfaces/plugins/plugins.mjs +0 -2
  82. package/esm2022/interfaces/plugins/with-override.mjs +0 -2
  83. package/esm2022/interfaces/preset.mjs +0 -3
  84. package/esm2022/interfaces/reset-block-type-plugin-options.mjs +0 -2
  85. package/esm2022/interfaces/toolbar.mjs +0 -12
  86. package/esm2022/interfaces/upload.mjs +0 -2
  87. package/esm2022/interfaces/utility/index.mjs +0 -4
  88. package/esm2022/interfaces/utility/nested-structure-by-key.mjs +0 -2
  89. package/esm2022/interfaces/utility/override-by-key.mjs +0 -2
  90. package/esm2022/interfaces/utility/types.mjs +0 -2
  91. package/esm2022/interfaces/valid-children-types.mjs +0 -36
  92. package/esm2022/interfaces/view-base.mjs +0 -38
  93. package/esm2022/pipes.mjs +0 -61
  94. package/esm2022/plugins/align/align.editor.mjs +0 -41
  95. package/esm2022/plugins/align/align.plugin.mjs +0 -64
  96. package/esm2022/plugins/autoformat/autoformat.plugin.mjs +0 -109
  97. package/esm2022/plugins/autoformat/transforms/auto-format-block.mjs +0 -14
  98. package/esm2022/plugins/autoformat/transforms/auto-format-inline.mjs +0 -78
  99. package/esm2022/plugins/blockquote/blockquote.component.mjs +0 -16
  100. package/esm2022/plugins/blockquote/blockquote.editor.mjs +0 -20
  101. package/esm2022/plugins/blockquote/blockquote.plugin.mjs +0 -84
  102. package/esm2022/plugins/code/code.component.mjs +0 -255
  103. package/esm2022/plugins/code/code.editor.mjs +0 -59
  104. package/esm2022/plugins/code/code.plugin.mjs +0 -67
  105. package/esm2022/plugins/color/color.editor.mjs +0 -27
  106. package/esm2022/plugins/color/color.plugin.mjs +0 -32
  107. package/esm2022/plugins/color/toolbar-item.component.mjs +0 -99
  108. package/esm2022/plugins/common/block-card.plugin.mjs +0 -330
  109. package/esm2022/plugins/common/common.plugin.mjs +0 -49
  110. package/esm2022/plugins/common/get-fragment.plugin.mjs +0 -24
  111. package/esm2022/plugins/common/history.plugin.mjs +0 -31
  112. package/esm2022/plugins/common/insert-data-by-invalid-type.mjs +0 -23
  113. package/esm2022/plugins/common/move-selection.plugin.mjs +0 -105
  114. package/esm2022/plugins/common/remove-empty.plugin.mjs +0 -61
  115. package/esm2022/plugins/common/remove-void.plugin.mjs +0 -60
  116. package/esm2022/plugins/common/reset-type.plugin.mjs +0 -35
  117. package/esm2022/plugins/deserialize/deserialize-html.plugin.mjs +0 -61
  118. package/esm2022/plugins/deserialize/deserialize-md.plugin.mjs +0 -142
  119. package/esm2022/plugins/font-size/font-size.editor.mjs +0 -98
  120. package/esm2022/plugins/heading/heading.editor.mjs +0 -54
  121. package/esm2022/plugins/heading/heading.plugin.mjs +0 -136
  122. package/esm2022/plugins/hr/hr.component.mjs +0 -37
  123. package/esm2022/plugins/hr/hr.editor.mjs +0 -16
  124. package/esm2022/plugins/hr/hr.plugin.mjs +0 -56
  125. package/esm2022/plugins/image/image.component.mjs +0 -474
  126. package/esm2022/plugins/image/image.editor.mjs +0 -116
  127. package/esm2022/plugins/image/image.plugin.mjs +0 -90
  128. package/esm2022/plugins/indent/indent.editor.mjs +0 -78
  129. package/esm2022/plugins/indent/indent.plugin.mjs +0 -59
  130. package/esm2022/plugins/indent/on-keydown-indent.mjs +0 -59
  131. package/esm2022/plugins/index.mjs +0 -73
  132. package/esm2022/plugins/inline-code/inline-code.component.mjs +0 -28
  133. package/esm2022/plugins/inline-code/inline-code.editor.mjs +0 -49
  134. package/esm2022/plugins/inline-code/inline-code.plugin.mjs +0 -67
  135. package/esm2022/plugins/link/edit/link-edit.component.mjs +0 -104
  136. package/esm2022/plugins/link/hover/link-hover.component.mjs +0 -38
  137. package/esm2022/plugins/link/link.component.mjs +0 -170
  138. package/esm2022/plugins/link/link.editor.mjs +0 -87
  139. package/esm2022/plugins/link/link.plugin.mjs +0 -89
  140. package/esm2022/plugins/link/link.types.mjs +0 -12
  141. package/esm2022/plugins/list/components/bulleted-list.component.mjs +0 -28
  142. package/esm2022/plugins/list/components/list-item.component.mjs +0 -88
  143. package/esm2022/plugins/list/components/numbered-list.component.mjs +0 -37
  144. package/esm2022/plugins/list/list.editor.mjs +0 -128
  145. package/esm2022/plugins/list/list.plugin.mjs +0 -302
  146. package/esm2022/plugins/list/normalizers/get-list-normalizer.mjs +0 -39
  147. package/esm2022/plugins/list/normalizers/normalize-list-item.mjs +0 -18
  148. package/esm2022/plugins/list/normalizers/normalize-no.mjs +0 -43
  149. package/esm2022/plugins/list/on-key-down-list.mjs +0 -33
  150. package/esm2022/plugins/list/queries/get-list-item-entry.mjs +0 -28
  151. package/esm2022/plugins/list/queries/get-list-item-sublist.mjs +0 -12
  152. package/esm2022/plugins/list/queries/get-list-types.mjs +0 -5
  153. package/esm2022/plugins/list/queries/get-start-list-item.mjs +0 -27
  154. package/esm2022/plugins/list/queries/has-list-in-list-item.mjs +0 -27
  155. package/esm2022/plugins/list/queries/is-in-list.mjs +0 -6
  156. package/esm2022/plugins/list/queries/is-list-nested.mjs +0 -10
  157. package/esm2022/plugins/list/queries/is-list.mjs +0 -5
  158. package/esm2022/plugins/list/queries/is-node-type-list.mjs +0 -5
  159. package/esm2022/plugins/list/queries/is-selection-at-list-item-start.mjs +0 -13
  160. package/esm2022/plugins/list/queries/is-selection-in-same-list-item.mjs +0 -17
  161. package/esm2022/plugins/list/queries/is-single-list-item.mjs +0 -9
  162. package/esm2022/plugins/list/transforms/insert-list-data.mjs +0 -72
  163. package/esm2022/plugins/list/transforms/insert-list-item.mjs +0 -73
  164. package/esm2022/plugins/list/transforms/move-list-item-down.mjs +0 -41
  165. package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +0 -43
  166. package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +0 -30
  167. package/esm2022/plugins/list/transforms/move-list-item-up.mjs +0 -78
  168. package/esm2022/plugins/list/transforms/unwrap-list.mjs +0 -10
  169. package/esm2022/plugins/list/types.mjs +0 -2
  170. package/esm2022/plugins/mark/mark.editor.mjs +0 -28
  171. package/esm2022/plugins/mark/mark.plugin.mjs +0 -105
  172. package/esm2022/plugins/mention/index.mjs +0 -5
  173. package/esm2022/plugins/mention/mention.editor.mjs +0 -179
  174. package/esm2022/plugins/mention/mention.plugin.mjs +0 -92
  175. package/esm2022/plugins/mention/mention.type.mjs +0 -2
  176. package/esm2022/plugins/mention/suggestion.component.mjs +0 -22
  177. package/esm2022/plugins/node-id/node-id.plugin.mjs +0 -78
  178. package/esm2022/plugins/normalizers/insert-paragraph-nodes.mjs +0 -28
  179. package/esm2022/plugins/normalizers/remove-empty-nodes.mjs +0 -18
  180. package/esm2022/plugins/normalizers/trailing-node.plugin.mjs +0 -33
  181. package/esm2022/plugins/paint-format/paint-format.editor.mjs +0 -126
  182. package/esm2022/plugins/public-api.mjs +0 -20
  183. package/esm2022/plugins/quick-insert/components/quick-insert.component.mjs +0 -126
  184. package/esm2022/plugins/quick-insert/index.mjs +0 -4
  185. package/esm2022/plugins/quick-insert/quick-insert.editor.mjs +0 -70
  186. package/esm2022/plugins/quick-insert/quick-insert.plugin.mjs +0 -109
  187. package/esm2022/plugins/soft-break/soft-break.plugin.mjs +0 -36
  188. package/esm2022/plugins/soft-break/soft-break.types.mjs +0 -2
  189. package/esm2022/plugins/table/components/insert-mark/insert-mark.component.mjs +0 -132
  190. package/esm2022/plugins/table/components/row/row.component.mjs +0 -93
  191. package/esm2022/plugins/table/components/table.component.mjs +0 -887
  192. package/esm2022/plugins/table/components/td/td.component.mjs +0 -610
  193. package/esm2022/plugins/table/components/toolbar/table-options.component.mjs +0 -102
  194. package/esm2022/plugins/table/components/toolbar/table-toolbar.component.mjs +0 -179
  195. package/esm2022/plugins/table/table.editor.mjs +0 -301
  196. package/esm2022/plugins/table/table.pipe.mjs +0 -66
  197. package/esm2022/plugins/table/table.plugin.mjs +0 -556
  198. package/esm2022/plugins/table/table.service.mjs +0 -122
  199. package/esm2022/plugins/table/table.store.mjs +0 -417
  200. package/esm2022/plugins/table/table.types.mjs +0 -68
  201. package/esm2022/plugins/table/toolbar-item.component.mjs +0 -95
  202. package/esm2022/plugins/table/transforms/clear-cell.mjs +0 -14
  203. package/esm2022/plugins/table/transforms/clear-table-node.mjs +0 -27
  204. package/esm2022/plugins/table/transforms/index.mjs +0 -8
  205. package/esm2022/plugins/table/transforms/insert-column.mjs +0 -69
  206. package/esm2022/plugins/table/transforms/insert-row.mjs +0 -50
  207. package/esm2022/plugins/table/transforms/insert-table.mjs +0 -15
  208. package/esm2022/plugins/table/transforms/move-selection-from-cell.mjs +0 -91
  209. package/esm2022/plugins/table/transforms/remove-column.mjs +0 -51
  210. package/esm2022/plugins/table/transforms/remove-row.mjs +0 -48
  211. package/esm2022/plugins/table/transforms/remove-table.mjs +0 -49
  212. package/esm2022/plugins/table/utils/add-columns.mjs +0 -38
  213. package/esm2022/plugins/table/utils/calc-anchor-position.mjs +0 -26
  214. package/esm2022/plugins/table/utils/calc-span.mjs +0 -73
  215. package/esm2022/plugins/table/utils/calculate-table.mjs +0 -116
  216. package/esm2022/plugins/table/utils/cell-position.mjs +0 -57
  217. package/esm2022/plugins/table/utils/create-cell.mjs +0 -19
  218. package/esm2022/plugins/table/utils/create-row.mjs +0 -12
  219. package/esm2022/plugins/table/utils/create-table-position.mjs +0 -10
  220. package/esm2022/plugins/table/utils/create-table.mjs +0 -15
  221. package/esm2022/plugins/table/utils/get-grid-columns.mjs +0 -79
  222. package/esm2022/plugins/table/utils/get-min-max-cell-index.mjs +0 -69
  223. package/esm2022/plugins/table/utils/get-next-cell.mjs +0 -44
  224. package/esm2022/plugins/table/utils/get-select-cell-node.mjs +0 -16
  225. package/esm2022/plugins/table/utils/handle-cell.mjs +0 -25
  226. package/esm2022/plugins/table/utils/index.mjs +0 -16
  227. package/esm2022/plugins/table/utils/is-header-row.mjs +0 -15
  228. package/esm2022/plugins/table/utils/is-legal-table.mjs +0 -26
  229. package/esm2022/plugins/table/utils/is-range-in-table.mjs +0 -16
  230. package/esm2022/plugins/table/utils/is-selection-in-table.mjs +0 -51
  231. package/esm2022/plugins/table/utils/is-virtual-key.mjs +0 -13
  232. package/esm2022/plugins/table/utils/merge-cell.mjs +0 -110
  233. package/esm2022/plugins/table/utils/next-path.mjs +0 -5
  234. package/esm2022/plugins/table/utils/normalize-table.mjs +0 -31
  235. package/esm2022/plugins/table/utils/remove-columns.mjs +0 -23
  236. package/esm2022/plugins/table/utils/remove-row-column.mjs +0 -45
  237. package/esm2022/plugins/table/utils/set-menu-cell-invisibility.mjs +0 -45
  238. package/esm2022/plugins/table/utils/split-cell.mjs +0 -29
  239. package/esm2022/plugins/table/utils/table-entry.mjs +0 -21
  240. package/esm2022/plugins/table/utils/table-position.mjs +0 -251
  241. package/esm2022/plugins/table/utils/table-viewport.mjs +0 -41
  242. package/esm2022/plugins/todo-item/todo-item.component.mjs +0 -65
  243. package/esm2022/plugins/todo-item/todo-item.editor.mjs +0 -32
  244. package/esm2022/plugins/todo-item/todo-item.plugin.mjs +0 -93
  245. package/esm2022/plugins/vertical-align/toolbar-item.component.mjs +0 -95
  246. package/esm2022/plugins/vertical-align/vertical-align.editor.mjs +0 -59
  247. package/esm2022/public-api.mjs +0 -22
  248. package/esm2022/queries/anchor-block-entry.mjs +0 -13
  249. package/esm2022/queries/anchor-block.mjs +0 -6
  250. package/esm2022/queries/anchor-inline-entry.mjs +0 -10
  251. package/esm2022/queries/find-descendant.mjs +0 -47
  252. package/esm2022/queries/find-node.mjs +0 -45
  253. package/esm2022/queries/find-path.mjs +0 -28
  254. package/esm2022/queries/get-above-by-type.mjs +0 -14
  255. package/esm2022/queries/get-above.mjs +0 -9
  256. package/esm2022/queries/get-anchor-block-entry.mjs +0 -8
  257. package/esm2022/queries/get-block-above.mjs +0 -10
  258. package/esm2022/queries/get-block-card-above.mjs +0 -10
  259. package/esm2022/queries/get-block-card-cursor.mjs +0 -9
  260. package/esm2022/queries/get-container-blocks.mjs +0 -12
  261. package/esm2022/queries/get-directly-parent.mjs +0 -12
  262. package/esm2022/queries/get-insert-elements-path.mjs +0 -46
  263. package/esm2022/queries/get-last-child-path.mjs +0 -9
  264. package/esm2022/queries/get-last-node.mjs +0 -17
  265. package/esm2022/queries/get-next-sibling-nodes.mjs +0 -17
  266. package/esm2022/queries/get-node.mjs +0 -10
  267. package/esm2022/queries/get-nodes-by-type.mjs +0 -15
  268. package/esm2022/queries/get-nodes.mjs +0 -7
  269. package/esm2022/queries/get-parent.mjs +0 -12
  270. package/esm2022/queries/get-plain-text.mjs +0 -16
  271. package/esm2022/queries/get-plugin-by-toolbar.mjs +0 -13
  272. package/esm2022/queries/get-point-before.mjs +0 -62
  273. package/esm2022/queries/get-point-from-location.mjs +0 -15
  274. package/esm2022/queries/get-previous-path.mjs +0 -9
  275. package/esm2022/queries/get-rang-from-block-start.mjs +0 -16
  276. package/esm2022/queries/get-range-before.mjs +0 -17
  277. package/esm2022/queries/get-selection-marks.mjs +0 -18
  278. package/esm2022/queries/get-selection-nodes-by-type.mjs +0 -30
  279. package/esm2022/queries/get-text.mjs +0 -9
  280. package/esm2022/queries/get-toolbar-disabled.mjs +0 -13
  281. package/esm2022/queries/index.mjs +0 -62
  282. package/esm2022/queries/is-across-blocks.mjs +0 -7
  283. package/esm2022/queries/is-ancestor-empty.mjs +0 -6
  284. package/esm2022/queries/is-ancestor.mjs +0 -3
  285. package/esm2022/queries/is-block-above-empty.mjs +0 -11
  286. package/esm2022/queries/is-block-active.mjs +0 -8
  287. package/esm2022/queries/is-block-card-cursor.mjs +0 -16
  288. package/esm2022/queries/is-block-text-empty-after-selection.mjs +0 -31
  289. package/esm2022/queries/is-collapsed.mjs +0 -7
  290. package/esm2022/queries/is-contain-nested-type.mjs +0 -29
  291. package/esm2022/queries/is-container-type.mjs +0 -3
  292. package/esm2022/queries/is-descendant.mjs +0 -3
  293. package/esm2022/queries/is-empty-content-filter.mjs +0 -22
  294. package/esm2022/queries/is-empty-content.mjs +0 -15
  295. package/esm2022/queries/is-empty-paragraph-by-path.mjs +0 -7
  296. package/esm2022/queries/is-empty-paragraph.mjs +0 -28
  297. package/esm2022/queries/is-first-child.mjs +0 -5
  298. package/esm2022/queries/is-global-collapsed.mjs +0 -5
  299. package/esm2022/queries/is-include-types.mjs +0 -12
  300. package/esm2022/queries/is-node-type-in.mjs +0 -9
  301. package/esm2022/queries/is-node-type.mjs +0 -15
  302. package/esm2022/queries/is-paragraph.mjs +0 -9
  303. package/esm2022/queries/is-point-at-root.mjs +0 -2
  304. package/esm2022/queries/is-range-across-blocks.mjs +0 -22
  305. package/esm2022/queries/is-range-at-root.mjs +0 -3
  306. package/esm2022/queries/is-root-path.mjs +0 -2
  307. package/esm2022/queries/is-start.mjs +0 -6
  308. package/esm2022/queries/some-node.mjs +0 -9
  309. package/esm2022/services/context.service.mjs +0 -140
  310. package/esm2022/services/table-contextmenu.service.mjs +0 -288
  311. package/esm2022/services/toolbar.service.mjs +0 -47
  312. package/esm2022/shortcuts/index.mjs +0 -5
  313. package/esm2022/shortcuts/mark.mjs +0 -25
  314. package/esm2022/test/basic/basic.component.mjs +0 -61
  315. package/esm2022/test/faker/data-transfer-faker.mjs +0 -13
  316. package/esm2022/test/faker/tethys-icon-faker.mjs +0 -22
  317. package/esm2022/test/index.mjs +0 -7
  318. package/esm2022/test/utils/mock-plugins.mjs +0 -104
  319. package/esm2022/test/utils/preset-config.mjs +0 -17
  320. package/esm2022/test/utils/with-plugin.mjs +0 -11
  321. package/esm2022/transforms/apply-deep-to-nodes.mjs +0 -22
  322. package/esm2022/transforms/clear-marks.mjs +0 -23
  323. package/esm2022/transforms/delete-element.mjs +0 -12
  324. package/esm2022/transforms/delete-node-by-type.mjs +0 -10
  325. package/esm2022/transforms/handle-continual-delete-backward.mjs +0 -18
  326. package/esm2022/transforms/handle-continual-insert-break.mjs +0 -20
  327. package/esm2022/transforms/index.mjs +0 -19
  328. package/esm2022/transforms/insert-elements.mjs +0 -55
  329. package/esm2022/transforms/insert-paragraph.mjs +0 -6
  330. package/esm2022/transforms/merge-deep-to-nodes.mjs +0 -9
  331. package/esm2022/transforms/move-children.mjs +0 -22
  332. package/esm2022/transforms/on-keydown-reset-block-type.mjs +0 -23
  333. package/esm2022/transforms/set-end-selection.mjs +0 -10
  334. package/esm2022/transforms/set-marks.mjs +0 -9
  335. package/esm2022/transforms/set-node-by-type.mjs +0 -10
  336. package/esm2022/transforms/set-node.mjs +0 -6
  337. package/esm2022/transforms/un-hang-range.mjs +0 -11
  338. package/esm2022/transforms/un-wrap.mjs +0 -12
  339. package/esm2022/transforms/unwrap-nodes-by-type.mjs +0 -14
  340. package/esm2022/utils/auto-focus.mjs +0 -24
  341. package/esm2022/utils/blob.mjs +0 -16
  342. package/esm2022/utils/cast-array.mjs +0 -7
  343. package/esm2022/utils/color-picker.mjs +0 -15
  344. package/esm2022/utils/common.mjs +0 -11
  345. package/esm2022/utils/copy-node.mjs +0 -38
  346. package/esm2022/utils/create-empty-paragraph.mjs +0 -14
  347. package/esm2022/utils/data-transform.mjs +0 -48
  348. package/esm2022/utils/dom.mjs +0 -56
  349. package/esm2022/utils/editor-uuid.mjs +0 -8
  350. package/esm2022/utils/fragment.mjs +0 -82
  351. package/esm2022/utils/get-editable-element-height.mjs +0 -6
  352. package/esm2022/utils/get-mode.mjs +0 -14
  353. package/esm2022/utils/get-toolbar-class.mjs +0 -6
  354. package/esm2022/utils/id-creator.mjs +0 -11
  355. package/esm2022/utils/index.mjs +0 -23
  356. package/esm2022/utils/insert-data-by-invalid-type.mjs +0 -70
  357. package/esm2022/utils/is-clean-empty-paragraph.mjs +0 -37
  358. package/esm2022/utils/is-inline.mjs +0 -9
  359. package/esm2022/utils/lodash.mjs +0 -3
  360. package/esm2022/utils/match.mjs +0 -32
  361. package/esm2022/utils/merge-element-options.mjs +0 -19
  362. package/esm2022/utils/normalize.mjs +0 -61
  363. package/esm2022/utils/refocus.mjs +0 -47
  364. package/esm2022/utils/scrolling.mjs +0 -43
  365. package/esm2022/utils/update-popover-position.mjs +0 -26
  366. package/esm2022/utils/weak-maps.mjs +0 -9
  367. package/esm2022/worktile-theia.mjs +0 -5
@@ -1,262 +0,0 @@
1
- import { NgIf, NgTemplateOutlet } from '@angular/common';
2
- import { Component, HostBinding, Inject, Input, ViewChild, ViewContainerRef } from '@angular/core';
3
- import { ThyDivider } from 'ngx-tethys/divider';
4
- import { DropdownMode, TheToolbarGroupToken, ToolbarActionTypes, ToolbarMoreGroup } from '../../constants';
5
- import { ToolbarItemType } from '../../interfaces/toolbar';
6
- import { TheToolbarDropdown } from '../toolbar-dropdown/toolbar-dropdown.component';
7
- import { TheToolbarItem } from '../toolbar-item/toolbar-item.component';
8
- import * as i0 from "@angular/core";
9
- export class TheToolbarComponent {
10
- get justifyContent() {
11
- return this.align;
12
- }
13
- constructor(cdr, elementRef, ngZone, toolbarGroup) {
14
- this.cdr = cdr;
15
- this.elementRef = elementRef;
16
- this.ngZone = ngZone;
17
- this.toolbarGroup = toolbarGroup;
18
- this.toolbarItems = [];
19
- this.containerClass = [];
20
- this.isMore = true;
21
- this.components = new Map();
22
- this.moreGroupMenu = ToolbarMoreGroup;
23
- this.elementWidth = 0;
24
- }
25
- ngOnInit() {
26
- this.setToolbarClass();
27
- this.renderToolbarView();
28
- this.selectionChange(this.editor);
29
- this.isMore && this.resizeElement();
30
- }
31
- ngOnChanges(changes) {
32
- const toolbarItems = changes.toolbarItems;
33
- if (toolbarItems && !toolbarItems.firstChange) {
34
- this.renderToolbarView();
35
- }
36
- }
37
- ngOnDestroy() {
38
- if (this.resizeObserver) {
39
- this.resizeObserver.disconnect();
40
- }
41
- }
42
- setToolbarClass() {
43
- if (this.editor && !!this.containerClass.length) {
44
- this.elementRef.nativeElement.classList.add(...this.containerClass);
45
- }
46
- }
47
- resizeElement() {
48
- const editableElement = this.elementRef.nativeElement;
49
- // @ts-ignore
50
- this.resizeObserver = new ResizeObserver(entries => {
51
- for (let entry of entries) {
52
- const { width } = entry.contentRect;
53
- if (this.isMore && this.elementWidth !== width) {
54
- this.elementWidth = width;
55
- this.renderToolbarView();
56
- }
57
- }
58
- });
59
- this.resizeObserver.observe(editableElement);
60
- }
61
- selectionChange(editor) {
62
- if (this.isMore) {
63
- this.renderToolbarView();
64
- }
65
- const toolbarItems = [...this.toolbarItems, this.moreGroupMenu];
66
- for (const item of toolbarItems) {
67
- if (item.key !== ToolbarActionTypes.split) {
68
- const itemComponent = this.components.get(item.key);
69
- if (itemComponent && itemComponent.instance.selectionChange) {
70
- itemComponent.instance.selectionChange(editor);
71
- }
72
- }
73
- }
74
- }
75
- renderToolbarView() {
76
- const toolbarItems = this.toolbarItemsCompose();
77
- const { items, group } = toolbarItems;
78
- if (items.length === this.composeToolbarItems?.items?.length && group?.length === this.composeToolbarItems?.group?.length) {
79
- return;
80
- }
81
- this.composeToolbarItems = toolbarItems;
82
- this.components.clear();
83
- this.toolbarContainer.clear();
84
- this.ngZone.run(() => {
85
- for (const item of items) {
86
- if (item.key === ToolbarActionTypes.split) {
87
- this.createToolbarSplit();
88
- continue;
89
- }
90
- this.createToolbarItem(item);
91
- }
92
- this.createMoreGroup(group);
93
- this.cdr.markForCheck();
94
- });
95
- }
96
- /**
97
- * calculation display toolbar and more grouped toolbars
98
- *
99
- * ┌──────────────────────────────────────── GlobalToolbarView ───────────────────────────────────┐
100
- * | ┌─────────────────────────────────────── #children ─────────────────────────────────────────┐ |
101
- * | | ┌─────── #itemsView ────────┐ ┌──────────────────────┐ ┌── #groupedItemsDropdown ───┐ | |
102
- * | | | #ungroupedItems | | ToolbarSeparatorView | | #groupedItems | | |
103
- * | | └──────────────────────────-┘ └──────────────────────┘ └────────────────────────────┘ | |
104
- * | | \---------- only when toolbar items overflow --------/ | |
105
- * | └───────────────────────────────────────────────────────────────────────────────────────────┘ |
106
- * └───────────────────────────────────────────────────────────────────────────────────────────────┘
107
- */
108
- toolbarItemsCompose() {
109
- const groupWidth = 32;
110
- const items = [];
111
- const group = [];
112
- let elementWidth = this.isMore ? this.elementWidth : null;
113
- let isSpaceRemaining = true;
114
- for (let i = 0; i < this.toolbarItems.length; i++) {
115
- const item = this.toolbarItems[i];
116
- if (!this.isMore) {
117
- items.push(item);
118
- continue;
119
- }
120
- if (!isSpaceRemaining) {
121
- group.push(item);
122
- continue;
123
- }
124
- const itemWidth = this.getItemWidth(item);
125
- const occupyWidth = i === this.toolbarItems.length - 1 ? itemWidth : itemWidth + groupWidth;
126
- const allowRender = elementWidth && elementWidth >= occupyWidth;
127
- if (allowRender) {
128
- items.push(item);
129
- elementWidth -= itemWidth;
130
- }
131
- else {
132
- const isFirstSplit = group.length === 0 && item.key === ToolbarActionTypes.split;
133
- if (!isFirstSplit) {
134
- isSpaceRemaining = false;
135
- group.push(item);
136
- }
137
- }
138
- }
139
- return {
140
- items: this.pureToolbarItems(items),
141
- group
142
- };
143
- }
144
- /**
145
- * split width: 13px
146
- * item width: default item: 32px
147
- * dropdown item: 48px
148
- * default paddingRight: 4px
149
- */
150
- getItemWidth(item) {
151
- const paddingRight = 4;
152
- const defaultItemWidth = 32;
153
- const iconDropdownItemWidth = 48;
154
- const textDropdownItemWidth = 70;
155
- const dropdownActionIconWidth = 16;
156
- const splitWidth = 9;
157
- const isDropdownComponent = item?.type === ToolbarItemType.dropdown;
158
- const isUpdateDropdownItemWidth = !item?.width && isDropdownComponent;
159
- let itemWidth = item?.width ?? defaultItemWidth;
160
- if (isUpdateDropdownItemWidth) {
161
- if (item?.dropdownMode === DropdownMode.icon) {
162
- itemWidth = iconDropdownItemWidth;
163
- }
164
- if (!item?.dropdownMode || item?.dropdownMode === DropdownMode.text) {
165
- itemWidth = textDropdownItemWidth;
166
- }
167
- if (item?.isHideDropdownActionIcon) {
168
- itemWidth -= dropdownActionIconWidth;
169
- }
170
- }
171
- if (item.key === ToolbarActionTypes.split) {
172
- itemWidth = splitWidth;
173
- }
174
- itemWidth += paddingRight;
175
- return itemWidth;
176
- }
177
- /**
178
- * filter adjacent repeated dividers
179
- * @param {ToolbarItem[]} items
180
- * @returns
181
- * @memberof TheToolbarComponent
182
- */
183
- pureToolbarItems(items) {
184
- if (!Array.isArray(items)) {
185
- return [];
186
- }
187
- return items.filter((a, i) => {
188
- if (i > 0 && items[i - 1].key !== ToolbarActionTypes.split) {
189
- return true;
190
- }
191
- return a.key !== ToolbarActionTypes.split;
192
- });
193
- }
194
- createToolbarItem(item) {
195
- const { iconComponent, type, dropdownMode, dropdownItemKey, includes, ...args } = item;
196
- const viewComponent = this.viewComponentType(type);
197
- const compRef = this.toolbarContainer.createComponent(iconComponent ? iconComponent : viewComponent);
198
- compRef.instance.editor = this.editor;
199
- compRef.instance.toolbarItem = item;
200
- this.components.set(item.key, compRef);
201
- if (item.type === ToolbarItemType.dropdown) {
202
- const dropdownRef = compRef;
203
- dropdownRef.instance.dropdownItemKey = item.dropdownItemKey;
204
- dropdownRef.instance.menus = includes;
205
- dropdownRef.instance.mode = dropdownMode;
206
- }
207
- }
208
- createToolbarSplit() {
209
- const compRef = this.toolbarContainer.createComponent(ThyDivider);
210
- compRef.instance.thyVertical = true;
211
- compRef.instance.thyColor = 'light';
212
- compRef.location.nativeElement.classList.add('mx-2');
213
- }
214
- createMoreGroup(group) {
215
- if (group.length > 0) {
216
- const compRef = this.toolbarContainer.createComponent(this.toolbarGroup);
217
- compRef.instance.editor = this.editor;
218
- compRef.instance.menus = group;
219
- compRef.instance.item = this.moreGroupMenu;
220
- this.components.set(this.moreGroupMenu.key, compRef);
221
- }
222
- }
223
- viewComponentType(type) {
224
- if (type === ToolbarItemType.default) {
225
- return TheToolbarItem;
226
- }
227
- if (type === ToolbarItemType.dropdown) {
228
- return TheToolbarDropdown;
229
- }
230
- return TheToolbarItem;
231
- }
232
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TheToolbarComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: TheToolbarGroupToken }], target: i0.ɵɵFactoryTarget.Component }); }
233
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TheToolbarComponent, isStandalone: true, selector: "the-toolbar", inputs: { editor: "editor", toolbarItems: "toolbarItems", align: "align", containerClass: "containerClass", isMore: "isMore", afterTemplate: "afterTemplate" }, host: { properties: { "style.justifyContent": "this.justifyContent" }, classAttribute: "the-toolbar-container d-flex align-items-center" }, viewQueries: [{ propertyName: "toolbarContainer", first: true, predicate: ["toolbarContainer"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container #toolbarContainer></ng-container>\n<ng-content></ng-content>\n<ng-template *ngIf=\"afterTemplate\" [ngTemplateOutlet]=\"afterTemplate\"></ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
234
- }
235
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TheToolbarComponent, decorators: [{
236
- type: Component,
237
- args: [{ selector: 'the-toolbar', host: {
238
- class: 'the-toolbar-container d-flex align-items-center'
239
- }, standalone: true, imports: [NgIf, NgTemplateOutlet], template: "<ng-container #toolbarContainer></ng-container>\n<ng-content></ng-content>\n<ng-template *ngIf=\"afterTemplate\" [ngTemplateOutlet]=\"afterTemplate\"></ng-template>\n" }]
240
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
241
- type: Inject,
242
- args: [TheToolbarGroupToken]
243
- }] }], propDecorators: { editor: [{
244
- type: Input
245
- }], toolbarItems: [{
246
- type: Input
247
- }], align: [{
248
- type: Input
249
- }], containerClass: [{
250
- type: Input
251
- }], isMore: [{
252
- type: Input
253
- }], afterTemplate: [{
254
- type: Input
255
- }], toolbarContainer: [{
256
- type: ViewChild,
257
- args: ['toolbarContainer', { read: ViewContainerRef, static: true }]
258
- }], justifyContent: [{
259
- type: HostBinding,
260
- args: ['style.justifyContent']
261
- }] } });
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvY29tcG9uZW50cy90b29sYmFyL3Rvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvdG9vbGJhci90b29sYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBRUgsU0FBUyxFQUdULFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQU9MLFNBQVMsRUFDVCxnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRyxPQUFPLEVBQWlDLGVBQWUsRUFBNkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNySCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUVwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7O0FBV3hFLE1BQU0sT0FBTyxtQkFBbUI7SUFlNUIsSUFBeUMsY0FBYztRQUNuRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQVlELFlBQ1ksR0FBc0IsRUFDdEIsVUFBc0IsRUFDdEIsTUFBYyxFQUNnQixZQUE0QztRQUgxRSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZ0IsaUJBQVksR0FBWixZQUFZLENBQWdDO1FBOUI3RSxpQkFBWSxHQUFrQixF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bnQiOlsiaW1wb3J0IHsgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb21wb25lbnRSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaHlEaXZpZGVyIH0gZnJvbSAnbmd4LXRldGh5cy9kaXZpZGVyJztcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IERyb3Bkb3duTW9kZSwgVGhlVG9vbGJhckdyb3VwVG9rZW4sIFRvb2xiYXJBY3Rpb25UeXBlcywgVG9vbGJhck1vcmVHcm91cCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBUaGVCYXNlVG9vbGJhckRyb3Bkb3duLCBUaGVCYXNlVG9vbGJhckl0ZW0gfSBmcm9tICcuLi8uLi9jb3JlL3Rvb2xiYXItaXRlbS9iYXNlLXRvb2xiYXItaXRlbSc7XG5pbXBvcnQgeyBUb29sYmFyQWxpZ25tZW50LCBUb29sYmFySXRlbSwgVG9vbGJhckl0ZW1UeXBlLCBUb29sYmFySXRlbXNDb21wb3NlUmV0dXJuIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90b29sYmFyJztcbmltcG9ydCB7IFRoZVRvb2xiYXJEcm9wZG93biB9IGZyb20gJy4uL3Rvb2xiYXItZHJvcGRvd24vdG9vbGJhci1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGhlVG9vbGJhckdyb3VwIH0gZnJvbSAnLi4vdG9vbGJhci1ncm91cC90b29sYmFyLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaGVUb29sYmFySXRlbSB9IGZyb20gJy4uL3Rvb2xiYXItaXRlbS90b29sYmFyLWl0ZW0uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aGUtdG9vbGJhcicsXG4gICAgdGVtcGxhdGVVcmw6ICd0b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAndGhlLXRvb2xiYXItY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXInXG4gICAgfSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0XVxufSlcbmV4cG9ydCBjbGFzcyBUaGVUb29sYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KCkgZWRpdG9yOiBFZGl0b3I7XG5cbiAgICBASW5wdXQoKSB0b29sYmFySXRlbXM6IFRvb2xiYXJJdGVtW10gPSBbXTtcblxuICAgIEBJbnB1dCgpIGFsaWduOiBUb29sYmFyQWxpZ25tZW50O1xuXG4gICAgQElucHV0KCkgY29udGFpbmVyQ2xhc3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBASW5wdXQoKSBpc01vcmUgPSB0cnVlO1xuXG4gICAgQElucHV0KCkgYWZ0ZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSB0b29sYmFyQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5qdXN0aWZ5Q29udGVudCcpIGdldCBqdXN0aWZ5Q29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxpZ247XG4gICAgfVxuXG4gICAgY29tcG9uZW50czogTWFwPHN0cmluZywgQ29tcG9uZW50UmVmPGFueT4+ID0gbmV3IE1hcDxzdHJpbmcsIENvbXBvbmVudFJlZjxhbnk+PigpO1xuXG4gICAgY29tcG9zZVRvb2xiYXJJdGVtczogVG9vbGJhckl0ZW1zQ29tcG9zZVJldHVybjtcblxuICAgIG1vcmVHcm91cE1lbnUgPSBUb29sYmFyTW9yZUdyb3VwO1xuXG4gICAgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xuXG4gICAgZWxlbWVudFdpZHRoID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgQEluamVjdChUaGVUb29sYmFyR3JvdXBUb2tlbikgcHJpdmF0ZSB0b29sYmFyR3JvdXA6IENvbXBvbmVudFR5cGU8VGhlVG9vbGJhckdyb3VwPlxuICAgICkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNldFRvb2xiYXJDbGFzcygpO1xuICAgICAgICB0aGlzLnJlbmRlclRvb2xiYXJWaWV3KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgdGhpcy5pc01vcmUgJiYgdGhpcy5yZXNpemVFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCB0b29sYmFySXRlbXMgPSBjaGFuZ2VzLnRvb2xiYXJJdGVtcztcbiAgICAgICAgaWYgKHRvb2xiYXJJdGVtcyAmJiAhdG9vbGJhckl0ZW1zLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlclRvb2xiYXJWaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldFRvb2xiYXJDbGFzcygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yICYmICEhdGhpcy5jb250YWluZXJDbGFzcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4udGhpcy5jb250YWluZXJDbGFzcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2l6ZUVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGVkaXRhYmxlRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCB9ID0gZW50cnkuY29udGVudFJlY3Q7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb3JlICYmIHRoaXMuZWxlbWVudFdpZHRoICE9PSB3aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRXaWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRvb2xiYXJWaWV3KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKGVkaXRhYmxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdGlvbkNoYW5nZShlZGl0b3I6IEVkaXRvcikge1xuICAgICAgICBpZiAodGhpcy5pc01vcmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVG9vbGJhclZpZXcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IFsuLi50aGlzLnRvb2xiYXJJdGVtcywgdGhpcy5tb3JlR3JvdXBNZW51XTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRvb2xiYXJJdGVtcykge1xuICAgICAgICAgICAgaWYgKGl0ZW0ua2V5ICE9PSBUb29sYmFyQWN0aW9uVHlwZXMuc3BsaXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmdldChpdGVtLmtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1Db21wb25lbnQgJiYgaXRlbUNvbXBvbmVudC5pbnN0YW5jZS5zZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvbXBvbmVudC5pbnN0YW5jZS5zZWxlY3Rpb25DaGFuZ2UoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyVG9vbGJhclZpZXcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IHRoaXMudG9vbGJhckl0ZW1zQ29tcG9zZSgpO1xuICAgICAgICBjb25zdCB7IGl0ZW1zLCBncm91cCB9ID0gdG9vbGJhckl0ZW1zO1xuXG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IHRoaXMuY29tcG9zZVRvb2xiYXJJdGVtcz8uaXRlbXM/Lmxlbmd0aCAmJiBncm91cD8ubGVuZ3RoID09PSB0aGlzLmNvbXBvc2VUb29sYmFySXRlbXM/Lmdyb3VwPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBvc2VUb29sYmFySXRlbXMgPSB0b29sYmFySXRlbXM7XG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5jbGVhcigpO1xuICAgICAgICB0aGlzLnRvb2xiYXJDb250YWluZXIuY2xlYXIoKTtcblxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ua2V5ID09PSBUb29sYmFyQWN0aW9uVHlwZXMuc3BsaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVUb29sYmFyU3BsaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVG9vbGJhckl0ZW0oaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1vcmVHcm91cChncm91cCk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY2FsY3VsYXRpb24gZGlzcGxheSB0b29sYmFyIGFuZCBtb3JlIGdyb3VwZWQgdG9vbGJhcnNcbiAgICAgKlxuICAgICAqXHTilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgIEdsb2JhbFRvb2xiYXJWaWV3IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgICAqXHR8IOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAjY2hpbGRyZW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIHxcbiAgICAgKlx0fCB8ICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSAICNpdGVtc1ZpZXcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilIzilIDilIAgI2dyb3VwZWRJdGVtc0Ryb3Bkb3duIOKUgOKUgOKUgOKUkCAgIHwgfFxuICAgICAqXHR8IHwgICB8ICAgICAgICN1bmdyb3VwZWRJdGVtcyAgICAgfCB8IFRvb2xiYXJTZXBhcmF0b3JWaWV3IHwgfCAgICAgICAgI2dyb3VwZWRJdGVtcyAgICAgICB8ICAgfCB8XG4gICAgICpcdHwgfCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgC3ilJgg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIHwgfFxuICAgICAqXHR8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwtLS0tLS0tLS0tIG9ubHkgd2hlbiB0b29sYmFyIGl0ZW1zIG92ZXJmbG93IC0tLS0tLS0tLyAgIHwgfFxuICAgICAqXHR8IOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCB8XG4gICAgICpcdOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgICAqL1xuICAgIHByaXZhdGUgdG9vbGJhckl0ZW1zQ29tcG9zZSgpOiBUb29sYmFySXRlbXNDb21wb3NlUmV0dXJuIHtcbiAgICAgICAgY29uc3QgZ3JvdXBXaWR0aCA9IDMyO1xuICAgICAgICBjb25zdCBpdGVtczogVG9vbGJhckl0ZW1bXSA9IFtdO1xuICAgICAgICBjb25zdCBncm91cDogVG9vbGJhckl0ZW1bXSA9IFtdO1xuICAgICAgICBsZXQgZWxlbWVudFdpZHRoID0gdGhpcy5pc01vcmUgPyB0aGlzLmVsZW1lbnRXaWR0aCA6IG51bGw7XG4gICAgICAgIGxldCBpc1NwYWNlUmVtYWluaW5nID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9vbGJhckl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy50b29sYmFySXRlbXNbaV07XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNNb3JlKSB7XG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc1NwYWNlUmVtYWluaW5nKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXRlbVdpZHRoID0gdGhpcy5nZXRJdGVtV2lkdGgoaXRlbSk7XG4gICAgICAgICAgICBjb25zdCBvY2N1cHlXaWR0aCA9IGkgPT09IHRoaXMudG9vbGJhckl0ZW1zLmxlbmd0aCAtIDEgPyBpdGVtV2lkdGggOiBpdGVtV2lkdGggKyBncm91cFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgYWxsb3dSZW5kZXIgPSBlbGVtZW50V2lkdGggJiYgZWxlbWVudFdpZHRoID49IG9jY3VweVdpZHRoO1xuXG4gICAgICAgICAgICBpZiAoYWxsb3dSZW5kZXIpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRXaWR0aCAtPSBpdGVtV2lkdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlyc3RTcGxpdCA9IGdyb3VwLmxlbmd0aCA9PT0gMCAmJiBpdGVtLmtleSA9PT0gVG9vbGJhckFjdGlvblR5cGVzLnNwbGl0O1xuICAgICAgICAgICAgICAgIGlmICghaXNGaXJzdFNwbGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlzU3BhY2VSZW1haW5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXRlbXM6IHRoaXMucHVyZVRvb2xiYXJJdGVtcyhpdGVtcyksXG4gICAgICAgICAgICBncm91cFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNwbGl0IHdpZHRoOiAxM3B4XG4gICAgICogaXRlbSB3aWR0aDogZGVmYXVsdCBpdGVtOiAzMnB4XG4gICAgICogZHJvcGRvd24gaXRlbTogNDhweFxuICAgICAqIGRlZmF1bHQgcGFkZGluZ1JpZ2h0OiA0cHhcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEl0ZW1XaWR0aChpdGVtOiBUb29sYmFySXRlbSkge1xuICAgICAgICBjb25zdCBwYWRkaW5nUmlnaHQgPSA0O1xuICAgICAgICBjb25zdCBkZWZhdWx0SXRlbVdpZHRoID0gMzI7XG4gICAgICAgIGNvbnN0IGljb25Ecm9wZG93bkl0ZW1XaWR0aCA9IDQ4O1xuICAgICAgICBjb25zdCB0ZXh0RHJvcGRvd25JdGVtV2lkdGggPSA3MDtcbiAgICAgICAgY29uc3QgZHJvcGRvd25BY3Rpb25JY29uV2lkdGggPSAxNjtcbiAgICAgICAgY29uc3Qgc3BsaXRXaWR0aCA9IDk7XG4gICAgICAgIGNvbnN0IGlzRHJvcGRvd25Db21wb25lbnQgPSBpdGVtPy50eXBlID09PSBUb29sYmFySXRlbVR5cGUuZHJvcGRvd247XG4gICAgICAgIGNvbnN0IGlzVXBkYXRlRHJvcGRvd25JdGVtV2lkdGggPSAhaXRlbT8ud2lkdGggJiYgaXNEcm9wZG93bkNvbXBvbmVudDtcblxuICAgICAgICBsZXQgaXRlbVdpZHRoID0gaXRlbT8ud2lkdGggPz8gZGVmYXVsdEl0ZW1XaWR0aDtcblxuICAgICAgICBpZiAoaXNVcGRhdGVEcm9wZG93bkl0ZW1XaWR0aCkge1xuICAgICAgICAgICAgaWYgKGl0ZW0/LmRyb3Bkb3duTW9kZSA9PT0gRHJvcGRvd25Nb2RlLmljb24pIHtcbiAgICAgICAgICAgICAgICBpdGVtV2lkdGggPSBpY29uRHJvcGRvd25JdGVtV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWl0ZW0/LmRyb3Bkb3duTW9kZSB8fCBpdGVtPy5kcm9wZG93bk1vZGUgPT09IERyb3Bkb3duTW9kZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgaXRlbVdpZHRoID0gdGV4dERyb3Bkb3duSXRlbVdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGl0ZW0/LmlzSGlkZURyb3Bkb3duQWN0aW9uSWNvbikge1xuICAgICAgICAgICAgICAgIGl0ZW1XaWR0aCAtPSBkcm9wZG93bkFjdGlvbkljb25XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5rZXkgPT09IFRvb2xiYXJBY3Rpb25UeXBlcy5zcGxpdCkge1xuICAgICAgICAgICAgaXRlbVdpZHRoID0gc3BsaXRXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1XaWR0aCArPSBwYWRkaW5nUmlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1XaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBmaWx0ZXIgYWRqYWNlbnQgcmVwZWF0ZWQgZGl2aWRlcnNcbiAgICAgKiBAcGFyYW0ge1Rvb2xiYXJJdGVtW119IGl0ZW1zXG4gICAgICogQHJldHVybnNcbiAgICAgKiBAbWVtYmVyb2YgVGhlVG9vbGJhckNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1cmVUb29sYmFySXRlbXMoaXRlbXM6IFRvb2xiYXJJdGVtW10pIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGEsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBpdGVtc1tpIC0gMV0ua2V5ICE9PSBUb29sYmFyQWN0aW9uVHlwZXMuc3BsaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhLmtleSAhPT0gVG9vbGJhckFjdGlvblR5cGVzLnNwbGl0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRvb2xiYXJJdGVtKGl0ZW06IFRvb2xiYXJJdGVtKSB7XG4gICAgICAgIGNvbnN0IHsgaWNvbkNvbXBvbmVudCwgdHlwZSwgZHJvcGRvd25Nb2RlLCBkcm9wZG93bkl0ZW1LZXksIGluY2x1ZGVzLCAuLi5hcmdzIH0gPSBpdGVtO1xuICAgICAgICBjb25zdCB2aWV3Q29tcG9uZW50ID0gdGhpcy52aWV3Q29tcG9uZW50VHlwZSh0eXBlKTtcbiAgICAgICAgY29uc3QgY29tcFJlZiA9IHRoaXMudG9vbGJhckNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQ8VGhlQmFzZVRvb2xiYXJJdGVtPihpY29uQ29tcG9uZW50ID8gaWNvbkNvbXBvbmVudCA6IHZpZXdDb21wb25lbnQpO1xuXG4gICAgICAgIGNvbXBSZWYuaW5zdGFuY2UuZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgICAgIGNvbXBSZWYuaW5zdGFuY2UudG9vbGJhckl0ZW0gPSBpdGVtO1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMuc2V0KGl0ZW0ua2V5LCBjb21wUmVmKTtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gVG9vbGJhckl0ZW1UeXBlLmRyb3Bkb3duKSB7XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93blJlZiA9IGNvbXBSZWYgYXMgdW5rbm93biBhcyBDb21wb25lbnRSZWY8VGhlQmFzZVRvb2xiYXJEcm9wZG93bj47XG4gICAgICAgICAgICBkcm9wZG93blJlZi5pbnN0YW5jZS5kcm9wZG93bkl0ZW1LZXkgPSBpdGVtLmRyb3Bkb3duSXRlbUtleTtcbiAgICAgICAgICAgIGRyb3Bkb3duUmVmLmluc3RhbmNlLm1lbnVzID0gaW5jbHVkZXMgYXMgVG9vbGJhckl0ZW1bXTtcbiAgICAgICAgICAgIGRyb3Bkb3duUmVmLmluc3RhbmNlLm1vZGUgPSBkcm9wZG93bk1vZGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRvb2xiYXJTcGxpdCgpIHtcbiAgICAgICAgY29uc3QgY29tcFJlZiA9IHRoaXMudG9vbGJhckNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoVGh5RGl2aWRlcik7XG4gICAgICAgIGNvbXBSZWYuaW5zdGFuY2UudGh5VmVydGljYWwgPSB0cnVlO1xuICAgICAgICBjb21wUmVmLmluc3RhbmNlLnRoeUNvbG9yID0gJ2xpZ2h0JztcbiAgICAgICAgY29tcFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ214LTInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1vcmVHcm91cChncm91cDogVG9vbGJhckl0ZW1bXSkge1xuICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29tcFJlZiA9IHRoaXMudG9vbGJhckNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodGhpcy50b29sYmFyR3JvdXApO1xuICAgICAgICAgICAgY29tcFJlZi5pbnN0YW5jZS5lZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICAgICAgICAgIGNvbXBSZWYuaW5zdGFuY2UubWVudXMgPSBncm91cDtcbiAgICAgICAgICAgIGNvbXBSZWYuaW5zdGFuY2UuaXRlbSA9IHRoaXMubW9yZUdyb3VwTWVudTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5zZXQodGhpcy5tb3JlR3JvdXBNZW51LmtleSwgY29tcFJlZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHZpZXdDb21wb25lbnRUeXBlKHR5cGU6IFRvb2xiYXJJdGVtVHlwZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gVG9vbGJhckl0ZW1UeXBlLmRlZmF1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVUb29sYmFySXRlbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gVG9vbGJhckl0ZW1UeXBlLmRyb3Bkb3duKSB7XG4gICAgICAgICAgICByZXR1cm4gVGhlVG9vbGJhckRyb3Bkb3duO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaGVUb29sYmFySXRlbTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICN0b29sYmFyQ29udGFpbmVyPjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPG5nLXRlbXBsYXRlICpuZ0lmPVwiYWZ0ZXJUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFmdGVyVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuIl19
@@ -1,137 +0,0 @@
1
- import { NgFor, NgIf, NgStyle } from '@angular/common';
2
- import { Component, HostBinding, ViewChild } from '@angular/core';
3
- import { ThyAction } from 'ngx-tethys/action';
4
- import { ThyDropdownMenuDivider, ThyDropdownMenuItemActiveDirective, ThyDropdownMenuItemDirective, ThyDropdownMenuItemIconDirective, ThyDropdownMenuItemNameDirective } from 'ngx-tethys/dropdown';
5
- import { ThyIcon } from 'ngx-tethys/icon';
6
- import { DropdownMode } from '../../constants';
7
- import { TheBaseToolbarDropdown } from '../../core';
8
- import { bottomLeftPosition, refocus, topLeftPosition, updatePopoverPosition } from '../../utils';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "ngx-tethys/popover";
11
- import * as i2 from "@angular/cdk/overlay";
12
- export class TheToolbarDropdown extends TheBaseToolbarDropdown {
13
- get isOpen() {
14
- return this.dropdownPopoverRef && this.dropdownPopoverRef.getOverlayRef() && this.dropdownPopoverRef.getOverlayRef().hasAttached();
15
- }
16
- get activeIcon() {
17
- if (this.toolbarItem.dropdownFixedIcon) {
18
- return this.toolbarItem.icon;
19
- }
20
- return this.activeMenuItem?.icon;
21
- }
22
- get activeDropdown() {
23
- return this.toolbarItem.dropdownFixedIcon && !!this.activeKeys.length;
24
- }
25
- constructor(elementRef, thyPopover, viewContainerRef, overlay) {
26
- super();
27
- this.elementRef = elementRef;
28
- this.thyPopover = thyPopover;
29
- this.viewContainerRef = viewContainerRef;
30
- this.overlay = overlay;
31
- this.className = 'the-toolbar-dropdown-container';
32
- this.activeKeys = [];
33
- this.dropdownMode = DropdownMode;
34
- }
35
- ngOnInit() {
36
- if (!this.activeMenuItem) {
37
- this.activeMenuItem = this.defaultDropdownItem;
38
- }
39
- if (this.toolbarItem && this.toolbarItem?.key) {
40
- this.elementRef.nativeElement?.classList?.add(`${this.toolbarItem?.key}`);
41
- }
42
- }
43
- selectionChange(editor) {
44
- super.selectionChange(editor);
45
- this.activeKeys = [];
46
- for (const menu of this.menus) {
47
- if (menu?.active && menu?.active(editor)) {
48
- this.activeKeys.push(menu.key);
49
- }
50
- }
51
- }
52
- toggleDropdown(event) {
53
- super.execute(event);
54
- if (this.editor?.disabled || this.disabled) {
55
- return;
56
- }
57
- this.openDropdownPopover(event);
58
- }
59
- itemMousedown(event, item) {
60
- super.execute(event);
61
- this.closeDropdownPopover();
62
- if (!this.toolbarItem.dropdownFixedIcon) {
63
- this.activeMenuItem = item;
64
- }
65
- if (this.itemMousedownHandle) {
66
- this.itemMousedownHandle(item);
67
- return;
68
- }
69
- if (!this.itemMousedownHandle && !this.editor?.selection) {
70
- refocus(this.editor);
71
- }
72
- if (item?.execute) {
73
- item?.execute(this.editor);
74
- }
75
- }
76
- preventDefault(event) {
77
- event.preventDefault();
78
- event.stopPropagation();
79
- }
80
- openDropdownPopover(event) {
81
- this.dropdownPopoverRef = this.thyPopover.open(this.dropdownTemplate, {
82
- origin: event.currentTarget,
83
- panelClass: ['the-toolbar-dropdown-popover', this.toolbarItem?.key],
84
- originActiveClass: 'active',
85
- placement: 'bottomLeft',
86
- insideClosable: false,
87
- outsideClosable: true,
88
- backdropClosable: true,
89
- hasBackdrop: false,
90
- offset: 4,
91
- minWidth: 0,
92
- viewContainerRef: this.viewContainerRef,
93
- scrollStrategy: this.overlay.scrollStrategies.reposition()
94
- });
95
- this.updatePopoverPosition();
96
- }
97
- updatePopoverPosition() {
98
- const origin = this.elementRef.nativeElement;
99
- const overlayRef = this.dropdownPopoverRef?.getOverlayRef();
100
- updatePopoverPosition(overlayRef, origin, [bottomLeftPosition, topLeftPosition]);
101
- }
102
- closeDropdownPopover() {
103
- if (this.dropdownPopoverRef) {
104
- this.dropdownPopoverRef?.close();
105
- }
106
- }
107
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TheToolbarDropdown, deps: [{ token: i0.ElementRef }, { token: i1.ThyPopover }, { token: i0.ViewContainerRef }, { token: i2.Overlay }], target: i0.ɵɵFactoryTarget.Component }); }
108
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TheToolbarDropdown, isStandalone: true, selector: "the-toolbar-dropdown", host: { properties: { "class": "this.className" } }, viewQueries: [{ propertyName: "iconModeTemplate", first: true, predicate: ["iconModeTemplate"], descendants: true, static: true }, { propertyName: "textModeTemplate", first: true, predicate: ["textModeTemplate"], descendants: true, static: true }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<a\n *ngIf=\"mode === dropdownMode.icon\"\n href=\"javascript:;\"\n class=\"icon-mode\"\n thyAction\n [thyActionIcon]=\"activeIcon\"\n [thyActionActive]=\"activeDropdown\"\n (mousedown)=\"preventDefault($event)\"\n (click)=\"toggleDropdown($event)\"\n>\n <thy-icon *ngIf=\"!toolbarItem.isHideDropdownActionIcon\" class=\"font-size-sm text-desc ml-1\" thyIconName=\"caret-down\"></thy-icon>\n</a>\n<a\n *ngIf=\"mode !== dropdownMode.icon\"\n href=\"javascript:;\"\n class=\"text-mode\"\n thyAction\n (mousedown)=\"preventDefault($event)\"\n (click)=\"toggleDropdown($event)\"\n>\n <span class=\"show-text\">{{ activeMenuItem?.name }}</span>\n <thy-icon class=\"font-size-sm text-desc ml-1\" thyIconName=\"caret-down\"></thy-icon>\n</a>\n\n<ng-template #dropdownTemplate>\n <div class=\"thy-dropdown-menu\">\n <ng-container *ngFor=\"let menu of menus\">\n <a\n *ngIf=\"menu.key !== 'split'\"\n class=\"d-flex justify-content-between text-secondary\"\n href=\"javascript:;\"\n thyDropdownMenuItem\n [ngStyle]=\"menu?.styles\"\n [thyDropdownMenuItemActive]=\"activeKeys.includes(menu.key)\"\n (mousedown)=\"preventDefault($event)\"\n (click)=\"itemMousedown($event, menu)\"\n >\n <div class=\"d-flex align-items-center\">\n <thy-icon\n class=\"text-secondary\"\n *ngIf=\"menu?.icon && mode === dropdownMode.icon\"\n thyDropdownMenuItemIcon\n [thyIconName]=\"menu.icon\"\n ></thy-icon>\n <span class=\"text-body\" *ngIf=\"menu?.name\" thyDropdownMenuItemName>{{ menu.name }}</span>\n </div>\n <div class=\"menu-item-right font-size-sm text-muted\" *ngIf=\"menu?.shortcutKey\">{{ menu.shortcutKey }}</div>\n </a>\n <thy-dropdown-menu-divider *ngIf=\"menu.key === 'split'\"></thy-dropdown-menu-divider>\n </ng-container>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }, { kind: "component", type: ThyAction, selector: "thy-action, [thyAction]", inputs: ["thyType", "thyIcon", "thyActionIcon", "thyActive", "thyActionActive", "thyTheme", "thyHoverIcon", "thyDisabled"] }, { kind: "directive", type: ThyDropdownMenuItemDirective, selector: "[thyDropdownMenuItem]", inputs: ["thyType", "thyDisabled"] }, { kind: "component", type: ThyDropdownMenuDivider, selector: "thy-dropdown-menu-divider" }, { kind: "directive", type: ThyDropdownMenuItemNameDirective, selector: "[thyDropdownMenuItemName]" }, { kind: "directive", type: ThyDropdownMenuItemIconDirective, selector: "[thyDropdownMenuItemIcon]" }, { kind: "directive", type: ThyDropdownMenuItemActiveDirective, selector: "[thyDropdownMenuItemActive]", inputs: ["thyDropdownMenuItemActive"] }] }); }
109
- }
110
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TheToolbarDropdown, decorators: [{
111
- type: Component,
112
- args: [{ selector: 'the-toolbar-dropdown', standalone: true, imports: [
113
- NgIf,
114
- NgFor,
115
- NgStyle,
116
- ThyIcon,
117
- ThyAction,
118
- ThyDropdownMenuItemDirective,
119
- ThyDropdownMenuDivider,
120
- ThyDropdownMenuItemNameDirective,
121
- ThyDropdownMenuItemIconDirective,
122
- ThyDropdownMenuItemActiveDirective
123
- ], template: "<a\n *ngIf=\"mode === dropdownMode.icon\"\n href=\"javascript:;\"\n class=\"icon-mode\"\n thyAction\n [thyActionIcon]=\"activeIcon\"\n [thyActionActive]=\"activeDropdown\"\n (mousedown)=\"preventDefault($event)\"\n (click)=\"toggleDropdown($event)\"\n>\n <thy-icon *ngIf=\"!toolbarItem.isHideDropdownActionIcon\" class=\"font-size-sm text-desc ml-1\" thyIconName=\"caret-down\"></thy-icon>\n</a>\n<a\n *ngIf=\"mode !== dropdownMode.icon\"\n href=\"javascript:;\"\n class=\"text-mode\"\n thyAction\n (mousedown)=\"preventDefault($event)\"\n (click)=\"toggleDropdown($event)\"\n>\n <span class=\"show-text\">{{ activeMenuItem?.name }}</span>\n <thy-icon class=\"font-size-sm text-desc ml-1\" thyIconName=\"caret-down\"></thy-icon>\n</a>\n\n<ng-template #dropdownTemplate>\n <div class=\"thy-dropdown-menu\">\n <ng-container *ngFor=\"let menu of menus\">\n <a\n *ngIf=\"menu.key !== 'split'\"\n class=\"d-flex justify-content-between text-secondary\"\n href=\"javascript:;\"\n thyDropdownMenuItem\n [ngStyle]=\"menu?.styles\"\n [thyDropdownMenuItemActive]=\"activeKeys.includes(menu.key)\"\n (mousedown)=\"preventDefault($event)\"\n (click)=\"itemMousedown($event, menu)\"\n >\n <div class=\"d-flex align-items-center\">\n <thy-icon\n class=\"text-secondary\"\n *ngIf=\"menu?.icon && mode === dropdownMode.icon\"\n thyDropdownMenuItemIcon\n [thyIconName]=\"menu.icon\"\n ></thy-icon>\n <span class=\"text-body\" *ngIf=\"menu?.name\" thyDropdownMenuItemName>{{ menu.name }}</span>\n </div>\n <div class=\"menu-item-right font-size-sm text-muted\" *ngIf=\"menu?.shortcutKey\">{{ menu.shortcutKey }}</div>\n </a>\n <thy-dropdown-menu-divider *ngIf=\"menu.key === 'split'\"></thy-dropdown-menu-divider>\n </ng-container>\n </div>\n</ng-template>\n" }]
124
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.ThyPopover }, { type: i0.ViewContainerRef }, { type: i2.Overlay }], propDecorators: { className: [{
125
- type: HostBinding,
126
- args: ['class']
127
- }], iconModeTemplate: [{
128
- type: ViewChild,
129
- args: ['iconModeTemplate', { static: true }]
130
- }], textModeTemplate: [{
131
- type: ViewChild,
132
- args: ['textModeTemplate', { static: true }]
133
- }], dropdownTemplate: [{
134
- type: ViewChild,
135
- args: ['dropdownTemplate', { static: true }]
136
- }] } });
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGJhci1kcm9wZG93bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvY29tcG9uZW50cy90b29sYmFyLWRyb3Bkb3duL3Rvb2xiYXItZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvdG9vbGJhci1kcm9wZG93bi90b29sYmFyLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQWMsV0FBVyxFQUF1QixTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQ0gsc0JBQXNCLEVBQ3RCLGtDQUFrQyxFQUNsQyw0QkFBNEIsRUFDNUIsZ0NBQWdDLEVBQ2hDLGdDQUFnQyxFQUNuQyxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXBELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7O0FBbUJsRyxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsc0JBQXNCO0lBUzFELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFB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QUUsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ3JDLENBQUM7SUFDTCxDQUFDOytHQS9IUSxrQkFBa0I7bUdBQWxCLGtCQUFrQiwwZ0JDcEMvQiwrNERBb0RBLDRDRDVCUSxJQUFJLDZGQUNKLEtBQUssbUhBQ0wsT0FBTywyRUFDUCxPQUFPLHNNQUNQLFNBQVMsZ01BQ1QsNEJBQTRCLHNHQUM1QixzQkFBc0Isc0VBQ3RCLGdDQUFnQyxzRUFDaEMsZ0NBQWdDLHNFQUNoQyxrQ0FBa0M7OzRGQUc3QixrQkFBa0I7a0JBakI5QixTQUFTOytCQUNJLHNCQUFzQixjQUVwQixJQUFJLFdBQ1A7d0JBQ0wsSUFBSTt3QkFDSixLQUFLO3dCQUNMLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxTQUFTO3dCQUNULDRCQUE0Qjt3QkFDNUIsc0JBQXNCO3dCQUN0QixnQ0FBZ0M7d0JBQ2hDLGdDQUFnQzt3QkFDaEMsa0NBQWtDO3FCQUNyQzs2SkFHcUIsU0FBUztzQkFBOUIsV0FBVzt1QkFBQyxPQUFPO2dCQXdCcEIsZ0JBQWdCO3NCQURmLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkvQyxnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSS9DLGdCQUFnQjtzQkFEZixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBOZ0ZvciwgTmdJZiwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRoeUFjdGlvbiB9IGZyb20gJ25neC10ZXRoeXMvYWN0aW9uJztcbmltcG9ydCB7XG4gICAgVGh5RHJvcGRvd25NZW51RGl2aWRlcixcbiAgICBUaHlEcm9wZG93bk1lbnVJdGVtQWN0aXZlRGlyZWN0aXZlLFxuICAgIFRoeURyb3Bkb3duTWVudUl0ZW1EaXJlY3RpdmUsXG4gICAgVGh5RHJvcGRvd25NZW51SXRlbUljb25EaXJlY3RpdmUsXG4gICAgVGh5RHJvcGRvd25NZW51SXRlbU5hbWVEaXJlY3RpdmVcbn0gZnJvbSAnbmd4LXRldGh5cy9kcm9wZG93bic7XG5pbXBvcnQgeyBUaHlJY29uIH0gZnJvbSAnbmd4LXRldGh5cy9pY29uJztcbmltcG9ydCB7IFRoeVBvcG92ZXIsIFRoeVBvcG92ZXJSZWYgfSBmcm9tICduZ3gtdGV0aHlzL3BvcG92ZXInO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2RlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFRoZUJhc2VUb29sYmFyRHJvcGRvd24gfSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IFRvb2xiYXJJdGVtLCBUb29sYmFyS2V5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBib3R0b21MZWZ0UG9zaXRpb24sIHJlZm9jdXMsIHRvcExlZnRQb3NpdGlvbiwgdXBkYXRlUG9wb3ZlclBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoZS10b29sYmFyLWRyb3Bkb3duJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdG9vbGJhci1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nRm9yLFxuICAgICAgICBOZ1N0eWxlLFxuICAgICAgICBUaHlJY29uLFxuICAgICAgICBUaHlBY3Rpb24sXG4gICAgICAgIFRoeURyb3Bkb3duTWVudUl0ZW1EaXJlY3RpdmUsXG4gICAgICAgIFRoeURyb3Bkb3duTWVudURpdmlkZXIsXG4gICAgICAgIFRoeURyb3Bkb3duTWVudUl0ZW1OYW1lRGlyZWN0aXZlLFxuICAgICAgICBUaHlEcm9wZG93bk1lbnVJdGVtSWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgVGh5RHJvcGRvd25NZW51SXRlbUFjdGl2ZURpcmVjdGl2ZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgVGhlVG9vbGJhckRyb3Bkb3duIGV4dGVuZHMgVGhlQmFzZVRvb2xiYXJEcm9wZG93biBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGNsYXNzTmFtZSA9ICd0aGUtdG9vbGJhci1kcm9wZG93bi1jb250YWluZXInO1xuXG4gICAgYWN0aXZlS2V5czogVG9vbGJhcktleVtdID0gW107XG5cbiAgICBkcm9wZG93bk1vZGUgPSBEcm9wZG93bk1vZGU7XG5cbiAgICBwdWJsaWMgZHJvcGRvd25Qb3BvdmVyUmVmOiBUaHlQb3BvdmVyUmVmPGFueT47XG5cbiAgICBnZXQgaXNPcGVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wZG93blBvcG92ZXJSZWYgJiYgdGhpcy5kcm9wZG93blBvcG92ZXJSZWYuZ2V0T3ZlcmxheVJlZigpICYmIHRoaXMuZHJvcGRvd25Qb3BvdmVyUmVmLmdldE92ZXJsYXlSZWYoKS5oYXNBdHRhY2hlZCgpO1xuICAgIH1cblxuICAgIGdldCBhY3RpdmVJY29uKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnRvb2xiYXJJdGVtLmRyb3Bkb3duRml4ZWRJY29uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b29sYmFySXRlbS5pY29uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZU1lbnVJdGVtPy5pY29uO1xuICAgIH1cblxuICAgIGdldCBhY3RpdmVEcm9wZG93bigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbGJhckl0ZW0uZHJvcGRvd25GaXhlZEljb24gJiYgISF0aGlzLmFjdGl2ZUtleXMubGVuZ3RoO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2ljb25Nb2RlVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIGljb25Nb2RlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCd0ZXh0TW9kZVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICB0ZXh0TW9kZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZHJvcGRvd25UZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgZHJvcGRvd25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSB0aHlQb3BvdmVyOiBUaHlQb3BvdmVyLFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlTWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTWVudUl0ZW0gPSB0aGlzLmRlZmF1bHREcm9wZG93bkl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50b29sYmFySXRlbSAmJiB0aGlzLnRvb2xiYXJJdGVtPy5rZXkpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3Q/LmFkZChgJHt0aGlzLnRvb2xiYXJJdGVtPy5rZXl9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3Rpb25DaGFuZ2UoZWRpdG9yOiBFZGl0b3IpIHtcbiAgICAgICAgc3VwZXIuc2VsZWN0aW9uQ2hhbmdlKGVkaXRvcik7XG4gICAgICAgIHRoaXMuYWN0aXZlS2V5cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG1lbnUgb2YgdGhpcy5tZW51cykge1xuICAgICAgICAgICAgaWYgKG1lbnU/LmFjdGl2ZSAmJiBtZW51Py5hY3RpdmUoZWRpdG9yKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlS2V5cy5wdXNoKG1lbnUua2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZURyb3Bkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHN1cGVyLmV4ZWN1dGUoZXZlbnQpO1xuXG4gICAgICAgIGlmICh0aGlzLmVkaXRvcj8uZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3BlbkRyb3Bkb3duUG9wb3ZlcihldmVudCk7XG4gICAgfVxuXG4gICAgaXRlbU1vdXNlZG93bihldmVudDogTW91c2VFdmVudCwgaXRlbTogVG9vbGJhckl0ZW0pIHtcbiAgICAgICAgc3VwZXIuZXhlY3V0ZShldmVudCk7XG5cbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duUG9wb3ZlcigpO1xuXG4gICAgICAgIGlmICghdGhpcy50b29sYmFySXRlbS5kcm9wZG93bkZpeGVkSWNvbikge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVNZW51SXRlbSA9IGl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pdGVtTW91c2Vkb3duSGFuZGxlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1Nb3VzZWRvd25IYW5kbGUoaXRlbSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXRlbU1vdXNlZG93bkhhbmRsZSAmJiAhdGhpcy5lZGl0b3I/LnNlbGVjdGlvbikge1xuICAgICAgICAgICAgcmVmb2N1cyh0aGlzLmVkaXRvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlbT8uZXhlY3V0ZSkge1xuICAgICAgICAgICAgaXRlbT8uZXhlY3V0ZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcmV2ZW50RGVmYXVsdChldmVudDogRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgb3BlbkRyb3Bkb3duUG9wb3ZlcihldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duUG9wb3ZlclJlZiA9IHRoaXMudGh5UG9wb3Zlci5vcGVuKHRoaXMuZHJvcGRvd25UZW1wbGF0ZSwge1xuICAgICAgICAgICAgb3JpZ2luOiBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWyd0aGUtdG9vbGJhci1kcm9wZG93bi1wb3BvdmVyJywgdGhpcy50b29sYmFySXRlbT8ua2V5XSxcbiAgICAgICAgICAgIG9yaWdpbkFjdGl2ZUNsYXNzOiAnYWN0aXZlJyxcbiAgICAgICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbUxlZnQnLFxuICAgICAgICAgICAgaW5zaWRlQ2xvc2FibGU6IGZhbHNlLFxuICAgICAgICAgICAgb3V0c2lkZUNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgYmFja2Ryb3BDbG9zYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgICAgICAgIG9mZnNldDogNCxcbiAgICAgICAgICAgIG1pbldpZHRoOiAwLFxuICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZjogdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVQb3BvdmVyUG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3BvdmVyUG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5kcm9wZG93blBvcG92ZXJSZWY/LmdldE92ZXJsYXlSZWYoKTtcbiAgICAgICAgdXBkYXRlUG9wb3ZlclBvc2l0aW9uKG92ZXJsYXlSZWYsIG9yaWdpbiwgW2JvdHRvbUxlZnRQb3NpdGlvbiwgdG9wTGVmdFBvc2l0aW9uXSk7XG4gICAgfVxuXG4gICAgY2xvc2VEcm9wZG93blBvcG92ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRyb3Bkb3duUG9wb3ZlclJlZikge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93blBvcG92ZXJSZWY/LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8YVxuICAqbmdJZj1cIm1vZGUgPT09IGRyb3Bkb3duTW9kZS5pY29uXCJcbiAgaHJlZj1cImphdmFzY3JpcHQ6O1wiXG4gIGNsYXNzPVwiaWNvbi1tb2RlXCJcbiAgdGh5QWN0aW9uXG4gIFt0aHlBY3Rpb25JY29uXT1cImFjdGl2ZUljb25cIlxuICBbdGh5QWN0aW9uQWN0aXZlXT1cImFjdGl2ZURyb3Bkb3duXCJcbiAgKG1vdXNlZG93bik9XCJwcmV2ZW50RGVmYXVsdCgkZXZlbnQpXCJcbiAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCRldmVudClcIlxuPlxuICA8dGh5LWljb24gKm5nSWY9XCIhdG9vbGJhckl0ZW0uaXNIaWRlRHJvcGRvd25BY3Rpb25JY29uXCIgY2xhc3M9XCJmb250LXNpemUtc20gdGV4dC1kZXNjIG1sLTFcIiB0aHlJY29uTmFtZT1cImNhcmV0LWRvd25cIj48L3RoeS1pY29uPlxuPC9hPlxuPGFcbiAgKm5nSWY9XCJtb2RlICE9PSBkcm9wZG93bk1vZGUuaWNvblwiXG4gIGhyZWY9XCJqYXZhc2NyaXB0OjtcIlxuICBjbGFzcz1cInRleHQtbW9kZVwiXG4gIHRoeUFjdGlvblxuICAobW91c2Vkb3duKT1cInByZXZlbnREZWZhdWx0KCRldmVudClcIlxuICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJGV2ZW50KVwiXG4+XG4gIDxzcGFuIGNsYXNzPVwic2hvdy10ZXh0XCI+e3sgYWN0aXZlTWVudUl0ZW0/Lm5hbWUgfX08L3NwYW4+XG4gIDx0aHktaWNvbiBjbGFzcz1cImZvbnQtc2l6ZS1zbSB0ZXh0LWRlc2MgbWwtMVwiIHRoeUljb25OYW1lPVwiY2FyZXQtZG93blwiPjwvdGh5LWljb24+XG48L2E+XG5cbjxuZy10ZW1wbGF0ZSAjZHJvcGRvd25UZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cInRoeS1kcm9wZG93bi1tZW51XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbWVudSBvZiBtZW51c1wiPlxuICAgICAgPGFcbiAgICAgICAgKm5nSWY9XCJtZW51LmtleSAhPT0gJ3NwbGl0J1wiXG4gICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHRleHQtc2Vjb25kYXJ5XCJcbiAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6O1wiXG4gICAgICAgIHRoeURyb3Bkb3duTWVudUl0ZW1cbiAgICAgICAgW25nU3R5bGVdPVwibWVudT8uc3R5bGVzXCJcbiAgICAgICAgW3RoeURyb3Bkb3duTWVudUl0ZW1BY3RpdmVdPVwiYWN0aXZlS2V5cy5pbmNsdWRlcyhtZW51LmtleSlcIlxuICAgICAgICAobW91c2Vkb3duKT1cInByZXZlbnREZWZhdWx0KCRldmVudClcIlxuICAgICAgICAoY2xpY2spPVwiaXRlbU1vdXNlZG93bigkZXZlbnQsIG1lbnUpXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8dGh5LWljb25cbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgKm5nSWY9XCJtZW51Py5pY29uICYmIG1vZGUgPT09IGRyb3Bkb3duTW9kZS5pY29uXCJcbiAgICAgICAgICAgIHRoeURyb3Bkb3duTWVudUl0ZW1JY29uXG4gICAgICAgICAgICBbdGh5SWNvbk5hbWVdPVwibWVudS5pY29uXCJcbiAgICAgICAgICA+PC90aHktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtYm9keVwiICpuZ0lmPVwibWVudT8ubmFtZVwiIHRoeURyb3Bkb3duTWVudUl0ZW1OYW1lPnt7IG1lbnUubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWl0ZW0tcmlnaHQgZm9udC1zaXplLXNtIHRleHQtbXV0ZWRcIiAqbmdJZj1cIm1lbnU/LnNob3J0Y3V0S2V5XCI+e3sgbWVudS5zaG9ydGN1dEtleSB9fTwvZGl2PlxuICAgICAgPC9hPlxuICAgICAgPHRoeS1kcm9wZG93bi1tZW51LWRpdmlkZXIgKm5nSWY9XCJtZW51LmtleSA9PT0gJ3NwbGl0J1wiPjwvdGh5LWRyb3Bkb3duLW1lbnUtZGl2aWRlcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19