@rxap/config 18.2.3-dev.0 → 19.0.0-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +1 -1
  3. package/compodoc/changelog.html +32 -0
  4. package/compodoc/dependencies.html +6 -6
  5. package/compodoc/index.html +1 -1
  6. package/compodoc/injectables/ConfigService.html +199 -31
  7. package/compodoc/interfaces/AppsNavigationConfig.html +5 -0
  8. package/compodoc/interfaces/Config.html +50 -0
  9. package/compodoc/interfaces/ConfigLoadOptions.html +36 -0
  10. package/compodoc/interfaces/LogoConfig.html +5 -0
  11. package/compodoc/interfaces/NavigationConfig.html +5 -0
  12. package/compodoc/interfaces/Oauth2Config.html +333 -0
  13. package/compodoc/interfaces/i18nConfig.html +5 -0
  14. package/compodoc/js/menu-wc.js +3 -0
  15. package/compodoc/js/menu-wc_es5.js +2 -2
  16. package/compodoc/js/search/search_index.js +2 -2
  17. package/compodoc/overview.html +1 -1
  18. package/compodoc/properties.html +1 -1
  19. package/docs/assets/navigation.js +1 -1
  20. package/docs/assets/search.js +1 -1
  21. package/docs/classes/ConfigLoaderService.html +2 -2
  22. package/docs/classes/ConfigService.html +6 -6
  23. package/docs/classes/ConfigTestingService.html +2 -2
  24. package/docs/documentation.json +288 -205
  25. package/docs/functions/ProvideConfig.html +1 -1
  26. package/docs/index.html +1 -1
  27. package/docs/interfaces/AppsNavigationConfig.html +2 -2
  28. package/docs/interfaces/Config.html +3 -2
  29. package/docs/interfaces/ConfigLoadOptions.html +3 -3
  30. package/docs/interfaces/LogoConfig.html +2 -2
  31. package/docs/interfaces/NavigationConfig.html +2 -2
  32. package/docs/interfaces/Oauth2Config.html +2 -0
  33. package/docs/interfaces/i18nConfig.html +2 -2
  34. package/docs/modules.html +1 -0
  35. package/docs/types/AnySchema.html +1 -1
  36. package/docs/types/Join.html +1 -1
  37. package/docs/types/LanguagesConfig.html +1 -1
  38. package/docs/types/Leaves.html +1 -1
  39. package/docs/types/NoInferType.html +1 -1
  40. package/docs/types/Paths.html +1 -1
  41. package/docs/variables/RXAP_CONFIG.html +1 -1
  42. package/fesm2022/rxap-config.mjs +9 -9
  43. package/fesm2022/rxap-config.mjs.map +1 -1
  44. package/package.json +11 -14
  45. package/theme.css +72 -1
  46. package/esm2022/index.mjs +0 -10
  47. package/esm2022/lib/config-loader.service.mjs +0 -34
  48. package/esm2022/lib/config-testing-service.mjs +0 -33
  49. package/esm2022/lib/config.mjs +0 -2
  50. package/esm2022/lib/config.service.mjs +0 -294
  51. package/esm2022/lib/provide-config.mjs +0 -8
  52. package/esm2022/lib/tokens.mjs +0 -3
  53. package/esm2022/lib/types.mjs +0 -2
  54. package/esm2022/rxap-config.mjs +0 -5
@@ -1,294 +0,0 @@
1
- import { Inject, Injectable, Optional, } from '@angular/core';
2
- import { coerceArray, deepMerge, SetObjectValue, } from '@rxap/utilities';
3
- import { ReplaySubject } from 'rxjs';
4
- import { RXAP_CONFIG } from './tokens';
5
- import * as i0 from "@angular/core";
6
- export class ConfigService {
7
- static { this.onError = new ReplaySubject(1); }
8
- static { this.onRequestError = new ReplaySubject(1); }
9
- static { this.onErrorFnc = []; }
10
- static { this.onRequestErrorFnc = []; }
11
- static { this.Config = null; }
12
- /**
13
- * Static default values for the config object.
14
- * Will be overwritten by an dynamic config file specified in
15
- * the Urls array.
16
- */
17
- static { this.Defaults = {}; }
18
- /**
19
- * Any value definition in the Overwrites object will overwrite any
20
- * value form the Defaults values or dynamic config files
21
- */
22
- static { this.Overwrites = {}; }
23
- static { this.LocalStorageKey = 'rxap/config/local-config'; }
24
- /**
25
- * @deprecated instead use the url property of the ConfigLoadOptions
26
- */
27
- static { this.Urls = []; }
28
- constructor(config = null) {
29
- this.config = ConfigService.Config;
30
- if (config) {
31
- this.config = deepMerge(this.config ?? {}, config);
32
- }
33
- if (!this.config) {
34
- throw new Error('config not available');
35
- }
36
- }
37
- /**
38
- * Used to load the app config from a remote resource.
39
- *
40
- * Promise.all([ ConfigService.Load() ])
41
- * .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
42
- * .catch(err => console.error(err))
43
- *
44
- */
45
- static async Load(options, environment) {
46
- options ??= {};
47
- let config = deepMerge(this.Defaults, {});
48
- if (environment?.config) {
49
- if (typeof environment.config === 'string') {
50
- options.url = environment.config;
51
- }
52
- else {
53
- options.static = environment.config.static;
54
- options.url = environment.config.url;
55
- options.fromUrlParam = environment.config.fromUrlParam;
56
- options.fromLocalStorage = environment.config.fromLocalStorage;
57
- options.schema = environment.config.schema;
58
- }
59
- }
60
- config = deepMerge(config, options?.static ?? {});
61
- const urls = (options?.url ? coerceArray(options.url) : ConfigService.Urls).map(url => {
62
- if (typeof url === 'function') {
63
- if (!environment) {
64
- throw new Error('environment is required when url is a function');
65
- }
66
- return coerceArray(url(environment));
67
- }
68
- return coerceArray(url);
69
- }).flat();
70
- for (const url of urls) {
71
- config = deepMerge(config, await this.loadConfig(url, true, options?.schema));
72
- }
73
- config = deepMerge(config, this.Overwrites);
74
- if (options?.fromLocalStorage !== false) {
75
- const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);
76
- if (localConfig) {
77
- try {
78
- config = deepMerge(config, JSON.parse(localConfig));
79
- }
80
- catch (e) {
81
- console.error('local config could not be parsed');
82
- }
83
- }
84
- }
85
- if (options?.fromUrlParam) {
86
- const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
87
- config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
88
- }
89
- console.debug('app config', config);
90
- this.Config = config;
91
- }
92
- static handleError(error) {
93
- this.onError.next(error);
94
- for (const fnc of this.onErrorFnc) {
95
- try {
96
- fnc(error);
97
- }
98
- catch (e) {
99
- console.error('Error in onErrorFnc', e);
100
- }
101
- }
102
- }
103
- static handleRequestError(response) {
104
- this.onRequestError.next(response);
105
- for (const fnc of this.onRequestErrorFnc) {
106
- try {
107
- fnc(response);
108
- }
109
- catch (e) {
110
- console.error('Error in onRequestErrorFnc', e);
111
- }
112
- }
113
- }
114
- static async loadConfig(url, required, schema) {
115
- let config;
116
- let response;
117
- try {
118
- response = await fetch(url);
119
- }
120
- catch (error) {
121
- const message = `Could not fetch config from '${url}': ${error.message}`;
122
- if (required) {
123
- this.handleError(error);
124
- this.showError(message);
125
- throw new Error(message);
126
- }
127
- else {
128
- console.warn(message);
129
- return null;
130
- }
131
- }
132
- if (!response.ok) {
133
- let message = `Config request results in non ok response for '${url}': (${response.status}) ${response.statusText}`;
134
- switch (response.status) {
135
- case 404:
136
- message = `Config not found at '${url}'`;
137
- break;
138
- case 405:
139
- message = `Config service is not started yet. Wait 30s and try again.`;
140
- break;
141
- case 401:
142
- message = `Unauthorized to fetch config from '${url}'`;
143
- break;
144
- }
145
- if (required) {
146
- this.handleRequestError(response);
147
- this.showError(message);
148
- throw new Error(message);
149
- }
150
- else {
151
- console.warn(message);
152
- return null;
153
- }
154
- }
155
- try {
156
- config = await response.json();
157
- }
158
- catch (error) {
159
- const message = `Could not parse config from '${url}' to a json object: ${error.message}`;
160
- if (required) {
161
- this.handleError(error);
162
- this.showError(message);
163
- throw new Error(message);
164
- }
165
- else {
166
- console.warn(message);
167
- return null;
168
- }
169
- }
170
- if (schema) {
171
- try {
172
- config = await schema.validateAsync(config);
173
- }
174
- catch (error) {
175
- const message = `Config from '${url}' is not valid: ${error.message}`;
176
- if (required) {
177
- this.handleError(error);
178
- this.showError(message);
179
- throw new Error(message);
180
- }
181
- else {
182
- console.warn(message);
183
- return null;
184
- }
185
- }
186
- }
187
- return config;
188
- }
189
- static LoadConfigDefaultFromUrlParam(param = 'config') {
190
- const queryString = window.location.search;
191
- const urlParams = new URLSearchParams(queryString);
192
- const configFromParams = {};
193
- for (const configParam of urlParams.getAll('config')) {
194
- try {
195
- const split = configParam.split(';');
196
- if (split.length === 2) {
197
- const keyPath = split[0];
198
- const value = split[1];
199
- SetObjectValue(configFromParams, keyPath, value);
200
- }
201
- }
202
- catch (e) {
203
- console.warn(`Parsing of url config param failed for '${configParam}': ${e.message}`);
204
- }
205
- }
206
- return configFromParams;
207
- }
208
- static async SideLoad(url, propertyPath, required, schema) {
209
- if (!this.Config) {
210
- throw new Error('Config side load is only possible after the initial config load.');
211
- }
212
- const config = await this.loadConfig(url, required, schema);
213
- SetObjectValue(this.Config, propertyPath, config);
214
- console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);
215
- }
216
- static Get(path, defaultValue, config = this.Config) {
217
- if (!config) {
218
- throw new Error('config not loaded');
219
- }
220
- let configValue = config;
221
- if (typeof path !== 'string') {
222
- throw new Error('The config property path is not a string');
223
- }
224
- for (const fragment of path.split('.')) {
225
- // eslint-disable-next-line no-prototype-builtins
226
- if (configValue.hasOwnProperty(fragment)) {
227
- configValue = configValue[fragment];
228
- }
229
- else {
230
- if (defaultValue !== undefined) {
231
- return defaultValue;
232
- }
233
- console.warn(`Config with path '${path}' not found`);
234
- return undefined;
235
- }
236
- }
237
- return configValue;
238
- }
239
- static showError(message) {
240
- const hasUl = document.getElementById('rxap-config-error') !== null;
241
- const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');
242
- ul.id = 'rxap-config-error';
243
- ul.style.position = 'fixed';
244
- ul.style.bottom = '16px';
245
- ul.style.right = '16px';
246
- ul.style.backgroundColor = 'white';
247
- ul.style.padding = '32px';
248
- ul.style.zIndex = '99999999';
249
- ul.style.color = 'black';
250
- const messageLi = document.createElement('li');
251
- messageLi.innerText = message;
252
- ul.appendChild(messageLi);
253
- const refreshHintLi = document.createElement('li');
254
- refreshHintLi.innerText = 'Please refresh the page to try again.';
255
- ul.appendChild(refreshHintLi);
256
- const autoRefreshHintLi = document.createElement('li');
257
- autoRefreshHintLi.innerText = 'The page will refresh automatically in 30 seconds.';
258
- ul.appendChild(autoRefreshHintLi);
259
- if (!hasUl) {
260
- document.body.appendChild(ul);
261
- }
262
- setTimeout(() => location.reload(), 30000);
263
- }
264
- setLocalConfig(config) {
265
- localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));
266
- }
267
- clearLocalConfig() {
268
- localStorage.removeItem(ConfigService.LocalStorageKey);
269
- }
270
- get(propertyPath, defaultValue) {
271
- return ConfigService.Get(propertyPath, defaultValue, this.config);
272
- }
273
- getOrThrow(propertyPath, defaultValue) {
274
- const value = ConfigService.Get(propertyPath, defaultValue, this.config);
275
- if (value === undefined) {
276
- throw new Error(`Could not find config in path '${propertyPath}'`);
277
- }
278
- return value;
279
- }
280
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
281
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: ConfigService, providedIn: 'root' }); }
282
- }
283
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: ConfigService, decorators: [{
284
- type: Injectable,
285
- args: [{
286
- providedIn: 'root',
287
- }]
288
- }], ctorParameters: () => [{ type: undefined, decorators: [{
289
- type: Optional
290
- }, {
291
- type: Inject,
292
- args: [RXAP_CONFIG]
293
- }] }] });
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL2NvbmZpZy9zcmMvbGliL2NvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxjQUFjLEdBQ2YsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBbUJ2QyxNQUFNLE9BQU8sYUFBYTthQUVWLFlBQU8sR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQUFBaEMsQ0FBaUM7YUFDeEMsbUJBQWMsR0FBRyxJQUFJLGFBQWEsQ0FBVyxDQUFDLENBQUMsQUFBakMsQ0FBa0M7YUFFaEQsZUFBVSxHQUFnQyxFQUFFLEFBQWxDLENBQW1DO2FBQzdDLHNCQUFpQixHQUF3QyxFQUFFLEFBQTFDLENBQTJDO2FBRTVELFdBQU0sR0FBUSxJQUFJLEFBQVosQ0FBYTtJQUVqQzs7OztPQUlHO2FBQ1csYUFBUSxHQUFRLEVBQUUsQUFBVixDQUFXO0lBRWpDOzs7T0FHRzthQUNXLGVBQVUsR0FBUSxFQUFFLEFBQVYsQ0FBVzthQUVyQixvQkFBZSxHQUFHLDBCQUEwQixBQUE3QixDQUE4QjtJQUUzRDs7T0FFRzthQUNXLFNBQUksR0FBRyxFQUFFLEFBQUwsQ0FBTTtJQUd4QixZQUE2QyxTQUFxQixJQUFJO1FBQ3BFLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFD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QUMsTUFBTSxDQUFDLENBQUM7UUFDekUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBbUMsWUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzhHQTVVVSxhQUFhLGtCQStCUSxXQUFXO2tIQS9CaEMsYUFBYSxjQUZaLE1BQU07OzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFnQ2MsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBPcHRpb25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJ0ByeGFwL2Vudmlyb25tZW50JztcbmltcG9ydCB7XG4gIGNvZXJjZUFycmF5LFxuICBkZWVwTWVyZ2UsXG4gIFNldE9iamVjdFZhbHVlLFxufSBmcm9tICdAcnhhcC91dGlsaXRpZXMnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUlhBUF9DT05GSUcgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBOb0luZmVyVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBBbnlTY2hlbWEgPSB7IHZhbGlkYXRlQXN5bmM6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55IH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnTG9hZE9wdGlvbnMge1xuICBmcm9tVXJsUGFyYW0/OiBzdHJpbmcgfCBib29sZWFuO1xuICBmcm9tTG9jYWxTdG9yYWdlPzogYm9vbGVhbjtcbiAgc2NoZW1hPzogQW55U2NoZW1hO1xuICB1cmw/OiBzdHJpbmcgfCBzdHJpbmdbXSB8ICgoZW52aXJvbm1lbnQ6IEVudmlyb25tZW50KSA9PiBzdHJpbmcgfCBzdHJpbmdbXSk7XG4gIC8qKlxuICAgKiBzdGF0aWMgY29uZmlnIHZhbHVlc1xuICAgKi9cbiAgc3RhdGljPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpZ1NlcnZpY2U8Q29uZmlnIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcblxuICBwdWJsaWMgc3RhdGljIG9uRXJyb3IgPSBuZXcgUmVwbGF5U3ViamVjdDx1bmtub3duPigxKTtcbiAgcHVibGljIHN0YXRpYyBvblJlcXVlc3RFcnJvciA9IG5ldyBSZXBsYXlTdWJqZWN0PFJlc3BvbnNlPigxKTtcblxuICBwdWJsaWMgc3RhdGljIG9uRXJyb3JGbmM6IEFycmF5PChlcnJvcjogYW55KSA9PiB2b2lkPiA9IFtdO1xuICBwdWJsaWMgc3RhdGljIG9uUmVxdWVzdEVycm9yRm5jOiBBcnJheTwocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB2b2lkPiA9IFtdO1xuXG4gIHB1YmxpYyBzdGF0aWMgQ29uZmlnOiBhbnkgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBjb25maWcgb2JqZWN0LlxuICAgKiBXaWxsIGJlIG92ZXJ3cml0dGVuIGJ5IGFuIGR5bmFtaWMgY29uZmlnIGZpbGUgc3BlY2lmaWVkIGluXG4gICAqIHRoZSBVcmxzIGFycmF5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0czogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIEFueSB2YWx1ZSBkZWZpbml0aW9uIGluIHRoZSBPdmVyd3JpdGVzIG9iamVjdCB3aWxsIG92ZXJ3cml0ZSBhbnlcbiAgICogdmFsdWUgZm9ybSB0aGUgRGVmYXVsdHMgdmFsdWVzIG9yIGR5bmFtaWMgY29uZmlnIGZpbGVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIE92ZXJ3cml0ZXM6IGFueSA9IHt9O1xuXG4gIHB1YmxpYyBzdGF0aWMgTG9jYWxTdG9yYWdlS2V5ID0gJ3J4YXAvY29uZmlnL2xvY2FsLWNvbmZpZyc7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIGluc3RlYWQgdXNlIHRoZSB1cmwgcHJvcGVydHkgb2YgdGhlIENvbmZpZ0xvYWRPcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIFVybHMgPSBbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZyE6IENvbmZpZztcblxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KFJYQVBfQ09ORklHKSBjb25maWc6IGFueSB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5jb25maWcgPSBDb25maWdTZXJ2aWNlLkNvbmZpZztcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGRlZXBNZXJnZSh0aGlzLmNvbmZpZyA/PyB7fSwgY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWcgbm90IGF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGxvYWQgdGhlIGFwcCBjb25maWcgZnJvbSBhIHJlbW90ZSByZXNvdXJjZS5cbiAgICpcbiAgICogUHJvbWlzZS5hbGwoWyBDb25maWdTZXJ2aWNlLkxvYWQoKSBdKVxuICAgKiAudGhlbigoKSA9PiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSkpXG4gICAqIC5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKVxuICAgKlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBMb2FkKG9wdGlvbnM/OiBDb25maWdMb2FkT3B0aW9ucywgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIG9wdGlvbnMgPz89IHt9O1xuXG4gICAgbGV0IGNvbmZpZzogYW55ID0gZGVlcE1lcmdlKHRoaXMuRGVmYXVsdHMsIHt9KTtcblxuICAgIGlmIChlbnZpcm9ubWVudD8uY29uZmlnKSB7XG4gICAgICBpZiAodHlwZW9mIGVudmlyb25tZW50LmNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3B0aW9ucy51cmwgPSBlbnZpcm9ubWVudC5jb25maWc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLnN0YXRpYyA9IGVudmlyb25tZW50LmNvbmZpZy5zdGF0aWM7XG4gICAgICAgIG9wdGlvbnMudXJsICAgID0gZW52aXJvbm1lbnQuY29uZmlnLnVybDtcbiAgICAgICAgb3B0aW9ucy5mcm9tVXJsUGFyYW0gPSBlbnZpcm9ubWVudC5jb25maWcuZnJvbVVybFBhcmFtO1xuICAgICAgICBvcHRpb25zLmZyb21Mb2NhbFN0b3JhZ2UgPSBlbnZpcm9ubWVudC5jb25maWcuZnJvbUxvY2FsU3RvcmFnZTtcbiAgICAgICAgb3B0aW9ucy5zY2hlbWEgPSBlbnZpcm9ubWVudC5jb25maWcuc2NoZW1hO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpZyA9IGRlZXBNZXJnZShjb25maWcsIG9wdGlvbnM/LnN0YXRpYyA/PyB7fSk7XG5cbiAgICBjb25zdCB1cmxzID0gKG9wdGlvbnM/LnVybCA/IGNvZXJjZUFycmF5KG9wdGlvbnMudXJsKSA6IENvbmZpZ1NlcnZpY2UuVXJscykubWFwKHVybCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoIWVudmlyb25tZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbnZpcm9ubWVudCBpcyByZXF1aXJlZCB3aGVuIHVybCBpcyBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvZXJjZUFycmF5KHVybChlbnZpcm9ubWVudCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvZXJjZUFycmF5KHVybCk7XG4gICAgfSkuZmxhdCgpO1xuXG4gICAgZm9yIChjb25zdCB1cmwgb2YgdXJscykge1xuICAgICAgY29uZmlnID0gZGVlcE1lcmdlKGNvbmZpZywgYXdhaXQgdGhpcy5sb2FkQ29uZmlnKHVybCwgdHJ1ZSwgb3B0aW9ucz8uc2NoZW1hKSk7XG4gICAgfVxuXG4gICAgY29uZmlnID0gZGVlcE1lcmdlKGNvbmZpZywgdGhpcy5PdmVyd3JpdGVzKTtcblxuICAgIGlmIChvcHRpb25zPy5mcm9tTG9jYWxTdG9yYWdlICE9PSBmYWxzZSkge1xuXG4gICAgICBjb25zdCBsb2NhbENvbmZpZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbmZpZ1NlcnZpY2UuTG9jYWxTdG9yYWdlS2V5KTtcblxuICAgICAgaWYgKGxvY2FsQ29uZmlnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uZmlnID0gZGVlcE1lcmdlKGNvbmZpZywgSlNPTi5wYXJzZShsb2NhbENvbmZpZykpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdsb2NhbCBjb25maWcgY291bGQgbm90IGJlIHBhcnNlZCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uZnJvbVVybFBhcmFtKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHR5cGVvZiBvcHRpb25zLmZyb21VcmxQYXJhbSA9PT0gJ3N0cmluZycgPyBvcHRpb25zLmZyb21VcmxQYXJhbSA6ICdjb25maWcnO1xuICAgICAgY29uZmlnID0gZGVlcE1lcmdlKGNvbmZpZywgdGhpcy5Mb2FkQ29uZmlnRGVmYXVsdEZyb21VcmxQYXJhbShwYXJhbSkpO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZGVidWcoJ2FwcCBjb25maWcnLCBjb25maWcpO1xuXG4gICAgdGhpcy5Db25maWcgPSBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBoYW5kbGVFcnJvcihlcnJvcjogYW55KSB7XG4gICAgdGhpcy5vbkVycm9yLm5leHQoZXJyb3IpO1xuICAgIGZvciAoY29uc3QgZm5jIG9mIHRoaXMub25FcnJvckZuYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm5jKGVycm9yKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBvbkVycm9yRm5jJywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaGFuZGxlUmVxdWVzdEVycm9yKHJlc3BvbnNlOiBSZXNwb25zZSkge1xuICAgIHRoaXMub25SZXF1ZXN0RXJyb3IubmV4dChyZXNwb25zZSk7XG4gICAgZm9yIChjb25zdCBmbmMgb2YgdGhpcy5vblJlcXVlc3RFcnJvckZuYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm5jKHJlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBvblJlcXVlc3RFcnJvckZuYycsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGxvYWRDb25maWc8VCA9IGFueT4odXJsOiBzdHJpbmcsIHJlcXVpcmVkPzogYm9vbGVhbiwgc2NoZW1hPzogQW55U2NoZW1hKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuXG4gICAgbGV0IGNvbmZpZzogYW55O1xuICAgIGxldCByZXNwb25zZTogYW55O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYENvdWxkIG5vdCBmZXRjaCBjb25maWcgZnJvbSAnJHsgdXJsIH0nOiAkeyBlcnJvci5tZXNzYWdlIH1gO1xuICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IGBDb25maWcgcmVxdWVzdCByZXN1bHRzIGluIG5vbiBvayByZXNwb25zZSBmb3IgJyR7IHVybCB9JzogKCR7IHJlc3BvbnNlLnN0YXR1cyB9KSAkeyByZXNwb25zZS5zdGF0dXNUZXh0IH1gO1xuICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgbWVzc2FnZSA9IGBDb25maWcgbm90IGZvdW5kIGF0ICckeyB1cmwgfSdgO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwNTpcbiAgICAgICAgICBtZXNzYWdlID0gYENvbmZpZyBzZXJ2aWNlIGlzIG5vdCBzdGFydGVkIHlldC4gV2FpdCAzMHMgYW5kIHRyeSBhZ2Fpbi5gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICBtZXNzYWdlID0gYFVuYXV0aG9yaXplZCB0byBmZXRjaCBjb25maWcgZnJvbSAnJHsgdXJsIH0nYDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBDb3VsZCBub3QgcGFyc2UgY29uZmlnIGZyb20gJyR7IHVybCB9JyB0byBhIGpzb24gb2JqZWN0OiAkeyBlcnJvci5tZXNzYWdlIH1gO1xuICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25maWcgPSBhd2FpdCBzY2hlbWEudmFsaWRhdGVBc3luYyhjb25maWcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYENvbmZpZyBmcm9tICckeyB1cmwgfScgaXMgbm90IHZhbGlkOiAkeyBlcnJvci5tZXNzYWdlIH1gO1xuICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZztcblxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgTG9hZENvbmZpZ0RlZmF1bHRGcm9tVXJsUGFyYW0ocGFyYW0gPSAnY29uZmlnJykge1xuXG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xuICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnlTdHJpbmcpO1xuXG4gICAgY29uc3QgY29uZmlnRnJvbVBhcmFtcyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb25maWdQYXJhbSBvZiB1cmxQYXJhbXMuZ2V0QWxsKCdjb25maWcnKSkge1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzcGxpdCA9IGNvbmZpZ1BhcmFtLnNwbGl0KCc7Jyk7XG4gICAgICAgIGlmIChzcGxpdC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBrZXlQYXRoID0gc3BsaXRbMF07XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFsxXTtcbiAgICAgICAgICBTZXRPYmplY3RWYWx1ZShjb25maWdGcm9tUGFyYW1zLCBrZXlQYXRoLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFBhcnNpbmcgb2YgdXJsIGNvbmZpZyBwYXJhbSBmYWlsZWQgZm9yICckeyBjb25maWdQYXJhbSB9JzogJHsgZS5tZXNzYWdlIH1gKTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdGcm9tUGFyYW1zO1xuXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIFNpZGVMb2FkKFxuICAgIHVybDogc3RyaW5nLFxuICAgIHByb3BlcnR5UGF0aDogc3RyaW5nLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICBzY2hlbWE/OiBBbnlTY2hlbWEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgaWYgKCF0aGlzLkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25maWcgc2lkZSBsb2FkIGlzIG9ubHkgcG9zc2libGUgYWZ0ZXIgdGhlIGluaXRpYWwgY29uZmlnIGxvYWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5sb2FkQ29uZmlnKHVybCwgcmVxdWlyZWQsIHNjaGVtYSk7XG5cbiAgICBTZXRPYmplY3RWYWx1ZSh0aGlzLkNvbmZpZywgcHJvcGVydHlQYXRoLCBjb25maWcpO1xuXG4gICAgY29uc29sZS5kZWJ1ZyhgU2lkZSBsb2FkZWQgY29uZmlnIGZvciAnJHsgcHJvcGVydHlQYXRoIH0nIHN1Y2Nlc3NmdWxgLCB0aGlzLkNvbmZpZyk7XG5cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgR2V0PFQgPSBhbnksIEsgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogVCB8IHVuZGVmaW5lZCxcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICk6IFRcblxuICBwdWJsaWMgc3RhdGljIEdldDxUID0gYW55LCBLIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IE5vSW5mZXJUeXBlPFQ+LFxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHRoaXMuQ29uZmlnLFxuICApOiBUIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWcgbm90IGxvYWRlZCcpO1xuICAgIH1cbiAgICBsZXQgY29uZmlnVmFsdWU6IGFueSA9IGNvbmZpZztcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjb25maWcgcHJvcGVydHkgcGF0aCBpcyBub3QgYSBzdHJpbmcnKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmcmFnbWVudCBvZiAocGF0aCBhcyBhbnkpLnNwbGl0KCcuJykpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIGlmIChjb25maWdWYWx1ZS5oYXNPd25Qcm9wZXJ0eShmcmFnbWVudCkpIHtcbiAgICAgICAgY29uZmlnVmFsdWUgPSBjb25maWdWYWx1ZVtmcmFnbWVudF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihgQ29uZmlnIHdpdGggcGF0aCAnJHsgcGF0aCB9JyBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNob3dFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoYXNVbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyeGFwLWNvbmZpZy1lcnJvcicpICE9PSBudWxsO1xuICAgIGNvbnN0IHVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3J4YXAtY29uZmlnLWVycm9yJykgPz8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICB1bC5pZCA9ICdyeGFwLWNvbmZpZy1lcnJvcic7XG4gICAgdWwuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIHVsLnN0eWxlLmJvdHRvbSA9ICcxNnB4JztcbiAgICB1bC5zdHlsZS5yaWdodCA9ICcxNnB4JztcbiAgICB1bC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xuICAgIHVsLnN0eWxlLnBhZGRpbmcgPSAnMzJweCc7XG4gICAgdWwuc3R5bGUuekluZGV4ID0gJzk5OTk5OTk5JztcbiAgICB1bC5zdHlsZS5jb2xvciA9ICdibGFjayc7XG4gICAgY29uc3QgbWVzc2FnZUxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBtZXNzYWdlTGkuaW5uZXJUZXh0ID0gbWVzc2FnZTtcbiAgICB1bC5hcHBlbmRDaGlsZChtZXNzYWdlTGkpO1xuICAgIGNvbnN0IHJlZnJlc2hIaW50TGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIHJlZnJlc2hIaW50TGkuaW5uZXJUZXh0ID0gJ1BsZWFzZSByZWZyZXNoIHRoZSBwYWdlIHRvIHRyeSBhZ2Fpbi4nO1xuICAgIHVsLmFwcGVuZENoaWxkKHJlZnJlc2hIaW50TGkpO1xuICAgIGNvbnN0IGF1dG9SZWZyZXNoSGludExpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBhdXRvUmVmcmVzaEhpbnRMaS5pbm5lclRleHQgPSAnVGhlIHBhZ2Ugd2lsbCByZWZyZXNoIGF1dG9tYXRpY2FsbHkgaW4gMzAgc2Vjb25kcy4nO1xuICAgIHVsLmFwcGVuZENoaWxkKGF1dG9SZWZyZXNoSGludExpKTtcbiAgICBpZiAoIWhhc1VsKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHVsKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiBsb2NhdGlvbi5yZWxvYWQoKSwgMzAwMDApO1xuICB9XG5cbiAgcHVibGljIHNldExvY2FsQ29uZmlnKGNvbmZpZzogQ29uZmlnKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29uZmlnU2VydmljZS5Mb2NhbFN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTG9jYWxDb25maWcoKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uZmlnU2VydmljZS5Mb2NhbFN0b3JhZ2VLZXkpO1xuICB9XG5cbiAgcHVibGljIGdldDxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBnZXQ8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogTm9JbmZlclR5cGU8VD4pOiBUO1xuICBwdWJsaWMgZ2V0PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIENvbmZpZ1NlcnZpY2UuR2V0KHByb3BlcnR5UGF0aCwgZGVmYXVsdFZhbHVlLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0T3JUaHJvdzxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IFQ7XG4gIHB1YmxpYyBnZXRPclRocm93PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IE5vSW5mZXJUeXBlPFQ+KTogVDtcbiAgcHVibGljIGdldE9yVGhyb3c8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHtcbiAgICBjb25zdCB2YWx1ZSA9IENvbmZpZ1NlcnZpY2UuR2V0KHByb3BlcnR5UGF0aCwgZGVmYXVsdFZhbHVlLCB0aGlzLmNvbmZpZyk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgY29uZmlnIGluIHBhdGggJyR7IHByb3BlcnR5UGF0aCB9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxufVxuIl19
@@ -1,8 +0,0 @@
1
- import { RXAP_CONFIG } from './tokens';
2
- export function ProvideConfig(config = {}) {
3
- return {
4
- provide: RXAP_CONFIG,
5
- useValue: config,
6
- };
7
- }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL2NvbmZpZy9zcmMvbGliL3Byb3ZpZGUtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdkMsTUFBTSxVQUFVLGFBQWEsQ0FBQyxTQUFrQyxFQUFFO0lBQ2hFLE9BQU87UUFDTCxPQUFPLEVBQUUsV0FBVztRQUNwQixRQUFRLEVBQUUsTUFBTTtLQUNqQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJYQVBfQ09ORklHIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gUHJvdmlkZUNvbmZpZyhjb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlOiBSWEFQX0NPTkZJRyxcbiAgICB1c2VWYWx1ZTogY29uZmlnLFxuICB9O1xufVxuIl19
@@ -1,3 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- export const RXAP_CONFIG = new InjectionToken('rxap/config');
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhci9jb25maWcvc3JjL2xpYi90b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgUlhBUF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ3J4YXAvY29uZmlnJyk7XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL2NvbmZpZy9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVjbGFyZSB0eXBlIE5vSW5mZXJUeXBlPFQ+ID0gWyBUIF1bVCBleHRlbmRzIGFueSA/IDAgOiBuZXZlcl07XG5cbnR5cGUgUHJldiA9IFtcbiAgbmV2ZXIsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLFxuICAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgLi4uMFtdXG5dXG5cbmV4cG9ydCB0eXBlIEpvaW48SywgUD4gPSBLIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyID9cbiAgUCBleHRlbmRzIHN0cmluZyB8IG51bWJlciA/XG4gICAgYCR7IEsgfSR7ICcnIGV4dGVuZHMgUCA/ICcnIDogJy4nIH0keyBQIH1gXG4gICAgOiBuZXZlciA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBQYXRoczxULCBEIGV4dGVuZHMgbnVtYmVyID0gMTA+ID0gWyBEIF0gZXh0ZW5kcyBbIG5ldmVyIF0gPyBuZXZlciA6IFQgZXh0ZW5kcyBvYmplY3QgP1xuICB7XG4gICAgW0sgaW4ga2V5b2YgVF0tPzogSyBleHRlbmRzIHN0cmluZyB8IG51bWJlciA/XG4gICAgYCR7IEsgfWAgfCBKb2luPEssIFBhdGhzPFRbS10sIFByZXZbRF0+PlxuICAgIDogbmV2ZXJcbiAgfVtrZXlvZiBUXSA6ICcnO1xuXG5leHBvcnQgdHlwZSBMZWF2ZXM8VCwgRCBleHRlbmRzIG51bWJlciA9IDEwPiA9IFsgRCBdIGV4dGVuZHMgWyBuZXZlciBdID8gbmV2ZXIgOiBUIGV4dGVuZHMgb2JqZWN0ID9cbiAgeyBbSyBpbiBrZXlvZiBUXS0/OiBKb2luPEssIExlYXZlczxUW0tdLCBQcmV2W0RdPj4gfVtrZXlvZiBUXSA6ICcnO1xuIl19
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnhhcC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL2NvbmZpZy9zcmMvcnhhcC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=