studiokit-scaffolding-js 7.0.12-next.1.3 → 7.0.12-next.2.1

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 (258) hide show
  1. package/lib/components/ActionList.js +164 -37
  2. package/lib/components/AlertDialog.js +128 -12
  3. package/lib/components/AlertWithIcon.js +88 -29
  4. package/lib/components/ConnectedModal.js +35 -12
  5. package/lib/components/Dropdowns/GroupsDropdown.js +63 -45
  6. package/lib/components/Dropdowns/ManagedNavDropdown.js +92 -67
  7. package/lib/components/Dropdowns/UserDropdown.js +105 -24
  8. package/lib/components/Dropdowns/index.js +4 -10
  9. package/lib/components/EntityOwnerList.js +47 -21
  10. package/lib/components/Error.js +101 -12
  11. package/lib/components/ErrorBoundary.js +127 -38
  12. package/lib/components/ErrorMessage.js +39 -12
  13. package/lib/components/Forms/DateField.js +56 -45
  14. package/lib/components/Forms/TimeField.js +76 -45
  15. package/lib/components/Forms/index.js +3 -5
  16. package/lib/components/Groups/CreateEditCopySaveButtons.js +109 -14
  17. package/lib/components/Groups/ExternalGroups/Attach.js +206 -151
  18. package/lib/components/Groups/ExternalGroups/Table.js +176 -48
  19. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
  20. package/lib/components/Groups/RosterSyncInfo.js +142 -23
  21. package/lib/components/HOC/AccessibleAppComponent.js +88 -72
  22. package/lib/components/HOC/ActivityRequiredComponent.js +68 -33
  23. package/lib/components/HOC/AsyncComponent.js +49 -41
  24. package/lib/components/HOC/AuthenticatedComponent.js +55 -44
  25. package/lib/components/HOC/CollectionComponent.js +154 -104
  26. package/lib/components/HOC/CollectionFirstItemComponent.js +45 -40
  27. package/lib/components/HOC/CollectionItemComponent.js +152 -100
  28. package/lib/components/HOC/ConnectedModalComponent.js +87 -69
  29. package/lib/components/HOC/DataDependentComponent.js +26 -27
  30. package/lib/components/HOC/EntityComponent.js +57 -53
  31. package/lib/components/HOC/FullscreenModalComponent.js +139 -108
  32. package/lib/components/HOC/GroupActivityRequiredComponent.js +27 -20
  33. package/lib/components/HOC/GuidComponent.js +20 -20
  34. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +32 -29
  35. package/lib/components/HOC/ModelErrorRedirectComponent.js +37 -39
  36. package/lib/components/HOC/SearchPersistorComponent.js +237 -173
  37. package/lib/components/HOC/UnauthenticatedComponent.js +32 -30
  38. package/lib/components/HOC/UserComponent.js +6 -8
  39. package/lib/components/Icons/IconAlphaList.js +28 -8
  40. package/lib/components/Icons/IconExternalUser.js +28 -8
  41. package/lib/components/Icons/IconImpersonation.js +28 -8
  42. package/lib/components/Icons/IconStopImpersonating.js +28 -8
  43. package/lib/components/Icons/IconTable.js +29 -9
  44. package/lib/components/Icons/IconTableDeleteCol.js +28 -8
  45. package/lib/components/Icons/IconTableDeleteRow.js +28 -8
  46. package/lib/components/Icons/IconTableInsertCol.js +28 -8
  47. package/lib/components/Icons/IconTableInsertRow.js +28 -8
  48. package/lib/components/Impersonation/Button.js +71 -16
  49. package/lib/components/Impersonation/Link.js +72 -16
  50. package/lib/components/Impersonation/UserDetail.js +60 -11
  51. package/lib/components/Loading.js +23 -8
  52. package/lib/components/LockDownBrowser/Check.js +188 -51
  53. package/lib/components/LockDownBrowser/ExitButton.js +22 -13
  54. package/lib/components/LockDownBrowser/Launch.js +64 -64
  55. package/lib/components/Lti/Confirm.js +147 -14
  56. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +165 -36
  57. package/lib/components/Lti/Launch.js +99 -25
  58. package/lib/components/Lti/LaunchGroup.js +81 -16
  59. package/lib/components/ManageTable.js +304 -90
  60. package/lib/components/ManageTableNoDataComponent.js +38 -7
  61. package/lib/components/NewVersionAlert.js +76 -49
  62. package/lib/components/NotFound.js +81 -11
  63. package/lib/components/Notifications.js +179 -129
  64. package/lib/components/PaginationNextButton.js +28 -9
  65. package/lib/components/PaginationPreviousButton.js +28 -9
  66. package/lib/components/Quill/CustomToolbar.js +427 -222
  67. package/lib/components/Quill/Formats/Image.js +67 -67
  68. package/lib/components/Quill/Formats/List.js +38 -47
  69. package/lib/components/Quill/Formats/Video.js +23 -26
  70. package/lib/components/Quill/ImageDropModule.js +136 -114
  71. package/lib/components/Quill/ImageWarning.js +41 -12
  72. package/lib/components/Quill/ImageWithAltTextModal.js +420 -89
  73. package/lib/components/Quill/Specs/CustomImageSpec.js +32 -31
  74. package/lib/components/Quill/Specs/CustomVideoSpec.js +22 -23
  75. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +89 -97
  76. package/lib/components/Quill/TableModule/Blots/TableBlot.js +47 -50
  77. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +48 -51
  78. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +219 -224
  79. package/lib/components/Quill/TableModule/Blots/TableContainer.js +75 -86
  80. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +70 -73
  81. package/lib/components/Quill/TableModule/constants.js +40 -42
  82. package/lib/components/Quill/TableModule/index.js +357 -305
  83. package/lib/components/Quill/TableModule/utils.js +39 -48
  84. package/lib/components/Quill/accessibilityFix.js +219 -223
  85. package/lib/components/Quill/index.js +30 -33
  86. package/lib/components/RefreshIndicator/Bordered.js +44 -10
  87. package/lib/components/RefreshIndicator/Inline.js +43 -12
  88. package/lib/components/RefreshIndicator/index.js +257 -62
  89. package/lib/components/SearchControls.js +211 -14
  90. package/lib/components/SentryRoute.js +5 -7
  91. package/lib/components/Tables/RoleFilter.js +66 -38
  92. package/lib/components/Tables/TextFilter.js +58 -18
  93. package/lib/components/UserRoles/Add.js +193 -99
  94. package/lib/components/UserRoles/Context.js +3 -6
  95. package/lib/components/UserRoles/RoleCell.js +176 -75
  96. package/lib/components/UserRoles/Select.js +151 -20
  97. package/lib/components/UserRoles/Table.js +215 -82
  98. package/lib/components/UserRoles/index.js +526 -386
  99. package/lib/config/eslint/index.js +26 -29
  100. package/lib/config/eslint/lib/order.js +21 -28
  101. package/lib/config/eslint/lib/prettier.js +15 -19
  102. package/lib/config/eslint/lib/typescript.js +87 -113
  103. package/lib/config/eslint/react.js +18 -15
  104. package/lib/constants/baseActivity.js +26 -28
  105. package/lib/constants/baseRole.js +10 -12
  106. package/lib/constants/configuration.js +43 -55
  107. package/lib/constants/externalProviderType.js +6 -8
  108. package/lib/constants/fetchErrorData.js +10 -12
  109. package/lib/constants/index.js +13 -15
  110. package/lib/constants/lockDownBrowser.js +23 -25
  111. package/lib/constants/mockData.js +370 -300
  112. package/lib/constants/modelStatus.js +11 -13
  113. package/lib/constants/notificationType.js +8 -10
  114. package/lib/constants/operatingSystem.js +8 -10
  115. package/lib/constants/shard.js +7 -9
  116. package/lib/constants/table.js +18 -22
  117. package/lib/constants/tier.js +8 -10
  118. package/lib/constants/userRole.js +11 -8
  119. package/lib/endpointMappings.js +191 -182
  120. package/lib/hooks/useCollection.js +79 -65
  121. package/lib/hooks/useCollectionConfiguration.js +220 -80
  122. package/lib/hooks/useCollectionItem.js +151 -57
  123. package/lib/hooks/useGuid.js +16 -9
  124. package/lib/hooks/usePrevious.js +14 -13
  125. package/lib/index.js +11 -26
  126. package/lib/redux/actionCreator.js +44 -35
  127. package/lib/redux/actions/AuthAction.js +45 -32
  128. package/lib/redux/actions/ModalAction.js +6 -8
  129. package/lib/redux/actions/ModelAction.js +95 -43
  130. package/lib/redux/actions/NotificationAction.js +6 -8
  131. package/lib/redux/actions/SearchAction.js +5 -7
  132. package/lib/redux/actions/index.js +6 -8
  133. package/lib/redux/configureReducers.js +48 -46
  134. package/lib/redux/configureStore.js +77 -91
  135. package/lib/redux/helpers.js +2 -5
  136. package/lib/redux/reducers/authReducer.js +44 -43
  137. package/lib/redux/reducers/index.js +7 -14
  138. package/lib/redux/reducers/modalsReducer.js +43 -31
  139. package/lib/redux/reducers/modelsReducer.js +131 -137
  140. package/lib/redux/reducers/notificationsReducer.js +20 -20
  141. package/lib/redux/reducers/searchReducer.js +13 -13
  142. package/lib/redux/sagas/appInsightsSaga.js +19 -21
  143. package/lib/redux/sagas/authSaga.js +248 -234
  144. package/lib/redux/sagas/caliperSaga.js +142 -131
  145. package/lib/redux/sagas/clockOffsetSaga.js +29 -32
  146. package/lib/redux/sagas/configurationSaga.js +8 -10
  147. package/lib/redux/sagas/downtimeApiErrorSaga.js +16 -19
  148. package/lib/redux/sagas/errorSaga.js +23 -24
  149. package/lib/redux/sagas/googleAnalyticsSaga.js +24 -27
  150. package/lib/redux/sagas/identityProviderSaga.js +19 -21
  151. package/lib/redux/sagas/initialDataLoadSaga.js +34 -31
  152. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +25 -22
  153. package/lib/redux/sagas/modelFetchSaga.js +302 -286
  154. package/lib/redux/sagas/noStoreSaga.js +60 -61
  155. package/lib/redux/sagas/postLoginDataSaga.js +37 -32
  156. package/lib/redux/sagas/postLoginRedirectSaga.js +22 -27
  157. package/lib/redux/sagas/rootSaga.js +77 -60
  158. package/lib/redux/sagas/sentrySaga.js +25 -28
  159. package/lib/redux/sagas/userIdSaga.js +13 -15
  160. package/lib/services/codeProviderService.js +21 -21
  161. package/lib/services/dateService.js +6 -8
  162. package/lib/services/documentService.js +10 -11
  163. package/lib/services/fetchService.js +103 -95
  164. package/lib/services/persistenceService.js +27 -30
  165. package/lib/services/ticketProviderService.js +25 -25
  166. package/lib/services/tokenPersistenceService.js +8 -10
  167. package/lib/services/windowService.js +14 -16
  168. package/lib/startup.js +110 -101
  169. package/lib/types/AppConfiguration.js +2 -2
  170. package/lib/types/Artifact.js +7 -9
  171. package/lib/types/BaseReduxState.js +2 -2
  172. package/lib/types/Client.js +2 -2
  173. package/lib/types/Collection.js +2 -2
  174. package/lib/types/Configuration.js +2 -2
  175. package/lib/types/DeepLinkingResponseRequest.js +2 -2
  176. package/lib/types/DeletableModel.js +2 -2
  177. package/lib/types/Event.js +2 -2
  178. package/lib/types/ExternalGroup.js +2 -2
  179. package/lib/types/ExternalProvider.js +2 -2
  180. package/lib/types/ExternalTerm.js +2 -2
  181. package/lib/types/Group.js +2 -2
  182. package/lib/types/IdentityProvider.js +2 -2
  183. package/lib/types/LtiLaunch.js +2 -2
  184. package/lib/types/NameOnlyEntity.js +2 -2
  185. package/lib/types/Notification.js +2 -2
  186. package/lib/types/OptionalRecord.js +2 -2
  187. package/lib/types/OwnerSchedule.js +2 -2
  188. package/lib/types/PropertyOfType.js +2 -2
  189. package/lib/types/Quill.js +2 -2
  190. package/lib/types/RoleDescription.js +2 -2
  191. package/lib/types/Search.js +2 -2
  192. package/lib/types/SimpleLocation.js +2 -2
  193. package/lib/types/UniTime.js +2 -2
  194. package/lib/types/User.js +2 -2
  195. package/lib/types/UserRole.js +2 -2
  196. package/lib/types/auth/AuthState.js +2 -2
  197. package/lib/types/auth/CasV1LoginRequestBody.js +2 -2
  198. package/lib/types/auth/ClientCredentials.js +2 -2
  199. package/lib/types/auth/CodeProviderService.js +2 -2
  200. package/lib/types/auth/LocalLoginRequestBody.js +2 -2
  201. package/lib/types/auth/TicketProviderService.js +2 -2
  202. package/lib/types/auth/TokenPersistenceService.js +2 -2
  203. package/lib/types/auth/index.js +8 -10
  204. package/lib/types/externals.d.js +2 -0
  205. package/lib/types/index.js +29 -31
  206. package/lib/types/net/EndpointConfig.js +2 -2
  207. package/lib/types/net/EndpointMapping.js +2 -2
  208. package/lib/types/net/EndpointMappings.js +2 -2
  209. package/lib/types/net/ErrorHandler.js +2 -2
  210. package/lib/types/net/FetchConfig.js +2 -2
  211. package/lib/types/net/FetchErrorData.js +6 -8
  212. package/lib/types/net/FetchResult.js +2 -2
  213. package/lib/types/net/HTTPMethod.js +2 -2
  214. package/lib/types/net/HTTPStatusCode.js +12 -14
  215. package/lib/types/net/Metadata.js +2 -2
  216. package/lib/types/net/Model.js +2 -2
  217. package/lib/types/net/ModelCollection.js +2 -2
  218. package/lib/types/net/ModelsState.js +2 -2
  219. package/lib/types/net/OAuthToken.js +2 -2
  220. package/lib/types/net/OAuthTokenOrNull.js +2 -2
  221. package/lib/types/net/TokenAccessFunction.js +2 -2
  222. package/lib/types/net/index.js +17 -19
  223. package/lib/utils/baseActivity.js +83 -85
  224. package/lib/utils/baseRole.js +32 -36
  225. package/lib/utils/collection.js +403 -297
  226. package/lib/utils/cookies.js +19 -23
  227. package/lib/utils/date.js +188 -205
  228. package/lib/utils/dom.js +130 -131
  229. package/lib/utils/domainIdentifier.js +4 -8
  230. package/lib/utils/entityUserRole.js +2 -5
  231. package/lib/utils/error.js +14 -19
  232. package/lib/utils/events.js +32 -31
  233. package/lib/utils/externalGroup.js +20 -25
  234. package/lib/utils/externalProviders.js +4 -7
  235. package/lib/utils/externalTerms.js +6 -6
  236. package/lib/utils/fetch.js +168 -176
  237. package/lib/utils/group.js +14 -11
  238. package/lib/utils/groupDates.js +38 -46
  239. package/lib/utils/groupRoles.js +23 -32
  240. package/lib/utils/lockDownBrowser.js +12 -15
  241. package/lib/utils/logger.js +23 -28
  242. package/lib/utils/lti.js +4 -7
  243. package/lib/utils/model.js +28 -43
  244. package/lib/utils/number.js +9 -13
  245. package/lib/utils/promise.js +23 -26
  246. package/lib/utils/quill.js +55 -60
  247. package/lib/utils/route.js +52 -60
  248. package/lib/utils/search.js +72 -87
  249. package/lib/utils/shard.js +33 -42
  250. package/lib/utils/sort.js +47 -50
  251. package/lib/utils/string.js +10 -12
  252. package/lib/utils/table.js +29 -33
  253. package/lib/utils/timezone.js +7 -12
  254. package/lib/utils/url.js +130 -144
  255. package/lib/utils/user.js +54 -64
  256. package/lib/utils/userAgent.js +7 -14
  257. package/lib/utils/userRole.js +36 -39
  258. package/package.json +17 -3
@@ -1,50 +1,41 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.rangeRemovalWillDeleteCellWithoutRow = exports.isLineAfterTable = exports.isLineBeforeTable = exports.isLineInTableCell = exports.isInstanceOfBlot = void 0;
4
- exports.newId = newId;
5
- const logger_1 = require("../../../utils/logger");
6
- const constants_1 = require("./constants");
7
- const isInstanceOfBlot = (blot, blotName) => blot.statics.blotName === blotName;
8
- exports.isInstanceOfBlot = isInstanceOfBlot;
9
- const isLineInTableCell = (line) => (0, exports.isInstanceOfBlot)(line.parent, constants_1.TABLE_BLOT_NAME.TD);
10
- exports.isLineInTableCell = isLineInTableCell;
11
- const isLineBeforeTable = (line) => (0, exports.isInstanceOfBlot)(line.next, constants_1.TABLE_BLOT_NAME.TABLE_CONTAINER);
12
- exports.isLineBeforeTable = isLineBeforeTable;
13
- const isLineAfterTable = (line) => (0, exports.isInstanceOfBlot)(line.prev, constants_1.TABLE_BLOT_NAME.TABLE_CONTAINER);
14
- exports.isLineAfterTable = isLineAfterTable;
15
- const rangeRemovalWillDeleteCellWithoutRow = (quill, range) => {
16
- const lines = quill.getLines(range);
17
- const willDeleteCellWithoutRow = lines.some((line) => {
18
- if ((0, exports.isLineInTableCell)(line)) {
19
- const cell = line.parent;
20
- const cellOffset = cell.offset(quill.scroll);
21
- const cellLength = cell.length();
22
- const willDeleteCell =
23
- // starts in cell and goes out of cell, or is exactly the cell
24
- (range.index >= cellOffset && range.index + range.length >= cellOffset + cellLength) ||
25
- // starts before cell and stops in cell
26
- (range.index < cellOffset && range.index + range.length < cellOffset + cellLength);
27
- const row = cell.row();
28
- if (!row)
29
- return false;
30
- const rowOffset = row.offset(quill.scroll);
31
- const rowLength = row.length();
32
- const willDeleteRow = range.index <= rowOffset && range.index + range.length >= rowOffset + rowLength;
33
- (0, logger_1.getLogger)().debug('rangeRemovalWillDeleteCellWithoutRow line', {
34
- range,
35
- line,
36
- cellOffset,
37
- cellLength,
38
- willDeleteCell,
39
- willDeleteRow
40
- });
41
- return willDeleteCell && !willDeleteRow;
42
- }
43
- return false;
44
- }, {});
45
- return willDeleteCellWithoutRow;
1
+ import { getLogger } from '../../../utils/logger';
2
+ import { TABLE_BLOT_NAME } from './constants';
3
+ export const isInstanceOfBlot = (blot, blotName) => blot.statics.blotName === blotName;
4
+ export const isLineInTableCell = line => isInstanceOfBlot(line.parent, TABLE_BLOT_NAME.TD);
5
+ export const isLineBeforeTable = line => isInstanceOfBlot(line.next, TABLE_BLOT_NAME.TABLE_CONTAINER);
6
+ export const isLineAfterTable = line => isInstanceOfBlot(line.prev, TABLE_BLOT_NAME.TABLE_CONTAINER);
7
+ export const rangeRemovalWillDeleteCellWithoutRow = (quill, range) => {
8
+ const lines = quill.getLines(range);
9
+ const willDeleteCellWithoutRow = lines.some(line => {
10
+ if (isLineInTableCell(line)) {
11
+ const cell = line.parent;
12
+ const cellOffset = cell.offset(quill.scroll);
13
+ const cellLength = cell.length();
14
+ const willDeleteCell =
15
+ // starts in cell and goes out of cell, or is exactly the cell
16
+ range.index >= cellOffset && range.index + range.length >= cellOffset + cellLength ||
17
+ // starts before cell and stops in cell
18
+ range.index < cellOffset && range.index + range.length < cellOffset + cellLength;
19
+ const row = cell.row();
20
+ if (!row) return false;
21
+ const rowOffset = row.offset(quill.scroll);
22
+ const rowLength = row.length();
23
+ const willDeleteRow = range.index <= rowOffset && range.index + range.length >= rowOffset + rowLength;
24
+ getLogger().debug('rangeRemovalWillDeleteCellWithoutRow line', {
25
+ range,
26
+ line,
27
+ cellOffset,
28
+ cellLength,
29
+ willDeleteCell,
30
+ willDeleteRow
31
+ });
32
+ return willDeleteCell && !willDeleteRow;
33
+ }
34
+ return false;
35
+ }, {});
36
+ return willDeleteCellWithoutRow;
46
37
  };
47
- exports.rangeRemovalWillDeleteCellWithoutRow = rangeRemovalWillDeleteCellWithoutRow;
48
- function newId(prefix) {
49
- return `${prefix}-${Math.random().toString(36).slice(2, 6)}`;
38
+ export function newId(prefix) {
39
+ return `${prefix}-${Math.random().toString(36).slice(2, 6)}`;
50
40
  }
41
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRMb2dnZXIiLCJUQUJMRV9CTE9UX05BTUUiLCJpc0luc3RhbmNlT2ZCbG90IiwiYmxvdCIsImJsb3ROYW1lIiwic3RhdGljcyIsImlzTGluZUluVGFibGVDZWxsIiwibGluZSIsInBhcmVudCIsIlREIiwiaXNMaW5lQmVmb3JlVGFibGUiLCJuZXh0IiwiVEFCTEVfQ09OVEFJTkVSIiwiaXNMaW5lQWZ0ZXJUYWJsZSIsInByZXYiLCJyYW5nZVJlbW92YWxXaWxsRGVsZXRlQ2VsbFdpdGhvdXRSb3ciLCJxdWlsbCIsInJhbmdlIiwibGluZXMiLCJnZXRMaW5lcyIsIndpbGxEZWxldGVDZWxsV2l0aG91dFJvdyIsInNvbWUiLCJjZWxsIiwiY2VsbE9mZnNldCIsIm9mZnNldCIsInNjcm9sbCIsImNlbGxMZW5ndGgiLCJsZW5ndGgiLCJ3aWxsRGVsZXRlQ2VsbCIsImluZGV4Iiwicm93Iiwicm93T2Zmc2V0Iiwicm93TGVuZ3RoIiwid2lsbERlbGV0ZVJvdyIsImRlYnVnIiwibmV3SWQiLCJwcmVmaXgiLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJzbGljZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1F1aWxsL1RhYmxlTW9kdWxlL3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJsb3QgfSBmcm9tICdwYXJjaG1lbnQvZGlzdC9zcmMvYmxvdC9hYnN0cmFjdC9ibG90J1xuaW1wb3J0IHsgUmFuZ2VTdGF0aWMgfSBmcm9tICdxdWlsbCdcbmltcG9ydCB7IFF1aWxsIH0gZnJvbSAncmVhY3QtcXVpbGwnXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscy9sb2dnZXInXG5pbXBvcnQgeyBUYWJsZUNlbGxCbG90IH0gZnJvbSAnLi9CbG90cy9UYWJsZUNlbGxCbG90J1xuaW1wb3J0IHsgVEFCTEVfQkxPVF9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmV4cG9ydCBjb25zdCBpc0luc3RhbmNlT2ZCbG90ID0gKGJsb3Q6IEJsb3QsIGJsb3ROYW1lOiBzdHJpbmcpID0+IChibG90IGFzIGFueSkuc3RhdGljcy5ibG90TmFtZSA9PT0gYmxvdE5hbWVcblxuZXhwb3J0IGNvbnN0IGlzTGluZUluVGFibGVDZWxsID0gKGxpbmU6IEJsb3QpID0+IGlzSW5zdGFuY2VPZkJsb3QobGluZS5wYXJlbnQsIFRBQkxFX0JMT1RfTkFNRS5URClcblxuZXhwb3J0IGNvbnN0IGlzTGluZUJlZm9yZVRhYmxlID0gKGxpbmU6IEJsb3QpID0+IGlzSW5zdGFuY2VPZkJsb3QobGluZS5uZXh0LCBUQUJMRV9CTE9UX05BTUUuVEFCTEVfQ09OVEFJTkVSKVxuXG5leHBvcnQgY29uc3QgaXNMaW5lQWZ0ZXJUYWJsZSA9IChsaW5lOiBCbG90KSA9PiBpc0luc3RhbmNlT2ZCbG90KGxpbmUucHJldiwgVEFCTEVfQkxPVF9OQU1FLlRBQkxFX0NPTlRBSU5FUilcblxuZXhwb3J0IGNvbnN0IHJhbmdlUmVtb3ZhbFdpbGxEZWxldGVDZWxsV2l0aG91dFJvdyA9IChxdWlsbDogUXVpbGwsIHJhbmdlOiBSYW5nZVN0YXRpYykgPT4ge1xuXHRjb25zdCBsaW5lcyA9IHF1aWxsLmdldExpbmVzKHJhbmdlKVxuXHRjb25zdCB3aWxsRGVsZXRlQ2VsbFdpdGhvdXRSb3cgPSBsaW5lcy5zb21lKChsaW5lOiBCbG90KSA9PiB7XG5cdFx0aWYgKGlzTGluZUluVGFibGVDZWxsKGxpbmUpKSB7XG5cdFx0XHRjb25zdCBjZWxsID0gbGluZS5wYXJlbnQgYXMgVGFibGVDZWxsQmxvdFxuXHRcdFx0Y29uc3QgY2VsbE9mZnNldCA9IGNlbGwub2Zmc2V0KHF1aWxsLnNjcm9sbClcblx0XHRcdGNvbnN0IGNlbGxMZW5ndGggPSBjZWxsLmxlbmd0aCgpXG5cdFx0XHRjb25zdCB3aWxsRGVsZXRlQ2VsbCA9XG5cdFx0XHRcdC8vIHN0YXJ0cyBpbiBjZWxsIGFuZCBnb2VzIG91dCBvZiBjZWxsLCBvciBpcyBleGFjdGx5IHRoZSBjZWxsXG5cdFx0XHRcdChyYW5nZS5pbmRleCA+PSBjZWxsT2Zmc2V0ICYmIHJhbmdlLmluZGV4ICsgcmFuZ2UubGVuZ3RoID49IGNlbGxPZmZzZXQgKyBjZWxsTGVuZ3RoKSB8fFxuXHRcdFx0XHQvLyBzdGFydHMgYmVmb3JlIGNlbGwgYW5kIHN0b3BzIGluIGNlbGxcblx0XHRcdFx0KHJhbmdlLmluZGV4IDwgY2VsbE9mZnNldCAmJiByYW5nZS5pbmRleCArIHJhbmdlLmxlbmd0aCA8IGNlbGxPZmZzZXQgKyBjZWxsTGVuZ3RoKVxuXHRcdFx0Y29uc3Qgcm93ID0gY2VsbC5yb3coKVxuXHRcdFx0aWYgKCFyb3cpIHJldHVybiBmYWxzZVxuXHRcdFx0Y29uc3Qgcm93T2Zmc2V0ID0gcm93Lm9mZnNldChxdWlsbC5zY3JvbGwpXG5cdFx0XHRjb25zdCByb3dMZW5ndGggPSByb3cubGVuZ3RoKClcblx0XHRcdGNvbnN0IHdpbGxEZWxldGVSb3cgPSByYW5nZS5pbmRleCA8PSByb3dPZmZzZXQgJiYgcmFuZ2UuaW5kZXggKyByYW5nZS5sZW5ndGggPj0gcm93T2Zmc2V0ICsgcm93TGVuZ3RoXG5cdFx0XHRnZXRMb2dnZXIoKS5kZWJ1ZygncmFuZ2VSZW1vdmFsV2lsbERlbGV0ZUNlbGxXaXRob3V0Um93IGxpbmUnLCB7XG5cdFx0XHRcdHJhbmdlLFxuXHRcdFx0XHRsaW5lLFxuXHRcdFx0XHRjZWxsT2Zmc2V0LFxuXHRcdFx0XHRjZWxsTGVuZ3RoLFxuXHRcdFx0XHR3aWxsRGVsZXRlQ2VsbCxcblx0XHRcdFx0d2lsbERlbGV0ZVJvd1xuXHRcdFx0fSlcblx0XHRcdHJldHVybiB3aWxsRGVsZXRlQ2VsbCAmJiAhd2lsbERlbGV0ZVJvd1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2Vcblx0fSwge30pXG5cdHJldHVybiB3aWxsRGVsZXRlQ2VsbFdpdGhvdXRSb3dcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKHByZWZpeDogc3RyaW5nKSB7XG5cdHJldHVybiBgJHtwcmVmaXh9LSR7TWF0aC5yYW5kb20o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
@@ -1,9 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.applyAccessibilityToIcons = applyAccessibilityToIcons;
4
- exports.applyAccessibilityHacks = applyAccessibilityHacks;
5
- const lodash_1 = require("lodash");
6
- const constants_1 = require("./TableModule/constants");
1
+ import { forEach, includes, isPlainObject, isString } from 'lodash';
2
+ import { TABLE_ACTION } from './TableModule/constants';
3
+
7
4
  /**
8
5
  * Apply aria-labels to the icons from the quill text editor
9
6
  * Imports the icons from Quill, recursively go through each icon and get the <svg /> html.
@@ -12,31 +9,31 @@ const constants_1 = require("./TableModule/constants");
12
9
  *
13
10
  * @param {*} icons The object that includes all the icons from Quill
14
11
  */
15
- function applyAccessibilityToIcons(icons) {
16
- (0, lodash_1.forEach)(icons, (value, key) => {
17
- // if the value is an object, recursively call this function
18
- if ((0, lodash_1.isPlainObject)(value)) {
19
- applyAccessibilityToIcons(value);
20
- }
21
- // if the value is a string, i.e, "<svg></svg>", then it adds the label
22
- if ((0, lodash_1.isString)(value)) {
23
- const regex = /^(.*) <\/svg>/g;
24
- const match = regex.exec(value);
25
- if (!match) {
26
- return;
27
- }
28
- let iconName;
29
- if (key) {
30
- iconName = key;
31
- }
32
- else {
33
- iconName = 'left';
34
- }
35
- const label = `<label class="hidden" aria-label="${iconName}">${iconName}</label>`;
36
- icons[key] = match[1] + label + '</svg>';
37
- }
38
- });
12
+ export function applyAccessibilityToIcons(icons) {
13
+ forEach(icons, (value, key) => {
14
+ // if the value is an object, recursively call this function
15
+ if (isPlainObject(value)) {
16
+ applyAccessibilityToIcons(value);
17
+ }
18
+ // if the value is a string, i.e, "<svg></svg>", then it adds the label
19
+ if (isString(value)) {
20
+ const regex = /^(.*) <\/svg>/g;
21
+ const match = regex.exec(value);
22
+ if (!match) {
23
+ return;
24
+ }
25
+ let iconName;
26
+ if (key) {
27
+ iconName = key;
28
+ } else {
29
+ iconName = 'left';
30
+ }
31
+ const label = `<label class="hidden" aria-label="${iconName}">${iconName}</label>`;
32
+ icons[key] = match[1] + label + '</svg>';
33
+ }
34
+ });
39
35
  }
36
+
40
37
  /**
41
38
  * Grabs the DOM from the toolbar reference and loop through each button, picker, and dropdowns adding accessibility values
42
39
  * Help from: https://github.com/quilljs/quill/issues/1173
@@ -44,206 +41,205 @@ function applyAccessibilityToIcons(icons) {
44
41
  * @param toolbarRef: reference to the div containing our custom Quill toolbar
45
42
  * @param editor: reference to the Quill editor
46
43
  */
47
- function applyAccessibilityHacks(toolbarRef, editor) {
48
- // Get ref to the toolbar, its not available through the quill api ughh
49
- if (!toolbarRef.current) {
50
- return;
51
- }
52
- const toolbar = toolbarRef.current;
53
- // apply aria labels to base buttons
54
- const buttons = toolbar.getElementsByTagName('button');
55
- for (const button of Array.from(buttons)) {
56
- const className = button.classList.value
57
- .split(' ')
58
- .filter(v => v.includes('ql-'))
59
- .map(v => v.replace('ql-', ''))[0];
60
- switch (className) {
61
- case 'bold':
62
- button.setAttribute('aria-label', 'Toggle bold text');
63
- break;
64
- case 'italic':
65
- button.setAttribute('aria-label', 'Toggle italic text');
66
- break;
67
- case 'underline':
68
- button.setAttribute('aria-label', 'Toggle underline text');
69
- break;
70
- case 'script':
71
- if (button.value === 'sub') {
72
- button.setAttribute('aria-label', 'Toggle subscript');
73
- }
74
- if (button.value === 'super') {
75
- button.setAttribute('aria-label', 'Toggle superscript');
76
- }
77
- break;
78
- case 'blockquote':
79
- button.setAttribute('aria-label', 'Toggle blockquote text');
80
- break;
81
- case 'list':
82
- if (button.value === 'ordered') {
83
- button.setAttribute('aria-label', 'Toggle ordered list');
84
- }
85
- if (button.value === 'bullet') {
86
- button.setAttribute('aria-label', 'Toggle bulleted list');
87
- }
88
- break;
89
- case 'header':
90
- if (button.value === '1') {
91
- button.setAttribute('aria-label', 'Toggle heading 1');
92
- }
93
- if (button.value === '2') {
94
- button.setAttribute('aria-label', 'Toggle heading 2');
95
- }
96
- break;
97
- case 'strike':
98
- button.setAttribute('aria-label', 'Toggle strike text');
99
- break;
100
- case 'code-block':
101
- button.setAttribute('aria-label', 'Toggle code block text');
102
- break;
103
- case 'indent':
104
- if (button.value === '-1') {
105
- button.setAttribute('aria-label', 'Indent left');
106
- }
107
- if (button.value === '+1') {
108
- button.setAttribute('aria-label', 'Indent right');
109
- }
110
- break;
111
- case 'link':
112
- button.setAttribute('aria-label', 'Insert link');
113
- break;
114
- case 'image':
115
- button.setAttribute('aria-label', 'Insert image');
116
- break;
117
- case 'video':
118
- button.setAttribute('aria-label', 'Insert video');
119
- break;
120
- case 'formula':
121
- button.setAttribute('aria-label', 'Insert formula');
122
- break;
123
- case 'clean':
124
- button.setAttribute('aria-label', 'Clear formatting');
125
- break;
126
- case 'table':
127
- switch (button.value) {
128
- case constants_1.TABLE_ACTION.INSERT_ROW:
129
- button.setAttribute('aria-label', 'Insert row');
130
- break;
131
- case constants_1.TABLE_ACTION.DELETE_ROW:
132
- button.setAttribute('aria-label', 'Delete row');
133
- break;
134
- case constants_1.TABLE_ACTION.INSERT_COL:
135
- button.setAttribute('aria-label', 'Insert column');
136
- break;
137
- case constants_1.TABLE_ACTION.DELETE_COL:
138
- button.setAttribute('aria-label', 'Delete column');
139
- break;
140
- }
141
- break;
142
- default:
143
- break;
44
+ export function applyAccessibilityHacks(toolbarRef, editor) {
45
+ // Get ref to the toolbar, its not available through the quill api ughh
46
+ if (!toolbarRef.current) {
47
+ return;
48
+ }
49
+ const toolbar = toolbarRef.current;
50
+ // apply aria labels to base buttons
51
+ const buttons = toolbar.getElementsByTagName('button');
52
+ for (const button of Array.from(buttons)) {
53
+ const className = button.classList.value.split(' ').filter(v => v.includes('ql-')).map(v => v.replace('ql-', ''))[0];
54
+ switch (className) {
55
+ case 'bold':
56
+ button.setAttribute('aria-label', 'Toggle bold text');
57
+ break;
58
+ case 'italic':
59
+ button.setAttribute('aria-label', 'Toggle italic text');
60
+ break;
61
+ case 'underline':
62
+ button.setAttribute('aria-label', 'Toggle underline text');
63
+ break;
64
+ case 'script':
65
+ if (button.value === 'sub') {
66
+ button.setAttribute('aria-label', 'Toggle subscript');
144
67
  }
145
- const ariaLabel = button.getAttribute('aria-label');
146
- if (ariaLabel) {
147
- button.setAttribute('title', ariaLabel);
68
+ if (button.value === 'super') {
69
+ button.setAttribute('aria-label', 'Toggle superscript');
148
70
  }
149
- // Put title tags to the dropdowns
150
- const dropdowns = toolbar.getElementsByTagName('select');
151
- for (const dropdown of Array.from(dropdowns)) {
152
- const classNameAttribute = dropdown.getAttribute('class');
153
- if (classNameAttribute) {
154
- dropdown.setAttribute('title', classNameAttribute.toLowerCase());
155
- }
71
+ break;
72
+ case 'blockquote':
73
+ button.setAttribute('aria-label', 'Toggle blockquote text');
74
+ break;
75
+ case 'list':
76
+ if (button.value === 'ordered') {
77
+ button.setAttribute('aria-label', 'Toggle ordered list');
156
78
  }
157
- // Make pickers work with keyboard and apply aria labels
158
- const pickers = toolbar.getElementsByClassName('ql-picker');
159
- for (const picker of Array.from(pickers)) {
160
- const label = picker.getElementsByClassName('ql-picker-label')[0];
161
- const optionsContainer = picker.getElementsByClassName('ql-picker-options')[0];
162
- const options = optionsContainer.getElementsByClassName('ql-picker-item');
163
- label.setAttribute('role', 'button');
164
- label.setAttribute('aria-haspopup', 'true');
165
- label.setAttribute('tabindex', '0');
166
- if (!!label.parentElement && label.parentElement.classList.contains('ql-font')) {
167
- label.setAttribute('title', 'Font face');
168
- }
169
- if (!!label.parentElement && label.parentElement.classList.contains('ql-size')) {
170
- label.setAttribute('title', 'Font size');
171
- }
172
- if (!!label.parentElement && label.parentElement.classList.contains('ql-align')) {
173
- label.setAttribute('title', 'Alignment');
174
- }
175
- if (!!label.parentElement && label.parentElement.classList.contains('ql-table')) {
176
- label.setAttribute('title', 'Insert table');
177
- }
178
- optionsContainer.setAttribute('aria-hidden', 'true');
179
- optionsContainer.setAttribute('aria-label', 'submenu');
180
- for (const item of Array.from(options)) {
181
- item.setAttribute('tabindex', '0');
182
- item.setAttribute('role', 'button');
183
- if (!(0, lodash_1.includes)(picker.classList, 'ql-align')) {
184
- // Read the css 'content' values and generate aria labels for font face/size
185
- const content = window.getComputedStyle(item, ':before').content;
186
- if (content) {
187
- const contentLabels = content.split('"').join('');
188
- item.setAttribute('aria-label', contentLabels);
189
- }
190
- }
191
- else {
192
- // Add the title labels to the justification icons
193
- const iconLabels = item.getElementsByTagName('label');
194
- if (iconLabels.length === 1) {
195
- const iconLabel = iconLabels[0].getAttribute('aria-label');
196
- if (iconLabel) {
197
- const iconTitle = iconLabel.charAt(0).toUpperCase() + iconLabel.slice(1);
198
- item.setAttribute('title', iconTitle);
199
- item.setAttribute('aria-label', iconLabel);
200
- }
201
- }
202
- }
203
- item.addEventListener('keyup', (e) => {
204
- if (e.keyCode === 13) {
205
- ;
206
- item.click();
207
- optionsContainer.setAttribute('aria-hidden', 'true');
208
- picker.classList.remove('ql-expanded');
209
- editor.focus();
210
- }
211
- });
212
- }
213
- label.addEventListener('keyup', (e) => {
214
- if (e.keyCode === 13) {
215
- ;
216
- label.click();
217
- picker.classList.add('ql-expanded');
218
- optionsContainer.setAttribute('aria-hidden', 'false');
219
- }
220
- });
79
+ if (button.value === 'bullet') {
80
+ button.setAttribute('aria-label', 'Toggle bulleted list');
81
+ }
82
+ break;
83
+ case 'header':
84
+ if (button.value === '1') {
85
+ button.setAttribute('aria-label', 'Toggle heading 1');
86
+ }
87
+ if (button.value === '2') {
88
+ button.setAttribute('aria-label', 'Toggle heading 2');
89
+ }
90
+ break;
91
+ case 'strike':
92
+ button.setAttribute('aria-label', 'Toggle strike text');
93
+ break;
94
+ case 'code-block':
95
+ button.setAttribute('aria-label', 'Toggle code block text');
96
+ break;
97
+ case 'indent':
98
+ if (button.value === '-1') {
99
+ button.setAttribute('aria-label', 'Indent left');
100
+ }
101
+ if (button.value === '+1') {
102
+ button.setAttribute('aria-label', 'Indent right');
103
+ }
104
+ break;
105
+ case 'link':
106
+ button.setAttribute('aria-label', 'Insert link');
107
+ break;
108
+ case 'image':
109
+ button.setAttribute('aria-label', 'Insert image');
110
+ break;
111
+ case 'video':
112
+ button.setAttribute('aria-label', 'Insert video');
113
+ break;
114
+ case 'formula':
115
+ button.setAttribute('aria-label', 'Insert formula');
116
+ break;
117
+ case 'clean':
118
+ button.setAttribute('aria-label', 'Clear formatting');
119
+ break;
120
+ case 'table':
121
+ switch (button.value) {
122
+ case TABLE_ACTION.INSERT_ROW:
123
+ button.setAttribute('aria-label', 'Insert row');
124
+ break;
125
+ case TABLE_ACTION.DELETE_ROW:
126
+ button.setAttribute('aria-label', 'Delete row');
127
+ break;
128
+ case TABLE_ACTION.INSERT_COL:
129
+ button.setAttribute('aria-label', 'Insert column');
130
+ break;
131
+ case TABLE_ACTION.DELETE_COL:
132
+ button.setAttribute('aria-label', 'Delete column');
133
+ break;
221
134
  }
135
+ break;
136
+ default:
137
+ break;
222
138
  }
223
- const tooltips = editor.container.getElementsByClassName('ql-tooltip');
224
- for (const tooltip of Array.from(tooltips)) {
225
- tooltip.setAttribute('tabindex', '-1');
226
- const embedUrls = tooltip.getElementsByTagName('input');
227
- for (const embedUrl of Array.from(embedUrls)) {
228
- embedUrl.setAttribute('aria-label', 'Embed Url');
139
+ const ariaLabel = button.getAttribute('aria-label');
140
+ if (ariaLabel) {
141
+ button.setAttribute('title', ariaLabel);
142
+ }
143
+
144
+ // Put title tags to the dropdowns
145
+ const dropdowns = toolbar.getElementsByTagName('select');
146
+ for (const dropdown of Array.from(dropdowns)) {
147
+ const classNameAttribute = dropdown.getAttribute('class');
148
+ if (classNameAttribute) {
149
+ dropdown.setAttribute('title', classNameAttribute.toLowerCase());
150
+ }
151
+ }
152
+
153
+ // Make pickers work with keyboard and apply aria labels
154
+ const pickers = toolbar.getElementsByClassName('ql-picker');
155
+ for (const picker of Array.from(pickers)) {
156
+ const label = picker.getElementsByClassName('ql-picker-label')[0];
157
+ const optionsContainer = picker.getElementsByClassName('ql-picker-options')[0];
158
+ const options = optionsContainer.getElementsByClassName('ql-picker-item');
159
+ label.setAttribute('role', 'button');
160
+ label.setAttribute('aria-haspopup', 'true');
161
+ label.setAttribute('tabindex', '0');
162
+ if (!!label.parentElement && label.parentElement.classList.contains('ql-font')) {
163
+ label.setAttribute('title', 'Font face');
164
+ }
165
+ if (!!label.parentElement && label.parentElement.classList.contains('ql-size')) {
166
+ label.setAttribute('title', 'Font size');
167
+ }
168
+ if (!!label.parentElement && label.parentElement.classList.contains('ql-align')) {
169
+ label.setAttribute('title', 'Alignment');
170
+ }
171
+ if (!!label.parentElement && label.parentElement.classList.contains('ql-table')) {
172
+ label.setAttribute('title', 'Insert table');
173
+ }
174
+ optionsContainer.setAttribute('aria-hidden', 'true');
175
+ optionsContainer.setAttribute('aria-label', 'submenu');
176
+ for (const item of Array.from(options)) {
177
+ item.setAttribute('tabindex', '0');
178
+ item.setAttribute('role', 'button');
179
+ if (!includes(picker.classList, 'ql-align')) {
180
+ // Read the css 'content' values and generate aria labels for font face/size
181
+ const content = window.getComputedStyle(item, ':before').content;
182
+ if (content) {
183
+ const contentLabels = content.split('"').join('');
184
+ item.setAttribute('aria-label', contentLabels);
185
+ }
186
+ } else {
187
+ // Add the title labels to the justification icons
188
+ const iconLabels = item.getElementsByTagName('label');
189
+ if (iconLabels.length === 1) {
190
+ const iconLabel = iconLabels[0].getAttribute('aria-label');
191
+ if (iconLabel) {
192
+ const iconTitle = iconLabel.charAt(0).toUpperCase() + iconLabel.slice(1);
193
+ item.setAttribute('title', iconTitle);
194
+ item.setAttribute('aria-label', iconLabel);
195
+ }
196
+ }
229
197
  }
230
- const previews = tooltip.getElementsByClassName('ql-preview');
231
- for (const preview of Array.from(previews)) {
232
- preview.setAttribute('aria-label', 'Preview');
233
- preview.setAttribute('tabindex', '0');
198
+ item.addEventListener('keyup', e => {
199
+ if (e.keyCode === 13) {
200
+ ;
201
+ item.click();
202
+ optionsContainer.setAttribute('aria-hidden', 'true');
203
+ picker.classList.remove('ql-expanded');
204
+ editor.focus();
205
+ }
206
+ });
207
+ }
208
+ label.addEventListener('keyup', e => {
209
+ if (e.keyCode === 13) {
210
+ ;
211
+ label.click();
212
+ picker.classList.add('ql-expanded');
213
+ optionsContainer.setAttribute('aria-hidden', 'false');
234
214
  }
235
- const actions = tooltip.getElementsByClassName('ql-action');
236
- const remove = tooltip.getElementsByClassName('ql-remove');
237
- const allActions = Array.from(actions).concat(Array.from(remove));
238
- for (const action of allActions) {
239
- action.setAttribute('tabindex', '0');
240
- action.setAttribute('role', 'button');
241
- action.addEventListener('keyup', (e) => {
242
- if (e.keyCode === 13) {
243
- ;
244
- action.click();
245
- }
246
- });
215
+ });
216
+ }
217
+ }
218
+ const tooltips = editor.container.getElementsByClassName('ql-tooltip');
219
+ for (const tooltip of Array.from(tooltips)) {
220
+ tooltip.setAttribute('tabindex', '-1');
221
+ const embedUrls = tooltip.getElementsByTagName('input');
222
+ for (const embedUrl of Array.from(embedUrls)) {
223
+ embedUrl.setAttribute('aria-label', 'Embed Url');
224
+ }
225
+ const previews = tooltip.getElementsByClassName('ql-preview');
226
+ for (const preview of Array.from(previews)) {
227
+ preview.setAttribute('aria-label', 'Preview');
228
+ preview.setAttribute('tabindex', '0');
229
+ }
230
+ const actions = tooltip.getElementsByClassName('ql-action');
231
+ const remove = tooltip.getElementsByClassName('ql-remove');
232
+ const allActions = Array.from(actions).concat(Array.from(remove));
233
+ for (const action of allActions) {
234
+ action.setAttribute('tabindex', '0');
235
+ action.setAttribute('role', 'button');
236
+ action.addEventListener('keyup', e => {
237
+ if (e.keyCode === 13) {
238
+ ;
239
+ action.click();
247
240
  }
241
+ });
248
242
  }
243
+ }
249
244
  }
245
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3JFYWNoIiwiaW5jbHVkZXMiLCJpc1BsYWluT2JqZWN0IiwiaXNTdHJpbmciLCJUQUJMRV9BQ1RJT04iLCJhcHBseUFjY2Vzc2liaWxpdHlUb0ljb25zIiwiaWNvbnMiLCJ2YWx1ZSIsImtleSIsInJlZ2V4IiwibWF0Y2giLCJleGVjIiwiaWNvbk5hbWUiLCJsYWJlbCIsImFwcGx5QWNjZXNzaWJpbGl0eUhhY2tzIiwidG9vbGJhclJlZiIsImVkaXRvciIsImN1cnJlbnQiLCJ0b29sYmFyIiwiYnV0dG9ucyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYnV0dG9uIiwiQXJyYXkiLCJmcm9tIiwiY2xhc3NOYW1lIiwiY2xhc3NMaXN0Iiwic3BsaXQiLCJmaWx0ZXIiLCJ2IiwibWFwIiwicmVwbGFjZSIsInNldEF0dHJpYnV0ZSIsIklOU0VSVF9ST1ciLCJERUxFVEVfUk9XIiwiSU5TRVJUX0NPTCIsIkRFTEVURV9DT0wiLCJhcmlhTGFiZWwiLCJnZXRBdHRyaWJ1dGUiLCJkcm9wZG93bnMiLCJkcm9wZG93biIsImNsYXNzTmFtZUF0dHJpYnV0ZSIsInRvTG93ZXJDYXNlIiwicGlja2VycyIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJwaWNrZXIiLCJvcHRpb25zQ29udGFpbmVyIiwib3B0aW9ucyIsInBhcmVudEVsZW1lbnQiLCJjb250YWlucyIsIml0ZW0iLCJjb250ZW50Iiwid2luZG93IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImNvbnRlbnRMYWJlbHMiLCJqb2luIiwiaWNvbkxhYmVscyIsImxlbmd0aCIsImljb25MYWJlbCIsImljb25UaXRsZSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsImtleUNvZGUiLCJjbGljayIsInJlbW92ZSIsImZvY3VzIiwiYWRkIiwidG9vbHRpcHMiLCJjb250YWluZXIiLCJ0b29sdGlwIiwiZW1iZWRVcmxzIiwiZW1iZWRVcmwiLCJwcmV2aWV3cyIsInByZXZpZXciLCJhY3Rpb25zIiwiYWxsQWN0aW9ucyIsImNvbmNhdCIsImFjdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1F1aWxsL2FjY2Vzc2liaWxpdHlGaXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9yRWFjaCwgaW5jbHVkZXMsIGlzUGxhaW5PYmplY3QsIGlzU3RyaW5nIH0gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgUXVpbGwgfSBmcm9tICdyZWFjdC1xdWlsbCdcbmltcG9ydCB7IFRBQkxFX0FDVElPTiB9IGZyb20gJy4vVGFibGVNb2R1bGUvY29uc3RhbnRzJ1xuXG4vKipcbiAqIEFwcGx5IGFyaWEtbGFiZWxzIHRvIHRoZSBpY29ucyBmcm9tIHRoZSBxdWlsbCB0ZXh0IGVkaXRvclxuICogSW1wb3J0cyB0aGUgaWNvbnMgZnJvbSBRdWlsbCwgcmVjdXJzaXZlbHkgZ28gdGhyb3VnaCBlYWNoIGljb24gYW5kIGdldCB0aGUgPHN2ZyAvPiBodG1sLlxuICogVGhlbiBpdCBzZXRzIGEgPGxhYmVsIC8+IGJldHdlZW4gdGhlIDxzdmcgLz5cbiAqIFVzaW5nIGNzcywgaXQgaGlkZXMgdGhlIGxhYmVsIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHsqfSBpY29ucyBUaGUgb2JqZWN0IHRoYXQgaW5jbHVkZXMgYWxsIHRoZSBpY29ucyBmcm9tIFF1aWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFjY2Vzc2liaWxpdHlUb0ljb25zKGljb25zOiBhbnkpIHtcblx0Zm9yRWFjaChpY29ucywgKHZhbHVlLCBrZXkpID0+IHtcblx0XHQvLyBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LCByZWN1cnNpdmVseSBjYWxsIHRoaXMgZnVuY3Rpb25cblx0XHRpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcblx0XHRcdGFwcGx5QWNjZXNzaWJpbGl0eVRvSWNvbnModmFsdWUpXG5cdFx0fVxuXHRcdC8vIGlmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZywgaS5lLCBcIjxzdmc+PC9zdmc+XCIsIHRoZW4gaXQgYWRkcyB0aGUgbGFiZWxcblx0XHRpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG5cdFx0XHRjb25zdCByZWdleCA9IC9eKC4qKSA8XFwvc3ZnPi9nXG5cdFx0XHRjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWModmFsdWUpXG5cdFx0XHRpZiAoIW1hdGNoKSB7XG5cdFx0XHRcdHJldHVyblxuXHRcdFx0fVxuXHRcdFx0bGV0IGljb25OYW1lXG5cdFx0XHRpZiAoa2V5KSB7XG5cdFx0XHRcdGljb25OYW1lID0ga2V5XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpY29uTmFtZSA9ICdsZWZ0J1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbGFiZWwgPSBgPGxhYmVsIGNsYXNzPVwiaGlkZGVuXCIgYXJpYS1sYWJlbD1cIiR7aWNvbk5hbWV9XCI+JHtpY29uTmFtZX08L2xhYmVsPmBcblx0XHRcdGljb25zW2tleV0gPSBtYXRjaFsxXSArIGxhYmVsICsgJzwvc3ZnPidcblx0XHR9XG5cdH0pXG59XG5cbi8qKlxuICogR3JhYnMgdGhlIERPTSBmcm9tIHRoZSB0b29sYmFyIHJlZmVyZW5jZSBhbmQgbG9vcCB0aHJvdWdoIGVhY2ggYnV0dG9uLCBwaWNrZXIsIGFuZCBkcm9wZG93bnMgYWRkaW5nIGFjY2Vzc2liaWxpdHkgdmFsdWVzXG4gKiBIZWxwIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9xdWlsbGpzL3F1aWxsL2lzc3Vlcy8xMTczXG4gKlxuICogQHBhcmFtIHRvb2xiYXJSZWY6IHJlZmVyZW5jZSB0byB0aGUgZGl2IGNvbnRhaW5pbmcgb3VyIGN1c3RvbSBRdWlsbCB0b29sYmFyXG4gKiBAcGFyYW0gZWRpdG9yOiByZWZlcmVuY2UgdG8gdGhlIFF1aWxsIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBY2Nlc3NpYmlsaXR5SGFja3ModG9vbGJhclJlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50PiwgZWRpdG9yOiBRdWlsbCkge1xuXHQvLyBHZXQgcmVmIHRvIHRoZSB0b29sYmFyLCBpdHMgbm90IGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBxdWlsbCBhcGkgdWdoaFxuXHRpZiAoIXRvb2xiYXJSZWYuY3VycmVudCkge1xuXHRcdHJldHVyblxuXHR9XG5cdGNvbnN0IHRvb2xiYXIgPSB0b29sYmFyUmVmLmN1cnJlbnRcblx0Ly8gYXBwbHkgYXJpYSBsYWJlbHMgdG8gYmFzZSBidXR0b25zXG5cdGNvbnN0IGJ1dHRvbnMgPSB0b29sYmFyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxuXG5cdGZvciAoY29uc3QgYnV0dG9uIG9mIEFycmF5LmZyb20oYnV0dG9ucykpIHtcblx0XHRjb25zdCBjbGFzc05hbWUgPSBidXR0b24uY2xhc3NMaXN0LnZhbHVlXG5cdFx0XHQuc3BsaXQoJyAnKVxuXHRcdFx0LmZpbHRlcih2ID0+IHYuaW5jbHVkZXMoJ3FsLScpKVxuXHRcdFx0Lm1hcCh2ID0+IHYucmVwbGFjZSgncWwtJywgJycpKVswXVxuXHRcdHN3aXRjaCAoY2xhc3NOYW1lKSB7XG5cdFx0XHRjYXNlICdib2xkJzpcblx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdUb2dnbGUgYm9sZCB0ZXh0Jylcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgJ2l0YWxpYyc6XG5cdFx0XHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVG9nZ2xlIGl0YWxpYyB0ZXh0Jylcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgJ3VuZGVybGluZSc6XG5cdFx0XHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVG9nZ2xlIHVuZGVybGluZSB0ZXh0Jylcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgJ3NjcmlwdCc6XG5cdFx0XHRcdGlmIChidXR0b24udmFsdWUgPT09ICdzdWInKSB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdUb2dnbGUgc3Vic2NyaXB0Jylcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYnV0dG9uLnZhbHVlID09PSAnc3VwZXInKSB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdUb2dnbGUgc3VwZXJzY3JpcHQnKVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlICdibG9ja3F1b3RlJzpcblx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdUb2dnbGUgYmxvY2txdW90ZSB0ZXh0Jylcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgJ2xpc3QnOlxuXHRcdFx0XHRpZiAoYnV0dG9uLnZhbHVlID09PSAnb3JkZXJlZCcpIHtcblx0XHRcdFx0XHRidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1RvZ2dsZSBvcmRlcmVkIGxpc3QnKVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChidXR0b24udmFsdWUgPT09ICdidWxsZXQnKSB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdUb2dnbGUgYnVsbGV0ZWQgbGlzdCcpXG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgJ2hlYWRlcic6XG5cdFx0XHRcdGlmIChidXR0b24udmFsdWUgPT09ICcxJykge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVG9nZ2xlIGhlYWRpbmcgMScpXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJ1dHRvbi52YWx1ZSA9PT0gJzInKSB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdUb2dnbGUgaGVhZGluZyAyJylcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Y2FzZSAnc3RyaWtlJzpcblx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdUb2dnbGUgc3RyaWtlIHRleHQnKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Y2FzZSAnY29kZS1ibG9jayc6XG5cdFx0XHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVG9nZ2xlIGNvZGUgYmxvY2sgdGV4dCcpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlICdpbmRlbnQnOlxuXHRcdFx0XHRpZiAoYnV0dG9uLnZhbHVlID09PSAnLTEnKSB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdJbmRlbnQgbGVmdCcpXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJ1dHRvbi52YWx1ZSA9PT0gJysxJykge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnSW5kZW50IHJpZ2h0Jylcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Y2FzZSAnbGluayc6XG5cdFx0XHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnSW5zZXJ0IGxpbmsnKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Y2FzZSAnaW1hZ2UnOlxuXHRcdFx0XHRidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0luc2VydCBpbWFnZScpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlICd2aWRlbyc6XG5cdFx0XHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnSW5zZXJ0IHZpZGVvJylcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgJ2Zvcm11bGEnOlxuXHRcdFx0XHRidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0luc2VydCBmb3JtdWxhJylcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgJ2NsZWFuJzpcblx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbGVhciBmb3JtYXR0aW5nJylcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgJ3RhYmxlJzpcblx0XHRcdFx0c3dpdGNoIChidXR0b24udmFsdWUpIHtcblx0XHRcdFx0XHRjYXNlIFRBQkxFX0FDVElPTi5JTlNFUlRfUk9XOlxuXHRcdFx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdJbnNlcnQgcm93Jylcblx0XHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdFx0Y2FzZSBUQUJMRV9BQ1RJT04uREVMRVRFX1JPVzpcblx0XHRcdFx0XHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnRGVsZXRlIHJvdycpXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdGNhc2UgVEFCTEVfQUNUSU9OLklOU0VSVF9DT0w6XG5cdFx0XHRcdFx0XHRidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0luc2VydCBjb2x1bW4nKVxuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHRjYXNlIFRBQkxFX0FDVElPTi5ERUxFVEVfQ09MOlxuXHRcdFx0XHRcdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdEZWxldGUgY29sdW1uJylcblx0XHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrXG5cdFx0fVxuXHRcdGNvbnN0IGFyaWFMYWJlbCA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKVxuXHRcdGlmIChhcmlhTGFiZWwpIHtcblx0XHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgYXJpYUxhYmVsKVxuXHRcdH1cblxuXHRcdC8vIFB1dCB0aXRsZSB0YWdzIHRvIHRoZSBkcm9wZG93bnNcblx0XHRjb25zdCBkcm9wZG93bnMgPSB0b29sYmFyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzZWxlY3QnKVxuXHRcdGZvciAoY29uc3QgZHJvcGRvd24gb2YgQXJyYXkuZnJvbShkcm9wZG93bnMpKSB7XG5cdFx0XHRjb25zdCBjbGFzc05hbWVBdHRyaWJ1dGUgPSBkcm9wZG93bi5nZXRBdHRyaWJ1dGUoJ2NsYXNzJylcblx0XHRcdGlmIChjbGFzc05hbWVBdHRyaWJ1dGUpIHtcblx0XHRcdFx0ZHJvcGRvd24uc2V0QXR0cmlidXRlKCd0aXRsZScsIGNsYXNzTmFtZUF0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE1ha2UgcGlja2VycyB3b3JrIHdpdGgga2V5Ym9hcmQgYW5kIGFwcGx5IGFyaWEgbGFiZWxzXG5cdFx0Y29uc3QgcGlja2VycyA9IHRvb2xiYXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncWwtcGlja2VyJylcblx0XHRmb3IgKGNvbnN0IHBpY2tlciBvZiBBcnJheS5mcm9tKHBpY2tlcnMpKSB7XG5cdFx0XHRjb25zdCBsYWJlbCA9IHBpY2tlci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdxbC1waWNrZXItbGFiZWwnKVswXVxuXHRcdFx0Y29uc3Qgb3B0aW9uc0NvbnRhaW5lciA9IHBpY2tlci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdxbC1waWNrZXItb3B0aW9ucycpWzBdXG5cdFx0XHRjb25zdCBvcHRpb25zID0gb3B0aW9uc0NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdxbC1waWNrZXItaXRlbScpXG5cdFx0XHRsYWJlbC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJylcblx0XHRcdGxhYmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oYXNwb3B1cCcsICd0cnVlJylcblx0XHRcdGxhYmVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpXG5cdFx0XHRpZiAoISFsYWJlbC5wYXJlbnRFbGVtZW50ICYmIGxhYmVsLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdxbC1mb250JykpIHtcblx0XHRcdFx0bGFiZWwuc2V0QXR0cmlidXRlKCd0aXRsZScsICdGb250IGZhY2UnKVxuXHRcdFx0fVxuXHRcdFx0aWYgKCEhbGFiZWwucGFyZW50RWxlbWVudCAmJiBsYWJlbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncWwtc2l6ZScpKSB7XG5cdFx0XHRcdGxhYmVsLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnRm9udCBzaXplJylcblx0XHRcdH1cblx0XHRcdGlmICghIWxhYmVsLnBhcmVudEVsZW1lbnQgJiYgbGFiZWwucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3FsLWFsaWduJykpIHtcblx0XHRcdFx0bGFiZWwuc2V0QXR0cmlidXRlKCd0aXRsZScsICdBbGlnbm1lbnQnKVxuXHRcdFx0fVxuXHRcdFx0aWYgKCEhbGFiZWwucGFyZW50RWxlbWVudCAmJiBsYWJlbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncWwtdGFibGUnKSkge1xuXHRcdFx0XHRsYWJlbC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0luc2VydCB0YWJsZScpXG5cdFx0XHR9XG5cdFx0XHRvcHRpb25zQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpXG5cdFx0XHRvcHRpb25zQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdzdWJtZW51JylcblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIEFycmF5LmZyb20ob3B0aW9ucykpIHtcblx0XHRcdFx0aXRlbS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKVxuXHRcdFx0XHRpdGVtLnNldEF0dHJpYnV0ZSgncm9sZScsICdidXR0b24nKVxuXG5cdFx0XHRcdGlmICghaW5jbHVkZXMocGlja2VyLmNsYXNzTGlzdCwgJ3FsLWFsaWduJykpIHtcblx0XHRcdFx0XHQvLyBSZWFkIHRoZSBjc3MgJ2NvbnRlbnQnIHZhbHVlcyBhbmQgZ2VuZXJhdGUgYXJpYSBsYWJlbHMgZm9yIGZvbnQgZmFjZS9zaXplXG5cdFx0XHRcdFx0Y29uc3QgY29udGVudCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGl0ZW0sICc6YmVmb3JlJykuY29udGVudFxuXHRcdFx0XHRcdGlmIChjb250ZW50KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb250ZW50TGFiZWxzID0gY29udGVudC5zcGxpdCgnXCInKS5qb2luKCcnKVxuXHRcdFx0XHRcdFx0aXRlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBjb250ZW50TGFiZWxzKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBBZGQgdGhlIHRpdGxlIGxhYmVscyB0byB0aGUganVzdGlmaWNhdGlvbiBpY29uc1xuXHRcdFx0XHRcdGNvbnN0IGljb25MYWJlbHMgPSBpdGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsYWJlbCcpXG5cdFx0XHRcdFx0aWYgKGljb25MYWJlbHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpY29uTGFiZWwgPSBpY29uTGFiZWxzWzBdLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpXG5cdFx0XHRcdFx0XHRpZiAoaWNvbkxhYmVsKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGljb25UaXRsZSA9IGljb25MYWJlbC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGljb25MYWJlbC5zbGljZSgxKVxuXHRcdFx0XHRcdFx0XHRpdGVtLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpY29uVGl0bGUpXG5cdFx0XHRcdFx0XHRcdGl0ZW0uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgaWNvbkxhYmVsKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0aWYgKGUua2V5Q29kZSA9PT0gMTMpIHtcblx0XHRcdFx0XHRcdDsoaXRlbSBhcyBIVE1MRWxlbWVudCkuY2xpY2soKVxuXHRcdFx0XHRcdFx0b3B0aW9uc0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKVxuXHRcdFx0XHRcdFx0cGlja2VyLmNsYXNzTGlzdC5yZW1vdmUoJ3FsLWV4cGFuZGVkJylcblx0XHRcdFx0XHRcdGVkaXRvci5mb2N1cygpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXG5cdFx0XHRsYWJlbC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChlOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGUua2V5Q29kZSA9PT0gMTMpIHtcblx0XHRcdFx0XHQ7KGxhYmVsIGFzIEhUTUxFbGVtZW50KS5jbGljaygpXG5cdFx0XHRcdFx0cGlja2VyLmNsYXNzTGlzdC5hZGQoJ3FsLWV4cGFuZGVkJylcblx0XHRcdFx0XHRvcHRpb25zQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHRvb2x0aXBzOiBIVE1MQ29sbGVjdGlvbk9mPEVsZW1lbnQ+ID0gKGVkaXRvciBhcyBhbnkpLmNvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdxbC10b29sdGlwJylcblx0Zm9yIChjb25zdCB0b29sdGlwIG9mIEFycmF5LmZyb20odG9vbHRpcHMpKSB7XG5cdFx0dG9vbHRpcC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJylcblx0XHRjb25zdCBlbWJlZFVybHMgPSB0b29sdGlwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpXG5cdFx0Zm9yIChjb25zdCBlbWJlZFVybCBvZiBBcnJheS5mcm9tKGVtYmVkVXJscykpIHtcblx0XHRcdGVtYmVkVXJsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdFbWJlZCBVcmwnKVxuXHRcdH1cblx0XHRjb25zdCBwcmV2aWV3cyA9IHRvb2x0aXAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncWwtcHJldmlldycpXG5cdFx0Zm9yIChjb25zdCBwcmV2aWV3IG9mIEFycmF5LmZyb20ocHJldmlld3MpKSB7XG5cdFx0XHRwcmV2aWV3LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdQcmV2aWV3Jylcblx0XHRcdHByZXZpZXcuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJylcblx0XHR9XG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRvb2x0aXAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncWwtYWN0aW9uJylcblx0XHRjb25zdCByZW1vdmUgPSB0b29sdGlwLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3FsLXJlbW92ZScpXG5cdFx0Y29uc3QgYWxsQWN0aW9ucyA9IEFycmF5LmZyb20oYWN0aW9ucykuY29uY2F0KEFycmF5LmZyb20ocmVtb3ZlKSlcblx0XHRmb3IgKGNvbnN0IGFjdGlvbiBvZiBhbGxBY3Rpb25zKSB7XG5cdFx0XHRhY3Rpb24uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJylcblx0XHRcdGFjdGlvbi5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJylcblx0XHRcdGFjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChlOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGUua2V5Q29kZSA9PT0gMTMpIHtcblx0XHRcdFx0XHQ7KGFjdGlvbiBhcyBIVE1MRWxlbWVudCkuY2xpY2soKVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH1cblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFPLEVBQUVDLFFBQVEsRUFBRUMsYUFBYSxFQUFFQyxRQUFRLFFBQVEsUUFBUTtBQUVuRSxTQUFTQyxZQUFZLFFBQVEseUJBQXlCOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTQyx5QkFBeUJBLENBQUNDLEtBQVUsRUFBRTtFQUNyRE4sT0FBTyxDQUFDTSxLQUFLLEVBQUUsQ0FBQ0MsS0FBSyxFQUFFQyxHQUFHLEtBQUs7SUFDOUI7SUFDQSxJQUFJTixhQUFhLENBQUNLLEtBQUssQ0FBQyxFQUFFO01BQ3pCRix5QkFBeUIsQ0FBQ0UsS0FBSyxDQUFDO0lBQ2pDO0lBQ0E7SUFDQSxJQUFJSixRQUFR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