@alfresco/aca-playwright-shared 5.1.1 → 5.2.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 (184) hide show
  1. package/api/tags-api.d.ts +8 -2
  2. package/esm2022/api/api-client-factory.mjs +131 -0
  3. package/esm2022/api/categories-api.mjs +66 -0
  4. package/esm2022/api/favorites-api.mjs +130 -0
  5. package/esm2022/api/file-actions.mjs +167 -0
  6. package/esm2022/api/nodes-api.mjs +428 -0
  7. package/esm2022/api/people-api-models.mjs +41 -0
  8. package/esm2022/api/queries-api.mjs +70 -0
  9. package/esm2022/api/rules-api.mjs +258 -0
  10. package/esm2022/api/search-api.mjs +75 -0
  11. package/esm2022/api/shared-links-api.mjs +137 -0
  12. package/esm2022/api/sites-api.mjs +156 -0
  13. package/esm2022/api/tags-api.mjs +92 -0
  14. package/esm2022/api/trashcan-api.mjs +52 -0
  15. package/{esm2020 → esm2022}/models/user-model.mjs +11 -5
  16. package/esm2022/page-objects/components/aca-header.component.mjs +78 -0
  17. package/esm2022/page-objects/components/actions-dropdown.component.mjs +100 -0
  18. package/esm2022/page-objects/components/adf-info-drawer.component.mjs +102 -0
  19. package/esm2022/page-objects/components/base.component.mjs +70 -0
  20. package/esm2022/page-objects/components/breadcrumb/breadcrumb.component.mjs +47 -0
  21. package/esm2022/page-objects/components/conditions.component.mjs +72 -0
  22. package/esm2022/page-objects/components/dataTable/data-table.component.mjs +343 -0
  23. package/esm2022/page-objects/components/dataTable/mat-menu.component.mjs +67 -0
  24. package/{esm2020/page-objects/components/dialogs/manage-versions-dialog.component.mjs → esm2022/page-objects/components/dataTable/toolbar.component.mjs} +13 -8
  25. package/esm2022/page-objects/components/datetime-picker/datetime-picker.component.mjs +53 -0
  26. package/esm2022/page-objects/components/dialogs/adf-confirm-dialog.component.mjs +36 -0
  27. package/esm2022/page-objects/components/dialogs/adf-folder-dialog.component.mjs +57 -0
  28. package/esm2022/page-objects/components/dialogs/adf-library-dialog.component.mjs +64 -0
  29. package/esm2022/page-objects/components/dialogs/content-node-selector-dialog.mjs +68 -0
  30. package/esm2022/page-objects/components/dialogs/create-from-template-dialog-component.mjs +55 -0
  31. package/esm2022/page-objects/components/dialogs/delete-trash-dialog.component.mjs +54 -0
  32. package/esm2022/page-objects/components/dialogs/edit-dialog.component.mjs +39 -0
  33. package/esm2022/page-objects/components/dialogs/link-rules.component.mjs +58 -0
  34. package/esm2022/page-objects/components/dialogs/manage-versions-dialog.component.mjs +36 -0
  35. package/esm2022/page-objects/components/dialogs/password-overlay-dialog.component.mjs +71 -0
  36. package/esm2022/page-objects/components/dialogs/share-dialog.component.mjs +85 -0
  37. package/esm2022/page-objects/components/dialogs/upload-dialog.component.mjs +36 -0
  38. package/esm2022/page-objects/components/dialogs/upload-new-version-dialog.component.mjs +38 -0
  39. package/esm2022/page-objects/components/dialogs/viewer-overlay-dialog.component.mjs +56 -0
  40. package/esm2022/page-objects/components/error.component.mjs +34 -0
  41. package/esm2022/page-objects/components/manageRules/manage-rules-dialog.component.mjs +64 -0
  42. package/esm2022/page-objects/components/manageRules/manage-rules.component.mjs +70 -0
  43. package/esm2022/page-objects/components/pagination.component.mjs +174 -0
  44. package/esm2022/page-objects/components/search/search-filters/search-filters-categories.component.mjs +33 -0
  45. package/esm2022/page-objects/components/search/search-filters/search-filters-date.component.mjs +115 -0
  46. package/esm2022/page-objects/components/search/search-filters/search-filters-location.component.mjs +40 -0
  47. package/esm2022/page-objects/components/search/search-filters/search-filters-logic.component.mjs +36 -0
  48. package/esm2022/page-objects/components/search/search-filters/search-filters-properties.component.mjs +83 -0
  49. package/esm2022/page-objects/components/search/search-filters/search-filters-tags.component.mjs +40 -0
  50. package/esm2022/page-objects/components/search/search-filters.component.mjs +45 -0
  51. package/esm2022/page-objects/components/search/search-input.component.mjs +48 -0
  52. package/esm2022/page-objects/components/search/search-overlay.components.mjs +83 -0
  53. package/esm2022/page-objects/components/search/search-sorting-picker.components.mjs +72 -0
  54. package/esm2022/page-objects/components/sidenav.component.mjs +88 -0
  55. package/esm2022/page-objects/components/snackBar/snack-bar.component.mjs +54 -0
  56. package/esm2022/page-objects/components/spinner.component.mjs +41 -0
  57. package/esm2022/page-objects/components/viewer.component.mjs +110 -0
  58. package/esm2022/page-objects/pages/base.page.mjs +84 -0
  59. package/esm2022/page-objects/pages/favorites-libraries.page.mjs +43 -0
  60. package/esm2022/page-objects/pages/favorites.page.mjs +49 -0
  61. package/esm2022/page-objects/pages/login.page.mjs +62 -0
  62. package/esm2022/page-objects/pages/my-libraries.page.mjs +54 -0
  63. package/esm2022/page-objects/pages/nodes.page.mjs +40 -0
  64. package/esm2022/page-objects/pages/personal-files.page.mjs +85 -0
  65. package/esm2022/page-objects/pages/recent-files.page.mjs +45 -0
  66. package/esm2022/page-objects/pages/search.page.mjs +79 -0
  67. package/esm2022/page-objects/pages/shared.page.mjs +45 -0
  68. package/esm2022/page-objects/pages/trash.page.mjs +45 -0
  69. package/esm2022/page-objects/playwright-base.mjs +33 -0
  70. package/esm2022/resources/test-files/index.mjs +102 -0
  71. package/esm2022/utils/logger.mjs +71 -0
  72. package/esm2022/utils/utils.mjs +145 -0
  73. package/{fesm2020 → fesm2022}/alfresco-aca-playwright-shared.mjs +816 -675
  74. package/fesm2022/alfresco-aca-playwright-shared.mjs.map +1 -0
  75. package/package.json +5 -11
  76. package/page-objects/components/adf-info-drawer.component.d.ts +18 -0
  77. package/page-objects/components/viewer.component.d.ts +11 -0
  78. package/page-objects/pages/search.page.d.ts +1 -1
  79. package/resources/test-files/index.d.ts +24 -0
  80. package/utils/utils.d.ts +2 -2
  81. package/esm2020/api/api-client-factory.mjs +0 -111
  82. package/esm2020/api/categories-api.mjs +0 -65
  83. package/esm2020/api/favorites-api.mjs +0 -129
  84. package/esm2020/api/file-actions.mjs +0 -166
  85. package/esm2020/api/nodes-api.mjs +0 -427
  86. package/esm2020/api/people-api-models.mjs +0 -34
  87. package/esm2020/api/queries-api.mjs +0 -69
  88. package/esm2020/api/rules-api.mjs +0 -251
  89. package/esm2020/api/search-api.mjs +0 -74
  90. package/esm2020/api/shared-links-api.mjs +0 -136
  91. package/esm2020/api/sites-api.mjs +0 -155
  92. package/esm2020/api/tags-api.mjs +0 -61
  93. package/esm2020/api/trashcan-api.mjs +0 -54
  94. package/esm2020/page-objects/components/aca-header.component.mjs +0 -77
  95. package/esm2020/page-objects/components/actions-dropdown.component.mjs +0 -99
  96. package/esm2020/page-objects/components/adf-info-drawer.component.mjs +0 -83
  97. package/esm2020/page-objects/components/base.component.mjs +0 -69
  98. package/esm2020/page-objects/components/breadcrumb/breadcrumb.component.mjs +0 -46
  99. package/esm2020/page-objects/components/conditions.component.mjs +0 -75
  100. package/esm2020/page-objects/components/dataTable/data-table.component.mjs +0 -341
  101. package/esm2020/page-objects/components/dataTable/mat-menu.component.mjs +0 -66
  102. package/esm2020/page-objects/components/dataTable/toolbar.component.mjs +0 -39
  103. package/esm2020/page-objects/components/datetime-picker/datetime-picker.component.mjs +0 -52
  104. package/esm2020/page-objects/components/dialogs/adf-confirm-dialog.component.mjs +0 -35
  105. package/esm2020/page-objects/components/dialogs/adf-folder-dialog.component.mjs +0 -56
  106. package/esm2020/page-objects/components/dialogs/adf-library-dialog.component.mjs +0 -63
  107. package/esm2020/page-objects/components/dialogs/content-node-selector-dialog.mjs +0 -67
  108. package/esm2020/page-objects/components/dialogs/create-from-template-dialog-component.mjs +0 -54
  109. package/esm2020/page-objects/components/dialogs/delete-trash-dialog.component.mjs +0 -53
  110. package/esm2020/page-objects/components/dialogs/edit-dialog.component.mjs +0 -38
  111. package/esm2020/page-objects/components/dialogs/link-rules.component.mjs +0 -57
  112. package/esm2020/page-objects/components/dialogs/password-overlay-dialog.component.mjs +0 -70
  113. package/esm2020/page-objects/components/dialogs/share-dialog.component.mjs +0 -84
  114. package/esm2020/page-objects/components/dialogs/upload-dialog.component.mjs +0 -35
  115. package/esm2020/page-objects/components/dialogs/upload-new-version-dialog.component.mjs +0 -37
  116. package/esm2020/page-objects/components/dialogs/viewer-overlay-dialog.component.mjs +0 -55
  117. package/esm2020/page-objects/components/error.component.mjs +0 -33
  118. package/esm2020/page-objects/components/manageRules/manage-rules-dialog.component.mjs +0 -63
  119. package/esm2020/page-objects/components/manageRules/manage-rules.component.mjs +0 -69
  120. package/esm2020/page-objects/components/pagination.component.mjs +0 -173
  121. package/esm2020/page-objects/components/search/search-filters/search-filters-categories.component.mjs +0 -32
  122. package/esm2020/page-objects/components/search/search-filters/search-filters-date.component.mjs +0 -114
  123. package/esm2020/page-objects/components/search/search-filters/search-filters-location.component.mjs +0 -39
  124. package/esm2020/page-objects/components/search/search-filters/search-filters-logic.component.mjs +0 -35
  125. package/esm2020/page-objects/components/search/search-filters/search-filters-properties.component.mjs +0 -82
  126. package/esm2020/page-objects/components/search/search-filters/search-filters-tags.component.mjs +0 -39
  127. package/esm2020/page-objects/components/search/search-filters.component.mjs +0 -44
  128. package/esm2020/page-objects/components/search/search-input.component.mjs +0 -47
  129. package/esm2020/page-objects/components/search/search-overlay.components.mjs +0 -82
  130. package/esm2020/page-objects/components/search/search-sorting-picker.components.mjs +0 -71
  131. package/esm2020/page-objects/components/sidenav.component.mjs +0 -86
  132. package/esm2020/page-objects/components/snackBar/snack-bar.component.mjs +0 -53
  133. package/esm2020/page-objects/components/spinner.component.mjs +0 -40
  134. package/esm2020/page-objects/components/viewer.component.mjs +0 -92
  135. package/esm2020/page-objects/pages/base.page.mjs +0 -80
  136. package/esm2020/page-objects/pages/favorites-libraries.page.mjs +0 -42
  137. package/esm2020/page-objects/pages/favorites.page.mjs +0 -48
  138. package/esm2020/page-objects/pages/login.page.mjs +0 -61
  139. package/esm2020/page-objects/pages/my-libraries.page.mjs +0 -53
  140. package/esm2020/page-objects/pages/nodes.page.mjs +0 -39
  141. package/esm2020/page-objects/pages/personal-files.page.mjs +0 -84
  142. package/esm2020/page-objects/pages/recent-files.page.mjs +0 -44
  143. package/esm2020/page-objects/pages/search.page.mjs +0 -78
  144. package/esm2020/page-objects/pages/shared.page.mjs +0 -44
  145. package/esm2020/page-objects/pages/trash.page.mjs +0 -44
  146. package/esm2020/page-objects/playwright-base.mjs +0 -31
  147. package/esm2020/resources/test-files/index.mjs +0 -78
  148. package/esm2020/utils/logger.mjs +0 -69
  149. package/esm2020/utils/utils.mjs +0 -144
  150. package/fesm2015/alfresco-aca-playwright-shared.mjs +0 -6267
  151. package/fesm2015/alfresco-aca-playwright-shared.mjs.map +0 -1
  152. package/fesm2020/alfresco-aca-playwright-shared.mjs.map +0 -1
  153. /package/{esm2020 → esm2022}/alfresco-aca-playwright-shared.mjs +0 -0
  154. /package/{esm2020 → esm2022}/api/index.mjs +0 -0
  155. /package/{esm2020 → esm2022}/api/node-content-tree.mjs +0 -0
  156. /package/{esm2020 → esm2022}/base-config/global-variables.mjs +0 -0
  157. /package/{esm2020 → esm2022}/base-config/global.setup.mjs +0 -0
  158. /package/{esm2020 → esm2022}/base-config/index.mjs +0 -0
  159. /package/{esm2020 → esm2022}/base-config/playwright.config.mjs +0 -0
  160. /package/{esm2020 → esm2022}/base-config/report-portal.config.mjs +0 -0
  161. /package/{esm2020 → esm2022}/fixtures/index.mjs +0 -0
  162. /package/{esm2020 → esm2022}/fixtures/page-initialization.mjs +0 -0
  163. /package/{esm2020 → esm2022}/models/custom-config.mjs +0 -0
  164. /package/{esm2020 → esm2022}/models/index.mjs +0 -0
  165. /package/{esm2020 → esm2022}/page-objects/components/dataTable/index.mjs +0 -0
  166. /package/{esm2020 → esm2022}/page-objects/components/dialogs/index.mjs +0 -0
  167. /package/{esm2020 → esm2022}/page-objects/components/index.mjs +0 -0
  168. /package/{esm2020 → esm2022}/page-objects/components/manageRules/index.mjs +0 -0
  169. /package/{esm2020 → esm2022}/page-objects/index.mjs +0 -0
  170. /package/{esm2020 → esm2022}/page-objects/pages/index.mjs +0 -0
  171. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  172. /package/{esm2020 → esm2022}/resources/index.mjs +0 -0
  173. /package/{esm2020 → esm2022}/resources/test-data/index.mjs +0 -0
  174. /package/{esm2020 → esm2022}/resources/test-data/test-data-files-folders.mjs +0 -0
  175. /package/{esm2020 → esm2022}/resources/test-data/test-data-permissions.mjs +0 -0
  176. /package/{esm2020 → esm2022}/utils/api.mjs +0 -0
  177. /package/{esm2020 → esm2022}/utils/config.mjs +0 -0
  178. /package/{esm2020 → esm2022}/utils/error-strings.mjs +0 -0
  179. /package/{esm2020 → esm2022}/utils/exclude-tests.mjs +0 -0
  180. /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
  181. /package/{esm2020 → esm2022}/utils/library-errors.mjs +0 -0
  182. /package/{esm2020 → esm2022}/utils/paths.mjs +0 -0
  183. /package/{esm2020 → esm2022}/utils/state-helper.mjs +0 -0
  184. /package/{esm2020 → esm2022}/utils/timeouts.mjs +0 -0
@@ -0,0 +1,145 @@
1
+ /*!
2
+ * Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
3
+ *
4
+ * Alfresco Example Content Application
5
+ *
6
+ * This file is part of the Alfresco Example Content Application.
7
+ * If the software was purchased under a paid Alfresco license, the terms of
8
+ * the paid license agreement will prevail. Otherwise, the software is
9
+ * provided under the following open source license terms:
10
+ *
11
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
12
+ * it under the terms of the GNU Lesser General Public License as published by
13
+ * the Free Software Foundation, either version 3 of the License, or
14
+ * (at your option) any later version.
15
+ *
16
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
17
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ * GNU Lesser General Public License for more details.
20
+ *
21
+ * You should have received a copy of the GNU Lesser General Public License
22
+ * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
23
+ */
24
+ const crypto = require('crypto');
25
+ import * as path from 'path';
26
+ import { format, subDays, subMonths, endOfMonth } from 'date-fns';
27
+ import StreamZip from 'node-stream-zip';
28
+ class Utils {
29
+ static string257Long = 'x'.repeat(257);
30
+ static string513Long = 'x'.repeat(513);
31
+ static random() {
32
+ return crypto.getRandomValues(new Uint32Array(1))[0].toString(36).substring(0, 5).toLowerCase();
33
+ }
34
+ static retryCall(fn, retry = 30, delay = 1500) {
35
+ const pause = (duration) => new Promise((res) => setTimeout(res, duration));
36
+ const run = (retries) => {
37
+ return fn().catch((err) => (retries > 1 ? pause(delay).then(() => run(retries - 1)) : Promise.reject(err)));
38
+ };
39
+ return run(retry);
40
+ }
41
+ static formatDate(date) {
42
+ return new Date(date).toLocaleDateString('en-US');
43
+ }
44
+ /**
45
+ * Method used to login user with navigation. Also waits for the page to load after login
46
+ *
47
+ * @param loginPage page context passed from the test
48
+ * @param username username string
49
+ * @param password password string
50
+ * @param errorMessage error message string if the login fails
51
+ *
52
+ */
53
+ static async tryLoginUser(loginPage, username, password, errorMessage = 'Error ') {
54
+ try {
55
+ await loginPage.loginUser({ username, password }, { withNavigation: true, waitForLoading: true });
56
+ }
57
+ catch (error) {
58
+ console.error(`${errorMessage}: ${error}`);
59
+ }
60
+ }
61
+ /**
62
+ * Method used to delete nodes and sites from user's account
63
+ *
64
+ * @param nodesApi nodesApi initialized with user credentials passed from the test
65
+ * @param trashcanApi trashcanApi initialized with user credentials passed from the test
66
+ * @param errorMessage error message string if the deleting sites/nodes fails
67
+ * @param sitesApi sitesApi initialized with user credentials passed from the test
68
+ * @param sitesToDelete array of sites' ids
69
+ *
70
+ */
71
+ static async deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, errorMessage = 'Error ', sitesApi, sitesToDelete) {
72
+ try {
73
+ await nodesApi?.deleteCurrentUserNodes();
74
+ await trashcanApi?.emptyTrashcan();
75
+ if (sitesToDelete?.length > 0) {
76
+ await sitesApi?.deleteSites(sitesToDelete);
77
+ }
78
+ }
79
+ catch (error) {
80
+ console.error(`${errorMessage}: ${error}`);
81
+ }
82
+ }
83
+ static async uploadFileNewVersion(personalFilesPage, fileFromOS) {
84
+ const fileInput = await personalFilesPage.page.$('#app-upload-file-version');
85
+ await fileInput.setInputFiles(path.join(__dirname, `../resources/test-files/${fileFromOS}.docx`));
86
+ }
87
+ static async reloadPageIfRowNotVisible(pageContext, nodeName, errorMessage = 'reloadPageIfRowNotVisible Error ') {
88
+ try {
89
+ if (!(await pageContext.dataTable.getRowByName(nodeName).isVisible())) {
90
+ await pageContext.page.reload({ waitUntil: 'load' });
91
+ }
92
+ }
93
+ catch (error) {
94
+ console.error(`${errorMessage}: ${error}`);
95
+ }
96
+ }
97
+ static async reloadPageIfDatatableEmpty(pageContext, errorMessage = 'reloadPageIfDatatableEmpty Error ') {
98
+ try {
99
+ if ((await pageContext.dataTable.getEmptyFolderLocator.isVisible()) || (await pageContext.dataTable.emptyListTitle.isVisible())) {
100
+ await pageContext.page.reload({ waitUntil: 'load' });
101
+ }
102
+ }
103
+ catch (error) {
104
+ console.error(`${errorMessage}: ${error}`);
105
+ }
106
+ }
107
+ static getCurrentAndPreviousDay(currentDate = new Date()) {
108
+ let formattedDate;
109
+ let formattedDate2;
110
+ const formatDate = (date) => {
111
+ return format(date, 'dd-MMM-yy').toUpperCase();
112
+ };
113
+ if (currentDate.getDate() === 1) {
114
+ const lastDayOfPreviousMonth = endOfMonth(subMonths(currentDate, 1));
115
+ formattedDate = formatDate(lastDayOfPreviousMonth);
116
+ formattedDate2 = formatDate(subDays(lastDayOfPreviousMonth, 1));
117
+ }
118
+ else {
119
+ formattedDate = formatDate(currentDate);
120
+ formattedDate2 = formatDate(subDays(currentDate, 1));
121
+ }
122
+ return { currentDate: formattedDate, previousDate: formattedDate2 };
123
+ }
124
+ static async verifyZipFileContent(filePath, fileOrFolderName) {
125
+ const zip = new StreamZip({
126
+ file: filePath,
127
+ storeEntries: true
128
+ });
129
+ return new Promise((resolve) => {
130
+ zip.on('ready', () => {
131
+ const entries = zip.entries();
132
+ const found = this.isFileOrFolderInEntries(entries, fileOrFolderName);
133
+ zip.close();
134
+ resolve(found);
135
+ });
136
+ });
137
+ }
138
+ static isFileOrFolderInEntries(entries, fileOrFolderName) {
139
+ return fileOrFolderName.some((name) => {
140
+ return Object.keys(entries).some((entry) => entry.includes(name));
141
+ });
142
+ }
143
+ }
144
+ export { Utils };
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY2EtcGxheXdyaWdodC1zaGFyZWQvc3JjL3V0aWxzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEUsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUM7QUFHeEMsTUFBYSxLQUFLO0lBQ2hCLE1BQU0sQ0FBVSxhQUFhLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRCxNQUFNLENBQVUsYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFaEQsTUFBTSxDQUFDLE1BQU07UUFDWCxPQUFPLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsRyxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFzQixFQUFFLFFBQWdCLEVBQUUsRUFBRSxRQUFnQixJQUFJO1FBQy9FLE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUVwRixNQUFNLEdBQUcsR0FB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QUMsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsZ0JBQTBCO1FBQzVFLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ3hCLElBQUksRUFBRSxRQUFRO1lBQ2QsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3RDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDbkIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3RFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBK0MsRUFBRSxnQkFBMEI7UUFDaEgsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNwQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztTQTNJVSxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI0IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFsZnJlc2NvIEV4YW1wbGUgQ29udGVudCBBcHBsaWNhdGlvbi5cbiAqIElmIHRoZSBzb2Z0d2FyZSB3YXMgcHVyY2hhc2VkIHVuZGVyIGEgcGFpZCBBbGZyZXNjbyBsaWNlbnNlLCB0aGUgdGVybXMgb2ZcbiAqIHRoZSBwYWlkIGxpY2Vuc2UgYWdyZWVtZW50IHdpbGwgcHJldmFpbC4gT3RoZXJ3aXNlLCB0aGUgc29mdHdhcmUgaXNcbiAqIHByb3ZpZGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgb3BlbiBzb3VyY2UgbGljZW5zZSB0ZXJtczpcbiAqXG4gKiBUaGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhlIEFsZnJlc2NvIEV4YW1wbGUgQ29udGVudCBBcHBsaWNhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBmcm9tIEh5bGFuZCBTb2Z0d2FyZS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICovXG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IExvZ2luUGFnZSwgTXlMaWJyYXJpZXNQYWdlLCBQZXJzb25hbEZpbGVzUGFnZSwgRmF2b3JpdGVzTGlicmFyaWVzUGFnZSwgU2VhcmNoUGFnZSwgU2hhcmVkUGFnZSwgVHJhc2hQYWdlIH0gZnJvbSAnLi4vcGFnZS1vYmplY3RzJztcbmltcG9ydCB7IGZvcm1hdCwgc3ViRGF5cywgc3ViTW9udGhzLCBlbmRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IFN0cmVhbVppcCBmcm9tICdub2RlLXN0cmVhbS16aXAnO1xuaW1wb3J0IHsgTm9kZXNBcGksIFNpdGVzQXBpLCBUcmFzaGNhbkFwaSB9IGZyb20gJy4uL2FwaSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyB7XG4gIHN0YXRpYyByZWFkb25seSBzdHJpbmcyNTdMb25nID0gJ3gnLnJlcGVhdCgyNTcpO1xuICBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nNTEzTG9uZyA9ICd4Jy5yZXBlYXQoNTEzKTtcblxuICBzdGF0aWMgcmFuZG9tKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXS50b1N0cmluZygzNikuc3Vic3RyaW5nKDAsIDUpLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBzdGF0aWMgcmV0cnlDYWxsKGZuOiAoKSA9PiBQcm9taXNlPGFueT4sIHJldHJ5OiBudW1iZXIgPSAzMCwgZGVsYXk6IG51bWJlciA9IDE1MDApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBhdXNlID0gKGR1cmF0aW9uOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXMpID0+IHNldFRpbWVvdXQocmVzLCBkdXJhdGlvbikpO1xuXG4gICAgY29uc3QgcnVuID0gKHJldHJpZXM6IG51bWJlcik6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICByZXR1cm4gZm4oKS5jYXRjaCgoZXJyKSA9PiAocmV0cmllcyA+IDEgPyBwYXVzZShkZWxheSkudGhlbigoKSA9PiBydW4ocmV0cmllcyAtIDEpKSA6IFByb21pc2UucmVqZWN0KGVycikpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJ1bihyZXRyeSk7XG4gIH1cblxuICBzdGF0aWMgZm9ybWF0RGF0ZShkYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gbG9naW4gdXNlciB3aXRoIG5hdmlnYXRpb24uIEFsc28gd2FpdHMgZm9yIHRoZSBwYWdlIHRvIGxvYWQgYWZ0ZXIgbG9naW5cbiAgICpcbiAgICogQHBhcmFtIGxvZ2luUGFnZSBwYWdlIGNvbnRleHQgcGFzc2VkIGZyb20gdGhlIHRlc3RcbiAgICogQHBhcmFtIHVzZXJuYW1lIHVzZXJuYW1lIHN0cmluZ1xuICAgKiBAcGFyYW0gcGFzc3dvcmQgcGFzc3dvcmQgc3RyaW5nXG4gICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgZXJyb3IgbWVzc2FnZSBzdHJpbmcgaWYgdGhlIGxvZ2luIGZhaWxzXG4gICAqXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdHJ5TG9naW5Vc2VyKGxvZ2luUGFnZTogTG9naW5QYWdlLCB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBlcnJvck1lc3NhZ2UgPSAnRXJyb3IgJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsb2dpblBhZ2UubG9naW5Vc2VyKHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0sIHsgd2l0aE5hdmlnYXRpb246IHRydWUsIHdhaXRGb3JMb2FkaW5nOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yTWVzc2FnZX06ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGRlbGV0ZSBub2RlcyBhbmQgc2l0ZXMgZnJvbSB1c2VyJ3MgYWNjb3VudFxuICAgKlxuICAgKiBAcGFyYW0gbm9kZXNBcGkgbm9kZXNBcGkgaW5pdGlhbGl6ZWQgd2l0aCB1c2VyIGNyZWRlbnRpYWxzIHBhc3NlZCBmcm9tIHRoZSB0ZXN0XG4gICAqIEBwYXJhbSB0cmFzaGNhbkFwaSB0cmFzaGNhbkFwaSBpbml0aWFsaXplZCB3aXRoIHVzZXIgY3JlZGVudGlhbHMgcGFzc2VkIGZyb20gdGhlIHRlc3RcbiAgICogQHBhcmFtIGVycm9yTWVzc2FnZSBlcnJvciBtZXNzYWdlIHN0cmluZyBpZiB0aGUgZGVsZXRpbmcgc2l0ZXMvbm9kZXMgZmFpbHNcbiAgICogQHBhcmFtIHNpdGVzQXBpIHNpdGVzQXBpIGluaXRpYWxpemVkIHdpdGggdXNlciBjcmVkZW50aWFscyBwYXNzZWQgZnJvbSB0aGUgdGVzdFxuICAgKiBAcGFyYW0gc2l0ZXNUb0RlbGV0ZSBhcnJheSBvZiBzaXRlcycgaWRzXG4gICAqXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVsZXRlTm9kZXNTaXRlc0VtcHR5VHJhc2hjYW4oXG4gICAgbm9kZXNBcGk/OiBOb2Rlc0FwaSxcbiAgICB0cmFzaGNhbkFwaT86IFRyYXNoY2FuQXBpLFxuICAgIGVycm9yTWVzc2FnZSA9ICdFcnJvciAnLFxuICAgIHNpdGVzQXBpPzogU2l0ZXNBcGksXG4gICAgc2l0ZXNUb0RlbGV0ZT86IHN0cmluZ1tdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBub2Rlc0FwaT8uZGVsZXRlQ3VycmVudFVzZXJOb2RlcygpO1xuICAgICAgYXdhaXQgdHJhc2hjYW5BcGk/LmVtcHR5VHJhc2hjYW4oKTtcbiAgICAgIGlmIChzaXRlc1RvRGVsZXRlPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHNpdGVzQXBpPy5kZWxldGVTaXRlcyhzaXRlc1RvRGVsZXRlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgJHtlcnJvck1lc3NhZ2V9OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB1cGxvYWRGaWxlTmV3VmVyc2lvbihwZXJzb25hbEZpbGVzUGFnZTogUGVyc29uYWxGaWxlc1BhZ2UsIGZpbGVGcm9tT1M6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGVJbnB1dCA9IGF3YWl0IHBlcnNvbmFsRmlsZXNQYWdlLnBhZ2UuJCgnI2FwcC11cGxvYWQtZmlsZS12ZXJzaW9uJyk7XG4gICAgYXdhaXQgZmlsZUlucHV0LnNldElucHV0RmlsZXMocGF0aC5qb2luKF9fZGlybmFtZSwgYC4uL3Jlc291cmNlcy90ZXN0LWZpbGVzLyR7ZmlsZUZyb21PU30uZG9jeGApKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyByZWxvYWRQYWdlSWZSb3dOb3RWaXNpYmxlKFxuICAgIHBhZ2VDb250ZXh0OiBQZXJzb25hbEZpbGVzUGFnZSB8IE15TGlicmFyaWVzUGFnZSB8IEZhdm9yaXRlc0xpYnJhcmllc1BhZ2UgfCBTZWFyY2hQYWdlIHwgU2hhcmVkUGFnZSxcbiAgICBub2RlTmFtZTogc3RyaW5nLFxuICAgIGVycm9yTWVzc2FnZSA9ICdyZWxvYWRQYWdlSWZSb3dOb3RWaXNpYmxlIEVycm9yICdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghKGF3YWl0IHBhZ2VDb250ZXh0LmRhdGFUYWJsZS5nZXRSb3dCeU5hbWUobm9kZU5hbWUpLmlzVmlzaWJsZSgpKSkge1xuICAgICAgICBhd2FpdCBwYWdlQ29udGV4dC5wYWdlLnJlbG9hZCh7IHdhaXRVbnRpbDogJ2xvYWQnIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yTWVzc2FnZX06ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHJlbG9hZFBhZ2VJZkRhdGF0YWJsZUVtcHR5KFxuICAgIHBhZ2VDb250ZXh0OiBQZXJzb25hbEZpbGVzUGFnZSB8IE15TGlicmFyaWVzUGFnZSB8IEZhdm9yaXRlc0xpYnJhcmllc1BhZ2UgfCBTZWFyY2hQYWdlIHwgU2hhcmVkUGFnZSB8IFRyYXNoUGFnZSxcbiAgICBlcnJvck1lc3NhZ2UgPSAncmVsb2FkUGFnZUlmRGF0YXRhYmxlRW1wdHkgRXJyb3IgJ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKChhd2FpdCBwYWdlQ29udGV4dC5kYXRhVGFibGUuZ2V0RW1wdHlGb2xkZXJMb2NhdG9yLmlzVmlzaWJsZSgpKSB8fCAoYXdhaXQgcGFnZUNvbnRleHQuZGF0YVRhYmxlLmVtcHR5TGlzdFRpdGxlLmlzVmlzaWJsZSgpKSkge1xuICAgICAgICBhd2FpdCBwYWdlQ29udGV4dC5wYWdlLnJlbG9hZCh7IHdhaXRVbnRpbDogJ2xvYWQnIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yTWVzc2FnZX06ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEN1cnJlbnRBbmRQcmV2aW91c0RheShjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCkpOiB7IGN1cnJlbnREYXRlOiBzdHJpbmc7IHByZXZpb3VzRGF0ZTogc3RyaW5nIH0ge1xuICAgIGxldCBmb3JtYXR0ZWREYXRlOiBzdHJpbmc7XG4gICAgbGV0IGZvcm1hdHRlZERhdGUyOiBzdHJpbmc7XG5cbiAgICBjb25zdCBmb3JtYXREYXRlID0gKGRhdGU6IERhdGUpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGZvcm1hdChkYXRlLCAnZGQtTU1NLXl5JykudG9VcHBlckNhc2UoKTtcbiAgICB9O1xuXG4gICAgaWYgKGN1cnJlbnREYXRlLmdldERhdGUoKSA9PT0gMSkge1xuICAgICAgY29uc3QgbGFzdERheU9mUHJldmlvdXNNb250aDogRGF0ZSA9IGVuZE9mTW9udGgoc3ViTW9udGhzKGN1cnJlbnREYXRlLCAxKSk7XG4gICAgICBmb3JtYXR0ZWREYXRlID0gZm9ybWF0RGF0ZShsYXN0RGF5T2ZQcmV2aW91c01vbnRoKTtcbiAgICAgIGZvcm1hdHRlZERhdGUyID0gZm9ybWF0RGF0ZShzdWJEYXlzKGxhc3REYXlPZlByZXZpb3VzTW9udGgsIDEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybWF0dGVkRGF0ZSA9IGZvcm1hdERhdGUoY3VycmVudERhdGUpO1xuICAgICAgZm9ybWF0dGVkRGF0ZTIgPSBmb3JtYXREYXRlKHN1YkRheXMoY3VycmVudERhdGUsIDEpKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjdXJyZW50RGF0ZTogZm9ybWF0dGVkRGF0ZSwgcHJldmlvdXNEYXRlOiBmb3JtYXR0ZWREYXRlMiB9O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHZlcmlmeVppcEZpbGVDb250ZW50KGZpbGVQYXRoOiBzdHJpbmcsIGZpbGVPckZvbGRlck5hbWU6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgemlwID0gbmV3IFN0cmVhbVppcCh7XG4gICAgICBmaWxlOiBmaWxlUGF0aCxcbiAgICAgIHN0b3JlRW50cmllczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICB6aXAub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gemlwLmVudHJpZXMoKTtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmlzRmlsZU9yRm9sZGVySW5FbnRyaWVzKGVudHJpZXMsIGZpbGVPckZvbGRlck5hbWUpO1xuICAgICAgICB6aXAuY2xvc2UoKTtcbiAgICAgICAgcmVzb2x2ZShmb3VuZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzRmlsZU9yRm9sZGVySW5FbnRyaWVzKGVudHJpZXM6IHsgW25hbWU6IHN0cmluZ106IFN0cmVhbVppcC5aaXBFbnRyeSB9LCBmaWxlT3JGb2xkZXJOYW1lOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmaWxlT3JGb2xkZXJOYW1lLnNvbWUoKG5hbWUpID0+IHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlbnRyaWVzKS5zb21lKChlbnRyeSkgPT4gZW50cnkuaW5jbHVkZXMobmFtZSkpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=