@piserve-tech/form-submission 1.3.267 → 1.3.269

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.
@@ -34,7 +34,7 @@ export class FormService {
34
34
  .set('progressiveLoading', progressiveLoading);
35
35
  return this.http.get(`${this.apiUrl}/api/public/forms/${moduleName}`, {
36
36
  headers,
37
- params
37
+ params,
38
38
  });
39
39
  }
40
40
  fetchDataFromDatabase(database) {
@@ -52,54 +52,137 @@ export class FormService {
52
52
  apiConfig.params?.some((p) => p.valueSource === 'PAGE_SIZE');
53
53
  // ---------------------- HEADERS ----------------------
54
54
  let headers = new HttpHeaders();
55
+ // helper: resolve a value (or values) based on valueSource
56
+ // Apply to headers (assuming `headers` is an HttpHeaders instance)
55
57
  if (apiConfig.headers) {
56
58
  apiConfig.headers.forEach((header) => {
57
- if (header.keyName) {
58
- if (header.valueSource === 'SELECTED_VALUES') {
59
- if (selectedValues.length > 0) {
60
- if (header.inputValue === 'SINGLE_VALUE') {
61
- headers = headers.set(header.keyName, selectedValues[0]);
62
- }
63
- else if (header.inputValue === 'ARRAY_OF_VALUES') {
64
- headers = headers.set(header.keyName, selectedValues.join(','));
65
- }
59
+ if (!header.keyName)
60
+ return;
61
+ const rawValue = resolveValueFromSource(header.valueSource, header.inputValue, selectedValues);
62
+ if (header.valueSource === 'SELECTED_VALUES') {
63
+ // Only add header if we have selected values
64
+ if (Array.isArray(rawValue) && rawValue.length > 0) {
65
+ if (header.inputValue === 'SINGLE_VALUE') {
66
+ headers = headers.set(header.keyName, String(rawValue[0]));
66
67
  }
67
- // else skip
68
- }
69
- else if (header.inputValue) {
70
- if (header.keyName.toLowerCase() === 'authorization') {
71
- headers = headers.set(header.keyName, 'Bearer ' + header.inputValue);
68
+ else if (header.inputValue === 'ARRAY_OF_VALUES') {
69
+ // join by comma for headers (common pattern)
70
+ headers = headers.set(header.keyName, rawValue.join(','));
72
71
  }
73
72
  else {
74
- headers = headers.set(header.keyName, header.inputValue);
73
+ // fallback: join
74
+ headers = headers.set(header.keyName, rawValue.join(','));
75
75
  }
76
76
  }
77
+ // no selected values -> skip header
78
+ return;
79
+ }
80
+ // For non-selected sources: skip when unresolved
81
+ if (rawValue === null || rawValue === undefined)
82
+ return;
83
+ // If rawValue is array -> join by comma (headers expect single string)
84
+ const headerValue = Array.isArray(rawValue)
85
+ ? rawValue.join(',')
86
+ : String(rawValue);
87
+ if (header.keyName.toLowerCase() === 'authorization') {
88
+ // add Bearer only when headerValue is truthy (and not already prefixed)
89
+ const token = headerValue.startsWith('Bearer ')
90
+ ? headerValue
91
+ : `Bearer ${headerValue}`;
92
+ headers = headers.set(header.keyName, token);
93
+ }
94
+ else {
95
+ headers = headers.set(header.keyName, headerValue);
77
96
  }
78
97
  });
79
98
  }
80
99
  // ---------------------- PARAMS ----------------------
81
100
  let params = new HttpParams();
101
+ // helper: resolve a value (or values) based on valueSource
102
+ function resolveValueFromSource(valueSource, inputValue, selectedValues = []) {
103
+ if (!valueSource)
104
+ return null;
105
+ switch (valueSource) {
106
+ case 'LOCAL_STORAGE':
107
+ return localStorage.getItem(inputValue); // string or null
108
+ case 'SESSION_STORAGE':
109
+ return sessionStorage.getItem(inputValue); // string or null
110
+ case 'CUSTOM_INPUT':
111
+ case 'QUESTION':
112
+ case 'PAGE_INDEX':
113
+ case 'PAGE_SIZE':
114
+ // inputValue may be a single value or an array/CSV depending on usage
115
+ return inputValue;
116
+ case 'SELECTED_VALUES':
117
+ // For SELECTED_VALUES, return the selectedValues array (caller decides SINGLE/ARRAY behavior)
118
+ return Array.isArray(selectedValues) ? selectedValues : [];
119
+ default:
120
+ console.warn(`Unsupported valueSource for params: ${valueSource}`);
121
+ return null;
122
+ }
123
+ }
124
+ // Usage: build params (assuming `params` is an HttpParams instance)
82
125
  if (apiConfig.params) {
83
126
  apiConfig.params.forEach((param) => {
84
- if (param.keyName) {
85
- if (param.valueSource === 'SELECTED_VALUES') {
86
- // Only add selectedIds if values exist
87
- if (selectedValues.length > 0) {
88
- if (param.inputValue === 'SINGLE_VALUE') {
89
- params = params.set(param.keyName, selectedValues[0]);
90
- }
91
- else if (param.inputValue === 'ARRAY_OF_VALUES') {
92
- selectedValues.forEach((val) => {
93
- params = params.append(param.keyName, val);
94
- });
95
- }
127
+ if (!param.keyName)
128
+ return;
129
+ // Resolve raw value based on source
130
+ const rawValue = resolveValueFromSource(param.valueSource, param.inputValue, selectedValues);
131
+ // If param expects selected values, handle SINGLE_VALUE vs ARRAY_OF_VALUES
132
+ if (param.valueSource === 'SELECTED_VALUES') {
133
+ // Only add if there are actual selected values
134
+ if (Array.isArray(rawValue) && rawValue.length > 0) {
135
+ if (param.inputValue === 'SINGLE_VALUE') {
136
+ // set to first selected value
137
+ params = params.set(param.keyName, rawValue[0]);
138
+ }
139
+ else if (param.inputValue === 'ARRAY_OF_VALUES') {
140
+ // append each selected value as repeated param
141
+ rawValue.forEach((val) => {
142
+ params = params.append(param.keyName, val);
143
+ });
144
+ }
145
+ else {
146
+ // if inputValue not provided, default to array behavior
147
+ rawValue.forEach((val) => {
148
+ params = params.append(param.keyName, val);
149
+ });
96
150
  }
97
- // ❌ If no values, do nothing (skip param entirely)
98
151
  }
99
- else if (param.inputValue) {
100
- // Normal custom or search params
101
- params = params.set(param.keyName, param.inputValue);
152
+ // if no selected values, skip adding this param
153
+ return;
154
+ }
155
+ // For non-selected valueSources: rawValue could be null/undefined/string/array
156
+ if (rawValue === null || rawValue === undefined) {
157
+ // skip adding param when value not found
158
+ return;
159
+ }
160
+ // If inputValue indicates array-of-values (e.g., param.inputValue === 'ARRAY_OF_VALUES'),
161
+ // accept either an array or a comma-separated string
162
+ if (param.inputValue === 'ARRAY_OF_VALUES') {
163
+ if (Array.isArray(rawValue)) {
164
+ rawValue.forEach((val) => {
165
+ params = params.append(param.keyName, val);
166
+ });
167
+ }
168
+ else if (typeof rawValue === 'string') {
169
+ // support comma separated string
170
+ rawValue
171
+ .split(',')
172
+ .map((s) => s.trim())
173
+ .filter(Boolean)
174
+ .forEach((val) => {
175
+ params = params.append(param.keyName, val);
176
+ });
102
177
  }
178
+ else {
179
+ // fallback: convert to string and append
180
+ params = params.append(param.keyName, String(rawValue));
181
+ }
182
+ }
183
+ else {
184
+ // default: set single value
185
+ params = params.set(param.keyName, String(rawValue));
103
186
  }
104
187
  });
105
188
  }
@@ -107,8 +190,25 @@ export class FormService {
107
190
  let url = apiConfig.url;
108
191
  if (apiConfig.pathVariables) {
109
192
  apiConfig.pathVariables.forEach((pathVar) => {
110
- if (pathVar.keyName && pathVar.inputValue) {
111
- url = url.replace(`{${pathVar.keyName}}`, pathVar.inputValue);
193
+ if (pathVar.keyName) {
194
+ let valueToBind = null;
195
+ switch (pathVar.valueSource) {
196
+ case 'LOCAL_STORAGE':
197
+ valueToBind = localStorage.getItem(pathVar.inputValue);
198
+ break;
199
+ case 'SESSION_STORAGE':
200
+ valueToBind = sessionStorage.getItem(pathVar.inputValue);
201
+ break;
202
+ case 'CUSTOM_INPUT':
203
+ case 'QUESTION':
204
+ valueToBind = pathVar.inputValue;
205
+ break;
206
+ default:
207
+ console.warn(`Unsupported valueSource: ${pathVar.valueSource}`);
208
+ }
209
+ if (valueToBind !== null && valueToBind !== undefined) {
210
+ url = url.replace(`{${pathVar.keyName}}`, valueToBind);
211
+ }
112
212
  }
113
213
  });
114
214
  }
@@ -124,7 +224,7 @@ export class FormService {
124
224
  formData.append('recaptchaToken', reCAPTCHAToken);
125
225
  }
126
226
  return this.http.post(url, formData, {
127
- headers
227
+ headers,
128
228
  });
129
229
  }
130
230
  getSubmittedForm(moduleName, submissionId, pageNumber = 1, rowSet = 0, navigateTo) {
@@ -153,7 +253,7 @@ export class FormService {
153
253
  formData.append('recaptchaToken', reCAPTCHAToken);
154
254
  }
155
255
  return this.http.put(url, formData, {
156
- headers
256
+ headers,
157
257
  });
158
258
  }
159
259
  previewFile(url) {
@@ -170,8 +270,9 @@ export class FormService {
170
270
  return this.http.get(this.apiUrl + `/api/cdn/preview${fullUrl}`, options);
171
271
  }
172
272
  getSubformSubmissions(subFormData) {
173
- if (!subFormData?.moduleName || !subFormData?.duplicateSubmission?.sourceSubmissionIds) {
174
- console.error("Invalid subFormData", subFormData);
273
+ if (!subFormData?.moduleName ||
274
+ !subFormData?.duplicateSubmission?.sourceSubmissionIds) {
275
+ console.error('Invalid subFormData', subFormData);
175
276
  return;
176
277
  }
177
278
  // Extract data
@@ -179,8 +280,8 @@ export class FormService {
179
280
  const submissionIds = subFormData.duplicateSubmission.sourceSubmissionIds;
180
281
  // Build query string
181
282
  const queryParams = submissionIds
182
- .map(id => `submissionIds=${encodeURIComponent(id)}`)
183
- .join("&");
283
+ .map((id) => `submissionIds=${encodeURIComponent(id)}`)
284
+ .join('&');
184
285
  // Final URL
185
286
  const url = `${this.apiUrl}/api/public/${moduleName}/subform-submissions?${queryParams}`;
186
287
  // Now make API call
@@ -195,4 +296,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
195
296
  providedIn: 'root',
196
297
  }]
197
298
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.DataService }]; } });
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1zdWJtaXNzaW9uL3NyYy9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBTzNFLE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQW9CLElBQWdCLEVBQVUsV0FBd0I7UUFBbEQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBTDlELFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDNUIsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUtmLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3hELElBQUksU0FBUyxFQUFFO2dCQUNiLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FB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QkFBcUI7UUFDckIsTUFBTSxXQUFXLEdBQUcsYUFBYTthQUM5QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsa0JBQWtCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFYixZQUFZO1FBQ1osTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxlQUFlLFVBQVUsd0JBQXdCLFdBQVcsRUFBRSxDQUFDO1FBRXpGLG9CQUFvQjtRQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7K0dBL01VLFdBQVc7bUhBQVgsV0FBVyxjQUZWLE1BQU07OzRGQUVQLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4vZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBhcGlVcmw6IHN0cmluZyA9ICcnO1xuICBoZWFkZXI6IGFueSA9IHt9O1xuICBwYXJlbnRRdWVzdGlvbnM6IGFueTtcbiAgc3ViZm9ybURhdGE6YW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UpIHtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLmFwaVVybCQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmFwaVVybCA9IGRhdGE7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFTZXJ2aWNlLmhlYWRlciQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmhlYWRlciA9IGRhdGE7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFTZXJ2aWNlLnBhcmVudFF1ZXN0aW9ucyQuc3Vic2NyaWJlKChxdWVzdGlvbnMpID0+IHtcbiAgICAgIGlmIChxdWVzdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRRdWVzdGlvbnMgPSBxdWVzdGlvbnM7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFTZXJ2aWNlLnN1YmZvcm0kLnN1YnNjcmliZSgoZGF0YSk9PntcbiAgICAgIHRoaXMuc3ViZm9ybURhdGEgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBnZXRRdWVzdGlvbnMobW9kdWxlTmFtZTogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIgPSAxLCByb3dTZXQ6IG51bWJlciA9IDAsIHByb2dyZXNzaXZlTG9hZGluZzogYm9vbGVhbj10cnVlKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiB0aGlzLmhlYWRlci5hY2NlcHRlZExhbmd1YWdlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgICAuc2V0KCdwYWdlTnVtYmVyJywgcGFnZU51bWJlci50b1N0cmluZygpKVxuICAgICAgICAuc2V0KCdyb3dTZXQnLCByb3dTZXQudG9TdHJpbmcoKSlcbiAgICAgICAgLnNldCgncHJvZ3Jlc3NpdmVMb2FkaW5nJywgcHJvZ3Jlc3NpdmVMb2FkaW5nKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvZm9ybXMvJHttb2R1bGVOYW1lfWAsIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcGFyYW1zXG4gICAgfSk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tRGF0YWJhc2UoZGF0YWJhc2U6IGFueSkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KGAke3RoaXMuYXBpVXJsfS9hcGkvbG9hZC1mcm9tLWRiYCwgZGF0YWJhc2UsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tTG9va3VwKHRhYmxlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHt0aGlzLmFwaVVybH0vYXBpL3B1YmxpYy9sb29rdXAvJHt0YWJsZU5hbWV9YCk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tRXh0ZXJuYWxBUEkoYXBpQ29uZmlnOiBhbnksIHNlbGVjdGVkVmFsdWVzOiBhbnlbXSA9IFtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIC8vIOKchSBDaGVjayBpZiBwYWdpbmF0aW9uIGV4aXN0c1xuICAgIGNvbnN0IGhhc1BhZ2luYXRpb24gPVxuICAgICAgYXBpQ29uZmlnLnBhcmFtcz8uc29tZSgocDogYW55KSA9PiBwLnZhbHVlU291cmNlID09PSAnUEFHRV9JTkRFWCcpICYmXG4gICAgICBhcGlDb25maWcucGFyYW1zPy5zb21lKChwOiBhbnkpID0+IHAudmFsdWVTb3VyY2UgPT09ICdQQUdFX1NJWkUnKTtcblxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIRUFERVJTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIGlmIChhcGlDb25maWcuaGVhZGVycykge1xuICAgICAgYXBpQ29uZmlnLmhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGhlYWRlci5rZXlOYW1lKSB7XG4gICAgICAgICAgaWYgKGhlYWRlci52YWx1ZVNvdXJjZSA9PT0gJ1NFTEVDVEVEX1ZBTFVFUycpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGlmIChoZWFkZXIuaW5wdXRWYWx1ZSA9PT0gJ1NJTkdMRV9WQUxVRScpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoaGVhZGVyLmtleU5hbWUsIHNlbGVjdGVkVmFsdWVzWzBdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIuaW5wdXRWYWx1ZSA9PT0gJ0FSUkFZX09GX1ZBTFVFUycpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoaGVhZGVyLmtleU5hbWUsIHNlbGVjdGVkVmFsdWVzLmpvaW4oJywnKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOKdjCBlbHNlIHNraXBcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlci5pbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoaGVhZGVyLmtleU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2F1dGhvcml6YXRpb24nKSB7XG4gICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChcbiAgICAgICAgICAgICAgICBoZWFkZXIua2V5TmFtZSxcbiAgICAgICAgICAgICAgICAnQmVhcmVyICcgKyBoZWFkZXIuaW5wdXRWYWx1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGhlYWRlci5rZXlOYW1lLCBoZWFkZXIuaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBUkFNUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaWYgKGFwaUNvbmZpZy5wYXJhbXMpIHtcbiAgICAgIGFwaUNvbmZpZy5wYXJhbXMuZm9yRWFjaCgocGFyYW06IGFueSkgPT4ge1xuICAgICAgICBpZiAocGFyYW0ua2V5TmFtZSkge1xuICAgICAgICAgIGlmIChwYXJhbS52YWx1ZVNvdXJjZSA9PT0gJ1NFTEVDVEVEX1ZBTFVFUycpIHtcbiAgICAgICAgICAgIC8vIOKchSBPbmx5IGFkZCBzZWxlY3RlZElkcyBpZiB2YWx1ZXMgZXhpc3RcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGlmIChwYXJhbS5pbnB1dFZhbHVlID09PSAnU0lOR0xFX1ZBTFVFJykge1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQocGFyYW0ua2V5TmFtZSwgc2VsZWN0ZWRWYWx1ZXNbMF0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmlucHV0VmFsdWUgPT09ICdBUlJBWV9PRl9WQUxVRVMnKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHBhcmFtLmtleU5hbWUsIHZhbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOKdjCBJZiBubyB2YWx1ZXMsIGRvIG5vdGhpbmcgKHNraXAgcGFyYW0gZW50aXJlbHkpXG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5pbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICAvLyBOb3JtYWwgY3VzdG9tIG9yIHNlYXJjaCBwYXJhbXNcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQocGFyYW0ua2V5TmFtZSwgcGFyYW0uaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBVEggVkFSSUFCTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgdXJsID0gYXBpQ29uZmlnLnVybDtcbiAgICBpZiAoYXBpQ29uZmlnLnBhdGhWYXJpYWJsZXMpIHtcbiAgICAgIGFwaUNvbmZpZy5wYXRoVmFyaWFibGVzLmZvckVhY2goKHBhdGhWYXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocGF0aFZhci5rZXlOYW1lICYmIHBhdGhWYXIuaW5wdXRWYWx1ZSkge1xuICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGB7JHtwYXRoVmFyLmtleU5hbWV9fWAsIHBhdGhWYXIuaW5wdXRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklOQUwgQ0FMTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55Pih1cmwsIHsgaGVhZGVycywgcGFyYW1zIH0pO1xuICB9XG5cbiAgc3VibWl0Rm9ybShtb2R1bGVOYW1lOiBzdHJpbmcsIGZvcm1EYXRhOiBGb3JtRGF0YSwgcmVDQVBUQ0hBVG9rZW4/OnN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQXV0aC11c2VyJzogdGhpcy5oZWFkZXIuYXV0aFVzZXIsXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvZm9ybXMvJHttb2R1bGVOYW1lfS9zdWJtaXNzaW9uc2A7XG4gICAgaWYgKHJlQ0FQVENIQVRva2VuKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ3JlY2FwdGNoYVRva2VuJywgcmVDQVBUQ0hBVG9rZW4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodXJsLCBmb3JtRGF0YSwge1xuICAgICAgaGVhZGVyc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0U3VibWl0dGVkRm9ybShtb2R1bGVOYW1lOiBzdHJpbmcsIHN1Ym1pc3Npb25JZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIgPSAxLCByb3dTZXQ6IG51bWJlciA9IDAsbmF2aWdhdGVUbz86c3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgLnNldCgncGFnZU51bWJlcicsIHBhZ2VOdW1iZXIudG9TdHJpbmcoKSlcbiAgICAgIC5zZXQoJ3Jvd1NldCcsIHJvd1NldC50b1N0cmluZygpKTtcbiAgICAgIGlmKG5hdmlnYXRlVG8pe1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYXZpZ2F0ZUlkJywgbmF2aWdhdGVUbyk7XG4gICAgICB9XG5cbiAgICBpZiAodGhpcy5wYXJlbnRRdWVzdGlvbnMpIHtcbiAgICAgIHRoaXMucGFyZW50UXVlc3Rpb25zLmZvckVhY2goKHE6IGFueSkgPT4ge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCdwYXJlbnRRdWVzdGlvbnMnLCBxKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiB0aGlzLmhlYWRlci5hY2NlcHRlZExhbmd1YWdlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYCR7dGhpcy5hcGlVcmx9L2FwaS9mb3Jtcy8ke21vZHVsZU5hbWV9L3N1Ym1pc3Npb25zLyR7c3VibWlzc2lvbklkfWAsIHtoZWFkZXJzLCBwYXJhbXMgfSk7XG4gIH1cblxuICB1cGRhdGVGb3JtKG1vZHVsZU5hbWU6IHN0cmluZywgc3VibWlzc2lvbklkOiBzdHJpbmcsIGZvcm1EYXRhOiBGb3JtRGF0YSwgcmVDQVBUQ0hBVG9rZW4/OnN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQXV0aC11c2VyJzogdGhpcy5oZWFkZXIuYXV0aFVzZXIsXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvZm9ybXMvJHttb2R1bGVOYW1lfS9zdWJtaXNzaW9ucy8ke3N1Ym1pc3Npb25JZH1gO1xuICAgIGlmIChyZUNBUFRDSEFUb2tlbikge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdyZWNhcHRjaGFUb2tlbicsIHJlQ0FQVENIQVRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8YW55Pih1cmwsIGZvcm1EYXRhLCB7XG4gICAgICBoZWFkZXJzXG4gICAgfSk7XG4gIH1cbiAgcHJldmlld0ZpbGUodXJsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHRoaXMuaGVhZGVyLmNvbnRlbnRUeXBlLFxuICAgICAgJ2F1dGgtdXNlcic6IHRoaXMuaGVhZGVyLmF1dGhVc2VyLFxuICAgIH0pO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgIH07XG4gICAgY29uc3QgZmlsZVVybCA9IHVybDtcbiAgICBjb25zdCBlbmNvZGVkRmlsZVVybCA9IGVuY29kZVVSSUNvbXBvbmVudChmaWxlVXJsKTtcbiAgICBjb25zdCBmdWxsVXJsID0gYD91cmw9JHtlbmNvZGVkRmlsZVVybH1gO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4odGhpcy5hcGlVcmwgKyBgL2FwaS9jZG4vcHJldmlldyR7ZnVsbFVybH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldFN1YmZvcm1TdWJtaXNzaW9ucyhzdWJGb3JtRGF0YTogYW55KSB7XG4gICAgaWYgKCFzdWJGb3JtRGF0YT8ubW9kdWxlTmFtZSB8fCAhc3ViRm9ybURhdGE/LmR1cGxpY2F0ZVN1Ym1pc3Npb24/LnNvdXJjZVN1Ym1pc3Npb25JZHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIHN1YkZvcm1EYXRhXCIsIHN1YkZvcm1EYXRhKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cblxuICAgIC8vIEV4dHJhY3QgZGF0YVxuICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBzdWJGb3JtRGF0YS5tb2R1bGVOYW1lO1xuICAgIGNvbnN0IHN1Ym1pc3Npb25JZHM6IHN0cmluZ1tdID0gc3ViRm9ybURhdGEuZHVwbGljYXRlU3VibWlzc2lvbi5zb3VyY2VTdWJtaXNzaW9uSWRzO1xuXG4gICAgLy8gQnVpbGQgcXVlcnkgc3RyaW5nXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBzdWJtaXNzaW9uSWRzXG4gICAgICAubWFwKGlkID0+IGBzdWJtaXNzaW9uSWRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gKVxuICAgICAgLmpvaW4oXCImXCIpO1xuXG4gICAgLy8gRmluYWwgVVJMXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvJHttb2R1bGVOYW1lfS9zdWJmb3JtLXN1Ym1pc3Npb25zPyR7cXVlcnlQYXJhbXN9YDtcblxuICAgIC8vIE5vdyBtYWtlIEFQSSBjYWxsXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKTtcbiAgfVxuXG5cbn1cbiJdfQ==
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1zdWJtaXNzaW9uL3NyYy9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBTzNFLE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQW9CLElBQWdCLEVBQVUsV0FBd0I7UUFBbEQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBTDlELFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDNUIsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUtmLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3hELElBQUksU0FBUyxFQUFFO2dCQUNiLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FB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RUFBRSxXQUFXLENBQUMsQ0FBQztZQUNsRCxPQUFPO1NBQ1I7UUFFRCxlQUFlO1FBQ2YsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUMxQyxNQUFNLGFBQWEsR0FDakIsV0FBVyxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDO1FBRXRELHFCQUFxQjtRQUNyQixNQUFNLFdBQVcsR0FBRyxhQUFhO2FBQzlCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsaUJBQWlCLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7YUFDdEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWIsWUFBWTtRQUNaLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sZUFBZSxVQUFVLHdCQUF3QixXQUFXLEVBQUUsQ0FBQztRQUV6RixvQkFBb0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDOytHQXhXVSxXQUFXO21IQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuL2RhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtU2VydmljZSB7XG4gIHByaXZhdGUgYXBpVXJsOiBzdHJpbmcgPSAnJztcbiAgaGVhZGVyOiBhbnkgPSB7fTtcbiAgcGFyZW50UXVlc3Rpb25zOiBhbnk7XG4gIHN1YmZvcm1EYXRhOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSkge1xuICAgIHRoaXMuZGF0YVNlcnZpY2UuYXBpVXJsJC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuYXBpVXJsID0gZGF0YTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNlcnZpY2UuaGVhZGVyJC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuaGVhZGVyID0gZGF0YTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNlcnZpY2UucGFyZW50UXVlc3Rpb25zJC5zdWJzY3JpYmUoKHF1ZXN0aW9ucykgPT4ge1xuICAgICAgaWYgKHF1ZXN0aW9ucykge1xuICAgICAgICB0aGlzLnBhcmVudFF1ZXN0aW9ucyA9IHF1ZXN0aW9ucztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNlcnZpY2Uuc3ViZm9ybSQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLnN1YmZvcm1EYXRhID0gZGF0YTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFF1ZXN0aW9ucyhcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyID0gMSxcbiAgICByb3dTZXQ6IG51bWJlciA9IDAsXG4gICAgcHJvZ3Jlc3NpdmVMb2FkaW5nOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiB0aGlzLmhlYWRlci5hY2NlcHRlZExhbmd1YWdlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgLnNldCgncGFnZU51bWJlcicsIHBhZ2VOdW1iZXIudG9TdHJpbmcoKSlcbiAgICAgIC5zZXQoJ3Jvd1NldCcsIHJvd1NldC50b1N0cmluZygpKVxuICAgICAgLnNldCgncHJvZ3Jlc3NpdmVMb2FkaW5nJywgcHJvZ3Jlc3NpdmVMb2FkaW5nKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvZm9ybXMvJHttb2R1bGVOYW1lfWAsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBwYXJhbXMsXG4gICAgfSk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tRGF0YWJhc2UoZGF0YWJhc2U6IGFueSkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KGAke3RoaXMuYXBpVXJsfS9hcGkvbG9hZC1mcm9tLWRiYCwgZGF0YWJhc2UsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tTG9va3VwKHRhYmxlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHt0aGlzLmFwaVVybH0vYXBpL3B1YmxpYy9sb29rdXAvJHt0YWJsZU5hbWV9YCk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tRXh0ZXJuYWxBUEkoXG4gICAgYXBpQ29uZmlnOiBhbnksXG4gICAgc2VsZWN0ZWRWYWx1ZXM6IGFueVtdID0gW11cbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAvLyDinIUgQ2hlY2sgaWYgcGFnaW5hdGlvbiBleGlzdHNcbiAgICBjb25zdCBoYXNQYWdpbmF0aW9uID1cbiAgICAgIGFwaUNvbmZpZy5wYXJhbXM/LnNvbWUoKHA6IGFueSkgPT4gcC52YWx1ZVNvdXJjZSA9PT0gJ1BBR0VfSU5ERVgnKSAmJlxuICAgICAgYXBpQ29uZmlnLnBhcmFtcz8uc29tZSgocDogYW55KSA9PiBwLnZhbHVlU291cmNlID09PSAnUEFHRV9TSVpFJyk7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhFQURFUlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgLy8gaGVscGVyOiByZXNvbHZlIGEgdmFsdWUgKG9yIHZhbHVlcykgYmFzZWQgb24gdmFsdWVTb3VyY2VcblxuICAgIC8vIEFwcGx5IHRvIGhlYWRlcnMgKGFzc3VtaW5nIGBoZWFkZXJzYCBpcyBhbiBIdHRwSGVhZGVycyBpbnN0YW5jZSlcbiAgICBpZiAoYXBpQ29uZmlnLmhlYWRlcnMpIHtcbiAgICAgIGFwaUNvbmZpZy5oZWFkZXJzLmZvckVhY2goKGhlYWRlcjogYW55KSA9PiB7XG4gICAgICAgIGlmICghaGVhZGVyLmtleU5hbWUpIHJldHVybjtcblxuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHJlc29sdmVWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICAgICAgaGVhZGVyLnZhbHVlU291cmNlLFxuICAgICAgICAgIGhlYWRlci5pbnB1dFZhbHVlLFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWVzXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGhlYWRlci52YWx1ZVNvdXJjZSA9PT0gJ1NFTEVDVEVEX1ZBTFVFUycpIHtcbiAgICAgICAgICAvLyBPbmx5IGFkZCBoZWFkZXIgaWYgd2UgaGF2ZSBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkgJiYgcmF3VmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGhlYWRlci5pbnB1dFZhbHVlID09PSAnU0lOR0xFX1ZBTFVFJykge1xuICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoaGVhZGVyLmtleU5hbWUsIFN0cmluZyhyYXdWYWx1ZVswXSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIuaW5wdXRWYWx1ZSA9PT0gJ0FSUkFZX09GX1ZBTFVFUycpIHtcbiAgICAgICAgICAgICAgLy8gam9pbiBieSBjb21tYSBmb3IgaGVhZGVycyAoY29tbW9uIHBhdHRlcm4pXG4gICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChoZWFkZXIua2V5TmFtZSwgcmF3VmFsdWUuam9pbignLCcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBqb2luXG4gICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChoZWFkZXIua2V5TmFtZSwgcmF3VmFsdWUuam9pbignLCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gbm8gc2VsZWN0ZWQgdmFsdWVzIC0+IHNraXAgaGVhZGVyXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yIG5vbi1zZWxlY3RlZCBzb3VyY2VzOiBza2lwIHdoZW4gdW5yZXNvbHZlZFxuICAgICAgICBpZiAocmF3VmFsdWUgPT09IG51bGwgfHwgcmF3VmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHJhd1ZhbHVlIGlzIGFycmF5IC0+IGpvaW4gYnkgY29tbWEgKGhlYWRlcnMgZXhwZWN0IHNpbmdsZSBzdHJpbmcpXG4gICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gQXJyYXkuaXNBcnJheShyYXdWYWx1ZSlcbiAgICAgICAgICA/IHJhd1ZhbHVlLmpvaW4oJywnKVxuICAgICAgICAgIDogU3RyaW5nKHJhd1ZhbHVlKTtcblxuICAgICAgICBpZiAoaGVhZGVyLmtleU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2F1dGhvcml6YXRpb24nKSB7XG4gICAgICAgICAgLy8gYWRkIEJlYXJlciBvbmx5IHdoZW4gaGVhZGVyVmFsdWUgaXMgdHJ1dGh5IChhbmQgbm90IGFscmVhZHkgcHJlZml4ZWQpXG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBoZWFkZXJWYWx1ZS5zdGFydHNXaXRoKCdCZWFyZXIgJylcbiAgICAgICAgICAgID8gaGVhZGVyVmFsdWVcbiAgICAgICAgICAgIDogYEJlYXJlciAke2hlYWRlclZhbHVlfWA7XG4gICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGhlYWRlci5rZXlOYW1lLCB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGhlYWRlci5rZXlOYW1lLCBoZWFkZXJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUEFSQU1TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICAvLyBoZWxwZXI6IHJlc29sdmUgYSB2YWx1ZSAob3IgdmFsdWVzKSBiYXNlZCBvbiB2YWx1ZVNvdXJjZVxuICAgIGZ1bmN0aW9uIHJlc29sdmVWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICB2YWx1ZVNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgaW5wdXRWYWx1ZTogYW55LFxuICAgICAgc2VsZWN0ZWRWYWx1ZXM6IGFueVtdID0gW11cbiAgICApIHtcbiAgICAgIGlmICghdmFsdWVTb3VyY2UpIHJldHVybiBudWxsO1xuXG4gICAgICBzd2l0Y2ggKHZhbHVlU291cmNlKSB7XG4gICAgICAgIGNhc2UgJ0xPQ0FMX1NUT1JBR0UnOlxuICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShpbnB1dFZhbHVlKTsgLy8gc3RyaW5nIG9yIG51bGxcblxuICAgICAgICBjYXNlICdTRVNTSU9OX1NUT1JBR0UnOlxuICAgICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGlucHV0VmFsdWUpOyAvLyBzdHJpbmcgb3IgbnVsbFxuXG4gICAgICAgIGNhc2UgJ0NVU1RPTV9JTlBVVCc6XG4gICAgICAgIGNhc2UgJ1FVRVNUSU9OJzpcbiAgICAgICAgY2FzZSAnUEFHRV9JTkRFWCcgOlxuICAgICAgICBjYXNlICdQQUdFX1NJWkUnIDogXG4gICAgICAgICAgLy8gaW5wdXRWYWx1ZSBtYXkgYmUgYSBzaW5nbGUgdmFsdWUgb3IgYW4gYXJyYXkvQ1NWIGRlcGVuZGluZyBvbiB1c2FnZVxuICAgICAgICAgIHJldHVybiBpbnB1dFZhbHVlO1xuXG4gICAgICAgIGNhc2UgJ1NFTEVDVEVEX1ZBTFVFUyc6XG4gICAgICAgICAgLy8gRm9yIFNFTEVDVEVEX1ZBTFVFUywgcmV0dXJuIHRoZSBzZWxlY3RlZFZhbHVlcyBhcnJheSAoY2FsbGVyIGRlY2lkZXMgU0lOR0xFL0FSUkFZIGJlaGF2aW9yKVxuICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNlbGVjdGVkVmFsdWVzKSA/IHNlbGVjdGVkVmFsdWVzIDogW107XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFVuc3VwcG9ydGVkIHZhbHVlU291cmNlIGZvciBwYXJhbXM6ICR7dmFsdWVTb3VyY2V9YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXNhZ2U6IGJ1aWxkIHBhcmFtcyAoYXNzdW1pbmcgYHBhcmFtc2AgaXMgYW4gSHR0cFBhcmFtcyBpbnN0YW5jZSlcbiAgICBpZiAoYXBpQ29uZmlnLnBhcmFtcykge1xuICAgICAgYXBpQ29uZmlnLnBhcmFtcy5mb3JFYWNoKChwYXJhbTogYW55KSA9PiB7XG4gICAgICAgIGlmICghcGFyYW0ua2V5TmFtZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFJlc29sdmUgcmF3IHZhbHVlIGJhc2VkIG9uIHNvdXJjZVxuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHJlc29sdmVWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICAgICAgcGFyYW0udmFsdWVTb3VyY2UsXG4gICAgICAgICAgcGFyYW0uaW5wdXRWYWx1ZSxcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlc1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIElmIHBhcmFtIGV4cGVjdHMgc2VsZWN0ZWQgdmFsdWVzLCBoYW5kbGUgU0lOR0xFX1ZBTFVFIHZzIEFSUkFZX09GX1ZBTFVFU1xuICAgICAgICBpZiAocGFyYW0udmFsdWVTb3VyY2UgPT09ICdTRUxFQ1RFRF9WQUxVRVMnKSB7XG4gICAgICAgICAgLy8gT25seSBhZGQgaWYgdGhlcmUgYXJlIGFjdHVhbCBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkgJiYgcmF3VmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHBhcmFtLmlucHV0VmFsdWUgPT09ICdTSU5HTEVfVkFMVUUnKSB7XG4gICAgICAgICAgICAgIC8vIHNldCB0byBmaXJzdCBzZWxlY3RlZCB2YWx1ZVxuICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KHBhcmFtLmtleU5hbWUsIHJhd1ZhbHVlWzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uaW5wdXRWYWx1ZSA9PT0gJ0FSUkFZX09GX1ZBTFVFUycpIHtcbiAgICAgICAgICAgICAgLy8gYXBwZW5kIGVhY2ggc2VsZWN0ZWQgdmFsdWUgYXMgcmVwZWF0ZWQgcGFyYW1cbiAgICAgICAgICAgICAgcmF3VmFsdWUuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHBhcmFtLmtleU5hbWUsIHZhbCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gaWYgaW5wdXRWYWx1ZSBub3QgcHJvdmlkZWQsIGRlZmF1bHQgdG8gYXJyYXkgYmVoYXZpb3JcbiAgICAgICAgICAgICAgcmF3VmFsdWUuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHBhcmFtLmtleU5hbWUsIHZhbCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBubyBzZWxlY3RlZCB2YWx1ZXMsIHNraXAgYWRkaW5nIHRoaXMgcGFyYW1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3Igbm9uLXNlbGVjdGVkIHZhbHVlU291cmNlczogcmF3VmFsdWUgY291bGQgYmUgbnVsbC91bmRlZmluZWQvc3RyaW5nL2FycmF5XG4gICAgICAgIGlmIChyYXdWYWx1ZSA9PT0gbnVsbCB8fCByYXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gc2tpcCBhZGRpbmcgcGFyYW0gd2hlbiB2YWx1ZSBub3QgZm91bmRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBpbnB1dFZhbHVlIGluZGljYXRlcyBhcnJheS1vZi12YWx1ZXMgKGUuZy4sIHBhcmFtLmlucHV0VmFsdWUgPT09ICdBUlJBWV9PRl9WQUxVRVMnKSxcbiAgICAgICAgLy8gYWNjZXB0IGVpdGhlciBhbiBhcnJheSBvciBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcbiAgICAgICAgaWYgKHBhcmFtLmlucHV0VmFsdWUgPT09ICdBUlJBWV9PRl9WQUxVRVMnKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmF3VmFsdWUpKSB7XG4gICAgICAgICAgICByYXdWYWx1ZS5mb3JFYWNoKCh2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHBhcmFtLmtleU5hbWUsIHZhbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByYXdWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29tbWEgc2VwYXJhdGVkIHN0cmluZ1xuICAgICAgICAgICAgcmF3VmFsdWVcbiAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgLmZvckVhY2goKHZhbDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChwYXJhbS5rZXlOYW1lLCB2YWwpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZmFsbGJhY2s6IGNvbnZlcnQgdG8gc3RyaW5nIGFuZCBhcHBlbmRcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQocGFyYW0ua2V5TmFtZSwgU3RyaW5nKHJhd1ZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGRlZmF1bHQ6IHNldCBzaW5nbGUgdmFsdWVcbiAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KHBhcmFtLmtleU5hbWUsIFN0cmluZyhyYXdWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBVEggVkFSSUFCTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgdXJsID0gYXBpQ29uZmlnLnVybDtcbiAgICBpZiAoYXBpQ29uZmlnLnBhdGhWYXJpYWJsZXMpIHtcbiAgICAgIGFwaUNvbmZpZy5wYXRoVmFyaWFibGVzLmZvckVhY2goKHBhdGhWYXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocGF0aFZhci5rZXlOYW1lKSB7XG4gICAgICAgICAgbGV0IHZhbHVlVG9CaW5kOiBhbnkgPSBudWxsO1xuXG4gICAgICAgICAgc3dpdGNoIChwYXRoVmFyLnZhbHVlU291cmNlKSB7XG4gICAgICAgICAgICBjYXNlICdMT0NBTF9TVE9SQUdFJzpcbiAgICAgICAgICAgICAgdmFsdWVUb0JpbmQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShwYXRoVmFyLmlucHV0VmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnU0VTU0lPTl9TVE9SQUdFJzpcbiAgICAgICAgICAgICAgdmFsdWVUb0JpbmQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHBhdGhWYXIuaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdDVVNUT01fSU5QVVQnOlxuICAgICAgICAgICAgY2FzZSAnUVVFU1RJT04nOlxuICAgICAgICAgICAgICB2YWx1ZVRvQmluZCA9IHBhdGhWYXIuaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgVW5zdXBwb3J0ZWQgdmFsdWVTb3VyY2U6ICR7cGF0aFZhci52YWx1ZVNvdXJjZX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWVUb0JpbmQgIT09IG51bGwgJiYgdmFsdWVUb0JpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoYHske3BhdGhWYXIua2V5TmFtZX19YCwgdmFsdWVUb0JpbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSU5BTCBDQUxMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KHVybCwgeyBoZWFkZXJzLCBwYXJhbXMgfSk7XG4gIH1cblxuICBzdWJtaXRGb3JtKFxuICAgIG1vZHVsZU5hbWU6IHN0cmluZyxcbiAgICBmb3JtRGF0YTogRm9ybURhdGEsXG4gICAgcmVDQVBUQ0hBVG9rZW4/OiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdBdXRoLXVzZXInOiB0aGlzLmhlYWRlci5hdXRoVXNlcixcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaVVybH0vYXBpL3B1YmxpYy9mb3Jtcy8ke21vZHVsZU5hbWV9L3N1Ym1pc3Npb25zYDtcbiAgICBpZiAocmVDQVBUQ0hBVG9rZW4pIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgncmVjYXB0Y2hhVG9rZW4nLCByZUNBUFRDSEFUb2tlbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIGZvcm1EYXRhLCB7XG4gICAgICBoZWFkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0U3VibWl0dGVkRm9ybShcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgc3VibWlzc2lvbklkOiBzdHJpbmcsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyID0gMSxcbiAgICByb3dTZXQ6IG51bWJlciA9IDAsXG4gICAgbmF2aWdhdGVUbz86IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAuc2V0KCdwYWdlTnVtYmVyJywgcGFnZU51bWJlci50b1N0cmluZygpKVxuICAgICAgLnNldCgncm93U2V0Jywgcm93U2V0LnRvU3RyaW5nKCkpO1xuICAgIGlmIChuYXZpZ2F0ZVRvKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYXZpZ2F0ZUlkJywgbmF2aWdhdGVUbyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFyZW50UXVlc3Rpb25zKSB7XG4gICAgICB0aGlzLnBhcmVudFF1ZXN0aW9ucy5mb3JFYWNoKChxOiBhbnkpID0+IHtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgncGFyZW50UXVlc3Rpb25zJywgcSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQWNjZXB0LUxhbmd1YWdlJzogdGhpcy5oZWFkZXIuYWNjZXB0ZWRMYW5ndWFnZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KFxuICAgICAgYCR7dGhpcy5hcGlVcmx9L2FwaS9mb3Jtcy8ke21vZHVsZU5hbWV9L3N1Ym1pc3Npb25zLyR7c3VibWlzc2lvbklkfWAsXG4gICAgICB7IGhlYWRlcnMsIHBhcmFtcyB9XG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUZvcm0oXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICAgIHN1Ym1pc3Npb25JZDogc3RyaW5nLFxuICAgIGZvcm1EYXRhOiBGb3JtRGF0YSxcbiAgICByZUNBUFRDSEFUb2tlbj86IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0F1dGgtdXNlcic6IHRoaXMuaGVhZGVyLmF1dGhVc2VyLFxuICAgIH0pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpVXJsfS9hcGkvcHVibGljL2Zvcm1zLyR7bW9kdWxlTmFtZX0vc3VibWlzc2lvbnMvJHtzdWJtaXNzaW9uSWR9YDtcbiAgICBpZiAocmVDQVBUQ0hBVG9rZW4pIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgncmVjYXB0Y2hhVG9rZW4nLCByZUNBUFRDSEFUb2tlbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PGFueT4odXJsLCBmb3JtRGF0YSwge1xuICAgICAgaGVhZGVycyxcbiAgICB9KTtcbiAgfVxuICBwcmV2aWV3RmlsZSh1cmw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogdGhpcy5oZWFkZXIuY29udGVudFR5cGUsXG4gICAgICAnYXV0aC11c2VyJzogdGhpcy5oZWFkZXIuYXV0aFVzZXIsXG4gICAgfSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgfTtcbiAgICBjb25zdCBmaWxlVXJsID0gdXJsO1xuICAgIGNvbnN0IGVuY29kZWRGaWxlVXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVVcmwpO1xuICAgIGNvbnN0IGZ1bGxVcmwgPSBgP3VybD0ke2VuY29kZWRGaWxlVXJsfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihcbiAgICAgIHRoaXMuYXBpVXJsICsgYC9hcGkvY2RuL3ByZXZpZXcke2Z1bGxVcmx9YCxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICB9XG5cbiAgZ2V0U3ViZm9ybVN1Ym1pc3Npb25zKHN1YkZvcm1EYXRhOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICAhc3ViRm9ybURhdGE/Lm1vZHVsZU5hbWUgfHxcbiAgICAgICFzdWJGb3JtRGF0YT8uZHVwbGljYXRlU3VibWlzc2lvbj8uc291cmNlU3VibWlzc2lvbklkc1xuICAgICkge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBzdWJGb3JtRGF0YScsIHN1YkZvcm1EYXRhKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGRhdGFcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gc3ViRm9ybURhdGEubW9kdWxlTmFtZTtcbiAgICBjb25zdCBzdWJtaXNzaW9uSWRzOiBzdHJpbmdbXSA9XG4gICAgICBzdWJGb3JtRGF0YS5kdXBsaWNhdGVTdWJtaXNzaW9uLnNvdXJjZVN1Ym1pc3Npb25JZHM7XG5cbiAgICAvLyBCdWlsZCBxdWVyeSBzdHJpbmdcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHN1Ym1pc3Npb25JZHNcbiAgICAgIC5tYXAoKGlkKSA9PiBgc3VibWlzc2lvbklkcz0ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YClcbiAgICAgIC5qb2luKCcmJyk7XG5cbiAgICAvLyBGaW5hbCBVUkxcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaVVybH0vYXBpL3B1YmxpYy8ke21vZHVsZU5hbWV9L3N1YmZvcm0tc3VibWlzc2lvbnM/JHtxdWVyeVBhcmFtc31gO1xuXG4gICAgLy8gTm93IG1ha2UgQVBJIGNhbGxcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwpO1xuICB9XG59XG4iXX0=
@@ -1093,7 +1093,7 @@ class FormService {
1093
1093
  .set('progressiveLoading', progressiveLoading);
1094
1094
  return this.http.get(`${this.apiUrl}/api/public/forms/${moduleName}`, {
1095
1095
  headers,
1096
- params
1096
+ params,
1097
1097
  });
1098
1098
  }
1099
1099
  fetchDataFromDatabase(database) {
@@ -1111,63 +1111,163 @@ class FormService {
1111
1111
  apiConfig.params?.some((p) => p.valueSource === 'PAGE_SIZE');
1112
1112
  // ---------------------- HEADERS ----------------------
1113
1113
  let headers = new HttpHeaders();
1114
+ // helper: resolve a value (or values) based on valueSource
1115
+ // Apply to headers (assuming `headers` is an HttpHeaders instance)
1114
1116
  if (apiConfig.headers) {
1115
1117
  apiConfig.headers.forEach((header) => {
1116
- if (header.keyName) {
1117
- if (header.valueSource === 'SELECTED_VALUES') {
1118
- if (selectedValues.length > 0) {
1119
- if (header.inputValue === 'SINGLE_VALUE') {
1120
- headers = headers.set(header.keyName, selectedValues[0]);
1121
- }
1122
- else if (header.inputValue === 'ARRAY_OF_VALUES') {
1123
- headers = headers.set(header.keyName, selectedValues.join(','));
1124
- }
1118
+ if (!header.keyName)
1119
+ return;
1120
+ const rawValue = resolveValueFromSource(header.valueSource, header.inputValue, selectedValues);
1121
+ if (header.valueSource === 'SELECTED_VALUES') {
1122
+ // Only add header if we have selected values
1123
+ if (Array.isArray(rawValue) && rawValue.length > 0) {
1124
+ if (header.inputValue === 'SINGLE_VALUE') {
1125
+ headers = headers.set(header.keyName, String(rawValue[0]));
1125
1126
  }
1126
- // else skip
1127
- }
1128
- else if (header.inputValue) {
1129
- if (header.keyName.toLowerCase() === 'authorization') {
1130
- headers = headers.set(header.keyName, 'Bearer ' + header.inputValue);
1127
+ else if (header.inputValue === 'ARRAY_OF_VALUES') {
1128
+ // join by comma for headers (common pattern)
1129
+ headers = headers.set(header.keyName, rawValue.join(','));
1131
1130
  }
1132
1131
  else {
1133
- headers = headers.set(header.keyName, header.inputValue);
1132
+ // fallback: join
1133
+ headers = headers.set(header.keyName, rawValue.join(','));
1134
1134
  }
1135
1135
  }
1136
+ // no selected values -> skip header
1137
+ return;
1138
+ }
1139
+ // For non-selected sources: skip when unresolved
1140
+ if (rawValue === null || rawValue === undefined)
1141
+ return;
1142
+ // If rawValue is array -> join by comma (headers expect single string)
1143
+ const headerValue = Array.isArray(rawValue)
1144
+ ? rawValue.join(',')
1145
+ : String(rawValue);
1146
+ if (header.keyName.toLowerCase() === 'authorization') {
1147
+ // add Bearer only when headerValue is truthy (and not already prefixed)
1148
+ const token = headerValue.startsWith('Bearer ')
1149
+ ? headerValue
1150
+ : `Bearer ${headerValue}`;
1151
+ headers = headers.set(header.keyName, token);
1152
+ }
1153
+ else {
1154
+ headers = headers.set(header.keyName, headerValue);
1136
1155
  }
1137
1156
  });
1138
1157
  }
1139
1158
  // ---------------------- PARAMS ----------------------
1140
1159
  let params = new HttpParams();
1160
+ // helper: resolve a value (or values) based on valueSource
1161
+ function resolveValueFromSource(valueSource, inputValue, selectedValues = []) {
1162
+ if (!valueSource)
1163
+ return null;
1164
+ switch (valueSource) {
1165
+ case 'LOCAL_STORAGE':
1166
+ return localStorage.getItem(inputValue); // string or null
1167
+ case 'SESSION_STORAGE':
1168
+ return sessionStorage.getItem(inputValue); // string or null
1169
+ case 'CUSTOM_INPUT':
1170
+ case 'QUESTION':
1171
+ case 'PAGE_INDEX':
1172
+ case 'PAGE_SIZE':
1173
+ // inputValue may be a single value or an array/CSV depending on usage
1174
+ return inputValue;
1175
+ case 'SELECTED_VALUES':
1176
+ // For SELECTED_VALUES, return the selectedValues array (caller decides SINGLE/ARRAY behavior)
1177
+ return Array.isArray(selectedValues) ? selectedValues : [];
1178
+ default:
1179
+ console.warn(`Unsupported valueSource for params: ${valueSource}`);
1180
+ return null;
1181
+ }
1182
+ }
1183
+ // Usage: build params (assuming `params` is an HttpParams instance)
1141
1184
  if (apiConfig.params) {
1142
1185
  apiConfig.params.forEach((param) => {
1143
- if (param.keyName) {
1144
- if (param.valueSource === 'SELECTED_VALUES') {
1145
- // Only add selectedIds if values exist
1146
- if (selectedValues.length > 0) {
1147
- if (param.inputValue === 'SINGLE_VALUE') {
1148
- params = params.set(param.keyName, selectedValues[0]);
1149
- }
1150
- else if (param.inputValue === 'ARRAY_OF_VALUES') {
1151
- selectedValues.forEach((val) => {
1152
- params = params.append(param.keyName, val);
1153
- });
1154
- }
1186
+ if (!param.keyName)
1187
+ return;
1188
+ // Resolve raw value based on source
1189
+ const rawValue = resolveValueFromSource(param.valueSource, param.inputValue, selectedValues);
1190
+ // If param expects selected values, handle SINGLE_VALUE vs ARRAY_OF_VALUES
1191
+ if (param.valueSource === 'SELECTED_VALUES') {
1192
+ // Only add if there are actual selected values
1193
+ if (Array.isArray(rawValue) && rawValue.length > 0) {
1194
+ if (param.inputValue === 'SINGLE_VALUE') {
1195
+ // set to first selected value
1196
+ params = params.set(param.keyName, rawValue[0]);
1197
+ }
1198
+ else if (param.inputValue === 'ARRAY_OF_VALUES') {
1199
+ // append each selected value as repeated param
1200
+ rawValue.forEach((val) => {
1201
+ params = params.append(param.keyName, val);
1202
+ });
1155
1203
  }
1156
- // ❌ If no values, do nothing (skip param entirely)
1204
+ else {
1205
+ // if inputValue not provided, default to array behavior
1206
+ rawValue.forEach((val) => {
1207
+ params = params.append(param.keyName, val);
1208
+ });
1209
+ }
1210
+ }
1211
+ // if no selected values, skip adding this param
1212
+ return;
1213
+ }
1214
+ // For non-selected valueSources: rawValue could be null/undefined/string/array
1215
+ if (rawValue === null || rawValue === undefined) {
1216
+ // skip adding param when value not found
1217
+ return;
1218
+ }
1219
+ // If inputValue indicates array-of-values (e.g., param.inputValue === 'ARRAY_OF_VALUES'),
1220
+ // accept either an array or a comma-separated string
1221
+ if (param.inputValue === 'ARRAY_OF_VALUES') {
1222
+ if (Array.isArray(rawValue)) {
1223
+ rawValue.forEach((val) => {
1224
+ params = params.append(param.keyName, val);
1225
+ });
1157
1226
  }
1158
- else if (param.inputValue) {
1159
- // Normal custom or search params
1160
- params = params.set(param.keyName, param.inputValue);
1227
+ else if (typeof rawValue === 'string') {
1228
+ // support comma separated string
1229
+ rawValue
1230
+ .split(',')
1231
+ .map((s) => s.trim())
1232
+ .filter(Boolean)
1233
+ .forEach((val) => {
1234
+ params = params.append(param.keyName, val);
1235
+ });
1236
+ }
1237
+ else {
1238
+ // fallback: convert to string and append
1239
+ params = params.append(param.keyName, String(rawValue));
1161
1240
  }
1162
1241
  }
1242
+ else {
1243
+ // default: set single value
1244
+ params = params.set(param.keyName, String(rawValue));
1245
+ }
1163
1246
  });
1164
1247
  }
1165
1248
  // ---------------------- PATH VARIABLES ----------------------
1166
1249
  let url = apiConfig.url;
1167
1250
  if (apiConfig.pathVariables) {
1168
1251
  apiConfig.pathVariables.forEach((pathVar) => {
1169
- if (pathVar.keyName && pathVar.inputValue) {
1170
- url = url.replace(`{${pathVar.keyName}}`, pathVar.inputValue);
1252
+ if (pathVar.keyName) {
1253
+ let valueToBind = null;
1254
+ switch (pathVar.valueSource) {
1255
+ case 'LOCAL_STORAGE':
1256
+ valueToBind = localStorage.getItem(pathVar.inputValue);
1257
+ break;
1258
+ case 'SESSION_STORAGE':
1259
+ valueToBind = sessionStorage.getItem(pathVar.inputValue);
1260
+ break;
1261
+ case 'CUSTOM_INPUT':
1262
+ case 'QUESTION':
1263
+ valueToBind = pathVar.inputValue;
1264
+ break;
1265
+ default:
1266
+ console.warn(`Unsupported valueSource: ${pathVar.valueSource}`);
1267
+ }
1268
+ if (valueToBind !== null && valueToBind !== undefined) {
1269
+ url = url.replace(`{${pathVar.keyName}}`, valueToBind);
1270
+ }
1171
1271
  }
1172
1272
  });
1173
1273
  }
@@ -1183,7 +1283,7 @@ class FormService {
1183
1283
  formData.append('recaptchaToken', reCAPTCHAToken);
1184
1284
  }
1185
1285
  return this.http.post(url, formData, {
1186
- headers
1286
+ headers,
1187
1287
  });
1188
1288
  }
1189
1289
  getSubmittedForm(moduleName, submissionId, pageNumber = 1, rowSet = 0, navigateTo) {
@@ -1212,7 +1312,7 @@ class FormService {
1212
1312
  formData.append('recaptchaToken', reCAPTCHAToken);
1213
1313
  }
1214
1314
  return this.http.put(url, formData, {
1215
- headers
1315
+ headers,
1216
1316
  });
1217
1317
  }
1218
1318
  previewFile(url) {
@@ -1229,8 +1329,9 @@ class FormService {
1229
1329
  return this.http.get(this.apiUrl + `/api/cdn/preview${fullUrl}`, options);
1230
1330
  }
1231
1331
  getSubformSubmissions(subFormData) {
1232
- if (!subFormData?.moduleName || !subFormData?.duplicateSubmission?.sourceSubmissionIds) {
1233
- console.error("Invalid subFormData", subFormData);
1332
+ if (!subFormData?.moduleName ||
1333
+ !subFormData?.duplicateSubmission?.sourceSubmissionIds) {
1334
+ console.error('Invalid subFormData', subFormData);
1234
1335
  return;
1235
1336
  }
1236
1337
  // Extract data
@@ -1238,8 +1339,8 @@ class FormService {
1238
1339
  const submissionIds = subFormData.duplicateSubmission.sourceSubmissionIds;
1239
1340
  // Build query string
1240
1341
  const queryParams = submissionIds
1241
- .map(id => `submissionIds=${encodeURIComponent(id)}`)
1242
- .join("&");
1342
+ .map((id) => `submissionIds=${encodeURIComponent(id)}`)
1343
+ .join('&');
1243
1344
  // Final URL
1244
1345
  const url = `${this.apiUrl}/api/public/${moduleName}/subform-submissions?${queryParams}`;
1245
1346
  // Now make API call