@keycloakify/angular 0.0.5 → 0.0.6
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/esm2022/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.mjs +123 -4
- package/esm2022/login/pages/register/register.component.mjs +3 -3
- package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs +122 -3
- package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-register.mjs +2 -2
- package/fesm2022/keycloakify-angular-login-pages-register.mjs.map +1 -1
- package/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.d.ts +3 -0
- package/package.json +7 -7
- package/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +123 -0
- package/src/login/pages/register/register.component.html +4 -1
|
@@ -3,15 +3,17 @@ 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';
|
|
5
5
|
import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';
|
|
6
|
+
import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';
|
|
6
7
|
import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';
|
|
7
8
|
import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';
|
|
8
9
|
import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';
|
|
9
10
|
import * as i0 from "@angular/core";
|
|
10
11
|
export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
|
|
11
12
|
constructor() {
|
|
12
|
-
super(
|
|
13
|
+
super();
|
|
13
14
|
this.kcContext = inject(KC_LOGIN_CONTEXT);
|
|
14
15
|
this.i18n = inject(LOGIN_I18N);
|
|
16
|
+
this.loginResourceInjectorService = inject(LoginResourceInjectorService);
|
|
15
17
|
this.doUseDefaultCss = inject(USE_DEFAULT_CSS);
|
|
16
18
|
this.classes = inject(LOGIN_CLASSES);
|
|
17
19
|
this.displayRequiredFields = false;
|
|
@@ -22,8 +24,125 @@ export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
|
|
|
22
24
|
this.socialProvidersNode = viewChild('socialProvidersNode');
|
|
23
25
|
this.toggleRecoveryCodesConfirmation = signal(false);
|
|
24
26
|
this.olRecoveryCodesListId = 'kc-recovery-codes-list';
|
|
27
|
+
this.loginResourceInjectorService.insertAdditionalScripts([
|
|
28
|
+
{
|
|
29
|
+
type: 'text/javascript',
|
|
30
|
+
id: `${this.olRecoveryCodesListId}-script`,
|
|
31
|
+
textContent: `
|
|
32
|
+
/* copy recovery codes */
|
|
33
|
+
function copyRecoveryCodes() {
|
|
34
|
+
var tmpTextarea = document.createElement("textarea");
|
|
35
|
+
var codes = document.querySelectorAll("#${this.olRecoveryCodesListId} li");
|
|
36
|
+
for (i = 0; i < codes.length; i++) {
|
|
37
|
+
tmpTextarea.value = tmpTextarea.value + codes[i].innerText + "\\n";
|
|
38
|
+
}
|
|
39
|
+
document.body.appendChild(tmpTextarea);
|
|
40
|
+
tmpTextarea.select();
|
|
41
|
+
document.execCommand("copy");
|
|
42
|
+
document.body.removeChild(tmpTextarea);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
var copyButton = document.getElementById("copyRecoveryCodes");
|
|
46
|
+
copyButton && copyButton.addEventListener("click", function () {
|
|
47
|
+
copyRecoveryCodes();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/* download recovery codes */
|
|
51
|
+
function formatCurrentDateTime() {
|
|
52
|
+
var dt = new Date();
|
|
53
|
+
var options = {
|
|
54
|
+
month: 'long',
|
|
55
|
+
day: 'numeric',
|
|
56
|
+
year: 'numeric',
|
|
57
|
+
hour: 'numeric',
|
|
58
|
+
minute: 'numeric',
|
|
59
|
+
timeZoneName: 'short'
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
return dt.toLocaleString('en-US', options);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function parseRecoveryCodeList() {
|
|
66
|
+
var recoveryCodes = document.querySelectorAll("#${this.olRecoveryCodesListId} li");
|
|
67
|
+
var recoveryCodeList = "";
|
|
68
|
+
|
|
69
|
+
for (var i = 0; i < recoveryCodes.length; i++) {
|
|
70
|
+
var recoveryCodeLiElement = recoveryCodes[i].innerText;
|
|
71
|
+
recoveryCodeList += recoveryCodeLiElement + "\\r\\n";
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return recoveryCodeList;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function buildDownloadContent() {
|
|
78
|
+
var recoveryCodeList = parseRecoveryCodeList();
|
|
79
|
+
var dt = new Date();
|
|
80
|
+
var options = {
|
|
81
|
+
month: 'long',
|
|
82
|
+
day: 'numeric',
|
|
83
|
+
year: 'numeric',
|
|
84
|
+
hour: 'numeric',
|
|
85
|
+
minute: 'numeric',
|
|
86
|
+
timeZoneName: 'short'
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
return fileBodyContent =
|
|
90
|
+
${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + "\\n\\n" +
|
|
91
|
+
recoveryCodeList + "\\n" +
|
|
92
|
+
${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + "\\n\\n" +
|
|
93
|
+
${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + " " + formatCurrentDateTime();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function setUpDownloadLinkAndDownload(filename, text) {
|
|
97
|
+
var el = document.createElement('a');
|
|
98
|
+
el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
|
|
99
|
+
el.setAttribute('download', filename);
|
|
100
|
+
el.style.display = 'none';
|
|
101
|
+
document.body.appendChild(el);
|
|
102
|
+
el.click();
|
|
103
|
+
document.body.removeChild(el);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function downloadRecoveryCodes() {
|
|
107
|
+
setUpDownloadLinkAndDownload('kc-download-recovery-codes.txt', buildDownloadContent());
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
var downloadButton = document.getElementById("downloadRecoveryCodes");
|
|
111
|
+
downloadButton && downloadButton.addEventListener("click", downloadRecoveryCodes);
|
|
112
|
+
|
|
113
|
+
/* print recovery codes */
|
|
114
|
+
function buildPrintContent() {
|
|
115
|
+
var recoveryCodeListHTML = document.getElementById('${this.olRecoveryCodesListId}').innerHTML;
|
|
116
|
+
var styles =
|
|
117
|
+
\`@page { size: auto; margin-top: 0; }
|
|
118
|
+
body { width: 480px; }
|
|
119
|
+
div { list-style-type: none; font-family: monospace }
|
|
120
|
+
p:first-of-type { margin-top: 48px }\`;
|
|
121
|
+
|
|
122
|
+
return printFileContent =
|
|
123
|
+
"<html><style>" + styles + "</style><body>" +
|
|
124
|
+
"<title>kc-download-recovery-codes</title>" +
|
|
125
|
+
"<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + "</p>" +
|
|
126
|
+
"<div>" + recoveryCodeListHTML + "</div>" +
|
|
127
|
+
"<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + "</p>" +
|
|
128
|
+
"<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + " " + formatCurrentDateTime() + "</p>" +
|
|
129
|
+
"</body></html>";
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function printRecoveryCodes() {
|
|
133
|
+
var w = window.open();
|
|
134
|
+
w.document.write(buildPrintContent());
|
|
135
|
+
w.print();
|
|
136
|
+
w.close();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
var printButton = document.getElementById("printRecoveryCodes");
|
|
140
|
+
printButton && printButton.addEventListener("click", printRecoveryCodes);
|
|
141
|
+
`
|
|
142
|
+
}
|
|
143
|
+
]);
|
|
25
144
|
}
|
|
26
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginRecoveryAuthnCodeConfigComponent, deps:
|
|
145
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginRecoveryAuthnCodeConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
27
146
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LoginRecoveryAuthnCodeConfigComponent, isStandalone: true, selector: "kc-login-recovery-authn-code-config", providers: [
|
|
28
147
|
{
|
|
29
148
|
provide: ComponentReference,
|
|
@@ -39,5 +158,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
|
|
|
39
158
|
useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)
|
|
40
159
|
}
|
|
41
160
|
], 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" }]
|
|
42
|
-
}] });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcmVjb3ZlcnktYXV0aG4tY29kZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xvZ2luL3BhZ2VzL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnL2xvZ2luLXJlY292ZXJ5LWF1dGhuLWNvZGUtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dpbi9wYWdlcy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy9sb2dpbi1yZWNvdmVyeS1hdXRobi1jb2RlLWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFvQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzVGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBR2xGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOENBQThDLENBQUM7O0FBZ0JoRixNQUFNLE9BQU8scUNBQXNDLFNBQVEsa0JBQWtCO0lBYjdFOztRQWNJLGNBQVMsR0FBRyxNQUFNLENBQXlFLGdCQUFnQixDQUFDLENBQUM7UUFDN0csU0FBSSxHQUFHLE1BQU0sQ0FBTyxVQUFVLENBQUMsQ0FBQztRQUV2QixvQkFBZSxHQUFHLE1BQU0sQ0FBVSxlQUFlLENBQUMsQ0FBQztRQUNuRCxZQUFPLEdBQUcsTUFBTSxDQUFvQyxhQUFhLENBQUMsQ0FBQztRQUs1RSwwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsbUJBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV6RSxlQUFVLEdBQUcsU0FBUyxDQUEyQixZQUFZLENBQUMsQ0FBQztRQUMvRCxhQUFRLEdBQUcsU0FBUyxDQUEyQixVQUFVLENBQUMsQ0FBQztRQUMzRCx3QkFBbUIsR0FBRyxTQUFTLENBQTJCLHFCQUFxQixDQUFDLENBQUM7UUFFakYsb0NBQStCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhELDBCQUFxQixHQUFHLHdCQUF3QixDQUFDO0tBQ3BEOzhHQXJCWSxxQ0FBcUM7a0dBQXJDLHFDQUFxQyxrRkFQbkM7WUFDUDtnQkFDSSxPQUFPLEVBQUUsa0JBQWtCO2dCQUMzQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxDQUFDO2FBQ3ZFO1NBQ0osK1lDdkJMLDY1SUFrSkEsNENEcEljLGdCQUFnQiwrRkFBRSw0QkFBNEI7OzJGQVcvQyxxQ0FBcUM7a0JBYmpELFNBQVM7aUNBQ00sSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsNEJBQTRCLENBQUMsWUFDL0MscUNBQXFDLG1CQUU5Qix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNDQUFzQyxDQUFDO3lCQUN2RTtxQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGZvcndhcmRSZWYsIGluamVjdCwgc2lnbmFsLCB0eXBlIFRlbXBsYXRlUmVmLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVTRV9ERUZBVUxUX0NTUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xpYi90b2tlbnMvdXNlLWRlZmF1bHQtY3NzJztcbmltcG9ydCB7IENvbXBvbmVudFJlZmVyZW5jZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2NsYXNzZXMvY29tcG9uZW50LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBMb2dvdXRPdGhlclNlc3Npb25zQ29tcG9uZW50IH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vY29tcG9uZW50cy9sb2dvdXQtb3RoZXItc2Vzc2lvbnMnO1xuaW1wb3J0IHsgS2NDbGFzc0RpcmVjdGl2ZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2RpcmVjdGl2ZXMva2MtY2xhc3MnO1xuaW1wb3J0IHR5cGUgeyBJMThuIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vaTE4bic7XG5pbXBvcnQgdHlwZSB7IEtjQ29udGV4dCB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL0tjQ29udGV4dCc7XG5pbXBvcnQgeyBMT0dJTl9DTEFTU0VTIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vdG9rZW5zL2NsYXNzZXMnO1xuaW1wb3J0IHsgTE9HSU5fSTE4TiB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL3Rva2Vucy9pMThuJztcbmltcG9ydCB7IEtDX0xPR0lOX0NPTlRFWFQgfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi90b2tlbnMva2MtY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IENsYXNzS2V5IH0gZnJvbSAna2V5Y2xvYWtpZnkvbG9naW4vbGliL2tjQ2xzeCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0tjQ2xhc3NEaXJlY3RpdmUsIExvZ291dE90aGVyU2Vzc2lvbnNDb21wb25lbnRdLFxuICAgIHNlbGVjdG9yOiAna2MtbG9naW4tcmVjb3ZlcnktYXV0aG4tY29kZS1jb25maWcnLFxuICAgIHRlbXBsYXRlVXJsOiAnbG9naW4tcmVjb3ZlcnktYXV0aG4tY29kZS1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBDb21wb25lbnRSZWZlcmVuY2UsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBMb2dpblJlY292ZXJ5QXV0aG5Db2RlQ29uZmlnQ29tcG9uZW50KVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBMb2dpblJlY292ZXJ5QXV0aG5Db2RlQ29uZmlnQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50UmVmZXJlbmNlIHtcbiAgICBrY0NvbnRleHQgPSBpbmplY3Q8RXh0cmFjdDxLY0NvbnRleHQsIHsgcGFnZUlkOiAnbG9naW4tcmVjb3ZlcnktYXV0aG4tY29kZS1jb25maWcuZnRsJyB9Pj4oS0NfTE9HSU5fQ09OVEVYVCk7XG4gICAgaTE4biA9IGluamVjdDxJMThuPihMT0dJTl9JMThOKTtcblxuICAgIG92ZXJyaWRlIGRvVXNlRGVmYXVsdENzcyA9IGluamVjdDxib29sZWFuPihVU0VfREVGQVVMVF9DU1MpO1xuICAgIG92ZXJyaWRlIGNsYXNzZXMgPSBpbmplY3Q8UGFydGlhbDxSZWNvcmQ8Q2xhc3NLZXksIHN0cmluZz4+PihMT0dJTl9DTEFTU0VTKTtcblxuICAgIGRvY3VtZW50VGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBib2R5Q2xhc3NOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkaXNwbGF5UmVxdWlyZWRGaWVsZHMgPSBmYWxzZTtcbiAgICBkaXNwbGF5SW5mbyA9IHRydWU7XG4gICAgZGlzcGxheU1lc3NhZ2UgPSB0aGlzLmtjQ29udGV4dC5tZXNzYWdlc1BlckZpZWxkLmV4aXN0c0Vycm9yKCdwYXNzd29yZCcpO1xuXG4gICAgaGVhZGVyTm9kZSA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4+KCdoZWFkZXJOb2RlJyk7XG4gICAgaW5mb05vZGUgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+PignaW5mb05vZGUnKTtcbiAgICBzb2NpYWxQcm92aWRlcnNOb2RlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50Pj4oJ3NvY2lhbFByb3ZpZGVyc05vZGUnKTtcblxuICAgIHRvZ2dsZVJlY292ZXJ5Q29kZXNDb25maXJtYXRpb24gPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgb2xSZWNvdmVyeUNvZGVzTGlzdElkID0gJ2tjLXJlY292ZXJ5LWNvZGVzLWxpc3QnO1xufVxuIiwiQGxldCByZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuID0ga2NDb250ZXh0LnJlY292ZXJ5QXV0aG5Db2Rlc0NvbmZpZ0JlYW47XG5AbGV0IGlzQXBwSW5pdGlhdGVkQWN0aW9uID0ga2NDb250ZXh0LmlzQXBwSW5pdGlhdGVkQWN0aW9uO1xuXG48bmctdGVtcGxhdGUgI2hlYWRlck5vZGU+XG4gICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGUtY29uZmlnLWhlYWRlcicpIH19XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2XG4gICAgY2xhc3M9XCJwZi1jLWFsZXJ0IHBmLW0td2FybmluZyBwZi1tLWlubGluZVwiXG4gICAgYXJpYS1sYWJlbD1cIldhcm5pbmcgYWxlcnRcIlxuICAgIFtrY0NsYXNzXT1cIidrY1JlY292ZXJ5Q29kZXNXYXJuaW5nJ1wiXG4+XG4gICAgPGRpdiBjbGFzcz1cInBmLWMtYWxlcnRfX2ljb25cIj5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLXdhcm5pbmctdHJpYW5nbGUtb1wiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxoNCBjbGFzcz1cInBmLWMtYWxlcnRfX3RpdGxlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGYtc2NyZWVuLXJlYWRlclwiPldhcm5pbmcgYWxlcnQ6PC9zcGFuPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZS1jb25maWctd2FybmluZy10aXRsZScpIH19XG4gICAgPC9oND5cbiAgICA8ZGl2IGNsYXNzPVwicGYtYy1hbGVydF9fZGVzY3JpcHRpb25cIj5cbiAgICAgICAgPHA+e3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGUtY29uZmlnLXdhcm5pbmctbWVzc2FnZScpIH19PC9wPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxvbFxuICAgIFtpZF09XCJvbFJlY292ZXJ5Q29kZXNMaXN0SWRcIlxuICAgIFtrY0NsYXNzXT1cIidrY1JlY292ZXJ5Q29kZXNMaXN0J1wiXG4+XG4gICAgQGZvciAoY29kZSBvZiByZWNvdmVyeUF1dGhuQ29kZXNDb25maWdCZWFuLmdlbmVyYXRlZFJlY292ZXJ5QXV0aG5Db2Rlc0xpc3Q7IHRyYWNrIGNvZGU7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxsaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19Ojwvc3Bhbj4ge3sgY29kZS5zbGljZSgwLCA0KSB9fS17eyBjb2RlLnNsaWNlKDQsIDgpIH19LXt7IGNvZGUuc2xpY2UoOCkgfX1cbiAgICAgICAgPC9saT5cbiAgICB9XG48L29sPlxuXG48IS0tIGFjdGlvbnMgLS0+XG48ZGl2IFtrY0NsYXNzXT1cIidrY1JlY292ZXJ5Q29kZXNBY3Rpb25zJ1wiPlxuICAgIDxidXR0b25cbiAgICAgICAgaWQ9XCJwcmludFJlY292ZXJ5Q29kZXNcIlxuICAgICAgICBjbGFzcz1cInBmLWMtYnV0dG9uIHBmLW0tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGZpY29uLXByaW50XCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID48L2k+XG4gICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1wcmludCcpIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgICBpZD1cImRvd25sb2FkUmVjb3ZlcnlDb2Rlc1wiXG4gICAgICAgIGNsYXNzPVwicGYtYy1idXR0b24gcGYtbS1saW5rXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJwZmljb24tc2F2ZVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgICAgICB7eyBpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtZG93bmxvYWQnKSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgaWQ9XCJjb3B5UmVjb3ZlcnlDb2Rlc1wiXG4gICAgICAgIGNsYXNzPVwicGYtYy1idXR0b24gcGYtbS1saW5rXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJwZmljb24tYmx1ZXByaW50XCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID48L2k+XG4gICAgICAgIHt7IGkxOG4ubXNnU3RyKCdyZWNvdmVyeS1jb2Rlcy1jb3B5JykgfX1cbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48IS0tIGNvbmZpcm1hdGlvbiBjaGVja2JveCAtLT5cblxuPGRpdlxuICAgIGNsYXNzPVwiY2hlY2tib3hcIlxuICAgIFtrY0NsYXNzXT1cIidrY0Zvcm1PcHRpb25zQ2xhc3MnXCJcbj5cbiAgICA8bGFiZWwgZm9yPVwia2NSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uQ2hlY2tcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgaWQ9XCJrY1JlY292ZXJ5Q29kZXNDb25maXJtYXRpb25DaGVja1wiXG4gICAgICAgICAgICBuYW1lPVwia2NSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uQ2hlY2tcIlxuICAgICAgICAgICAgW2tjQ2xhc3NdPVwiJ2tjQ2hlY2tJbnB1dENsYXNzJ1wiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uKClcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uLnNldCgkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWQpXCJcbiAgICAgICAgLz5cbiAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWNvbmZpcm1hdGlvbi1tZXNzYWdlJykgfX1cbiAgICA8L2xhYmVsPlxuPC9kaXY+XG5cbjxmb3JtXG4gICAgaWQ9XCJrYy1yZWNvdmVyeS1jb2Rlcy1zZXR0aW5ncy1mb3JtXCJcbiAgICBtZXRob2Q9XCJwb3N0XCJcbiAgICBbYWN0aW9uXT1cImtjQ29udGV4dC51cmwubG9naW5BY3Rpb25cIlxuICAgIFtrY0NsYXNzXT1cIidrY0Zvcm1Hcm91cENsYXNzJ1wiXG4+XG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgICBuYW1lPVwiZ2VuZXJhdGVkUmVjb3ZlcnlBdXRobkNvZGVzXCJcbiAgICAgICAgW3ZhbHVlXT1cInJlY292ZXJ5QXV0aG5Db2Rlc0NvbmZpZ0JlYW4uZ2VuZXJhdGVkUmVjb3ZlcnlBdXRobkNvZGVzQXNTdHJpbmdcIlxuICAgIC8+XG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgICBuYW1lPVwiZ2VuZXJhdGVkQXRcIlxuICAgICAgICBbdmFsdWVdPVwicmVjb3ZlcnlBdXRobkNvZGVzQ29uZmlnQmVhbi5nZW5lcmF0ZWRBdFwiXG4gICAgLz5cbiAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImhpZGRlblwiXG4gICAgICAgIGlkPVwidXNlckxhYmVsXCJcbiAgICAgICAgbmFtZT1cInVzZXJMYWJlbFwiXG4gICAgICAgIFt2YWx1ZV09XCJpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtbGFiZWwtZGVmYXVsdCcpXCJcbiAgICAvPlxuXG4gICAgPGtjLWxvZ291dC1vdGhlci1zZXNzaW9ucyAvPlxuXG4gICAgQGlmIChpc0FwcEluaXRpYXRlZEFjdGlvbikge1xuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgaWQ9XCJzYXZlUmVjb3ZlcnlBdXRobkNvZGVzQnRuXCJcbiAgICAgICAgICAgIFtrY0NsYXNzXT1cIlsna2NCdXR0b25DbGFzcycsICdrY0J1dHRvblByaW1hcnlDbGFzcycsICdrY0J1dHRvbkxhcmdlQ2xhc3MnXVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWFjdGlvbi1jb21wbGV0ZScpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdG9nZ2xlUmVjb3ZlcnlDb2Rlc0NvbmZpcm1hdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBpZD1cImNhbmNlbFJlY292ZXJ5QXV0aG5Db2Rlc0J0blwiXG4gICAgICAgICAgICBuYW1lPVwiY2FuY2VsLWFpYVwiXG4gICAgICAgICAgICB2YWx1ZT1cInRydWVcIlxuICAgICAgICAgICAgW2tjQ2xhc3NdPVwiWydrY0J1dHRvbkNsYXNzJywgJ2tjQnV0dG9uRGVmYXVsdENsYXNzJywgJ2tjQnV0dG9uTGFyZ2VDbGFzcyddXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3JlY292ZXJ5LWNvZGVzLWFjdGlvbi1jYW5jZWwnKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgIGlkPVwic2F2ZVJlY292ZXJ5QXV0aG5Db2Rlc0J0blwiXG4gICAgICAgICAgICBba2NDbGFzc109XCJbJ2tjQnV0dG9uQ2xhc3MnLCAna2NCdXR0b25QcmltYXJ5Q2xhc3MnLCAna2NCdXR0b25CbG9ja0NsYXNzJywgJ2tjQnV0dG9uTGFyZ2VDbGFzcyddXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpMThuLm1zZ1N0cigncmVjb3ZlcnktY29kZXMtYWN0aW9uLWNvbXBsZXRlJylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0b2dnbGVSZWNvdmVyeUNvZGVzQ29uZmlybWF0aW9uKClcIlxuICAgICAgICAvPlxuICAgIH1cbjwvZm9ybT5cbiJdfQ==
|
|
161
|
+
}], 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=
|
|
@@ -39,7 +39,7 @@ export class RegisterComponent extends ComponentReference {
|
|
|
39
39
|
provide: ComponentReference,
|
|
40
40
|
useExisting: forwardRef(() => RegisterComponent)
|
|
41
41
|
}
|
|
42
|
-
], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a
|
|
42
|
+
], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a\n [href]=\"url.loginUrl\"\n [innerHTML]=\"i18n.msgStr('backToLogin') | kcSanitize: 'html'\"\n ></a>\n </span>\n </div>\n </div>\n @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <button\n class=\"g-recaptcha\"\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-callback]=\"onCallback\"\n [attr.data-action]=\"recaptchaAction\"\n >\n {{ i18n.msgStr('doRegister') }}\n </button>\n </div>\n } @else {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable() || (termsAcceptanceRequired && !areTermsAccepted())\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doRegister')\"\n />\n </div>\n }\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: KcClassDirective, selector: "[kcClass]", inputs: ["class", "ngClass", "kcClass"] }, { kind: "pipe", type: KcSanitizePipe, name: "kcSanitize" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
43
43
|
}
|
|
44
44
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: RegisterComponent, decorators: [{
|
|
45
45
|
type: Component,
|
|
@@ -48,6 +48,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
|
|
|
48
48
|
provide: ComponentReference,
|
|
49
49
|
useExisting: forwardRef(() => RegisterComponent)
|
|
50
50
|
}
|
|
51
|
-
], template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a
|
|
51
|
+
], template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a\n [href]=\"url.loginUrl\"\n [innerHTML]=\"i18n.msgStr('backToLogin') | kcSanitize: 'html'\"\n ></a>\n </span>\n </div>\n </div>\n @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <button\n class=\"g-recaptcha\"\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-callback]=\"onCallback\"\n [attr.data-action]=\"recaptchaAction\"\n >\n {{ i18n.msgStr('doRegister') }}\n </button>\n </div>\n } @else {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable() || (termsAcceptanceRequired && !areTermsAccepted())\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doRegister')\"\n />\n </div>\n }\n </div>\n</form>\n" }]
|
|
52
52
|
}] });
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xvZ2luL3BhZ2VzL3JlZ2lzdGVyL3JlZ2lzdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dpbi9wYWdlcy9yZWdpc3Rlci9yZWdpc3Rlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUEwQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekksT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFFNUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFHbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDL0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUVoRixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQWUzQixNQUFNLE9BQU8saUJBQWtCLFNBQVEsa0JBQWtCO0lBYnpEOztRQWNJLDRCQUF1QixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pELGNBQVMsR0FBRyxNQUFNLENBQWlELGdCQUFnQixDQUFDLENBQUM7UUFDckYsU0FBSSxHQUFHLE1BQU0sQ0FBTyxVQUFVLENBQUMsQ0FBQztRQUV2QixvQkFBZSxHQUFHLE1BQU0sQ0FBVSxlQUFlLENBQUMsQ0FBQztRQUNuRCxZQUFPLEdBQUcsTUFBTSxDQUFvQyxhQUFhLENBQUMsQ0FBQztRQUs1RSwwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsbUJBQWMsR0FBWSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5GLGVBQVUsR0FBRyxTQUFTLENBQTJCLFlBQVksQ0FBQyxDQUFDO1FBQy9ELGFBQVEsR0FBRyxTQUFTLENBQTJCLFVBQVUsQ0FBQyxDQUFDO1FBQzNELHdCQUFtQixHQUFHLFNBQVMsQ0FBMkIscUJBQXFCLENBQUMsQ0FBQztRQUVqRixzQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25JLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQywwQkFBcUIsR0FBRyxLQUFLLEVBQXdDLENBQUM7S0FLekU7SUF6QkcsdUJBQXVCLENBQWtDO0lBc0J6RCxVQUFVO1FBQ0wsUUFBUSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBcUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM5RSxDQUFDOzhHQXpCUSxpQkFBaUI7a0dBQWpCLGlCQUFpQiw4T0FQZjtZQUNQO2dCQUNJLE9BQU8sRUFBRSxrQkFBa0I7Z0JBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7YUFDbkQ7U0FDSiwrWUM1QkwsZzhJQWlIQSw0Q0QzRmMsZ0JBQWdCLDBGQUFhLGNBQWMsbURBQVcsaUJBQWlCOzsyRkFReEUsaUJBQWlCO2tCQWI3QixTQUFTOytCQUNJLGFBQWEsY0FFWCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxhQUN2RTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsa0JBQWtCOzRCQUMzQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzt5QkFDbkQ7cUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGZvcndhcmRSZWYsIGluamVjdCwgaW5wdXQsIHNpZ25hbCwgdHlwZSBUZW1wbGF0ZVJlZiwgVHlwZSwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEtjU2FuaXRpemVQaXBlIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbGliL3BpcGVzL2tjLXNhbml0aXplJztcbmltcG9ydCB7IFVTRV9ERUZBVUxUX0NTUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xpYi90b2tlbnMvdXNlLWRlZmF1bHQtY3NzJztcbmltcG9ydCB7IENvbXBvbmVudFJlZmVyZW5jZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2NsYXNzZXMvY29tcG9uZW50LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBVc2VyUHJvZmlsZUZvcm1GaWVsZHNDb21wb25lbnQgfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi9jb21wb25lbnRzL3VzZXItcHJvZmlsZS1mb3JtLWZpZWxkcyc7XG5pbXBvcnQgeyBLY0NsYXNzRGlyZWN0aXZlIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vZGlyZWN0aXZlcy9rYy1jbGFzcyc7XG5pbXBvcnQgdHlwZSB7IEkxOG4gfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi9pMThuJztcbmltcG9ydCB0eXBlIHsgS2NDb250ZXh0IH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vS2NDb250ZXh0JztcbmltcG9ydCB7IFVzZXJQcm9maWxlRm9ybVNlcnZpY2UgfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi9zZXJ2aWNlcy91c2VyLXByb2ZpbGUtZm9ybSc7XG5pbXBvcnQgeyBMT0dJTl9DTEFTU0VTIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vdG9rZW5zL2NsYXNzZXMnO1xuaW1wb3J0IHsgTE9HSU5fSTE4TiB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL3Rva2Vucy9pMThuJztcbmltcG9ydCB7IEtDX0xPR0lOX0NPTlRFWFQgfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi90b2tlbnMva2MtY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IENsYXNzS2V5IH0gZnJvbSAna2V5Y2xvYWtpZnkvbG9naW4vbGliL2tjQ2xzeCc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdrYy1yZWdpc3RlcicsXG4gICAgdGVtcGxhdGVVcmw6ICdyZWdpc3Rlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBpbXBvcnRzOiBbS2NDbGFzc0RpcmVjdGl2ZSwgQXN5bmNQaXBlLCBLY1Nhbml0aXplUGlwZSwgTmdDbGFzcywgTmdDb21wb25lbnRPdXRsZXRdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBDb21wb25lbnRSZWZlcmVuY2UsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSZWdpc3RlckNvbXBvbmVudClcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgUmVnaXN0ZXJDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRSZWZlcmVuY2Uge1xuICAgICN1c2VyUHJvZmlsZUZvcm1TZXJ2aWNlID0gaW5qZWN0KFVzZXJQcm9maWxlRm9ybVNlcnZpY2UpO1xuICAgIGtjQ29udGV4dCA9IGluamVjdDxFeHRyYWN0PEtjQ29udGV4dCwgeyBwYWdlSWQ6ICdyZWdpc3Rlci5mdGwnIH0+PihLQ19MT0dJTl9DT05URVhUKTtcbiAgICBpMThuID0gaW5qZWN0PEkxOG4+KExPR0lOX0kxOE4pO1xuXG4gICAgb3ZlcnJpZGUgZG9Vc2VEZWZhdWx0Q3NzID0gaW5qZWN0PGJvb2xlYW4+KFVTRV9ERUZBVUxUX0NTUyk7XG4gICAgb3ZlcnJpZGUgY2xhc3NlcyA9IGluamVjdDxQYXJ0aWFsPFJlY29yZDxDbGFzc0tleSwgc3RyaW5nPj4+KExPR0lOX0NMQVNTRVMpO1xuXG4gICAgZG9jdW1lbnRUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGJvZHlDbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRpc3BsYXlSZXF1aXJlZEZpZWxkcyA9IGZhbHNlO1xuICAgIGRpc3BsYXlJbmZvID0gZmFsc2U7XG4gICAgZGlzcGxheU1lc3NhZ2U6IGJvb2xlYW4gPSAhdGhpcy5rY0NvbnRleHQ/Lm1lc3NhZ2VzUGVyRmllbGQ/LmV4aXN0c0Vycm9yKCdnbG9iYWwnKTtcblxuICAgIGhlYWRlck5vZGUgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+PignaGVhZGVyTm9kZScpO1xuICAgIGluZm9Ob2RlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50Pj4oJ2luZm9Ob2RlJyk7XG4gICAgc29jaWFsUHJvdmlkZXJzTm9kZSA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4+KCdzb2NpYWxQcm92aWRlcnNOb2RlJyk7XG5cbiAgICBpc0Zvcm1TdWJtaXR0YWJsZSA9IHRvU2lnbmFsKHRoaXMuI3VzZXJQcm9maWxlRm9ybVNlcnZpY2UuZm9ybVN0YXRlJC5waXBlKG1hcChzID0+IHMuaXNGb3JtU3VibWl0dGFibGUpKSwgeyBpbml0aWFsVmFsdWU6IGZhbHNlIH0pO1xuICAgIGFyZVRlcm1zQWNjZXB0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHVzZXJQcm9maWxlRm9ybUZpZWxkcyA9IGlucHV0PFR5cGU8VXNlclByb2ZpbGVGb3JtRmllbGRzQ29tcG9uZW50Pj4oKTtcblxuICAgIG9uQ2FsbGJhY2soKSB7XG4gICAgICAgIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2MtcmVnaXN0ZXItZm9ybScpIGFzIEhUTUxGb3JtRWxlbWVudCkuc3VibWl0KCk7XG4gICAgfVxufVxuIiwiQGxldCB1cmwgPSBrY0NvbnRleHQudXJsO1xuQGxldCBtZXNzYWdlc1BlckZpZWxkID0ga2NDb250ZXh0Lm1lc3NhZ2VzUGVyRmllbGQ7XG5AbGV0IHJlY2FwdGNoYVJlcXVpcmVkID0ga2NDb250ZXh0LnJlY2FwdGNoYVJlcXVpcmVkO1xuQGxldCByZWNhcHRjaGFWaXNpYmxlID0ga2NDb250ZXh0LnJlY2FwdGNoYVZpc2libGU7XG5AbGV0IHJlY2FwdGNoYVNpdGVLZXkgPSBrY0NvbnRleHQucmVjYXB0Y2hhU2l0ZUtleTtcbkBsZXQgcmVjYXB0Y2hhQWN0aW9uID0ga2NDb250ZXh0LnJlY2FwdGNoYUFjdGlvbjtcbkBsZXQgdGVybXNBY2NlcHRhbmNlUmVxdWlyZWQgPSBrY0NvbnRleHQudGVybXNBY2NlcHRhbmNlUmVxdWlyZWQ7XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyTm9kZT5cbiAgICBAbGV0IG1lc3NhZ2VIZWFkZXIgPSBrY0NvbnRleHQubWVzc2FnZUhlYWRlcjtcbiAgICB7eyBtZXNzYWdlSGVhZGVyID8/IGkxOG4uYWR2YW5jZWRNc2dTdHIoJ3JlZ2lzdGVyVGl0bGUnKSB9fVxuPC9uZy10ZW1wbGF0ZT5cbjxmb3JtXG4gICAgaWQ9XCJrYy1yZWdpc3Rlci1mb3JtXCJcbiAgICBtZXRob2Q9XCJwb3N0XCJcbiAgICBba2NDbGFzc109XCIna2NGb3JtQ2xhc3MnXCJcbiAgICBbYWN0aW9uXT1cInVybC5yZWdpc3RyYXRpb25BY3Rpb25cIlxuPlxuICAgIDxuZy1jb250YWluZXIgW25nQ29tcG9uZW50T3V0bGV0XT1cInVzZXJQcm9maWxlRm9ybUZpZWxkcygpID8/IG51bGxcIiAvPlxuICAgIEBpZiAodGVybXNBY2NlcHRhbmNlUmVxdWlyZWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgW2tjQ2xhc3NdPVwiJ2tjSW5wdXRXcmFwcGVyQ2xhc3MnXCI+XG4gICAgICAgICAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3Rlcm1zVGl0bGUnKSB9fVxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJrYy1yZWdpc3RyYXRpb24tdGVybXMtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpMThuLm1zZ1N0cigndGVybXNUZXh0JykgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgW2tjQ2xhc3NdPVwiJ2tjTGFiZWxXcmFwcGVyQ2xhc3MnXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwidGVybXNBY2NlcHRlZFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ0ZXJtc0FjY2VwdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2tjQ2xhc3NdPVwiJ2tjQ2hlY2tib3hJbnB1dENsYXNzJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFyZVRlcm1zQWNjZXB0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJtZXNzYWdlc1BlckZpZWxkLmV4aXN0c0Vycm9yKCd0ZXJtc0FjY2VwdGVkJylcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImFyZVRlcm1zQWNjZXB0ZWQuc2V0KCRhbnkoJGV2ZW50LnRhcmdldCkuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGZvcj1cInRlcm1zQWNjZXB0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBba2NDbGFzc109XCIna2NMYWJlbENsYXNzJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBpMThuLm1zZ1N0cignYWNjZXB0VGVybXMnKSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAobWVzc2FnZXNQZXJGaWVsZC5leGlzdHNFcnJvcigndGVybXNBY2NlcHRlZCcpKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBba2NDbGFzc109XCIna2NMYWJlbFdyYXBwZXJDbGFzcydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiaW5wdXQtZXJyb3ItdGVybXMtYWNjZXB0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtrY0NsYXNzXT1cIidrY0lucHV0RXJyb3JNZXNzYWdlQ2xhc3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwibWVzc2FnZXNQZXJGaWVsZC5nZXQoJ3Rlcm1zQWNjZXB0ZWQnKSB8IGtjU2FuaXRpemU6ICdodG1sJ1wiXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKHJlY2FwdGNoYVJlcXVpcmVkICYmIChyZWNhcHRjaGFWaXNpYmxlIHx8IHJlY2FwdGNoYUFjdGlvbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBba2NDbGFzc109XCIna2NJbnB1dFdyYXBwZXJDbGFzcydcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZy1yZWNhcHRjaGFcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXNpemU9XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1zaXRla2V5XT1cInJlY2FwdGNoYVNpdGVLZXlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWFjdGlvbl09XCJyZWNhcHRjaGFBY3Rpb25cIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8ZGl2IFtrY0NsYXNzXT1cIidrY0Zvcm1Hcm91cENsYXNzJ1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBpZD1cImtjLWZvcm0tb3B0aW9uc1wiXG4gICAgICAgICAgICBba2NDbGFzc109XCIna2NGb3JtT3B0aW9uc0NsYXNzJ1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgW2tjQ2xhc3NdPVwiJ2tjRm9ybU9wdGlvbnNXcmFwcGVyQ2xhc3MnXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cInVybC5sb2dpblVybFwiPnt7IGkxOG4ubXNnU3RyKCdiYWNrVG9Mb2dpbicpIH19PC9hPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChyZWNhcHRjaGFSZXF1aXJlZCAmJiAhcmVjYXB0Y2hhVmlzaWJsZSAmJiByZWNhcHRjaGFBY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGlkPVwia2MtZm9ybS1idXR0b25zXCJcbiAgICAgICAgICAgICAgICBba2NDbGFzc109XCIna2NGb3JtQnV0dG9uc0NsYXNzJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImctcmVjYXB0Y2hhXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgIFtrY0NsYXNzXT1cIlsna2NCdXR0b25DbGFzcycsICdrY0J1dHRvblByaW1hcnlDbGFzcycsICdrY0J1dHRvbkJsb2NrQ2xhc3MnLCAna2NCdXR0b25MYXJnZUNsYXNzJ11cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXNpdGVrZXldPVwicmVjYXB0Y2hhU2l0ZUtleVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY2FsbGJhY2tdPVwib25DYWxsYmFja1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYWN0aW9uXT1cInJlY2FwdGNoYUFjdGlvblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBpMThuLm1zZ1N0cignZG9SZWdpc3RlcicpIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgaWQ9XCJrYy1mb3JtLWJ1dHRvbnNcIlxuICAgICAgICAgICAgICAgIFtrY0NsYXNzXT1cIidrY0Zvcm1CdXR0b25zQ2xhc3MnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNGb3JtU3VibWl0dGFibGUoKSB8fCAodGVybXNBY2NlcHRhbmNlUmVxdWlyZWQgJiYgIWFyZVRlcm1zQWNjZXB0ZWQoKSlcIlxuICAgICAgICAgICAgICAgICAgICBba2NDbGFzc109XCJbJ2tjQnV0dG9uQ2xhc3MnLCAna2NCdXR0b25QcmltYXJ5Q2xhc3MnLCAna2NCdXR0b25CbG9ja0NsYXNzJywgJ2tjQnV0dG9uTGFyZ2VDbGFzcyddXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImkxOG4ubXNnU3RyKCdkb1JlZ2lzdGVyJylcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9mb3JtPlxuIl19
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xvZ2luL3BhZ2VzL3JlZ2lzdGVyL3JlZ2lzdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dpbi9wYWdlcy9yZWdpc3Rlci9yZWdpc3Rlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUEwQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekksT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFFNUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFHbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDL0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUVoRixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQWUzQixNQUFNLE9BQU8saUJBQWtCLFNBQVEsa0JBQWtCO0lBYnpEOztRQWNJLDRCQUF1QixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pELGNBQVMsR0FBRyxNQUFNLENBQWlELGdCQUFnQixDQUFDLENBQUM7UUFDckYsU0FBSSxHQUFHLE1BQU0sQ0FBTyxVQUFVLENBQUMsQ0FBQztRQUV2QixvQkFBZSxHQUFHLE1BQU0sQ0FBVSxlQUFlLENBQUMsQ0FBQztRQUNuRCxZQUFPLEdBQUcsTUFBTSxDQUFvQyxhQUFhLENBQUMsQ0FBQztRQUs1RSwwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsbUJBQWMsR0FBWSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5GLGVBQVUsR0FBRyxTQUFTLENBQTJCLFlBQVksQ0FBQyxDQUFDO1FBQy9ELGFBQVEsR0FBRyxTQUFTLENBQTJCLFVBQVUsQ0FBQyxDQUFDO1FBQzNELHdCQUFtQixHQUFHLFNBQVMsQ0FBMkIscUJBQXFCLENBQUMsQ0FBQztRQUVqRixzQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25JLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQywwQkFBcUIsR0FBRyxLQUFLLEVBQXdDLENBQUM7S0FLekU7SUF6QkcsdUJBQXVCLENBQWtDO0lBc0J6RCxVQUFVO1FBQ0wsUUFBUSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBcUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM5RSxDQUFDOzhHQXpCUSxpQkFBaUI7a0dBQWpCLGlCQUFpQiw4T0FQZjtZQUNQO2dCQUNJLE9BQU8sRUFBRSxrQkFBa0I7Z0JBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7YUFDbkQ7U0FDSiwrWUM1Qkwsd2lKQW9IQSw0Q0Q5RmMsZ0JBQWdCLDBGQUFhLGNBQWMsbURBQVcsaUJBQWlCOzsyRkFReEUsaUJBQWlCO2tCQWI3QixTQUFTOytCQUNJLGFBQWEsY0FFWCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxhQUN2RTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsa0JBQWtCOzRCQUMzQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzt5QkFDbkQ7cUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGZvcndhcmRSZWYsIGluamVjdCwgaW5wdXQsIHNpZ25hbCwgdHlwZSBUZW1wbGF0ZVJlZiwgVHlwZSwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEtjU2FuaXRpemVQaXBlIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbGliL3BpcGVzL2tjLXNhbml0aXplJztcbmltcG9ydCB7IFVTRV9ERUZBVUxUX0NTUyB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xpYi90b2tlbnMvdXNlLWRlZmF1bHQtY3NzJztcbmltcG9ydCB7IENvbXBvbmVudFJlZmVyZW5jZSB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL2NsYXNzZXMvY29tcG9uZW50LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBVc2VyUHJvZmlsZUZvcm1GaWVsZHNDb21wb25lbnQgfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi9jb21wb25lbnRzL3VzZXItcHJvZmlsZS1mb3JtLWZpZWxkcyc7XG5pbXBvcnQgeyBLY0NsYXNzRGlyZWN0aXZlIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vZGlyZWN0aXZlcy9rYy1jbGFzcyc7XG5pbXBvcnQgdHlwZSB7IEkxOG4gfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi9pMThuJztcbmltcG9ydCB0eXBlIHsgS2NDb250ZXh0IH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vS2NDb250ZXh0JztcbmltcG9ydCB7IFVzZXJQcm9maWxlRm9ybVNlcnZpY2UgfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi9zZXJ2aWNlcy91c2VyLXByb2ZpbGUtZm9ybSc7XG5pbXBvcnQgeyBMT0dJTl9DTEFTU0VTIH0gZnJvbSAnQGtleWNsb2FraWZ5L2FuZ3VsYXIvbG9naW4vdG9rZW5zL2NsYXNzZXMnO1xuaW1wb3J0IHsgTE9HSU5fSTE4TiB9IGZyb20gJ0BrZXljbG9ha2lmeS9hbmd1bGFyL2xvZ2luL3Rva2Vucy9pMThuJztcbmltcG9ydCB7IEtDX0xPR0lOX0NPTlRFWFQgfSBmcm9tICdAa2V5Y2xvYWtpZnkvYW5ndWxhci9sb2dpbi90b2tlbnMva2MtY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IENsYXNzS2V5IH0gZnJvbSAna2V5Y2xvYWtpZnkvbG9naW4vbGliL2tjQ2xzeCc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdrYy1yZWdpc3RlcicsXG4gICAgdGVtcGxhdGVVcmw6ICdyZWdpc3Rlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBpbXBvcnRzOiBbS2NDbGFzc0RpcmVjdGl2ZSwgQXN5bmNQaXBlLCBLY1Nhbml0aXplUGlwZSwgTmdDbGFzcywgTmdDb21wb25lbnRPdXRsZXRdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBDb21wb25lbnRSZWZlcmVuY2UsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSZWdpc3RlckNvbXBvbmVudClcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgUmVnaXN0ZXJDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRSZWZlcmVuY2Uge1xuICAgICN1c2VyUHJvZmlsZUZvcm1TZXJ2aWNlID0gaW5qZWN0KFVzZXJQcm9maWxlRm9ybVNlcnZpY2UpO1xuICAgIGtjQ29udGV4dCA9IGluamVjdDxFeHRyYWN0PEtjQ29udGV4dCwgeyBwYWdlSWQ6ICdyZWdpc3Rlci5mdGwnIH0+PihLQ19MT0dJTl9DT05URVhUKTtcbiAgICBpMThuID0gaW5qZWN0PEkxOG4+KExPR0lOX0kxOE4pO1xuXG4gICAgb3ZlcnJpZGUgZG9Vc2VEZWZhdWx0Q3NzID0gaW5qZWN0PGJvb2xlYW4+KFVTRV9ERUZBVUxUX0NTUyk7XG4gICAgb3ZlcnJpZGUgY2xhc3NlcyA9IGluamVjdDxQYXJ0aWFsPFJlY29yZDxDbGFzc0tleSwgc3RyaW5nPj4+KExPR0lOX0NMQVNTRVMpO1xuXG4gICAgZG9jdW1lbnRUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGJvZHlDbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRpc3BsYXlSZXF1aXJlZEZpZWxkcyA9IGZhbHNlO1xuICAgIGRpc3BsYXlJbmZvID0gZmFsc2U7XG4gICAgZGlzcGxheU1lc3NhZ2U6IGJvb2xlYW4gPSAhdGhpcy5rY0NvbnRleHQ/Lm1lc3NhZ2VzUGVyRmllbGQ/LmV4aXN0c0Vycm9yKCdnbG9iYWwnKTtcblxuICAgIGhlYWRlck5vZGUgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+PignaGVhZGVyTm9kZScpO1xuICAgIGluZm9Ob2RlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50Pj4oJ2luZm9Ob2RlJyk7XG4gICAgc29jaWFsUHJvdmlkZXJzTm9kZSA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4+KCdzb2NpYWxQcm92aWRlcnNOb2RlJyk7XG5cbiAgICBpc0Zvcm1TdWJtaXR0YWJsZSA9IHRvU2lnbmFsKHRoaXMuI3VzZXJQcm9maWxlRm9ybVNlcnZpY2UuZm9ybVN0YXRlJC5waXBlKG1hcChzID0+IHMuaXNGb3JtU3VibWl0dGFibGUpKSwgeyBpbml0aWFsVmFsdWU6IGZhbHNlIH0pO1xuICAgIGFyZVRlcm1zQWNjZXB0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHVzZXJQcm9maWxlRm9ybUZpZWxkcyA9IGlucHV0PFR5cGU8VXNlclByb2ZpbGVGb3JtRmllbGRzQ29tcG9uZW50Pj4oKTtcblxuICAgIG9uQ2FsbGJhY2soKSB7XG4gICAgICAgIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2MtcmVnaXN0ZXItZm9ybScpIGFzIEhUTUxGb3JtRWxlbWVudCkuc3VibWl0KCk7XG4gICAgfVxufVxuIiwiQGxldCB1cmwgPSBrY0NvbnRleHQudXJsO1xuQGxldCBtZXNzYWdlc1BlckZpZWxkID0ga2NDb250ZXh0Lm1lc3NhZ2VzUGVyRmllbGQ7XG5AbGV0IHJlY2FwdGNoYVJlcXVpcmVkID0ga2NDb250ZXh0LnJlY2FwdGNoYVJlcXVpcmVkO1xuQGxldCByZWNhcHRjaGFWaXNpYmxlID0ga2NDb250ZXh0LnJlY2FwdGNoYVZpc2libGU7XG5AbGV0IHJlY2FwdGNoYVNpdGVLZXkgPSBrY0NvbnRleHQucmVjYXB0Y2hhU2l0ZUtleTtcbkBsZXQgcmVjYXB0Y2hhQWN0aW9uID0ga2NDb250ZXh0LnJlY2FwdGNoYUFjdGlvbjtcbkBsZXQgdGVybXNBY2NlcHRhbmNlUmVxdWlyZWQgPSBrY0NvbnRleHQudGVybXNBY2NlcHRhbmNlUmVxdWlyZWQ7XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyTm9kZT5cbiAgICBAbGV0IG1lc3NhZ2VIZWFkZXIgPSBrY0NvbnRleHQubWVzc2FnZUhlYWRlcjtcbiAgICB7eyBtZXNzYWdlSGVhZGVyID8/IGkxOG4uYWR2YW5jZWRNc2dTdHIoJ3JlZ2lzdGVyVGl0bGUnKSB9fVxuPC9uZy10ZW1wbGF0ZT5cbjxmb3JtXG4gICAgaWQ9XCJrYy1yZWdpc3Rlci1mb3JtXCJcbiAgICBtZXRob2Q9XCJwb3N0XCJcbiAgICBba2NDbGFzc109XCIna2NGb3JtQ2xhc3MnXCJcbiAgICBbYWN0aW9uXT1cInVybC5yZWdpc3RyYXRpb25BY3Rpb25cIlxuPlxuICAgIDxuZy1jb250YWluZXIgW25nQ29tcG9uZW50T3V0bGV0XT1cInVzZXJQcm9maWxlRm9ybUZpZWxkcygpID8/IG51bGxcIiAvPlxuICAgIEBpZiAodGVybXNBY2NlcHRhbmNlUmVxdWlyZWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgW2tjQ2xhc3NdPVwiJ2tjSW5wdXRXcmFwcGVyQ2xhc3MnXCI+XG4gICAgICAgICAgICAgICAge3sgaTE4bi5tc2dTdHIoJ3Rlcm1zVGl0bGUnKSB9fVxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJrYy1yZWdpc3RyYXRpb24tdGVybXMtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpMThuLm1zZ1N0cigndGVybXNUZXh0JykgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgW2tjQ2xhc3NdPVwiJ2tjTGFiZWxXcmFwcGVyQ2xhc3MnXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwidGVybXNBY2NlcHRlZFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ0ZXJtc0FjY2VwdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2tjQ2xhc3NdPVwiJ2tjQ2hlY2tib3hJbnB1dENsYXNzJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFyZVRlcm1zQWNjZXB0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJtZXNzYWdlc1BlckZpZWxkLmV4aXN0c0Vycm9yKCd0ZXJtc0FjY2VwdGVkJylcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImFyZVRlcm1zQWNjZXB0ZWQuc2V0KCRhbnkoJGV2ZW50LnRhcmdldCkuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGZvcj1cInRlcm1zQWNjZXB0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBba2NDbGFzc109XCIna2NMYWJlbENsYXNzJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBpMThuLm1zZ1N0cignYWNjZXB0VGVybXMnKSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAobWVzc2FnZXNQZXJGaWVsZC5leGlzdHNFcnJvcigndGVybXNBY2NlcHRlZCcpKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBba2NDbGFzc109XCIna2NMYWJlbFdyYXBwZXJDbGFzcydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiaW5wdXQtZXJyb3ItdGVybXMtYWNjZXB0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtrY0NsYXNzXT1cIidrY0lucHV0RXJyb3JNZXNzYWdlQ2xhc3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwibWVzc2FnZXNQZXJGaWVsZC5nZXQoJ3Rlcm1zQWNjZXB0ZWQnKSB8IGtjU2FuaXRpemU6ICdodG1sJ1wiXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKHJlY2FwdGNoYVJlcXVpcmVkICYmIChyZWNhcHRjaGFWaXNpYmxlIHx8IHJlY2FwdGNoYUFjdGlvbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBba2NDbGFzc109XCIna2NJbnB1dFdyYXBwZXJDbGFzcydcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZy1yZWNhcHRjaGFcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXNpemU9XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1zaXRla2V5XT1cInJlY2FwdGNoYVNpdGVLZXlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWFjdGlvbl09XCJyZWNhcHRjaGFBY3Rpb25cIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8ZGl2IFtrY0NsYXNzXT1cIidrY0Zvcm1Hcm91cENsYXNzJ1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBpZD1cImtjLWZvcm0tb3B0aW9uc1wiXG4gICAgICAgICAgICBba2NDbGFzc109XCIna2NGb3JtT3B0aW9uc0NsYXNzJ1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgW2tjQ2xhc3NdPVwiJ2tjRm9ybU9wdGlvbnNXcmFwcGVyQ2xhc3MnXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJ1cmwubG9naW5VcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJpMThuLm1zZ1N0cignYmFja1RvTG9naW4nKSB8IGtjU2FuaXRpemU6ICdodG1sJ1wiXG4gICAgICAgICAgICAgICAgICAgID48L2E+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKHJlY2FwdGNoYVJlcXVpcmVkICYmICFyZWNhcHRjaGFWaXNpYmxlICYmIHJlY2FwdGNoYUFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgaWQ9XCJrYy1mb3JtLWJ1dHRvbnNcIlxuICAgICAgICAgICAgICAgIFtrY0NsYXNzXT1cIidrY0Zvcm1CdXR0b25zQ2xhc3MnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZy1yZWNhcHRjaGFcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgW2tjQ2xhc3NdPVwiWydrY0J1dHRvbkNsYXNzJywgJ2tjQnV0dG9uUHJpbWFyeUNsYXNzJywgJ2tjQnV0dG9uQmxvY2tDbGFzcycsICdrY0J1dHRvbkxhcmdlQ2xhc3MnXVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtc2l0ZWtleV09XCJyZWNhcHRjaGFTaXRlS2V5XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jYWxsYmFja109XCJvbkNhbGxiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1hY3Rpb25dPVwicmVjYXB0Y2hhQWN0aW9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7IGkxOG4ubXNnU3RyKCdkb1JlZ2lzdGVyJykgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBpZD1cImtjLWZvcm0tYnV0dG9uc1wiXG4gICAgICAgICAgICAgICAgW2tjQ2xhc3NdPVwiJ2tjRm9ybUJ1dHRvbnNDbGFzcydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1TdWJtaXR0YWJsZSgpIHx8ICh0ZXJtc0FjY2VwdGFuY2VSZXF1aXJlZCAmJiAhYXJlVGVybXNBY2NlcHRlZCgpKVwiXG4gICAgICAgICAgICAgICAgICAgIFtrY0NsYXNzXT1cIlsna2NCdXR0b25DbGFzcycsICdrY0J1dHRvblByaW1hcnlDbGFzcycsICdrY0J1dHRvbkJsb2NrQ2xhc3MnLCAna2NCdXR0b25MYXJnZUNsYXNzJ11cIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaTE4bi5tc2dTdHIoJ2RvUmVnaXN0ZXInKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=
|
|
@@ -4,15 +4,17 @@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css
|
|
|
4
4
|
import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
|
|
5
5
|
import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions';
|
|
6
6
|
import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';
|
|
7
|
+
import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';
|
|
7
8
|
import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';
|
|
8
9
|
import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';
|
|
9
10
|
import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';
|
|
10
11
|
|
|
11
12
|
class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
|
|
12
13
|
constructor() {
|
|
13
|
-
super(
|
|
14
|
+
super();
|
|
14
15
|
this.kcContext = inject(KC_LOGIN_CONTEXT);
|
|
15
16
|
this.i18n = inject(LOGIN_I18N);
|
|
17
|
+
this.loginResourceInjectorService = inject(LoginResourceInjectorService);
|
|
16
18
|
this.doUseDefaultCss = inject(USE_DEFAULT_CSS);
|
|
17
19
|
this.classes = inject(LOGIN_CLASSES);
|
|
18
20
|
this.displayRequiredFields = false;
|
|
@@ -23,8 +25,125 @@ class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
|
|
|
23
25
|
this.socialProvidersNode = viewChild('socialProvidersNode');
|
|
24
26
|
this.toggleRecoveryCodesConfirmation = signal(false);
|
|
25
27
|
this.olRecoveryCodesListId = 'kc-recovery-codes-list';
|
|
28
|
+
this.loginResourceInjectorService.insertAdditionalScripts([
|
|
29
|
+
{
|
|
30
|
+
type: 'text/javascript',
|
|
31
|
+
id: `${this.olRecoveryCodesListId}-script`,
|
|
32
|
+
textContent: `
|
|
33
|
+
/* copy recovery codes */
|
|
34
|
+
function copyRecoveryCodes() {
|
|
35
|
+
var tmpTextarea = document.createElement("textarea");
|
|
36
|
+
var codes = document.querySelectorAll("#${this.olRecoveryCodesListId} li");
|
|
37
|
+
for (i = 0; i < codes.length; i++) {
|
|
38
|
+
tmpTextarea.value = tmpTextarea.value + codes[i].innerText + "\\n";
|
|
39
|
+
}
|
|
40
|
+
document.body.appendChild(tmpTextarea);
|
|
41
|
+
tmpTextarea.select();
|
|
42
|
+
document.execCommand("copy");
|
|
43
|
+
document.body.removeChild(tmpTextarea);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
var copyButton = document.getElementById("copyRecoveryCodes");
|
|
47
|
+
copyButton && copyButton.addEventListener("click", function () {
|
|
48
|
+
copyRecoveryCodes();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
/* download recovery codes */
|
|
52
|
+
function formatCurrentDateTime() {
|
|
53
|
+
var dt = new Date();
|
|
54
|
+
var options = {
|
|
55
|
+
month: 'long',
|
|
56
|
+
day: 'numeric',
|
|
57
|
+
year: 'numeric',
|
|
58
|
+
hour: 'numeric',
|
|
59
|
+
minute: 'numeric',
|
|
60
|
+
timeZoneName: 'short'
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
return dt.toLocaleString('en-US', options);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function parseRecoveryCodeList() {
|
|
67
|
+
var recoveryCodes = document.querySelectorAll("#${this.olRecoveryCodesListId} li");
|
|
68
|
+
var recoveryCodeList = "";
|
|
69
|
+
|
|
70
|
+
for (var i = 0; i < recoveryCodes.length; i++) {
|
|
71
|
+
var recoveryCodeLiElement = recoveryCodes[i].innerText;
|
|
72
|
+
recoveryCodeList += recoveryCodeLiElement + "\\r\\n";
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return recoveryCodeList;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function buildDownloadContent() {
|
|
79
|
+
var recoveryCodeList = parseRecoveryCodeList();
|
|
80
|
+
var dt = new Date();
|
|
81
|
+
var options = {
|
|
82
|
+
month: 'long',
|
|
83
|
+
day: 'numeric',
|
|
84
|
+
year: 'numeric',
|
|
85
|
+
hour: 'numeric',
|
|
86
|
+
minute: 'numeric',
|
|
87
|
+
timeZoneName: 'short'
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
return fileBodyContent =
|
|
91
|
+
${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + "\\n\\n" +
|
|
92
|
+
recoveryCodeList + "\\n" +
|
|
93
|
+
${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + "\\n\\n" +
|
|
94
|
+
${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + " " + formatCurrentDateTime();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function setUpDownloadLinkAndDownload(filename, text) {
|
|
98
|
+
var el = document.createElement('a');
|
|
99
|
+
el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
|
|
100
|
+
el.setAttribute('download', filename);
|
|
101
|
+
el.style.display = 'none';
|
|
102
|
+
document.body.appendChild(el);
|
|
103
|
+
el.click();
|
|
104
|
+
document.body.removeChild(el);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function downloadRecoveryCodes() {
|
|
108
|
+
setUpDownloadLinkAndDownload('kc-download-recovery-codes.txt', buildDownloadContent());
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
var downloadButton = document.getElementById("downloadRecoveryCodes");
|
|
112
|
+
downloadButton && downloadButton.addEventListener("click", downloadRecoveryCodes);
|
|
113
|
+
|
|
114
|
+
/* print recovery codes */
|
|
115
|
+
function buildPrintContent() {
|
|
116
|
+
var recoveryCodeListHTML = document.getElementById('${this.olRecoveryCodesListId}').innerHTML;
|
|
117
|
+
var styles =
|
|
118
|
+
\`@page { size: auto; margin-top: 0; }
|
|
119
|
+
body { width: 480px; }
|
|
120
|
+
div { list-style-type: none; font-family: monospace }
|
|
121
|
+
p:first-of-type { margin-top: 48px }\`;
|
|
122
|
+
|
|
123
|
+
return printFileContent =
|
|
124
|
+
"<html><style>" + styles + "</style><body>" +
|
|
125
|
+
"<title>kc-download-recovery-codes</title>" +
|
|
126
|
+
"<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + "</p>" +
|
|
127
|
+
"<div>" + recoveryCodeListHTML + "</div>" +
|
|
128
|
+
"<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + "</p>" +
|
|
129
|
+
"<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + " " + formatCurrentDateTime() + "</p>" +
|
|
130
|
+
"</body></html>";
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function printRecoveryCodes() {
|
|
134
|
+
var w = window.open();
|
|
135
|
+
w.document.write(buildPrintContent());
|
|
136
|
+
w.print();
|
|
137
|
+
w.close();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
var printButton = document.getElementById("printRecoveryCodes");
|
|
141
|
+
printButton && printButton.addEventListener("click", printRecoveryCodes);
|
|
142
|
+
`
|
|
143
|
+
}
|
|
144
|
+
]);
|
|
26
145
|
}
|
|
27
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginRecoveryAuthnCodeConfigComponent, deps:
|
|
146
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LoginRecoveryAuthnCodeConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
28
147
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LoginRecoveryAuthnCodeConfigComponent, isStandalone: true, selector: "kc-login-recovery-authn-code-config", providers: [
|
|
29
148
|
{
|
|
30
149
|
provide: ComponentReference,
|
|
@@ -40,7 +159,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
|
|
|
40
159
|
useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent)
|
|
41
160
|
}
|
|
42
161
|
], 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" }]
|
|
43
|
-
}] });
|
|
162
|
+
}], ctorParameters: () => [] });
|
|
44
163
|
|
|
45
164
|
/**
|
|
46
165
|
* Generated bundle index. Do not edit.
|
|
@@ -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 { 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\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","@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":";;;;;;;;;;AAyBM,MAAO,qCAAsC,SAAQ,kBAAkB,CAAA;AAb7E,IAAA,WAAA,GAAA;;AAcI,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAyE,gBAAgB,CAAC,CAAC;AAC7G,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAO,UAAU,CAAC,CAAC;AAEvB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAU,eAAe,CAAC,CAAC;AACnD,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAoC,aAAa,CAAC,CAAC;QAK5E,IAAqB,CAAA,qBAAA,GAAG,KAAK,CAAC;QAC9B,IAAW,CAAA,WAAA,GAAG,IAAI,CAAC;QACnB,IAAc,CAAA,cAAA,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AAEzE,QAAA,IAAA,CAAA,UAAU,GAAG,SAAS,CAA2B,YAAY,CAAC,CAAC;AAC/D,QAAA,IAAA,CAAA,QAAQ,GAAG,SAAS,CAA2B,UAAU,CAAC,CAAC;AAC3D,QAAA,IAAA,CAAA,mBAAmB,GAAG,SAAS,CAA2B,qBAAqB,CAAC,CAAC;AAEjF,QAAA,IAAA,CAAA,+BAA+B,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAEhD,IAAqB,CAAA,qBAAA,GAAG,wBAAwB,CAAC;AACpD,KAAA;8GArBY,qCAAqC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAArC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qCAAqC,EAPnC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,SAAA,EAAA;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,kBAAkB;AAC3B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,qCAAqC,CAAC;AACvE,aAAA;AACJ,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBL,65IAkJA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpIc,gBAAgB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,EAAA,QAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA,EAAA;;2FAW/C,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBAbjD,SAAS;AACM,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,gBAAgB,EAAE,4BAA4B,CAAC,EAC/C,QAAA,EAAA,qCAAqC,EAE9B,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACpC,SAAA,EAAA;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,kBAAkB;AAC3B,4BAAA,WAAW,EAAE,UAAU,CAAC,2CAA2C,CAAC;AACvE,yBAAA;AACJ,qBAAA,EAAA,QAAA,EAAA,65IAAA,EAAA,CAAA;;;AEvBL;;AAEG;;;;"}
|
|
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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"}
|
|
@@ -40,7 +40,7 @@ class RegisterComponent extends ComponentReference {
|
|
|
40
40
|
provide: ComponentReference,
|
|
41
41
|
useExisting: forwardRef(() => RegisterComponent)
|
|
42
42
|
}
|
|
43
|
-
], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a
|
|
43
|
+
], viewQueries: [{ propertyName: "headerNode", first: true, predicate: ["headerNode"], descendants: true, isSignal: true }, { propertyName: "infoNode", first: true, predicate: ["infoNode"], descendants: true, isSignal: true }, { propertyName: "socialProvidersNode", first: true, predicate: ["socialProvidersNode"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a\n [href]=\"url.loginUrl\"\n [innerHTML]=\"i18n.msgStr('backToLogin') | kcSanitize: 'html'\"\n ></a>\n </span>\n </div>\n </div>\n @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <button\n class=\"g-recaptcha\"\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-callback]=\"onCallback\"\n [attr.data-action]=\"recaptchaAction\"\n >\n {{ i18n.msgStr('doRegister') }}\n </button>\n </div>\n } @else {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable() || (termsAcceptanceRequired && !areTermsAccepted())\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doRegister')\"\n />\n </div>\n }\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: KcClassDirective, selector: "[kcClass]", inputs: ["class", "ngClass", "kcClass"] }, { kind: "pipe", type: KcSanitizePipe, name: "kcSanitize" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
44
44
|
}
|
|
45
45
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: RegisterComponent, decorators: [{
|
|
46
46
|
type: Component,
|
|
@@ -49,7 +49,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
|
|
|
49
49
|
provide: ComponentReference,
|
|
50
50
|
useExisting: forwardRef(() => RegisterComponent)
|
|
51
51
|
}
|
|
52
|
-
], template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a
|
|
52
|
+
], template: "@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a\n [href]=\"url.loginUrl\"\n [innerHTML]=\"i18n.msgStr('backToLogin') | kcSanitize: 'html'\"\n ></a>\n </span>\n </div>\n </div>\n @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <button\n class=\"g-recaptcha\"\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-callback]=\"onCallback\"\n [attr.data-action]=\"recaptchaAction\"\n >\n {{ i18n.msgStr('doRegister') }}\n </button>\n </div>\n } @else {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable() || (termsAcceptanceRequired && !areTermsAccepted())\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doRegister')\"\n />\n </div>\n }\n </div>\n</form>\n" }]
|
|
53
53
|
}] });
|
|
54
54
|
|
|
55
55
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keycloakify-angular-login-pages-register.mjs","sources":["../../src/login/pages/register/register.component.ts","../../src/login/pages/register/register.component.html","../../src/login/pages/register/keycloakify-angular-login-pages-register.ts"],"sourcesContent":["import { AsyncPipe, NgClass, NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal, type TemplateRef, Type, viewChild } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields';\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 { UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form';\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';\nimport { map } from 'rxjs';\n\n@Component({\n selector: 'kc-register',\n templateUrl: 'register.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass, NgComponentOutlet],\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => RegisterComponent)\n }\n ]\n})\nexport class RegisterComponent extends ComponentReference {\n #userProfileFormService = inject(UserProfileFormService);\n kcContext = inject<Extract<KcContext, { pageId: 'register.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\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 = false;\n displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n isFormSubmittable = toSignal(this.#userProfileFormService.formState$.pipe(map(s => s.isFormSubmittable)), { initialValue: false });\n areTermsAccepted = signal(false);\n userProfileFormFields = input<Type<UserProfileFormFieldsComponent>>();\n\n onCallback() {\n (document.getElementById('kc-register-form') as HTMLFormElement).submit();\n }\n}\n","@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a [href]=\"url.loginUrl\">{{ i18n.msgStr('backToLogin') }}</a>\n </span>\n </div>\n </div>\n @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <button\n class=\"g-recaptcha\"\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-callback]=\"onCallback\"\n [attr.data-action]=\"recaptchaAction\"\n >\n {{ i18n.msgStr('doRegister') }}\n </button>\n </div>\n } @else {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable() || (termsAcceptanceRequired && !areTermsAccepted())\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doRegister')\"\n />\n </div>\n }\n </div>\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-register.mjs","sources":["../../src/login/pages/register/register.component.ts","../../src/login/pages/register/register.component.html","../../src/login/pages/register/keycloakify-angular-login-pages-register.ts"],"sourcesContent":["import { AsyncPipe, NgClass, NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal, type TemplateRef, Type, viewChild } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize';\nimport { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css';\nimport { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';\nimport { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields';\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 { UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form';\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';\nimport { map } from 'rxjs';\n\n@Component({\n selector: 'kc-register',\n templateUrl: 'register.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass, NgComponentOutlet],\n providers: [\n {\n provide: ComponentReference,\n useExisting: forwardRef(() => RegisterComponent)\n }\n ]\n})\nexport class RegisterComponent extends ComponentReference {\n #userProfileFormService = inject(UserProfileFormService);\n kcContext = inject<Extract<KcContext, { pageId: 'register.ftl' }>>(KC_LOGIN_CONTEXT);\n i18n = inject<I18n>(LOGIN_I18N);\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 = false;\n displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global');\n\n headerNode = viewChild<TemplateRef<HTMLElement>>('headerNode');\n infoNode = viewChild<TemplateRef<HTMLElement>>('infoNode');\n socialProvidersNode = viewChild<TemplateRef<HTMLElement>>('socialProvidersNode');\n\n isFormSubmittable = toSignal(this.#userProfileFormService.formState$.pipe(map(s => s.isFormSubmittable)), { initialValue: false });\n areTermsAccepted = signal(false);\n userProfileFormFields = input<Type<UserProfileFormFieldsComponent>>();\n\n onCallback() {\n (document.getElementById('kc-register-form') as HTMLFormElement).submit();\n }\n}\n","@let url = kcContext.url;\n@let messagesPerField = kcContext.messagesPerField;\n@let recaptchaRequired = kcContext.recaptchaRequired;\n@let recaptchaVisible = kcContext.recaptchaVisible;\n@let recaptchaSiteKey = kcContext.recaptchaSiteKey;\n@let recaptchaAction = kcContext.recaptchaAction;\n@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired;\n\n<ng-template #headerNode>\n @let messageHeader = kcContext.messageHeader;\n {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}\n</ng-template>\n<form\n id=\"kc-register-form\"\n method=\"post\"\n [kcClass]=\"'kcFormClass'\"\n [action]=\"url.registrationAction\"\n>\n <ng-container [ngComponentOutlet]=\"userProfileFormFields() ?? null\" />\n @if (termsAcceptanceRequired) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n {{ i18n.msgStr('termsTitle') }}\n <div id=\"kc-registration-terms-text\">\n {{ i18n.msgStr('termsText') }}\n </div>\n </div>\n </div>\n <div class=\"form-group\">\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <input\n type=\"checkbox\"\n id=\"termsAccepted\"\n name=\"termsAccepted\"\n [kcClass]=\"'kcCheckboxInputClass'\"\n [checked]=\"areTermsAccepted()\"\n [attr.aria-invalid]=\"messagesPerField.existsError('termsAccepted')\"\n (change)=\"areTermsAccepted.set($any($event.target).checked)\"\n />\n <label\n for=\"termsAccepted\"\n [kcClass]=\"'kcLabelClass'\"\n >\n {{ i18n.msgStr('acceptTerms') }}\n </label>\n </div>\n @if (messagesPerField.existsError('termsAccepted')) {\n <div [kcClass]=\"'kcLabelWrapperClass'\">\n <span\n id=\"input-error-terms-accepted\"\n aria-live=\"polite\"\n [kcClass]=\"'kcInputErrorMessageClass'\"\n [innerHtml]=\"messagesPerField.get('termsAccepted') | kcSanitize: 'html'\"\n ></span>\n </div>\n }\n </div>\n }\n @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) {\n <div class=\"form-group\">\n <div [kcClass]=\"'kcInputWrapperClass'\">\n <div\n class=\"g-recaptcha\"\n data-size=\"compact\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-action]=\"recaptchaAction\"\n ></div>\n </div>\n </div>\n }\n\n <div [kcClass]=\"'kcFormGroupClass'\">\n <div\n id=\"kc-form-options\"\n [kcClass]=\"'kcFormOptionsClass'\"\n >\n <div [kcClass]=\"'kcFormOptionsWrapperClass'\">\n <span>\n <a\n [href]=\"url.loginUrl\"\n [innerHTML]=\"i18n.msgStr('backToLogin') | kcSanitize: 'html'\"\n ></a>\n </span>\n </div>\n </div>\n @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <button\n class=\"g-recaptcha\"\n type=\"submit\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [attr.data-sitekey]=\"recaptchaSiteKey\"\n [attr.data-callback]=\"onCallback\"\n [attr.data-action]=\"recaptchaAction\"\n >\n {{ i18n.msgStr('doRegister') }}\n </button>\n </div>\n } @else {\n <div\n id=\"kc-form-buttons\"\n [kcClass]=\"'kcFormButtonsClass'\"\n >\n <input\n type=\"submit\"\n [disabled]=\"!isFormSubmittable() || (termsAcceptanceRequired && !areTermsAccepted())\"\n [kcClass]=\"['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']\"\n [value]=\"i18n.msgStr('doRegister')\"\n />\n </div>\n }\n </div>\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.d.ts
CHANGED
|
@@ -2,11 +2,13 @@ import { 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
|
+
import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';
|
|
5
6
|
import type { ClassKey } from 'keycloakify/login/lib/kcClsx';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export declare class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
|
|
8
9
|
kcContext: KcContext.LoginRecoveryAuthnCodeConfig;
|
|
9
10
|
i18n: I18n;
|
|
11
|
+
loginResourceInjectorService: LoginResourceInjectorService;
|
|
10
12
|
doUseDefaultCss: boolean;
|
|
11
13
|
classes: Partial<Record<ClassKey, string>>;
|
|
12
14
|
documentTitle: string | undefined;
|
|
@@ -19,6 +21,7 @@ export declare class LoginRecoveryAuthnCodeConfigComponent extends ComponentRefe
|
|
|
19
21
|
socialProvidersNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
|
|
20
22
|
toggleRecoveryCodesConfirmation: import("@angular/core").WritableSignal<boolean>;
|
|
21
23
|
olRecoveryCodesListId: string;
|
|
24
|
+
constructor();
|
|
22
25
|
static ɵfac: i0.ɵɵFactoryDeclaration<LoginRecoveryAuthnCodeConfigComponent, never>;
|
|
23
26
|
static ɵcmp: i0.ɵɵComponentDeclaration<LoginRecoveryAuthnCodeConfigComponent, "kc-login-recovery-authn-code-config", never, {}, {}, never, never, true, never>;
|
|
24
27
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keycloakify/angular",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"keycloakify": "^11.3.9",
|
|
6
6
|
"@angular/core": "^18.0.0",
|
|
@@ -309,12 +309,6 @@
|
|
|
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
|
-
},
|
|
318
312
|
"./login/pages/code": {
|
|
319
313
|
"types": "./login/pages/code/index.d.ts",
|
|
320
314
|
"esm2022": "./esm2022/login/pages/code/keycloakify-angular-login-pages-code.mjs",
|
|
@@ -531,6 +525,12 @@
|
|
|
531
525
|
"esm": "./esm2022/login/pages/webauthn-register/keycloakify-angular-login-pages-webauthn-register.mjs",
|
|
532
526
|
"default": "./fesm2022/keycloakify-angular-login-pages-webauthn-register.mjs"
|
|
533
527
|
},
|
|
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",
|
|
@@ -5,6 +5,7 @@ import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/compone
|
|
|
5
5
|
import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class';
|
|
6
6
|
import type { I18n } from '@keycloakify/angular/login/i18n';
|
|
7
7
|
import type { KcContext } from '@keycloakify/angular/login/KcContext';
|
|
8
|
+
import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';
|
|
8
9
|
import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes';
|
|
9
10
|
import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';
|
|
10
11
|
import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';
|
|
@@ -26,6 +27,7 @@ import type { ClassKey } from 'keycloakify/login/lib/kcClsx';
|
|
|
26
27
|
export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
|
|
27
28
|
kcContext = inject<Extract<KcContext, { pageId: 'login-recovery-authn-code-config.ftl' }>>(KC_LOGIN_CONTEXT);
|
|
28
29
|
i18n = inject<I18n>(LOGIN_I18N);
|
|
30
|
+
loginResourceInjectorService = inject(LoginResourceInjectorService);
|
|
29
31
|
|
|
30
32
|
override doUseDefaultCss = inject<boolean>(USE_DEFAULT_CSS);
|
|
31
33
|
override classes = inject<Partial<Record<ClassKey, string>>>(LOGIN_CLASSES);
|
|
@@ -44,4 +46,125 @@ export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference {
|
|
|
44
46
|
toggleRecoveryCodesConfirmation = signal(false);
|
|
45
47
|
|
|
46
48
|
olRecoveryCodesListId = 'kc-recovery-codes-list';
|
|
49
|
+
|
|
50
|
+
constructor() {
|
|
51
|
+
super();
|
|
52
|
+
this.loginResourceInjectorService.insertAdditionalScripts([
|
|
53
|
+
{
|
|
54
|
+
type: 'text/javascript',
|
|
55
|
+
id: `${this.olRecoveryCodesListId}-script`,
|
|
56
|
+
textContent: `
|
|
57
|
+
/* copy recovery codes */
|
|
58
|
+
function copyRecoveryCodes() {
|
|
59
|
+
var tmpTextarea = document.createElement("textarea");
|
|
60
|
+
var codes = document.querySelectorAll("#${this.olRecoveryCodesListId} li");
|
|
61
|
+
for (i = 0; i < codes.length; i++) {
|
|
62
|
+
tmpTextarea.value = tmpTextarea.value + codes[i].innerText + "\\n";
|
|
63
|
+
}
|
|
64
|
+
document.body.appendChild(tmpTextarea);
|
|
65
|
+
tmpTextarea.select();
|
|
66
|
+
document.execCommand("copy");
|
|
67
|
+
document.body.removeChild(tmpTextarea);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
var copyButton = document.getElementById("copyRecoveryCodes");
|
|
71
|
+
copyButton && copyButton.addEventListener("click", function () {
|
|
72
|
+
copyRecoveryCodes();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
/* download recovery codes */
|
|
76
|
+
function formatCurrentDateTime() {
|
|
77
|
+
var dt = new Date();
|
|
78
|
+
var options = {
|
|
79
|
+
month: 'long',
|
|
80
|
+
day: 'numeric',
|
|
81
|
+
year: 'numeric',
|
|
82
|
+
hour: 'numeric',
|
|
83
|
+
minute: 'numeric',
|
|
84
|
+
timeZoneName: 'short'
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return dt.toLocaleString('en-US', options);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function parseRecoveryCodeList() {
|
|
91
|
+
var recoveryCodes = document.querySelectorAll("#${this.olRecoveryCodesListId} li");
|
|
92
|
+
var recoveryCodeList = "";
|
|
93
|
+
|
|
94
|
+
for (var i = 0; i < recoveryCodes.length; i++) {
|
|
95
|
+
var recoveryCodeLiElement = recoveryCodes[i].innerText;
|
|
96
|
+
recoveryCodeList += recoveryCodeLiElement + "\\r\\n";
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return recoveryCodeList;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function buildDownloadContent() {
|
|
103
|
+
var recoveryCodeList = parseRecoveryCodeList();
|
|
104
|
+
var dt = new Date();
|
|
105
|
+
var options = {
|
|
106
|
+
month: 'long',
|
|
107
|
+
day: 'numeric',
|
|
108
|
+
year: 'numeric',
|
|
109
|
+
hour: 'numeric',
|
|
110
|
+
minute: 'numeric',
|
|
111
|
+
timeZoneName: 'short'
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
return fileBodyContent =
|
|
115
|
+
${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + "\\n\\n" +
|
|
116
|
+
recoveryCodeList + "\\n" +
|
|
117
|
+
${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + "\\n\\n" +
|
|
118
|
+
${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + " " + formatCurrentDateTime();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function setUpDownloadLinkAndDownload(filename, text) {
|
|
122
|
+
var el = document.createElement('a');
|
|
123
|
+
el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
|
|
124
|
+
el.setAttribute('download', filename);
|
|
125
|
+
el.style.display = 'none';
|
|
126
|
+
document.body.appendChild(el);
|
|
127
|
+
el.click();
|
|
128
|
+
document.body.removeChild(el);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function downloadRecoveryCodes() {
|
|
132
|
+
setUpDownloadLinkAndDownload('kc-download-recovery-codes.txt', buildDownloadContent());
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
var downloadButton = document.getElementById("downloadRecoveryCodes");
|
|
136
|
+
downloadButton && downloadButton.addEventListener("click", downloadRecoveryCodes);
|
|
137
|
+
|
|
138
|
+
/* print recovery codes */
|
|
139
|
+
function buildPrintContent() {
|
|
140
|
+
var recoveryCodeListHTML = document.getElementById('${this.olRecoveryCodesListId}').innerHTML;
|
|
141
|
+
var styles =
|
|
142
|
+
\`@page { size: auto; margin-top: 0; }
|
|
143
|
+
body { width: 480px; }
|
|
144
|
+
div { list-style-type: none; font-family: monospace }
|
|
145
|
+
p:first-of-type { margin-top: 48px }\`;
|
|
146
|
+
|
|
147
|
+
return printFileContent =
|
|
148
|
+
"<html><style>" + styles + "</style><body>" +
|
|
149
|
+
"<title>kc-download-recovery-codes</title>" +
|
|
150
|
+
"<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-header'))} + "</p>" +
|
|
151
|
+
"<div>" + recoveryCodeListHTML + "</div>" +
|
|
152
|
+
"<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-description'))} + "</p>" +
|
|
153
|
+
"<p>" + ${JSON.stringify(this.i18n.msgStr('recovery-codes-download-file-date'))} + " " + formatCurrentDateTime() + "</p>" +
|
|
154
|
+
"</body></html>";
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function printRecoveryCodes() {
|
|
158
|
+
var w = window.open();
|
|
159
|
+
w.document.write(buildPrintContent());
|
|
160
|
+
w.print();
|
|
161
|
+
w.close();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
var printButton = document.getElementById("printRecoveryCodes");
|
|
165
|
+
printButton && printButton.addEventListener("click", printRecoveryCodes);
|
|
166
|
+
`
|
|
167
|
+
}
|
|
168
|
+
]);
|
|
169
|
+
}
|
|
47
170
|
}
|
|
@@ -76,7 +76,10 @@
|
|
|
76
76
|
>
|
|
77
77
|
<div [kcClass]="'kcFormOptionsWrapperClass'">
|
|
78
78
|
<span>
|
|
79
|
-
<a
|
|
79
|
+
<a
|
|
80
|
+
[href]="url.loginUrl"
|
|
81
|
+
[innerHTML]="i18n.msgStr('backToLogin') | kcSanitize: 'html'"
|
|
82
|
+
></a>
|
|
80
83
|
</span>
|
|
81
84
|
</div>
|
|
82
85
|
</div>
|