@yuuvis/client-shell-core 2.0.0-beta.0 → 2.0.0-beta.3
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/README.md +4 -0
- package/esm2022/index.mjs +7 -2
- package/esm2022/lib/client-shell.assets.mjs +7 -8
- package/esm2022/lib/client-shell.interface.mjs +1 -1
- package/esm2022/lib/services/command-palette/command-palette/command-palette.component.mjs +18 -92
- package/esm2022/lib/services/command-palette/command-palette.service.mjs +16 -14
- package/esm2022/lib/services/feature/feature.guard.mjs +7 -0
- package/esm2022/lib/services/feature/feature.interface.mjs +2 -0
- package/esm2022/lib/services/feature/feature.providers.mjs +8 -0
- package/esm2022/lib/services/feature/feature.service.mjs +93 -0
- package/esm2022/lib/services/feature/index.mjs +5 -0
- package/esm2022/lib/services/shell/noop.extension.mjs +13 -0
- package/esm2022/lib/services/shell/shell.bootstrap.mjs +68 -0
- package/esm2022/lib/services/shell/shell.providers.mjs +21 -0
- package/esm2022/lib/services/shell/shell.service.mjs +129 -57
- package/esm2022/lib/services/shell-config/shell-config.const.mjs +23 -0
- package/esm2022/lib/services/shell-config/shell-config.interface.mjs +2 -0
- package/esm2022/lib/services/shell-config/shell-config.service.mjs +100 -0
- package/esm2022/lib/services/shell-notifications/shell-notifications.service.mjs +9 -9
- package/index.d.ts +6 -1
- package/lib/assets/i18n/de.json +0 -1
- package/lib/assets/i18n/en.json +0 -1
- package/lib/client-shell.assets.d.ts +2 -8
- package/lib/client-shell.interface.d.ts +13 -6
- package/lib/services/command-palette/command-palette.service.d.ts +1 -2
- package/lib/services/feature/feature.guard.d.ts +2 -0
- package/lib/services/feature/feature.interface.d.ts +11 -0
- package/lib/services/feature/feature.providers.d.ts +4 -0
- package/lib/services/feature/feature.service.d.ts +20 -0
- package/lib/services/feature/index.d.ts +4 -0
- package/lib/services/shell/noop.extension.d.ts +7 -0
- package/lib/services/shell/shell.bootstrap.d.ts +29 -0
- package/lib/services/shell/shell.providers.d.ts +2 -0
- package/lib/services/shell/shell.service.d.ts +13 -4
- package/lib/services/shell-config/shell-config.const.d.ts +8 -0
- package/lib/services/shell-config/shell-config.interface.d.ts +13 -0
- package/lib/services/shell-config/shell-config.service.d.ts +30 -0
- package/package.json +6 -8
- package/esm2022/lib/services/shell/shell.extensions.service.mjs +0 -9
- package/lib/services/shell/shell.extensions.service.d.ts +0 -2
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { inject, provideAppInitializer } from '@angular/core';
|
|
2
|
+
import { bootstrapApplication } from '@angular/platform-browser';
|
|
3
|
+
import { BaseObjectTypeField, provideUser } from '@yuuvis/client-core';
|
|
4
|
+
import { provideClientShellFeatures } from '../feature/feature.providers';
|
|
5
|
+
import { getShellConfigQueryString, SHELL_CONFIG_FEATURES } from '../shell-config/shell-config.const';
|
|
6
|
+
import { ShellService } from './shell.service';
|
|
7
|
+
/**
|
|
8
|
+
* Boostraps a yuuvis Momentum shell client.
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { bootstrapShellApplication } from '@yuuvis/client-shell-core';
|
|
12
|
+
*
|
|
13
|
+
* bootstrapShellApplication(AppComponent, appConfig).catch((err) => console.error(err));
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @param rootComponent Root component of the application
|
|
17
|
+
* @param options Application configuration
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
20
|
+
export async function bootstrapShellApplication(rootComponent, options, shellOptions) {
|
|
21
|
+
const o = options || {
|
|
22
|
+
providers: []
|
|
23
|
+
};
|
|
24
|
+
const user = await fetch('/api-web/api/idm/whoami', {
|
|
25
|
+
headers: {
|
|
26
|
+
'Content-Type': 'application/json'
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
const userRes = await user.json();
|
|
30
|
+
o.providers = [...o.providers, provideUser(userRes)];
|
|
31
|
+
if (shellOptions?.enableObjectTypeConfig) {
|
|
32
|
+
o.providers = [...o.providers, provideAppInitializer(() => {
|
|
33
|
+
inject(ShellService)._initObjectTypeConfig();
|
|
34
|
+
})];
|
|
35
|
+
}
|
|
36
|
+
if (userRes && shellOptions?.enableFeatureConfig) {
|
|
37
|
+
// find the config file
|
|
38
|
+
const response = await fetch('/api/dms/objects/search', {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json'
|
|
42
|
+
},
|
|
43
|
+
body: JSON.stringify({
|
|
44
|
+
query: {
|
|
45
|
+
statement: getShellConfigQueryString(SHELL_CONFIG_FEATURES)
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
const res = await response.json();
|
|
50
|
+
const objects = res.objects;
|
|
51
|
+
if (objects?.length > 0) {
|
|
52
|
+
const id = objects[0]?.properties[BaseObjectTypeField.OBJECT_ID].value;
|
|
53
|
+
const file = await fetch(`/api/dms/objects/${id}/contents/file`, {
|
|
54
|
+
headers: {
|
|
55
|
+
'Content-Type': 'application/json'
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
const res = await file.json();
|
|
59
|
+
const shellFeatureConfig = {
|
|
60
|
+
objectID: id,
|
|
61
|
+
features: res || []
|
|
62
|
+
};
|
|
63
|
+
o.providers = [...o.providers, provideClientShellFeatures(shellFeatureConfig)];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return bootstrapApplication(rootComponent, o);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwuYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9zaGVsbC9zaGVsbC5ib290c3RyYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQyxNQUFNLEVBQUUscUJBQXFCLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWlCL0M7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsYUFBNEIsRUFDNUIsT0FBMkIsRUFDM0IsWUFBb0M7SUFFcEMsTUFBTSxDQUFDLEdBQXNCLE9BQU8sSUFBSTtRQUN0QyxTQUFTLEVBQUUsRUFBRTtLQUNkLENBQUM7SUFFRixNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyx5QkFBeUIsRUFBRTtRQUNsRCxPQUFPLEVBQUU7WUFDUCxjQUFjLEVBQUUsa0JBQWtCO1NBQ25DO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbEMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUVyRCxJQUFHLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUN4RCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELElBQUksT0FBTyxJQUFJLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxDQUFDO1FBQ2pELHVCQUF1QjtRQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyx5QkFBeUIsRUFBRTtZQUN0RCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25CLEtBQUssRUFBRTtvQkFDTCxTQUFTLEVBQUUseUJBQXlCLENBQUMscUJBQXFCLENBQUM7aUJBQzVEO2FBQ0YsQ0FBQztTQUNILENBQUMsQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWxDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDNUIsSUFBSSxPQUFPLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBRXZFLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFO2dCQUMvRCxPQUFPLEVBQUU7b0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjtpQkFDbkM7YUFDRixDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QixNQUFNLGtCQUFrQixHQUE2QjtnQkFDbkQsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUFFO2FBQ3BCLENBQUM7WUFDRixDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLDBCQUEwQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sb0JBQW9CLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBsaWNhdGlvbkNvbmZpZywgQXBwbGljYXRpb25SZWYsIGluamVjdCwgcHJvdmlkZUFwcEluaXRpYWxpemVyLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBib290c3RyYXBBcHBsaWNhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQmFzZU9iamVjdFR5cGVGaWVsZCwgcHJvdmlkZVVzZXIgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IENsaWVudFNoZWxsRmVhdHVyZUNvbmZpZyB9IGZyb20gJy4uL2ZlYXR1cmUvZmVhdHVyZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcHJvdmlkZUNsaWVudFNoZWxsRmVhdHVyZXMgfSBmcm9tICcuLi9mZWF0dXJlL2ZlYXR1cmUucHJvdmlkZXJzJztcbmltcG9ydCB7IGdldFNoZWxsQ29uZmlnUXVlcnlTdHJpbmcsIFNIRUxMX0NPTkZJR19GRUFUVVJFUyB9IGZyb20gJy4uL3NoZWxsLWNvbmZpZy9zaGVsbC1jb25maWcuY29uc3QnO1xuaW1wb3J0IHsgU2hlbGxTZXJ2aWNlIH0gZnJvbSAnLi9zaGVsbC5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBTaGVsbEJvb3RzdHJhcE9wdGlvbnMge1xuICAvKipcbiAgICogRW5hYmxlcyBjYXBhYmlsaXRpZXMgb2YgY29uZGl0aW9uYWxseSBsb2FkIGZlYXR1cmVzIGxpa2UgYXBwcyBhbmQgXG4gICAqIGV4dGVuc2lvbnMgYmFzZWQgb24gYSBjb25maWd1cmF0aW9uIGZpbGUgbWFwcGluZyBmZWF0dXJlcyB0byB1c2VyXG4gICAqIGF1dGhvcml0aWVzLlxuICAgKi9cbiAgZW5hYmxlRmVhdHVyZUNvbmZpZz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmFibGVzIGNhcGFiaWxpdGllcyBvZiBhZGRpbmcgY3VzdG9tIG9iamVjdCB0eXBlcyBieSBjb25maWd1cmF0aW9uLlxuICAgKiBBbnkgc2NoZW1hIHR5cGUgb3IgU09UIGNhbiB0aGVuIGJlIGNvbmZpZ3VyZWQgdG8gc2VydmUgYXMgYSBjdXN0b20gXG4gICAqIG9iamVjdCB0eXBlIChmbGF2b3IpLlxuICAgKi9cbiAgZW5hYmxlT2JqZWN0VHlwZUNvbmZpZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQm9vc3RyYXBzIGEgeXV1dmlzIE1vbWVudHVtIHNoZWxsIGNsaWVudC5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgYm9vdHN0cmFwU2hlbGxBcHBsaWNhdGlvbiB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUnO1xuICpcbiAqIGJvb3RzdHJhcFNoZWxsQXBwbGljYXRpb24oQXBwQ29tcG9uZW50LCBhcHBDb25maWcpLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcm9vdENvbXBvbmVudCBSb290IGNvbXBvbmVudCBvZiB0aGUgYXBwbGljYXRpb25cbiAqIEBwYXJhbSBvcHRpb25zIEFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBib290c3RyYXBTaGVsbEFwcGxpY2F0aW9uKFxuICByb290Q29tcG9uZW50OiBUeXBlPHVua25vd24+LFxuICBvcHRpb25zPzogQXBwbGljYXRpb25Db25maWcsXG4gIHNoZWxsT3B0aW9ucz86IFNoZWxsQm9vdHN0cmFwT3B0aW9uc1xuKTogUHJvbWlzZTxBcHBsaWNhdGlvblJlZj4ge1xuICBjb25zdCBvOiBBcHBsaWNhdGlvbkNvbmZpZyA9IG9wdGlvbnMgfHwge1xuICAgIHByb3ZpZGVyczogW11cbiAgfTtcblxuICBjb25zdCB1c2VyID0gYXdhaXQgZmV0Y2goJy9hcGktd2ViL2FwaS9pZG0vd2hvYW1pJywge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICB9XG4gIH0pO1xuICBjb25zdCB1c2VyUmVzID0gYXdhaXQgdXNlci5qc29uKCk7XG4gIG8ucHJvdmlkZXJzID0gWy4uLm8ucHJvdmlkZXJzLCBwcm92aWRlVXNlcih1c2VyUmVzKV07XG4gIFxuICBpZihzaGVsbE9wdGlvbnM/LmVuYWJsZU9iamVjdFR5cGVDb25maWcpIHtcbiAgICBvLnByb3ZpZGVycyA9IFsuLi5vLnByb3ZpZGVycywgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+IHtcbiAgICAgIGluamVjdChTaGVsbFNlcnZpY2UpLl9pbml0T2JqZWN0VHlwZUNvbmZpZygpO1xuICAgIH0pXTtcbiAgfVxuXG4gIGlmICh1c2VyUmVzICYmIHNoZWxsT3B0aW9ucz8uZW5hYmxlRmVhdHVyZUNvbmZpZykge1xuICAgIC8vIGZpbmQgdGhlIGNvbmZpZyBmaWxlXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9kbXMvb2JqZWN0cy9zZWFyY2gnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICBzdGF0ZW1lbnQ6IGdldFNoZWxsQ29uZmlnUXVlcnlTdHJpbmcoU0hFTExfQ09ORklHX0ZFQVRVUkVTKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGNvbnN0IG9iamVjdHMgPSByZXMub2JqZWN0cztcbiAgICBpZiAob2JqZWN0cz8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaWQgPSBvYmplY3RzWzBdPy5wcm9wZXJ0aWVzW0Jhc2VPYmplY3RUeXBlRmllbGQuT0JKRUNUX0lEXS52YWx1ZTtcblxuICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZldGNoKGAvYXBpL2Rtcy9vYmplY3RzLyR7aWR9L2NvbnRlbnRzL2ZpbGVgLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmlsZS5qc29uKCk7XG4gICAgICBjb25zdCBzaGVsbEZlYXR1cmVDb25maWc6IENsaWVudFNoZWxsRmVhdHVyZUNvbmZpZyA9IHtcbiAgICAgICAgb2JqZWN0SUQ6IGlkLFxuICAgICAgICBmZWF0dXJlczogcmVzIHx8IFtdXG4gICAgICB9O1xuICAgICAgby5wcm92aWRlcnMgPSBbLi4uby5wcm92aWRlcnMsIHByb3ZpZGVDbGllbnRTaGVsbEZlYXR1cmVzKHNoZWxsRmVhdHVyZUNvbmZpZyldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm9vdHN0cmFwQXBwbGljYXRpb24ocm9vdENvbXBvbmVudCwgbyk7XG59XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { inject, provideAppInitializer } from '@angular/core';
|
|
2
|
+
import { NoopExtension } from './noop.extension';
|
|
3
|
+
import { FeatureService } from '../feature/feature.service';
|
|
4
|
+
export const importShellExtensions = (extensions) => {
|
|
5
|
+
const providers = [];
|
|
6
|
+
// TODO: find proper way of typing
|
|
7
|
+
const ne = NoopExtension;
|
|
8
|
+
providers.push(ne);
|
|
9
|
+
extensions.forEach((extension) => {
|
|
10
|
+
providers.push(extension);
|
|
11
|
+
providers.push(provideAppInitializer(() => {
|
|
12
|
+
const featureName = extension.name.replaceAll('_', '');
|
|
13
|
+
const e = inject(FeatureService).canUseFeatureById(featureName)
|
|
14
|
+
? extension
|
|
15
|
+
: NoopExtension;
|
|
16
|
+
return inject(e).init();
|
|
17
|
+
}));
|
|
18
|
+
});
|
|
19
|
+
return providers;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwucHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9zaGVsbC9zaGVsbC5wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixNQUFNLEVBQUUscUJBQXFCLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRW5HLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNNUQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxVQUFpQixFQUEwQixFQUFFO0lBQ2pGLE1BQU0sU0FBUyxHQUEyQixFQUFFLENBQUM7SUFDN0Msa0NBQWtDO0lBQ2xDLE1BQU0sRUFBRSxHQUFHLGFBQW9CLENBQUM7SUFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUEwQixDQUFDLENBQUM7SUFDM0MsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1FBQy9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBaUMsQ0FBQyxDQUFDO1FBQ2xELFNBQVMsQ0FBQyxJQUFJLENBQ1oscUJBQXFCLENBQUMsR0FBRyxFQUFFO1lBQ3pCLE1BQU0sV0FBVyxHQUFZLFNBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLEdBQXdDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7Z0JBQ2xHLENBQUMsQ0FBRSxTQUFpRDtnQkFDcEQsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUNsQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgaW5qZWN0LCBwcm92aWRlQXBwSW5pdGlhbGl6ZXIsIFByb3ZpZGVyVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENsaWVudFNoZWxsRXh0ZW5zaW9uIH0gZnJvbSAnLi4vLi4vY2xpZW50LXNoZWxsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBOb29wRXh0ZW5zaW9uIH0gZnJvbSAnLi9ub29wLmV4dGVuc2lvbic7XG5pbXBvcnQgeyBGZWF0dXJlU2VydmljZSB9IGZyb20gJy4uL2ZlYXR1cmUvZmVhdHVyZS5zZXJ2aWNlJztcblxuXG5cblxuXG5leHBvcnQgY29uc3QgaW1wb3J0U2hlbGxFeHRlbnNpb25zID0gKGV4dGVuc2lvbnM6IGFueVtdKTogRW52aXJvbm1lbnRQcm92aWRlcnNbXSA9PiB7XG4gIGNvbnN0IHByb3ZpZGVyczogRW52aXJvbm1lbnRQcm92aWRlcnNbXSA9IFtdO1xuICAvLyBUT0RPOiBmaW5kIHByb3BlciB3YXkgb2YgdHlwaW5nXG4gIGNvbnN0IG5lID0gTm9vcEV4dGVuc2lvbiBhcyBhbnk7XG4gIHByb3ZpZGVycy5wdXNoKG5lIGFzIEVudmlyb25tZW50UHJvdmlkZXJzKTtcbiAgZXh0ZW5zaW9ucy5mb3JFYWNoKChleHRlbnNpb24pID0+IHtcbiAgICBwcm92aWRlcnMucHVzaChleHRlbnNpb24gYXMgRW52aXJvbm1lbnRQcm92aWRlcnMpO1xuICAgIHByb3ZpZGVycy5wdXNoKFxuICAgICAgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+IHtcbiAgICAgICAgY29uc3QgZmVhdHVyZU5hbWU6IHN0cmluZyA9IChleHRlbnNpb24gYXMgYW55KS5uYW1lLnJlcGxhY2VBbGwoJ18nLCAnJyk7XG4gICAgICAgIGNvbnN0IGU6IFByb3ZpZGVyVG9rZW48Q2xpZW50U2hlbGxFeHRlbnNpb24+ID0gaW5qZWN0KEZlYXR1cmVTZXJ2aWNlKS5jYW5Vc2VGZWF0dXJlQnlJZChmZWF0dXJlTmFtZSlcbiAgICAgICAgICA/IChleHRlbnNpb24gYXMgUHJvdmlkZXJUb2tlbjxDbGllbnRTaGVsbEV4dGVuc2lvbj4pXG4gICAgICAgICAgOiBOb29wRXh0ZW5zaW9uO1xuICAgICAgICByZXR1cm4gaW5qZWN0KGUpLmluaXQoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG4gIHJldHVybiBwcm92aWRlcnM7XG59O1xuIl19
|
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
import { inject, Injectable, signal } from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
3
|
+
import { MatIconRegistry } from '@angular/material/icon';
|
|
4
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
5
|
+
import { ApiBase, BaseObjectTypeField, ConfigService, DmsService, SystemService, SystemType, TranslateService, UserService, Utils } from '@yuuvis/client-core';
|
|
6
|
+
import { BehaviorSubject, debounceTime, filter, firstValueFrom, fromEvent, map, of, ReplaySubject, tap } from 'rxjs';
|
|
5
7
|
import { CLIENT_SHELL_ASSETS } from '../../client-shell.assets';
|
|
8
|
+
import { SHELL_CONFIG_TYPES } from '../shell-config/shell-config.const';
|
|
9
|
+
import { ShellConfigService } from '../shell-config/shell-config.service';
|
|
10
|
+
import { DOCUMENT } from '@angular/common';
|
|
6
11
|
import * as i0 from "@angular/core";
|
|
7
12
|
export class ShellService {
|
|
8
13
|
constructor() {
|
|
9
14
|
this.#dmsService = inject(DmsService);
|
|
10
|
-
this.#
|
|
15
|
+
this.#dialog = inject(MatDialog);
|
|
11
16
|
this.#system = inject(SystemService);
|
|
12
17
|
this.#userService = inject(UserService);
|
|
18
|
+
// TODO: Need orignal MatIconRegistry to #registerObjectTypeIcons, otherwise icons could not be registered in the namespace
|
|
19
|
+
// #iconRegistry = inject(YuvMatIconRegistry);
|
|
20
|
+
this.#iconRegistry = inject(MatIconRegistry);
|
|
21
|
+
this.#shellConfig = inject(ShellConfigService);
|
|
22
|
+
this.#configService = inject(ConfigService);
|
|
23
|
+
this.#sanitizer = inject(DomSanitizer);
|
|
24
|
+
this.#DOCUMENT = inject(DOCUMENT);
|
|
13
25
|
this.translate = inject(TranslateService);
|
|
14
26
|
this._busyCount = 0;
|
|
15
27
|
this.isBusySubject = new BehaviorSubject(false);
|
|
@@ -20,12 +32,8 @@ export class ShellService {
|
|
|
20
32
|
this.#appSchemata = [];
|
|
21
33
|
this.appBaseRoutes = {};
|
|
22
34
|
this.#defaultShellConfig = {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
logout: CLIENT_SHELL_ASSETS.icons?.logout,
|
|
26
|
-
settings: CLIENT_SHELL_ASSETS.icons?.settings,
|
|
27
|
-
notifications: CLIENT_SHELL_ASSETS.icons?.notifications
|
|
28
|
-
}
|
|
35
|
+
appIcon: CLIENT_SHELL_ASSETS.appIcon,
|
|
36
|
+
shellIconNamespace: CLIENT_SHELL_ASSETS.shellIconNamespace
|
|
29
37
|
};
|
|
30
38
|
this.shellConfig = signal(this.#defaultShellConfig);
|
|
31
39
|
/** TODO: implement this feature ????
|
|
@@ -47,21 +55,32 @@ export class ShellService {
|
|
|
47
55
|
this._objectCreateFlavors = [];
|
|
48
56
|
}
|
|
49
57
|
#dmsService;
|
|
50
|
-
#
|
|
58
|
+
#dialog;
|
|
51
59
|
#system;
|
|
52
60
|
#userService;
|
|
61
|
+
// TODO: Need orignal MatIconRegistry to #registerObjectTypeIcons, otherwise icons could not be registered in the namespace
|
|
62
|
+
// #iconRegistry = inject(YuvMatIconRegistry);
|
|
63
|
+
#iconRegistry;
|
|
64
|
+
#shellConfig;
|
|
65
|
+
#configService;
|
|
66
|
+
#sanitizer;
|
|
67
|
+
#DOCUMENT;
|
|
53
68
|
#appSettings;
|
|
54
69
|
#appSettingsSubject;
|
|
55
70
|
#appSchemata;
|
|
56
71
|
#defaultShellConfig;
|
|
72
|
+
pickFile() {
|
|
73
|
+
const input = this.#DOCUMENT.createElement('input');
|
|
74
|
+
input.type = 'file';
|
|
75
|
+
input.click();
|
|
76
|
+
return fromEvent(input, 'change').pipe(map((e) => e.target.files?.[0] || null), tap(() => {
|
|
77
|
+
input.remove();
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
57
80
|
setShellConfig(csc) {
|
|
58
81
|
this.shellConfig.update((sc) => ({
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
logout: csc.icons?.logout ?? sc.icons?.logout,
|
|
62
|
-
settings: csc.icons?.settings ?? sc.icons?.settings,
|
|
63
|
-
notifications: csc.icons?.settings ?? sc.icons?.notifications
|
|
64
|
-
}
|
|
82
|
+
appIcon: csc.appIcon ?? sc.appIcon,
|
|
83
|
+
shellIconNamespace: csc.shellIconNamespace ?? sc.shellIconNamespace
|
|
65
84
|
}));
|
|
66
85
|
}
|
|
67
86
|
setAppBaseRoutes(apps) {
|
|
@@ -135,9 +154,11 @@ export class ShellService {
|
|
|
135
154
|
* Flavors are able to be applied to objects and add new metadata properties to them.
|
|
136
155
|
* @param flavors Array of flavors to be exposed
|
|
137
156
|
* @param app Optional ID of the app that exposes the flavors (defaults to 'global' if not provided)
|
|
157
|
+
* @param origin Optional origin of the flavors. Flavors could be added by apps or derived
|
|
158
|
+
* from a configuration (defaults to 'app' if not provided)
|
|
138
159
|
*/
|
|
139
|
-
exposeObjectFlavors(flavors, app = 'global') {
|
|
140
|
-
flavors.forEach((f) => this.exposeObjectFlavor(f, app));
|
|
160
|
+
exposeObjectFlavors(flavors, app = 'global', origin = 'app') {
|
|
161
|
+
flavors.forEach((f) => this.exposeObjectFlavor(f, app, origin));
|
|
141
162
|
}
|
|
142
163
|
/**
|
|
143
164
|
* Removes exposed object flavors from the shell.
|
|
@@ -154,11 +175,13 @@ export class ShellService {
|
|
|
154
175
|
* from the file and filled out automatically.
|
|
155
176
|
* @param flavor The flavor object to be exposed
|
|
156
177
|
* @param app Optional ID of the app that exposes the flavor (defaults to 'global' if not provided)
|
|
178
|
+
* @param origin Optional origin of the flavors. Flavors could be added by apps or derived
|
|
179
|
+
* from a configuration (defaults to 'app' if not provided)
|
|
157
180
|
*/
|
|
158
|
-
exposeObjectFlavor(flavor, app = 'global') {
|
|
181
|
+
exposeObjectFlavor(flavor, app = 'global', origin = 'app') {
|
|
159
182
|
const idx = this._objectFlavors.findIndex((f) => f.id === flavor.id && f.app === app);
|
|
160
183
|
if (idx === -1)
|
|
161
|
-
this._objectFlavors.push({ ...flavor, app });
|
|
184
|
+
this._objectFlavors.push({ ...flavor, app, origin });
|
|
162
185
|
}
|
|
163
186
|
/**
|
|
164
187
|
* Removes an exposed object flavor from the shell.
|
|
@@ -186,13 +209,19 @@ export class ShellService {
|
|
|
186
209
|
* @param data Optional data to be passed to the flavor component
|
|
187
210
|
* @returns Observable that emits true if the flavor was applied successfully
|
|
188
211
|
*/
|
|
189
|
-
triggerApplyObjectFlavor(dmsObject, flavor, data) {
|
|
212
|
+
triggerApplyObjectFlavor(dmsObject, flavor, data, applyComponent) {
|
|
190
213
|
if (dmsObject) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
214
|
+
const ac = applyComponent || flavor.applyComponent;
|
|
215
|
+
if (ac) {
|
|
216
|
+
this.#dialog.open(ac, {
|
|
217
|
+
maxWidth: '90vw',
|
|
218
|
+
maxHeight: '90vh',
|
|
219
|
+
minWidth: '50vw',
|
|
220
|
+
data: {
|
|
221
|
+
dmsObject,
|
|
222
|
+
flavor,
|
|
223
|
+
data
|
|
224
|
+
}
|
|
196
225
|
});
|
|
197
226
|
return of(true);
|
|
198
227
|
}
|
|
@@ -207,23 +236,10 @@ export class ShellService {
|
|
|
207
236
|
return of(false);
|
|
208
237
|
}
|
|
209
238
|
removeObjectFlavor(dmsObject, flavor) {
|
|
210
|
-
|
|
211
|
-
.
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
})
|
|
215
|
-
})
|
|
216
|
-
.pipe(switchMap((confirmed) => {
|
|
217
|
-
if (confirmed) {
|
|
218
|
-
// remove SOT ...
|
|
219
|
-
const data = {
|
|
220
|
-
[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS]: dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS].filter((sot) => sot !== flavor.sot)
|
|
221
|
-
};
|
|
222
|
-
return this.#dmsService.updateDmsObject(dmsObject.id, data).pipe(map(() => true));
|
|
223
|
-
}
|
|
224
|
-
else
|
|
225
|
-
return of(false);
|
|
226
|
-
}));
|
|
239
|
+
const data = {
|
|
240
|
+
[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS]: dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS].filter((sot) => sot !== flavor.sot)
|
|
241
|
+
};
|
|
242
|
+
return this.#dmsService.updateDmsObject(dmsObject.id, data).pipe(map(() => true));
|
|
227
243
|
}
|
|
228
244
|
/**
|
|
229
245
|
* Get object flavors applicable for a certain mimetype
|
|
@@ -235,8 +251,14 @@ export class ShellService {
|
|
|
235
251
|
* exposed to other apps
|
|
236
252
|
* @returns Array of matching object flavors
|
|
237
253
|
*/
|
|
238
|
-
|
|
239
|
-
return [...(customFlavors || []), ...this._objectFlavors].filter((of) => of.applicableTo?.
|
|
254
|
+
getApplicableDocumentFlavors(mimeType, app, customFlavors) {
|
|
255
|
+
return [...(customFlavors || []), ...this._objectFlavors].filter((of) => (!of.applicableTo?.folders || (of.applicableTo?.folders && of.applicableTo?.documents)) &&
|
|
256
|
+
(!of.applicableTo ||
|
|
257
|
+
!of.applicableTo?.mimeTypes ||
|
|
258
|
+
(of.applicableTo?.mimeTypes?.some((mtp) => Utils.patternToRegExp(mtp).test(mimeType)) && (!app || of.app === app))));
|
|
259
|
+
}
|
|
260
|
+
getApplicableFolderFlavors(app, customFlavors) {
|
|
261
|
+
return [...(customFlavors || []), ...this._objectFlavors].filter((of) => of.applicableTo?.folders && (!app || of.app === app));
|
|
240
262
|
}
|
|
241
263
|
/**
|
|
242
264
|
* Get applied and applicable object flavors for a certain object
|
|
@@ -249,7 +271,17 @@ export class ShellService {
|
|
|
249
271
|
if (dmsObject) {
|
|
250
272
|
const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
|
|
251
273
|
if (dmsObject.content) {
|
|
252
|
-
this.
|
|
274
|
+
this.getApplicableDocumentFlavors(dmsObject.content.mimeType).forEach((flavor) => {
|
|
275
|
+
if (sots.includes(flavor.sot)) {
|
|
276
|
+
applied.push(flavor);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
applicable.push(flavor);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
if (dmsObject.isFolder) {
|
|
284
|
+
this.getApplicableFolderFlavors().forEach((flavor) => {
|
|
253
285
|
if (sots.includes(flavor.sot)) {
|
|
254
286
|
applied.push(flavor);
|
|
255
287
|
}
|
|
@@ -261,6 +293,9 @@ export class ShellService {
|
|
|
261
293
|
}
|
|
262
294
|
return { applied, applicable };
|
|
263
295
|
}
|
|
296
|
+
getFlavorLabel(id) {
|
|
297
|
+
return this.#system.getLocalizedLabel(id) || this.translate.instant(id);
|
|
298
|
+
}
|
|
264
299
|
applyObjectFlavor(dmsObject, flavor, data = {}) {
|
|
265
300
|
const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
|
|
266
301
|
data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, flavor.sot];
|
|
@@ -277,15 +312,52 @@ export class ShellService {
|
|
|
277
312
|
getRegisteredTileExtensions() {
|
|
278
313
|
return this._extensions;
|
|
279
314
|
}
|
|
280
|
-
|
|
315
|
+
_initObjectTypeConfig() {
|
|
316
|
+
// load flavors from config
|
|
317
|
+
console.debug('Loading object type config...');
|
|
318
|
+
return firstValueFrom(this.#shellConfig.get(SHELL_CONFIG_TYPES).pipe(tap((res) => {
|
|
319
|
+
if (res) {
|
|
320
|
+
this.#registerObjectTypeIcons(res.data.map((t) => t.id));
|
|
321
|
+
const flv = res.data.map((t) => ({
|
|
322
|
+
id: t.id,
|
|
323
|
+
sot: t.id,
|
|
324
|
+
icon: t.id,
|
|
325
|
+
svgIcon: true,
|
|
326
|
+
objectTypeID: t.baseType,
|
|
327
|
+
applicableTo: {
|
|
328
|
+
folders: t.baseType === SystemType.FOLDER || t.baseType === SystemType.OBJECT,
|
|
329
|
+
documents: t.baseType === SystemType.DOCUMENT || t.baseType === SystemType.OBJECT,
|
|
330
|
+
mimeTypes: t.applicableToMimeTypes || undefined
|
|
331
|
+
},
|
|
332
|
+
useDefaultApplyComponent: !t.instantApply
|
|
333
|
+
}));
|
|
334
|
+
this.exposeObjectFlavors(flv, 'global', 'config');
|
|
335
|
+
}
|
|
336
|
+
})));
|
|
337
|
+
}
|
|
338
|
+
#registerObjectTypeIcons(ids) {
|
|
339
|
+
const sub = this.#system.system$.subscribe(() => {
|
|
340
|
+
ids.forEach((id) => {
|
|
341
|
+
// split technical name e.g. 'system:document' and use the first part as namespace
|
|
342
|
+
const idTokens = id.split(':');
|
|
343
|
+
if (idTokens.length === 2) {
|
|
344
|
+
const uri = `${this.#configService.getApiBase(ApiBase.none, true)}${this.#system.getObjectTypeIconUri(id)}`;
|
|
345
|
+
this.#iconRegistry.addSvgIconInNamespace(idTokens[0], idTokens[1], this.#sanitizer.bypassSecurityTrustResourceUrl(uri));
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
sub.unsubscribe();
|
|
349
|
+
// const config = (this.#iconRegistry as any)._svgIconConfigs;
|
|
350
|
+
// console.log({ config });
|
|
351
|
+
});
|
|
352
|
+
}
|
|
281
353
|
_init() { }
|
|
282
|
-
static { this.ɵfac =
|
|
283
|
-
static { this.ɵprov =
|
|
354
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ShellService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
355
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ShellService, providedIn: 'root' }); }
|
|
284
356
|
}
|
|
285
|
-
(
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvc2hlbGwvc2hlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUNMLG1CQUFtQixFQUVuQixVQUFVLEVBRVYsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsS0FBSyxFQUVOLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBT2hFLE1BQU0sT0FBTyxZQUFZO0lBSHpCO1FBSUUsZ0JBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JDLFlBQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEMsaUJBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0IsY0FBUyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXJDLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzVELFlBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFB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Q0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQW9CLEVBQUUsTUFBb0IsRUFBRSxPQUFnQyxFQUFFO1FBQzlGLE1BQU0sSUFBSSxHQUFjLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQWMsSUFBSSxFQUFFLENBQUM7UUFDekcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxHQUFrQjtRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCwyQkFBMkI7UUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsS0FBSyxLQUFJLENBQUM7NkdBOVNDLFlBQVk7dUVBQVosWUFBWSxXQUFaLFlBQVksbUJBRlgsTUFBTTs7aUZBRVAsWUFBWTtjQUh4QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmFzZU9iamVjdFR5cGVGaWVsZCxcbiAgRG1zT2JqZWN0LFxuICBEbXNTZXJ2aWNlLFxuICBPYmplY3RDcmVhdGVGbGF2b3IsXG4gIFN5c3RlbVNlcnZpY2UsXG4gIFRyYW5zbGF0ZVNlcnZpY2UsXG4gIFVzZXJTZXJ2aWNlLFxuICBVdGlscyxcbiAgWXV2VXNlclxufSBmcm9tICdAeXV1dmlzL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IFl2Y092ZXJsYXlTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL292ZXJsYXknO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZnJvbUV2ZW50LCBtYXAsIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENMSUVOVF9TSEVMTF9BU1NFVFMgfSBmcm9tICcuLi8uLi9jbGllbnQtc2hlbGwuYXNzZXRzJztcbmltcG9ydCB7IEFwcCwgQXBwU2NoZW1hLCBBcHBTY2hlbWFGbGF2b3IsIENsaWVudFNoZWxsQ29uZmlnLCBHbG9iYWxTaG9ydGN1dCwgT2JqZWN0Rmxhdm9yLCBTaGVsbEFwcFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vY2xpZW50LXNoZWxsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBUaWxlRXh0ZW5zaW9uIH0gZnJvbSAnLi4vLi4vdGlsZS1leHRlbnNpb24uaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2hlbGxTZXJ2aWNlIHtcbiAgI2Rtc1NlcnZpY2UgPSBpbmplY3QoRG1zU2VydmljZSk7XG4gICNvdmVybGF5ID0gaW5qZWN0KFl2Y092ZXJsYXlTZXJ2aWNlKTtcbiAgI3N5c3RlbSA9IGluamVjdChTeXN0ZW1TZXJ2aWNlKTtcbiAgI3VzZXJTZXJ2aWNlID0gaW5qZWN0KFVzZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgcHJpdmF0ZSBfYnVzeUNvdW50ID0gMDtcbiAgcHJpdmF0ZSBpc0J1c3lTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGlzQnVzeSQgPSB0aGlzLmlzQnVzeVN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkZWJvdW5jZVRpbWUoNTAwKSk7XG5cbiAgI2FwcFNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCBTaGVsbEFwcFNldHRpbmdzPiA9IHt9O1xuICAjYXBwU2V0dGluZ3NTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8U2hlbGxBcHBTZXR0aW5nc1tdPigpO1xuICBhcHBTZXR0aW5ncyQgPSB0aGlzLiNhcHBTZXR0aW5nc1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkZWJvdW5jZVRpbWUoNTAwKSk7XG5cbiAgI2FwcFNjaGVtYXRhOiBBcHBTY2hlbWFbXSA9IFtdO1xuICBhcHBCYXNlUm91dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgI2RlZmF1bHRTaGVsbENvbmZpZzogQ2xpZW50U2hlbGxDb25maWcgPSB7XG4gICAgaWNvbnM6IHtcbiAgICAgIGFwcEljb246IENMSUVOVF9TSEVMTF9BU1NFVFMuaWNvbnM/LmFwcEljb24sXG4gICAgICBsb2dvdXQ6IENMSUVOVF9TSEVMTF9BU1NFVFMuaWNvbnM/LmxvZ291dCxcbiAgICAgIHNldHRpbmdzOiBDTElFTlRfU0hFTExfQVNTRVRTLmljb25zPy5zZXR0aW5ncyxcbiAgICAgIG5vdGlmaWNhdGlvbnM6IENMSUVOVF9TSEVMTF9BU1NFVFMuaWNvbnM/Lm5vdGlmaWNhdGlvbnNcbiAgICB9XG4gIH07XG4gIHNoZWxsQ29uZmlnID0gc2lnbmFsPENsaWVudFNoZWxsQ29uZmlnPih0aGlzLiNkZWZhdWx0U2hlbGxDb25maWcpO1xuXG4gIC8qKiBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlID8/Pz9cbiAgICogR2xvYmFsIHNob3J0Y3V0cyBhcmUgY2FwdHVyZWQgYnkgdGhlIHNoZWxsIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IGV4cGVyaWVuY2VcbiAgICogYWNjcm9zcyBhbGwgYXBwcy4gU2VhcmNoIGlzIG9uZSBleGFtcGxlLiBBcHBzIHNob3VsZCBub3QgZGVmaW5lIHRoZWlyIG93biBzaG91cnRjdXRzXG4gICAqIGZvciBzZWFyY2guIEluc3RlYWQgdGhleSBzaG91bGQgc3Vic2NyaWJlIHRvIHRoZSBnbG9iYWwgc2hvcnRjdXRzIGFuZCBpbml0aWFsaXplIHRoZWlyXG4gICAqIHNlYXJjaCBiYXNlZCBvbiB0aGUgZ2xvYmFsIHNlYXJjaCBzaG9ydGN1dC5cbiAgICovXG4gIGdsb2JhbFNob3J0Y3V0cyQ6IE9ic2VydmFibGU8R2xvYmFsU2hvcnRjdXQ+ID0gZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgbWFwKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBnbG9iYWwgc2hvcnRjdXQgZm9yIHNlYXJjaFxuICAgICAgLy8gaWYgKGUuY3RybEtleSAmJiBlLmNvZGUgPT09ICdLZXlGJykge1xuICAgICAgLy8gICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyAgIHJldHVybiBHbG9iYWxTaG9ydGN1dC5zZWFyY2g7XG4gICAgICAvLyB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pLFxuICAgIGZpbHRlcigoczogR2xvYmFsU2hvcnRjdXQgfCB1bmRlZmluZWQpID0+IHMgIT09IHVuZGVmaW5lZCksXG4gICAgbWFwKChzKSA9PiBzIGFzIEdsb2JhbFNob3J0Y3V0KVxuICApO1xuXG4gIHByaXZhdGUgX2V4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIFRpbGVFeHRlbnNpb24+ID0ge307XG4gIHByaXZhdGUgX29iamVjdEZsYXZvcnM6IE9iamVjdEZsYXZvcltdID0gW107XG4gIHByaXZhdGUgX29iamVjdENyZWF0ZUZsYXZvcnM6IE9iamVjdENyZWF0ZUZsYXZvcltdID0gW107XG5cbiAgc2V0U2hlbGxDb25maWcoY3NjOiBDbGllbnRTaGVsbENvbmZpZykge1xuICAgIHRoaXMuc2hlbGxDb25maWcudXBkYXRlKChzYykgPT4gKHtcbiAgICAgIGljb25zOiB7XG4gICAgICAgIGFwcEljb246IGNzYy5pY29ucz8uYXBwSWNvbiA/PyBzYy5pY29ucz8uYXBwSWNvbixcbiAgICAgICAgbG9nb3V0OiBjc2MuaWNvbnM/LmxvZ291dCA/PyBzYy5pY29ucz8ubG9nb3V0LFxuICAgICAgICBzZXR0aW5nczogY3NjLmljb25zPy5zZXR0aW5ncyA/PyBzYy5pY29ucz8uc2V0dGluZ3MsXG4gICAgICAgIG5vdGlmaWNhdGlvbnM6IGNzYy5pY29ucz8uc2V0dGluZ3MgPz8gc2MuaWNvbnM/Lm5vdGlmaWNhdGlvbnNcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBzZXRBcHBCYXNlUm91dGVzKGFwcHM6IEFwcFtdKSB7XG4gICAgYXBwcy5mb3JFYWNoKChhKSA9PiAodGhpcy5hcHBCYXNlUm91dGVzW2EuaWRdID0gYS5wYXRoIHx8ICcnKSk7XG4gIH1cblxuICByZWdpc3RlckFwcChzY2hlbWE6IEFwcFNjaGVtYSkge1xuICAgIHRoaXMuI2FwcFNjaGVtYXRhLnB1c2goc2NoZW1hKTtcbiAgfVxuXG4gIGdldFJlZ2lzdGVyZWRBcHAoaWQ6IHN0cmluZyk6IEFwcFNjaGVtYSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2FwcFNjaGVtYXRhLmZpbmQoKGEpID0+IGEuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBzZXR0aW5ncyBmb3IgYXBwcyB0byBob29rIGludG8gc2hlbGwgc2V0dGluZ3MgcGFnZS5cbiAgICogVGhlc2UgZXhwb3NlZCBzZXR0aW5ncyB3aWxsIGJlIHNhdmVkIGluIHRoZSB1c2VycyBzZXR0aW5ncyBvbiB0aGUgYmFja2VuZC5cbiAgICogQHBhcmFtIGFwcElEIElEIG9mIHRoZSBhcHAgdGhhdCBleHBvc2VzIHRoZSBzZXR0aW5nc1xuICAgKiBAcGFyYW0gY2ZnIFNoZWxsQXBwU2V0dGluZ3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNldHRpbmdzXG4gICAqL1xuICByZWdpc3RlckFwcFNldHRpbmdzKGFwcElEOiBzdHJpbmcsIGNmZzogU2hlbGxBcHBTZXR0aW5ncykge1xuICAgIHRoaXMuI2FwcFNldHRpbmdzW2FwcElEXSA9IGNmZztcbiAgICB0aGlzLiNhcHBTZXR0aW5nc1N1YmplY3QubmV4dCh0aGlzLiNnZXRBcHBTZXR0aW5ncygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHBlcnNpc3RlZCBzZXR0aW5ncyBmb3IgYSBzcGVjaWZpYyBhcHBcbiAgICogQHBhcmFtIGFwcElEIElEIG9mIHRoZSBhcHAgdG8gbG9hZCB0aGUgc2V0dGluZ3MgZm9yXG4gICAqL1xuICB1c2Vyc0FwcFNldHRpbmdzJChhcHBJRDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTaGVsbEFwcFNldHRpbmdzIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuI3VzZXJTZXJ2aWNlLnVzZXIkLnBpcGUoXG4gICAgICBtYXAoKHU6IFl1dlVzZXIgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgcmV0dXJuIHUgJiYgdS51c2VyU2V0dGluZ3MuY2xpZW50QXBwU2V0dGluZ3MgPyB1LnVzZXJTZXR0aW5ncy5jbGllbnRBcHBTZXR0aW5nc1thcHBJRF0gOiB1bmRlZmluZWQ7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzYXZlVXNlcnNBcHBTZXR0aW5ncyhhcHBJRDogc3RyaW5nLCBzZXR0aW5nczogU2hlbGxBcHBTZXR0aW5ncyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuI3VzZXJTZXJ2aWNlLnNhdmVVc2VyU2V0dGluZ3MoeyBjbGllbnRBcHBTZXR0aW5nczogeyBbYXBwSURdOiBzZXR0aW5ncyB9IH0pO1xuICB9XG5cbiAgI2dldEFwcFNldHRpbmdzKCk6IFNoZWxsQXBwU2V0dGluZ3NbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuI2FwcFNldHRpbmdzKVxuICAgICAgLm1hcCgoa2V5OiBzdHJpbmcpID0+ICh7XG4gICAgICAgIGFwcElEOiB0aGlzLiNhcHBTZXR0aW5nc1trZXldLmFwcElELFxuICAgICAgICBsYWJlbDogdGhpcy4jYXBwU2V0dGluZ3Nba2V5XS5sYWJlbCxcbiAgICAgICAgcHJvcGVydGllczogdGhpcy4jYXBwU2V0dGluZ3Nba2V5XS5wcm9wZXJ0aWVzXG4gICAgICB9KSlcbiAgICAgIC5zb3J0KCk7XG4gIH1cblxuICBhZGRCdXN5KCkge1xuICAgIGlmICh0aGlzLl9idXN5Q291bnQgPT09IDApIHtcbiAgICAgIHRoaXMuaXNCdXN5U3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgICB0aGlzLl9idXN5Q291bnQrKztcbiAgfVxuICByZW1vdmVCdXN5KCkge1xuICAgIHRoaXMuX2J1c3lDb3VudC0tO1xuICAgIGlmICh0aGlzLl9idXN5Q291bnQgPT09IDApIHtcbiAgICAgIHRoaXMuaXNCdXN5U3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBleHBvc2VPYmplY3RDcmVhdGVGbGF2b3JzKGZsYXZvcnM6IE9iamVjdENyZWF0ZUZsYXZvcltdKSB7XG4gICAgZmxhdm9ycy5mb3JFYWNoKChmbGF2b3I6IE9iamVjdENyZWF0ZUZsYXZvcikgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5fb2JqZWN0Q3JlYXRlRmxhdm9ycy5maW5kSW5kZXgoKGYpID0+IGYuaWQgPT09IGZsYXZvci5pZCk7XG4gICAgICBpZiAoaWR4ID09PSAtMSkgdGhpcy5fb2JqZWN0Q3JlYXRlRmxhdm9ycy5wdXNoKGZsYXZvcik7XG4gICAgfSk7XG4gIH1cblxuICBjb25jZWFsT2JqZWN0Q3JlYXRlRmxhdm9ycyhmbGF2b3JzOiBPYmplY3RDcmVhdGVGbGF2b3JbXSkge1xuICAgIGNvbnN0IGZpZCA9IGZsYXZvcnMubWFwKChmKSA9PiBmLmlkKTtcbiAgICB0aGlzLl9vYmplY3RDcmVhdGVGbGF2b3JzID0gdGhpcy5fb2JqZWN0Q3JlYXRlRmxhdm9ycy5maWx0ZXIoKGYpID0+ICFmaWQuaW5jbHVkZXMoZi5pZCkpO1xuICB9XG5cbiAgZ2V0T2JqZWN0Q3JlYXRlRmxhdm9ycygpOiBPYmplY3RDcmVhdGVGbGF2b3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdENyZWF0ZUZsYXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3NlcyBhIGxpc3Qgb2Ygb2JqZWN0IGZsYXZvcnMgdG8gdGhlIHNoZWxsLlxuICAgKiBGbGF2b3JzIGFyZSBhYmxlIHRvIGJlIGFwcGxpZWQgdG8gb2JqZWN0cyBhbmQgYWRkIG5ldyBtZXRhZGF0YSBwcm9wZXJ0aWVzIHRvIHRoZW0uXG4gICAqIEBwYXJhbSBmbGF2b3JzIEFycmF5IG9mIGZsYXZvcnMgdG8gYmUgZXhwb3NlZFxuICAgKiBAcGFyYW0gYXBwIE9wdGlvbmFsIElEIG9mIHRoZSBhcHAgdGhhdCBleHBvc2VzIHRoZSBmbGF2b3JzIChkZWZhdWx0cyB0byAnZ2xvYmFsJyBpZiBub3QgcHJvdmlkZWQpXG4gICAqL1xuICBleHBvc2VPYmplY3RGbGF2b3JzKGZsYXZvcnM6IEFwcFNjaGVtYUZsYXZvcltdLCBhcHAgPSAnZ2xvYmFsJykge1xuICAgIGZsYXZvcnMuZm9yRWFjaCgoZikgPT4gdGhpcy5leHBvc2VPYmplY3RGbGF2b3IoZiwgYXBwKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBleHBvc2VkIG9iamVjdCBmbGF2b3JzIGZyb20gdGhlIHNoZWxsLlxuICAgKiBAcGFyYW0gZmxhdm9ycyBBcnJheSBvZiBmbGF2b3JzIHRvIGJlIGNvbmNlYWxlZFxuICAgKi9cbiAgY29uY2VhbE9iamVjdEZsYXZvcnMoZmxhdm9yczogQXBwU2NoZW1hRmxhdm9yW10sIGFwcCA9ICdnbG9iYWwnKSB7XG4gICAgZmxhdm9ycy5mb3JFYWNoKChmKSA9PiB0aGlzLmNvbmNlYWxPYmplY3RGbGF2b3IoZiwgYXBwKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3NlcyBhbiBvYmplY3QgZmxhdm9yIHRvIHRoZSBzaGVsbC4gRmxhdm9ycyBhcmUgYWJsZSB0byBiZSBhcHBsaWVkIHRvIG9iamVjdHNcbiAgICogaW4gb3JkZXIgdG8gYWRkIGEgbmV3IGFzcGVjdCB0byB0aGVtLiBBbiBvYmplY3QgY29udGFpbmluZyBhbiBpbWFnZSBmb3IgZXhhbXBsZSBjb3VsZFxuICAgKiBiZSBhZGRlZCBhIGZsYXZvciBvZiAnRVhJRiBEYXRhJyB0aGF0IHdpbGwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIFNPVCB0byBpdC4gVGhpcyB3YXkgdGhlXG4gICAqIG9iamVjdCBnZXRzIG5ldyBtZXRhZGF0YSBwcm9wZXJ0aWVzLiBJZiBzdXBwb3J0ZWQsIHRoZXNlIG1ldGFkYXRhIGNvdWxkIGV2ZW4gYmUgZXh0cmFjdGVkXG4gICAqIGZyb20gdGhlIGZpbGUgYW5kIGZpbGxlZCBvdXQgYXV0b21hdGljYWxseS5cbiAgICogQHBhcmFtIGZsYXZvciBUaGUgZmxhdm9yIG9iamVjdCB0byBiZSBleHBvc2VkXG4gICAqIEBwYXJhbSBhcHAgT3B0aW9uYWwgSUQgb2YgdGhlIGFwcCB0aGF0IGV4cG9zZXMgdGhlIGZsYXZvciAoZGVmYXVsdHMgdG8gJ2dsb2JhbCcgaWYgbm90IHByb3ZpZGVkKVxuICAgKi9cbiAgZXhwb3NlT2JqZWN0Rmxhdm9yKGZsYXZvcjogQXBwU2NoZW1hRmxhdm9yLCBhcHAgPSAnZ2xvYmFsJykge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuX29iamVjdEZsYXZvcnMuZmluZEluZGV4KChmKSA9PiBmLmlkID09PSBmbGF2b3IuaWQgJiYgZi5hcHAgPT09IGFwcCk7XG4gICAgaWYgKGlkeCA9PT0gLTEpIHRoaXMuX29iamVjdEZsYXZvcnMucHVzaCh7IC4uLmZsYXZvciwgYXBwIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXhwb3NlZCBvYmplY3QgZmxhdm9yIGZyb20gdGhlIHNoZWxsLlxuICAgKiBAcGFyYW0gZmxhdm9yIEZsYXZvciB0byBiZSBjb25jZWFsZWRcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgZmxhdm9yIChkZWZhdWx0cyB0byAnZ2xvYmFsJyBpZiBub3QgcHJvdmlkZWQpXG4gICAqL1xuICBjb25jZWFsT2JqZWN0Rmxhdm9yKGZsYXZvcjogQXBwU2NoZW1hRmxhdm9yLCBhcHAgPSAnZ2xvYmFsJykge1xuICAgIHRoaXMuX29iamVjdEZsYXZvcnMgPSB0aGlzLl9vYmplY3RGbGF2b3JzLmZpbHRlcigoZikgPT4gZi5pZCAhPT0gZmxhdm9yLmlkICYmIGYuYXBwICE9PSBhcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWdpc3RlcmVkIG9iamVjdCBmbGF2b3JzXG4gICAqIEBwYXJhbSBhcHAgT3B0aW9uYWwgYXBwIElEIHRoYXQgcmVzdHJpY3RzIHRoZSByZXR1cm5lZCBmbGF2b3JzIHRvIHRoZSBvbmVzXG4gICAqIHByb3ZpZGVkIGJ5IGEgcGFydGljdWxhciBhcHAuIElmIG5vdCBwcm92aWRlZCBhbGwgZmxhdm9ycyBhcmUgcmV0dXJuZWRcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbWF0Y2hpbmcgb2JqZWN0IGZsYXZvcnNcbiAgICovXG4gIGdldE9iamVjdEZsYXZvcnMoYXBwPzogc3RyaW5nKTogT2JqZWN0Rmxhdm9yW10ge1xuICAgIHJldHVybiBhcHAgPyB0aGlzLl9vYmplY3RGbGF2b3JzLmZpbHRlcigob2YpID0+IG9mLmFwcCA9PT0gYXBwKSA6IHRoaXMuX29iamVjdEZsYXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIGFwcGxpY2F0aW9uIG9mIGFuIG9iamVjdCBmbGF2b3IuIElmIHRoZSBmbGF2b3IgaGFzIGFuIGFwcGx5Q29tcG9uZW50XG4gICAqIGRlZmluZWQsIHRoZSBvdmVybGF5IHdpbGwgYmUgb3BlbmVkIHdpdGggdGhlIGNvbXBvbmVudC4gT3RoZXJ3aXNlIHRoZSBmbGF2b3Igd2lsbFxuICAgKiBiZSBhcHBsaWVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSBkbXNPYmplY3QgVGhlIG9iamVjdCB0byBhcHBseSB0aGUgZmxhdm9yIHRvXG4gICAqIEBwYXJhbSBmbGF2b3IgVGhlIGZsYXZvciB0byBhcHBseVxuICAgKiBAcGFyYW0gZGF0YSBPcHRpb25hbCBkYXRhIHRvIGJlIHBhc3NlZCB0byB0aGUgZmxhdm9yIGNvbXBvbmVudFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdHJ1ZSBpZiB0aGUgZmxhdm9yIHdhcyBhcHBsaWVkIHN1Y2Nlc3NmdWxseVxuICAgKi9cbiAgdHJpZ2dlckFwcGx5T2JqZWN0Rmxhdm9yKGRtc09iamVjdDogRG1zT2JqZWN0LCBmbGF2b3I6IE9iamVjdEZsYXZvciwgZGF0YT86IGFueSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmIChkbXNPYmplY3QpIHtcbiAgICAgIGlmIChmbGF2b3IuYXBwbHlDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy4jb3ZlcmxheS5vcGVuKGZsYXZvci5hcHBseUNvbXBvbmVudCwge1xuICAgICAgICAgIGRtc09iamVjdCxcbiAgICAgICAgICBmbGF2b3IsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc290czogc3RyaW5nW10gPSAoZG1zT2JqZWN0LmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgICBkYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEU10gPSBbLi4uc290cywgZmxhdm9yLnNvdF07XG4gICAgICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLnVwZGF0ZURtc09iamVjdChkbXNPYmplY3Q/LmlkLCBkYXRhKS5waXBlKG1hcCgoKSA9PiB0cnVlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHJldHVybiBvZihmYWxzZSk7XG4gIH1cblxuICByZW1vdmVPYmplY3RGbGF2b3IoZG1zT2JqZWN0OiBEbXNPYmplY3QsIGZsYXZvcjogT2JqZWN0Rmxhdm9yKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jb3ZlcmxheVxuICAgICAgLmNvbmZpcm0oe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuc2hlbGwuZmxhdm9yLnJlbW92ZS5jb25maXJtLm1lc3NhZ2UnLCB7XG4gICAgICAgICAgZmxhdm9yOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGZsYXZvci5pZClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChjb25maXJtZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgU09UIC4uLlxuICAgICAgICAgICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICAgICAgIFtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdOiAoZG1zT2JqZWN0LmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSBhcyBzdHJpbmdbXSkuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChzb3Q6IHN0cmluZykgPT4gc290ICE9PSBmbGF2b3Iuc290XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZG1zU2VydmljZS51cGRhdGVEbXNPYmplY3QoZG1zT2JqZWN0LmlkLCBkYXRhKS5waXBlKG1hcCgoKSA9PiB0cnVlKSk7XG4gICAgICAgICAgfSBlbHNlIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvYmplY3QgZmxhdm9ycyBhcHBsaWNhYmxlIGZvciBhIGNlcnRhaW4gbWltZXR5cGVcbiAgICogQHBhcmFtIG1pbWVUeXBlIE1pbWUgdHlwZSBvciBtaW1lIHR5cGUgcGF0dGVybiBsaWtlICdpbWFnZS8qJ1xuICAgKiBAcGFyYW0gYXBwIE9wdGlvbmFsIGFwcCBJRCB0aGF0IHJlc3RyaWN0cyB0aGUgcmV0dXJuZWQgZmxhdm9ycyB0byB0aGUgb25lc1xuICAgKiBwcm92aWRlZCBieSBhIHBhcnRpY3VsYXIgYXBwXG4gICAqIEBwYXJhbSBjdXN0b21GbGF2b3JzIE9wdGlvbmFsIGFycmF5IG9mIGN1c3RvbSBmbGF2b3JzIHRvIGFsc28gdGFrZSBpbnRvIGFjY291bnQuXG4gICAqIFRoaXMgY291bGQgYmUgZmxhdm9ycyBtYW5hZ2VkIGJ5IGFuIGFwcCBpdHNlbGYgdGhhdCBhcmUgbm90IHN1cHBvc2VkIHRvIGJlXG4gICAqIGV4cG9zZWQgdG8gb3RoZXIgYXBwc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBtYXRjaGluZyBvYmplY3QgZmxhdm9yc1xuICAgKi9cbiAgZ2V0QXBwbGljYWJsZU9iamVjdEZsYXZvcnMobWltZVR5cGU6IHN0cmluZywgYXBwPzogc3RyaW5nLCBjdXN0b21GbGF2b3JzPzogT2JqZWN0Rmxhdm9yW10pOiBPYmplY3RGbGF2b3JbXSB7XG4gICAgcmV0dXJuIFsuLi4oY3VzdG9tRmxhdm9ycyB8fCBbXSksIC4uLnRoaXMuX29iamVjdEZsYXZvcnNdLmZpbHRlcihcbiAgICAgIChvZjogT2JqZWN0Rmxhdm9yKSA9PiBvZi5hcHBsaWNhYmxlVG8/Lm1pbWVUeXBlcy5zb21lKChtdHApID0+IFV0aWxzLnBhdHRlcm5Ub1JlZ0V4cChtdHApLnRlc3QobWltZVR5cGUpKSAmJiAoIWFwcCB8fCBvZi5hcHAgPT09IGFwcClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhcHBsaWVkIGFuZCBhcHBsaWNhYmxlIG9iamVjdCBmbGF2b3JzIGZvciBhIGNlcnRhaW4gb2JqZWN0XG4gICAqIEBwYXJhbSBkbXNPYmplY3QgRG1zT2JqZWN0IHRvIGdldCBmbGF2b3JzIGZvclxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0d28gYXJyYXlzOiBhcHBsaWVkIGFuZCBhcHBsaWNhYmxlIGZsYXZvcnNcbiAgICovXG4gIGdldEFwcGxpZWRPYmplY3RGbGF2b3JzKGRtc09iamVjdDogRG1zT2JqZWN0KToge1xuICAgIGFwcGxpZWQ6IE9iamVjdEZsYXZvcltdO1xuICAgIGFwcGxpY2FibGU6IE9iamVjdEZsYXZvcltdO1xuICB9IHtcbiAgICBjb25zdCBhcHBsaWVkOiBPYmplY3RGbGF2b3JbXSA9IFtdO1xuICAgIGNvbnN0IGFwcGxpY2FibGU6IE9iamVjdEZsYXZvcltdID0gW107XG4gICAgaWYgKGRtc09iamVjdCkge1xuICAgICAgY29uc3Qgc290czogc3RyaW5nW10gPSAoZG1zT2JqZWN0LmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgICBpZiAoZG1zT2JqZWN0LmNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5nZXRBcHBsaWNhYmxlT2JqZWN0Rmxhdm9ycyhkbXNPYmplY3QuY29udGVudC5taW1lVHlwZSkuZm9yRWFjaCgoZmxhdm9yOiBPYmplY3RGbGF2b3IpID0+IHtcbiAgICAgICAgICBpZiAoc290cy5pbmNsdWRlcyhmbGF2b3Iuc290KSkge1xuICAgICAgICAgICAgYXBwbGllZC5wdXNoKGZsYXZvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFwcGxpY2FibGUucHVzaChmbGF2b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGFwcGxpZWQsIGFwcGxpY2FibGUgfTtcbiAgfVxuXG4gIGFwcGx5T2JqZWN0Rmxhdm9yKGRtc09iamVjdDogRG1zT2JqZWN0LCBmbGF2b3I6IE9iamVjdEZsYXZvciwgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IE9ic2VydmFibGU8RG1zT2JqZWN0PiB7XG4gICAgY29uc3Qgc290czogc3RyaW5nW10gPSAoZG1zT2JqZWN0LmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdID0gWy4uLnNvdHMsIGZsYXZvci5zb3RdO1xuICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLnVwZGF0ZURtc09iamVjdChkbXNPYmplY3QuaWQsIGRhdGEpO1xuICB9XG5cbiAgcmVnaXN0ZXJUaWxlRXh0ZW5zaW9uKGV4dDogVGlsZUV4dGVuc2lvbikge1xuICAgIHRoaXMuX2V4dGVuc2lvbnNbZXh0LnR5cGVJZF0gPSBleHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRpbGUgZXh0ZW5zaW9ucyBmb3IgYSBjZXJ0YWluIHR5cGVcbiAgICogQHBhcmFtIHR5cGVJZCBJRCBvZiB0aGUgdHlwZSB0byBmZXRjaCBleHRlc2lvbiBmb3IgKG9iamVjdFR5cGVJRCBvciBzZWNvbmRhcnlPYmplY3RUeXBlSUQpXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRSZWdpc3RlcmVkVGlsZUV4dGVuc2lvbnMoKTogUmVjb3JkPHN0cmluZywgVGlsZUV4dGVuc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLl9leHRlbnNpb25zO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBfaW5pdCgpIHt9XG59XG4iXX0=
|
|
357
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ShellService, decorators: [{
|
|
358
|
+
type: Injectable,
|
|
359
|
+
args: [{
|
|
360
|
+
providedIn: 'root'
|
|
361
|
+
}]
|
|
362
|
+
}] });
|
|
363
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvc2hlbGwvc2hlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUNMLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsYUFBYSxFQUViLFVBQVUsRUFFVixhQUFhLEVBQ2IsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsS0FBSyxFQUVOLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pJLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLFlBQVk7SUFIekI7UUFJRSxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxZQUFPLEdBQUcsTUFBTSxDQUFDLFNB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QUFDOzhHQXhYQyxZQUFZO2tIQUFaLFlBQVksY0FGWCxNQUFNOzsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0SWNvblJlZ2lzdHJ5IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7XG4gIEFwaUJhc2UsXG4gIEJhc2VPYmplY3RUeXBlRmllbGQsXG4gIENvbmZpZ1NlcnZpY2UsXG4gIERtc09iamVjdCxcbiAgRG1zU2VydmljZSxcbiAgT2JqZWN0Q3JlYXRlRmxhdm9yLFxuICBTeXN0ZW1TZXJ2aWNlLFxuICBTeXN0ZW1UeXBlLFxuICBUcmFuc2xhdGVTZXJ2aWNlLFxuICBVc2VyU2VydmljZSxcbiAgVXRpbHMsXG4gIFl1dlVzZXJcbn0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmaXJzdFZhbHVlRnJvbSwgZnJvbUV2ZW50LCBtYXAsIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENMSUVOVF9TSEVMTF9BU1NFVFMgfSBmcm9tICcuLi8uLi9jbGllbnQtc2hlbGwuYXNzZXRzJztcbmltcG9ydCB7IEFwcCwgQXBwU2NoZW1hLCBBcHBTY2hlbWFGbGF2b3IsIENsaWVudFNoZWxsQ29uZmlnLCBHbG9iYWxTaG9ydGN1dCwgT2JqZWN0Rmxhdm9yLCBTaGVsbEFwcFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vY2xpZW50LXNoZWxsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBUaWxlRXh0ZW5zaW9uIH0gZnJvbSAnLi4vLi4vdGlsZS1leHRlbnNpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFNIRUxMX0NPTkZJR19UWVBFUyB9IGZyb20gJy4uL3NoZWxsLWNvbmZpZy9zaGVsbC1jb25maWcuY29uc3QnO1xuaW1wb3J0IHsgQ2xpZW50U2hlbGxUeXBlLCBTaGVsbENvbmZpZyB9IGZyb20gJy4uL3NoZWxsLWNvbmZpZy9zaGVsbC1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNoZWxsQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NoZWxsLWNvbmZpZy9zaGVsbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNoZWxsU2VydmljZSB7XG4gICNkbXNTZXJ2aWNlID0gaW5qZWN0KERtc1NlcnZpY2UpO1xuICAjZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gICNzeXN0ZW0gPSBpbmplY3QoU3lzdGVtU2VydmljZSk7XG4gICN1c2VyU2VydmljZSA9IGluamVjdChVc2VyU2VydmljZSk7XG4gIC8vIFRPRE86IE5lZWQgb3JpZ25hbCBNYXRJY29uUmVnaXN0cnkgdG8gI3JlZ2lzdGVyT2JqZWN0VHlwZUljb25zLCBvdGhlcndpc2UgaWNvbnMgY291bGQgbm90IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIG5hbWVzcGFjZVxuICAvLyAjaWNvblJlZ2lzdHJ5ID0gaW5qZWN0KFl1dk1hdEljb25SZWdpc3RyeSk7XG4gICNpY29uUmVnaXN0cnkgPSBpbmplY3QoTWF0SWNvblJlZ2lzdHJ5KTtcbiAgI3NoZWxsQ29uZmlnID0gaW5qZWN0KFNoZWxsQ29uZmlnU2VydmljZSk7XG4gICNjb25maWdTZXJ2aWNlID0gaW5qZWN0KENvbmZpZ1NlcnZpY2UpO1xuICAjc2FuaXRpemVyID0gaW5qZWN0KERvbVNhbml0aXplcik7XG4gICNET0NVTUVOVCA9IGluamVjdChET0NVTUVOVCk7XG4gIHByaXZhdGUgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gIHByaXZhdGUgX2J1c3lDb3VudCA9IDA7XG4gIHByaXZhdGUgaXNCdXN5U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBpc0J1c3kkID0gdGhpcy5pc0J1c3lTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGVib3VuY2VUaW1lKDUwMCkpO1xuXG4gICNhcHBTZXR0aW5nczogUmVjb3JkPHN0cmluZywgU2hlbGxBcHBTZXR0aW5ncz4gPSB7fTtcbiAgI2FwcFNldHRpbmdzU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PFNoZWxsQXBwU2V0dGluZ3NbXT4oKTtcbiAgYXBwU2V0dGluZ3MkID0gdGhpcy4jYXBwU2V0dGluZ3NTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGVib3VuY2VUaW1lKDUwMCkpO1xuXG4gICNhcHBTY2hlbWF0YTogQXBwU2NoZW1hW10gPSBbXTtcbiAgYXBwQmFzZVJvdXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICNkZWZhdWx0U2hlbGxDb25maWc6IENsaWVudFNoZWxsQ29uZmlnID0ge1xuICAgIGFwcEljb246IENMSUVOVF9TSEVMTF9BU1NFVFMuYXBwSWNvbixcbiAgICBzaGVsbEljb25OYW1lc3BhY2U6IENMSUVOVF9TSEVMTF9BU1NFVFMuc2hlbGxJY29uTmFtZXNwYWNlXG4gIH07XG4gIHNoZWxsQ29uZmlnID0gc2lnbmFsPENsaWVudFNoZWxsQ29uZmlnPih0aGlzLiNkZWZhdWx0U2hlbGxDb25maWcpO1xuXG4gIC8qKiBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlID8/Pz9cbiAgICogR2xvYmFsIHNob3J0Y3V0cyBhcmUgY2FwdHVyZWQgYnkgdGhlIHNoZWxsIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IGV4cGVyaWVuY2VcbiAgICogYWNjcm9zcyBhbGwgYXBwcy4gU2VhcmNoIGlzIG9uZSBleGFtcGxlLiBBcHBzIHNob3VsZCBub3QgZGVmaW5lIHRoZWlyIG93biBzaG91cnRjdXRzXG4gICAqIGZvciBzZWFyY2guIEluc3RlYWQgdGhleSBzaG91bGQgc3Vic2NyaWJlIHRvIHRoZSBnbG9iYWwgc2hvcnRjdXRzIGFuZCBpbml0aWFsaXplIHRoZWlyXG4gICAqIHNlYXJjaCBiYXNlZCBvbiB0aGUgZ2xvYmFsIHNlYXJjaCBzaG9ydGN1dC5cbiAgICovXG4gIGdsb2JhbFNob3J0Y3V0cyQ6IE9ic2VydmFibGU8R2xvYmFsU2hvcnRjdXQ+ID0gZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgbWFwKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBnbG9iYWwgc2hvcnRjdXQgZm9yIHNlYXJjaFxuICAgICAgLy8gaWYgKGUuY3RybEtleSAmJiBlLmNvZGUgPT09ICdLZXlGJykge1xuICAgICAgLy8gICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyAgIHJldHVybiBHbG9iYWxTaG9ydGN1dC5zZWFyY2g7XG4gICAgICAvLyB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pLFxuICAgIGZpbHRlcigoczogR2xvYmFsU2hvcnRjdXQgfCB1bmRlZmluZWQpID0+IHMgIT09IHVuZGVmaW5lZCksXG4gICAgbWFwKChzKSA9PiBzIGFzIEdsb2JhbFNob3J0Y3V0KVxuICApO1xuXG4gIHByaXZhdGUgX2V4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIFRpbGVFeHRlbnNpb24+ID0ge307XG4gIHByaXZhdGUgX29iamVjdEZsYXZvcnM6IE9iamVjdEZsYXZvcltdID0gW107XG4gIHByaXZhdGUgX29iamVjdENyZWF0ZUZsYXZvcnM6IE9iamVjdENyZWF0ZUZsYXZvcltdID0gW107XG5cbiAgcGlja0ZpbGUoKTogT2JzZXJ2YWJsZTxGaWxlIHwgbnVsbD4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy4jRE9DVU1FTlQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBpbnB1dC50eXBlID0gJ2ZpbGUnO1xuICAgIGlucHV0LmNsaWNrKCk7XG4gICAgcmV0dXJuIGZyb21FdmVudChpbnB1dCwgJ2NoYW5nZScpLnBpcGUoXG4gICAgICBtYXAoKGU6IEV2ZW50KSA9PiAoZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXM/LlswXSB8fCBudWxsKSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGlucHV0LnJlbW92ZSgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2V0U2hlbGxDb25maWcoY3NjOiBDbGllbnRTaGVsbENvbmZpZykge1xuICAgIHRoaXMuc2hlbGxDb25maWcudXBkYXRlKChzYykgPT4gKHtcbiAgICAgIGFwcEljb246IGNzYy5hcHBJY29uID8/IHNjLmFwcEljb24sXG4gICAgICBzaGVsbEljb25OYW1lc3BhY2U6IGNzYy5zaGVsbEljb25OYW1lc3BhY2UgPz8gc2Muc2hlbGxJY29uTmFtZXNwYWNlXG4gICAgfSkpO1xuICB9XG5cbiAgc2V0QXBwQmFzZVJvdXRlcyhhcHBzOiBBcHBbXSkge1xuICAgIGFwcHMuZm9yRWFjaCgoYSkgPT4gKHRoaXMuYXBwQmFzZVJvdXRlc1thLmlkXSA9IGEucGF0aCB8fCAnJykpO1xuICB9XG5cbiAgcmVnaXN0ZXJBcHAoc2NoZW1hOiBBcHBTY2hlbWEpIHtcbiAgICB0aGlzLiNhcHBTY2hlbWF0YS5wdXNoKHNjaGVtYSk7XG4gIH1cblxuICBnZXRSZWdpc3RlcmVkQXBwKGlkOiBzdHJpbmcpOiBBcHBTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNhcHBTY2hlbWF0YS5maW5kKChhKSA9PiBhLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIGFwcHMgdG8gaG9vayBpbnRvIHNoZWxsIHNldHRpbmdzIHBhZ2UuXG4gICAqIFRoZXNlIGV4cG9zZWQgc2V0dGluZ3Mgd2lsbCBiZSBzYXZlZCBpbiB0aGUgdXNlcnMgc2V0dGluZ3Mgb24gdGhlIGJhY2tlbmQuXG4gICAqIEBwYXJhbSBhcHBJRCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgc2V0dGluZ3NcbiAgICogQHBhcmFtIGNmZyBTaGVsbEFwcFNldHRpbmdzIG9iamVjdCBjb250YWluaW5nIHRoZSBzZXR0aW5nc1xuICAgKi9cbiAgcmVnaXN0ZXJBcHBTZXR0aW5ncyhhcHBJRDogc3RyaW5nLCBjZmc6IFNoZWxsQXBwU2V0dGluZ3MpIHtcbiAgICB0aGlzLiNhcHBTZXR0aW5nc1thcHBJRF0gPSBjZmc7XG4gICAgdGhpcy4jYXBwU2V0dGluZ3NTdWJqZWN0Lm5leHQodGhpcy4jZ2V0QXBwU2V0dGluZ3MoKSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBwZXJzaXN0ZWQgc2V0dGluZ3MgZm9yIGEgc3BlY2lmaWMgYXBwXG4gICAqIEBwYXJhbSBhcHBJRCBJRCBvZiB0aGUgYXBwIHRvIGxvYWQgdGhlIHNldHRpbmdzIGZvclxuICAgKi9cbiAgdXNlcnNBcHBTZXR0aW5ncyQoYXBwSUQ6IHN0cmluZyk6IE9ic2VydmFibGU8U2hlbGxBcHBTZXR0aW5ncyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLiN1c2VyU2VydmljZS51c2VyJC5waXBlKFxuICAgICAgbWFwKCh1OiBZdXZVc2VyIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIHJldHVybiB1ICYmIHUudXNlclNldHRpbmdzLmNsaWVudEFwcFNldHRpbmdzID8gdS51c2VyU2V0dGluZ3MuY2xpZW50QXBwU2V0dGluZ3NbYXBwSURdIDogdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2F2ZVVzZXJzQXBwU2V0dGluZ3MoYXBwSUQ6IHN0cmluZywgc2V0dGluZ3M6IFNoZWxsQXBwU2V0dGluZ3MpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLiN1c2VyU2VydmljZS5zYXZlVXNlclNldHRpbmdzKHsgY2xpZW50QXBwU2V0dGluZ3M6IHsgW2FwcElEXTogc2V0dGluZ3MgfSB9KTtcbiAgfVxuXG4gICNnZXRBcHBTZXR0aW5ncygpOiBTaGVsbEFwcFNldHRpbmdzW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLiNhcHBTZXR0aW5ncylcbiAgICAgIC5tYXAoKGtleTogc3RyaW5nKSA9PiAoe1xuICAgICAgICBhcHBJRDogdGhpcy4jYXBwU2V0dGluZ3Nba2V5XS5hcHBJRCxcbiAgICAgICAgbGFiZWw6IHRoaXMuI2FwcFNldHRpbmdzW2tleV0ubGFiZWwsXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMuI2FwcFNldHRpbmdzW2tleV0ucHJvcGVydGllc1xuICAgICAgfSkpXG4gICAgICAuc29ydCgpO1xuICB9XG5cbiAgYWRkQnVzeSgpIHtcbiAgICBpZiAodGhpcy5fYnVzeUNvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLmlzQnVzeVN1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5fYnVzeUNvdW50Kys7XG4gIH1cbiAgcmVtb3ZlQnVzeSgpIHtcbiAgICB0aGlzLl9idXN5Q291bnQtLTtcbiAgICBpZiAodGhpcy5fYnVzeUNvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLmlzQnVzeVN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZXhwb3NlT2JqZWN0Q3JlYXRlRmxhdm9ycyhmbGF2b3JzOiBPYmplY3RDcmVhdGVGbGF2b3JbXSkge1xuICAgIGZsYXZvcnMuZm9yRWFjaCgoZmxhdm9yOiBPYmplY3RDcmVhdGVGbGF2b3IpID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX29iamVjdENyZWF0ZUZsYXZvcnMuZmluZEluZGV4KChmKSA9PiBmLmlkID09PSBmbGF2b3IuaWQpO1xuICAgICAgaWYgKGlkeCA9PT0gLTEpIHRoaXMuX29iamVjdENyZWF0ZUZsYXZvcnMucHVzaChmbGF2b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgY29uY2VhbE9iamVjdENyZWF0ZUZsYXZvcnMoZmxhdm9yczogT2JqZWN0Q3JlYXRlRmxhdm9yW10pIHtcbiAgICBjb25zdCBmaWQgPSBmbGF2b3JzLm1hcCgoZikgPT4gZi5pZCk7XG4gICAgdGhpcy5fb2JqZWN0Q3JlYXRlRmxhdm9ycyA9IHRoaXMuX29iamVjdENyZWF0ZUZsYXZvcnMuZmlsdGVyKChmKSA9PiAhZmlkLmluY2x1ZGVzKGYuaWQpKTtcbiAgfVxuXG4gIGdldE9iamVjdENyZWF0ZUZsYXZvcnMoKTogT2JqZWN0Q3JlYXRlRmxhdm9yW10ge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RDcmVhdGVGbGF2b3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZXMgYSBsaXN0IG9mIG9iamVjdCBmbGF2b3JzIHRvIHRoZSBzaGVsbC5cbiAgICogRmxhdm9ycyBhcmUgYWJsZSB0byBiZSBhcHBsaWVkIHRvIG9iamVjdHMgYW5kIGFkZCBuZXcgbWV0YWRhdGEgcHJvcGVydGllcyB0byB0aGVtLlxuICAgKiBAcGFyYW0gZmxhdm9ycyBBcnJheSBvZiBmbGF2b3JzIHRvIGJlIGV4cG9zZWRcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgZmxhdm9ycyAoZGVmYXVsdHMgdG8gJ2dsb2JhbCcgaWYgbm90IHByb3ZpZGVkKVxuICAgKiBAcGFyYW0gb3JpZ2luIE9wdGlvbmFsIG9yaWdpbiBvZiB0aGUgZmxhdm9ycy4gRmxhdm9ycyBjb3VsZCBiZSBhZGRlZCBieSBhcHBzIG9yIGRlcml2ZWRcbiAgICogZnJvbSBhIGNvbmZpZ3VyYXRpb24gKGRlZmF1bHRzIHRvICdhcHAnIGlmIG5vdCBwcm92aWRlZClcbiAgICovXG4gIGV4cG9zZU9iamVjdEZsYXZvcnMoZmxhdm9yczogQXBwU2NoZW1hRmxhdm9yW10sIGFwcCA9ICdnbG9iYWwnLCBvcmlnaW46ICdhcHAnIHwgJ2NvbmZpZycgPSAnYXBwJykge1xuICAgIGZsYXZvcnMuZm9yRWFjaCgoZikgPT4gdGhpcy5leHBvc2VPYmplY3RGbGF2b3IoZiwgYXBwLCBvcmlnaW4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGV4cG9zZWQgb2JqZWN0IGZsYXZvcnMgZnJvbSB0aGUgc2hlbGwuXG4gICAqIEBwYXJhbSBmbGF2b3JzIEFycmF5IG9mIGZsYXZvcnMgdG8gYmUgY29uY2VhbGVkXG4gICAqL1xuICBjb25jZWFsT2JqZWN0Rmxhdm9ycyhmbGF2b3JzOiBBcHBTY2hlbWFGbGF2b3JbXSwgYXBwID0gJ2dsb2JhbCcpIHtcbiAgICBmbGF2b3JzLmZvckVhY2goKGYpID0+IHRoaXMuY29uY2VhbE9iamVjdEZsYXZvcihmLCBhcHApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2VzIGFuIG9iamVjdCBmbGF2b3IgdG8gdGhlIHNoZWxsLiBGbGF2b3JzIGFyZSBhYmxlIHRvIGJlIGFwcGxpZWQgdG8gb2JqZWN0c1xuICAgKiBpbiBvcmRlciB0byBhZGQgYSBuZXcgYXNwZWN0IHRvIHRoZW0uIEFuIG9iamVjdCBjb250YWluaW5nIGFuIGltYWdlIGZvciBleGFtcGxlIGNvdWxkXG4gICAqIGJlIGFkZGVkIGEgZmxhdm9yIG9mICdFWElGIERhdGEnIHRoYXQgd2lsbCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgU09UIHRvIGl0LiBUaGlzIHdheSB0aGVcbiAgICogb2JqZWN0IGdldHMgbmV3IG1ldGFkYXRhIHByb3BlcnRpZXMuIElmIHN1cHBvcnRlZCwgdGhlc2UgbWV0YWRhdGEgY291bGQgZXZlbiBiZSBleHRyYWN0ZWRcbiAgICogZnJvbSB0aGUgZmlsZSBhbmQgZmlsbGVkIG91dCBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcGFyYW0gZmxhdm9yIFRoZSBmbGF2b3Igb2JqZWN0IHRvIGJlIGV4cG9zZWRcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgZmxhdm9yIChkZWZhdWx0cyB0byAnZ2xvYmFsJyBpZiBub3QgcHJvdmlkZWQpXG4gICAqIEBwYXJhbSBvcmlnaW4gT3B0aW9uYWwgb3JpZ2luIG9mIHRoZSBmbGF2b3JzLiBGbGF2b3JzIGNvdWxkIGJlIGFkZGVkIGJ5IGFwcHMgb3IgZGVyaXZlZFxuICAgKiBmcm9tIGEgY29uZmlndXJhdGlvbiAoZGVmYXVsdHMgdG8gJ2FwcCcgaWYgbm90IHByb3ZpZGVkKVxuICAgKi9cbiAgZXhwb3NlT2JqZWN0Rmxhdm9yKGZsYXZvcjogQXBwU2NoZW1hRmxhdm9yLCBhcHAgPSAnZ2xvYmFsJywgb3JpZ2luOiAnYXBwJyB8ICdjb25maWcnID0gJ2FwcCcpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLl9vYmplY3RGbGF2b3JzLmZpbmRJbmRleCgoZikgPT4gZi5pZCA9PT0gZmxhdm9yLmlkICYmIGYuYXBwID09PSBhcHApO1xuICAgIGlmIChpZHggPT09IC0xKSB0aGlzLl9vYmplY3RGbGF2b3JzLnB1c2goeyAuLi5mbGF2b3IsIGFwcCwgb3JpZ2luIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXhwb3NlZCBvYmplY3QgZmxhdm9yIGZyb20gdGhlIHNoZWxsLlxuICAgKiBAcGFyYW0gZmxhdm9yIEZsYXZvciB0byBiZSBjb25jZWFsZWRcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgZmxhdm9yIChkZWZhdWx0cyB0byAnZ2xvYmFsJyBpZiBub3QgcHJvdmlkZWQpXG4gICAqL1xuICBjb25jZWFsT2JqZWN0Rmxhdm9yKGZsYXZvcjogQXBwU2NoZW1hRmxhdm9yLCBhcHAgPSAnZ2xvYmFsJykge1xuICAgIHRoaXMuX29iamVjdEZsYXZvcnMgPSB0aGlzLl9vYmplY3RGbGF2b3JzLmZpbHRlcigoZikgPT4gZi5pZCAhPT0gZmxhdm9yLmlkICYmIGYuYXBwICE9PSBhcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWdpc3RlcmVkIG9iamVjdCBmbGF2b3JzXG4gICAqIEBwYXJhbSBhcHAgT3B0aW9uYWwgYXBwIElEIHRoYXQgcmVzdHJpY3RzIHRoZSByZXR1cm5lZCBmbGF2b3JzIHRvIHRoZSBvbmVzXG4gICAqIHByb3ZpZGVkIGJ5IGEgcGFydGljdWxhciBhcHAuIElmIG5vdCBwcm92aWRlZCBhbGwgZmxhdm9ycyBhcmUgcmV0dXJuZWRcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbWF0Y2hpbmcgb2JqZWN0IGZsYXZvcnNcbiAgICovXG4gIGdldE9iamVjdEZsYXZvcnMoYXBwPzogc3RyaW5nKTogT2JqZWN0Rmxhdm9yW10ge1xuICAgIHJldHVybiBhcHAgPyB0aGlzLl9vYmplY3RGbGF2b3JzLmZpbHRlcigob2YpID0+IG9mLmFwcCA9PT0gYXBwKSA6IHRoaXMuX29iamVjdEZsYXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIGFwcGxpY2F0aW9uIG9mIGFuIG9iamVjdCBmbGF2b3IuIElmIHRoZSBmbGF2b3IgaGFzIGFuIGFwcGx5Q29tcG9uZW50XG4gICAqIGRlZmluZWQsIHRoZSBvdmVybGF5IHdpbGwgYmUgb3BlbmVkIHdpdGggdGhlIGNvbXBvbmVudC4gT3RoZXJ3aXNlIHRoZSBmbGF2b3Igd2lsbFxuICAgKiBiZSBhcHBsaWVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSBkbXNPYmplY3QgVGhlIG9iamVjdCB0byBhcHBseSB0aGUgZmxhdm9yIHRvXG4gICAqIEBwYXJhbSBmbGF2b3IgVGhlIGZsYXZvciB0byBhcHBseVxuICAgKiBAcGFyYW0gZGF0YSBPcHRpb25hbCBkYXRhIHRvIGJlIHBhc3NlZCB0byB0aGUgZmxhdm9yIGNvbXBvbmVudFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdHJ1ZSBpZiB0aGUgZmxhdm9yIHdhcyBhcHBsaWVkIHN1Y2Nlc3NmdWxseVxuICAgKi9cbiAgdHJpZ2dlckFwcGx5T2JqZWN0Rmxhdm9yKGRtc09iamVjdDogRG1zT2JqZWN0LCBmbGF2b3I6IE9iamVjdEZsYXZvciwgZGF0YT86IGFueSwgYXBwbHlDb21wb25lbnQ/OiBUeXBlPGFueT4pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBpZiAoZG1zT2JqZWN0KSB7XG4gICAgICBjb25zdCBhYyA9IGFwcGx5Q29tcG9uZW50IHx8IGZsYXZvci5hcHBseUNvbXBvbmVudDtcbiAgICAgIGlmIChhYykge1xuICAgICAgICB0aGlzLiNkaWFsb2cub3BlbihhYywge1xuICAgICAgICAgIG1heFdpZHRoOiAnOTB2dycsXG4gICAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXG4gICAgICAgICAgbWluV2lkdGg6ICc1MHZ3JyxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBkbXNPYmplY3QsXG4gICAgICAgICAgICBmbGF2b3IsXG4gICAgICAgICAgICBkYXRhXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc290czogc3RyaW5nW10gPSAoZG1zT2JqZWN0LmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgICBkYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEU10gPSBbLi4uc290cywgZmxhdm9yLnNvdF07XG4gICAgICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLnVwZGF0ZURtc09iamVjdChkbXNPYmplY3Q/LmlkLCBkYXRhKS5waXBlKG1hcCgoKSA9PiB0cnVlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHJldHVybiBvZihmYWxzZSk7XG4gIH1cblxuICByZW1vdmVPYmplY3RGbGF2b3IoZG1zT2JqZWN0OiBEbXNPYmplY3QsIGZsYXZvcjogT2JqZWN0Rmxhdm9yKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIFtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdOiAoZG1zT2JqZWN0LmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSBhcyBzdHJpbmdbXSkuZmlsdGVyKFxuICAgICAgICAoc290OiBzdHJpbmcpID0+IHNvdCAhPT0gZmxhdm9yLnNvdFxuICAgICAgKVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UudXBkYXRlRG1zT2JqZWN0KGRtc09iamVjdC5pZCwgZGF0YSkucGlwZShtYXAoKCkgPT4gdHJ1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvYmplY3QgZmxhdm9ycyBhcHBsaWNhYmxlIGZvciBhIGNlcnRhaW4gbWltZXR5cGVcbiAgICogQHBhcmFtIG1pbWVUeXBlIE1pbWUgdHlwZSBvciBtaW1lIHR5cGUgcGF0dGVybiBsaWtlICdpbWFnZS8qJ1xuICAgKiBAcGFyYW0gYXBwIE9wdGlvbmFsIGFwcCBJRCB0aGF0IHJlc3RyaWN0cyB0aGUgcmV0dXJuZWQgZmxhdm9ycyB0byB0aGUgb25lc1xuICAgKiBwcm92aWRlZCBieSBhIHBhcnRpY3VsYXIgYXBwXG4gICAqIEBwYXJhbSBjdXN0b21GbGF2b3JzIE9wdGlvbmFsIGFycmF5IG9mIGN1c3RvbSBmbGF2b3JzIHRvIGFsc28gdGFrZSBpbnRvIGFjY291bnQuXG4gICAqIFRoaXMgY291bGQgYmUgZmxhdm9ycyBtYW5hZ2VkIGJ5IGFuIGFwcCBpdHNlbGYgdGhhdCBhcmUgbm90IHN1cHBvc2VkIHRvIGJlXG4gICAqIGV4cG9zZWQgdG8gb3RoZXIgYXBwc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBtYXRjaGluZyBvYmplY3QgZmxhdm9yc1xuICAgKi9cbiAgZ2V0QXBwbGljYWJsZURvY3VtZW50Rmxhdm9ycyhtaW1lVHlwZTogc3RyaW5nLCBhcHA/OiBzdHJpbmcsIGN1c3RvbUZsYXZvcnM/OiBPYmplY3RGbGF2b3JbXSk6IE9iamVjdEZsYXZvcltdIHtcbiAgICByZXR1cm4gWy4uLihjdXN0b21GbGF2b3JzIHx8IFtdKSwgLi4udGhpcy5fb2JqZWN0Rmxhdm9yc10uZmlsdGVyKFxuICAgICAgKG9mOiBPYmplY3RGbGF2b3IpID0+XG4gICAgICAgICghb2YuYXBwbGljYWJsZVRvPy5mb2xkZXJzIHx8IChvZi5hcHBsaWNhYmxlVG8/LmZvbGRlcnMgJiYgb2YuYXBwbGljYWJsZVRvPy5kb2N1bWVudHMpKSAmJlxuICAgICAgICAoIW9mLmFwcGxpY2FibGVUbyB8fFxuICAgICAgICAgICFvZi5hcHBsaWNhYmxlVG8/Lm1pbWVUeXBlcyB8fFxuICAgICAgICAgIChvZi5hcHBsaWNhYmxlVG8/Lm1pbWVUeXBlcz8uc29tZSgobXRwKSA9PiBVdGlscy5wYXR0ZXJuVG9SZWdFeHAobXRwKS50ZXN0KG1pbWVUeXBlKSkgJiYgKCFhcHAgfHwgb2YuYXBwID09PSBhcHApKSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QXBwbGljYWJsZUZvbGRlckZsYXZvcnMoYXBwPzogc3RyaW5nLCBjdXN0b21GbGF2b3JzPzogT2JqZWN0Rmxhdm9yW10pOiBPYmplY3RGbGF2b3JbXSB7XG4gICAgcmV0dXJuIFsuLi4oY3VzdG9tRmxhdm9ycyB8fCBbXSksIC4uLnRoaXMuX29iamVjdEZsYXZvcnNdLmZpbHRlcigob2Y6IE9iamVjdEZsYXZvcikgPT4gb2YuYXBwbGljYWJsZVRvPy5mb2xkZXJzICYmICghYXBwIHx8IG9mLmFwcCA9PT0gYXBwKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFwcGxpZWQgYW5kIGFwcGxpY2FibGUgb2JqZWN0IGZsYXZvcnMgZm9yIGEgY2VydGFpbiBvYmplY3RcbiAgICogQHBhcmFtIGRtc09iamVjdCBEbXNPYmplY3QgdG8gZ2V0IGZsYXZvcnMgZm9yXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHR3byBhcnJheXM6IGFwcGxpZWQgYW5kIGFwcGxpY2FibGUgZmxhdm9yc1xuICAgKi9cbiAgZ2V0QXBwbGllZE9iamVjdEZsYXZvcnMoZG1zT2JqZWN0OiBEbXNPYmplY3QpOiB7XG4gICAgYXBwbGllZDogT2JqZWN0Rmxhdm9yW107XG4gICAgYXBwbGljYWJsZTogT2JqZWN0Rmxhdm9yW107XG4gIH0ge1xuICAgIGNvbnN0IGFwcGxpZWQ6IE9iamVjdEZsYXZvcltdID0gW107XG4gICAgY29uc3QgYXBwbGljYWJsZTogT2JqZWN0Rmxhdm9yW10gPSBbXTtcbiAgICBpZiAoZG1zT2JqZWN0KSB7XG4gICAgICBjb25zdCBzb3RzOiBzdHJpbmdbXSA9IChkbXNPYmplY3QuZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgICAgIGlmIChkbXNPYmplY3QuY29udGVudCkge1xuICAgICAgICB0aGlzLmdldEFwcGxpY2FibGVEb2N1bWVudEZsYXZvcnMoZG1zT2JqZWN0LmNvbnRlbnQubWltZVR5cGUpLmZvckVhY2goKGZsYXZvcjogT2JqZWN0Rmxhdm9yKSA9PiB7XG4gICAgICAgICAgaWYgKHNvdHMuaW5jbHVkZXMoZmxhdm9yLnNvdCkpIHtcbiAgICAgICAgICAgIGFwcGxpZWQucHVzaChmbGF2b3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcHBsaWNhYmxlLnB1c2goZmxhdm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZG1zT2JqZWN0LmlzRm9sZGVyKSB7XG4gICAgICAgIHRoaXMuZ2V0QXBwbGljYWJsZUZvbGRlckZsYXZvcnMoKS5mb3JFYWNoKChmbGF2b3I6IE9iamVjdEZsYXZvcikgPT4ge1xuICAgICAgICAgIGlmIChzb3RzLmluY2x1ZGVzKGZsYXZvci5zb3QpKSB7XG4gICAgICAgICAgICBhcHBsaWVkLnB1c2goZmxhdm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXBwbGljYWJsZS5wdXNoKGZsYXZvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgYXBwbGllZCwgYXBwbGljYWJsZSB9O1xuICB9XG5cbiAgZ2V0Rmxhdm9yTGFiZWwoaWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLiNzeXN0ZW0uZ2V0TG9jYWxpemVkTGFiZWwoaWQpIHx8IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoaWQpO1xuICB9XG5cbiAgYXBwbHlPYmplY3RGbGF2b3IoZG1zT2JqZWN0OiBEbXNPYmplY3QsIGZsYXZvcjogT2JqZWN0Rmxhdm9yLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogT2JzZXJ2YWJsZTxEbXNPYmplY3Q+IHtcbiAgICBjb25zdCBzb3RzOiBzdHJpbmdbXSA9IChkbXNPYmplY3QuZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgICBkYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEU10gPSBbLi4uc290cywgZmxhdm9yLnNvdF07XG4gICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UudXBkYXRlRG1zT2JqZWN0KGRtc09iamVjdC5pZCwgZGF0YSk7XG4gIH1cblxuICByZWdpc3RlclRpbGVFeHRlbnNpb24oZXh0OiBUaWxlRXh0ZW5zaW9uKSB7XG4gICAgdGhpcy5fZXh0ZW5zaW9uc1tleHQudHlwZUlkXSA9IGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGlsZSBleHRlbnNpb25zIGZvciBhIGNlcnRhaW4gdHlwZVxuICAgKiBAcGFyYW0gdHlwZUlkIElEIG9mIHRoZSB0eXBlIHRvIGZldGNoIGV4dGVzaW9uIGZvciAob2JqZWN0VHlwZUlEIG9yIHNlY29uZGFyeU9iamVjdFR5cGVJRClcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFJlZ2lzdGVyZWRUaWxlRXh0ZW5zaW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBUaWxlRXh0ZW5zaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dGVuc2lvbnM7XG4gIH1cblxuICBfaW5pdE9iamVjdFR5cGVDb25maWcoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gbG9hZCBmbGF2b3JzIGZyb20gY29uZmlnXG4gICAgY29uc29sZS5kZWJ1ZygnTG9hZGluZyBvYmplY3QgdHlwZSBjb25maWcuLi4nKTtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLiNzaGVsbENvbmZpZy5nZXQoU0hFTExfQ09ORklHX1RZUEVTKS5waXBlKFxuICAgICAgICB0YXAoKHJlczogU2hlbGxDb25maWcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICB0aGlzLiNyZWdpc3Rlck9iamVjdFR5cGVJY29ucygocmVzLmRhdGEgYXMgQ2xpZW50U2hlbGxUeXBlW10pLm1hcCgodCkgPT4gdC5pZCkpO1xuXG4gICAgICAgICAgICBjb25zdCBmbHY6IEFwcFNjaGVtYUZsYXZvcltdID0gKHJlcy5kYXRhIGFzIENsaWVudFNoZWxsVHlwZVtdKS5tYXAoKHQpID0+ICh7XG4gICAgICAgICAgICAgIGlkOiB0LmlkLFxuICAgICAgICAgICAgICBzb3Q6IHQuaWQsXG4gICAgICAgICAgICAgIGljb246IHQuaWQsXG4gICAgICAgICAgICAgIHN2Z0ljb246IHRydWUsXG4gICAgICAgICAgICAgIG9iamVjdFR5cGVJRDogdC5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgYXBwbGljYWJsZVRvOiB7XG4gICAgICAgICAgICAgICAgZm9sZGVyczogdC5iYXNlVHlwZSA9PT0gU3lzdGVtVHlwZS5GT0xERVIgfHwgdC5iYXNlVHlwZSA9PT0gU3lzdGVtVHlwZS5PQkpFQ1QsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRzOiB0LmJhc2VUeXBlID09PSBTeXN0ZW1UeXBlLkRPQ1VNRU5UIHx8IHQuYmFzZVR5cGUgPT09IFN5c3RlbVR5cGUuT0JKRUNULFxuICAgICAgICAgICAgICAgIG1pbWVUeXBlczogdC5hcHBsaWNhYmxlVG9NaW1lVHlwZXMgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVzZURlZmF1bHRBcHBseUNvbXBvbmVudDogIXQuaW5zdGFudEFwcGx5XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB0aGlzLmV4cG9zZU9iamVjdEZsYXZvcnMoZmx2LCAnZ2xvYmFsJywgJ2NvbmZpZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgI3JlZ2lzdGVyT2JqZWN0VHlwZUljb25zKGlkczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBzdWIgPSB0aGlzLiNzeXN0ZW0uc3lzdGVtJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgIC8vIHNwbGl0IHRlY2huaWNhbCBuYW1lIGUuZy4gJ3N5c3RlbTpkb2N1bWVudCcgYW5kIHVzZSB0aGUgZmlyc3QgcGFydCBhcyBuYW1lc3BhY2VcbiAgICAgICAgY29uc3QgaWRUb2tlbnMgPSBpZC5zcGxpdCgnOicpO1xuICAgICAgICBpZiAoaWRUb2tlbnMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgdXJpID0gYCR7dGhpcy4jY29uZmlnU2VydmljZS5nZXRBcGlCYXNlKEFwaUJhc2Uubm9uZSwgdHJ1ZSl9JHt0aGlzLiNzeXN0ZW0uZ2V0T2JqZWN0VHlwZUljb25VcmkoaWQpfWA7XG4gICAgICAgICAgdGhpcy4jaWNvblJlZ2lzdHJ5LmFkZFN2Z0ljb25Jbk5hbWVzcGFjZShpZFRva2Vuc1swXSwgaWRUb2tlbnNbMV0sIHRoaXMuI3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJpKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBjb25zdCBjb25maWcgPSAodGhpcy4jaWNvblJlZ2lzdHJ5IGFzIGFueSkuX3N2Z0ljb25Db25maWdzO1xuICAgICAgLy8gY29uc29sZS5sb2coeyBjb25maWcgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfaW5pdCgpIHt9XG59XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function getShellConfigQueryString(name, user = [], context) {
|
|
2
|
+
const conditions = [
|
|
3
|
+
`${SHELL_CONFIG_BASE.nameProperty} = '${name}'`,
|
|
4
|
+
...(context ? [`system:context = '${context}'`] : []),
|
|
5
|
+
...(user.length ? [`system:user IN (${user.map((u) => `'${u}'`).join(',')})`] : [])
|
|
6
|
+
];
|
|
7
|
+
return `SELECT * FROM ${SHELL_CONFIG_BASE.objectType} WHERE ${conditions.join(' AND ')}`;
|
|
8
|
+
}
|
|
9
|
+
export const SHELL_CONFIG_FEATURES = 'yuv:shell:features';
|
|
10
|
+
export const SHELL_CONFIG_TYPES = 'yuv:shell:types';
|
|
11
|
+
// TODO: enable again once HAR-876 is fixed
|
|
12
|
+
export const SHELL_CONFIG_BASE = {
|
|
13
|
+
objectType: 'system:item',
|
|
14
|
+
secondaryObjectType: 'system:configuration',
|
|
15
|
+
nameProperty: 'system:name'
|
|
16
|
+
};
|
|
17
|
+
// TODO: this is temporary until HAR-876 is fixed
|
|
18
|
+
// export const SHELL_CONFIG_BASE = {
|
|
19
|
+
// objectType: 'system:document',
|
|
20
|
+
// secondaryObjectType: 'appOsdrive:file',
|
|
21
|
+
// nameProperty: 'appOsdrive:fileName'
|
|
22
|
+
// };
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwtY29uZmlnLmNvbnN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9zaGVsbC1jb25maWcvc2hlbGwtY29uZmlnLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxJQUFZLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxPQUFnQjtJQUNqRixNQUFNLFVBQVUsR0FBRztRQUNqQixHQUFHLGlCQUFpQixDQUFDLFlBQVksT0FBTyxJQUFJLEdBQUc7UUFDL0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3BGLENBQUM7SUFDRixPQUFPLGlCQUFpQixpQkFBaUIsQ0FBQyxVQUFVLFVBQVUsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQzNGLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUVwRCwyQ0FBMkM7QUFDM0MsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0IsVUFBVSxFQUFFLGFBQWE7SUFDekIsbUJBQW1CLEVBQUUsc0JBQXNCO0lBQzNDLFlBQVksRUFBRSxhQUFhO0NBQzVCLENBQUM7QUFDRixpREFBaUQ7QUFDakQscUNBQXFDO0FBQ3JDLG1DQUFtQztBQUNuQyw0Q0FBNEM7QUFDNUMsd0NBQXdDO0FBQ3hDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2V0U2hlbGxDb25maWdRdWVyeVN0cmluZyhuYW1lOiBzdHJpbmcsIHVzZXIgPSBbXSwgY29udGV4dD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBbXG4gICAgYCR7U0hFTExfQ09ORklHX0JBU0UubmFtZVByb3BlcnR5fSA9ICcke25hbWV9J2AsXG4gICAgLi4uKGNvbnRleHQgPyBbYHN5c3RlbTpjb250ZXh0ID0gJyR7Y29udGV4dH0nYF0gOiBbXSksXG4gICAgLi4uKHVzZXIubGVuZ3RoID8gW2BzeXN0ZW06dXNlciBJTiAoJHt1c2VyLm1hcCgodSkgPT4gYCcke3V9J2ApLmpvaW4oJywnKX0pYF0gOiBbXSlcbiAgXTtcbiAgcmV0dXJuIGBTRUxFQ1QgKiBGUk9NICR7U0hFTExfQ09ORklHX0JBU0Uub2JqZWN0VHlwZX0gV0hFUkUgJHtjb25kaXRpb25zLmpvaW4oJyBBTkQgJyl9YDtcbn1cblxuZXhwb3J0IGNvbnN0IFNIRUxMX0NPTkZJR19GRUFUVVJFUyA9ICd5dXY6c2hlbGw6ZmVhdHVyZXMnO1xuZXhwb3J0IGNvbnN0IFNIRUxMX0NPTkZJR19UWVBFUyA9ICd5dXY6c2hlbGw6dHlwZXMnO1xuXG4vLyBUT0RPOiBlbmFibGUgYWdhaW4gb25jZSBIQVItODc2IGlzIGZpeGVkXG5leHBvcnQgY29uc3QgU0hFTExfQ09ORklHX0JBU0UgPSB7XG4gIG9iamVjdFR5cGU6ICdzeXN0ZW06aXRlbScsXG4gIHNlY29uZGFyeU9iamVjdFR5cGU6ICdzeXN0ZW06Y29uZmlndXJhdGlvbicsXG4gIG5hbWVQcm9wZXJ0eTogJ3N5c3RlbTpuYW1lJ1xufTtcbi8vIFRPRE86IHRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIEhBUi04NzYgaXMgZml4ZWRcbi8vIGV4cG9ydCBjb25zdCBTSEVMTF9DT05GSUdfQkFTRSA9IHtcbi8vICAgb2JqZWN0VHlwZTogJ3N5c3RlbTpkb2N1bWVudCcsXG4vLyAgIHNlY29uZGFyeU9iamVjdFR5cGU6ICdhcHBPc2RyaXZlOmZpbGUnLFxuLy8gICBuYW1lUHJvcGVydHk6ICdhcHBPc2RyaXZlOmZpbGVOYW1lJ1xuLy8gfTtcbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwtY29uZmlnLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvc2hlbGwtY29uZmlnL3NoZWxsLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgU2hlbGxDb25maWcge1xuICAgIC8vIHRoZSBpZCBvZiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICBpZDogc3RyaW5nO1xuICAgIC8vIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8vIGNvbnRleHQgXG4gICAgY29udGV4dD86IHN0cmluZztcbiAgICAvLyB1c2VycyB0aGlzIGNvbmZpZyBhcHBsaWVzIHRvXG4gICAgdXNlcj86IHN0cmluZ1tdO1xuICAgIC8vIHRoZSBhY3R1YWxsIGNvbmZpZ3VyYXRpb24gZGF0YVxuICAgIGRhdGE6IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U2hlbGxUeXBlIHtcbiAgICAvLyBvYmplY3QgdHlwZSBvciBTT1QgSURcbiAgICBpZDogc3RyaW5nO1xuICAgIGJhc2VUeXBlOiBzdHJpbmc7XG4gICAgaW5zdGFudEFwcGx5PzogYm9vbGVhblxuICAgIGFwcGxpY2FibGVUb01pbWVUeXBlcz86IHN0cmluZ1tdO1xuXG59Il19
|