payload-auth 1.4.1 → 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.
Files changed (207) hide show
  1. package/dist/better-auth/adapter/transform/index.js +3 -3
  2. package/dist/better-auth/generated-types.d.ts +216 -0
  3. package/dist/better-auth/generated-types.d.ts.map +1 -0
  4. package/dist/better-auth/generated-types.js +4 -0
  5. package/dist/better-auth/plugin/constants.d.ts +145 -3
  6. package/dist/better-auth/plugin/constants.d.ts.map +1 -1
  7. package/dist/better-auth/plugin/constants.js +148 -6
  8. package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts +13 -0
  9. package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts.map +1 -0
  10. package/dist/better-auth/plugin/helpers/check-plugin-exists.js +14 -0
  11. package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts +22 -0
  12. package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts.map +1 -0
  13. package/dist/better-auth/plugin/helpers/get-better-auth-schema.js +50 -0
  14. package/dist/better-auth/plugin/helpers/get-collection-schema-map.d.ts +16 -0
  15. package/dist/better-auth/plugin/helpers/get-collection-schema-map.d.ts.map +1 -0
  16. package/dist/better-auth/plugin/helpers/get-collection-schema-map.js +108 -0
  17. package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts +6 -0
  18. package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts.map +1 -0
  19. package/dist/better-auth/plugin/helpers/get-collection-slug.js +20 -0
  20. package/dist/better-auth/plugin/helpers/get-collection.d.ts +41 -0
  21. package/dist/better-auth/plugin/helpers/get-collection.d.ts.map +1 -0
  22. package/dist/better-auth/plugin/helpers/get-collection.js +62 -0
  23. package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts +8 -16
  24. package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts.map +1 -1
  25. package/dist/better-auth/plugin/helpers/prepare-session-data.js +9 -20
  26. package/dist/better-auth/plugin/index.d.ts +3 -3
  27. package/dist/better-auth/plugin/index.d.ts.map +1 -1
  28. package/dist/better-auth/plugin/index.js +31 -40
  29. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts +2 -6
  30. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts.map +1 -1
  31. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.js +22 -7
  32. package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts +3 -6
  33. package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts.map +1 -1
  34. package/dist/better-auth/plugin/lib/build-collections/accounts/index.js +96 -102
  35. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts +2 -2
  36. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts.map +1 -1
  37. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.js +6 -5
  38. package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts +3 -5
  39. package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts.map +1 -1
  40. package/dist/better-auth/plugin/lib/build-collections/api-keys.js +97 -113
  41. package/dist/better-auth/plugin/lib/build-collections/index.d.ts +6 -6
  42. package/dist/better-auth/plugin/lib/build-collections/index.d.ts.map +1 -1
  43. package/dist/better-auth/plugin/lib/build-collections/index.js +68 -84
  44. package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts +2 -4
  45. package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts.map +1 -1
  46. package/dist/better-auth/plugin/lib/build-collections/invitations.js +75 -70
  47. package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts +3 -5
  48. package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts.map +1 -1
  49. package/dist/better-auth/plugin/lib/build-collections/jwks.js +46 -28
  50. package/dist/better-auth/plugin/lib/build-collections/members.d.ts +3 -5
  51. package/dist/better-auth/plugin/lib/build-collections/members.d.ts.map +1 -1
  52. package/dist/better-auth/plugin/lib/build-collections/members.js +52 -48
  53. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts +3 -5
  54. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts.map +1 -1
  55. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.js +74 -64
  56. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts +3 -5
  57. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts.map +1 -1
  58. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.js +78 -71
  59. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts +3 -5
  60. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts.map +1 -1
  61. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.js +68 -45
  62. package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts +3 -5
  63. package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts.map +1 -1
  64. package/dist/better-auth/plugin/lib/build-collections/organizations.js +52 -39
  65. package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts +3 -5
  66. package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts.map +1 -1
  67. package/dist/better-auth/plugin/lib/build-collections/passkeys.js +60 -64
  68. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts +3 -7
  69. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts.map +1 -1
  70. package/dist/better-auth/plugin/lib/build-collections/sessions.js +100 -98
  71. package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts +3 -5
  72. package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts.map +1 -1
  73. package/dist/better-auth/plugin/lib/build-collections/sso-providers.js +56 -56
  74. package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts +4 -0
  75. package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts.map +1 -0
  76. package/dist/better-auth/plugin/lib/build-collections/subscriptions.js +113 -0
  77. package/dist/better-auth/plugin/lib/build-collections/teams.d.ts +3 -5
  78. package/dist/better-auth/plugin/lib/build-collections/teams.d.ts.map +1 -1
  79. package/dist/better-auth/plugin/lib/build-collections/teams.js +62 -30
  80. package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts +3 -5
  81. package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts.map +1 -1
  82. package/dist/better-auth/plugin/lib/build-collections/two-factors.js +50 -37
  83. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.js +4 -4
  84. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.js +3 -3
  85. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts +6 -0
  86. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts.map +1 -0
  87. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.js +7 -0
  88. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.js +4 -4
  89. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.d.ts +2 -2
  90. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.d.ts.map +1 -1
  91. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.js +93 -96
  92. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts +1 -6
  93. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts.map +1 -1
  94. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.js +22 -13
  95. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts +1 -5
  96. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts.map +1 -1
  97. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.js +16 -8
  98. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts +2 -6
  99. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts.map +1 -1
  100. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.js +25 -6
  101. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts +2 -1
  102. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts.map +1 -1
  103. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.js +5 -8
  104. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts +7 -0
  105. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts.map +1 -0
  106. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.js +8 -0
  107. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts +1 -1
  108. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts.map +1 -1
  109. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.js +15 -12
  110. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts +1 -6
  111. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts.map +1 -1
  112. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.js +21 -10
  113. package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts +3 -7
  114. package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts.map +1 -1
  115. package/dist/better-auth/plugin/lib/build-collections/users/index.js +153 -210
  116. package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts +16 -0
  117. package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts.map +1 -0
  118. package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.js +32 -0
  119. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts +1 -1
  120. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts.map +1 -1
  121. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.js +1 -1
  122. package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts +17 -0
  123. package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts.map +1 -0
  124. package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.js +21 -0
  125. package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts +22 -0
  126. package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts.map +1 -0
  127. package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.js +95 -0
  128. package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts +3 -6
  129. package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts.map +1 -1
  130. package/dist/better-auth/plugin/lib/build-collections/verifications.js +62 -40
  131. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts.map +1 -1
  132. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.js +4 -3
  133. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts +2 -1
  134. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts.map +1 -1
  135. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.js +8 -15
  136. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts +5 -3
  137. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts.map +1 -1
  138. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.js +56 -69
  139. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts +2 -1
  140. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts.map +1 -1
  141. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.js +16 -55
  142. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts +2 -1
  143. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts.map +1 -1
  144. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.js +21 -83
  145. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts +2 -1
  146. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts.map +1 -1
  147. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.js +8 -15
  148. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts +2 -1
  149. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts.map +1 -1
  150. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.js +8 -15
  151. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts +3 -0
  152. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts.map +1 -0
  153. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.js +10 -0
  154. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts +3 -3
  155. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts.map +1 -1
  156. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.js +3 -3
  157. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts +5 -4
  158. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts.map +1 -1
  159. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.js +10 -10
  160. package/dist/better-auth/plugin/lib/set-login-methods.d.ts +1 -1
  161. package/dist/better-auth/plugin/lib/set-login-methods.d.ts.map +1 -1
  162. package/dist/better-auth/plugin/lib/set-login-methods.js +5 -6
  163. package/dist/better-auth/plugin/payload/views/admin-login/client.d.ts.map +1 -1
  164. package/dist/better-auth/plugin/payload/views/admin-login/client.js +2 -2
  165. package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts +4 -4
  166. package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts.map +1 -1
  167. package/dist/better-auth/plugin/payload/views/admin-login/index.js +7 -8
  168. package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts +1 -1
  169. package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts.map +1 -1
  170. package/dist/better-auth/plugin/payload/views/admin-signup/client.js +27 -7
  171. package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts +4 -5
  172. package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts.map +1 -1
  173. package/dist/better-auth/plugin/payload/views/admin-signup/index.js +6 -6
  174. package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts +1 -5
  175. package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts.map +1 -1
  176. package/dist/better-auth/plugin/payload/views/forgot-password/index.js +1 -1
  177. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts +3 -3
  178. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts.map +1 -1
  179. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.js +10 -7
  180. package/dist/better-auth/plugin/types.d.ts +41 -13
  181. package/dist/better-auth/plugin/types.d.ts.map +1 -1
  182. package/dist/better-auth/plugin/types.js +1 -1
  183. package/dist/better-auth/plugin/utils/set.d.ts +40 -0
  184. package/dist/better-auth/plugin/utils/set.d.ts.map +1 -0
  185. package/dist/better-auth/plugin/utils/set.js +84 -0
  186. package/dist/better-auth/scripts/generate-types.d.ts +2 -0
  187. package/dist/better-auth/scripts/generate-types.d.ts.map +1 -0
  188. package/dist/better-auth/scripts/generate-types.js +219 -0
  189. package/dist/shared/form/validation.d.ts +31 -7
  190. package/dist/shared/form/validation.d.ts.map +1 -1
  191. package/dist/shared/form/validation.js +13 -5
  192. package/package.json +14 -9
  193. package/dist/better-auth/plugin/helpers/check-passkey-plugin.d.ts +0 -3
  194. package/dist/better-auth/plugin/helpers/check-passkey-plugin.d.ts.map +0 -1
  195. package/dist/better-auth/plugin/helpers/check-passkey-plugin.js +0 -6
  196. package/dist/better-auth/plugin/helpers/check-two-factor-plugin.d.ts +0 -3
  197. package/dist/better-auth/plugin/helpers/check-two-factor-plugin.d.ts.map +0 -1
  198. package/dist/better-auth/plugin/helpers/check-two-factor-plugin.js +0 -6
  199. package/dist/better-auth/plugin/helpers/check-username-plugin.d.ts +0 -3
  200. package/dist/better-auth/plugin/helpers/check-username-plugin.d.ts.map +0 -1
  201. package/dist/better-auth/plugin/helpers/check-username-plugin.js +0 -6
  202. package/dist/better-auth/plugin/lib/get-required-collection-slugs.d.ts +0 -10
  203. package/dist/better-auth/plugin/lib/get-required-collection-slugs.d.ts.map +0 -1
  204. package/dist/better-auth/plugin/lib/get-required-collection-slugs.js +0 -35
  205. package/dist/better-auth/plugin/payload/utils/generate-metadata.d.ts +0 -15
  206. package/dist/better-auth/plugin/payload/utils/generate-metadata.d.ts.map +0 -1
  207. package/dist/better-auth/plugin/payload/utils/generate-metadata.js +0 -74
@@ -294,7 +294,7 @@ export const createTransform = (options, enableDebugLogs)=>{
294
294
  * @returns Transformed data compatible with Payload CMS
295
295
  */ function transformInput({ data, model, idType }) {
296
296
  const transformedData = {};
297
- const schemaFields = schema[model].fields;
297
+ const schemaFields = schema?.[model]?.fields ?? {};
298
298
  // Process each field in the input data
299
299
  Object.entries(data).forEach(([key, value])=>{
300
300
  // Skip null/undefined values
@@ -342,7 +342,7 @@ export const createTransform = (options, enableDebugLogs)=>{
342
342
  const result = {
343
343
  ...doc
344
344
  };
345
- const schemaFields = schema[model].fields;
345
+ const schemaFields = schema?.[model]?.fields ?? {};
346
346
  // Identify relationship fields with custom field name mappings
347
347
  const relationshipFields = Object.fromEntries(Object.entries(schemaFields).filter(([key])=>isRelationshipField(key, schemaFields)));
348
348
  Object.entries(doc).forEach(([key, value])=>{
@@ -664,4 +664,4 @@ export const createTransform = (options, enableDebugLogs)=>{
664
664
  };
665
665
  };
666
666
 
667
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWVsZEF0dHJpYnV0ZSwgRmllbGRUeXBlLCBnZXRBdXRoVGFibGVzIH0gZnJvbSAnYmV0dGVyLWF1dGgvZGInXG5pbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gJ2JldHRlci1hdXRoJ1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uU2x1ZywgV2hlcmUgYXMgUGF5bG9hZFdoZXJlIH0gZnJvbSAncGF5bG9hZCdcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybSA9IChvcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucywgZW5hYmxlRGVidWdMb2dzOiBib29sZWFuKSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IGdldEF1dGhUYWJsZXMob3B0aW9ucylcblxuICBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnlbXSkge1xuICAgIGlmIChlbmFibGVEZWJ1Z0xvZ3MpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbcGF5bG9hZC1kYi1hZGFwdGVyXWAsIC4uLm1lc3NhZ2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBtb2RlbCBuYW1lIHRvIGl0cyBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGNvbGxlY3Rpb24gc2x1Zy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiByZXNvbHZlcyB0aGUgYXBwcm9wcmlhdGUgY29sbGVjdGlvbiBzbHVnIGJ5OlxuICAgKiAxLiBMb29raW5nIHVwIHRoZSBtb2RlbCBpbiB0aGUgQmV0dGVyQXV0aCBzY2hlbWEgdG8gZmluZCBpdHMgY29uZmlndXJlZCBtb2RlbE5hbWVcbiAgICogMi4gRmFsbGluZyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCBuYW1lIGlmIG5vIG1hcHBpbmcgZXhpc3RzXG4gICAqXG4gICAqIENvbGxlY3Rpb24gc2x1ZyByZXNvbHV0aW9uIGZvbGxvd3MgdGhlc2UgcnVsZXM6XG4gICAqIC0gRm9yIGJhc2UgY29sbGVjdGlvbnM6IFRoZSBzYW5pdGl6ZUJldHRlckF1dGhPcHRpb25zIGZ1bmN0aW9uIGVuc3VyZXMgdGhlIGNvbGxlY3Rpb24gc2x1Z1xuICAgKiAgIGZyb20gcGx1Z2luIG9wdGlvbnMgaXMgc2V0IGFzIHRoZSBtb2RlbCBuYW1lIGluIHRoZSBzY2hlbWFcbiAgICogLSBGb3IgcGx1Z2luczogVGhlIGJldHRlckF1dGhQbHVnaW5TbHVncyBjb25zdGFudCBpcyB1c2VkIGFzIHRoZSBtb2RlbE5hbWVcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGNvbGxlY3Rpb24gc2x1Z1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWFbJ3VzZXInXS5tb2RlbE5hbWUgaXMgJ3VzZXJzJ1xuICAgKiBnZXRDb2xsZWN0aW9uU2x1ZygndXNlcicpIC8vIFJldHVybnMgJ3VzZXJzJ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBtb2RlbCBkb2Vzbid0IGV4aXN0IGluIHNjaGVtYVxuICAgKiBnZXRDb2xsZWN0aW9uU2x1ZygnY3VzdG9tJykgLy8gUmV0dXJucyAnY3VzdG9tJ1xuICAgKlxuICAgKiBAd2FybmluZyBJZiBhIGNvbGxlY3Rpb24gaXMgb3ZlcnJpZGRlbiB1c2luZyB0aGUgY29sbGVjdGlvbk92ZXJyaWRlIG9wdGlvblxuICAgKiB3aXRob3V0IHVwZGF0aW5nIHRoZSBzY2hlbWEgbWFwcGluZywgdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGluY29ycmVjdCBzbHVnc1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWw6IHN0cmluZyk6IENvbGxlY3Rpb25TbHVnIHtcbiAgICAvLyBGaXJzdCB0cnkgdG8gZ2V0IHRoZSBtb2RlbE5hbWUgZnJvbSBzY2hlbWEsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWVcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gc2NoZW1hW21vZGVsXT8ubW9kZWxOYW1lIHx8IG1vZGVsXG4gICAgZGVidWdMb2coWydnZXRDb2xsZWN0aW9uU2x1ZzonLCB7IG1vZGVsLCByZXNvbHZlZFNsdWc6IGNvbGxlY3Rpb24gfV0pXG4gICAgcmV0dXJuIGNvbGxlY3Rpb24gYXMgQ29sbGVjdGlvblNsdWdcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgQmV0dGVyQXV0aCBzY2hlbWEgZmllbGQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgZmllbGQgbmFtZS5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiByZXNvbHZlcyB0aGUgYXBwcm9wcmlhdGUgZmllbGQgbmFtZSBieTpcbiAgICogMS4gUHJlc2VydmluZyAnaWQnIG9yICdfaWQnIGZpZWxkcyBhcy1pcyAoc3BlY2lhbCBjYXNlIGhhbmRsaW5nKVxuICAgKiAyLiBMb29raW5nIHVwIHRoZSBmaWVsZCBpbiB0aGUgQmV0dGVyQXV0aCBzY2hlbWEgdG8gZmluZCBpdHMgY29uZmlndXJlZCBmaWVsZE5hbWVcbiAgICogMy4gRmFsbGluZyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBmaWVsZCBuYW1lIGlmIG5vIG1hcHBpbmcgZXhpc3RzXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBCZXR0ZXJBdXRoIG1vZGVsIG5hbWUgY29udGFpbmluZyB0aGUgZmllbGRcbiAgICogQHBhcmFtIGZpZWxkIC0gVGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgdG8gcmVzb2x2ZVxuICAgKiBAcmV0dXJucyBUaGUgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYVsndXNlciddLmZpZWxkc1snZW1haWwnXS5maWVsZE5hbWUgaXMgJ2VtYWlsQWRkcmVzcydcbiAgICogZ2V0RmllbGROYW1lKCd1c2VyJywgJ2VtYWlsJykgLy8gUmV0dXJucyAnZW1haWxBZGRyZXNzJ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTcGVjaWFsIGNhc2UgZm9yIElEIGZpZWxkc1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnaWQnKSAvLyBBbHdheXMgcmV0dXJucyAnaWQnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIGZpZWxkIGRvZXNuJ3QgZXhpc3QgaW4gc2NoZW1hIG9yIGhhcyBubyBmaWVsZE5hbWUgbWFwcGluZ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnY3VzdG9tJykgLy8gUmV0dXJucyAnY3VzdG9tJ1xuICAgKlxuICAgKiBAd2FybmluZyBJZiBhIGZpZWxkTmFtZSBpcyBvdmVycmlkZGVuIGluIHRoZSBwYXlsb2FkIGNvbGxlY3Rpb24gY29uZmlnIHVzaW5nIHRoZSBjb2xsZWN0aW9uT3ZlcnJpZGUgb3B0aW9uXG4gICAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHNjaGVtYSBtYXBwaW5nLCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gaW5jb3JyZWN0IGZpZWxkIG5hbWVzXG4gICAqL1xuICBmdW5jdGlvbiBnZXRGaWVsZE5hbWUobW9kZWw6IHN0cmluZywgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiAnaWQnIG9yICdfaWQnIGlzIGFsd2F5cyBwcmVzZXJ2ZWQgYXMtaXNcbiAgICBpZiAoWydpZCcsICdfaWQnXS5pbmNsdWRlcyhmaWVsZCkpIHtcbiAgICAgIHJldHVybiBmaWVsZFxuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGZpZWxkIGluIHRoZSBzY2hlbWFcbiAgICBjb25zdCBmaWVsZERlZmluaXRpb24gPSBzY2hlbWFbbW9kZWxdPy5maWVsZHNbZmllbGRdXG5cbiAgICAvLyBVc2UgdGhlIGNvbmZpZ3VyZWQgZmllbGROYW1lIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBvcmlnaW5hbFxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkRGVmaW5pdGlvbj8uZmllbGROYW1lIHx8IGZpZWxkXG5cbiAgICAvLyBMb2cgdGhlIGZpZWxkIHJlc29sdXRpb24gZm9yIGRlYnVnZ2luZ1xuICAgIGRlYnVnTG9nKFsnZ2V0RmllbGQ6ICcsIHsgbW9kZWwsIG9yaWdpbmFsRmllbGQ6IGZpZWxkLCBmaWVsZE5hbWUgfV0pXG5cbiAgICByZXR1cm4gZmllbGROYW1lXG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIGJ5IGNoZWNraW5nIGZvciBhIHJlZmVyZW5jZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIFJlbGF0aW9uc2hpcCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgbW9kZWwuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIHRvIGlkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZEtleSAtIFRoZSBrZXkgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHNjaGVtYUZpZWxkcyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIChoYXMgcmVmZXJlbmNlcyksIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMucG9zdHMgaGFzIHsgcmVmZXJlbmNlczoge30gfVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdwb3N0cycsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyB0cnVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYS51c2VyLmZpZWxkcy5lbWFpbCBoYXMgbm8gcmVmZXJlbmNlcyBwcm9wZXJ0eVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdlbWFpbCcsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyBmYWxzZVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbnNoaXBGaWVsZChmaWVsZEtleTogc3RyaW5nLCBzY2hlbWFGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpZWxkQXR0cmlidXRlPEZpZWxkVHlwZT4+KTogYm9vbGVhbiB7XG4gICAgLy8gQSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBpZiBpdCBoYXMgYSAncmVmZXJlbmNlcycgcHJvcGVydHkgZGVmaW5lZFxuICAgIHJldHVybiBzY2hlbWFGaWVsZHNbZmllbGRLZXldPy5yZWZlcmVuY2VzICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgaW50byBhIERhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgYW5kIGNhbiBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkXG4gICAqIGludG8gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0IHVzaW5nIERhdGUucGFyc2UoKS4gSXQncyB1c2VkIHRvIGlkZW50aWZ5IGRhdGUgZmllbGRzXG4gICAqIGR1cmluZyBkYXRhIHRyYW5zZm9ybWF0aW9uIHByb2Nlc3Nlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0J3MgYSB2YWxpZCBkYXRlIHN0cmluZ1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgYSBkYXRlLCBmYWxzZSBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyB0cnVlIGZvciBJU08gZGF0ZSBzdHJpbmdzXG4gICAqIGlzRGF0ZUZpZWxkKCcyMDIzLTAxLTAxVDEyOjAwOjAwWicpIC8vIHRydWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBmYWxzZSBmb3Igbm9uLWRhdGUgc3RyaW5ncyBvciBvdGhlciB0eXBlc1xuICAgKiBpc0RhdGVGaWVsZCgnbm90IGEgZGF0ZScpIC8vIGZhbHNlXG4gICAqIGlzRGF0ZUZpZWxkKDEyMykgLy8gZmFsc2VcbiAgICovXG4gIGZ1bmN0aW9uIGlzRGF0ZUZpZWxkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB2YWx1ZSBpcyBhIHN0cmluZyBhbmQgY2FuIGJlIHBhcnNlZCBhcyBhIHZhbGlkIGRhdGVcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgYSBzaW5nbGUgSUQgdmFsdWUgZnJvbSBhIFBheWxvYWQgd2hlcmUgY2xhdXNlIGlmIGl0IHJlcHJlc2VudHMgYSBzaW1wbGUgSUQgcXVlcnkuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gYW5hbHl6ZXMgYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSB0byBkZXRlcm1pbmUgaWYgaXQncyBhIHNpbXBsZSBxdWVyeSBmb3IgYVxuICAgKiBzaW5nbGUgZG9jdW1lbnQgYnkgSUQuIEl0IHN1cHBvcnRzIGJvdGggJ2lkJyBhbmQgJ19pZCcgZmllbGRzIHdpdGggJ2VxdWFscycgb3IgJ2NvbnRhaW5zJ1xuICAgKiBvcGVyYXRvcnMuIFRoaXMgaXMgdXNlZnVsIGZvciBvcHRpbWl6aW5nIHF1ZXJpZXMgd2hlbiB3ZSBvbmx5IG5lZWQgdG8gZmV0Y2ggYSBzaW5nbGUgZG9jdW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSAtIFRoZSBQYXlsb2FkIHdoZXJlIGNsYXVzZSB0byBhbmFseXplXG4gICAqIEByZXR1cm5zIFRoZSBJRCB2YWx1ZSAoc3RyaW5nIG9yIG51bWJlcikgaWYgdGhlIHdoZXJlIGNsYXVzZSBpcyBhIHNpbXBsZSBJRCBxdWVyeSwgbnVsbCBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyAnMTIzJyBmb3IgYSBzaW1wbGUgZXF1YWxzIHF1ZXJ5XG4gICAqIHNpbmdsZUlkUXVlcnkoeyBpZDogeyBlcXVhbHM6ICcxMjMnIH0gfSkgLy8gJzEyMydcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyA0NTYgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeSB3aXRoIG51bWJlciBJRFxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgX2lkOiB7IGVxdWFsczogNDU2IH0gfSkgLy8gNDU2XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzc4OScgZm9yIGEgY29udGFpbnMgcXVlcnkgd2l0aCBhIHNpbmdsZSB2YWx1ZVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgY29udGFpbnM6IFsnNzg5J10gfSB9KSAvLyAnNzg5J1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIG51bGwgZm9yIGNvbXBsZXggcXVlcmllc1xuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgYW5kOiBbeyBpZDogeyBlcXVhbHM6ICcxMjMnIH0gfV0gfSkgLy8gbnVsbFxuICAgKi9cbiAgZnVuY3Rpb24gc2luZ2xlSWRRdWVyeSh3aGVyZTogUGF5bG9hZFdoZXJlKSB7XG4gICAgLy8gUmV0dXJuIG51bGwgZm9yIGVtcHR5IHdoZXJlIGNsYXVzZXMgb3IgY29tcGxleCBxdWVyaWVzIHdpdGggJ2FuZCcvJ29yJyBvcGVyYXRvcnNcbiAgICBpZiAoIXdoZXJlIHx8ICdhbmQnIGluIHdoZXJlIHx8ICdvcicgaW4gd2hlcmUpIHJldHVybiBudWxsXG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2hlcmUgY2xhdXNlIGNvbnRhaW5zIGVpdGhlciAnaWQnIG9yICdfaWQnIGZpZWxkXG4gICAgaWYgKFsnaWQnLCAnX2lkJ10uc29tZSgoZmllbGQpID0+IGZpZWxkIGluIHdoZXJlKSkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIElEIGZpZWxkIGlzIGJlaW5nIHVzZWQgKHN1cHBvcnQgYm90aCAnaWQnIGFuZCAnX2lkJylcbiAgICAgIGNvbnN0IGlkRmllbGQgPSAnaWQnIGluIHdoZXJlID8gJ2lkJyA6ICdfaWQnXG4gICAgICBjb25zdCBjb25kaXRpb24gPSB3aGVyZVtpZEZpZWxkXVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBlcXVhbHMgb3BlcmF0b3IgY2FzZVxuICAgICAgaWYgKGNvbmRpdGlvbiAmJiB0eXBlb2YgY29uZGl0aW9uID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjb25kaXRpb24pICYmICdlcXVhbHMnIGluIGNvbmRpdGlvbikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5lcXVhbHNcbiAgICAgICAgLy8gT25seSByZXR1cm4gc3RyaW5nIG9yIG51bWJlciBJRCB2YWx1ZXNcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIGNvbnRhaW5zIG9wZXJhdG9yIGNhc2Ugd2l0aCBhIHNpbmdsZSB2YWx1ZVxuICAgICAgaWYgKFxuICAgICAgICBjb25kaXRpb24gJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJlxuICAgICAgICAnY29udGFpbnMnIGluIGNvbmRpdGlvbiAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGNvbmRpdGlvbi5jb250YWlucykgJiZcbiAgICAgICAgY29uZGl0aW9uLmNvbnRhaW5zLmxlbmd0aCA9PT0gMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZGl0aW9uLmNvbnRhaW5zWzBdXG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBudWxsIGlmIG5vIHZhbGlkIElEIHF1ZXJ5IHdhcyBmb3VuZFxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBkYXRhIHZhbHVlcyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCByZXF1aXJlZCBJRCB0eXBlXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0eXBlIGNvbnZlcnNpb24gZm9yIHJlbGF0aW9uc2hpcCBmaWVsZHMgdG8gZW5zdXJlXG4gICAqIElEcyBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IChzdHJpbmcgb3IgbnVtYmVyKSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBmaWVsZCBrZXkvbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplXG4gICAqIEBwYXJhbSBpc1JlbGF0ZWRGaWVsZCAtIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBpc1JlbGF0ZWRGaWVsZCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIGlzUmVsYXRlZEZpZWxkOiBib29sZWFuXG4gICAgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0J1xuICB9KSB7XG4gICAgLy8gU2tpcCBwcm9jZXNzaW5nIGZvciBudWxsL3VuZGVmaW5lZCB2YWx1ZXNcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKFsnaWQnLCAnX2lkJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgaWRUeXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApXG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XSlcbiAgICAgICAgICByZXR1cm4gcGFyc2VkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlkVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICBkZWJ1Z0xvZyhbYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLCB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ0lkXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aW9uc2hpcCBmaWVsZHMgdGhhdCBuZWVkIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChpc1JlbGF0ZWRGaWVsZCkge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBJRCB2YWx1ZSBjb252ZXJzaW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBpZFR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHZhbHVlLCAxMClcbiAgICAgICAgaWYgKCFpc05hTihwYXJzZWQpKSB7XG4gICAgICAgICAgZGVidWdMb2coW2BJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBzdHJpbmcgSUQgdG8gbnVtYmVyYCwgeyBvcmlnaW5hbDogdmFsdWUsIGNvbnZlcnRlZDogcGFyc2VkIH1dKVxuICAgICAgICAgIHJldHVybiBwYXJzZWRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlkVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICBkZWJ1Z0xvZyhbYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLCB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ0lkXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBhcnJheSBvZiBJRHMgLSBtYXAgZWFjaCB2YWx1ZSB0byB0aGUgY29ycmVjdCB0eXBlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoaWQpID0+IHtcbiAgICAgICAgICAvLyBTa2lwIG51bGwvdW5kZWZpbmVkIHZhbHVlcyBpbiBhcnJheXNcbiAgICAgICAgICBpZiAoaWQgPT09IG51bGwgfHwgaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGlkXG5cbiAgICAgICAgICBpZiAoaWRUeXBlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChpZCwgMTApXG4gICAgICAgICAgICByZXR1cm4gIWlzTmFOKHBhcnNlZCkgPyBwYXJzZWQgOiBpZFxuICAgICAgICAgIH0gZWxzZSBpZiAoaWRUeXBlID09PSAndGV4dCcgJiYgdHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhpZClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlkXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG9yaWdpbmFsIHZhbHVlIGlmIG5vIGNvbnZlcnNpb24gd2FzIG5lZWRlZCBvciBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBpbnB1dCBkYXRhIGZyb20gYmV0dGVyLWF1dGggdG8gUGF5bG9hZCBDTVMgZm9ybWF0XG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlczpcbiAgICogMS4gRmllbGQgbmFtZSBtYXBwaW5nIGFjY29yZGluZyB0byBzY2hlbWEgZGVmaW5pdGlvbnNcbiAgICogMi4gSUQgdHlwZSBjb252ZXJzaW9uIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAqIDMuIFByb3BlciBkYXRhIG5vcm1hbGl6YXRpb24gYmFzZWQgb24gZmllbGQgdHlwZXNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBuYW1lIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIGRhdGEgY29tcGF0aWJsZSB3aXRoIFBheWxvYWQgQ01TXG4gICAqL1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1JbnB1dCh7XG4gICAgZGF0YSxcbiAgICBtb2RlbCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICBtb2RlbDogc3RyaW5nXG4gICAgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0J1xuICB9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWFbbW9kZWxdLmZpZWxkc1xuXG4gICAgLy8gUHJvY2VzcyBlYWNoIGZpZWxkIGluIHRoZSBpbnB1dCBkYXRhXG4gICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAvLyBTa2lwIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkXG4gICAgICBjb25zdCBpc1JlbGF0ZWRGaWVsZCA9IGlzUmVsYXRpb25zaGlwRmllbGQoa2V5LCBzY2hlbWFGaWVsZHMpXG5cbiAgICAgIC8vIEdldCB0aGUgbWFwcGVkIGZpZWxkIG5hbWUgZnJvbSBzY2hlbWEgKGlmIGFueSlcbiAgICAgIGNvbnN0IHNjaGVtYUZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkc1trZXldPy5maWVsZE5hbWVcblxuICAgICAgLy8gTm9ybWFsaXplIHRoZSBkYXRhIHZhbHVlIGJhc2VkIG9uIGZpZWxkIHR5cGUgYW5kIElEIHR5cGVcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhID0gbm9ybWFsaXplRGF0YSh7XG4gICAgICAgIGlkVHlwZSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaXNSZWxhdGVkRmllbGRcbiAgICAgIH0pXG5cbiAgICAgIC8vIFVzZSB0aGUgc2NoZW1hLWRlZmluZWQgZmllbGQgbmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugb3JpZ2luYWwga2V5XG4gICAgICBjb25zdCB0YXJnZXRGaWVsZE5hbWUgPSBzY2hlbWFGaWVsZE5hbWUgfHwga2V5XG4gICAgICB0cmFuc2Zvcm1lZERhdGFbdGFyZ2V0RmllbGROYW1lXSA9IG5vcm1hbGl6ZWREYXRhXG4gICAgfSlcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIFBheWxvYWQgQ01TIGRvY3VtZW50IG91dHB1dCB0byBtYXRjaCBCZXR0ZXJBdXRoIHNjaGVtYSBleHBlY3RhdGlvbnMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXZlcmFsIGNyaXRpY2FsIHRyYW5zZm9ybWF0aW9uczpcbiAgICpcbiAgICogMS4gSUQgQ29udmVyc2lvbjogRW5zdXJlcyBhbGwgSUQgZmllbGRzIGFyZSBzdHJpbmdzIGFzIHJlcXVpcmVkIGJ5IEJldHRlckF1dGhcbiAgICogICAgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JldHRlci1hdXRoL2JldHRlci1hdXRoL2Jsb2IvbWFpbi9wYWNrYWdlcy9iZXR0ZXItYXV0aC9zcmMvZGIvc2NoZW1hLnRzI0wxMjUpXG4gICAqXG4gICAqIDIuIFJlbGF0aW9uc2hpcCBGaWVsZCBNYXBwaW5nOiBBbGlnbnMgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIEJldHRlckF1dGggc2NoZW1hIG5hbWluZyBjb252ZW50aW9uc1xuICAgKiAgICBhbmQgZW5zdXJlcyBwcm9wZXIgSUQgdHlwZSBoYW5kbGluZ1xuICAgKlxuICAgKiAzLiBEYXRlIENvbnZlcnNpb246IFRyYW5zZm9ybXMgZGF0ZSBzdHJpbmdzIGZyb20gUGF5bG9hZCBpbnRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgKlxuICAgKiBOb3RlOiBXaGlsZSBzZXR0aW5nIGRlcHRoOiAxIGluIFBheWxvYWQgb3BlcmF0aW9ucyBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBieSBhdm9pZGluZ1xuICAgKiBkZWVwbHkgbmVzdGVkIG9iamVjdHMsIHdlIG1haW50YWluIGNvbXByZWhlbnNpdmUgY2hlY2tzIGZvciByb2J1c3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHJldHVybmVkIGZyb20gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCBjb21wYXRpYmxlIHdpdGggQmV0dGVyQXV0aFxuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT3V0cHV0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4oeyBkb2MsIG1vZGVsIH06IHsgZG9jOiBUOyBtb2RlbDogc3RyaW5nIH0pOiBUIHtcbiAgICBpZiAoIWRvYyB8fCB0eXBlb2YgZG9jICE9PSAnb2JqZWN0JykgcmV0dXJuIGRvY1xuXG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5kb2MgfVxuICAgIGNvbnN0IHNjaGVtYUZpZWxkcyA9IHNjaGVtYVttb2RlbF0uZmllbGRzXG5cbiAgICAvLyBJZGVudGlmeSByZWxhdGlvbnNoaXAgZmllbGRzIHdpdGggY3VzdG9tIGZpZWxkIG5hbWUgbWFwcGluZ3NcbiAgICBjb25zdCByZWxhdGlvbnNoaXBGaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoc2NoZW1hRmllbGRzKS5maWx0ZXIoKFtrZXldKSA9PiBpc1JlbGF0aW9uc2hpcEZpZWxkKGtleSwgc2NoZW1hRmllbGRzKSkpXG5cbiAgICBPYmplY3QuZW50cmllcyhkb2MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVyblxuXG4gICAgICAvLyBDb252ZXJ0IElEIGZpZWxkcyB0byBzdHJpbmdzIGZvciBCZXR0ZXJBdXRoIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChbJ2lkJywgJ19pZCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBTdHJpbmcodmFsdWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIHJlbmFtZWQgZmllbGROYW1lc1xuICAgICAgY29uc3Qgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXkgPSBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBGaWVsZHMpLmZpbmQoKGspID0+IHJlbGF0aW9uc2hpcEZpZWxkc1trXS5maWVsZE5hbWUgPT09IGtleSlcbiAgICAgIGlmIChvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSkge1xuICAgICAgICBub3JtYWxpemVEb2N1bWVudElkcyhyZXN1bHQsIG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5LCBrZXksIHZhbHVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBJU08gZGF0ZSBzdHJpbmdzIHRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgICAgaWYgKGlzRGF0ZUZpZWxkKHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBUXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBJRCBmaWVsZHMgZm9yIGJvdGggcHJpbWFyeSBhbmQgcmVsYXRpb25zaGlwIGRvY3VtZW50cy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIGNvbnNpc3RlbnQgSUQgaGFuZGxpbmcgYmV0d2VlbiBCZXR0ZXJBdXRoIGFuZCBQYXlsb2FkIENNUyBieTpcbiAgICogMS4gQ29udmVydGluZyBhbGwgSURzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggKHN0b3JlZCBpbiBvcmlnaW5hbEtleSlcbiAgICogMi4gUHJlc2VydmluZyBvcmlnaW5hbCBJRCB0eXBlcyBmb3IgUGF5bG9hZCBDTVMgKHN0b3JlZCBpbiBmaWVsZE5hbWUpXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHZhcmlvdXMgSUQgZm9ybWF0czpcbiAgICogLSBQcmltaXRpdmUgdmFsdWVzIChzdHJpbmcvbnVtYmVyIElEcylcbiAgICogLSBPYmplY3QgcmVmZXJlbmNlcyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICogLSBBcnJheXMgb2YgZWl0aGVyIHByaW1pdGl2ZSBJRHMgb3Igb2JqZWN0IHJlZmVyZW5jZXNcbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgb2JqZWN0IGJlaW5nIHRyYW5zZm9ybWVkXG4gICAqIEBwYXJhbSBvcmlnaW5hbEtleSAtIFRoZSBvcmlnaW5hbCBmaWVsZCBrZXkgZnJvbSBCZXR0ZXJBdXRoIHNjaGVtYVxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIHJlbmFtZWQgZmllbGQgYXMgdXNlZCBpbiBQYXlsb2FkIENNU1xuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgSUQgdmFsdWUgdG8gbm9ybWFsaXplIChwcmltaXRpdmUsIG9iamVjdCwgb3IgYXJyYXkpXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVEb2N1bWVudElkcyhyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIG9yaWdpbmFsS2V5OiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gQ2FzZSAxOiBQcmltaXRpdmUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gRm9yIEJldHRlckF1dGg6IEFsd2F5cyB1c2Ugc3RyaW5nIElEc1xuICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IFN0cmluZyh2YWx1ZSlcbiAgICAgIC8vIEZvciBQYXlsb2FkOiBLZWVwIG9yaWdpbmFsIHR5cGVcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIENhc2UgMjogT2JqZWN0IHdpdGggSUQgcHJvcGVydHlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnaWQnIGluIHZhbHVlKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogRXh0cmFjdCBhbmQgc3RyaW5naWZ5IHRoZSBJRFxuICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IFN0cmluZyh2YWx1ZS5pZClcbiAgICAgIC8vIEZvciBQYXlsb2FkOiBFeHRyYWN0IElEIGJ1dCBwcmVzZXJ2ZSB0eXBlXG4gICAgICByZXN1bHRbZmllbGROYW1lXSA9IHZhbHVlLmlkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDYXNlIDM6IEFycmF5IG9mIElEcyBvciByZWZlcmVuY2VzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNrIGlmIGFycmF5IGNvbnRhaW5zIG9iamVjdHMgd2l0aCBJRCBwcm9wZXJ0aWVzXG4gICAgICBpZiAodmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsICYmICdpZCcgaW4gaXRlbSkpIHtcbiAgICAgICAgLy8gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIElEc1xuICAgICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gdmFsdWUubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbS5pZCkpXG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiBpdGVtLmlkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXJyYXkgb2YgcHJpbWl0aXZlIElEc1xuICAgICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gdmFsdWUubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpXG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiBpdGVtKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gTm90ZTogSWYgdmFsdWUgZG9lc24ndCBtYXRjaCBhbnkgZXhwZWN0ZWQgZm9ybWF0LCBubyBjaGFuZ2VzIGFyZSBtYWRlXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBCZXR0ZXJBdXRoIG9wZXJhdG9yIHRvIHRoZSBlcXVpdmFsZW50IFBheWxvYWQgQ01TIHF1ZXJ5IG9wZXJhdG9yXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gbWFwcyBzdGFuZGFyZCBxdWVyeSBvcGVyYXRvcnMgZnJvbSBCZXR0ZXJBdXRoJ3MgZm9ybWF0IHRvXG4gICAqIHRoZSBzcGVjaWZpYyBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBlbmdpbmUuXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRvciAtIFRoZSBCZXR0ZXJBdXRoIG9wZXJhdG9yIHN0cmluZyAoZS5nLiwgJ2VxJywgJ2d0JywgJ2NvbnRhaW5zJylcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHVzZWQgd2l0aCB0aGUgb3BlcmF0b3JcbiAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIFBheWxvYWQtY29tcGF0aWJsZSBvcGVyYXRvciBhbmQgdmFsdWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyB7IGVxdWFsczogJ3Rlc3RAZXhhbXBsZS5jb20nIH1cbiAgICogb3BlcmF0b3JUb1BheWxvYWQoJ2VxJywgJ3Rlc3RAZXhhbXBsZS5jb20nKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIHsgZ3JlYXRlcl90aGFuOiAxMDAgfVxuICAgKiBvcGVyYXRvclRvUGF5bG9hZCgnZ3QnLCAxMDApXG4gICAqL1xuICBmdW5jdGlvbiBvcGVyYXRvclRvUGF5bG9hZChvcGVyYXRvcjogc3RyaW5nLCB2YWx1ZTogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgY2FzZSAnZXEnOlxuICAgICAgICByZXR1cm4geyBlcXVhbHM6IHZhbHVlIH1cbiAgICAgIGNhc2UgJ25lJzpcbiAgICAgICAgcmV0dXJuIHsgbm90X2VxdWFsczogdmFsdWUgfVxuICAgICAgY2FzZSAnZ3QnOlxuICAgICAgICByZXR1cm4geyBncmVhdGVyX3RoYW46IHZhbHVlIH1cbiAgICAgIGNhc2UgJ2d0ZSc6XG4gICAgICAgIHJldHVybiB7IGdyZWF0ZXJfdGhhbl9lcXVhbDogdmFsdWUgfVxuICAgICAgY2FzZSAnbHQnOlxuICAgICAgICByZXR1cm4geyBsZXNzX3RoYW46IHZhbHVlIH1cbiAgICAgIGNhc2UgJ2x0ZSc6XG4gICAgICAgIHJldHVybiB7IGxlc3NfdGhhbl9lcXVhbDogdmFsdWUgfVxuICAgICAgY2FzZSAnY29udGFpbnMnOlxuICAgICAgICByZXR1cm4geyBjb250YWluczogdmFsdWUgfVxuICAgICAgY2FzZSAnaW4nOlxuICAgICAgICByZXR1cm4geyBpbjogdmFsdWUgfVxuICAgICAgY2FzZSAnc3RhcnRzX3dpdGgnOlxuICAgICAgICByZXR1cm4geyBsaWtlOiBgJHt2YWx1ZX0lYCB9XG4gICAgICBjYXNlICdlbmRzX3dpdGgnOlxuICAgICAgICByZXR1cm4geyBsaWtlOiBgJSR7dmFsdWV9YCB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gZXF1YWxzIGZvciB1bnJlY29nbml6ZWQgb3BlcmF0b3JzXG4gICAgICAgIHJldHVybiB7IGVxdWFsczogdmFsdWUgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHdoZXJlIGNsYXVzZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBiYXNlZCBvbiBmaWVsZCBuYW1lIGFuZCBJRCB0eXBlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHR3byBtYWluIHNjZW5hcmlvczpcbiAgICogMS4gSUQgZmllbGQgY29udmVyc2lvbiAtIGVuc3VyZXMgSURzIG1hdGNoIHRoZSBkYXRhYmFzZSdzIGV4cGVjdGVkIHR5cGUgKG51bWJlciBvciBzdHJpbmcpXG4gICAqIDIuIE9iamVjdCB3aXRoIGVtYmVkZGVkIElEIC0gZXh0cmFjdHMgYW5kIGNvbnZlcnRzIHRoZSBJRCBwcm9wZXJ0eSBmcm9tIG9iamVjdHNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKGNhbiBiZSBwcmltaXRpdmUsIG9iamVjdCB3aXRoIElELCBvciBhcnJheSlcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBxdWVyaWVkXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGRhdGFiYXNlIHF1ZXJ5XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVWYWx1ZSh7IHZhbHVlLCBmaWVsZE5hbWUsIGlkVHlwZSB9OiB7IHZhbHVlOiBhbnk7IGZpZWxkTmFtZTogc3RyaW5nOyBpZFR5cGU6ICdudW1iZXInIHwgJ3RleHQnIH0pIHtcbiAgICAvLyBDaGVjayBpZiBmaWVsZCBpcyBhbiBJRCBmaWVsZCAoc3VwcG9ydGluZyBib3RoIE1vbmdvREItc3R5bGUgX2lkIGFuZCBzdGFuZGFyZCBpZClcbiAgICBpZiAoWydpZCcsICdfaWQnXS5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XG4gICAgICAvLyBDYXNlIDE6IFZhbHVlIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFuIElEIHByb3BlcnR5XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnaWQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIEV4dHJhY3QgSUQgZnJvbSBvYmplY3RcbiAgICAgICAgY29uc3QgaWQgPSB2YWx1ZS5pZFxuXG4gICAgICAgIC8vIFVzZSB0eXBlIGNvbnZlcnNpb24gYmFzZWQgb24gZGF0YWJhc2UgY29uZmlndXJhdGlvblxuICAgICAgICBpZiAoaWRUeXBlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgbnVtSWQgPSBOdW1iZXIoaWQpXG4gICAgICAgICAgcmV0dXJuICFpc05hTihudW1JZCkgPyBudW1JZCA6IGlkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWRUeXBlID09PSAndGV4dCcgJiYgdHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaWRcbiAgICAgIH1cbiAgICAgIC8vIENhc2UgMjogVmFsdWUgaXMgYSBzdGFuZGFsb25lIElEIHRoYXQgbmVlZHMgdHlwZSBjb252ZXJzaW9uXG4gICAgICAvLyBDb252ZXJ0IHN0cmluZyBJRCB0byBudW1iZXIgaWYgZGF0YWJhc2UgZXhwZWN0cyBudW1lcmljIElEc1xuICAgICAgaWYgKGlkVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSlcbiAgICAgIH1cbiAgICAgIC8vIENvbnZlcnQgbnVtZXJpYyBJRCB0byBzdHJpbmcgaWYgZGF0YWJhc2UgZXhwZWN0cyB0ZXh0IElEc1xuICAgICAgZWxzZSBpZiAoaWRUeXBlID09PSAndGV4dCcgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgLy8gRm9yIG5vbi1JRCBmaWVsZHMsIHJldHVybiB0aGUgdmFsdWUgdW5jaGFuZ2VkXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgQmV0dGVyIEF1dGggd2hlcmUgY2xhdXNlcyB0byBQYXlsb2FkIENNUyBjb21wYXRpYmxlIHdoZXJlIGNvbmRpdGlvbnNcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBCZXR0ZXIgQXV0aCBxdWVyeSBmb3JtYXQgaW50byBQYXlsb2FkJ3MgcXVlcnkgZm9ybWF0LFxuICAgKiBoYW5kbGluZyBmaWVsZCBuYW1lIG1hcHBpbmcsIHZhbHVlIHR5cGUgY29udmVyc2lvbiwgYW5kIGxvZ2ljYWwgb3BlcmF0b3JzIChBTkQvT1IpLlxuICAgKlxuICAgKiBUaGUgZnVuY3Rpb24gaGFuZGxlcyB0aHJlZSBtYWluIGNhc2VzOlxuICAgKiAxLiBFbXB0eSBvciB1bmRlZmluZWQgd2hlcmUgY2xhdXNlIC0gcmV0dXJucyBlbXB0eSBvYmplY3RcbiAgICogMi4gU2luZ2xlIGNvbmRpdGlvbiAtIGNvbnZlcnRzIHRvIGEgc2ltcGxlIGZpZWxkLXZhbHVlIHBhaXJcbiAgICogMy4gTXVsdGlwbGUgY29uZGl0aW9ucyAtIGdyb3VwcyBieSBBTkQvT1IgY29ubmVjdG9ycyBhbmQgYnVpbGRzIGEgY29tcGxleCBxdWVyeVxuICAgKlxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGRhdGFiYXNlIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsL2NvbGxlY3Rpb24gbmFtZSB0byBxdWVyeVxuICAgKiBAcGFyYW0gd2hlcmUgLSBBcnJheSBvZiBCZXR0ZXIgQXV0aCB3aGVyZSBjb25kaXRpb25zXG4gICAqIEByZXR1cm5zIEEgUGF5bG9hZC1jb21wYXRpYmxlIHdoZXJlIGNsYXVzZSBvYmplY3RcbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRXaGVyZUNsYXVzZSh7IGlkVHlwZSwgbW9kZWwsIHdoZXJlIH06IHsgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0JzsgbW9kZWw6IHN0cmluZzsgd2hlcmU/OiBXaGVyZVtdIH0pOiBQYXlsb2FkV2hlcmUge1xuICAgIC8vIEhhbmRsZSBlbXB0eSB3aGVyZSBjbGF1c2VcbiAgICBpZiAoIXdoZXJlKSByZXR1cm4ge31cblxuICAgIC8vIEhhbmRsZSBzaW5nbGUgY29uZGl0aW9uIGNhc2UgZm9yIG9wdGltaXphdGlvblxuICAgIGlmICh3aGVyZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHcgPSB3aGVyZVswXVxuICAgICAgaWYgKCF3KSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyBNYXAgZmllbGQgbmFtZSBhY2NvcmRpbmcgdG8gc2NoZW1hIGFuZCBjb252ZXJ0IHZhbHVlIHRvIGFwcHJvcHJpYXRlIHR5cGVcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZClcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pXG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgUGF5bG9hZCB3aGVyZSBjb25kaXRpb24gd2l0aCBwcm9wZXIgb3BlcmF0b3JcbiAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgW2ZpZWxkTmFtZV06IG9wZXJhdG9yVG9QYXlsb2FkKHcub3BlcmF0b3IgPz8gJycsIHZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG11bHRpcGxlIGNvbmRpdGlvbnMgYnkgc2VwYXJhdGluZyBBTkQvT1IgY2xhdXNlc1xuICAgIC8vIERlZmF1bHQgdG8gQU5EIGlmIG5vIGNvbm5lY3RvciBpcyBzcGVjaWZpZWRcbiAgICBjb25zdCBhbmQgPSB3aGVyZS5maWx0ZXIoKHcpID0+IHcuY29ubmVjdG9yID09PSAnQU5EJyB8fCAhdy5jb25uZWN0b3IpXG4gICAgY29uc3Qgb3IgPSB3aGVyZS5maWx0ZXIoKHcpID0+IHcuY29ubmVjdG9yID09PSAnT1InKVxuXG4gICAgLy8gUHJvY2VzcyBBTkQgY29uZGl0aW9uc1xuICAgIGNvbnN0IGFuZENsYXVzZSA9IGFuZC5tYXAoKHcpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZClcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbZmllbGROYW1lXTogb3BlcmF0b3JUb1BheWxvYWQody5vcGVyYXRvciA/PyAnJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIFByb2Nlc3MgT1IgY29uZGl0aW9uc1xuICAgIGNvbnN0IG9yQ2xhdXNlID0gb3IubWFwKCh3KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHcuZmllbGQpXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgaWRUeXBlXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2ZpZWxkTmFtZV06IG9wZXJhdG9yVG9QYXlsb2FkKHcub3BlcmF0b3IgPz8gJycsIHZhbHVlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBDb21iaW5lIEFORCBhbmQgT1IgY2xhdXNlcyBpbnRvIGZpbmFsIFBheWxvYWQgd2hlcmUgb2JqZWN0XG4gICAgLy8gT25seSBpbmNsdWRlIG5vbi1lbXB0eSBjbGF1c2UgYXJyYXlzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihhbmRDbGF1c2UubGVuZ3RoID8geyBBTkQ6IGFuZENsYXVzZSB9IDoge30pLFxuICAgICAgLi4uKG9yQ2xhdXNlLmxlbmd0aCA/IHsgT1I6IG9yQ2xhdXNlIH0gOiB7fSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgdG8gYSBQYXlsb2FkIHNlbGVjdCBvYmplY3RcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgKHdoaWNoIGNvbnRhaW5zIGZpZWxkIG5hbWVzKVxuICAgKiBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBBUEkgKGFuIG9iamVjdCB3aXRoIGZpZWxkIG5hbWVzIGFzIGtleXNcbiAgICogYW5kIGJvb2xlYW4gdHJ1ZSBhcyB2YWx1ZXMpLlxuICAgKlxuICAgKiBJdCBhbHNvIGhhbmRsZXMgZmllbGQgbmFtZSBtYXBwaW5nIGJldHdlZW4gYmV0dGVyLWF1dGggc2NoZW1hIGFuZCBQYXlsb2FkIGNvbGxlY3Rpb25zXG4gICAqIGJ5IHVzaW5nIHRoZSBnZXRGaWVsZE5hbWUgaGVscGVyIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgZmllbGQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gZ2V0IGZpZWxkIG1hcHBpbmdzIGZyb21cbiAgICogQHBhcmFtIHNlbGVjdCAtIE9wdGlvbmFsIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRvIHNlbGVjdFxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzZWxlY3Qgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBmaWVsZHMgdG8gc2VsZWN0XG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElucHV0OiBbJ2VtYWlsJywgJ25hbWUnXVxuICAgKiAvLyBPdXRwdXQ6IHsgZW1haWw6IHRydWUsIG5hbWU6IHRydWUgfVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFNlbGVjdChtb2RlbDogc3RyaW5nLCBzZWxlY3Q/OiBzdHJpbmdbXSkge1xuICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgc2VsZWN0IGlzIGVtcHR5IG9yIG5vdCBwcm92aWRlZFxuICAgIGlmICghc2VsZWN0IHx8IHNlbGVjdC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMgaW50byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgIC8vIHdoaWxlIGFsc28gbWFwcGluZyBhbnkgZmllbGQgbmFtZXMgdGhhdCBtaWdodCBiZSBkaWZmZXJlbnQgaW4gUGF5bG9hZFxuICAgIHJldHVybiBzZWxlY3QucmVkdWNlKChhY2MsIGZpZWxkKSA9PiAoeyAuLi5hY2MsIFtnZXRGaWVsZE5hbWUobW9kZWwsIGZpZWxkKV06IHRydWUgfSksIHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYmV0dGVyLWF1dGggc29ydCBvYmplY3QgdG8gYSBQYXlsb2FkIHNvcnQgc3RyaW5nXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgYmV0dGVyLWF1dGggc29ydCBvYmplY3QgKHdoaWNoIGNvbnRhaW5zIGZpZWxkIG5hbWUgYW5kIGRpcmVjdGlvbilcbiAgICogaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IFBheWxvYWQgQ01TJ3MgcXVlcnkgQVBJIChhIHN0cmluZyB3aXRoIG9wdGlvbmFsICctJyBwcmVmaXggZm9yIGRlc2NlbmRpbmcgb3JkZXIpLlxuICAgKlxuICAgKiBJdCBhbHNvIGhhbmRsZXMgZmllbGQgbmFtZSBtYXBwaW5nIGJldHdlZW4gYmV0dGVyLWF1dGggc2NoZW1hIGFuZCBQYXlsb2FkIGNvbGxlY3Rpb25zXG4gICAqIGJ5IHVzaW5nIHRoZSBnZXRGaWVsZE5hbWUgaGVscGVyIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgZmllbGQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gZ2V0IGZpZWxkIG1hcHBpbmdzIGZyb21cbiAgICogQHBhcmFtIHNvcnRCeSAtIE9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIGZpZWxkIG5hbWUgYW5kIHNvcnQgZGlyZWN0aW9uXG4gICAqIEByZXR1cm5zIEEgUGF5bG9hZC1jb21wYXRpYmxlIHNvcnQgc3RyaW5nIG9yIHVuZGVmaW5lZCBpZiBubyBzb3J0IHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJbnB1dDogeyBmaWVsZDogJ2VtYWlsJywgZGlyZWN0aW9uOiAnZGVzYycgfVxuICAgKiAvLyBPdXRwdXQ6ICctZW1haWwnXG4gICAqIC8vIElucHV0OiB7IGZpZWxkOiAnY3JlYXRlZEF0JywgZGlyZWN0aW9uOiAnYXNjJyB9XG4gICAqIC8vIE91dHB1dDogJ2NyZWF0ZWRBdCdcbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRTb3J0KG1vZGVsOiBzdHJpbmcsIHNvcnRCeT86IHsgZmllbGQ6IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB9KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXNvcnRCeSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgc29ydEJ5LmZpZWxkKVxuICAgIGNvbnN0IHByZWZpeCA9IHNvcnRCeS5kaXJlY3Rpb24gPT09ICdkZXNjJyA/ICctJyA6ICcnXG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke2ZpZWxkTmFtZX1gXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldEZpZWxkTmFtZSxcbiAgICBnZXRDb2xsZWN0aW9uU2x1ZyxcbiAgICBzaW5nbGVJZFF1ZXJ5LFxuICAgIHRyYW5zZm9ybUlucHV0LFxuICAgIHRyYW5zZm9ybU91dHB1dCxcbiAgICBjb252ZXJ0V2hlcmVDbGF1c2UsXG4gICAgY29udmVydFNlbGVjdCxcbiAgICBjb252ZXJ0U29ydFxuICB9XG59XG4iXSwibmFtZXMiOlsiZ2V0QXV0aFRhYmxlcyIsImNyZWF0ZVRyYW5zZm9ybSIsIm9wdGlvbnMiLCJlbmFibGVEZWJ1Z0xvZ3MiLCJzY2hlbWEiLCJkZWJ1Z0xvZyIsIm1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZ2V0Q29sbGVjdGlvblNsdWciLCJtb2RlbCIsImNvbGxlY3Rpb24iLCJtb2RlbE5hbWUiLCJyZXNvbHZlZFNsdWciLCJnZXRGaWVsZE5hbWUiLCJmaWVsZCIsImluY2x1ZGVzIiwiZmllbGREZWZpbml0aW9uIiwiZmllbGRzIiwiZmllbGROYW1lIiwib3JpZ2luYWxGaWVsZCIsImlzUmVsYXRpb25zaGlwRmllbGQiLCJmaWVsZEtleSIsInNjaGVtYUZpZWxkcyIsInJlZmVyZW5jZXMiLCJ1bmRlZmluZWQiLCJpc0RhdGVGaWVsZCIsInZhbHVlIiwiaXNOYU4iLCJEYXRlIiwicGFyc2UiLCJzaW5nbGVJZFF1ZXJ5Iiwid2hlcmUiLCJzb21lIiwiaWRGaWVsZCIsImNvbmRpdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsImVxdWFscyIsImNvbnRhaW5zIiwibGVuZ3RoIiwibm9ybWFsaXplRGF0YSIsImtleSIsImlzUmVsYXRlZEZpZWxkIiwiaWRUeXBlIiwicGFyc2VkIiwicGFyc2VJbnQiLCJvcmlnaW5hbCIsImNvbnZlcnRlZCIsInN0cmluZ0lkIiwiU3RyaW5nIiwibWFwIiwiaWQiLCJ0cmFuc2Zvcm1JbnB1dCIsImRhdGEiLCJ0cmFuc2Zvcm1lZERhdGEiLCJPYmplY3QiLCJlbnRyaWVzIiwiZm9yRWFjaCIsInNjaGVtYUZpZWxkTmFtZSIsIm5vcm1hbGl6ZWREYXRhIiwidGFyZ2V0RmllbGROYW1lIiwidHJhbnNmb3JtT3V0cHV0IiwiZG9jIiwicmVzdWx0IiwicmVsYXRpb25zaGlwRmllbGRzIiwiZnJvbUVudHJpZXMiLCJmaWx0ZXIiLCJvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSIsImtleXMiLCJmaW5kIiwiayIsIm5vcm1hbGl6ZURvY3VtZW50SWRzIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIml0ZW0iLCJvcGVyYXRvclRvUGF5bG9hZCIsIm9wZXJhdG9yIiwibm90X2VxdWFscyIsImdyZWF0ZXJfdGhhbiIsImdyZWF0ZXJfdGhhbl9lcXVhbCIsImxlc3NfdGhhbiIsImxlc3NfdGhhbl9lcXVhbCIsImluIiwibGlrZSIsImNvbnZlcnRXaGVyZVZhbHVlIiwibnVtSWQiLCJOdW1iZXIiLCJjb252ZXJ0V2hlcmVDbGF1c2UiLCJ3IiwicmVzIiwiYW5kIiwiY29ubmVjdG9yIiwib3IiLCJhbmRDbGF1c2UiLCJvckNsYXVzZSIsIkFORCIsIk9SIiwiY29udmVydFNlbGVjdCIsInNlbGVjdCIsInJlZHVjZSIsImFjYyIsImNvbnZlcnRTb3J0Iiwic29ydEJ5IiwicHJlZml4IiwiZGlyZWN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFvQ0EsYUFBYSxRQUFRLGlCQUFnQjtBQUl6RSxPQUFPLE1BQU1DLGtCQUFrQixDQUFDQyxTQUE0QkM7SUFDMUQsTUFBTUMsU0FBU0osY0FBY0U7SUFFN0IsU0FBU0csU0FBU0MsT0FBYztRQUM5QixJQUFJSCxpQkFBaUI7WUFDbkJJLFFBQVFD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
667
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWVsZEF0dHJpYnV0ZSwgRmllbGRUeXBlLCBnZXRBdXRoVGFibGVzIH0gZnJvbSAnYmV0dGVyLWF1dGgvZGInXG5pbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gJ2JldHRlci1hdXRoJ1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uU2x1ZywgV2hlcmUgYXMgUGF5bG9hZFdoZXJlIH0gZnJvbSAncGF5bG9hZCdcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybSA9IChvcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucywgZW5hYmxlRGVidWdMb2dzOiBib29sZWFuKSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IGdldEF1dGhUYWJsZXMob3B0aW9ucylcblxuICBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnlbXSkge1xuICAgIGlmIChlbmFibGVEZWJ1Z0xvZ3MpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbcGF5bG9hZC1kYi1hZGFwdGVyXWAsIC4uLm1lc3NhZ2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBtb2RlbCBuYW1lIHRvIGl0cyBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGNvbGxlY3Rpb24gc2x1Zy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiByZXNvbHZlcyB0aGUgYXBwcm9wcmlhdGUgY29sbGVjdGlvbiBzbHVnIGJ5OlxuICAgKiAxLiBMb29raW5nIHVwIHRoZSBtb2RlbCBpbiB0aGUgQmV0dGVyQXV0aCBzY2hlbWEgdG8gZmluZCBpdHMgY29uZmlndXJlZCBtb2RlbE5hbWVcbiAgICogMi4gRmFsbGluZyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCBuYW1lIGlmIG5vIG1hcHBpbmcgZXhpc3RzXG4gICAqXG4gICAqIENvbGxlY3Rpb24gc2x1ZyByZXNvbHV0aW9uIGZvbGxvd3MgdGhlc2UgcnVsZXM6XG4gICAqIC0gRm9yIGJhc2UgY29sbGVjdGlvbnM6IFRoZSBzYW5pdGl6ZUJldHRlckF1dGhPcHRpb25zIGZ1bmN0aW9uIGVuc3VyZXMgdGhlIGNvbGxlY3Rpb24gc2x1Z1xuICAgKiAgIGZyb20gcGx1Z2luIG9wdGlvbnMgaXMgc2V0IGFzIHRoZSBtb2RlbCBuYW1lIGluIHRoZSBzY2hlbWFcbiAgICogLSBGb3IgcGx1Z2luczogVGhlIGJldHRlckF1dGhQbHVnaW5TbHVncyBjb25zdGFudCBpcyB1c2VkIGFzIHRoZSBtb2RlbE5hbWVcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGNvbGxlY3Rpb24gc2x1Z1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWFbJ3VzZXInXS5tb2RlbE5hbWUgaXMgJ3VzZXJzJ1xuICAgKiBnZXRDb2xsZWN0aW9uU2x1ZygndXNlcicpIC8vIFJldHVybnMgJ3VzZXJzJ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBtb2RlbCBkb2Vzbid0IGV4aXN0IGluIHNjaGVtYVxuICAgKiBnZXRDb2xsZWN0aW9uU2x1ZygnY3VzdG9tJykgLy8gUmV0dXJucyAnY3VzdG9tJ1xuICAgKlxuICAgKiBAd2FybmluZyBJZiBhIGNvbGxlY3Rpb24gaXMgb3ZlcnJpZGRlbiB1c2luZyB0aGUgY29sbGVjdGlvbk92ZXJyaWRlIG9wdGlvblxuICAgKiB3aXRob3V0IHVwZGF0aW5nIHRoZSBzY2hlbWEgbWFwcGluZywgdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGluY29ycmVjdCBzbHVnc1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWw6IHN0cmluZyk6IENvbGxlY3Rpb25TbHVnIHtcbiAgICAvLyBGaXJzdCB0cnkgdG8gZ2V0IHRoZSBtb2RlbE5hbWUgZnJvbSBzY2hlbWEsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWVcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gc2NoZW1hW21vZGVsXT8ubW9kZWxOYW1lIHx8IG1vZGVsXG4gICAgZGVidWdMb2coWydnZXRDb2xsZWN0aW9uU2x1ZzonLCB7IG1vZGVsLCByZXNvbHZlZFNsdWc6IGNvbGxlY3Rpb24gfV0pXG4gICAgcmV0dXJuIGNvbGxlY3Rpb24gYXMgQ29sbGVjdGlvblNsdWdcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgQmV0dGVyQXV0aCBzY2hlbWEgZmllbGQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgZmllbGQgbmFtZS5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiByZXNvbHZlcyB0aGUgYXBwcm9wcmlhdGUgZmllbGQgbmFtZSBieTpcbiAgICogMS4gUHJlc2VydmluZyAnaWQnIG9yICdfaWQnIGZpZWxkcyBhcy1pcyAoc3BlY2lhbCBjYXNlIGhhbmRsaW5nKVxuICAgKiAyLiBMb29raW5nIHVwIHRoZSBmaWVsZCBpbiB0aGUgQmV0dGVyQXV0aCBzY2hlbWEgdG8gZmluZCBpdHMgY29uZmlndXJlZCBmaWVsZE5hbWVcbiAgICogMy4gRmFsbGluZyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBmaWVsZCBuYW1lIGlmIG5vIG1hcHBpbmcgZXhpc3RzXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBCZXR0ZXJBdXRoIG1vZGVsIG5hbWUgY29udGFpbmluZyB0aGUgZmllbGRcbiAgICogQHBhcmFtIGZpZWxkIC0gVGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgdG8gcmVzb2x2ZVxuICAgKiBAcmV0dXJucyBUaGUgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYVsndXNlciddLmZpZWxkc1snZW1haWwnXS5maWVsZE5hbWUgaXMgJ2VtYWlsQWRkcmVzcydcbiAgICogZ2V0RmllbGROYW1lKCd1c2VyJywgJ2VtYWlsJykgLy8gUmV0dXJucyAnZW1haWxBZGRyZXNzJ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTcGVjaWFsIGNhc2UgZm9yIElEIGZpZWxkc1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnaWQnKSAvLyBBbHdheXMgcmV0dXJucyAnaWQnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIGZpZWxkIGRvZXNuJ3QgZXhpc3QgaW4gc2NoZW1hIG9yIGhhcyBubyBmaWVsZE5hbWUgbWFwcGluZ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnY3VzdG9tJykgLy8gUmV0dXJucyAnY3VzdG9tJ1xuICAgKlxuICAgKiBAd2FybmluZyBJZiBhIGZpZWxkTmFtZSBpcyBvdmVycmlkZGVuIGluIHRoZSBwYXlsb2FkIGNvbGxlY3Rpb24gY29uZmlnIHVzaW5nIHRoZSBjb2xsZWN0aW9uT3ZlcnJpZGUgb3B0aW9uXG4gICAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHNjaGVtYSBtYXBwaW5nLCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gaW5jb3JyZWN0IGZpZWxkIG5hbWVzXG4gICAqL1xuICBmdW5jdGlvbiBnZXRGaWVsZE5hbWUobW9kZWw6IHN0cmluZywgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiAnaWQnIG9yICdfaWQnIGlzIGFsd2F5cyBwcmVzZXJ2ZWQgYXMtaXNcbiAgICBpZiAoWydpZCcsICdfaWQnXS5pbmNsdWRlcyhmaWVsZCkpIHtcbiAgICAgIHJldHVybiBmaWVsZFxuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGZpZWxkIGluIHRoZSBzY2hlbWFcbiAgICBjb25zdCBmaWVsZERlZmluaXRpb24gPSBzY2hlbWFbbW9kZWxdPy5maWVsZHNbZmllbGRdXG5cbiAgICAvLyBVc2UgdGhlIGNvbmZpZ3VyZWQgZmllbGROYW1lIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBvcmlnaW5hbFxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkRGVmaW5pdGlvbj8uZmllbGROYW1lIHx8IGZpZWxkXG5cbiAgICAvLyBMb2cgdGhlIGZpZWxkIHJlc29sdXRpb24gZm9yIGRlYnVnZ2luZ1xuICAgIGRlYnVnTG9nKFsnZ2V0RmllbGQ6ICcsIHsgbW9kZWwsIG9yaWdpbmFsRmllbGQ6IGZpZWxkLCBmaWVsZE5hbWUgfV0pXG5cbiAgICByZXR1cm4gZmllbGROYW1lXG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIGJ5IGNoZWNraW5nIGZvciBhIHJlZmVyZW5jZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIFJlbGF0aW9uc2hpcCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgbW9kZWwuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIHRvIGlkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZEtleSAtIFRoZSBrZXkgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHNjaGVtYUZpZWxkcyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIChoYXMgcmVmZXJlbmNlcyksIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMucG9zdHMgaGFzIHsgcmVmZXJlbmNlczoge30gfVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdwb3N0cycsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyB0cnVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYS51c2VyLmZpZWxkcy5lbWFpbCBoYXMgbm8gcmVmZXJlbmNlcyBwcm9wZXJ0eVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdlbWFpbCcsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyBmYWxzZVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbnNoaXBGaWVsZChmaWVsZEtleTogc3RyaW5nLCBzY2hlbWFGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpZWxkQXR0cmlidXRlPEZpZWxkVHlwZT4+KTogYm9vbGVhbiB7XG4gICAgLy8gQSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBpZiBpdCBoYXMgYSAncmVmZXJlbmNlcycgcHJvcGVydHkgZGVmaW5lZFxuICAgIHJldHVybiBzY2hlbWFGaWVsZHNbZmllbGRLZXldPy5yZWZlcmVuY2VzICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgaW50byBhIERhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgYW5kIGNhbiBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkXG4gICAqIGludG8gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0IHVzaW5nIERhdGUucGFyc2UoKS4gSXQncyB1c2VkIHRvIGlkZW50aWZ5IGRhdGUgZmllbGRzXG4gICAqIGR1cmluZyBkYXRhIHRyYW5zZm9ybWF0aW9uIHByb2Nlc3Nlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0J3MgYSB2YWxpZCBkYXRlIHN0cmluZ1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgYSBkYXRlLCBmYWxzZSBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyB0cnVlIGZvciBJU08gZGF0ZSBzdHJpbmdzXG4gICAqIGlzRGF0ZUZpZWxkKCcyMDIzLTAxLTAxVDEyOjAwOjAwWicpIC8vIHRydWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBmYWxzZSBmb3Igbm9uLWRhdGUgc3RyaW5ncyBvciBvdGhlciB0eXBlc1xuICAgKiBpc0RhdGVGaWVsZCgnbm90IGEgZGF0ZScpIC8vIGZhbHNlXG4gICAqIGlzRGF0ZUZpZWxkKDEyMykgLy8gZmFsc2VcbiAgICovXG4gIGZ1bmN0aW9uIGlzRGF0ZUZpZWxkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB2YWx1ZSBpcyBhIHN0cmluZyBhbmQgY2FuIGJlIHBhcnNlZCBhcyBhIHZhbGlkIGRhdGVcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgYSBzaW5nbGUgSUQgdmFsdWUgZnJvbSBhIFBheWxvYWQgd2hlcmUgY2xhdXNlIGlmIGl0IHJlcHJlc2VudHMgYSBzaW1wbGUgSUQgcXVlcnkuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gYW5hbHl6ZXMgYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSB0byBkZXRlcm1pbmUgaWYgaXQncyBhIHNpbXBsZSBxdWVyeSBmb3IgYVxuICAgKiBzaW5nbGUgZG9jdW1lbnQgYnkgSUQuIEl0IHN1cHBvcnRzIGJvdGggJ2lkJyBhbmQgJ19pZCcgZmllbGRzIHdpdGggJ2VxdWFscycgb3IgJ2NvbnRhaW5zJ1xuICAgKiBvcGVyYXRvcnMuIFRoaXMgaXMgdXNlZnVsIGZvciBvcHRpbWl6aW5nIHF1ZXJpZXMgd2hlbiB3ZSBvbmx5IG5lZWQgdG8gZmV0Y2ggYSBzaW5nbGUgZG9jdW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSAtIFRoZSBQYXlsb2FkIHdoZXJlIGNsYXVzZSB0byBhbmFseXplXG4gICAqIEByZXR1cm5zIFRoZSBJRCB2YWx1ZSAoc3RyaW5nIG9yIG51bWJlcikgaWYgdGhlIHdoZXJlIGNsYXVzZSBpcyBhIHNpbXBsZSBJRCBxdWVyeSwgbnVsbCBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyAnMTIzJyBmb3IgYSBzaW1wbGUgZXF1YWxzIHF1ZXJ5XG4gICAqIHNpbmdsZUlkUXVlcnkoeyBpZDogeyBlcXVhbHM6ICcxMjMnIH0gfSkgLy8gJzEyMydcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyA0NTYgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeSB3aXRoIG51bWJlciBJRFxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgX2lkOiB7IGVxdWFsczogNDU2IH0gfSkgLy8gNDU2XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzc4OScgZm9yIGEgY29udGFpbnMgcXVlcnkgd2l0aCBhIHNpbmdsZSB2YWx1ZVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgY29udGFpbnM6IFsnNzg5J10gfSB9KSAvLyAnNzg5J1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIG51bGwgZm9yIGNvbXBsZXggcXVlcmllc1xuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgYW5kOiBbeyBpZDogeyBlcXVhbHM6ICcxMjMnIH0gfV0gfSkgLy8gbnVsbFxuICAgKi9cbiAgZnVuY3Rpb24gc2luZ2xlSWRRdWVyeSh3aGVyZTogUGF5bG9hZFdoZXJlKSB7XG4gICAgLy8gUmV0dXJuIG51bGwgZm9yIGVtcHR5IHdoZXJlIGNsYXVzZXMgb3IgY29tcGxleCBxdWVyaWVzIHdpdGggJ2FuZCcvJ29yJyBvcGVyYXRvcnNcbiAgICBpZiAoIXdoZXJlIHx8ICdhbmQnIGluIHdoZXJlIHx8ICdvcicgaW4gd2hlcmUpIHJldHVybiBudWxsXG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2hlcmUgY2xhdXNlIGNvbnRhaW5zIGVpdGhlciAnaWQnIG9yICdfaWQnIGZpZWxkXG4gICAgaWYgKFsnaWQnLCAnX2lkJ10uc29tZSgoZmllbGQpID0+IGZpZWxkIGluIHdoZXJlKSkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIElEIGZpZWxkIGlzIGJlaW5nIHVzZWQgKHN1cHBvcnQgYm90aCAnaWQnIGFuZCAnX2lkJylcbiAgICAgIGNvbnN0IGlkRmllbGQgPSAnaWQnIGluIHdoZXJlID8gJ2lkJyA6ICdfaWQnXG4gICAgICBjb25zdCBjb25kaXRpb24gPSB3aGVyZVtpZEZpZWxkXVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBlcXVhbHMgb3BlcmF0b3IgY2FzZVxuICAgICAgaWYgKGNvbmRpdGlvbiAmJiB0eXBlb2YgY29uZGl0aW9uID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjb25kaXRpb24pICYmICdlcXVhbHMnIGluIGNvbmRpdGlvbikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5lcXVhbHNcbiAgICAgICAgLy8gT25seSByZXR1cm4gc3RyaW5nIG9yIG51bWJlciBJRCB2YWx1ZXNcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIGNvbnRhaW5zIG9wZXJhdG9yIGNhc2Ugd2l0aCBhIHNpbmdsZSB2YWx1ZVxuICAgICAgaWYgKFxuICAgICAgICBjb25kaXRpb24gJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJlxuICAgICAgICAnY29udGFpbnMnIGluIGNvbmRpdGlvbiAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGNvbmRpdGlvbi5jb250YWlucykgJiZcbiAgICAgICAgY29uZGl0aW9uLmNvbnRhaW5zLmxlbmd0aCA9PT0gMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZGl0aW9uLmNvbnRhaW5zWzBdXG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBudWxsIGlmIG5vIHZhbGlkIElEIHF1ZXJ5IHdhcyBmb3VuZFxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBkYXRhIHZhbHVlcyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCByZXF1aXJlZCBJRCB0eXBlXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0eXBlIGNvbnZlcnNpb24gZm9yIHJlbGF0aW9uc2hpcCBmaWVsZHMgdG8gZW5zdXJlXG4gICAqIElEcyBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IChzdHJpbmcgb3IgbnVtYmVyKSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBmaWVsZCBrZXkvbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplXG4gICAqIEBwYXJhbSBpc1JlbGF0ZWRGaWVsZCAtIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBpc1JlbGF0ZWRGaWVsZCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIGlzUmVsYXRlZEZpZWxkOiBib29sZWFuXG4gICAgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0J1xuICB9KSB7XG4gICAgLy8gU2tpcCBwcm9jZXNzaW5nIGZvciBudWxsL3VuZGVmaW5lZCB2YWx1ZXNcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKFsnaWQnLCAnX2lkJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgaWRUeXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApXG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XSlcbiAgICAgICAgICByZXR1cm4gcGFyc2VkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlkVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICBkZWJ1Z0xvZyhbYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLCB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ0lkXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aW9uc2hpcCBmaWVsZHMgdGhhdCBuZWVkIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChpc1JlbGF0ZWRGaWVsZCkge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBJRCB2YWx1ZSBjb252ZXJzaW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBpZFR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHZhbHVlLCAxMClcbiAgICAgICAgaWYgKCFpc05hTihwYXJzZWQpKSB7XG4gICAgICAgICAgZGVidWdMb2coW2BJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBzdHJpbmcgSUQgdG8gbnVtYmVyYCwgeyBvcmlnaW5hbDogdmFsdWUsIGNvbnZlcnRlZDogcGFyc2VkIH1dKVxuICAgICAgICAgIHJldHVybiBwYXJzZWRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlkVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICBkZWJ1Z0xvZyhbYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLCB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ0lkXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBhcnJheSBvZiBJRHMgLSBtYXAgZWFjaCB2YWx1ZSB0byB0aGUgY29ycmVjdCB0eXBlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoaWQpID0+IHtcbiAgICAgICAgICAvLyBTa2lwIG51bGwvdW5kZWZpbmVkIHZhbHVlcyBpbiBhcnJheXNcbiAgICAgICAgICBpZiAoaWQgPT09IG51bGwgfHwgaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGlkXG5cbiAgICAgICAgICBpZiAoaWRUeXBlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChpZCwgMTApXG4gICAgICAgICAgICByZXR1cm4gIWlzTmFOKHBhcnNlZCkgPyBwYXJzZWQgOiBpZFxuICAgICAgICAgIH0gZWxzZSBpZiAoaWRUeXBlID09PSAndGV4dCcgJiYgdHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhpZClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlkXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG9yaWdpbmFsIHZhbHVlIGlmIG5vIGNvbnZlcnNpb24gd2FzIG5lZWRlZCBvciBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBpbnB1dCBkYXRhIGZyb20gYmV0dGVyLWF1dGggdG8gUGF5bG9hZCBDTVMgZm9ybWF0XG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlczpcbiAgICogMS4gRmllbGQgbmFtZSBtYXBwaW5nIGFjY29yZGluZyB0byBzY2hlbWEgZGVmaW5pdGlvbnNcbiAgICogMi4gSUQgdHlwZSBjb252ZXJzaW9uIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAqIDMuIFByb3BlciBkYXRhIG5vcm1hbGl6YXRpb24gYmFzZWQgb24gZmllbGQgdHlwZXNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBuYW1lIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIGRhdGEgY29tcGF0aWJsZSB3aXRoIFBheWxvYWQgQ01TXG4gICAqL1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1JbnB1dCh7XG4gICAgZGF0YSxcbiAgICBtb2RlbCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICBtb2RlbDogc3RyaW5nXG4gICAgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0J1xuICB9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fVxuXG4gICAgLy8gUHJvY2VzcyBlYWNoIGZpZWxkIGluIHRoZSBpbnB1dCBkYXRhXG4gICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAvLyBTa2lwIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkXG4gICAgICBjb25zdCBpc1JlbGF0ZWRGaWVsZCA9IGlzUmVsYXRpb25zaGlwRmllbGQoa2V5LCBzY2hlbWFGaWVsZHMpXG5cbiAgICAgIC8vIEdldCB0aGUgbWFwcGVkIGZpZWxkIG5hbWUgZnJvbSBzY2hlbWEgKGlmIGFueSlcbiAgICAgIGNvbnN0IHNjaGVtYUZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkc1trZXldPy5maWVsZE5hbWVcblxuICAgICAgLy8gTm9ybWFsaXplIHRoZSBkYXRhIHZhbHVlIGJhc2VkIG9uIGZpZWxkIHR5cGUgYW5kIElEIHR5cGVcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhID0gbm9ybWFsaXplRGF0YSh7XG4gICAgICAgIGlkVHlwZSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaXNSZWxhdGVkRmllbGRcbiAgICAgIH0pXG5cbiAgICAgIC8vIFVzZSB0aGUgc2NoZW1hLWRlZmluZWQgZmllbGQgbmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugb3JpZ2luYWwga2V5XG4gICAgICBjb25zdCB0YXJnZXRGaWVsZE5hbWUgPSBzY2hlbWFGaWVsZE5hbWUgfHwga2V5XG4gICAgICB0cmFuc2Zvcm1lZERhdGFbdGFyZ2V0RmllbGROYW1lXSA9IG5vcm1hbGl6ZWREYXRhXG4gICAgfSlcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIFBheWxvYWQgQ01TIGRvY3VtZW50IG91dHB1dCB0byBtYXRjaCBCZXR0ZXJBdXRoIHNjaGVtYSBleHBlY3RhdGlvbnMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXZlcmFsIGNyaXRpY2FsIHRyYW5zZm9ybWF0aW9uczpcbiAgICpcbiAgICogMS4gSUQgQ29udmVyc2lvbjogRW5zdXJlcyBhbGwgSUQgZmllbGRzIGFyZSBzdHJpbmdzIGFzIHJlcXVpcmVkIGJ5IEJldHRlckF1dGhcbiAgICogICAgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JldHRlci1hdXRoL2JldHRlci1hdXRoL2Jsb2IvbWFpbi9wYWNrYWdlcy9iZXR0ZXItYXV0aC9zcmMvZGIvc2NoZW1hLnRzI0wxMjUpXG4gICAqXG4gICAqIDIuIFJlbGF0aW9uc2hpcCBGaWVsZCBNYXBwaW5nOiBBbGlnbnMgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIEJldHRlckF1dGggc2NoZW1hIG5hbWluZyBjb252ZW50aW9uc1xuICAgKiAgICBhbmQgZW5zdXJlcyBwcm9wZXIgSUQgdHlwZSBoYW5kbGluZ1xuICAgKlxuICAgKiAzLiBEYXRlIENvbnZlcnNpb246IFRyYW5zZm9ybXMgZGF0ZSBzdHJpbmdzIGZyb20gUGF5bG9hZCBpbnRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgKlxuICAgKiBOb3RlOiBXaGlsZSBzZXR0aW5nIGRlcHRoOiAxIGluIFBheWxvYWQgb3BlcmF0aW9ucyBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBieSBhdm9pZGluZ1xuICAgKiBkZWVwbHkgbmVzdGVkIG9iamVjdHMsIHdlIG1haW50YWluIGNvbXByZWhlbnNpdmUgY2hlY2tzIGZvciByb2J1c3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHJldHVybmVkIGZyb20gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCBjb21wYXRpYmxlIHdpdGggQmV0dGVyQXV0aFxuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT3V0cHV0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4oeyBkb2MsIG1vZGVsIH06IHsgZG9jOiBUOyBtb2RlbDogc3RyaW5nIH0pOiBUIHtcbiAgICBpZiAoIWRvYyB8fCB0eXBlb2YgZG9jICE9PSAnb2JqZWN0JykgcmV0dXJuIGRvY1xuXG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5kb2MgfVxuICAgIGNvbnN0IHNjaGVtYUZpZWxkcyA9IHNjaGVtYT8uW21vZGVsXT8uZmllbGRzID8/IHt9XG5cbiAgICAvLyBJZGVudGlmeSByZWxhdGlvbnNoaXAgZmllbGRzIHdpdGggY3VzdG9tIGZpZWxkIG5hbWUgbWFwcGluZ3NcbiAgICBjb25zdCByZWxhdGlvbnNoaXBGaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoc2NoZW1hRmllbGRzKS5maWx0ZXIoKFtrZXldKSA9PiBpc1JlbGF0aW9uc2hpcEZpZWxkKGtleSwgc2NoZW1hRmllbGRzKSkpXG5cbiAgICBPYmplY3QuZW50cmllcyhkb2MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVyblxuXG4gICAgICAvLyBDb252ZXJ0IElEIGZpZWxkcyB0byBzdHJpbmdzIGZvciBCZXR0ZXJBdXRoIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChbJ2lkJywgJ19pZCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBTdHJpbmcodmFsdWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIHJlbmFtZWQgZmllbGROYW1lc1xuICAgICAgY29uc3Qgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXkgPSBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBGaWVsZHMpLmZpbmQoKGspID0+IHJlbGF0aW9uc2hpcEZpZWxkc1trXS5maWVsZE5hbWUgPT09IGtleSlcbiAgICAgIGlmIChvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSkge1xuICAgICAgICBub3JtYWxpemVEb2N1bWVudElkcyhyZXN1bHQsIG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5LCBrZXksIHZhbHVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBJU08gZGF0ZSBzdHJpbmdzIHRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgICAgaWYgKGlzRGF0ZUZpZWxkKHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBUXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBJRCBmaWVsZHMgZm9yIGJvdGggcHJpbWFyeSBhbmQgcmVsYXRpb25zaGlwIGRvY3VtZW50cy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIGNvbnNpc3RlbnQgSUQgaGFuZGxpbmcgYmV0d2VlbiBCZXR0ZXJBdXRoIGFuZCBQYXlsb2FkIENNUyBieTpcbiAgICogMS4gQ29udmVydGluZyBhbGwgSURzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggKHN0b3JlZCBpbiBvcmlnaW5hbEtleSlcbiAgICogMi4gUHJlc2VydmluZyBvcmlnaW5hbCBJRCB0eXBlcyBmb3IgUGF5bG9hZCBDTVMgKHN0b3JlZCBpbiBmaWVsZE5hbWUpXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHZhcmlvdXMgSUQgZm9ybWF0czpcbiAgICogLSBQcmltaXRpdmUgdmFsdWVzIChzdHJpbmcvbnVtYmVyIElEcylcbiAgICogLSBPYmplY3QgcmVmZXJlbmNlcyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICogLSBBcnJheXMgb2YgZWl0aGVyIHByaW1pdGl2ZSBJRHMgb3Igb2JqZWN0IHJlZmVyZW5jZXNcbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgb2JqZWN0IGJlaW5nIHRyYW5zZm9ybWVkXG4gICAqIEBwYXJhbSBvcmlnaW5hbEtleSAtIFRoZSBvcmlnaW5hbCBmaWVsZCBrZXkgZnJvbSBCZXR0ZXJBdXRoIHNjaGVtYVxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIHJlbmFtZWQgZmllbGQgYXMgdXNlZCBpbiBQYXlsb2FkIENNU1xuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgSUQgdmFsdWUgdG8gbm9ybWFsaXplIChwcmltaXRpdmUsIG9iamVjdCwgb3IgYXJyYXkpXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVEb2N1bWVudElkcyhyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIG9yaWdpbmFsS2V5OiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gQ2FzZSAxOiBQcmltaXRpdmUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gRm9yIEJldHRlckF1dGg6IEFsd2F5cyB1c2Ugc3RyaW5nIElEc1xuICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IFN0cmluZyh2YWx1ZSlcbiAgICAgIC8vIEZvciBQYXlsb2FkOiBLZWVwIG9yaWdpbmFsIHR5cGVcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIENhc2UgMjogT2JqZWN0IHdpdGggSUQgcHJvcGVydHlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnaWQnIGluIHZhbHVlKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogRXh0cmFjdCBhbmQgc3RyaW5naWZ5IHRoZSBJRFxuICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IFN0cmluZyh2YWx1ZS5pZClcbiAgICAgIC8vIEZvciBQYXlsb2FkOiBFeHRyYWN0IElEIGJ1dCBwcmVzZXJ2ZSB0eXBlXG4gICAgICByZXN1bHRbZmllbGROYW1lXSA9IHZhbHVlLmlkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDYXNlIDM6IEFycmF5IG9mIElEcyBvciByZWZlcmVuY2VzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNrIGlmIGFycmF5IGNvbnRhaW5zIG9iamVjdHMgd2l0aCBJRCBwcm9wZXJ0aWVzXG4gICAgICBpZiAodmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsICYmICdpZCcgaW4gaXRlbSkpIHtcbiAgICAgICAgLy8gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIElEc1xuICAgICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gdmFsdWUubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbS5pZCkpXG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiBpdGVtLmlkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXJyYXkgb2YgcHJpbWl0aXZlIElEc1xuICAgICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gdmFsdWUubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpXG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiBpdGVtKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gTm90ZTogSWYgdmFsdWUgZG9lc24ndCBtYXRjaCBhbnkgZXhwZWN0ZWQgZm9ybWF0LCBubyBjaGFuZ2VzIGFyZSBtYWRlXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBCZXR0ZXJBdXRoIG9wZXJhdG9yIHRvIHRoZSBlcXVpdmFsZW50IFBheWxvYWQgQ01TIHF1ZXJ5IG9wZXJhdG9yXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gbWFwcyBzdGFuZGFyZCBxdWVyeSBvcGVyYXRvcnMgZnJvbSBCZXR0ZXJBdXRoJ3MgZm9ybWF0IHRvXG4gICAqIHRoZSBzcGVjaWZpYyBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBlbmdpbmUuXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRvciAtIFRoZSBCZXR0ZXJBdXRoIG9wZXJhdG9yIHN0cmluZyAoZS5nLiwgJ2VxJywgJ2d0JywgJ2NvbnRhaW5zJylcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHVzZWQgd2l0aCB0aGUgb3BlcmF0b3JcbiAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIFBheWxvYWQtY29tcGF0aWJsZSBvcGVyYXRvciBhbmQgdmFsdWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyB7IGVxdWFsczogJ3Rlc3RAZXhhbXBsZS5jb20nIH1cbiAgICogb3BlcmF0b3JUb1BheWxvYWQoJ2VxJywgJ3Rlc3RAZXhhbXBsZS5jb20nKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIHsgZ3JlYXRlcl90aGFuOiAxMDAgfVxuICAgKiBvcGVyYXRvclRvUGF5bG9hZCgnZ3QnLCAxMDApXG4gICAqL1xuICBmdW5jdGlvbiBvcGVyYXRvclRvUGF5bG9hZChvcGVyYXRvcjogc3RyaW5nLCB2YWx1ZTogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgY2FzZSAnZXEnOlxuICAgICAgICByZXR1cm4geyBlcXVhbHM6IHZhbHVlIH1cbiAgICAgIGNhc2UgJ25lJzpcbiAgICAgICAgcmV0dXJuIHsgbm90X2VxdWFsczogdmFsdWUgfVxuICAgICAgY2FzZSAnZ3QnOlxuICAgICAgICByZXR1cm4geyBncmVhdGVyX3RoYW46IHZhbHVlIH1cbiAgICAgIGNhc2UgJ2d0ZSc6XG4gICAgICAgIHJldHVybiB7IGdyZWF0ZXJfdGhhbl9lcXVhbDogdmFsdWUgfVxuICAgICAgY2FzZSAnbHQnOlxuICAgICAgICByZXR1cm4geyBsZXNzX3RoYW46IHZhbHVlIH1cbiAgICAgIGNhc2UgJ2x0ZSc6XG4gICAgICAgIHJldHVybiB7IGxlc3NfdGhhbl9lcXVhbDogdmFsdWUgfVxuICAgICAgY2FzZSAnY29udGFpbnMnOlxuICAgICAgICByZXR1cm4geyBjb250YWluczogdmFsdWUgfVxuICAgICAgY2FzZSAnaW4nOlxuICAgICAgICByZXR1cm4geyBpbjogdmFsdWUgfVxuICAgICAgY2FzZSAnc3RhcnRzX3dpdGgnOlxuICAgICAgICByZXR1cm4geyBsaWtlOiBgJHt2YWx1ZX0lYCB9XG4gICAgICBjYXNlICdlbmRzX3dpdGgnOlxuICAgICAgICByZXR1cm4geyBsaWtlOiBgJSR7dmFsdWV9YCB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gZXF1YWxzIGZvciB1bnJlY29nbml6ZWQgb3BlcmF0b3JzXG4gICAgICAgIHJldHVybiB7IGVxdWFsczogdmFsdWUgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHdoZXJlIGNsYXVzZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBiYXNlZCBvbiBmaWVsZCBuYW1lIGFuZCBJRCB0eXBlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHR3byBtYWluIHNjZW5hcmlvczpcbiAgICogMS4gSUQgZmllbGQgY29udmVyc2lvbiAtIGVuc3VyZXMgSURzIG1hdGNoIHRoZSBkYXRhYmFzZSdzIGV4cGVjdGVkIHR5cGUgKG51bWJlciBvciBzdHJpbmcpXG4gICAqIDIuIE9iamVjdCB3aXRoIGVtYmVkZGVkIElEIC0gZXh0cmFjdHMgYW5kIGNvbnZlcnRzIHRoZSBJRCBwcm9wZXJ0eSBmcm9tIG9iamVjdHNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKGNhbiBiZSBwcmltaXRpdmUsIG9iamVjdCB3aXRoIElELCBvciBhcnJheSlcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBxdWVyaWVkXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGRhdGFiYXNlIHF1ZXJ5XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVWYWx1ZSh7IHZhbHVlLCBmaWVsZE5hbWUsIGlkVHlwZSB9OiB7IHZhbHVlOiBhbnk7IGZpZWxkTmFtZTogc3RyaW5nOyBpZFR5cGU6ICdudW1iZXInIHwgJ3RleHQnIH0pIHtcbiAgICAvLyBDaGVjayBpZiBmaWVsZCBpcyBhbiBJRCBmaWVsZCAoc3VwcG9ydGluZyBib3RoIE1vbmdvREItc3R5bGUgX2lkIGFuZCBzdGFuZGFyZCBpZClcbiAgICBpZiAoWydpZCcsICdfaWQnXS5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XG4gICAgICAvLyBDYXNlIDE6IFZhbHVlIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFuIElEIHByb3BlcnR5XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnaWQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIEV4dHJhY3QgSUQgZnJvbSBvYmplY3RcbiAgICAgICAgY29uc3QgaWQgPSB2YWx1ZS5pZFxuXG4gICAgICAgIC8vIFVzZSB0eXBlIGNvbnZlcnNpb24gYmFzZWQgb24gZGF0YWJhc2UgY29uZmlndXJhdGlvblxuICAgICAgICBpZiAoaWRUeXBlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgbnVtSWQgPSBOdW1iZXIoaWQpXG4gICAgICAgICAgcmV0dXJuICFpc05hTihudW1JZCkgPyBudW1JZCA6IGlkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWRUeXBlID09PSAndGV4dCcgJiYgdHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaWRcbiAgICAgIH1cbiAgICAgIC8vIENhc2UgMjogVmFsdWUgaXMgYSBzdGFuZGFsb25lIElEIHRoYXQgbmVlZHMgdHlwZSBjb252ZXJzaW9uXG4gICAgICAvLyBDb252ZXJ0IHN0cmluZyBJRCB0byBudW1iZXIgaWYgZGF0YWJhc2UgZXhwZWN0cyBudW1lcmljIElEc1xuICAgICAgaWYgKGlkVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSlcbiAgICAgIH1cbiAgICAgIC8vIENvbnZlcnQgbnVtZXJpYyBJRCB0byBzdHJpbmcgaWYgZGF0YWJhc2UgZXhwZWN0cyB0ZXh0IElEc1xuICAgICAgZWxzZSBpZiAoaWRUeXBlID09PSAndGV4dCcgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgLy8gRm9yIG5vbi1JRCBmaWVsZHMsIHJldHVybiB0aGUgdmFsdWUgdW5jaGFuZ2VkXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgQmV0dGVyIEF1dGggd2hlcmUgY2xhdXNlcyB0byBQYXlsb2FkIENNUyBjb21wYXRpYmxlIHdoZXJlIGNvbmRpdGlvbnNcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBCZXR0ZXIgQXV0aCBxdWVyeSBmb3JtYXQgaW50byBQYXlsb2FkJ3MgcXVlcnkgZm9ybWF0LFxuICAgKiBoYW5kbGluZyBmaWVsZCBuYW1lIG1hcHBpbmcsIHZhbHVlIHR5cGUgY29udmVyc2lvbiwgYW5kIGxvZ2ljYWwgb3BlcmF0b3JzIChBTkQvT1IpLlxuICAgKlxuICAgKiBUaGUgZnVuY3Rpb24gaGFuZGxlcyB0aHJlZSBtYWluIGNhc2VzOlxuICAgKiAxLiBFbXB0eSBvciB1bmRlZmluZWQgd2hlcmUgY2xhdXNlIC0gcmV0dXJucyBlbXB0eSBvYmplY3RcbiAgICogMi4gU2luZ2xlIGNvbmRpdGlvbiAtIGNvbnZlcnRzIHRvIGEgc2ltcGxlIGZpZWxkLXZhbHVlIHBhaXJcbiAgICogMy4gTXVsdGlwbGUgY29uZGl0aW9ucyAtIGdyb3VwcyBieSBBTkQvT1IgY29ubmVjdG9ycyBhbmQgYnVpbGRzIGEgY29tcGxleCBxdWVyeVxuICAgKlxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGRhdGFiYXNlIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsL2NvbGxlY3Rpb24gbmFtZSB0byBxdWVyeVxuICAgKiBAcGFyYW0gd2hlcmUgLSBBcnJheSBvZiBCZXR0ZXIgQXV0aCB3aGVyZSBjb25kaXRpb25zXG4gICAqIEByZXR1cm5zIEEgUGF5bG9hZC1jb21wYXRpYmxlIHdoZXJlIGNsYXVzZSBvYmplY3RcbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRXaGVyZUNsYXVzZSh7IGlkVHlwZSwgbW9kZWwsIHdoZXJlIH06IHsgaWRUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0JzsgbW9kZWw6IHN0cmluZzsgd2hlcmU/OiBXaGVyZVtdIH0pOiBQYXlsb2FkV2hlcmUge1xuICAgIC8vIEhhbmRsZSBlbXB0eSB3aGVyZSBjbGF1c2VcbiAgICBpZiAoIXdoZXJlKSByZXR1cm4ge31cblxuICAgIC8vIEhhbmRsZSBzaW5nbGUgY29uZGl0aW9uIGNhc2UgZm9yIG9wdGltaXphdGlvblxuICAgIGlmICh3aGVyZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHcgPSB3aGVyZVswXVxuICAgICAgaWYgKCF3KSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyBNYXAgZmllbGQgbmFtZSBhY2NvcmRpbmcgdG8gc2NoZW1hIGFuZCBjb252ZXJ0IHZhbHVlIHRvIGFwcHJvcHJpYXRlIHR5cGVcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZClcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pXG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgUGF5bG9hZCB3aGVyZSBjb25kaXRpb24gd2l0aCBwcm9wZXIgb3BlcmF0b3JcbiAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgW2ZpZWxkTmFtZV06IG9wZXJhdG9yVG9QYXlsb2FkKHcub3BlcmF0b3IgPz8gJycsIHZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG11bHRpcGxlIGNvbmRpdGlvbnMgYnkgc2VwYXJhdGluZyBBTkQvT1IgY2xhdXNlc1xuICAgIC8vIERlZmF1bHQgdG8gQU5EIGlmIG5vIGNvbm5lY3RvciBpcyBzcGVjaWZpZWRcbiAgICBjb25zdCBhbmQgPSB3aGVyZS5maWx0ZXIoKHcpID0+IHcuY29ubmVjdG9yID09PSAnQU5EJyB8fCAhdy5jb25uZWN0b3IpXG4gICAgY29uc3Qgb3IgPSB3aGVyZS5maWx0ZXIoKHcpID0+IHcuY29ubmVjdG9yID09PSAnT1InKVxuXG4gICAgLy8gUHJvY2VzcyBBTkQgY29uZGl0aW9uc1xuICAgIGNvbnN0IGFuZENsYXVzZSA9IGFuZC5tYXAoKHcpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZClcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbZmllbGROYW1lXTogb3BlcmF0b3JUb1BheWxvYWQody5vcGVyYXRvciA/PyAnJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIFByb2Nlc3MgT1IgY29uZGl0aW9uc1xuICAgIGNvbnN0IG9yQ2xhdXNlID0gb3IubWFwKCh3KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBnZXRGaWVsZE5hbWUobW9kZWwsIHcuZmllbGQpXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgaWRUeXBlXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2ZpZWxkTmFtZV06IG9wZXJhdG9yVG9QYXlsb2FkKHcub3BlcmF0b3IgPz8gJycsIHZhbHVlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBDb21iaW5lIEFORCBhbmQgT1IgY2xhdXNlcyBpbnRvIGZpbmFsIFBheWxvYWQgd2hlcmUgb2JqZWN0XG4gICAgLy8gT25seSBpbmNsdWRlIG5vbi1lbXB0eSBjbGF1c2UgYXJyYXlzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihhbmRDbGF1c2UubGVuZ3RoID8geyBBTkQ6IGFuZENsYXVzZSB9IDoge30pLFxuICAgICAgLi4uKG9yQ2xhdXNlLmxlbmd0aCA/IHsgT1I6IG9yQ2xhdXNlIH0gOiB7fSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgdG8gYSBQYXlsb2FkIHNlbGVjdCBvYmplY3RcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgKHdoaWNoIGNvbnRhaW5zIGZpZWxkIG5hbWVzKVxuICAgKiBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBBUEkgKGFuIG9iamVjdCB3aXRoIGZpZWxkIG5hbWVzIGFzIGtleXNcbiAgICogYW5kIGJvb2xlYW4gdHJ1ZSBhcyB2YWx1ZXMpLlxuICAgKlxuICAgKiBJdCBhbHNvIGhhbmRsZXMgZmllbGQgbmFtZSBtYXBwaW5nIGJldHdlZW4gYmV0dGVyLWF1dGggc2NoZW1hIGFuZCBQYXlsb2FkIGNvbGxlY3Rpb25zXG4gICAqIGJ5IHVzaW5nIHRoZSBnZXRGaWVsZE5hbWUgaGVscGVyIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgZmllbGQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gZ2V0IGZpZWxkIG1hcHBpbmdzIGZyb21cbiAgICogQHBhcmFtIHNlbGVjdCAtIE9wdGlvbmFsIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRvIHNlbGVjdFxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzZWxlY3Qgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBmaWVsZHMgdG8gc2VsZWN0XG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElucHV0OiBbJ2VtYWlsJywgJ25hbWUnXVxuICAgKiAvLyBPdXRwdXQ6IHsgZW1haWw6IHRydWUsIG5hbWU6IHRydWUgfVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFNlbGVjdChtb2RlbDogc3RyaW5nLCBzZWxlY3Q/OiBzdHJpbmdbXSkge1xuICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgc2VsZWN0IGlzIGVtcHR5IG9yIG5vdCBwcm92aWRlZFxuICAgIGlmICghc2VsZWN0IHx8IHNlbGVjdC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMgaW50byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgIC8vIHdoaWxlIGFsc28gbWFwcGluZyBhbnkgZmllbGQgbmFtZXMgdGhhdCBtaWdodCBiZSBkaWZmZXJlbnQgaW4gUGF5bG9hZFxuICAgIHJldHVybiBzZWxlY3QucmVkdWNlKChhY2MsIGZpZWxkKSA9PiAoeyAuLi5hY2MsIFtnZXRGaWVsZE5hbWUobW9kZWwsIGZpZWxkKV06IHRydWUgfSksIHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYmV0dGVyLWF1dGggc29ydCBvYmplY3QgdG8gYSBQYXlsb2FkIHNvcnQgc3RyaW5nXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgYmV0dGVyLWF1dGggc29ydCBvYmplY3QgKHdoaWNoIGNvbnRhaW5zIGZpZWxkIG5hbWUgYW5kIGRpcmVjdGlvbilcbiAgICogaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IFBheWxvYWQgQ01TJ3MgcXVlcnkgQVBJIChhIHN0cmluZyB3aXRoIG9wdGlvbmFsICctJyBwcmVmaXggZm9yIGRlc2NlbmRpbmcgb3JkZXIpLlxuICAgKlxuICAgKiBJdCBhbHNvIGhhbmRsZXMgZmllbGQgbmFtZSBtYXBwaW5nIGJldHdlZW4gYmV0dGVyLWF1dGggc2NoZW1hIGFuZCBQYXlsb2FkIGNvbGxlY3Rpb25zXG4gICAqIGJ5IHVzaW5nIHRoZSBnZXRGaWVsZE5hbWUgaGVscGVyIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgZmllbGQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gZ2V0IGZpZWxkIG1hcHBpbmdzIGZyb21cbiAgICogQHBhcmFtIHNvcnRCeSAtIE9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIGZpZWxkIG5hbWUgYW5kIHNvcnQgZGlyZWN0aW9uXG4gICAqIEByZXR1cm5zIEEgUGF5bG9hZC1jb21wYXRpYmxlIHNvcnQgc3RyaW5nIG9yIHVuZGVmaW5lZCBpZiBubyBzb3J0IHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJbnB1dDogeyBmaWVsZDogJ2VtYWlsJywgZGlyZWN0aW9uOiAnZGVzYycgfVxuICAgKiAvLyBPdXRwdXQ6ICctZW1haWwnXG4gICAqIC8vIElucHV0OiB7IGZpZWxkOiAnY3JlYXRlZEF0JywgZGlyZWN0aW9uOiAnYXNjJyB9XG4gICAqIC8vIE91dHB1dDogJ2NyZWF0ZWRBdCdcbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRTb3J0KG1vZGVsOiBzdHJpbmcsIHNvcnRCeT86IHsgZmllbGQ6IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB9KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXNvcnRCeSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgc29ydEJ5LmZpZWxkKVxuICAgIGNvbnN0IHByZWZpeCA9IHNvcnRCeS5kaXJlY3Rpb24gPT09ICdkZXNjJyA/ICctJyA6ICcnXG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke2ZpZWxkTmFtZX1gXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldEZpZWxkTmFtZSxcbiAgICBnZXRDb2xsZWN0aW9uU2x1ZyxcbiAgICBzaW5nbGVJZFF1ZXJ5LFxuICAgIHRyYW5zZm9ybUlucHV0LFxuICAgIHRyYW5zZm9ybU91dHB1dCxcbiAgICBjb252ZXJ0V2hlcmVDbGF1c2UsXG4gICAgY29udmVydFNlbGVjdCxcbiAgICBjb252ZXJ0U29ydFxuICB9XG59XG4iXSwibmFtZXMiOlsiZ2V0QXV0aFRhYmxlcyIsImNyZWF0ZVRyYW5zZm9ybSIsIm9wdGlvbnMiLCJlbmFibGVEZWJ1Z0xvZ3MiLCJzY2hlbWEiLCJkZWJ1Z0xvZyIsIm1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZ2V0Q29sbGVjdGlvblNsdWciLCJtb2RlbCIsImNvbGxlY3Rpb24iLCJtb2RlbE5hbWUiLCJyZXNvbHZlZFNsdWciLCJnZXRGaWVsZE5hbWUiLCJmaWVsZCIsImluY2x1ZGVzIiwiZmllbGREZWZpbml0aW9uIiwiZmllbGRzIiwiZmllbGROYW1lIiwib3JpZ2luYWxGaWVsZCIsImlzUmVsYXRpb25zaGlwRmllbGQiLCJmaWVsZEtleSIsInNjaGVtYUZpZWxkcyIsInJlZmVyZW5jZXMiLCJ1bmRlZmluZWQiLCJpc0RhdGVGaWVsZCIsInZhbHVlIiwiaXNOYU4iLCJEYXRlIiwicGFyc2UiLCJzaW5nbGVJZFF1ZXJ5Iiwid2hlcmUiLCJzb21lIiwiaWRGaWVsZCIsImNvbmRpdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsImVxdWFscyIsImNvbnRhaW5zIiwibGVuZ3RoIiwibm9ybWFsaXplRGF0YSIsImtleSIsImlzUmVsYXRlZEZpZWxkIiwiaWRUeXBlIiwicGFyc2VkIiwicGFyc2VJbnQiLCJvcmlnaW5hbCIsImNvbnZlcnRlZCIsInN0cmluZ0lkIiwiU3RyaW5nIiwibWFwIiwiaWQiLCJ0cmFuc2Zvcm1JbnB1dCIsImRhdGEiLCJ0cmFuc2Zvcm1lZERhdGEiLCJPYmplY3QiLCJlbnRyaWVzIiwiZm9yRWFjaCIsInNjaGVtYUZpZWxkTmFtZSIsIm5vcm1hbGl6ZWREYXRhIiwidGFyZ2V0RmllbGROYW1lIiwidHJhbnNmb3JtT3V0cHV0IiwiZG9jIiwicmVzdWx0IiwicmVsYXRpb25zaGlwRmllbGRzIiwiZnJvbUVudHJpZXMiLCJmaWx0ZXIiLCJvcmlnaW5hbFJlbGF0ZWRGaWVsZEtleSIsImtleXMiLCJmaW5kIiwiayIsIm5vcm1hbGl6ZURvY3VtZW50SWRzIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIml0ZW0iLCJvcGVyYXRvclRvUGF5bG9hZCIsIm9wZXJhdG9yIiwibm90X2VxdWFscyIsImdyZWF0ZXJfdGhhbiIsImdyZWF0ZXJfdGhhbl9lcXVhbCIsImxlc3NfdGhhbiIsImxlc3NfdGhhbl9lcXVhbCIsImluIiwibGlrZSIsImNvbnZlcnRXaGVyZVZhbHVlIiwibnVtSWQiLCJOdW1iZXIiLCJjb252ZXJ0V2hlcmVDbGF1c2UiLCJ3IiwicmVzIiwiYW5kIiwiY29ubmVjdG9yIiwib3IiLCJhbmRDbGF1c2UiLCJvckNsYXVzZSIsIkFORCIsIk9SIiwiY29udmVydFNlbGVjdCIsInNlbGVjdCIsInJlZHVjZSIsImFjYyIsImNvbnZlcnRTb3J0Iiwic29ydEJ5IiwicHJlZml4IiwiZGlyZWN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFvQ0EsYUFBYSxRQUFRLGlCQUFnQjtBQUl6RSxPQUFPLE1BQU1DLGtCQUFrQixDQUFDQyxTQUE0QkM7SUFDMUQsTUFBTUMsU0FBU0osY0FBY0U7SUFFN0IsU0FBU0csU0FBU0MsT0FBYztRQUM5QixJQUFJSCxp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
@@ -0,0 +1,216 @@
1
+ export type BaseUserFields = {
2
+ name: string;
3
+ email: string;
4
+ emailVerified: boolean;
5
+ image?: string;
6
+ createdAt: Date;
7
+ updatedAt: Date;
8
+ role?: string;
9
+ };
10
+ export type UserPluginFields = {
11
+ "username": {
12
+ username?: string;
13
+ displayUsername?: string;
14
+ };
15
+ "admin": {
16
+ banned?: boolean;
17
+ banReason?: string;
18
+ banExpires?: Date;
19
+ };
20
+ "harmony-email": {
21
+ normalizedEmail?: string;
22
+ };
23
+ "phone-number": {
24
+ phoneNumber?: string;
25
+ phoneNumberVerified?: boolean;
26
+ };
27
+ "anonymous": {
28
+ isAnonymous?: boolean;
29
+ };
30
+ "two-factor": {
31
+ twoFactorEnabled?: boolean;
32
+ };
33
+ "stripe": {
34
+ stripeCustomerId?: string;
35
+ };
36
+ };
37
+ export type User = BaseUserFields & UserPluginFields["username"] & UserPluginFields["admin"] & UserPluginFields["harmony-email"] & UserPluginFields["phone-number"] & UserPluginFields["anonymous"] & UserPluginFields["two-factor"] & UserPluginFields["stripe"];
38
+ export type BaseSessionFields = {
39
+ expiresAt: Date;
40
+ token: string;
41
+ createdAt: Date;
42
+ updatedAt: Date;
43
+ ipAddress?: string;
44
+ userAgent?: string;
45
+ userId: string;
46
+ };
47
+ export type SessionPluginFields = {
48
+ "admin": {
49
+ impersonatedBy?: string;
50
+ };
51
+ "organization": {
52
+ activeOrganizationId?: string;
53
+ };
54
+ };
55
+ export type Session = BaseSessionFields & SessionPluginFields["admin"] & SessionPluginFields["organization"];
56
+ export type BaseAccountFields = {
57
+ accountId: string;
58
+ providerId: string;
59
+ userId: string;
60
+ accessToken?: string;
61
+ refreshToken?: string;
62
+ idToken?: string;
63
+ accessTokenExpiresAt?: Date;
64
+ refreshTokenExpiresAt?: Date;
65
+ scope?: string;
66
+ password?: string;
67
+ createdAt: Date;
68
+ updatedAt: Date;
69
+ };
70
+ export type Account = BaseAccountFields;
71
+ export type BaseVerificationFields = {
72
+ identifier: string;
73
+ value: string;
74
+ expiresAt: Date;
75
+ createdAt?: Date;
76
+ updatedAt?: Date;
77
+ };
78
+ export type Verification = BaseVerificationFields;
79
+ export type ApikeyFields = {
80
+ name?: string;
81
+ start?: string;
82
+ prefix?: string;
83
+ key: string;
84
+ userId: string;
85
+ refillInterval?: number;
86
+ refillAmount?: number;
87
+ lastRefillAt?: Date;
88
+ enabled?: boolean;
89
+ rateLimitEnabled?: boolean;
90
+ rateLimitTimeWindow?: number;
91
+ rateLimitMax?: number;
92
+ requestCount?: number;
93
+ remaining?: number;
94
+ lastRequest?: Date;
95
+ expiresAt?: Date;
96
+ createdAt: Date;
97
+ updatedAt: Date;
98
+ permissions?: string;
99
+ metadata?: string;
100
+ };
101
+ export type Apikey = ApikeyFields;
102
+ export type PasskeyFields = {
103
+ name?: string;
104
+ publicKey: string;
105
+ userId: string;
106
+ credentialID: string;
107
+ counter: number;
108
+ deviceType: string;
109
+ backedUp: boolean;
110
+ transports?: string;
111
+ createdAt?: Date;
112
+ };
113
+ export type Passkey = PasskeyFields;
114
+ export type OauthApplicationFields = {
115
+ name?: string;
116
+ icon?: string;
117
+ metadata?: string;
118
+ clientId?: string;
119
+ clientSecret?: string;
120
+ redirectURLs?: string;
121
+ type?: string;
122
+ disabled?: boolean;
123
+ userId?: string;
124
+ createdAt?: Date;
125
+ updatedAt?: Date;
126
+ };
127
+ export type OauthApplication = OauthApplicationFields;
128
+ export type OauthAccessTokenFields = {
129
+ accessToken?: string;
130
+ refreshToken?: string;
131
+ accessTokenExpiresAt?: Date;
132
+ refreshTokenExpiresAt?: Date;
133
+ clientId?: string;
134
+ userId?: string;
135
+ scopes?: string;
136
+ createdAt?: Date;
137
+ updatedAt?: Date;
138
+ };
139
+ export type OauthAccessToken = OauthAccessTokenFields;
140
+ export type OauthConsentFields = {
141
+ clientId?: string;
142
+ userId?: string;
143
+ scopes?: string;
144
+ createdAt?: Date;
145
+ updatedAt?: Date;
146
+ consentGiven?: boolean;
147
+ };
148
+ export type OauthConsent = OauthConsentFields;
149
+ export type SsoProviderFields = {
150
+ issuer: string;
151
+ oidcConfig?: string;
152
+ samlConfig?: string;
153
+ userId?: string;
154
+ providerId: string;
155
+ organizationId?: string;
156
+ domain: string;
157
+ };
158
+ export type SsoProvider = SsoProviderFields;
159
+ export type OrganizationFields = {
160
+ name: string;
161
+ slug?: string;
162
+ logo?: string;
163
+ createdAt: Date;
164
+ metadata?: string;
165
+ };
166
+ export type Organization = OrganizationFields;
167
+ export type MemberFields = {
168
+ organizationId: string;
169
+ userId: string;
170
+ role: string;
171
+ teamId?: string;
172
+ createdAt: Date;
173
+ };
174
+ export type Member = MemberFields;
175
+ export type InvitationFields = {
176
+ organizationId: string;
177
+ email: string;
178
+ role?: string;
179
+ teamId?: string;
180
+ status: string;
181
+ expiresAt: Date;
182
+ inviterId: string;
183
+ };
184
+ export type Invitation = InvitationFields;
185
+ export type TeamFields = {
186
+ name: string;
187
+ organizationId: string;
188
+ createdAt: Date;
189
+ updatedAt?: Date;
190
+ };
191
+ export type Team = TeamFields;
192
+ export type JwksFields = {
193
+ publicKey: string;
194
+ privateKey: string;
195
+ createdAt: Date;
196
+ };
197
+ export type Jwks = JwksFields;
198
+ export type TwoFactorFields = {
199
+ secret: string;
200
+ backupCodes: string;
201
+ userId: string;
202
+ };
203
+ export type TwoFactor = TwoFactorFields;
204
+ export type SubscriptionFields = {
205
+ plan: string;
206
+ referenceId: string;
207
+ stripeCustomerId?: string;
208
+ stripeSubscriptionId?: string;
209
+ status?: string;
210
+ periodStart?: Date;
211
+ periodEnd?: Date;
212
+ cancelAtPeriodEnd?: boolean;
213
+ seats?: number;
214
+ };
215
+ export type Subscription = SubscriptionFields;
216
+ //# sourceMappingURL=generated-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-types.d.ts","sourceRoot":"","sources":["../../src/better-auth/generated-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ // Auto-generated types. Do not edit.
2
+ export { };
3
+
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iZXR0ZXItYXV0aC9nZW5lcmF0ZWQtdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQXV0by1nZW5lcmF0ZWQgdHlwZXMuIERvIG5vdCBlZGl0LlxuXG5leHBvcnQgdHlwZSBCYXNlVXNlckZpZWxkcyA9IHtcbiAgbmFtZTogc3RyaW5nXG4gIGVtYWlsOiBzdHJpbmdcbiAgZW1haWxWZXJpZmllZDogYm9vbGVhblxuICBpbWFnZT86IHN0cmluZ1xuICBjcmVhdGVkQXQ6IERhdGVcbiAgdXBkYXRlZEF0OiBEYXRlXG4gIHJvbGU/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgVXNlclBsdWdpbkZpZWxkcyA9IHtcbiAgXCJ1c2VybmFtZVwiOiB7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgICBkaXNwbGF5VXNlcm5hbWU/OiBzdHJpbmdcbiAgfVxuICBcImFkbWluXCI6IHtcbiAgICBiYW5uZWQ/OiBib29sZWFuXG4gICAgYmFuUmVhc29uPzogc3RyaW5nXG4gICAgYmFuRXhwaXJlcz86IERhdGVcbiAgfVxuICBcImhhcm1vbnktZW1haWxcIjoge1xuICAgIG5vcm1hbGl6ZWRFbWFpbD86IHN0cmluZ1xuICB9XG4gIFwicGhvbmUtbnVtYmVyXCI6IHtcbiAgICBwaG9uZU51bWJlcj86IHN0cmluZ1xuICAgIHBob25lTnVtYmVyVmVyaWZpZWQ/OiBib29sZWFuXG4gIH1cbiAgXCJhbm9ueW1vdXNcIjoge1xuICAgIGlzQW5vbnltb3VzPzogYm9vbGVhblxuICB9XG4gIFwidHdvLWZhY3RvclwiOiB7XG4gICAgdHdvRmFjdG9yRW5hYmxlZD86IGJvb2xlYW5cbiAgfVxuICBcInN0cmlwZVwiOiB7XG4gICAgc3RyaXBlQ3VzdG9tZXJJZD86IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFVzZXIgPSBCYXNlVXNlckZpZWxkcyAmIFVzZXJQbHVnaW5GaWVsZHNbXCJ1c2VybmFtZVwiXSAmIFVzZXJQbHVnaW5GaWVsZHNbXCJhZG1pblwiXSAmIFVzZXJQbHVnaW5GaWVsZHNbXCJoYXJtb255LWVtYWlsXCJdICYgVXNlclBsdWdpbkZpZWxkc1tcInBob25lLW51bWJlclwiXSAmIFVzZXJQbHVnaW5GaWVsZHNbXCJhbm9ueW1vdXNcIl0gJiBVc2VyUGx1Z2luRmllbGRzW1widHdvLWZhY3RvclwiXSAmIFVzZXJQbHVnaW5GaWVsZHNbXCJzdHJpcGVcIl1cblxuZXhwb3J0IHR5cGUgQmFzZVNlc3Npb25GaWVsZHMgPSB7XG4gIGV4cGlyZXNBdDogRGF0ZVxuICB0b2tlbjogc3RyaW5nXG4gIGNyZWF0ZWRBdDogRGF0ZVxuICB1cGRhdGVkQXQ6IERhdGVcbiAgaXBBZGRyZXNzPzogc3RyaW5nXG4gIHVzZXJBZ2VudD86IHN0cmluZ1xuICB1c2VySWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBTZXNzaW9uUGx1Z2luRmllbGRzID0ge1xuICBcImFkbWluXCI6IHtcbiAgICBpbXBlcnNvbmF0ZWRCeT86IHN0cmluZ1xuICB9XG4gIFwib3JnYW5pemF0aW9uXCI6IHtcbiAgICBhY3RpdmVPcmdhbml6YXRpb25JZD86IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFNlc3Npb24gPSBCYXNlU2Vzc2lvbkZpZWxkcyAmIFNlc3Npb25QbHVnaW5GaWVsZHNbXCJhZG1pblwiXSAmIFNlc3Npb25QbHVnaW5GaWVsZHNbXCJvcmdhbml6YXRpb25cIl1cblxuZXhwb3J0IHR5cGUgQmFzZUFjY291bnRGaWVsZHMgPSB7XG4gIGFjY291bnRJZDogc3RyaW5nXG4gIHByb3ZpZGVySWQ6IHN0cmluZ1xuICB1c2VySWQ6IHN0cmluZ1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZ1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmdcbiAgaWRUb2tlbj86IHN0cmluZ1xuICBhY2Nlc3NUb2tlbkV4cGlyZXNBdD86IERhdGVcbiAgcmVmcmVzaFRva2VuRXhwaXJlc0F0PzogRGF0ZVxuICBzY29wZT86IHN0cmluZ1xuICBwYXNzd29yZD86IHN0cmluZ1xuICBjcmVhdGVkQXQ6IERhdGVcbiAgdXBkYXRlZEF0OiBEYXRlXG59XG5cbmV4cG9ydCB0eXBlIEFjY291bnQgPSBCYXNlQWNjb3VudEZpZWxkc1xuXG5leHBvcnQgdHlwZSBCYXNlVmVyaWZpY2F0aW9uRmllbGRzID0ge1xuICBpZGVudGlmaWVyOiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICBleHBpcmVzQXQ6IERhdGVcbiAgY3JlYXRlZEF0PzogRGF0ZVxuICB1cGRhdGVkQXQ/OiBEYXRlXG59XG5cbmV4cG9ydCB0eXBlIFZlcmlmaWNhdGlvbiA9IEJhc2VWZXJpZmljYXRpb25GaWVsZHNcblxuZXhwb3J0IHR5cGUgQXBpa2V5RmllbGRzID0ge1xuICBuYW1lPzogc3RyaW5nXG4gIHN0YXJ0Pzogc3RyaW5nXG4gIHByZWZpeD86IHN0cmluZ1xuICBrZXk6IHN0cmluZ1xuICB1c2VySWQ6IHN0cmluZ1xuICByZWZpbGxJbnRlcnZhbD86IG51bWJlclxuICByZWZpbGxBbW91bnQ/OiBudW1iZXJcbiAgbGFzdFJlZmlsbEF0PzogRGF0ZVxuICBlbmFibGVkPzogYm9vbGVhblxuICByYXRlTGltaXRFbmFibGVkPzogYm9vbGVhblxuICByYXRlTGltaXRUaW1lV2luZG93PzogbnVtYmVyXG4gIHJhdGVMaW1pdE1heD86IG51bWJlclxuICByZXF1ZXN0Q291bnQ/OiBudW1iZXJcbiAgcmVtYWluaW5nPzogbnVtYmVyXG4gIGxhc3RSZXF1ZXN0PzogRGF0ZVxuICBleHBpcmVzQXQ/OiBEYXRlXG4gIGNyZWF0ZWRBdDogRGF0ZVxuICB1cGRhdGVkQXQ6IERhdGVcbiAgcGVybWlzc2lvbnM/OiBzdHJpbmdcbiAgbWV0YWRhdGE/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQXBpa2V5ID0gQXBpa2V5RmllbGRzXG5cbmV4cG9ydCB0eXBlIFBhc3NrZXlGaWVsZHMgPSB7XG4gIG5hbWU/OiBzdHJpbmdcbiAgcHVibGljS2V5OiBzdHJpbmdcbiAgdXNlcklkOiBzdHJpbmdcbiAgY3JlZGVudGlhbElEOiBzdHJpbmdcbiAgY291bnRlcjogbnVtYmVyXG4gIGRldmljZVR5cGU6IHN0cmluZ1xuICBiYWNrZWRVcDogYm9vbGVhblxuICB0cmFuc3BvcnRzPzogc3RyaW5nXG4gIGNyZWF0ZWRBdD86IERhdGVcbn1cblxuZXhwb3J0IHR5cGUgUGFzc2tleSA9IFBhc3NrZXlGaWVsZHNcblxuZXhwb3J0IHR5cGUgT2F1dGhBcHBsaWNhdGlvbkZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZ1xuICBpY29uPzogc3RyaW5nXG4gIG1ldGFkYXRhPzogc3RyaW5nXG4gIGNsaWVudElkPzogc3RyaW5nXG4gIGNsaWVudFNlY3JldD86IHN0cmluZ1xuICByZWRpcmVjdFVSTHM/OiBzdHJpbmdcbiAgdHlwZT86IHN0cmluZ1xuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgdXNlcklkPzogc3RyaW5nXG4gIGNyZWF0ZWRBdD86IERhdGVcbiAgdXBkYXRlZEF0PzogRGF0ZVxufVxuXG5leHBvcnQgdHlwZSBPYXV0aEFwcGxpY2F0aW9uID0gT2F1dGhBcHBsaWNhdGlvbkZpZWxkc1xuXG5leHBvcnQgdHlwZSBPYXV0aEFjY2Vzc1Rva2VuRmllbGRzID0ge1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZ1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmdcbiAgYWNjZXNzVG9rZW5FeHBpcmVzQXQ/OiBEYXRlXG4gIHJlZnJlc2hUb2tlbkV4cGlyZXNBdD86IERhdGVcbiAgY2xpZW50SWQ/OiBzdHJpbmdcbiAgdXNlcklkPzogc3RyaW5nXG4gIHNjb3Blcz86IHN0cmluZ1xuICBjcmVhdGVkQXQ/OiBEYXRlXG4gIHVwZGF0ZWRBdD86IERhdGVcbn1cblxuZXhwb3J0IHR5cGUgT2F1dGhBY2Nlc3NUb2tlbiA9IE9hdXRoQWNjZXNzVG9rZW5GaWVsZHNcblxuZXhwb3J0IHR5cGUgT2F1dGhDb25zZW50RmllbGRzID0ge1xuICBjbGllbnRJZD86IHN0cmluZ1xuICB1c2VySWQ/OiBzdHJpbmdcbiAgc2NvcGVzPzogc3RyaW5nXG4gIGNyZWF0ZWRBdD86IERhdGVcbiAgdXBkYXRlZEF0PzogRGF0ZVxuICBjb25zZW50R2l2ZW4/OiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIE9hdXRoQ29uc2VudCA9IE9hdXRoQ29uc2VudEZpZWxkc1xuXG5leHBvcnQgdHlwZSBTc29Qcm92aWRlckZpZWxkcyA9IHtcbiAgaXNzdWVyOiBzdHJpbmdcbiAgb2lkY0NvbmZpZz86IHN0cmluZ1xuICBzYW1sQ29uZmlnPzogc3RyaW5nXG4gIHVzZXJJZD86IHN0cmluZ1xuICBwcm92aWRlcklkOiBzdHJpbmdcbiAgb3JnYW5pemF0aW9uSWQ/OiBzdHJpbmdcbiAgZG9tYWluOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgU3NvUHJvdmlkZXIgPSBTc29Qcm92aWRlckZpZWxkc1xuXG5leHBvcnQgdHlwZSBPcmdhbml6YXRpb25GaWVsZHMgPSB7XG4gIG5hbWU6IHN0cmluZ1xuICBzbHVnPzogc3RyaW5nXG4gIGxvZ28/OiBzdHJpbmdcbiAgY3JlYXRlZEF0OiBEYXRlXG4gIG1ldGFkYXRhPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIE9yZ2FuaXphdGlvbiA9IE9yZ2FuaXphdGlvbkZpZWxkc1xuXG5leHBvcnQgdHlwZSBNZW1iZXJGaWVsZHMgPSB7XG4gIG9yZ2FuaXphdGlvbklkOiBzdHJpbmdcbiAgdXNlcklkOiBzdHJpbmdcbiAgcm9sZTogc3RyaW5nXG4gIHRlYW1JZD86IHN0cmluZ1xuICBjcmVhdGVkQXQ6IERhdGVcbn1cblxuZXhwb3J0IHR5cGUgTWVtYmVyID0gTWVtYmVyRmllbGRzXG5cbmV4cG9ydCB0eXBlIEludml0YXRpb25GaWVsZHMgPSB7XG4gIG9yZ2FuaXphdGlvbklkOiBzdHJpbmdcbiAgZW1haWw6IHN0cmluZ1xuICByb2xlPzogc3RyaW5nXG4gIHRlYW1JZD86IHN0cmluZ1xuICBzdGF0dXM6IHN0cmluZ1xuICBleHBpcmVzQXQ6IERhdGVcbiAgaW52aXRlcklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW52aXRhdGlvbiA9IEludml0YXRpb25GaWVsZHNcblxuZXhwb3J0IHR5cGUgVGVhbUZpZWxkcyA9IHtcbiAgbmFtZTogc3RyaW5nXG4gIG9yZ2FuaXphdGlvbklkOiBzdHJpbmdcbiAgY3JlYXRlZEF0OiBEYXRlXG4gIHVwZGF0ZWRBdD86IERhdGVcbn1cblxuZXhwb3J0IHR5cGUgVGVhbSA9IFRlYW1GaWVsZHNcblxuZXhwb3J0IHR5cGUgSndrc0ZpZWxkcyA9IHtcbiAgcHVibGljS2V5OiBzdHJpbmdcbiAgcHJpdmF0ZUtleTogc3RyaW5nXG4gIGNyZWF0ZWRBdDogRGF0ZVxufVxuXG5leHBvcnQgdHlwZSBKd2tzID0gSndrc0ZpZWxkc1xuXG5leHBvcnQgdHlwZSBUd29GYWN0b3JGaWVsZHMgPSB7XG4gIHNlY3JldDogc3RyaW5nXG4gIGJhY2t1cENvZGVzOiBzdHJpbmdcbiAgdXNlcklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgVHdvRmFjdG9yID0gVHdvRmFjdG9yRmllbGRzXG5cbmV4cG9ydCB0eXBlIFN1YnNjcmlwdGlvbkZpZWxkcyA9IHtcbiAgcGxhbjogc3RyaW5nXG4gIHJlZmVyZW5jZUlkOiBzdHJpbmdcbiAgc3RyaXBlQ3VzdG9tZXJJZD86IHN0cmluZ1xuICBzdHJpcGVTdWJzY3JpcHRpb25JZD86IHN0cmluZ1xuICBzdGF0dXM/OiBzdHJpbmdcbiAgcGVyaW9kU3RhcnQ/OiBEYXRlXG4gIHBlcmlvZEVuZD86IERhdGVcbiAgY2FuY2VsQXRQZXJpb2RFbmQ/OiBib29sZWFuXG4gIHNlYXRzPzogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbkZpZWxkc1xuXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUNBQXFDO0FBMlByQyxXQUE2QyJ9