@pipeline-builder/api-core 5.2.3 → 5.2.4

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 (81) hide show
  1. package/lib/constants/ai-providers.d.ts +3 -22
  2. package/lib/constants/ai-providers.js +6 -56
  3. package/lib/errors/app-errors.d.ts +14 -0
  4. package/lib/errors/app-errors.js +21 -1
  5. package/lib/helpers/sse-helpers.d.ts +33 -3
  6. package/lib/helpers/sse-helpers.js +91 -19
  7. package/lib/middleware/auth.js +6 -3
  8. package/lib/middleware/deferred-quota-check.d.ts +5 -0
  9. package/lib/middleware/deferred-quota-check.js +33 -0
  10. package/lib/middleware/ecosystem-guard.d.ts +3 -3
  11. package/lib/middleware/ecosystem-guard.js +5 -5
  12. package/lib/middleware/index.d.ts +5 -2
  13. package/lib/middleware/index.js +6 -3
  14. package/lib/middleware/on-behalf.d.ts +37 -0
  15. package/lib/middleware/on-behalf.js +143 -0
  16. package/lib/middleware/permission-gates.d.ts +11 -0
  17. package/lib/middleware/permission-gates.js +7 -1
  18. package/lib/middleware/quota-exempt-routes.d.ts +36 -0
  19. package/lib/middleware/quota-exempt-routes.js +47 -0
  20. package/lib/middleware/route-table.d.ts +104 -0
  21. package/lib/middleware/route-table.js +72 -2
  22. package/lib/middleware/service-tokens.d.ts +8 -0
  23. package/lib/middleware/service-tokens.js +2 -1
  24. package/lib/middleware/step-up.js +11 -1
  25. package/lib/services/ai-call-weight.d.ts +24 -0
  26. package/lib/services/ai-call-weight.js +77 -0
  27. package/lib/services/audit-context.d.ts +105 -0
  28. package/lib/services/audit-context.js +134 -0
  29. package/lib/services/index.d.ts +7 -2
  30. package/lib/services/index.js +7 -2
  31. package/lib/services/org-ai-client.d.ts +61 -0
  32. package/lib/services/org-ai-client.js +112 -0
  33. package/lib/services/quota-increment-batcher.d.ts +81 -0
  34. package/lib/services/quota-increment-batcher.js +166 -0
  35. package/lib/services/quota.d.ts +158 -14
  36. package/lib/services/quota.js +252 -22
  37. package/lib/services/remote-audit-client.d.ts +44 -1
  38. package/lib/services/remote-audit-client.js +106 -20
  39. package/lib/services/version-vuln-policy.d.ts +174 -0
  40. package/lib/services/version-vuln-policy.js +242 -0
  41. package/lib/types/ai-catalog.d.ts +63 -0
  42. package/lib/types/ai-catalog.js +82 -0
  43. package/lib/types/ask-proposals.js +6 -6
  44. package/lib/types/build-catalog.d.ts +154 -0
  45. package/lib/types/build-catalog.js +158 -0
  46. package/lib/types/common.d.ts +37 -3
  47. package/lib/types/common.js +20 -2
  48. package/lib/types/ecosystem-notifications.d.ts +5 -5
  49. package/lib/types/ecosystem-notifications.js +9 -3
  50. package/lib/types/error-codes.d.ts +13 -6
  51. package/lib/types/error-codes.js +18 -8
  52. package/lib/types/feature-flags.d.ts +6 -4
  53. package/lib/types/feature-flags.js +11 -6
  54. package/lib/types/index.d.ts +6 -4
  55. package/lib/types/index.js +12 -5
  56. package/lib/types/metadata-keys.d.ts +6 -0
  57. package/lib/types/metadata-keys.js +4 -1
  58. package/lib/types/permissions.d.ts +344 -3
  59. package/lib/types/permissions.js +596 -21
  60. package/lib/types/pipeline.d.ts +39 -0
  61. package/lib/types/pipeline.js +57 -1
  62. package/lib/types/plugin-health.d.ts +0 -2
  63. package/lib/types/plugin-health.js +1 -11
  64. package/lib/types/plugin-scan.d.ts +192 -42
  65. package/lib/types/plugin-scan.js +159 -43
  66. package/lib/types/quota-catalog.d.ts +247 -0
  67. package/lib/types/quota-catalog.js +122 -0
  68. package/lib/types/quota-tiers.d.ts +118 -0
  69. package/lib/types/quota-tiers.js +153 -2
  70. package/lib/types/remote-audit-actions.d.ts +1 -1
  71. package/lib/types/remote-audit-actions.js +131 -1
  72. package/lib/types/wire-vocabulary.js +8 -1
  73. package/lib/utils/index.d.ts +1 -1
  74. package/lib/utils/index.js +2 -2
  75. package/lib/utils/response.d.ts +35 -2
  76. package/lib/utils/response.js +42 -3
  77. package/lib/validation/ai-schemas.d.ts +27 -0
  78. package/lib/validation/ai-schemas.js +31 -5
  79. package/lib/validation/plugin-schemas.d.ts +15 -0
  80. package/lib/validation/plugin-schemas.js +28 -1
  81. package/package.json +31 -2
@@ -95,7 +95,7 @@ export const ORG_SETTING_PROPOSAL_ALLOWLIST = [
95
95
  field: 'incidentWindowHours',
96
96
  shape: { kind: 'integer', min: 1, max: 720 },
97
97
  api: { method: 'PUT', path: '/reports/settings/incidents' },
98
- permission: 'org:settings',
98
+ permission: 'org_settings:write',
99
99
  label: 'Incident correlation window (hours)',
100
100
  why: 'Analytics tuning only: it decides how long after a deploy an incident is '
101
101
  + 'attributed to that deploy when DORA metrics are computed. It grants nothing, '
@@ -154,7 +154,7 @@ export const ORG_SETTING_PROPOSAL_ALLOWLIST = [
154
154
  field: 'notifyRescan',
155
155
  shape: { kind: 'boolean' },
156
156
  api: { method: 'PUT', path: '/plugins/security-notifications' },
157
- permission: 'org:settings',
157
+ permission: 'org_settings:write',
158
158
  label: 'Notify on nightly rescan findings',
159
159
  why: 'Governs the N31 rescan notice only. The scan GATES are untouched: a build that '
160
160
  + 'trips PLUGIN_VULN_GATE still fails and still sends N30, which this flag cannot '
@@ -167,7 +167,7 @@ export const ORG_SETTING_PROPOSAL_ALLOWLIST = [
167
167
  field: 'digestMode',
168
168
  shape: { kind: 'enum', values: DIGEST_MODES },
169
169
  api: { method: 'PUT', path: '/plugins/security-notifications' },
170
- permission: 'org:settings',
170
+ permission: 'org_settings:write',
171
171
  label: 'Plugin security notice cadence',
172
172
  why: 'Cadence of the rescan notice. N30 ("version blocked") is always immediate and '
173
173
  + 'ignores this field, so the urgent channel cannot be slowed down.',
@@ -185,8 +185,8 @@ export const ORG_SETTING_PROPOSAL_EXCLUSIONS = [
185
185
  { field: 'organization.passwordPolicy', why: 'Security control + step-up.' },
186
186
  { field: 'organization.authenticatorPolicy', why: 'Security control + step-up.' },
187
187
  { field: 'organization.impersonationPolicy', why: 'Security control + step-up; decides who outside the org may view its data.' },
188
- { field: 'organization.idp', why: 'SSO/SAML config: security control on its own capability (org:idp), assurance + strong step-up.' },
189
- { field: 'organization.kmsConfig', why: 'Key material. Own capability (org:kms), assurance + strong step-up.' },
188
+ { field: 'organization.idp', why: 'SSO/SAML config: security control on its own capability (org_idp:write), assurance + strong step-up.' },
189
+ { field: 'organization.kmsConfig', why: 'Key material. Own capability (org_kms:write), assurance + strong step-up.' },
190
190
  { field: 'organization.identity', why: 'Org name/slug: no step-up, but renaming an org is an impersonation primitive and the slug is addressable.' },
191
191
  { field: 'organization.domains', why: 'Verified domains drive domain-based join — who may become a member.' },
192
192
  { field: 'organization.joinRequests', why: 'Membership decisions are an authority grant, not a setting.' },
@@ -305,4 +305,4 @@ export function orgSettingRequests(changes) {
305
305
  }
306
306
  return [...bySurface.values()];
307
307
  }
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLXByb3Bvc2Fscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9hc2stcHJvcG9zYWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUF3RXRDLGdGQUFnRjtBQUNoRixzQkFBc0I7QUFDdEIsZ0ZBQWdGO0FBRWhGLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUM7QUFFOUMsdURBQXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFlBQVksQ0FBQztBQU9uRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxPQUEyQztJQUUzQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtCLENBQUM7QUFXekQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsT0FBZ0I7SUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBcUQsQ0FBQztJQUNsRSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JGLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2hELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDekUsT0FB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QUMsR0FBRyxDQUFDLElBQUk7WUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgc2hhcmVkIGNvbnRyYWN0IGJldHdlZW4gdGhlIGFzayBhZ2VudCdzIFBST1BPU0UgdG9vbHMgYW5kIHRoZSBicm93c2VyJ3NcbiAqIENPTkZJUk0gaGFuZGxlcnMuIFR3byB0aGluZ3MgbGl2ZSBoZXJlLCBhbmQgdGhleSBsaXZlIGhlcmUgYmVjYXVzZSBCT1RIIHNpZGVzXG4gKiBuZWVkIHRoZW06IGBhcGkvYXNrYCBidWlsZHMgaXRzIHRvb2wgc2NoZW1hIGZyb20gdGhpcyBtb2R1bGUsIHRoZSBmcm9udGVuZCdzXG4gKiBjb25maXJtIGhhbmRsZXIgYnVpbGRzIGl0cyByZXF1ZXN0IGZyb20gaXQsIGFuZCB0aGUgdGVzdHMgb2YgYm90aCBhc3NlcnRcbiAqIGFnYWluc3QgaXQuIEEgc2Vjb25kIGNvcHkgd291bGQgYmUgYSBzZWNvbmQgcG9saWN5LlxuICpcbiAqIERlcGVuZGVuY3ktZnJlZSBvbiBwdXJwb3NlIOKAlCBubyBydW50aW1lIGltcG9ydHMgYXQgYWxsIOKAlCBzbyB0aGUgYnJvd3NlciBjYW5cbiAqIGltcG9ydCBpdCB0aHJvdWdoIGFwaS1jb3JlJ3MgYC4vYXNrLXByb3Bvc2Fsc2AgZW50cnkgd2l0aG91dCBkcmFnZ2luZyBpbiB0aGVcbiAqIHNlcnZlciBncmFwaCAoZXhwcmVzcyAvIGp3dCAvIGlvcmVkaXMpLiBUaGUgb25seSBpbXBvcnRzIGFyZSBgaW1wb3J0IHR5cGVgLFxuICogd2hpY2ggdGhlIGNvbXBpbGVyIGVyYXNlcy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogMS4gUFJPVkVOQU5DRVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5IGNvbW1pdCB0aGF0IHN0YXJ0ZWQgbGlmZSBhcyBhbiBhZ2VudCBkcmFmdCBzdGFtcHNcbiAqIGBkZXRhaWxzOiB7IHByb3Bvc2VkQnk6ICdhc2stYWdlbnQnIH1gIG9udG8gaXRzIGF1ZGl0IGV2ZW50LiBUaGUgYXVkaXQgdHJhaWxcbiAqIGlzIGhhc2gtY2hhaW5lZCBhbmQgdGFtcGVyLWV2aWRlbnQsIGJ1dCB3aXRob3V0IHRoaXMgZmllbGQgaXQgY2Fubm90XG4gKiBkaXN0aW5ndWlzaCBcInRoZSBhZG1pbiBjaGFuZ2VkIHRoaXNcIiBmcm9tIFwiYW4gQUkgZHJhZnRlZCBpdCBhbmQgdGhlIGFkbWluXG4gKiBjbGlja2VkIEFwcGx5XCIg4oCUIHRoZSB0d28gbWVhbiB2ZXJ5IGRpZmZlcmVudCB0aGluZ3MgaW4gYW4gaW5jaWRlbnQgcmV2aWV3LlxuICogVGhlIGNvbnN0YW50IGV4aXN0cyBzbyB0aGUgbGl0ZXJhbCBpcyBub3QgcmV0eXBlZCBpbiB0d28gY29kZWJhc2VzLCB3aGVyZSBhXG4gKiB0eXBvIHdvdWxkIHNpbGVudGx5IHByb2R1Y2UgYW4gdW5xdWVyeWFibGUgdHJhaWwuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIDIuIFRIRSBPUkctU0VUVElOR1MgQUxMT1dMSVNUXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGhpcyBpcyBhbiBBTExPV0xJU1QsIG5vdCBhIGRlbnlsaXN0LCBhbmQgdGhlIGRpc3RpbmN0aW9uIGlzIHRoZSB3aG9sZSBwb2ludDpcbiAqIGEgc2V0dGluZyBhZGRlZCB0byB0aGUgcGxhdGZvcm0gdG9tb3Jyb3cgaXMgVU5BVkFJTEFCTEUgdG8gdGhlIGFnZW50IHVudGlsXG4gKiBzb21lb25lIGRlbGliZXJhdGVseSBhZGRzIGl0IGhlcmUsIHJhdGhlciB0aGFuIGJlaW5nIGV4cG9zZWQgYnkgb21pc3Npb24uXG4gKiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyBiZWNhdXNlIGEgcHJvcG9zYWwgd2FzIHJlZnVzZWQsIHRoZSBmaXggaXMgdG8gYWRkIHRoZVxuICogZmllbGQgYmVsb3cgV0lUSCBpdHMgYHdoeWAg4oCUIG5vdCB0byBsb29zZW4ge0BsaW5rIHBpY2tBbGxvd2VkfS5cbiAqXG4gKiBBIGZpZWxkIGVhcm5zIGEgcGxhY2UgaGVyZSBvbmx5IGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGhvbGQuIFRoZXkgd2VyZVxuICogY2hlY2tlZCBhZ2FpbnN0IHRoZSByb3V0ZXMsIG5vdCBhc3N1bWVkOlxuICpcbiAqICAtICoqTm8gc3RlcC11cC4qKiBBIHJvdXRlIGNhcnJ5aW5nIGByZXF1aXJlU3RlcFVwYCBpcyBvdXQsIG5vIGV4Y2VwdGlvbnMuXG4gKiAgICBTdGVwLXVwIG1lYW5zIHRoZSBwbGF0Zm9ybSBhbHJlYWR5IGRlY2lkZWQgYSBsaXZlIHNlc3Npb24gaXMgbm90IGVub3VnaFxuICogICAgYXV0aG9yaXR5OyBhIGNoYXQgcHJvcG9zYWwgaXMgc3RyaWN0bHkgbGVzcy4gVGhpcyBpcyB3aGF0IGtlZXBzXG4gKiAgICBgUFVUIC9vcmdhbml6YXRpb24vYWktY29uZmlnYCBvdXQgKGl0IHBlcnNpc3RzIHBlci1vcmcgcHJvdmlkZXIgU0VDUkVUUyksXG4gKiAgICBhbG9uZyB3aXRoIHRoZSBNRkEgLyBwYXNzd29yZCAvIGF1dGhlbnRpY2F0b3IgcG9saWNpZXMsXG4gKiAgICBgUFVUIC9wbHVnaW5zL2luc3RhbGwtcG9saWN5YCwgb3JnIHJlc3RvcmUgYW5kIHRyYW5zZmVyLW93bmVyLlxuICogIC0gKipOb3QgYSBzZWN1cml0eSBjb250cm9sLioqIE1GQSAvIHBhc3N3b3JkIC8gYXV0aGVudGljYXRvciAvIGltcGVyc29uYXRpb25cbiAqICAgIHBvbGljeSwgU1NPK1NBTUwgYW5kIGl0cyBncm91cCBtYXBwaW5ncywgdmVyaWZpZWQgZG9tYWlucyBhbmQgZG9tYWluLWJhc2VkXG4gKiAgICBqb2luLCBqb2luLXJlcXVlc3QgZGVjaXNpb25zLCB0cmFuc2Zlci1vd25lciBhbmQgdGVhbSBsaWZlY3ljbGUgYXJlIEFCU0VOVFxuICogICAgaGVyZSByYXRoZXIgdGhhbiBnYXRlZCB3aXRoaW4g4oCUIFwicmVsYXggdGhlIE1GQSBwb2xpY3lcIiBpcyBwcmVjaXNlbHkgd2hhdCBhblxuICogICAgaW5qZWN0aW9uIHBheWxvYWQgYXNrcyBmb3IsIGFuZCBpdCBhcnJpdmVzIHRocm91Z2ggdGV4dCB0aGUgYWdlbnQgYWxyZWFkeVxuICogICAgcmVhZHMuIEFic2VudCBjYW5ub3QgYmUgYXJndWVkIHdpdGg7IGdhdGVkIGNhbi5cbiAqICAtICoqQ2FycmllcyBubyBzZWNyZXQgYW5kIG5vIGNhbGxiYWNrIHRhcmdldC4qKiBBbiBBUEkgdGhhdCByZXR1cm5zXG4gKiAgICBgaGFzV2ViaG9va1NlY3JldGAgaW5zdGVhZCBvZiB0aGUgc2VjcmV0IGlzIHRlbGxpbmcgeW91IHRoZSBmaWVsZCBjYW5ub3QgYmVcbiAqICAgIGRpZmZlZCwgc28gaXQgY2Fubm90IGJlIHJldmlld2VkLCBzbyBpdCBjYW5ub3QgYmUgcHJvcG9zZWQuIFdlYmhvb2sgVVJMc1xuICogICAgYW5kIGVtYWlsIGFkZHJlc3NlcyBhcmUgb3V0IGZvciB0aGUgc2FtZSByZWFzb24gcGx1cyBvbmUgbW9yZTogdGhleSBhcmVcbiAqICAgIGV4ZmlsdHJhdGlvbiB0YXJnZXRzLCBhbmQgYSBjb25maXJtYXRpb24gbWFpbCB0byBhbiBhdHRhY2tlci1jaG9zZW4gYWRkcmVzc1xuICogICAgaXMgYSBzZW5kIHRoZSBwbGF0Zm9ybSBwZXJmb3JtcyBvbiB0aGUgbW9kZWwncyBzYXktc28uXG4gKiAgLSAqKlJldmlld2FibGUgYXMgYSBkaWZmLioqIEEgc2NhbGFyIHdpdGggYSBjbG9zZWQgc2hhcGUgKGJvb2xlYW4sIGJvdW5kZWRcbiAqICAgIGludGVnZXIsIHNtYWxsIGVudW0pLiBBIGxpc3Qgb2Ygb3BhcXVlIHVzZXIgaWRzIHJlbmRlcnMgYXMgaWRzIGluIGEgY2FyZFxuICogICAgbm9ib2R5IGNhbiBjaGVjaywgc28gcmVjaXBpZW50IExJU1RTIGFyZSBvdXQgZXZlbiB0aG91Z2ggY2FkZW5jZSBpcyBpbi5cbiAqXG4gKiBFYWNoIGVudHJ5IG5hbWVzIHRoZSBBUEkgdGhhdCBhcHBsaWVzIGl0LiBUaGUgYnJvd3NlciBhcHBsaWVzIGl0IHRocm91Z2ggdGhlXG4gKiBVU0VSJ3Mgb3duIHNlc3Npb24gYW5kIHRoZSB1c2VyJ3Mgb3duIHBlcm1pc3Npb25zIOKAlCB0aGUgYWdlbnQgbmV2ZXIgd3JpdGVzIOKAlFxuICogc28gYSBwcm9wb3NhbCBhIG1lbWJlciBtYXkgbm90IGNvbW1pdCBzaW1wbHkgNDAzcyBhdCB0aGUgcm91dGUsIGV4YWN0bHkgYXMgYVxuICogaGFuZC1tYWRlIHJlcXVlc3Qgd291bGQuXG4gKlxuICogUnVsZSAxMCBsaXZlcyBpbiB7QGxpbmsgcGlja0FsbG93ZWR9OiBhIGNhbmRpZGF0ZSBjYXJyeWluZyBhIGZpZWxkIG91dHNpZGVcbiAqIHRoaXMgbGlzdCBpcyB0aGUgaW5qZWN0aW9uIHNpZ25hbCwgc28gdGhlIHJlZnVzZWQgbmFtZXMgY29tZSBiYWNrIHRvIHRoZVxuICogY2FsbGVyIHRvIGJlIGNvdW50ZWQgYW5kIGxvZ2dlZCByYXRoZXIgdGhhbiBiZWluZyBxdWlldGx5IGRyb3BwZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNlY3VyaXR5RGlnZXN0TW9kZSB9IGZyb20gJy4vd2lyZS12b2NhYnVsYXJ5LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFByb3ZlbmFuY2UgKHJ1bGUgNilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBUaGUgYHByb3Bvc2VkQnlgIHZhbHVlIGV2ZXJ5IGFnZW50LWRyYWZ0ZWQgY29tbWl0IHJlY29yZHMuICovXG5leHBvcnQgY29uc3QgQVNLX0FHRU5UX1BST1BPU0VSID0gJ2Fzay1hZ2VudCc7XG5cbi8qKiBUaGUgYXVkaXQgYGRldGFpbHNgIGtleSB0aGF0IGNhcnJpZXMgcHJvdmVuYW5jZS4gKi9cbmV4cG9ydCBjb25zdCBQUk9QT1NFRF9CWV9ERVRBSUxfS0VZID0gJ3Byb3Bvc2VkQnknO1xuXG4vKiogVGhlIHByb3ZlbmFuY2UgZnJhZ21lbnQgbWVyZ2VkIGludG8gYSBgUmVtb3RlQXVkaXRFdmVudC5kZXRhaWxzYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNrUHJvcG9zYWxQcm92ZW5hbmNlIHtcbiAgcmVhZG9ubHkgcHJvcG9zZWRCeTogdHlwZW9mIEFTS19BR0VOVF9QUk9QT1NFUjtcbn1cblxuLyoqXG4gKiBNZXJnZSBhZ2VudCBwcm92ZW5hbmNlIGludG8gYW4gYXVkaXQgZXZlbnQncyBmcmVlLWZvcm0gYGRldGFpbHNgLlxuICogUHJvdmVuYW5jZSBpcyBhcHBsaWVkIExBU1Qgc28gYSBjYWxsZXItc3VwcGxpZWQgYHByb3Bvc2VkQnlgIGNhbm5vdCBvdmVyd3JpdGVcbiAqIGl0IOKAlCB0aGUgcG9pbnQgb2YgdGhlIGZpZWxkIGlzIHRoYXQgaXQgaXMgbm90IG5lZ290aWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc2tQcm9wb3NhbEF1ZGl0RGV0YWlscyhcbiAgZGV0YWlscz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgQXNrUHJvcG9zYWxQcm92ZW5hbmNlIHtcbiAgcmV0dXJuIHsgLi4uZGV0YWlscywgcHJvcG9zZWRCeTogQVNLX0FHRU5UX1BST1BPU0VSIH07XG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgSEVBREVSIGEgcHJvcG9zYWwgY29tbWl0IHN0YW1wcywgYW5kIHRoZSBvbmx5IGNoYW5uZWwgcHJvdmVuYW5jZVxuICogdHJhdmVscyBvbi5cbiAqXG4gKiBBIEhFQURFUiByYXRoZXIgdGhhbiBhIGJvZHkgZmllbGQsIGZvciB0aHJlZSByZWFzb25zOlxuICpcbiAqICAtICoqSXQgY2Fubm90IGNvbGxpZGUuKiogYHByb3Bvc2VkQnlgIGluIGEgYm9keSB3b3VsZCBiZSBhIG5ldyBrZXkgaW4gc2l4XG4gKiAgICBkaWZmZXJlbnQgZG9tYWluIHNjaGVtYXMg4oCUIGBQaXBlbGluZVVwZGF0ZVNjaGVtYWAsIHRoZSBwbHVnaW4vdGVtcGxhdGVcbiAqICAgIHVwZGF0ZSBzY2hlbWFzLCB0aHJlZSBub3RpZmljYXRpb24vc2V0dGluZ3Mgc2NoZW1hcyDigJQgdHdvIG9mIHdoaWNoIGFyZVxuICogICAgYC5zdHJpY3QoKWAgYW5kIHRoZSByZXN0IG9mIHdoaWNoIGZlZWQgYE9iamVjdC5rZXlzKGJvZHkpYCBzdHJhaWdodCBpbnRvXG4gKiAgICB0aGUgdXBkYXRlJ3MgY29sdW1uIGxpc3QgYW5kIHRoZSBhdWRpdCdzIGBmaWVsZHNgLiBBIGZpZWxkIG5hbWVkIGFmdGVyIGFuXG4gKiAgICBhdWRpdCBrZXkgd291bGQgdGhlbiBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgcmVhbCBvbmUsIGFuZCB0aGUgZGF5IGFcbiAqICAgIGRvbWFpbiBncm93cyBpdHMgb3duIGBwcm9wb3NlZEJ5YCB0aGUgdHdvIG1lYW5pbmdzIG1lcmdlIHNpbGVudGx5LlxuICogIC0gKipJdCBpcyB0cmFuc3BvcnQgbWV0YWRhdGEsIGFuZCBzdGF5cyBvdXQgb2YgdGhlIHBheWxvYWQuKiogTm90aGluZ1xuICogICAgZG93bnN0cmVhbSBvZiBgdmFsaWRhdGVCb2R5YCBldmVyIHNlZXMgaXQsIHNvIGl0IGNhbm5vdCBiZSBwZXJzaXN0ZWQsIGNhbm5vdFxuICogICAgd2lkZW4gYSBkaWZmLCBhbmQgY2Fubm90IHJlYWNoIGEgc2VydmljZSB0aGF0IGZvcndhcmRzIHRoZSBib2R5IG9ud2FyZC5cbiAqICAtICoqVGhlIHBsYXRmb3JtIGFscmVhZHkgZG9lcyB0aGlzLioqIGBYLVN0ZXAtVXAtVG9rZW5gIGlzIHRoZSBzYW1lIHNoYXBlIG9mXG4gKiAgICB0aGluZyDigJQgYSBwZXItcmVxdWVzdCBhc3NlcnRpb24gYWJvdXQgSE9XIHRoZSBjYWxsIHdhcyBtYWRlIHJhdGhlciB0aGFuXG4gKiAgICBXSEFUIGl0IGNoYW5nZXMg4oCUIGFuZCByaWRlcyBhIGhlYWRlciBmb3IgdGhlIHNhbWUgcmVhc29ucy5cbiAqXG4gKiBMb3dlci1jYXNlIGJlY2F1c2UgdGhhdCBpcyBob3cgTm9kZSBub3JtYWxpc2VzIGluY29taW5nIGhlYWRlciBuYW1lczsgdGhlXG4gKiBicm93c2VyIHNlbmRzIGBYLVBCLVByb3Bvc2VkLUJ5YCwgd2hpY2ggYXJyaXZlcyBoZXJlLlxuICovXG5leHBvcnQgY29uc3QgQVNLX1BST1BPU0VEX0JZX0hFQURFUiA9ICd4LXBiLXByb3Bvc2VkLWJ5JztcblxuLyoqXG4gKiBXaGF0IGEgcmVxdWVzdCdzIHByb3ZlbmFuY2UgaGVhZGVyIGNsYWltcy5cbiAqXG4gKiBgZm9yZWlnbmAgaXMgYW55IHZhbHVlIHRoYXQgaXMgbm90IEVYQUNUTFkge0BsaW5rIEFTS19BR0VOVF9QUk9QT1NFUn0g4oCUIHRoZXJlXG4gKiBpcyBvbmUgbGVnaXRpbWF0ZSBwcm9wb3NlciBhbmQgbm8gZnJlZS1mb3JtIHRleHQsIHNvIGFueXRoaW5nIGVsc2UgaXMgYSBidWdcbiAqIG9yIGEgZm9yZ2VyeSBhbmQgaXMgbmFtZWQgYXMgc3VjaCByYXRoZXIgdGhhbiBmb2xkZWQgaW50byBgbm9uZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFByb3Bvc2VyQ2xhaW0gPSAnbm9uZScgfCAnYXNrLWFnZW50JyB8ICdmb3JlaWduJztcblxuLyoqXG4gKiBSZWFkIHRoZSBwcm92ZW5hbmNlIGNsYWltIG9mZiBhIHJlcXVlc3QncyBoZWFkZXIgYmFnLlxuICpcbiAqIERlbGliZXJhdGVseSBleGFjdDogbm8gdHJpbW1pbmcsIG5vIGNhc2UgZm9sZGluZywgbm8gcHJlZml4IG1hdGNoaW5nLiBUaGVcbiAqIG9ubHkgc2VuZGVyIGlzIHRoZSBicm93c2VyJ3MgY29uZmlybSBwYXRoLCB3aGljaCBzdGFtcHMgdGhlIHNoYXJlZCBjb25zdGFudCxcbiAqIHNvIGV2ZXJ5IG90aGVyIHZhbHVlIGlzIHJlZnVzZWQgcmF0aGVyIHRoYW4gcmVwYWlyZWQuIFRoaXMgaXMgd2hhdCBrZWVwcyBhXG4gKiBjbGllbnQgZnJvbSB3cml0aW5nIGFyYml0cmFyeSBhdWRpdCBgZGV0YWlsc2Ag4oCUIHRoZSBoZWFkZXIncyB3aG9sZSB2b2NhYnVsYXJ5XG4gKiBpcyBvbmUgd29yZCwgYW5kIHRoZSB3b3JkIGlzIG5vdCB0aGUgY2xpZW50J3MgdG8gY2hvb3NlLlxuICpcbiAqIFRha2VzIHRoZSBoZWFkZXIgQkFHIChgcmVxLmhlYWRlcnNgKSByYXRoZXIgdGhhbiBhIHJlcXVlc3QsIHNvIHRoaXMgbW9kdWxlXG4gKiBrZWVwcyBpdHMgemVybyBydW50aW1lIGltcG9ydHMgYW5kIHRoZSBicm93c2VyIGNhbiBzdGlsbCBpbXBvcnQgdGhlIGNvbnN0YW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFByb3Bvc2VyQ2xhaW0oaGVhZGVyczogdW5rbm93bik6IFByb3Bvc2VyQ2xhaW0ge1xuICBjb25zdCBiYWcgPSBoZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3ID0gYmFnICYmIHR5cGVvZiBiYWcgPT09ICdvYmplY3QnID8gYmFnW0FTS19QUk9QT1NFRF9CWV9IRUFERVJdIDogdW5kZWZpbmVkO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gJ25vbmUnO1xuICByZXR1cm4gdmFsdWUgPT09IEFTS19BR0VOVF9QUk9QT1NFUiA/ICdhc2stYWdlbnQnIDogJ2ZvcmVpZ24nO1xufVxuXG4vKipcbiAqIFRoZSBhdWRpdCBgZGV0YWlsc2AgZm9yIGEgd3JpdGUsIHdpdGggcHJvdmVuYW5jZSBmb2xkZWQgaW4gd2hlbiDigJQgYW5kIE9OTFlcbiAqIHdoZW4g4oCUIHRoZSByZXF1ZXN0IGNhcnJpZXMgdGhlIGFnZW50IG1hcmtlci5cbiAqXG4gKiBgZGV0YWlsc2AgaXMgd2hhdCB0aGUgSEFORExFUiBidWlsdCBhbmQgc3RheXMgYXV0aG9yaXRhdGl2ZS4gUHJvdmVuYW5jZSBpc1xuICogYWRkaXRpdmU6IHRoZSBPTkxZIGtleSBpdCBjYW4gZXZlciB3cml0ZSBpcyBgcHJvcG9zZWRCeWAsIHNvIGV2ZXJ5IGZpZWxkIHRoZVxuICogaGFuZGxlciBzZXQgc3Vydml2ZXMgdW50b3VjaGVkLCBhbmQge0BsaW5rIGFza1Byb3Bvc2FsQXVkaXREZXRhaWxzfSBhcHBsaWVzXG4gKiB0aGF0IG9uZSBrZXkgTEFTVCBzbyBhIGBwcm9wb3NlZEJ5YCBhcnJpdmluZyBmcm9tIGFueXdoZXJlIGVsc2UgY2Fubm90IHNwZWFrXG4gKiBpbiBpdHMgcGxhY2UuIEEgcmVxdWVzdCBjYXJyeWluZyBubyBtYXJrZXIsIG9yIGEgYGZvcmVpZ25gIG9uZSwgZ2V0cyB0aGVcbiAqIGhhbmRsZXIncyBkZXRhaWxzIHVuY2hhbmdlZCDigJQgYW4gb3JkaW5hcnkgZWRpdCByZWNvcmRzIG5vIGBwcm9wb3NlZEJ5YCBhdFxuICogYWxsLCB3aGljaCBpcyB0aGUgZGlzdGluY3Rpb24gdGhlIGZpZWxkIGV4aXN0cyB0byBtYWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFByb3Bvc2FsUHJvdmVuYW5jZShcbiAgaGVhZGVyczogdW5rbm93bixcbiAgZGV0YWlscz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHJlYWRQcm9wb3NlckNsYWltKGhlYWRlcnMpID09PSAnYXNrLWFnZW50J1xuICAgID8gYXNrUHJvcG9zYWxBdWRpdERldGFpbHMoZGV0YWlscylcbiAgICA6IHsgLi4uZGV0YWlscyB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIGFsbG93bGlzdFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgdmFsdWUgYW4gYWxsb3dsaXN0ZWQgb3JnIHNldHRpbmcgY2FuIGhvbGQuICovXG5leHBvcnQgdHlwZSBPcmdTZXR0aW5nVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vKiogV2hpY2ggcGVyLW9yZyByZWNvcmQgKGFuZCB0aGVyZWZvcmUgd2hpY2ggQVBJKSBhIGZpZWxkIGJlbG9uZ3MgdG8uICovXG5leHBvcnQgdHlwZSBPcmdTZXR0aW5nU3VyZmFjZSA9XG4gIHwgJ3JlcG9ydGluZydcbiAgfCAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMnXG4gIHwgJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucyc7XG5cbi8qKlxuICogRXZlcnkgcHJvcG9zYWJsZSBzZXR0aW5nLCBhcyBgPHN1cmZhY2U+LjxmaWVsZD5gLiBXcml0aW5nIHRoZSB1bmlvbiBvdXQgYnlcbiAqIGhhbmQgKHJhdGhlciB0aGFuIGluZmVycmluZyBpdCBmcm9tIHRoZSBhcnJheSkgaXMgZGVsaWJlcmF0ZTogdGhlIGtleSBzcGFjZVxuICogaXMgdGhlIGNvbnRyYWN0IHRoZSB0b29sIHNjaGVtYSBhbmQgdGhlIGNvbmZpcm0gaGFuZGxlciBzaGFyZSwgc28gaXQgaXNcbiAqIHN0YXRlZCBvbmNlLCBleHBsaWNpdGx5LCBhbmQgYSB0eXBvIGluIGFuIGVudHJ5IGJlbG93IGlzIGEgY29tcGlsZSBlcnJvci5cbiAqL1xuZXhwb3J0IHR5cGUgT3JnU2V0dGluZ0tleSA9XG4gIHwgJ3JlcG9ydGluZy5pbmNpZGVudFdpbmRvd0hvdXJzJ1xuICB8ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucy5ub3RpZnlPbkJsb2NrJ1xuICB8ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucy5ub3RpZnlPbldhcm5pbmcnXG4gIHwgJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLmVtYWlsRW5hYmxlZCdcbiAgfCAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMuZGlnZXN0TW9kZSdcbiAgfCAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLm5vdGlmeVJlc2NhbidcbiAgfCAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLmRpZ2VzdE1vZGUnO1xuXG4vKiogVGhlIGNsb3NlZCBzaGFwZSBhIHByb3Bvc2VkIHZhbHVlIG11c3QgbWF0Y2ggYmVmb3JlIGl0IGlzIGFjY2VwdGVkLiAqL1xuZXhwb3J0IHR5cGUgT3JnU2V0dGluZ1NoYXBlID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdib29sZWFuJyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnaW50ZWdlcic7IHJlYWRvbmx5IG1pbjogbnVtYmVyOyByZWFkb25seSBtYXg6IG51bWJlciB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZW51bSc7IHJlYWRvbmx5IHZhbHVlczogcmVhZG9ubHkgc3RyaW5nW10gfTtcblxuLyoqIE9uZSBwcm9wb3NhYmxlIG9yZyBzZXR0aW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdTZXR0aW5nU3BlYyB7XG4gIC8qKiBTdGFibGUgcHJvcG9zYWwga2V5IOKAlCBgPHN1cmZhY2U+LjxmaWVsZD5gLiBUaGlzIGlzIHdoYXQgdGhlIG1vZGVsIG5hbWVzLiAqL1xuICByZWFkb25seSBrZXk6IE9yZ1NldHRpbmdLZXk7XG4gIHJlYWRvbmx5IHN1cmZhY2U6IE9yZ1NldHRpbmdTdXJmYWNlO1xuICAvKiogVGhlIHJlcXVlc3QtYm9keSBmaWVsZCBuYW1lIHRoZSBBUEkgZXhwZWN0cy4gKi9cbiAgcmVhZG9ubHkgZmllbGQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hhcGU6IE9yZ1NldHRpbmdTaGFwZTtcbiAgLyoqIFRoZSByb3V0ZSB0aGF0IGFwcGxpZXMgaXQsIGNhbGxlZCBieSB0aGUgQlJPV1NFUiB3aXRoIHRoZSB1c2VyJ3Mgc2Vzc2lvbi4gKi9cbiAgcmVhZG9ubHkgYXBpOiB7IHJlYWRvbmx5IG1ldGhvZDogJ1BVVCc7IHJlYWRvbmx5IHBhdGg6IHN0cmluZyB9O1xuICAvKiogVGhlIHBlcm1pc3Npb24gdGhhdCByb3V0ZSByZXF1aXJlcyBvZiB0aGUgY2FsbGVyLiAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uO1xuICAvKiogU2hvcnQgaHVtYW4gbGFiZWwgZm9yIHRoZSBjb25maXJtIGNhcmQuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBXSFkgdGhpcyBmaWVsZCBpcyBzYWZlIHRvIHByb3Bvc2UuIEV2ZXJ5IGVudHJ5IHN0YXRlcyBpdHMgb3duIGNhc2UuICovXG4gIHJlYWRvbmx5IHdoeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBgZGlnZXN0TW9kZWAgdm9jYWJ1bGFyeSBpcyBNSVJST1JFRCwgbm90IGltcG9ydGVkOiB0aGlzIG1vZHVsZSBrZWVwcyB6ZXJvXG4gKiBydW50aW1lIGltcG9ydHMgc28gdGhlIGJyb3dzZXIgZW50cnkgc3RheXMgc3RhbmRhbG9uZS4gVGhlIHR5cGUgYW5ub3RhdGlvblxuICogbWFrZXMgYSBSRU1PVkVEIG1vZGUgYSBjb21waWxlIGVycm9yIGhlcmUsIGFuZCBgYXNrLXByb3Bvc2Fscy50ZXN0LnRzYCBhc3NlcnRzXG4gKiB0aGUgbGlzdCBhZ2FpbnN0IGBQTFVHSU5fU0VDVVJJVFlfRElHRVNUX01PREVTYCBzbyBhbiBBRERFRCBvbmUgY2Fubm90IGRyaWZ0XG4gKiBlaXRoZXIuXG4gKi9cbmNvbnN0IERJR0VTVF9NT0RFUzogcmVhZG9ubHkgUGx1Z2luU2VjdXJpdHlEaWdlc3RNb2RlW10gPSBbJ2ltbWVkaWF0ZScsICdkYWlseScsICd3ZWVrbHknXTtcblxuLyoqXG4gKiBUaGUgYWxsb3dsaXN0LiBBZGRpbmcgYW4gZW50cnkgaXMgYSBkZWxpYmVyYXRlIGFjdDogbmFtZSB0aGUgcm91dGUgeW91XG4gKiBjaGVja2VkLCBjb25maXJtIGl0IGNhcnJpZXMgbm8gYHJlcXVpcmVTdGVwVXBgLCBhbmQgd3JpdGUgdGhlIGB3aHlgLlxuICovXG5leHBvcnQgY29uc3QgT1JHX1NFVFRJTkdfUFJPUE9TQUxfQUxMT1dMSVNUOiByZWFkb25seSBPcmdTZXR0aW5nU3BlY1tdID0gW1xuICB7XG4gICAga2V5OiAncmVwb3J0aW5nLmluY2lkZW50V2luZG93SG91cnMnLFxuICAgIHN1cmZhY2U6ICdyZXBvcnRpbmcnLFxuICAgIGZpZWxkOiAnaW5jaWRlbnRXaW5kb3dIb3VycycsXG4gICAgc2hhcGU6IHsga2luZDogJ2ludGVnZXInLCBtaW46IDEsIG1heDogNzIwIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvcmVwb3J0cy9zZXR0aW5ncy9pbmNpZGVudHMnIH0sXG4gICAgcGVybWlzc2lvbjogJ29yZzpzZXR0aW5ncycsXG4gICAgbGFiZWw6ICdJbmNpZGVudCBjb3JyZWxhdGlvbiB3aW5kb3cgKGhvdXJzKScsXG4gICAgd2h5OlxuICAgICAgJ0FuYWx5dGljcyB0dW5pbmcgb25seTogaXQgZGVjaWRlcyBob3cgbG9uZyBhZnRlciBhIGRlcGxveSBhbiBpbmNpZGVudCBpcyAnXG4gICAgICArICdhdHRyaWJ1dGVkIHRvIHRoYXQgZGVwbG95IHdoZW4gRE9SQSBtZXRyaWNzIGFyZSBjb21wdXRlZC4gSXQgZ3JhbnRzIG5vdGhpbmcsICdcbiAgICAgICsgJ3JldmVhbHMgbm90aGluZyBhbmQgcmVhY2hlcyBubyBvbmUg4oCUIHRoZSB3b3JzdCBvdXRjb21lIG9mIGEgd3JvbmcgdmFsdWUgaXMgYSAnXG4gICAgICArICdtaXNsZWFkaW5nIGNoYW5nZS1mYWlsdXJlIHJhdGUsIHdoaWNoIHRoZSBuZXh0IGVkaXQgY29ycmVjdHMuIFRoZSByb3V0ZSAnXG4gICAgICArICdyZWplY3RzIHRoZSBzaWJsaW5nIHJldGVudGlvbiBmaWVsZHMgb3V0cmlnaHQgKHRoZXkgYXJlIGJpbGxpbmctb3duZWQpLCBzbyAnXG4gICAgICArICd0aGlzIGlzIHRoZSB3aG9sZSB3cml0YWJsZSBzdXJmYWNlLiBCb3VuZGVkIGludGVnZXIsIHNvIHRoZSBkaWZmIGlzIG9uZSBudW1iZXIuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLm5vdGlmeU9uQmxvY2snLFxuICAgIHN1cmZhY2U6ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucycsXG4gICAgZmllbGQ6ICdub3RpZnlPbkJsb2NrJyxcbiAgICBzaGFwZTogeyBraW5kOiAnYm9vbGVhbicgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9jb21wbGlhbmNlL25vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcycgfSxcbiAgICBwZXJtaXNzaW9uOiAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgbGFiZWw6ICdOb3RpZnkgd2hlbiBjb21wbGlhbmNlIGJsb2NrcyBhbiBhY3Rpb24nLFxuICAgIHdoeTpcbiAgICAgICdBIGRlbGl2ZXJ5IHByZWZlcmVuY2UsIG5vdCBhbiBlbmZvcmNlbWVudCBjb250cm9sOiB0aGUgYmxvY2sgaGFwcGVucyBlaXRoZXIgJ1xuICAgICAgKyAnd2F5IGFuZCB0aGUgcG9saWN5IHRoYXQgY2F1c2VkIGl0IGlzIHVuY2hhbmdlZC4gVHVybmluZyBpdCBvZmYgbWFrZXMgdGhlIG9yZyAnXG4gICAgICArICdxdWlldGVyLCBuZXZlciBtb3JlIHBlcm1pc3NpdmUuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLm5vdGlmeU9uV2FybmluZycsXG4gICAgc3VyZmFjZTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ25vdGlmeU9uV2FybmluZycsXG4gICAgc2hhcGU6IHsga2luZDogJ2Jvb2xlYW4nIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvY29tcGxpYW5jZS9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMnIH0sXG4gICAgcGVybWlzc2lvbjogJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgIGxhYmVsOiAnTm90aWZ5IG9uIGNvbXBsaWFuY2Ugd2FybmluZ3MnLFxuICAgIHdoeTogJ0FzIG5vdGlmeU9uQmxvY2sg4oCUIHdoaWNoIG5vbi1ibG9ja2luZyBmaW5kaW5ncyBhcmUgYW5ub3VuY2VkLCBub3Qgd2hhdCBpcyBlbmZvcmNlZC4nLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMuZW1haWxFbmFibGVkJyxcbiAgICBzdXJmYWNlOiAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMnLFxuICAgIGZpZWxkOiAnZW1haWxFbmFibGVkJyxcbiAgICBzaGFwZTogeyBraW5kOiAnYm9vbGVhbicgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9jb21wbGlhbmNlL25vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcycgfSxcbiAgICBwZXJtaXNzaW9uOiAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgbGFiZWw6ICdTZW5kIGNvbXBsaWFuY2Ugbm90aWNlcyBieSBlbWFpbCcsXG4gICAgd2h5OlxuICAgICAgJ0Nob29zZXMgd2hldGhlciB0aGUgZXhpc3Rpbmcgbm90aWNlcyBnbyBvdXQgYnkgZW1haWwuIEl0IGRvZXMgbm90IG5hbWUgYSAnXG4gICAgICArICdyZWNpcGllbnQg4oCUIHRoZSBhZGRyZXNzIGxpc3QgaXMgcmVzb2x2ZWQgZnJvbSBvcmcgbWVtYmVyc2hpcCBhdCBzZW5kIHRpbWUg4oCUICdcbiAgICAgICsgJ3NvIGEgZmxpcHBlZCBib29sZWFuIGNhbiBuZXZlciByb3V0ZSBtYWlsIHNvbWV3aGVyZSBuZXcuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLmRpZ2VzdE1vZGUnLFxuICAgIHN1cmZhY2U6ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucycsXG4gICAgZmllbGQ6ICdkaWdlc3RNb2RlJyxcbiAgICBzaGFwZTogeyBraW5kOiAnZW51bScsIHZhbHVlczogRElHRVNUX01PREVTIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvY29tcGxpYW5jZS9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMnIH0sXG4gICAgcGVybWlzc2lvbjogJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgIGxhYmVsOiAnQ29tcGxpYW5jZSBub3RpY2UgY2FkZW5jZScsXG4gICAgd2h5OiAnQ2FkZW5jZSBvZiBhbiBleGlzdGluZyBub3RpY2UgdG8gZXhpc3RpbmcgcmVjaXBpZW50cy4gQ2xvc2VkIGVudW0sIHNvIHRoZSBkaWZmIGlzIG9uZSB3b3JkLicsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdwbHVnaW5TZWN1cml0eU5vdGlmaWNhdGlvbnMubm90aWZ5UmVzY2FuJyxcbiAgICBzdXJmYWNlOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ25vdGlmeVJlc2NhbicsXG4gICAgc2hhcGU6IHsga2luZDogJ2Jvb2xlYW4nIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvcGx1Z2lucy9zZWN1cml0eS1ub3RpZmljYXRpb25zJyB9LFxuICAgIHBlcm1pc3Npb246ICdvcmc6c2V0dGluZ3MnLFxuICAgIGxhYmVsOiAnTm90aWZ5IG9uIG5pZ2h0bHkgcmVzY2FuIGZpbmRpbmdzJyxcbiAgICB3aHk6XG4gICAgICAnR292ZXJucyB0aGUgTjMxIHJlc2NhbiBub3RpY2Ugb25seS4gVGhlIHNjYW4gR0FURVMgYXJlIHVudG91Y2hlZDogYSBidWlsZCB0aGF0ICdcbiAgICAgICsgJ3RyaXBzIFBMVUdJTl9WVUxOX0dBVEUgc3RpbGwgZmFpbHMgYW5kIHN0aWxsIHNlbmRzIE4zMCwgd2hpY2ggdGhpcyBmbGFnIGNhbm5vdCAnXG4gICAgICArICdzdXBwcmVzcy4gU28gaXQgY2hhbmdlcyBob3cgbm9pc3kgYW4gaW5mb3JtYXRpb25hbCBub3RpY2UgaXMsIG5vdCB3aGV0aGVyIGEgJ1xuICAgICAgKyAndnVsbmVyYWJsZSB2ZXJzaW9uIGNhbiBiZSBwdWJsaXNoZWQuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucy5kaWdlc3RNb2RlJyxcbiAgICBzdXJmYWNlOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ2RpZ2VzdE1vZGUnLFxuICAgIHNoYXBlOiB7IGtpbmQ6ICdlbnVtJywgdmFsdWVzOiBESUdFU1RfTU9ERVMgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9wbHVnaW5zL3NlY3VyaXR5LW5vdGlmaWNhdGlvbnMnIH0sXG4gICAgcGVybWlzc2lvbjogJ29yZzpzZXR0aW5ncycsXG4gICAgbGFiZWw6ICdQbHVnaW4gc2VjdXJpdHkgbm90aWNlIGNhZGVuY2UnLFxuICAgIHdoeTpcbiAgICAgICdDYWRlbmNlIG9mIHRoZSByZXNjYW4gbm90aWNlLiBOMzAgKFwidmVyc2lvbiBibG9ja2VkXCIpIGlzIGFsd2F5cyBpbW1lZGlhdGUgYW5kICdcbiAgICAgICsgJ2lnbm9yZXMgdGhpcyBmaWVsZCwgc28gdGhlIHVyZ2VudCBjaGFubmVsIGNhbm5vdCBiZSBzbG93ZWQgZG93bi4nLFxuICB9LFxuXTtcblxuLyoqXG4gKiBGaWVsZHMgREVMSUJFUkFURUxZIGV4Y2x1ZGVkLCB3aXRoIHRoZSByZWFzb24sIHNvIGEgZnV0dXJlIHJlYWRlciBkb2VzIG5vdFxuICogcmUtbGl0aWdhdGUgdGhlbSBhbmQgYSByZXZpZXdlciBjYW4gc2VlIHRoZXkgd2VyZSBjb25zaWRlcmVkIHJhdGhlciB0aGFuXG4gKiBtaXNzZWQuIFRoaXMgaXMgZG9jdW1lbnRhdGlvbiBvbmx5IOKAlCB7QGxpbmsgcGlja0FsbG93ZWR9IGNvbnN1bHRzIHRoZVxuICogYWxsb3dsaXN0IGFsb25lLCBhbmQgYSBmaWVsZCBhYnNlbnQgZnJvbSBCT1RIIGxpc3RzIGlzIHJlZnVzZWQgaWRlbnRpY2FsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfU0VUVElOR19QUk9QT1NBTF9FWENMVVNJT05TOiBSZWFkb25seUFycmF5PHsgcmVhZG9ubHkgZmllbGQ6IHN0cmluZzsgcmVhZG9ubHkgd2h5OiBzdHJpbmcgfT4gPSBbXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uYWlDb25maWcnLCB3aHk6ICdTdGVwLXVwIGdhdGVkIChQVVQgL29yZ2FuaXphdGlvbi9haS1jb25maWcpIGFuZCBwZXJzaXN0cyBwZXItb3JnIHByb3ZpZGVyIHNlY3JldHMuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLm1mYVBvbGljeScsIHdoeTogJ1NlY3VyaXR5IGNvbnRyb2wgKyBzdGVwLXVwLiBMb29zZW5pbmcgaXQgcmVtb3ZlcyBhIGNvbnRyb2wgZm9yIGV2ZXJ5IG1lbWJlci4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24ucGFzc3dvcmRQb2xpY3knLCB3aHk6ICdTZWN1cml0eSBjb250cm9sICsgc3RlcC11cC4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uYXV0aGVudGljYXRvclBvbGljeScsIHdoeTogJ1NlY3VyaXR5IGNvbnRyb2wgKyBzdGVwLXVwLicgfSxcbiAgeyBmaWVsZDogJ29yZ2FuaXphdGlvbi5pbXBlcnNvbmF0aW9uUG9saWN5Jywgd2h5OiAnU2VjdXJpdHkgY29udHJvbCArIHN0ZXAtdXA7IGRlY2lkZXMgd2hvIG91dHNpZGUgdGhlIG9yZyBtYXkgdmlldyBpdHMgZGF0YS4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uaWRwJywgd2h5OiAnU1NPL1NBTUwgY29uZmlnOiBzZWN1cml0eSBjb250cm9sIG9uIGl0cyBvd24gY2FwYWJpbGl0eSAob3JnOmlkcCksIGFzc3VyYW5jZSArIHN0cm9uZyBzdGVwLXVwLicgfSxcbiAgeyBmaWVsZDogJ29yZ2FuaXphdGlvbi5rbXNDb25maWcnLCB3aHk6ICdLZXkgbWF0ZXJpYWwuIE93biBjYXBhYmlsaXR5IChvcmc6a21zKSwgYXNzdXJhbmNlICsgc3Ryb25nIHN0ZXAtdXAuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLmlkZW50aXR5Jywgd2h5OiAnT3JnIG5hbWUvc2x1Zzogbm8gc3RlcC11cCwgYnV0IHJlbmFtaW5nIGFuIG9yZyBpcyBhbiBpbXBlcnNvbmF0aW9uIHByaW1pdGl2ZSBhbmQgdGhlIHNsdWcgaXMgYWRkcmVzc2FibGUuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLmRvbWFpbnMnLCB3aHk6ICdWZXJpZmllZCBkb21haW5zIGRyaXZlIGRvbWFpbi1iYXNlZCBqb2luIOKAlCB3aG8gbWF5IGJlY29tZSBhIG1lbWJlci4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uam9pblJlcXVlc3RzJywgd2h5OiAnTWVtYmVyc2hpcCBkZWNpc2lvbnMgYXJlIGFuIGF1dGhvcml0eSBncmFudCwgbm90IGEgc2V0dGluZy4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24udHJhbnNmZXJPd25lcicsIHdoeTogJ093bmVyc2hpcCB0cmFuc2Zlcjogc2VjdXJpdHkgY29udHJvbCwgTUZBLWdyYWRlICsgc3RlcC11cC4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24udGVhbXMnLCB3aHk6ICdUZWFtIGxpZmVjeWNsZSAoY3JlYXRlL2RlbGV0ZS9tb3ZlKSBpcyBzdHJ1Y3R1cmFsIGFuZCBzdGVwLXVwIGdhdGVkLicgfSxcbiAgeyBmaWVsZDogJ3BsdWdpbnMuaW5zdGFsbFBvbGljeScsIHdoeTogJ1N0ZXAtdXAgZ2F0ZWQgKFBVVCAvcGx1Z2lucy9pbnN0YWxsLXBvbGljeSkgYW5kIGRlY2lkZXMgd2hhdCBtYXkgYmUgaW5zdGFsbGVkLicgfSxcbiAgeyBmaWVsZDogJyoud2ViaG9va1VybCcsIHdoeTogJ0EgY2FsbGJhY2sgdGFyZ2V0OiBwcm9wb3Npbmcgb25lIHR1cm5zIHRoZSBwbGF0Zm9ybSBpbnRvIGFuIGV4ZmlsdHJhdGlvbiBjaGFubmVsLicgfSxcbiAgeyBmaWVsZDogJyoud2ViaG9va1NlY3JldCcsIHdoeTogJ0JlYXJlci1lcXVpdmFsZW50LiBUaGUgQVBJIHJldHVybnMgaGFzV2ViaG9va1NlY3JldCwgbmV2ZXIgdGhlIHZhbHVlLCBzbyBpdCBjYW5ub3QgYmUgZGlmZmVkLicgfSxcbiAgeyBmaWVsZDogJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucy5leHRlcm5hbEVtYWlsJywgd2h5OiAnQW4gYWRkcmVzcyB0aGUgcGxhdGZvcm0gdGhlbiBtYWlscyBhIGNvbmZpcm1hdGlvbiBsaW5rIHRvLiBOZXZlciBtb2RlbC1jaG9zZW4uJyB9LFxuICB7IGZpZWxkOiAnKi50YXJnZXRVc2VycycsIHdoeTogJ0EgbGlzdCBvZiBvcGFxdWUgdXNlciBpZHMgaXMgbm90IHJldmlld2FibGUgaW4gYSBjYXJkLCBhbmQgcmVkaXJlY3RpbmcgcmVjaXBpZW50cyBjYW4gc2lsZW5jZSBhIGNoYW5uZWwuJyB9LFxuICB7IGZpZWxkOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLnJlY2lwaWVudE1vZGUnLCB3aHk6ICdQYWlycyB3aXRoIHRhcmdldFVzZXJzOyBzd2l0Y2hpbmcgdG8gXCJ1c2Vyc1wiIG1ha2VzIGFuIHVucmV2aWV3YWJsZSBsaXN0IGF1dGhvcml0YXRpdmUuJyB9LFxuICB7IGZpZWxkOiAncmVwb3J0aW5nLmV2ZW50UmV0ZW50aW9uRGF5cycsIHdoeTogJ0JpbGxpbmctb3duZWQgKHRpZXIgKyBwdXJjaGFzZWQgcGFja3MpLiBUaGUgcm91dGUgYWxyZWFkeSByZWplY3RzIGl0OyBhZG1pdHRpbmcgaXQgd291bGQgYmUgYW4gZW50aXRsZW1lbnQgYnlwYXNzLicgfSxcbiAgeyBmaWVsZDogJ3JlcG9ydGluZy5kb3JhUmV0ZW50aW9uRGF5cycsIHdoeTogJ0JpbGxpbmctb3duZWQsIGFzIGFib3ZlLicgfSxcbl07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb29rdXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IEJZX0tFWTogUmVhZG9ubHlNYXA8c3RyaW5nLCBPcmdTZXR0aW5nU3BlYz4gPVxuICBuZXcgTWFwKE9SR19TRVRUSU5HX1BST1BPU0FMX0FMTE9XTElTVC5tYXAoKHNwZWMpID0+IFtzcGVjLmtleSwgc3BlY10pKTtcblxuLyoqIEV2ZXJ5IHByb3Bvc2FibGUga2V5IOKAlCB0aGUgZW51bSBhIHByb3Bvc2UgdG9vbCdzIGlucHV0IHNjaGVtYSBpcyBidWlsdCBmcm9tLiAqL1xuZXhwb3J0IGNvbnN0IE9SR19TRVRUSU5HX1BST1BPU0FMX0tFWVM6IHJlYWRvbmx5IE9yZ1NldHRpbmdLZXlbXSA9XG4gIE9SR19TRVRUSU5HX1BST1BPU0FMX0FMTE9XTElTVC5tYXAoKHNwZWMpID0+IHNwZWMua2V5KTtcblxuLyoqIElzIGBrZXlgIG9uIHRoZSBhbGxvd2xpc3Q/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wb3NhYmxlT3JnU2V0dGluZyhrZXk6IHN0cmluZyk6IGtleSBpcyBPcmdTZXR0aW5nS2V5IHtcbiAgcmV0dXJuIEJZX0tFWS5oYXMoa2V5KTtcbn1cblxuLyoqIFRoZSBzcGVjIGZvciBga2V5YCwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaXMgbm90IHByb3Bvc2FibGUuICovXG5leHBvcnQgZnVuY3Rpb24gb3JnU2V0dGluZ1NwZWMoa2V5OiBzdHJpbmcpOiBPcmdTZXR0aW5nU3BlYyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBCWV9LRVkuZ2V0KGtleSk7XG59XG5cbi8qKiBEb2VzIGB2YWx1ZWAgbWF0Y2ggdGhlIHNoYXBlIHRoZSBmaWVsZCBkZWNsYXJlcz8gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT3JnU2V0dGluZ1ZhbHVlKHNwZWM6IE9yZ1NldHRpbmdTcGVjLCB2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE9yZ1NldHRpbmdWYWx1ZSB7XG4gIGNvbnN0IHNoYXBlID0gc3BlYy5zaGFwZTtcbiAgaWYgKHNoYXBlLmtpbmQgPT09ICdib29sZWFuJykgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICBpZiAoc2hhcGUua2luZCA9PT0gJ2ludGVnZXInKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gc2hhcGUubWluICYmIHZhbHVlIDw9IHNoYXBlLm1heDtcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBzaGFwZS52YWx1ZXMuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gcGlja0FsbG93ZWQgKHJ1bGVzIDEsIDMgYW5kIDEwKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgcHJvcG9zYWwncyBzZXR0aW5ncywga2V5ZWQgYnkgYWxsb3dsaXN0IGtleS4gKi9cbmV4cG9ydCB0eXBlIE9yZ1NldHRpbmdQYXRjaCA9IFBhcnRpYWw8UmVjb3JkPE9yZ1NldHRpbmdLZXksIE9yZ1NldHRpbmdWYWx1ZT4+O1xuXG4vKiogV2hhdCB7QGxpbmsgcGlja0FsbG93ZWR9IGtlcHQsIGFuZCB3aGF0IGl0IHRocmV3IGF3YXkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tBbGxvd2VkUmVzdWx0IHtcbiAgLyoqIFRoZSBhbGxvd2xpc3RlZCwgc2hhcGUtdmFsaWQgc2V0dGluZ3MuICovXG4gIHJlYWRvbmx5IGFsbG93ZWQ6IE9yZ1NldHRpbmdQYXRjaDtcbiAgLyoqXG4gICAqIEZpZWxkIG5hbWVzIHRoZSBjYW5kaWRhdGUgY2FycmllZCB0aGF0IGFyZSBOT1Qgb24gdGhlIGFsbG93bGlzdC4gVEhJUyBpc1xuICAgKiB0aGUgaW5qZWN0aW9uIHNpZ25hbCAocnVsZSAxMCk6IGEgbGVnaXRpbWF0ZSBkcmFmdCBoYXMgbm9uZSwgc28gYSBub24tZW1wdHlcbiAgICogbGlzdCBpcyBhIGNvdW50ZXIgdG8gaW5jcmVtZW50IGFuZCBhIGxpbmUgdG8gbG9nLCBub3QgYSBzaWxlbnQgZHJvcC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZnVzZWQ6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQWxsb3dsaXN0ZWQga2V5cyB3aG9zZSB2YWx1ZSBkaWQgbm90IG1hdGNoIHRoZSBkZWNsYXJlZCBzaGFwZS4gRHJvcHBlZCB0b28sXG4gICAqIGJ1dCByZXBvcnRlZCBzZXBhcmF0ZWx5IOKAlCBhIGJhZCB2YWx1ZSBpcyBhIGRyYWZ0aW5nIG1pc3Rha2UsIG5vdCBhbiBhdHRlbXB0XG4gICAqIHRvIHJlYWNoIGEgZmllbGQgdGhlIGFnZW50IHdhcyBuZXZlciBnaXZlbi5cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWQ6IHJlYWRvbmx5IE9yZ1NldHRpbmdLZXlbXTtcbiAgLyoqIGByZWZ1c2VkLmxlbmd0aGAsIHNvIGEgY2FsbGVyIGNhbiBjb3VudCB3aXRob3V0IHJlLWRlcml2aW5nIGl0LiAqL1xuICByZWFkb25seSByZWZ1c2VkQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBLZWVwIG9ubHkgdGhlIGFsbG93bGlzdGVkLCBzaGFwZS12YWxpZCBmaWVsZHMgb2YgYSBjYW5kaWRhdGUgcHJvcG9zYWwsIGFuZFxuICogcmVwb3J0IGV2ZXJ5dGhpbmcgZHJvcHBlZC5cbiAqXG4gKiBUaGUgcmVzdWx0J3MgYGFsbG93ZWRgIG1hcCBJUyB0aGUgY29tbWl0IHBheWxvYWQgKHJ1bGUgMyk6IHRoZSBjb25maXJtXG4gKiBoYW5kbGVyIHNlbmRzIHRoZXNlIGZpZWxkcyBhbmQgb25seSB0aGVzZSwgc28gYW55dGhpbmcgdGhlIG1vZGVsIHNsaXBwZWQgaW5cbiAqIGlzIHN0cnVjdHVyYWxseSB1bmFwcGxpYWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgdW5yZW5kZXJlZC5cbiAqXG4gKiBgY2FuZGlkYXRlYCBpcyB1bnRydXN0ZWQgbW9kZWwgb3V0cHV0LCBzbyBpdCBpcyByZWFkIGRlZmVuc2l2ZWx5OiBhbnl0aGluZ1xuICogdGhhdCBpcyBub3QgYSBwbGFpbiBvYmplY3QgeWllbGRzIGFuIGVtcHR5IHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tBbGxvd2VkKGNhbmRpZGF0ZTogdW5rbm93bik6IFBpY2tBbGxvd2VkUmVzdWx0IHtcbiAgY29uc3QgYWxsb3dlZDogT3JnU2V0dGluZ1BhdGNoID0ge307XG4gIGNvbnN0IHJlZnVzZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGludmFsaWQ6IE9yZ1NldHRpbmdLZXlbXSA9IFtdO1xuXG4gIGlmIChjYW5kaWRhdGUgJiYgdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNhbmRpZGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IHNwZWMgPSBCWV9LRVkuZ2V0KGtleSk7XG4gICAgICBpZiAoIXNwZWMpIHsgcmVmdXNlZC5wdXNoKGtleSk7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoIWlzVmFsaWRPcmdTZXR0aW5nVmFsdWUoc3BlYywgdmFsdWUpKSB7IGludmFsaWQucHVzaChzcGVjLmtleSk7IGNvbnRpbnVlOyB9XG4gICAgICBhbGxvd2VkW3NwZWMua2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFsbG93ZWQsIHJlZnVzZWQsIGludmFsaWQsIHJlZnVzZWRDb3VudDogcmVmdXNlZC5sZW5ndGggfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpZmYgKyByZXF1ZXN0IHBsYW5uaW5nIChydWxlcyAzIGFuZCA3KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE9uZSByZXZpZXdlZCBjaGFuZ2U6IHdoYXQgdGhlIHNldHRpbmcgaXMgbm93LCBhbmQgd2hhdCBpdCB3b3VsZCBiZWNvbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yZ1NldHRpbmdDaGFuZ2Uge1xuICByZWFkb25seSBzcGVjOiBPcmdTZXR0aW5nU3BlYztcbiAgcmVhZG9ubHkgZnJvbTogT3JnU2V0dGluZ1ZhbHVlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSB0bzogT3JnU2V0dGluZ1ZhbHVlO1xufVxuXG4vKipcbiAqIFRoZSBjaGFuZ2VzIGEgcHJvcG9zYWwgYWN0dWFsbHkgbWFrZXMsIGdpdmVuIHRoZSBDVVJSRU5UIHZhbHVlcy4gQSBmaWVsZFxuICogd2hvc2UgcHJvcG9zZWQgdmFsdWUgYWxyZWFkeSBlcXVhbHMgdGhlIGN1cnJlbnQgb25lIGlzIGRyb3BwZWQg4oCUIGl0IGlzIG5vdCBhXG4gKiBjaGFuZ2UsIGFuZCByZW5kZXJpbmcgaXQgYXMgb25lIG1ha2VzIGEgZGlmZiB0aGUgdXNlciBjYW5ub3QgcmVhZC5cbiAqXG4gKiBUaGUgY29uZmlybSBoYW5kbGVyIHJlLXJ1bnMgdGhpcyBhZ2FpbnN0IGEgRlJFU0ggcmVhZCBpbW1lZGlhdGVseSBiZWZvcmVcbiAqIGNvbW1pdHRpbmcgKHJ1bGUgNyk6IHRoZXNlIHJlY29yZHMgY2Fycnkgbm8gdmVyc2lvbiBjb2x1bW4sIHNvIGlmIHRoZSBsaXN0XG4gKiB0aGF0IGNvbWVzIGJhY2sgZGlmZmVycyBmcm9tIHRoZSBvbmUgdGhlIHVzZXIgYXBwcm92ZWQsIHN0YXRlIG1vdmVkIHVuZGVyIHRoZVxuICogcHJvcG9zYWwgYW5kIHRoZSBjb21taXQgbXVzdCBiZSByZWZ1c2VkIHJhdGhlciB0aGFuIGFwcGxpZWQgYmxpbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmT3JnU2V0dGluZ3MoXG4gIGN1cnJlbnQ6IFJlYWRvbmx5PE9yZ1NldHRpbmdQYXRjaD4sXG4gIHByb3Bvc2VkOiBSZWFkb25seTxPcmdTZXR0aW5nUGF0Y2g+LFxuKTogcmVhZG9ubHkgT3JnU2V0dGluZ0NoYW5nZVtdIHtcbiAgY29uc3QgY2hhbmdlczogT3JnU2V0dGluZ0NoYW5nZVtdID0gW107XG4gIGZvciAoY29uc3Qgc3BlYyBvZiBPUkdfU0VUVElOR19QUk9QT1NBTF9BTExPV0xJU1QpIHtcbiAgICBjb25zdCB0byA9IHByb3Bvc2VkW3NwZWMua2V5XTtcbiAgICBpZiAodG8gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3QgZnJvbSA9IGN1cnJlbnRbc3BlYy5rZXldO1xuICAgIGlmIChmcm9tID09PSB0bykgY29udGludWU7XG4gICAgY2hhbmdlcy5wdXNoKHsgc3BlYywgZnJvbSwgdG8gfSk7XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbi8qKiBPbmUgQVBJIGNhbGwgdGhlIGNvbmZpcm0gaGFuZGxlciBtYWtlczogb25lIHN1cmZhY2UsIG9uZSBib2R5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdTZXR0aW5nUmVxdWVzdCB7XG4gIHJlYWRvbmx5IHN1cmZhY2U6IE9yZ1NldHRpbmdTdXJmYWNlO1xuICByZWFkb25seSBtZXRob2Q6ICdQVVQnO1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcm1pc3Npb246IFBlcm1pc3Npb247XG4gIC8qKiBSZXF1ZXN0IGJvZHk6IHRoZSBBUEkncyBvd24gZmllbGQgbmFtZXMsIGNhcnJ5aW5nIG9ubHkgcmV2aWV3ZWQgdmFsdWVzLiAqL1xuICByZWFkb25seSBib2R5OiBSZWNvcmQ8c3RyaW5nLCBPcmdTZXR0aW5nVmFsdWU+O1xufVxuXG4vKipcbiAqIEdyb3VwIGFwcHJvdmVkIGNoYW5nZXMgaW50byBvbmUgcmVxdWVzdCBwZXIgc3VyZmFjZSwgdHJhbnNsYXRpbmcgcHJvcG9zYWxcbiAqIGtleXMgYmFjayB0byB0aGUgZmllbGQgbmFtZXMgZWFjaCBBUEkgZXhwZWN0cy4gT3JkZXIgZm9sbG93cyB0aGUgYWxsb3dsaXN0LFxuICogc28gdGhlIHNhbWUgcHJvcG9zYWwgYWx3YXlzIHByb2R1Y2VzIHRoZSBzYW1lIGNhbGwgc2VxdWVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcmdTZXR0aW5nUmVxdWVzdHMoY2hhbmdlczogcmVhZG9ubHkgT3JnU2V0dGluZ0NoYW5nZVtdKTogcmVhZG9ubHkgT3JnU2V0dGluZ1JlcXVlc3RbXSB7XG4gIGNvbnN0IGJ5U3VyZmFjZSA9IG5ldyBNYXA8T3JnU2V0dGluZ1N1cmZhY2UsIE9yZ1NldHRpbmdSZXF1ZXN0PigpO1xuICBmb3IgKGNvbnN0IHNwZWMgb2YgT1JHX1NFVFRJTkdfUFJPUE9TQUxfQUxMT1dMSVNUKSB7XG4gICAgY29uc3QgY2hhbmdlID0gY2hhbmdlcy5maW5kKChjKSA9PiBjLnNwZWMua2V5ID09PSBzcGVjLmtleSk7XG4gICAgaWYgKCFjaGFuZ2UpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYnlTdXJmYWNlLmdldChzcGVjLnN1cmZhY2UpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcuYm9keVtzcGVjLmZpZWxkXSA9IGNoYW5nZS50bztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBieVN1cmZhY2Uuc2V0KHNwZWMuc3VyZmFjZSwge1xuICAgICAgc3VyZmFjZTogc3BlYy5zdXJmYWNlLFxuICAgICAgbWV0aG9kOiBzcGVjLmFwaS5tZXRob2QsXG4gICAgICBwYXRoOiBzcGVjLmFwaS5wYXRoLFxuICAgICAgcGVybWlzc2lvbjogc3BlYy5wZXJtaXNzaW9uLFxuICAgICAgYm9keTogeyBbc3BlYy5maWVsZF06IGNoYW5nZS50byB9LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBbLi4uYnlTdXJmYWNlLnZhbHVlcygpXTtcbn1cbiJdfQ==
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLXByb3Bvc2Fscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9hc2stcHJvcG9zYWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUF3RXRDLGdGQUFnRjtBQUNoRixzQkFBc0I7QUFDdEIsZ0ZBQWdGO0FBRWhGLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUM7QUFFOUMsdURBQXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFlBQVksQ0FBQztBQU9uRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxPQUEyQztJQUUzQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtCLENBQUM7QUFXekQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsT0FBZ0I7SUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBcUQsQ0FBQztJQUNsRSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JGLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2hELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDekUsT0FB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QUFJLENBQUMsR0FBRyxDQUFDLElBQUk7WUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgc2hhcmVkIGNvbnRyYWN0IGJldHdlZW4gdGhlIGFzayBhZ2VudCdzIFBST1BPU0UgdG9vbHMgYW5kIHRoZSBicm93c2VyJ3NcbiAqIENPTkZJUk0gaGFuZGxlcnMuIFR3byB0aGluZ3MgbGl2ZSBoZXJlLCBhbmQgdGhleSBsaXZlIGhlcmUgYmVjYXVzZSBCT1RIIHNpZGVzXG4gKiBuZWVkIHRoZW06IGBhcGkvYXNrYCBidWlsZHMgaXRzIHRvb2wgc2NoZW1hIGZyb20gdGhpcyBtb2R1bGUsIHRoZSBmcm9udGVuZCdzXG4gKiBjb25maXJtIGhhbmRsZXIgYnVpbGRzIGl0cyByZXF1ZXN0IGZyb20gaXQsIGFuZCB0aGUgdGVzdHMgb2YgYm90aCBhc3NlcnRcbiAqIGFnYWluc3QgaXQuIEEgc2Vjb25kIGNvcHkgd291bGQgYmUgYSBzZWNvbmQgcG9saWN5LlxuICpcbiAqIERlcGVuZGVuY3ktZnJlZSBvbiBwdXJwb3NlIOKAlCBubyBydW50aW1lIGltcG9ydHMgYXQgYWxsIOKAlCBzbyB0aGUgYnJvd3NlciBjYW5cbiAqIGltcG9ydCBpdCB0aHJvdWdoIGFwaS1jb3JlJ3MgYC4vYXNrLXByb3Bvc2Fsc2AgZW50cnkgd2l0aG91dCBkcmFnZ2luZyBpbiB0aGVcbiAqIHNlcnZlciBncmFwaCAoZXhwcmVzcyAvIGp3dCAvIGlvcmVkaXMpLiBUaGUgb25seSBpbXBvcnRzIGFyZSBgaW1wb3J0IHR5cGVgLFxuICogd2hpY2ggdGhlIGNvbXBpbGVyIGVyYXNlcy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogMS4gUFJPVkVOQU5DRVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5IGNvbW1pdCB0aGF0IHN0YXJ0ZWQgbGlmZSBhcyBhbiBhZ2VudCBkcmFmdCBzdGFtcHNcbiAqIGBkZXRhaWxzOiB7IHByb3Bvc2VkQnk6ICdhc2stYWdlbnQnIH1gIG9udG8gaXRzIGF1ZGl0IGV2ZW50LiBUaGUgYXVkaXQgdHJhaWxcbiAqIGlzIGhhc2gtY2hhaW5lZCBhbmQgdGFtcGVyLWV2aWRlbnQsIGJ1dCB3aXRob3V0IHRoaXMgZmllbGQgaXQgY2Fubm90XG4gKiBkaXN0aW5ndWlzaCBcInRoZSBhZG1pbiBjaGFuZ2VkIHRoaXNcIiBmcm9tIFwiYW4gQUkgZHJhZnRlZCBpdCBhbmQgdGhlIGFkbWluXG4gKiBjbGlja2VkIEFwcGx5XCIg4oCUIHRoZSB0d28gbWVhbiB2ZXJ5IGRpZmZlcmVudCB0aGluZ3MgaW4gYW4gaW5jaWRlbnQgcmV2aWV3LlxuICogVGhlIGNvbnN0YW50IGV4aXN0cyBzbyB0aGUgbGl0ZXJhbCBpcyBub3QgcmV0eXBlZCBpbiB0d28gY29kZWJhc2VzLCB3aGVyZSBhXG4gKiB0eXBvIHdvdWxkIHNpbGVudGx5IHByb2R1Y2UgYW4gdW5xdWVyeWFibGUgdHJhaWwuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIDIuIFRIRSBPUkctU0VUVElOR1MgQUxMT1dMSVNUXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGhpcyBpcyBhbiBBTExPV0xJU1QsIG5vdCBhIGRlbnlsaXN0LCBhbmQgdGhlIGRpc3RpbmN0aW9uIGlzIHRoZSB3aG9sZSBwb2ludDpcbiAqIGEgc2V0dGluZyBhZGRlZCB0byB0aGUgcGxhdGZvcm0gdG9tb3Jyb3cgaXMgVU5BVkFJTEFCTEUgdG8gdGhlIGFnZW50IHVudGlsXG4gKiBzb21lb25lIGRlbGliZXJhdGVseSBhZGRzIGl0IGhlcmUsIHJhdGhlciB0aGFuIGJlaW5nIGV4cG9zZWQgYnkgb21pc3Npb24uXG4gKiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyBiZWNhdXNlIGEgcHJvcG9zYWwgd2FzIHJlZnVzZWQsIHRoZSBmaXggaXMgdG8gYWRkIHRoZVxuICogZmllbGQgYmVsb3cgV0lUSCBpdHMgYHdoeWAg4oCUIG5vdCB0byBsb29zZW4ge0BsaW5rIHBpY2tBbGxvd2VkfS5cbiAqXG4gKiBBIGZpZWxkIGVhcm5zIGEgcGxhY2UgaGVyZSBvbmx5IGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGhvbGQuIFRoZXkgd2VyZVxuICogY2hlY2tlZCBhZ2FpbnN0IHRoZSByb3V0ZXMsIG5vdCBhc3N1bWVkOlxuICpcbiAqICAtICoqTm8gc3RlcC11cC4qKiBBIHJvdXRlIGNhcnJ5aW5nIGByZXF1aXJlU3RlcFVwYCBpcyBvdXQsIG5vIGV4Y2VwdGlvbnMuXG4gKiAgICBTdGVwLXVwIG1lYW5zIHRoZSBwbGF0Zm9ybSBhbHJlYWR5IGRlY2lkZWQgYSBsaXZlIHNlc3Npb24gaXMgbm90IGVub3VnaFxuICogICAgYXV0aG9yaXR5OyBhIGNoYXQgcHJvcG9zYWwgaXMgc3RyaWN0bHkgbGVzcy4gVGhpcyBpcyB3aGF0IGtlZXBzXG4gKiAgICBgUFVUIC9vcmdhbml6YXRpb24vYWktY29uZmlnYCBvdXQgKGl0IHBlcnNpc3RzIHBlci1vcmcgcHJvdmlkZXIgU0VDUkVUUyksXG4gKiAgICBhbG9uZyB3aXRoIHRoZSBNRkEgLyBwYXNzd29yZCAvIGF1dGhlbnRpY2F0b3IgcG9saWNpZXMsXG4gKiAgICBgUFVUIC9wbHVnaW5zL2luc3RhbGwtcG9saWN5YCwgb3JnIHJlc3RvcmUgYW5kIHRyYW5zZmVyLW93bmVyLlxuICogIC0gKipOb3QgYSBzZWN1cml0eSBjb250cm9sLioqIE1GQSAvIHBhc3N3b3JkIC8gYXV0aGVudGljYXRvciAvIGltcGVyc29uYXRpb25cbiAqICAgIHBvbGljeSwgU1NPK1NBTUwgYW5kIGl0cyBncm91cCBtYXBwaW5ncywgdmVyaWZpZWQgZG9tYWlucyBhbmQgZG9tYWluLWJhc2VkXG4gKiAgICBqb2luLCBqb2luLXJlcXVlc3QgZGVjaXNpb25zLCB0cmFuc2Zlci1vd25lciBhbmQgdGVhbSBsaWZlY3ljbGUgYXJlIEFCU0VOVFxuICogICAgaGVyZSByYXRoZXIgdGhhbiBnYXRlZCB3aXRoaW4g4oCUIFwicmVsYXggdGhlIE1GQSBwb2xpY3lcIiBpcyBwcmVjaXNlbHkgd2hhdCBhblxuICogICAgaW5qZWN0aW9uIHBheWxvYWQgYXNrcyBmb3IsIGFuZCBpdCBhcnJpdmVzIHRocm91Z2ggdGV4dCB0aGUgYWdlbnQgYWxyZWFkeVxuICogICAgcmVhZHMuIEFic2VudCBjYW5ub3QgYmUgYXJndWVkIHdpdGg7IGdhdGVkIGNhbi5cbiAqICAtICoqQ2FycmllcyBubyBzZWNyZXQgYW5kIG5vIGNhbGxiYWNrIHRhcmdldC4qKiBBbiBBUEkgdGhhdCByZXR1cm5zXG4gKiAgICBgaGFzV2ViaG9va1NlY3JldGAgaW5zdGVhZCBvZiB0aGUgc2VjcmV0IGlzIHRlbGxpbmcgeW91IHRoZSBmaWVsZCBjYW5ub3QgYmVcbiAqICAgIGRpZmZlZCwgc28gaXQgY2Fubm90IGJlIHJldmlld2VkLCBzbyBpdCBjYW5ub3QgYmUgcHJvcG9zZWQuIFdlYmhvb2sgVVJMc1xuICogICAgYW5kIGVtYWlsIGFkZHJlc3NlcyBhcmUgb3V0IGZvciB0aGUgc2FtZSByZWFzb24gcGx1cyBvbmUgbW9yZTogdGhleSBhcmVcbiAqICAgIGV4ZmlsdHJhdGlvbiB0YXJnZXRzLCBhbmQgYSBjb25maXJtYXRpb24gbWFpbCB0byBhbiBhdHRhY2tlci1jaG9zZW4gYWRkcmVzc1xuICogICAgaXMgYSBzZW5kIHRoZSBwbGF0Zm9ybSBwZXJmb3JtcyBvbiB0aGUgbW9kZWwncyBzYXktc28uXG4gKiAgLSAqKlJldmlld2FibGUgYXMgYSBkaWZmLioqIEEgc2NhbGFyIHdpdGggYSBjbG9zZWQgc2hhcGUgKGJvb2xlYW4sIGJvdW5kZWRcbiAqICAgIGludGVnZXIsIHNtYWxsIGVudW0pLiBBIGxpc3Qgb2Ygb3BhcXVlIHVzZXIgaWRzIHJlbmRlcnMgYXMgaWRzIGluIGEgY2FyZFxuICogICAgbm9ib2R5IGNhbiBjaGVjaywgc28gcmVjaXBpZW50IExJU1RTIGFyZSBvdXQgZXZlbiB0aG91Z2ggY2FkZW5jZSBpcyBpbi5cbiAqXG4gKiBFYWNoIGVudHJ5IG5hbWVzIHRoZSBBUEkgdGhhdCBhcHBsaWVzIGl0LiBUaGUgYnJvd3NlciBhcHBsaWVzIGl0IHRocm91Z2ggdGhlXG4gKiBVU0VSJ3Mgb3duIHNlc3Npb24gYW5kIHRoZSB1c2VyJ3Mgb3duIHBlcm1pc3Npb25zIOKAlCB0aGUgYWdlbnQgbmV2ZXIgd3JpdGVzIOKAlFxuICogc28gYSBwcm9wb3NhbCBhIG1lbWJlciBtYXkgbm90IGNvbW1pdCBzaW1wbHkgNDAzcyBhdCB0aGUgcm91dGUsIGV4YWN0bHkgYXMgYVxuICogaGFuZC1tYWRlIHJlcXVlc3Qgd291bGQuXG4gKlxuICogUnVsZSAxMCBsaXZlcyBpbiB7QGxpbmsgcGlja0FsbG93ZWR9OiBhIGNhbmRpZGF0ZSBjYXJyeWluZyBhIGZpZWxkIG91dHNpZGVcbiAqIHRoaXMgbGlzdCBpcyB0aGUgaW5qZWN0aW9uIHNpZ25hbCwgc28gdGhlIHJlZnVzZWQgbmFtZXMgY29tZSBiYWNrIHRvIHRoZVxuICogY2FsbGVyIHRvIGJlIGNvdW50ZWQgYW5kIGxvZ2dlZCByYXRoZXIgdGhhbiBiZWluZyBxdWlldGx5IGRyb3BwZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNlY3VyaXR5RGlnZXN0TW9kZSB9IGZyb20gJy4vd2lyZS12b2NhYnVsYXJ5LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFByb3ZlbmFuY2UgKHJ1bGUgNilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBUaGUgYHByb3Bvc2VkQnlgIHZhbHVlIGV2ZXJ5IGFnZW50LWRyYWZ0ZWQgY29tbWl0IHJlY29yZHMuICovXG5leHBvcnQgY29uc3QgQVNLX0FHRU5UX1BST1BPU0VSID0gJ2Fzay1hZ2VudCc7XG5cbi8qKiBUaGUgYXVkaXQgYGRldGFpbHNgIGtleSB0aGF0IGNhcnJpZXMgcHJvdmVuYW5jZS4gKi9cbmV4cG9ydCBjb25zdCBQUk9QT1NFRF9CWV9ERVRBSUxfS0VZID0gJ3Byb3Bvc2VkQnknO1xuXG4vKiogVGhlIHByb3ZlbmFuY2UgZnJhZ21lbnQgbWVyZ2VkIGludG8gYSBgUmVtb3RlQXVkaXRFdmVudC5kZXRhaWxzYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNrUHJvcG9zYWxQcm92ZW5hbmNlIHtcbiAgcmVhZG9ubHkgcHJvcG9zZWRCeTogdHlwZW9mIEFTS19BR0VOVF9QUk9QT1NFUjtcbn1cblxuLyoqXG4gKiBNZXJnZSBhZ2VudCBwcm92ZW5hbmNlIGludG8gYW4gYXVkaXQgZXZlbnQncyBmcmVlLWZvcm0gYGRldGFpbHNgLlxuICogUHJvdmVuYW5jZSBpcyBhcHBsaWVkIExBU1Qgc28gYSBjYWxsZXItc3VwcGxpZWQgYHByb3Bvc2VkQnlgIGNhbm5vdCBvdmVyd3JpdGVcbiAqIGl0IOKAlCB0aGUgcG9pbnQgb2YgdGhlIGZpZWxkIGlzIHRoYXQgaXQgaXMgbm90IG5lZ290aWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc2tQcm9wb3NhbEF1ZGl0RGV0YWlscyhcbiAgZGV0YWlscz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgQXNrUHJvcG9zYWxQcm92ZW5hbmNlIHtcbiAgcmV0dXJuIHsgLi4uZGV0YWlscywgcHJvcG9zZWRCeTogQVNLX0FHRU5UX1BST1BPU0VSIH07XG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgSEVBREVSIGEgcHJvcG9zYWwgY29tbWl0IHN0YW1wcywgYW5kIHRoZSBvbmx5IGNoYW5uZWwgcHJvdmVuYW5jZVxuICogdHJhdmVscyBvbi5cbiAqXG4gKiBBIEhFQURFUiByYXRoZXIgdGhhbiBhIGJvZHkgZmllbGQsIGZvciB0aHJlZSByZWFzb25zOlxuICpcbiAqICAtICoqSXQgY2Fubm90IGNvbGxpZGUuKiogYHByb3Bvc2VkQnlgIGluIGEgYm9keSB3b3VsZCBiZSBhIG5ldyBrZXkgaW4gc2l4XG4gKiAgICBkaWZmZXJlbnQgZG9tYWluIHNjaGVtYXMg4oCUIGBQaXBlbGluZVVwZGF0ZVNjaGVtYWAsIHRoZSBwbHVnaW4vdGVtcGxhdGVcbiAqICAgIHVwZGF0ZSBzY2hlbWFzLCB0aHJlZSBub3RpZmljYXRpb24vc2V0dGluZ3Mgc2NoZW1hcyDigJQgdHdvIG9mIHdoaWNoIGFyZVxuICogICAgYC5zdHJpY3QoKWAgYW5kIHRoZSByZXN0IG9mIHdoaWNoIGZlZWQgYE9iamVjdC5rZXlzKGJvZHkpYCBzdHJhaWdodCBpbnRvXG4gKiAgICB0aGUgdXBkYXRlJ3MgY29sdW1uIGxpc3QgYW5kIHRoZSBhdWRpdCdzIGBmaWVsZHNgLiBBIGZpZWxkIG5hbWVkIGFmdGVyIGFuXG4gKiAgICBhdWRpdCBrZXkgd291bGQgdGhlbiBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgcmVhbCBvbmUsIGFuZCB0aGUgZGF5IGFcbiAqICAgIGRvbWFpbiBncm93cyBpdHMgb3duIGBwcm9wb3NlZEJ5YCB0aGUgdHdvIG1lYW5pbmdzIG1lcmdlIHNpbGVudGx5LlxuICogIC0gKipJdCBpcyB0cmFuc3BvcnQgbWV0YWRhdGEsIGFuZCBzdGF5cyBvdXQgb2YgdGhlIHBheWxvYWQuKiogTm90aGluZ1xuICogICAgZG93bnN0cmVhbSBvZiBgdmFsaWRhdGVCb2R5YCBldmVyIHNlZXMgaXQsIHNvIGl0IGNhbm5vdCBiZSBwZXJzaXN0ZWQsIGNhbm5vdFxuICogICAgd2lkZW4gYSBkaWZmLCBhbmQgY2Fubm90IHJlYWNoIGEgc2VydmljZSB0aGF0IGZvcndhcmRzIHRoZSBib2R5IG9ud2FyZC5cbiAqICAtICoqVGhlIHBsYXRmb3JtIGFscmVhZHkgZG9lcyB0aGlzLioqIGBYLVN0ZXAtVXAtVG9rZW5gIGlzIHRoZSBzYW1lIHNoYXBlIG9mXG4gKiAgICB0aGluZyDigJQgYSBwZXItcmVxdWVzdCBhc3NlcnRpb24gYWJvdXQgSE9XIHRoZSBjYWxsIHdhcyBtYWRlIHJhdGhlciB0aGFuXG4gKiAgICBXSEFUIGl0IGNoYW5nZXMg4oCUIGFuZCByaWRlcyBhIGhlYWRlciBmb3IgdGhlIHNhbWUgcmVhc29ucy5cbiAqXG4gKiBMb3dlci1jYXNlIGJlY2F1c2UgdGhhdCBpcyBob3cgTm9kZSBub3JtYWxpc2VzIGluY29taW5nIGhlYWRlciBuYW1lczsgdGhlXG4gKiBicm93c2VyIHNlbmRzIGBYLVBCLVByb3Bvc2VkLUJ5YCwgd2hpY2ggYXJyaXZlcyBoZXJlLlxuICovXG5leHBvcnQgY29uc3QgQVNLX1BST1BPU0VEX0JZX0hFQURFUiA9ICd4LXBiLXByb3Bvc2VkLWJ5JztcblxuLyoqXG4gKiBXaGF0IGEgcmVxdWVzdCdzIHByb3ZlbmFuY2UgaGVhZGVyIGNsYWltcy5cbiAqXG4gKiBgZm9yZWlnbmAgaXMgYW55IHZhbHVlIHRoYXQgaXMgbm90IEVYQUNUTFkge0BsaW5rIEFTS19BR0VOVF9QUk9QT1NFUn0g4oCUIHRoZXJlXG4gKiBpcyBvbmUgbGVnaXRpbWF0ZSBwcm9wb3NlciBhbmQgbm8gZnJlZS1mb3JtIHRleHQsIHNvIGFueXRoaW5nIGVsc2UgaXMgYSBidWdcbiAqIG9yIGEgZm9yZ2VyeSBhbmQgaXMgbmFtZWQgYXMgc3VjaCByYXRoZXIgdGhhbiBmb2xkZWQgaW50byBgbm9uZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFByb3Bvc2VyQ2xhaW0gPSAnbm9uZScgfCAnYXNrLWFnZW50JyB8ICdmb3JlaWduJztcblxuLyoqXG4gKiBSZWFkIHRoZSBwcm92ZW5hbmNlIGNsYWltIG9mZiBhIHJlcXVlc3QncyBoZWFkZXIgYmFnLlxuICpcbiAqIERlbGliZXJhdGVseSBleGFjdDogbm8gdHJpbW1pbmcsIG5vIGNhc2UgZm9sZGluZywgbm8gcHJlZml4IG1hdGNoaW5nLiBUaGVcbiAqIG9ubHkgc2VuZGVyIGlzIHRoZSBicm93c2VyJ3MgY29uZmlybSBwYXRoLCB3aGljaCBzdGFtcHMgdGhlIHNoYXJlZCBjb25zdGFudCxcbiAqIHNvIGV2ZXJ5IG90aGVyIHZhbHVlIGlzIHJlZnVzZWQgcmF0aGVyIHRoYW4gcmVwYWlyZWQuIFRoaXMgaXMgd2hhdCBrZWVwcyBhXG4gKiBjbGllbnQgZnJvbSB3cml0aW5nIGFyYml0cmFyeSBhdWRpdCBgZGV0YWlsc2Ag4oCUIHRoZSBoZWFkZXIncyB3aG9sZSB2b2NhYnVsYXJ5XG4gKiBpcyBvbmUgd29yZCwgYW5kIHRoZSB3b3JkIGlzIG5vdCB0aGUgY2xpZW50J3MgdG8gY2hvb3NlLlxuICpcbiAqIFRha2VzIHRoZSBoZWFkZXIgQkFHIChgcmVxLmhlYWRlcnNgKSByYXRoZXIgdGhhbiBhIHJlcXVlc3QsIHNvIHRoaXMgbW9kdWxlXG4gKiBrZWVwcyBpdHMgemVybyBydW50aW1lIGltcG9ydHMgYW5kIHRoZSBicm93c2VyIGNhbiBzdGlsbCBpbXBvcnQgdGhlIGNvbnN0YW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFByb3Bvc2VyQ2xhaW0oaGVhZGVyczogdW5rbm93bik6IFByb3Bvc2VyQ2xhaW0ge1xuICBjb25zdCBiYWcgPSBoZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3ID0gYmFnICYmIHR5cGVvZiBiYWcgPT09ICdvYmplY3QnID8gYmFnW0FTS19QUk9QT1NFRF9CWV9IRUFERVJdIDogdW5kZWZpbmVkO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gJ25vbmUnO1xuICByZXR1cm4gdmFsdWUgPT09IEFTS19BR0VOVF9QUk9QT1NFUiA/ICdhc2stYWdlbnQnIDogJ2ZvcmVpZ24nO1xufVxuXG4vKipcbiAqIFRoZSBhdWRpdCBgZGV0YWlsc2AgZm9yIGEgd3JpdGUsIHdpdGggcHJvdmVuYW5jZSBmb2xkZWQgaW4gd2hlbiDigJQgYW5kIE9OTFlcbiAqIHdoZW4g4oCUIHRoZSByZXF1ZXN0IGNhcnJpZXMgdGhlIGFnZW50IG1hcmtlci5cbiAqXG4gKiBgZGV0YWlsc2AgaXMgd2hhdCB0aGUgSEFORExFUiBidWlsdCBhbmQgc3RheXMgYXV0aG9yaXRhdGl2ZS4gUHJvdmVuYW5jZSBpc1xuICogYWRkaXRpdmU6IHRoZSBPTkxZIGtleSBpdCBjYW4gZXZlciB3cml0ZSBpcyBgcHJvcG9zZWRCeWAsIHNvIGV2ZXJ5IGZpZWxkIHRoZVxuICogaGFuZGxlciBzZXQgc3Vydml2ZXMgdW50b3VjaGVkLCBhbmQge0BsaW5rIGFza1Byb3Bvc2FsQXVkaXREZXRhaWxzfSBhcHBsaWVzXG4gKiB0aGF0IG9uZSBrZXkgTEFTVCBzbyBhIGBwcm9wb3NlZEJ5YCBhcnJpdmluZyBmcm9tIGFueXdoZXJlIGVsc2UgY2Fubm90IHNwZWFrXG4gKiBpbiBpdHMgcGxhY2UuIEEgcmVxdWVzdCBjYXJyeWluZyBubyBtYXJrZXIsIG9yIGEgYGZvcmVpZ25gIG9uZSwgZ2V0cyB0aGVcbiAqIGhhbmRsZXIncyBkZXRhaWxzIHVuY2hhbmdlZCDigJQgYW4gb3JkaW5hcnkgZWRpdCByZWNvcmRzIG5vIGBwcm9wb3NlZEJ5YCBhdFxuICogYWxsLCB3aGljaCBpcyB0aGUgZGlzdGluY3Rpb24gdGhlIGZpZWxkIGV4aXN0cyB0byBtYWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFByb3Bvc2FsUHJvdmVuYW5jZShcbiAgaGVhZGVyczogdW5rbm93bixcbiAgZGV0YWlscz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHJlYWRQcm9wb3NlckNsYWltKGhlYWRlcnMpID09PSAnYXNrLWFnZW50J1xuICAgID8gYXNrUHJvcG9zYWxBdWRpdERldGFpbHMoZGV0YWlscylcbiAgICA6IHsgLi4uZGV0YWlscyB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIGFsbG93bGlzdFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgdmFsdWUgYW4gYWxsb3dsaXN0ZWQgb3JnIHNldHRpbmcgY2FuIGhvbGQuICovXG5leHBvcnQgdHlwZSBPcmdTZXR0aW5nVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vKiogV2hpY2ggcGVyLW9yZyByZWNvcmQgKGFuZCB0aGVyZWZvcmUgd2hpY2ggQVBJKSBhIGZpZWxkIGJlbG9uZ3MgdG8uICovXG5leHBvcnQgdHlwZSBPcmdTZXR0aW5nU3VyZmFjZSA9XG4gIHwgJ3JlcG9ydGluZydcbiAgfCAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMnXG4gIHwgJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucyc7XG5cbi8qKlxuICogRXZlcnkgcHJvcG9zYWJsZSBzZXR0aW5nLCBhcyBgPHN1cmZhY2U+LjxmaWVsZD5gLiBXcml0aW5nIHRoZSB1bmlvbiBvdXQgYnlcbiAqIGhhbmQgKHJhdGhlciB0aGFuIGluZmVycmluZyBpdCBmcm9tIHRoZSBhcnJheSkgaXMgZGVsaWJlcmF0ZTogdGhlIGtleSBzcGFjZVxuICogaXMgdGhlIGNvbnRyYWN0IHRoZSB0b29sIHNjaGVtYSBhbmQgdGhlIGNvbmZpcm0gaGFuZGxlciBzaGFyZSwgc28gaXQgaXNcbiAqIHN0YXRlZCBvbmNlLCBleHBsaWNpdGx5LCBhbmQgYSB0eXBvIGluIGFuIGVudHJ5IGJlbG93IGlzIGEgY29tcGlsZSBlcnJvci5cbiAqL1xuZXhwb3J0IHR5cGUgT3JnU2V0dGluZ0tleSA9XG4gIHwgJ3JlcG9ydGluZy5pbmNpZGVudFdpbmRvd0hvdXJzJ1xuICB8ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucy5ub3RpZnlPbkJsb2NrJ1xuICB8ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucy5ub3RpZnlPbldhcm5pbmcnXG4gIHwgJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLmVtYWlsRW5hYmxlZCdcbiAgfCAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMuZGlnZXN0TW9kZSdcbiAgfCAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLm5vdGlmeVJlc2NhbidcbiAgfCAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLmRpZ2VzdE1vZGUnO1xuXG4vKiogVGhlIGNsb3NlZCBzaGFwZSBhIHByb3Bvc2VkIHZhbHVlIG11c3QgbWF0Y2ggYmVmb3JlIGl0IGlzIGFjY2VwdGVkLiAqL1xuZXhwb3J0IHR5cGUgT3JnU2V0dGluZ1NoYXBlID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdib29sZWFuJyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnaW50ZWdlcic7IHJlYWRvbmx5IG1pbjogbnVtYmVyOyByZWFkb25seSBtYXg6IG51bWJlciB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZW51bSc7IHJlYWRvbmx5IHZhbHVlczogcmVhZG9ubHkgc3RyaW5nW10gfTtcblxuLyoqIE9uZSBwcm9wb3NhYmxlIG9yZyBzZXR0aW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdTZXR0aW5nU3BlYyB7XG4gIC8qKiBTdGFibGUgcHJvcG9zYWwga2V5IOKAlCBgPHN1cmZhY2U+LjxmaWVsZD5gLiBUaGlzIGlzIHdoYXQgdGhlIG1vZGVsIG5hbWVzLiAqL1xuICByZWFkb25seSBrZXk6IE9yZ1NldHRpbmdLZXk7XG4gIHJlYWRvbmx5IHN1cmZhY2U6IE9yZ1NldHRpbmdTdXJmYWNlO1xuICAvKiogVGhlIHJlcXVlc3QtYm9keSBmaWVsZCBuYW1lIHRoZSBBUEkgZXhwZWN0cy4gKi9cbiAgcmVhZG9ubHkgZmllbGQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hhcGU6IE9yZ1NldHRpbmdTaGFwZTtcbiAgLyoqIFRoZSByb3V0ZSB0aGF0IGFwcGxpZXMgaXQsIGNhbGxlZCBieSB0aGUgQlJPV1NFUiB3aXRoIHRoZSB1c2VyJ3Mgc2Vzc2lvbi4gKi9cbiAgcmVhZG9ubHkgYXBpOiB7IHJlYWRvbmx5IG1ldGhvZDogJ1BVVCc7IHJlYWRvbmx5IHBhdGg6IHN0cmluZyB9O1xuICAvKiogVGhlIHBlcm1pc3Npb24gdGhhdCByb3V0ZSByZXF1aXJlcyBvZiB0aGUgY2FsbGVyLiAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uO1xuICAvKiogU2hvcnQgaHVtYW4gbGFiZWwgZm9yIHRoZSBjb25maXJtIGNhcmQuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBXSFkgdGhpcyBmaWVsZCBpcyBzYWZlIHRvIHByb3Bvc2UuIEV2ZXJ5IGVudHJ5IHN0YXRlcyBpdHMgb3duIGNhc2UuICovXG4gIHJlYWRvbmx5IHdoeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBgZGlnZXN0TW9kZWAgdm9jYWJ1bGFyeSBpcyBNSVJST1JFRCwgbm90IGltcG9ydGVkOiB0aGlzIG1vZHVsZSBrZWVwcyB6ZXJvXG4gKiBydW50aW1lIGltcG9ydHMgc28gdGhlIGJyb3dzZXIgZW50cnkgc3RheXMgc3RhbmRhbG9uZS4gVGhlIHR5cGUgYW5ub3RhdGlvblxuICogbWFrZXMgYSBSRU1PVkVEIG1vZGUgYSBjb21waWxlIGVycm9yIGhlcmUsIGFuZCBgYXNrLXByb3Bvc2Fscy50ZXN0LnRzYCBhc3NlcnRzXG4gKiB0aGUgbGlzdCBhZ2FpbnN0IGBQTFVHSU5fU0VDVVJJVFlfRElHRVNUX01PREVTYCBzbyBhbiBBRERFRCBvbmUgY2Fubm90IGRyaWZ0XG4gKiBlaXRoZXIuXG4gKi9cbmNvbnN0IERJR0VTVF9NT0RFUzogcmVhZG9ubHkgUGx1Z2luU2VjdXJpdHlEaWdlc3RNb2RlW10gPSBbJ2ltbWVkaWF0ZScsICdkYWlseScsICd3ZWVrbHknXTtcblxuLyoqXG4gKiBUaGUgYWxsb3dsaXN0LiBBZGRpbmcgYW4gZW50cnkgaXMgYSBkZWxpYmVyYXRlIGFjdDogbmFtZSB0aGUgcm91dGUgeW91XG4gKiBjaGVja2VkLCBjb25maXJtIGl0IGNhcnJpZXMgbm8gYHJlcXVpcmVTdGVwVXBgLCBhbmQgd3JpdGUgdGhlIGB3aHlgLlxuICovXG5leHBvcnQgY29uc3QgT1JHX1NFVFRJTkdfUFJPUE9TQUxfQUxMT1dMSVNUOiByZWFkb25seSBPcmdTZXR0aW5nU3BlY1tdID0gW1xuICB7XG4gICAga2V5OiAncmVwb3J0aW5nLmluY2lkZW50V2luZG93SG91cnMnLFxuICAgIHN1cmZhY2U6ICdyZXBvcnRpbmcnLFxuICAgIGZpZWxkOiAnaW5jaWRlbnRXaW5kb3dIb3VycycsXG4gICAgc2hhcGU6IHsga2luZDogJ2ludGVnZXInLCBtaW46IDEsIG1heDogNzIwIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvcmVwb3J0cy9zZXR0aW5ncy9pbmNpZGVudHMnIH0sXG4gICAgcGVybWlzc2lvbjogJ29yZ19zZXR0aW5nczp3cml0ZScsXG4gICAgbGFiZWw6ICdJbmNpZGVudCBjb3JyZWxhdGlvbiB3aW5kb3cgKGhvdXJzKScsXG4gICAgd2h5OlxuICAgICAgJ0FuYWx5dGljcyB0dW5pbmcgb25seTogaXQgZGVjaWRlcyBob3cgbG9uZyBhZnRlciBhIGRlcGxveSBhbiBpbmNpZGVudCBpcyAnXG4gICAgICArICdhdHRyaWJ1dGVkIHRvIHRoYXQgZGVwbG95IHdoZW4gRE9SQSBtZXRyaWNzIGFyZSBjb21wdXRlZC4gSXQgZ3JhbnRzIG5vdGhpbmcsICdcbiAgICAgICsgJ3JldmVhbHMgbm90aGluZyBhbmQgcmVhY2hlcyBubyBvbmUg4oCUIHRoZSB3b3JzdCBvdXRjb21lIG9mIGEgd3JvbmcgdmFsdWUgaXMgYSAnXG4gICAgICArICdtaXNsZWFkaW5nIGNoYW5nZS1mYWlsdXJlIHJhdGUsIHdoaWNoIHRoZSBuZXh0IGVkaXQgY29ycmVjdHMuIFRoZSByb3V0ZSAnXG4gICAgICArICdyZWplY3RzIHRoZSBzaWJsaW5nIHJldGVudGlvbiBmaWVsZHMgb3V0cmlnaHQgKHRoZXkgYXJlIGJpbGxpbmctb3duZWQpLCBzbyAnXG4gICAgICArICd0aGlzIGlzIHRoZSB3aG9sZSB3cml0YWJsZSBzdXJmYWNlLiBCb3VuZGVkIGludGVnZXIsIHNvIHRoZSBkaWZmIGlzIG9uZSBudW1iZXIuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLm5vdGlmeU9uQmxvY2snLFxuICAgIHN1cmZhY2U6ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucycsXG4gICAgZmllbGQ6ICdub3RpZnlPbkJsb2NrJyxcbiAgICBzaGFwZTogeyBraW5kOiAnYm9vbGVhbicgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9jb21wbGlhbmNlL25vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcycgfSxcbiAgICBwZXJtaXNzaW9uOiAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgbGFiZWw6ICdOb3RpZnkgd2hlbiBjb21wbGlhbmNlIGJsb2NrcyBhbiBhY3Rpb24nLFxuICAgIHdoeTpcbiAgICAgICdBIGRlbGl2ZXJ5IHByZWZlcmVuY2UsIG5vdCBhbiBlbmZvcmNlbWVudCBjb250cm9sOiB0aGUgYmxvY2sgaGFwcGVucyBlaXRoZXIgJ1xuICAgICAgKyAnd2F5IGFuZCB0aGUgcG9saWN5IHRoYXQgY2F1c2VkIGl0IGlzIHVuY2hhbmdlZC4gVHVybmluZyBpdCBvZmYgbWFrZXMgdGhlIG9yZyAnXG4gICAgICArICdxdWlldGVyLCBuZXZlciBtb3JlIHBlcm1pc3NpdmUuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLm5vdGlmeU9uV2FybmluZycsXG4gICAgc3VyZmFjZTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ25vdGlmeU9uV2FybmluZycsXG4gICAgc2hhcGU6IHsga2luZDogJ2Jvb2xlYW4nIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvY29tcGxpYW5jZS9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMnIH0sXG4gICAgcGVybWlzc2lvbjogJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgIGxhYmVsOiAnTm90aWZ5IG9uIGNvbXBsaWFuY2Ugd2FybmluZ3MnLFxuICAgIHdoeTogJ0FzIG5vdGlmeU9uQmxvY2sg4oCUIHdoaWNoIG5vbi1ibG9ja2luZyBmaW5kaW5ncyBhcmUgYW5ub3VuY2VkLCBub3Qgd2hhdCBpcyBlbmZvcmNlZC4nLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMuZW1haWxFbmFibGVkJyxcbiAgICBzdXJmYWNlOiAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMnLFxuICAgIGZpZWxkOiAnZW1haWxFbmFibGVkJyxcbiAgICBzaGFwZTogeyBraW5kOiAnYm9vbGVhbicgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9jb21wbGlhbmNlL25vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcycgfSxcbiAgICBwZXJtaXNzaW9uOiAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgbGFiZWw6ICdTZW5kIGNvbXBsaWFuY2Ugbm90aWNlcyBieSBlbWFpbCcsXG4gICAgd2h5OlxuICAgICAgJ0Nob29zZXMgd2hldGhlciB0aGUgZXhpc3Rpbmcgbm90aWNlcyBnbyBvdXQgYnkgZW1haWwuIEl0IGRvZXMgbm90IG5hbWUgYSAnXG4gICAgICArICdyZWNpcGllbnQg4oCUIHRoZSBhZGRyZXNzIGxpc3QgaXMgcmVzb2x2ZWQgZnJvbSBvcmcgbWVtYmVyc2hpcCBhdCBzZW5kIHRpbWUg4oCUICdcbiAgICAgICsgJ3NvIGEgZmxpcHBlZCBib29sZWFuIGNhbiBuZXZlciByb3V0ZSBtYWlsIHNvbWV3aGVyZSBuZXcuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLmRpZ2VzdE1vZGUnLFxuICAgIHN1cmZhY2U6ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucycsXG4gICAgZmllbGQ6ICdkaWdlc3RNb2RlJyxcbiAgICBzaGFwZTogeyBraW5kOiAnZW51bScsIHZhbHVlczogRElHRVNUX01PREVTIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvY29tcGxpYW5jZS9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMnIH0sXG4gICAgcGVybWlzc2lvbjogJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgIGxhYmVsOiAnQ29tcGxpYW5jZSBub3RpY2UgY2FkZW5jZScsXG4gICAgd2h5OiAnQ2FkZW5jZSBvZiBhbiBleGlzdGluZyBub3RpY2UgdG8gZXhpc3RpbmcgcmVjaXBpZW50cy4gQ2xvc2VkIGVudW0sIHNvIHRoZSBkaWZmIGlzIG9uZSB3b3JkLicsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdwbHVnaW5TZWN1cml0eU5vdGlmaWNhdGlvbnMubm90aWZ5UmVzY2FuJyxcbiAgICBzdXJmYWNlOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ25vdGlmeVJlc2NhbicsXG4gICAgc2hhcGU6IHsga2luZDogJ2Jvb2xlYW4nIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvcGx1Z2lucy9zZWN1cml0eS1ub3RpZmljYXRpb25zJyB9LFxuICAgIHBlcm1pc3Npb246ICdvcmdfc2V0dGluZ3M6d3JpdGUnLFxuICAgIGxhYmVsOiAnTm90aWZ5IG9uIG5pZ2h0bHkgcmVzY2FuIGZpbmRpbmdzJyxcbiAgICB3aHk6XG4gICAgICAnR292ZXJucyB0aGUgTjMxIHJlc2NhbiBub3RpY2Ugb25seS4gVGhlIHNjYW4gR0FURVMgYXJlIHVudG91Y2hlZDogYSBidWlsZCB0aGF0ICdcbiAgICAgICsgJ3RyaXBzIFBMVUdJTl9WVUxOX0dBVEUgc3RpbGwgZmFpbHMgYW5kIHN0aWxsIHNlbmRzIE4zMCwgd2hpY2ggdGhpcyBmbGFnIGNhbm5vdCAnXG4gICAgICArICdzdXBwcmVzcy4gU28gaXQgY2hhbmdlcyBob3cgbm9pc3kgYW4gaW5mb3JtYXRpb25hbCBub3RpY2UgaXMsIG5vdCB3aGV0aGVyIGEgJ1xuICAgICAgKyAndnVsbmVyYWJsZSB2ZXJzaW9uIGNhbiBiZSBwdWJsaXNoZWQuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucy5kaWdlc3RNb2RlJyxcbiAgICBzdXJmYWNlOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ2RpZ2VzdE1vZGUnLFxuICAgIHNoYXBlOiB7IGtpbmQ6ICdlbnVtJywgdmFsdWVzOiBESUdFU1RfTU9ERVMgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9wbHVnaW5zL3NlY3VyaXR5LW5vdGlmaWNhdGlvbnMnIH0sXG4gICAgcGVybWlzc2lvbjogJ29yZ19zZXR0aW5nczp3cml0ZScsXG4gICAgbGFiZWw6ICdQbHVnaW4gc2VjdXJpdHkgbm90aWNlIGNhZGVuY2UnLFxuICAgIHdoeTpcbiAgICAgICdDYWRlbmNlIG9mIHRoZSByZXNjYW4gbm90aWNlLiBOMzAgKFwidmVyc2lvbiBibG9ja2VkXCIpIGlzIGFsd2F5cyBpbW1lZGlhdGUgYW5kICdcbiAgICAgICsgJ2lnbm9yZXMgdGhpcyBmaWVsZCwgc28gdGhlIHVyZ2VudCBjaGFubmVsIGNhbm5vdCBiZSBzbG93ZWQgZG93bi4nLFxuICB9LFxuXTtcblxuLyoqXG4gKiBGaWVsZHMgREVMSUJFUkFURUxZIGV4Y2x1ZGVkLCB3aXRoIHRoZSByZWFzb24sIHNvIGEgZnV0dXJlIHJlYWRlciBkb2VzIG5vdFxuICogcmUtbGl0aWdhdGUgdGhlbSBhbmQgYSByZXZpZXdlciBjYW4gc2VlIHRoZXkgd2VyZSBjb25zaWRlcmVkIHJhdGhlciB0aGFuXG4gKiBtaXNzZWQuIFRoaXMgaXMgZG9jdW1lbnRhdGlvbiBvbmx5IOKAlCB7QGxpbmsgcGlja0FsbG93ZWR9IGNvbnN1bHRzIHRoZVxuICogYWxsb3dsaXN0IGFsb25lLCBhbmQgYSBmaWVsZCBhYnNlbnQgZnJvbSBCT1RIIGxpc3RzIGlzIHJlZnVzZWQgaWRlbnRpY2FsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfU0VUVElOR19QUk9QT1NBTF9FWENMVVNJT05TOiBSZWFkb25seUFycmF5PHsgcmVhZG9ubHkgZmllbGQ6IHN0cmluZzsgcmVhZG9ubHkgd2h5OiBzdHJpbmcgfT4gPSBbXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uYWlDb25maWcnLCB3aHk6ICdTdGVwLXVwIGdhdGVkIChQVVQgL29yZ2FuaXphdGlvbi9haS1jb25maWcpIGFuZCBwZXJzaXN0cyBwZXItb3JnIHByb3ZpZGVyIHNlY3JldHMuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLm1mYVBvbGljeScsIHdoeTogJ1NlY3VyaXR5IGNvbnRyb2wgKyBzdGVwLXVwLiBMb29zZW5pbmcgaXQgcmVtb3ZlcyBhIGNvbnRyb2wgZm9yIGV2ZXJ5IG1lbWJlci4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24ucGFzc3dvcmRQb2xpY3knLCB3aHk6ICdTZWN1cml0eSBjb250cm9sICsgc3RlcC11cC4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uYXV0aGVudGljYXRvclBvbGljeScsIHdoeTogJ1NlY3VyaXR5IGNvbnRyb2wgKyBzdGVwLXVwLicgfSxcbiAgeyBmaWVsZDogJ29yZ2FuaXphdGlvbi5pbXBlcnNvbmF0aW9uUG9saWN5Jywgd2h5OiAnU2VjdXJpdHkgY29udHJvbCArIHN0ZXAtdXA7IGRlY2lkZXMgd2hvIG91dHNpZGUgdGhlIG9yZyBtYXkgdmlldyBpdHMgZGF0YS4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uaWRwJywgd2h5OiAnU1NPL1NBTUwgY29uZmlnOiBzZWN1cml0eSBjb250cm9sIG9uIGl0cyBvd24gY2FwYWJpbGl0eSAob3JnX2lkcDp3cml0ZSksIGFzc3VyYW5jZSArIHN0cm9uZyBzdGVwLXVwLicgfSxcbiAgeyBmaWVsZDogJ29yZ2FuaXphdGlvbi5rbXNDb25maWcnLCB3aHk6ICdLZXkgbWF0ZXJpYWwuIE93biBjYXBhYmlsaXR5IChvcmdfa21zOndyaXRlKSwgYXNzdXJhbmNlICsgc3Ryb25nIHN0ZXAtdXAuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLmlkZW50aXR5Jywgd2h5OiAnT3JnIG5hbWUvc2x1Zzogbm8gc3RlcC11cCwgYnV0IHJlbmFtaW5nIGFuIG9yZyBpcyBhbiBpbXBlcnNvbmF0aW9uIHByaW1pdGl2ZSBhbmQgdGhlIHNsdWcgaXMgYWRkcmVzc2FibGUuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLmRvbWFpbnMnLCB3aHk6ICdWZXJpZmllZCBkb21haW5zIGRyaXZlIGRvbWFpbi1iYXNlZCBqb2luIOKAlCB3aG8gbWF5IGJlY29tZSBhIG1lbWJlci4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uam9pblJlcXVlc3RzJywgd2h5OiAnTWVtYmVyc2hpcCBkZWNpc2lvbnMgYXJlIGFuIGF1dGhvcml0eSBncmFudCwgbm90IGEgc2V0dGluZy4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24udHJhbnNmZXJPd25lcicsIHdoeTogJ093bmVyc2hpcCB0cmFuc2Zlcjogc2VjdXJpdHkgY29udHJvbCwgTUZBLWdyYWRlICsgc3RlcC11cC4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24udGVhbXMnLCB3aHk6ICdUZWFtIGxpZmVjeWNsZSAoY3JlYXRlL2RlbGV0ZS9tb3ZlKSBpcyBzdHJ1Y3R1cmFsIGFuZCBzdGVwLXVwIGdhdGVkLicgfSxcbiAgeyBmaWVsZDogJ3BsdWdpbnMuaW5zdGFsbFBvbGljeScsIHdoeTogJ1N0ZXAtdXAgZ2F0ZWQgKFBVVCAvcGx1Z2lucy9pbnN0YWxsLXBvbGljeSkgYW5kIGRlY2lkZXMgd2hhdCBtYXkgYmUgaW5zdGFsbGVkLicgfSxcbiAgeyBmaWVsZDogJyoud2ViaG9va1VybCcsIHdoeTogJ0EgY2FsbGJhY2sgdGFyZ2V0OiBwcm9wb3Npbmcgb25lIHR1cm5zIHRoZSBwbGF0Zm9ybSBpbnRvIGFuIGV4ZmlsdHJhdGlvbiBjaGFubmVsLicgfSxcbiAgeyBmaWVsZDogJyoud2ViaG9va1NlY3JldCcsIHdoeTogJ0JlYXJlci1lcXVpdmFsZW50LiBUaGUgQVBJIHJldHVybnMgaGFzV2ViaG9va1NlY3JldCwgbmV2ZXIgdGhlIHZhbHVlLCBzbyBpdCBjYW5ub3QgYmUgZGlmZmVkLicgfSxcbiAgeyBmaWVsZDogJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucy5leHRlcm5hbEVtYWlsJywgd2h5OiAnQW4gYWRkcmVzcyB0aGUgcGxhdGZvcm0gdGhlbiBtYWlscyBhIGNvbmZpcm1hdGlvbiBsaW5rIHRvLiBOZXZlciBtb2RlbC1jaG9zZW4uJyB9LFxuICB7IGZpZWxkOiAnKi50YXJnZXRVc2VycycsIHdoeTogJ0EgbGlzdCBvZiBvcGFxdWUgdXNlciBpZHMgaXMgbm90IHJldmlld2FibGUgaW4gYSBjYXJkLCBhbmQgcmVkaXJlY3RpbmcgcmVjaXBpZW50cyBjYW4gc2lsZW5jZSBhIGNoYW5uZWwuJyB9LFxuICB7IGZpZWxkOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLnJlY2lwaWVudE1vZGUnLCB3aHk6ICdQYWlycyB3aXRoIHRhcmdldFVzZXJzOyBzd2l0Y2hpbmcgdG8gXCJ1c2Vyc1wiIG1ha2VzIGFuIHVucmV2aWV3YWJsZSBsaXN0IGF1dGhvcml0YXRpdmUuJyB9LFxuICB7IGZpZWxkOiAncmVwb3J0aW5nLmV2ZW50UmV0ZW50aW9uRGF5cycsIHdoeTogJ0JpbGxpbmctb3duZWQgKHRpZXIgKyBwdXJjaGFzZWQgcGFja3MpLiBUaGUgcm91dGUgYWxyZWFkeSByZWplY3RzIGl0OyBhZG1pdHRpbmcgaXQgd291bGQgYmUgYW4gZW50aXRsZW1lbnQgYnlwYXNzLicgfSxcbiAgeyBmaWVsZDogJ3JlcG9ydGluZy5kb3JhUmV0ZW50aW9uRGF5cycsIHdoeTogJ0JpbGxpbmctb3duZWQsIGFzIGFib3ZlLicgfSxcbl07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb29rdXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IEJZX0tFWTogUmVhZG9ubHlNYXA8c3RyaW5nLCBPcmdTZXR0aW5nU3BlYz4gPVxuICBuZXcgTWFwKE9SR19TRVRUSU5HX1BST1BPU0FMX0FMTE9XTElTVC5tYXAoKHNwZWMpID0+IFtzcGVjLmtleSwgc3BlY10pKTtcblxuLyoqIEV2ZXJ5IHByb3Bvc2FibGUga2V5IOKAlCB0aGUgZW51bSBhIHByb3Bvc2UgdG9vbCdzIGlucHV0IHNjaGVtYSBpcyBidWlsdCBmcm9tLiAqL1xuZXhwb3J0IGNvbnN0IE9SR19TRVRUSU5HX1BST1BPU0FMX0tFWVM6IHJlYWRvbmx5IE9yZ1NldHRpbmdLZXlbXSA9XG4gIE9SR19TRVRUSU5HX1BST1BPU0FMX0FMTE9XTElTVC5tYXAoKHNwZWMpID0+IHNwZWMua2V5KTtcblxuLyoqIElzIGBrZXlgIG9uIHRoZSBhbGxvd2xpc3Q/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wb3NhYmxlT3JnU2V0dGluZyhrZXk6IHN0cmluZyk6IGtleSBpcyBPcmdTZXR0aW5nS2V5IHtcbiAgcmV0dXJuIEJZX0tFWS5oYXMoa2V5KTtcbn1cblxuLyoqIFRoZSBzcGVjIGZvciBga2V5YCwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaXMgbm90IHByb3Bvc2FibGUuICovXG5leHBvcnQgZnVuY3Rpb24gb3JnU2V0dGluZ1NwZWMoa2V5OiBzdHJpbmcpOiBPcmdTZXR0aW5nU3BlYyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBCWV9LRVkuZ2V0KGtleSk7XG59XG5cbi8qKiBEb2VzIGB2YWx1ZWAgbWF0Y2ggdGhlIHNoYXBlIHRoZSBmaWVsZCBkZWNsYXJlcz8gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT3JnU2V0dGluZ1ZhbHVlKHNwZWM6IE9yZ1NldHRpbmdTcGVjLCB2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE9yZ1NldHRpbmdWYWx1ZSB7XG4gIGNvbnN0IHNoYXBlID0gc3BlYy5zaGFwZTtcbiAgaWYgKHNoYXBlLmtpbmQgPT09ICdib29sZWFuJykgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICBpZiAoc2hhcGUua2luZCA9PT0gJ2ludGVnZXInKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gc2hhcGUubWluICYmIHZhbHVlIDw9IHNoYXBlLm1heDtcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBzaGFwZS52YWx1ZXMuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gcGlja0FsbG93ZWQgKHJ1bGVzIDEsIDMgYW5kIDEwKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgcHJvcG9zYWwncyBzZXR0aW5ncywga2V5ZWQgYnkgYWxsb3dsaXN0IGtleS4gKi9cbmV4cG9ydCB0eXBlIE9yZ1NldHRpbmdQYXRjaCA9IFBhcnRpYWw8UmVjb3JkPE9yZ1NldHRpbmdLZXksIE9yZ1NldHRpbmdWYWx1ZT4+O1xuXG4vKiogV2hhdCB7QGxpbmsgcGlja0FsbG93ZWR9IGtlcHQsIGFuZCB3aGF0IGl0IHRocmV3IGF3YXkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tBbGxvd2VkUmVzdWx0IHtcbiAgLyoqIFRoZSBhbGxvd2xpc3RlZCwgc2hhcGUtdmFsaWQgc2V0dGluZ3MuICovXG4gIHJlYWRvbmx5IGFsbG93ZWQ6IE9yZ1NldHRpbmdQYXRjaDtcbiAgLyoqXG4gICAqIEZpZWxkIG5hbWVzIHRoZSBjYW5kaWRhdGUgY2FycmllZCB0aGF0IGFyZSBOT1Qgb24gdGhlIGFsbG93bGlzdC4gVEhJUyBpc1xuICAgKiB0aGUgaW5qZWN0aW9uIHNpZ25hbCAocnVsZSAxMCk6IGEgbGVnaXRpbWF0ZSBkcmFmdCBoYXMgbm9uZSwgc28gYSBub24tZW1wdHlcbiAgICogbGlzdCBpcyBhIGNvdW50ZXIgdG8gaW5jcmVtZW50IGFuZCBhIGxpbmUgdG8gbG9nLCBub3QgYSBzaWxlbnQgZHJvcC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZnVzZWQ6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQWxsb3dsaXN0ZWQga2V5cyB3aG9zZSB2YWx1ZSBkaWQgbm90IG1hdGNoIHRoZSBkZWNsYXJlZCBzaGFwZS4gRHJvcHBlZCB0b28sXG4gICAqIGJ1dCByZXBvcnRlZCBzZXBhcmF0ZWx5IOKAlCBhIGJhZCB2YWx1ZSBpcyBhIGRyYWZ0aW5nIG1pc3Rha2UsIG5vdCBhbiBhdHRlbXB0XG4gICAqIHRvIHJlYWNoIGEgZmllbGQgdGhlIGFnZW50IHdhcyBuZXZlciBnaXZlbi5cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWQ6IHJlYWRvbmx5IE9yZ1NldHRpbmdLZXlbXTtcbiAgLyoqIGByZWZ1c2VkLmxlbmd0aGAsIHNvIGEgY2FsbGVyIGNhbiBjb3VudCB3aXRob3V0IHJlLWRlcml2aW5nIGl0LiAqL1xuICByZWFkb25seSByZWZ1c2VkQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBLZWVwIG9ubHkgdGhlIGFsbG93bGlzdGVkLCBzaGFwZS12YWxpZCBmaWVsZHMgb2YgYSBjYW5kaWRhdGUgcHJvcG9zYWwsIGFuZFxuICogcmVwb3J0IGV2ZXJ5dGhpbmcgZHJvcHBlZC5cbiAqXG4gKiBUaGUgcmVzdWx0J3MgYGFsbG93ZWRgIG1hcCBJUyB0aGUgY29tbWl0IHBheWxvYWQgKHJ1bGUgMyk6IHRoZSBjb25maXJtXG4gKiBoYW5kbGVyIHNlbmRzIHRoZXNlIGZpZWxkcyBhbmQgb25seSB0aGVzZSwgc28gYW55dGhpbmcgdGhlIG1vZGVsIHNsaXBwZWQgaW5cbiAqIGlzIHN0cnVjdHVyYWxseSB1bmFwcGxpYWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgdW5yZW5kZXJlZC5cbiAqXG4gKiBgY2FuZGlkYXRlYCBpcyB1bnRydXN0ZWQgbW9kZWwgb3V0cHV0LCBzbyBpdCBpcyByZWFkIGRlZmVuc2l2ZWx5OiBhbnl0aGluZ1xuICogdGhhdCBpcyBub3QgYSBwbGFpbiBvYmplY3QgeWllbGRzIGFuIGVtcHR5IHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tBbGxvd2VkKGNhbmRpZGF0ZTogdW5rbm93bik6IFBpY2tBbGxvd2VkUmVzdWx0IHtcbiAgY29uc3QgYWxsb3dlZDogT3JnU2V0dGluZ1BhdGNoID0ge307XG4gIGNvbnN0IHJlZnVzZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGludmFsaWQ6IE9yZ1NldHRpbmdLZXlbXSA9IFtdO1xuXG4gIGlmIChjYW5kaWRhdGUgJiYgdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNhbmRpZGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IHNwZWMgPSBCWV9LRVkuZ2V0KGtleSk7XG4gICAgICBpZiAoIXNwZWMpIHsgcmVmdXNlZC5wdXNoKGtleSk7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoIWlzVmFsaWRPcmdTZXR0aW5nVmFsdWUoc3BlYywgdmFsdWUpKSB7IGludmFsaWQucHVzaChzcGVjLmtleSk7IGNvbnRpbnVlOyB9XG4gICAgICBhbGxvd2VkW3NwZWMua2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFsbG93ZWQsIHJlZnVzZWQsIGludmFsaWQsIHJlZnVzZWRDb3VudDogcmVmdXNlZC5sZW5ndGggfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpZmYgKyByZXF1ZXN0IHBsYW5uaW5nIChydWxlcyAzIGFuZCA3KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE9uZSByZXZpZXdlZCBjaGFuZ2U6IHdoYXQgdGhlIHNldHRpbmcgaXMgbm93LCBhbmQgd2hhdCBpdCB3b3VsZCBiZWNvbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yZ1NldHRpbmdDaGFuZ2Uge1xuICByZWFkb25seSBzcGVjOiBPcmdTZXR0aW5nU3BlYztcbiAgcmVhZG9ubHkgZnJvbTogT3JnU2V0dGluZ1ZhbHVlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSB0bzogT3JnU2V0dGluZ1ZhbHVlO1xufVxuXG4vKipcbiAqIFRoZSBjaGFuZ2VzIGEgcHJvcG9zYWwgYWN0dWFsbHkgbWFrZXMsIGdpdmVuIHRoZSBDVVJSRU5UIHZhbHVlcy4gQSBmaWVsZFxuICogd2hvc2UgcHJvcG9zZWQgdmFsdWUgYWxyZWFkeSBlcXVhbHMgdGhlIGN1cnJlbnQgb25lIGlzIGRyb3BwZWQg4oCUIGl0IGlzIG5vdCBhXG4gKiBjaGFuZ2UsIGFuZCByZW5kZXJpbmcgaXQgYXMgb25lIG1ha2VzIGEgZGlmZiB0aGUgdXNlciBjYW5ub3QgcmVhZC5cbiAqXG4gKiBUaGUgY29uZmlybSBoYW5kbGVyIHJlLXJ1bnMgdGhpcyBhZ2FpbnN0IGEgRlJFU0ggcmVhZCBpbW1lZGlhdGVseSBiZWZvcmVcbiAqIGNvbW1pdHRpbmcgKHJ1bGUgNyk6IHRoZXNlIHJlY29yZHMgY2Fycnkgbm8gdmVyc2lvbiBjb2x1bW4sIHNvIGlmIHRoZSBsaXN0XG4gKiB0aGF0IGNvbWVzIGJhY2sgZGlmZmVycyBmcm9tIHRoZSBvbmUgdGhlIHVzZXIgYXBwcm92ZWQsIHN0YXRlIG1vdmVkIHVuZGVyIHRoZVxuICogcHJvcG9zYWwgYW5kIHRoZSBjb21taXQgbXVzdCBiZSByZWZ1c2VkIHJhdGhlciB0aGFuIGFwcGxpZWQgYmxpbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmT3JnU2V0dGluZ3MoXG4gIGN1cnJlbnQ6IFJlYWRvbmx5PE9yZ1NldHRpbmdQYXRjaD4sXG4gIHByb3Bvc2VkOiBSZWFkb25seTxPcmdTZXR0aW5nUGF0Y2g+LFxuKTogcmVhZG9ubHkgT3JnU2V0dGluZ0NoYW5nZVtdIHtcbiAgY29uc3QgY2hhbmdlczogT3JnU2V0dGluZ0NoYW5nZVtdID0gW107XG4gIGZvciAoY29uc3Qgc3BlYyBvZiBPUkdfU0VUVElOR19QUk9QT1NBTF9BTExPV0xJU1QpIHtcbiAgICBjb25zdCB0byA9IHByb3Bvc2VkW3NwZWMua2V5XTtcbiAgICBpZiAodG8gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3QgZnJvbSA9IGN1cnJlbnRbc3BlYy5rZXldO1xuICAgIGlmIChmcm9tID09PSB0bykgY29udGludWU7XG4gICAgY2hhbmdlcy5wdXNoKHsgc3BlYywgZnJvbSwgdG8gfSk7XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbi8qKiBPbmUgQVBJIGNhbGwgdGhlIGNvbmZpcm0gaGFuZGxlciBtYWtlczogb25lIHN1cmZhY2UsIG9uZSBib2R5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdTZXR0aW5nUmVxdWVzdCB7XG4gIHJlYWRvbmx5IHN1cmZhY2U6IE9yZ1NldHRpbmdTdXJmYWNlO1xuICByZWFkb25seSBtZXRob2Q6ICdQVVQnO1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcm1pc3Npb246IFBlcm1pc3Npb247XG4gIC8qKiBSZXF1ZXN0IGJvZHk6IHRoZSBBUEkncyBvd24gZmllbGQgbmFtZXMsIGNhcnJ5aW5nIG9ubHkgcmV2aWV3ZWQgdmFsdWVzLiAqL1xuICByZWFkb25seSBib2R5OiBSZWNvcmQ8c3RyaW5nLCBPcmdTZXR0aW5nVmFsdWU+O1xufVxuXG4vKipcbiAqIEdyb3VwIGFwcHJvdmVkIGNoYW5nZXMgaW50byBvbmUgcmVxdWVzdCBwZXIgc3VyZmFjZSwgdHJhbnNsYXRpbmcgcHJvcG9zYWxcbiAqIGtleXMgYmFjayB0byB0aGUgZmllbGQgbmFtZXMgZWFjaCBBUEkgZXhwZWN0cy4gT3JkZXIgZm9sbG93cyB0aGUgYWxsb3dsaXN0LFxuICogc28gdGhlIHNhbWUgcHJvcG9zYWwgYWx3YXlzIHByb2R1Y2VzIHRoZSBzYW1lIGNhbGwgc2VxdWVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcmdTZXR0aW5nUmVxdWVzdHMoY2hhbmdlczogcmVhZG9ubHkgT3JnU2V0dGluZ0NoYW5nZVtdKTogcmVhZG9ubHkgT3JnU2V0dGluZ1JlcXVlc3RbXSB7XG4gIGNvbnN0IGJ5U3VyZmFjZSA9IG5ldyBNYXA8T3JnU2V0dGluZ1N1cmZhY2UsIE9yZ1NldHRpbmdSZXF1ZXN0PigpO1xuICBmb3IgKGNvbnN0IHNwZWMgb2YgT1JHX1NFVFRJTkdfUFJPUE9TQUxfQUxMT1dMSVNUKSB7XG4gICAgY29uc3QgY2hhbmdlID0gY2hhbmdlcy5maW5kKChjKSA9PiBjLnNwZWMua2V5ID09PSBzcGVjLmtleSk7XG4gICAgaWYgKCFjaGFuZ2UpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYnlTdXJmYWNlLmdldChzcGVjLnN1cmZhY2UpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcuYm9keVtzcGVjLmZpZWxkXSA9IGNoYW5nZS50bztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBieVN1cmZhY2Uuc2V0KHNwZWMuc3VyZmFjZSwge1xuICAgICAgc3VyZmFjZTogc3BlYy5zdXJmYWNlLFxuICAgICAgbWV0aG9kOiBzcGVjLmFwaS5tZXRob2QsXG4gICAgICBwYXRoOiBzcGVjLmFwaS5wYXRoLFxuICAgICAgcGVybWlzc2lvbjogc3BlYy5wZXJtaXNzaW9uLFxuICAgICAgYm9keTogeyBbc3BlYy5maWVsZF06IGNoYW5nZS50byB9LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBbLi4uYnlTdXJmYWNlLnZhbHVlcygpXTtcbn1cbiJdfQ==
@@ -0,0 +1,154 @@
1
+ /**
2
+ * What a build's CLASS and SIZE are called, what they cost, and which tier may
3
+ * ask for them (D11/D13).
4
+ *
5
+ * ONE module instead of six tables. The facts used to live in
6
+ * `wire-vocabulary.ts` (the two id lists and the size multipliers),
7
+ * `quota-tiers.ts` (which tier gets which size, and the per-class slot counts)
8
+ * and a hand-maintained mirror of all four in `frontend/src/lib/build-shape.ts`
9
+ * — held together by a test that parsed this package's TypeScript SOURCE with
10
+ * regexes to detect drift. This is the same move `quota-catalog.ts` made for the
11
+ * five frontend label maps, and for the same reason: the browser imports the
12
+ * catalog directly, so there is nothing left to drift.
13
+ *
14
+ * DEPENDENCY-FREE, and that is a constraint rather than a happy accident. Only
15
+ * type-only imports, which are erased, so this module loads in a browser; the
16
+ * moment it reads an env var it stops being importable by the frontend and the
17
+ * mirror comes back. Everything here is therefore a DEFAULT. The env overlay
18
+ * (`PLUGIN_MAX_BUILDS_<TIER>_<CLASS>`, `PLUGIN_BUILDKIT_ADDR_SIZE_<SUFFIX>`)
19
+ * lives server-side, which is the same split the tier presets already use: a
20
+ * hardcoded fallback plus a `/config` overlay.
21
+ *
22
+ * IDS ARE ARITHMETIC, LABELS ARE WORDS. `0.5x` carries its own multiplier, so
23
+ * `buildSizeMultiplier` is checkable by eye and the credit math is
24
+ * self-documenting; `Small` / `Standard` / `Medium` / `Large` / `X-Large` is what
25
+ * a person reads. Keeping them separate is also what makes a rename cheap: a
26
+ * label is one line here, with no wire value, Redis key, metric label or ledger
27
+ * string to migrate.
28
+ */
29
+ import type { QuotaTier } from './quota-tiers.js';
30
+ /**
31
+ * `flexible` rather than `batch`, `deferred` or `small`.
32
+ *
33
+ * It names what the CUSTOMER trades — a flexible start time — instead of what
34
+ * the platform does with it, and it does not read as a demotion: this class is
35
+ * available on every tier including free, and `deferred` sounds broken while
36
+ * `low priority` sounds like a penalty. `small` was rejected outright because it
37
+ * is a magnitude word on a latency dimension — `{ buildClass: 'small',
38
+ * buildSize: '2x' }` is legal and unreadable.
39
+ */
40
+ export declare const BUILD_CLASSES: readonly ['standard', 'flexible'];
41
+ export type BuildClass = (typeof BUILD_CLASSES)[number];
42
+ export interface BuildClassMeta {
43
+ /** What a person reads. */
44
+ label: string;
45
+ /** The trade, said in one line beside the control. */
46
+ blurb: string;
47
+ /**
48
+ * In-flight builds one ORG may hold in this class, per tier — the DEFAULT for
49
+ * `PLUGIN_MAX_BUILDS_<TIER>_<CLASS>`.
50
+ *
51
+ * Graded by tier rather than one flat figure: a single figure gave a Developer
52
+ * org the same three in-flight builds as an Enterprise one, which made the
53
+ * per-org semaphore the one place in the build path that ignored what the
54
+ * tenant pays for. `flexible` has more headroom than `standard` on every row,
55
+ * because the cheap class is where the room has to be for it to smooth
56
+ * anything — a row where they were equal would make the class pointless to
57
+ * choose.
58
+ */
59
+ slotsByTier: Readonly<Record<QuotaTier, number>>;
60
+ }
61
+ export declare const BUILD_CLASS_CATALOG: Readonly<Record<BuildClass, BuildClassMeta>>;
62
+ export declare const BUILD_SIZES: readonly ['0.5x', '1x', '2x', '4x', '8x'];
63
+ export type BuildSize = (typeof BUILD_SIZES)[number];
64
+ export interface BuildSizeMeta {
65
+ /** What a person reads: Small … X-Large. */
66
+ label: string;
67
+ /** vCPU relative to the deployment's base figure, and the credit rate. */
68
+ multiplier: number;
69
+ /**
70
+ * Lowest tier that may REQUEST this size; `null` means every tier may.
71
+ *
72
+ * One field per size rather than a row per tier, and that makes the ladder's
73
+ * monotonicity STRUCTURAL: a row-per-tier table can express "Team has 4x but
74
+ * Business does not" and needed a test to forbid it. This shape cannot.
75
+ */
76
+ minTier: QuotaTier | null;
77
+ /**
78
+ * The class this size pairs with unless the caller says otherwise.
79
+ *
80
+ * Why `0.5x` defaults to `flexible`: a half-speed build takes roughly twice as
81
+ * long and therefore HOLDS ITS SLOT twice as long. On Developer — one standard
82
+ * slot — one cheap build would block the only urgent-fix slot for double the
83
+ * time. Defaulting it to the class with three slots means it cannot.
84
+ */
85
+ defaultClass: BuildClass;
86
+ /**
87
+ * Suffix of this size's buildkitd pool override
88
+ * (`PLUGIN_BUILDKIT_ADDR_SIZE_<SUFFIX>`).
89
+ *
90
+ * Declared rather than derived from the id, because deriving it produces
91
+ * ILLEGAL NAMES: `'0.5x'.toUpperCase()` gives `0.5X` and a dot cannot appear in
92
+ * an environment variable name (the same reason `x-large` was rejected as an
93
+ * id — `..._X-LARGE` is not an identifier either).
94
+ */
95
+ envSuffix: string;
96
+ }
97
+ /**
98
+ * The size ladder.
99
+ *
100
+ * A size is a BIGGER DAEMON, not a flag: `buildctl` has no per-build CPU option,
101
+ * because the CPU a build may use is the buildkitd POD's limit. So every rung
102
+ * above or below `1x` needs a pool of its own, and a rung with no pool is
103
+ * REFUSED rather than silently served at `1x` — in both directions. Serving
104
+ * `4x` from the shared daemon would charge four times for one times the speed;
105
+ * serving `0.5x` from it would hand every tenant full speed at half price.
106
+ */
107
+ export declare const BUILD_SIZE_CATALOG: Readonly<Record<BuildSize, BuildSizeMeta>>;
108
+ /**
109
+ * The tier ladder, ascending, for evaluating {@link BuildSizeMeta.minTier}.
110
+ *
111
+ * Declared here because a dependency-free module cannot import `VALID_TIERS` (it
112
+ * is derived from the env-reading tier table). `unlimited` sits at the top so
113
+ * the no-billing install gates nothing — a gate there would invent a limit the
114
+ * operator never bought into. Pinned against the `QuotaTier` union by a test.
115
+ */
116
+ export declare const BUILD_TIER_LADDER: readonly QuotaTier[];
117
+ /** This size's credit/vCPU multiplier; `1` for anything unrecognised. */
118
+ export declare function buildSizeMultiplier(size: string): number;
119
+ /** `Small` … `X-Large`; the raw id for anything unrecognised. */
120
+ export declare function buildSizeLabel(size: string): string;
121
+ /** `Standard` / `Flexible`; the raw id for anything unrecognised. */
122
+ export declare function buildClassLabel(buildClass: string): string;
123
+ /**
124
+ * Env-var suffix of this size's buildkitd pool override.
125
+ *
126
+ * Declared in the catalog rather than derived, because deriving it produces
127
+ * ILLEGAL NAMES: `'0.5x'.toUpperCase()` is `0.5X`, and a dot cannot appear in an
128
+ * environment variable name. (It is the same reason `x-large` was rejected as an
129
+ * id — `..._X-LARGE` is not an identifier either.) Falls back to `1X`, the
130
+ * shared daemon, for an unrecognised size.
131
+ */
132
+ export declare function buildSizeEnvSuffix(size: string): string;
133
+ /** The class this size runs in unless the caller overrides it. */
134
+ export declare function defaultClassForSize(size: string): BuildClass;
135
+ /**
136
+ * How much longer a build at this size may run before the timeout kills it.
137
+ *
138
+ * Scales UP below `1x` and never down above it, and the asymmetry is the point:
139
+ * the timeout is a SAFETY bound on a runaway build, not a budget. At half the
140
+ * vCPU a ten-minute build becomes about twenty and would die on a 15-minute
141
+ * bound — so Small would quietly fail long builds (as a `retryable` failure, so
142
+ * the tenant is not charged, but it is retried twice and dead-lettered). Scaling
143
+ * it DOWN at `4x` would instead break I/O-bound builds that gain nothing from
144
+ * the extra CPU.
145
+ */
146
+ export declare function buildTimeoutFactor(size: string): number;
147
+ /** In-flight builds one org on `tier` may hold in `buildClass` (the default). */
148
+ export declare function buildSlotsFor(tier: QuotaTier, buildClass: BuildClass): number;
149
+ /** Both classes' slot counts for one tier — the per-tier reading the UI wants. */
150
+ export declare function buildSlotsByClass(tier: QuotaTier): Readonly<Record<BuildClass, number>>;
151
+ /** Whether `tier` may request `size`. */
152
+ export declare function tierAllowsBuildSize(tier: QuotaTier, size: string): boolean;
153
+ /** Every size `tier` may request, ascending. */
154
+ export declare function buildSizesForTier(tier: QuotaTier): readonly BuildSize[];
@@ -0,0 +1,158 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // ---------------------------------------------------------------------------
4
+ // Scheduling class — WHEN a build starts
5
+ // ---------------------------------------------------------------------------
6
+ /**
7
+ * `flexible` rather than `batch`, `deferred` or `small`.
8
+ *
9
+ * It names what the CUSTOMER trades — a flexible start time — instead of what
10
+ * the platform does with it, and it does not read as a demotion: this class is
11
+ * available on every tier including free, and `deferred` sounds broken while
12
+ * `low priority` sounds like a penalty. `small` was rejected outright because it
13
+ * is a magnitude word on a latency dimension — `{ buildClass: 'small',
14
+ * buildSize: '2x' }` is legal and unreadable.
15
+ */
16
+ export const BUILD_CLASSES = ['standard', 'flexible'];
17
+ export const BUILD_CLASS_CATALOG = {
18
+ standard: {
19
+ label: 'Standard',
20
+ blurb: 'Starts as soon as a slot is free. Use it for anything you are waiting on.',
21
+ slotsByTier: {
22
+ developer: 1,
23
+ pro: 2,
24
+ team: 3,
25
+ business: 5,
26
+ enterprise: 8,
27
+ // Billing disabled: nothing is capped, so the ceiling is the pool itself.
28
+ unlimited: 8,
29
+ },
30
+ },
31
+ flexible: {
32
+ label: 'Flexible',
33
+ blurb: 'Starts later, in exchange for more builds at once. Same cost per build.',
34
+ slotsByTier: {
35
+ developer: 3,
36
+ pro: 4,
37
+ team: 6,
38
+ business: 10,
39
+ enterprise: 16,
40
+ unlimited: 16,
41
+ },
42
+ },
43
+ };
44
+ // ---------------------------------------------------------------------------
45
+ // Machine size — HOW MUCH CPU a build gets
46
+ // ---------------------------------------------------------------------------
47
+ export const BUILD_SIZES = ['0.5x', '1x', '2x', '4x', '8x'];
48
+ /**
49
+ * The size ladder.
50
+ *
51
+ * A size is a BIGGER DAEMON, not a flag: `buildctl` has no per-build CPU option,
52
+ * because the CPU a build may use is the buildkitd POD's limit. So every rung
53
+ * above or below `1x` needs a pool of its own, and a rung with no pool is
54
+ * REFUSED rather than silently served at `1x` — in both directions. Serving
55
+ * `4x` from the shared daemon would charge four times for one times the speed;
56
+ * serving `0.5x` from it would hand every tenant full speed at half price.
57
+ */
58
+ export const BUILD_SIZE_CATALOG = {
59
+ // Available to EVERY tier, deliberately. It is a budget option, not a
60
+ // restriction: the free tier gains a real choice (spend less) instead of a
61
+ // list of locks. The arithmetic is honest in one direction — a CPU-bound build
62
+ // takes twice as long at half the vCPU and costs the SAME, while an I/O-bound
63
+ // one costs about half. So Small can never cost more than Standard, and can
64
+ // cost half (assuming slowdown is at most linear, which memory pressure can
65
+ // break).
66
+ '0.5x': { label: 'Small', multiplier: 0.5, minTier: null, defaultClass: 'flexible', envSuffix: 'HALF' },
67
+ '1x': { label: 'Standard', multiplier: 1, minTier: null, defaultClass: 'standard', envSuffix: '1X' },
68
+ '2x': { label: 'Medium', multiplier: 2, minTier: 'team', defaultClass: 'standard', envSuffix: '2X' },
69
+ '4x': { label: 'Large', multiplier: 4, minTier: 'business', defaultClass: 'standard', envSuffix: '4X' },
70
+ '8x': { label: 'X-Large', multiplier: 8, minTier: 'enterprise', defaultClass: 'standard', envSuffix: '8X' },
71
+ };
72
+ /**
73
+ * The tier ladder, ascending, for evaluating {@link BuildSizeMeta.minTier}.
74
+ *
75
+ * Declared here because a dependency-free module cannot import `VALID_TIERS` (it
76
+ * is derived from the env-reading tier table). `unlimited` sits at the top so
77
+ * the no-billing install gates nothing — a gate there would invent a limit the
78
+ * operator never bought into. Pinned against the `QuotaTier` union by a test.
79
+ */
80
+ export const BUILD_TIER_LADDER = [
81
+ 'developer', 'pro', 'team', 'business', 'enterprise', 'unlimited',
82
+ ];
83
+ // ---------------------------------------------------------------------------
84
+ // Accessors
85
+ // ---------------------------------------------------------------------------
86
+ /** This size's credit/vCPU multiplier; `1` for anything unrecognised. */
87
+ export function buildSizeMultiplier(size) {
88
+ return BUILD_SIZE_CATALOG[size]?.multiplier ?? 1;
89
+ }
90
+ /** `Small` … `X-Large`; the raw id for anything unrecognised. */
91
+ export function buildSizeLabel(size) {
92
+ return BUILD_SIZE_CATALOG[size]?.label ?? size;
93
+ }
94
+ /** `Standard` / `Flexible`; the raw id for anything unrecognised. */
95
+ export function buildClassLabel(buildClass) {
96
+ return BUILD_CLASS_CATALOG[buildClass]?.label ?? buildClass;
97
+ }
98
+ /**
99
+ * Env-var suffix of this size's buildkitd pool override.
100
+ *
101
+ * Declared in the catalog rather than derived, because deriving it produces
102
+ * ILLEGAL NAMES: `'0.5x'.toUpperCase()` is `0.5X`, and a dot cannot appear in an
103
+ * environment variable name. (It is the same reason `x-large` was rejected as an
104
+ * id — `..._X-LARGE` is not an identifier either.) Falls back to `1X`, the
105
+ * shared daemon, for an unrecognised size.
106
+ */
107
+ export function buildSizeEnvSuffix(size) {
108
+ return BUILD_SIZE_CATALOG[size]?.envSuffix ?? '1X';
109
+ }
110
+ /** The class this size runs in unless the caller overrides it. */
111
+ export function defaultClassForSize(size) {
112
+ return BUILD_SIZE_CATALOG[size]?.defaultClass ?? 'standard';
113
+ }
114
+ /**
115
+ * How much longer a build at this size may run before the timeout kills it.
116
+ *
117
+ * Scales UP below `1x` and never down above it, and the asymmetry is the point:
118
+ * the timeout is a SAFETY bound on a runaway build, not a budget. At half the
119
+ * vCPU a ten-minute build becomes about twenty and would die on a 15-minute
120
+ * bound — so Small would quietly fail long builds (as a `retryable` failure, so
121
+ * the tenant is not charged, but it is retried twice and dead-lettered). Scaling
122
+ * it DOWN at `4x` would instead break I/O-bound builds that gain nothing from
123
+ * the extra CPU.
124
+ */
125
+ export function buildTimeoutFactor(size) {
126
+ return Math.max(1, 1 / buildSizeMultiplier(size));
127
+ }
128
+ /** In-flight builds one org on `tier` may hold in `buildClass` (the default). */
129
+ export function buildSlotsFor(tier, buildClass) {
130
+ const meta = BUILD_CLASS_CATALOG[buildClass] ?? BUILD_CLASS_CATALOG.standard;
131
+ return meta.slotsByTier[tier] ?? meta.slotsByTier.developer;
132
+ }
133
+ /** Both classes' slot counts for one tier — the per-tier reading the UI wants. */
134
+ export function buildSlotsByClass(tier) {
135
+ return {
136
+ standard: buildSlotsFor(tier, 'standard'),
137
+ flexible: buildSlotsFor(tier, 'flexible'),
138
+ };
139
+ }
140
+ /** Whether `tier` may request `size`. */
141
+ export function tierAllowsBuildSize(tier, size) {
142
+ const meta = BUILD_SIZE_CATALOG[size];
143
+ if (!meta)
144
+ return false;
145
+ if (meta.minTier === null)
146
+ return true;
147
+ const have = BUILD_TIER_LADDER.indexOf(tier);
148
+ // An unrecognised tier gets the FLOOR of the ladder — the smallest allowance,
149
+ // never everything. Same conservative call `tierForQueueName` makes.
150
+ if (have < 0)
151
+ return false;
152
+ return have >= BUILD_TIER_LADDER.indexOf(meta.minTier);
153
+ }
154
+ /** Every size `tier` may request, ascending. */
155
+ export function buildSizesForTier(tier) {
156
+ return BUILD_SIZES.filter((s) => tierAllowsBuildSize(tier, s));
157
+ }
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9idWlsZC1jYXRhbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFpQ3RDLDhFQUE4RTtBQUM5RSx5Q0FBeUM7QUFDekMsOEVBQThFO0FBRTlFOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQVUsQ0FBQztBQXVCL0QsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlEO0lBQy9FLFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRSxVQUFVO1FBQ2pCLEtBQUssRUFBRSwyRUFBMkU7UUFDbEYsV0FBVyxFQUFFO1lBQ1gsU0FBUyxFQUFFLENBQUM7WUFDWixHQUFHLEVBQUUsQ0FBQztZQUNOLElBQUksRUFBRSxDQUFDO1lBQ1AsUUFBUSxFQUFFLENBQUM7WUFDWCxVQUFVLEVBQUUsQ0FBQztZQUNiLDBFQUEwRTtZQUMxRSxTQUFTLEVBQUUsQ0FBQztTQUNiO0tBQ0Y7SUFDRCxRQUFRLEVBQUU7UUFDUixLQUFLLEVBQUUsVUFBVTtRQUNqQixLQUFLLEVBQUUseUVBQXlFO1FBQ2hGLFdBQVcsRUFBRTtZQUNYLFNBQVMsRUFBRSxDQUFDO1lBQ1osR0FBRyxFQUFFLENBQUM7WUFDTixJQUFJLEVBQUUsQ0FBQztZQUNQLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLEVBQUU7WUFDZCxTQUFTLEVBQUUsRUFBRTtTQUNkO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsOEVBQThFO0FBQzlFLDJDQUEyQztBQUMzQyw4RUFBOEU7QUFFOUUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBVSxDQUFDO0FBcUNyRTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMs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QUFDOUQsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBZTtJQUMvQyxPQUFPO1FBQ0wsUUFBUSxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDO1FBQ3pDLFFBQVEsRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQztLQUMxQyxDQUFDO0FBQ0osQ0FBQztBQUVELHlDQUF5QztBQUN6QyxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFBZSxFQUFFLElBQVk7SUFDL0QsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBaUIsQ0FBQyxDQUFDO0lBQ25ELElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsOEVBQThFO0lBQzlFLHFFQUFxRTtJQUNyRSxJQUFJLElBQUksR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0IsT0FBTyxJQUFJLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsZ0RBQWdEO0FBQ2hELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFlO0lBQy9DLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFdoYXQgYSBidWlsZCdzIENMQVNTIGFuZCBTSVpFIGFyZSBjYWxsZWQsIHdoYXQgdGhleSBjb3N0LCBhbmQgd2hpY2ggdGllciBtYXlcbiAqIGFzayBmb3IgdGhlbSAoRDExL0QxMykuXG4gKlxuICogT05FIG1vZHVsZSBpbnN0ZWFkIG9mIHNpeCB0YWJsZXMuIFRoZSBmYWN0cyB1c2VkIHRvIGxpdmUgaW5cbiAqIGB3aXJlLXZvY2FidWxhcnkudHNgICh0aGUgdHdvIGlkIGxpc3RzIGFuZCB0aGUgc2l6ZSBtdWx0aXBsaWVycyksXG4gKiBgcXVvdGEtdGllcnMudHNgICh3aGljaCB0aWVyIGdldHMgd2hpY2ggc2l6ZSwgYW5kIHRoZSBwZXItY2xhc3Mgc2xvdCBjb3VudHMpXG4gKiBhbmQgYSBoYW5kLW1haW50YWluZWQgbWlycm9yIG9mIGFsbCBmb3VyIGluIGBmcm9udGVuZC9zcmMvbGliL2J1aWxkLXNoYXBlLnRzYFxuICog4oCUIGhlbGQgdG9nZXRoZXIgYnkgYSB0ZXN0IHRoYXQgcGFyc2VkIHRoaXMgcGFja2FnZSdzIFR5cGVTY3JpcHQgU09VUkNFIHdpdGhcbiAqIHJlZ2V4ZXMgdG8gZGV0ZWN0IGRyaWZ0LiBUaGlzIGlzIHRoZSBzYW1lIG1vdmUgYHF1b3RhLWNhdGFsb2cudHNgIG1hZGUgZm9yIHRoZVxuICogZml2ZSBmcm9udGVuZCBsYWJlbCBtYXBzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogdGhlIGJyb3dzZXIgaW1wb3J0cyB0aGVcbiAqIGNhdGFsb2cgZGlyZWN0bHksIHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkcmlmdC5cbiAqXG4gKiBERVBFTkRFTkNZLUZSRUUsIGFuZCB0aGF0IGlzIGEgY29uc3RyYWludCByYXRoZXIgdGhhbiBhIGhhcHB5IGFjY2lkZW50LiBPbmx5XG4gKiB0eXBlLW9ubHkgaW1wb3J0cywgd2hpY2ggYXJlIGVyYXNlZCwgc28gdGhpcyBtb2R1bGUgbG9hZHMgaW4gYSBicm93c2VyOyB0aGVcbiAqIG1vbWVudCBpdCByZWFkcyBhbiBlbnYgdmFyIGl0IHN0b3BzIGJlaW5nIGltcG9ydGFibGUgYnkgdGhlIGZyb250ZW5kIGFuZCB0aGVcbiAqIG1pcnJvciBjb21lcyBiYWNrLiBFdmVyeXRoaW5nIGhlcmUgaXMgdGhlcmVmb3JlIGEgREVGQVVMVC4gVGhlIGVudiBvdmVybGF5XG4gKiAoYFBMVUdJTl9NQVhfQlVJTERTXzxUSUVSPl88Q0xBU1M+YCwgYFBMVUdJTl9CVUlMREtJVF9BRERSX1NJWkVfPFNVRkZJWD5gKVxuICogbGl2ZXMgc2VydmVyLXNpZGUsIHdoaWNoIGlzIHRoZSBzYW1lIHNwbGl0IHRoZSB0aWVyIHByZXNldHMgYWxyZWFkeSB1c2U6IGFcbiAqIGhhcmRjb2RlZCBmYWxsYmFjayBwbHVzIGEgYC9jb25maWdgIG92ZXJsYXkuXG4gKlxuICogSURTIEFSRSBBUklUSE1FVElDLCBMQUJFTFMgQVJFIFdPUkRTLiBgMC41eGAgY2FycmllcyBpdHMgb3duIG11bHRpcGxpZXIsIHNvXG4gKiBgYnVpbGRTaXplTXVsdGlwbGllcmAgaXMgY2hlY2thYmxlIGJ5IGV5ZSBhbmQgdGhlIGNyZWRpdCBtYXRoIGlzXG4gKiBzZWxmLWRvY3VtZW50aW5nOyBgU21hbGxgIC8gYFN0YW5kYXJkYCAvIGBNZWRpdW1gIC8gYExhcmdlYCAvIGBYLUxhcmdlYCBpcyB3aGF0XG4gKiBhIHBlcnNvbiByZWFkcy4gS2VlcGluZyB0aGVtIHNlcGFyYXRlIGlzIGFsc28gd2hhdCBtYWtlcyBhIHJlbmFtZSBjaGVhcDogYVxuICogbGFiZWwgaXMgb25lIGxpbmUgaGVyZSwgd2l0aCBubyB3aXJlIHZhbHVlLCBSZWRpcyBrZXksIG1ldHJpYyBsYWJlbCBvciBsZWRnZXJcbiAqIHN0cmluZyB0byBtaWdyYXRlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUXVvdGFUaWVyIH0gZnJvbSAnLi9xdW90YS10aWVycy5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2NoZWR1bGluZyBjbGFzcyDigJQgV0hFTiBhIGJ1aWxkIHN0YXJ0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogYGZsZXhpYmxlYCByYXRoZXIgdGhhbiBgYmF0Y2hgLCBgZGVmZXJyZWRgIG9yIGBzbWFsbGAuXG4gKlxuICogSXQgbmFtZXMgd2hhdCB0aGUgQ1VTVE9NRVIgdHJhZGVzIOKAlCBhIGZsZXhpYmxlIHN0YXJ0IHRpbWUg4oCUIGluc3RlYWQgb2Ygd2hhdFxuICogdGhlIHBsYXRmb3JtIGRvZXMgd2l0aCBpdCwgYW5kIGl0IGRvZXMgbm90IHJlYWQgYXMgYSBkZW1vdGlvbjogdGhpcyBjbGFzcyBpc1xuICogYXZhaWxhYmxlIG9uIGV2ZXJ5IHRpZXIgaW5jbHVkaW5nIGZyZWUsIGFuZCBgZGVmZXJyZWRgIHNvdW5kcyBicm9rZW4gd2hpbGVcbiAqIGBsb3cgcHJpb3JpdHlgIHNvdW5kcyBsaWtlIGEgcGVuYWx0eS4gYHNtYWxsYCB3YXMgcmVqZWN0ZWQgb3V0cmlnaHQgYmVjYXVzZSBpdFxuICogaXMgYSBtYWduaXR1ZGUgd29yZCBvbiBhIGxhdGVuY3kgZGltZW5zaW9uIOKAlCBgeyBidWlsZENsYXNzOiAnc21hbGwnLFxuICogYnVpbGRTaXplOiAnMngnIH1gIGlzIGxlZ2FsIGFuZCB1bnJlYWRhYmxlLlxuICovXG5leHBvcnQgY29uc3QgQlVJTERfQ0xBU1NFUyA9IFsnc3RhbmRhcmQnLCAnZmxleGlibGUnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEJ1aWxkQ2xhc3MgPSAodHlwZW9mIEJVSUxEX0NMQVNTRVMpW251bWJlcl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRDbGFzc01ldGEge1xuICAvKiogV2hhdCBhIHBlcnNvbiByZWFkcy4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFRoZSB0cmFkZSwgc2FpZCBpbiBvbmUgbGluZSBiZXNpZGUgdGhlIGNvbnRyb2wuICovXG4gIGJsdXJiOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbi1mbGlnaHQgYnVpbGRzIG9uZSBPUkcgbWF5IGhvbGQgaW4gdGhpcyBjbGFzcywgcGVyIHRpZXIg4oCUIHRoZSBERUZBVUxUIGZvclxuICAgKiBgUExVR0lOX01BWF9CVUlMRFNfPFRJRVI+XzxDTEFTUz5gLlxuICAgKlxuICAgKiBHcmFkZWQgYnkgdGllciByYXRoZXIgdGhhbiBvbmUgZmxhdCBmaWd1cmU6IGEgc2luZ2xlIGZpZ3VyZSBnYXZlIGEgRGV2ZWxvcGVyXG4gICAqIG9yZyB0aGUgc2FtZSB0aHJlZSBpbi1mbGlnaHQgYnVpbGRzIGFzIGFuIEVudGVycHJpc2Ugb25lLCB3aGljaCBtYWRlIHRoZVxuICAgKiBwZXItb3JnIHNlbWFwaG9yZSB0aGUgb25lIHBsYWNlIGluIHRoZSBidWlsZCBwYXRoIHRoYXQgaWdub3JlZCB3aGF0IHRoZVxuICAgKiB0ZW5hbnQgcGF5cyBmb3IuIGBmbGV4aWJsZWAgaGFzIG1vcmUgaGVhZHJvb20gdGhhbiBgc3RhbmRhcmRgIG9uIGV2ZXJ5IHJvdyxcbiAgICogYmVjYXVzZSB0aGUgY2hlYXAgY2xhc3MgaXMgd2hlcmUgdGhlIHJvb20gaGFzIHRvIGJlIGZvciBpdCB0byBzbW9vdGhcbiAgICogYW55dGhpbmcg4oCUIGEgcm93IHdoZXJlIHRoZXkgd2VyZSBlcXVhbCB3b3VsZCBtYWtlIHRoZSBjbGFzcyBwb2ludGxlc3MgdG9cbiAgICogY2hvb3NlLlxuICAgKi9cbiAgc2xvdHNCeVRpZXI6IFJlYWRvbmx5PFJlY29yZDxRdW90YVRpZXIsIG51bWJlcj4+O1xufVxuXG5leHBvcnQgY29uc3QgQlVJTERfQ0xBU1NfQ0FUQUxPRzogUmVhZG9ubHk8UmVjb3JkPEJ1aWxkQ2xhc3MsIEJ1aWxkQ2xhc3NNZXRhPj4gPSB7XG4gIHN0YW5kYXJkOiB7XG4gICAgbGFiZWw6ICdTdGFuZGFyZCcsXG4gICAgYmx1cmI6ICdTdGFydHMgYXMgc29vbiBhcyBhIHNsb3QgaXMgZnJlZS4gVXNlIGl0IGZvciBhbnl0aGluZyB5b3UgYXJlIHdhaXRpbmcgb24uJyxcbiAgICBzbG90c0J5VGllcjoge1xuICAgICAgZGV2ZWxvcGVyOiAxLFxuICAgICAgcHJvOiAyLFxuICAgICAgdGVhbTogMyxcbiAgICAgIGJ1c2luZXNzOiA1LFxuICAgICAgZW50ZXJwcmlzZTogOCxcbiAgICAgIC8vIEJpbGxpbmcgZGlzYWJsZWQ6IG5vdGhpbmcgaXMgY2FwcGVkLCBzbyB0aGUgY2VpbGluZyBpcyB0aGUgcG9vbCBpdHNlbGYuXG4gICAgICB1bmxpbWl0ZWQ6IDgsXG4gICAgfSxcbiAgfSxcbiAgZmxleGlibGU6IHtcbiAgICBsYWJlbDogJ0ZsZXhpYmxlJyxcbiAgICBibHVyYjogJ1N0YXJ0cyBsYXRlciwgaW4gZXhjaGFuZ2UgZm9yIG1vcmUgYnVpbGRzIGF0IG9uY2UuIFNhbWUgY29zdCBwZXIgYnVpbGQuJyxcbiAgICBzbG90c0J5VGllcjoge1xuICAgICAgZGV2ZWxvcGVyOiAzLFxuICAgICAgcHJvOiA0LFxuICAgICAgdGVhbTogNixcbiAgICAgIGJ1c2luZXNzOiAxMCxcbiAgICAgIGVudGVycHJpc2U6IDE2LFxuICAgICAgdW5saW1pdGVkOiAxNixcbiAgICB9LFxuICB9LFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNYWNoaW5lIHNpemUg4oCUIEhPVyBNVUNIIENQVSBhIGJ1aWxkIGdldHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgQlVJTERfU0laRVMgPSBbJzAuNXgnLCAnMXgnLCAnMngnLCAnNHgnLCAnOHgnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEJ1aWxkU2l6ZSA9ICh0eXBlb2YgQlVJTERfU0laRVMpW251bWJlcl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRTaXplTWV0YSB7XG4gIC8qKiBXaGF0IGEgcGVyc29uIHJlYWRzOiBTbWFsbCDigKYgWC1MYXJnZS4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIHZDUFUgcmVsYXRpdmUgdG8gdGhlIGRlcGxveW1lbnQncyBiYXNlIGZpZ3VyZSwgYW5kIHRoZSBjcmVkaXQgcmF0ZS4gKi9cbiAgbXVsdGlwbGllcjogbnVtYmVyO1xuICAvKipcbiAgICogTG93ZXN0IHRpZXIgdGhhdCBtYXkgUkVRVUVTVCB0aGlzIHNpemU7IGBudWxsYCBtZWFucyBldmVyeSB0aWVyIG1heS5cbiAgICpcbiAgICogT25lIGZpZWxkIHBlciBzaXplIHJhdGhlciB0aGFuIGEgcm93IHBlciB0aWVyLCBhbmQgdGhhdCBtYWtlcyB0aGUgbGFkZGVyJ3NcbiAgICogbW9ub3RvbmljaXR5IFNUUlVDVFVSQUw6IGEgcm93LXBlci10aWVyIHRhYmxlIGNhbiBleHByZXNzIFwiVGVhbSBoYXMgNHggYnV0XG4gICAqIEJ1c2luZXNzIGRvZXMgbm90XCIgYW5kIG5lZWRlZCBhIHRlc3QgdG8gZm9yYmlkIGl0LiBUaGlzIHNoYXBlIGNhbm5vdC5cbiAgICovXG4gIG1pblRpZXI6IFF1b3RhVGllciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgY2xhc3MgdGhpcyBzaXplIHBhaXJzIHdpdGggdW5sZXNzIHRoZSBjYWxsZXIgc2F5cyBvdGhlcndpc2UuXG4gICAqXG4gICAqIFdoeSBgMC41eGAgZGVmYXVsdHMgdG8gYGZsZXhpYmxlYDogYSBoYWxmLXNwZWVkIGJ1aWxkIHRha2VzIHJvdWdobHkgdHdpY2UgYXNcbiAgICogbG9uZyBhbmQgdGhlcmVmb3JlIEhPTERTIElUUyBTTE9UIHR3aWNlIGFzIGxvbmcuIE9uIERldmVsb3BlciDigJQgb25lIHN0YW5kYXJkXG4gICAqIHNsb3Qg4oCUIG9uZSBjaGVhcCBidWlsZCB3b3VsZCBibG9jayB0aGUgb25seSB1cmdlbnQtZml4IHNsb3QgZm9yIGRvdWJsZSB0aGVcbiAgICogdGltZS4gRGVmYXVsdGluZyBpdCB0byB0aGUgY2xhc3Mgd2l0aCB0aHJlZSBzbG90cyBtZWFucyBpdCBjYW5ub3QuXG4gICAqL1xuICBkZWZhdWx0Q2xhc3M6IEJ1aWxkQ2xhc3M7XG4gIC8qKlxuICAgKiBTdWZmaXggb2YgdGhpcyBzaXplJ3MgYnVpbGRraXRkIHBvb2wgb3ZlcnJpZGVcbiAgICogKGBQTFVHSU5fQlVJTERLSVRfQUREUl9TSVpFXzxTVUZGSVg+YCkuXG4gICAqXG4gICAqIERlY2xhcmVkIHJhdGhlciB0aGFuIGRlcml2ZWQgZnJvbSB0aGUgaWQsIGJlY2F1c2UgZGVyaXZpbmcgaXQgcHJvZHVjZXNcbiAgICogSUxMRUdBTCBOQU1FUzogYCcwLjV4Jy50b1VwcGVyQ2FzZSgpYCBnaXZlcyBgMC41WGAgYW5kIGEgZG90IGNhbm5vdCBhcHBlYXIgaW5cbiAgICogYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSAodGhlIHNhbWUgcmVhc29uIGB4LWxhcmdlYCB3YXMgcmVqZWN0ZWQgYXMgYW5cbiAgICogaWQg4oCUIGAuLi5fWC1MQVJHRWAgaXMgbm90IGFuIGlkZW50aWZpZXIgZWl0aGVyKS5cbiAgICovXG4gIGVudlN1ZmZpeDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzaXplIGxhZGRlci5cbiAqXG4gKiBBIHNpemUgaXMgYSBCSUdHRVIgREFFTU9OLCBub3QgYSBmbGFnOiBgYnVpbGRjdGxgIGhhcyBubyBwZXItYnVpbGQgQ1BVIG9wdGlvbixcbiAqIGJlY2F1c2UgdGhlIENQVSBhIGJ1aWxkIG1heSB1c2UgaXMgdGhlIGJ1aWxka2l0ZCBQT0QncyBsaW1pdC4gU28gZXZlcnkgcnVuZ1xuICogYWJvdmUgb3IgYmVsb3cgYDF4YCBuZWVkcyBhIHBvb2wgb2YgaXRzIG93biwgYW5kIGEgcnVuZyB3aXRoIG5vIHBvb2wgaXNcbiAqIFJFRlVTRUQgcmF0aGVyIHRoYW4gc2lsZW50bHkgc2VydmVkIGF0IGAxeGAg4oCUIGluIGJvdGggZGlyZWN0aW9ucy4gU2VydmluZ1xuICogYDR4YCBmcm9tIHRoZSBzaGFyZWQgZGFlbW9uIHdvdWxkIGNoYXJnZSBmb3VyIHRpbWVzIGZvciBvbmUgdGltZXMgdGhlIHNwZWVkO1xuICogc2VydmluZyBgMC41eGAgZnJvbSBpdCB3b3VsZCBoYW5kIGV2ZXJ5IHRlbmFudCBmdWxsIHNwZWVkIGF0IGhhbGYgcHJpY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBCVUlMRF9TSVpFX0NBVEFMT0c6IFJlYWRvbmx5PFJlY29yZDxCdWlsZFNpemUsIEJ1aWxkU2l6ZU1ldGE+PiA9IHtcbiAgLy8gQXZhaWxhYmxlIHRvIEVWRVJZIHRpZXIsIGRlbGliZXJhdGVseS4gSXQgaXMgYSBidWRnZXQgb3B0aW9uLCBub3QgYVxuICAvLyByZXN0cmljdGlvbjogdGhlIGZyZWUgdGllciBnYWlucyBhIHJlYWwgY2hvaWNlIChzcGVuZCBsZXNzKSBpbnN0ZWFkIG9mIGFcbiAgLy8gbGlzdCBvZiBsb2Nrcy4gVGhlIGFyaXRobWV0aWMgaXMgaG9uZXN0IGluIG9uZSBkaXJlY3Rpb24g4oCUIGEgQ1BVLWJvdW5kIGJ1aWxkXG4gIC8vIHRha2VzIHR3aWNlIGFzIGxvbmcgYXQgaGFsZiB0aGUgdkNQVSBhbmQgY29zdHMgdGhlIFNBTUUsIHdoaWxlIGFuIEkvTy1ib3VuZFxuICAvLyBvbmUgY29zdHMgYWJvdXQgaGFsZi4gU28gU21hbGwgY2FuIG5ldmVyIGNvc3QgbW9yZSB0aGFuIFN0YW5kYXJkLCBhbmQgY2FuXG4gIC8vIGNvc3QgaGFsZiAoYXNzdW1pbmcgc2xvd2Rvd24gaXMgYXQgbW9zdCBsaW5lYXIsIHdoaWNoIG1lbW9yeSBwcmVzc3VyZSBjYW5cbiAgLy8gYnJlYWspLlxuICAnMC41eCc6IHsgbGFiZWw6ICdTbWFsbCcsIG11bHRpcGxpZXI6IDAuNSwgbWluVGllcjogbnVsbCwgZGVmYXVsdENsYXNzOiAnZmxleGlibGUnLCBlbnZTdWZmaXg6ICdIQUxGJyB9LFxuICAnMXgnOiB7IGxhYmVsOiAnU3RhbmRhcmQnLCBtdWx0aXBsaWVyOiAxLCBtaW5UaWVyOiBudWxsLCBkZWZhdWx0Q2xhc3M6ICdzdGFuZGFyZCcsIGVudlN1ZmZpeDogJzFYJyB9LFxuICAnMngnOiB7IGxhYmVsOiAnTWVkaXVtJywgbXVsdGlwbGllcjogMiwgbWluVGllcjogJ3RlYW0nLCBkZWZhdWx0Q2xhc3M6ICdzdGFuZGFyZCcsIGVudlN1ZmZpeDogJzJYJyB9LFxuICAnNHgnOiB7IGxhYmVsOiAnTGFyZ2UnLCBtdWx0aXBsaWVyOiA0LCBtaW5UaWVyOiAnYnVzaW5lc3MnLCBkZWZhdWx0Q2xhc3M6ICdzdGFuZGFyZCcsIGVudlN1ZmZpeDogJzRYJyB9LFxuICAnOHgnOiB7IGxhYmVsOiAnWC1MYXJnZScsIG11bHRpcGxpZXI6IDgsIG1pblRpZXI6ICdlbnRlcnByaXNlJywgZGVmYXVsdENsYXNzOiAnc3RhbmRhcmQnLCBlbnZTdWZmaXg6ICc4WCcgfSxcbn07XG5cbi8qKlxuICogVGhlIHRpZXIgbGFkZGVyLCBhc2NlbmRpbmcsIGZvciBldmFsdWF0aW5nIHtAbGluayBCdWlsZFNpemVNZXRhLm1pblRpZXJ9LlxuICpcbiAqIERlY2xhcmVkIGhlcmUgYmVjYXVzZSBhIGRlcGVuZGVuY3ktZnJlZSBtb2R1bGUgY2Fubm90IGltcG9ydCBgVkFMSURfVElFUlNgIChpdFxuICogaXMgZGVyaXZlZCBmcm9tIHRoZSBlbnYtcmVhZGluZyB0aWVyIHRhYmxlKS4gYHVubGltaXRlZGAgc2l0cyBhdCB0aGUgdG9wIHNvXG4gKiB0aGUgbm8tYmlsbGluZyBpbnN0YWxsIGdhdGVzIG5vdGhpbmcg4oCUIGEgZ2F0ZSB0aGVyZSB3b3VsZCBpbnZlbnQgYSBsaW1pdCB0aGVcbiAqIG9wZXJhdG9yIG5ldmVyIGJvdWdodCBpbnRvLiBQaW5uZWQgYWdhaW5zdCB0aGUgYFF1b3RhVGllcmAgdW5pb24gYnkgYSB0ZXN0LlxuICovXG5leHBvcnQgY29uc3QgQlVJTERfVElFUl9MQURERVI6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gW1xuICAnZGV2ZWxvcGVyJywgJ3BybycsICd0ZWFtJywgJ2J1c2luZXNzJywgJ2VudGVycHJpc2UnLCAndW5saW1pdGVkJyxcbl07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWNjZXNzb3JzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFRoaXMgc2l6ZSdzIGNyZWRpdC92Q1BVIG11bHRpcGxpZXI7IGAxYCBmb3IgYW55dGhpbmcgdW5yZWNvZ25pc2VkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2l6ZU11bHRpcGxpZXIoc2l6ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIEJVSUxEX1NJWkVfQ0FUQUxPR1tzaXplIGFzIEJ1aWxkU2l6ZV0/Lm11bHRpcGxpZXIgPz8gMTtcbn1cblxuLyoqIGBTbWFsbGAg4oCmIGBYLUxhcmdlYDsgdGhlIHJhdyBpZCBmb3IgYW55dGhpbmcgdW5yZWNvZ25pc2VkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2l6ZUxhYmVsKHNpemU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBCVUlMRF9TSVpFX0NBVEFMT0dbc2l6ZSBhcyBCdWlsZFNpemVdPy5sYWJlbCA/PyBzaXplO1xufVxuXG4vKiogYFN0YW5kYXJkYCAvIGBGbGV4aWJsZWA7IHRoZSByYXcgaWQgZm9yIGFueXRoaW5nIHVucmVjb2duaXNlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENsYXNzTGFiZWwoYnVpbGRDbGFzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIEJVSUxEX0NMQVNTX0NBVEFMT0dbYnVpbGRDbGFzcyBhcyBCdWlsZENsYXNzXT8ubGFiZWwgPz8gYnVpbGRDbGFzcztcbn1cblxuLyoqXG4gKiBFbnYtdmFyIHN1ZmZpeCBvZiB0aGlzIHNpemUncyBidWlsZGtpdGQgcG9vbCBvdmVycmlkZS5cbiAqXG4gKiBEZWNsYXJlZCBpbiB0aGUgY2F0YWxvZyByYXRoZXIgdGhhbiBkZXJpdmVkLCBiZWNhdXNlIGRlcml2aW5nIGl0IHByb2R1Y2VzXG4gKiBJTExFR0FMIE5BTUVTOiBgJzAuNXgnLnRvVXBwZXJDYXNlKClgIGlzIGAwLjVYYCwgYW5kIGEgZG90IGNhbm5vdCBhcHBlYXIgaW4gYW5cbiAqIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUuIChJdCBpcyB0aGUgc2FtZSByZWFzb24gYHgtbGFyZ2VgIHdhcyByZWplY3RlZCBhcyBhblxuICogaWQg4oCUIGAuLi5fWC1MQVJHRWAgaXMgbm90IGFuIGlkZW50aWZpZXIgZWl0aGVyLikgRmFsbHMgYmFjayB0byBgMVhgLCB0aGVcbiAqIHNoYXJlZCBkYWVtb24sIGZvciBhbiB1bnJlY29nbmlzZWQgc2l6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2l6ZUVudlN1ZmZpeChzaXplOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gQlVJTERfU0laRV9DQVRBTE9HW3NpemUgYXMgQnVpbGRTaXplXT8uZW52U3VmZml4ID8/ICcxWCc7XG59XG5cbi8qKiBUaGUgY2xhc3MgdGhpcyBzaXplIHJ1bnMgaW4gdW5sZXNzIHRoZSBjYWxsZXIgb3ZlcnJpZGVzIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRDbGFzc0ZvclNpemUoc2l6ZTogc3RyaW5nKTogQnVpbGRDbGFzcyB7XG4gIHJldHVybiBCVUlMRF9TSVpFX0NBVEFMT0dbc2l6ZSBhcyBCdWlsZFNpemVdPy5kZWZhdWx0Q2xhc3MgPz8gJ3N0YW5kYXJkJztcbn1cblxuLyoqXG4gKiBIb3cgbXVjaCBsb25nZXIgYSBidWlsZCBhdCB0aGlzIHNpemUgbWF5IHJ1biBiZWZvcmUgdGhlIHRpbWVvdXQga2lsbHMgaXQuXG4gKlxuICogU2NhbGVzIFVQIGJlbG93IGAxeGAgYW5kIG5ldmVyIGRvd24gYWJvdmUgaXQsIGFuZCB0aGUgYXN5bW1ldHJ5IGlzIHRoZSBwb2ludDpcbiAqIHRoZSB0aW1lb3V0IGlzIGEgU0FGRVRZIGJvdW5kIG9uIGEgcnVuYXdheSBidWlsZCwgbm90IGEgYnVkZ2V0LiBBdCBoYWxmIHRoZVxuICogdkNQVSBhIHRlbi1taW51dGUgYnVpbGQgYmVjb21lcyBhYm91dCB0d2VudHkgYW5kIHdvdWxkIGRpZSBvbiBhIDE1LW1pbnV0ZVxuICogYm91bmQg4oCUIHNvIFNtYWxsIHdvdWxkIHF1aWV0bHkgZmFpbCBsb25nIGJ1aWxkcyAoYXMgYSBgcmV0cnlhYmxlYCBmYWlsdXJlLCBzb1xuICogdGhlIHRlbmFudCBpcyBub3QgY2hhcmdlZCwgYnV0IGl0IGlzIHJldHJpZWQgdHdpY2UgYW5kIGRlYWQtbGV0dGVyZWQpLiBTY2FsaW5nXG4gKiBpdCBET1dOIGF0IGA0eGAgd291bGQgaW5zdGVhZCBicmVhayBJL08tYm91bmQgYnVpbGRzIHRoYXQgZ2FpbiBub3RoaW5nIGZyb21cbiAqIHRoZSBleHRyYSBDUFUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRpbWVvdXRGYWN0b3Ioc2l6ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KDEsIDEgLyBidWlsZFNpemVNdWx0aXBsaWVyKHNpemUpKTtcbn1cblxuLyoqIEluLWZsaWdodCBidWlsZHMgb25lIG9yZyBvbiBgdGllcmAgbWF5IGhvbGQgaW4gYGJ1aWxkQ2xhc3NgICh0aGUgZGVmYXVsdCkuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTbG90c0Zvcih0aWVyOiBRdW90YVRpZXIsIGJ1aWxkQ2xhc3M6IEJ1aWxkQ2xhc3MpOiBudW1iZXIge1xuICBjb25zdCBtZXRhID0gQlVJTERfQ0xBU1NfQ0FUQUxPR1tidWlsZENsYXNzXSA/PyBCVUlMRF9DTEFTU19DQVRBTE9HLnN0YW5kYXJkO1xuICByZXR1cm4gbWV0YS5zbG90c0J5VGllclt0aWVyXSA/PyBtZXRhLnNsb3RzQnlUaWVyLmRldmVsb3Blcjtcbn1cblxuLyoqIEJvdGggY2xhc3Nlcycgc2xvdCBjb3VudHMgZm9yIG9uZSB0aWVyIOKAlCB0aGUgcGVyLXRpZXIgcmVhZGluZyB0aGUgVUkgd2FudHMuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTbG90c0J5Q2xhc3ModGllcjogUXVvdGFUaWVyKTogUmVhZG9ubHk8UmVjb3JkPEJ1aWxkQ2xhc3MsIG51bWJlcj4+IHtcbiAgcmV0dXJuIHtcbiAgICBzdGFuZGFyZDogYnVpbGRTbG90c0Zvcih0aWVyLCAnc3RhbmRhcmQnKSxcbiAgICBmbGV4aWJsZTogYnVpbGRTbG90c0Zvcih0aWVyLCAnZmxleGlibGUnKSxcbiAgfTtcbn1cblxuLyoqIFdoZXRoZXIgYHRpZXJgIG1heSByZXF1ZXN0IGBzaXplYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWVyQWxsb3dzQnVpbGRTaXplKHRpZXI6IFF1b3RhVGllciwgc2l6ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1ldGEgPSBCVUlMRF9TSVpFX0NBVEFMT0dbc2l6ZSBhcyBCdWlsZFNpemVdO1xuICBpZiAoIW1ldGEpIHJldHVybiBmYWxzZTtcbiAgaWYgKG1ldGEubWluVGllciA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGhhdmUgPSBCVUlMRF9USUVSX0xBRERFUi5pbmRleE9mKHRpZXIpO1xuICAvLyBBbiB1bnJlY29nbmlzZWQgdGllciBnZXRzIHRoZSBGTE9PUiBvZiB0aGUgbGFkZGVyIOKAlCB0aGUgc21hbGxlc3QgYWxsb3dhbmNlLFxuICAvLyBuZXZlciBldmVyeXRoaW5nLiBTYW1lIGNvbnNlcnZhdGl2ZSBjYWxsIGB0aWVyRm9yUXVldWVOYW1lYCBtYWtlcy5cbiAgaWYgKGhhdmUgPCAwKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBoYXZlID49IEJVSUxEX1RJRVJfTEFEREVSLmluZGV4T2YobWV0YS5taW5UaWVyKTtcbn1cblxuLyoqIEV2ZXJ5IHNpemUgYHRpZXJgIG1heSByZXF1ZXN0LCBhc2NlbmRpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaXplc0ZvclRpZXIodGllcjogUXVvdGFUaWVyKTogcmVhZG9ubHkgQnVpbGRTaXplW10ge1xuICByZXR1cm4gQlVJTERfU0laRVMuZmlsdGVyKChzKSA9PiB0aWVyQWxsb3dzQnVpbGRTaXplKHRpZXIsIHMpKTtcbn1cbiJdfQ==