@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
@@ -1,144 +0,0 @@
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
- export class Utils {
29
- static random() {
30
- return crypto.getRandomValues(new Uint32Array(1))[0].toString(36).substring(0, 5).toLowerCase();
31
- }
32
- static retryCall(fn, retry = 30, delay = 1500) {
33
- const pause = (duration) => new Promise((res) => setTimeout(res, duration));
34
- const run = (retries) => {
35
- return fn().catch((err) => (retries > 1 ? pause(delay).then(() => run(retries - 1)) : Promise.reject(err)));
36
- };
37
- return run(retry);
38
- }
39
- static formatDate(date) {
40
- return new Date(date).toLocaleDateString('en-US');
41
- }
42
- /**
43
- * Method used to login user with navigation. Also waits for the page to load after login
44
- *
45
- * @param loginPage page context passed from the test
46
- * @param username username string
47
- * @param password password string
48
- * @param errorMessage error message string if the login fails
49
- *
50
- */
51
- static async tryLoginUser(loginPage, username, password, errorMessage = 'Error ') {
52
- try {
53
- await loginPage.loginUser({ username, password }, { withNavigation: true, waitForLoading: true });
54
- }
55
- catch (error) {
56
- console.error(`${errorMessage}: ${error}`);
57
- }
58
- }
59
- /**
60
- * Method used to delete nodes and sites from user's account
61
- *
62
- * @param nodesApi nodesApi initialized with user credentials passed from the test
63
- * @param trashcanApi trashcanApi initialized with user credentials passed from the test
64
- * @param errorMessage error message string if the deleting sites/nodes fails
65
- * @param sitesApi sitesApi initialized with user credentials passed from the test
66
- * @param sitesToDelete array of sites' ids
67
- *
68
- */
69
- static async deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, errorMessage = 'Error ', sitesApi, sitesToDelete) {
70
- try {
71
- await nodesApi?.deleteCurrentUserNodes();
72
- await trashcanApi?.emptyTrashcan();
73
- if (sitesToDelete?.length > 0) {
74
- await sitesApi?.deleteSites(sitesToDelete);
75
- }
76
- }
77
- catch (error) {
78
- console.error(`${errorMessage}: ${error}`);
79
- }
80
- }
81
- static async uploadFileNewVersion(personalFilesPage, fileFromOS) {
82
- const fileInput = await personalFilesPage.page.$('#app-upload-file-version');
83
- await fileInput.setInputFiles(path.join(__dirname, `../resources/test-files/${fileFromOS}.docx`));
84
- }
85
- static async reloadPageIfRowNotVisible(pageContext, nodeName, errorMessage = 'reloadPageIfRowNotVisible Error ') {
86
- try {
87
- if (!(await pageContext.dataTable.getRowByName(nodeName).isVisible())) {
88
- await pageContext.page.reload({ waitUntil: 'load' });
89
- }
90
- }
91
- catch (error) {
92
- console.error(`${errorMessage}: ${error}`);
93
- }
94
- }
95
- static async reloadPageIfDatatableEmpty(pageContext, errorMessage = 'reloadPageIfDatatableEmpty Error ') {
96
- try {
97
- if ((await pageContext.dataTable.getEmptyFolderLocator.isVisible()) || (await pageContext.dataTable.emptyListTitle.isVisible())) {
98
- await pageContext.page.reload({ waitUntil: 'load' });
99
- }
100
- }
101
- catch (error) {
102
- console.error(`${errorMessage}: ${error}`);
103
- }
104
- }
105
- static getCurrentAndPreviousDay(currentDate = new Date()) {
106
- let formattedDate;
107
- let formattedDate2;
108
- const formatDate = (date) => {
109
- return format(date, 'dd-MMM-yy').toUpperCase();
110
- };
111
- if (currentDate.getDate() === 1) {
112
- const lastDayOfPreviousMonth = endOfMonth(subMonths(currentDate, 1));
113
- formattedDate = formatDate(lastDayOfPreviousMonth);
114
- formattedDate2 = formatDate(subDays(lastDayOfPreviousMonth, 1));
115
- }
116
- else {
117
- formattedDate = formatDate(currentDate);
118
- formattedDate2 = formatDate(subDays(currentDate, 1));
119
- }
120
- return { currentDate: formattedDate, previousDate: formattedDate2 };
121
- }
122
- static async verifyZipFileContent(filePath, fileOrFolderName) {
123
- const zip = new StreamZip({
124
- file: filePath,
125
- storeEntries: true
126
- });
127
- return new Promise((resolve) => {
128
- zip.on('ready', () => {
129
- const entries = zip.entries();
130
- const found = this.isFileOrFolderInEntries(entries, fileOrFolderName);
131
- zip.close();
132
- resolve(found);
133
- });
134
- });
135
- }
136
- static isFileOrFolderInEntries(entries, fileOrFolderName) {
137
- return fileOrFolderName.some((name) => {
138
- return Object.keys(entries).some((entry) => entry.includes(name));
139
- });
140
- }
141
- }
142
- Utils.string257Long = 'x'.repeat(257);
143
- Utils.string513Long = 'x'.repeat(513);
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY2EtcGxheXdyaWdodC1zaGFyZWQvc3JjL3V0aWxzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEUsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUM7QUFHeEMsTUFBTSxPQUFPLEtBQUs7SUFJaEIsTUFBTSxDQUFDLE1BQU07UUFDWCxPQUFPLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsRyxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFzQixFQUFFLFFBQWdCLEVBQUUsRUFBRSxRQUFnQixJQUFJO1FBQy9FLE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUVwRixNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQWUsRUFBZ0IsRUFBRTtZQUM1QyxPQUFPLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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QUFvQixDQUFDLFFBQWdCLEVBQUUsZ0JBQTBCO1FBQzVFLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ3hCLElBQUksRUFBRSxRQUFRO1lBQ2QsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3RDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDbkIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3RFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBK0MsRUFBRSxnQkFBMEI7UUFDaEgsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNwQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQTFJTSxtQkFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsbUJBQWEsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI0IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFsZnJlc2NvIEV4YW1wbGUgQ29udGVudCBBcHBsaWNhdGlvbi5cbiAqIElmIHRoZSBzb2Z0d2FyZSB3YXMgcHVyY2hhc2VkIHVuZGVyIGEgcGFpZCBBbGZyZXNjbyBsaWNlbnNlLCB0aGUgdGVybXMgb2ZcbiAqIHRoZSBwYWlkIGxpY2Vuc2UgYWdyZWVtZW50IHdpbGwgcHJldmFpbC4gT3RoZXJ3aXNlLCB0aGUgc29mdHdhcmUgaXNcbiAqIHByb3ZpZGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgb3BlbiBzb3VyY2UgbGljZW5zZSB0ZXJtczpcbiAqXG4gKiBUaGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhlIEFsZnJlc2NvIEV4YW1wbGUgQ29udGVudCBBcHBsaWNhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBmcm9tIEh5bGFuZCBTb2Z0d2FyZS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICovXG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IExvZ2luUGFnZSwgTXlMaWJyYXJpZXNQYWdlLCBQZXJzb25hbEZpbGVzUGFnZSwgRmF2b3JpdGVzTGlicmFyaWVzUGFnZSwgU2VhcmNoUGFnZSwgU2hhcmVkUGFnZSwgVHJhc2hQYWdlIH0gZnJvbSAnLi4vcGFnZS1vYmplY3RzJztcbmltcG9ydCB7IGZvcm1hdCwgc3ViRGF5cywgc3ViTW9udGhzLCBlbmRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IFN0cmVhbVppcCBmcm9tICdub2RlLXN0cmVhbS16aXAnO1xuaW1wb3J0IHsgTm9kZXNBcGksIFNpdGVzQXBpLCBUcmFzaGNhbkFwaSB9IGZyb20gJy4uL2FwaSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyB7XG4gIHN0YXRpYyBzdHJpbmcyNTdMb25nID0gJ3gnLnJlcGVhdCgyNTcpO1xuICBzdGF0aWMgc3RyaW5nNTEzTG9uZyA9ICd4Jy5yZXBlYXQoNTEzKTtcblxuICBzdGF0aWMgcmFuZG9tKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXS50b1N0cmluZygzNikuc3Vic3RyaW5nKDAsIDUpLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBzdGF0aWMgcmV0cnlDYWxsKGZuOiAoKSA9PiBQcm9taXNlPGFueT4sIHJldHJ5OiBudW1iZXIgPSAzMCwgZGVsYXk6IG51bWJlciA9IDE1MDApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBhdXNlID0gKGR1cmF0aW9uOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXMpID0+IHNldFRpbWVvdXQocmVzLCBkdXJhdGlvbikpO1xuXG4gICAgY29uc3QgcnVuID0gKHJldHJpZXM6IG51bWJlcik6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICByZXR1cm4gZm4oKS5jYXRjaCgoZXJyKSA9PiAocmV0cmllcyA+IDEgPyBwYXVzZShkZWxheSkudGhlbigoKSA9PiBydW4ocmV0cmllcyAtIDEpKSA6IFByb21pc2UucmVqZWN0KGVycikpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJ1bihyZXRyeSk7XG4gIH1cblxuICBzdGF0aWMgZm9ybWF0RGF0ZShkYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gbG9naW4gdXNlciB3aXRoIG5hdmlnYXRpb24uIEFsc28gd2FpdHMgZm9yIHRoZSBwYWdlIHRvIGxvYWQgYWZ0ZXIgbG9naW5cbiAgICpcbiAgICogQHBhcmFtIGxvZ2luUGFnZSBwYWdlIGNvbnRleHQgcGFzc2VkIGZyb20gdGhlIHRlc3RcbiAgICogQHBhcmFtIHVzZXJuYW1lIHVzZXJuYW1lIHN0cmluZ1xuICAgKiBAcGFyYW0gcGFzc3dvcmQgcGFzc3dvcmQgc3RyaW5nXG4gICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgZXJyb3IgbWVzc2FnZSBzdHJpbmcgaWYgdGhlIGxvZ2luIGZhaWxzXG4gICAqXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdHJ5TG9naW5Vc2VyKGxvZ2luUGFnZTogTG9naW5QYWdlLCB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBlcnJvck1lc3NhZ2UgPSAnRXJyb3IgJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsb2dpblBhZ2UubG9naW5Vc2VyKHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0sIHsgd2l0aE5hdmlnYXRpb246IHRydWUsIHdhaXRGb3JMb2FkaW5nOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yTWVzc2FnZX06ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGRlbGV0ZSBub2RlcyBhbmQgc2l0ZXMgZnJvbSB1c2VyJ3MgYWNjb3VudFxuICAgKlxuICAgKiBAcGFyYW0gbm9kZXNBcGkgbm9kZXNBcGkgaW5pdGlhbGl6ZWQgd2l0aCB1c2VyIGNyZWRlbnRpYWxzIHBhc3NlZCBmcm9tIHRoZSB0ZXN0XG4gICAqIEBwYXJhbSB0cmFzaGNhbkFwaSB0cmFzaGNhbkFwaSBpbml0aWFsaXplZCB3aXRoIHVzZXIgY3JlZGVudGlhbHMgcGFzc2VkIGZyb20gdGhlIHRlc3RcbiAgICogQHBhcmFtIGVycm9yTWVzc2FnZSBlcnJvciBtZXNzYWdlIHN0cmluZyBpZiB0aGUgZGVsZXRpbmcgc2l0ZXMvbm9kZXMgZmFpbHNcbiAgICogQHBhcmFtIHNpdGVzQXBpIHNpdGVzQXBpIGluaXRpYWxpemVkIHdpdGggdXNlciBjcmVkZW50aWFscyBwYXNzZWQgZnJvbSB0aGUgdGVzdFxuICAgKiBAcGFyYW0gc2l0ZXNUb0RlbGV0ZSBhcnJheSBvZiBzaXRlcycgaWRzXG4gICAqXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVsZXRlTm9kZXNTaXRlc0VtcHR5VHJhc2hjYW4oXG4gICAgbm9kZXNBcGk/OiBOb2Rlc0FwaSxcbiAgICB0cmFzaGNhbkFwaT86IFRyYXNoY2FuQXBpLFxuICAgIGVycm9yTWVzc2FnZSA9ICdFcnJvciAnLFxuICAgIHNpdGVzQXBpPzogU2l0ZXNBcGksXG4gICAgc2l0ZXNUb0RlbGV0ZT86IHN0cmluZ1tdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBub2Rlc0FwaT8uZGVsZXRlQ3VycmVudFVzZXJOb2RlcygpO1xuICAgICAgYXdhaXQgdHJhc2hjYW5BcGk/LmVtcHR5VHJhc2hjYW4oKTtcbiAgICAgIGlmIChzaXRlc1RvRGVsZXRlPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHNpdGVzQXBpPy5kZWxldGVTaXRlcyhzaXRlc1RvRGVsZXRlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgJHtlcnJvck1lc3NhZ2V9OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB1cGxvYWRGaWxlTmV3VmVyc2lvbihwZXJzb25hbEZpbGVzUGFnZTogUGVyc29uYWxGaWxlc1BhZ2UsIGZpbGVGcm9tT1M6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGVJbnB1dCA9IGF3YWl0IHBlcnNvbmFsRmlsZXNQYWdlLnBhZ2UuJCgnI2FwcC11cGxvYWQtZmlsZS12ZXJzaW9uJyk7XG4gICAgYXdhaXQgZmlsZUlucHV0LnNldElucHV0RmlsZXMocGF0aC5qb2luKF9fZGlybmFtZSwgYC4uL3Jlc291cmNlcy90ZXN0LWZpbGVzLyR7ZmlsZUZyb21PU30uZG9jeGApKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyByZWxvYWRQYWdlSWZSb3dOb3RWaXNpYmxlKFxuICAgIHBhZ2VDb250ZXh0OiBQZXJzb25hbEZpbGVzUGFnZSB8IE15TGlicmFyaWVzUGFnZSB8IEZhdm9yaXRlc0xpYnJhcmllc1BhZ2UgfCBTZWFyY2hQYWdlIHwgU2hhcmVkUGFnZSxcbiAgICBub2RlTmFtZTogc3RyaW5nLFxuICAgIGVycm9yTWVzc2FnZSA9ICdyZWxvYWRQYWdlSWZSb3dOb3RWaXNpYmxlIEVycm9yICdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghKGF3YWl0IHBhZ2VDb250ZXh0LmRhdGFUYWJsZS5nZXRSb3dCeU5hbWUobm9kZU5hbWUpLmlzVmlzaWJsZSgpKSkge1xuICAgICAgICBhd2FpdCBwYWdlQ29udGV4dC5wYWdlLnJlbG9hZCh7IHdhaXRVbnRpbDogJ2xvYWQnIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yTWVzc2FnZX06ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHJlbG9hZFBhZ2VJZkRhdGF0YWJsZUVtcHR5KFxuICAgIHBhZ2VDb250ZXh0OiBQZXJzb25hbEZpbGVzUGFnZSB8IE15TGlicmFyaWVzUGFnZSB8IEZhdm9yaXRlc0xpYnJhcmllc1BhZ2UgfCBTZWFyY2hQYWdlIHwgU2hhcmVkUGFnZSB8IFRyYXNoUGFnZSxcbiAgICBlcnJvck1lc3NhZ2UgPSAncmVsb2FkUGFnZUlmRGF0YXRhYmxlRW1wdHkgRXJyb3IgJ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKChhd2FpdCBwYWdlQ29udGV4dC5kYXRhVGFibGUuZ2V0RW1wdHlGb2xkZXJMb2NhdG9yLmlzVmlzaWJsZSgpKSB8fCAoYXdhaXQgcGFnZUNvbnRleHQuZGF0YVRhYmxlLmVtcHR5TGlzdFRpdGxlLmlzVmlzaWJsZSgpKSkge1xuICAgICAgICBhd2FpdCBwYWdlQ29udGV4dC5wYWdlLnJlbG9hZCh7IHdhaXRVbnRpbDogJ2xvYWQnIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yTWVzc2FnZX06ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEN1cnJlbnRBbmRQcmV2aW91c0RheShjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCkpOiB7IGN1cnJlbnREYXRlOiBzdHJpbmc7IHByZXZpb3VzRGF0ZTogc3RyaW5nIH0ge1xuICAgIGxldCBmb3JtYXR0ZWREYXRlOiBzdHJpbmc7XG4gICAgbGV0IGZvcm1hdHRlZERhdGUyOiBzdHJpbmc7XG5cbiAgICBjb25zdCBmb3JtYXREYXRlID0gKGRhdGU6IERhdGUpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGZvcm1hdChkYXRlLCAnZGQtTU1NLXl5JykudG9VcHBlckNhc2UoKTtcbiAgICB9O1xuXG4gICAgaWYgKGN1cnJlbnREYXRlLmdldERhdGUoKSA9PT0gMSkge1xuICAgICAgY29uc3QgbGFzdERheU9mUHJldmlvdXNNb250aDogRGF0ZSA9IGVuZE9mTW9udGgoc3ViTW9udGhzKGN1cnJlbnREYXRlLCAxKSk7XG4gICAgICBmb3JtYXR0ZWREYXRlID0gZm9ybWF0RGF0ZShsYXN0RGF5T2ZQcmV2aW91c01vbnRoKTtcbiAgICAgIGZvcm1hdHRlZERhdGUyID0gZm9ybWF0RGF0ZShzdWJEYXlzKGxhc3REYXlPZlByZXZpb3VzTW9udGgsIDEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybWF0dGVkRGF0ZSA9IGZvcm1hdERhdGUoY3VycmVudERhdGUpO1xuICAgICAgZm9ybWF0dGVkRGF0ZTIgPSBmb3JtYXREYXRlKHN1YkRheXMoY3VycmVudERhdGUsIDEpKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjdXJyZW50RGF0ZTogZm9ybWF0dGVkRGF0ZSwgcHJldmlvdXNEYXRlOiBmb3JtYXR0ZWREYXRlMiB9O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHZlcmlmeVppcEZpbGVDb250ZW50KGZpbGVQYXRoOiBzdHJpbmcsIGZpbGVPckZvbGRlck5hbWU6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgemlwID0gbmV3IFN0cmVhbVppcCh7XG4gICAgICBmaWxlOiBmaWxlUGF0aCxcbiAgICAgIHN0b3JlRW50cmllczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICB6aXAub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gemlwLmVudHJpZXMoKTtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmlzRmlsZU9yRm9sZGVySW5FbnRyaWVzKGVudHJpZXMsIGZpbGVPckZvbGRlck5hbWUpO1xuICAgICAgICB6aXAuY2xvc2UoKTtcbiAgICAgICAgcmVzb2x2ZShmb3VuZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzRmlsZU9yRm9sZGVySW5FbnRyaWVzKGVudHJpZXM6IHsgW25hbWU6IHN0cmluZ106IFN0cmVhbVppcC5aaXBFbnRyeSB9LCBmaWxlT3JGb2xkZXJOYW1lOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmaWxlT3JGb2xkZXJOYW1lLnNvbWUoKG5hbWUpID0+IHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlbnRyaWVzKS5zb21lKChlbnRyeSkgPT4gZW50cnkuaW5jbHVkZXMobmFtZSkpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=