@atlasauth/angular 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/esm2022/lib/appearance.mjs +1 -1
- package/dist/esm2022/lib/atlas.service.mjs +39 -2
- package/dist/esm2022/lib/atlas.ui.mjs +3 -1
- package/dist/esm2022/lib/components/attempt-flow.component.mjs +384 -8
- package/dist/esm2022/lib/components/flow-controller.mjs +115 -2
- package/dist/esm2022/lib/components/impersonation-banner.component.mjs +75 -0
- package/dist/esm2022/lib/components/organization-audit-log.component.mjs +115 -0
- package/dist/esm2022/lib/components/organization-audit-log.mjs +40 -0
- package/dist/esm2022/lib/components/organization-profile.component.mjs +602 -27
- package/dist/esm2022/lib/components/recovery-codes.component.mjs +122 -0
- package/dist/esm2022/lib/components/sign-in.component.mjs +45 -4
- package/dist/esm2022/lib/components/sign-up-form.component.mjs +69 -6
- package/dist/esm2022/lib/components/sign-up.component.mjs +81 -7
- package/dist/esm2022/lib/i18n.mjs +58 -1
- package/dist/esm2022/lib/provide-atlas.mjs +3 -2
- package/dist/esm2022/lib/types.mjs +1 -1
- package/dist/esm2022/lib/version.mjs +2 -2
- package/dist/esm2022/public-api.mjs +4 -1
- package/dist/fesm2022/atlasauth-angular.mjs +1711 -46
- package/dist/fesm2022/atlasauth-angular.mjs.map +1 -1
- package/dist/lib/appearance.d.ts +1 -1
- package/dist/lib/atlas.service.d.ts +22 -1
- package/dist/lib/atlas.ui.d.ts +2 -1
- package/dist/lib/components/attempt-flow.component.d.ts +57 -2
- package/dist/lib/components/flow-controller.d.ts +64 -1
- package/dist/lib/components/impersonation-banner.component.d.ts +27 -0
- package/dist/lib/components/organization-audit-log.component.d.ts +34 -0
- package/dist/lib/components/organization-audit-log.d.ts +25 -0
- package/dist/lib/components/organization-profile.component.d.ts +55 -6
- package/dist/lib/components/recovery-codes.component.d.ts +26 -0
- package/dist/lib/components/sign-in.component.d.ts +2 -0
- package/dist/lib/components/sign-up-form.component.d.ts +11 -1
- package/dist/lib/components/sign-up.component.d.ts +13 -0
- package/dist/lib/provide-atlas.d.ts +2 -1
- package/dist/lib/types.d.ts +6 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/public-api.d.ts +4 -0
- package/package.json +3 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { signal } from '@angular/core';
|
|
2
|
-
import { advanceWithCaptcha, atlasCaptchaLabels, createCaptchaController, createSignUp, fetchInstanceSettings, flowNeedsCaptcha, signInCaptchaOptions, flowFromPending, initialFlow, nextStep, offeredFirstFactors, pollAttempt, prepareFactor, planFirstFactor, shouldKeepPolling, } from '@atlasauth/js';
|
|
2
|
+
import { advanceWithCaptcha, atlasCaptchaLabels, createCaptchaController, createPasskeySignUp, createSignUp, finishPasskeySignUp, fetchInstanceSettings, fetchLastSignInMethod, createMfaEnrollment, acknowledgeRecoveryCodes, pendingRecoveryCodes, mfaChoicesFrom, prepareSecondFactorCode, resendSignUpVerification, flowNeedsCaptcha, signInCaptchaOptions, flowFromPending, initialFlow, nextStep, offeredFirstFactors, pollAttempt, prepareFactor, planFirstFactor, shouldKeepPolling, } from '@atlasauth/js';
|
|
3
3
|
import { EN_US, translate } from '../i18n';
|
|
4
4
|
/**
|
|
5
5
|
* The server-driven sign-in / sign-up engine, shared by `<atlas-sign-in>` and
|
|
@@ -26,6 +26,11 @@ export class AtlasFlowController {
|
|
|
26
26
|
* resolves, or when the server could not be reached.
|
|
27
27
|
*/
|
|
28
28
|
settings = signal(null);
|
|
29
|
+
/**
|
|
30
|
+
* The method this browser last signed in with (`password`, `oauth_github`, …)
|
|
31
|
+
* for the "Last used" hint; null when none, or the instance turned it off.
|
|
32
|
+
*/
|
|
33
|
+
lastMethod = signal(null);
|
|
29
34
|
/** The sign-in captcha (identifier step / `needs_captcha` challenge). */
|
|
30
35
|
captcha = createCaptchaController(undefined, {
|
|
31
36
|
// The Atlas captcha's words follow the form's catalog (read when drawn).
|
|
@@ -45,6 +50,21 @@ export class AtlasFlowController {
|
|
|
45
50
|
* otherwise.
|
|
46
51
|
*/
|
|
47
52
|
preparedFactor = signal(null);
|
|
53
|
+
/**
|
|
54
|
+
* "Email me a code instead" at the second factor ({@link sendEmailSecondFactor}):
|
|
55
|
+
* in flight, where the code went, or why it was not sent. Null until asked,
|
|
56
|
+
* and again once the flow leaves that step.
|
|
57
|
+
*/
|
|
58
|
+
emailSecondFactor = signal(null);
|
|
59
|
+
/** "Text me a code instead" at the second factor ({@link sendSmsSecondFactor}): as {@link emailSecondFactor}. */
|
|
60
|
+
smsSecondFactor = signal(null);
|
|
61
|
+
/**
|
|
62
|
+
* The MFA enrolment step (`needs_mfa_enrollment`): the authenticator app's
|
|
63
|
+
* setup (QR code, setup key) or a texted code. Started and reset with the flow.
|
|
64
|
+
*/
|
|
65
|
+
enrollment;
|
|
66
|
+
/** {@link enrollment}'s state, for templates. */
|
|
67
|
+
enrollmentState;
|
|
48
68
|
pollTimer = null;
|
|
49
69
|
identifier = '';
|
|
50
70
|
constructor(client, reload, pending,
|
|
@@ -56,7 +76,23 @@ export class AtlasFlowController {
|
|
|
56
76
|
// Seeded from a redirect that came back mid-flow (e.g. OAuth needing a second
|
|
57
77
|
// factor) so the user resumes at the demanded step instead of starting over.
|
|
58
78
|
this.state = signal(pending ? flowFromPending(pending) : initialFlow);
|
|
79
|
+
this.enrollment = createMfaEnrollment(this.client, () => this.mfaChoices());
|
|
80
|
+
this.enrollmentState = signal(this.enrollment.state);
|
|
81
|
+
this.enrollment.subscribe((next) => this.enrollmentState.set(next));
|
|
59
82
|
this.syncCaptcha();
|
|
83
|
+
this.syncEnrollment();
|
|
84
|
+
}
|
|
85
|
+
/** What the app lets the MFA steps offer (from {@link settings}). */
|
|
86
|
+
mfaChoices() {
|
|
87
|
+
return mfaChoicesFrom(this.settings()?.account);
|
|
88
|
+
}
|
|
89
|
+
/** Start the enrolment step for its attempt, or reset it once the flow leaves. */
|
|
90
|
+
syncEnrollment() {
|
|
91
|
+
const attempt = this.state().attempt;
|
|
92
|
+
if (attempt?.status === 'needs_mfa_enrollment' && attempt.id)
|
|
93
|
+
this.enrollment.start(attempt.id);
|
|
94
|
+
else
|
|
95
|
+
this.enrollment.reset();
|
|
60
96
|
}
|
|
61
97
|
/** Fetch the instance's public settings and draw whatever captcha they require. */
|
|
62
98
|
async loadSettings() {
|
|
@@ -64,6 +100,8 @@ export class AtlasFlowController {
|
|
|
64
100
|
if (loaded) {
|
|
65
101
|
this.settings.set(loaded);
|
|
66
102
|
this.syncCaptcha();
|
|
103
|
+
if (loaded.account.lastSignInMethod)
|
|
104
|
+
this.lastMethod.set(await fetchLastSignInMethod(this.client));
|
|
67
105
|
}
|
|
68
106
|
}
|
|
69
107
|
/**
|
|
@@ -118,11 +156,18 @@ export class AtlasFlowController {
|
|
|
118
156
|
this.signUpCaptchaDrawn.set(this.signUpCaptcha.needed);
|
|
119
157
|
}
|
|
120
158
|
setState(next) {
|
|
159
|
+
const previousId = this.state().attempt?.id ?? null;
|
|
121
160
|
this.state.set(next);
|
|
122
161
|
// A prepared factor belongs to the first-factor step it was sent for.
|
|
123
162
|
if (next.attempt?.status !== 'needs_first_factor')
|
|
124
163
|
this.preparedFactor.set(null);
|
|
164
|
+
// An emailed second-factor code belongs to the second-factor step of this attempt.
|
|
165
|
+
if (next.attempt?.status !== 'needs_second_factor' || (next.attempt?.id ?? null) !== previousId) {
|
|
166
|
+
this.emailSecondFactor.set(null);
|
|
167
|
+
this.smsSecondFactor.set(null);
|
|
168
|
+
}
|
|
125
169
|
this.syncCaptcha();
|
|
170
|
+
this.syncEnrollment();
|
|
126
171
|
this.autoSend();
|
|
127
172
|
}
|
|
128
173
|
autoSentFor = null;
|
|
@@ -171,7 +216,72 @@ export class AtlasFlowController {
|
|
|
171
216
|
});
|
|
172
217
|
await this.finish(next);
|
|
173
218
|
}
|
|
219
|
+
/**
|
|
220
|
+
* "Email me a code instead" at the second factor (the instance's
|
|
221
|
+
* `account.emailSecondFactor`): mails a code to the account's verified email;
|
|
222
|
+
* it is then posted with {@link submit} like any 2FA code.
|
|
223
|
+
*/
|
|
224
|
+
async sendEmailSecondFactor() {
|
|
225
|
+
await this.sendSecondFactorCode('email_code', this.emailSecondFactor);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* "Text me a code instead" at the second factor (where the app offers texted
|
|
229
|
+
* codes, {@link mfaChoices}`().sms`): texts a code to the account's enrolled
|
|
230
|
+
* phone; it is then posted with {@link submit} like any 2FA code.
|
|
231
|
+
*/
|
|
232
|
+
async sendSmsSecondFactor() {
|
|
233
|
+
await this.sendSecondFactorCode('sms', this.smsSecondFactor);
|
|
234
|
+
}
|
|
235
|
+
async sendSecondFactorCode(strategy, out) {
|
|
236
|
+
const id = this.state().attempt?.id;
|
|
237
|
+
if (!id)
|
|
238
|
+
return;
|
|
239
|
+
out.set({ busy: true });
|
|
240
|
+
try {
|
|
241
|
+
const { sentTo } = await prepareSecondFactorCode(this.client, id, strategy);
|
|
242
|
+
out.set({ sentTo });
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
out.set({ error: error instanceof Error ? error.message : this.t('error.generic') });
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/** Resend a sign-up's emailed code / link (the earlier one stops working). */
|
|
249
|
+
async resendSignUp() {
|
|
250
|
+
this.state.update((current) => ({ ...current, busy: true, errors: [] }));
|
|
251
|
+
this.state.set(await resendSignUpVerification(this.client, this.state()));
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Start a passkey-only sign-up (`POST /v1/client/sign_ups/passkey`) from the
|
|
255
|
+
* create-account form's values — no password. Offered when the instance's
|
|
256
|
+
* `account.passkeySignUp` is set.
|
|
257
|
+
*/
|
|
258
|
+
async createWithPasskey(values, consent = true) {
|
|
259
|
+
this.state.update((current) => ({ ...current, busy: true, errors: [] }));
|
|
260
|
+
await this.finish(await createPasskeySignUp(this.client, values, { consent, captcha: this.signUpCaptcha, t: this.t }));
|
|
261
|
+
}
|
|
262
|
+
/** The passkey-only sign-up's last step: create the passkey, and with it the account. */
|
|
263
|
+
async createPasskey() {
|
|
264
|
+
this.state.update((current) => ({ ...current, busy: true, errors: [] }));
|
|
265
|
+
await this.finish(await finishPasskeySignUp(this.client, this.state(), { t: this.t }));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* The recovery codes an MFA enrolment just completed the sign-in with, shown
|
|
269
|
+
* once before it finishes ({@link saveRecoveryCodes}); null otherwise. They
|
|
270
|
+
* live only in this controller's memory.
|
|
271
|
+
*/
|
|
272
|
+
recoveryCodes() {
|
|
273
|
+
return pendingRecoveryCodes(this.state());
|
|
274
|
+
}
|
|
275
|
+
/** "I've saved my codes": forget the recovery codes and finish the sign-in. */
|
|
276
|
+
async saveRecoveryCodes() {
|
|
277
|
+
await this.finish(acknowledgeRecoveryCodes(this.state()));
|
|
278
|
+
}
|
|
174
279
|
async finish(next) {
|
|
280
|
+
// An enrolment's recovery codes are shown first; `saveRecoveryCodes` finishes.
|
|
281
|
+
if (pendingRecoveryCodes(next)) {
|
|
282
|
+
this.setState({ ...next, busy: false });
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
175
285
|
if (next.attempt?.status === 'complete') {
|
|
176
286
|
// Stays busy until this browser actually holds the session: the completion
|
|
177
287
|
// alone says nothing about whether the cookie was kept.
|
|
@@ -209,6 +319,9 @@ export class AtlasFlowController {
|
|
|
209
319
|
void (async () => {
|
|
210
320
|
const { state: next, ticket } = await pollAttempt(this.client, this.state());
|
|
211
321
|
this.setState(next);
|
|
322
|
+
// e.g. a passkey sign-up whose email was just proven: only this tab can go on.
|
|
323
|
+
if (!ticket && !shouldKeepPolling(next))
|
|
324
|
+
this.stopPolling();
|
|
212
325
|
if (!ticket || !next.attempt)
|
|
213
326
|
return;
|
|
214
327
|
// The ticket is exchanged by a normal request, so no session token ever
|
|
@@ -236,4 +349,4 @@ export class AtlasFlowController {
|
|
|
236
349
|
this.signUpCaptcha.destroy();
|
|
237
350
|
}
|
|
238
351
|
}
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zsb3ctY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsYUFBYSxFQUNiLGVBQWUsRUFDZixpQkFBaUIsR0FJbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0M7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUErQlg7SUFDQTtJQUdBO0lBbENWLEtBQUssQ0FBNEI7SUFDMUM7Ozs7T0FJRztJQUNNLFFBQVEsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzFELHlFQUF5RTtJQUNoRSxPQUFPLEdBQXNCLHVCQUF1QixDQUFDLFNBQVMsRUFBRTtRQUN2RSx5RUFBeUU7UUFDekUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDOUMsQ0FBQyxDQUFDO0lBQ0gscURBQXFEO0lBQzVDLGFBQWEsR0FBc0IsdUJBQXVCLENBQUMsU0FBUyxFQUFFO1FBQzdFLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQzlDLENBQUMsQ0FBQztJQUNILHdFQUF3RTtJQUMvRCxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFD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SUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUVELGdHQUFnRztJQUNoRyxPQUFPO1FBQ0wsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXcml0YWJsZVNpZ25hbCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGYXBpQ2xpZW50LFxuICBhZHZhbmNlV2l0aENhcHRjaGEsXG4gIGF0bGFzQ2FwdGNoYUxhYmVscyxcbiAgY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIsXG4gIGNyZWF0ZVNpZ25VcCxcbiAgZmV0Y2hJbnN0YW5jZVNldHRpbmdzLFxuICBmbG93TmVlZHNDYXB0Y2hhLFxuICBzaWduSW5DYXB0Y2hhT3B0aW9ucyxcbiAgZmxvd0Zyb21QZW5kaW5nLFxuICBpbml0aWFsRmxvdyxcbiAgbmV4dFN0ZXAsXG4gIG9mZmVyZWRGaXJzdEZhY3RvcnMsXG4gIHBvbGxBdHRlbXB0LFxuICBwcmVwYXJlRmFjdG9yLFxuICBwbGFuRmlyc3RGYWN0b3IsXG4gIHNob3VsZEtlZXBQb2xsaW5nLFxuICB0eXBlIENhcHRjaGFDb250cm9sbGVyLFxuICB0eXBlIEZsb3dTdGF0ZSxcbiAgdHlwZSBJbnN0YW5jZVNldHRpbmdzLFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IEVOX1VTLCB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcblxuLyoqXG4gKiBUaGUgc2VydmVyLWRyaXZlbiBzaWduLWluIC8gc2lnbi11cCBlbmdpbmUsIHNoYXJlZCBieSBgPGF0bGFzLXNpZ24taW4+YCBhbmRcbiAqIGA8YXRsYXMtc2lnbi11cD5gIOKAlCB0aGUgQW5ndWxhciBjb3VudGVycGFydCBvZiBSZWFjdCdzIGB1c2VGbG93YCBob29rLlxuICpcbiAqIEl0IG93bnMgbm8gZGVjaXNpb24gYWJvdXQgd2hhdCBjb21lcyBuZXh0OiBldmVyeSBzdGF0dXMgY29tZXMgYmFjayBmcm9tIHRoZVxuICogc2VydmVyIHZpYSBgYWR2YW5jZWAsIGFuZCB0aGlzIGNvbnRyb2xsZXIgb25seSBwb3N0cyB3aGF0ZXZlciB0aGUgY3VycmVudCBzdGVwXG4gKiBuZWVkcyBhbmQgcmUtcmVuZGVycyB0aGUgcmV0dXJuZWQgc3RhdHVzLiBTdGF0ZSBsaXZlcyBpbiBhIHNpZ25hbCBzbyB0ZW1wbGF0ZXNcbiAqIHVwZGF0ZSB3aGV0aGVyIHRoZSBhcHAgcnVucyB6b25lZCBvciB6b25lbGVzcy5cbiAqXG4gKiBgPGF0bGFzLXNpZ24tdXA+YCBzdGFydHMgdGhlIGF0dGVtcHQgd2l0aCB7QGxpbmsgY3JlYXRlfVxuICogKGBQT1NUIC92MS9jbGllbnQvc2lnbl91cHNgKTsgdGhlIGVtYWlsZWQtY29kZSBzdGVwIHRoZW4gcnVucyB0aHJvdWdoIHRoZSBzYW1lXG4gKiB7QGxpbmsgc3VibWl0fS4gQm90aCBmbG93cyBkcmF3IHRoZSBpbnN0YW5jZSdzIGNhcHRjaGEgKGZyb21cbiAqIHtAbGluayBsb2FkU2V0dGluZ3N9KSB3aGVuIGl0IGlzIHJlcXVpcmVkLlxuICovXG5leHBvcnQgY2xhc3MgQXRsYXNGbG93Q29udHJvbGxlciB7XG4gIHJlYWRvbmx5IHN0YXRlOiBXcml0YWJsZVNpZ25hbDxGbG93U3RhdGU+O1xuICAvKipcbiAgICogVGhlIGluc3RhbmNlJ3MgcHVibGljIHNpZ24taW4gLyBzaWduLXVwIHNldHRpbmdzIChjYXB0Y2hhLCBzaWduLXVwIGZpZWxkcyxcbiAgICogbGVnYWwgY29uc2VudCkgZnJvbSBgR0VUIC92MS9hcHBlYXJhbmNlYDsgbnVsbCB1bnRpbCB7QGxpbmsgbG9hZFNldHRpbmdzfVxuICAgKiByZXNvbHZlcywgb3Igd2hlbiB0aGUgc2VydmVyIGNvdWxkIG5vdCBiZSByZWFjaGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZ3MgPSBzaWduYWw8SW5zdGFuY2VTZXR0aW5ncyB8IG51bGw+KG51bGwpO1xuICAvKiogVGhlIHNpZ24taW4gY2FwdGNoYSAoaWRlbnRpZmllciBzdGVwIC8gYG5lZWRzX2NhcHRjaGFgIGNoYWxsZW5nZSkuICovXG4gIHJlYWRvbmx5IGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgLy8gVGhlIEF0bGFzIGNhcHRjaGEncyB3b3JkcyBmb2xsb3cgdGhlIGZvcm0ncyBjYXRhbG9nIChyZWFkIHdoZW4gZHJhd24pLlxuICAgIGF0bGFzTGFiZWxzOiAoKSA9PiBhdGxhc0NhcHRjaGFMYWJlbHModGhpcy50KSxcbiAgfSk7XG4gIC8qKiBUaGUgc2lnbi11cCBjYXB0Y2hhICh0aGUgY3JlYXRlLWFjY291bnQgc3RlcCkuICovXG4gIHJlYWRvbmx5IHNpZ25VcENhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgYXRsYXNMYWJlbHM6ICgpID0+IGF0bGFzQ2FwdGNoYUxhYmVscyh0aGlzLnQpLFxuICB9KTtcbiAgLyoqIFdoZXRoZXIge0BsaW5rIGNhcHRjaGF9IGN1cnJlbnRseSBkcmF3cyBhIHdpZGdldCAoZm9yIHRlbXBsYXRlcykuICovXG4gIHJlYWRvbmx5IGNhcHRjaGFEcmF3biA9IHNpZ25hbChmYWxzZSk7XG4gIC8qKiBXaGV0aGVyIHtAbGluayBzaWduVXBDYXB0Y2hhfSBjdXJyZW50bHkgZHJhd3MgYSB3aWRnZXQgKGZvciB0ZW1wbGF0ZXMpLiAqL1xuICByZWFkb25seSBzaWduVXBDYXB0Y2hhRHJhd24gPSBzaWduYWwoZmFsc2UpO1xuICAvKipcbiAgICogVGhlIGZpcnN0IGZhY3RvciB0aGUgc2VydmVyIHdhcyBhc2tlZCB0byBzZW5kICh7QGxpbmsgcHJlcGFyZX0pIG9uIHRoZVxuICAgKiBjdXJyZW50IGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXAg4oCUIHRoZSBmb3JtIHRoZW4gY29sbGVjdHMgaXRzIGNvZGUuIE51bGxcbiAgICogb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZWRGYWN0b3IgPSBzaWduYWw8J2VtYWlsX2NvZGUnIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcG9sbFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpZGVudGlmaWVyID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IEZhcGlDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWxvYWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4gICAgcGVuZGluZzogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbCxcbiAgICAvKiogUmVzb2x2ZXMgdGhlIGNhcHRjaGEgbWVzc2FnZXMnIGNhdGFsb2cga2V5cy4gRGVmYXVsdHMgdG8gZW4tVVMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB0OiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyA9IChrZXkpID0+IHRyYW5zbGF0ZShFTl9VUywga2V5KSxcbiAgKSB7XG4gICAgLy8gU2VlZGVkIGZyb20gYSByZWRpcmVjdCB0aGF0IGNhbWUgYmFjayBtaWQtZmxvdyAoZS5nLiBPQXV0aCBuZWVkaW5nIGEgc2Vjb25kXG4gICAgLy8gZmFjdG9yKSBzbyB0aGUgdXNlciByZXN1bWVzIGF0IHRoZSBkZW1hbmRlZCBzdGVwIGluc3RlYWQgb2Ygc3RhcnRpbmcgb3Zlci5cbiAgICB0aGlzLnN0YXRlID0gc2lnbmFsPEZsb3dTdGF0ZT4ocGVuZGluZyA/IGZsb3dGcm9tUGVuZGluZyhwZW5kaW5nKSA6IGluaXRpYWxGbG93KTtcbiAgICB0aGlzLnN5bmNDYXB0Y2hhKCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhlIGluc3RhbmNlJ3MgcHVibGljIHNldHRpbmdzIGFuZCBkcmF3IHdoYXRldmVyIGNhcHRjaGEgdGhleSByZXF1aXJlLiAqL1xuICBhc3luYyBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgZmV0Y2hJbnN0YW5jZVNldHRpbmdzKHRoaXMuY2xpZW50KTtcbiAgICBpZiAobG9hZGVkKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLnNldChsb2FkZWQpO1xuICAgICAgdGhpcy5zeW5jQ2FwdGNoYSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgZmFjdG9ycyB0byBvZmZlciBvbiBhIGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXA6IHRoZSBzZXJ2ZXIncyBsaXN0XG4gICAqIHdpdGhvdXQgZW1haWwgY29kZSAvIGxpbmsgd2hpbGUgdGhlIGFwcCBjYW5ub3QgZGVsaXZlciBlbWFpbFxuICAgKiAoYHNldHRpbmdzLmVtYWlsRGVsaXZlcnkuYXZhaWxhYmxlID09PSBmYWxzZWApLiBFbXB0eSBvbiBhbnkgb3RoZXIgc3RlcC5cbiAgICovXG4gIGZpcnN0RmFjdG9ycygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0O1xuICAgIGNvbnN0IHN0ZXAgPSBhdHRlbXB0ID8gbmV4dFN0ZXAoYXR0ZW1wdCkgOiBudWxsO1xuICAgIHJldHVybiBzdGVwPy5raW5kID09PSAnY29sbGVjdF9maXJzdF9mYWN0b3InXG4gICAgICA/IG9mZmVyZWRGaXJzdEZhY3RvcnMoc3RlcC5zdHJhdGVnaWVzLCB0aGlzLnNldHRpbmdzKCk/LmVtYWlsRGVsaXZlcnkpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiBlbWFpbCArIHBhc3N3b3JkIHNpZ24tdXAgY2Fubm90IGNvbXBsZXRlIGJlY2F1c2UgdGhlIGFwcCBjYW5ub3RcbiAgICogc2VuZCB0aGUgdmVyaWZpY2F0aW9uIGVtYWlsIChgc2V0dGluZ3MuZW1haWxEZWxpdmVyeS5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2VgKTpcbiAgICogYDxhdGxhcy1zaWduLXVwPmAgc2hvd3MgdGhlIFwiY2FuJ3Qgc2VuZCBlbWFpbFwiIG5vdGljZSBpbnN0ZWFkIG9mIHRoZSBmb3JtLlxuICAgKi9cbiAgc2lnblVwRW1haWxVbmF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkU2lnblVwID09PSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBGYWxzZSB3aGVuIGEgcGFzc3dvcmQgcmVzZXQgZW1haWwgY2Fubm90IGJlIGRlbGl2ZXJlZCDigJQgaGlkZSBcIkZvcmdvdCBwYXNzd29yZD9cIi4gKi9cbiAgcGFzc3dvcmRSZXNldEF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkUmVzZXQgIT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgc2VydmVyIHRvIGVtYWlsIGEgc2lnbi1pbiBjb2RlIGZvciB0aGUgY3VycmVudCBgbmVlZHNfZmlyc3RfZmFjdG9yYFxuICAgKiBzdGVwIChgUE9TVCDigKYvcHJlcGFyZV9maXJzdF9mYWN0b3JgKTsgdGhlIGZvcm0gdGhlbiBjb2xsZWN0cyB0aGUgY29kZSwgd2hpY2hcbiAgICoge0BsaW5rIHN1Ym1pdH0gcG9zdHMgYXMgdGhlIGBlbWFpbF9jb2RlYCBzdHJhdGVneS5cbiAgICovXG4gIGFzeW5jIHByZXBhcmUoc3RyYXRlZ3k6ICdlbWFpbF9jb2RlJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5maXJzdEZhY3RvcnMoKS5pbmNsdWRlcyhzdHJhdGVneSkpIHJldHVybjtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG4gICAgY29uc3QgbmV4dCA9IGF3YWl0IHByZXBhcmVGYWN0b3IodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgc3RyYXRlZ3kpO1xuICAgIHRoaXMuc2V0U3RhdGUobmV4dCk7XG4gICAgaWYgKCFuZXh0LmVycm9ycy5sZW5ndGgpIHRoaXMucHJlcGFyZWRGYWN0b3Iuc2V0KHN0cmF0ZWd5KTtcbiAgfVxuXG4gIC8qKiBLZWVwIGJvdGggY2FwdGNoYXMgaW4gc3RlcCB3aXRoIHRoZSBzZXR0aW5ncyBhbmQgdGhlIGZsb3cncyBjdXJyZW50IHN0ZXAuICovXG4gIHByaXZhdGUgc3luY0NhcHRjaGEoKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlKCk7XG4gICAgdGhpcy5jYXB0Y2hhLmNvbmZpZ3VyZShcbiAgICAgIHNpZ25JbkNhcHRjaGFPcHRpb25zKHNldHRpbmdzPy5jYXB0Y2hhRmxvd3Muc2lnbkluLCBzdGF0ZSwgKCkgPT4gdm9pZCB0aGlzLnN1Ym1pdCh7fSkpLFxuICAgICk7XG4gICAgY29uc3Qgc2lnblVwRmxvdyA9IHNldHRpbmdzPy5jYXB0Y2hhRmxvd3Muc2lnblVwO1xuICAgIHRoaXMuc2lnblVwQ2FwdGNoYS5jb25maWd1cmUoe1xuICAgICAgZmxvdzogc2lnblVwRmxvdyxcbiAgICAgIGFjdGl2ZTogIXN0YXRlLmF0dGVtcHQgJiYgZmxvd05lZWRzQ2FwdGNoYShzaWduVXBGbG93KSxcbiAgICB9KTtcbiAgICB0aGlzLmNhcHRjaGFEcmF3bi5zZXQodGhpcy5jYXB0Y2hhLm5lZWRlZCk7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhRHJhd24uc2V0KHRoaXMuc2lnblVwQ2FwdGNoYS5uZWVkZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGF0ZShuZXh0OiBGbG93U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLnNldChuZXh0KTtcbiAgICAvLyBBIHByZXBhcmVkIGZhY3RvciBiZWxvbmdzIHRvIHRoZSBmaXJzdC1mYWN0b3Igc3RlcCBpdCB3YXMgc2VudCBmb3IuXG4gICAgaWYgKG5leHQuYXR0ZW1wdD8uc3RhdHVzICE9PSAnbmVlZHNfZmlyc3RfZmFjdG9yJykgdGhpcy5wcmVwYXJlZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgdGhpcy5zeW5jQ2FwdGNoYSgpO1xuICAgIHRoaXMuYXV0b1NlbmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1NlbnRGb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogV2l0aCBubyBwYXNzd29yZCBvbiBvZmZlciwgZW1haWwgdGhlIGNvZGUgYXMgc29vbiBhcyB0aGUgc2VydmVyIGFza3MgZm9yIGFcbiAgICogZmlyc3QgZmFjdG9yIOKAlCBvbmNlIHBlciBhdHRlbXB0LCBzbyBhIGZhaWxlZCBzZW5kIHdhaXRzIGZvciB0aGUgdXNlcidzIHJldHJ5XG4gICAqICh0aGUgXCJFbWFpbCBtZSBhIGNvZGVcIiBidXR0b24pIGluc3RlYWQgb2YgbG9vcGluZy5cbiAgICovXG4gIHByaXZhdGUgYXV0b1NlbmQoKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXRlKCkuYXR0ZW1wdD8uaWQgPz8gbnVsbDtcbiAgICBpZiAoIWlkIHx8IHRoaXMuYXV0b1NlbnRGb3IgPT09IGlkIHx8IHRoaXMucHJlcGFyZWRGYWN0b3IoKSkgcmV0dXJuO1xuICAgIGlmIChwbGFuRmlyc3RGYWN0b3IodGhpcy5maXJzdEZhY3RvcnMoKSkuYXV0b1NlbmQgIT09ICdlbWFpbF9jb2RlJykgcmV0dXJuO1xuICAgIHRoaXMuYXV0b1NlbnRGb3IgPSBpZDtcbiAgICB2b2lkIHRoaXMucHJlcGFyZSgnZW1haWxfY29kZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2UgdGhlIGZsb3cgd2l0aCB0aGUgdmFsdWVzIHRoZSB1c2VyIHR5cGVkLiBPbiBjb21wbGV0aW9uLCBleGNoYW5nZSB0aGVcbiAgICogb25lLXRpbWUgdGlja2V0IGZvciBjb29raWVzIG92ZXIgYSBzYW1lLW9yaWdpbiByZXF1ZXN0IChGQVBJIGlzIGNyb3NzLW9yaWdpblxuICAgKiBhbmQgY2Fubm90IHNldCB0aGUgY29va2llIG9uIGl0cyBvd24gcmVzcG9uc2UpLCB0aGVuIHJlLWJvb3Qgc28gdGhlIHJlc3Qgb2ZcbiAgICogdGhlIGFwcCBzZWVzIGEgc2lnbmVkLWluIHVzZXIuXG4gICAqL1xuICBhc3luYyBzdWJtaXQodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpO1xuXG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgYWR2YW5jZVdpdGhDYXB0Y2hhKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCksIHZhbHVlcywge1xuICAgICAgY2FwdGNoYTogdGhpcy5jYXB0Y2hhLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgdDogdGhpcy50LFxuICAgIH0pO1xuICAgIHRoaXMuaWRlbnRpZmllciA9IG91dC5pZGVudGlmaWVyO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKG91dC5zdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGFjY291bnQgKGBQT1NUIC92MS9jbGllbnQvc2lnbl91cHNgKSBmcm9tIGEgY3JlYXRlLWFjY291bnQgZm9ybSdzXG4gICAqIHZhbHVlcyDigJQgZW1haWwsIHBhc3N3b3JkIGFuZCBhbnkgY29uZmlndXJlZCBzaWduLXVwIGZpZWxkcyDigJQgY2FycnlpbmcgdGhlXG4gICAqIHNpZ24tdXAgY2FwdGNoYSdzIHRva2VuIHdoZW4gdGhlIGluc3RhbmNlIHJlcXVpcmVzIG9uZS4gVGhlIGVtYWlsZWQgY29kZSBpc1xuICAgKiB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY29uc2VudCA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG4gICAgY29uc3QgbmV4dCA9IGF3YWl0IGNyZWF0ZVNpZ25VcCh0aGlzLmNsaWVudCwgdmFsdWVzLCB7XG4gICAgICBjb25zZW50LFxuICAgICAgY2FwdGNoYTogdGhpcy5zaWduVXBDYXB0Y2hhLFxuICAgICAgdDogdGhpcy50LFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKG5leHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2gobmV4dDogRmxvd1N0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG5leHQuYXR0ZW1wdD8uc3RhdHVzID09PSAnY29tcGxldGUnKSB7XG4gICAgICAvLyBTdGF5cyBidXN5IHVudGlsIHRoaXMgYnJvd3NlciBhY3R1YWxseSBob2xkcyB0aGUgc2Vzc2lvbjogdGhlIGNvbXBsZXRpb25cbiAgICAgIC8vIGFsb25lIHNheXMgbm90aGluZyBhYm91dCB3aGV0aGVyIHRoZSBjb29raWUgd2FzIGtlcHQuXG4gICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgYnVzeTogdHJ1ZSB9KTtcbiAgICAgIGxldCBleGNoYW5nZWQgPSB0cnVlO1xuICAgICAgaWYgKG5leHQudGlja2V0KSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3QoJy92MS9jbGllbnQvdGlja2V0cy9leGNoYW5nZScsIHtcbiAgICAgICAgICBhdHRlbXB0X2lkOiAobmV4dC5hdHRlbXB0IGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQsXG4gICAgICAgICAgdGlja2V0OiBuZXh0LnRpY2tldCxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4Y2hhbmdlZCA9IHJlcy5vaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtlcHQgPSBleGNoYW5nZWQgJiYgKGF3YWl0IHRoaXMucmVsb2FkKCkpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLm5leHQsIGJ1c3k6IGZhbHNlLCBzZXNzaW9uS2VwdDoga2VwdCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZShuZXh0KTtcbiAgICAgIC8vIEEgbWFnaWMtbGluayBzdGVwIG1heSBub3cgYmUgcG9sbGFibGUgKGEgbGluayBvcGVuZWQgb24gYW5vdGhlciBkZXZpY2UpLlxuICAgICAgdGhpcy5zeW5jUG9sbGluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGFydC9zdG9wIHRoZSDCpzUuMyBtYWdpYy1saW5rIHBvbGwgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgc3RhdGUuICovXG4gIHN5bmNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmIChzaG91bGRLZWVwUG9sbGluZyh0aGlzLnN0YXRlKCkpKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFBvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9sbFRpbWVyKSByZXR1cm47XG4gICAgdGhpcy5wb2xsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGU6IG5leHQsIHRpY2tldCB9ID0gYXdhaXQgcG9sbEF0dGVtcHQodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUobmV4dCk7XG4gICAgICAgIGlmICghdGlja2V0IHx8ICFuZXh0LmF0dGVtcHQpIHJldHVybjtcblxuICAgICAgICAvLyBUaGUgdGlja2V0IGlzIGV4Y2hhbmdlZCBieSBhIG5vcm1hbCByZXF1ZXN0LCBzbyBubyBzZXNzaW9uIHRva2VuIGV2ZXJcbiAgICAgICAgLy8gYXBwZWFycyBpbiBhIFVSTC5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICAgIGF0dGVtcHRfaWQ6IChuZXh0LmF0dGVtcHQgYXMgeyBpZD86IHN0cmluZyB9KS5pZCxcbiAgICAgICAgICB0aWNrZXQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBrZXB0ID0gcmVzLm9rICYmIChhd2FpdCB0aGlzLnJlbG9hZCgpKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnRoaXMuc3RhdGUoKSwgc2Vzc2lvbktlcHQ6IGtlcHQgfSk7XG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICAgIH0pKCk7XG4gICAgfSwgMl8wMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xuICAgICAgdGhpcy5wb2xsVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWxlYXNlIHRoZSBwb2xsIHRpbWVyIGFuZCB0aGUgY2FwdGNoYSB3aWRnZXRzIOKAlCBjYWxsIGZyb20gdGhlIGNvbXBvbmVudCdzIGBuZ09uRGVzdHJveWAuICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIHRoaXMuY2FwdGNoYS5kZXN0cm95KCk7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhLmRlc3Ryb3koKTtcbiAgfVxufVxuIl19
|
|
352
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zsb3ctY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix1QkFBdUIsRUFDdkIsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsYUFBYSxFQUNiLGVBQWUsRUFDZixpQkFBaUIsR0FPbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0M7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFtRFg7SUFDQTtJQUdBO0lBdERWLEtBQUssQ0FBNEI7SUFDMUM7Ozs7T0FJRztJQUNNLFFBQVEsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzFEOzs7T0FHRztJQUNNLFVBQVUsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQ2xELHlFQUF5RTtJQUNoRSxPQUFPLEdBQXNCLHVCQUF1QixDQUFDLFNBQVMsRUFBRTtRQUN2RSx5RUFBeUU7UUFDekUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDOUMsQ0FBQyxDQUFDO0lBQ0gscURBQXFEO0lB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RyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7b0JBQ2hFLFVBQVUsRUFBRyxJQUFJLENBQUMsT0FBMkIsQ0FBQyxFQUFFO29CQUNoRCxNQUFNO2lCQUNQLENBQUMsQ0FBQztnQkFDSCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRCxnR0FBZ0c7SUFDaEcsT0FBTztRQUNMLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV3JpdGFibGVTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRmFwaUNsaWVudCxcbiAgYWR2YW5jZVdpdGhDYXB0Y2hhLFxuICBhdGxhc0NhcHRjaGFMYWJlbHMsXG4gIGNyZWF0ZUNhcHRjaGFDb250cm9sbGVyLFxuICBjcmVhdGVQYXNza2V5U2lnblVwLFxuICBjcmVhdGVTaWduVXAsXG4gIGZpbmlzaFBhc3NrZXlTaWduVXAsXG4gIGZldGNoSW5zdGFuY2VTZXR0aW5ncyxcbiAgZmV0Y2hMYXN0U2lnbkluTWV0aG9kLFxuICBjcmVhdGVNZmFFbnJvbGxtZW50LFxuICBhY2tub3dsZWRnZVJlY292ZXJ5Q29kZXMsXG4gIHBlbmRpbmdSZWNvdmVyeUNvZGVzLFxuICBtZmFDaG9pY2VzRnJvbSxcbiAgcHJlcGFyZVNlY29uZEZhY3RvckNvZGUsXG4gIHJlc2VuZFNpZ25VcFZlcmlmaWNhdGlvbixcbiAgZmxvd05lZWRzQ2FwdGNoYSxcbiAgc2lnbkluQ2FwdGNoYU9wdGlvbnMsXG4gIGZsb3dGcm9tUGVuZGluZyxcbiAgaW5pdGlhbEZsb3csXG4gIG5leHRTdGVwLFxuICBvZmZlcmVkRmlyc3RGYWN0b3JzLFxuICBwb2xsQXR0ZW1wdCxcbiAgcHJlcGFyZUZhY3RvcixcbiAgcGxhbkZpcnN0RmFjdG9yLFxuICBzaG91bGRLZWVwUG9sbGluZyxcbiAgdHlwZSBDYXB0Y2hhQ29udHJvbGxlcixcbiAgdHlwZSBGbG93U3RhdGUsXG4gIHR5cGUgSW5zdGFuY2VTZXR0aW5ncyxcbiAgdHlwZSBNZmFDaG9pY2VzLFxuICB0eXBlIE1mYUVucm9sbG1lbnRDb250cm9sbGVyLFxuICB0eXBlIE1mYUVucm9sbG1lbnRTdGF0ZSxcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBFTl9VUywgdHJhbnNsYXRlIH0gZnJvbSAnLi4vaTE4bic7XG5cbi8qKlxuICogVGhlIHNlcnZlci1kcml2ZW4gc2lnbi1pbiAvIHNpZ24tdXAgZW5naW5lLCBzaGFyZWQgYnkgYDxhdGxhcy1zaWduLWluPmAgYW5kXG4gKiBgPGF0bGFzLXNpZ24tdXA+YCDigJQgdGhlIEFuZ3VsYXIgY291bnRlcnBhcnQgb2YgUmVhY3QncyBgdXNlRmxvd2AgaG9vay5cbiAqXG4gKiBJdCBvd25zIG5vIGRlY2lzaW9uIGFib3V0IHdoYXQgY29tZXMgbmV4dDogZXZlcnkgc3RhdHVzIGNvbWVzIGJhY2sgZnJvbSB0aGVcbiAqIHNlcnZlciB2aWEgYGFkdmFuY2VgLCBhbmQgdGhpcyBjb250cm9sbGVyIG9ubHkgcG9zdHMgd2hhdGV2ZXIgdGhlIGN1cnJlbnQgc3RlcFxuICogbmVlZHMgYW5kIHJlLXJlbmRlcnMgdGhlIHJldHVybmVkIHN0YXR1cy4gU3RhdGUgbGl2ZXMgaW4gYSBzaWduYWwgc28gdGVtcGxhdGVzXG4gKiB1cGRhdGUgd2hldGhlciB0aGUgYXBwIHJ1bnMgem9uZWQgb3Igem9uZWxlc3MuXG4gKlxuICogYDxhdGxhcy1zaWduLXVwPmAgc3RhcnRzIHRoZSBhdHRlbXB0IHdpdGgge0BsaW5rIGNyZWF0ZX1cbiAqIChgUE9TVCAvdjEvY2xpZW50L3NpZ25fdXBzYCk7IHRoZSBlbWFpbGVkLWNvZGUgc3RlcCB0aGVuIHJ1bnMgdGhyb3VnaCB0aGUgc2FtZVxuICoge0BsaW5rIHN1Ym1pdH0uIEJvdGggZmxvd3MgZHJhdyB0aGUgaW5zdGFuY2UncyBjYXB0Y2hhIChmcm9tXG4gKiB7QGxpbmsgbG9hZFNldHRpbmdzfSkgd2hlbiBpdCBpcyByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0bGFzRmxvd0NvbnRyb2xsZXIge1xuICByZWFkb25seSBzdGF0ZTogV3JpdGFibGVTaWduYWw8Rmxvd1N0YXRlPjtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSdzIHB1YmxpYyBzaWduLWluIC8gc2lnbi11cCBzZXR0aW5ncyAoY2FwdGNoYSwgc2lnbi11cCBmaWVsZHMsXG4gICAqIGxlZ2FsIGNvbnNlbnQpIGZyb20gYEdFVCAvdjEvYXBwZWFyYW5jZWA7IG51bGwgdW50aWwge0BsaW5rIGxvYWRTZXR0aW5nc31cbiAgICogcmVzb2x2ZXMsIG9yIHdoZW4gdGhlIHNlcnZlciBjb3VsZCBub3QgYmUgcmVhY2hlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNldHRpbmdzID0gc2lnbmFsPEluc3RhbmNlU2V0dGluZ3MgfCBudWxsPihudWxsKTtcbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgdGhpcyBicm93c2VyIGxhc3Qgc2lnbmVkIGluIHdpdGggKGBwYXNzd29yZGAsIGBvYXV0aF9naXRodWJgLCDigKYpXG4gICAqIGZvciB0aGUgXCJMYXN0IHVzZWRcIiBoaW50OyBudWxsIHdoZW4gbm9uZSwgb3IgdGhlIGluc3RhbmNlIHR1cm5lZCBpdCBvZmYuXG4gICAqL1xuICByZWFkb25seSBsYXN0TWV0aG9kID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAvKiogVGhlIHNpZ24taW4gY2FwdGNoYSAoaWRlbnRpZmllciBzdGVwIC8gYG5lZWRzX2NhcHRjaGFgIGNoYWxsZW5nZSkuICovXG4gIHJlYWRvbmx5IGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgLy8gVGhlIEF0bGFzIGNhcHRjaGEncyB3b3JkcyBmb2xsb3cgdGhlIGZvcm0ncyBjYXRhbG9nIChyZWFkIHdoZW4gZHJhd24pLlxuICAgIGF0bGFzTGFiZWxzOiAoKSA9PiBhdGxhc0NhcHRjaGFMYWJlbHModGhpcy50KSxcbiAgfSk7XG4gIC8qKiBUaGUgc2lnbi11cCBjYXB0Y2hhICh0aGUgY3JlYXRlLWFjY291bnQgc3RlcCkuICovXG4gIHJlYWRvbmx5IHNpZ25VcENhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyID0gY3JlYXRlQ2FwdGNoYUNvbnRyb2xsZXIodW5kZWZpbmVkLCB7XG4gICAgYXRsYXNMYWJlbHM6ICgpID0+IGF0bGFzQ2FwdGNoYUxhYmVscyh0aGlzLnQpLFxuICB9KTtcbiAgLyoqIFdoZXRoZXIge0BsaW5rIGNhcHRjaGF9IGN1cnJlbnRseSBkcmF3cyBhIHdpZGdldCAoZm9yIHRlbXBsYXRlcykuICovXG4gIHJlYWRvbmx5IGNhcHRjaGFEcmF3biA9IHNpZ25hbChmYWxzZSk7XG4gIC8qKiBXaGV0aGVyIHtAbGluayBzaWduVXBDYXB0Y2hhfSBjdXJyZW50bHkgZHJhd3MgYSB3aWRnZXQgKGZvciB0ZW1wbGF0ZXMpLiAqL1xuICByZWFkb25seSBzaWduVXBDYXB0Y2hhRHJhd24gPSBzaWduYWwoZmFsc2UpO1xuICAvKipcbiAgICogVGhlIGZpcnN0IGZhY3RvciB0aGUgc2VydmVyIHdhcyBhc2tlZCB0byBzZW5kICh7QGxpbmsgcHJlcGFyZX0pIG9uIHRoZVxuICAgKiBjdXJyZW50IGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXAg4oCUIHRoZSBmb3JtIHRoZW4gY29sbGVjdHMgaXRzIGNvZGUuIE51bGxcbiAgICogb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZWRGYWN0b3IgPSBzaWduYWw8J2VtYWlsX2NvZGUnIHwgbnVsbD4obnVsbCk7XG4gIC8qKlxuICAgKiBcIkVtYWlsIG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHtAbGluayBzZW5kRW1haWxTZWNvbmRGYWN0b3J9KTpcbiAgICogaW4gZmxpZ2h0LCB3aGVyZSB0aGUgY29kZSB3ZW50LCBvciB3aHkgaXQgd2FzIG5vdCBzZW50LiBOdWxsIHVudGlsIGFza2VkLFxuICAgKiBhbmQgYWdhaW4gb25jZSB0aGUgZmxvdyBsZWF2ZXMgdGhhdCBzdGVwLlxuICAgKi9cbiAgcmVhZG9ubHkgZW1haWxTZWNvbmRGYWN0b3IgPSBzaWduYWw8eyBidXN5PzogYm9vbGVhbjsgc2VudFRvPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG4gIC8qKiBcIlRleHQgbWUgYSBjb2RlIGluc3RlYWRcIiBhdCB0aGUgc2Vjb25kIGZhY3RvciAoe0BsaW5rIHNlbmRTbXNTZWNvbmRGYWN0b3J9KTogYXMge0BsaW5rIGVtYWlsU2Vjb25kRmFjdG9yfS4gKi9cbiAgcmVhZG9ubHkgc21zU2Vjb25kRmFjdG9yID0gc2lnbmFsPHsgYnVzeT86IGJvb2xlYW47IHNlbnRUbz86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICAvKipcbiAgICogVGhlIE1GQSBlbnJvbG1lbnQgc3RlcCAoYG5lZWRzX21mYV9lbnJvbGxtZW50YCk6IHRoZSBhdXRoZW50aWNhdG9yIGFwcCdzXG4gICAqIHNldHVwIChRUiBjb2RlLCBzZXR1cCBrZXkpIG9yIGEgdGV4dGVkIGNvZGUuIFN0YXJ0ZWQgYW5kIHJlc2V0IHdpdGggdGhlIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBlbnJvbGxtZW50OiBNZmFFbnJvbGxtZW50Q29udHJvbGxlcjtcbiAgLyoqIHtAbGluayBlbnJvbGxtZW50fSdzIHN0YXRlLCBmb3IgdGVtcGxhdGVzLiAqL1xuICByZWFkb25seSBlbnJvbGxtZW50U3RhdGU6IFdyaXRhYmxlU2lnbmFsPE1mYUVucm9sbG1lbnRTdGF0ZT47XG4gIHByaXZhdGUgcG9sbFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpZGVudGlmaWVyID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IEZhcGlDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWxvYWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4gICAgcGVuZGluZzogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbCxcbiAgICAvKiogUmVzb2x2ZXMgdGhlIGNhcHRjaGEgbWVzc2FnZXMnIGNhdGFsb2cga2V5cy4gRGVmYXVsdHMgdG8gZW4tVVMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB0OiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyA9IChrZXkpID0+IHRyYW5zbGF0ZShFTl9VUywga2V5KSxcbiAgKSB7XG4gICAgLy8gU2VlZGVkIGZyb20gYSByZWRpcmVjdCB0aGF0IGNhbWUgYmFjayBtaWQtZmxvdyAoZS5nLiBPQXV0aCBuZWVkaW5nIGEgc2Vjb25kXG4gICAgLy8gZmFjdG9yKSBzbyB0aGUgdXNlciByZXN1bWVzIGF0IHRoZSBkZW1hbmRlZCBzdGVwIGluc3RlYWQgb2Ygc3RhcnRpbmcgb3Zlci5cbiAgICB0aGlzLnN0YXRlID0gc2lnbmFsPEZsb3dTdGF0ZT4ocGVuZGluZyA/IGZsb3dGcm9tUGVuZGluZyhwZW5kaW5nKSA6IGluaXRpYWxGbG93KTtcbiAgICB0aGlzLmVucm9sbG1lbnQgPSBjcmVhdGVNZmFFbnJvbGxtZW50KHRoaXMuY2xpZW50LCAoKSA9PiB0aGlzLm1mYUNob2ljZXMoKSk7XG4gICAgdGhpcy5lbnJvbGxtZW50U3RhdGUgPSBzaWduYWw8TWZhRW5yb2xsbWVudFN0YXRlPih0aGlzLmVucm9sbG1lbnQuc3RhdGUpO1xuICAgIHRoaXMuZW5yb2xsbWVudC5zdWJzY3JpYmUoKG5leHQpID0+IHRoaXMuZW5yb2xsbWVudFN0YXRlLnNldChuZXh0KSk7XG4gICAgdGhpcy5zeW5jQ2FwdGNoYSgpO1xuICAgIHRoaXMuc3luY0Vucm9sbG1lbnQoKTtcbiAgfVxuXG4gIC8qKiBXaGF0IHRoZSBhcHAgbGV0cyB0aGUgTUZBIHN0ZXBzIG9mZmVyIChmcm9tIHtAbGluayBzZXR0aW5nc30pLiAqL1xuICBtZmFDaG9pY2VzKCk6IE1mYUNob2ljZXMge1xuICAgIHJldHVybiBtZmFDaG9pY2VzRnJvbSh0aGlzLnNldHRpbmdzKCk/LmFjY291bnQpO1xuICB9XG5cbiAgLyoqIFN0YXJ0IHRoZSBlbnJvbG1lbnQgc3RlcCBmb3IgaXRzIGF0dGVtcHQsIG9yIHJlc2V0IGl0IG9uY2UgdGhlIGZsb3cgbGVhdmVzLiAqL1xuICBwcml2YXRlIHN5bmNFbnJvbGxtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGF0dGVtcHQgPSB0aGlzLnN0YXRlKCkuYXR0ZW1wdDtcbiAgICBpZiAoYXR0ZW1wdD8uc3RhdHVzID09PSAnbmVlZHNfbWZhX2Vucm9sbG1lbnQnICYmIGF0dGVtcHQuaWQpIHRoaXMuZW5yb2xsbWVudC5zdGFydChhdHRlbXB0LmlkKTtcbiAgICBlbHNlIHRoaXMuZW5yb2xsbWVudC5yZXNldCgpO1xuICB9XG5cbiAgLyoqIEZldGNoIHRoZSBpbnN0YW5jZSdzIHB1YmxpYyBzZXR0aW5ncyBhbmQgZHJhdyB3aGF0ZXZlciBjYXB0Y2hhIHRoZXkgcmVxdWlyZS4gKi9cbiAgYXN5bmMgbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGZldGNoSW5zdGFuY2VTZXR0aW5ncyh0aGlzLmNsaWVudCk7XG4gICAgaWYgKGxvYWRlZCkge1xuICAgICAgdGhpcy5zZXR0aW5ncy5zZXQobG9hZGVkKTtcbiAgICAgIHRoaXMuc3luY0NhcHRjaGEoKTtcbiAgICAgIGlmIChsb2FkZWQuYWNjb3VudC5sYXN0U2lnbkluTWV0aG9kKSB0aGlzLmxhc3RNZXRob2Quc2V0KGF3YWl0IGZldGNoTGFzdFNpZ25Jbk1ldGhvZCh0aGlzLmNsaWVudCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgZmFjdG9ycyB0byBvZmZlciBvbiBhIGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXA6IHRoZSBzZXJ2ZXIncyBsaXN0XG4gICAqIHdpdGhvdXQgZW1haWwgY29kZSAvIGxpbmsgd2hpbGUgdGhlIGFwcCBjYW5ub3QgZGVsaXZlciBlbWFpbFxuICAgKiAoYHNldHRpbmdzLmVtYWlsRGVsaXZlcnkuYXZhaWxhYmxlID09PSBmYWxzZWApLiBFbXB0eSBvbiBhbnkgb3RoZXIgc3RlcC5cbiAgICovXG4gIGZpcnN0RmFjdG9ycygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0O1xuICAgIGNvbnN0IHN0ZXAgPSBhdHRlbXB0ID8gbmV4dFN0ZXAoYXR0ZW1wdCkgOiBudWxsO1xuICAgIHJldHVybiBzdGVwPy5raW5kID09PSAnY29sbGVjdF9maXJzdF9mYWN0b3InXG4gICAgICA/IG9mZmVyZWRGaXJzdEZhY3RvcnMoc3RlcC5zdHJhdGVnaWVzLCB0aGlzLnNldHRpbmdzKCk/LmVtYWlsRGVsaXZlcnkpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiBlbWFpbCArIHBhc3N3b3JkIHNpZ24tdXAgY2Fubm90IGNvbXBsZXRlIGJlY2F1c2UgdGhlIGFwcCBjYW5ub3RcbiAgICogc2VuZCB0aGUgdmVyaWZpY2F0aW9uIGVtYWlsIChgc2V0dGluZ3MuZW1haWxEZWxpdmVyeS5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2VgKTpcbiAgICogYDxhdGxhcy1zaWduLXVwPmAgc2hvd3MgdGhlIFwiY2FuJ3Qgc2VuZCBlbWFpbFwiIG5vdGljZSBpbnN0ZWFkIG9mIHRoZSBmb3JtLlxuICAgKi9cbiAgc2lnblVwRW1haWxVbmF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkU2lnblVwID09PSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBGYWxzZSB3aGVuIGEgcGFzc3dvcmQgcmVzZXQgZW1haWwgY2Fubm90IGJlIGRlbGl2ZXJlZCDigJQgaGlkZSBcIkZvcmdvdCBwYXNzd29yZD9cIi4gKi9cbiAgcGFzc3dvcmRSZXNldEF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncygpPy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkUmVzZXQgIT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgc2VydmVyIHRvIGVtYWlsIGEgc2lnbi1pbiBjb2RlIGZvciB0aGUgY3VycmVudCBgbmVlZHNfZmlyc3RfZmFjdG9yYFxuICAgKiBzdGVwIChgUE9TVCDigKYvcHJlcGFyZV9maXJzdF9mYWN0b3JgKTsgdGhlIGZvcm0gdGhlbiBjb2xsZWN0cyB0aGUgY29kZSwgd2hpY2hcbiAgICoge0BsaW5rIHN1Ym1pdH0gcG9zdHMgYXMgdGhlIGBlbWFpbF9jb2RlYCBzdHJhdGVneS5cbiAgICovXG4gIGFzeW5jIHByZXBhcmUoc3RyYXRlZ3k6ICdlbWFpbF9jb2RlJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5maXJzdEZhY3RvcnMoKS5pbmNsdWRlcyhzdHJhdGVneSkpIHJldHVybjtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG4gICAgY29uc3QgbmV4dCA9IGF3YWl0IHByZXBhcmVGYWN0b3IodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgc3RyYXRlZ3kpO1xuICAgIHRoaXMuc2V0U3RhdGUobmV4dCk7XG4gICAgaWYgKCFuZXh0LmVycm9ycy5sZW5ndGgpIHRoaXMucHJlcGFyZWRGYWN0b3Iuc2V0KHN0cmF0ZWd5KTtcbiAgfVxuXG4gIC8qKiBLZWVwIGJvdGggY2FwdGNoYXMgaW4gc3RlcCB3aXRoIHRoZSBzZXR0aW5ncyBhbmQgdGhlIGZsb3cncyBjdXJyZW50IHN0ZXAuICovXG4gIHByaXZhdGUgc3luY0NhcHRjaGEoKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlKCk7XG4gICAgdGhpcy5jYXB0Y2hhLmNvbmZpZ3VyZShcbiAgICAgIHNpZ25JbkNhcHRjaGFPcHRpb25zKHNldHRpbmdzPy5jYXB0Y2hhRmxvd3Muc2lnbkluLCBzdGF0ZSwgKCkgPT4gdm9pZCB0aGlzLnN1Ym1pdCh7fSkpLFxuICAgICk7XG4gICAgY29uc3Qgc2lnblVwRmxvdyA9IHNldHRpbmdzPy5jYXB0Y2hhRmxvd3Muc2lnblVwO1xuICAgIHRoaXMuc2lnblVwQ2FwdGNoYS5jb25maWd1cmUoe1xuICAgICAgZmxvdzogc2lnblVwRmxvdyxcbiAgICAgIGFjdGl2ZTogIXN0YXRlLmF0dGVtcHQgJiYgZmxvd05lZWRzQ2FwdGNoYShzaWduVXBGbG93KSxcbiAgICB9KTtcbiAgICB0aGlzLmNhcHRjaGFEcmF3bi5zZXQodGhpcy5jYXB0Y2hhLm5lZWRlZCk7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhRHJhd24uc2V0KHRoaXMuc2lnblVwQ2FwdGNoYS5uZWVkZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGF0ZShuZXh0OiBGbG93U3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c0lkID0gdGhpcy5zdGF0ZSgpLmF0dGVtcHQ/LmlkID8/IG51bGw7XG4gICAgdGhpcy5zdGF0ZS5zZXQobmV4dCk7XG4gICAgLy8gQSBwcmVwYXJlZCBmYWN0b3IgYmVsb25ncyB0byB0aGUgZmlyc3QtZmFjdG9yIHN0ZXAgaXQgd2FzIHNlbnQgZm9yLlxuICAgIGlmIChuZXh0LmF0dGVtcHQ/LnN0YXR1cyAhPT0gJ25lZWRzX2ZpcnN0X2ZhY3RvcicpIHRoaXMucHJlcGFyZWRGYWN0b3Iuc2V0KG51bGwpO1xuICAgIC8vIEFuIGVtYWlsZWQgc2Vjb25kLWZhY3RvciBjb2RlIGJlbG9uZ3MgdG8gdGhlIHNlY29uZC1mYWN0b3Igc3RlcCBvZiB0aGlzIGF0dGVtcHQuXG4gICAgaWYgKG5leHQuYXR0ZW1wdD8uc3RhdHVzICE9PSAnbmVlZHNfc2Vjb25kX2ZhY3RvcicgfHwgKG5leHQuYXR0ZW1wdD8uaWQgPz8gbnVsbCkgIT09IHByZXZpb3VzSWQpIHtcbiAgICAgIHRoaXMuZW1haWxTZWNvbmRGYWN0b3Iuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zbXNTZWNvbmRGYWN0b3Iuc2V0KG51bGwpO1xuICAgIH1cbiAgICB0aGlzLnN5bmNDYXB0Y2hhKCk7XG4gICAgdGhpcy5zeW5jRW5yb2xsbWVudCgpO1xuICAgIHRoaXMuYXV0b1NlbmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1NlbnRGb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogV2l0aCBubyBwYXNzd29yZCBvbiBvZmZlciwgZW1haWwgdGhlIGNvZGUgYXMgc29vbiBhcyB0aGUgc2VydmVyIGFza3MgZm9yIGFcbiAgICogZmlyc3QgZmFjdG9yIOKAlCBvbmNlIHBlciBhdHRlbXB0LCBzbyBhIGZhaWxlZCBzZW5kIHdhaXRzIGZvciB0aGUgdXNlcidzIHJldHJ5XG4gICAqICh0aGUgXCJFbWFpbCBtZSBhIGNvZGVcIiBidXR0b24pIGluc3RlYWQgb2YgbG9vcGluZy5cbiAgICovXG4gIHByaXZhdGUgYXV0b1NlbmQoKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXRlKCkuYXR0ZW1wdD8uaWQgPz8gbnVsbDtcbiAgICBpZiAoIWlkIHx8IHRoaXMuYXV0b1NlbnRGb3IgPT09IGlkIHx8IHRoaXMucHJlcGFyZWRGYWN0b3IoKSkgcmV0dXJuO1xuICAgIGlmIChwbGFuRmlyc3RGYWN0b3IodGhpcy5maXJzdEZhY3RvcnMoKSkuYXV0b1NlbmQgIT09ICdlbWFpbF9jb2RlJykgcmV0dXJuO1xuICAgIHRoaXMuYXV0b1NlbnRGb3IgPSBpZDtcbiAgICB2b2lkIHRoaXMucHJlcGFyZSgnZW1haWxfY29kZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2UgdGhlIGZsb3cgd2l0aCB0aGUgdmFsdWVzIHRoZSB1c2VyIHR5cGVkLiBPbiBjb21wbGV0aW9uLCBleGNoYW5nZSB0aGVcbiAgICogb25lLXRpbWUgdGlja2V0IGZvciBjb29raWVzIG92ZXIgYSBzYW1lLW9yaWdpbiByZXF1ZXN0IChGQVBJIGlzIGNyb3NzLW9yaWdpblxuICAgKiBhbmQgY2Fubm90IHNldCB0aGUgY29va2llIG9uIGl0cyBvd24gcmVzcG9uc2UpLCB0aGVuIHJlLWJvb3Qgc28gdGhlIHJlc3Qgb2ZcbiAgICogdGhlIGFwcCBzZWVzIGEgc2lnbmVkLWluIHVzZXIuXG4gICAqL1xuICBhc3luYyBzdWJtaXQodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpO1xuXG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgYWR2YW5jZVdpdGhDYXB0Y2hhKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCksIHZhbHVlcywge1xuICAgICAgY2FwdGNoYTogdGhpcy5jYXB0Y2hhLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgdDogdGhpcy50LFxuICAgIH0pO1xuICAgIHRoaXMuaWRlbnRpZmllciA9IG91dC5pZGVudGlmaWVyO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKG91dC5zdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGFjY291bnQgKGBQT1NUIC92MS9jbGllbnQvc2lnbl91cHNgKSBmcm9tIGEgY3JlYXRlLWFjY291bnQgZm9ybSdzXG4gICAqIHZhbHVlcyDigJQgZW1haWwsIHBhc3N3b3JkIGFuZCBhbnkgY29uZmlndXJlZCBzaWduLXVwIGZpZWxkcyDigJQgY2FycnlpbmcgdGhlXG4gICAqIHNpZ24tdXAgY2FwdGNoYSdzIHRva2VuIHdoZW4gdGhlIGluc3RhbmNlIHJlcXVpcmVzIG9uZS4gVGhlIGVtYWlsZWQgY29kZSBpc1xuICAgKiB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY29uc2VudCA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG4gICAgY29uc3QgbmV4dCA9IGF3YWl0IGNyZWF0ZVNpZ25VcCh0aGlzLmNsaWVudCwgdmFsdWVzLCB7XG4gICAgICBjb25zZW50LFxuICAgICAgY2FwdGNoYTogdGhpcy5zaWduVXBDYXB0Y2hhLFxuICAgICAgdDogdGhpcy50LFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKG5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiRW1haWwgbWUgYSBjb2RlIGluc3RlYWRcIiBhdCB0aGUgc2Vjb25kIGZhY3RvciAodGhlIGluc3RhbmNlJ3NcbiAgICogYGFjY291bnQuZW1haWxTZWNvbmRGYWN0b3JgKTogbWFpbHMgYSBjb2RlIHRvIHRoZSBhY2NvdW50J3MgdmVyaWZpZWQgZW1haWw7XG4gICAqIGl0IGlzIHRoZW4gcG9zdGVkIHdpdGgge0BsaW5rIHN1Ym1pdH0gbGlrZSBhbnkgMkZBIGNvZGUuXG4gICAqL1xuICBhc3luYyBzZW5kRW1haWxTZWNvbmRGYWN0b3IoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZW5kU2Vjb25kRmFjdG9yQ29kZSgnZW1haWxfY29kZScsIHRoaXMuZW1haWxTZWNvbmRGYWN0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiVGV4dCBtZSBhIGNvZGUgaW5zdGVhZFwiIGF0IHRoZSBzZWNvbmQgZmFjdG9yICh3aGVyZSB0aGUgYXBwIG9mZmVycyB0ZXh0ZWRcbiAgICogY29kZXMsIHtAbGluayBtZmFDaG9pY2VzfWAoKS5zbXNgKTogdGV4dHMgYSBjb2RlIHRvIHRoZSBhY2NvdW50J3MgZW5yb2xsZWRcbiAgICogcGhvbmU7IGl0IGlzIHRoZW4gcG9zdGVkIHdpdGgge0BsaW5rIHN1Ym1pdH0gbGlrZSBhbnkgMkZBIGNvZGUuXG4gICAqL1xuICBhc3luYyBzZW5kU21zU2Vjb25kRmFjdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZFNlY29uZEZhY3RvckNvZGUoJ3NtcycsIHRoaXMuc21zU2Vjb25kRmFjdG9yKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZFNlY29uZEZhY3RvckNvZGUoXG4gICAgc3RyYXRlZ3k6ICdzbXMnIHwgJ2VtYWlsX2NvZGUnLFxuICAgIG91dDogV3JpdGFibGVTaWduYWw8eyBidXN5PzogYm9vbGVhbjsgc2VudFRvPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9IHwgbnVsbD4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5zdGF0ZSgpLmF0dGVtcHQ/LmlkO1xuICAgIGlmICghaWQpIHJldHVybjtcbiAgICBvdXQuc2V0KHsgYnVzeTogdHJ1ZSB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBzZW50VG8gfSA9IGF3YWl0IHByZXBhcmVTZWNvbmRGYWN0b3JDb2RlKHRoaXMuY2xpZW50LCBpZCwgc3RyYXRlZ3kpO1xuICAgICAgb3V0LnNldCh7IHNlbnRUbyB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgb3V0LnNldCh7IGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IHRoaXMudCgnZXJyb3IuZ2VuZXJpYycpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXNlbmQgYSBzaWduLXVwJ3MgZW1haWxlZCBjb2RlIC8gbGluayAodGhlIGVhcmxpZXIgb25lIHN0b3BzIHdvcmtpbmcpLiAqL1xuICBhc3luYyByZXNlbmRTaWduVXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpO1xuICAgIHRoaXMuc3RhdGUuc2V0KGF3YWl0IHJlc2VuZFNpZ25VcFZlcmlmaWNhdGlvbih0aGlzLmNsaWVudCwgdGhpcy5zdGF0ZSgpKSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYSBwYXNza2V5LW9ubHkgc2lnbi11cCAoYFBPU1QgL3YxL2NsaWVudC9zaWduX3Vwcy9wYXNza2V5YCkgZnJvbSB0aGVcbiAgICogY3JlYXRlLWFjY291bnQgZm9ybSdzIHZhbHVlcyDigJQgbm8gcGFzc3dvcmQuIE9mZmVyZWQgd2hlbiB0aGUgaW5zdGFuY2Unc1xuICAgKiBgYWNjb3VudC5wYXNza2V5U2lnblVwYCBpcyBzZXQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVXaXRoUGFzc2tleSh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGNvbnNlbnQgPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKGF3YWl0IGNyZWF0ZVBhc3NrZXlTaWduVXAodGhpcy5jbGllbnQsIHZhbHVlcywgeyBjb25zZW50LCBjYXB0Y2hhOiB0aGlzLnNpZ25VcENhcHRjaGEsIHQ6IHRoaXMudCB9KSk7XG4gIH1cblxuICAvKiogVGhlIHBhc3NrZXktb25seSBzaWduLXVwJ3MgbGFzdCBzdGVwOiBjcmVhdGUgdGhlIHBhc3NrZXksIGFuZCB3aXRoIGl0IHRoZSBhY2NvdW50LiAqL1xuICBhc3luYyBjcmVhdGVQYXNza2V5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChhd2FpdCBmaW5pc2hQYXNza2V5U2lnblVwKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCksIHsgdDogdGhpcy50IH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVjb3ZlcnkgY29kZXMgYW4gTUZBIGVucm9sbWVudCBqdXN0IGNvbXBsZXRlZCB0aGUgc2lnbi1pbiB3aXRoLCBzaG93blxuICAgKiBvbmNlIGJlZm9yZSBpdCBmaW5pc2hlcyAoe0BsaW5rIHNhdmVSZWNvdmVyeUNvZGVzfSk7IG51bGwgb3RoZXJ3aXNlLiBUaGV5XG4gICAqIGxpdmUgb25seSBpbiB0aGlzIGNvbnRyb2xsZXIncyBtZW1vcnkuXG4gICAqL1xuICByZWNvdmVyeUNvZGVzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIHBlbmRpbmdSZWNvdmVyeUNvZGVzKHRoaXMuc3RhdGUoKSk7XG4gIH1cblxuICAvKiogXCJJJ3ZlIHNhdmVkIG15IGNvZGVzXCI6IGZvcmdldCB0aGUgcmVjb3ZlcnkgY29kZXMgYW5kIGZpbmlzaCB0aGUgc2lnbi1pbi4gKi9cbiAgYXN5bmMgc2F2ZVJlY292ZXJ5Q29kZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maW5pc2goYWNrbm93bGVkZ2VSZWNvdmVyeUNvZGVzKHRoaXMuc3RhdGUoKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2gobmV4dDogRmxvd1N0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQW4gZW5yb2xtZW50J3MgcmVjb3ZlcnkgY29kZXMgYXJlIHNob3duIGZpcnN0OyBgc2F2ZVJlY292ZXJ5Q29kZXNgIGZpbmlzaGVzLlxuICAgIGlmIChwZW5kaW5nUmVjb3ZlcnlDb2RlcyhuZXh0KSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLm5leHQsIGJ1c3k6IGZhbHNlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmV4dC5hdHRlbXB0Py5zdGF0dXMgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIC8vIFN0YXlzIGJ1c3kgdW50aWwgdGhpcyBicm93c2VyIGFjdHVhbGx5IGhvbGRzIHRoZSBzZXNzaW9uOiB0aGUgY29tcGxldGlvblxuICAgICAgLy8gYWxvbmUgc2F5cyBub3RoaW5nIGFib3V0IHdoZXRoZXIgdGhlIGNvb2tpZSB3YXMga2VwdC5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyAuLi5uZXh0LCBidXN5OiB0cnVlIH0pO1xuICAgICAgbGV0IGV4Y2hhbmdlZCA9IHRydWU7XG4gICAgICBpZiAobmV4dC50aWNrZXQpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICAgIGF0dGVtcHRfaWQ6IChuZXh0LmF0dGVtcHQgYXMgeyBpZD86IHN0cmluZyB9KS5pZCxcbiAgICAgICAgICB0aWNrZXQ6IG5leHQudGlja2V0LFxuICAgICAgICB9KTtcbiAgICAgICAgZXhjaGFuZ2VkID0gcmVzLm9rO1xuICAgICAgfVxuICAgICAgY29uc3Qga2VwdCA9IGV4Y2hhbmdlZCAmJiAoYXdhaXQgdGhpcy5yZWxvYWQoKSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgYnVzeTogZmFsc2UsIHNlc3Npb25LZXB0OiBrZXB0IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKG5leHQpO1xuICAgICAgLy8gQSBtYWdpYy1saW5rIHN0ZXAgbWF5IG5vdyBiZSBwb2xsYWJsZSAoYSBsaW5rIG9wZW5lZCBvbiBhbm90aGVyIGRldmljZSkuXG4gICAgICB0aGlzLnN5bmNQb2xsaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0YXJ0L3N0b3AgdGhlIMKnNS4zIG1hZ2ljLWxpbmsgcG9sbCB0byBtYXRjaCB0aGUgY3VycmVudCBzdGF0ZS4gKi9cbiAgc3luY1BvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHNob3VsZEtlZXBQb2xsaW5nKHRoaXMuc3RhdGUoKSkpIHtcbiAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xsVGltZXIpIHJldHVybjtcbiAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBzdGF0ZTogbmV4dCwgdGlja2V0IH0gPSBhd2FpdCBwb2xsQXR0ZW1wdCh0aGlzLmNsaWVudCwgdGhpcy5zdGF0ZSgpKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXh0KTtcbiAgICAgICAgLy8gZS5nLiBhIHBhc3NrZXkgc2lnbi11cCB3aG9zZSBlbWFpbCB3YXMganVzdCBwcm92ZW46IG9ubHkgdGhpcyB0YWIgY2FuIGdvIG9uLlxuICAgICAgICBpZiAoIXRpY2tldCAmJiAhc2hvdWxkS2VlcFBvbGxpbmcobmV4dCkpIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICAgICAgaWYgKCF0aWNrZXQgfHwgIW5leHQuYXR0ZW1wdCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFRoZSB0aWNrZXQgaXMgZXhjaGFuZ2VkIGJ5IGEgbm9ybWFsIHJlcXVlc3QsIHNvIG5vIHNlc3Npb24gdG9rZW4gZXZlclxuICAgICAgICAvLyBhcHBlYXJzIGluIGEgVVJMLlxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5wb3N0KCcvdjEvY2xpZW50L3RpY2tldHMvZXhjaGFuZ2UnLCB7XG4gICAgICAgICAgYXR0ZW1wdF9pZDogKG5leHQuYXR0ZW1wdCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkLFxuICAgICAgICAgIHRpY2tldCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGtlcHQgPSByZXMub2sgJiYgKGF3YWl0IHRoaXMucmVsb2FkKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgLi4udGhpcy5zdGF0ZSgpLCBzZXNzaW9uS2VwdDoga2VwdCB9KTtcbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgICAgfSkoKTtcbiAgICB9LCAyXzAwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGxUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XG4gICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbGVhc2UgdGhlIHBvbGwgdGltZXIgYW5kIHRoZSBjYXB0Y2hhIHdpZGdldHMg4oCUIGNhbGwgZnJvbSB0aGUgY29tcG9uZW50J3MgYG5nT25EZXN0cm95YC4gKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgdGhpcy5jYXB0Y2hhLmRlc3Ryb3koKTtcbiAgICB0aGlzLnNpZ25VcENhcHRjaGEuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Output, computed, inject, signal } from '@angular/core';
|
|
2
|
+
import { actorFromClaims } from '@atlasauth/js';
|
|
3
|
+
import { AtlasService } from '../atlas.service';
|
|
4
|
+
import { classFor } from '../appearance';
|
|
5
|
+
import { translate } from '../i18n';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* `<atlas-impersonation-banner>` — shown only while the active session is an
|
|
9
|
+
* impersonation, naming the user acted as, with "Return to admin" (or "End
|
|
10
|
+
* impersonation" when there is no session of the impersonator's to resume).
|
|
11
|
+
* Emits `ended` with the outcome. The Angular peer of React's
|
|
12
|
+
* `<ImpersonationBanner/>`.
|
|
13
|
+
*/
|
|
14
|
+
export class ImpersonationBannerComponent {
|
|
15
|
+
atlas = inject(AtlasService);
|
|
16
|
+
ended = new EventEmitter();
|
|
17
|
+
busy = signal(false);
|
|
18
|
+
actor = computed(() => actorFromClaims(this.atlas.claims()) ?? this.atlas.session()?.actor ?? null);
|
|
19
|
+
canReturn = computed(() => this.actor() !== null && Boolean(this.atlas.session()?.actor_session_id));
|
|
20
|
+
name = computed(() => {
|
|
21
|
+
const u = this.atlas.user();
|
|
22
|
+
return ([u?.first_name, u?.last_name].filter(Boolean).join(' ') ||
|
|
23
|
+
u?.username ||
|
|
24
|
+
u?.email_addresses?.find((e) => e.primary)?.email_address ||
|
|
25
|
+
u?.id ||
|
|
26
|
+
'');
|
|
27
|
+
});
|
|
28
|
+
t(key, vars) {
|
|
29
|
+
return translate(this.atlas.localization, key, vars);
|
|
30
|
+
}
|
|
31
|
+
cls(key, base) {
|
|
32
|
+
return classFor(key, this.atlas.appearance, base);
|
|
33
|
+
}
|
|
34
|
+
async end() {
|
|
35
|
+
this.busy.set(true);
|
|
36
|
+
try {
|
|
37
|
+
this.ended.emit(await this.atlas.endImpersonation());
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
this.busy.set(false);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImpersonationBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
44
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ImpersonationBannerComponent, isStandalone: true, selector: "atlas-impersonation-banner", outputs: { ended: "ended" }, ngImport: i0, template: `
|
|
45
|
+
@if (actor()) {
|
|
46
|
+
<div [class]="cls('card', 'atlas-alert atlas-impersonation-banner')" role="status">
|
|
47
|
+
<span [class]="cls('headerSubtitle', 'atlas-text')">{{ t('impersonation.banner', { name: name() }) }}</span>
|
|
48
|
+
<button type="button" [class]="cls('formButtonPrimary', 'atlas-button')" [disabled]="busy()" (click)="end()">
|
|
49
|
+
{{ canReturn() ? t('impersonation.returnToAdmin') : t('impersonation.end') }}
|
|
50
|
+
</button>
|
|
51
|
+
</div>
|
|
52
|
+
}
|
|
53
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
54
|
+
}
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImpersonationBannerComponent, decorators: [{
|
|
56
|
+
type: Component,
|
|
57
|
+
args: [{
|
|
58
|
+
selector: 'atlas-impersonation-banner',
|
|
59
|
+
standalone: true,
|
|
60
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
61
|
+
template: `
|
|
62
|
+
@if (actor()) {
|
|
63
|
+
<div [class]="cls('card', 'atlas-alert atlas-impersonation-banner')" role="status">
|
|
64
|
+
<span [class]="cls('headerSubtitle', 'atlas-text')">{{ t('impersonation.banner', { name: name() }) }}</span>
|
|
65
|
+
<button type="button" [class]="cls('formButtonPrimary', 'atlas-button')" [disabled]="busy()" (click)="end()">
|
|
66
|
+
{{ canReturn() ? t('impersonation.returnToAdmin') : t('impersonation.end') }}
|
|
67
|
+
</button>
|
|
68
|
+
</div>
|
|
69
|
+
}
|
|
70
|
+
`,
|
|
71
|
+
}]
|
|
72
|
+
}], propDecorators: { ended: [{
|
|
73
|
+
type: Output
|
|
74
|
+
}] } });
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wZXJzb25hdGlvbi1iYW5uZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2ltcGVyc29uYXRpb24tYmFubmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkgsT0FBTyxFQUFFLGVBQWUsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7O0FBRXBDOzs7Ozs7R0FNRztBQWdCSCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3BCLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0IsS0FBSyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO0lBQ25ELElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFckIsS0FBSyxHQUFHLFFBQVEsQ0FDakMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQ2xGLENBQUM7SUFDaUIsU0FBUyxHQUFHLFFBQVEsQ0FDckMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUMvRSxDQUFDO0lBQ2lCLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUNMLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdkQsQ0FBQyxFQUFFLFFBQVE7WUFDWCxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWE7WUFDekQsQ0FBQyxFQUFFLEVBQUU7WUFDTCxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRU8sQ0FBQyxDQUFDLEdBQVcsRUFBRSxJQUE2QjtRQUNwRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVTLEdBQUcsQ0FBQyxHQUFlLEVBQUUsSUFBWTtRQUN6QyxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVTLEtBQUssQ0FBQyxHQUFHO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7d0dBckNVLDRCQUE0Qjs0RkFBNUIsNEJBQTRCLG1IQVg3Qjs7Ozs7Ozs7O0dBU1Q7OzRGQUVVLDRCQUE0QjtrQkFmeEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsNEJBQTRCO29CQUN0QyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRTs7Ozs7Ozs7O0dBU1Q7aUJBQ0Y7OEJBR29CLEtBQUs7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhY3RvckZyb21DbGFpbXMsIHR5cGUgRW5kSW1wZXJzb25hdGlvblJlc3VsdCB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBjbGFzc0ZvciwgdHlwZSBFbGVtZW50S2V5IH0gZnJvbSAnLi4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcblxuLyoqXG4gKiBgPGF0bGFzLWltcGVyc29uYXRpb24tYmFubmVyPmAg4oCUIHNob3duIG9ubHkgd2hpbGUgdGhlIGFjdGl2ZSBzZXNzaW9uIGlzIGFuXG4gKiBpbXBlcnNvbmF0aW9uLCBuYW1pbmcgdGhlIHVzZXIgYWN0ZWQgYXMsIHdpdGggXCJSZXR1cm4gdG8gYWRtaW5cIiAob3IgXCJFbmRcbiAqIGltcGVyc29uYXRpb25cIiB3aGVuIHRoZXJlIGlzIG5vIHNlc3Npb24gb2YgdGhlIGltcGVyc29uYXRvcidzIHRvIHJlc3VtZSkuXG4gKiBFbWl0cyBgZW5kZWRgIHdpdGggdGhlIG91dGNvbWUuIFRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3Qnc1xuICogYDxJbXBlcnNvbmF0aW9uQmFubmVyLz5gLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1pbXBlcnNvbmF0aW9uLWJhbm5lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoYWN0b3IoKSkge1xuICAgICAgPGRpdiBbY2xhc3NdPVwiY2xzKCdjYXJkJywgJ2F0bGFzLWFsZXJ0IGF0bGFzLWltcGVyc29uYXRpb24tYmFubmVyJylcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2hlYWRlclN1YnRpdGxlJywgJ2F0bGFzLXRleHQnKVwiPnt7IHQoJ2ltcGVyc29uYXRpb24uYmFubmVyJywgeyBuYW1lOiBuYW1lKCkgfSkgfX08L3NwYW4+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25QcmltYXJ5JywgJ2F0bGFzLWJ1dHRvbicpXCIgW2Rpc2FibGVkXT1cImJ1c3koKVwiIChjbGljayk9XCJlbmQoKVwiPlxuICAgICAgICAgIHt7IGNhblJldHVybigpID8gdCgnaW1wZXJzb25hdGlvbi5yZXR1cm5Ub0FkbWluJykgOiB0KCdpbXBlcnNvbmF0aW9uLmVuZCcpIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBJbXBlcnNvbmF0aW9uQmFubmVyQ29tcG9uZW50IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBlbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RW5kSW1wZXJzb25hdGlvblJlc3VsdD4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJ1c3kgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBhY3RvciA9IGNvbXB1dGVkKFxuICAgICgpID0+IGFjdG9yRnJvbUNsYWltcyh0aGlzLmF0bGFzLmNsYWltcygpKSA/PyB0aGlzLmF0bGFzLnNlc3Npb24oKT8uYWN0b3IgPz8gbnVsbCxcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhblJldHVybiA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuYWN0b3IoKSAhPT0gbnVsbCAmJiBCb29sZWFuKHRoaXMuYXRsYXMuc2Vzc2lvbigpPy5hY3Rvcl9zZXNzaW9uX2lkKSxcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdSA9IHRoaXMuYXRsYXMudXNlcigpO1xuICAgIHJldHVybiAoXG4gICAgICBbdT8uZmlyc3RfbmFtZSwgdT8ubGFzdF9uYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpIHx8XG4gICAgICB1Py51c2VybmFtZSB8fFxuICAgICAgdT8uZW1haWxfYWRkcmVzc2VzPy5maW5kKChlKSA9PiBlLnByaW1hcnkpPy5lbWFpbF9hZGRyZXNzIHx8XG4gICAgICB1Py5pZCB8fFxuICAgICAgJydcbiAgICApO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZywgdmFycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0cmFuc2xhdGUodGhpcy5hdGxhcy5sb2NhbGl6YXRpb24sIGtleSwgdmFycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xzKGtleTogRWxlbWVudEtleSwgYmFzZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY2xhc3NGb3Ioa2V5LCB0aGlzLmF0bGFzLmFwcGVhcmFuY2UsIGJhc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGVuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVuZGVkLmVtaXQoYXdhaXQgdGhpcy5hdGxhcy5lbmRJbXBlcnNvbmF0aW9uKCkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input, inject, } from '@angular/core';
|
|
2
|
+
import { describeAuditAction } from '@atlasauth/js';
|
|
3
|
+
import { AtlasService } from '../atlas.service';
|
|
4
|
+
import { classFor } from '../appearance';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* `<atlas-organization-audit-log>` — the active organization's audit trail for
|
|
8
|
+
* its admins, next to `<atlas-organization-profile>`. The Angular peer of
|
|
9
|
+
* React's `<OrganizationAuditLog/>`. Renders nothing for a member who may not
|
|
10
|
+
* read it (the server is the authority; the component just follows it). Labels
|
|
11
|
+
* are inputs so an app can localise them.
|
|
12
|
+
*/
|
|
13
|
+
export class OrganizationAuditLogComponent {
|
|
14
|
+
/** Entries per page (the server caps it). */
|
|
15
|
+
pageSize;
|
|
16
|
+
/** Narrow to one action, or a prefix ending in `.`. */
|
|
17
|
+
action;
|
|
18
|
+
labels = {};
|
|
19
|
+
formatDate = (ms) => new Date(ms).toLocaleString();
|
|
20
|
+
atlas = inject(AtlasService);
|
|
21
|
+
/** Created in ngOnInit, once the inputs are set (templates render after it). */
|
|
22
|
+
log;
|
|
23
|
+
ngOnInit() {
|
|
24
|
+
this.log = this.atlas.organizationAuditLog({ pageSize: this.pageSize, action: this.action });
|
|
25
|
+
}
|
|
26
|
+
ngOnDestroy() {
|
|
27
|
+
this.log.destroy();
|
|
28
|
+
}
|
|
29
|
+
describe(action) {
|
|
30
|
+
return describeAuditAction(action);
|
|
31
|
+
}
|
|
32
|
+
cls(key, base) {
|
|
33
|
+
return classFor(key, this.atlas.appearance, base);
|
|
34
|
+
}
|
|
35
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OrganizationAuditLogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
36
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OrganizationAuditLogComponent, isStandalone: true, selector: "atlas-organization-audit-log", inputs: { pageSize: "pageSize", action: "action", labels: "labels", formatDate: "formatDate" }, ngImport: i0, template: `
|
|
37
|
+
@if (atlas.organization() && !log.state().forbidden) {
|
|
38
|
+
<div [class]="cls('card', 'atlas-card')" data-atlas="organization-audit-log">
|
|
39
|
+
<h2 [class]="cls('headerTitle', 'atlas-title')">{{ labels.title ?? 'Audit log' }}</h2>
|
|
40
|
+
@if (log.state().entries.length === 0 && !log.state().loading) {
|
|
41
|
+
<p [class]="cls('headerSubtitle', 'atlas-subtitle')">{{ labels.empty ?? 'No activity recorded yet.' }}</p>
|
|
42
|
+
} @else {
|
|
43
|
+
<ul [class]="cls('list', 'atlas-audit-list')">
|
|
44
|
+
@for (entry of log.state().entries; track entry.id) {
|
|
45
|
+
<li [class]="cls('listItem', 'atlas-audit-item')" [attr.data-action]="entry.action">
|
|
46
|
+
<strong>{{ describe(entry.action) }}</strong>
|
|
47
|
+
<span class="atlas-audit-meta">
|
|
48
|
+
· {{ formatDate(entry.created_at) }}{{ entry.actor.id ? ' · ' + (labels.actor ?? 'by') + ' ' + entry.actor.type + ' ' + entry.actor.id : '' }}
|
|
49
|
+
</span>
|
|
50
|
+
</li>
|
|
51
|
+
}
|
|
52
|
+
</ul>
|
|
53
|
+
}
|
|
54
|
+
@if (log.state().hasMore) {
|
|
55
|
+
<button
|
|
56
|
+
type="button"
|
|
57
|
+
[class]="cls('formButtonSecondary', 'atlas-button-secondary')"
|
|
58
|
+
[disabled]="log.state().loading"
|
|
59
|
+
(click)="log.loadMore()"
|
|
60
|
+
>
|
|
61
|
+
{{ labels.loadMore ?? 'Load more' }}
|
|
62
|
+
</button>
|
|
63
|
+
}
|
|
64
|
+
</div>
|
|
65
|
+
}
|
|
66
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
67
|
+
}
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OrganizationAuditLogComponent, decorators: [{
|
|
69
|
+
type: Component,
|
|
70
|
+
args: [{
|
|
71
|
+
selector: 'atlas-organization-audit-log',
|
|
72
|
+
standalone: true,
|
|
73
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
74
|
+
template: `
|
|
75
|
+
@if (atlas.organization() && !log.state().forbidden) {
|
|
76
|
+
<div [class]="cls('card', 'atlas-card')" data-atlas="organization-audit-log">
|
|
77
|
+
<h2 [class]="cls('headerTitle', 'atlas-title')">{{ labels.title ?? 'Audit log' }}</h2>
|
|
78
|
+
@if (log.state().entries.length === 0 && !log.state().loading) {
|
|
79
|
+
<p [class]="cls('headerSubtitle', 'atlas-subtitle')">{{ labels.empty ?? 'No activity recorded yet.' }}</p>
|
|
80
|
+
} @else {
|
|
81
|
+
<ul [class]="cls('list', 'atlas-audit-list')">
|
|
82
|
+
@for (entry of log.state().entries; track entry.id) {
|
|
83
|
+
<li [class]="cls('listItem', 'atlas-audit-item')" [attr.data-action]="entry.action">
|
|
84
|
+
<strong>{{ describe(entry.action) }}</strong>
|
|
85
|
+
<span class="atlas-audit-meta">
|
|
86
|
+
· {{ formatDate(entry.created_at) }}{{ entry.actor.id ? ' · ' + (labels.actor ?? 'by') + ' ' + entry.actor.type + ' ' + entry.actor.id : '' }}
|
|
87
|
+
</span>
|
|
88
|
+
</li>
|
|
89
|
+
}
|
|
90
|
+
</ul>
|
|
91
|
+
}
|
|
92
|
+
@if (log.state().hasMore) {
|
|
93
|
+
<button
|
|
94
|
+
type="button"
|
|
95
|
+
[class]="cls('formButtonSecondary', 'atlas-button-secondary')"
|
|
96
|
+
[disabled]="log.state().loading"
|
|
97
|
+
(click)="log.loadMore()"
|
|
98
|
+
>
|
|
99
|
+
{{ labels.loadMore ?? 'Load more' }}
|
|
100
|
+
</button>
|
|
101
|
+
}
|
|
102
|
+
</div>
|
|
103
|
+
}
|
|
104
|
+
`,
|
|
105
|
+
}]
|
|
106
|
+
}], propDecorators: { pageSize: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], action: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], labels: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], formatDate: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}] } });
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uLWF1ZGl0LWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pemF0aW9uLWF1ZGl0LWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQW1CLE1BQU0sZUFBZSxDQUFDOztBQUcxRDs7Ozs7O0dBTUc7QUFxQ0gsTUFBTSxPQUFPLDZCQUE2QjtJQUN4Qyw2Q0FBNkM7SUFDcEMsUUFBUSxDQUFVO0lBQzNCLHVEQUF1RDtJQUM5QyxNQUFNLENBQVU7SUFDaEIsTUFBTSxHQUEwRSxFQUFFLENBQUM7SUFDbkYsVUFBVSxHQUEyQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7SUFFakUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRCxnRkFBZ0Y7SUFDdEUsR0FBRyxDQUE2QjtJQUUxQyxRQUFRO1FBQ04sSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRVMsUUFBUSxDQUFDLE1BQWM7UUFDL0IsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRVMsR0FBRyxDQUFDLEdBQWUsRUFBRSxJQUFZO1FBQ3pDLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO3dHQTFCVSw2QkFBNkI7NEZBQTdCLDZCQUE2Qix3TEFoQzlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4QlQ7OzRGQUVVLDZCQUE2QjtrQkFwQ3pDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDhCQUE4QjtvQkFDeEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCVDtpQkFDRjs4QkFHVSxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIHR5cGUgT25EZXN0cm95LFxuICB0eXBlIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZXNjcmliZUF1ZGl0QWN0aW9uIH0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBBdGxhc1NlcnZpY2UgfSBmcm9tICcuLi9hdGxhcy5zZXJ2aWNlJztcbmltcG9ydCB7IGNsYXNzRm9yLCB0eXBlIEVsZW1lbnRLZXkgfSBmcm9tICcuLi9hcHBlYXJhbmNlJztcbmltcG9ydCB0eXBlIHsgQXRsYXNPcmdhbml6YXRpb25BdWRpdExvZyB9IGZyb20gJy4vb3JnYW5pemF0aW9uLWF1ZGl0LWxvZyc7XG5cbi8qKlxuICogYDxhdGxhcy1vcmdhbml6YXRpb24tYXVkaXQtbG9nPmAg4oCUIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uJ3MgYXVkaXQgdHJhaWwgZm9yXG4gKiBpdHMgYWRtaW5zLCBuZXh0IHRvIGA8YXRsYXMtb3JnYW5pemF0aW9uLXByb2ZpbGU+YC4gVGhlIEFuZ3VsYXIgcGVlciBvZlxuICogUmVhY3QncyBgPE9yZ2FuaXphdGlvbkF1ZGl0TG9nLz5gLiBSZW5kZXJzIG5vdGhpbmcgZm9yIGEgbWVtYmVyIHdobyBtYXkgbm90XG4gKiByZWFkIGl0ICh0aGUgc2VydmVyIGlzIHRoZSBhdXRob3JpdHk7IHRoZSBjb21wb25lbnQganVzdCBmb2xsb3dzIGl0KS4gTGFiZWxzXG4gKiBhcmUgaW5wdXRzIHNvIGFuIGFwcCBjYW4gbG9jYWxpc2UgdGhlbS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXRsYXMtb3JnYW5pemF0aW9uLWF1ZGl0LWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoYXRsYXMub3JnYW5pemF0aW9uKCkgJiYgIWxvZy5zdGF0ZSgpLmZvcmJpZGRlbikge1xuICAgICAgPGRpdiBbY2xhc3NdPVwiY2xzKCdjYXJkJywgJ2F0bGFzLWNhcmQnKVwiIGRhdGEtYXRsYXM9XCJvcmdhbml6YXRpb24tYXVkaXQtbG9nXCI+XG4gICAgICAgIDxoMiBbY2xhc3NdPVwiY2xzKCdoZWFkZXJUaXRsZScsICdhdGxhcy10aXRsZScpXCI+e3sgbGFiZWxzLnRpdGxlID8/ICdBdWRpdCBsb2cnIH19PC9oMj5cbiAgICAgICAgQGlmIChsb2cuc3RhdGUoKS5lbnRyaWVzLmxlbmd0aCA9PT0gMCAmJiAhbG9nLnN0YXRlKCkubG9hZGluZykge1xuICAgICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2hlYWRlclN1YnRpdGxlJywgJ2F0bGFzLXN1YnRpdGxlJylcIj57eyBsYWJlbHMuZW1wdHkgPz8gJ05vIGFjdGl2aXR5IHJlY29yZGVkIHlldC4nIH19PC9wPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8dWwgW2NsYXNzXT1cImNscygnbGlzdCcsICdhdGxhcy1hdWRpdC1saXN0JylcIj5cbiAgICAgICAgICAgIEBmb3IgKGVudHJ5IG9mIGxvZy5zdGF0ZSgpLmVudHJpZXM7IHRyYWNrIGVudHJ5LmlkKSB7XG4gICAgICAgICAgICAgIDxsaSBbY2xhc3NdPVwiY2xzKCdsaXN0SXRlbScsICdhdGxhcy1hdWRpdC1pdGVtJylcIiBbYXR0ci5kYXRhLWFjdGlvbl09XCJlbnRyeS5hY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IGRlc2NyaWJlKGVudHJ5LmFjdGlvbikgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0bGFzLWF1ZGl0LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgIMK3IHt7IGZvcm1hdERhdGUoZW50cnkuY3JlYXRlZF9hdCkgfX17eyBlbnRyeS5hY3Rvci5pZCA/ICcgwrcgJyArIChsYWJlbHMuYWN0b3IgPz8gJ2J5JykgKyAnICcgKyBlbnRyeS5hY3Rvci50eXBlICsgJyAnICsgZW50cnkuYWN0b3IuaWQgOiAnJyB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobG9nLnN0YXRlKCkuaGFzTW9yZSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvZy5zdGF0ZSgpLmxvYWRpbmdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImxvZy5sb2FkTW9yZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBsYWJlbHMubG9hZE1vcmUgPz8gJ0xvYWQgbW9yZScgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBPcmdhbml6YXRpb25BdWRpdExvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIEVudHJpZXMgcGVyIHBhZ2UgKHRoZSBzZXJ2ZXIgY2FwcyBpdCkuICovXG4gIEBJbnB1dCgpIHBhZ2VTaXplPzogbnVtYmVyO1xuICAvKiogTmFycm93IHRvIG9uZSBhY3Rpb24sIG9yIGEgcHJlZml4IGVuZGluZyBpbiBgLmAuICovXG4gIEBJbnB1dCgpIGFjdGlvbj86IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWxzOiB7IHRpdGxlPzogc3RyaW5nOyBlbXB0eT86IHN0cmluZzsgbG9hZE1vcmU/OiBzdHJpbmc7IGFjdG9yPzogc3RyaW5nIH0gPSB7fTtcbiAgQElucHV0KCkgZm9ybWF0RGF0ZTogKG1zOiBudW1iZXIpID0+IHN0cmluZyA9IChtcykgPT4gbmV3IERhdGUobXMpLnRvTG9jYWxlU3RyaW5nKCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG4gIC8qKiBDcmVhdGVkIGluIG5nT25Jbml0LCBvbmNlIHRoZSBpbnB1dHMgYXJlIHNldCAodGVtcGxhdGVzIHJlbmRlciBhZnRlciBpdCkuICovXG4gIHByb3RlY3RlZCBsb2chOiBBdGxhc09yZ2FuaXphdGlvbkF1ZGl0TG9nO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9nID0gdGhpcy5hdGxhcy5vcmdhbml6YXRpb25BdWRpdExvZyh7IHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLCBhY3Rpb246IHRoaXMuYWN0aW9uIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5sb2cuZGVzdHJveSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc2NyaWJlKGFjdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGVzY3JpYmVBdWRpdEFjdGlvbihhY3Rpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { signal } from '@angular/core';
|
|
2
|
+
import { distinctUntilChanged, map } from 'rxjs/operators';
|
|
3
|
+
import { createOrganizationAuditLog, } from '@atlasauth/js';
|
|
4
|
+
/**
|
|
5
|
+
* The active organization's audit trail, for its admins — the engine behind
|
|
6
|
+
* `<atlas-organization-audit-log>` and `AtlasService.organizationAuditLog()`
|
|
7
|
+
* (the Angular peer of React's `useOrganizationAuditLog`). `state` is a signal
|
|
8
|
+
* of `{ entries, loading, forbidden, hasMore }`, one page at a time, newest
|
|
9
|
+
* first. It follows the active organization until {@link destroy}.
|
|
10
|
+
*/
|
|
11
|
+
export class AtlasOrganizationAuditLog {
|
|
12
|
+
_state;
|
|
13
|
+
log;
|
|
14
|
+
unsubscribe;
|
|
15
|
+
organizationSub;
|
|
16
|
+
state;
|
|
17
|
+
constructor(client, organization$, options = {}) {
|
|
18
|
+
this.log = createOrganizationAuditLog(client, options);
|
|
19
|
+
this._state = signal(this.log.getState());
|
|
20
|
+
this.state = this._state.asReadonly();
|
|
21
|
+
this.unsubscribe = this.log.subscribe((next) => this._state.set(next));
|
|
22
|
+
this.organizationSub = organization$
|
|
23
|
+
.pipe(map((membership) => membership?.organization.id ?? null), distinctUntilChanged())
|
|
24
|
+
.subscribe((id) => void this.log.load(id));
|
|
25
|
+
}
|
|
26
|
+
/** Append the next page, when there is one. */
|
|
27
|
+
loadMore() {
|
|
28
|
+
return this.log.loadMore();
|
|
29
|
+
}
|
|
30
|
+
/** Re-read from the newest entry. */
|
|
31
|
+
reload() {
|
|
32
|
+
return this.log.reload();
|
|
33
|
+
}
|
|
34
|
+
/** Stop following the active organization. */
|
|
35
|
+
destroy() {
|
|
36
|
+
this.organizationSub.unsubscribe();
|
|
37
|
+
this.unsubscribe();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uLWF1ZGl0LWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbml6YXRpb24tYXVkaXQtbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBRXpFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsMEJBQTBCLEdBSzNCLE1BQU0sZUFBZSxDQUFDO0FBR3ZCOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsTUFBTSxDQUE0QztJQUNsRCxHQUFHLENBQWlDO0lBQ3BDLFdBQVcsQ0FBYTtJQUN4QixlQUFlLENBQWU7SUFFdEMsS0FBSyxDQUFvQztJQUVsRCxZQUNFLE1BQStCLEVBQy9CLGFBQTZELEVBQzdELFVBQXVDLEVBQUU7UUFFekMsSUFBSSxDQUFDLEdBQUcsR0FBRywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxlQUFlLEdBQUcsYUFBYTthQUNqQyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFDeEQsb0JBQW9CLEVBQUUsQ0FDdkI7YUFDQSxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsK0NBQStDO0lBQy9DLFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsT0FBTztRQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25hbCwgdHlwZSBTaWduYWwsIHR5cGUgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlT3JnYW5pemF0aW9uQXVkaXRMb2csXG4gIHR5cGUgRmFwaUNsaWVudCxcbiAgdHlwZSBPcmdhbml6YXRpb25BdWRpdExvZ0NvbnRyb2xsZXIsXG4gIHR5cGUgT3JnYW5pemF0aW9uQXVkaXRMb2dPcHRpb25zLFxuICB0eXBlIE9yZ2FuaXphdGlvbkF1ZGl0TG9nU3RhdGUsXG59IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHR5cGUgeyBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGFjdGl2ZSBvcmdhbml6YXRpb24ncyBhdWRpdCB0cmFpbCwgZm9yIGl0cyBhZG1pbnMg4oCUIHRoZSBlbmdpbmUgYmVoaW5kXG4gKiBgPGF0bGFzLW9yZ2FuaXphdGlvbi1hdWRpdC1sb2c+YCBhbmQgYEF0bGFzU2VydmljZS5vcmdhbml6YXRpb25BdWRpdExvZygpYFxuICogKHRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3QncyBgdXNlT3JnYW5pemF0aW9uQXVkaXRMb2dgKS4gYHN0YXRlYCBpcyBhIHNpZ25hbFxuICogb2YgYHsgZW50cmllcywgbG9hZGluZywgZm9yYmlkZGVuLCBoYXNNb3JlIH1gLCBvbmUgcGFnZSBhdCBhIHRpbWUsIG5ld2VzdFxuICogZmlyc3QuIEl0IGZvbGxvd3MgdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gdW50aWwge0BsaW5rIGRlc3Ryb3l9LlxuICovXG5leHBvcnQgY2xhc3MgQXRsYXNPcmdhbml6YXRpb25BdWRpdExvZyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXRlOiBXcml0YWJsZVNpZ25hbDxPcmdhbml6YXRpb25BdWRpdExvZ1N0YXRlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2c6IE9yZ2FuaXphdGlvbkF1ZGl0TG9nQ29udHJvbGxlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcmdhbml6YXRpb25TdWI6IFN1YnNjcmlwdGlvbjtcblxuICByZWFkb25seSBzdGF0ZTogU2lnbmFsPE9yZ2FuaXphdGlvbkF1ZGl0TG9nU3RhdGU+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogUGljazxGYXBpQ2xpZW50LCAnZ2V0Jz4sXG4gICAgb3JnYW5pemF0aW9uJDogT2JzZXJ2YWJsZTxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfCBudWxsPixcbiAgICBvcHRpb25zOiBPcmdhbml6YXRpb25BdWRpdExvZ09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5sb2cgPSBjcmVhdGVPcmdhbml6YXRpb25BdWRpdExvZyhjbGllbnQsIG9wdGlvbnMpO1xuICAgIHRoaXMuX3N0YXRlID0gc2lnbmFsKHRoaXMubG9nLmdldFN0YXRlKCkpO1xuICAgIHRoaXMuc3RhdGUgPSB0aGlzLl9zdGF0ZS5hc1JlYWRvbmx5KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSA9IHRoaXMubG9nLnN1YnNjcmliZSgobmV4dCkgPT4gdGhpcy5fc3RhdGUuc2V0KG5leHQpKTtcbiAgICB0aGlzLm9yZ2FuaXphdGlvblN1YiA9IG9yZ2FuaXphdGlvbiRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKG1lbWJlcnNoaXApID0+IG1lbWJlcnNoaXA/Lm9yZ2FuaXphdGlvbi5pZCA/PyBudWxsKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGlkKSA9PiB2b2lkIHRoaXMubG9nLmxvYWQoaWQpKTtcbiAgfVxuXG4gIC8qKiBBcHBlbmQgdGhlIG5leHQgcGFnZSwgd2hlbiB0aGVyZSBpcyBvbmUuICovXG4gIGxvYWRNb3JlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmxvZy5sb2FkTW9yZSgpO1xuICB9XG5cbiAgLyoqIFJlLXJlYWQgZnJvbSB0aGUgbmV3ZXN0IGVudHJ5LiAqL1xuICByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMubG9nLnJlbG9hZCgpO1xuICB9XG5cbiAgLyoqIFN0b3AgZm9sbG93aW5nIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uLiAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub3JnYW5pemF0aW9uU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
|