payload-auth 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/better-auth/adapter/index.d.ts +10 -0
- package/dist/better-auth/adapter/index.d.ts.map +1 -1
- package/dist/better-auth/adapter/index.js +151 -125
- package/dist/better-auth/adapter/transform/index.d.ts +2 -4
- package/dist/better-auth/adapter/transform/index.d.ts.map +1 -1
- package/dist/better-auth/adapter/transform/index.js +435 -311
- package/dist/better-auth/generated-types.d.ts +216 -0
- package/dist/better-auth/generated-types.d.ts.map +1 -0
- package/dist/better-auth/generated-types.js +4 -0
- package/dist/better-auth/plugin/constants.d.ts +146 -3
- package/dist/better-auth/plugin/constants.d.ts.map +1 -1
- package/dist/better-auth/plugin/constants.js +149 -6
- package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts +13 -0
- package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/check-plugin-exists.js +14 -0
- package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts +22 -0
- package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-better-auth-schema.js +50 -0
- package/dist/better-auth/plugin/helpers/get-collection-schema-map.d.ts +16 -0
- package/dist/better-auth/plugin/helpers/get-collection-schema-map.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-collection-schema-map.js +108 -0
- package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts +6 -0
- package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-collection-slug.js +20 -0
- package/dist/better-auth/plugin/helpers/get-collection.d.ts +41 -0
- package/dist/better-auth/plugin/helpers/get-collection.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-collection.js +62 -0
- package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts +52 -14
- package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts.map +1 -1
- package/dist/better-auth/plugin/helpers/prepare-session-data.js +41 -35
- package/dist/better-auth/plugin/index.d.ts +3 -3
- package/dist/better-auth/plugin/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/index.js +31 -40
- package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts +2 -6
- package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.js +22 -7
- package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts +3 -6
- package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/accounts/index.js +96 -102
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts +2 -2
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.js +6 -5
- package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/api-keys.js +97 -113
- package/dist/better-auth/plugin/lib/build-collections/index.d.ts +6 -6
- package/dist/better-auth/plugin/lib/build-collections/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/index.js +68 -84
- package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts +2 -4
- package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/invitations.js +75 -70
- package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/jwks.js +46 -28
- package/dist/better-auth/plugin/lib/build-collections/members.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/members.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/members.js +52 -48
- package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.js +74 -64
- package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/oauth-applications.js +78 -71
- package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/oauth-consents.js +68 -45
- package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/organizations.js +52 -39
- package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/passkeys.js +60 -64
- package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts +3 -7
- package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/sessions.js +100 -96
- package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/sso-providers.js +56 -56
- package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/subscriptions.js +113 -0
- package/dist/better-auth/plugin/lib/build-collections/teams.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/teams.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/teams.js +62 -30
- package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts +3 -5
- package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/two-factors.js +50 -37
- package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.js +5 -5
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.js +3 -3
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.js +7 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.js +4 -4
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.d.ts +2 -2
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.js +93 -96
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts +1 -6
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.js +27 -16
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts +1 -5
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.js +16 -8
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts +2 -6
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.js +25 -6
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts +2 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.js +5 -8
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts +7 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.js +8 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.js +15 -12
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts +1 -6
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.js +21 -10
- package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts +3 -7
- package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/index.js +153 -210
- package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts +16 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.js +32 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts +1 -1
- package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.js +1 -1
- package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts +17 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.js +21 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts +22 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.js +95 -0
- package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts +3 -6
- package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/build-collections/verifications.js +62 -40
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.js +4 -3
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts +2 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.js +8 -15
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts +5 -3
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.js +56 -69
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts +2 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.js +16 -55
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts +2 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.js +21 -83
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts +2 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.js +8 -15
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts +2 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.js +8 -15
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.js +10 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts +3 -3
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.js +3 -3
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts +5 -4
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.js +19 -17
- package/dist/better-auth/plugin/lib/set-login-methods.d.ts +1 -1
- package/dist/better-auth/plugin/lib/set-login-methods.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/set-login-methods.js +5 -6
- package/dist/better-auth/plugin/payload/views/admin-login/client.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/views/admin-login/client.js +2 -2
- package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts +4 -4
- package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/views/admin-login/index.js +7 -8
- package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts +1 -1
- package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/views/admin-signup/client.js +27 -7
- package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts +4 -5
- package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/views/admin-signup/index.js +6 -6
- package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts +1 -5
- package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/views/forgot-password/index.js +1 -1
- package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts +3 -3
- package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/views/two-factor-verify/index.js +10 -7
- package/dist/better-auth/plugin/types.d.ts +41 -13
- package/dist/better-auth/plugin/types.d.ts.map +1 -1
- package/dist/better-auth/plugin/types.js +1 -1
- package/dist/better-auth/plugin/utils/set.d.ts +40 -0
- package/dist/better-auth/plugin/utils/set.d.ts.map +1 -0
- package/dist/better-auth/plugin/utils/set.js +84 -0
- package/dist/better-auth/scripts/generate-types.d.ts +2 -0
- package/dist/better-auth/scripts/generate-types.d.ts.map +1 -0
- package/dist/better-auth/scripts/generate-types.js +219 -0
- package/dist/shared/form/validation.d.ts +31 -7
- package/dist/shared/form/validation.d.ts.map +1 -1
- package/dist/shared/form/validation.js +13 -5
- package/package.json +14 -4
- package/dist/better-auth/plugin/helpers/check-passkey-plugin.d.ts +0 -3
- package/dist/better-auth/plugin/helpers/check-passkey-plugin.d.ts.map +0 -1
- package/dist/better-auth/plugin/helpers/check-passkey-plugin.js +0 -6
- package/dist/better-auth/plugin/helpers/check-two-factor-plugin.d.ts +0 -3
- package/dist/better-auth/plugin/helpers/check-two-factor-plugin.d.ts.map +0 -1
- package/dist/better-auth/plugin/helpers/check-two-factor-plugin.js +0 -6
- package/dist/better-auth/plugin/helpers/check-username-plugin.d.ts +0 -3
- package/dist/better-auth/plugin/helpers/check-username-plugin.d.ts.map +0 -1
- package/dist/better-auth/plugin/helpers/check-username-plugin.js +0 -6
- package/dist/better-auth/plugin/lib/get-required-collection-slugs.d.ts +0 -10
- package/dist/better-auth/plugin/lib/get-required-collection-slugs.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/get-required-collection-slugs.js +0 -35
- package/dist/better-auth/plugin/payload/utils/generate-metadata.d.ts +0 -15
- package/dist/better-auth/plugin/payload/utils/generate-metadata.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/utils/generate-metadata.js +0 -74
|
@@ -2,61 +2,101 @@ import { BetterAuthError } from "better-auth";
|
|
|
2
2
|
import { generateSchema } from "./generate-schema";
|
|
3
3
|
import { createTransform } from "./transform";
|
|
4
4
|
export const BETTER_AUTH_CONTEXT_KEY = 'payload-db-adapter';
|
|
5
|
-
const PAYLOAD_QUERY_DEPTH =
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
const PAYLOAD_QUERY_DEPTH = 0;
|
|
6
|
+
/**
|
|
7
|
+
* Payload adapter for Better Auth
|
|
8
|
+
*
|
|
9
|
+
* This adapter connects Better Auth to Payload CMS, allowing authentication
|
|
10
|
+
* operations to be performed against Payload collections.
|
|
11
|
+
*
|
|
12
|
+
* @param payloadClient - The Payload CMS client instance or a function that returns it
|
|
13
|
+
* @param config - Configuration options for the adapter
|
|
14
|
+
* @returns A function that creates a Better Auth adapter
|
|
15
|
+
*/ const payloadAdapter = (payloadClient, config)=>{
|
|
16
|
+
/**
|
|
17
|
+
* Logs debug messages if debug logging is enabled
|
|
18
|
+
* @param message - The message to log
|
|
19
|
+
*/ function debugLog(message) {
|
|
8
20
|
if (config.enableDebugLogs) {
|
|
9
21
|
console.log('[payload-db-adapter]', ...message);
|
|
10
22
|
}
|
|
11
23
|
}
|
|
12
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Logs error messages
|
|
26
|
+
* @param message - The error message to log
|
|
27
|
+
*/ function errorLog(message) {
|
|
13
28
|
console.error(`[payload-db-adapter]`, ...message);
|
|
14
29
|
}
|
|
15
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Throws an error when a collection slug doesn't exist
|
|
32
|
+
* @param model - The model name that couldn't be found
|
|
33
|
+
* @throws {BetterAuthError} When the collection doesn't exist
|
|
34
|
+
* @returns Never - Function always throws
|
|
35
|
+
*/ function collectionSlugError(model) {
|
|
16
36
|
throw new BetterAuthError(`Collection ${model} does not exist. Please check your payload collection slugs match the better auth schema`);
|
|
17
37
|
}
|
|
18
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Validates that a collection exists in Payload
|
|
40
|
+
* @param payload - The Payload client instance
|
|
41
|
+
* @param collectionSlug - The collection slug to validate
|
|
42
|
+
* @param model - The model name for error messages
|
|
43
|
+
* @throws {BetterAuthError} When the collection doesn't exist
|
|
44
|
+
*/ async function validateCollection(payload, collectionSlug, model) {
|
|
45
|
+
if (!collectionSlug || !(collectionSlug in payload.collections)) {
|
|
46
|
+
collectionSlugError(model);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Creates a context object for Payload operations
|
|
51
|
+
* @param data - Data to include in the context
|
|
52
|
+
* @returns The context object with Better Auth metadata
|
|
53
|
+
*/ const createAdapterContext = (data)=>({
|
|
19
54
|
[BETTER_AUTH_CONTEXT_KEY]: {
|
|
20
55
|
...data
|
|
21
56
|
}
|
|
22
57
|
});
|
|
23
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Resolves the Payload client, handling both function and direct references
|
|
60
|
+
* @returns The resolved Payload client
|
|
61
|
+
* @throws {BetterAuthError} When Better Auth plugin is not configured
|
|
62
|
+
*/ async function resolvePayloadClient() {
|
|
24
63
|
const payload = typeof payloadClient === 'function' ? await payloadClient() : await payloadClient;
|
|
25
64
|
if (!payload.config?.custom?.hasBetterAuthPlugin) {
|
|
26
65
|
throw new BetterAuthError(`Payload is not configured with the better-auth plugin. Please add the plugin to your payload config.`);
|
|
27
66
|
}
|
|
28
67
|
return payload;
|
|
29
68
|
}
|
|
30
|
-
|
|
31
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Creates and returns a Better Auth adapter for Payload
|
|
71
|
+
* @param options - Better Auth options
|
|
72
|
+
* @returns A Better Auth adapter implementation
|
|
73
|
+
*/ return (options)=>{
|
|
74
|
+
const { transformInput, transformOutput, convertWhereClause, convertSelect, convertSort, getCollectionSlug, singleIdQuery } = createTransform(options, config.enableDebugLogs ?? false);
|
|
32
75
|
return {
|
|
33
|
-
id: 'payload',
|
|
34
|
-
async create (data) {
|
|
76
|
+
id: 'payload-adapter',
|
|
77
|
+
async create ({ model, data: values, select }) {
|
|
35
78
|
const start = Date.now();
|
|
36
|
-
const
|
|
37
|
-
const collectionSlug =
|
|
38
|
-
|
|
79
|
+
const payload = await resolvePayloadClient();
|
|
80
|
+
const collectionSlug = getCollectionSlug(model);
|
|
81
|
+
// Validate collection exists before proceeding
|
|
82
|
+
await validateCollection(payload, collectionSlug, model);
|
|
83
|
+
const transformedInput = transformInput({
|
|
39
84
|
data: values,
|
|
40
85
|
model,
|
|
41
|
-
action: 'create',
|
|
42
86
|
idType: config.idType
|
|
43
87
|
});
|
|
44
88
|
debugLog([
|
|
45
89
|
'create',
|
|
46
90
|
{
|
|
47
91
|
collectionSlug,
|
|
48
|
-
|
|
92
|
+
transformedInput,
|
|
49
93
|
select
|
|
50
94
|
}
|
|
51
95
|
]);
|
|
52
96
|
try {
|
|
53
|
-
const payload = await resolvePayloadClient();
|
|
54
|
-
if (!collectionSlug || !(collectionSlug in payload.collections)) {
|
|
55
|
-
collectionSlugError(model);
|
|
56
|
-
}
|
|
57
97
|
const result = await payload.create({
|
|
58
98
|
collection: collectionSlug,
|
|
59
|
-
data:
|
|
99
|
+
data: transformedInput,
|
|
60
100
|
select: convertSelect(model, select),
|
|
61
101
|
context: createAdapterContext({
|
|
62
102
|
model,
|
|
@@ -86,10 +126,12 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
86
126
|
return null;
|
|
87
127
|
}
|
|
88
128
|
},
|
|
89
|
-
async findOne (
|
|
129
|
+
async findOne ({ model, where, select }) {
|
|
90
130
|
const start = Date.now();
|
|
91
|
-
const
|
|
92
|
-
const collectionSlug =
|
|
131
|
+
const payload = await resolvePayloadClient();
|
|
132
|
+
const collectionSlug = getCollectionSlug(model);
|
|
133
|
+
// Validate collection exists before proceeding
|
|
134
|
+
await validateCollection(payload, collectionSlug, model);
|
|
93
135
|
const payloadWhere = convertWhereClause({
|
|
94
136
|
idType: config.idType,
|
|
95
137
|
model,
|
|
@@ -102,23 +144,19 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
102
144
|
}
|
|
103
145
|
]);
|
|
104
146
|
try {
|
|
105
|
-
const
|
|
106
|
-
if (!collectionSlug || !(collectionSlug in payload.collections)) {
|
|
107
|
-
collectionSlugError(model);
|
|
108
|
-
}
|
|
109
|
-
const id = singleIdQuery(payloadWhere);
|
|
147
|
+
const singleId = singleIdQuery(payloadWhere);
|
|
110
148
|
let result = null;
|
|
111
|
-
if (
|
|
149
|
+
if (singleId) {
|
|
112
150
|
debugLog([
|
|
113
151
|
'findOneByID',
|
|
114
152
|
{
|
|
115
153
|
collectionSlug,
|
|
116
|
-
id
|
|
154
|
+
id: singleId
|
|
117
155
|
}
|
|
118
156
|
]);
|
|
119
|
-
|
|
157
|
+
result = await payload.findByID({
|
|
120
158
|
collection: collectionSlug,
|
|
121
|
-
id,
|
|
159
|
+
id: singleId,
|
|
122
160
|
select: convertSelect(model, select),
|
|
123
161
|
context: createAdapterContext({
|
|
124
162
|
model,
|
|
@@ -126,7 +164,6 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
126
164
|
}),
|
|
127
165
|
depth: PAYLOAD_QUERY_DEPTH
|
|
128
166
|
});
|
|
129
|
-
result = doc;
|
|
130
167
|
} else {
|
|
131
168
|
debugLog([
|
|
132
169
|
'findOneByWhere',
|
|
@@ -162,6 +199,9 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
162
199
|
]);
|
|
163
200
|
return transformedResult;
|
|
164
201
|
} catch (error) {
|
|
202
|
+
if (error instanceof Error && 'status' in error && error.status === 404) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
165
205
|
errorLog([
|
|
166
206
|
'Error in findOne: ',
|
|
167
207
|
error
|
|
@@ -169,10 +209,12 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
169
209
|
return null;
|
|
170
210
|
}
|
|
171
211
|
},
|
|
172
|
-
async findMany (
|
|
212
|
+
async findMany ({ model, where, limit = 10, sortBy, offset = 0 }) {
|
|
173
213
|
const start = Date.now();
|
|
174
|
-
const
|
|
175
|
-
const collectionSlug =
|
|
214
|
+
const payload = await resolvePayloadClient();
|
|
215
|
+
const collectionSlug = getCollectionSlug(model);
|
|
216
|
+
// Validate collection exists before proceeding
|
|
217
|
+
await validateCollection(payload, collectionSlug, model);
|
|
176
218
|
const payloadWhere = convertWhereClause({
|
|
177
219
|
idType: config.idType,
|
|
178
220
|
model,
|
|
@@ -188,43 +230,9 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
188
230
|
}
|
|
189
231
|
]);
|
|
190
232
|
try {
|
|
191
|
-
const payload = await resolvePayloadClient();
|
|
192
|
-
if (!collectionSlug || !(collectionSlug in payload.collections)) {
|
|
193
|
-
collectionSlugError(model);
|
|
194
|
-
}
|
|
195
233
|
let result = null;
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
if (multipleIds && multipleIds.length > 0) {
|
|
199
|
-
debugLog([
|
|
200
|
-
'findManyByMultipleIDs',
|
|
201
|
-
{
|
|
202
|
-
collectionSlug,
|
|
203
|
-
ids: multipleIds
|
|
204
|
-
}
|
|
205
|
-
]);
|
|
206
|
-
const res = {
|
|
207
|
-
docs: [],
|
|
208
|
-
totalDocs: 0
|
|
209
|
-
};
|
|
210
|
-
for (const id of multipleIds){
|
|
211
|
-
const doc = await payload.findByID({
|
|
212
|
-
collection: collectionSlug,
|
|
213
|
-
id,
|
|
214
|
-
depth: PAYLOAD_QUERY_DEPTH,
|
|
215
|
-
context: createAdapterContext({
|
|
216
|
-
model,
|
|
217
|
-
operation: 'findManyByMultipleIDs'
|
|
218
|
-
})
|
|
219
|
-
});
|
|
220
|
-
res.docs.push(doc);
|
|
221
|
-
res.totalDocs++;
|
|
222
|
-
}
|
|
223
|
-
result = {
|
|
224
|
-
docs: res.docs,
|
|
225
|
-
totalDocs: res.totalDocs
|
|
226
|
-
};
|
|
227
|
-
} else if (singleId) {
|
|
234
|
+
const singleId = singleIdQuery(payloadWhere);
|
|
235
|
+
if (singleId) {
|
|
228
236
|
debugLog([
|
|
229
237
|
'findManyBySingleID',
|
|
230
238
|
{
|
|
@@ -255,11 +263,14 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
255
263
|
payloadWhere
|
|
256
264
|
}
|
|
257
265
|
]);
|
|
266
|
+
const spill = offset % limit;
|
|
267
|
+
const page = Math.floor(offset / limit) + 1;
|
|
268
|
+
const fetchLimit = spill ? limit + spill : limit;
|
|
258
269
|
const res = await payload.find({
|
|
259
270
|
collection: collectionSlug,
|
|
260
271
|
where: payloadWhere,
|
|
261
|
-
limit:
|
|
262
|
-
page:
|
|
272
|
+
limit: fetchLimit,
|
|
273
|
+
page: page,
|
|
263
274
|
sort: convertSort(model, sortBy),
|
|
264
275
|
depth: PAYLOAD_QUERY_DEPTH,
|
|
265
276
|
context: createAdapterContext({
|
|
@@ -268,14 +279,14 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
268
279
|
})
|
|
269
280
|
});
|
|
270
281
|
result = {
|
|
271
|
-
docs: res.docs,
|
|
282
|
+
docs: res.docs.slice(spill, spill + limit),
|
|
272
283
|
totalDocs: res.totalDocs
|
|
273
284
|
};
|
|
274
285
|
}
|
|
275
286
|
const transformedResult = result?.docs.map((doc)=>transformOutput({
|
|
276
287
|
doc,
|
|
277
288
|
model
|
|
278
|
-
})) ??
|
|
289
|
+
})) ?? [];
|
|
279
290
|
debugLog([
|
|
280
291
|
'findMany result',
|
|
281
292
|
{
|
|
@@ -286,6 +297,9 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
286
297
|
]);
|
|
287
298
|
return transformedResult;
|
|
288
299
|
} catch (error) {
|
|
300
|
+
if (error instanceof Error && 'status' in error && error.status === 404) {
|
|
301
|
+
return [];
|
|
302
|
+
}
|
|
289
303
|
errorLog([
|
|
290
304
|
'Error in findMany: ',
|
|
291
305
|
error
|
|
@@ -293,15 +307,22 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
293
307
|
return [];
|
|
294
308
|
}
|
|
295
309
|
},
|
|
296
|
-
async update (
|
|
310
|
+
async update ({ model, where, update }) {
|
|
297
311
|
const start = Date.now();
|
|
298
|
-
const
|
|
299
|
-
const collectionSlug =
|
|
312
|
+
const payload = await resolvePayloadClient();
|
|
313
|
+
const collectionSlug = getCollectionSlug(model);
|
|
314
|
+
// Validate collection exists before proceeding
|
|
315
|
+
await validateCollection(payload, collectionSlug, model);
|
|
300
316
|
const payloadWhere = convertWhereClause({
|
|
301
317
|
idType: config.idType,
|
|
302
318
|
model,
|
|
303
319
|
where
|
|
304
320
|
});
|
|
321
|
+
const transformedInput = transformInput({
|
|
322
|
+
data: update,
|
|
323
|
+
model,
|
|
324
|
+
idType: config.idType
|
|
325
|
+
});
|
|
305
326
|
debugLog([
|
|
306
327
|
'update',
|
|
307
328
|
{
|
|
@@ -310,10 +331,6 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
310
331
|
}
|
|
311
332
|
]);
|
|
312
333
|
try {
|
|
313
|
-
const payload = await resolvePayloadClient();
|
|
314
|
-
if (!collectionSlug || !(collectionSlug in payload.collections)) {
|
|
315
|
-
collectionSlugError(model);
|
|
316
|
-
}
|
|
317
334
|
let result = null;
|
|
318
335
|
const id = singleIdQuery(payloadWhere);
|
|
319
336
|
if (id) {
|
|
@@ -324,17 +341,16 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
324
341
|
id
|
|
325
342
|
}
|
|
326
343
|
]);
|
|
327
|
-
|
|
344
|
+
result = await payload.update({
|
|
328
345
|
collection: collectionSlug,
|
|
329
346
|
id,
|
|
330
|
-
data:
|
|
347
|
+
data: transformedInput,
|
|
331
348
|
depth: PAYLOAD_QUERY_DEPTH,
|
|
332
349
|
context: createAdapterContext({
|
|
333
350
|
model,
|
|
334
351
|
operation: 'updateByID'
|
|
335
352
|
})
|
|
336
353
|
});
|
|
337
|
-
result = doc;
|
|
338
354
|
} else {
|
|
339
355
|
debugLog([
|
|
340
356
|
'updateByWhere',
|
|
@@ -346,7 +362,7 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
346
362
|
const doc = await payload.update({
|
|
347
363
|
collection: collectionSlug,
|
|
348
364
|
where: payloadWhere,
|
|
349
|
-
data:
|
|
365
|
+
data: transformedInput,
|
|
350
366
|
depth: PAYLOAD_QUERY_DEPTH,
|
|
351
367
|
context: createAdapterContext({
|
|
352
368
|
model,
|
|
@@ -360,7 +376,7 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
360
376
|
model
|
|
361
377
|
});
|
|
362
378
|
debugLog([
|
|
363
|
-
'update
|
|
379
|
+
'update-result',
|
|
364
380
|
{
|
|
365
381
|
collectionSlug,
|
|
366
382
|
transformedResult,
|
|
@@ -369,6 +385,9 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
369
385
|
]);
|
|
370
386
|
return transformedResult;
|
|
371
387
|
} catch (error) {
|
|
388
|
+
if (error instanceof Error && 'status' in error && error.status === 404) {
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
372
391
|
errorLog([
|
|
373
392
|
'Error in update: ',
|
|
374
393
|
error
|
|
@@ -376,15 +395,22 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
376
395
|
return null;
|
|
377
396
|
}
|
|
378
397
|
},
|
|
379
|
-
async updateMany (
|
|
398
|
+
async updateMany ({ model, where, update }) {
|
|
380
399
|
const start = Date.now();
|
|
381
|
-
const
|
|
382
|
-
const collectionSlug =
|
|
400
|
+
const payload = await resolvePayloadClient();
|
|
401
|
+
const collectionSlug = getCollectionSlug(model);
|
|
402
|
+
// Validate collection exists before proceeding
|
|
403
|
+
await validateCollection(payload, collectionSlug, model);
|
|
383
404
|
const payloadWhere = convertWhereClause({
|
|
384
405
|
idType: config.idType,
|
|
385
406
|
model,
|
|
386
407
|
where
|
|
387
408
|
});
|
|
409
|
+
const transformedInput = transformInput({
|
|
410
|
+
data: update,
|
|
411
|
+
model,
|
|
412
|
+
idType: config.idType
|
|
413
|
+
});
|
|
388
414
|
debugLog([
|
|
389
415
|
'updateMany',
|
|
390
416
|
{
|
|
@@ -394,14 +420,10 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
394
420
|
}
|
|
395
421
|
]);
|
|
396
422
|
try {
|
|
397
|
-
const payload = await resolvePayloadClient();
|
|
398
|
-
if (!collectionSlug || !(collectionSlug in payload.collections)) {
|
|
399
|
-
collectionSlugError(model);
|
|
400
|
-
}
|
|
401
423
|
const { docs: updateResult } = await payload.update({
|
|
402
424
|
collection: collectionSlug,
|
|
403
425
|
where: payloadWhere,
|
|
404
|
-
data:
|
|
426
|
+
data: transformedInput,
|
|
405
427
|
depth: PAYLOAD_QUERY_DEPTH,
|
|
406
428
|
context: createAdapterContext({
|
|
407
429
|
model,
|
|
@@ -418,6 +440,9 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
418
440
|
]);
|
|
419
441
|
return updateResult?.length || 0;
|
|
420
442
|
} catch (error) {
|
|
443
|
+
if (error instanceof Error && 'status' in error && error.status === 404) {
|
|
444
|
+
return 0;
|
|
445
|
+
}
|
|
421
446
|
errorLog([
|
|
422
447
|
'Error in updateMany: ',
|
|
423
448
|
error
|
|
@@ -425,10 +450,12 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
425
450
|
return 0;
|
|
426
451
|
}
|
|
427
452
|
},
|
|
428
|
-
async delete (
|
|
453
|
+
async delete ({ model, where }) {
|
|
429
454
|
const start = Date.now();
|
|
430
|
-
const
|
|
431
|
-
const collectionSlug =
|
|
455
|
+
const payload = await resolvePayloadClient();
|
|
456
|
+
const collectionSlug = getCollectionSlug(model);
|
|
457
|
+
// Validate collection exists before proceeding
|
|
458
|
+
await validateCollection(payload, collectionSlug, model);
|
|
432
459
|
const payloadWhere = convertWhereClause({
|
|
433
460
|
idType: config.idType,
|
|
434
461
|
model,
|
|
@@ -441,23 +468,19 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
441
468
|
}
|
|
442
469
|
]);
|
|
443
470
|
try {
|
|
444
|
-
const payload = await resolvePayloadClient();
|
|
445
|
-
if (!collectionSlug || !(collectionSlug in payload.collections)) {
|
|
446
|
-
collectionSlugError(model);
|
|
447
|
-
}
|
|
448
471
|
let deleteResult = null;
|
|
449
|
-
const
|
|
450
|
-
if (
|
|
472
|
+
const singleId = singleIdQuery(payloadWhere);
|
|
473
|
+
if (singleId) {
|
|
451
474
|
debugLog([
|
|
452
475
|
'deleteByID',
|
|
453
476
|
{
|
|
454
477
|
collectionSlug,
|
|
455
|
-
id
|
|
478
|
+
id: singleId
|
|
456
479
|
}
|
|
457
480
|
]);
|
|
458
481
|
const doc = await payload.delete({
|
|
459
482
|
collection: collectionSlug,
|
|
460
|
-
id,
|
|
483
|
+
id: singleId,
|
|
461
484
|
depth: PAYLOAD_QUERY_DEPTH,
|
|
462
485
|
context: createAdapterContext({
|
|
463
486
|
model,
|
|
@@ -498,19 +521,22 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
498
521
|
duration: `${Date.now() - start}ms`
|
|
499
522
|
}
|
|
500
523
|
]);
|
|
501
|
-
return;
|
|
502
524
|
} catch (error) {
|
|
525
|
+
if (error instanceof Error && 'status' in error && error.status === 404) {
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
503
528
|
errorLog([
|
|
504
529
|
'Error in delete: ',
|
|
505
530
|
error
|
|
506
531
|
]);
|
|
507
|
-
return;
|
|
508
532
|
}
|
|
509
533
|
},
|
|
510
|
-
async deleteMany (
|
|
534
|
+
async deleteMany ({ model, where }) {
|
|
511
535
|
const start = Date.now();
|
|
512
|
-
const
|
|
513
|
-
const collectionSlug =
|
|
536
|
+
const payload = await resolvePayloadClient();
|
|
537
|
+
const collectionSlug = getCollectionSlug(model);
|
|
538
|
+
// Validate collection exists before proceeding
|
|
539
|
+
await validateCollection(payload, collectionSlug, model);
|
|
514
540
|
const payloadWhere = convertWhereClause({
|
|
515
541
|
idType: config.idType,
|
|
516
542
|
model,
|
|
@@ -524,10 +550,6 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
524
550
|
}
|
|
525
551
|
]);
|
|
526
552
|
try {
|
|
527
|
-
const payload = await resolvePayloadClient();
|
|
528
|
-
if (!collectionSlug || !(collectionSlug in payload.collections)) {
|
|
529
|
-
collectionSlugError(model);
|
|
530
|
-
}
|
|
531
553
|
const deleteResult = await payload.delete({
|
|
532
554
|
collection: collectionSlug,
|
|
533
555
|
where: payloadWhere,
|
|
@@ -547,6 +569,9 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
547
569
|
]);
|
|
548
570
|
return deleteResult.docs.length;
|
|
549
571
|
} catch (error) {
|
|
572
|
+
if (error instanceof Error && 'status' in error && error.status === 404) {
|
|
573
|
+
return 0;
|
|
574
|
+
}
|
|
550
575
|
errorLog([
|
|
551
576
|
'Error in deleteMany: ',
|
|
552
577
|
error
|
|
@@ -554,10 +579,12 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
554
579
|
return 0;
|
|
555
580
|
}
|
|
556
581
|
},
|
|
557
|
-
async count (
|
|
582
|
+
async count ({ model, where }) {
|
|
558
583
|
const start = Date.now();
|
|
559
|
-
const
|
|
560
|
-
const collectionSlug =
|
|
584
|
+
const payload = await resolvePayloadClient();
|
|
585
|
+
const collectionSlug = getCollectionSlug(model);
|
|
586
|
+
// Validate collection exists before proceeding
|
|
587
|
+
await validateCollection(payload, collectionSlug, model);
|
|
561
588
|
const payloadWhere = convertWhereClause({
|
|
562
589
|
idType: config.idType,
|
|
563
590
|
model,
|
|
@@ -571,10 +598,6 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
571
598
|
}
|
|
572
599
|
]);
|
|
573
600
|
try {
|
|
574
|
-
const payload = await resolvePayloadClient();
|
|
575
|
-
if (!collectionSlug || !(collectionSlug in payload.collections)) {
|
|
576
|
-
collectionSlugError(model);
|
|
577
|
-
}
|
|
578
601
|
const result = await payload.count({
|
|
579
602
|
collection: collectionSlug,
|
|
580
603
|
where: payloadWhere,
|
|
@@ -596,6 +619,9 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
596
619
|
]);
|
|
597
620
|
return result.totalDocs;
|
|
598
621
|
} catch (error) {
|
|
622
|
+
if (error instanceof Error && 'status' in error && error.status === 404) {
|
|
623
|
+
return 0;
|
|
624
|
+
}
|
|
599
625
|
errorLog([
|
|
600
626
|
'Error in count: ',
|
|
601
627
|
error
|
|
@@ -621,4 +647,4 @@ const payloadAdapter = (payloadClient, config)=>{
|
|
|
621
647
|
};
|
|
622
648
|
export { generateSchema, payloadAdapter };
|
|
623
649
|
|
|
624
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJldHRlckF1dGhFcnJvciB9IGZyb20gJ2JldHRlci1hdXRoJ1xuaW1wb3J0IHR5cGUgeyBBZGFwdGVyLCBCZXR0ZXJBdXRoT3B0aW9ucywgV2hlcmUgfSBmcm9tICdiZXR0ZXItYXV0aCdcbmltcG9ydCB7IGdlbmVyYXRlU2NoZW1hIH0gZnJvbSAnLi9nZW5lcmF0ZS1zY2hlbWEnXG5pbXBvcnQgeyBjcmVhdGVUcmFuc2Zvcm0gfSBmcm9tICcuL3RyYW5zZm9ybSdcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEFkYXB0ZXIgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgQkVUVEVSX0FVVEhfQ09OVEVYVF9LRVkgPSAncGF5bG9hZC1kYi1hZGFwdGVyJ1xuY29uc3QgUEFZTE9BRF9RVUVSWV9ERVBUSCA9IDJcblxuY29uc3QgcGF5bG9hZEFkYXB0ZXI6IFBheWxvYWRBZGFwdGVyID0gKHBheWxvYWRDbGllbnQsIGNvbmZpZykgPT4ge1xuICBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnlbXSkge1xuICAgIGlmIChjb25maWcuZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZygnW3BheWxvYWQtZGItYWRhcHRlcl0nLCAuLi5tZXNzYWdlKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yTG9nKG1lc3NhZ2U6IGFueVtdKSB7XG4gICAgY29uc29sZS5lcnJvcihgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbDogc3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IEJldHRlckF1dGhFcnJvcihgQ29sbGVjdGlvbiAke21vZGVsfSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcGF5bG9hZCBjb2xsZWN0aW9uIHNsdWdzIG1hdGNoIHRoZSBiZXR0ZXIgYXV0aCBzY2hlbWFgKVxuICB9XG5cbiAgY29uc3QgY3JlYXRlQWRhcHRlckNvbnRleHQgPSAoZGF0YTogUmVjb3JkPHN0cmluZywgYW55PikgPT4gKHtcbiAgICBbQkVUVEVSX0FVVEhfQ09OVEVYVF9LRVldOiB7IC4uLmRhdGEgfVxuICB9KVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQYXlsb2FkQ2xpZW50KCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eXBlb2YgcGF5bG9hZENsaWVudCA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IHBheWxvYWRDbGllbnQoKSA6IGF3YWl0IHBheWxvYWRDbGllbnRcbiAgICBpZiAoIXBheWxvYWQuY29uZmlnPy5jdXN0b20/Lmhhc0JldHRlckF1dGhQbHVnaW4pIHtcbiAgICAgIHRocm93IG5ldyBCZXR0ZXJBdXRoRXJyb3IoYFBheWxvYWQgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aGUgYmV0dGVyLWF1dGggcGx1Z2luLiBQbGVhc2UgYWRkIHRoZSBwbHVnaW4gdG8geW91ciBwYXlsb2FkIGNvbmZpZy5gKVxuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgcmV0dXJuIChvcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucyk6IEFkYXB0ZXIgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHRyYW5zZm9ybUlucHV0LFxuICAgICAgdHJhbnNmb3JtT3V0cHV0LFxuICAgICAgY29udmVydFdoZXJlQ2xhdXNlLFxuICAgICAgY29udmVydFNlbGVjdCxcbiAgICAgIGNvbnZlcnRTb3J0LFxuICAgICAgZ2V0TW9kZWxOYW1lLFxuICAgICAgc2luZ2xlSWRRdWVyeSxcbiAgICAgIG11bHRpcGxlSWRzUXVlcnlcbiAgICB9ID0gY3JlYXRlVHJhbnNmb3JtKG9wdGlvbnMsIGNvbmZpZy5lbmFibGVEZWJ1Z0xvZ3MgPz8gZmFsc2UpXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdwYXlsb2FkJyxcbiAgICAgIGFzeW5jIGNyZWF0ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgUiA9IFQ+KGRhdGE6IHsgbW9kZWw6IHN0cmluZzsgZGF0YTogVDsgc2VsZWN0Pzogc3RyaW5nW10gfSk6IFByb21pc2U8Uj4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgeyBtb2RlbCwgZGF0YTogdmFsdWVzLCBzZWxlY3QgfSA9IGRhdGFcbiAgICAgICAgY29uc3QgY29sbGVjdGlvblNsdWcgPSBnZXRNb2RlbE5hbWUobW9kZWwpXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gdHJhbnNmb3JtSW5wdXQoe1xuICAgICAgICAgIGRhdGE6IHZhbHVlcyxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBhY3Rpb246ICdjcmVhdGUnLFxuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZVxuICAgICAgICB9KVxuICAgICAgICBkZWJ1Z0xvZyhbJ2NyZWF0ZScsIHsgY29sbGVjdGlvblNsdWcsIHRyYW5zZm9ybWVkLCBzZWxlY3QgfV0pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBheWxvYWQuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWQsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnZlcnRTZWxlY3QobW9kZWwsIHNlbGVjdCksXG4gICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7IG1vZGVsLCBvcGVyYXRpb246ICdjcmVhdGUnIH0pLFxuICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEhcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmVzdWx0ID0gdHJhbnNmb3JtT3V0cHV0KHtcbiAgICAgICAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgICAgICAgbW9kZWxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdjcmVhdGUgcmVzdWx0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHRyYW5zZm9ybWVkUmVzdWx0LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUmVzdWx0IGFzIFJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIGNyZWF0aW5nOicsIG1vZGVsLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGwgYXMgUlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgZmluZE9uZTxUPihkYXRhOiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyBzZWxlY3Q/OiBzdHJpbmdbXSB9KTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgeyBtb2RlbCwgd2hlcmUsIHNlbGVjdCB9ID0gZGF0YVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldE1vZGVsTmFtZShtb2RlbClcbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcbiAgICAgICAgZGVidWdMb2coWydmaW5kT25lJywgeyBjb2xsZWN0aW9uU2x1ZyB9XSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICAgIGlmICghY29sbGVjdGlvblNsdWcgfHwgIShjb2xsZWN0aW9uU2x1ZyBpbiBwYXlsb2FkLmNvbGxlY3Rpb25zKSkge1xuICAgICAgICAgICAgY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBsZXQgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGxcbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsnZmluZE9uZUJ5SUQnLCB7IGNvbGxlY3Rpb25TbHVnLCBpZCB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBheWxvYWQuZmluZEJ5SUQoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIHNlbGVjdDogY29udmVydFNlbGVjdChtb2RlbCwgc2VsZWN0KSxcbiAgICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoe1xuICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2ZpbmRPbmVCeUlEJ1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEhcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXN1bHQgPSBkb2NcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdMb2coWydmaW5kT25lQnlXaGVyZScsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvY3MgPSBhd2FpdCBwYXlsb2FkLmZpbmQoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgICAgc2VsZWN0OiBjb252ZXJ0U2VsZWN0KG1vZGVsLCBzZWxlY3QpLFxuICAgICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7XG4gICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnZmluZE9uZUJ5V2hlcmUnXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgICAgbGltaXQ6IDFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXN1bHQgPSBkb2NzLmRvY3NbMF1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSZXN1bHQgPSB0cmFuc2Zvcm1PdXRwdXQ8dHlwZW9mIHJlc3VsdCB8IG51bGw+KHtcbiAgICAgICAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgICAgICAgbW9kZWxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdmaW5kT25lIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJlc3VsdCBhcyBUXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBmaW5kT25lOiAnLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGZpbmRNYW55PFQ+KGRhdGE6IHtcbiAgICAgICAgbW9kZWw6IHN0cmluZ1xuICAgICAgICB3aGVyZT86IFdoZXJlW11cbiAgICAgICAgbGltaXQ/OiBudW1iZXJcbiAgICAgICAgc29ydEJ5Pzoge1xuICAgICAgICAgIGZpZWxkOiBzdHJpbmdcbiAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnXG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0PzogbnVtYmVyXG4gICAgICB9KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHsgbW9kZWwsIHdoZXJlLCBzb3J0QnksIGxpbWl0LCBvZmZzZXQgfSA9IGRhdGFcbiAgICAgICAgY29uc3QgY29sbGVjdGlvblNsdWcgPSBnZXRNb2RlbE5hbWUobW9kZWwpXG4gICAgICAgIGNvbnN0IHBheWxvYWRXaGVyZSA9IGNvbnZlcnRXaGVyZUNsYXVzZSh7XG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHdoZXJlXG4gICAgICAgIH0pXG4gICAgICAgIGRlYnVnTG9nKFsnZmluZE1hbnknLCB7IGNvbGxlY3Rpb25TbHVnLCBzb3J0QnksIGxpbWl0LCBvZmZzZXQgfV0pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCByZXN1bHQ6IHtcbiAgICAgICAgICAgIGRvY3M6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICAgICAgICAgICAgdG90YWxEb2NzOiBudW1iZXJcbiAgICAgICAgICB9IHwgbnVsbCA9IG51bGxcbiAgICAgICAgICBjb25zdCBtdWx0aXBsZUlkcyA9IHdoZXJlICYmIG11bHRpcGxlSWRzUXVlcnkocGF5bG9hZFdoZXJlKVxuICAgICAgICAgIGNvbnN0IHNpbmdsZUlkID0gd2hlcmUgJiYgc2luZ2xlSWRRdWVyeShwYXlsb2FkV2hlcmUpXG4gICAgICAgICAgaWYgKG11bHRpcGxlSWRzICYmIG11bHRpcGxlSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsnZmluZE1hbnlCeU11bHRpcGxlSURzJywgeyBjb2xsZWN0aW9uU2x1ZywgaWRzOiBtdWx0aXBsZUlkcyB9XSlcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgICAgICAgZG9jczogW10gYXMgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgICAgICAgICAgICB0b3RhbERvY3M6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgbXVsdGlwbGVJZHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC5maW5kQnlJRCh7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoe1xuICAgICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kTWFueUJ5TXVsdGlwbGVJRHMnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgcmVzLmRvY3MucHVzaChkb2MpXG4gICAgICAgICAgICAgIHJlcy50b3RhbERvY3MrK1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0geyBkb2NzOiByZXMuZG9jcywgdG90YWxEb2NzOiByZXMudG90YWxEb2NzIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHNpbmdsZUlkKSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZyhbJ2ZpbmRNYW55QnlTaW5nbGVJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkOiBzaW5nbGVJZCB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBheWxvYWQuZmluZEJ5SUQoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQ6IHNpbmdsZUlkLFxuICAgICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoe1xuICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2ZpbmRNYW55QnlTaW5nbGVJRCdcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXN1bHQgPSB7IGRvY3M6IGRvYyA/IFtkb2NdIDogW10sIHRvdGFsRG9jczogZG9jID8gMSA6IDAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZyhbJ2ZpbmRNYW55QnlXaGVyZScsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHBheWxvYWQuZmluZCh7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB3aGVyZTogcGF5bG9hZFdoZXJlLFxuICAgICAgICAgICAgICBsaW1pdDogbGltaXQsXG4gICAgICAgICAgICAgIHBhZ2U6IG9mZnNldCA/IE1hdGguZmxvb3Iob2Zmc2V0IC8gKGxpbWl0IHx8IDEwKSkgKyAxIDogMSxcbiAgICAgICAgICAgICAgc29ydDogY29udmVydFNvcnQobW9kZWwsIHNvcnRCeSksXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7XG4gICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnZmluZE1hbnlCeVdoZXJlJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlc3VsdCA9IHsgZG9jczogcmVzLmRvY3MsIHRvdGFsRG9jczogcmVzLnRvdGFsRG9jcyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmVzdWx0ID1cbiAgICAgICAgICAgIHJlc3VsdD8uZG9jcy5tYXAoKGRvYykgPT5cbiAgICAgICAgICAgICAgdHJhbnNmb3JtT3V0cHV0KHtcbiAgICAgICAgICAgICAgICBkb2MsXG4gICAgICAgICAgICAgICAgbW9kZWxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkgPz8gbnVsbFxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdmaW5kTWFueSByZXN1bHQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWRSZXN1bHQsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRSZXN1bHQgYXMgVFtdXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBmaW5kTWFueTogJywgZXJyb3JdKVxuICAgICAgICAgIHJldHVybiBbXSBhcyBUW11cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHVwZGF0ZTxUPihkYXRhOiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCB7IG1vZGVsLCB3aGVyZSwgdXBkYXRlIH0gPSBkYXRhXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0TW9kZWxOYW1lKG1vZGVsKVxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuICAgICAgICBkZWJ1Z0xvZyhbJ3VwZGF0ZScsIHsgY29sbGVjdGlvblNsdWcsIHVwZGF0ZSB9XSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICAgIGlmICghY29sbGVjdGlvblNsdWcgfHwgIShjb2xsZWN0aW9uU2x1ZyBpbiBwYXlsb2FkLmNvbGxlY3Rpb25zKSkge1xuICAgICAgICAgICAgY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsXG4gICAgICAgICAgY29uc3QgaWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsndXBkYXRlQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC51cGRhdGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIGRhdGE6IHVwZGF0ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHsgbW9kZWwsIG9wZXJhdGlvbjogJ3VwZGF0ZUJ5SUQnIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmVzdWx0ID0gZG9jXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsndXBkYXRlQnlXaGVyZScsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBheWxvYWQudXBkYXRlKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHdoZXJlOiBwYXlsb2FkV2hlcmUsXG4gICAgICAgICAgICAgIGRhdGE6IHVwZGF0ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICd1cGRhdGVCeVdoZXJlJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvYy5kb2NzWzBdXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmVzdWx0ID0gdHJhbnNmb3JtT3V0cHV0PHR5cGVvZiByZXN1bHQgfCBudWxsPih7XG4gICAgICAgICAgICBkb2M6IHJlc3VsdCxcbiAgICAgICAgICAgIG1vZGVsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICAndXBkYXRlIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJlc3VsdCBhcyBUXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiB1cGRhdGU6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgdXBkYXRlTWFueShkYXRhOiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgeyBtb2RlbCwgd2hlcmUsIHVwZGF0ZSB9ID0gZGF0YVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldE1vZGVsTmFtZShtb2RlbClcbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcbiAgICAgICAgZGVidWdMb2coWyd1cGRhdGVNYW55JywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlLCB1cGRhdGUgfV0pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHsgZG9jczogdXBkYXRlUmVzdWx0IH0gPSBhd2FpdCBwYXlsb2FkLnVwZGF0ZSh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgIHdoZXJlOiBwYXlsb2FkV2hlcmUsXG4gICAgICAgICAgICBkYXRhOiB1cGRhdGUsXG4gICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHsgbW9kZWwsIG9wZXJhdGlvbjogJ3VwZGF0ZU1hbnknIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICAndXBkYXRlTWFueSByZXN1bHQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgcmVzdWx0OiB1cGRhdGVSZXN1bHQsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVzdWx0Py5sZW5ndGggfHwgMFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gdXBkYXRlTWFueTogJywgZXJyb3JdKVxuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyBkZWxldGUoZGF0YTogeyBtb2RlbDogc3RyaW5nOyB3aGVyZTogV2hlcmVbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCB7IG1vZGVsLCB3aGVyZSB9ID0gZGF0YVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldE1vZGVsTmFtZShtb2RlbClcbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcbiAgICAgICAgZGVidWdMb2coWydkZWxldGUnLCB7IGNvbGxlY3Rpb25TbHVnIH1dKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNvbHZlUGF5bG9hZENsaWVudCgpXG4gICAgICAgICAgaWYgKCFjb2xsZWN0aW9uU2x1ZyB8fCAhKGNvbGxlY3Rpb25TbHVnIGluIHBheWxvYWQuY29sbGVjdGlvbnMpKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uU2x1Z0Vycm9yKG1vZGVsKVxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgZGVsZXRlUmVzdWx0OiB7XG4gICAgICAgICAgICBkb2M6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsXG4gICAgICAgICAgICBlcnJvcnM6IGFueVtdXG4gICAgICAgICAgfSB8IG51bGwgPSBudWxsXG4gICAgICAgICAgY29uc3QgaWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsnZGVsZXRlQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC5kZWxldGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7IG1vZGVsLCBvcGVyYXRpb246ICdkZWxldGVCeUlEJyB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGRlbGV0ZVJlc3VsdCA9IHsgZG9jLCBlcnJvcnM6IFtdIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdMb2coWydkZWxldGVCeVdoZXJlJywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC5kZWxldGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdkZWxldGVCeVdoZXJlJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGRlbGV0ZVJlc3VsdCA9IHsgZG9jOiBkb2MuZG9jc1swXSwgZXJyb3JzOiBbXSB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdkZWxldGUgcmVzdWx0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHJlc3VsdDogZGVsZXRlUmVzdWx0LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBkZWxldGU6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGRlbGV0ZU1hbnkoZGF0YTogeyBtb2RlbDogc3RyaW5nOyB3aGVyZTogV2hlcmVbXSB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHsgbW9kZWwsIHdoZXJlIH0gPSBkYXRhXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0TW9kZWxOYW1lKG1vZGVsKVxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuICAgICAgICBkZWJ1Z0xvZyhbJ2RlbGV0ZU1hbnknLCB7IGNvbGxlY3Rpb25TbHVnLCBwYXlsb2FkV2hlcmUgfV0pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRlbGV0ZVJlc3VsdCA9IGF3YWl0IHBheWxvYWQuZGVsZXRlKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoeyBtb2RlbCwgb3BlcmF0aW9uOiAnZGVsZXRlTWFueScgfSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdkZWxldGVNYW55IHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICByZXN1bHQ6IGRlbGV0ZVJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICAgIHJldHVybiBkZWxldGVSZXN1bHQuZG9jcy5sZW5ndGhcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIGRlbGV0ZU1hbnk6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgY291bnQoZGF0YTogeyBtb2RlbDogc3RyaW5nOyB3aGVyZT86IFdoZXJlW10gfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCB7IG1vZGVsLCB3aGVyZSB9ID0gZGF0YVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldE1vZGVsTmFtZShtb2RlbClcbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcbiAgICAgICAgZGVidWdMb2coWydjb3VudCcsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICAgIGlmICghY29sbGVjdGlvblNsdWcgfHwgIShjb2xsZWN0aW9uU2x1ZyBpbiBwYXlsb2FkLmNvbGxlY3Rpb25zKSkge1xuICAgICAgICAgICAgY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGF5bG9hZC5jb3VudCh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgIHdoZXJlOiBwYXlsb2FkV2hlcmUsXG4gICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHsgbW9kZWwsIG9wZXJhdGlvbjogJ2NvdW50JyB9KVxuICAgICAgICAgIH0pXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ2NvdW50IHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICByZXN1bHQ6IHsgdG90YWxEb2NzOiByZXN1bHQudG90YWxEb2NzIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvdGFsRG9jc1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gY291bnQ6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY3JlYXRlU2NoZW1hOiBhc3luYyAob3B0aW9ucywgZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBzY2hlbWFDb2RlID0gYXdhaXQgZ2VuZXJhdGVTY2hlbWEob3B0aW9ucylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBzY2hlbWFDb2RlLFxuICAgICAgICAgIHBhdGg6IGZpbGUgfHwgJ3NjaGVtYS50cycsXG4gICAgICAgICAgYXBwZW5kOiBmYWxzZSxcbiAgICAgICAgICBvdmVyd3JpdGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgZW5hYmxlRGVidWdMb2dzOiBjb25maWcuZW5hYmxlRGVidWdMb2dzLFxuICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgZ2VuZXJhdGVTY2hlbWEsIHBheWxvYWRBZGFwdGVyIH1cbiJdLCJuYW1lcyI6WyJCZXR0ZXJBdXRoRXJyb3IiLCJnZW5lcmF0ZVNjaGVtYSIsImNyZWF0ZVRyYW5zZm9ybSIsIkJFVFRFUl9BVVRIX0NPTlRFWFRfS0VZIiwiUEFZTE9BRF9RVUVSWV9ERVBUSCIsInBheWxvYWRBZGFwdGVyIiwicGF5bG9hZENsaWVudCIsImNvbmZpZyIsImRlYnVnTG9nIiwibWVzc2FnZSIsImVuYWJsZURlYnVnTG9ncyIsImNvbnNvbGUiLCJsb2ciLCJlcnJvckxvZyIsImVycm9yIiwiY29sbGVjdGlvblNsdWdFcnJvciIsIm1vZGVsIiwiY3JlYXRlQWRhcHRlckNvbnRleHQiLCJkYXRhIiwicmVzb2x2ZVBheWxvYWRDbGllbnQiLCJwYXlsb2FkIiwiY3VzdG9tIiwiaGFzQmV0dGVyQXV0aFBsdWdpbiIsIm9wdGlvbnMiLCJ0cmFuc2Zvcm1JbnB1dCIsInRyYW5zZm9ybU91dHB1dCIsImNvbnZlcnRXaGVyZUNsYXVzZSIsImNvbnZlcnRTZWxlY3QiLCJjb252ZXJ0U29ydCIsImdldE1vZGVsTmFtZSIsInNpbmdsZUlkUXVlcnkiLCJtdWx0aXBsZUlkc1F1ZXJ5IiwiaWQiLCJjcmVhdGUiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJ2YWx1ZXMiLCJzZWxlY3QiLCJjb2xsZWN0aW9uU2x1ZyIsInRyYW5zZm9ybWVkIiwiYWN0aW9uIiwiaWRUeXBlIiwiY29sbGVjdGlvbnMiLCJyZXN1bHQiLCJjb2xsZWN0aW9uIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsImRlcHRoIiwidHJhbnNmb3JtZWRSZXN1bHQiLCJkb2MiLCJkdXJhdGlvbiIsImZpbmRPbmUiLCJ3aGVyZSIsInBheWxvYWRXaGVyZSIsImZpbmRCeUlEIiwiZG9jcyIsImZpbmQiLCJsaW1pdCIsImZpbmRNYW55Iiwic29ydEJ5Iiwib2Zmc2V0IiwibXVsdGlwbGVJZHMiLCJzaW5nbGVJZCIsImxlbmd0aCIsImlkcyIsInJlcyIsInRvdGFsRG9jcyIsInB1c2giLCJwYWdlIiwiTWF0aCIsImZsb29yIiwic29ydCIsIm1hcCIsInVwZGF0ZSIsInVwZGF0ZU1hbnkiLCJ1cGRhdGVSZXN1bHQiLCJkZWxldGUiLCJkZWxldGVSZXN1bHQiLCJlcnJvcnMiLCJkZWxldGVNYW55IiwiY291bnQiLCJjcmVhdGVTY2hlbWEiLCJmaWxlIiwic2NoZW1hQ29kZSIsImNvZGUiLCJwYXRoIiwiYXBwZW5kIiwib3ZlcndyaXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxlQUFlLFFBQVEsY0FBYTtBQUU3QyxTQUFTQyxjQUFjLFFBQVEsb0JBQW1CO0FBQ2xELFNBQVNDLGVBQWUsUUFBUSxjQUFhO0FBRzdDLE9BQU8sTUFBTUMsMEJBQTBCLHFCQUFvQjtBQUMzRCxNQUFNQyxzQkFBc0I7QUFFNUIsTUFBTUMsaUJBQWlDLENBQUNDLGVBQWVDO0lBQ3JELFNBQVNDLFNBQVNDLE9BQWM7UUFDOUIsSUFBSUYsT0FBT0csZUFBZSxFQUFFO1lBQzFCQyxRQUFRQyxHQUFHLENBQUMsMkJBQTJCSDtRQUN6QztJQUNGO0lBRUEsU0FBU0ksU0FBU0osT0FBYztRQUM5QkUs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
|
|
650
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJldHRlckF1dGhFcnJvciB9IGZyb20gJ2JldHRlci1hdXRoJ1xuaW1wb3J0IHR5cGUgeyBBZGFwdGVyLCBCZXR0ZXJBdXRoT3B0aW9ucywgV2hlcmUgfSBmcm9tICdiZXR0ZXItYXV0aCdcbmltcG9ydCB7IGdlbmVyYXRlU2NoZW1hIH0gZnJvbSAnLi9nZW5lcmF0ZS1zY2hlbWEnXG5pbXBvcnQgeyBjcmVhdGVUcmFuc2Zvcm0gfSBmcm9tICcuL3RyYW5zZm9ybSdcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEFkYXB0ZXIgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgQkVUVEVSX0FVVEhfQ09OVEVYVF9LRVkgPSAncGF5bG9hZC1kYi1hZGFwdGVyJ1xuY29uc3QgUEFZTE9BRF9RVUVSWV9ERVBUSCA9IDBcblxuLyoqXG4gKiBQYXlsb2FkIGFkYXB0ZXIgZm9yIEJldHRlciBBdXRoXG4gKlxuICogVGhpcyBhZGFwdGVyIGNvbm5lY3RzIEJldHRlciBBdXRoIHRvIFBheWxvYWQgQ01TLCBhbGxvd2luZyBhdXRoZW50aWNhdGlvblxuICogb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgYWdhaW5zdCBQYXlsb2FkIGNvbGxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBwYXlsb2FkQ2xpZW50IC0gVGhlIFBheWxvYWQgQ01TIGNsaWVudCBpbnN0YW5jZSBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBpdFxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGFkYXB0ZXJcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgQmV0dGVyIEF1dGggYWRhcHRlclxuICovXG5jb25zdCBwYXlsb2FkQWRhcHRlcjogUGF5bG9hZEFkYXB0ZXIgPSAocGF5bG9hZENsaWVudCwgY29uZmlnKSA9PiB7XG4gIC8qKlxuICAgKiBMb2dzIGRlYnVnIG1lc3NhZ2VzIGlmIGRlYnVnIGxvZ2dpbmcgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGxvZ1xuICAgKi9cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoY29uZmlnLmVuYWJsZURlYnVnTG9ncykge1xuICAgICAgY29uc29sZS5sb2coJ1twYXlsb2FkLWRiLWFkYXB0ZXJdJywgLi4ubWVzc2FnZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBlcnJvciBtZXNzYWdlc1xuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGxvZ1xuICAgKi9cbiAgZnVuY3Rpb24gZXJyb3JMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBjb25zb2xlLmVycm9yKGBbcGF5bG9hZC1kYi1hZGFwdGVyXWAsIC4uLm1lc3NhZ2UpXG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIGVycm9yIHdoZW4gYSBjb2xsZWN0aW9uIHNsdWcgZG9lc24ndCBleGlzdFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSB0aGF0IGNvdWxkbid0IGJlIGZvdW5kXG4gICAqIEB0aHJvd3Mge0JldHRlckF1dGhFcnJvcn0gV2hlbiB0aGUgY29sbGVjdGlvbiBkb2Vzbid0IGV4aXN0XG4gICAqIEByZXR1cm5zIE5ldmVyIC0gRnVuY3Rpb24gYWx3YXlzIHRocm93c1xuICAgKi9cbiAgZnVuY3Rpb24gY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbDogc3RyaW5nKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBCZXR0ZXJBdXRoRXJyb3IoYENvbGxlY3Rpb24gJHttb2RlbH0gZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBjaGVjayB5b3VyIHBheWxvYWQgY29sbGVjdGlvbiBzbHVncyBtYXRjaCB0aGUgYmV0dGVyIGF1dGggc2NoZW1hYClcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBhIGNvbGxlY3Rpb24gZXhpc3RzIGluIFBheWxvYWRcbiAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgUGF5bG9hZCBjbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25TbHVnIC0gVGhlIGNvbGxlY3Rpb24gc2x1ZyB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICogQHRocm93cyB7QmV0dGVyQXV0aEVycm9yfSBXaGVuIHRoZSBjb2xsZWN0aW9uIGRvZXNuJ3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQ29sbGVjdGlvbihwYXlsb2FkOiBhbnksIGNvbGxlY3Rpb25TbHVnOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb250ZXh0IG9iamVjdCBmb3IgUGF5bG9hZCBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBkYXRhIC0gRGF0YSB0byBpbmNsdWRlIGluIHRoZSBjb250ZXh0XG4gICAqIEByZXR1cm5zIFRoZSBjb250ZXh0IG9iamVjdCB3aXRoIEJldHRlciBBdXRoIG1ldGFkYXRhXG4gICAqL1xuICBjb25zdCBjcmVhdGVBZGFwdGVyQ29udGV4dCA9IChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiAoe1xuICAgIFtCRVRURVJfQVVUSF9DT05URVhUX0tFWV06IHsgLi4uZGF0YSB9XG4gIH0pXG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBQYXlsb2FkIGNsaWVudCwgaGFuZGxpbmcgYm90aCBmdW5jdGlvbiBhbmQgZGlyZWN0IHJlZmVyZW5jZXNcbiAgICogQHJldHVybnMgVGhlIHJlc29sdmVkIFBheWxvYWQgY2xpZW50XG4gICAqIEB0aHJvd3Mge0JldHRlckF1dGhFcnJvcn0gV2hlbiBCZXR0ZXIgQXV0aCBwbHVnaW4gaXMgbm90IGNvbmZpZ3VyZWRcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQYXlsb2FkQ2xpZW50KCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eXBlb2YgcGF5bG9hZENsaWVudCA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IHBheWxvYWRDbGllbnQoKSA6IGF3YWl0IHBheWxvYWRDbGllbnRcbiAgICBpZiAoIXBheWxvYWQuY29uZmlnPy5jdXN0b20/Lmhhc0JldHRlckF1dGhQbHVnaW4pIHtcbiAgICAgIHRocm93IG5ldyBCZXR0ZXJBdXRoRXJyb3IoYFBheWxvYWQgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aGUgYmV0dGVyLWF1dGggcGx1Z2luLiBQbGVhc2UgYWRkIHRoZSBwbHVnaW4gdG8geW91ciBwYXlsb2FkIGNvbmZpZy5gKVxuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBCZXR0ZXIgQXV0aCBhZGFwdGVyIGZvciBQYXlsb2FkXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQmV0dGVyIEF1dGggb3B0aW9uc1xuICAgKiBAcmV0dXJucyBBIEJldHRlciBBdXRoIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIHJldHVybiAob3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMpOiBBZGFwdGVyID0+IHtcbiAgICBjb25zdCB7IHRyYW5zZm9ybUlucHV0LCB0cmFuc2Zvcm1PdXRwdXQsIGNvbnZlcnRXaGVyZUNsYXVzZSwgY29udmVydFNlbGVjdCwgY29udmVydFNvcnQsIGdldENvbGxlY3Rpb25TbHVnLCBzaW5nbGVJZFF1ZXJ5IH0gPVxuICAgICAgY3JlYXRlVHJhbnNmb3JtKG9wdGlvbnMsIGNvbmZpZy5lbmFibGVEZWJ1Z0xvZ3MgPz8gZmFsc2UpXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdwYXlsb2FkLWFkYXB0ZXInLFxuICAgICAgYXN5bmMgY3JlYXRlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBSID0gVD4oe1xuICAgICAgICBtb2RlbCxcbiAgICAgICAgZGF0YTogdmFsdWVzLFxuICAgICAgICBzZWxlY3RcbiAgICAgIH06IHtcbiAgICAgICAgbW9kZWw6IHN0cmluZ1xuICAgICAgICBkYXRhOiBUXG4gICAgICAgIHNlbGVjdD86IHN0cmluZ1tdXG4gICAgICB9KTogUHJvbWlzZTxSPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNvbGxlY3Rpb24gZXhpc3RzIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAgICAgIGF3YWl0IHZhbGlkYXRlQ29sbGVjdGlvbihwYXlsb2FkLCBjb2xsZWN0aW9uU2x1ZywgbW9kZWwpXG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRJbnB1dCA9IHRyYW5zZm9ybUlucHV0KHtcbiAgICAgICAgICBkYXRhOiB2YWx1ZXMsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVidWdMb2coWydjcmVhdGUnLCB7IGNvbGxlY3Rpb25TbHVnLCB0cmFuc2Zvcm1lZElucHV0LCBzZWxlY3QgfV0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXlsb2FkLmNyZWF0ZSh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgIGRhdGE6IHRyYW5zZm9ybWVkSW5wdXQsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnZlcnRTZWxlY3QobW9kZWwsIHNlbGVjdCksXG4gICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7IG1vZGVsLCBvcGVyYXRpb246ICdjcmVhdGUnIH0pLFxuICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEhcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSZXN1bHQgPSB0cmFuc2Zvcm1PdXRwdXQoe1xuICAgICAgICAgICAgZG9jOiByZXN1bHQsXG4gICAgICAgICAgICBtb2RlbFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICAnY3JlYXRlIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUmVzdWx0IGFzIFJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIGNyZWF0aW5nOicsIG1vZGVsLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGwgYXMgUlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgZmluZE9uZTxSPih7IG1vZGVsLCB3aGVyZSwgc2VsZWN0IH06IHsgbW9kZWw6IHN0cmluZzsgd2hlcmU6IFdoZXJlW107IHNlbGVjdD86IHN0cmluZ1tdIH0pOiBQcm9taXNlPFIgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNvbGxlY3Rpb24gZXhpc3RzIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAgICAgIGF3YWl0IHZhbGlkYXRlQ29sbGVjdGlvbihwYXlsb2FkLCBjb2xsZWN0aW9uU2x1ZywgbW9kZWwpXG5cbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcblxuICAgICAgICBkZWJ1Z0xvZyhbJ2ZpbmRPbmUnLCB7IGNvbGxlY3Rpb25TbHVnIH1dKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2luZ2xlSWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBsZXQgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGxcblxuICAgICAgICAgIGlmIChzaW5nbGVJZCkge1xuICAgICAgICAgICAgZGVidWdMb2coWydmaW5kT25lQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkOiBzaW5nbGVJZCB9XSlcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHBheWxvYWQuZmluZEJ5SUQoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQ6IHNpbmdsZUlkLFxuICAgICAgICAgICAgICBzZWxlY3Q6IGNvbnZlcnRTZWxlY3QobW9kZWwsIHNlbGVjdCksXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kT25lQnlJRCdcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRIXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZyhbJ2ZpbmRPbmVCeVdoZXJlJywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jcyA9IGF3YWl0IHBheWxvYWQuZmluZCh7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB3aGVyZTogcGF5bG9hZFdoZXJlLFxuICAgICAgICAgICAgICBzZWxlY3Q6IGNvbnZlcnRTZWxlY3QobW9kZWwsIHNlbGVjdCksXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kT25lQnlXaGVyZSdcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgICBsaW1pdDogMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvY3MuZG9jc1swXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmVzdWx0ID0gdHJhbnNmb3JtT3V0cHV0PHR5cGVvZiByZXN1bHQgfCBudWxsPih7XG4gICAgICAgICAgICBkb2M6IHJlc3VsdCxcbiAgICAgICAgICAgIG1vZGVsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdmaW5kT25lIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUmVzdWx0IGFzIFJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnc3RhdHVzJyBpbiBlcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBmaW5kT25lOiAnLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGZpbmRNYW55PFI+KHtcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICBsaW1pdCA9IDEwLFxuICAgICAgICBzb3J0QnksXG4gICAgICAgIG9mZnNldCA9IDBcbiAgICAgIH06IHtcbiAgICAgICAgbW9kZWw6IHN0cmluZ1xuICAgICAgICB3aGVyZT86IFdoZXJlW11cbiAgICAgICAgbGltaXQ/OiBudW1iZXJcbiAgICAgICAgc29ydEJ5Pzoge1xuICAgICAgICAgIGZpZWxkOiBzdHJpbmdcbiAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnXG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0PzogbnVtYmVyXG4gICAgICB9KTogUHJvbWlzZTxSW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNvbHZlUGF5bG9hZENsaWVudCgpXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWwpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY29sbGVjdGlvbiBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmdcbiAgICAgICAgYXdhaXQgdmFsaWRhdGVDb2xsZWN0aW9uKHBheWxvYWQsIGNvbGxlY3Rpb25TbHVnLCBtb2RlbClcblxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuXG4gICAgICAgIGRlYnVnTG9nKFsnZmluZE1hbnknLCB7IGNvbGxlY3Rpb25TbHVnLCBzb3J0QnksIGxpbWl0LCBvZmZzZXQgfV0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgcmVzdWx0OiB7XG4gICAgICAgICAgICBkb2NzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgICAgICAgICAgIHRvdGFsRG9jczogbnVtYmVyXG4gICAgICAgICAgfSB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgICBjb25zdCBzaW5nbGVJZCA9IHNpbmdsZUlkUXVlcnkocGF5bG9hZFdoZXJlKVxuICAgICAgICAgIGlmIChzaW5nbGVJZCkge1xuICAgICAgICAgICAgZGVidWdMb2coWydmaW5kTWFueUJ5U2luZ2xlSUQnLCB7IGNvbGxlY3Rpb25TbHVnLCBpZDogc2luZ2xlSWQgfV0pXG4gICAgICAgICAgICBjb25zdCBkb2MgPSBhd2FpdCBwYXlsb2FkLmZpbmRCeUlEKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIGlkOiBzaW5nbGVJZCxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kTWFueUJ5U2luZ2xlSUQnXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmVzdWx0ID0geyBkb2NzOiBkb2MgPyBbZG9jXSA6IFtdLCB0b3RhbERvY3M6IGRvYyA/IDEgOiAwIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdMb2coWydmaW5kTWFueUJ5V2hlcmUnLCB7IGNvbGxlY3Rpb25TbHVnLCBwYXlsb2FkV2hlcmUgfV0pXG4gICAgICAgICAgICBjb25zdCBzcGlsbCA9IG9mZnNldCAlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5mbG9vcihvZmZzZXQgLyBsaW1pdCkgKyAxXG4gICAgICAgICAgICBjb25zdCBmZXRjaExpbWl0ID0gc3BpbGwgPyBsaW1pdCArIHNwaWxsIDogbGltaXRcblxuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcGF5bG9hZC5maW5kKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHdoZXJlOiBwYXlsb2FkV2hlcmUsXG4gICAgICAgICAgICAgIGxpbWl0OiBmZXRjaExpbWl0LFxuICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxuICAgICAgICAgICAgICBzb3J0OiBjb252ZXJ0U29ydChtb2RlbCwgc29ydEJ5KSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kTWFueUJ5V2hlcmUnXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmVzdWx0ID0geyBkb2NzOiByZXMuZG9jcy5zbGljZShzcGlsbCwgc3BpbGwgKyBsaW1pdCksIHRvdGFsRG9jczogcmVzLnRvdGFsRG9jcyB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSZXN1bHQgPVxuICAgICAgICAgICAgcmVzdWx0Py5kb2NzLm1hcCgoZG9jKSA9PlxuICAgICAgICAgICAgICB0cmFuc2Zvcm1PdXRwdXQoe1xuICAgICAgICAgICAgICAgIGRvYyxcbiAgICAgICAgICAgICAgICBtb2RlbFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSA/PyBbXVxuXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ2ZpbmRNYW55IHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUmVzdWx0IGFzIFJbXVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdzdGF0dXMnIGluIGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gW10gYXMgUltdXG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gZmluZE1hbnk6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gW10gYXMgUltdXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyB1cGRhdGU8Uj4oeyBtb2RlbCwgd2hlcmUsIHVwZGF0ZSB9OiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPFIgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNvbGxlY3Rpb24gZXhpc3RzIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAgICAgIGF3YWl0IHZhbGlkYXRlQ29sbGVjdGlvbihwYXlsb2FkLCBjb2xsZWN0aW9uU2x1ZywgbW9kZWwpXG5cbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZElucHV0ID0gdHJhbnNmb3JtSW5wdXQoe1xuICAgICAgICAgIGRhdGE6IHVwZGF0ZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGVcbiAgICAgICAgfSlcblxuICAgICAgICBkZWJ1Z0xvZyhbJ3VwZGF0ZScsIHsgY29sbGVjdGlvblNsdWcsIHVwZGF0ZSB9XSlcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbFxuICAgICAgICAgIGNvbnN0IGlkID0gc2luZ2xlSWRRdWVyeShwYXlsb2FkV2hlcmUpXG5cbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsndXBkYXRlQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkIH1dKVxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGF5bG9hZC51cGRhdGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIGRhdGE6IHRyYW5zZm9ybWVkSW5wdXQsXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7IG1vZGVsLCBvcGVyYXRpb246ICd1cGRhdGVCeUlEJyB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdMb2coWyd1cGRhdGVCeVdoZXJlJywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC51cGRhdGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRJbnB1dCxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICd1cGRhdGVCeVdoZXJlJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvYy5kb2NzWzBdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSZXN1bHQgPSB0cmFuc2Zvcm1PdXRwdXQ8dHlwZW9mIHJlc3VsdCB8IG51bGw+KHtcbiAgICAgICAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgICAgICAgbW9kZWxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ3VwZGF0ZS1yZXN1bHQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWRSZXN1bHQsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcblxuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJlc3VsdCBhcyBSXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ3N0YXR1cycgaW4gZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gdXBkYXRlOiAnLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHVwZGF0ZU1hbnkoeyBtb2RlbCwgd2hlcmUsIHVwZGF0ZSB9OiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgY29uc3QgY29sbGVjdGlvblNsdWcgPSBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbClcblxuICAgICAgICAvLyBWYWxpZGF0ZSBjb2xsZWN0aW9uIGV4aXN0cyBiZWZvcmUgcHJvY2VlZGluZ1xuICAgICAgICBhd2FpdCB2YWxpZGF0ZUNvbGxlY3Rpb24ocGF5bG9hZCwgY29sbGVjdGlvblNsdWcsIG1vZGVsKVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWRXaGVyZSA9IGNvbnZlcnRXaGVyZUNsYXVzZSh7XG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHdoZXJlXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRJbnB1dCA9IHRyYW5zZm9ybUlucHV0KHtcbiAgICAgICAgICBkYXRhOiB1cGRhdGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVidWdMb2coWyd1cGRhdGVNYW55JywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlLCB1cGRhdGUgfV0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGRvY3M6IHVwZGF0ZVJlc3VsdCB9ID0gYXdhaXQgcGF5bG9hZC51cGRhdGUoe1xuICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICB3aGVyZTogcGF5bG9hZFdoZXJlLFxuICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRJbnB1dCxcbiAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoeyBtb2RlbCwgb3BlcmF0aW9uOiAndXBkYXRlTWFueScgfSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ3VwZGF0ZU1hbnkgcmVzdWx0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHJlc3VsdDogdXBkYXRlUmVzdWx0LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG5cbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVzdWx0Py5sZW5ndGggfHwgMFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdzdGF0dXMnIGluIGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIHVwZGF0ZU1hbnk6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgZGVsZXRlKHsgbW9kZWwsIHdoZXJlIH06IHsgbW9kZWw6IHN0cmluZzsgd2hlcmU6IFdoZXJlW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgY29uc3QgY29sbGVjdGlvblNsdWcgPSBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbClcblxuICAgICAgICAvLyBWYWxpZGF0ZSBjb2xsZWN0aW9uIGV4aXN0cyBiZWZvcmUgcHJvY2VlZGluZ1xuICAgICAgICBhd2FpdCB2YWxpZGF0ZUNvbGxlY3Rpb24ocGF5bG9hZCwgY29sbGVjdGlvblNsdWcsIG1vZGVsKVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWRXaGVyZSA9IGNvbnZlcnRXaGVyZUNsYXVzZSh7XG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHdoZXJlXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVidWdMb2coWydkZWxldGUnLCB7IGNvbGxlY3Rpb25TbHVnIH1dKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IGRlbGV0ZVJlc3VsdDoge1xuICAgICAgICAgICAgZG9jOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbFxuICAgICAgICAgICAgZXJyb3JzOiBhbnlbXVxuICAgICAgICAgIH0gfCBudWxsID0gbnVsbFxuXG4gICAgICAgICAgY29uc3Qgc2luZ2xlSWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBpZiAoc2luZ2xlSWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsnZGVsZXRlQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkOiBzaW5nbGVJZCB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBheWxvYWQuZGVsZXRlKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIGlkOiBzaW5nbGVJZCxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHsgbW9kZWwsIG9wZXJhdGlvbjogJ2RlbGV0ZUJ5SUQnIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZGVsZXRlUmVzdWx0ID0geyBkb2MsIGVycm9yczogW10gfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZyhbJ2RlbGV0ZUJ5V2hlcmUnLCB7IGNvbGxlY3Rpb25TbHVnLCBwYXlsb2FkV2hlcmUgfV0pXG4gICAgICAgICAgICBjb25zdCBkb2MgPSBhd2FpdCBwYXlsb2FkLmRlbGV0ZSh7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB3aGVyZTogcGF5bG9hZFdoZXJlLFxuICAgICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoe1xuICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2RlbGV0ZUJ5V2hlcmUnXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZGVsZXRlUmVzdWx0ID0geyBkb2M6IGRvYy5kb2NzWzBdLCBlcnJvcnM6IFtdIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICAnZGVsZXRlIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICByZXN1bHQ6IGRlbGV0ZVJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdzdGF0dXMnIGluIGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBkZWxldGU6ICcsIGVycm9yXSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGRlbGV0ZU1hbnkoeyBtb2RlbCwgd2hlcmUgfTogeyBtb2RlbDogc3RyaW5nOyB3aGVyZTogV2hlcmVbXSB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNvbHZlUGF5bG9hZENsaWVudCgpXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWwpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY29sbGVjdGlvbiBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmdcbiAgICAgICAgYXdhaXQgdmFsaWRhdGVDb2xsZWN0aW9uKHBheWxvYWQsIGNvbGxlY3Rpb25TbHVnLCBtb2RlbClcblxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuXG4gICAgICAgIGRlYnVnTG9nKFsnZGVsZXRlTWFueScsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZVJlc3VsdCA9IGF3YWl0IHBheWxvYWQuZGVsZXRlKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoeyBtb2RlbCwgb3BlcmF0aW9uOiAnZGVsZXRlTWFueScgfSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ2RlbGV0ZU1hbnkgcmVzdWx0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHJlc3VsdDogZGVsZXRlUmVzdWx0LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG5cbiAgICAgICAgICByZXR1cm4gZGVsZXRlUmVzdWx0LmRvY3MubGVuZ3RoXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ3N0YXR1cycgaW4gZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gZGVsZXRlTWFueTogJywgZXJyb3JdKVxuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyBjb3VudCh7IG1vZGVsLCB3aGVyZSB9OiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlPzogV2hlcmVbXSB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNvbHZlUGF5bG9hZENsaWVudCgpXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWwpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY29sbGVjdGlvbiBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmdcbiAgICAgICAgYXdhaXQgdmFsaWRhdGVDb2xsZWN0aW9uKHBheWxvYWQsIGNvbGxlY3Rpb25TbHVnLCBtb2RlbClcblxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuXG4gICAgICAgIGRlYnVnTG9nKFsnY291bnQnLCB7IGNvbGxlY3Rpb25TbHVnLCBwYXlsb2FkV2hlcmUgfV0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXlsb2FkLmNvdW50KHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoeyBtb2RlbCwgb3BlcmF0aW9uOiAnY291bnQnIH0pXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdjb3VudCByZXN1bHQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgcmVzdWx0OiB7IHRvdGFsRG9jczogcmVzdWx0LnRvdGFsRG9jcyB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvdGFsRG9jc1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdzdGF0dXMnIGluIGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIGNvdW50OiAnLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNyZWF0ZVNjaGVtYTogYXN5bmMgKG9wdGlvbnMsIGZpbGUpID0+IHtcbiAgICAgICAgY29uc3Qgc2NoZW1hQ29kZSA9IGF3YWl0IGdlbmVyYXRlU2NoZW1hKG9wdGlvbnMpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29kZTogc2NoZW1hQ29kZSxcbiAgICAgICAgICBwYXRoOiBmaWxlIHx8ICdzY2hlbWEudHMnLFxuICAgICAgICAgIGFwcGVuZDogZmFsc2UsXG4gICAgICAgICAgb3ZlcndyaXRlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGVuYWJsZURlYnVnTG9nczogY29uZmlnLmVuYWJsZURlYnVnTG9ncyxcbiAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IGdlbmVyYXRlU2NoZW1hLCBwYXlsb2FkQWRhcHRlciB9XG4iXSwibmFtZXMiOlsiQmV0dGVyQXV0aEVycm9yIiwiZ2VuZXJhdGVTY2hlbWEiLCJjcmVhdGVUcmFuc2Zvcm0iLCJCRVRURVJfQVVUSF9DT05URVhUX0tFWSIsIlBBWUxPQURfUVVFUllfREVQVEgiLCJwYXlsb2FkQWRhcHRlciIsInBheWxvYWRDbGllbnQiLCJjb25maWciLCJkZWJ1Z0xvZyIsIm1lc3NhZ2UiLCJlbmFibGVEZWJ1Z0xvZ3MiLCJjb25zb2xlIiwibG9nIiwiZXJyb3JMb2ciLCJlcnJvciIsImNvbGxlY3Rpb25TbHVnRXJyb3IiLCJtb2RlbCIsInZhbGlkYXRlQ29sbGVjdGlvbiIsInBheWxvYWQiLCJjb2xsZWN0aW9uU2x1ZyIsImNvbGxlY3Rpb25zIiwiY3JlYXRlQWRhcHRlckNvbnRleHQiLCJkYXRhIiwicmVzb2x2ZVBheWxvYWRDbGllbnQiLCJjdXN0b20iLCJoYXNCZXR0ZXJBdXRoUGx1Z2luIiwib3B0aW9ucyIsInRyYW5zZm9ybUlucHV0IiwidHJhbnNmb3JtT3V0cHV0IiwiY29udmVydFdoZXJlQ2xhdXNlIiwiY29udmVydFNlbGVjdCIsImNvbnZlcnRTb3J0IiwiZ2V0Q29sbGVjdGlvblNsdWciLCJzaW5nbGVJZFF1ZXJ5IiwiaWQiLCJjcmVhdGUiLCJ2YWx1ZXMiLCJzZWxlY3QiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJ0cmFuc2Zvcm1lZElucHV0IiwiaWRUeXBlIiwicmVzdWx0IiwiY29sbGVjdGlvbiIsImNvbnRleHQiLCJvcGVyYXRpb24iLCJkZXB0aCIsInRyYW5zZm9ybWVkUmVzdWx0IiwiZG9jIiwiZHVyYXRpb24iLCJmaW5kT25lIiwid2hlcmUiLCJwYXlsb2FkV2hlcmUiLCJzaW5nbGVJZCIsImZpbmRCeUlEIiwiZG9jcyIsImZpbmQiLCJsaW1pdCIsIkVycm9yIiwic3RhdHVzIiwiZmluZE1hbnkiLCJzb3J0QnkiLCJvZmZzZXQiLCJ0b3RhbERvY3MiLCJzcGlsbCIsInBhZ2UiLCJNYXRoIiwiZmxvb3IiLCJmZXRjaExpbWl0IiwicmVzIiwic29ydCIsInNsaWNlIiwibWFwIiwidXBkYXRlIiwidXBkYXRlTWFueSIsInVwZGF0ZVJlc3VsdCIsImxlbmd0aCIsImRlbGV0ZSIsImRlbGV0ZVJlc3VsdCIsImVycm9ycyIsImRlbGV0ZU1hbnkiLCJjb3VudCIsImNyZWF0ZVNjaGVtYSIsImZpbGUiLCJzY2hlbWFDb2RlIiwiY29kZSIsInBhdGgiLCJhcHBlbmQiLCJvdmVyd3JpdGUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsUUFBUSxjQUFhO0FBRTdDLFNBQVNDLGNBQWMsUUFBUSxvQkFBbUI7QUFDbEQsU0FBU0MsZUFBZSxRQUFRLGNBQWE7QUFHN0MsT0FBTyxNQUFNQywwQkFBMEIscUJBQW9CO0FBQzNELE1BQU1DLHNCQUFzQjtBQUU1Qjs7Ozs7Ozs7O0NBU0MsR0FDRCxNQUFNQyxpQkFBaUMsQ0FBQ0MsZUFBZUM7SUFDckQ7OztHQUdDLEdBQ0QsU0FBU0MsU0FBU0MsT0FBYztRQUM5QixJQUFJRixPQUFPRyxlQUFlLEVBQUU7WUFDMUJDLFFBQVFDLEdBQUcsQ0FBQywyQkFBMkJIO1FBQ3pDO0lBQ0Y7SUFFQTs7O0dBR0MsR0FDRCxTQUFTSSxTQUFTSixPQUFjO1FBQzlCRSxRQUFRRyxLQUFLLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLTDtJQUMzQztJQUVBOzs7OztHQUtDLEdBQ0QsU0FBU00sb0JBQW9CQyxLQUFhO1FBQ3hDLE1BQU0sSUFBSWhCLGdCQUFnQixDQUFDLFdBQVcsRUFBRWdCLE1BQU0sd0ZBQXdGLENBQUM7SUFDekk7SUFFQTs7Ozs7O0dBTUMsR0FDRCxlQUFlQyxtQkFBbUJDLE9BQVksRUFBRUMsY0FBc0IsRUFBRUgsS0FBYTtRQUNuRixJQUFJLENBQUNHLGtCQUFrQixDQUFFQSxDQUFBQSxrQkFBa0JELFFBQVFFLFdBQVcsQUFBRCxHQUFJO1lBQy9ETCxvQkFBb0JDO1FBQ3RCO0lBQ0Y7SUFFQTs7OztHQUlDLEdBQ0QsTUFBTUssdUJBQXVCLENBQUNDLE9BQStCLENBQUE7WUFDM0QsQ0FBQ25CLHdCQUF3QixFQUFFO2dCQUFF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
|