@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.
- package/api/tags-api.d.ts +8 -2
- package/esm2022/api/api-client-factory.mjs +131 -0
- package/esm2022/api/categories-api.mjs +66 -0
- package/esm2022/api/favorites-api.mjs +130 -0
- package/esm2022/api/file-actions.mjs +167 -0
- package/esm2022/api/nodes-api.mjs +428 -0
- package/esm2022/api/people-api-models.mjs +41 -0
- package/esm2022/api/queries-api.mjs +70 -0
- package/esm2022/api/rules-api.mjs +258 -0
- package/esm2022/api/search-api.mjs +75 -0
- package/esm2022/api/shared-links-api.mjs +137 -0
- package/esm2022/api/sites-api.mjs +156 -0
- package/esm2022/api/tags-api.mjs +92 -0
- package/esm2022/api/trashcan-api.mjs +52 -0
- package/{esm2020 → esm2022}/models/user-model.mjs +11 -5
- package/esm2022/page-objects/components/aca-header.component.mjs +78 -0
- package/esm2022/page-objects/components/actions-dropdown.component.mjs +100 -0
- package/esm2022/page-objects/components/adf-info-drawer.component.mjs +102 -0
- package/esm2022/page-objects/components/base.component.mjs +70 -0
- package/esm2022/page-objects/components/breadcrumb/breadcrumb.component.mjs +47 -0
- package/esm2022/page-objects/components/conditions.component.mjs +72 -0
- package/esm2022/page-objects/components/dataTable/data-table.component.mjs +343 -0
- package/esm2022/page-objects/components/dataTable/mat-menu.component.mjs +67 -0
- package/{esm2020/page-objects/components/dialogs/manage-versions-dialog.component.mjs → esm2022/page-objects/components/dataTable/toolbar.component.mjs} +13 -8
- package/esm2022/page-objects/components/datetime-picker/datetime-picker.component.mjs +53 -0
- package/esm2022/page-objects/components/dialogs/adf-confirm-dialog.component.mjs +36 -0
- package/esm2022/page-objects/components/dialogs/adf-folder-dialog.component.mjs +57 -0
- package/esm2022/page-objects/components/dialogs/adf-library-dialog.component.mjs +64 -0
- package/esm2022/page-objects/components/dialogs/content-node-selector-dialog.mjs +68 -0
- package/esm2022/page-objects/components/dialogs/create-from-template-dialog-component.mjs +55 -0
- package/esm2022/page-objects/components/dialogs/delete-trash-dialog.component.mjs +54 -0
- package/esm2022/page-objects/components/dialogs/edit-dialog.component.mjs +39 -0
- package/esm2022/page-objects/components/dialogs/link-rules.component.mjs +58 -0
- package/esm2022/page-objects/components/dialogs/manage-versions-dialog.component.mjs +36 -0
- package/esm2022/page-objects/components/dialogs/password-overlay-dialog.component.mjs +71 -0
- package/esm2022/page-objects/components/dialogs/share-dialog.component.mjs +85 -0
- package/esm2022/page-objects/components/dialogs/upload-dialog.component.mjs +36 -0
- package/esm2022/page-objects/components/dialogs/upload-new-version-dialog.component.mjs +38 -0
- package/esm2022/page-objects/components/dialogs/viewer-overlay-dialog.component.mjs +56 -0
- package/esm2022/page-objects/components/error.component.mjs +34 -0
- package/esm2022/page-objects/components/manageRules/manage-rules-dialog.component.mjs +64 -0
- package/esm2022/page-objects/components/manageRules/manage-rules.component.mjs +70 -0
- package/esm2022/page-objects/components/pagination.component.mjs +174 -0
- package/esm2022/page-objects/components/search/search-filters/search-filters-categories.component.mjs +33 -0
- package/esm2022/page-objects/components/search/search-filters/search-filters-date.component.mjs +115 -0
- package/esm2022/page-objects/components/search/search-filters/search-filters-location.component.mjs +40 -0
- package/esm2022/page-objects/components/search/search-filters/search-filters-logic.component.mjs +36 -0
- package/esm2022/page-objects/components/search/search-filters/search-filters-properties.component.mjs +83 -0
- package/esm2022/page-objects/components/search/search-filters/search-filters-tags.component.mjs +40 -0
- package/esm2022/page-objects/components/search/search-filters.component.mjs +45 -0
- package/esm2022/page-objects/components/search/search-input.component.mjs +48 -0
- package/esm2022/page-objects/components/search/search-overlay.components.mjs +83 -0
- package/esm2022/page-objects/components/search/search-sorting-picker.components.mjs +72 -0
- package/esm2022/page-objects/components/sidenav.component.mjs +88 -0
- package/esm2022/page-objects/components/snackBar/snack-bar.component.mjs +54 -0
- package/esm2022/page-objects/components/spinner.component.mjs +41 -0
- package/esm2022/page-objects/components/viewer.component.mjs +110 -0
- package/esm2022/page-objects/pages/base.page.mjs +84 -0
- package/esm2022/page-objects/pages/favorites-libraries.page.mjs +43 -0
- package/esm2022/page-objects/pages/favorites.page.mjs +49 -0
- package/esm2022/page-objects/pages/login.page.mjs +62 -0
- package/esm2022/page-objects/pages/my-libraries.page.mjs +54 -0
- package/esm2022/page-objects/pages/nodes.page.mjs +40 -0
- package/esm2022/page-objects/pages/personal-files.page.mjs +85 -0
- package/esm2022/page-objects/pages/recent-files.page.mjs +45 -0
- package/esm2022/page-objects/pages/search.page.mjs +79 -0
- package/esm2022/page-objects/pages/shared.page.mjs +45 -0
- package/esm2022/page-objects/pages/trash.page.mjs +45 -0
- package/esm2022/page-objects/playwright-base.mjs +33 -0
- package/esm2022/resources/test-files/index.mjs +102 -0
- package/esm2022/utils/logger.mjs +71 -0
- package/esm2022/utils/utils.mjs +145 -0
- package/{fesm2020 → fesm2022}/alfresco-aca-playwright-shared.mjs +816 -675
- package/fesm2022/alfresco-aca-playwright-shared.mjs.map +1 -0
- package/package.json +5 -11
- package/page-objects/components/adf-info-drawer.component.d.ts +18 -0
- package/page-objects/components/viewer.component.d.ts +11 -0
- package/page-objects/pages/search.page.d.ts +1 -1
- package/resources/test-files/index.d.ts +24 -0
- package/utils/utils.d.ts +2 -2
- package/esm2020/api/api-client-factory.mjs +0 -111
- package/esm2020/api/categories-api.mjs +0 -65
- package/esm2020/api/favorites-api.mjs +0 -129
- package/esm2020/api/file-actions.mjs +0 -166
- package/esm2020/api/nodes-api.mjs +0 -427
- package/esm2020/api/people-api-models.mjs +0 -34
- package/esm2020/api/queries-api.mjs +0 -69
- package/esm2020/api/rules-api.mjs +0 -251
- package/esm2020/api/search-api.mjs +0 -74
- package/esm2020/api/shared-links-api.mjs +0 -136
- package/esm2020/api/sites-api.mjs +0 -155
- package/esm2020/api/tags-api.mjs +0 -61
- package/esm2020/api/trashcan-api.mjs +0 -54
- package/esm2020/page-objects/components/aca-header.component.mjs +0 -77
- package/esm2020/page-objects/components/actions-dropdown.component.mjs +0 -99
- package/esm2020/page-objects/components/adf-info-drawer.component.mjs +0 -83
- package/esm2020/page-objects/components/base.component.mjs +0 -69
- package/esm2020/page-objects/components/breadcrumb/breadcrumb.component.mjs +0 -46
- package/esm2020/page-objects/components/conditions.component.mjs +0 -75
- package/esm2020/page-objects/components/dataTable/data-table.component.mjs +0 -341
- package/esm2020/page-objects/components/dataTable/mat-menu.component.mjs +0 -66
- package/esm2020/page-objects/components/dataTable/toolbar.component.mjs +0 -39
- package/esm2020/page-objects/components/datetime-picker/datetime-picker.component.mjs +0 -52
- package/esm2020/page-objects/components/dialogs/adf-confirm-dialog.component.mjs +0 -35
- package/esm2020/page-objects/components/dialogs/adf-folder-dialog.component.mjs +0 -56
- package/esm2020/page-objects/components/dialogs/adf-library-dialog.component.mjs +0 -63
- package/esm2020/page-objects/components/dialogs/content-node-selector-dialog.mjs +0 -67
- package/esm2020/page-objects/components/dialogs/create-from-template-dialog-component.mjs +0 -54
- package/esm2020/page-objects/components/dialogs/delete-trash-dialog.component.mjs +0 -53
- package/esm2020/page-objects/components/dialogs/edit-dialog.component.mjs +0 -38
- package/esm2020/page-objects/components/dialogs/link-rules.component.mjs +0 -57
- package/esm2020/page-objects/components/dialogs/password-overlay-dialog.component.mjs +0 -70
- package/esm2020/page-objects/components/dialogs/share-dialog.component.mjs +0 -84
- package/esm2020/page-objects/components/dialogs/upload-dialog.component.mjs +0 -35
- package/esm2020/page-objects/components/dialogs/upload-new-version-dialog.component.mjs +0 -37
- package/esm2020/page-objects/components/dialogs/viewer-overlay-dialog.component.mjs +0 -55
- package/esm2020/page-objects/components/error.component.mjs +0 -33
- package/esm2020/page-objects/components/manageRules/manage-rules-dialog.component.mjs +0 -63
- package/esm2020/page-objects/components/manageRules/manage-rules.component.mjs +0 -69
- package/esm2020/page-objects/components/pagination.component.mjs +0 -173
- package/esm2020/page-objects/components/search/search-filters/search-filters-categories.component.mjs +0 -32
- package/esm2020/page-objects/components/search/search-filters/search-filters-date.component.mjs +0 -114
- package/esm2020/page-objects/components/search/search-filters/search-filters-location.component.mjs +0 -39
- package/esm2020/page-objects/components/search/search-filters/search-filters-logic.component.mjs +0 -35
- package/esm2020/page-objects/components/search/search-filters/search-filters-properties.component.mjs +0 -82
- package/esm2020/page-objects/components/search/search-filters/search-filters-tags.component.mjs +0 -39
- package/esm2020/page-objects/components/search/search-filters.component.mjs +0 -44
- package/esm2020/page-objects/components/search/search-input.component.mjs +0 -47
- package/esm2020/page-objects/components/search/search-overlay.components.mjs +0 -82
- package/esm2020/page-objects/components/search/search-sorting-picker.components.mjs +0 -71
- package/esm2020/page-objects/components/sidenav.component.mjs +0 -86
- package/esm2020/page-objects/components/snackBar/snack-bar.component.mjs +0 -53
- package/esm2020/page-objects/components/spinner.component.mjs +0 -40
- package/esm2020/page-objects/components/viewer.component.mjs +0 -92
- package/esm2020/page-objects/pages/base.page.mjs +0 -80
- package/esm2020/page-objects/pages/favorites-libraries.page.mjs +0 -42
- package/esm2020/page-objects/pages/favorites.page.mjs +0 -48
- package/esm2020/page-objects/pages/login.page.mjs +0 -61
- package/esm2020/page-objects/pages/my-libraries.page.mjs +0 -53
- package/esm2020/page-objects/pages/nodes.page.mjs +0 -39
- package/esm2020/page-objects/pages/personal-files.page.mjs +0 -84
- package/esm2020/page-objects/pages/recent-files.page.mjs +0 -44
- package/esm2020/page-objects/pages/search.page.mjs +0 -78
- package/esm2020/page-objects/pages/shared.page.mjs +0 -44
- package/esm2020/page-objects/pages/trash.page.mjs +0 -44
- package/esm2020/page-objects/playwright-base.mjs +0 -31
- package/esm2020/resources/test-files/index.mjs +0 -78
- package/esm2020/utils/logger.mjs +0 -69
- package/esm2020/utils/utils.mjs +0 -144
- package/fesm2015/alfresco-aca-playwright-shared.mjs +0 -6267
- package/fesm2015/alfresco-aca-playwright-shared.mjs.map +0 -1
- package/fesm2020/alfresco-aca-playwright-shared.mjs.map +0 -1
- /package/{esm2020 → esm2022}/alfresco-aca-playwright-shared.mjs +0 -0
- /package/{esm2020 → esm2022}/api/index.mjs +0 -0
- /package/{esm2020 → esm2022}/api/node-content-tree.mjs +0 -0
- /package/{esm2020 → esm2022}/base-config/global-variables.mjs +0 -0
- /package/{esm2020 → esm2022}/base-config/global.setup.mjs +0 -0
- /package/{esm2020 → esm2022}/base-config/index.mjs +0 -0
- /package/{esm2020 → esm2022}/base-config/playwright.config.mjs +0 -0
- /package/{esm2020 → esm2022}/base-config/report-portal.config.mjs +0 -0
- /package/{esm2020 → esm2022}/fixtures/index.mjs +0 -0
- /package/{esm2020 → esm2022}/fixtures/page-initialization.mjs +0 -0
- /package/{esm2020 → esm2022}/models/custom-config.mjs +0 -0
- /package/{esm2020 → esm2022}/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/page-objects/components/dataTable/index.mjs +0 -0
- /package/{esm2020 → esm2022}/page-objects/components/dialogs/index.mjs +0 -0
- /package/{esm2020 → esm2022}/page-objects/components/index.mjs +0 -0
- /package/{esm2020 → esm2022}/page-objects/components/manageRules/index.mjs +0 -0
- /package/{esm2020 → esm2022}/page-objects/index.mjs +0 -0
- /package/{esm2020 → esm2022}/page-objects/pages/index.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/resources/index.mjs +0 -0
- /package/{esm2020 → esm2022}/resources/test-data/index.mjs +0 -0
- /package/{esm2020 → esm2022}/resources/test-data/test-data-files-folders.mjs +0 -0
- /package/{esm2020 → esm2022}/resources/test-data/test-data-permissions.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/api.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/config.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/error-strings.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/exclude-tests.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/library-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/paths.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/state-helper.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/timeouts.mjs +0 -0
package/esm2020/utils/utils.mjs
DELETED
|
@@ -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=
|