@kolektor/nucleus-identity 0.0.12-pre.7931 → 0.1.0-pre.128
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/README.md +4 -0
- package/esm2022/index.mjs +7 -0
- package/esm2022/kolektor-nucleus-identity.mjs +5 -0
- package/esm2022/lib/models/client-registration.mjs +8 -0
- package/esm2022/lib/models/device-code.mjs +19 -0
- package/esm2022/lib/models/identity.mjs +52 -0
- package/esm2022/lib/models/otp.mjs +11 -0
- package/esm2022/lib/models/service-principal.mjs +16 -0
- package/esm2022/lib/nucleus-identity-config.mjs +7 -0
- package/esm2022/lib/nucleus-identity.module.mjs +32 -0
- package/esm2022/lib/nucleus-identity.service.mjs +350 -0
- package/esm2022/lib/nucleus-token-interceptor.service.mjs +69 -0
- package/esm2022/lib/utils/angular-requestor.mjs +44 -0
- package/esm2022/lib/utils/authorization-service-configuration.mjs +28 -0
- package/esm2022/lib/utils/location.service.mjs +72 -0
- package/esm2022/lib/utils/nucleus-authorization-notifier.mjs +15 -0
- package/esm2022/lib/utils/oidc-configuration.service.mjs +95 -0
- package/esm2022/lib/utils/secrets-store.mjs +120 -0
- package/esm2022/lib/utils/token-client.mjs +140 -0
- package/{fesm2020 → fesm2022}/kolektor-nucleus-identity.mjs +980 -1012
- package/fesm2022/kolektor-nucleus-identity.mjs.map +1 -0
- package/index.d.ts +6 -5
- package/lib/models/client-registration.d.ts +11 -11
- package/lib/models/device-code.d.ts +19 -19
- package/lib/models/identity.d.ts +14 -14
- package/lib/models/otp.d.ts +14 -14
- package/lib/models/service-principal.d.ts +12 -12
- package/lib/nucleus-identity-config.d.ts +12 -12
- package/lib/nucleus-identity.module.d.ts +9 -9
- package/lib/nucleus-identity.service.d.ts +63 -63
- package/lib/nucleus-token-interceptor.service.d.ts +19 -19
- package/lib/utils/angular-requestor.d.ts +11 -11
- package/lib/utils/authorization-service-configuration.d.ts +12 -12
- package/lib/utils/location.service.d.ts +25 -25
- package/lib/utils/nucleus-authorization-notifier.d.ts +9 -9
- package/lib/utils/oidc-configuration.service.d.ts +23 -23
- package/lib/utils/secrets-store.d.ts +33 -33
- package/lib/utils/token-client.d.ts +23 -23
- package/package.json +29 -33
- package/esm2020/kolektor-nucleus-identity.mjs +0 -5
- package/esm2020/lib/models/client-registration.mjs +0 -8
- package/esm2020/lib/models/device-code.mjs +0 -19
- package/esm2020/lib/models/identity.mjs +0 -49
- package/esm2020/lib/models/otp.mjs +0 -11
- package/esm2020/lib/models/service-principal.mjs +0 -16
- package/esm2020/lib/nucleus-identity-config.mjs +0 -8
- package/esm2020/lib/nucleus-identity.module.mjs +0 -28
- package/esm2020/lib/nucleus-identity.service.mjs +0 -341
- package/esm2020/lib/nucleus-token-interceptor.service.mjs +0 -64
- package/esm2020/lib/utils/angular-requestor.mjs +0 -38
- package/esm2020/lib/utils/authorization-service-configuration.mjs +0 -23
- package/esm2020/lib/utils/location.service.mjs +0 -72
- package/esm2020/lib/utils/nucleus-authorization-notifier.mjs +0 -13
- package/esm2020/lib/utils/nucleus-crypto.mjs +0 -68
- package/esm2020/lib/utils/oidc-configuration.service.mjs +0 -90
- package/esm2020/lib/utils/secrets-store.mjs +0 -120
- package/esm2020/lib/utils/token-client.mjs +0 -140
- package/esm2020/public-api.mjs +0 -11
- package/fesm2015/kolektor-nucleus-identity.mjs +0 -1139
- package/fesm2015/kolektor-nucleus-identity.mjs.map +0 -1
- package/fesm2020/kolektor-nucleus-identity.mjs.map +0 -1
- package/lib/utils/nucleus-crypto.d.ts +0 -9
- package/public-api.d.ts +0 -7
package/README.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './lib/nucleus-identity.module';
|
|
2
|
+
export * from './lib/nucleus-identity.service';
|
|
3
|
+
export * from './lib/nucleus-identity-config';
|
|
4
|
+
export { OtpResponse, OtpStatus, OtpType } from './lib/models/otp';
|
|
5
|
+
export { DeviceCode } from './lib/models/device-code';
|
|
6
|
+
export { ServicePrincipalRegistrationStatus } from './lib/models/service-principal';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL251Y2xldXMtaWRlbnRpdHkubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL251Y2xldXMtaWRlbnRpdHkuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9udWNsZXVzLWlkZW50aXR5LWNvbmZpZyc7XG5leHBvcnQgeyBPdHBSZXNwb25zZSwgT3RwU3RhdHVzLCBPdHBUeXBlIH0gZnJvbSAnLi9saWIvbW9kZWxzL290cCc7XG5leHBvcnQgeyBEZXZpY2VDb2RlIH0gZnJvbSAnLi9saWIvbW9kZWxzL2RldmljZS1jb2RlJztcbmV4cG9ydCB7IFNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb25TdGF0dXMgfSBmcm9tICcuL2xpYi9tb2RlbHMvc2VydmljZS1wcmluY2lwYWwnO1xuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia29sZWt0b3ItbnVjbGV1cy1pZGVudGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmcvbnVjbGV1cy1pZGVudGl0eS9zcmMva29sZWt0b3ItbnVjbGV1cy1pZGVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export class ClientRegistrationResponse {
|
|
2
|
+
constructor(response) {
|
|
3
|
+
this.clientId = response.client_id;
|
|
4
|
+
this.clientSecret = response.client_secret;
|
|
5
|
+
this.secretExpirationDate = new Date(response.client_secret_expires_at * 1000);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXJlZ2lzdHJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmcvbnVjbGV1cy1pZGVudGl0eS9zcmMvbGliL21vZGVscy9jbGllbnQtcmVnaXN0cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE1BQU0sT0FBTywwQkFBMEI7SUFDckMsWUFBWSxRQUF3QztRQUNsRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLElBQUksQ0FDbEMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FDekMsQ0FBQztJQUNKLENBQUM7Q0FLRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UmVnaXN0cmF0aW9uUmVzcG9uc2VKc29uIHtcbiAgY2xpZW50X2lkOiBzdHJpbmc7XG4gIGNsaWVudF9zZWNyZXQ6IHN0cmluZztcbiAgY2xpZW50X3NlY3JldF9leHBpcmVzX2F0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBDbGllbnRSZWdpc3RyYXRpb25SZXNwb25zZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBDbGllbnRSZWdpc3RyYXRpb25SZXNwb25zZUpzb24pIHtcbiAgICB0aGlzLmNsaWVudElkID0gcmVzcG9uc2UuY2xpZW50X2lkO1xuICAgIHRoaXMuY2xpZW50U2VjcmV0ID0gcmVzcG9uc2UuY2xpZW50X3NlY3JldDtcbiAgICB0aGlzLnNlY3JldEV4cGlyYXRpb25EYXRlID0gbmV3IERhdGUoXG4gICAgICByZXNwb25zZS5jbGllbnRfc2VjcmV0X2V4cGlyZXNfYXQgKiAxMDAwXG4gICAgKTtcbiAgfVxuXG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICBzZWNyZXRFeHBpcmF0aW9uRGF0ZTogRGF0ZTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { nowInSeconds } from '@openid/appauth';
|
|
2
|
+
export class DeviceCode {
|
|
3
|
+
constructor(response) {
|
|
4
|
+
this.deviceCode = response.device_code;
|
|
5
|
+
this.userCode = response.user_code;
|
|
6
|
+
this.verificationUrl = response.verification_uri;
|
|
7
|
+
this.verificationUrlComplete = response.verification_uri_complete;
|
|
8
|
+
this.expiresIn = parseInt(response.expires_in, 10);
|
|
9
|
+
this.issuedAt = nowInSeconds();
|
|
10
|
+
}
|
|
11
|
+
isExpired(buffer = 60) {
|
|
12
|
+
return this.secondsLeft(buffer) <= 0;
|
|
13
|
+
}
|
|
14
|
+
secondsLeft(buffer = 60) {
|
|
15
|
+
const now = nowInSeconds();
|
|
16
|
+
return this.issuedAt + this.expiresIn - buffer - now;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWNvZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9tb2RlbHMvZGV2aWNlLWNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBVy9DLE1BQU0sT0FBTyxVQUFVO0lBQ3JCLFlBQVksUUFBd0I7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsUUFBUSxDQUFDLHlCQUF5QixDQUFDO1FBQ2xFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBVUQsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFNLEdBQUcsRUFBRTtRQUNyQixNQUFNLEdBQUcsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ3ZELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vd0luU2Vjb25kcyB9IGZyb20gJ0BvcGVuaWQvYXBwYXV0aCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2aWNlQ29kZUpzb24ge1xuICBkZXZpY2VfY29kZTogc3RyaW5nO1xuICB1c2VyX2NvZGU6IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uX3VyaTogc3RyaW5nO1xuICB2ZXJpZmljYXRpb25fdXJpX2NvbXBsZXRlOiBzdHJpbmc7XG4gIGV4cGlyZXNfaW46IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRGV2aWNlQ29kZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBEZXZpY2VDb2RlSnNvbikge1xuICAgIHRoaXMuZGV2aWNlQ29kZSA9IHJlc3BvbnNlLmRldmljZV9jb2RlO1xuICAgIHRoaXMudXNlckNvZGUgPSByZXNwb25zZS51c2VyX2NvZGU7XG4gICAgdGhpcy52ZXJpZmljYXRpb25VcmwgPSByZXNwb25zZS52ZXJpZmljYXRpb25fdXJpO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uVXJsQ29tcGxldGUgPSByZXNwb25zZS52ZXJpZmljYXRpb25fdXJpX2NvbXBsZXRlO1xuICAgIHRoaXMuZXhwaXJlc0luID0gcGFyc2VJbnQocmVzcG9uc2UuZXhwaXJlc19pbiwgMTApO1xuICAgIHRoaXMuaXNzdWVkQXQgPSBub3dJblNlY29uZHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwaXJlc0luOiBudW1iZXI7XG4gIHByaXZhdGUgaXNzdWVkQXQ6IG51bWJlcjtcblxuICBwdWJsaWMgZGV2aWNlQ29kZTogc3RyaW5nO1xuICBwdWJsaWMgdXNlckNvZGU6IHN0cmluZztcbiAgcHVibGljIHZlcmlmaWNhdGlvblVybDogc3RyaW5nO1xuICBwdWJsaWMgdmVyaWZpY2F0aW9uVXJsQ29tcGxldGU6IHN0cmluZztcblxuICBpc0V4cGlyZWQoYnVmZmVyID0gNjApIHtcbiAgICByZXR1cm4gdGhpcy5zZWNvbmRzTGVmdChidWZmZXIpIDw9IDA7XG4gIH1cblxuICBzZWNvbmRzTGVmdChidWZmZXIgPSA2MCkge1xuICAgIGNvbnN0IG5vdyA9IG5vd0luU2Vjb25kcygpO1xuICAgIHJldHVybiB0aGlzLmlzc3VlZEF0ICsgdGhpcy5leHBpcmVzSW4gLSBidWZmZXIgLSBub3c7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export class Claim {
|
|
2
|
+
constructor(name, values) {
|
|
3
|
+
this.name = name;
|
|
4
|
+
this.values = values;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class Identity {
|
|
8
|
+
constructor(res) {
|
|
9
|
+
this.claims = [];
|
|
10
|
+
if (!res.idToken) {
|
|
11
|
+
throw Error("There is no id token in the token response!");
|
|
12
|
+
}
|
|
13
|
+
const token = this.decodeToken(res.idToken);
|
|
14
|
+
this.name = token.name;
|
|
15
|
+
this.subject = token.sub;
|
|
16
|
+
for (const key in token) {
|
|
17
|
+
if ({}.hasOwnProperty.call(token, key)) {
|
|
18
|
+
let vals = token[key];
|
|
19
|
+
if (!Array.isArray(vals)) {
|
|
20
|
+
vals = [vals];
|
|
21
|
+
}
|
|
22
|
+
const claim = new Claim(key, vals);
|
|
23
|
+
this.claims.push(claim);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
decodeToken(jwt) {
|
|
29
|
+
if (!jwt) {
|
|
30
|
+
throw new Error('NucleusIdentity: There was no identity token in the response!');
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const arr = jwt.split('.');
|
|
34
|
+
// var header = arr[0];
|
|
35
|
+
const payload = this.b64DecodeUnicode(arr[1]);
|
|
36
|
+
// var signature = arr[2];
|
|
37
|
+
return JSON.parse(payload);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error('Error while decoding identity token', error);
|
|
41
|
+
console.error('Error while decoding identity token JWT', jwt);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
b64DecodeUnicode(str) {
|
|
45
|
+
str = str.replace(/-/g, '+').replace(/_/g, '/'); // Qlector fix :)
|
|
46
|
+
return decodeURIComponent(atob(str)
|
|
47
|
+
.split('')
|
|
48
|
+
.map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
|
|
49
|
+
.join(''));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9tb2RlbHMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLEtBQUs7SUFJaEIsWUFBWSxJQUFZLEVBQUUsTUFBZ0I7UUFDeEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFFBQVE7SUFNbkIsWUFBWSxHQUFrQjtRQUZ2QixXQUFNLEdBQVksRUFBRSxDQUFDO1FBRzFCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO1lBQ2hCLE1BQU0sS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDNUQ7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFO1lBQ3ZCLElBQUksRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUN0QyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRXRCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN4QixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDZjtnQkFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3pCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsOERBQThEO0lBQ3RELFdBQVcsQ0FBQyxHQUFXO1FBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxDQUNoRSxDQUFDO1NBQ0g7UUFFRCxJQUFJO1lBQ0YsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQix1QkFBdUI7WUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLDBCQUEwQjtZQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ2xDLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO1FBQ2xFLE9BQU8sa0JBQWtCLENBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUM7YUFDTixLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQ1osQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuUmVzcG9uc2UgfSBmcm9tICdAb3BlbmlkL2FwcGF1dGgnO1xuXG5leHBvcnQgY2xhc3MgQ2xhaW0ge1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgdmFsdWVzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eSB7XG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBzdWJqZWN0OiBzdHJpbmc7XG5cbiAgcHVibGljIGNsYWltczogQ2xhaW1bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHJlczogVG9rZW5SZXNwb25zZSkge1xuICAgIGlmICghcmVzLmlkVG9rZW4pIHtcbiAgICAgIHRocm93IEVycm9yKFwiVGhlcmUgaXMgbm8gaWQgdG9rZW4gaW4gdGhlIHRva2VuIHJlc3BvbnNlIVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZGVjb2RlVG9rZW4ocmVzLmlkVG9rZW4pO1xuXG4gICAgdGhpcy5uYW1lID0gdG9rZW4ubmFtZTtcbiAgICB0aGlzLnN1YmplY3QgPSB0b2tlbi5zdWI7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdG9rZW4pIHtcbiAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRva2VuLCBrZXkpKSB7XG4gICAgICAgIGxldCB2YWxzID0gdG9rZW5ba2V5XTtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFscykpIHtcbiAgICAgICAgICB2YWxzID0gW3ZhbHNdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhaW0gPSBuZXcgQ2xhaW0oa2V5LCB2YWxzKTtcbiAgICAgICAgdGhpcy5jbGFpbXMucHVzaChjbGFpbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBkZWNvZGVUb2tlbihqd3Q6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFqd3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ051Y2xldXNJZGVudGl0eTogVGhlcmUgd2FzIG5vIGlkZW50aXR5IHRva2VuIGluIHRoZSByZXNwb25zZSEnXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcnIgPSBqd3Quc3BsaXQoJy4nKTtcbiAgICAgIC8vIHZhciBoZWFkZXIgPSBhcnJbMF07XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5iNjREZWNvZGVVbmljb2RlKGFyclsxXSk7XG4gICAgICAvLyB2YXIgc2lnbmF0dXJlID0gYXJyWzJdO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UocGF5bG9hZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGRlY29kaW5nIGlkZW50aXR5IHRva2VuJywgZXJyb3IpO1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgZGVjb2RpbmcgaWRlbnRpdHkgdG9rZW4gSldUJywgand0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGI2NERlY29kZVVuaWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTsgLy8gUWxlY3RvciBmaXggOilcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KFxuICAgICAgYXRvYihzdHIpXG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoYykgPT4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMikpXG4gICAgICAgIC5qb2luKCcnKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class OtpResponse {
|
|
2
|
+
}
|
|
3
|
+
export class OtpStatus {
|
|
4
|
+
}
|
|
5
|
+
export var OtpType;
|
|
6
|
+
(function (OtpType) {
|
|
7
|
+
OtpType[OtpType["SimpleNumbers"] = 0] = "SimpleNumbers";
|
|
8
|
+
OtpType[OtpType["SimpleAlfanumeric"] = 1] = "SimpleAlfanumeric";
|
|
9
|
+
OtpType[OtpType["Complex"] = 2] = "Complex";
|
|
10
|
+
})(OtpType || (OtpType = {}));
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy9udWNsZXVzLWlkZW50aXR5L3NyYy9saWIvbW9kZWxzL290cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sV0FBVztDQUd2QjtBQUVELE1BQU0sT0FBTyxTQUFTO0NBSXJCO0FBRUQsTUFBTSxDQUFOLElBQVksT0FJWDtBQUpELFdBQVksT0FBTztJQUNqQix1REFBaUIsQ0FBQTtJQUNqQiwrREFBcUIsQ0FBQTtJQUNyQiwyQ0FBVyxDQUFBO0FBQ2IsQ0FBQyxFQUpXLE9BQU8sS0FBUCxPQUFPLFFBSWxCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIE90cFJlc3BvbnNlIHtcbiAgcHVibGljIHBhc3N3b3JkITogc3RyaW5nO1xuICBwdWJsaWMgcGFzc3dvcmRJZCE6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE90cFN0YXR1cyB7XG4gIHB1YmxpYyBpc0V4cGlyZWQhOiBib29sZWFuO1xuICBwdWJsaWMgaXNVc2VkITogYm9vbGVhbjtcbiAgcHVibGljIHNlY29uZHNUb0V4cGlyYXRpb24hOiBudW1iZXI7XG59XG5cbmV4cG9ydCBlbnVtIE90cFR5cGUge1xuICBTaW1wbGVOdW1iZXJzID0gMCxcbiAgU2ltcGxlQWxmYW51bWVyaWMgPSAxLFxuICBDb21wbGV4ID0gMixcbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export class ServicePrincipal {
|
|
2
|
+
}
|
|
3
|
+
export class ServicePrincipalRegistrationStatus {
|
|
4
|
+
constructor(servicePrincipal) {
|
|
5
|
+
this.isRegistered = false;
|
|
6
|
+
if (servicePrincipal) {
|
|
7
|
+
this.isRegistered = true;
|
|
8
|
+
this.id = servicePrincipal.id;
|
|
9
|
+
this.expiresAt = servicePrincipal.expiresAt;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
get isExpired() {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1wcmluY2lwYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9tb2RlbHMvc2VydmljZS1wcmluY2lwYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGdCQUFnQjtDQUk1QjtBQUVELE1BQU0sT0FBTyxrQ0FBa0M7SUFLN0MsWUFBWSxnQkFBeUM7UUFIOUMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFJMUIsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsRUFBRSxHQUFHLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU2VydmljZVByaW5jaXBhbCB7XG4gIHB1YmxpYyBpZCE6IHN0cmluZztcbiAgcHVibGljIHNlY3JldCE6IHN0cmluZztcbiAgcHVibGljIGV4cGlyZXNBdCE6IERhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlUHJpbmNpcGFsUmVnaXN0cmF0aW9uU3RhdHVzIHtcbiAgcHVibGljIGlkITogc3RyaW5nO1xuICBwdWJsaWMgaXNSZWdpc3RlcmVkID0gZmFsc2U7XG4gIHB1YmxpYyBleHBpcmVzQXQhOiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNlcnZpY2VQcmluY2lwYWw6IFNlcnZpY2VQcmluY2lwYWwgfCBudWxsKSB7XG4gICAgaWYgKHNlcnZpY2VQcmluY2lwYWwpIHtcbiAgICAgIHRoaXMuaXNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaWQgPSBzZXJ2aWNlUHJpbmNpcGFsLmlkO1xuICAgICAgdGhpcy5leHBpcmVzQXQgPSBzZXJ2aWNlUHJpbmNpcGFsLmV4cGlyZXNBdDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhwaXJlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export class NucleusIdentityConfig {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.httpInterceptorUrls = [];
|
|
4
|
+
this.automaticLoginOnHttp401 = false;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1pZGVudGl0eS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9udWNsZXVzLWlkZW50aXR5LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8scUJBQXFCO0lBQWxDO1FBV1Msd0JBQW1CLEdBQWMsRUFBRSxDQUFDO1FBRXBDLDRCQUF1QixHQUFHLEtBQUssQ0FBQztJQU96QyxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgTnVjbGV1c0lkZW50aXR5Q29uZmlnIHtcbiAgcHVibGljIGF1dGhvcml0eSE6IHN0cmluZztcblxuICBwdWJsaWMgY2xpZW50SWQhOiBzdHJpbmc7XG5cbiAgcHVibGljIHJlZGlyZWN0VXJpPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBhbmRyb2lkUmVkaXJlY3RVcmk/OiBzdHJpbmc7XG5cbiAgcHVibGljIGlPU1JlZGlyZWN0VXJpPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBodHRwSW50ZXJjZXB0b3JVcmxzPzogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgYXV0b21hdGljTG9naW5Pbkh0dHA0MDEgPSBmYWxzZTtcblxuICBwdWJsaWMgcmVxdWVzdGVkU2NvcGVzPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBzZXJ2aWNlUHJpbmNpcGFsUmVxdWVzdGVkU2NvcGVzPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBhdXRoUHJvdmlkZXJIaW50Pzogc3RyaW5nO1xufVxuIl19
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
3
|
+
import { NucleusTokenInterceptor } from './nucleus-token-interceptor.service';
|
|
4
|
+
import { NucleusIdentityConfig } from './nucleus-identity-config';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class NucleusIdentityModule {
|
|
7
|
+
static forRoot(config) {
|
|
8
|
+
return {
|
|
9
|
+
ngModule: NucleusIdentityModule,
|
|
10
|
+
providers: [
|
|
11
|
+
{ provide: NucleusIdentityConfig, useValue: config },
|
|
12
|
+
{
|
|
13
|
+
provide: HTTP_INTERCEPTORS,
|
|
14
|
+
useClass: NucleusTokenInterceptor,
|
|
15
|
+
multi: true,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
21
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityModule }); }
|
|
22
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityModule }); }
|
|
23
|
+
}
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityModule, decorators: [{
|
|
25
|
+
type: NgModule,
|
|
26
|
+
args: [{
|
|
27
|
+
imports: [],
|
|
28
|
+
declarations: [],
|
|
29
|
+
exports: [],
|
|
30
|
+
}]
|
|
31
|
+
}] });
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1pZGVudGl0eS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi9udWNsZXVzLWlkZW50aXR5Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFPbEUsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxNQUFNLENBQUMsT0FBTyxDQUNaLE1BQTZCO1FBRTdCLE9BQU87WUFDTCxRQUFRLEVBQUUscUJBQXFCO1lBQy9CLFNBQVMsRUFBRTtnQkFDVCxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO2dCQUNwRDtvQkFDRSxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxLQUFLLEVBQUUsSUFBSTtpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7K0dBZlUscUJBQXFCO2dIQUFyQixxQkFBcUI7Z0hBQXJCLHFCQUFxQjs7NEZBQXJCLHFCQUFxQjtrQkFMakMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsRUFBRTtvQkFDWCxZQUFZLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLEVBQUU7aUJBQ1oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSFRUUF9JTlRFUkNFUFRPUlMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBOdWNsZXVzVG9rZW5JbnRlcmNlcHRvciB9IGZyb20gJy4vbnVjbGV1cy10b2tlbi1pbnRlcmNlcHRvci5zZXJ2aWNlJztcbmltcG9ydCB7IE51Y2xldXNJZGVudGl0eUNvbmZpZyB9IGZyb20gJy4vbnVjbGV1cy1pZGVudGl0eS1jb25maWcnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXSxcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgZXhwb3J0czogW10sXG59KVxuZXhwb3J0IGNsYXNzIE51Y2xldXNJZGVudGl0eU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIGNvbmZpZzogTnVjbGV1c0lkZW50aXR5Q29uZmlnXG4gICk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TnVjbGV1c0lkZW50aXR5TW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBOdWNsZXVzSWRlbnRpdHlNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBOdWNsZXVzSWRlbnRpdHlDb25maWcsIHVzZVZhbHVlOiBjb25maWcgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLFxuICAgICAgICAgIHVzZUNsYXNzOiBOdWNsZXVzVG9rZW5JbnRlcmNlcHRvcixcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { AuthorizationRequest, RedirectRequestHandler, BasicQueryStringUtils, LocalStorageBackend, AppAuthError, DefaultCrypto, } from '@openid/appauth';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { App } from '@capacitor/app';
|
|
4
|
+
import { Browser } from '@capacitor/browser';
|
|
5
|
+
import { Device } from '@capacitor/device';
|
|
6
|
+
import { NucleusAppService } from '@kolektor/nucleus-common';
|
|
7
|
+
import { LocationService } from './utils/location.service';
|
|
8
|
+
import { NucleusAuthorizationNotifier } from './utils/nucleus-authorization-notifier';
|
|
9
|
+
import { HttpClient } from '@angular/common/http';
|
|
10
|
+
import { SecretsStore } from './utils/secrets-store';
|
|
11
|
+
import { OidcConfigurationService } from './utils/oidc-configuration.service';
|
|
12
|
+
import { TokenClient } from './utils/token-client';
|
|
13
|
+
import { ServicePrincipalRegistrationStatus } from './models/service-principal';
|
|
14
|
+
import { lastValueFrom } from 'rxjs';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@kolektor/nucleus-common";
|
|
17
|
+
import * as i2 from "./utils/location.service";
|
|
18
|
+
import * as i3 from "@angular/common/http";
|
|
19
|
+
import * as i4 from "./utils/oidc-configuration.service";
|
|
20
|
+
import * as i5 from "./utils/token-client";
|
|
21
|
+
export class NucleusIdentityService {
|
|
22
|
+
constructor(appService, location, http, config, tokenClient) {
|
|
23
|
+
this.appService = appService;
|
|
24
|
+
this.http = http;
|
|
25
|
+
this.config = config;
|
|
26
|
+
this.tokenClient = tokenClient;
|
|
27
|
+
this._authorizationNotifier = new NucleusAuthorizationNotifier();
|
|
28
|
+
this._initStarted = false;
|
|
29
|
+
this._initialized = false;
|
|
30
|
+
this._refreshTokenPromise = null;
|
|
31
|
+
this._getTokenPromise = null;
|
|
32
|
+
this._getServicePrincipalTokenPromise = null;
|
|
33
|
+
this._servicePrincipalTokenId = '_svcp';
|
|
34
|
+
const storage = new LocalStorageBackend();
|
|
35
|
+
this._crypto = new DefaultCrypto();
|
|
36
|
+
this._authorizationHandler = new RedirectRequestHandler(storage, new BasicQueryStringUtils(), location, this._crypto);
|
|
37
|
+
this._authorizationHandler.setAuthorizationNotifier(this._authorizationNotifier);
|
|
38
|
+
this._store = new SecretsStore(config.clientId);
|
|
39
|
+
}
|
|
40
|
+
get identity() {
|
|
41
|
+
return this._store.getIdentity();
|
|
42
|
+
}
|
|
43
|
+
get isAuthenticated() {
|
|
44
|
+
return this.identity != null;
|
|
45
|
+
}
|
|
46
|
+
get servicePrincipalIdentity() {
|
|
47
|
+
return this._store.getIdentity(this._servicePrincipalTokenId);
|
|
48
|
+
}
|
|
49
|
+
get isServicePrincipalAuthenticated() {
|
|
50
|
+
return this.servicePrincipalIdentity != null;
|
|
51
|
+
}
|
|
52
|
+
get isIdentityServicePrincipal() {
|
|
53
|
+
return this._store.defaultIdentityId === this._servicePrincipalTokenId;
|
|
54
|
+
}
|
|
55
|
+
async init(startLogin = false) {
|
|
56
|
+
if (this._initStarted || this._initialized) {
|
|
57
|
+
console.warn("Nucleus.Identity: Auth initialization was already started. Don't call init() multiple times!");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this._initStarted = true;
|
|
61
|
+
this.handleLaunchCodeHash();
|
|
62
|
+
await this._authorizationHandler.completeAuthorizationRequestIfPossible();
|
|
63
|
+
const authErr = this._authorizationNotifier.error;
|
|
64
|
+
if (authErr) {
|
|
65
|
+
throw new Error('Authorization err: ' + authErr.error + ': ' + authErr.errorDescription);
|
|
66
|
+
}
|
|
67
|
+
else if (this._authorizationNotifier.response) {
|
|
68
|
+
window.location.hash = '';
|
|
69
|
+
const request = this._authorizationNotifier.request;
|
|
70
|
+
const response = this._authorizationNotifier.response;
|
|
71
|
+
const codeVerifier = (request.internal) ? request.internal['code_verifier'] : undefined;
|
|
72
|
+
const res = await this.tokenClient.getByAuthorizationCode(request.redirectUri, response.code, codeVerifier);
|
|
73
|
+
this._store.setDefaultIdentityId(null);
|
|
74
|
+
await this._store.setToken(res);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const res = await this._store.getToken();
|
|
78
|
+
if (!res && startLogin) {
|
|
79
|
+
await this.login();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
this._initialized = true;
|
|
83
|
+
}
|
|
84
|
+
async loginWithSecret(provider, secret) {
|
|
85
|
+
this._store.removeToken();
|
|
86
|
+
const assertionToken = await this.getServicePrincipalAccessToken();
|
|
87
|
+
const scope = this.prepareScope(true, this.config?.requestedScopes);
|
|
88
|
+
const res = await this.tokenClient.getBySecret(provider, secret, assertionToken, scope);
|
|
89
|
+
this._store.setDefaultIdentityId(null);
|
|
90
|
+
await this._store.setToken(res);
|
|
91
|
+
}
|
|
92
|
+
async login() {
|
|
93
|
+
this._store.removeToken();
|
|
94
|
+
const config = await this.config.getConfiguration();
|
|
95
|
+
const request = this.prepareAuthorizationRequest();
|
|
96
|
+
if (this.appService.isNative) {
|
|
97
|
+
const listener = App.addListener('appUrlOpen', (data) => {
|
|
98
|
+
if (this.appService.platform === 'ios') {
|
|
99
|
+
Browser.close();
|
|
100
|
+
}
|
|
101
|
+
listener.remove();
|
|
102
|
+
const hash = this.getCodeHash(data.url);
|
|
103
|
+
if (hash) {
|
|
104
|
+
const targetUrl = window.location.origin + window.location.pathname + '#' + hash;
|
|
105
|
+
window.location.assign(targetUrl);
|
|
106
|
+
window.location.reload();
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
console.warn('Nucleus.Identity: Redirect url did not contain authorization code!', data);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
this._authorizationHandler.performAuthorizationRequest(config, request);
|
|
114
|
+
}
|
|
115
|
+
async logout() {
|
|
116
|
+
this._store.removeToken();
|
|
117
|
+
const config = await this.config.getConfiguration();
|
|
118
|
+
const redirectUrl = this.config.redirectUrl;
|
|
119
|
+
const logoutUrl = config.endSessionEndpoint +
|
|
120
|
+
'?post_logout_redirect_uri=' +
|
|
121
|
+
encodeURI(redirectUrl);
|
|
122
|
+
if (this.appService.isNative) {
|
|
123
|
+
const listener = App.addListener('appUrlOpen', () => {
|
|
124
|
+
Device.getInfo().then((info) => {
|
|
125
|
+
if (info.platform === 'ios') {
|
|
126
|
+
Browser.close();
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
listener.remove();
|
|
130
|
+
});
|
|
131
|
+
Browser.open({ url: logoutUrl });
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
window.location.assign(logoutUrl);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async getAccessToken() {
|
|
138
|
+
if (!this._getTokenPromise) {
|
|
139
|
+
this._getTokenPromise = this.getAccessTokenInternal();
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
return await this._getTokenPromise;
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
this._getTokenPromise = null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async getServicePrincipalAccessToken() {
|
|
149
|
+
if (!this._getServicePrincipalTokenPromise) {
|
|
150
|
+
this._getServicePrincipalTokenPromise =
|
|
151
|
+
this.getServicePrincipalAccessTokenInternal();
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
return await this._getServicePrincipalTokenPromise;
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
this._getServicePrincipalTokenPromise = null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async loginServicePrincipal() {
|
|
161
|
+
const sp = await this._store.getServicePrincipal();
|
|
162
|
+
if (sp) {
|
|
163
|
+
const scope = this.prepareScope(false, this.config.servicePrincipalRequestedScopes);
|
|
164
|
+
const res = await this.tokenClient.getByClientCredentials(sp.id, sp.secret, scope);
|
|
165
|
+
await this._store.setToken(res, this._servicePrincipalTokenId);
|
|
166
|
+
return res;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
throw Error('Service principal is not registered!');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async loginAsServicePrincipal() {
|
|
173
|
+
const token = await this._store.getToken(this._servicePrincipalTokenId);
|
|
174
|
+
if (!token) {
|
|
175
|
+
await this.loginServicePrincipal();
|
|
176
|
+
}
|
|
177
|
+
this._store.setDefaultIdentityId(this._servicePrincipalTokenId);
|
|
178
|
+
}
|
|
179
|
+
async getOtp(type, expiresIn = -1) {
|
|
180
|
+
let url = this.config.getServerUrl(`/otp/create?type=${type}`);
|
|
181
|
+
if (expiresIn > 0) {
|
|
182
|
+
url += `&expiresIn=${expiresIn}`;
|
|
183
|
+
}
|
|
184
|
+
return lastValueFrom(this.http.get(url));
|
|
185
|
+
}
|
|
186
|
+
async getOtpStatus(id) {
|
|
187
|
+
const url = this.config.getServerUrl(`/otp/status/${id}`);
|
|
188
|
+
return lastValueFrom(this.http.get(url));
|
|
189
|
+
}
|
|
190
|
+
getOtpUrl(redirectUrl, password) {
|
|
191
|
+
const encoded = encodeURIComponent(redirectUrl);
|
|
192
|
+
const url = `/otp/auth?otpValue=${password}&returnUrl=${encoded}`;
|
|
193
|
+
return this.config.getServerUrl(url);
|
|
194
|
+
}
|
|
195
|
+
async startServicePrincipalRegistration() {
|
|
196
|
+
const sp = await this._store.getServicePrincipal();
|
|
197
|
+
return await this.tokenClient.getRegistrationCode(sp?.id);
|
|
198
|
+
}
|
|
199
|
+
async completeServicePrincipalRegistration(deviceCode) {
|
|
200
|
+
const tokenRes = await this.waitForDeviceToken(deviceCode);
|
|
201
|
+
const regRes = await this.tokenClient.registerServicePrincipal(tokenRes.accessToken);
|
|
202
|
+
await this._store.setServicePrincipal({
|
|
203
|
+
id: regRes.clientId,
|
|
204
|
+
secret: regRes.clientSecret,
|
|
205
|
+
expiresAt: regRes.secretExpirationDate,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
removeServicePrincipalRegistration() {
|
|
209
|
+
return this._store.removeServicePrincipal();
|
|
210
|
+
}
|
|
211
|
+
async getServicePrincipalRegistrationStatus() {
|
|
212
|
+
const sp = await this._store.getServicePrincipal();
|
|
213
|
+
return new ServicePrincipalRegistrationStatus(sp);
|
|
214
|
+
}
|
|
215
|
+
async startDeviceCodeLogin() {
|
|
216
|
+
const scope = this.prepareScope(true, this.config.requestedScopes);
|
|
217
|
+
return await this.tokenClient.getDeviceCode(scope);
|
|
218
|
+
}
|
|
219
|
+
async completeDeviceCodeLogin(deviceCode) {
|
|
220
|
+
const res = await this.waitForDeviceToken(deviceCode);
|
|
221
|
+
await this._store.setToken(res);
|
|
222
|
+
}
|
|
223
|
+
async waitForDeviceToken(deviceCode) {
|
|
224
|
+
let res = null;
|
|
225
|
+
do {
|
|
226
|
+
if (deviceCode.isExpired()) {
|
|
227
|
+
throw Error('Device code is expired!');
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
res = await this.tokenClient.getByDeviceCode(deviceCode.deviceCode);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
if (error instanceof AppAuthError &&
|
|
234
|
+
error.message === 'authorization_pending') {
|
|
235
|
+
await this.delay(2000);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
} while (!res);
|
|
242
|
+
return res;
|
|
243
|
+
}
|
|
244
|
+
prepareAuthorizationRequest() {
|
|
245
|
+
const redirectUri = this.config.redirectUrl;
|
|
246
|
+
const params = {
|
|
247
|
+
response_mode: 'fragment',
|
|
248
|
+
prompt: 'consent',
|
|
249
|
+
access_type: 'offline',
|
|
250
|
+
auth_provider_hint: this.config.authProviderHint,
|
|
251
|
+
};
|
|
252
|
+
return new AuthorizationRequest({
|
|
253
|
+
client_id: this.config.clientId,
|
|
254
|
+
redirect_uri: redirectUri,
|
|
255
|
+
response_type: AuthorizationRequest.RESPONSE_TYPE_CODE,
|
|
256
|
+
scope: this.prepareScope(true, this.config.requestedScopes),
|
|
257
|
+
extras: params,
|
|
258
|
+
}, this._crypto, true);
|
|
259
|
+
}
|
|
260
|
+
async getServicePrincipalAccessTokenInternal() {
|
|
261
|
+
let token = await this._store.getToken(this._servicePrincipalTokenId);
|
|
262
|
+
if (!token?.isValid()) {
|
|
263
|
+
token = await this.loginServicePrincipal();
|
|
264
|
+
}
|
|
265
|
+
return token?.accessToken;
|
|
266
|
+
}
|
|
267
|
+
async getAccessTokenInternal() {
|
|
268
|
+
let token = await this._store.getToken();
|
|
269
|
+
if (token && !token.isValid()) {
|
|
270
|
+
token = await this.loginWithRefreshToken(token);
|
|
271
|
+
}
|
|
272
|
+
return token?.accessToken ?? null;
|
|
273
|
+
}
|
|
274
|
+
async loginWithRefreshToken(token) {
|
|
275
|
+
if (!this._refreshTokenPromise) {
|
|
276
|
+
this._refreshTokenPromise = this.loginWithRefreshTokenInternal(token);
|
|
277
|
+
}
|
|
278
|
+
try {
|
|
279
|
+
return await this._refreshTokenPromise;
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
this._refreshTokenPromise = null;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
async loginWithRefreshTokenInternal(token) {
|
|
286
|
+
if (token?.refreshToken) {
|
|
287
|
+
try {
|
|
288
|
+
const res = await this.tokenClient.getByRefreshToken(token.refreshToken);
|
|
289
|
+
await this._store.setToken(res);
|
|
290
|
+
return res;
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
console.warn('Nucleus.Identity: Failed to login with refresh token.', err);
|
|
294
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
295
|
+
if (err.message === 'invalid_grant') {
|
|
296
|
+
await this.logout();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
console.warn('Nucleus.Identity: There is no refresh token available.');
|
|
302
|
+
}
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
getCodeHash(url) {
|
|
306
|
+
const arr = url.split('#');
|
|
307
|
+
if (arr.length > 1) {
|
|
308
|
+
const hash = arr[1];
|
|
309
|
+
if (hash.startsWith('code=')) {
|
|
310
|
+
return hash;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
handleLaunchCodeHash() {
|
|
316
|
+
if (this.appService.isNative && this.appService.launchUrl) {
|
|
317
|
+
const hash = this.getCodeHash(this.appService.launchUrl);
|
|
318
|
+
if (hash) {
|
|
319
|
+
console.log('Nucleus.Identity: Got authorization code from launchUrl, will assign it to hash.');
|
|
320
|
+
window.location.hash = '#' + hash;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
prepareScope(offlineAccess, aditionalScope) {
|
|
325
|
+
let scope = 'openid';
|
|
326
|
+
if (offlineAccess) {
|
|
327
|
+
scope += ' offline_access';
|
|
328
|
+
}
|
|
329
|
+
if (aditionalScope) {
|
|
330
|
+
scope += ' ' + aditionalScope;
|
|
331
|
+
}
|
|
332
|
+
return scope;
|
|
333
|
+
}
|
|
334
|
+
delay(miliseconds) {
|
|
335
|
+
return new Promise((resolve) => {
|
|
336
|
+
setTimeout(() => {
|
|
337
|
+
resolve();
|
|
338
|
+
}, miliseconds);
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityService, deps: [{ token: i1.NucleusAppService }, { token: i2.LocationService }, { token: i3.HttpClient }, { token: i4.OidcConfigurationService }, { token: i5.TokenClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
342
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityService, providedIn: 'root' }); }
|
|
343
|
+
}
|
|
344
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusIdentityService, decorators: [{
|
|
345
|
+
type: Injectable,
|
|
346
|
+
args: [{
|
|
347
|
+
providedIn: 'root',
|
|
348
|
+
}]
|
|
349
|
+
}], ctorParameters: function () { return [{ type: i1.NucleusAppService }, { type: i2.LocationService }, { type: i3.HttpClient }, { type: i4.OidcConfigurationService }, { type: i5.TokenClient }]; } });
|
|
350
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1pZGVudGl0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy9udWNsZXVzLWlkZW50aXR5L3NyYy9saWIvbnVjbGV1cy1pZGVudGl0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxvQkFBb0IsRUFHcEIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLGFBQWEsR0FFZCxNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFLckMsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxZQUNVLFVBQTZCLEVBQ3JD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QUFDLEdBQUcsQ0FDVCxrRkFBa0YsQ0FDbkYsQ0FBQztnQkFDRixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO2FBQ25DO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLGFBQXNCLEVBQUUsY0FBdUI7UUFDbEUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ3JCLElBQUksYUFBYSxFQUFFO1lBQ2pCLEtBQUssSUFBSSxpQkFBaUIsQ0FBQztTQUM1QjtRQUNELElBQUksY0FBYyxFQUFFO1lBQ2xCLEtBQUssSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQW1CO1FBQy9CLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0EzWVUsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FGckIsTUFBTTs7NEZBRVAsc0JBQXNCO2tCQUhsQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25SZXF1ZXN0LFxuICBUb2tlblJlc3BvbnNlLFxuICBDcnlwdG8sXG4gIFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIsXG4gIEJhc2ljUXVlcnlTdHJpbmdVdGlscyxcbiAgTG9jYWxTdG9yYWdlQmFja2VuZCxcbiAgQXBwQXV0aEVycm9yLFxuICBEZWZhdWx0Q3J5cHRvLFxuICBTdHJpbmdNYXAsXG59IGZyb20gJ0BvcGVuaWQvYXBwYXV0aCc7XG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJ0BjYXBhY2l0b3IvYXBwJztcbmltcG9ydCB7IEJyb3dzZXIgfSBmcm9tICdAY2FwYWNpdG9yL2Jyb3dzZXInO1xuaW1wb3J0IHsgRGV2aWNlIH0gZnJvbSAnQGNhcGFjaXRvci9kZXZpY2UnO1xuaW1wb3J0IHsgTnVjbGV1c0FwcFNlcnZpY2UgfSBmcm9tICdAa29sZWt0b3IvbnVjbGV1cy1jb21tb24nO1xuaW1wb3J0IHsgTG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi91dGlscy9sb2NhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhvcml6YXRpb25SZXF1ZXN0SGFuZGxlciB9IGZyb20gJ0BvcGVuaWQvYXBwYXV0aCc7XG5pbXBvcnQgeyBOdWNsZXVzQXV0aG9yaXphdGlvbk5vdGlmaWVyIH0gZnJvbSAnLi91dGlscy9udWNsZXVzLWF1dGhvcml6YXRpb24tbm90aWZpZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE90cFJlc3BvbnNlLCBPdHBTdGF0dXMsIE90cFR5cGUgfSBmcm9tICcuL21vZGVscy9vdHAnO1xuaW1wb3J0IHsgU2VjcmV0c1N0b3JlIH0gZnJvbSAnLi91dGlscy9zZWNyZXRzLXN0b3JlJztcbmltcG9ydCB7IE9pZGNDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4vdXRpbHMvb2lkYy1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5DbGllbnQgfSBmcm9tICcuL3V0aWxzL3Rva2VuLWNsaWVudCc7XG5pbXBvcnQgeyBEZXZpY2VDb2RlIH0gZnJvbSAnLi9tb2RlbHMvZGV2aWNlLWNvZGUnO1xuaW1wb3J0IHsgU2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvblN0YXR1cyB9IGZyb20gJy4vbW9kZWxzL3NlcnZpY2UtcHJpbmNpcGFsJztcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE51Y2xldXNJZGVudGl0eVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFwcFNlcnZpY2U6IE51Y2xldXNBcHBTZXJ2aWNlLFxuICAgIGxvY2F0aW9uOiBMb2NhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgY29uZmlnOiBPaWRjQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2tlbkNsaWVudDogVG9rZW5DbGllbnRcbiAgKSB7XG4gICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBMb2NhbFN0b3JhZ2VCYWNrZW5kKCk7XG4gICAgdGhpcy5fY3J5cHRvID0gbmV3IERlZmF1bHRDcnlwdG8oKTtcbiAgICB0aGlzLl9hdXRob3JpemF0aW9uSGFuZGxlciA9IG5ldyBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyKFxuICAgICAgc3RvcmFnZSxcbiAgICAgIG5ldyBCYXNpY1F1ZXJ5U3RyaW5nVXRpbHMoKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdGhpcy5fY3J5cHRvXG4gICAgKTtcbiAgICB0aGlzLl9hdXRob3JpemF0aW9uSGFuZGxlci5zZXRBdXRob3JpemF0aW9uTm90aWZpZXIoXG4gICAgICB0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXJcbiAgICApO1xuICAgIHRoaXMuX3N0b3JlID0gbmV3IFNlY3JldHNTdG9yZShjb25maWcuY2xpZW50SWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0aG9yaXphdGlvbkhhbmRsZXI6IEF1dGhvcml6YXRpb25SZXF1ZXN0SGFuZGxlcjtcbiAgcHJpdmF0ZSBfYXV0aG9yaXphdGlvbk5vdGlmaWVyID0gbmV3IE51Y2xldXNBdXRob3JpemF0aW9uTm90aWZpZXIoKTtcbiAgcHJpdmF0ZSBfY3J5cHRvOiBDcnlwdG87XG4gIHByaXZhdGUgX2luaXRTdGFydGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3JlZnJlc2hUb2tlblByb21pc2U6IFByb21pc2U8VG9rZW5SZXNwb25zZSB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2dldFRva2VuUHJvbWlzZTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9nZXRTZXJ2aWNlUHJpbmNpcGFsVG9rZW5Qcm9taXNlOiBQcm9taXNlPHN0cmluZz4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc2VydmljZVByaW5jaXBhbFRva2VuSWQgPSAnX3N2Y3AnO1xuICBwcml2YXRlIF9zdG9yZTogU2VjcmV0c1N0b3JlO1xuXG4gIHB1YmxpYyBnZXQgaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldElkZW50aXR5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQXV0aGVudGljYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eSAhPSBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCBzZXJ2aWNlUHJpbmNpcGFsSWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldElkZW50aXR5KHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNTZXJ2aWNlUHJpbmNpcGFsQXV0aGVudGljYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlUHJpbmNpcGFsSWRlbnRpdHkgIT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNJZGVudGl0eVNlcnZpY2VQcmluY2lwYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmRlZmF1bHRJZGVudGl0eUlkID09PSB0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsVG9rZW5JZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbml0KHN0YXJ0TG9naW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9pbml0U3RhcnRlZCB8fCB0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIk51Y2xldXMuSWRlbnRpdHk6IEF1dGggaW5pdGlhbGl6YXRpb24gd2FzIGFscmVhZHkgc3RhcnRlZC4gRG9uJ3QgY2FsbCBpbml0KCkgbXVsdGlwbGUgdGltZXMhXCJcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2luaXRTdGFydGVkID0gdHJ1ZTtcblxuICAgIHRoaXMuaGFuZGxlTGF1bmNoQ29kZUhhc2goKTtcbiAgICBhd2FpdCB0aGlzLl9hdXRob3JpemF0aW9uSGFuZGxlci5jb21wbGV0ZUF1dGhvcml6YXRpb25SZXF1ZXN0SWZQb3NzaWJsZSgpO1xuXG4gICAgY29uc3QgYXV0aEVyciA9IHRoaXMuX2F1dGhvcml6YXRpb25Ob3RpZmllci5lcnJvcjtcbiAgICBpZiAoYXV0aEVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQXV0aG9yaXphdGlvbiBlcnI6ICcgKyBhdXRoRXJyLmVycm9yICsgJzogJyArIGF1dGhFcnIuZXJyb3JEZXNjcmlwdGlvblxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2F1dGhvcml6YXRpb25Ob3RpZmllci5yZXNwb25zZSkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJztcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXIucmVxdWVzdDtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5fYXV0aG9yaXphdGlvbk5vdGlmaWVyLnJlc3BvbnNlO1xuXG4gICAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSAocmVxdWVzdC5pbnRlcm5hbCkgPyByZXF1ZXN0LmludGVybmFsWydjb2RlX3ZlcmlmaWVyJ10gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5QXV0aG9yaXphdGlvbkNvZGUocmVxdWVzdC5yZWRpcmVjdFVyaSwgcmVzcG9uc2UuY29kZSwgY29kZVZlcmlmaWVyKTtcbiAgICAgIHRoaXMuX3N0b3JlLnNldERlZmF1bHRJZGVudGl0eUlkKG51bGwpO1xuICAgICAgYXdhaXQgdGhpcy5fc3RvcmUuc2V0VG9rZW4ocmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0VG9rZW4oKTtcbiAgICAgIGlmICghcmVzICYmIHN0YXJ0TG9naW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbigpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9naW5XaXRoU2VjcmV0KFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgc2VjcmV0OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fc3RvcmUucmVtb3ZlVG9rZW4oKTtcbiAgICBjb25zdCBhc3NlcnRpb25Ub2tlbiA9IGF3YWl0IHRoaXMuZ2V0U2VydmljZVByaW5jaXBhbEFjY2Vzc1Rva2VuKCk7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnByZXBhcmVTY29wZSh0cnVlLCB0aGlzLmNvbmZpZz8ucmVxdWVzdGVkU2NvcGVzKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5U2VjcmV0KFxuICAgICAgcHJvdmlkZXIsXG4gICAgICBzZWNyZXQsXG4gICAgICBhc3NlcnRpb25Ub2tlbixcbiAgICAgIHNjb3BlXG4gICAgKTtcbiAgICB0aGlzLl9zdG9yZS5zZXREZWZhdWx0SWRlbnRpdHlJZChudWxsKTtcbiAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRUb2tlbihyZXMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvZ2luKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX3N0b3JlLnJlbW92ZVRva2VuKCk7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5jb25maWcuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnByZXBhcmVBdXRob3JpemF0aW9uUmVxdWVzdCgpO1xuICAgIGlmICh0aGlzLmFwcFNlcnZpY2UuaXNOYXRpdmUpIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gQXBwLmFkZExpc3RlbmVyKCdhcHBVcmxPcGVuJywgKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXBwU2VydmljZS5wbGF0Zm9ybSA9PT0gJ2lvcycpIHtcbiAgICAgICAgICBCcm93c2VyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAgIGNvbnN0IGhhc2ggPSB0aGlzLmdldENvZGVIYXNoKGRhdGEudXJsKTtcbiAgICAgICAgaWYgKGhhc2gpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRVcmwgPVxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArICcjJyArIGhhc2g7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih0YXJnZXRVcmwpO1xuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnTnVjbGV1cy5JZGVudGl0eTogUmVkaXJlY3QgdXJsIGRpZCBub3QgY29udGFpbiBhdXRob3JpemF0aW9uIGNvZGUhJyxcbiAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fYXV0aG9yaXphdGlvbkhhbmRsZXIucGVyZm9ybUF1dGhvcml6YXRpb25SZXF1ZXN0KGNvbmZpZywgcmVxdWVzdCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX3N0b3JlLnJlbW92ZVRva2VuKCk7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5jb25maWcuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gdGhpcy5jb25maWcucmVkaXJlY3RVcmw7XG4gICAgY29uc3QgbG9nb3V0VXJsID1cbiAgICAgIGNvbmZpZy5lbmRTZXNzaW9uRW5kcG9pbnQgK1xuICAgICAgJz9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk9JyArXG4gICAgICBlbmNvZGVVUkkocmVkaXJlY3RVcmwpO1xuICAgIGlmICh0aGlzLmFwcFNlcnZpY2UuaXNOYXRpdmUpIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gQXBwLmFkZExpc3RlbmVyKCdhcHBVcmxPcGVuJywgKCkgPT4ge1xuICAgICAgICBEZXZpY2UuZ2V0SW5mbygpLnRoZW4oKGluZm8pID0+IHtcbiAgICAgICAgICBpZiAoaW5mby5wbGF0Zm9ybSA9PT0gJ2lvcycpIHtcbiAgICAgICAgICAgIEJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgICAgQnJvd3Nlci5vcGVuKHsgdXJsOiBsb2dvdXRVcmwgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24obG9nb3V0VXJsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWNjZXNzVG9rZW4oKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRUb2tlblByb21pc2UpIHtcbiAgICAgIHRoaXMuX2dldFRva2VuUHJvbWlzZSA9IHRoaXMuZ2V0QWNjZXNzVG9rZW5JbnRlcm5hbCgpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2dldFRva2VuUHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fZ2V0VG9rZW5Qcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U2VydmljZVByaW5jaXBhbEFjY2Vzc1Rva2VuKCkge1xuICAgIGlmICghdGhpcy5fZ2V0U2VydmljZVByaW5jaXBhbFRva2VuUHJvbWlzZSkge1xuICAgICAgdGhpcy5fZ2V0U2VydmljZVByaW5jaXBhbFRva2VuUHJvbWlzZSA9XG4gICAgICAgIHRoaXMuZ2V0U2VydmljZVByaW5jaXBhbEFjY2Vzc1Rva2VuSW50ZXJuYWwoKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRTZXJ2aWNlUHJpbmNpcGFsVG9rZW5Qcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9nZXRTZXJ2aWNlUHJpbmNpcGFsVG9rZW5Qcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9naW5TZXJ2aWNlUHJpbmNpcGFsKCkge1xuICAgIGNvbnN0IHNwID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0U2VydmljZVByaW5jaXBhbCgpO1xuICAgIGlmIChzcCkge1xuICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLnByZXBhcmVTY29wZShmYWxzZSwgdGhpcy5jb25maWcuc2VydmljZVByaW5jaXBhbFJlcXVlc3RlZFNjb3Blcyk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5Q2xpZW50Q3JlZGVudGlhbHMoXG4gICAgICAgIHNwLmlkLFxuICAgICAgICBzcC5zZWNyZXQsXG4gICAgICAgIHNjb3BlXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5fc3RvcmUuc2V0VG9rZW4ocmVzLCB0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsVG9rZW5JZCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcignU2VydmljZSBwcmluY2lwYWwgaXMgbm90IHJlZ2lzdGVyZWQhJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvZ2luQXNTZXJ2aWNlUHJpbmNpcGFsKCkge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0VG9rZW4odGhpcy5fc2VydmljZVByaW5jaXBhbFRva2VuSWQpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIGF3YWl0IHRoaXMubG9naW5TZXJ2aWNlUHJpbmNpcGFsKCk7XG4gICAgfVxuICAgIHRoaXMuX3N0b3JlLnNldERlZmF1bHRJZGVudGl0eUlkKHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRPdHAodHlwZTogT3RwVHlwZSwgZXhwaXJlc0luID0gLTEpIHtcbiAgICBsZXQgdXJsID0gdGhpcy5jb25maWcuZ2V0U2VydmVyVXJsKGAvb3RwL2NyZWF0ZT90eXBlPSR7dHlwZX1gKTtcbiAgICBpZiAoZXhwaXJlc0luID4gMCkge1xuICAgICAgdXJsICs9IGAmZXhwaXJlc0luPSR7ZXhwaXJlc0lufWA7XG4gICAgfVxuICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8T3RwUmVzcG9uc2U+KHVybCkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE90cFN0YXR1cyhpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jb25maWcuZ2V0U2VydmVyVXJsKGAvb3RwL3N0YXR1cy8ke2lkfWApO1xuICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8T3RwU3RhdHVzPih1cmwpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdHBVcmwocmVkaXJlY3RVcmw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykge1xuICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQocmVkaXJlY3RVcmwpO1xuICAgIGNvbnN0IHVybCA9IGAvb3RwL2F1dGg/b3RwVmFsdWU9JHtwYXNzd29yZH0mcmV0dXJuVXJsPSR7ZW5jb2RlZH1gO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZXRTZXJ2ZXJVcmwodXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb24oKSB7XG4gICAgY29uc3Qgc3AgPSBhd2FpdCB0aGlzLl9zdG9yZS5nZXRTZXJ2aWNlUHJpbmNpcGFsKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudG9rZW5DbGllbnQuZ2V0UmVnaXN0cmF0aW9uQ29kZShzcD8uaWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbXBsZXRlU2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvbihkZXZpY2VDb2RlOiBEZXZpY2VDb2RlKSB7XG4gICAgY29uc3QgdG9rZW5SZXMgPSBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VUb2tlbihkZXZpY2VDb2RlKTtcbiAgICBjb25zdCByZWdSZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LnJlZ2lzdGVyU2VydmljZVByaW5jaXBhbChcbiAgICAgIHRva2VuUmVzLmFjY2Vzc1Rva2VuXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuX3N0b3JlLnNldFNlcnZpY2VQcmluY2lwYWwoe1xuICAgICAgaWQ6IHJlZ1Jlcy5jbGllbnRJZCxcbiAgICAgIHNlY3JldDogcmVnUmVzLmNsaWVudFNlY3JldCxcbiAgICAgIGV4cGlyZXNBdDogcmVnUmVzLnNlY3JldEV4cGlyYXRpb25EYXRlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZVNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLnJlbW92ZVNlcnZpY2VQcmluY2lwYWwoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTZXJ2aWNlUHJpbmNpcGFsUmVnaXN0cmF0aW9uU3RhdHVzKCkge1xuICAgIGNvbnN0IHNwID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0U2VydmljZVByaW5jaXBhbCgpO1xuICAgIHJldHVybiBuZXcgU2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvblN0YXR1cyhzcCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnREZXZpY2VDb2RlTG9naW4oKSB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnByZXBhcmVTY29wZSh0cnVlLCB0aGlzLmNvbmZpZy5yZXF1ZXN0ZWRTY29wZXMpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldERldmljZUNvZGUoc2NvcGUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbXBsZXRlRGV2aWNlQ29kZUxvZ2luKGRldmljZUNvZGU6IERldmljZUNvZGUpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VUb2tlbihkZXZpY2VDb2RlKTtcbiAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRUb2tlbihyZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRGV2aWNlVG9rZW4oZGV2aWNlQ29kZTogRGV2aWNlQ29kZSkge1xuICAgIGxldCByZXM6IFRva2VuUmVzcG9uc2UgfCBudWxsID0gbnVsbDtcbiAgICBkbyB7XG4gICAgICBpZiAoZGV2aWNlQ29kZS5pc0V4cGlyZWQoKSkge1xuICAgICAgICB0aHJvdyBFcnJvcignRGV2aWNlIGNvZGUgaXMgZXhwaXJlZCEnKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy50b2tlbkNsaWVudC5nZXRCeURldmljZUNvZGUoZGV2aWNlQ29kZS5kZXZpY2VDb2RlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEFwcEF1dGhFcnJvciAmJlxuICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPT09ICdhdXRob3JpemF0aW9uX3BlbmRpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsYXkoMjAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlICghcmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlQXV0aG9yaXphdGlvblJlcXVlc3QoKTogQXV0aG9yaXphdGlvblJlcXVlc3Qge1xuICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gdGhpcy5jb25maWcucmVkaXJlY3RVcmw7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICByZXNwb25zZV9tb2RlOiAnZnJhZ21lbnQnLFxuICAgICAgcHJvbXB0OiAnY29uc2VudCcsXG4gICAgICBhY2Nlc3NfdHlwZTogJ29mZmxpbmUnLFxuICAgICAgYXV0aF9wcm92aWRlcl9oaW50OiB0aGlzLmNvbmZpZy5hdXRoUHJvdmlkZXJIaW50LFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25SZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuY29uZmlnLmNsaWVudElkLFxuICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxuICAgICAgICByZXNwb25zZV90eXBlOiBBdXRob3JpemF0aW9uUmVxdWVzdC5SRVNQT05TRV9UWVBFX0NPREUsXG4gICAgICAgIHNjb3BlOiB0aGlzLnByZXBhcmVTY29wZSh0cnVlLCB0aGlzLmNvbmZpZy5yZXF1ZXN0ZWRTY29wZXMpLFxuICAgICAgICBleHRyYXM6IHBhcmFtcyBhcyBTdHJpbmdNYXAsXG4gICAgICB9LFxuICAgICAgdGhpcy5fY3J5cHRvLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFNlcnZpY2VQcmluY2lwYWxBY2Nlc3NUb2tlbkludGVybmFsKCkge1xuICAgIGxldCB0b2tlbiA9IGF3YWl0IHRoaXMuX3N0b3JlLmdldFRva2VuKHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkKTtcbiAgICBpZiAoIXRva2VuPy5pc1ZhbGlkKCkpIHtcbiAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5sb2dpblNlcnZpY2VQcmluY2lwYWwoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuPy5hY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWNjZXNzVG9rZW5JbnRlcm5hbCgpIHtcbiAgICBsZXQgdG9rZW4gPSBhd2FpdCB0aGlzLl9zdG9yZS5nZXRUb2tlbigpO1xuICAgIGlmICh0b2tlbiAmJiAhdG9rZW4uaXNWYWxpZCgpKSB7XG4gICAgICB0b2tlbiA9IGF3YWl0IHRoaXMubG9naW5XaXRoUmVmcmVzaFRva2VuKHRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuPy5hY2Nlc3NUb2tlbiA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2dpbldpdGhSZWZyZXNoVG9rZW4odG9rZW46IFRva2VuUmVzcG9uc2UpIHtcbiAgICBpZiAoIXRoaXMuX3JlZnJlc2hUb2tlblByb21pc2UpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hUb2tlblByb21pc2UgPSB0aGlzLmxvZ2luV2l0aFJlZnJlc2hUb2tlbkludGVybmFsKHRva2VuKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZWZyZXNoVG9rZW5Qcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZWZyZXNoVG9rZW5Qcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvZ2luV2l0aFJlZnJlc2hUb2tlbkludGVybmFsKHRva2VuOiBUb2tlblJlc3BvbnNlKSB7XG4gICAgaWYgKHRva2VuPy5yZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMudG9rZW5DbGllbnQuZ2V0QnlSZWZyZXNoVG9rZW4oXG4gICAgICAgICAgdG9rZW4ucmVmcmVzaFRva2VuXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3N0b3JlLnNldFRva2VuKHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdOdWNsZXVzLklkZW50aXR5OiBGYWlsZWQgdG8gbG9naW4gd2l0aCByZWZyZXNoIHRva2VuLicsXG4gICAgICAgICAgZXJyXG4gICAgICAgICk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGlmICgoZXJyIGFzIGFueSkubWVzc2FnZSA9PT0gJ2ludmFsaWRfZ3JhbnQnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ051Y2xldXMuSWRlbnRpdHk6IFRoZXJlIGlzIG5vIHJlZnJlc2ggdG9rZW4gYXZhaWxhYmxlLicpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29kZUhhc2godXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcnIgPSB1cmwuc3BsaXQoJyMnKTtcbiAgICBpZiAoYXJyLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGhhc2ggPSBhcnJbMV07XG4gICAgICBpZiAoaGFzaC5zdGFydHNXaXRoKCdjb2RlPScpKSB7XG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTGF1bmNoQ29kZUhhc2goKSB7XG4gICAgaWYgKHRoaXMuYXBwU2VydmljZS5pc05hdGl2ZSAmJiB0aGlzLmFwcFNlcnZpY2UubGF1bmNoVXJsKSB7XG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRDb2RlSGFzaCh0aGlzLmFwcFNlcnZpY2UubGF1bmNoVXJsKTtcbiAgICAgIGlmIChoYXNoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICdOdWNsZXVzLklkZW50aXR5OiBHb3QgYXV0aG9yaXphdGlvbiBjb2RlIGZyb20gbGF1bmNoVXJsLCB3aWxsIGFzc2lnbiBpdCB0byBoYXNoLidcbiAgICAgICAgKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnIycgKyBoYXNoO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVNjb3BlKG9mZmxpbmVBY2Nlc3M6IGJvb2xlYW4sIGFkaXRpb25hbFNjb3BlPzogc3RyaW5nKSB7XG4gICAgbGV0IHNjb3BlID0gJ29wZW5pZCc7XG4gICAgaWYgKG9mZmxpbmVBY2Nlc3MpIHtcbiAgICAgIHNjb3BlICs9ICcgb2ZmbGluZV9hY2Nlc3MnO1xuICAgIH1cbiAgICBpZiAoYWRpdGlvbmFsU2NvcGUpIHtcbiAgICAgIHNjb3BlICs9ICcgJyArIGFkaXRpb25hbFNjb3BlO1xuICAgIH1cbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cblxuICBwcml2YXRlIGRlbGF5KG1pbGlzZWNvbmRzOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCBtaWxpc2Vjb25kcyk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|