@atlasauth/angular 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, inject, } from '@angular/core';
2
+ import { localizedErrorMessage, } from '@atlasauth/js';
2
3
  import { AtlasService } from '../atlas.service';
3
4
  import { classFor } from '../appearance';
4
5
  import { translate } from '../i18n';
@@ -25,6 +26,12 @@ export class SignUpFormComponent {
25
26
  t(key, vars) {
26
27
  return translate(this.atlas.localization, key, vars);
27
28
  }
29
+ /** A server error in the app's language (`error.<reason>`, else the server's message). */
30
+ errorText(error) {
31
+ // `errorLocalization` is read defensively: a stand-in service may lack it.
32
+ const layer = this.atlas.errorLocalization;
33
+ return localizedErrorMessage(error, layer ?? this.atlas.localization, this.atlas.localization);
34
+ }
28
35
  cls(key, base) {
29
36
  return classFor(key, this.atlas.appearance, base);
30
37
  }
@@ -93,7 +100,7 @@ export class SignUpFormComponent {
93
100
  </p>
94
101
  } @else {
95
102
  @for (error of formErrors(); track error.code) {
96
- <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ error.message }}</p>
103
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ errorText(error) }}</p>
97
104
  }
98
105
 
99
106
  <form (submit)="onSubmit($event)">
@@ -116,7 +123,7 @@ export class SignUpFormComponent {
116
123
  }
117
124
  </span>
118
125
  @for (error of fieldErrorsFor(f.key); track error.code) {
119
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
126
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
120
127
  }
121
128
  </div>
122
129
  } @else {
@@ -164,7 +171,7 @@ export class SignUpFormComponent {
164
171
  />
165
172
  }
166
173
  @for (error of fieldErrorsFor(f.key); track error.code) {
167
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
174
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
168
175
  }
169
176
  </label>
170
177
  }
@@ -182,7 +189,7 @@ export class SignUpFormComponent {
182
189
  (input)="setValue('email', $any($event.target).value)"
183
190
  />
184
191
  @for (error of fieldErrorsFor('email'); track error.code) {
185
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
192
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
186
193
  }
187
194
  </label>
188
195
 
@@ -198,7 +205,7 @@ export class SignUpFormComponent {
198
205
  (input)="setValue('password', $any($event.target).value)"
199
206
  />
200
207
  @for (error of fieldErrorsFor('password'); track error.code) {
201
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
208
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
202
209
  }
203
210
  </label>
204
211
 
@@ -225,7 +232,7 @@ export class SignUpFormComponent {
225
232
  }.
226
233
  </span>
227
234
  @for (error of fieldErrorsFor('consent'); track error.code) {
228
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
235
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
229
236
  }
230
237
  </label>
231
238
  }
@@ -265,7 +272,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
265
272
  </p>
266
273
  } @else {
267
274
  @for (error of formErrors(); track error.code) {
268
- <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ error.message }}</p>
275
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ errorText(error) }}</p>
269
276
  }
270
277
 
271
278
  <form (submit)="onSubmit($event)">
@@ -288,7 +295,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
288
295
  }
289
296
  </span>
290
297
  @for (error of fieldErrorsFor(f.key); track error.code) {
291
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
298
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
292
299
  }
293
300
  </div>
294
301
  } @else {
@@ -336,7 +343,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
336
343
  />
337
344
  }
338
345
  @for (error of fieldErrorsFor(f.key); track error.code) {
339
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
346
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
340
347
  }
341
348
  </label>
342
349
  }
@@ -354,7 +361,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
354
361
  (input)="setValue('email', $any($event.target).value)"
355
362
  />
356
363
  @for (error of fieldErrorsFor('email'); track error.code) {
357
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
364
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
358
365
  }
359
366
  </label>
360
367
 
@@ -370,7 +377,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
370
377
  (input)="setValue('password', $any($event.target).value)"
371
378
  />
372
379
  @for (error of fieldErrorsFor('password'); track error.code) {
373
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
380
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
374
381
  }
375
382
  </label>
376
383
 
@@ -397,7 +404,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
397
404
  }.
398
405
  </span>
399
406
  @for (error of fieldErrorsFor('consent'); track error.code) {
400
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
407
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
401
408
  }
402
409
  </label>
403
410
  }
@@ -429,4 +436,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
429
436
  }], submitSignUp: [{
430
437
  type: Output
431
438
  }] } });
432
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi11cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zaWduLXVwLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNwQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7QUFRakY7Ozs7Ozs7R0FPRztBQTJLSCxNQUFNLE9BQU8sbUJBQW1CO0lBQ2IsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUVyQyxRQUFRLEdBQTRCLElBQUksQ0FBQztJQUN6QyxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ2IsTUFBTSxHQUFpQixFQUFFLENBQUM7SUFDMUIsT0FBTyxHQUE2QixJQUFJLENBQUM7SUFFbEQsOEVBQThFO0lBQ3BFLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztJQUVwRCxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUNwQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWYsQ0FBQyxDQUFDLEdBQVcsRUFBRSxJQUE2QjtRQUNwRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVTLEdBQUcsQ0FBQyxHQUFlLEVBQUUsSUFBWTtRQUN6QyxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFD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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUtUO2lCQUNGOzhCQUlVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgQ2FwdGNoYUNvbnRyb2xsZXIsXG4gIEZpZWxkRXJyb3IsXG4gIEluc3RhbmNlU2V0dGluZ3MsXG4gIFB1YmxpY1NpZ25VcEZpZWxkLFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2xhc3NGb3IsIHR5cGUgRWxlbWVudEtleSB9IGZyb20gJy4uL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vaTE4bic7XG5pbXBvcnQgeyBBdGxhc0NhcHRjaGFTbG90RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jYXB0Y2hhLXNsb3QuZGlyZWN0aXZlJztcblxuLyoqIFdoYXQgdGhlIGNyZWF0ZS1hY2NvdW50IGZvcm0gZW1pdHM6IHRoZSB2YWx1ZXMgdHlwZWQgcGx1cyB0aGUgY29uc2VudCB0aWNrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduVXBGb3JtU3VibWl0IHtcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zZW50OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBjcmVhdGUtYWNjb3VudCBzdGVwIG9mIGA8YXRsYXMtc2lnbi11cD5gOiB0aGUgaW5zdGFuY2UncyBjb25maWd1cmVkIGV4dHJhXG4gKiBmaWVsZHMsIGVtYWlsICsgcGFzc3dvcmQsIHRoZSBsZWdhbC1jb25zZW50IHJvdyBhbmQg4oCUIHdoZW4gdGhlIGluc3RhbmNlXG4gKiByZXF1aXJlcyBvbmUgb24gc2lnbi11cCDigJQgdGhlIGNhcHRjaGEgd2lkZ2V0LiBWYWx1ZXMgbGl2ZSBvbiB0aGUgY29tcG9uZW50IHNvXG4gKiBhIHJlZnVzZWQgc3VibWl0IG5ldmVyIGNsZWFycyB0aGVtLiBXaGVuIHRoZSBhcHAgY2Fubm90IHNlbmQgdGhlIHZlcmlmaWNhdGlvblxuICogZW1haWwgKGBzZXR0aW5ncy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkU2lnblVwID09PSBmYWxzZWApIGl0IHNob3dzIHRoZVxuICogYHNpZ25VcC5lbWFpbFVuYXZhaWxhYmxlYCBub3RpY2UgaW5zdGVhZCBvZiB0aGUgZm9ybS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXRsYXMtc2lnbi11cC1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtBdGxhc0NhcHRjaGFTbG90RGlyZWN0aXZlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjbHMoJ2NhcmQnLCAnYXRsYXMtY2FyZCcpXCI+XG4gICAgICA8aDEgW2NsYXNzXT1cImNscygnaGVhZGVyVGl0bGUnLCAnYXRsYXMtdGl0bGUnKVwiPnt7IHQoJ3NpZ25VcC50aXRsZScpIH19PC9oMT5cblxuICAgICAgQGlmIChlbWFpbFVuYXZhaWxhYmxlKCkpIHtcbiAgICAgICAgPCEtLSBUaGUgYXBwIGNhbm5vdCBzZW5kIHRoZSB2ZXJpZmljYXRpb24gZW1haWwsIHNvIGFuIGVtYWlsICsgcGFzc3dvcmRcbiAgICAgICAgICAgICBzaWduLXVwIGNvdWxkIG5ldmVyIGNvbXBsZXRlOiBzYXkgc28gaW5zdGVhZCBvZiBvZmZlcmluZyB0aGUgZm9ybS4gLS0+XG4gICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIiBkYXRhLWF0bGFzLWVtYWlsLXVuYXZhaWxhYmxlPVwiXCI+XG4gICAgICAgICAge3sgdCgnc2lnblVwLmVtYWlsVW5hdmFpbGFibGUnKSB9fVxuICAgICAgICA8L3A+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgIEBmb3IgKGVycm9yIG9mIGZvcm1FcnJvcnMoKTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICA8cCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCIgcm9sZT1cImFsZXJ0XCI+e3sgZXJyb3IubWVzc2FnZSB9fTwvcD5cbiAgICAgIH1cblxuICAgICAgPGZvcm0gKHN1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCI+XG4gICAgICAgIEBmb3IgKGYgb2YgZmllbGRzKCk7IHRyYWNrIGYua2V5KSB7XG4gICAgICAgICAgQGlmIChmLnR5cGUgPT09ICdyYWRpbycgfHwgZi50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZCcsICdhdGxhcy1maWVsZCcpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZExhYmVsJywgJ2F0bGFzLWZpZWxkLWxhYmVsJylcIj57eyBsYWJlbChmKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdGxhcy1jaG9pY2VzXCI+XG4gICAgICAgICAgICAgICAgQGZvciAobyBvZiBmLm9wdGlvbnM7IHRyYWNrIG8pIHtcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWNob2ljZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJmLnR5cGUgPT09ICdyYWRpbycgPyAncmFkaW8nIDogJ2NoZWNrYm94J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInBpY2tlZChmLmtleSkuaW5jbHVkZXMobylcIlxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlKGYsIG8sICRhbnkoJGV2ZW50LnRhcmdldCkuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICB7eyBvIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcihmLmtleSk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3IubWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWZpZWxkJylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkTGFiZWwnLCAnYXRsYXMtZmllbGQtbGFiZWwnKVwiPnt7IGxhYmVsKGYpIH19PC9zcGFuPlxuICAgICAgICAgICAgICBAaWYgKGYudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiZi5rZXlcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidmFsdWVzW2Yua2V5XSA9PT0gJ3RydWUnXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWUoZi5rZXksICRhbnkoJGV2ZW50LnRhcmdldCkuY2hlY2tlZCA/ICd0cnVlJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZi50eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLmtleVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVzW2Yua2V5XSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZi5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlKGYua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7IGYucGxhY2Vob2xkZXIgPz8gdCgnc2lnblVwLnNlbGVjdFBsYWNlaG9sZGVyJykgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKG8gb2YgZi5vcHRpb25zOyB0cmFjayBvKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIm9cIj57eyBvIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGYudHlwZSA9PT0gJ3RleHRhcmVhJykge1xuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCIzXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbZi5rZXldID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cImYucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKGYua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCJpbnB1dFR5cGUoZilcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLmtleVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVzW2Yua2V5XSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZi5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJmLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJzZXRWYWx1ZShmLmtleSwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGZvciAoZXJyb3Igb2YgZmllbGRFcnJvcnNGb3IoZi5rZXkpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiPnt7IGVycm9yLm1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPGxhYmVsIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZCcsICdhdGxhcy1maWVsZCcpXCI+XG4gICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkTGFiZWwnLCAnYXRsYXMtZmllbGQtbGFiZWwnKVwiPnt7IHQoJ3NpZ25VcC5lbWFpbExhYmVsJykgfX08L3NwYW4+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgIHR5cGU9XCJlbWFpbFwiXG4gICAgICAgICAgICBuYW1lPVwiZW1haWxcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwiZW1haWxcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbJ2VtYWlsJ10gPz8gJydcIlxuICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKCdlbWFpbCcsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKCdlbWFpbCcpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3IubWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPGxhYmVsIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZCcsICdhdGxhcy1maWVsZCcpXCI+XG4gICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkTGFiZWwnLCAnYXRsYXMtZmllbGQtbGFiZWwnKVwiPnt7IHQoJ3NpZ25VcC5wYXNzd29yZExhYmVsJykgfX08L3NwYW4+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICBuYW1lPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwibmV3LXBhc3N3b3JkXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVzWydwYXNzd29yZCddID8/ICcnXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJzZXRWYWx1ZSgncGFzc3dvcmQnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcigncGFzc3dvcmQnKTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiPnt7IGVycm9yLm1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIEBpZiAoc2hvd0xlZ2FsKCkpIHtcbiAgICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWNvbnNlbnQnKVwiPlxuICAgICAgICAgICAgQGlmIChzZXR0aW5ncz8ubGVnYWw/LnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImNvbnNlbnRcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFncmVlZFwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJhZ3JlZWQgPSAkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdGxhcy10ZXh0XCI+XG4gICAgICAgICAgICAgIHt7IHQoc2V0dGluZ3M/LmxlZ2FsPy5yZXF1aXJlZCA/ICdzaWduVXAuY29uc2VudEFncmVlJyA6ICdzaWduVXAuY29uc2VudE5vdGljZScpIH19XG4gICAgICAgICAgICAgIEBpZiAoc2V0dGluZ3M/LmxlZ2FsPy50ZXJtc1VybDsgYXMgdGVybXMpIHtcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImF0bGFzLWxpbmtcIiBbaHJlZl09XCJ0ZXJtc1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj57eyB0KCdzaWduVXAudGVybXMnKSB9fTwvYT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNldHRpbmdzPy5sZWdhbD8udGVybXNVcmwgJiYgc2V0dGluZ3M/LmxlZ2FsPy5wcml2YWN5VXJsKSB7XG4gICAgICAgICAgICAgICAge3sgdCgnc2lnblVwLmFuZCcpIH19XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzZXR0aW5ncz8ubGVnYWw/LnByaXZhY3lVcmw7IGFzIHByaXZhY3kpIHtcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImF0bGFzLWxpbmtcIiBbaHJlZl09XCJwcml2YWN5XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnt7IHQoJ3NpZ25VcC5wcml2YWN5JykgfX08L2E+XG4gICAgICAgICAgICAgIH0uXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcignY29uc2VudCcpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvci5tZXNzYWdlIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGNhcHRjaGEpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXRsYXMtY2FwdGNoYVwiIGRhdGEtYXRsYXMtY2FwdGNoYT1cIlwiIFthdGxhc0NhcHRjaGFTbG90XT1cImNhcHRjaGFcIj48L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uUHJpbWFyeScsICdhdGxhcy1idXR0b24nKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgIWNvbnNlbnRPaygpXCJcbiAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHQoJ3NpZ25VcC5zdWJtaXQnKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZm9ybT5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgU2lnblVwRm9ybUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXRsYXMgPSBpbmplY3QoQXRsYXNTZXJ2aWNlKTtcblxuICBASW5wdXQoKSBzZXR0aW5nczogSW5zdGFuY2VTZXR0aW5ncyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBidXN5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVycm9yczogRmllbGRFcnJvcltdID0gW107XG4gIEBJbnB1dCgpIGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEVtaXRzIHRoZSB0eXBlZCB2YWx1ZXMgYW5kIHRoZSBjb25zZW50IHRpY2sgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuICovXG4gIEBPdXRwdXQoKSBzdWJtaXRTaWduVXAgPSBuZXcgRXZlbnRFbWl0dGVyPFNpZ25VcEZvcm1TdWJtaXQ+KCk7XG5cbiAgcHJvdGVjdGVkIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcm90ZWN0ZWQgYWdyZWVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcsIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXksIHZhcnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IHsgLi4udGhpcy52YWx1ZXMsIFtuYW1lXTogdmFsdWUgfTtcbiAgfVxuXG4gIC8qKiBFbWFpbCArIHBhc3N3b3JkIHNpZ24tdXAgY2Fubm90IGNvbXBsZXRlOiB0aGUgYXBwIGNhbm5vdCBzZW5kIHRoZSB2ZXJpZmljYXRpb24gZW1haWwuICovXG4gIHByb3RlY3RlZCBlbWFpbFVuYXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5lbWFpbERlbGl2ZXJ5Py5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRzKCk6IFB1YmxpY1NpZ25VcEZpZWxkW10ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5zaWduVXBGaWVsZHMgPz8gW107XG4gIH1cblxuICBwcm90ZWN0ZWQgbGFiZWwoZjogUHVibGljU2lnblVwRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBmLnJlcXVpcmVkID8gZi5sYWJlbCA6IHRoaXMudCgnc2lnblVwLm9wdGlvbmFsRmllbGQnLCB7IGxhYmVsOiBmLmxhYmVsIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlucHV0VHlwZShmOiBQdWJsaWNTaWduVXBGaWVsZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnZW1haWwnLCAndGVsJywgJ3VybCcsICdudW1iZXInLCAnZGF0ZSddLmluY2x1ZGVzKGYudHlwZSkgPyBmLnR5cGUgOiAndGV4dCc7XG4gIH1cblxuICAvKiogU2FtZSBlbmNvZGluZyBhcyBSZWFjdCwgdGhlIGVtYmVkIHdpZGdldCBhbmQgdGhlIGhvc3RlZCBwYWdlOiBvbmUgdmFsdWUsXG4gICAqICBvciBhIGNvbW1hLWpvaW5lZCBsaXN0IGZvciBtdWx0aXNlbGVjdC4gKi9cbiAgcHJvdGVjdGVkIHBpY2tlZChrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVzW2tleV07XG4gICAgcmV0dXJuIHZhbHVlID8gdmFsdWUuc3BsaXQoJywgJykgOiBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGUoZjogUHVibGljU2lnblVwRmllbGQsIG9wdGlvbjogc3RyaW5nLCBvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoZi5rZXksIG9wdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBpY2tlZChmLmtleSk7XG4gICAgdGhpcy5zZXRWYWx1ZShmLmtleSwgKG9uID8gWy4uLmN1cnJlbnQsIG9wdGlvbl0gOiBjdXJyZW50LmZpbHRlcigocCkgPT4gcCAhPT0gb3B0aW9uKSkuam9pbignLCAnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0xlZ2FsKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxlZ2FsID0gdGhpcy5zZXR0aW5ncz8ubGVnYWw7XG4gICAgcmV0dXJuICEhbGVnYWwgJiYgKCEhbGVnYWwudGVybXNVcmwgfHwgISFsZWdhbC5wcml2YWN5VXJsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zZW50T2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQgfHwgdGhpcy5hZ3JlZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9ybUVycm9ycygpOiBGaWVsZEVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiAhZXJyb3IucGFyYW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpZWxkRXJyb3JzRm9yKG5hbWU6IHN0cmluZyk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+IGVycm9yLnBhcmFtID09PSBuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN1Ym1pdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLmVtYWlsVW5hdmFpbGFibGUoKSB8fCAhdGhpcy5jb25zZW50T2soKSkgcmV0dXJuO1xuICAgIHRoaXMuc3VibWl0U2lnblVwLmVtaXQoe1xuICAgICAgdmFsdWVzOiB7IC4uLnRoaXMudmFsdWVzIH0sXG4gICAgICBjb25zZW50OiB0aGlzLnNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQgPyB0aGlzLmFncmVlZCA6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
439
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi11cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zaWduLXVwLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wscUJBQXFCLEdBS3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOztBQVFqRjs7Ozs7OztHQU9HO0FBMktILE1BQU0sT0FBTyxtQkFBbUI7SUFDYixLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXJDLFFBQVEsR0FBNEIsSUFBSSxDQUFDO0lBQ3pDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDYixNQUFNLEdBQWlCLEVBQUUsQ0FBQztJQUMxQixPQUFPLEdBQTZCLElBQUksQ0FBQztJQUVsRCw4RUFBOEU7SUFDcEUsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO0lBRXBELE1BQU0sR0FBMkIsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixDQUFDLENBQUMsR0FBVyxFQUFFLElBQTZCO1FBQ3BELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsMEZBQTBGO0lBQ2hGLFNBQVMsQ0FB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Ozs0RkFzS3hCLG1CQUFtQjtrQkExSy9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztvQkFDcEMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUtUO2lCQUNGOzhCQUlVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGxvY2FsaXplZEVycm9yTWVzc2FnZSxcbiAgdHlwZSBDYXB0Y2hhQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZEVycm9yLFxuICB0eXBlIEluc3RhbmNlU2V0dGluZ3MsXG4gIHR5cGUgUHVibGljU2lnblVwRmllbGQsXG59IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBjbGFzc0ZvciwgdHlwZSBFbGVtZW50S2V5IH0gZnJvbSAnLi4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcbmltcG9ydCB7IEF0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NhcHRjaGEtc2xvdC5kaXJlY3RpdmUnO1xuXG4vKiogV2hhdCB0aGUgY3JlYXRlLWFjY291bnQgZm9ybSBlbWl0czogdGhlIHZhbHVlcyB0eXBlZCBwbHVzIHRoZSBjb25zZW50IHRpY2suICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25VcEZvcm1TdWJtaXQge1xuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnNlbnQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGNyZWF0ZS1hY2NvdW50IHN0ZXAgb2YgYDxhdGxhcy1zaWduLXVwPmA6IHRoZSBpbnN0YW5jZSdzIGNvbmZpZ3VyZWQgZXh0cmFcbiAqIGZpZWxkcywgZW1haWwgKyBwYXNzd29yZCwgdGhlIGxlZ2FsLWNvbnNlbnQgcm93IGFuZCDigJQgd2hlbiB0aGUgaW5zdGFuY2VcbiAqIHJlcXVpcmVzIG9uZSBvbiBzaWduLXVwIOKAlCB0aGUgY2FwdGNoYSB3aWRnZXQuIFZhbHVlcyBsaXZlIG9uIHRoZSBjb21wb25lbnQgc29cbiAqIGEgcmVmdXNlZCBzdWJtaXQgbmV2ZXIgY2xlYXJzIHRoZW0uIFdoZW4gdGhlIGFwcCBjYW5ub3Qgc2VuZCB0aGUgdmVyaWZpY2F0aW9uXG4gKiBlbWFpbCAoYHNldHRpbmdzLmVtYWlsRGVsaXZlcnkucGFzc3dvcmRTaWduVXAgPT09IGZhbHNlYCkgaXQgc2hvd3MgdGhlXG4gKiBgc2lnblVwLmVtYWlsVW5hdmFpbGFibGVgIG5vdGljZSBpbnN0ZWFkIG9mIHRoZSBmb3JtLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1zaWduLXVwLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0F0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNscygnY2FyZCcsICdhdGxhcy1jYXJkJylcIj5cbiAgICAgIDxoMSBbY2xhc3NdPVwiY2xzKCdoZWFkZXJUaXRsZScsICdhdGxhcy10aXRsZScpXCI+e3sgdCgnc2lnblVwLnRpdGxlJykgfX08L2gxPlxuXG4gICAgICBAaWYgKGVtYWlsVW5hdmFpbGFibGUoKSkge1xuICAgICAgICA8IS0tIFRoZSBhcHAgY2Fubm90IHNlbmQgdGhlIHZlcmlmaWNhdGlvbiBlbWFpbCwgc28gYW4gZW1haWwgKyBwYXNzd29yZFxuICAgICAgICAgICAgIHNpZ24tdXAgY291bGQgbmV2ZXIgY29tcGxldGU6IHNheSBzbyBpbnN0ZWFkIG9mIG9mZmVyaW5nIHRoZSBmb3JtLiAtLT5cbiAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiIGRhdGEtYXRsYXMtZW1haWwtdW5hdmFpbGFibGU9XCJcIj5cbiAgICAgICAgICB7eyB0KCdzaWduVXAuZW1haWxVbmF2YWlsYWJsZScpIH19XG4gICAgICAgIDwvcD5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgQGZvciAoZXJyb3Igb2YgZm9ybUVycm9ycygpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9wPlxuICAgICAgfVxuXG4gICAgICA8Zm9ybSAoc3VibWl0KT1cIm9uU3VibWl0KCRldmVudClcIj5cbiAgICAgICAgQGZvciAoZiBvZiBmaWVsZHMoKTsgdHJhY2sgZi5rZXkpIHtcbiAgICAgICAgICBAaWYgKGYudHlwZSA9PT0gJ3JhZGlvJyB8fCBmLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWZpZWxkJylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkTGFiZWwnLCAnYXRsYXMtZmllbGQtbGFiZWwnKVwiPnt7IGxhYmVsKGYpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0bGFzLWNob2ljZXNcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChvIG9mIGYub3B0aW9uczsgdHJhY2sgbykge1xuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtY2hvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImYudHlwZSA9PT0gJ3JhZGlvJyA/ICdyYWRpbycgOiAnY2hlY2tib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicGlja2VkKGYua2V5KS5pbmNsdWRlcyhvKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGUoZiwgbywgJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIHt7IG8gfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKGYua2V5KTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGQnLCAnYXRsYXMtZmllbGQnKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRMYWJlbCcsICdhdGxhcy1maWVsZC1sYWJlbCcpXCI+e3sgbGFiZWwoZikgfX08L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoZi50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLmtleVwiXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ2YWx1ZXNbZi5rZXldID09PSAndHJ1ZSdcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZShmLmtleSwgJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkID8gJ3RydWUnIDogJycpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChmLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbZi5rZXldID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWUoZi5rZXksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3sgZi5wbGFjZWhvbGRlciA/PyB0KCdzaWduVXAuc2VsZWN0UGxhY2Vob2xkZXInKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgQGZvciAobyBvZiBmLm9wdGlvbnM7IHRyYWNrIG8pIHtcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib1wiPnt7IG8gfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZi50eXBlID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiZi5rZXlcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjNcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1tmLmtleV0gPz8gJydcIlxuICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImYucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwiZi5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoZi5rZXksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImlucHV0VHlwZShmKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbZi5rZXldID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cImYucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKGYua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcihmLmtleSk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3JUZXh0KGVycm9yKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWZpZWxkJylcIj5cbiAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRMYWJlbCcsICdhdGxhcy1maWVsZC1sYWJlbCcpXCI+e3sgdCgnc2lnblVwLmVtYWlsTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIlxuICAgICAgICAgICAgdHlwZT1cImVtYWlsXCJcbiAgICAgICAgICAgIG5hbWU9XCJlbWFpbFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJlbWFpbFwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1snZW1haWwnXSA/PyAnJ1wiXG4gICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoJ2VtYWlsJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgQGZvciAoZXJyb3Igb2YgZmllbGRFcnJvcnNGb3IoJ2VtYWlsJyk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWZpZWxkJylcIj5cbiAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRMYWJlbCcsICdhdGxhcy1maWVsZC1sYWJlbCcpXCI+e3sgdCgnc2lnblVwLnBhc3N3b3JkTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIlxuICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgIG5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbJ3Bhc3N3b3JkJ10gPz8gJydcIlxuICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKCdwYXNzd29yZCcsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKCdwYXNzd29yZCcpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3JUZXh0KGVycm9yKSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgQGlmIChzaG93TGVnYWwoKSkge1xuICAgICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGQnLCAnYXRsYXMtY29uc2VudCcpXCI+XG4gICAgICAgICAgICBAaWYgKHNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBuYW1lPVwiY29uc2VudFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWdyZWVkXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImFncmVlZCA9ICRhbnkoJGV2ZW50LnRhcmdldCkuY2hlY2tlZFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0bGFzLXRleHRcIj5cbiAgICAgICAgICAgICAge3sgdChzZXR0aW5ncz8ubGVnYWw/LnJlcXVpcmVkID8gJ3NpZ25VcC5jb25zZW50QWdyZWUnIDogJ3NpZ25VcC5jb25zZW50Tm90aWNlJykgfX1cbiAgICAgICAgICAgICAgQGlmIChzZXR0aW5ncz8ubGVnYWw/LnRlcm1zVXJsOyBhcyB0ZXJtcykge1xuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYXRsYXMtbGlua1wiIFtocmVmXT1cInRlcm1zXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnt7IHQoJ3NpZ25VcC50ZXJtcycpIH19PC9hPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoc2V0dGluZ3M/LmxlZ2FsPy50ZXJtc1VybCAmJiBzZXR0aW5ncz8ubGVnYWw/LnByaXZhY3lVcmwpIHtcbiAgICAgICAgICAgICAgICB7eyB0KCdzaWduVXAuYW5kJykgfX1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNldHRpbmdzPy5sZWdhbD8ucHJpdmFjeVVybDsgYXMgcHJpdmFjeSkge1xuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYXRsYXMtbGlua1wiIFtocmVmXT1cInByaXZhY3lcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+e3sgdCgnc2lnblVwLnByaXZhY3knKSB9fTwvYT5cbiAgICAgICAgICAgICAgfS5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKCdjb25zZW50Jyk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiPnt7IGVycm9yVGV4dChlcnJvcikgfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoY2FwdGNoYSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdGxhcy1jYXB0Y2hhXCIgZGF0YS1hdGxhcy1jYXB0Y2hhPVwiXCIgW2F0bGFzQ2FwdGNoYVNsb3RdPVwiY2FwdGNoYVwiPjwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25QcmltYXJ5JywgJ2F0bGFzLWJ1dHRvbicpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCAhY29uc2VudE9rKClcIlxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdCgnc2lnblVwLnN1Ym1pdCcpIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9mb3JtPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBTaWduVXBGb3JtQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhdGxhcyA9IGluamVjdChBdGxhc1NlcnZpY2UpO1xuXG4gIEBJbnB1dCgpIHNldHRpbmdzOiBJbnN0YW5jZVNldHRpbmdzIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGJ1c3kgPSBmYWxzZTtcbiAgQElucHV0KCkgZXJyb3JzOiBGaWVsZEVycm9yW10gPSBbXTtcbiAgQElucHV0KCkgY2FwdGNoYTogQ2FwdGNoYUNvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogRW1pdHMgdGhlIHR5cGVkIHZhbHVlcyBhbmQgdGhlIGNvbnNlbnQgdGljayB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC4gKi9cbiAgQE91dHB1dCgpIHN1Ym1pdFNpZ25VcCA9IG5ldyBFdmVudEVtaXR0ZXI8U2lnblVwRm9ybVN1Ym1pdD4oKTtcblxuICBwcm90ZWN0ZWQgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHByb3RlY3RlZCBhZ3JlZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZywgdmFycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0cmFuc2xhdGUodGhpcy5hdGxhcy5sb2NhbGl6YXRpb24sIGtleSwgdmFycyk7XG4gIH1cblxuICAvKiogQSBzZXJ2ZXIgZXJyb3IgaW4gdGhlIGFwcCdzIGxhbmd1YWdlIChgZXJyb3IuPHJlYXNvbj5gLCBlbHNlIHRoZSBzZXJ2ZXIncyBtZXNzYWdlKS4gKi9cbiAgcHJvdGVjdGVkIGVycm9yVGV4dChlcnJvcjogRmllbGRFcnJvcik6IHN0cmluZyB7XG4gICAgLy8gYGVycm9yTG9jYWxpemF0aW9uYCBpcyByZWFkIGRlZmVuc2l2ZWx5OiBhIHN0YW5kLWluIHNlcnZpY2UgbWF5IGxhY2sgaXQuXG4gICAgY29uc3QgbGF5ZXIgPSAodGhpcy5hdGxhcyBhcyB7IGVycm9yTG9jYWxpemF0aW9uPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KS5lcnJvckxvY2FsaXphdGlvbjtcbiAgICByZXR1cm4gbG9jYWxpemVkRXJyb3JNZXNzYWdlKGVycm9yLCBsYXllciA/PyB0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwgdGhpcy5hdGxhcy5sb2NhbGl6YXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IHsgLi4udGhpcy52YWx1ZXMsIFtuYW1lXTogdmFsdWUgfTtcbiAgfVxuXG4gIC8qKiBFbWFpbCArIHBhc3N3b3JkIHNpZ24tdXAgY2Fubm90IGNvbXBsZXRlOiB0aGUgYXBwIGNhbm5vdCBzZW5kIHRoZSB2ZXJpZmljYXRpb24gZW1haWwuICovXG4gIHByb3RlY3RlZCBlbWFpbFVuYXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5lbWFpbERlbGl2ZXJ5Py5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRzKCk6IFB1YmxpY1NpZ25VcEZpZWxkW10ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5zaWduVXBGaWVsZHMgPz8gW107XG4gIH1cblxuICBwcm90ZWN0ZWQgbGFiZWwoZjogUHVibGljU2lnblVwRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBmLnJlcXVpcmVkID8gZi5sYWJlbCA6IHRoaXMudCgnc2lnblVwLm9wdGlvbmFsRmllbGQnLCB7IGxhYmVsOiBmLmxhYmVsIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlucHV0VHlwZShmOiBQdWJsaWNTaWduVXBGaWVsZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnZW1haWwnLCAndGVsJywgJ3VybCcsICdudW1iZXInLCAnZGF0ZSddLmluY2x1ZGVzKGYudHlwZSkgPyBmLnR5cGUgOiAndGV4dCc7XG4gIH1cblxuICAvKiogU2FtZSBlbmNvZGluZyBhcyBSZWFjdCwgdGhlIGVtYmVkIHdpZGdldCBhbmQgdGhlIGhvc3RlZCBwYWdlOiBvbmUgdmFsdWUsXG4gICAqICBvciBhIGNvbW1hLWpvaW5lZCBsaXN0IGZvciBtdWx0aXNlbGVjdC4gKi9cbiAgcHJvdGVjdGVkIHBpY2tlZChrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVzW2tleV07XG4gICAgcmV0dXJuIHZhbHVlID8gdmFsdWUuc3BsaXQoJywgJykgOiBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGUoZjogUHVibGljU2lnblVwRmllbGQsIG9wdGlvbjogc3RyaW5nLCBvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoZi5rZXksIG9wdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBpY2tlZChmLmtleSk7XG4gICAgdGhpcy5zZXRWYWx1ZShmLmtleSwgKG9uID8gWy4uLmN1cnJlbnQsIG9wdGlvbl0gOiBjdXJyZW50LmZpbHRlcigocCkgPT4gcCAhPT0gb3B0aW9uKSkuam9pbignLCAnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0xlZ2FsKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxlZ2FsID0gdGhpcy5zZXR0aW5ncz8ubGVnYWw7XG4gICAgcmV0dXJuICEhbGVnYWwgJiYgKCEhbGVnYWwudGVybXNVcmwgfHwgISFsZWdhbC5wcml2YWN5VXJsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zZW50T2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQgfHwgdGhpcy5hZ3JlZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9ybUVycm9ycygpOiBGaWVsZEVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiAhZXJyb3IucGFyYW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpZWxkRXJyb3JzRm9yKG5hbWU6IHN0cmluZyk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+IGVycm9yLnBhcmFtID09PSBuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN1Ym1pdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLmVtYWlsVW5hdmFpbGFibGUoKSB8fCAhdGhpcy5jb25zZW50T2soKSkgcmV0dXJuO1xuICAgIHRoaXMuc3VibWl0U2lnblVwLmVtaXQoe1xuICAgICAgdmFsdWVzOiB7IC4uLnRoaXMudmFsdWVzIH0sXG4gICAgICBjb25zZW50OiB0aGlzLnNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQgPyB0aGlzLmFncmVlZCA6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -74,6 +74,46 @@ export const EN_US = {
74
74
  'organization.roleLabel': 'Role',
75
75
  'error.generic': 'Something went wrong. Please try again.',
76
76
  'error.network': 'We could not reach the server. Check your connection.',
77
+ // Server errors, by the stable `reason` the Frontend API sends. Shown instead
78
+ // of the server's `message` (see `localizedErrorMessage` in @atlasauth/js).
79
+ 'error.form_password_incorrect': 'Those credentials are incorrect.',
80
+ 'error.form_code_incorrect': 'That code is incorrect.',
81
+ 'error.form_code_already_used': 'That code has already been used. Wait for a new one.',
82
+ 'error.form_code_expired': 'That code has expired. Request a new one.',
83
+ 'error.form_code_max_attempts': 'Too many incorrect codes. Request a new code.',
84
+ 'error.form_link_invalid': 'That sign-in link is invalid or has already been used.',
85
+ 'error.form_identifier_not_found': "We couldn't find an account with those details.",
86
+ 'error.form_identifier_exists': "There's already an account for this email. Sign in with {methods}.",
87
+ 'error.form_password_pwned': 'This password has appeared in a known data breach. Please choose a different one.',
88
+ 'error.form_password_too_short': 'Password must be at least {min_length} characters.',
89
+ 'error.form_password_too_long': 'Password must be at most {max_length} characters.',
90
+ 'error.form_password_requires_uppercase': 'Password must contain an uppercase letter.',
91
+ 'error.form_password_requires_lowercase': 'Password must contain a lowercase letter.',
92
+ 'error.form_password_requires_number': 'Password must contain a number.',
93
+ 'error.form_password_requires_symbol': 'Password must contain a symbol.',
94
+ 'error.form_password_not_allowed': 'That password is not allowed. Choose a different one.',
95
+ 'error.form_password_contains_identifier': 'Password must not contain your email or username.',
96
+ 'error.form_password_same_as_current': 'Your new password must be different from your current one.',
97
+ 'error.form_password_reused': 'Your new password must not match any of your last {history_count} passwords.',
98
+ 'error.password_expired': 'Your password has expired. Reset it to continue.',
99
+ 'error.email_not_verified': 'Your email address is not verified yet. Verify it before signing in with your password.',
100
+ 'error.sign_in_token_invalid': 'That sign-in token is invalid or has expired.',
101
+ 'error.too_many_attempts': 'Too many failed attempts. Try again later.',
102
+ 'error.too_many_requests': 'Too many requests. Please try again later.',
103
+ 'error.captcha_required': 'Please complete the security check, then try again.',
104
+ 'error.captcha_failed': "The security check didn't pass. Please try again.",
105
+ 'error.captcha_unavailable': 'The security check is unavailable right now. Please try again later.',
106
+ 'error.email_delivery_unavailable': "This app can't send email right now. Try another sign-in method or contact the app owner.",
107
+ 'error.strategy_disabled': 'This sign-in method is not available for this app.',
108
+ 'error.sign_up_restricted': 'Sign-up on this app is by invitation only.',
109
+ 'error.waitlisted': "You're on the waitlist. We'll email you when a place opens up.",
110
+ 'error.identifier_not_allowed': 'This email or phone number is not allowed on this app.',
111
+ 'error.disposable_email_blocked': 'Sign-up with a disposable or temporary email address is not allowed.',
112
+ 'error.sso_required': 'This organization requires signing in through single sign-on.',
113
+ 'error.sign_ins_disabled': 'Sign-ins are temporarily disabled.',
114
+ 'error.sign_ups_disabled': 'Sign-ups are temporarily disabled.',
115
+ 'error.high_risk_blocked': 'This sign-in was blocked because it looked unusual.',
116
+ 'error.sms_region_blocked': 'Text messages are not available for this phone number.',
77
117
  };
78
118
  /**
79
119
  * Look up a key and interpolate `{placeholders}`.
@@ -90,4 +130,4 @@ export function translate(catalog, key, variables = {}) {
90
130
  export function withFallback(locale) {
91
131
  return { ...EN_US, ...locale };
92
132
  }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFZO0lBQzVCLGNBQWMsRUFBRSxTQUFTO0lBQ3pCLGlCQUFpQixFQUFFLDhCQUE4QjtJQUNqRCx3QkFBd0IsRUFBRSxlQUFlO0lBQ3pDLHNCQUFzQixFQUFFLFVBQVU7SUFDbEMsZUFBZSxFQUFFLFVBQVU7SUFDM0IsdUJBQXVCLEVBQUUsa0JBQWtCO0lBQzNDLGtCQUFrQixFQUFFLGFBQWE7SUFDakMsbUJBQW1CLEVBQUUsU0FBUztJQUM5QixrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLHFCQUFxQixFQUFFLDBCQUEwQjtJQUNqRCx1QkFBdUIsRUFBRSxtQkFBbUI7SUFDNUMscUJBQXFCLEVBQUUsaUJBQWlCO0lBQ3hDLHNCQUFzQixFQUFFLHNDQUFzQztJQUM5RCxzQkFBc0IsRUFBRSwrREFBK0Q7SUFFdkYsY0FBYyxFQUFFLHFCQUFxQjtJQUNyQyxlQUFlLEVBQUUsVUFBVTtJQUMzQixvQkFBb0IsRUFBRSwwQkFBMEI7SUFDaEQsbUJBQW1CLEVBQUUsU0FBUztJQUM5QixtQkFBbUIsRUFBRSxlQUFlO0lBQ3BDLHNCQUFzQixFQUFFLFVBQVU7SUFDbEMsc0JBQXNCLEVBQUUsb0JBQW9CO0lBQzVDLDBCQUEwQixFQUFFLFNBQVM7SUFDckMscUJBQXFCLEVBQUUsZ0JBQWdCO0lBQ3ZDLHNCQUFzQixFQUFFLGdDQUFnQztJQUN4RCxjQUFjLEVBQUUsa0JBQWtCO0lBQ2xDLGdCQUFnQixFQUFFLGdCQUFnQjtJQUNsQyxZQUFZLEVBQUUsS0FBSztJQUNuQixrREFBa0Q7SUFDbEQseUJBQXlCLEVBQ3ZCLDJGQUEyRjtJQUU3RixnQkFBZ0IsRUFBRSwwQ0FBMEM7SUFDNUQsa0JBQWtCLEVBQUUscURBQXFEO0lBQ3pFLGdCQUFnQixFQUFFLG1EQUFtRDtJQUVyRSxXQUFXLEVBQUUsdUJBQXVCO0lBQ3BDLGNBQWMsRUFBRSw2Q0FBNkM7SUFDN0QsZUFBZSxFQUFFLE1BQU07SUFDdkIsMEJBQTBCLEVBQUUsa0NBQWtDO0lBQzlELDJCQUEyQixFQUFFLHdCQUF3QjtJQUNyRCxnQkFBZ0IsRUFBRSx1QkFBdUI7SUFDekMsbUJBQW1CLEVBQUUscUJBQXFCO0lBQzFDLFlBQVksRUFBRSxRQUFRO0lBRXRCLGFBQWEsRUFBRSxxQkFBcUI7SUFDcEMsY0FBYyxFQUFFLGlCQUFpQjtJQUNqQyx3QkFBd0IsRUFBRSxjQUFjO0lBRXhDLDBCQUEwQixFQUFFLGdCQUFnQjtJQUM1QyxvQkFBb0IsRUFBRSxVQUFVO0lBQ2hDLHVCQUF1QixFQUFFLHlCQUF5QjtJQUVsRCxtQkFBbUIsRUFBRSxTQUFTO0lBQzlCLDRCQUE0QixFQUFFLFNBQVM7SUFDdkMsMkJBQTJCLEVBQUUsaUJBQWlCO0lBQzlDLDZCQUE2QixFQUFFLFVBQVU7SUFDekMsNEJBQTRCLEVBQUUsZ0JBQWdCO0lBQzlDLDJCQUEyQixFQUFFLGFBQWE7SUFDMUMsc0JBQXNCLEVBQUUsc0JBQXNCO0lBQzlDLHlCQUF5QixFQUFFLGNBQWM7SUFDekMsd0JBQXdCLEVBQUUsWUFBWTtJQUN0QywwQkFBMEIsRUFBRSxVQUFVO0lBQ3RDLDJCQUEyQixFQUFFLGdCQUFnQjtJQUU3Qyx1QkFBdUIsRUFBRSxxQkFBcUI7SUFDOUMsdUJBQXVCLEVBQUUsa0JBQWtCO0lBQzNDLHNCQUFzQixFQUFFLFNBQVM7SUFDakMscUJBQXFCLEVBQUUsZUFBZTtJQUN0Qyx3QkFBd0IsRUFBRSxNQUFNO0lBRWhDLGVBQWUsRUFBRSx5Q0FBeUM7SUFDMUQsZUFBZSxFQUFFLHVEQUF1RDtDQUN6RSxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsT0FBZ0IsRUFDaEIsR0FBVyxFQUNYLFlBQW9DLEVBQUU7SUFFdEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDbkQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFZLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQztBQUMzRixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBZTtJQUMxQyxPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDCpzEwLjM6IFwiRXZlcnkgc3RyaW5nIHBhc3NlcyB0aHJvdWdoIGFuIGkxOG4gY2F0YWxvZzsgZW4tVVMgc2hpcHMsIGNhdGFsb2dcbiAqIGZvcm1hdCBkb2N1bWVudGVkIGZvciBjb21tdW5pdHkgbG9jYWxlcy5cIlxuICpcbiAqIEEgZmxhdCBrZXktdG8tc3RyaW5nIG1hcCByYXRoZXIgdGhhbiBuZXN0ZWQgb2JqZWN0cywgYmVjYXVzZSBuZXN0aW5nIGxvb2tzXG4gKiB0aWRpZXIgYW5kIG1ha2VzIGEgbWlzc2luZyBrZXkgYSBydW50aW1lIGNyYXNoIG9uIGB1bmRlZmluZWQub2YuYS5jaGFpbmBcbiAqIHJhdGhlciB0aGFuIGEgdmlzaWJsZSBmYWxsYmFjay5cbiAqXG4gKiBBIG1pc3Npbmcga2V5IHJlbmRlcnMgdGhlIEtFWSwgbm90IGFuIGVtcHR5IHN0cmluZy4gQSBibGFuayBidXR0b24gaXMgYSBidWdcbiAqIG5vYm9keSBjYW4gcmVwb3J0OyBhIGJ1dHRvbiByZWFkaW5nIGBzaWduSW4uc3VibWl0YCBpcyBvbmUgYW55b25lIGNhbi5cbiAqL1xuXG5leHBvcnQgdHlwZSBDYXRhbG9nID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuZXhwb3J0IGNvbnN0IEVOX1VTOiBDYXRhbG9nID0ge1xuICAnc2lnbkluLnRpdGxlJzogJ1NpZ24gaW4nLFxuICAnc2lnbkluLnN1YnRpdGxlJzogJ3RvIGNvbnRpbnVlIHRvIHthcHBsaWNhdGlvbn0nLFxuICAnc2lnbkluLmlkZW50aWZpZXJMYWJlbCc6ICdFbWFpbCBhZGRyZXNzJyxcbiAgJ3NpZ25Jbi5wYXNzd29yZExhYmVsJzogJ1Bhc3N3b3JkJyxcbiAgJ3NpZ25Jbi5zdWJtaXQnOiAnQ29udGludWUnLFxuICAnc2lnbkluLmZvcmdvdFBhc3N3b3JkJzogJ0ZvcmdvdCBwYXNzd29yZD8nLFxuICAnc2lnbkluLm5vQWNjb3VudCc6ICdObyBhY2NvdW50PycsXG4gICdzaWduSW4uc2lnblVwTGluayc6ICdTaWduIHVwJyxcbiAgJ3NpZ25Jbi5vckRpdmlkZXInOiAnb3InLFxuICAnc2lnbkluLnNvY2lhbEJ1dHRvbic6ICdDb250aW51ZSB3aXRoIHtwcm92aWRlcn0nLFxuICAnc2lnbkluLmVtYWlsQ29kZUxhYmVsJzogJ1ZlcmlmaWNhdGlvbiBjb2RlJyxcbiAgJ3NpZ25Jbi51c2VFbWFpbENvZGUnOiAnRW1haWwgbWUgYSBjb2RlJyxcbiAgJ3NpZ25Jbi5tYWdpY0xpbmtTZW50JzogJ0NoZWNrIHlvdXIgZW1haWwgZm9yIGEgc2lnbi1pbiBsaW5rLicsXG4gICdzaWduSW4uY2hlY2tPdGhlclRhYic6ICdZb3UgY2FuIGNsb3NlIHRoaXMgdGFiIOKAlCB5b3UgYXJlIHNpZ25lZCBpbiB3aGVyZSB5b3Ugc3RhcnRlZC4nLFxuXG4gICdzaWduVXAudGl0bGUnOiAnQ3JlYXRlIHlvdXIgYWNjb3VudCcsXG4gICdzaWduVXAuc3VibWl0JzogJ0NvbnRpbnVlJyxcbiAgJ3NpZ25VcC5oYXZlQWNjb3VudCc6ICdBbHJlYWR5IGhhdmUgYW4gYWNjb3VudD8nLFxuICAnc2lnblVwLnNpZ25JbkxpbmsnOiAnU2lnbiBpbicsXG4gICdzaWduVXAuZW1haWxMYWJlbCc6ICdFbWFpbCBhZGRyZXNzJyxcbiAgJ3NpZ25VcC5wYXNzd29yZExhYmVsJzogJ1Bhc3N3b3JkJyxcbiAgJ3NpZ25VcC5vcHRpb25hbEZpZWxkJzogJ3tsYWJlbH0gKG9wdGlvbmFsKScsXG4gICdzaWduVXAuc2VsZWN0UGxhY2Vob2xkZXInOiAnU2VsZWN04oCmJyxcbiAgJ3NpZ25VcC5jb25zZW50QWdyZWUnOiAnSSBhZ3JlZSB0byB0aGUnLFxuICAnc2lnblVwLmNvbnNlbnROb3RpY2UnOiAnQnkgY29udGludWluZyB5b3UgYWdyZWUgdG8gdGhlJyxcbiAgJ3NpZ25VcC50ZXJtcyc6ICdUZXJtcyBvZiBTZXJ2aWNlJyxcbiAgJ3NpZ25VcC5wcml2YWN5JzogJ1ByaXZhY3kgUG9saWN5JyxcbiAgJ3NpZ25VcC5hbmQnOiAnYW5kJyxcbiAgLy8gPSBFTUFJTF9VTkFWQUlMQUJMRV9NRVNTQUdFIGZyb20gQGF0bGFzYXV0aC9qcy5cbiAgJ3NpZ25VcC5lbWFpbFVuYXZhaWxhYmxlJzpcbiAgICBcIlRoaXMgYXBwIGNhbid0IHNlbmQgZW1haWwgcmlnaHQgbm93LiBUcnkgYW5vdGhlciBzaWduLWluIG1ldGhvZCBvciBjb250YWN0IHRoZSBhcHAgb3duZXIuXCIsXG5cbiAgJ2NhcHRjaGEucHJvbXB0JzogJ0NvbXBsZXRlIHRoZSBzZWN1cml0eSBjaGVjayB0byBjb250aW51ZS4nLFxuICAnY2FwdGNoYS5yZXF1aXJlZCc6ICdQbGVhc2UgY29tcGxldGUgdGhlIHNlY3VyaXR5IGNoZWNrLCB0aGVuIHRyeSBhZ2Fpbi4nLFxuICAnY2FwdGNoYS5mYWlsZWQnOiBcIlRoZSBzZWN1cml0eSBjaGVjayBkaWRuJ3QgcGFzcy4gUGxlYXNlIHRyeSBhZ2Fpbi5cIixcblxuICAnbWZhLnRpdGxlJzogJ1R3by1zdGVwIHZlcmlmaWNhdGlvbicsXG4gICdtZmEuc3VidGl0bGUnOiAnRW50ZXIgdGhlIGNvZGUgZnJvbSB5b3VyIGF1dGhlbnRpY2F0b3IgYXBwLicsXG4gICdtZmEuY29kZUxhYmVsJzogJ0NvZGUnLFxuICAnbWZhLmVucm9sbEZpcnN0Q29kZUxhYmVsJzogJ0NvZGUgZnJvbSB5b3VyIGF1dGhlbnRpY2F0b3IgYXBwJyxcbiAgJ21mYS5lbnJvbGxTZWNvbmRDb2RlTGFiZWwnOiAnVGhlIG5leHQgY29kZSBpdCBzaG93cycsXG4gICdtZmEudXNlUGFzc2tleSc6ICdVc2UgYSBwYXNza2V5IGluc3RlYWQnLFxuICAnbWZhLnVzZUJhY2t1cENvZGUnOiAnVXNlIGEgcmVjb3ZlcnkgY29kZScsXG4gICdtZmEuc3VibWl0JzogJ1ZlcmlmeScsXG5cbiAgJ3Jlc2V0LnRpdGxlJzogJ1Jlc2V0IHlvdXIgcGFzc3dvcmQnLFxuICAncmVzZXQuc3VibWl0JzogJ1NlbmQgcmVzZXQgY29kZScsXG4gICdyZXNldC5uZXdQYXNzd29yZExhYmVsJzogJ05ldyBwYXNzd29yZCcsXG5cbiAgJ3VzZXJCdXR0b24ubWFuYWdlQWNjb3VudCc6ICdNYW5hZ2UgYWNjb3VudCcsXG4gICd1c2VyQnV0dG9uLnNpZ25PdXQnOiAnU2lnbiBvdXQnLFxuICAndXNlckJ1dHRvbi5zaWduT3V0QWxsJzogJ1NpZ24gb3V0IG9mIGFsbCBkZXZpY2VzJyxcblxuICAndXNlclByb2ZpbGUudGl0bGUnOiAnQWNjb3VudCcsXG4gICd1c2VyUHJvZmlsZS5wcm9maWxlU2VjdGlvbic6ICdQcm9maWxlJyxcbiAgJ3VzZXJQcm9maWxlLmVtYWlsc1NlY3Rpb24nOiAnRW1haWwgYWRkcmVzc2VzJyxcbiAgJ3VzZXJQcm9maWxlLnNlY3VyaXR5U2VjdGlvbic6ICdTZWN1cml0eScsXG4gICd1c2VyUHJvZmlsZS5kZXZpY2VzU2VjdGlvbic6ICdBY3RpdmUgZGV2aWNlcycsXG4gICd1c2VyUHJvZmlsZS5kYW5nZXJTZWN0aW9uJzogJ0RhbmdlciB6b25lJyxcbiAgJ3VzZXJQcm9maWxlLmFkZEVtYWlsJzogJ0FkZCBhbiBlbWFpbCBhZGRyZXNzJyxcbiAgJ3VzZXJQcm9maWxlLm1ha2VQcmltYXJ5JzogJ01ha2UgcHJpbWFyeScsXG4gICd1c2VyUHJvZmlsZS51bnZlcmlmaWVkJzogJ1VudmVyaWZpZWQnLFxuICAndXNlclByb2ZpbGUucmV2b2tlRGV2aWNlJzogJ1NpZ24gb3V0JyxcbiAgJ3VzZXJQcm9maWxlLmRlbGV0ZUFjY291bnQnOiAnRGVsZXRlIGFjY291bnQnLFxuXG4gICdvcmdhbml6YXRpb24uc3dpdGNoZXInOiAnU3dpdGNoIG9yZ2FuaXphdGlvbicsXG4gICdvcmdhbml6YXRpb24ucGVyc29uYWwnOiAnUGVyc29uYWwgYWNjb3VudCcsXG4gICdvcmdhbml6YXRpb24ubWVtYmVycyc6ICdNZW1iZXJzJyxcbiAgJ29yZ2FuaXphdGlvbi5pbnZpdGUnOiAnSW52aXRlIG1lbWJlcicsXG4gICdvcmdhbml6YXRpb24ucm9sZUxhYmVsJzogJ1JvbGUnLFxuXG4gICdlcnJvci5nZW5lcmljJzogJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLicsXG4gICdlcnJvci5uZXR3b3JrJzogJ1dlIGNvdWxkIG5vdCByZWFjaCB0aGUgc2VydmVyLiBDaGVjayB5b3VyIGNvbm5lY3Rpb24uJyxcbn07XG5cbi8qKlxuICogTG9vayB1cCBhIGtleSBhbmQgaW50ZXJwb2xhdGUgYHtwbGFjZWhvbGRlcnN9YC5cbiAqXG4gKiBBbiB1bmtub3duIHBsYWNlaG9sZGVyIGlzIGxlZnQgdmlzaWJsZSBmb3IgdGhlIHNhbWUgcmVhc29uIGEgbWlzc2luZyBrZXkgaXM6XG4gKiBgQ29udGludWUgd2l0aCB7cHJvdmlkZXJ9YCBpbiB0aGUgVUkgaXMgYSBidWcgcmVwb3J0IHdhaXRpbmcgdG8gYmUgZmlsZWQsXG4gKiB3aGVyZWFzIGBDb250aW51ZSB3aXRoIGAgaXMgb25lIG5vYm9keSBub3RpY2VzIHVudGlsIGEgY3VzdG9tZXIgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShcbiAgY2F0YWxvZzogQ2F0YWxvZyxcbiAga2V5OiBzdHJpbmcsXG4gIHZhcmlhYmxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdGVtcGxhdGUgPSBjYXRhbG9nW2tleV0gPz8gRU5fVVNba2V5XSA/PyBrZXk7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHsoXFx3KylcXH0vZywgKG1hdGNoLCBuYW1lOiBzdHJpbmcpID0+IHZhcmlhYmxlc1tuYW1lXSA/PyBtYXRjaCk7XG59XG5cbi8qKiBNZXJnZSBhIGNvbW11bml0eSBsb2NhbGUgb3ZlciBlbi1VUyBzbyBhIHBhcnRpYWwgdHJhbnNsYXRpb24gc3RpbGwgcmVuZGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRmFsbGJhY2sobG9jYWxlOiBDYXRhbG9nKTogQ2F0YWxvZyB7XG4gIHJldHVybiB7IC4uLkVOX1VTLCAuLi5sb2NhbGUgfTtcbn1cbiJdfQ==
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFZO0lBQzVCLGNBQWMsRUFBRSxTQUFTO0lBQ3pCLGlCQUFpQixFQUFFLDhCQUE4QjtJQUNqRCx3QkFBd0IsRUFBRSxlQUFlO0lBQ3pDLHNCQUFzQixFQUFFLFVBQVU7SUFDbEMsZUFBZSxFQUFFLFVBQVU7SUFDM0IsdUJBQXVCLEVBQUUsa0JBQWtCO0lBQzNDLGtCQUFrQixFQUFFLGFBQWE7SUFDakMsbUJBQW1CLEVBQUUsU0FBUztJQUM5QixrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLHFCQUFxQixFQUFFLDBCQUEwQjtJQUNqRCx1QkFBdUIsRUFBRSxtQkFBbUI7SUFDNUMscUJBQXFCLEVBQUUsaUJBQWlCO0lBQ3hDLHNCQUFzQixFQUFFLHNDQUFzQztJQUM5RCxzQkFBc0IsRUFBRSwrREFBK0Q7SUFFdkYsY0FBYyxFQUFFLHFCQUFxQjtJQUNyQyxlQUFlLEVBQUUsVUFBVTtJQUMzQixvQkFBb0IsRUFBRSwwQkFBMEI7SUFDaEQsbUJBQW1CLEVBQUUsU0FBUztJQUM5QixtQkFBbUIsRUFBRSxlQUFlO0lBQ3BDLHNCQUFzQixFQUFFLFVBQVU7SUFDbEMsc0JBQXNCLEVBQUUsb0JBQW9CO0lBQzVDLDBCQUEwQixFQUFFLFNBQVM7SUFDckMscUJBQXFCLEVBQUUsZ0JBQWdCO0lBQ3ZDLHNCQUFzQixFQUFFLGdDQUFnQztJQUN4RCxjQUFjLEVBQUUsa0JBQWtCO0lBQ2xDLGdCQUFnQixFQUFFLGdCQUFnQjtJQUNsQyxZQUFZLEVBQUUsS0FBSztJQUNuQixrREFBa0Q7SUFDbEQseUJBQXlCLEVBQ3ZCLDJGQUEyRjtJQUU3RixnQkFBZ0IsRUFBRSwwQ0FBMEM7SUFDNUQsa0JBQWtCLEVBQUUscURBQXFEO0lBQ3pFLGdCQUFnQixFQUFF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Q2hCLEdBQVcsRUFDWCxZQUFvQyxFQUFFO0lBRXRDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ25ELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUM7QUFDM0YsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQWU7SUFDMUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogwqcxMC4zOiBcIkV2ZXJ5IHN0cmluZyBwYXNzZXMgdGhyb3VnaCBhbiBpMThuIGNhdGFsb2c7IGVuLVVTIHNoaXBzLCBjYXRhbG9nXG4gKiBmb3JtYXQgZG9jdW1lbnRlZCBmb3IgY29tbXVuaXR5IGxvY2FsZXMuXCJcbiAqXG4gKiBBIGZsYXQga2V5LXRvLXN0cmluZyBtYXAgcmF0aGVyIHRoYW4gbmVzdGVkIG9iamVjdHMsIGJlY2F1c2UgbmVzdGluZyBsb29rc1xuICogdGlkaWVyIGFuZCBtYWtlcyBhIG1pc3Npbmcga2V5IGEgcnVudGltZSBjcmFzaCBvbiBgdW5kZWZpbmVkLm9mLmEuY2hhaW5gXG4gKiByYXRoZXIgdGhhbiBhIHZpc2libGUgZmFsbGJhY2suXG4gKlxuICogQSBtaXNzaW5nIGtleSByZW5kZXJzIHRoZSBLRVksIG5vdCBhbiBlbXB0eSBzdHJpbmcuIEEgYmxhbmsgYnV0dG9uIGlzIGEgYnVnXG4gKiBub2JvZHkgY2FuIHJlcG9ydDsgYSBidXR0b24gcmVhZGluZyBgc2lnbkluLnN1Ym1pdGAgaXMgb25lIGFueW9uZSBjYW4uXG4gKi9cblxuZXhwb3J0IHR5cGUgQ2F0YWxvZyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbmV4cG9ydCBjb25zdCBFTl9VUzogQ2F0YWxvZyA9IHtcbiAgJ3NpZ25Jbi50aXRsZSc6ICdTaWduIGluJyxcbiAgJ3NpZ25Jbi5zdWJ0aXRsZSc6ICd0byBjb250aW51ZSB0byB7YXBwbGljYXRpb259JyxcbiAgJ3NpZ25Jbi5pZGVudGlmaWVyTGFiZWwnOiAnRW1haWwgYWRkcmVzcycsXG4gICdzaWduSW4ucGFzc3dvcmRMYWJlbCc6ICdQYXNzd29yZCcsXG4gICdzaWduSW4uc3VibWl0JzogJ0NvbnRpbnVlJyxcbiAgJ3NpZ25Jbi5mb3Jnb3RQYXNzd29yZCc6ICdGb3Jnb3QgcGFzc3dvcmQ/JyxcbiAgJ3NpZ25Jbi5ub0FjY291bnQnOiAnTm8gYWNjb3VudD8nLFxuICAnc2lnbkluLnNpZ25VcExpbmsnOiAnU2lnbiB1cCcsXG4gICdzaWduSW4ub3JEaXZpZGVyJzogJ29yJyxcbiAgJ3NpZ25Jbi5zb2NpYWxCdXR0b24nOiAnQ29udGludWUgd2l0aCB7cHJvdmlkZXJ9JyxcbiAgJ3NpZ25Jbi5lbWFpbENvZGVMYWJlbCc6ICdWZXJpZmljYXRpb24gY29kZScsXG4gICdzaWduSW4udXNlRW1haWxDb2RlJzogJ0VtYWlsIG1lIGEgY29kZScsXG4gICdzaWduSW4ubWFnaWNMaW5rU2VudCc6ICdDaGVjayB5b3VyIGVtYWlsIGZvciBhIHNpZ24taW4gbGluay4nLFxuICAnc2lnbkluLmNoZWNrT3RoZXJUYWInOiAnWW91IGNhbiBjbG9zZSB0aGlzIHRhYiDigJQgeW91IGFyZSBzaWduZWQgaW4gd2hlcmUgeW91IHN0YXJ0ZWQuJyxcblxuICAnc2lnblVwLnRpdGxlJzogJ0NyZWF0ZSB5b3VyIGFjY291bnQnLFxuICAnc2lnblVwLnN1Ym1pdCc6ICdDb250aW51ZScsXG4gICdzaWduVXAuaGF2ZUFjY291bnQnOiAnQWxyZWFkeSBoYXZlIGFuIGFjY291bnQ/JyxcbiAgJ3NpZ25VcC5zaWduSW5MaW5rJzogJ1NpZ24gaW4nLFxuICAnc2lnblVwLmVtYWlsTGFiZWwnOiAnRW1haWwgYWRkcmVzcycsXG4gICdzaWduVXAucGFzc3dvcmRMYWJlbCc6ICdQYXNzd29yZCcsXG4gICdzaWduVXAub3B0aW9uYWxGaWVsZCc6ICd7bGFiZWx9IChvcHRpb25hbCknLFxuICAnc2lnblVwLnNlbGVjdFBsYWNlaG9sZGVyJzogJ1NlbGVjdOKApicsXG4gICdzaWduVXAuY29uc2VudEFncmVlJzogJ0kgYWdyZWUgdG8gdGhlJyxcbiAgJ3NpZ25VcC5jb25zZW50Tm90aWNlJzogJ0J5IGNvbnRpbnVpbmcgeW91IGFncmVlIHRvIHRoZScsXG4gICdzaWduVXAudGVybXMnOiAnVGVybXMgb2YgU2VydmljZScsXG4gICdzaWduVXAucHJpdmFjeSc6ICdQcml2YWN5IFBvbGljeScsXG4gICdzaWduVXAuYW5kJzogJ2FuZCcsXG4gIC8vID0gRU1BSUxfVU5BVkFJTEFCTEVfTUVTU0FHRSBmcm9tIEBhdGxhc2F1dGgvanMuXG4gICdzaWduVXAuZW1haWxVbmF2YWlsYWJsZSc6XG4gICAgXCJUaGlzIGFwcCBjYW4ndCBzZW5kIGVtYWlsIHJpZ2h0IG5vdy4gVHJ5IGFub3RoZXIgc2lnbi1pbiBtZXRob2Qgb3IgY29udGFjdCB0aGUgYXBwIG93bmVyLlwiLFxuXG4gICdjYXB0Y2hhLnByb21wdCc6ICdDb21wbGV0ZSB0aGUgc2VjdXJpdHkgY2hlY2sgdG8gY29udGludWUuJyxcbiAgJ2NhcHRjaGEucmVxdWlyZWQnOiAnUGxlYXNlIGNvbXBsZXRlIHRoZSBzZWN1cml0eSBjaGVjaywgdGhlbiB0cnkgYWdhaW4uJyxcbiAgJ2NhcHRjaGEuZmFpbGVkJzogXCJUaGUgc2VjdXJpdHkgY2hlY2sgZGlkbid0IHBhc3MuIFBsZWFzZSB0cnkgYWdhaW4uXCIsXG5cbiAgJ21mYS50aXRsZSc6ICdUd28tc3RlcCB2ZXJpZmljYXRpb24nLFxuICAnbWZhLnN1YnRpdGxlJzogJ0VudGVyIHRoZSBjb2RlIGZyb20geW91ciBhdXRoZW50aWNhdG9yIGFwcC4nLFxuICAnbWZhLmNvZGVMYWJlbCc6ICdDb2RlJyxcbiAgJ21mYS5lbnJvbGxGaXJzdENvZGVMYWJlbCc6ICdDb2RlIGZyb20geW91ciBhdXRoZW50aWNhdG9yIGFwcCcsXG4gICdtZmEuZW5yb2xsU2Vjb25kQ29kZUxhYmVsJzogJ1RoZSBuZXh0IGNvZGUgaXQgc2hvd3MnLFxuICAnbWZhLnVzZVBhc3NrZXknOiAnVXNlIGEgcGFzc2tleSBpbnN0ZWFkJyxcbiAgJ21mYS51c2VCYWNrdXBDb2RlJzogJ1VzZSBhIHJlY292ZXJ5IGNvZGUnLFxuICAnbWZhLnN1Ym1pdCc6ICdWZXJpZnknLFxuXG4gICdyZXNldC50aXRsZSc6ICdSZXNldCB5b3VyIHBhc3N3b3JkJyxcbiAgJ3Jlc2V0LnN1Ym1pdCc6ICdTZW5kIHJlc2V0IGNvZGUnLFxuICAncmVzZXQubmV3UGFzc3dvcmRMYWJlbCc6ICdOZXcgcGFzc3dvcmQnLFxuXG4gICd1c2VyQnV0dG9uLm1hbmFnZUFjY291bnQnOiAnTWFuYWdlIGFjY291bnQnLFxuICAndXNlckJ1dHRvbi5zaWduT3V0JzogJ1NpZ24gb3V0JyxcbiAgJ3VzZXJCdXR0b24uc2lnbk91dEFsbCc6ICdTaWduIG91dCBvZiBhbGwgZGV2aWNlcycsXG5cbiAgJ3VzZXJQcm9maWxlLnRpdGxlJzogJ0FjY291bnQnLFxuICAndXNlclByb2ZpbGUucHJvZmlsZVNlY3Rpb24nOiAnUHJvZmlsZScsXG4gICd1c2VyUHJvZmlsZS5lbWFpbHNTZWN0aW9uJzogJ0VtYWlsIGFkZHJlc3NlcycsXG4gICd1c2VyUHJvZmlsZS5zZWN1cml0eVNlY3Rpb24nOiAnU2VjdXJpdHknLFxuICAndXNlclByb2ZpbGUuZGV2aWNlc1NlY3Rpb24nOiAnQWN0aXZlIGRldmljZXMnLFxuICAndXNlclByb2ZpbGUuZGFuZ2VyU2VjdGlvbic6ICdEYW5nZXIgem9uZScsXG4gICd1c2VyUHJvZmlsZS5hZGRFbWFpbCc6ICdBZGQgYW4gZW1haWwgYWRkcmVzcycsXG4gICd1c2VyUHJvZmlsZS5tYWtlUHJpbWFyeSc6ICdNYWtlIHByaW1hcnknLFxuICAndXNlclByb2ZpbGUudW52ZXJpZmllZCc6ICdVbnZlcmlmaWVkJyxcbiAgJ3VzZXJQcm9maWxlLnJldm9rZURldmljZSc6ICdTaWduIG91dCcsXG4gICd1c2VyUHJvZmlsZS5kZWxldGVBY2NvdW50JzogJ0RlbGV0ZSBhY2NvdW50JyxcblxuICAnb3JnYW5pemF0aW9uLnN3aXRjaGVyJzogJ1N3aXRjaCBvcmdhbml6YXRpb24nLFxuICAnb3JnYW5pemF0aW9uLnBlcnNvbmFsJzogJ1BlcnNvbmFsIGFjY291bnQnLFxuICAnb3JnYW5pemF0aW9uLm1lbWJlcnMnOiAnTWVtYmVycycsXG4gICdvcmdhbml6YXRpb24uaW52aXRlJzogJ0ludml0ZSBtZW1iZXInLFxuICAnb3JnYW5pemF0aW9uLnJvbGVMYWJlbCc6ICdSb2xlJyxcblxuICAnZXJyb3IuZ2VuZXJpYyc6ICdTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLFxuICAnZXJyb3IubmV0d29yayc6ICdXZSBjb3VsZCBub3QgcmVhY2ggdGhlIHNlcnZlci4gQ2hlY2sgeW91ciBjb25uZWN0aW9uLicsXG5cbiAgLy8gU2VydmVyIGVycm9ycywgYnkgdGhlIHN0YWJsZSBgcmVhc29uYCB0aGUgRnJvbnRlbmQgQVBJIHNlbmRzLiBTaG93biBpbnN0ZWFkXG4gIC8vIG9mIHRoZSBzZXJ2ZXIncyBgbWVzc2FnZWAgKHNlZSBgbG9jYWxpemVkRXJyb3JNZXNzYWdlYCBpbiBAYXRsYXNhdXRoL2pzKS5cbiAgJ2Vycm9yLmZvcm1fcGFzc3dvcmRfaW5jb3JyZWN0JzogJ1Rob3NlIGNyZWRlbnRpYWxzIGFyZSBpbmNvcnJlY3QuJyxcbiAgJ2Vycm9yLmZvcm1fY29kZV9pbmNvcnJlY3QnOiAnVGhhdCBjb2RlIGlzIGluY29ycmVjdC4nLFxuICAnZXJyb3IuZm9ybV9jb2RlX2FscmVhZHlfdXNlZCc6ICdUaGF0IGNvZGUgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiBXYWl0IGZvciBhIG5ldyBvbmUuJyxcbiAgJ2Vycm9yLmZvcm1fY29kZV9leHBpcmVkJzogJ1RoYXQgY29kZSBoYXMgZXhwaXJlZC4gUmVxdWVzdCBhIG5ldyBvbmUuJyxcbiAgJ2Vycm9yLmZvcm1fY29kZV9tYXhfYXR0ZW1wdHMnOiAnVG9vIG1hbnkgaW5jb3JyZWN0IGNvZGVzLiBSZXF1ZXN0IGEgbmV3IGNvZGUuJyxcbiAgJ2Vycm9yLmZvcm1fbGlua19pbnZhbGlkJzogJ1RoYXQgc2lnbi1pbiBsaW5rIGlzIGludmFsaWQgb3IgaGFzIGFscmVhZHkgYmVlbiB1c2VkLicsXG4gICdlcnJvci5mb3JtX2lkZW50aWZpZXJfbm90X2ZvdW5kJzogXCJXZSBjb3VsZG4ndCBmaW5kIGFuIGFjY291bnQgd2l0aCB0aG9zZSBkZXRhaWxzLlwiLFxuICAnZXJyb3IuZm9ybV9pZGVudGlmaWVyX2V4aXN0cyc6IFwiVGhlcmUncyBhbHJlYWR5IGFuIGFjY291bnQgZm9yIHRoaXMgZW1haWwuIFNpZ24gaW4gd2l0aCB7bWV0aG9kc30uXCIsXG4gICdlcnJvci5mb3JtX3Bhc3N3b3JkX3B3bmVkJzogJ1RoaXMgcGFzc3dvcmQgaGFzIGFwcGVhcmVkIGluIGEga25vd24gZGF0YSBicmVhY2guIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgb25lLicsXG4gICdlcnJvci5mb3JtX3Bhc3N3b3JkX3Rvb19zaG9ydCc6ICdQYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0IHttaW5fbGVuZ3RofSBjaGFyYWN0ZXJzLicsXG4gICdlcnJvci5mb3JtX3Bhc3N3b3JkX3Rvb19sb25nJzogJ1Bhc3N3b3JkIG11c3QgYmUgYXQgbW9zdCB7bWF4X2xlbmd0aH0gY2hhcmFjdGVycy4nLFxuICAnZXJyb3IuZm9ybV9wYXNzd29yZF9yZXF1aXJlc191cHBlcmNhc2UnOiAnUGFzc3dvcmQgbXVzdCBjb250YWluIGFuIHVwcGVyY2FzZSBsZXR0ZXIuJyxcbiAgJ2Vycm9yLmZvcm1fcGFzc3dvcmRfcmVxdWlyZXNfbG93ZXJjYXNlJzogJ1Bhc3N3b3JkIG11c3QgY29udGFpbiBhIGxvd2VyY2FzZSBsZXR0ZXIuJyxcbiAgJ2Vycm9yLmZvcm1fcGFzc3dvcmRfcmVxdWlyZXNfbnVtYmVyJzogJ1Bhc3N3b3JkIG11c3QgY29udGFpbiBhIG51bWJlci4nLFxuICAnZXJyb3IuZm9ybV9wYXNzd29yZF9yZXF1aXJlc19zeW1ib2wnOiAnUGFzc3dvcmQgbXVzdCBjb250YWluIGEgc3ltYm9sLicsXG4gICdlcnJvci5mb3JtX3Bhc3N3b3JkX25vdF9hbGxvd2VkJzogJ1RoYXQgcGFzc3dvcmQgaXMgbm90IGFsbG93ZWQuIENob29zZSBhIGRpZmZlcmVudCBvbmUuJyxcbiAgJ2Vycm9yLmZvcm1fcGFzc3dvcmRfY29udGFpbnNfaWRlbnRpZmllcic6ICdQYXNzd29yZCBtdXN0IG5vdCBjb250YWluIHlvdXIgZW1haWwgb3IgdXNlcm5hbWUuJyxcbiAgJ2Vycm9yLmZvcm1fcGFzc3dvcmRfc2FtZV9hc19jdXJyZW50JzogJ1lvdXIgbmV3IHBhc3N3b3JkIG11c3QgYmUgZGlmZmVyZW50IGZyb20geW91ciBjdXJyZW50IG9uZS4nLFxuICAnZXJyb3IuZm9ybV9wYXNzd29yZF9yZXVzZWQnOiAnWW91ciBuZXcgcGFzc3dvcmQgbXVzdCBub3QgbWF0Y2ggYW55IG9mIHlvdXIgbGFzdCB7aGlzdG9yeV9jb3VudH0gcGFzc3dvcmRzLicsXG4gICdlcnJvci5wYXNzd29yZF9leHBpcmVkJzogJ1lvdXIgcGFzc3dvcmQgaGFzIGV4cGlyZWQuIFJlc2V0IGl0IHRvIGNvbnRpbnVlLicsXG4gICdlcnJvci5lbWFpbF9ub3RfdmVyaWZpZWQnOiAnWW91ciBlbWFpbCBhZGRyZXNzIGlzIG5vdCB2ZXJpZmllZCB5ZXQuIFZlcmlmeSBpdCBiZWZvcmUgc2lnbmluZyBpbiB3aXRoIHlvdXIgcGFzc3dvcmQuJyxcbiAgJ2Vycm9yLnNpZ25faW5fdG9rZW5faW52YWxpZCc6ICdUaGF0IHNpZ24taW4gdG9rZW4gaXMgaW52YWxpZCBvciBoYXMgZXhwaXJlZC4nLFxuICAnZXJyb3IudG9vX21hbnlfYXR0ZW1wdHMnOiAnVG9vIG1hbnkgZmFpbGVkIGF0dGVtcHRzLiBUcnkgYWdhaW4gbGF0ZXIuJyxcbiAgJ2Vycm9yLnRvb19tYW55X3JlcXVlc3RzJzogJ1RvbyBtYW55IHJlcXVlc3RzLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsXG4gICdlcnJvci5jYXB0Y2hhX3JlcXVpcmVkJzogJ1BsZWFzZSBjb21wbGV0ZSB0aGUgc2VjdXJpdHkgY2hlY2ssIHRoZW4gdHJ5IGFnYWluLicsXG4gICdlcnJvci5jYXB0Y2hhX2ZhaWxlZCc6IFwiVGhlIHNlY3VyaXR5IGNoZWNrIGRpZG4ndCBwYXNzLiBQbGVhc2UgdHJ5IGFnYWluLlwiLFxuICAnZXJyb3IuY2FwdGNoYV91bmF2YWlsYWJsZSc6ICdUaGUgc2VjdXJpdHkgY2hlY2sgaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsXG4gICdlcnJvci5lbWFpbF9kZWxpdmVyeV91bmF2YWlsYWJsZSc6IFwiVGhpcyBhcHAgY2FuJ3Qgc2VuZCBlbWFpbCByaWdodCBub3cuIFRyeSBhbm90aGVyIHNpZ24taW4gbWV0aG9kIG9yIGNvbnRhY3QgdGhlIGFwcCBvd25lci5cIixcbiAgJ2Vycm9yLnN0cmF0ZWd5X2Rpc2FibGVkJzogJ1RoaXMgc2lnbi1pbiBtZXRob2QgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBhcHAuJyxcbiAgJ2Vycm9yLnNpZ25fdXBfcmVzdHJpY3RlZCc6ICdTaWduLXVwIG9uIHRoaXMgYXBwIGlzIGJ5IGludml0YXRpb24gb25seS4nLFxuICAnZXJyb3Iud2FpdGxpc3RlZCc6IFwiWW91J3JlIG9uIHRoZSB3YWl0bGlzdC4gV2UnbGwgZW1haWwgeW91IHdoZW4gYSBwbGFjZSBvcGVucyB1cC5cIixcbiAgJ2Vycm9yLmlkZW50aWZpZXJfbm90X2FsbG93ZWQnOiAnVGhpcyBlbWFpbCBvciBwaG9uZSBudW1iZXIgaXMgbm90IGFsbG93ZWQgb24gdGhpcyBhcHAuJyxcbiAgJ2Vycm9yLmRpc3Bvc2FibGVfZW1haWxfYmxvY2tlZCc6ICdTaWduLXVwIHdpdGggYSBkaXNwb3NhYmxlIG9yIHRlbXBvcmFyeSBlbWFpbCBhZGRyZXNzIGlzIG5vdCBhbGxvd2VkLicsXG4gICdlcnJvci5zc29fcmVxdWlyZWQnOiAnVGhpcyBvcmdhbml6YXRpb24gcmVxdWlyZXMgc2lnbmluZyBpbiB0aHJvdWdoIHNpbmdsZSBzaWduLW9uLicsXG4gICdlcnJvci5zaWduX2luc19kaXNhYmxlZCc6ICdTaWduLWlucyBhcmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQuJyxcbiAgJ2Vycm9yLnNpZ25fdXBzX2Rpc2FibGVkJzogJ1NpZ24tdXBzIGFyZSB0ZW1wb3JhcmlseSBkaXNhYmxlZC4nLFxuICAnZXJyb3IuaGlnaF9yaXNrX2Jsb2NrZWQnOiAnVGhpcyBzaWduLWluIHdhcyBibG9ja2VkIGJlY2F1c2UgaXQgbG9va2VkIHVudXN1YWwuJyxcbiAgJ2Vycm9yLnNtc19yZWdpb25fYmxvY2tlZCc6ICdUZXh0IG1lc3NhZ2VzIGFyZSBub3QgYXZhaWxhYmxlIGZvciB0aGlzIHBob25lIG51bWJlci4nLFxufTtcblxuLyoqXG4gKiBMb29rIHVwIGEga2V5IGFuZCBpbnRlcnBvbGF0ZSBge3BsYWNlaG9sZGVyc31gLlxuICpcbiAqIEFuIHVua25vd24gcGxhY2Vob2xkZXIgaXMgbGVmdCB2aXNpYmxlIGZvciB0aGUgc2FtZSByZWFzb24gYSBtaXNzaW5nIGtleSBpczpcbiAqIGBDb250aW51ZSB3aXRoIHtwcm92aWRlcn1gIGluIHRoZSBVSSBpcyBhIGJ1ZyByZXBvcnQgd2FpdGluZyB0byBiZSBmaWxlZCxcbiAqIHdoZXJlYXMgYENvbnRpbnVlIHdpdGggYCBpcyBvbmUgbm9ib2R5IG5vdGljZXMgdW50aWwgYSBjdXN0b21lciBkb2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKFxuICBjYXRhbG9nOiBDYXRhbG9nLFxuICBrZXk6IHN0cmluZyxcbiAgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGNhdGFsb2dba2V5XSA/PyBFTl9VU1trZXldID8/IGtleTtcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xceyhcXHcrKVxcfS9nLCAobWF0Y2gsIG5hbWU6IHN0cmluZykgPT4gdmFyaWFibGVzW25hbWVdID8/IG1hdGNoKTtcbn1cblxuLyoqIE1lcmdlIGEgY29tbXVuaXR5IGxvY2FsZSBvdmVyIGVuLVVTIHNvIGEgcGFydGlhbCB0cmFuc2xhdGlvbiBzdGlsbCByZW5kZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhGYWxsYmFjayhsb2NhbGU6IENhdGFsb2cpOiBDYXRhbG9nIHtcbiAgcmV0dXJuIHsgLi4uRU5fVVMsIC4uLmxvY2FsZSB9O1xufVxuIl19
@@ -4,7 +4,7 @@ import { isPlatformBrowser, DOCUMENT } from '@angular/common';
4
4
  import { toSignal } from '@angular/core/rxjs-interop';
5
5
  import { BehaviorSubject, combineLatest, firstValueFrom } from 'rxjs';
6
6
  import { map, distinctUntilChanged, filter, take } from 'rxjs/operators';
7
- import { TokenCache, resolveFrontendApi, FapiClient, SignOutGuard, getProviderToken, readRedirectResult, completeOAuthPopupLanding, mapOAuthPopupPayload, stripRedirectParams, closeOAuthPopupAfterSignIn, readExpiry, msUntilRefresh, nextStep, createCaptchaController, flowFromPending, initialFlow, fetchInstanceSettings, offeredFirstFactors, prepareFactor, signInCaptchaOptions, flowNeedsCaptcha, advanceWithCaptcha, createSignUp, shouldKeepPolling, pollAttempt } from '@atlasauth/js';
7
+ import { TokenCache, resolveFrontendApi, catalogLocale, FapiClient, SignOutGuard, localizedErrorMessage, getProviderToken, readRedirectResult, completeOAuthPopupLanding, mapOAuthPopupPayload, stripRedirectParams, closeOAuthPopupAfterSignIn, readExpiry, msUntilRefresh, nextStep, createCaptchaController, flowFromPending, initialFlow, fetchInstanceSettings, offeredFirstFactors, prepareFactor, signInCaptchaOptions, flowNeedsCaptcha, advanceWithCaptcha, createSignUp, shouldKeepPolling, pollAttempt } from '@atlasauth/js';
8
8
  export { FapiClient, SignOutError, advance, flowFromPending, getProviderToken, initialFlow, pollAttempt, prepareFactor, requestForStep, shouldKeepPolling } from '@atlasauth/js';
9
9
  import { evaluate } from '@atlasauth/authz';
10
10
  export { evaluate, hasFromClaims } from '@atlasauth/authz';
@@ -220,6 +220,46 @@ const EN_US = {
220
220
  'organization.roleLabel': 'Role',
221
221
  'error.generic': 'Something went wrong. Please try again.',
222
222
  'error.network': 'We could not reach the server. Check your connection.',
223
+ // Server errors, by the stable `reason` the Frontend API sends. Shown instead
224
+ // of the server's `message` (see `localizedErrorMessage` in @atlasauth/js).
225
+ 'error.form_password_incorrect': 'Those credentials are incorrect.',
226
+ 'error.form_code_incorrect': 'That code is incorrect.',
227
+ 'error.form_code_already_used': 'That code has already been used. Wait for a new one.',
228
+ 'error.form_code_expired': 'That code has expired. Request a new one.',
229
+ 'error.form_code_max_attempts': 'Too many incorrect codes. Request a new code.',
230
+ 'error.form_link_invalid': 'That sign-in link is invalid or has already been used.',
231
+ 'error.form_identifier_not_found': "We couldn't find an account with those details.",
232
+ 'error.form_identifier_exists': "There's already an account for this email. Sign in with {methods}.",
233
+ 'error.form_password_pwned': 'This password has appeared in a known data breach. Please choose a different one.',
234
+ 'error.form_password_too_short': 'Password must be at least {min_length} characters.',
235
+ 'error.form_password_too_long': 'Password must be at most {max_length} characters.',
236
+ 'error.form_password_requires_uppercase': 'Password must contain an uppercase letter.',
237
+ 'error.form_password_requires_lowercase': 'Password must contain a lowercase letter.',
238
+ 'error.form_password_requires_number': 'Password must contain a number.',
239
+ 'error.form_password_requires_symbol': 'Password must contain a symbol.',
240
+ 'error.form_password_not_allowed': 'That password is not allowed. Choose a different one.',
241
+ 'error.form_password_contains_identifier': 'Password must not contain your email or username.',
242
+ 'error.form_password_same_as_current': 'Your new password must be different from your current one.',
243
+ 'error.form_password_reused': 'Your new password must not match any of your last {history_count} passwords.',
244
+ 'error.password_expired': 'Your password has expired. Reset it to continue.',
245
+ 'error.email_not_verified': 'Your email address is not verified yet. Verify it before signing in with your password.',
246
+ 'error.sign_in_token_invalid': 'That sign-in token is invalid or has expired.',
247
+ 'error.too_many_attempts': 'Too many failed attempts. Try again later.',
248
+ 'error.too_many_requests': 'Too many requests. Please try again later.',
249
+ 'error.captcha_required': 'Please complete the security check, then try again.',
250
+ 'error.captcha_failed': "The security check didn't pass. Please try again.",
251
+ 'error.captcha_unavailable': 'The security check is unavailable right now. Please try again later.',
252
+ 'error.email_delivery_unavailable': "This app can't send email right now. Try another sign-in method or contact the app owner.",
253
+ 'error.strategy_disabled': 'This sign-in method is not available for this app.',
254
+ 'error.sign_up_restricted': 'Sign-up on this app is by invitation only.',
255
+ 'error.waitlisted': "You're on the waitlist. We'll email you when a place opens up.",
256
+ 'error.identifier_not_allowed': 'This email or phone number is not allowed on this app.',
257
+ 'error.disposable_email_blocked': 'Sign-up with a disposable or temporary email address is not allowed.',
258
+ 'error.sso_required': 'This organization requires signing in through single sign-on.',
259
+ 'error.sign_ins_disabled': 'Sign-ins are temporarily disabled.',
260
+ 'error.sign_ups_disabled': 'Sign-ups are temporarily disabled.',
261
+ 'error.high_risk_blocked': 'This sign-in was blocked because it looked unusual.',
262
+ 'error.sms_region_blocked': 'Text messages are not available for this phone number.',
223
263
  };
224
264
  /**
225
265
  * Look up a key and interpolate `{placeholders}`.
@@ -274,6 +314,10 @@ class AtlasService {
274
314
  guard;
275
315
  stopWatchingSignOut = null;
276
316
  catalog;
317
+ /** The language layer of `catalog` (the `localization` bundle alone; `EN_US` when none). */
318
+ errorCatalog;
319
+ /** Sent to the Frontend API as `Accept-Language`: the `localization` bundle's `locale` tag. */
320
+ requestLocale;
277
321
  /**
278
322
  * A sign-in attempt handed back by an OAuth redirect that still needs a second
279
323
  * factor (no session was issued). Null in the ordinary case; the `<atlas-sign-in>`
@@ -329,10 +373,13 @@ class AtlasService {
329
373
  });
330
374
  this.doFetch = options.fetchImpl ?? ((...args) => fetch(...args));
331
375
  this.catalog = options.localization ? withFallback(options.localization) : EN_US;
376
+ this.errorCatalog = options.localization ?? EN_US;
377
+ this.requestLocale = catalogLocale(options.localization);
332
378
  this.fapiClient = new FapiClient({
333
379
  publishableKey: this.publishableKey,
334
380
  baseUrl: this.baseUrl,
335
381
  fetchImpl: this.doFetch,
382
+ locale: this.requestLocale,
336
383
  });
337
384
  this.guard = new SignOutGuard({
338
385
  request: (path, init) => this.call(path, init),
@@ -375,6 +422,22 @@ class AtlasService {
375
422
  get frontendApi() {
376
423
  return this.baseUrl;
377
424
  }
425
+ /** The `Accept-Language` sent to the Frontend API: the `localization` bundle's `locale` tag, if any. */
426
+ get locale() {
427
+ return this.requestLocale;
428
+ }
429
+ /**
430
+ * The text to show for a server error, in the app's language: the catalog's
431
+ * `error.<reason>` (looked up in the `localization` bundle, or `EN_US` when
432
+ * none is set), else the server's message, else `error.generic`.
433
+ */
434
+ errorText(error) {
435
+ return localizedErrorMessage(error, this.errorCatalog, this.catalog);
436
+ }
437
+ /** The catalog server errors are looked up in (see {@link errorText}). */
438
+ get errorLocalization() {
439
+ return this.errorCatalog;
440
+ }
378
441
  /** Tokens as CSS custom properties, for a host element to inherit. */
379
442
  appearanceVariables() {
380
443
  return cssVariables(resolveTokens(this.options.appearance));
@@ -408,7 +471,11 @@ class AtlasService {
408
471
  }
409
472
  /** A fresh {@link FapiClient} for driving a sign-in/sign-up flow. */
410
473
  createFapiClient() {
411
- return new FapiClient({ publishableKey: this.publishableKey, baseUrl: this.baseUrl });
474
+ return new FapiClient({
475
+ publishableKey: this.publishableKey,
476
+ baseUrl: this.baseUrl,
477
+ locale: this.requestLocale,
478
+ });
412
479
  }
413
480
  // --- Imperative API (mirrors the React hooks' actions) ----------------------
414
481
  /**
@@ -975,6 +1042,12 @@ class AttemptFlowComponent {
975
1042
  t(key, vars) {
976
1043
  return translate(this.atlas.localization, key, vars);
977
1044
  }
1045
+ /** A server error in the app's language (`error.<reason>`, else the server's message). */
1046
+ errorText(error) {
1047
+ // `errorLocalization` is read defensively: a stand-in service may lack it.
1048
+ const layer = this.atlas.errorLocalization;
1049
+ return localizedErrorMessage(error, layer ?? this.atlas.localization, this.atlas.localization);
1050
+ }
978
1051
  cls(key, base) {
979
1052
  return classFor(key, this.atlas.appearance, base);
980
1053
  }
@@ -1067,7 +1140,7 @@ class AttemptFlowComponent {
1067
1140
  <h1 [class]="cls('headerTitle', 'atlas-title')">{{ t(titleKey) }}</h1>
1068
1141
 
1069
1142
  @for (error of formErrors(); track error.code) {
1070
- <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ error.message }}</p>
1143
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ errorText(error) }}</p>
1071
1144
  }
1072
1145
 
1073
1146
  <form (submit)="onSubmit($event)">
@@ -1083,7 +1156,7 @@ class AttemptFlowComponent {
1083
1156
  (input)="setValue(f.name, $any($event.target).value)"
1084
1157
  />
1085
1158
  @for (error of fieldErrorsFor(f.name); track error.code) {
1086
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1159
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1087
1160
  }
1088
1161
  </label>
1089
1162
  } @else {
@@ -1127,7 +1200,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1127
1200
  <h1 [class]="cls('headerTitle', 'atlas-title')">{{ t(titleKey) }}</h1>
1128
1201
 
1129
1202
  @for (error of formErrors(); track error.code) {
1130
- <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ error.message }}</p>
1203
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ errorText(error) }}</p>
1131
1204
  }
1132
1205
 
1133
1206
  <form (submit)="onSubmit($event)">
@@ -1143,7 +1216,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1143
1216
  (input)="setValue(f.name, $any($event.target).value)"
1144
1217
  />
1145
1218
  @for (error of fieldErrorsFor(f.name); track error.code) {
1146
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1219
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1147
1220
  }
1148
1221
  </label>
1149
1222
  } @else {
@@ -1497,6 +1570,12 @@ class SignUpFormComponent {
1497
1570
  t(key, vars) {
1498
1571
  return translate(this.atlas.localization, key, vars);
1499
1572
  }
1573
+ /** A server error in the app's language (`error.<reason>`, else the server's message). */
1574
+ errorText(error) {
1575
+ // `errorLocalization` is read defensively: a stand-in service may lack it.
1576
+ const layer = this.atlas.errorLocalization;
1577
+ return localizedErrorMessage(error, layer ?? this.atlas.localization, this.atlas.localization);
1578
+ }
1500
1579
  cls(key, base) {
1501
1580
  return classFor(key, this.atlas.appearance, base);
1502
1581
  }
@@ -1565,7 +1644,7 @@ class SignUpFormComponent {
1565
1644
  </p>
1566
1645
  } @else {
1567
1646
  @for (error of formErrors(); track error.code) {
1568
- <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ error.message }}</p>
1647
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ errorText(error) }}</p>
1569
1648
  }
1570
1649
 
1571
1650
  <form (submit)="onSubmit($event)">
@@ -1588,7 +1667,7 @@ class SignUpFormComponent {
1588
1667
  }
1589
1668
  </span>
1590
1669
  @for (error of fieldErrorsFor(f.key); track error.code) {
1591
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1670
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1592
1671
  }
1593
1672
  </div>
1594
1673
  } @else {
@@ -1636,7 +1715,7 @@ class SignUpFormComponent {
1636
1715
  />
1637
1716
  }
1638
1717
  @for (error of fieldErrorsFor(f.key); track error.code) {
1639
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1718
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1640
1719
  }
1641
1720
  </label>
1642
1721
  }
@@ -1654,7 +1733,7 @@ class SignUpFormComponent {
1654
1733
  (input)="setValue('email', $any($event.target).value)"
1655
1734
  />
1656
1735
  @for (error of fieldErrorsFor('email'); track error.code) {
1657
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1736
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1658
1737
  }
1659
1738
  </label>
1660
1739
 
@@ -1670,7 +1749,7 @@ class SignUpFormComponent {
1670
1749
  (input)="setValue('password', $any($event.target).value)"
1671
1750
  />
1672
1751
  @for (error of fieldErrorsFor('password'); track error.code) {
1673
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1752
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1674
1753
  }
1675
1754
  </label>
1676
1755
 
@@ -1697,7 +1776,7 @@ class SignUpFormComponent {
1697
1776
  }.
1698
1777
  </span>
1699
1778
  @for (error of fieldErrorsFor('consent'); track error.code) {
1700
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1779
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1701
1780
  }
1702
1781
  </label>
1703
1782
  }
@@ -1737,7 +1816,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1737
1816
  </p>
1738
1817
  } @else {
1739
1818
  @for (error of formErrors(); track error.code) {
1740
- <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ error.message }}</p>
1819
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ errorText(error) }}</p>
1741
1820
  }
1742
1821
 
1743
1822
  <form (submit)="onSubmit($event)">
@@ -1760,7 +1839,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1760
1839
  }
1761
1840
  </span>
1762
1841
  @for (error of fieldErrorsFor(f.key); track error.code) {
1763
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1842
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1764
1843
  }
1765
1844
  </div>
1766
1845
  } @else {
@@ -1808,7 +1887,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1808
1887
  />
1809
1888
  }
1810
1889
  @for (error of fieldErrorsFor(f.key); track error.code) {
1811
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1890
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1812
1891
  }
1813
1892
  </label>
1814
1893
  }
@@ -1826,7 +1905,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1826
1905
  (input)="setValue('email', $any($event.target).value)"
1827
1906
  />
1828
1907
  @for (error of fieldErrorsFor('email'); track error.code) {
1829
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1908
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1830
1909
  }
1831
1910
  </label>
1832
1911
 
@@ -1842,7 +1921,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1842
1921
  (input)="setValue('password', $any($event.target).value)"
1843
1922
  />
1844
1923
  @for (error of fieldErrorsFor('password'); track error.code) {
1845
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1924
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1846
1925
  }
1847
1926
  </label>
1848
1927
 
@@ -1869,7 +1948,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1869
1948
  }.
1870
1949
  </span>
1871
1950
  @for (error of fieldErrorsFor('consent'); track error.code) {
1872
- <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
1951
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
1873
1952
  }
1874
1953
  </label>
1875
1954
  }