@keycloakify/angular 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/338.index.js CHANGED
@@ -173,6 +173,72 @@ function getThisCodebaseRootDirPath() {
173
173
  }
174
174
 
175
175
 
176
+ /***/ }),
177
+
178
+ /***/ 49:
179
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
180
+
181
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
182
+ /* harmony export */ J: () => (/* binding */ runFormat)
183
+ /* harmony export */ });
184
+ /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(896);
185
+ /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);
186
+ /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(928);
187
+ /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__);
188
+ /* harmony import */ var tsafe_assert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(966);
189
+ /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(797);
190
+ /* harmony import */ var tsafe_id__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(94);
191
+ /* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(383);
192
+ /* harmony import */ var tsafe_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(289);
193
+ /* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(317);
194
+ /* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(child_process__WEBPACK_IMPORTED_MODULE_4__);
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+ function runFormat(params) {
204
+ const { packageJsonFilePath } = params;
205
+ const parsedPackageJson = (() => {
206
+ const zParsedPackageJson = (() => {
207
+ const zTargetType = zod__WEBPACK_IMPORTED_MODULE_5__.z.object({
208
+ scripts: zod__WEBPACK_IMPORTED_MODULE_5__.z.record(zod__WEBPACK_IMPORTED_MODULE_5__.z.string()).optional()
209
+ });
210
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_2__/* .assert */ .v)();
211
+ return (0,tsafe_id__WEBPACK_IMPORTED_MODULE_6__.id)(zTargetType);
212
+ })();
213
+ const parsedPackageJson = JSON.parse(fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(packageJsonFilePath).toString('utf8'));
214
+ zParsedPackageJson.parse(parsedPackageJson);
215
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_2__/* .assert */ .v)((0,tsafe_is__WEBPACK_IMPORTED_MODULE_3__.is)(parsedPackageJson));
216
+ return parsedPackageJson;
217
+ })();
218
+ const { scripts } = parsedPackageJson;
219
+ if (scripts === undefined) {
220
+ return;
221
+ }
222
+ for (const scriptName of ['format', 'lint']) {
223
+ if (!(scriptName in scripts)) {
224
+ continue;
225
+ }
226
+ const command = `npm run ${scriptName}`;
227
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Ay.grey(`$ ${command}`));
228
+ try {
229
+ child_process__WEBPACK_IMPORTED_MODULE_4__.execSync(`npm run ${scriptName}`, {
230
+ stdio: 'inherit',
231
+ cwd: (0,path__WEBPACK_IMPORTED_MODULE_1__.dirname)(packageJsonFilePath)
232
+ });
233
+ }
234
+ catch (_a) {
235
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Ay.yellow(`\`${command}\` failed, please format your code manually, continuing...`));
236
+ }
237
+ return;
238
+ }
239
+ }
240
+
241
+
176
242
  /***/ }),
177
243
 
178
244
  /***/ 758:
@@ -185,6 +251,8 @@ function getThisCodebaseRootDirPath() {
185
251
  /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);
186
252
  /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(928);
187
253
  /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__);
254
+ /* harmony import */ var _tools_runFormat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(49);
255
+
188
256
 
189
257
 
190
258
  function command(params) {
@@ -195,13 +263,8 @@ function command(params) {
195
263
  : undefined;
196
264
  const implementedThemeTypes = ['login', 'account'].filter(themeType => buildContext.implementedThemeTypes[themeType].isImplemented);
197
265
  const newContent = Buffer.from([
198
- `/* prettier-ignore-start */`,
199
- ``,
200
- `/* eslint-disable */`,
201
266
  ``,
202
- `// noinspection JSUnusedGlobalSymbols`,
203
- ``,
204
- `// This file is auto-generated by Keycloakify`,
267
+ `// This file is auto-generated by Keycloakify, do not modify it manually.`,
205
268
  ``,
206
269
  `import type { ComponentRef, EnvironmentProviders, Type } from "@angular/core";`,
207
270
  ``,
@@ -226,6 +289,7 @@ function command(params) {
226
289
  `}`,
227
290
  ``,
228
291
  `type ApplicationRefLike = {`,
292
+ ` // eslint-disable-next-line @typescript-eslint/no-explicit-any`,
229
293
  ` components: ComponentRef<any>[];`,
230
294
  `};`,
231
295
  ``,
@@ -299,14 +363,13 @@ function command(params) {
299
363
  .flat(),
300
364
  ` }`,
301
365
  `}`,
302
- ``,
303
- `/* prettier-ignore-end */`,
304
366
  ``
305
367
  ].join('\n'), 'utf8');
306
368
  if (currentContent !== undefined && currentContent.equals(newContent)) {
307
369
  return;
308
370
  }
309
371
  fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync(filePath, newContent);
372
+ (0,_tools_runFormat__WEBPACK_IMPORTED_MODULE_2__/* .runFormat */ .J)({ packageJsonFilePath: buildContext.packageJsonFilePath });
310
373
  }
311
374
 
312
375
 
package/bin/758.index.js CHANGED
@@ -3,6 +3,72 @@ exports.id = 758;
3
3
  exports.ids = [758];
4
4
  exports.modules = {
5
5
 
6
+ /***/ 49:
7
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8
+
9
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
10
+ /* harmony export */ J: () => (/* binding */ runFormat)
11
+ /* harmony export */ });
12
+ /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(896);
13
+ /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);
14
+ /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(928);
15
+ /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__);
16
+ /* harmony import */ var tsafe_assert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(966);
17
+ /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(797);
18
+ /* harmony import */ var tsafe_id__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(94);
19
+ /* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(383);
20
+ /* harmony import */ var tsafe_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(289);
21
+ /* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(317);
22
+ /* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(child_process__WEBPACK_IMPORTED_MODULE_4__);
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+ function runFormat(params) {
32
+ const { packageJsonFilePath } = params;
33
+ const parsedPackageJson = (() => {
34
+ const zParsedPackageJson = (() => {
35
+ const zTargetType = zod__WEBPACK_IMPORTED_MODULE_5__.z.object({
36
+ scripts: zod__WEBPACK_IMPORTED_MODULE_5__.z.record(zod__WEBPACK_IMPORTED_MODULE_5__.z.string()).optional()
37
+ });
38
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_2__/* .assert */ .v)();
39
+ return (0,tsafe_id__WEBPACK_IMPORTED_MODULE_6__.id)(zTargetType);
40
+ })();
41
+ const parsedPackageJson = JSON.parse(fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(packageJsonFilePath).toString('utf8'));
42
+ zParsedPackageJson.parse(parsedPackageJson);
43
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_2__/* .assert */ .v)((0,tsafe_is__WEBPACK_IMPORTED_MODULE_3__.is)(parsedPackageJson));
44
+ return parsedPackageJson;
45
+ })();
46
+ const { scripts } = parsedPackageJson;
47
+ if (scripts === undefined) {
48
+ return;
49
+ }
50
+ for (const scriptName of ['format', 'lint']) {
51
+ if (!(scriptName in scripts)) {
52
+ continue;
53
+ }
54
+ const command = `npm run ${scriptName}`;
55
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Ay.grey(`$ ${command}`));
56
+ try {
57
+ child_process__WEBPACK_IMPORTED_MODULE_4__.execSync(`npm run ${scriptName}`, {
58
+ stdio: 'inherit',
59
+ cwd: (0,path__WEBPACK_IMPORTED_MODULE_1__.dirname)(packageJsonFilePath)
60
+ });
61
+ }
62
+ catch (_a) {
63
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Ay.yellow(`\`${command}\` failed, please format your code manually, continuing...`));
64
+ }
65
+ return;
66
+ }
67
+ }
68
+
69
+
70
+ /***/ }),
71
+
6
72
  /***/ 758:
7
73
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8
74
 
@@ -13,6 +79,8 @@ exports.modules = {
13
79
  /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);
14
80
  /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(928);
15
81
  /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__);
82
+ /* harmony import */ var _tools_runFormat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(49);
83
+
16
84
 
17
85
 
18
86
  function command(params) {
@@ -23,13 +91,8 @@ function command(params) {
23
91
  : undefined;
24
92
  const implementedThemeTypes = ['login', 'account'].filter(themeType => buildContext.implementedThemeTypes[themeType].isImplemented);
25
93
  const newContent = Buffer.from([
26
- `/* prettier-ignore-start */`,
27
94
  ``,
28
- `/* eslint-disable */`,
29
- ``,
30
- `// noinspection JSUnusedGlobalSymbols`,
31
- ``,
32
- `// This file is auto-generated by Keycloakify`,
95
+ `// This file is auto-generated by Keycloakify, do not modify it manually.`,
33
96
  ``,
34
97
  `import type { ComponentRef, EnvironmentProviders, Type } from "@angular/core";`,
35
98
  ``,
@@ -54,6 +117,7 @@ function command(params) {
54
117
  `}`,
55
118
  ``,
56
119
  `type ApplicationRefLike = {`,
120
+ ` // eslint-disable-next-line @typescript-eslint/no-explicit-any`,
57
121
  ` components: ComponentRef<any>[];`,
58
122
  `};`,
59
123
  ``,
@@ -127,14 +191,13 @@ function command(params) {
127
191
  .flat(),
128
192
  ` }`,
129
193
  `}`,
130
- ``,
131
- `/* prettier-ignore-end */`,
132
194
  ``
133
195
  ].join('\n'), 'utf8');
134
196
  if (currentContent !== undefined && currentContent.equals(newContent)) {
135
197
  return;
136
198
  }
137
199
  fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync(filePath, newContent);
200
+ (0,_tools_runFormat__WEBPACK_IMPORTED_MODULE_2__/* .runFormat */ .J)({ packageJsonFilePath: buildContext.packageJsonFilePath });
138
201
  }
139
202
 
140
203
 
package/bin/925.index.js CHANGED
@@ -257,14 +257,8 @@ function replaceAll(string, searchValue, replaceValue) {
257
257
  return string.replace(regexFromString, replaceValue);
258
258
  }
259
259
 
260
- // EXTERNAL MODULE: ./node_modules/tsafe/esm/id.mjs
261
- var id = __webpack_require__(94);
262
- // EXTERNAL MODULE: ./node_modules/zod/lib/index.mjs
263
- var lib = __webpack_require__(383);
264
- // EXTERNAL MODULE: ./node_modules/tsafe/esm/is.mjs
265
- var is = __webpack_require__(289);
266
- // EXTERNAL MODULE: external "child_process"
267
- var external_child_process_ = __webpack_require__(317);
260
+ // EXTERNAL MODULE: ./dist/bin/tools/runFormat.js
261
+ var runFormat = __webpack_require__(49);
268
262
  ;// CONCATENATED MODULE: ./dist/bin/eject-page.js
269
263
 
270
264
 
@@ -278,9 +272,6 @@ var external_child_process_ = __webpack_require__(317);
278
272
 
279
273
 
280
274
 
281
-
282
-
283
-
284
275
  async function command(params) {
285
276
  const { buildContext } = params;
286
277
  console.log(source/* default */.Ay.cyan('Theme type:'));
@@ -399,42 +390,9 @@ async function command(params) {
399
390
  console.log(`${source/* default */.Ay.green('✓')} ${source/* default */.Ay.bold(`.${external_path_.sep}` + (0,external_path_.relative)(process.cwd(), destDirPath))} moved from the @keycloakify/angular to your project`);
400
391
  }
401
392
  }
402
- run_format: {
403
- const parsedPackageJson = (() => {
404
- const zParsedPackageJson = (() => {
405
- const zTargetType = lib.z.object({
406
- scripts: lib.z.record(lib.z.string()).optional()
407
- });
408
- (0,assert/* assert */.v)();
409
- return (0,id.id)(zTargetType);
410
- })();
411
- const parsedPackageJson = JSON.parse(external_fs_.readFileSync(buildContext.packageJsonFilePath).toString('utf8'));
412
- zParsedPackageJson.parse(parsedPackageJson);
413
- (0,assert/* assert */.v)((0,is.is)(parsedPackageJson));
414
- return parsedPackageJson;
415
- })();
416
- const { scripts } = parsedPackageJson;
417
- if (scripts === undefined) {
418
- break run_format;
419
- }
420
- for (const scriptName of ['format', 'lint']) {
421
- if (!(scriptName in scripts)) {
422
- continue;
423
- }
424
- const command = `npm run ${scriptName}`;
425
- console.log(source/* default */.Ay.grey(`$ ${command}`));
426
- try {
427
- external_child_process_.execSync(`npm run ${scriptName}`, {
428
- stdio: 'inherit',
429
- cwd: (0,external_path_.dirname)(buildContext.packageJsonFilePath)
430
- });
431
- }
432
- catch (_a) {
433
- console.log(source/* default */.Ay.yellow(`\`${command}\` failed, please format your code manually, continuing...`));
434
- }
435
- break run_format;
436
- }
437
- }
393
+ (0,runFormat/* runFormat */.J)({
394
+ packageJsonFilePath: buildContext.packageJsonFilePath
395
+ });
438
396
  edit_KcPage: {
439
397
  if (pageIdOrComponent !== templateValue &&
440
398
  pageIdOrComponent !== userProfileFormFieldsValue) {
@@ -540,6 +498,72 @@ function getThisCodebaseRootDirPath() {
540
498
  }
541
499
 
542
500
 
501
+ /***/ }),
502
+
503
+ /***/ 49:
504
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
505
+
506
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
507
+ /* harmony export */ J: () => (/* binding */ runFormat)
508
+ /* harmony export */ });
509
+ /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(896);
510
+ /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);
511
+ /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(928);
512
+ /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__);
513
+ /* harmony import */ var tsafe_assert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(966);
514
+ /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(797);
515
+ /* harmony import */ var tsafe_id__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(94);
516
+ /* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(383);
517
+ /* harmony import */ var tsafe_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(289);
518
+ /* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(317);
519
+ /* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(child_process__WEBPACK_IMPORTED_MODULE_4__);
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+
528
+ function runFormat(params) {
529
+ const { packageJsonFilePath } = params;
530
+ const parsedPackageJson = (() => {
531
+ const zParsedPackageJson = (() => {
532
+ const zTargetType = zod__WEBPACK_IMPORTED_MODULE_5__.z.object({
533
+ scripts: zod__WEBPACK_IMPORTED_MODULE_5__.z.record(zod__WEBPACK_IMPORTED_MODULE_5__.z.string()).optional()
534
+ });
535
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_2__/* .assert */ .v)();
536
+ return (0,tsafe_id__WEBPACK_IMPORTED_MODULE_6__.id)(zTargetType);
537
+ })();
538
+ const parsedPackageJson = JSON.parse(fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(packageJsonFilePath).toString('utf8'));
539
+ zParsedPackageJson.parse(parsedPackageJson);
540
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_2__/* .assert */ .v)((0,tsafe_is__WEBPACK_IMPORTED_MODULE_3__.is)(parsedPackageJson));
541
+ return parsedPackageJson;
542
+ })();
543
+ const { scripts } = parsedPackageJson;
544
+ if (scripts === undefined) {
545
+ return;
546
+ }
547
+ for (const scriptName of ['format', 'lint']) {
548
+ if (!(scriptName in scripts)) {
549
+ continue;
550
+ }
551
+ const command = `npm run ${scriptName}`;
552
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Ay.grey(`$ ${command}`));
553
+ try {
554
+ child_process__WEBPACK_IMPORTED_MODULE_4__.execSync(`npm run ${scriptName}`, {
555
+ stdio: 'inherit',
556
+ cwd: (0,path__WEBPACK_IMPORTED_MODULE_1__.dirname)(packageJsonFilePath)
557
+ });
558
+ }
559
+ catch (_a) {
560
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Ay.yellow(`\`${command}\` failed, please format your code manually, continuing...`));
561
+ }
562
+ return;
563
+ }
564
+ }
565
+
566
+
543
567
  /***/ }),
544
568
 
545
569
  /***/ 672:
package/bin/main.js CHANGED
@@ -442,7 +442,7 @@ const { buildContext, commandName } = readParams({ apiVersion: 'v1' });
442
442
  return;
443
443
  case 'update-kc-gen':
444
444
  {
445
- const { command } = await __nccwpck_require__.e(/* import() */ 758).then(__nccwpck_require__.bind(__nccwpck_require__, 758));
445
+ const { command } = await Promise.all(/* import() */[__nccwpck_require__.e(603), __nccwpck_require__.e(758)]).then(__nccwpck_require__.bind(__nccwpck_require__, 758));
446
446
  command({ buildContext });
447
447
  }
448
448
  return;
@@ -24,6 +24,8 @@ export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
24
24
  this.socialProvidersNode = viewChild('socialProvidersNode');
25
25
  this.toggleRecoveryCodesConfirmation = signal(false);
26
26
  this.olRecoveryCodesListId = 'kc-recovery-codes-list';
27
+ }
28
+ ngAfterViewInit() {
27
29
  this.loginResourceInjectorService.insertAdditionalScripts([
28
30
  {
29
31
  type: 'text/javascript',
@@ -159,4 +161,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
159
161
  }
160
162
  ], template: "@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n" }]
161
163
  }], ctorParameters: () => [] });
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcmVjb3ZlcnktYXV0aG4tY29kZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xvZ2luL3BhZ2VzL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dpbi9wYWdlcy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFvQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzVGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBR2xGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOENBQThDLENBQUM7O0FBZ0JoRixNQUFNLE9BQU8scUNBQXNDLFNBQVEsa0JBQWtCO0lBdUJ6RTtRQUNJLEtBQUssRUFBRSxDQUFDO1FBdkJaLGNBQVMsR0FBRyxNQUFNLENBQXlFLGdCQUFnQixDQUFDLENBQUM7UUFDN0csU0FBSSxHQUFHLE1BQU0sQ0FBTyxVQUFVLENBQUMsQ0FBQztRQUNoQyxpQ0FBNEIsR0FBRyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUUzRCxvQkFBZSxHQUFHLE1BQU0sQ0FBVSxlQUFlLENBQUMsQ0FBQztRQUNuRCxZQUFPLEdBQUcsTUFBTSxDQUFvQyxhQUFhLENBQUMsQ0FBQztRQUs1RSwwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsbUJBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV6RSxlQUFVLEdBQUcsU0FBUyxDQUEyQixZQUFZLENBQUMsQ0FBQztRQUMvRCxhQUFRLEdBQUcsU0FBUyxDQUEyQixVQUFVLENBQUMsQ0FBQztRQUMzRCx3QkFBbUIsR0FBRyxTQUFTLENBQTJCLHFCQUFxQixDQUFDLENBQUM7UUFFakYsb0NBQStCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhELDBCQUFxQixHQUFHLHdCQUF3QixDQUFDO1FBSTdDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx1QkFBdUIsQ0FBQztZQUN0RDtnQkFDSSxJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMscUJBQXFCLFNBQVM7Z0JBQzFDLFdBQVcsRUFBRTs7OztrRUFJcUMsSUFBSSxDQUFDLHFCQUFxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswRUErQmxCLElBQUksQ0FBQyxxQkFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4QkF3QnRFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQzs7OEJBRXZFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMENBQTBDLENBQUMsQ0FBQzs4QkFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzhFQXNCckIsSUFBSSxDQUFDLHFCQUFxQjs7Ozs7Ozs7OztzQ0FVbEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDOztzQ0FFdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO3NDQUM1RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7aUJBYTFGO2FBQ0o7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDOzhHQTlJUSxxQ0FBcUM7a0dBQXJDLHFDQUFxQyxrRkFQbkM7WUFDUDtnQkFDSSxPQUFPLEVBQUUsa0JBQWtCO2dCQUMzQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxDQUFDO2FBQ3ZFO1NBQ0osK1lDeEJMLDY1SUFrSkEsNENEbkljLGdCQUFnQiwrRkFBRSw0QkFBNEI7OzJGQVcvQyxxQ0FBcUM7a0JBYmpELFNBQVM7aUNBQ00sSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsNEJBQTRCLENBQUMsWUFDL0MscUNBQXFDLG1CQUU5Qix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNDQUFzQyxDQUFDO3lCQUN2RTtxQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGZvcndhcmRSZWYsIGluamVjdCwgc2lnbmFsLCB0eXBlIFRlbXBsYXRlUmVmLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVTRV9ERUZBVUxUX0NTUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xpYi90b2tlbnMvdXNlLWRlZmF1bHQtY3NzJztcbmltcG9ydCB7IENvbXBvbmVudFJlZmVyZW5jZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2NsYXNzZXMvY29tcG9uZW50LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBMb2dvdXRPdGhlclNlc3Npb25zQ29tcG9uZW50IH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vY29tcG9uZW50cy9sb2dvdXQtb3RoZXItc2Vzc2lvbnMnO1xuaW1wb3J0IHsgS2NDbGFzc0RpcmVjdGl2ZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2RpcmVjdGl2ZXMva2MtY2xhc3MnO1xuaW1wb3J0IHR5cGUgeyBJMThuIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vaTE4bic7XG5pbXBvcnQgdHlwZSB7IEtjQ29udGV4dCB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL0tjQ29udGV4dCc7XG5pbXBvcnQgeyBMb2dpblJlc291cmNlSW5qZWN0b3JTZXJ2aWNlIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vc2VydmljZXMvbG9naW4tcmVzb3VyY2UtaW5qZWN0b3InO1xuaW1wb3J0IHsgTE9HSU5fQ0xBU1NFUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL3Rva2Vucy9jbGFzc2VzJztcbmltcG9ydCB7IExPR0lOX0kxOE4gfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi90b2tlbnMvaTE4bic7XG5pbXBvcnQgeyBLQ19MT0dJTl9DT05URVhUIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vdG9rZW5zL2tjLWNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBDbGFzc0tleSB9IGZyb20gJ2tleWNsb2FraWZ5L2xvZ2luL2xpYi9rY0Nsc3gnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtLY0NsYXNzRGlyZWN0aXZlLCBMb2dvdXRPdGhlclNlc3Npb25zQ29tcG9uZW50XSxcbiAgICBzZWxlY3RvcjogJ2tjLWxvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQ29tcG9uZW50UmVmZXJlbmNlLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTG9naW5SZWNvdmVyeUF1dGhuQ29kZUNvbmZpZ0NvbXBvbmVudClcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTG9naW5SZWNvdmVyeUF1dGhuQ29kZUNvbmZpZ0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudFJlZmVyZW5jZSB7XG4gICAga2NDb250ZXh0ID0gaW5qZWN0PEV4dHJhY3Q8S2NDb250ZXh0LCB7IHBhZ2VJZDogJ2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmZ0bCcgfT4+KEtDX0xPR0lOX0NPTlRFWFQpO1xuICAgIGkxOG4gPSBpbmplY3Q8STE4bj4oTE9HSU5fSTE4Tik7XG4gICAgbG9naW5SZXNvdXJjZUluamVjdG9yU2VydmljZSA9IGluamVjdChMb2dpblJlc291cmNlSW5qZWN0b3JTZXJ2aWNlKTtcblxuICAgIG92ZXJyaWRlIGRvVXNlRGVmYXVsdENzcyA9IGluamVjdDxib29sZWFuPihVU0VfREVGQVVMVF9DU1MpO1xuICAgIG92ZXJyaWRlIGNsYXNzZXMgPSBpbmplY3Q8UGFydGlhbDxSZWNvcmQ8Q2xhc3NLZXksIHN0cmluZz4+PihMT0dJTl9DTEFTU0VTKTtcblxuICAgIGRvY3VtZW50VGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBib2R5Q2xhc3NOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkaXNwbGF5UmVxdWlyZWRGaWVsZHMgPSBmYWxzZTtcbiAgICBkaXNwbGF5SW5mbyA9IHRydWU7XG4gICAgZGlzcGxheU1lc3NhZ2UgPSB0aGlzLmtjQ29udGV4dC5tZXNzYWdlc1BlckZpZWxkLmV4aXN0c0Vycm9yKCdwYXNzd29yZCcpO1xuXG4gICAgaGVhZGVyTm9kZSA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4+KCdoZWFkZXJOb2RlJyk7XG4gICAgaW5mb05vZGUgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+PignaW5mb05vZGUnKTtcbiAgICBzb2NpYWxQcm92aWRlcnNOb2RlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50Pj4oJ3NvY2lhbFByb3ZpZGVyc05vZGUnKTtcblxuICAgIHRvZ2dsZVJlY292ZXJ5Q29kZXNDb25maXJtYXRpb24gPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgb2xSZWNvdmVyeUNvZGVzTGlzdElkID0gJ2tjLXJlY292ZXJ5LWNvZGVzLWxpc3QnO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubG9naW5SZXNvdXJjZUluamVjdG9yU2VydmljZS5pbnNlcnRBZGRpdGlvbmFsU2NyaXB0cyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG4gICAgICAgICAgICAgICAgaWQ6IGAke3RoaXMub2xSZWNvdmVyeUNvZGVzTGlzdElkfS1zY3JpcHRgLFxuICAgICAgICAgICAgICAgIHRleHRDb250ZW50OiBgXG4gICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgcmVjb3ZlcnkgY29kZXMgICovXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvcHlSZWNvdmVyeUNvZGVzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcFRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIiMke3RoaXMub2xSZWNvdmVyeUNvZGVzTGlzdElkfSBsaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFRleHRhcmVhLnZhbHVlID0gdG1wVGV4dGFyZWEudmFsdWUgKyBjb2Rlc1tpXS5pbm5lclRleHQgKyBcIlxcXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRtcFRleHRhcmVhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFRleHRhcmVhLnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0bXBUZXh0YXJlYSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgY29weUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29weVJlY292ZXJ5Q29kZXNcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvcHlCdXR0b24gJiYgY29weUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29weVJlY292ZXJ5Q29kZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLyogZG93bmxvYWQgcmVjb3ZlcnkgY29kZXMgICovXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdEN1cnJlbnREYXRlVGltZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVOYW1lOiAnc2hvcnQnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYXJzZVJlY292ZXJ5Q29kZUxpc3QoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVjb3ZlcnlDb2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIjJHt0aGlzLm9sUmVjb3ZlcnlDb2Rlc0xpc3RJZH0gbGlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVjb3ZlcnlDb2RlTGlzdCA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3ZlcnlDb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvdmVyeUNvZGVMaUVsZW1lbnQgPSByZWNvdmVyeUNvZGVzW2ldLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyeUNvZGVMaXN0ICs9IHJlY292ZXJ5Q29kZUxpRWxlbWVudCArIFwiXFxcXHJcXFxcblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3ZlcnlDb2RlTGlzdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ1aWxkRG93bmxvYWRDb250ZW50KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlY292ZXJ5Q29kZUxpc3QgPSBwYXJzZVJlY292ZXJ5Q29kZUxpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVOYW1lOiAnc2hvcnQnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUJvZHlDb250ZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KHRoaXMuaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWRvd25sb2FkLWZpbGUtaGVhZGVyJykpfSArIFwiXFxcXG5cXFxcblwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyeUNvZGVMaXN0ICsgXCJcXFxcblwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KHRoaXMuaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWRvd25sb2FkLWZpbGUtZGVzY3JpcHRpb24nKSl9ICsgXCJcXFxcblxcXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1kYXRlJykpfSArIFwiIFwiICsgZm9ybWF0Q3VycmVudERhdGVUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRVcERvd25sb2FkTGlua0FuZERvd25sb2FkKGZpbGVuYW1lLCB0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZG93bmxvYWRSZWNvdmVyeUNvZGVzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXBEb3dubG9hZExpbmtBbmREb3dubG9hZCgna2MtZG93bmxvYWQtcmVjb3ZlcnktY29kZXMudHh0JywgYnVpbGREb3dubG9hZENvbnRlbnQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgZG93bmxvYWRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRvd25sb2FkUmVjb3ZlcnlDb2Rlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRCdXR0b24gJiYgZG93bmxvYWRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGRvd25sb2FkUmVjb3ZlcnlDb2Rlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLyogcHJpbnQgcmVjb3ZlcnkgY29kZXMgKi9cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRQcmludENvbnRlbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVjb3ZlcnlDb2RlTGlzdEhUTUwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnJHt0aGlzLm9sUmVjb3ZlcnlDb2Rlc0xpc3RJZH0nKS5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXGBAcGFnZSB7IHNpemU6IGF1dG87ICBtYXJnaW4tdG9wOiAwOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSB7IHdpZHRoOiA0ODBweDsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdiB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcDpmaXJzdC1vZi10eXBlIHsgbWFyZ2luLXRvcDogNDhweCB9XFxgO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJpbnRGaWxlQ29udGVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8aHRtbD48c3R5bGU+XCIgKyBzdHlsZXMgKyBcIjwvc3R5bGU+PGJvZHk+XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPHRpdGxlPmtjLWRvd25sb2FkLXJlY292ZXJ5LWNvZGVzPC90aXRsZT5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8cD5cIiArICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1oZWFkZXInKSl9ICsgXCI8L3A+XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPGRpdj5cIiArIHJlY292ZXJ5Q29kZUxpc3RIVE1MICsgXCI8L2Rpdj5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8cD5cIiArICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1kZXNjcmlwdGlvbicpKX0gKyBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8cD5cIiArICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1kYXRlJykpfSArIFwiIFwiICsgZm9ybWF0Q3VycmVudERhdGVUaW1lKCkgKyBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L2JvZHk+PC9odG1sPlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcHJpbnRSZWNvdmVyeUNvZGVzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSB3aW5kb3cub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdy5kb2N1bWVudC53cml0ZShidWlsZFByaW50Q29udGVudCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHcuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmludEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHJpbnRSZWNvdmVyeUNvZGVzXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcmludEJ1dHRvbiAmJiBwcmludEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcHJpbnRSZWNvdmVyeUNvZGVzKTtcbiAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICB9XG4gICAgICAgIF0pO1xuICAgIH1cbn1cbiIsIkBsZXQgcmVjb3ZlcnlBdXRobkNvZGVzQ29uZmlnQmVhbiA9IGtjQ29udGV4dC5yZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuO1xuQGxldCBpc0FwcEluaXRpYXRlZEFjdGlvbiA9IGtjQ29udGV4dC5pc0FwcEluaXRpYXRlZEFjdGlvbjtcblxuPG5nLXRlbXBsYXRlICNoZWFkZXJOb2RlPlxuICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2RlLWNvbmZpZy1oZWFkZXInKSB9fVxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdlxuICAgIGNsYXNzPVwicGYtYy1hbGVydCBwZi1tLXdhcm5pbmcgcGYtbS1pbmxpbmVcIlxuICAgIGFyaWEtbGFiZWw9XCJXYXJuaW5nIGFsZXJ0XCJcbiAgICBba2NDbGFzc109XCIna2NSZWNvdmVyeUNvZGVzV2FybmluZydcIlxuPlxuICAgIDxkaXYgY2xhc3M9XCJwZi1jLWFsZXJ0X19pY29uXCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cInBmaWNvbi13YXJuaW5nLXRyaWFuZ2xlLW9cIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8aDQgY2xhc3M9XCJwZi1jLWFsZXJ0X190aXRsZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBmLXNjcmVlbi1yZWFkZXJcIj5XYXJuaW5nIGFsZXJ0Ojwvc3Bhbj5cbiAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGUtY29uZmlnLXdhcm5pbmctdGl0bGUnKSB9fVxuICAgIDwvaDQ+XG4gICAgPGRpdiBjbGFzcz1cInBmLWMtYWxlcnRfX2Rlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxwPnt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2RlLWNvbmZpZy13YXJuaW5nLW1lc3NhZ2UnKSB9fTwvcD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48b2xcbiAgICBbaWRdPVwib2xSZWNvdmVyeUNvZGVzTGlzdElkXCJcbiAgICBba2NDbGFzc109XCIna2NSZWNvdmVyeUNvZGVzTGlzdCdcIlxuPlxuICAgIEBmb3IgKGNvZGUgb2YgcmVjb3ZlcnlBdXRobkNvZGVzQ29uZmlnQmVhbi5nZW5lcmF0ZWRSZWNvdmVyeUF1dGhuQ29kZXNMaXN0OyB0cmFjayBjb2RlOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICA8bGk+XG4gICAgICAgICAgICA8c3Bhbj57eyBpICsgMSB9fTo8L3NwYW4+IHt7IGNvZGUuc2xpY2UoMCwgNCkgfX0te3sgY29kZS5zbGljZSg0LCA4KSB9fS17eyBjb2RlLnNsaWNlKDgpIH19XG4gICAgICAgIDwvbGk+XG4gICAgfVxuPC9vbD5cblxuPCEtLSBhY3Rpb25zIC0tPlxuPGRpdiBba2NDbGFzc109XCIna2NSZWNvdmVyeUNvZGVzQWN0aW9ucydcIj5cbiAgICA8YnV0dG9uXG4gICAgICAgIGlkPVwicHJpbnRSZWNvdmVyeUNvZGVzXCJcbiAgICAgICAgY2xhc3M9XCJwZi1jLWJ1dHRvbiBwZi1tLWxpbmtcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cInBmaWNvbi1wcmludFwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtcHJpbnQnKSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgaWQ9XCJkb3dubG9hZFJlY292ZXJ5Q29kZXNcIlxuICAgICAgICBjbGFzcz1cInBmLWMtYnV0dG9uIHBmLW0tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLXNhdmVcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvaT5cbiAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWRvd25sb2FkJykgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAgIGlkPVwiY29weVJlY292ZXJ5Q29kZXNcIlxuICAgICAgICBjbGFzcz1cInBmLWMtYnV0dG9uIHBmLW0tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLWJsdWVwcmludFwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtY29weScpIH19XG4gICAgPC9idXR0b24+XG48L2Rpdj5cblxuPCEtLSBjb25maXJtYXRpb24gY2hlY2tib3ggLS0+XG5cbjxkaXZcbiAgICBjbGFzcz1cImNoZWNrYm94XCJcbiAgICBba2NDbGFzc109XCIna2NGb3JtT3B0aW9uc0NsYXNzJ1wiXG4+XG4gICAgPGxhYmVsIGZvcj1cImtjUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbkNoZWNrXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIGlkPVwia2NSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uQ2hlY2tcIlxuICAgICAgICAgICAgbmFtZT1cImtjUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbkNoZWNrXCJcbiAgICAgICAgICAgIFtrY0NsYXNzXT1cIidrY0NoZWNrSW5wdXRDbGFzcydcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwidG9nZ2xlUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbigpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbi5zZXQoJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkKVwiXG4gICAgICAgIC8+XG4gICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1jb25maXJtYXRpb24tbWVzc2FnZScpIH19XG4gICAgPC9sYWJlbD5cbjwvZGl2PlxuXG48Zm9ybVxuICAgIGlkPVwia2MtcmVjb3ZlcnktY29kZXMtc2V0dGluZ3MtZm9ybVwiXG4gICAgbWV0aG9kPVwicG9zdFwiXG4gICAgW2FjdGlvbl09XCJrY0NvbnRleHQudXJsLmxvZ2luQWN0aW9uXCJcbiAgICBba2NDbGFzc109XCIna2NGb3JtR3JvdXBDbGFzcydcIlxuPlxuICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwiaGlkZGVuXCJcbiAgICAgICAgbmFtZT1cImdlbmVyYXRlZFJlY292ZXJ5QXV0aG5Db2Rlc1wiXG4gICAgICAgIFt2YWx1ZV09XCJyZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuLmdlbmVyYXRlZFJlY292ZXJ5QXV0aG5Db2Rlc0FzU3RyaW5nXCJcbiAgICAvPlxuICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwiaGlkZGVuXCJcbiAgICAgICAgbmFtZT1cImdlbmVyYXRlZEF0XCJcbiAgICAgICAgW3ZhbHVlXT1cInJlY292ZXJ5QXV0aG5Db2Rlc0NvbmZpZ0JlYW4uZ2VuZXJhdGVkQXRcIlxuICAgIC8+XG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgICBpZD1cInVzZXJMYWJlbFwiXG4gICAgICAgIG5hbWU9XCJ1c2VyTGFiZWxcIlxuICAgICAgICBbdmFsdWVdPVwiaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWxhYmVsLWRlZmF1bHQnKVwiXG4gICAgLz5cblxuICAgIDxrYy1sb2dvdXQtb3RoZXItc2Vzc2lvbnMgLz5cblxuICAgIEBpZiAoaXNBcHBJbml0aWF0ZWRBY3Rpb24pIHtcbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgIGlkPVwic2F2ZVJlY292ZXJ5QXV0aG5Db2Rlc0J0blwiXG4gICAgICAgICAgICBba2NDbGFzc109XCJbJ2tjQnV0dG9uQ2xhc3MnLCAna2NCdXR0b25QcmltYXJ5Q2xhc3MnLCAna2NCdXR0b25MYXJnZUNsYXNzJ11cIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1hY3Rpb24tY29tcGxldGUnKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXRvZ2dsZVJlY292ZXJ5Q29kZXNDb25maXJtYXRpb24oKVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgaWQ9XCJjYW5jZWxSZWNvdmVyeUF1dGhuQ29kZXNCdG5cIlxuICAgICAgICAgICAgbmFtZT1cImNhbmNlbC1haWFcIlxuICAgICAgICAgICAgdmFsdWU9XCJ0cnVlXCJcbiAgICAgICAgICAgIFtrY0NsYXNzXT1cIlsna2NCdXR0b25DbGFzcycsICdrY0J1dHRvbkRlZmF1bHRDbGFzcycsICdrY0J1dHRvbkxhcmdlQ2xhc3MnXVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1hY3Rpb24tY2FuY2VsJykgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgfSBAZWxzZSB7XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBpZD1cInNhdmVSZWNvdmVyeUF1dGhuQ29kZXNCdG5cIlxuICAgICAgICAgICAgW2tjQ2xhc3NdPVwiWydrY0J1dHRvbkNsYXNzJywgJ2tjQnV0dG9uUHJpbWFyeUNsYXNzJywgJ2tjQnV0dG9uQmxvY2tDbGFzcycsICdrY0J1dHRvbkxhcmdlQ2xhc3MnXVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWFjdGlvbi1jb21wbGV0ZScpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdG9nZ2xlUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICB9XG48L2Zvcm0+XG4iXX0=
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcmVjb3ZlcnktYXV0aG4tY29kZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xvZ2luL3BhZ2VzL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dpbi9wYWdlcy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBb0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUM1RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUdsRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOztBQWdCaEYsTUFBTSxPQUFPLHFDQUFzQyxTQUFRLGtCQUFrQjtJQXVCekU7UUFDSSxLQUFLLEVBQUUsQ0FBQztRQXZCWixjQUFTLEdBQUcsTUFBTSxDQUF5RSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdHLFNBQUksR0FBRyxNQUFNLENBQU8sVUFBVSxDQUFDLENBQUM7UUFDaEMsaUNBQTRCLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFM0Qsb0JBQWUsR0FBRyxNQUFNLENBQVUsZUFBZSxDQUFDLENBQUM7UUFDbkQsWUFBTyxHQUFHLE1BQU0sQ0FBb0MsYUFBYSxDQUFDLENBQUM7UUFLNUUsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ25CLG1CQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFekUsZUFBVSxHQUFHLFNBQVMsQ0FBMkIsWUFBWSxDQUFDLENBQUM7UUFDL0QsYUFBUSxHQUFHLFNBQVMsQ0FBMkIsVUFBVSxDQUFDLENBQUM7UUFDM0Qsd0JBQW1CLEdBQUcsU0FBUyxDQUEyQixxQkFBcUIsQ0FBQyxDQUFDO1FBRWpGLG9DQUErQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoRCwwQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztJQUlqRCxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx1QkFBdUIsQ0FBQztZQUN0RDtnQkFDSSxJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMscUJBQXFCLFNBQVM7Z0JBQzFDLFdBQVcsRUFBRTs7OztrRUFJcUMsSUFBSSxDQUFDLHFCQUFxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswRUErQmxCLElBQUksQ0FBQyxxQkFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4QkF3QnRFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQzs7OEJBRXZFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMENBQTBDLENBQUMsQ0FBQzs4QkFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzhFQXNCckIsSUFBSSxDQUFDLHFCQUFxQjs7Ozs7Ozs7OztzQ0FVbEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDOztzQ0FFdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO3NDQUM1RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7aUJBYTFGO2FBQ0o7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDOzhHQWpKUSxxQ0FBcUM7a0dBQXJDLHFDQUFxQyxrRkFQbkM7WUFDUDtnQkFDSSxPQUFPLEVBQUUsa0JBQWtCO2dCQUMzQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxDQUFDO2FBQ3ZFO1NBQ0osK1lDeEJMLDY1SUFrSkEsNENEbkljLGdCQUFnQiwrRkFBRSw0QkFBNEI7OzJGQVcvQyxxQ0FBcUM7a0JBYmpELFNBQVM7aUNBQ00sSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsNEJBQTRCLENBQUMsWUFDL0MscUNBQXFDLG1CQUU5Qix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNDQUFzQyxDQUFDO3lCQUN2RTtxQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGZvcndhcmRSZWYsIGluamVjdCwgc2lnbmFsLCB0eXBlIFRlbXBsYXRlUmVmLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVTRV9ERUZBVUxUX0NTUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xpYi90b2tlbnMvdXNlLWRlZmF1bHQtY3NzJztcbmltcG9ydCB7IENvbXBvbmVudFJlZmVyZW5jZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2NsYXNzZXMvY29tcG9uZW50LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBMb2dvdXRPdGhlclNlc3Npb25zQ29tcG9uZW50IH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vY29tcG9uZW50cy9sb2dvdXQtb3RoZXItc2Vzc2lvbnMnO1xuaW1wb3J0IHsgS2NDbGFzc0RpcmVjdGl2ZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2RpcmVjdGl2ZXMva2MtY2xhc3MnO1xuaW1wb3J0IHR5cGUgeyBJMThuIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vaTE4bic7XG5pbXBvcnQgdHlwZSB7IEtjQ29udGV4dCB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL0tjQ29udGV4dCc7XG5pbXBvcnQgeyBMb2dpblJlc291cmNlSW5qZWN0b3JTZXJ2aWNlIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vc2VydmljZXMvbG9naW4tcmVzb3VyY2UtaW5qZWN0b3InO1xuaW1wb3J0IHsgTE9HSU5fQ0xBU1NFUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL3Rva2Vucy9jbGFzc2VzJztcbmltcG9ydCB7IExPR0lOX0kxOE4gfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi90b2tlbnMvaTE4bic7XG5pbXBvcnQgeyBLQ19MT0dJTl9DT05URVhUIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vdG9rZW5zL2tjLWNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBDbGFzc0tleSB9IGZyb20gJ2tleWNsb2FraWZ5L2xvZ2luL2xpYi9rY0Nsc3gnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtLY0NsYXNzRGlyZWN0aXZlLCBMb2dvdXRPdGhlclNlc3Npb25zQ29tcG9uZW50XSxcbiAgICBzZWxlY3RvcjogJ2tjLWxvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQ29tcG9uZW50UmVmZXJlbmNlLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTG9naW5SZWNvdmVyeUF1dGhuQ29kZUNvbmZpZ0NvbXBvbmVudClcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTG9naW5SZWNvdmVyeUF1dGhuQ29kZUNvbmZpZ0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudFJlZmVyZW5jZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAgIGtjQ29udGV4dCA9IGluamVjdDxFeHRyYWN0PEtjQ29udGV4dCwgeyBwYWdlSWQ6ICdsb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy5mdGwnIH0+PihLQ19MT0dJTl9DT05URVhUKTtcbiAgICBpMThuID0gaW5qZWN0PEkxOG4+KExPR0lOX0kxOE4pO1xuICAgIGxvZ2luUmVzb3VyY2VJbmplY3RvclNlcnZpY2UgPSBpbmplY3QoTG9naW5SZXNvdXJjZUluamVjdG9yU2VydmljZSk7XG5cbiAgICBvdmVycmlkZSBkb1VzZURlZmF1bHRDc3MgPSBpbmplY3Q8Ym9vbGVhbj4oVVNFX0RFRkFVTFRfQ1NTKTtcbiAgICBvdmVycmlkZSBjbGFzc2VzID0gaW5qZWN0PFBhcnRpYWw8UmVjb3JkPENsYXNzS2V5LCBzdHJpbmc+Pj4oTE9HSU5fQ0xBU1NFUyk7XG5cbiAgICBkb2N1bWVudFRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgYm9keUNsYXNzTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZGlzcGxheVJlcXVpcmVkRmllbGRzID0gZmFsc2U7XG4gICAgZGlzcGxheUluZm8gPSB0cnVlO1xuICAgIGRpc3BsYXlNZXNzYWdlID0gdGhpcy5rY0NvbnRleHQubWVzc2FnZXNQZXJGaWVsZC5leGlzdHNFcnJvcigncGFzc3dvcmQnKTtcblxuICAgIGhlYWRlck5vZGUgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+PignaGVhZGVyTm9kZScpO1xuICAgIGluZm9Ob2RlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50Pj4oJ2luZm9Ob2RlJyk7XG4gICAgc29jaWFsUHJvdmlkZXJzTm9kZSA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4+KCdzb2NpYWxQcm92aWRlcnNOb2RlJyk7XG5cbiAgICB0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uID0gc2lnbmFsKGZhbHNlKTtcblxuICAgIG9sUmVjb3ZlcnlDb2Rlc0xpc3RJZCA9ICdrYy1yZWNvdmVyeS1jb2Rlcy1saXN0JztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5sb2dpblJlc291cmNlSW5qZWN0b3JTZXJ2aWNlLmluc2VydEFkZGl0aW9uYWxTY3JpcHRzKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyxcbiAgICAgICAgICAgICAgICBpZDogYCR7dGhpcy5vbFJlY292ZXJ5Q29kZXNMaXN0SWR9LXNjcmlwdGAsXG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6IGBcbiAgICAgICAgICAgICAgICAgICAgLyogY29weSByZWNvdmVyeSBjb2RlcyAgKi9cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY29weVJlY292ZXJ5Q29kZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1wVGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiIyR7dGhpcy5vbFJlY292ZXJ5Q29kZXNMaXN0SWR9IGxpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wVGV4dGFyZWEudmFsdWUgPSB0bXBUZXh0YXJlYS52YWx1ZSArIGNvZGVzW2ldLmlubmVyVGV4dCArIFwiXFxcXG5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG1wVGV4dGFyZWEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG1wVGV4dGFyZWEuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRtcFRleHRhcmVhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb3B5QnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb3B5UmVjb3ZlcnlDb2Rlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgY29weUJ1dHRvbiAmJiBjb3B5QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5UmVjb3ZlcnlDb2RlcygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvKiBkb3dubG9hZCByZWNvdmVyeSBjb2RlcyAgKi9cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0Q3VycmVudERhdGVUaW1lKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU5hbWU6ICdzaG9ydCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkdC50b0xvY2FsZVN0cmluZygnZW4tVVMnLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBhcnNlUmVjb3ZlcnlDb2RlTGlzdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvdmVyeUNvZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIiMke3RoaXMub2xSZWNvdmVyeUNvZGVzTGlzdElkfSBsaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvdmVyeUNvZGVMaXN0ID0gXCJcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvdmVyeUNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlY292ZXJ5Q29kZUxpRWxlbWVudCA9IHJlY292ZXJ5Q29kZXNbaV0uaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJ5Q29kZUxpc3QgKz0gcmVjb3ZlcnlDb2RlTGlFbGVtZW50ICsgXCJcXFxcclxcXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNvdmVyeUNvZGVMaXN0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGREb3dubG9hZENvbnRlbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVjb3ZlcnlDb2RlTGlzdCA9IHBhcnNlUmVjb3ZlcnlDb2RlTGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU5hbWU6ICdzaG9ydCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlQm9keUNvbnRlbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1oZWFkZXInKSl9ICsgXCJcXFxcblxcXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJ5Q29kZUxpc3QgKyBcIlxcXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQtZmlsZS1kZXNjcmlwdGlvbicpKX0gKyBcIlxcXFxuXFxcXG5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1kb3dubG9hZC1maWxlLWRhdGUnKSl9ICsgXCIgXCIgKyBmb3JtYXRDdXJyZW50RGF0ZVRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFVwRG93bmxvYWRMaW5rQW5kRG93bmxvYWQoZmlsZW5hbWUsIHRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaHJlZicsICdkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCwnICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb3dubG9hZFJlY292ZXJ5Q29kZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRVcERvd25sb2FkTGlua0FuZERvd25sb2FkKCdrYy1kb3dubG9hZC1yZWNvdmVyeS1jb2Rlcy50eHQnLCBidWlsZERvd25sb2FkQ29udGVudCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZG93bmxvYWRSZWNvdmVyeUNvZGVzXCIpO1xuICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEJ1dHRvbiAmJiBkb3dubG9hZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZG93bmxvYWRSZWNvdmVyeUNvZGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAvKiBwcmludCByZWNvdmVyeSBjb2RlcyAqL1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBidWlsZFByaW50Q29udGVudCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvdmVyeUNvZGVMaXN0SFRNTCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke3RoaXMub2xSZWNvdmVyeUNvZGVzTGlzdElkfScpLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcYEBwYWdlIHsgc2l6ZTogYXV0bzsgIG1hcmdpbi10b3A6IDA7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5IHsgd2lkdGg6IDQ4MHB4OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2IHsgbGlzdC1zdHlsZS10eXBlOiBub25lOyBmb250LWZhbWlseTogbW9ub3NwYWNlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOmZpcnN0LW9mLXR5cGUgeyBtYXJnaW4tdG9wOiA0OHB4IH1cXGA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmludEZpbGVDb250ZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxodG1sPjxzdHlsZT5cIiArIHN0eWxlcyArIFwiPC9zdHlsZT48Ym9keT5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8dGl0bGU+a2MtZG93bmxvYWQtcmVjb3ZlcnktY29kZXM8L3RpdGxlPlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxwPlwiICsgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1kb3dubG9hZC1maWxlLWhlYWRlcicpKX0gKyBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8ZGl2PlwiICsgcmVjb3ZlcnlDb2RlTGlzdEhUTUwgKyBcIjwvZGl2PlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxwPlwiICsgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1kb3dubG9hZC1maWxlLWRlc2NyaXB0aW9uJykpfSArIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxwPlwiICsgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1kb3dubG9hZC1maWxlLWRhdGUnKSl9ICsgXCIgXCIgKyBmb3JtYXRDdXJyZW50RGF0ZVRpbWUoKSArIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvYm9keT48L2h0bWw+XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwcmludFJlY292ZXJ5Q29kZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdyA9IHdpbmRvdy5vcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3LmRvY3VtZW50LndyaXRlKGJ1aWxkUHJpbnRDb250ZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByaW50QnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwcmludFJlY292ZXJ5Q29kZXNcIik7XG4gICAgICAgICAgICAgICAgICAgIHByaW50QnV0dG9uICYmIHByaW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBwcmludFJlY292ZXJ5Q29kZXMpO1xuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSk7XG4gICAgfVxufVxuIiwiQGxldCByZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuID0ga2NDb250ZXh0LnJlY292ZXJ5QXV0aG5Db2Rlc0NvbmZpZ0JlYW47XG5AbGV0IGlzQXBwSW5pdGlhdGVkQWN0aW9uID0ga2NDb250ZXh0LmlzQXBwSW5pdGlhdGVkQWN0aW9uO1xuXG48bmctdGVtcGxhdGUgI2hlYWRlck5vZGU+XG4gICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGUtY29uZmlnLWhlYWRlcicpIH19XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2XG4gICAgY2xhc3M9XCJwZi1jLWFsZXJ0IHBmLW0td2FybmluZyBwZi1tLWlubGluZVwiXG4gICAgYXJpYS1sYWJlbD1cIldhcm5pbmcgYWxlcnRcIlxuICAgIFtrY0NsYXNzXT1cIidrY1JlY292ZXJ5Q29kZXNXYXJuaW5nJ1wiXG4+XG4gICAgPGRpdiBjbGFzcz1cInBmLWMtYWxlcnRfX2ljb25cIj5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLXdhcm5pbmctdHJpYW5nbGUtb1wiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxoNCBjbGFzcz1cInBmLWMtYWxlcnRfX3RpdGxlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGYtc2NyZWVuLXJlYWRlclwiPldhcm5pbmcgYWxlcnQ6PC9zcGFuPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZS1jb25maWctd2FybmluZy10aXRsZScpIH19XG4gICAgPC9oND5cbiAgICA8ZGl2IGNsYXNzPVwicGYtYy1hbGVydF9fZGVzY3JpcHRpb25cIj5cbiAgICAgICAgPHA+e3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGUtY29uZmlnLXdhcm5pbmctbWVzc2FnZScpIH19PC9wPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxvbFxuICAgIFtpZF09XCJvbFJlY292ZXJ5Q29kZXNMaXN0SWRcIlxuICAgIFtrY0NsYXNzXT1cIidrY1JlY292ZXJ5Q29kZXNMaXN0J1wiXG4+XG4gICAgQGZvciAoY29kZSBvZiByZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuLmdlbmVyYXRlZFJlY292ZXJ5QXV0aG5Db2Rlc0xpc3Q7IHRyYWNrIGNvZGU7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxsaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19Ojwvc3Bhbj4ge3sgY29kZS5zbGljZSgwLCA0KSB9fS17eyBjb2RlLnNsaWNlKDQsIDgpIH19LXt7IGNvZGUuc2xpY2UoOCkgfX1cbiAgICAgICAgPC9saT5cbiAgICB9XG48L29sPlxuXG48IS0tIGFjdGlvbnMgLS0+XG48ZGl2IFtrY0NsYXNzXT1cIidrY1JlY292ZXJ5Q29kZXNBY3Rpb25zJ1wiPlxuICAgIDxidXR0b25cbiAgICAgICAgaWQ9XCJwcmludFJlY292ZXJ5Q29kZXNcIlxuICAgICAgICBjbGFzcz1cInBmLWMtYnV0dG9uIHBmLW0tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLXByaW50XCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID48L2k+XG4gICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1wcmludCcpIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgICBpZD1cImRvd25sb2FkUmVjb3ZlcnlDb2Rlc1wiXG4gICAgICAgIGNsYXNzPVwicGYtYy1idXR0b24gcGYtbS1saW5rXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJwZmljb24tc2F2ZVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQnKSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgaWQ9XCJjb3B5UmVjb3ZlcnlDb2Rlc1wiXG4gICAgICAgIGNsYXNzPVwicGYtYy1idXR0b24gcGYtbS1saW5rXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJwZmljb24tYmx1ZXByaW50XCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID48L2k+XG4gICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1jb3B5JykgfX1cbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48IS0tIGNvbmZpcm1hdGlvbiBjaGVja2JveCAtLT5cblxuPGRpdlxuICAgIGNsYXNzPVwiY2hlY2tib3hcIlxuICAgIFtrY0NsYXNzXT1cIidrY0Zvcm1PcHRpb25zQ2xhc3MnXCJcbj5cbiAgICA8bGFiZWwgZm9yPVwia2NSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uQ2hlY2tcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgaWQ9XCJrY1JlY292ZXJ5Q29kZXNDb25maXJtYXRpb25DaGVja1wiXG4gICAgICAgICAgICBuYW1lPVwia2NSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uQ2hlY2tcIlxuICAgICAgICAgICAgW2tjQ2xhc3NdPVwiJ2tjQ2hlY2tJbnB1dENsYXNzJ1wiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uKClcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uLnNldCgkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWQpXCJcbiAgICAgICAgLz5cbiAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWNvbmZpcm1hdGlvbi1tZXNzYWdlJykgfX1cbiAgICA8L2xhYmVsPlxuPC9kaXY+XG5cbjxmb3JtXG4gICAgaWQ9XCJrYy1yZWNvdmVyeS1jb2Rlcy1zZXR0aW5ncy1mb3JtXCJcbiAgICBtZXRob2Q9XCJwb3N0XCJcbiAgICBbYWN0aW9uXT1cImtjQ29udGV4dC51cmwubG9naW5BY3Rpb25cIlxuICAgIFtrY0NsYXNzXT1cIidrY0Zvcm1Hcm91cENsYXNzJ1wiXG4+XG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgICBuYW1lPVwiZ2VuZXJhdGVkUmVjb3ZlcnlBdXRobkNvZGVzXCJcbiAgICAgICAgW3ZhbHVlXT1cInJlY292ZXJ5QXV0aG5Db2Rlc0NvbmZpZ0JlYW4uZ2VuZXJhdGVkUmVjb3ZlcnlBdXRobkNvZGVzQXNTdHJpbmdcIlxuICAgIC8+XG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgICBuYW1lPVwiZ2VuZXJhdGVkQXRcIlxuICAgICAgICBbdmFsdWVdPVwicmVjb3ZlcnlBdXRobkNvZGVzQ29uZmlnQmVhbi5nZW5lcmF0ZWRBdFwiXG4gICAgLz5cbiAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImhpZGRlblwiXG4gICAgICAgIGlkPVwidXNlckxhYmVsXCJcbiAgICAgICAgbmFtZT1cInVzZXJMYWJlbFwiXG4gICAgICAgIFt2YWx1ZV09XCJpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtbGFiZWwtZGVmYXVsdCcpXCJcbiAgICAvPlxuXG4gICAgPGtjLWxvZ291dC1vdGhlci1zZXNzaW9ucyAvPlxuXG4gICAgQGlmIChpc0FwcEluaXRpYXRlZEFjdGlvbikge1xuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgaWQ9XCJzYXZlUmVjb3ZlcnlBdXRobkNvZGVzQnRuXCJcbiAgICAgICAgICAgIFtrY0NsYXNzXT1cIlsna2NCdXR0b25DbGFzcycsICdrY0J1dHRvblByaW1hcnlDbGFzcycsICdrY0J1dHRvbkxhcmdlQ2xhc3MnXVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWFjdGlvbi1jb21wbGV0ZScpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdG9nZ2xlUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBpZD1cImNhbmNlbFJlY292ZXJ5QXV0aG5Db2Rlc0J0blwiXG4gICAgICAgICAgICBuYW1lPVwiY2FuY2VsLWFpYVwiXG4gICAgICAgICAgICB2YWx1ZT1cInRydWVcIlxuICAgICAgICAgICAgW2tjQ2xhc3NdPVwiWydrY0J1dHRvbkNsYXNzJywgJ2tjQnV0dG9uRGVmYXVsdENsYXNzJywgJ2tjQnV0dG9uTGFyZ2VDbGFzcyddXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWFjdGlvbi1jYW5jZWwnKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgIGlkPVwic2F2ZVJlY292ZXJ5QXV0aG5Db2Rlc0J0blwiXG4gICAgICAgICAgICBba2NDbGFzc109XCJbJ2tjQnV0dG9uQ2xhc3MnLCAna2NCdXR0b25QcmltYXJ5Q2xhc3MnLCAna2NCdXR0b25CbG9ja0NsYXNzJywgJ2tjQnV0dG9uTGFyZ2VDbGFzcyddXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtYWN0aW9uLWNvbXBsZXRlJylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uKClcIlxuICAgICAgICAvPlxuICAgIH1cbjwvZm9ybT5cbiJdfQ==
@@ -25,6 +25,8 @@ class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
25
25
  this.socialProvidersNode = viewChild('socialProvidersNode');
26
26
  this.toggleRecoveryCodesConfirmation = signal(false);
27
27
  this.olRecoveryCodesListId = 'kc-recovery-codes-list';
28
+ }
29
+ ngAfterViewInit() {
28
30
  this.loginResourceInjectorService.insertAdditionalScripts([
29
31
  {
30
32
  type: 'text/javascript',
@@ -1 +1 @@
1
- {"version":3,"file":"keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs","sources":["../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts","../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html","../../src/login/pages/login-recovery-authn-code-config/keycloakify-angular-login-pages-login-recovery-authn-code-config.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';\nimport { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport type { KcContext } from '@keycloakify/angular/login/KcContext';\nimport { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';\nimport { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport type { ClassKey } from 'keycloakify/login/lib/kcClsx';\n\n@Component({\n standalone: true,\n imports: [KcClassDirective, LogoutOtherSessionsComponent],\n selector: 'kc-login-recovery-authn-code-config',\n templateUrl: 'login-recovery-authn-code-config.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)\n }\n ]\n})\nexport class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {\n kcContext = inject<Extract<KcContext, { pageId: 'login-recovery-authn-code-config.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\n loginResourceInjectorService = inject(LoginResourceInjectorService);\n\n override doUseDefaultCss = inject<boolean>(USE_DEFAULT_CSS);\n override classes = inject<Partial<Record<ClassKey, string>>>(LOGIN_CLASSES);\n\n documentTitle: string | undefined;\n bodyClassName: string | undefined;\n\n displayRequiredFields = false;\n displayInfo = true;\n displayMessage = this.kcContext.messagesPerField.existsError('password');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n toggleRecoveryCodesConfirmation = signal(false);\n\n olRecoveryCodesListId = 'kc-recovery-codes-list';\n\n constructor() {\n super();\n this.loginResourceInjectorService.insertAdditionalScripts([\n {\n type: 'text/javascript',\n id: `${this.olRecoveryCodesListId}-script`,\n textContent: `\n /* copy recovery codes */\n function copyRecoveryCodes() {\n var tmpTextarea = document.createElement(\"textarea\");\n var codes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n for (i = 0; i < codes.length; i++) {\n tmpTextarea.value = tmpTextarea.value + codes[i].innerText + \"\\\\n\";\n }\n document.body.appendChild(tmpTextarea);\n tmpTextarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(tmpTextarea);\n }\n\n var copyButton = document.getElementById(\"copyRecoveryCodes\");\n copyButton && copyButton.addEventListener(\"click\", function () {\n copyRecoveryCodes();\n });\n\n /* download recovery codes */\n function formatCurrentDateTime() {\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return dt.toLocaleString('en-US', options);\n }\n\n function parseRecoveryCodeList() {\n var recoveryCodes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n var recoveryCodeList = \"\";\n\n for (var i = 0; i < recoveryCodes.length; i++) {\n var recoveryCodeLiElement = recoveryCodes[i].innerText;\n recoveryCodeList += recoveryCodeLiElement + \"\\\\r\\\\n\";\n }\n\n return recoveryCodeList;\n }\n\n function buildDownloadContent() {\n var recoveryCodeList = parseRecoveryCodeList();\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return fileBodyContent =\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"\\\\n\\\\n\" +\n recoveryCodeList + \"\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"\\\\n\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime();\n }\n\n function setUpDownloadLinkAndDownload(filename, text) {\n var el = document.createElement('a');\n el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n el.setAttribute('download', filename);\n el.style.display = 'none';\n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n }\n\n function downloadRecoveryCodes() {\n setUpDownloadLinkAndDownload('kc-download-recovery-codes.txt', buildDownloadContent());\n }\n\n var downloadButton = document.getElementById(\"downloadRecoveryCodes\");\n downloadButton && downloadButton.addEventListener(\"click\", downloadRecoveryCodes);\n\n /* print recovery codes */\n function buildPrintContent() {\n var recoveryCodeListHTML = document.getElementById('${this.olRecoveryCodesListId}').innerHTML;\n var styles =\n \\`@page { size: auto; margin-top: 0; }\n body { width: 480px; }\n div { list-style-type: none; font-family: monospace }\n p:first-of-type { margin-top: 48px }\\`;\n\n return printFileContent =\n \"<html><style>\" + styles + \"</style><body>\" +\n \"<title>kc-download-recovery-codes</title>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"</p>\" +\n \"<div>\" + recoveryCodeListHTML + \"</div>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"</p>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime() + \"</p>\" +\n \"</body></html>\";\n }\n\n function printRecoveryCodes() {\n var w = window.open();\n w.document.write(buildPrintContent());\n w.print();\n w.close();\n }\n\n var printButton = document.getElementById(\"printRecoveryCodes\");\n printButton && printButton.addEventListener(\"click\", printRecoveryCodes);\n `\n }\n ]);\n }\n}\n","@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs","sources":["../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts","../../src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html","../../src/login/pages/login-recovery-authn-code-config/keycloakify-angular-login-pages-login-recovery-authn-code-config.ts"],"sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';\nimport { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport type { KcContext } from '@keycloakify/angular/login/KcContext';\nimport { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';\nimport { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport type { ClassKey } from 'keycloakify/login/lib/kcClsx';\n\n@Component({\n standalone: true,\n imports: [KcClassDirective, LogoutOtherSessionsComponent],\n selector: 'kc-login-recovery-authn-code-config',\n templateUrl: 'login-recovery-authn-code-config.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)\n }\n ]\n})\nexport class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference implements AfterViewInit {\n kcContext = inject<Extract<KcContext, { pageId: 'login-recovery-authn-code-config.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\n loginResourceInjectorService = inject(LoginResourceInjectorService);\n\n override doUseDefaultCss = inject<boolean>(USE_DEFAULT_CSS);\n override classes = inject<Partial<Record<ClassKey, string>>>(LOGIN_CLASSES);\n\n documentTitle: string | undefined;\n bodyClassName: string | undefined;\n\n displayRequiredFields = false;\n displayInfo = true;\n displayMessage = this.kcContext.messagesPerField.existsError('password');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n toggleRecoveryCodesConfirmation = signal(false);\n\n olRecoveryCodesListId = 'kc-recovery-codes-list';\n\n constructor() {\n super();\n }\n\n ngAfterViewInit() {\n this.loginResourceInjectorService.insertAdditionalScripts([\n {\n type: 'text/javascript',\n id: `${this.olRecoveryCodesListId}-script`,\n textContent: `\n /* copy recovery codes */\n function copyRecoveryCodes() {\n var tmpTextarea = document.createElement(\"textarea\");\n var codes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n for (i = 0; i < codes.length; i++) {\n tmpTextarea.value = tmpTextarea.value + codes[i].innerText + \"\\\\n\";\n }\n document.body.appendChild(tmpTextarea);\n tmpTextarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(tmpTextarea);\n }\n\n var copyButton = document.getElementById(\"copyRecoveryCodes\");\n copyButton && copyButton.addEventListener(\"click\", function () {\n copyRecoveryCodes();\n });\n\n /* download recovery codes */\n function formatCurrentDateTime() {\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return dt.toLocaleString('en-US', options);\n }\n\n function parseRecoveryCodeList() {\n var recoveryCodes = document.querySelectorAll(\"#${this.olRecoveryCodesListId} li\");\n var recoveryCodeList = \"\";\n\n for (var i = 0; i < recoveryCodes.length; i++) {\n var recoveryCodeLiElement = recoveryCodes[i].innerText;\n recoveryCodeList += recoveryCodeLiElement + \"\\\\r\\\\n\";\n }\n\n return recoveryCodeList;\n }\n\n function buildDownloadContent() {\n var recoveryCodeList = parseRecoveryCodeList();\n var dt = new Date();\n var options = {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n timeZoneName: 'short'\n };\n\n return fileBodyContent =\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"\\\\n\\\\n\" +\n recoveryCodeList + \"\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"\\\\n\\\\n\" +\n ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime();\n }\n\n function setUpDownloadLinkAndDownload(filename, text) {\n var el = document.createElement('a');\n el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n el.setAttribute('download', filename);\n el.style.display = 'none';\n document.body.appendChild(el);\n el.click();\n document.body.removeChild(el);\n }\n\n function downloadRecoveryCodes() {\n setUpDownloadLinkAndDownload('kc-download-recovery-codes.txt', buildDownloadContent());\n }\n\n var downloadButton = document.getElementById(\"downloadRecoveryCodes\");\n downloadButton && downloadButton.addEventListener(\"click\", downloadRecoveryCodes);\n\n /* print recovery codes */\n function buildPrintContent() {\n var recoveryCodeListHTML = document.getElementById('${this.olRecoveryCodesListId}').innerHTML;\n var styles =\n \\`@page { size: auto; margin-top: 0; }\n body { width: 480px; }\n div { list-style-type: none; font-family: monospace }\n p:first-of-type { margin-top: 48px }\\`;\n\n return printFileContent =\n \"<html><style>\" + styles + \"</style><body>\" +\n \"<title>kc-download-recovery-codes</title>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + \"</p>\" +\n \"<div>\" + recoveryCodeListHTML + \"</div>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + \"</p>\" +\n \"<p>\" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + \" \" + formatCurrentDateTime() + \"</p>\" +\n \"</body></html>\";\n }\n\n function printRecoveryCodes() {\n var w = window.open();\n w.document.write(buildPrintContent());\n w.print();\n w.close();\n }\n\n var printButton = document.getElementById(\"printRecoveryCodes\");\n printButton && printButton.addEventListener(\"click\", printRecoveryCodes);\n `\n }\n ]);\n }\n}\n","@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean;\n@let isAppInitiatedAction = kcContext.isAppInitiatedAction;\n\n<ng-template #headerNode>\n {{ i18n.msgStr('recovery-code-config-header') }}\n</ng-template>\n\n<div\n class=\"pf-c-alert pf-m-warning pf-m-inline\"\n aria-label=\"Warning alert\"\n [kcClass]=\"'kcRecoveryCodesWarning'\"\n>\n <div class=\"pf-c-alert__icon\">\n <i\n class=\"pficon-warning-triangle-o\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <h4 class=\"pf-c-alert__title\">\n <span class=\"pf-screen-reader\">Warning alert:</span>\n {{ i18n.msgStr('recovery-code-config-warning-title') }}\n </h4>\n <div class=\"pf-c-alert__description\">\n <p>{{ i18n.msgStr('recovery-code-config-warning-message') }}</p>\n </div>\n</div>\n\n<ol\n [id]=\"olRecoveryCodesListId\"\n [kcClass]=\"'kcRecoveryCodesList'\"\n>\n @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) {\n <li>\n <span>{{ i + 1 }}:</span> {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }}\n </li>\n }\n</ol>\n\n<!-- actions -->\n<div [kcClass]=\"'kcRecoveryCodesActions'\">\n <button\n id=\"printRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-print\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-print') }}\n </button>\n <button\n id=\"downloadRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-save\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-download') }}\n </button>\n <button\n id=\"copyRecoveryCodes\"\n class=\"pf-c-button pf-m-link\"\n type=\"button\"\n >\n <i\n class=\"pficon-blueprint\"\n aria-hidden=\"true\"\n ></i>\n {{ i18n.msgStr('recovery-codes-copy') }}\n </button>\n</div>\n\n<!-- confirmation checkbox -->\n\n<div\n class=\"checkbox\"\n [kcClass]=\"'kcFormOptionsClass'\"\n>\n <label for=\"kcRecoveryCodesConfirmationCheck\">\n <input\n type=\"checkbox\"\n id=\"kcRecoveryCodesConfirmationCheck\"\n name=\"kcRecoveryCodesConfirmationCheck\"\n [kcClass]=\"'kcCheckInputClass'\"\n [checked]=\"toggleRecoveryCodesConfirmation()\"\n (change)=\"toggleRecoveryCodesConfirmation.set($any($event.target).checked)\"\n />\n {{ i18n.msgStr('recovery-codes-confirmation-message') }}\n </label>\n</div>\n\n<form\n id=\"kc-recovery-codes-settings-form\"\n method=\"post\"\n [action]=\"kcContext.url.loginAction\"\n [kcClass]=\"'kcFormGroupClass'\"\n>\n <input\n type=\"hidden\"\n name=\"generatedRecoveryAuthnCodes\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesAsString\"\n />\n <input\n type=\"hidden\"\n name=\"generatedAt\"\n [value]=\"recoveryAuthnCodesConfigBean.generatedAt\"\n />\n <input\n type=\"hidden\"\n id=\"userLabel\"\n name=\"userLabel\"\n [value]=\"i18n.msgStr('recovery-codes-label-default')\"\n />\n\n <kc-logout-other-sessions />\n\n @if (isAppInitiatedAction) {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n <button\n type=\"submit\"\n id=\"cancelRecoveryAuthnCodesBtn\"\n name=\"cancel-aia\"\n value=\"true\"\n [kcClass]=\"['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass']\"\n >\n {{ i18n.msgStr('recovery-codes-action-cancel') }}\n </button>\n } @else {\n <input\n type=\"submit\"\n id=\"saveRecoveryAuthnCodesBtn\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('recovery-codes-action-complete')\"\n [disabled]=\"!toggleRecoveryCodesConfirmation()\"\n />\n }\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { type TemplateRef } from '@angular/core';
1
+ import { AfterViewInit, type TemplateRef } from '@angular/core';
2
2
  import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
3
3
  import type { I18n } from '@keycloakify/angular/login/i18n';
4
4
  import type { KcContext } from '@keycloakify/angular/login/KcContext';
5
5
  import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';
6
6
  import type { ClassKey } from 'keycloakify/login/lib/kcClsx';
7
7
  import * as i0 from "@angular/core";
8
- export declare class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
8
+ export declare class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference implements AfterViewInit {
9
9
  kcContext: KcContext.LoginRecoveryAuthnCodeConfig;
10
10
  i18n: I18n;
11
11
  loginResourceInjectorService: LoginResourceInjectorService;
@@ -22,6 +22,7 @@ export declare class LoginRecoveryAuthnCodeConfigComponent extends ComponentRefe
22
22
  toggleRecoveryCodesConfirmation: import("@angular/core").WritableSignal<boolean>;
23
23
  olRecoveryCodesListId: string;
24
24
  constructor();
25
+ ngAfterViewInit(): void;
25
26
  static ɵfac: i0.ɵɵFactoryDeclaration<LoginRecoveryAuthnCodeConfigComponent, never>;
26
27
  static ɵcmp: i0.ɵɵComponentDeclaration<LoginRecoveryAuthnCodeConfigComponent, "kc-login-recovery-authn-code-config", never, {}, {}, never, never, true, never>;
27
28
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@keycloakify/angular",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "peerDependencies": {
5
- "keycloakify": "^11.3.9",
5
+ "keycloakify": "^11.3.10",
6
6
  "@angular/core": "^18.0.0",
7
7
  "@angular/common": "^18.0.0",
8
8
  "@angular/platform-browser": "^18.0.0"
@@ -309,6 +309,12 @@
309
309
  "esm": "./esm2022/login/directives/kc-class/keycloakify-angular-login-directives-kc-class.mjs",
310
310
  "default": "./fesm2022/keycloakify-angular-login-directives-kc-class.mjs"
311
311
  },
312
+ "./login/providers/keycloakify-angular": {
313
+ "types": "./login/providers/keycloakify-angular/index.d.ts",
314
+ "esm2022": "./esm2022/login/providers/keycloakify-angular/keycloakify-angular-login-providers-keycloakify-angular.mjs",
315
+ "esm": "./esm2022/login/providers/keycloakify-angular/keycloakify-angular-login-providers-keycloakify-angular.mjs",
316
+ "default": "./fesm2022/keycloakify-angular-login-providers-keycloakify-angular.mjs"
317
+ },
312
318
  "./login/pages/code": {
313
319
  "types": "./login/pages/code/index.d.ts",
314
320
  "esm2022": "./esm2022/login/pages/code/keycloakify-angular-login-pages-code.mjs",
@@ -525,12 +531,6 @@
525
531
  "esm": "./esm2022/login/pages/webauthn-register/keycloakify-angular-login-pages-webauthn-register.mjs",
526
532
  "default": "./fesm2022/keycloakify-angular-login-pages-webauthn-register.mjs"
527
533
  },
528
- "./login/providers/keycloakify-angular": {
529
- "types": "./login/providers/keycloakify-angular/index.d.ts",
530
- "esm2022": "./esm2022/login/providers/keycloakify-angular/keycloakify-angular-login-providers-keycloakify-angular.mjs",
531
- "esm": "./esm2022/login/providers/keycloakify-angular/keycloakify-angular-login-providers-keycloakify-angular.mjs",
532
- "default": "./fesm2022/keycloakify-angular-login-providers-keycloakify-angular.mjs"
533
- },
534
534
  "./login/services/i18n": {
535
535
  "types": "./login/services/i18n/index.d.ts",
536
536
  "esm2022": "./esm2022/login/services/i18n/keycloakify-angular-login-services-i18n.mjs",
@@ -25,10 +25,7 @@ import { transformCodebase } from './tools/transformCodebase';
25
25
  import { kebabCaseToCamelCase } from './tools/kebabCaseToSnakeCase';
26
26
  import { replaceAll } from './tools/String.prototype.replaceAll';
27
27
  import { capitalize } from 'tsafe/capitalize';
28
- import { id } from 'tsafe/id';
29
- import { z } from 'zod';
30
- import { is } from 'tsafe/is';
31
- import * as child_process from 'child_process';
28
+ import { runFormat } from './tools/runFormat';
32
29
 
33
30
  export async function command(params: { buildContext: BuildContext }) {
34
31
  const { buildContext } = params;
@@ -246,66 +243,9 @@ export async function command(params: { buildContext: BuildContext }) {
246
243
  }
247
244
  }
248
245
 
249
- run_format: {
250
- const parsedPackageJson = (() => {
251
- type ParsedPackageJson = {
252
- scripts?: Record<string, string>;
253
- };
254
-
255
- const zParsedPackageJson = (() => {
256
- type TargetType = ParsedPackageJson;
257
-
258
- const zTargetType = z.object({
259
- scripts: z.record(z.string()).optional()
260
- });
261
-
262
- assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
263
-
264
- return id<z.ZodType<TargetType>>(zTargetType);
265
- })();
266
-
267
- const parsedPackageJson = JSON.parse(
268
- fs.readFileSync(buildContext.packageJsonFilePath).toString('utf8')
269
- );
270
-
271
- zParsedPackageJson.parse(parsedPackageJson);
272
-
273
- assert(is<ParsedPackageJson>(parsedPackageJson));
274
-
275
- return parsedPackageJson;
276
- })();
277
-
278
- const { scripts } = parsedPackageJson;
279
-
280
- if (scripts === undefined) {
281
- break run_format;
282
- }
283
-
284
- for (const scriptName of ['format', 'lint']) {
285
- if (!(scriptName in scripts)) {
286
- continue;
287
- }
288
-
289
- const command = `npm run ${scriptName}`;
290
-
291
- console.log(chalk.grey(`$ ${command}`));
292
-
293
- try {
294
- child_process.execSync(`npm run ${scriptName}`, {
295
- stdio: 'inherit',
296
- cwd: pathDirname(buildContext.packageJsonFilePath)
297
- });
298
- } catch {
299
- console.log(
300
- chalk.yellow(
301
- `\`${command}\` failed, please format your code manually, continuing...`
302
- )
303
- );
304
- }
305
-
306
- break run_format;
307
- }
308
- }
246
+ runFormat({
247
+ packageJsonFilePath: buildContext.packageJsonFilePath
248
+ });
309
249
 
310
250
  edit_KcPage: {
311
251
  if (
@@ -0,0 +1,71 @@
1
+ import * as fs from 'fs';
2
+ import { dirname as pathDirname } from 'path';
3
+ import { assert, Equals } from 'tsafe/assert';
4
+ import chalk from 'chalk';
5
+ import { id } from 'tsafe/id';
6
+ import { z } from 'zod';
7
+ import { is } from 'tsafe/is';
8
+ import * as child_process from 'child_process';
9
+
10
+ export function runFormat(params: { packageJsonFilePath: string }) {
11
+ const { packageJsonFilePath } = params;
12
+
13
+ const parsedPackageJson = (() => {
14
+ type ParsedPackageJson = {
15
+ scripts?: Record<string, string>;
16
+ };
17
+
18
+ const zParsedPackageJson = (() => {
19
+ type TargetType = ParsedPackageJson;
20
+
21
+ const zTargetType = z.object({
22
+ scripts: z.record(z.string()).optional()
23
+ });
24
+
25
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
26
+
27
+ return id<z.ZodType<TargetType>>(zTargetType);
28
+ })();
29
+
30
+ const parsedPackageJson = JSON.parse(
31
+ fs.readFileSync(packageJsonFilePath).toString('utf8')
32
+ );
33
+
34
+ zParsedPackageJson.parse(parsedPackageJson);
35
+
36
+ assert(is<ParsedPackageJson>(parsedPackageJson));
37
+
38
+ return parsedPackageJson;
39
+ })();
40
+
41
+ const { scripts } = parsedPackageJson;
42
+
43
+ if (scripts === undefined) {
44
+ return;
45
+ }
46
+
47
+ for (const scriptName of ['format', 'lint']) {
48
+ if (!(scriptName in scripts)) {
49
+ continue;
50
+ }
51
+
52
+ const command = `npm run ${scriptName}`;
53
+
54
+ console.log(chalk.grey(`$ ${command}`));
55
+
56
+ try {
57
+ child_process.execSync(`npm run ${scriptName}`, {
58
+ stdio: 'inherit',
59
+ cwd: pathDirname(packageJsonFilePath)
60
+ });
61
+ } catch {
62
+ console.log(
63
+ chalk.yellow(
64
+ `\`${command}\` failed, please format your code manually, continuing...`
65
+ )
66
+ );
67
+ }
68
+
69
+ return;
70
+ }
71
+ }
@@ -1,6 +1,7 @@
1
1
  import type { BuildContext } from './core';
2
2
  import * as fs from 'fs';
3
3
  import { join as pathJoin } from 'path';
4
+ import { runFormat } from './tools/runFormat';
4
5
 
5
6
  export function command(params: { buildContext: BuildContext }) {
6
7
  const { buildContext } = params;
@@ -17,13 +18,8 @@ export function command(params: { buildContext: BuildContext }) {
17
18
 
18
19
  const newContent = Buffer.from(
19
20
  [
20
- `/* prettier-ignore-start */`,
21
21
  ``,
22
- `/* eslint-disable */`,
23
- ``,
24
- `// noinspection JSUnusedGlobalSymbols`,
25
- ``,
26
- `// This file is auto-generated by Keycloakify`,
22
+ `// This file is auto-generated by Keycloakify, do not modify it manually.`,
27
23
  ``,
28
24
  `import type { ComponentRef, EnvironmentProviders, Type } from "@angular/core";`,
29
25
  ``,
@@ -58,6 +54,7 @@ export function command(params: { buildContext: BuildContext }) {
58
54
  `}`,
59
55
  ``,
60
56
  `type ApplicationRefLike = {`,
57
+ ` // eslint-disable-next-line @typescript-eslint/no-explicit-any`,
61
58
  ` components: ComponentRef<any>[];`,
62
59
  `};`,
63
60
  ``,
@@ -134,8 +131,6 @@ export function command(params: { buildContext: BuildContext }) {
134
131
  .flat(),
135
132
  ` }`,
136
133
  `}`,
137
- ``,
138
- `/* prettier-ignore-end */`,
139
134
  ``
140
135
  ].join('\n'),
141
136
  'utf8'
@@ -146,4 +141,6 @@ export function command(params: { buildContext: BuildContext }) {
146
141
  }
147
142
 
148
143
  fs.writeFileSync(filePath, newContent);
144
+
145
+ runFormat({ packageJsonFilePath: buildContext.packageJsonFilePath });
149
146
  }
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';
1
+ import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, signal, type TemplateRef, viewChild } from '@angular/core';
2
2
  import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';
3
3
  import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
4
4
  import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';
@@ -24,7 +24,7 @@ import type { ClassKey } from 'keycloakify/login/lib/kcClsx';
24
24
  }
25
25
  ]
26
26
  })
27
- export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
27
+ export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference implements AfterViewInit {
28
28
  kcContext = inject<Extract<KcContext, { pageId: 'login-recovery-authn-code-config.ftl' }>>(KC_LOGIN_CONTEXT);
29
29
  i18n = inject<I18n>(LOGIN_I18N);
30
30
  loginResourceInjectorService = inject(LoginResourceInjectorService);
@@ -49,6 +49,9 @@ export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
49
49
 
50
50
  constructor() {
51
51
  super();
52
+ }
53
+
54
+ ngAfterViewInit() {
52
55
  this.loginResourceInjectorService.insertAdditionalScripts([
53
56
  {
54
57
  type: 'text/javascript',