@pipeline-builder/pipeline-data 4.3.6 → 4.3.7

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 (70) hide show
  1. package/lib/api/access-control-builder.js +1 -1
  2. package/lib/api/alert-destinations.js +1 -1
  3. package/lib/api/crud-service.js +1 -1
  4. package/lib/api/ecosystem-privacy.js +1 -1
  5. package/lib/api/keyset-cursor.js +1 -1
  6. package/lib/api/pipeline-step-resolution.js +1 -1
  7. package/lib/api/plugin-advisories.js +1 -1
  8. package/lib/api/plugin-consumption-policy.js +1 -1
  9. package/lib/api/plugin-resolution.js +6 -1
  10. package/lib/api/public-directory.d.ts +71 -3
  11. package/lib/api/public-directory.js +68 -22
  12. package/lib/api/query-builders.js +47 -2
  13. package/lib/api/reporting/analytics-queries.js +1 -1
  14. package/lib/api/reporting/caches.js +1 -1
  15. package/lib/api/reporting/daily-rollup.js +1 -1
  16. package/lib/api/reporting/deploy-rollup.js +1 -1
  17. package/lib/api/reporting/dora-scoring.js +1 -1
  18. package/lib/api/reporting/dora.js +1 -1
  19. package/lib/api/reporting/failure-classifier.js +1 -1
  20. package/lib/api/reporting/ingest.js +1 -1
  21. package/lib/api/reporting/last-deploy.js +1 -1
  22. package/lib/api/reporting/needs-attention.js +1 -1
  23. package/lib/api/reporting/plugin-exposure.js +1 -1
  24. package/lib/api/reporting/plugin-runtime.js +1 -1
  25. package/lib/api/reporting/query-scope.js +1 -1
  26. package/lib/api/reporting/retention-sweep.js +1 -1
  27. package/lib/api/reporting/retention.js +1 -1
  28. package/lib/api/reporting/sql-helpers.js +1 -1
  29. package/lib/api/reporting/stakeholder/compose.js +1 -1
  30. package/lib/api/reporting/stakeholder/index.js +1 -1
  31. package/lib/api/reporting/stakeholder/period.js +1 -1
  32. package/lib/api/reporting/stakeholder/report-html.js +1 -1
  33. package/lib/api/reporting/stakeholder/sections.js +1 -1
  34. package/lib/api/reporting/stakeholder/store.js +1 -1
  35. package/lib/api/reporting/stakeholder/templates.js +1 -1
  36. package/lib/api/reporting/types.js +1 -1
  37. package/lib/api/reporting-service.js +1 -1
  38. package/lib/api/semver-range.js +1 -1
  39. package/lib/api/soft-delete-sweep.js +1 -1
  40. package/lib/api/support-cases.js +1 -1
  41. package/lib/api/version-references.js +1 -1
  42. package/lib/api/viewer-context.js +1 -1
  43. package/lib/core/query-filters.d.ts +25 -0
  44. package/lib/core/query-filters.js +1 -1
  45. package/lib/database/drizzle-schema.d.ts +19 -0
  46. package/lib/database/drizzle-schema.js +1 -1
  47. package/lib/database/index.js +1 -1
  48. package/lib/database/pg-result.js +1 -1
  49. package/lib/database/postgres-connection.js +1 -1
  50. package/lib/database/public-reader.js +1 -1
  51. package/lib/database/read-connection.js +1 -1
  52. package/lib/database/read-lag.js +1 -1
  53. package/lib/database/retry-strategy.js +1 -1
  54. package/lib/database/schema/alert.js +1 -1
  55. package/lib/database/schema/compliance.js +1 -1
  56. package/lib/database/schema/dashboard.js +1 -1
  57. package/lib/database/schema/ecosystem.d.ts +17 -0
  58. package/lib/database/schema/ecosystem.js +3 -1
  59. package/lib/database/schema/message-attachment.js +1 -1
  60. package/lib/database/schema/message.d.ts +19 -0
  61. package/lib/database/schema/message.js +18 -1
  62. package/lib/database/schema/pipeline-template.js +1 -1
  63. package/lib/database/schema/pipeline.js +1 -1
  64. package/lib/database/schema/plugin.js +1 -1
  65. package/lib/database/schema/reporting-analytics.js +1 -1
  66. package/lib/database/schema/reporting-stakeholder.js +1 -1
  67. package/lib/database/schema/support.js +1 -1
  68. package/lib/database/tenancy.js +1 -1
  69. package/lib/index.js +1 -1
  70. package/package.json +8 -8
@@ -221,4 +221,4 @@ export class AccessControlQueryBuilder {
221
221
  return conditions;
222
222
  }
223
223
  }
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvYWNjZXNzLWNvbnRyb2wtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHeEQsTUFBTSxTQUFTLEdBQUcsaUVBQWlFLENBQUM7QUFFcEY7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEdBQVc7SUFDN0MsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQUFpQixFQUFFLE9BQWU7SUFDM0UsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDM0QsT0FBTyxHQUFHLENBQUEsbURBQW1ELE1BQU0sZ0NBQWdDLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDNUgsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWM7SUFDL0MsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDO0lBQ3ZELE9BQU8sT0FBTyxDQUFDLEtBQUss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Q0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxtQkFBbUIsQ0FBQyxNQUF3QjtRQUNwRCxPQUFPLHNCQUFzQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLHFCQUFxQixDQUFDLE1BQXdCLEVBQUUsS0FBYyxFQUFFLFdBQW9CO1FBQ3pGLE1BQU0sVUFBVSxHQUFVLEVBQUUsQ0FBQztRQUU3QixnRUFBZ0U7UUFDaEUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFeEUsaUNBQWlDO1FBQ2pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksV0FBVztZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFOUMsa0JBQWtCO1FBQ2xCLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVyRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIG5lLCBvciwgc3FsLCBTUUwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5cbmNvbnN0IEZVTExfVVVJRCA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC9pO1xuXG4vKipcbiAqIEVzY2FwZSBTUUwgTElLRSB3aWxkY2FyZCBjaGFyYWN0ZXJzIHRvIHByZXZlbnQgd2lsZGNhcmQgaW5qZWN0aW9uLlxuICogUmVwbGFjZXMgYCVgIOKGkiBgXFxcXCVgLCBgX2Ag4oaSIGBcXFxcX2AsIGFuZCBgXFxcXGAg4oaSIGBcXFxcXFxcXGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVMaWtlV2lsZGNhcmRzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoLyUvZywgJ1xcXFwlJykucmVwbGFjZSgvXy9nLCAnXFxcXF8nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiBhIEpTT05CIHRleHQgYXJyYXkgY29sdW1uIGNvbnRhaW5zIGEga2V5d29yZCAoY2FzZS1pbnNlbnNpdGl2ZSkuXG4gKiBVc2VkIGZvciBrZXl3b3Jkcy90YWdzIGZpbHRlcmluZyBvbiBwaXBlbGluZXMsIHBsdWdpbnMsIGFuZCBjb21wbGlhbmNlIHJ1bGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oY29sdW1uOiBBbnlDb2x1bW4sIGtleXdvcmQ6IHN0cmluZyk6IFNRTCB7XG4gIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGVMaWtlV2lsZGNhcmRzKGtleXdvcmQudG9Mb3dlckNhc2UoKSk7XG4gIHJldHVybiBzcWxgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGpzb25iX2FycmF5X2VsZW1lbnRzX3RleHQoJHtjb2x1bW59KSBBUyBlbCBXSEVSRSBsb3dlcihlbCkgTElLRSAkeyclJyArIGVzY2FwZWQgKyAnJSd9KWA7XG59XG5cbi8qKlxuICogUGFyc2UgYm9vbGVhbiBmaWx0ZXIgdmFsdWUgZnJvbSBzdHJpbmcgb3IgYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCb29sZWFuRmlsdGVyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgc3RyaW5nIGZpbHRlciB2YWx1ZSB0byBsb3dlcmNhc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcih2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBJRCBwcmVkaWNhdGUgd2l0aCBVVUlEIHByZWZpeCBtYXRjaGluZy5cbiAqXG4gKiAtIEZ1bGwgVVVJRCDihpIgZXhhY3QgbWF0Y2hcbiAqIC0gUGFydGlhbCBVVUlEIOKGkiBwcmVmaXggbWF0Y2ggdmlhIGBMSUtFYCAoYSBsaXN0LXNlYXJjaCBhZmZvcmRhbmNlKVxuICogLSBBYnNlbnQg4oaSIGBudWxsYCAobm8gcHJlZGljYXRlKVxuICpcbiAqIFN0YW5kYWxvbmUgc28gZW50aXRpZXMgdGhhdCBET04nVCB1c2Uge0BsaW5rIEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXJ9J3NcbiAqIGFjY2VzcyBjb250cm9sIChlLmcuIHBpcGVsaW5lIHRlbXBsYXRlcywgd2hpY2ggY2FycnkgdGhlaXIgb3duIHRocmVlLXJ1bmdcbiAqIHZpc2liaWxpdHkgbGFkZGVyKSBzdGlsbCBzaGFyZSBvbmUgaWQtbWF0Y2hpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZElkQ29uZGl0aW9uKGlkQ29sdW1uOiBBbnlDb2x1bW4sIGlkOiB1bmtub3duKTogU1FMIHwgbnVsbCB7XG4gIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAvLyBgQmFzZUFjY2Vzc0ZpbHRlci5pZGAgaXMgZGVjbGFyZWQgYHN0cmluZyB8IHN0cmluZ1tdYCwgc28gaG9ub3VyIHRoZSBhcnJheVxuICAvLyBmb3JtOiBtYXRjaCBBTlkgb2YgdGhlIGlkcywgZWFjaCB3aXRoIHRoZSBzYW1lIGV4YWN0LXZzLXByZWZpeCBzZW1hbnRpY3MgYXNcbiAgLy8gYSBzaW5nbGUgdmFsdWUuIGBTdHJpbmcoWydhJywnYiddKWAgd291bGQgb3RoZXJ3aXNlIHByb2R1Y2UgYExJS0UgJ2EsYiUnYFxuICAvLyBhbmQgc2lsZW50bHkgcmV0dXJuIHplcm8gcm93cyDigJQgYSB0cmFwIGZvciB0aGUgZmlyc3QgY2FsbGVyIHRvIHBhc3Mgb25lLlxuICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICBjb25zdCBwYXJ0cyA9IGlkXG4gICAgICAubWFwKChvbmUpID0+IGJ1aWxkSWRDb25kaXRpb24oaWRDb2x1bW4sIG9uZSkpXG4gICAgICAuZmlsdGVyKChjKTogYyBpcyBTUUwgPT4gYyAhPT0gbnVsbCk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMSA/IHBhcnRzWzBdIDogKG9yKC4uLnBhcnRzKSBhcyBTUUwpO1xuICB9XG5cbiAgY29uc3QgaWRTdHJpbmcgPSBTdHJpbmcoaWQpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChGVUxMX1VVSUQudGVzdChpZFN0cmluZykpIHtcbiAgICByZXR1cm4gZXEoaWRDb2x1bW4sIGlkU3RyaW5nKTtcbiAgfVxuICAvLyBFc2NhcGUgU1FMIExJS0Ugd2lsZGNhcmRzIHRvIHByZXZlbnQgd2lsZGNhcmQgaW5qZWN0aW9uXG4gIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGVMaWtlV2lsZGNhcmRzKGlkU3RyaW5nKTtcbiAgcmV0dXJuIHNxbGAke2lkQ29sdW1ufTo6dGV4dCBMSUtFICR7ZXNjYXBlZCArICclJ30gRVNDQVBFICdcXFxcJ2A7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBpc0RlZmF1bHRgIC8gYGlzQWN0aXZlYCBwcmVkaWNhdGVzIHNoYXJlZCBieSBldmVyeSBjYXRhbG9nIGVudGl0eS5cbiAqIGBpc0FjdGl2ZWAgZGVmYXVsdHMgdG8gdHJ1ZSBzbyBzb2Z0LWRlbGV0ZWQgcm93cyBzdGF5IG91dCBvZiBub3JtYWwgcmVhZHMuXG4gKiBTdGFuZGFsb25lIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIGJ1aWxkSWRDb25kaXRpb259LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRCb29sZWFuQ29uZGl0aW9ucyhcbiAgY29sdW1uczogeyBpc0RlZmF1bHQ6IEFueUNvbHVtbjsgaXNBY3RpdmU6IEFueUNvbHVtbiB9LFxuICBmaWx0ZXI6IHsgaXNEZWZhdWx0PzogdW5rbm93bjsgaXNBY3RpdmU/OiB1bmtub3duIH0sXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKGZpbHRlci5pc0RlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShjb2x1bW5zLmlzRGVmYXVsdCwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc0RlZmF1bHQpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoY29sdW1ucy5pc0FjdGl2ZSwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc0FjdGl2ZSkpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBEZWZhdWx0IHRvIGFjdGl2ZSByZWNvcmRzIG9ubHkgdG8gZXhjbHVkZSBzb2Z0LWRlbGV0ZWQgZW50aXRpZXNcbiAgICBjb25kaXRpb25zLnB1c2goZXEoY29sdW1ucy5pc0FjdGl2ZSwgdHJ1ZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogU2NoZW1hIHRhYmxlIGludGVyZmFjZSBmb3IgYWNjZXNzIGNvbnRyb2wgcXVlcmllcy4gRXZlcnkgY2F0YWxvZyBlbnRpdHlcbiAqIGNhcnJpZXMgdGhlIHNhbWUgZml2ZSBjb2x1bW5zLCB3aGljaCBpcyB3aGF0IGxldHMgT05FIHByZWRpY2F0ZSBzZXJ2ZVxuICogcGlwZWxpbmVzLCBwbHVnaW5zIGFuZCB0ZW1wbGF0ZXMgYWxpa2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzQ29udHJvbFNjaGVtYSB7XG4gIGlkOiBBbnlDb2x1bW47XG4gIG9yZ0lkOiBBbnlDb2x1bW47XG4gIC8qKiBUaHJlZS1ydW5nIHNoYXJpbmcgbGFkZGVyIOKAlCBzZWUgYXBpLWNvcmUncyBgVmlzaWJpbGl0eWAuICovXG4gIHZpc2liaWxpdHk6IEFueUNvbHVtbjtcbiAgLyoqIEF1dGhvci4gT3ducyB0aGUgYHByaXZhdGVgIHJ1bmcuICovXG4gIGNyZWF0ZWRCeTogQW55Q29sdW1uO1xuICBpc0RlZmF1bHQ6IEFueUNvbHVtbjtcbiAgaXNBY3RpdmU6IEFueUNvbHVtbjtcbn1cblxuLyoqXG4gKiBCYXNlIGZpbHRlciBpbnRlcmZhY2Ugd2l0aCBjb21tb24gYWNjZXNzIGNvbnRyb2wgZmllbGRzLlxuICpcbiAqIGB2aWV3ZXJVc2VySWRgIC8gYHZpZXdlcklzU3VwZXJBZG1pbmAgYXJlIFNFUlZFUi1TRVQgKHN0YW1wZWQgZnJvbSB0aGUgcmVxdWVzdCdzXG4gKiB0ZW5hbnQgY29udGV4dCBieSBgd2l0aFZpZXdlckNvbnRleHRgKSwgbmV2ZXIgY2xpZW50LXN1cHBsaWVkIOKAlCBzZWVcbiAqIGB2aWV3ZXItY29udGV4dC50c2AgZm9yIHdoeSB0aGUgdGVuYW50IGNvbnRleHQgaXMgdGhlIGNoYW5uZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUFjY2Vzc0ZpbHRlciB7XG4gIGlkPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHZpc2liaWxpdHk/OiBzdHJpbmc7XG4gIGlzRGVmYXVsdD86IGJvb2xlYW4gfCBzdHJpbmc7XG4gIGlzQWN0aXZlPzogYm9vbGVhbiB8IHN0cmluZztcbiAgdmlld2VyVXNlcklkPzogc3RyaW5nO1xuICB2aWV3ZXJJc1N1cGVyQWRtaW4/OiBib29sZWFuO1xufVxuXG4vKiogRmFpbC1jbG9zZWQgcHJlZGljYXRlOiBtYXRjaGVzIG5vIHJvd3MuICovXG5jb25zdCBOT19ST1dTOiBTUUwgPSBzcWxgZmFsc2VgO1xuXG4vKiogUGVyLWVudGl0eSB0dW5pbmcgb2Yge0BsaW5rIEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXJ9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NDb250cm9sT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBTWVNURU0gb3JnJ3MgYHB1YmxpY2AgcnVuZyByZWFjaGVzIGNhbGxlcnMgaW4gb3RoZXIgb3JncyAoYW5kXG4gICAqIGFub255bW91cyBjYWxsZXJzKS4gRGVmYXVsdCB0cnVlOiB0aGUgc3lzdGVtIG9yZydzIHNhbXBsZSBwaXBlbGluZXMsXG4gICAqIHRlbXBsYXRlcyBhbmQgZGFzaGJvYXJkcyBhcmUgdmlzaWJsZSBmcm9tIGV2ZXJ5IG9yZy4gUGx1Z2lucyBzZXQgaXQgZmFsc2U6XG4gICAqIHNpbmNlIHRoZSBwbHVnaW4gZWNvc3lzdGVtIHRoZSBPZmZpY2lhbCBjYXRhbG9nIHJlYWNoZXNcbiAgICogb3RoZXIgb3JncyBvbmx5IGFzIExJU1RJTkdTIHJlc29sdmVkIHRocm91Z2ggaW5zdGFsbHMsIG5ldmVyIHRocm91Z2hcbiAgICogYHZpc2liaWxpdHkgPSAncHVibGljJ2Agb24gYSBgcGx1Z2luc2Agcm93LlxuICAgKi9cbiAgc3lzdGVtQ2F0YWxvZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogR2VuZXJpYyBhY2Nlc3MgY29udHJvbCBxdWVyeSBidWlsZGVyIGZvciBtdWx0aS10ZW5hbnQgZW50aXRpZXMuXG4gKlxuICogQ29uc29saWRhdGVzIGR1cGxpY2F0ZSBhY2Nlc3MgY29udHJvbCBsb2dpYyBzaGFyZWQgYWNyb3NzIHBpcGVsaW5lIGFuZCBwbHVnaW4gcXVlcmllcy5cbiAqIEhhbmRsZXM6XG4gKiAtIE11bHRpLXRlbmFudCBhY2Nlc3MgY29udHJvbCAocHVibGljL3ByaXZhdGUvb3JnLWFuZC1wdWJsaWMpXG4gKiAtIFVVSUQgcHJlZml4IG1hdGNoaW5nIGZvciBJRCBmaWx0ZXJzXG4gKiAtIEJvb2xlYW4gZmllbGQgbm9ybWFsaXphdGlvblxuICpcbiAqIEB0eXBlUGFyYW0gVFNjaGVtYSAtIFNjaGVtYSB0YWJsZSB0eXBlIHdpdGggYWNjZXNzIGNvbnRyb2wgZmllbGRzXG4gKiBAdHlwZVBhcmFtIFRGaWx0ZXIgLSBGaWx0ZXIgdHlwZSBleHRlbmRpbmcgQmFzZUFjY2Vzc0ZpbHRlclxuICovXG5leHBvcnQgY2xhc3MgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcjxcbiAgVFNjaGVtYSBleHRlbmRzIEFjY2Vzc0NvbnRyb2xTY2hlbWEsXG4gIFRGaWx0ZXIgZXh0ZW5kcyBCYXNlQWNjZXNzRmlsdGVyLFxuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2NoZW1hOiBUU2NoZW1hLFxuICAgIHByaXZhdGUgb3B0aW9uczogQWNjZXNzQ29udHJvbE9wdGlvbnMgPSB7fSxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgY2FsbGVyJ3MgdmlzaWJsZSBzbGljZSBvZiBhIGNhdGFsb2csIGZyb20gdGhlIHRocmVlLXJ1bmdcbiAgICogYHZpc2liaWxpdHlgIGxhZGRlciBzaGFyZWQgYnkgZXZlcnkgY2F0YWxvZyBlbnRpdHkuXG4gICAqXG4gICAqIEVmZmVjdGl2ZSByZWFkIHNldCBmb3IgYSBjYWxsZXIgaW4gb3JnIGBPYCBhcyB1c2VyIGBWYCB3aG9zZSBwYXJlbnQgb3JnIGlzIGBQYDpcbiAgICpcbiAgICogICAob3JnX2lkID0gTyBBTkQgKHZpc2liaWxpdHkgPD4gJ3ByaXZhdGUnIE9SIGNyZWF0ZWRfYnkgPSBWKSlcbiAgICogICBPUiAodmlzaWJpbGl0eSA9ICdwdWJsaWMnIEFORCAob3JnX2lkID0gJ3N5c3RlbScgT1Igb3JnX2lkID0gUCkpXG4gICAqXG4gICAqIGkuZS4geW91ciBvd24gb3JnJ3Mgc2hhcmVkIHJ1bmdzIHBsdXMgeW91ciBvd24gZHJhZnRzLCB3aWRlbmVkIGJ5IHRoZSBzeXN0ZW1cbiAgICogb3JnJ3MgcHVibGljIGNhdGFsb2cgKHRoZSBzdGFuZGluZyBcInN5c3RlbS1vcmcgY29udGVudCBpcyB2aXNpYmxlIGZyb20gZXZlcnlcbiAgICogb3JnXCIgcnVsZSkgYW5kIOKAlCBmb3IgYSB0ZWFtIOKAlCBpdHMgcGFyZW50J3MgcHVibGljIHJvd3MuIFRoZSBgcHVibGljYC1vbmx5XG4gICAqIHJlc3RyaWN0aW9uIGFwcGxpZXMgc29sZWx5IHRvIHRob3NlIE9USEVSIG9yZ3MnIHJvd3M7IHdpdGhpbiB5b3VyIG93biBvcmcgeW91XG4gICAqIGFsd2F5cyBzZWUgZXZlcnl0aGluZyB5b3UgYXJlIGVudGl0bGVkIHRvLCBvciBhIGZyZXNobHktY3JlYXRlZCBwcml2YXRlIHJvd1xuICAgKiB3b3VsZCB2YW5pc2ggZnJvbSBpdHMgb3duIGF1dGhvcidzIGxpc3RpbmcuXG4gICAqXG4gICAqIEFuIGVudGl0eSBjYW4gZHJvcCB0aGUgc3lzdGVtLW9yZyBicmFuY2ggd2l0aCBgc3lzdGVtQ2F0YWxvZzogZmFsc2VgXG4gICAqICh7QGxpbmsgQWNjZXNzQ29udHJvbE9wdGlvbnN9KTogcGx1Z2lucyBkbywgc28gYSBzeXN0ZW0tb3JnIHBsdWdpbiByZWFjaGVzXG4gICAqIG90aGVyIG9yZ3Mgb25seSBhcyBhbiBPZmZpY2lhbCBsaXN0aW5nLlxuICAgKlxuICAgKiBBbiBleHBsaWNpdCBgdmlzaWJpbGl0eWAgZmlsdGVyIE5BUlJPV1Mgd2l0aGluIHRoYXQgc2V0LCBuZXZlciB3aWRlbnMgaXQg4oCUXG4gICAqIHNvIGA/dmlzaWJpbGl0eT1wdWJsaWNgIHN0aWxsIHN1cmZhY2VzIHRoZSBzeXN0ZW0tb3JnIGNhdGFsb2cuXG4gICAqXG4gICAqIEZhaWxzIENMT1NFRCBvbiBib3RoIGF4ZXM6IG5vIGBvcmdJZGAgKGFub255bW91cykg4oeSIHN5c3RlbS1vcmcgcHVibGljIG9ubHk7XG4gICAqIG5vIGB2aWV3ZXJVc2VySWRgIOKHkiB0aGUgcHJpdmF0ZSBydW5nIG1hdGNoZXMgbm90aGluZyByYXRoZXIgdGhhbiBldmVyeXRoaW5nLlxuICAgKiBgdmlld2VySXNTdXBlckFkbWluYCBsaWZ0cyB0aGUgcHJpdmF0ZSBydW5nIG9ubHkg4oCUIGEgcGxhdGZvcm0gb3BlcmF0b3JcbiAgICogYWRtaW5pc3RlcnMgdGhlIHdob2xlIGNhdGFsb2cuXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwpXG4gICAqIEBwYXJhbSBwYXJlbnRPcmdJZCAtIFBhcmVudCBvcmcgSUQgd2hlbiB0aGUgY2FsbGVyIGlzIGEgdGVhbSAob3B0aW9uYWwpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zIGZvciBhY2Nlc3MgY29udHJvbFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkQWNjZXNzQ29udHJvbChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IGZpbHRlci52aXNpYmlsaXR5O1xuXG4gICAgY29uc3Qgc3lzdGVtQ2F0YWxvZyA9IHRoaXMub3B0aW9ucy5zeXN0ZW1DYXRhbG9nICE9PSBmYWxzZTtcblxuICAgIGlmICghb3JnSWQpIHtcbiAgICAgIC8vIE5vIG9yZyBjb250ZXh0IOKAlCBvbmx5IHRoZSBzeXN0ZW0gb3JnJ3MgcHVibGljIGNhdGFsb2cgKG5vdGhpbmcgYXQgYWxsXG4gICAgICAvLyBmb3IgYW4gZW50aXR5IHdpdGhvdXQgb25lKS5cbiAgICAgIGlmICghc3lzdGVtQ2F0YWxvZykgcmV0dXJuIFtOT19ST1dTXTtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLnNjaGVtYS5vcmdJZCwgU1lTVEVNX09SR19JRCkpO1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuc2NoZW1hLnZpc2liaWxpdHksICdwdWJsaWMnKSk7XG4gICAgICAvLyBBbiBhbm9ueW1vdXMgY2FsbGVyIGFza2luZyBmb3IgYSBuYXJyb3dlciBydW5nIGdldHMgbm90aGluZywgcmF0aGVyIHRoYW5cbiAgICAgIC8vIGhhdmluZyB0aGUgbmFycm93aW5nIHNpbGVudGx5IGlnbm9yZWQuXG4gICAgICBpZiAocmVxdWVzdGVkICE9PSB1bmRlZmluZWQgJiYgcmVxdWVzdGVkICE9PSAncHVibGljJykgY29uZGl0aW9ucy5wdXNoKE5PX1JPV1MpO1xuICAgICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZE9yZ0lkID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIE93bi1vcmcgcm93czogZXZlcnl0aGluZyBFWENFUFQgb3RoZXIgcGVvcGxlJ3MgcHJpdmF0ZSBkcmFmdHMuXG4gICAgY29uc3Qgb3duRHJhZnRzT25seSA9IGZpbHRlci52aWV3ZXJVc2VySWQgPyBlcSh0aGlzLnNjaGVtYS5jcmVhdGVkQnksIGZpbHRlci52aWV3ZXJVc2VySWQpIDogTk9fUk9XUztcbiAgICBjb25zdCBvd25PcmcgPSBmaWx0ZXIudmlld2VySXNTdXBlckFkbWluXG4gICAgICA/IGVxKHRoaXMuc2NoZW1hLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpXG4gICAgICA6IGFuZChlcSh0aGlzLnNjaGVtYS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSwgb3IobmUodGhpcy5zY2hlbWEudmlzaWJpbGl0eSwgJ3ByaXZhdGUnKSwgb3duRHJhZnRzT25seSkhKSE7XG5cbiAgICAvLyBSb3dzIGZyb20gT1RIRVIgb3JncyBhcmUgb25seSBldmVyIHZpc2libGUgYXQgdGhlIGBwdWJsaWNgIHJ1bmcuXG4gICAgY29uc3Qgb3RoZXJPcmdTY29wZXM6IFNRTFtdID0gW107XG4gICAgaWYgKHN5c3RlbUNhdGFsb2cpIG90aGVyT3JnU2NvcGVzLnB1c2goZXEodGhpcy5zY2hlbWEub3JnSWQsIFNZU1RFTV9PUkdfSUQpKTtcbiAgICBpZiAocGFyZW50T3JnSWQpIG90aGVyT3JnU2NvcGVzLnB1c2goZXEodGhpcy5zY2hlbWEub3JnSWQsIHBhcmVudE9yZ0lkLnRvTG93ZXJDYXNlKCkpKTtcbiAgICBjb25kaXRpb25zLnB1c2gob3RoZXJPcmdTY29wZXMubGVuZ3RoID4gMFxuICAgICAgPyBvcihvd25PcmcsIGFuZChlcSh0aGlzLnNjaGVtYS52aXNpYmlsaXR5LCAncHVibGljJyksIG9yKC4uLm90aGVyT3JnU2NvcGVzKSEpISkhXG4gICAgICA6IG93bk9yZyk7XG5cbiAgICBpZiAocmVxdWVzdGVkICE9PSB1bmRlZmluZWQpIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLnNjaGVtYS52aXNpYmlsaXR5LCByZXF1ZXN0ZWQpKTtcblxuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIElEIGZpbHRlciB3aXRoIFVVSUQgcHJlZml4IG1hdGNoaW5nIHN1cHBvcnRcbiAgICpcbiAgICogLSBGdWxsIFVVSUQ6IEV4YWN0IG1hdGNoXG4gICAqIC0gUGFydGlhbCBVVUlEOiBQcmVmaXggbWF0Y2ggdXNpbmcgU1FMIExJS0VcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gSUQgZmlsdGVyIHZhbHVlIChmdWxsIG9yIHBhcnRpYWwgVVVJRClcbiAgICogQHJldHVybnMgU1FMIGNvbmRpdGlvbiBvciBudWxsIGlmIG5vIElEIGZpbHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkSWRGaWx0ZXIoaWQ6IHVua25vd24pOiBTUUwgfCBudWxsIHtcbiAgICByZXR1cm4gYnVpbGRJZENvbmRpdGlvbih0aGlzLnNjaGVtYS5pZCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGJvb2xlYW4gZmllbGQgY29uZGl0aW9ucyAoaXNEZWZhdWx0LCBpc0FjdGl2ZSlcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9ucyBmb3IgYm9vbGVhbiBmaWVsZHNcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEJvb2xlYW5GaWx0ZXJzKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPik6IFNRTFtdIHtcbiAgICByZXR1cm4gYnVpbGRCb29sZWFuQ29uZGl0aW9ucyh0aGlzLnNjaGVtYSwgZmlsdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbGwgY29tbW9uIGNvbmRpdGlvbnMgKGFjY2VzcyBjb250cm9sICsgSUQgKyBib29sZWFucylcbiAgICpcbiAgICogVGhpcyBjb21iaW5lcyBhbGwgdGhlIGdlbmVyaWMgZmlsdGVycyB0aGF0IGFwcGx5IHRvIGFueSBhY2Nlc3MtY29udHJvbGxlZCBlbnRpdHkuXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBhbmQgYWRkIGVudGl0eS1zcGVjaWZpYyBjb25kaXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBmYWxscyBiYWNrIHRvIHN5c3RlbS1wdWJsaWMtb25seSlcbiAgICogQHJldHVybnMgQXJyYXkgb2YgU1FMIGNvbmRpdGlvbnNcbiAgICovXG4gIHB1YmxpYyBidWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICAgIC8vIEFjY2VzcyBjb250cm9sIChtdWx0aS10ZW5hbnQpIOKAlCBoYW5kbGVzIHZpc2liaWxpdHkgaW50ZXJuYWxseVxuICAgIGNvbmRpdGlvbnMucHVzaCguLi50aGlzLmJ1aWxkQWNjZXNzQ29udHJvbChmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCkpO1xuXG4gICAgLy8gSUQgZmlsdGVyIHdpdGggcHJlZml4IG1hdGNoaW5nXG4gICAgY29uc3QgaWRDb25kaXRpb24gPSB0aGlzLmJ1aWxkSWRGaWx0ZXIoZmlsdGVyLmlkKTtcbiAgICBpZiAoaWRDb25kaXRpb24pIGNvbmRpdGlvbnMucHVzaChpZENvbmRpdGlvbik7XG5cbiAgICAvLyBCb29sZWFuIGZpbHRlcnNcbiAgICBjb25kaXRpb25zLnB1c2goLi4udGhpcy5idWlsZEJvb2xlYW5GaWx0ZXJzKGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gIH1cbn1cbiJdfQ==
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wtYnVpbGRlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9hY2Nlc3MtY29udHJvbC1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd4RCxNQUFNLFNBQVMsR0FBRyxpRUFBaUUsQ0FBQztBQUVwRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBVztJQUM3QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLE1BQWlCLEVBQUUsT0FBZTtJQUMzRSxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMzRCxPQUFPLEdBQUcsQ0FBQSxtREFBbUQsTUFBTSxnQ0FBZ0MsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM1SCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsS0FBYztJQUMvQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM3QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssS0FBSyxNQUFNLENBQUM7SUFDdkQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIs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QUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLG1CQUFtQixDQUFDLE1BQXdCO1FBQ3BELE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0kscUJBQXFCLENBQUMsTUFBd0IsRUFBRSxLQUFjLEVBQUUsV0FBb0I7UUFDekYsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO1FBRTdCLGdFQUFnRTtRQUNoRSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUV4RSxpQ0FBaUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxXQUFXO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5QyxrQkFBa0I7UUFDbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXJELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgYW5kLCBlcSwgbmUsIG9yLCBzcWwsIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQW55Q29sdW1uIH0gZnJvbSAnZHJpenpsZS1vcm0vY29sdW1uJztcblxuY29uc3QgRlVMTF9VVUlEID0gL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2k7XG5cbi8qKlxuICogRXNjYXBlIFNRTCBMSUtFIHdpbGRjYXJkIGNoYXJhY3RlcnMgdG8gcHJldmVudCB3aWxkY2FyZCBpbmplY3Rpb24uXG4gKiBSZXBsYWNlcyBgJWAg4oaSIGBcXFxcJWAsIGBfYCDihpIgYFxcXFxfYCwgYW5kIGBcXFxcYCDihpIgYFxcXFxcXFxcYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUxpa2VXaWxkY2FyZHMoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvJS9nLCAnXFxcXCUnKS5yZXBsYWNlKC9fL2csICdcXFxcXycpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIGEgSlNPTkIgdGV4dCBhcnJheSBjb2x1bW4gY29udGFpbnMgYSBrZXl3b3JkIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAqIFVzZWQgZm9yIGtleXdvcmRzL3RhZ3MgZmlsdGVyaW5nIG9uIHBpcGVsaW5lcywgcGx1Z2lucywgYW5kIGNvbXBsaWFuY2UgcnVsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihjb2x1bW46IEFueUNvbHVtbiwga2V5d29yZDogc3RyaW5nKTogU1FMIHtcbiAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZUxpa2VXaWxkY2FyZHMoa2V5d29yZC50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHNxbGBFWElTVFMgKFNFTEVDVCAxIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHNfdGV4dCgke2NvbHVtbn0pIEFTIGVsIFdIRVJFIGxvd2VyKGVsKSBMSUtFICR7JyUnICsgZXNjYXBlZCArICclJ30pYDtcbn1cblxuLyoqXG4gKiBQYXJzZSBib29sZWFuIGZpbHRlciB2YWx1ZSBmcm9tIHN0cmluZyBvciBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJvb2xlYW5GaWx0ZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBzdHJpbmcgZmlsdGVyIHZhbHVlIHRvIGxvd2VyY2FzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nRmlsdGVyKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGFuIElEIHByZWRpY2F0ZSB3aXRoIFVVSUQgcHJlZml4IG1hdGNoaW5nLlxuICpcbiAqIC0gRnVsbCBVVUlEIOKGkiBleGFjdCBtYXRjaFxuICogLSBQYXJ0aWFsIFVVSUQg4oaSIHByZWZpeCBtYXRjaCB2aWEgYExJS0VgIChhIGxpc3Qtc2VhcmNoIGFmZm9yZGFuY2UpXG4gKiAtIEFic2VudCDihpIgYG51bGxgIChubyBwcmVkaWNhdGUpXG4gKlxuICogU3RhbmRhbG9uZSBzbyBlbnRpdGllcyB0aGF0IERPTidUIHVzZSB7QGxpbmsgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcn0nc1xuICogYWNjZXNzIGNvbnRyb2wgKGUuZy4gcGlwZWxpbmUgdGVtcGxhdGVzLCB3aGljaCBjYXJyeSB0aGVpciBvd24gdGhyZWUtcnVuZ1xuICogdmlzaWJpbGl0eSBsYWRkZXIpIHN0aWxsIHNoYXJlIG9uZSBpZC1tYXRjaGluZyBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkSWRDb25kaXRpb24oaWRDb2x1bW46IEFueUNvbHVtbiwgaWQ6IHVua25vd24pOiBTUUwgfCBudWxsIHtcbiAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIC8vIGBCYXNlQWNjZXNzRmlsdGVyLmlkYCBpcyBkZWNsYXJlZCBgc3RyaW5nIHwgc3RyaW5nW11gLCBzbyBob25vdXIgdGhlIGFycmF5XG4gIC8vIGZvcm06IG1hdGNoIEFOWSBvZiB0aGUgaWRzLCBlYWNoIHdpdGggdGhlIHNhbWUgZXhhY3QtdnMtcHJlZml4IHNlbWFudGljcyBhc1xuICAvLyBhIHNpbmdsZSB2YWx1ZS4gYFN0cmluZyhbJ2EnLCdiJ10pYCB3b3VsZCBvdGhlcndpc2UgcHJvZHVjZSBgTElLRSAnYSxiJSdgXG4gIC8vIGFuZCBzaWxlbnRseSByZXR1cm4gemVybyByb3dzIOKAlCBhIHRyYXAgZm9yIHRoZSBmaXJzdCBjYWxsZXIgdG8gcGFzcyBvbmUuXG4gIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgIGNvbnN0IHBhcnRzID0gaWRcbiAgICAgIC5tYXAoKG9uZSkgPT4gYnVpbGRJZENvbmRpdGlvbihpZENvbHVtbiwgb25lKSlcbiAgICAgIC5maWx0ZXIoKGMpOiBjIGlzIFNRTCA9PiBjICE9PSBudWxsKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAxID8gcGFydHNbMF0gOiAob3IoLi4ucGFydHMpIGFzIFNRTCk7XG4gIH1cblxuICBjb25zdCBpZFN0cmluZyA9IFN0cmluZyhpZCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKEZVTExfVVVJRC50ZXN0KGlkU3RyaW5nKSkge1xuICAgIHJldHVybiBlcShpZENvbHVtbiwgaWRTdHJpbmcpO1xuICB9XG4gIC8vIEVzY2FwZSBTUUwgTElLRSB3aWxkY2FyZHMgdG8gcHJldmVudCB3aWxkY2FyZCBpbmplY3Rpb25cbiAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZUxpa2VXaWxkY2FyZHMoaWRTdHJpbmcpO1xuICByZXR1cm4gc3FsYCR7aWRDb2x1bW59Ojp0ZXh0IExJS0UgJHtlc2NhcGVkICsgJyUnfSBFU0NBUEUgJ1xcXFwnYDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYGlzRGVmYXVsdGAgLyBgaXNBY3RpdmVgIHByZWRpY2F0ZXMgc2hhcmVkIGJ5IGV2ZXJ5IGNhdGFsb2cgZW50aXR5LlxuICogYGlzQWN0aXZlYCBkZWZhdWx0cyB0byB0cnVlIHNvIHNvZnQtZGVsZXRlZCByb3dzIHN0YXkgb3V0IG9mIG5vcm1hbCByZWFkcy5cbiAqIFN0YW5kYWxvbmUgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB7QGxpbmsgYnVpbGRJZENvbmRpdGlvbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEJvb2xlYW5Db25kaXRpb25zKFxuICBjb2x1bW5zOiB7IGlzRGVmYXVsdDogQW55Q29sdW1uOyBpc0FjdGl2ZTogQW55Q29sdW1uIH0sXG4gIGZpbHRlcjogeyBpc0RlZmF1bHQ/OiB1bmtub3duOyBpc0FjdGl2ZT86IHVua25vd24gfSxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICBpZiAoZmlsdGVyLmlzRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKGNvbHVtbnMuaXNEZWZhdWx0LCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzRGVmYXVsdCkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaXNBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShjb2x1bW5zLmlzQWN0aXZlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzQWN0aXZlKSkpO1xuICB9IGVsc2Uge1xuICAgIC8vIERlZmF1bHQgdG8gYWN0aXZlIHJlY29yZHMgb25seSB0byBleGNsdWRlIHNvZnQtZGVsZXRlZCBlbnRpdGllc1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShjb2x1bW5zLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBTY2hlbWEgdGFibGUgaW50ZXJmYWNlIGZvciBhY2Nlc3MgY29udHJvbCBxdWVyaWVzLiBFdmVyeSBjYXRhbG9nIGVudGl0eVxuICogY2FycmllcyB0aGUgc2FtZSBmaXZlIGNvbHVtbnMsIHdoaWNoIGlzIHdoYXQgbGV0cyBPTkUgcHJlZGljYXRlIHNlcnZlXG4gKiBwaXBlbGluZXMsIHBsdWdpbnMgYW5kIHRlbXBsYXRlcyBhbGlrZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NDb250cm9sU2NoZW1hIHtcbiAgaWQ6IEFueUNvbHVtbjtcbiAgb3JnSWQ6IEFueUNvbHVtbjtcbiAgLyoqIFRocmVlLXJ1bmcgc2hhcmluZyBsYWRkZXIg4oCUIHNlZSBhcGktY29yZSdzIGBWaXNpYmlsaXR5YC4gKi9cbiAgdmlzaWJpbGl0eTogQW55Q29sdW1uO1xuICAvKiogQXV0aG9yLiBPd25zIHRoZSBgcHJpdmF0ZWAgcnVuZy4gKi9cbiAgY3JlYXRlZEJ5OiBBbnlDb2x1bW47XG4gIGlzRGVmYXVsdDogQW55Q29sdW1uO1xuICBpc0FjdGl2ZTogQW55Q29sdW1uO1xufVxuXG4vKipcbiAqIEJhc2UgZmlsdGVyIGludGVyZmFjZSB3aXRoIGNvbW1vbiBhY2Nlc3MgY29udHJvbCBmaWVsZHMuXG4gKlxuICogYHZpZXdlclVzZXJJZGAgLyBgdmlld2VySXNTdXBlckFkbWluYCBhcmUgU0VSVkVSLVNFVCAoc3RhbXBlZCBmcm9tIHRoZSByZXF1ZXN0J3NcbiAqIHRlbmFudCBjb250ZXh0IGJ5IGB3aXRoVmlld2VyQ29udGV4dGApLCBuZXZlciBjbGllbnQtc3VwcGxpZWQg4oCUIHNlZVxuICogYHZpZXdlci1jb250ZXh0LnRzYCBmb3Igd2h5IHRoZSB0ZW5hbnQgY29udGV4dCBpcyB0aGUgY2hhbm5lbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlQWNjZXNzRmlsdGVyIHtcbiAgaWQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgdmlzaWJpbGl0eT86IHN0cmluZztcbiAgaXNEZWZhdWx0PzogYm9vbGVhbiB8IHN0cmluZztcbiAgaXNBY3RpdmU/OiBib29sZWFuIHwgc3RyaW5nO1xuICB2aWV3ZXJVc2VySWQ/OiBzdHJpbmc7XG4gIHZpZXdlcklzU3VwZXJBZG1pbj86IGJvb2xlYW47XG59XG5cbi8qKiBGYWlsLWNsb3NlZCBwcmVkaWNhdGU6IG1hdGNoZXMgbm8gcm93cy4gKi9cbmNvbnN0IE5PX1JPV1M6IFNRTCA9IHNxbGBmYWxzZWA7XG5cbi8qKiBQZXItZW50aXR5IHR1bmluZyBvZiB7QGxpbmsgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcn0uICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc0NvbnRyb2xPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIFNZU1RFTSBvcmcncyBgcHVibGljYCBydW5nIHJlYWNoZXMgY2FsbGVycyBpbiBvdGhlciBvcmdzIChhbmRcbiAgICogYW5vbnltb3VzIGNhbGxlcnMpLiBEZWZhdWx0IHRydWU6IHRoZSBzeXN0ZW0gb3JnJ3Mgc2FtcGxlIHBpcGVsaW5lcyxcbiAgICogdGVtcGxhdGVzIGFuZCBkYXNoYm9hcmRzIGFyZSB2aXNpYmxlIGZyb20gZXZlcnkgb3JnLiBQbHVnaW5zIHNldCBpdCBmYWxzZTpcbiAgICogc2luY2UgdGhlIHBsdWdpbiBlY29zeXN0ZW0gdGhlIE9mZmljaWFsIGNhdGFsb2cgcmVhY2hlc1xuICAgKiBvdGhlciBvcmdzIG9ubHkgYXMgTElTVElOR1MgcmVzb2x2ZWQgdGhyb3VnaCBpbnN0YWxscywgbmV2ZXIgdGhyb3VnaFxuICAgKiBgdmlzaWJpbGl0eSA9ICdwdWJsaWMnYCBvbiBhIGBwbHVnaW5zYCByb3cuXG4gICAqL1xuICBzeXN0ZW1DYXRhbG9nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBHZW5lcmljIGFjY2VzcyBjb250cm9sIHF1ZXJ5IGJ1aWxkZXIgZm9yIG11bHRpLXRlbmFudCBlbnRpdGllcy5cbiAqXG4gKiBDb25zb2xpZGF0ZXMgZHVwbGljYXRlIGFjY2VzcyBjb250cm9sIGxvZ2ljIHNoYXJlZCBhY3Jvc3MgcGlwZWxpbmUgYW5kIHBsdWdpbiBxdWVyaWVzLlxuICogSGFuZGxlczpcbiAqIC0gTXVsdGktdGVuYW50IGFjY2VzcyBjb250cm9sIChwdWJsaWMvcHJpdmF0ZS9vcmctYW5kLXB1YmxpYylcbiAqIC0gVVVJRCBwcmVmaXggbWF0Y2hpbmcgZm9yIElEIGZpbHRlcnNcbiAqIC0gQm9vbGVhbiBmaWVsZCBub3JtYWxpemF0aW9uXG4gKlxuICogQHR5cGVQYXJhbSBUU2NoZW1hIC0gU2NoZW1hIHRhYmxlIHR5cGUgd2l0aCBhY2Nlc3MgY29udHJvbCBmaWVsZHNcbiAqIEB0eXBlUGFyYW0gVEZpbHRlciAtIEZpbHRlciB0eXBlIGV4dGVuZGluZyBCYXNlQWNjZXNzRmlsdGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyPFxuICBUU2NoZW1hIGV4dGVuZHMgQWNjZXNzQ29udHJvbFNjaGVtYSxcbiAgVEZpbHRlciBleHRlbmRzIEJhc2VBY2Nlc3NGaWx0ZXIsXG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY2hlbWE6IFRTY2hlbWEsXG4gICAgcHJpdmF0ZSBvcHRpb25zOiBBY2Nlc3NDb250cm9sT3B0aW9ucyA9IHt9LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBjYWxsZXIncyB2aXNpYmxlIHNsaWNlIG9mIGEgY2F0YWxvZywgZnJvbSB0aGUgdGhyZWUtcnVuZ1xuICAgKiBgdmlzaWJpbGl0eWAgbGFkZGVyIHNoYXJlZCBieSBldmVyeSBjYXRhbG9nIGVudGl0eS5cbiAgICpcbiAgICogRWZmZWN0aXZlIHJlYWQgc2V0IGZvciBhIGNhbGxlciBpbiBvcmcgYE9gIGFzIHVzZXIgYFZgIHdob3NlIHBhcmVudCBvcmcgaXMgYFBgOlxuICAgKlxuICAgKiAgIChvcmdfaWQgPSBPIEFORCAodmlzaWJpbGl0eSA8PiAncHJpdmF0ZScgT1IgY3JlYXRlZF9ieSA9IFYpKVxuICAgKiAgIE9SICh2aXNpYmlsaXR5ID0gJ3B1YmxpYycgQU5EIChvcmdfaWQgPSAnc3lzdGVtJyBPUiBvcmdfaWQgPSBQKSlcbiAgICpcbiAgICogaS5lLiB5b3VyIG93biBvcmcncyBzaGFyZWQgcnVuZ3MgcGx1cyB5b3VyIG93biBkcmFmdHMsIHdpZGVuZWQgYnkgdGhlIHN5c3RlbVxuICAgKiBvcmcncyBwdWJsaWMgY2F0YWxvZyAodGhlIHN0YW5kaW5nIFwic3lzdGVtLW9yZyBjb250ZW50IGlzIHZpc2libGUgZnJvbSBldmVyeVxuICAgKiBvcmdcIiBydWxlKSBhbmQg4oCUIGZvciBhIHRlYW0g4oCUIGl0cyBwYXJlbnQncyBwdWJsaWMgcm93cy4gVGhlIGBwdWJsaWNgLW9ubHlcbiAgICogcmVzdHJpY3Rpb24gYXBwbGllcyBzb2xlbHkgdG8gdGhvc2UgT1RIRVIgb3Jncycgcm93czsgd2l0aGluIHlvdXIgb3duIG9yZyB5b3VcbiAgICogYWx3YXlzIHNlZSBldmVyeXRoaW5nIHlvdSBhcmUgZW50aXRsZWQgdG8sIG9yIGEgZnJlc2hseS1jcmVhdGVkIHByaXZhdGUgcm93XG4gICAqIHdvdWxkIHZhbmlzaCBmcm9tIGl0cyBvd24gYXV0aG9yJ3MgbGlzdGluZy5cbiAgICpcbiAgICogQW4gZW50aXR5IGNhbiBkcm9wIHRoZSBzeXN0ZW0tb3JnIGJyYW5jaCB3aXRoIGBzeXN0ZW1DYXRhbG9nOiBmYWxzZWBcbiAgICogKHtAbGluayBBY2Nlc3NDb250cm9sT3B0aW9uc30pOiBwbHVnaW5zIGRvLCBzbyBhIHN5c3RlbS1vcmcgcGx1Z2luIHJlYWNoZXNcbiAgICogb3RoZXIgb3JncyBvbmx5IGFzIGFuIE9mZmljaWFsIGxpc3RpbmcuXG4gICAqXG4gICAqIEFuIGV4cGxpY2l0IGB2aXNpYmlsaXR5YCBmaWx0ZXIgTkFSUk9XUyB3aXRoaW4gdGhhdCBzZXQsIG5ldmVyIHdpZGVucyBpdCDigJRcbiAgICogc28gYD92aXNpYmlsaXR5PXB1YmxpY2Agc3RpbGwgc3VyZmFjZXMgdGhlIHN5c3RlbS1vcmcgY2F0YWxvZy5cbiAgICpcbiAgICogRmFpbHMgQ0xPU0VEIG9uIGJvdGggYXhlczogbm8gYG9yZ0lkYCAoYW5vbnltb3VzKSDih5Igc3lzdGVtLW9yZyBwdWJsaWMgb25seTtcbiAgICogbm8gYHZpZXdlclVzZXJJZGAg4oeSIHRoZSBwcml2YXRlIHJ1bmcgbWF0Y2hlcyBub3RoaW5nIHJhdGhlciB0aGFuIGV2ZXJ5dGhpbmcuXG4gICAqIGB2aWV3ZXJJc1N1cGVyQWRtaW5gIGxpZnRzIHRoZSBwcml2YXRlIHJ1bmcgb25seSDigJQgYSBwbGF0Zm9ybSBvcGVyYXRvclxuICAgKiBhZG1pbmlzdGVycyB0aGUgd2hvbGUgY2F0YWxvZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbClcbiAgICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gUGFyZW50IG9yZyBJRCB3aGVuIHRoZSBjYWxsZXIgaXMgYSB0ZWFtIChvcHRpb25hbClcbiAgICogQHJldHVybnMgQXJyYXkgb2YgU1FMIGNvbmRpdGlvbnMgZm9yIGFjY2VzcyBjb250cm9sXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRBY2Nlc3NDb250cm9sKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW10ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG4gICAgY29uc3QgcmVxdWVzdGVkID0gZmlsdGVyLnZpc2liaWxpdHk7XG5cbiAgICBjb25zdCBzeXN0ZW1DYXRhbG9nID0gdGhpcy5vcHRpb25zLnN5c3RlbUNhdGFsb2cgIT09IGZhbHNlO1xuXG4gICAgaWYgKCFvcmdJZCkge1xuICAgICAgLy8gTm8gb3JnIGNvbnRleHQg4oCUIG9ubHkgdGhlIHN5c3RlbSBvcmcncyBwdWJsaWMgY2F0YWxvZyAobm90aGluZyBhdCBhbGxcbiAgICAgIC8vIGZvciBhbiBlbnRpdHkgd2l0aG91dCBvbmUpLlxuICAgICAgaWYgKCFzeXN0ZW1DYXRhbG9nKSByZXR1cm4gW05PX1JPV1NdO1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuc2NoZW1hLm9yZ0lkLCBTWVNURU1fT1JHX0lEKSk7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEodGhpcy5zY2hlbWEudmlzaWJpbGl0eSwgJ3B1YmxpYycpKTtcbiAgICAgIC8vIEFuIGFub255bW91cyBjYWxsZXIgYXNraW5nIGZvciBhIG5hcnJvd2VyIHJ1bmcgZ2V0cyBub3RoaW5nLCByYXRoZXIgdGhhblxuICAgICAgLy8gaGF2aW5nIHRoZSBuYXJyb3dpbmcgc2lsZW50bHkgaWdub3JlZC5cbiAgICAgIGlmIChyZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0ZWQgIT09ICdwdWJsaWMnKSBjb25kaXRpb25zLnB1c2goTk9fUk9XUyk7XG4gICAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gT3duLW9yZyByb3dzOiBldmVyeXRoaW5nIEVYQ0VQVCBvdGhlciBwZW9wbGUncyBwcml2YXRlIGRyYWZ0cy5cbiAgICBjb25zdCBvd25EcmFmdHNPbmx5ID0gZmlsdGVyLnZpZXdlclVzZXJJZCA/IGVxKHRoaXMuc2NoZW1hLmNyZWF0ZWRCeSwgZmlsdGVyLnZpZXdlclVzZXJJZCkgOiBOT19ST1dTO1xuICAgIGNvbnN0IG93bk9yZyA9IGZpbHRlci52aWV3ZXJJc1N1cGVyQWRtaW5cbiAgICAgID8gZXEodGhpcy5zY2hlbWEub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZClcbiAgICAgIDogYW5kKGVxKHRoaXMuc2NoZW1hLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLCBvcihuZSh0aGlzLnNjaGVtYS52aXNpYmlsaXR5LCAncHJpdmF0ZScpLCBvd25EcmFmdHNPbmx5KSEpITtcblxuICAgIC8vIFJvd3MgZnJvbSBPVEhFUiBvcmdzIGFyZSBvbmx5IGV2ZXIgdmlzaWJsZSBhdCB0aGUgYHB1YmxpY2AgcnVuZy5cbiAgICBjb25zdCBvdGhlck9yZ1Njb3BlczogU1FMW10gPSBbXTtcbiAgICBpZiAoc3lzdGVtQ2F0YWxvZykgb3RoZXJPcmdTY29wZXMucHVzaChlcSh0aGlzLnNjaGVtYS5vcmdJZCwgU1lTVEVNX09SR19JRCkpO1xuICAgIGlmIChwYXJlbnRPcmdJZCkgb3RoZXJPcmdTY29wZXMucHVzaChlcSh0aGlzLnNjaGVtYS5vcmdJZCwgcGFyZW50T3JnSWQudG9Mb3dlckNhc2UoKSkpO1xuICAgIGNvbmRpdGlvbnMucHVzaChvdGhlck9yZ1Njb3Blcy5sZW5ndGggPiAwXG4gICAgICA/IG9yKG93bk9yZywgYW5kKGVxKHRoaXMuc2NoZW1hLnZpc2liaWxpdHksICdwdWJsaWMnKSwgb3IoLi4ub3RoZXJPcmdTY29wZXMpISkhKSFcbiAgICAgIDogb3duT3JnKTtcblxuICAgIGlmIChyZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuc2NoZW1hLnZpc2liaWxpdHksIHJlcXVlc3RlZCkpO1xuXG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgSUQgZmlsdGVyIHdpdGggVVVJRCBwcmVmaXggbWF0Y2hpbmcgc3VwcG9ydFxuICAgKlxuICAgKiAtIEZ1bGwgVVVJRDogRXhhY3QgbWF0Y2hcbiAgICogLSBQYXJ0aWFsIFVVSUQ6IFByZWZpeCBtYXRjaCB1c2luZyBTUUwgTElLRVxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBJRCBmaWx0ZXIgdmFsdWUgKGZ1bGwgb3IgcGFydGlhbCBVVUlEKVxuICAgKiBAcmV0dXJucyBTUUwgY29uZGl0aW9uIG9yIG51bGwgaWYgbm8gSUQgZmlsdGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRJZEZpbHRlcihpZDogdW5rbm93bik6IFNRTCB8IG51bGwge1xuICAgIHJldHVybiBidWlsZElkQ29uZGl0aW9uKHRoaXMuc2NoZW1hLmlkLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYm9vbGVhbiBmaWVsZCBjb25kaXRpb25zIChpc0RlZmF1bHQsIGlzQWN0aXZlKVxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zIGZvciBib29sZWFuIGZpZWxkc1xuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkQm9vbGVhbkZpbHRlcnMoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+KTogU1FMW10ge1xuICAgIHJldHVybiBidWlsZEJvb2xlYW5Db25kaXRpb25zKHRoaXMuc2NoZW1hLCBmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFsbCBjb21tb24gY29uZGl0aW9ucyAoYWNjZXNzIGNvbnRyb2wgKyBJRCArIGJvb2xlYW5zKVxuICAgKlxuICAgKiBUaGlzIGNvbWJpbmVzIGFsbCB0aGUgZ2VuZXJpYyBmaWx0ZXJzIHRoYXQgYXBwbHkgdG8gYW55IGFjY2Vzcy1jb250cm9sbGVkIGVudGl0eS5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgY2FsbCB0aGlzIGFuZCBhZGQgZW50aXR5LXNwZWNpZmljIGNvbmRpdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIGZhbGxzIGJhY2sgdG8gc3lzdGVtLXB1YmxpYy1vbmx5KVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9uc1xuICAgKi9cbiAgcHVibGljIGJ1aWxkQ29tbW9uQ29uZGl0aW9ucyhmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gICAgLy8gQWNjZXNzIGNvbnRyb2wgKG11bHRpLXRlbmFudCkg4oCUIGhhbmRsZXMgdmlzaWJpbGl0eSBpbnRlcm5hbGx5XG4gICAgY29uZGl0aW9ucy5wdXNoKC4uLnRoaXMuYnVpbGRBY2Nlc3NDb250cm9sKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKSk7XG5cbiAgICAvLyBJRCBmaWx0ZXIgd2l0aCBwcmVmaXggbWF0Y2hpbmdcbiAgICBjb25zdCBpZENvbmRpdGlvbiA9IHRoaXMuYnVpbGRJZEZpbHRlcihmaWx0ZXIuaWQpO1xuICAgIGlmIChpZENvbmRpdGlvbikgY29uZGl0aW9ucy5wdXNoKGlkQ29uZGl0aW9uKTtcblxuICAgIC8vIEJvb2xlYW4gZmlsdGVyc1xuICAgIGNvbmRpdGlvbnMucHVzaCguLi50aGlzLmJ1aWxkQm9vbGVhbkZpbHRlcnMoZmlsdGVyKSk7XG5cbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxufVxuIl19
@@ -33,4 +33,4 @@ export async function listEnabledAlertDestinations(orgId) {
33
33
  .where(and(eq(schema.orgAlertDestination.orgId, orgId), eq(schema.orgAlertDestination.enabled, true), isNull(schema.orgAlertDestination.deletedAt))));
34
34
  return rows;
35
35
  }
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGVzdGluYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9hbGVydC1kZXN0aW5hdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVl0RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDRCQUE0QixDQUFDLEtBQWE7SUFDOUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDaEQsRUFBRSxFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1FBQ2pDLE9BQU8sRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTztRQUMzQyxNQUFNLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU07UUFDekMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO0tBQ3hDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1NBQ2hDLEtBQUssQ0FBQyxHQUFHLENBQ1IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQzNDLEVBQUUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUM1QyxNQUFNLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNOLE9BQU8sSUFBaUMsQ0FBQztBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUmVhZGluZyBhbiBvcmcncyBub3RpZmljYXRpb24gZGVzdGluYXRpb25zLlxuICpcbiAqIFRoZXNlIHJvd3MgYXJlIEFETUlOLU9XTkVEOiBhbiBvcmcncyBhZG1pbnMgZGVjaWRlZCB3aGVyZSB0aGlzIG9yZ2FuaXphdGlvbidzXG4gKiBub3RpZmljYXRpb25zIGdvLCBhbmQgZXZlcnl0aGluZyB0aGF0IG5lZWRzIHRvIG5vdGlmeSBhbiBvcmcgcmVhZHMgdGhlIHNhbWUgbGlzdFxuICogcmF0aGVyIHRoYW4gZ3Jvd2luZyBpdHMgb3duIGNvcHkuIFBsYXRmb3JtIG93bnMgdGhlIHdyaXRlcyAoY3JlYXRlLCB1cGRhdGUsIHRlc3QsXG4gKiBkZWxldGUpIGluIGl0cyBhbGVydC1kZXN0aW5hdGlvbiBzZXJ2aWNlOyB0aGlzIGlzIHRoZSByZWFkLCBoZXJlIHNvIHRoYXQgYSBzZXJ2aWNlXG4gKiB3aXRoIG5vIERyaXp6bGUgZGVwZW5kZW5jeSBvZiBpdHMgb3duIGNhbiB1c2UgaXQuXG4gKlxuICogV2hvZXZlciByZWFkcyB0aGlzIGxpc3QgbXVzdCBub3QgdHJlYXQgaXQgYXMgYSBVUkwgdGhleSBjaG9zZS4gQSBjYWxsZXIgdGhhdCBsZXQgYVxuICogdXNlciBuYW1lIHRoZSB0YXJnZXQgd291bGQgaGF2ZSByZWludmVudGVkIGFuIFNTUkYsIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSB3cml0ZVxuICogc2lkZSB2YWxpZGF0ZXMgdGhlIGNoYW5uZWwvdGFyZ2V0IHBhaXJpbmcgYW5kIHRoZSB0cmFuc3BvcnQgcmVzb2x2ZXMtYW5kLXBpbnMgdGhlIGhvc3QuXG4gKi9cblxuaW1wb3J0IHsgYW5kLCBlcSwgaXNOdWxsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4IH0gZnJvbSAnLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5cbi8qKiBPbmUgZGVzdGluYXRpb24sIHJlZHVjZWQgdG8gd2hhdCBhIGRlbGl2ZXJ5IG5lZWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25EZXN0aW5hdGlvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBgc2xhY2tgIHwgYHdlYmhvb2tgIHwgYGVtYWlsYCB8IGBpbi1hcHBgLiAqL1xuICBjaGFubmVsOiBzdHJpbmc7XG4gIC8qKiBUaGUgVVJMIG9yIGFkZHJlc3MuIEJlYXJlci1lcXVpdmFsZW50IGZvciBhIHdlYmhvb2sg4oCUIG5ldmVyIGxvZ2dlZC4gKi9cbiAgdGFyZ2V0OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXZlcnkgRU5BQkxFRCwgdW5kZWxldGVkIGRlc3RpbmF0aW9uIGZvciBhbiBvcmcuXG4gKlxuICogUnVucyBpbiB0aGUgY2FsbGVyJ3MgYW1iaWVudCB0ZW5hbnQgY29udGV4dCwgc28gUkxTIGlzIHRoZSB0ZW5hbmN5IGdhdGUg4oCUIGEgY2FsbGVyXG4gKiB3aXRob3V0IGEgY29udGV4dCBmb3IgdGhpcyBvcmcgcmVhZHMgbm90aGluZywgd2hpY2ggaXMgdGhlIGNvcnJlY3QgYW5zd2VyIHJhdGhlciB0aGFuXG4gKiBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RFbmFibGVkQWxlcnREZXN0aW5hdGlvbnMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8Tm90aWZpY2F0aW9uRGVzdGluYXRpb25bXT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHtcbiAgICBpZDogc2NoZW1hLm9yZ0FsZXJ0RGVzdGluYXRpb24uaWQsXG4gICAgY2hhbm5lbDogc2NoZW1hLm9yZ0FsZXJ0RGVzdGluYXRpb24uY2hhbm5lbCxcbiAgICB0YXJnZXQ6IHNjaGVtYS5vcmdBbGVydERlc3RpbmF0aW9uLnRhcmdldCxcbiAgICBsYWJlbDogc2NoZW1hLm9yZ0FsZXJ0RGVzdGluYXRpb24ubGFiZWwsXG4gIH0pLmZyb20oc2NoZW1hLm9yZ0FsZXJ0RGVzdGluYXRpb24pXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKHNjaGVtYS5vcmdBbGVydERlc3RpbmF0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICBlcShzY2hlbWEub3JnQWxlcnREZXN0aW5hdGlvbi5lbmFibGVkLCB0cnVlKSxcbiAgICAgIGlzTnVsbChzY2hlbWEub3JnQWxlcnREZXN0aW5hdGlvbi5kZWxldGVkQXQpLFxuICAgICkpKTtcbiAgcmV0dXJuIHJvd3MgYXMgTm90aWZpY2F0aW9uRGVzdGluYXRpb25bXTtcbn1cbiJdfQ==
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGVzdGluYXRpb25zLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2FsZXJ0LWRlc3RpbmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBWXREOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsNEJBQTRCLENBQUMsS0FBYTtJQUM5RCxNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNoRCxFQUFFLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7UUFDakMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPO1FBQzNDLE1BQU0sRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTTtRQUN6QyxLQUFLLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUs7S0FDeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUM7U0FDaEMsS0FBSyxDQUFDLEdBQUcsQ0FDUixFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFDM0MsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ04sT0FBTyxJQUFpQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSZWFkaW5nIGFuIG9yZydzIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbnMuXG4gKlxuICogVGhlc2Ugcm93cyBhcmUgQURNSU4tT1dORUQ6IGFuIG9yZydzIGFkbWlucyBkZWNpZGVkIHdoZXJlIHRoaXMgb3JnYW5pemF0aW9uJ3NcbiAqIG5vdGlmaWNhdGlvbnMgZ28sIGFuZCBldmVyeXRoaW5nIHRoYXQgbmVlZHMgdG8gbm90aWZ5IGFuIG9yZyByZWFkcyB0aGUgc2FtZSBsaXN0XG4gKiByYXRoZXIgdGhhbiBncm93aW5nIGl0cyBvd24gY29weS4gUGxhdGZvcm0gb3ducyB0aGUgd3JpdGVzIChjcmVhdGUsIHVwZGF0ZSwgdGVzdCxcbiAqIGRlbGV0ZSkgaW4gaXRzIGFsZXJ0LWRlc3RpbmF0aW9uIHNlcnZpY2U7IHRoaXMgaXMgdGhlIHJlYWQsIGhlcmUgc28gdGhhdCBhIHNlcnZpY2VcbiAqIHdpdGggbm8gRHJpenpsZSBkZXBlbmRlbmN5IG9mIGl0cyBvd24gY2FuIHVzZSBpdC5cbiAqXG4gKiBXaG9ldmVyIHJlYWRzIHRoaXMgbGlzdCBtdXN0IG5vdCB0cmVhdCBpdCBhcyBhIFVSTCB0aGV5IGNob3NlLiBBIGNhbGxlciB0aGF0IGxldCBhXG4gKiB1c2VyIG5hbWUgdGhlIHRhcmdldCB3b3VsZCBoYXZlIHJlaW52ZW50ZWQgYW4gU1NSRiwgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhlIHdyaXRlXG4gKiBzaWRlIHZhbGlkYXRlcyB0aGUgY2hhbm5lbC90YXJnZXQgcGFpcmluZyBhbmQgdGhlIHRyYW5zcG9ydCByZXNvbHZlcy1hbmQtcGlucyB0aGUgaG9zdC5cbiAqL1xuXG5pbXBvcnQgeyBhbmQsIGVxLCBpc051bGwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHggfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuLyoqIE9uZSBkZXN0aW5hdGlvbiwgcmVkdWNlZCB0byB3aGF0IGEgZGVsaXZlcnkgbmVlZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIGBzbGFja2AgfCBgd2ViaG9va2AgfCBgZW1haWxgIHwgYGluLWFwcGAuICovXG4gIGNoYW5uZWw6IHN0cmluZztcbiAgLyoqIFRoZSBVUkwgb3IgYWRkcmVzcy4gQmVhcmVyLWVxdWl2YWxlbnQgZm9yIGEgd2ViaG9vayDigJQgbmV2ZXIgbG9nZ2VkLiAqL1xuICB0YXJnZXQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFdmVyeSBFTkFCTEVELCB1bmRlbGV0ZWQgZGVzdGluYXRpb24gZm9yIGFuIG9yZy5cbiAqXG4gKiBSdW5zIGluIHRoZSBjYWxsZXIncyBhbWJpZW50IHRlbmFudCBjb250ZXh0LCBzbyBSTFMgaXMgdGhlIHRlbmFuY3kgZ2F0ZSDigJQgYSBjYWxsZXJcbiAqIHdpdGhvdXQgYSBjb250ZXh0IGZvciB0aGlzIG9yZyByZWFkcyBub3RoaW5nLCB3aGljaCBpcyB0aGUgY29ycmVjdCBhbnN3ZXIgcmF0aGVyIHRoYW5cbiAqIGFuIGVycm9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEVuYWJsZWRBbGVydERlc3RpbmF0aW9ucyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxOb3RpZmljYXRpb25EZXN0aW5hdGlvbltdPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3Qoe1xuICAgIGlkOiBzY2hlbWEub3JnQWxlcnREZXN0aW5hdGlvbi5pZCxcbiAgICBjaGFubmVsOiBzY2hlbWEub3JnQWxlcnREZXN0aW5hdGlvbi5jaGFubmVsLFxuICAgIHRhcmdldDogc2NoZW1hLm9yZ0FsZXJ0RGVzdGluYXRpb24udGFyZ2V0LFxuICAgIGxhYmVsOiBzY2hlbWEub3JnQWxlcnREZXN0aW5hdGlvbi5sYWJlbCxcbiAgfSkuZnJvbShzY2hlbWEub3JnQWxlcnREZXN0aW5hdGlvbilcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoc2NoZW1hLm9yZ0FsZXJ0RGVzdGluYXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgIGVxKHNjaGVtYS5vcmdBbGVydERlc3RpbmF0aW9uLmVuYWJsZWQsIHRydWUpLFxuICAgICAgaXNOdWxsKHNjaGVtYS5vcmdBbGVydERlc3RpbmF0aW9uLmRlbGV0ZWRBdCksXG4gICAgKSkpO1xuICByZXR1cm4gcm93cyBhcyBOb3RpZmljYXRpb25EZXN0aW5hdGlvbltdO1xufVxuIl19
@@ -869,4 +869,4 @@ export class CrudService {
869
869
  return purgedId ?? null;
870
870
  }
871
871
  }
872
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jcnVkLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNySixPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR2pHLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUcsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzlGOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxJQUFhO0lBQzFDLE9BQU8sSUFBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFhO0lBQ3hDLE9BQU8sSUFBMkIsQ0FBQztBQUNyQyxDQUFDO0FBeUVEOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRTVHOzs7NkVBRzZFO0FBQzdFLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyx3QkFBd0IsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBQ0gsTUFBTSxPQUFnQixXQUFXO0lBUy9COzs7OztPQUtHO0lBQ0gsSUFBWSxJQUFJO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBZ0MsQ0FBQztJQUMvQyxDQUFDO0lBeUJnQixPQUFPLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXhEO1FBQ0Usd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxzRUFBc0U7UUFDdEUsNERBQTREO1FBQzVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksb0RBQW9ELENBQUMsQ0FBQztRQUNoRyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7MEVBR3NFO0lBQzlELFlBQVksQ0FBQyxFQUFVLEVBQUUsS0FBYyxFQUFFLFdBQW9CO1FBQ25FLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEVBQWlDLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQztZQUNsRixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7U0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGFBQWE7UUFDbkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLGVBQWUsQ0FBQyxFQUFVLEVBQUUsS0FBYztRQUNoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxpRUFBaUU7UUFDakUseUVBQXlFO1FBQ3pFLHdFQUF3RTtRQUN4RSxJQUFJLEtBQUs7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzRCwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsNkVBQTZFO1FBQzdFLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O3NEQUVrRDtJQUMxQyxnQkFBZ0IsQ0FBQyxFQUFVO1FBQ2pDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCx5RkFBeUY7SUFDakYsS0FBSyxDQUFDLE1BQWM7UUFDMUIsT0FBTyxNQUFNLElBQUksZUFBZSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsOERBQThEO0lBQ3RELEdBQUcsQ0FBQyxNQUErQjtRQUN6QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsMkVBQTJFO0lBQ25FLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBeUI7UUFDN0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUVELHNFQUFzRTtJQUM5RCxZQUFZLENBQUMsR0FBUyxFQUFFLE1BQWM7UUFDNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxPQUFPO1lBQ0wsUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUsR0FBRztZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsU0FBUyxFQUFFLEdBQUc7WUFDZCxTQUFTLEVBQUUsSUFBSTtZQUNmLHlFQUF5RTtZQUN6RSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDO1NBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQWlCLEVBQUUsS0FBYTtRQUN2RCxNQUFNLFNBQVMsR0FBRyxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFO2lCQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7aUJBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2lCQUNqQixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7aUJBQ3pCLEtBQUssQ0FBQyxLQUFLLENBQUM7aUJBQ1osSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVuRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsMkVBQTJFO0lBRTNFLDJDQUEyQztJQUNqQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQWdCLEVBQUUsT0FBZSxJQUFrQixDQUFDO0lBRWxGLHdDQUF3QztJQUM5QixLQUFLLENBQUMsYUFBYSxDQUFDLEdBQVcsRUFBRSxPQUFnQixFQUFFLE9BQWUsSUFBa0IsQ0FBQztJQUUvRiw2Q0FBNkM7SUFDbkMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZ0IsRUFBRSxPQUFlLElBQWtCLENBQUM7SUFFL0Y7cUZBQ2lGO0lBQ3ZFLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBVyxFQUFFLE9BQWdCLEVBQUUsT0FBZSxJQUFrQixDQUFDO0lBRWhHOzs7O21FQUkrRDtJQUNyRCxLQUFLLENBQUMsYUFBYSxDQUFDLElBQWMsRUFBRSxHQUFXLElBQWtCLENBQUM7SUFFNUU7NEVBQ3dFO0lBQzlELEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBYyxJQUFrQixDQUFDO0lBRTlEO3lGQUNxRjtJQUNyRixJQUFjLHFCQUFxQjtRQUNqQyxPQUFPLHdCQUF3QixDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztnRkFJNEU7SUFDbEUsZUFBZSxDQUFDLEdBQVM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNLLE9BQU8sQ0FBSSxXQUErQixFQUFFLEVBQW9CO1FBQ3RFLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUF3QixFQUFFLEtBQWMsRUFBRSxXQUFvQjtRQUN2RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFcEUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTthQUNqRSxNQUFNLEVBQUU7YUFDUixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNqQixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sZ0JBQWdCLENBQUMsT0FBeUIsRUFBRSxNQUFlLEVBQUUsWUFBcUI7UUFDMUYsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBd0IsRUFBRSxLQUFjLEVBQUUsV0FBb0I7UUFDNUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRWxFLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7YUFDaEYsTUFBTSxFQUFFO2FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDakIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO2FBQ3pCLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQzthQUNuQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpELE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FDakIsTUFBd0IsRUFDeEIsS0FBYyxFQUNkLE9BQU8sR0FBaUIsRUFBRSxFQUMxQixXQUFvQjtRQUVwQixNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsR0FBRyxrQkFBa0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQUcsS0FBSyxFQUFFLFlBQVksR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUN0SSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRTlELDhFQUE4RTtRQUM5RSwwRUFBMEU7UUFDMUUsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSxrRUFBa0U7UUFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDOUIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQztRQUM1RSxNQUFNLFNBQVMsR0FBRyxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNwRCxNQUFNLE9BQU8sR0FBRyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUUvRyw4RUFBOEU7UUFDOUUsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSw2REFBNkQ7UUFDN0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2RCxNQUFNLGFBQWEsR0FBRyxTQUFTO2VBQzFCLFlBQVksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxrRUFBa0U7ZUFDL0QsQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFlBQVksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNHLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDcEUsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFHLENBQUM7UUFFRCxpRUFBaUU7UUFDakUsd0VBQXdFO1FBQ3hFLG9FQUFvRTtRQUNwRSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUMvRCwwRUFBMEU7WUFDMUUseURBQXlEO1lBQ3pELE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEcsTUFBTSxVQUFVLEdBQUcsRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBZSxHQUFHLFVBQVUsUUFBUSxFQUFFLENBQUM7WUFFakcsbURBQW1EO1lBQ25ELE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDbkQsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztpQkFDeEYsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDO2lCQUNuQixLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztpQkFDaEIsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU5RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUM1QixNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMvQixPQUFPLE1BQWlCLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLE1BQU0sR0FBNkIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFFM0YsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEcsQ0FBQztZQUVELDBFQUEwRTtZQUMxRSxvRUFBb0U7WUFDcEUsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUN4RSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxFQUFFO3FCQUMzQixNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFRLGVBQWUsRUFBRSxDQUFDO3FCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztxQkFDakIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELE1BQU0sQ0FBQyxLQUFLLEdBQUcsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGdCQUFnQixDQUFDLE1BQWdCO1FBQ3ZDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFFMUMsTUFBTSxPQUFPLEdBQTRCLEVBQUUsQ0FBQztRQUM1Qyx3Q0FBd0M7UUFDeEMsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUUxQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksS0FBSyxLQUFLLElBQUk7Z0JBQUUsU0FBUyxDQUFDLG1CQUFtQjtZQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLElBQUksR0FBRztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2hDLENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQXdCLEVBQUUsS0FBYyxFQUFFLFdBQW9CO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVwRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTthQUNqRixNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFRLGVBQWUsRUFBRSxDQUFDO2FBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ2pCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRCxPQUFPLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQVUsRUFBRSxLQUFjLEVBQUUsV0FBb0I7UUFDN0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdELDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsd0VBQXdFO1FBQ3hFLDhEQUE4RDtRQUM5RCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7YUFDaEYsTUFBTSxFQUFFO2FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDakIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO2FBQ3pCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakQsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRCxzQkFBc0I7SUFFdEI7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLG1CQUFtQjtJQUNULFlBQVksQ0FBSSxJQUFPLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFDakQsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUMvQixNQUFNLENBQUMsR0FBRyxJQUErQixDQUFDO1FBQzFDLGdGQUFnRjtRQUNoRiw2RUFBNkU7UUFDN0UsZ0ZBQWdGO1FBQ2hGLGdGQUFnRjtRQUNoRiw2RUFBNkU7UUFDN0UsSUFBSSxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSx5R0FBeUcsQ0FBQyxDQUFDO1FBQ3JKLENBQUM7UUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuRSx3RUFBd0U7WUFDeEUsd0VBQXdFO1lBQ3hFLDRFQUE0RTtZQUM1RSwyRUFBMkU7WUFDM0UsZ0NBQWdDO1lBQ2hDLE1BQU0sSUFBSSxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25GLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpREFBaUQsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsbURBQW1ELEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUNELE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBTyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBYSxFQUFFLE1BQWM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELDBFQUEwRTtRQUMxRSw4RUFBOEU7UUFDOUUsK0VBQStFO1FBQy9FLHlFQUF5RTtRQUN6RSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTthQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNmLEdBQUcsUUFBUTtZQUNYLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDOUIsQ0FBQyxDQUFDO2FBQ0YsbUJBQW1CLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQXFCLEVBQUUsQ0FBQzthQUMzRCxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxhQUFhLENBQUMsd0ZBQXdGLENBQUMsQ0FBQztRQUNwSCxDQUFDO1FBRUQsdUVBQXVFO1FBQ3ZFLHlFQUF5RTtRQUN6RSxvRUFBb0U7UUFDcEUsc0VBQXNFO1FBQ3RFLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQ1YsRUFBVSxFQUNWLElBQXNCLEVBQ3RCLEtBQWEsRUFDYixNQUFjO1FBRWQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkQsOEVBQThFO1FBQzlFLGlGQUFpRjtRQUNqRiwwRUFBMEU7UUFDMUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTthQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNaLEdBQUcsUUFBUTtZQUNYLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDOUIsQ0FBQyxDQUFDO2FBQ0YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO2FBQ3pCLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsT0FBTyxPQUFPLElBQUksSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBVSxFQUFFLEtBQWEsRUFBRSxNQUFjO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFFdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7YUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDbkIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUM3QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7YUFDekIsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxPQUFPLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUNkLE9BQWUsRUFDZixHQUFXLEVBQ1gsRUFBVSxFQUNWLE1BQWM7UUFFZCw4RUFBOEU7UUFDOUUsMEVBQTBFO1FBQzFFLHlEQUF5RDtRQUN6RCxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQy9CLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsS0FBSztZQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzNELE9BQU8sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFOUMsaURBQWlEO1lBQ2pELE1BQU0sZUFBZSxHQUFHO2dCQUN0QixFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQztnQkFDbEIsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQzthQUM5QixDQUFDO1lBQ0YsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUVELGdGQUFnRjtZQUNoRixNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQ2QsR0FBRyxDQUFBLGtCQUFrQixJQUFJLENBQUMsTUFBTTtvQkFDcEIsU0FBUyxNQUFNLEdBQUc7b0JBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztjQUN6QixhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxPQUFPLGFBQWEsTUFBTSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLEVBQUU7dUJBQ3JELENBQ2hCLENBQUM7WUFFRiw0Q0FBNEM7WUFDNUMsTUFBTSxFQUFFO2lCQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2lCQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDWixTQUFTLEVBQUUsS0FBSztnQkFDaEIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7YUFDOUIsQ0FBQyxDQUFDO2lCQUNGLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBRWxDLGlFQUFpRTtZQUNqRSwwRUFBMEU7WUFDMUUsK0RBQStEO1lBQy9ELDBFQUEwRTtZQUMxRSx5RUFBeUU7WUFDekUsNkVBQTZFO1lBQzdFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLEVBQUU7aUJBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2lCQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDWixTQUFTLEVBQUUsSUFBSTtnQkFDZixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQzthQUM5QixDQUFDLENBQUM7aUJBQ0YsS0FBSyxDQUNKLEdBQUcsQ0FDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQ3pCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQ2xCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FDN0IsQ0FDRjtpQkFDQSxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVsRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM1RCxDQUFDO1lBRUQsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUNkLE1BQXdCLEVBQ3hCLElBQXNCLEVBQ3RCLEtBQWEsRUFDYixNQUFjO1FBRWQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsMEVBQTBFO1FBQzFFLDJFQUEyRTtRQUMzRSxxRUFBcUU7UUFDckUsNEVBQTRFO1FBQzVFLGVBQWU7UUFDZixJQUFJLEtBQUs7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUUzRCw4RUFBOEU7UUFDOUUsb0NBQW9DO1FBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekMsT0FBTyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTthQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNaLEdBQUcsUUFBUTtZQUNYLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDOUIsQ0FBQyxDQUFDO2FBQ0YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO2FBQ3pCLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUdEOzs7Ozs7O09BT0c7SUFDSywwQkFBMEIsQ0FDaEMsTUFBbUUsRUFDbkUsTUFBYyxFQUNkLFNBQXFCLEVBQ3JCLFlBQXdCO1FBRXhCLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsYUFBYTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRS9DLE1BQU0sS0FBSyxHQUFVLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVDLDJFQUEyRTtRQUMzRSwyRUFBMkU7UUFDM0UsMENBQTBDO1FBQzFDLElBQUksWUFBWSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBUSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFVBQVU7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUUzRCxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFRLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUNkLEdBQWEsRUFDYixLQUFhLEVBQ2IsTUFBYztJQUNkOzs7Ozs7O09BT0c7SUFDSCxNQUF3RDtRQUV4RCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRWhDLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsOEVBQThFO1FBQzlFLDBFQUEwRTtRQUMxRSwrQ0FBK0M7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDdkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDekMsTUFBTSxVQUFVLEdBQUc7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQztZQUMxQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBc0IsRUFBRSxLQUFLLENBQUM7WUFDdEQsb0VBQW9FO1lBQ3BFLG9FQUFvRTtZQUNwRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xELEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQztZQUMzRSw2REFBNkQ7WUFDN0QsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFO1NBQ3hCLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDN0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO2FBQ3pCLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUcsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OEJBRzBCO0lBQ2xCLG1CQUFtQixDQUFDLEtBQWMsRUFBRSxFQUFXO1FBQ3JELE1BQU0sVUFBVSxHQUFVO1lBQ3hCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7WUFDN0IsR0FBRyxDQUFBLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLGNBQWM7WUFDdkMsR0FBRyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7U0FDeEMsQ0FBQztRQUNGLElBQUksRUFBRSxLQUFLLFNBQVM7WUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksS0FBSztZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNLLDZCQUE2QjtRQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN2QyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzFCLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDL0IsSUFBSSxHQUFHLEVBQUUsWUFBWTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRWpDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRSxNQUFNLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQVUsQ0FBQyxHQUFHLENBQUEsR0FBRyxTQUFTLGVBQWUsQ0FBQyxDQUFDO1FBQ3RELElBQUksWUFBWSxJQUFJLE1BQU07WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRSxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFRLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFVLEVBQUUsS0FBYSxFQUFFLE1BQWM7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsc0NBQXNDO1FBQzdFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFdkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7YUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDbkIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDWixRQUFRLEVBQUUsSUFBSTtZQUNkLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDN0IsU0FBUyxFQUFFLElBQUk7WUFDZixTQUFTLEVBQUUsSUFBSTtZQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN0RCxDQUFDLENBQUM7YUFDRixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7YUFDekIsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxPQUFPLFFBQVEsSUFBSSxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFVLEVBQUUsS0FBYztRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV2RCxNQUFNLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2FBQ2hELE1BQU0sRUFBRTthQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ2pCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQzthQUN6QixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2YsS0FBYSxFQUNiLElBQUksR0FBd0MsRUFBRTtRQUU5QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5ELE9BQU8sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7YUFDakMsTUFBTSxFQUFFO2FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDakIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO2FBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsQ0FBQzthQUNuQyxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ1osTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBUyxFQUFFLEtBQUssR0FBRyxHQUFHO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsY0FBYyxFQUFFLEdBQUcsQ0FBQSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekosT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLFVBQVU7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFVLEVBQUUsS0FBYztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqSCxPQUFPLFFBQVEsSUFBSSxJQUFJLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IENvbmZsaWN0RXJyb3IsIE5vdEZvdW5kRXJyb3IsIGNyZWF0ZUxvZ2dlciwgREVGQVVMVF9QQUdFX0xJTUlULCBNQVhfUEFHRV9MSU1JVCwgU1lTVEVNX0FDVE9SX0lELCBlbnZJbnQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBTUUwsIGVxLCBhbmQsIG9yLCBhc2MsIGRlc2MsIHNxbCwgaW5BcnJheSwgaXNOdWxsLCBnZXRUYWJsZUNvbHVtbnMgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQgdHlwZSB7IFBnVGFibGUgfSBmcm9tICdkcml6emxlLW9ybS9wZy1jb3JlJztcbmltcG9ydCB7IENVUlNPUl9TT1JUX0tFWSwgZGVjb2RlQ3Vyc29yLCBlbmNvZGVDdXJzb3IsIGlzQ2FzdGFibGVUbywga2V5c2V0QWZ0ZXIgfSBmcm9tICcuL2tleXNldC1jdXJzb3IuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCwgZ2V0VGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG5cbi8qKlxuICogQ2FzdCBEcml6emxlIHF1ZXJ5IHJlc3VsdHMgdG8gYSB0eXBlZCBhcnJheS5cbiAqIERyaXp6bGUncyBnZW5lcmljIHJldHVybiB0eXBlIChgUGdTZWxlY3RCYXNlPC4uLj5gKSBkb2Vzbid0IG5hcnJvdyB0byBvdXJcbiAqIGVudGl0eSBnZW5lcmljcywgc28gYW4gZXhwbGljaXQgY2FzdCBpcyBuZWVkZWQuIENlbnRyYWxpc2VkIGhlcmUgc28gZXZlcnlcbiAqIGNhbGwtc2l0ZSBzdGF5cyBvbmUtbGluZXIgY2xlYW4gYW5kIHRoZSBjYXN0IGlzIGRvY3VtZW50ZWQgaW4gb25lIHBsYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJpenpsZVJvd3M8VD4ocm93czogdW5rbm93bik6IFRbXSB7XG4gIHJldHVybiByb3dzIGFzIFRbXTtcbn1cblxuLyoqIENhc3QgYSBEcml6emxlIGFnZ3JlZ2F0ZSByZXN1bHQgdG8gZXh0cmFjdCBgW3sgY291bnQ6IG51bWJlciB9XWAuICovXG5leHBvcnQgZnVuY3Rpb24gZHJpenpsZUNvdW50KHJvd3M6IHVua25vd24pOiBbeyBjb3VudDogbnVtYmVyIH1dIHtcbiAgcmV0dXJuIHJvd3MgYXMgW3sgY291bnQ6IG51bWJlciB9XTtcbn1cblxuLyoqIFRoZSBEcml6emxlIHRyYW5zYWN0aW9uIG9iamVjdCBoYW5kZWQgdG8gYHdpdGhUZW5hbnRUeGAgY2FsbGJhY2tzLiBQYXNzZWQgdG9cbiAqICBgb25CZWZvcmVQdXJnZWAgc28gYSBzdWJjbGFzcydzIGRlcGVuZGVudCB0ZWFyZG93biBydW5zIGluIHRoZSBTQU1FIHB1cmdlXG4gKiAgdHJhbnNhY3Rpb24gKGF0b21pYyB3aXRoIHRoZSBwYXJlbnQgREVMRVRFKSwgbm90IGEgZnJlc2ggY29ubmVjdGlvbi4gKi9cbmV4cG9ydCB0eXBlIENydWRUeCA9IFBhcmFtZXRlcnM8UGFyYW1ldGVyczx0eXBlb2Ygd2l0aFRlbmFudFR4PlswXT5bMF07XG5cbi8qKlxuICogQmFzZSBpbnRlcmZhY2UgZm9yIGVudGl0aWVzIHdpdGggY29tbW9uIGZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICBpc0RlZmF1bHQ6IGJvb2xlYW47XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgdXBkYXRlZEJ5OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogUGFnaW5hdGlvbiBhbmQgc29ydGluZyBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlPcHRpb25zIHtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgc29ydEJ5Pzogc3RyaW5nO1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbiAgLyoqIFdoZW4gdHJ1ZSwgcnVucyBhIHNlcGFyYXRlIENPVU5UKCopIHF1ZXJ5IHRvIGluY2x1ZGUgZXhhY3QgdG90YWwuIERlZmF1bHQ6IGZhbHNlLiAqL1xuICBpbmNsdWRlVG90YWw/OiBib29sZWFuO1xuICAvKipcbiAgICogS2V5c2V0IHBhZ2luYXRpb246IHRoZSBvcGFxdWUgYG5leHRDdXJzb3JgIG9mIHRoZSBwcmV2aW91cyBwYWdlLiBDb250aW51ZXNcbiAgICogc3RyaWN0bHkgYWZ0ZXIgdGhhdCByb3cgaW4gKHNvcnRCeSwgaWQpIG9yZGVyOyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYG9mZnNldGAuXG4gICAqL1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIC8qKiBTcGFyc2UgZmllbGRzZXQ6IGNvbHVtbiBuYW1lcyB0byBzZWxlY3QuIFJldHVybnMgYWxsIGNvbHVtbnMgd2hlbiBvbWl0dGVkLiAqL1xuICBmaWVsZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQYWdpbmF0ZWQgcmVzdWx0IHdpdGggbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRSZXN1bHQ8VD4ge1xuICBkYXRhOiBUW107XG4gIC8qKiBUb3RhbCBjb3VudCBvZiBtYXRjaGluZyBlbnRpdGllcy4gT25seSBwcmVzZW50IHdoZW4gaW5jbHVkZVRvdGFsIGlzIHRydWUuICovXG4gIHRvdGFsPzogbnVtYmVyO1xuICBsaW1pdDogbnVtYmVyO1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgaGFzTW9yZTogYm9vbGVhbjtcbiAgLyoqIE9wYXF1ZSBjdXJzb3IgZm9yIHRoZSBuZXh0IHBhZ2UuIFByZXNlbnQgb25seSB3aGVuIGBoYXNNb3JlYC4gKi9cbiAgbmV4dEN1cnNvcj86IHN0cmluZztcbn1cblxuLyoqIFN0cnVjdHVyYWwgdmlldyBvZiB0aGUgc3ViY2xhc3MgdGFibGUncyBjb2x1bW5zIHRoZSBiYXNlIGNsYXNzIHRvdWNoZXNcbiAqICBkaXJlY3RseS4gYGlkYC9gaXNBY3RpdmVgL2Bpc0RlZmF1bHRgIGFyZSBhbHdheXMgcHJlc2VudCBvbiBhIENSVUQgZW50aXR5O1xuICogIGB2aXNpYmlsaXR5YCBvbmx5IG9uIHZpc2liaWxpdHktYmVhcmluZyBlbnRpdGllczsgdGhlIGluZGV4IHNpZ25hdHVyZVxuICogIGNvdmVycyBkeW5hbWljIChzcGFyc2UtZmllbGRzZXQpIGNvbHVtbiBhY2Nlc3MuICovXG5pbnRlcmZhY2UgQ3J1ZENvbHVtbnMge1xuICBpZDogQW55Q29sdW1uO1xuICBpc0FjdGl2ZTogQW55Q29sdW1uO1xuICBpc0RlZmF1bHQ6IEFueUNvbHVtbjtcbiAgdmlzaWJpbGl0eT86IEFueUNvbHVtbjtcbiAgLyoqIEF1dGhvciBjb2x1bW4g4oCUIHRoZSBgcHJpdmF0ZWAgcnVuZyBvZiB0aGUgdmlzaWJpbGl0eSBsYWRkZXIgaXMgYXV0aG9yLW9ubHkuICovXG4gIGNyZWF0ZWRCeT86IEFueUNvbHVtbjtcbiAgLy8gU29mdC1kZWxldGUgbGlmZWN5Y2xlIGNvbHVtbnMgKHByZXNlbnQgb24gdG9tYnN0b25lLWJlYXJpbmcgZW50aXRpZXMgb25seTtcbiAgLy8gYHJlc3RvcmVgL2BwdXJnZUV4cGlyZWRgIGFyZSBuby1vcHMgd2hlbiBhYnNlbnQpLlxuICBkZWxldGVkQXQ/OiBBbnlDb2x1bW47XG4gIHB1cmdlQWZ0ZXI/OiBBbnlDb2x1bW47XG4gIFtrZXk6IHN0cmluZ106IEFueUNvbHVtbiB8IHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIFJldGVudGlvbiBiZWZvcmUgYSBzb2Z0LWRlbGV0ZWQgcm93IGJlY29tZXMgcHVyZ2UtZWxpZ2libGUsIHNoYXJlZCBhY3Jvc3NcbiAqIGV2ZXJ5IENydWRTZXJ2aWNlIGVudGl0eSAodW5pZmllZCBgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgLCBkZWZhdWx0IDMwZCkuXG4gKiBTdGFtcGVkIGludG8gYHB1cmdlX2FmdGVyYCBhdCBkZWxldGUgdGltZTsgdGhlIHBlci1zZXJ2aWNlIHB1cmdlIHN3ZWVwIGhhcmQtXG4gKiBkZWxldGVzIHRvbWJzdG9uZXMgb25jZSBpdCBoYXMgcGFzc2VkLiBgMGAgZGlzYWJsZXMgcHVyZ2UtZGVhZGxpbmUgc3RhbXBpbmcuXG4gKi9cbmNvbnN0IFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUyA9IGVudkludCgnU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVMnLCAzMCwgeyBtaW46IDAgfSkgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogVGhlIHNoYXJlZCBzb2Z0LWRlbGV0ZSByZXRlbnRpb24gd2luZG93IGluIG1zIChgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgLFxuICogIGRlZmF1bHQgMzBkOyAwIGRpc2FibGVzIHB1cmdlLWRlYWRsaW5lIHN0YW1waW5nKS4gRXhwb3NlZCBzbyBub24tQ3J1ZFNlcnZpY2VcbiAqICBzb2Z0LWRlbGV0ZSBwYXRocyAoZS5nLiBwbGF0Zm9ybSdzIGhhbmQtcm9sbGVkIGRhc2hib2FyZC9hbGVydCBzZXJ2aWNlcylcbiAqICBzdGFtcCBgcHVyZ2VfYWZ0ZXJgIHdpdGggdGhlIFNBTUUgd2luZG93IHRoZSBDcnVkU2VydmljZSBlbnRpdGllcyB1c2UuICovXG5leHBvcnQgZnVuY3Rpb24gc29mdERlbGV0ZVJldGVudGlvbk1zKCk6IG51bWJlciB7XG4gIHJldHVybiBTT0ZUX0RFTEVURV9SRVRFTlRJT05fTVM7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgQ1JVRCBzZXJ2aWNlIHdpdGggbXVsdGktdGVuYW50IGFjY2VzcyBjb250cm9sIGFuZCBwYWdpbmF0aW9uLlxuICpcbiAqIFN1YmNsYXNzZXMgYmluZCB0byBhIHNwZWNpZmljIERyaXp6bGUgdGFibGUgYnkgaW1wbGVtZW50aW5nIGBzY2hlbWFgLFxuICogYGJ1aWxkQ29uZGl0aW9uc2AsIGBnZXRTb3J0Q29sdW1uYCwgYW5kIHRoZSBvcmcvcHJvamVjdC1jb2x1bW4gYWNjZXNzb3JzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEVudGl0eSAtIEVudGl0eSB0eXBlIGV4dGVuZGluZyBCYXNlRW50aXR5XG4gKiBAdHlwZVBhcmFtIFRGaWx0ZXIgLSBGaWx0ZXIgdHlwZSBmb3IgcXVlcnkgcGFyYW1ldGVyc1xuICogQHR5cGVQYXJhbSBUSW5zZXJ0IC0gSW5zZXJ0IERUTyB0eXBlXG4gKiBAdHlwZVBhcmFtIFRVcGRhdGUgLSBVcGRhdGUgRFRPIHR5cGVcbiAqXG4gKiAqKkEgbm90ZSBvbiB0aGUgdHlwZSBjYXN0cy4qKiBEcml6emxlJ3Mgcm93IHR5cGVzIGFyZSBpbmZlcnJlZCBmcm9tXG4gKiBgcGdUYWJsZSguLi4pYCBhbmQgZG9uJ3QgZ2VuZXJpY2FsbHkgbmFycm93IHRocm91Z2ggdGhlIGFic3RyYWN0IGBzY2hlbWFgXG4gKiBnZXR0ZXIsIHNvIHRoZSBiYXNlIGNsYXNzIGNhc3RzIHF1ZXJ5IHJlc3VsdHMgdG8gYFRFbnRpdHlgIGFuZCBiYWNrLiBUaGVcbiAqIGNhc3QgaXMgKm5vdCogYSBydW50aW1lIHNhZmV0eSBndWFyYW50ZWUg4oCUIGl0IHJlbGllcyBvbiBlYWNoIHN1YmNsYXNzXG4gKiBwYXNzaW5nIHRoZSBtYXRjaGluZyBlbnRpdHkgdHlwZS4gT3JnLXNjb3BpbmcgaXMgZW5mb3JjZWQgYnkgZXZlcnlcbiAqIHN1YmNsYXNzJ3MgYGJ1aWxkQ29uZGl0aW9uc2AgaW5qZWN0aW5nIGBXSEVSRSBvcmdfaWQgPSAkMWA7IHRoaXMgY2xhc3NcbiAqIGRvZXMgbm90IGFkZCB0aGF0IGZpbHRlciBpdHNlbGYuXG4gKlxuICogKipFcnJvciBwb2xpY3kuKiogRXJyb3JzIHByb3BhZ2F0ZSB1cCB0byB0aGUgcm91dGUtbGV2ZWwgaGFuZGxlclxuICogKGB3aXRoUm91dGVgKTsgbm8gY2F0Y2gtYW5kLXN3YWxsb3cgaGVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgUGlwZWxpbmVTZXJ2aWNlIGV4dGVuZHMgQ3J1ZFNlcnZpY2U8UGlwZWxpbmUsIFBpcGVsaW5lRmlsdGVyLCBQaXBlbGluZUluc2VydCwgUGlwZWxpbmVVcGRhdGU+IHtcbiAqICAgcHJvdGVjdGVkIGdldCBzY2hlbWEoKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmU7IH1cbiAqICAgcHJvdGVjdGVkIGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKSB7IHJldHVybiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKTsgfVxuICogICBwcm90ZWN0ZWQgZ2V0U29ydENvbHVtbihzb3J0QnkpIHsgcmV0dXJuIE9iamVjdC5oYXNPd24oc29ydENvbHVtbk1hcCwgc29ydEJ5KSA/IHNvcnRDb2x1bW5NYXBbc29ydEJ5XSA6IG51bGw7IH1cbiAqICAgcHJvdGVjdGVkIGdldFByb2plY3RDb2x1bW4oKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmUucHJvamVjdDsgfVxuICogICBwcm90ZWN0ZWQgZ2V0T3JnQ29sdW1uKCkgeyByZXR1cm4gc2NoZW1hLnBpcGVsaW5lLm9yZ0lkOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENydWRTZXJ2aWNlPFxuICBURW50aXR5IGV4dGVuZHMgQmFzZUVudGl0eSxcbiAgVEZpbHRlcixcbiAgVEluc2VydCxcbiAgVFVwZGF0ZSxcbj4ge1xuICAvKiogRHJpenpsZSBzY2hlbWEgdGFibGUgZm9yIHRoaXMgZW50aXR5ICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgc2NoZW1hKCk6IFBnVGFibGU7XG5cbiAgLyoqXG4gICAqIFR5cGVkIGNvbHVtbiB2aWV3IG9mIHtAbGluayBzY2hlbWF9LiBgUGdUYWJsZWAgZXhwb3NlcyBubyBzdGF0aWMgY29sdW1ucywgc29cbiAgICogdGhpcyBpcyB0aGUgc2luZ2xlIHVuYXZvaWRhYmxlIGNhc3QgZm9yIGNvbHVtbiBhY2Nlc3MuIGB2aXNpYmlsaXR5YCBpc1xuICAgKiBvcHRpb25hbCAobm90IGV2ZXJ5IGVudGl0eSBoYXMgaXQpIGFuZCB0aGUgaW5kZXggc2lnbmF0dXJlIGNvdmVycyBkeW5hbWljXG4gICAqIHNwYXJzZS1maWVsZHNldCBjb2x1bW4gbG9va3VwLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgY29scygpOiBDcnVkQ29sdW1ucyB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hIGFzIHVua25vd24gYXMgQ3J1ZENvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGZpbHRlcmluZyBlbnRpdGllcy5cbiAgICogYHBhcmVudE9yZ0lkYCAob3JnIOKGkiB0ZWFtIGhpZXJhcmNoeSkgaXMgb3B0aW9uYWwgYW5kIG9ubHkgaG9ub3JlZCBieVxuICAgKiBzZXJ2aWNlcyB0aGF0IG9wdCBpbnRvIHBhcmVudC1pbmhlcml0ZWQgdmlzaWJpbGl0eSAoZS5nLiBwbHVnaW5zKS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZENvbmRpdGlvbnMoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBTUUxbXTtcblxuICAvKiogR2V0IHRoZSBzY2hlbWEgY29sdW1uIGZvciBzb3J0aW5nIGJ5IGZpZWxkIG5hbWUgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNvcnRDb2x1bW4oc29ydEJ5OiBzdHJpbmcpOiBBbnlDb2x1bW4gfCBudWxsO1xuXG4gIC8qKiBHZXQgdGhlIHByb2plY3QgY29sdW1uIGZvciBzZXREZWZhdWx0IHNjb3BpbmcgKG51bGwgaWYgZW50aXR5IGhhcyBubyBwcm9qZWN0IHNjb3BlKSAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0UHJvamVjdENvbHVtbigpOiBBbnlDb2x1bW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRlbmFudCBvcmctaWQgY29sdW1uLiBVc2VkIGJvdGggdG8gc2NvcGUgYHNldERlZmF1bHRgIGFuZCB0byBwaW5cbiAgICogZXZlcnkgd3JpdGUgKHVwZGF0ZS9kZWxldGUvYnVsa0RlbGV0ZSkgdG8gdGhlIGNhbGxlcidzIG93biBvcmcg4oCUIHNvIGl0IE1VU1RcbiAgICogYmUgdGhlIHRlbmFudCBgb3JnSWRgIGNvbHVtbiwgbm90IGEgZGlzcGxheS9uYW1lIGNvbHVtbi5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRPcmdDb2x1bW4oKTogQW55Q29sdW1uO1xuXG4gIC8qKiBUaGUgdW5pcXVlLWNvbnN0cmFpbnQgY29sdW1ucyBhIGNyZWF0ZSBtdXN0IG5vdCBjb25mbGljdCBvbiAoc2VlIHtAbGluayBjcmVhdGV9KS4gKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBjb25mbGljdFRhcmdldCgpOiBBbnlDb2x1bW5bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NydWQtc2VydmljZScpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEZhaWwgZmFzdCBpZiBhIHN1YmNsYXNzIGRvZXNuJ3QgZXhwb3NlIGEgdGVuYW50IG9yZyBjb2x1bW4uIFRoZSB3cml0ZVxuICAgIC8vIHBhdGhzICh3cml0ZUNvbmRpdGlvbnMgLyBidWxrRGVsZXRlKSBwaW4gbXV0YXRpb25zIHRvIHRoZSBjYWxsZXIncyBvd25cbiAgICAvLyBvcmcgdGhyb3VnaCBpdDsgYSBtaXNzaW5nIGNvbHVtbiB3b3VsZCBzaWxlbnRseSBkcm9wIHRoYXQgZ3VhcmQg4oCUIGFcbiAgICAvLyBjcm9zcy10ZW5hbnQgZmFpbC1vcGVuIOKAlCBzbyBhc3NlcnQgaXRzIHByZXNlbmNlIHVwIGZyb250LlxuICAgIGlmICh0aGlzLmdldE9yZ0NvbHVtbigpID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBnZXRPcmdDb2x1bW4oKSBtdXN0IHJldHVybiB0aGUgdGVuYW50IG9yZyBjb2x1bW5gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgY29uZGl0aW9ucyBmb3IgYSBzaW5nbGUgZW50aXR5IGJ5IElELlxuICAgKiAgYHBhcmVudE9yZ0lkYCB3aWRlbnMgdmlzaWJpbGl0eSB0byBhIHBhcmVudCBvcmcncyBwdWJsaWMgcm93cyAob3JnIOKGkiB0ZWFtXG4gICAqICBoaWVyYXJjaHkpIOKAlCBzYW1lIG9wdC1pbiBzZW1hbnRpY3MgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYC4gT21pdHRlZCBieSB0aGVcbiAgICogIHdyaXRlIHBhdGggKGB3cml0ZUNvbmRpdGlvbnNgKSwgd2hpY2ggbXVzdCBzdGF5IG93bi1vcmcgc2NvcGVkLiAqL1xuICBwcml2YXRlIGlkQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnRoaXMuYnVpbGRDb25kaXRpb25zKHsgaWQgfSBhcyB1bmtub3duIGFzIFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkLCBwYXJlbnRPcmdJZCksXG4gICAgICAuLi50aGlzLm5vdFRvbWJzdG9uZWQoKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2x1ZGVzIHNvZnQtZGVsZXRlZCB0b21ic3RvbmVzIG9uIGVudGl0aWVzIHdpdGggYSBgZGVsZXRlZEF0YCBjb2x1bW4uIFRoZVxuICAgKiBieS1pZCBmaWx0ZXIgZGVsaWJlcmF0ZWx5IHNraXBzIHRoZSBgaXNBY3RpdmVgIGRlZmF1bHQgKGEgZGVhY3RpdmF0ZWQgcm93IGlzXG4gICAqIHN0aWxsIHJlYWRhYmxlIGJ5IGlkKSwgc28gd2l0aG91dCB0aGlzIGEgdG9tYnN0b25lIHdvdWxkIGJlIHJlYWRhYmxlIGFuZCDigJRcbiAgICogdGhyb3VnaCBgdXBkYXRlYCDigJQgaGFsZi1yZXZpdmFibGUgKGBpc0FjdGl2ZWAgZmxpcHBlZCBiYWNrIHdoaWxlXG4gICAqIGBkZWxldGVkQXRgL2BwdXJnZUFmdGVyYCBzdGF5IHNldCwgc28gdGhlIHN3ZWVwIGxhdGVyIHB1cmdlcyBhIHJvdyB0aGUgVUlcbiAgICogc2hvd3MgYXMgbGl2ZSkuIFRvbWJzdG9uZXMgYXJlIHJlYWNoZWQgb25seSB2aWEgdGhlIGRlZGljYXRlZFxuICAgKiByZXN0b3JlL3B1cmdlL2ZpbmREZWxldGVkIHBhdGhzLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RUb21ic3RvbmVkKCk6IFNRTFtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xzLmRlbGV0ZWRBdCA/IFtpc051bGwodGhpcy5jb2xzLmRlbGV0ZWRBdCldIDogW107XG4gIH1cblxuICAvKipcbiAgICogQ29uZGl0aW9ucyBmb3IgYSBNVVRBVElPTiAodXBkYXRlL2RlbGV0ZSkgb2YgYSBzaW5nbGUgZW50aXR5LlxuICAgKlxuICAgKiBgaWRDb25kaXRpb25zYCByZXVzZXMgdGhlIFJFQUQgYWNjZXNzLWNvbnRyb2wgY2xhdXNlLCB3aGljaCBhbHNvIG1hdGNoZXNcbiAgICogc3lzdGVtLW9yZyAvIG90aGVyLW9yZyBQVUJMSUMgcmVjb3JkcyDigJQgc28gd2l0aG91dCBhbiBleHRyYSBvd25lcnNoaXAgcGluIGFueVxuICAgKiB0ZW5hbnQgY291bGQgdXBkYXRlIG9yIHNvZnQtZGVsZXRlIGFub3RoZXIgb3JnJ3MgKG9yIHRoZSBzeXN0ZW0gb3JnJ3MpIHB1YmxpY1xuICAgKiByZWNvcmRzLiBBTkQgYSBzdHJpY3QgYG9yZ0lkID09PSBjYWxsZXJgIHByZWRpY2F0ZTogdGhlIHJlYWQgY2xhdXNlJ3NcbiAgICogcHVibGljLU9SIGJyYW5jaCByZXF1aXJlcyBgb3JnX2lkID0gJ3N5c3RlbSdgLCB3aGljaCB0aGVuIGNhbid0IGJlIHNhdGlzZmllZCxcbiAgICogbGVhdmluZyBvbmx5IG93bi1vcmcgcm93cy4gb3JnSWQtbGVzcyAoc3lzYWRtaW4pIGNvbnRleHQga2VlcHMgZnVsbCBhY2Nlc3MuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkKTtcbiAgICAvLyBQaW4gdGhlIG11dGF0aW9uIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIHZpYSB0aGUgdGVuYW50IGNvbHVtblxuICAgIC8vIChnZXRPcmdDb2x1bW4sIGFzc2VydGVkIG5vbi1udWxsIGluIHRoZSBjb25zdHJ1Y3Rvcikg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgIC8vIHNldERlZmF1bHQsIGFuZCBuZXZlciBzaWxlbnRseSBmYWlsLW9wZW4gd2hlbiB0aGUgcHJvcGVydHkgaXMgYWJzZW50LlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG4gICAgLy8gRm9yY2UgRVhBQ1QgaWQgZXF1YWxpdHkgb24gdGhlIG11dGF0aW9uIHBhdGguIGBpZENvbmRpdGlvbnNgIHJldXNlcyB0aGVcbiAgICAvLyBsaXN0LWZpbHRlciBjbGF1c2UsIHdob3NlIGBidWlsZElkRmlsdGVyYCBQUkVGSVgtbWF0Y2hlcyAoYGlkOjp0ZXh0IExJS0VcbiAgICAvLyAndmFsJSdgKSBhbnkgbm9uLWZ1bGwtVVVJRCB2YWx1ZSDigJQgc28gYSBwYXJ0aWFsIGlkIChgREVMRVRFIC94L2FiYCkgd291bGRcbiAgICAvLyBzb2Z0LWRlbGV0ZS9tdXRhdGUgRVZFUlkgb3duLW9yZyByb3cgd2hvc2UgaWQgc3RhcnRzIHdpdGggYGFiYCBhbmQgcmVwb3J0XG4gICAgLy8gdG91Y2hpbmcgb25lLiBBTkRpbmcgYW4gZXhhY3QgYGlkID0gdmFsYCBjb2xsYXBzZXMgdGhlIHByZWZpeCBjbGF1c2UgdG8gYXRcbiAgICAvLyBtb3N0IHRoZSBzaW5nbGUgZXhhY3Qgcm93OyBhIG1hbGZvcm1lZC9wYXJ0aWFsIGlkIHRoZW4gbWF0Y2hlcyBub3RoaW5nXG4gICAgLy8gKOKGkiA0MDQgdmlhIHRoZSBjYWxsZXJzJyBgaWYgKCFkZWxldGVkKWAgZ3VhcmQpIGluc3RlYWQgb2YgbWFzcy1tdXRhdGluZy5cbiAgICBjb25kaXRpb25zLnB1c2godGhpcy5leGFjdElkQ29uZGl0aW9uKGlkKSk7XG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gIH1cblxuICAvKiogRXhhY3QgaWQgZXF1YWxpdHksIGxvd2VyLWNhc2VkIHRvIG1hdGNoIGBidWlsZElkRmlsdGVyYCdzIGZ1bGwtVVVJRCBicmFuY2guXG4gICAqICBgc2NoZW1hYCBpcyB0eXBlZCBgUGdUYWJsZWAgKG5vIHN0YXRpYyBgLmlkYCksIHNvIGNhc3Qg4oCUIHNhbWUgcGF0dGVybiB0aGVcbiAgICogIHNvcnQvZGVmYXVsdCBoZWxwZXJzIHVzZSBmb3IgY29sdW1uIGFjY2Vzcy4gKi9cbiAgcHJpdmF0ZSBleGFjdElkQ29uZGl0aW9uKGlkOiBzdHJpbmcpOiBTUUwge1xuICAgIHJldHVybiBlcSh0aGlzLmNvbHMuaWQsIFN0cmluZyhpZCkudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvKiogVGhlIGFjdG9yIHN0YW1wZWQgb24gYSB3cml0ZTogdGhlIGNhbGxlciwgb3IgdGhlIHN5c3RlbSBhY3RvciBmb3IgYmFja2dyb3VuZCB3b3JrLiAqL1xuICBwcml2YXRlIGFjdG9yKHVzZXJJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXNlcklkIHx8IFNZU1RFTV9BQ1RPUl9JRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb25lIGNhc3QgcG9pbnQgZm9yIGAuc2V0KClgIC8gYC52YWx1ZXMoKWAgLyBgLnNlbGVjdCgpYCBzaGFwZXMuIFRoZSBiYXNlIGNsYXNzIHdyaXRlc1xuICAgKiB0aGUgc2hhcmVkIGNvbHVtbnMgKGB1cGRhdGVkQnlgLCBgZGVsZXRlZEF0YCwg4oCmKSB0aHJvdWdoIHRoZSBhYnN0cmFjdFxuICAgKiBgUGdUYWJsZWAsIHdob3NlIGluc2VydC91cGRhdGUgdHlwZXMgY2FuJ3QgcHJvdmUgdGhvc2UgY29sdW1ucyBleGlzdC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgcm93KHZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBhbnkge1xuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICAvKiogUnVuIGEgbGlmZWN5Y2xlIGhvb2sgYmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBpcyBsb2dnZWQsIG5ldmVyIHRocm93bi4gKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5Ib29rKGhvb2s6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgaG9vaygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgY29sdW1ucyBhIHNvZnQtZGVsZXRlIHN0YW1wcywgaW5jbHVkaW5nIHRoZSBwdXJnZSBkZWFkbGluZS4gKi9cbiAgcHJpdmF0ZSB0b21ic3RvbmVTZXQobm93OiBEYXRlLCB1c2VySWQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5hY3Rvcih1c2VySWQpO1xuICAgIHJldHVybiB7XG4gICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgIHVwZGF0ZWRCeTogdXNlcixcbiAgICAgIGRlbGV0ZWRBdDogbm93LFxuICAgICAgZGVsZXRlZEJ5OiB1c2VyLFxuICAgICAgLy8gU3RhbXAgdGhlIHB1cmdlIGRlYWRsaW5lIHNvIHRoZSByZXRlbnRpb24gc3dlZXAgY2FuIGhhcmQtZGVsZXRlIGxhdGVyLlxuICAgICAgLi4udGhpcy5wdXJnZUFmdGVyU3RhbXAobm93KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmQtZGVsZXRlIHVwIHRvIGBsaW1pdGAgcm93cyBtYXRjaGluZyBgY29uZGl0aW9uc2AgaW4gb25lIHRyYW5zYWN0aW9uOlxuICAgKiBkZXBlbmRlbnRzIGFyZSB0b3JuIGRvd24gZmlyc3QgYnkgYG9uQmVmb3JlUHVyZ2VgIGluIHRoZSBTQU1FIHR4IChhXG4gICAqIEZLLWJsb2NraW5nIGNoaWxkIGNhbid0IHN0cmFuZCB0aGUgcGFyZW50OyBhIHRocm93IGFib3J0cyB0aGUgYmF0Y2gpLCB0aGVuXG4gICAqIGBvbkFmdGVyUHVyZ2VgIGhhbmRsZXMgZXh0ZXJuYWwgc2lkZS1lZmZlY3RzIGJlc3QtZWZmb3J0LiBSZXR1cm5zIHRoZSBpZHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHB1cmdlV2hlcmUoY29uZGl0aW9uczogU1FMW10sIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcHVyZ2VkSWRzID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgZG9vbWVkID0gYXdhaXQgdHhcbiAgICAgICAgLnNlbGVjdCh0aGlzLnJvdyh7IGlkOiB0aGlzLmNvbHMuaWQgfSkpXG4gICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgICAubGltaXQobGltaXQpXG4gICAgICAgIC50aGVuKHIgPT4gKHIgYXMgQXJyYXk8eyBpZDogdW5rbm93biB9PikubWFwKGQgPT4gU3RyaW5nKGQuaWQpKSk7XG5cbiAgICAgIGlmIChkb29tZWQubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICBhd2FpdCB0aGlzLm9uQmVmb3JlUHVyZ2UoZG9vbWVkLCB0eCk7XG4gICAgICBhd2FpdCB0eC5kZWxldGUodGhpcy5zY2hlbWEpLndoZXJlKGluQXJyYXkodGhpcy5jb2xzLmlkLCBkb29tZWQpKTtcbiAgICAgIHJldHVybiBkb29tZWQ7XG4gICAgfSk7XG5cbiAgICBpZiAocHVyZ2VkSWRzLmxlbmd0aCA+IDApIGF3YWl0IHRoaXMucnVuSG9vaygoKSA9PiB0aGlzLm9uQWZ0ZXJQdXJnZShwdXJnZWRJZHMpKTtcbiAgICByZXR1cm4gcHVyZ2VkSWRzO1xuICB9XG5cbiAgLy8gTGlmZWN5Y2xlIGhvb2tzIOKAlCBvdmVycmlkZSBpbiBzdWJjbGFzc2VzIHRvIHJlYWN0IHRvIG11dGF0aW9uc1xuICAvLyBUaGVzZSBhcmUgZmlyZS1hbmQtZm9yZ2V0OiBlcnJvcnMgYXJlIGxvZ2dlZCBidXQgbmV2ZXIgYmxvY2sgdGhlIGNhbGxlci5cblxuICAvKiogQ2FsbGVkIGFmdGVyIGEgbmV3IGVudGl0eSBpcyBjcmVhdGVkICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyQ3JlYXRlKF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIGFuIGVudGl0eSBpcyB1cGRhdGVkICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyVXBkYXRlKF9pZDogc3RyaW5nLCBfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhbiBlbnRpdHkgaXMgc29mdC1kZWxldGVkICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyRGVsZXRlKF9pZDogc3RyaW5nLCBfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhIHNvZnQtZGVsZXRlZCBlbnRpdHkgaXMgcmVzdG9yZWQgKHVuZG8gdGhlIGRlbGV0ZSkuIE92ZXJyaWRlXG4gICAqICBmb3IgZW50aXRpZXMgd2hvc2UgcmVzdG9yZSBoYXMgc2lkZS1lZmZlY3RzIChlLmcuIHJlLW5vdGlmeSkuIEJlc3QtZWZmb3J0LiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclJlc3RvcmUoX2lkOiBzdHJpbmcsIF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIHdpdGggdGhlIGlkcyBhYm91dCB0byBiZSBoYXJkLXB1cmdlZCwgQkVGT1JFIHRoZSBkZWxldGUsIGluc2lkZSB0aGVcbiAgICogIHB1cmdlIHRyYW5zYWN0aW9uIChgdHhgKSDigJQgYSBzdWJjbGFzcyB0ZWFyaW5nIGRvd24gZGVwZW5kZW50cyB0aGF0IGxhY2sgT05cbiAgICogIERFTEVURSBDQVNDQURFIE1VU1QgdXNlIGB0eGAgc28gdGhlIHRlYXJkb3duIGlzIGF0b21pYyB3aXRoIHRoZSBwYXJlbnRcbiAgICogIERFTEVURSAoYW5kIGNhbid0IHNlbGYtZGVhZGxvY2sgYWdhaW5zdCBpdHMgcm93IGxvY2tzKS4gVGhyb3dpbmcgYWJvcnRzIHRoYXRcbiAgICogIGJhdGNoJ3MgcHVyZ2UgKHJvd3Mgc3RheSB0b21ic3RvbmVkLCByZXRyaWVkIG5leHQgdGljaykuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkJlZm9yZVB1cmdlKF9pZHM6IHN0cmluZ1tdLCBfdHg6IENydWRUeCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIHJvd3MgYXJlIGhhcmQtcHVyZ2VkLCBmb3IgZXh0ZXJuYWwgc2lkZS1lZmZlY3RzIChlLmcuIHBsdWdpblxuICAgKiAgaW1hZ2UgR0MpLiBCZXN0LWVmZm9ydDogZXJyb3JzIGFyZSBsb2dnZWQsIG5ldmVyIGJsb2NrIHRoZSBzd2VlcC4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJQdXJnZShfaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogUmV0ZW50aW9uIGJlZm9yZSBhIHNvZnQtZGVsZXRlZCByb3cgYmVjb21lcyBwdXJnZS1lbGlnaWJsZS4gRGVmYXVsdHMgdG8gdGhlXG4gICAqICBzaGFyZWQgYFNPRlRfREVMRVRFX1JFVEVOVElPTl9EQVlTYDsgb3ZlcnJpZGUgcGVyIGVudGl0eSBmb3IgYSBiZXNwb2tlIHdpbmRvdy4gKi9cbiAgcHJvdGVjdGVkIGdldCBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gU09GVF9ERUxFVEVfUkVURU5USU9OX01TO1xuICB9XG5cbiAgLyoqIFRoZSBgcHVyZ2VfYWZ0ZXJgIHZhbHVlIHRvIHN0YW1wIG9uIGEgc29mdC1kZWxldGU6IGBub3cgKyByZXRlbnRpb25gLCBvciB0aGVcbiAgICogIHNwcmVhZC1mcmllbmRseSBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgZW50aXR5IGhhcyBubyBgcHVyZ2VfYWZ0ZXJgIGNvbHVtbi5cbiAgICogIGBwcm90ZWN0ZWRgIHNvIHN1YmNsYXNzZXMgd2l0aCBoYW5kLXJvbGxlZCBzb2Z0LWRlbGV0ZSBwYXRocyAoZS5nLlxuICAgKiAgbWVzc2FnZS1zZXJ2aWNlJ3MgdGhyZWFkIGNhc2NhZGUgLyBzeXNhZG1pbiBtb2RlcmF0aW9uKSBzdGFtcCBpdCB0b28g4oCUIGFuXG4gICAqICB1bi1zdGFtcGVkIHRvbWJzdG9uZSBoYXMgTlVMTCBgcHVyZ2VfYWZ0ZXJgIGFuZCBpcyBuZXZlciBoYXJkLXB1cmdlZC4gKi9cbiAgcHJvdGVjdGVkIHB1cmdlQWZ0ZXJTdGFtcChub3c6IERhdGUpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMucHVyZ2VBZnRlciB8fCB0aGlzLnNvZnREZWxldGVSZXRlbnRpb25NcyA8PSAwKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHsgcHVyZ2VBZnRlcjogbmV3IERhdGUobm93LmdldFRpbWUoKSArIHRoaXMuc29mdERlbGV0ZVJldGVudGlvbk1zKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdoZW4gYSByZWFkIGlzIHdpZGVuZWQgdG8gYSBwYXJlbnQgb3JnIChgcGFyZW50T3JnSWRgXG4gICAqIHNldCksIHRoZSBwYXJlbnQncyByb3dzIGFyZSBvdXRzaWRlIHRoZSBjYWxsZXIncyBSTFMgc2NvcGUsIHNvIHRoZSByZWFkIG11c3RcbiAgICogcnVuIHVuZGVyIHN5c2FkbWluIGNvbnRleHQg4oCUIHRoZSBhY2Nlc3MtY29udHJvbCBXSEVSRSBjbGF1c2UgKG93biArIHBhcmVudCArXG4gICAqIHN5c3RlbSBwdWJsaWMsIGJ1aWx0IHNlcnZlci1zaWRlIGZyb20gYSB0cnVzdGVkIEpXVCBjbGFpbSkgaXMgdGhlbiB0aGVcbiAgICogYXV0aG9yaXRhdGl2ZSB0ZW5hbmN5IGdhdGUuIFdpdGhvdXQgYHBhcmVudE9yZ0lkYCBpdCBzdGF5cyBSTFMtc2NvcGVkLlxuICAgKlxuICAgKiBJTlZBUklBTlQgKHdoeSB0aGUgc3lzYWRtaW4gYnlwYXNzIGlzIHNhZmUpOiB0aGUgV0hFUkUgY2xhdXNlIGlzIGFsd2F5c1xuICAgKiBzZXJ2ZXItYnVpbHQgYnkgYGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZClgIGZyb20gdmFsdWVzXG4gICAqIGRlcml2ZWQgZnJvbSB0aGUgdmFsaWRhdGVkIEpXVCAoYG9yZ0lkYCA9IGFjdGl2ZSBvcmcsIGBwYXJlbnRPcmdJZGAgPSB0aGVcbiAgICogYWN0aXZlIG9yZydzIHBhcmVudCkuIE5vbmUgb2YgdGhlbSBpcyBhIHJhdyB1c2VyLXN1cHBsaWVkIHByZWRpY2F0ZSwgc28gdGhlXG4gICAqIGJ5cGFzcyBvbmx5IGV2ZXIgd2lkZW5zIHRoZSByZWFkIHRvIHRoZSBjYWxsZXIncyBvd24gc3VidHJlZSArIHN5c3RlbSBwdWJsaWNcbiAgICogcm93cyDigJQgaXQgY2FuIE5PVCBiZSBzdGVlcmVkIGF0IGFuIGFyYml0cmFyeSBvcmcuIE5PVEU6IHRoaXMgZG9lcyByZW1vdmUgdGhlXG4gICAqIFJMUyBiYWNrc3RvcCBmb3IgdGhlIHdpZGVuZWQgcmVhZDsgYSBzaW5nbGUtR1VDIGBhcHAub3JnX2lkYCBjYW4ndCBleHByZXNzXG4gICAqIHRoZSBcIm93biBPUiBwYXJlbnQgT1Igc3lzdGVtXCIgc2V0IHRoZSBwb2xpY3kgd291bGQgbmVlZCwgc28gcmVwbGFjaW5nIHRoZVxuICAgKiBieXBhc3Mgd291bGQgcmVxdWlyZSBhIHRlbmFuY3ktbGF5ZXIgY2hhbmdlIChlLmcuIGEgbXVsdGktb3JnIFJMUyBwb2xpY3kpLlxuICAgKiBEZWZlcnJlZCBkZWxpYmVyYXRlbHkg4oCUIGRvIG5vdCBzd2FwIHRoaXMgZm9yIGEgYmxhbmtldCBieXBhc3Mgd2l0aG91dFxuICAgKiByZS1jaGVja2luZyB0aGUgV0hFUkUgaXMgc3RpbGwgZnVsbHkgc2VydmVyLWJ1aWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBydW5SZWFkPFQ+KHBhcmVudE9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHBhcmVudE9yZ0lkID8gcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgZm4pIDogZm4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGVudGl0aWVzIG1hdGNoaW5nIGZpbHRlciBjcml0ZXJpYVxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICovXG4gIGFzeW5jIGZpbmQoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICByZXR1cm4gdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPUkRFUiBCWSBmb3Ige0BsaW5rIGZpbmRGaXJzdH0sIHNvIFwidGFrZSBvbmVcIiBpcyBkZXRlcm1pbmlzdGljIHJhdGhlciB0aGFuXG4gICAqIHdoYXRldmVyIHJvdyB0aGUgcGxhbm5lciBtZWV0cyBmaXJzdDogdGhlIGRlZmF1bHQgcm93LCB0aGVuIHRoZSBuZXdlc3QsXG4gICAqIHRoZW4gaWQgYXMgdGhlIGZpbmFsIHRpZWJyZWFrLiBTZXJ2aWNlcyBvdmVycmlkZSBpdCB0byByYW5rIGJ5IHRoZWlyIG93blxuICAgKiBub3Rpb24gb2YgXCJiZXN0IG1hdGNoXCIgKHBsdWdpbnM6IG93biBvcmcgZmlyc3QsIHRoZW4gc2VtdmVyKS5cbiAgICovXG4gIHByb3RlY3RlZCBmaW5kRmlyc3RPcmRlckJ5KF9maWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIF9vcmdJZD86IHN0cmluZywgX3BhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW10ge1xuICAgIGNvbnN0IHsgaXNEZWZhdWx0LCBjcmVhdGVkQXQsIGlkIH0gPSB0aGlzLmNvbHM7XG4gICAgcmV0dXJuIFtkZXNjKGlzRGVmYXVsdCksIC4uLihjcmVhdGVkQXQgPyBbZGVzYyhjcmVhdGVkQXQpXSA6IFtdKSwgYXNjKGlkKV07XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgRklSU1QgZW50aXR5IG1hdGNoaW5nIGBmaWx0ZXJgIOKAlCBhIGJvdW5kZWQgKGBMSU1JVCAxYCkgdmFyaWFudCBvZlxuICAgKiBgZmluZGAgZm9yIHRoZSBcIm1hdGNoIGJ5IGZpbHRlciwgdGFrZSBvbmVcIiByZWFkIHBhdGhzIChlLmcuIGBHRVQgL2ZpbmRgKSwgc29cbiAgICogdGhleSBkb24ndCBgU0VMRUNUYCBldmVyeSBtYXRjaGluZyBvcmcgcm93IGp1c3QgdG8gcmV0dXJuIGBbMF1gLiBSYW5rZWQgYnlcbiAgICoge0BsaW5rIGZpbmRGaXJzdE9yZGVyQnl9LlxuICAgKi9cbiAgYXN5bmMgZmluZEZpcnN0KGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgY29uc3Qgb3JkZXJCeSA9IHRoaXMuZmluZEZpcnN0T3JkZXJCeShmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAub3JkZXJCeSguLi5vcmRlckJ5KVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbnRpdGllcyB3aXRoIHBhZ2luYXRpb24gYW5kIHNvcnRpbmdcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUGFnaW5hdGlvbiBhbmQgc29ydGluZyBvcHRpb25zXG4gICAqL1xuICBhc3luYyBmaW5kUGFnaW5hdGVkKFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBvcmdJZD86IHN0cmluZyxcbiAgICBvcHRpb25zOiBRdWVyeU9wdGlvbnMgPSB7fSxcbiAgICBwYXJlbnRPcmdJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQYWdpbmF0ZWRSZXN1bHQ8VEVudGl0eT4+IHtcbiAgICBjb25zdCB7IGxpbWl0OiByYXdMaW1pdCA9IERFRkFVTFRfUEFHRV9MSU1JVCwgb2Zmc2V0ID0gMCwgc29ydEJ5LCBzb3J0T3JkZXIgPSAnYXNjJywgaW5jbHVkZVRvdGFsID0gZmFsc2UsIGN1cnNvciwgZmllbGRzIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oTWF0aC5tYXgoMSwgcmF3TGltaXQpLCBNQVhfUEFHRV9MSU1JVCk7XG5cbiAgICAvLyBUb3RhbCwgZGV0ZXJtaW5pc3RpYyBvcmRlcjogKHNvcnQgY29sdW1uLCBpZCkuIGBpZGAgaXMgdW5pcXVlLCBzbyByb3dzIHRoYXRcbiAgICAvLyBzaGFyZSBhIHNvcnQgdmFsdWUgaGF2ZSBhIHN0YWJsZSByZWxhdGl2ZSBvcmRlciBhbmQgYSBrZXlzZXQgY3Vyc29yIGNhblxuICAgIC8vIG5ldmVyIHNraXAgb3IgcmVwZWF0IHRoZW0uIEFuIGFic2VudCBvciBVTktOT1dOIGBzb3J0QnlgIG9yZGVycyBieSBgaWRgXG4gICAgLy8gYWxvbmUg4oCUIGFuIHVua25vd24gc29ydCB0aGF0IGFkZGVkIG5vIFdIRVJFIGFuZCBubyBPUkRFUiBCWSB3aGlsZSBzdGlsbFxuICAgIC8vIGVtaXR0aW5nIGEgY3Vyc29yIHdvdWxkIGxvb3AgYSBjdXJzb3IgY2xpZW50IG9uIHBhZ2UgMSBmb3JldmVyLlxuICAgIGNvbnN0IGlkQ29sdW1uID0gdGhpcy5jb2xzLmlkO1xuICAgIGNvbnN0IHNvcnRDb2x1bW4gPSAoc29ydEJ5ID8gdGhpcy5nZXRTb3J0Q29sdW1uKHNvcnRCeSkgOiBudWxsKSA/PyBpZENvbHVtbjtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBzb3J0T3JkZXIgPT09ICdkZXNjJyA/IGRlc2MgOiBhc2M7XG4gICAgY29uc3Qgb3JkZXJCeSA9IHNvcnRDb2x1bW4gPT09IGlkQ29sdW1uID8gW2RpcmVjdGlvbihpZENvbHVtbildIDogW2RpcmVjdGlvbihzb3J0Q29sdW1uKSwgZGlyZWN0aW9uKGlkQ29sdW1uKV07XG5cbiAgICAvLyBDdXJzb3IgYW5kIG9mZnNldCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIOKAlCBhIHZhbGlkIGN1cnNvciB0YWtlcyBwcmVjZWRlbmNlLlxuICAgIC8vIEEgbWFsZm9ybWVkL3RhbXBlcmVkIGN1cnNvciDigJQgaW5jbHVkaW5nIHdlbGwtZm9ybWVkIEpTT04gd2hvc2UgdmFsdWVzXG4gICAgLy8gY2FuJ3QgYmUgY2FzdCB0byB0aGUgaWQgLyBzb3J0IGNvbHVtbiB0eXBlcyDigJQgaXMgaWdub3JlZCAocmVhZHMgZnJvbSB0aGVcbiAgICAvLyBzdGFydCkgaW5zdGVhZCBvZiByZWFjaGluZyBQb3N0Z3JlcyBhbmQgZmFpbGluZyB0aGUgcXVlcnkuXG4gICAgY29uc3QgcmF3Q3Vyc29yID0gY3Vyc29yID8gZGVjb2RlQ3Vyc29yKGN1cnNvcikgOiBudWxsO1xuICAgIGNvbnN0IGRlY29kZWRDdXJzb3IgPSByYXdDdXJzb3JcbiAgICAgICYmIGlzQ2FzdGFibGVUbyhpZENvbHVtbiwgcmF3Q3Vyc29yLmlkKVxuICAgICAgLy8gKGFuIGlkLW9ubHkgb3JkZXIgbmV2ZXIgYmluZHMgdGhlIHNvcnQgdmFsdWUg4oCUIHNlZSBrZXlzZXRBZnRlcilcbiAgICAgICYmIChzb3J0Q29sdW1uID09PSBpZENvbHVtbiB8fCByYXdDdXJzb3Iuc29ydFRleHQgPT09IG51bGwgfHwgaXNDYXN0YWJsZVRvKHNvcnRDb2x1bW4sIHJhd0N1cnNvci5zb3J0VGV4dCkpXG4gICAgICA/IHJhd0N1cnNvclxuICAgICAgOiBudWxsO1xuICAgIGlmIChjdXJzb3IgJiYgIWRlY29kZWRDdXJzb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdJZ25vcmluZyBtYWxmb3JtZWQgcGFnaW5hdGlvbiBjdXJzb3InLCB7IGVudGl0eTogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgaWYgKGRlY29kZWRDdXJzb3IpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChrZXlzZXRBZnRlcihzb3J0Q29sdW1uLCBpZENvbHVtbiwgc29ydE9yZGVyLCBkZWNvZGVkQ3Vyc29yLnNvcnRUZXh0LCBkZWNvZGVkQ3Vyc29yLmlkKSk7XG4gICAgfVxuXG4gICAgLy8gV3JhcCB0aGUgd2hvbGUgcGFnaW5hdGVkIHJlYWQgKFNFTEVDVCArIG9wdGlvbmFsIENPVU5UKSBpbiBvbmVcbiAgICAvLyB0ZW5hbnQgdHguIEJvdGggcXVlcmllcyBhcmUgdmlzaWJpbGl0eS1zY29wZWQgYnkgdGhlIHNhbWUgUkxTIHBvbGljeSxcbiAgICAvLyBhbmQgcGlubmluZyB0aGVtIHRvIGEgc2luZ2xlIHR4IGtlZXBzIHRoZSBgYXBwLm9yZ19pZGAgR1VDIHN0YWJsZVxuICAgIC8vIGJldHdlZW4gdGhlbS4gV2hlbiB3aWRlbmluZyB0byBhIHBhcmVudCBvcmcsIHRoZSB3aG9sZSByZWFkIHJ1bnMgdW5kZXJcbiAgICAvLyBzeXNhZG1pbiBjb250ZXh0IChzZWUgcnVuUmVhZCkgc28gdGhlIGFjY2Vzcy1jb250cm9sIFdIRVJFIGlzIHRoZSBnYXRlLlxuICAgIHJldHVybiB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIC8vIFByb2plY3Rpb246IHRoZSBzcGFyc2UgZmllbGRzZXQgKGFsd2F5cyBpbmNsdWRlcyBgaWRgKSBvciBldmVyeSBjb2x1bW4sXG4gICAgICAvLyBwbHVzIHRoZSBzb3J0IGNvbHVtbidzIGV4YWN0IHRleHQgZm9yIHRoZSBuZXh0IGN1cnNvci5cbiAgICAgIGNvbnN0IGJhc2VTZWxlY3QgPSAoZmllbGRzID8gdGhpcy5idWlsZEZpZWxkU2VsZWN0KGZpZWxkcykgOiB1bmRlZmluZWQpID8/IGdldFRhYmxlQ29sdW1ucyh0aGlzLnNjaGVtYSk7XG4gICAgICBjb25zdCBzZWxlY3RTcGVjID0geyAuLi5iYXNlU2VsZWN0LCBbQ1VSU09SX1NPUlRfS0VZXTogc3FsPHN0cmluZyB8IG51bGw+YCR7c29ydENvbHVtbn06OnRleHRgIH07XG5cbiAgICAgIC8vIEZldGNoIGxpbWl0KzEgdG8gZGV0ZWN0IGhhc01vcmUgd2l0aG91dCBDT1VOVCgqKVxuICAgICAgY29uc3QgZWZmZWN0aXZlT2Zmc2V0ID0gZGVjb2RlZEN1cnNvciA/IDAgOiBvZmZzZXQ7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdHguc2VsZWN0KHNlbGVjdFNwZWMgYXMgYW55KS5mcm9tKHRoaXMuc2NoZW1hKS53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAgIC5vcmRlckJ5KC4uLm9yZGVyQnkpXG4gICAgICAgIC5saW1pdChsaW1pdCArIDEpXG4gICAgICAgIC5vZmZzZXQoZWZmZWN0aXZlT2Zmc2V0KS50aGVuKHIgPT4gZHJpenpsZVJvd3M8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHIpKTtcblxuICAgICAgY29uc3QgaGFzTW9yZSA9IHJvd3MubGVuZ3RoID4gbGltaXQ7XG4gICAgICBjb25zdCBwYWdlID0gaGFzTW9yZSA/IHJvd3Muc2xpY2UoMCwgbGltaXQpIDogcm93cztcbiAgICAgIGNvbnN0IGRhdGEgPSBwYWdlLm1hcCgocm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHsgLi4ucm93IH07XG4gICAgICAgIGRlbGV0ZSBlbnRpdHlbQ1VSU09SX1NPUlRfS0VZXTtcbiAgICAgICAgcmV0dXJuIGVudGl0eSBhcyBURW50aXR5O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogUGFnaW5hdGVkUmVzdWx0PFRFbnRpdHk+ID0geyBkYXRhLCBsaW1pdCwgb2Zmc2V0OiBlZmZlY3RpdmVPZmZzZXQsIGhhc01vcmUgfTtcblxuICAgICAgaWYgKGhhc01vcmUpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHBhZ2VbcGFnZS5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3Qgc29ydFRleHQgPSBsYXN0W0NVUlNPUl9TT1JUX0tFWV07XG4gICAgICAgIHJlc3VsdC5uZXh0Q3Vyc29yID0gZW5jb2RlQ3Vyc29yKHNvcnRUZXh0ID09IG51bGwgPyBudWxsIDogU3RyaW5nKHNvcnRUZXh0KSwgU3RyaW5nKGxhc3QuaWQpKTtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBydW4gdGhlIENPVU5UKCopIHF1ZXJ5IHdoZW4gdGhlIGNhbGxlciBleHBsaWNpdGx5IG5lZWRzIHRoZSB0b3RhbC5cbiAgICAgIC8vIE11c3QgaW5jbHVkZSBwYXJlbnRPcmdJZCBzbyBgdG90YWxgIG1hdGNoZXMgdGhlIHdpZGVuZWQgZGF0YSBzZXQuXG4gICAgICBpZiAoaW5jbHVkZVRvdGFsKSB7XG4gICAgICAgIGNvbnN0IGJhc2VDb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuICAgICAgICBjb25zdCBbY291bnRSZXN1bHRdID0gYXdhaXQgdHhcbiAgICAgICAgICAuc2VsZWN0KHsgY291bnQ6IHNxbDxudW1iZXI+YGNvdW50KCopOjppbnRgIH0pXG4gICAgICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAgICAgLndoZXJlKGFuZCguLi5iYXNlQ29uZGl0aW9ucykpLnRoZW4ociA9PiBkcml6emxlQ291bnQocikpO1xuICAgICAgICByZXN1bHQudG90YWwgPSBjb3VudFJlc3VsdD8uY291bnQgfHwgMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb2x1bW4gc2VsZWN0aW9uIG1hcCBmb3Igc3BhcnNlIGZpZWxkc2V0cy5cbiAgICogRmFsbHMgYmFjayB0byBmdWxsIHNlbGVjdCBpZiBubyBmaWVsZHMgYXJlIHJlcXVlc3RlZC5cbiAgICpcbiAgICogYGlkYCBpcyBhbHdheXMgaW5jbHVkZWQg4oCUIGl0IGlzIHRoZSBlbnRpdHkgaWRlbnRpdHkgQU5EIHRoZSBrZXlzZXQgY3Vyc29yJ3NcbiAgICogdGllLWJyZWFrZXIuIFRoZSBzb3J0IHZhbHVlIGZvciB0aGUgY3Vyc29yIGlzIHByb2plY3RlZCBzZXBhcmF0ZWx5IChhcyB0ZXh0KVxuICAgKiBieSBgZmluZFBhZ2luYXRlZGAsIHNvIHRoZSBmaWVsZHNldCBuZWVkIG5vdCBjYXJyeSB0aGUgc29ydCBjb2x1bW4uXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRmllbGRTZWxlY3QoZmllbGRzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgaWQgZm9yIGVudGl0eSBpZGVudGl0eVxuICAgIGNvbHVtbnMuaWQgPSB0aGlzLmNvbHMuaWQ7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkID09PSAnaWQnKSBjb250aW51ZTsgLy8gQWxyZWFkeSBpbmNsdWRlZFxuICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xzW2ZpZWxkXTtcbiAgICAgIGlmIChjb2wpIGNvbHVtbnNbZmllbGRdID0gY29sO1xuICAgIH1cblxuICAgIC8vIEF0IG1pbmltdW0gd2UnbGwgaGF2ZSB7IGlkIH0sIHdoaWNoIGlzIHZhbGlkXG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyIGNyaXRlcmlhXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aWRlbiB0aGUgY291bnQgdG8gdGhlIHBhcmVudCBvcmcnc1xuICAgKiAgIHB1YmxpYyByb3dzLiBNVVNUIG1pcnJvciBgZmluZGAvYGZpbmRQYWdpbmF0ZWRgJ3Mgd2lkZW5pbmcgKHNhbWVcbiAgICogICBgYnVpbGRDb25kaXRpb25zYCBhcmdzICsgc3lzYWRtaW4tc2NvcGVkIHJlYWQgdmlhIGBydW5SZWFkYCkgc28gYSBwYWdlZFxuICAgKiAgIGxpc3QncyBgdG90YWxgIG1hdGNoZXMgdGhlIHJvd3MgYSB3aWRlbmVkIGBmaW5kKClgIHJldHVybnMg4oCUIG90aGVyd2lzZSB0aGVcbiAgICogICBjb3VudCBvbWl0cyB0aGUgcGFyZW50J3Mgcm93cyBhbmQgcmVwb3J0cyBhIG5hcnJvd2VyIHRvdGFsIHRoYW4gdGhlIGRhdGEgc2V0LlxuICAgKi9cbiAgYXN5bmMgY291bnQoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoeyBjb3VudDogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVDb3VudChyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHQ/LmNvdW50IHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHNpbmdsZSBlbnRpdHkgYnkgSURcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gRW50aXR5IElEXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2lkZW4gdmlzaWJpbGl0eSB0byB0aGUgcGFyZW50XG4gICAqICAgb3JnJ3MgcHVibGljIHJvd3MgKHNvIGEgdGVhbSBjYW4gZmV0Y2ggYSBwYXJlbnQncyBwdWJsaWMgZW50aXR5IGJ5IGlkKS5cbiAgICogICBTYW1lIG9wdC1pbiArIHN5c2FkbWluLXNjb3BlZCByZWFkIGFzIGBmaW5kYC9gZmluZFBhZ2luYXRlZGA7IHRoZVxuICAgKiAgIGFjY2Vzcy1jb250cm9sIFdIRVJFIGNsYXVzZSBpcyB0aGUgYXV0aG9yaXRhdGl2ZSB0ZW5hbmN5IGdhdGUuXG4gICAqL1xuICBhc3luYyBmaW5kQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuaWRDb25kaXRpb25zKGlkLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuICAgIC8vIEV4YWN0IGlkIOKAlCBgZmluZEJ5SWRgIG1lYW5zIFRIRSByb3cgd2l0aCB0aGlzIGlkLCBub3QgYSBwcmVmaXggbWF0Y2guIFRoZVxuICAgIC8vIHNoYXJlZCBgYnVpbGRJZEZpbHRlcmAgcHJlZml4LW1hdGNoZXMgbm9uLWZ1bGwtVVVJRCB2YWx1ZXMgKGEgbGlzdC1zZWFyY2hcbiAgICAvLyBmZWF0dXJlKSwgd2hpY2ggaGVyZSB3b3VsZCByZXR1cm4gYW4gYXJiaXRyYXJ5IGZpcnN0IHByZWZpeCBoaXQgZm9yIGFcbiAgICAvLyBwYXJ0aWFsIGlkOyBwaW4gaXQgdG8gZXhhY3Qgc28gYSBtYWxmb3JtZWQgaWQgcmV0dXJucyBudWxsLlxuICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5saW1pdCgxKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLy8gTXV0YXRpb24gb3BlcmF0aW9uc1xuXG4gIC8qKlxuICAgKiBEZWZlbnNlLWluLWRlcHRoIHRlbmFudCBzdGFtcCBhbG9uZ3NpZGUgUkxTOiBhIE5PTi1zeXNhZG1pbiBjYWxsZXIgbWF5IG9ubHlcbiAgICogd3JpdGUgaW50byBpdHMgT1dOIG9yZywgc28gcGluIHRoZSByb3cgdG8gdGhlIHRydXN0ZWQgdGVuYW50LWNvbnRleHQgb3JnLlxuICAgKlxuICAgKiBUaGUgc3RhbXAgZmlyZXMgd2hlbmV2ZXIgdGhlIHBheWxvYWQncyBgb3JnSWRgIGRpZmZlcnMgZnJvbSB0aGUgY29udGV4dCBvcmcg4oCUXG4gICAqIHdoaWNoIGNvdmVycyBCT1RIIGEgZm9yZ2VkL21pc21hdGNoZWQgYGRhdGEub3JnSWRgIEFORCBhbiBBQlNFTlQgb25lLiBUaGVcbiAgICogYWJzZW50IGNhc2UgaXMgdGhlIGltcG9ydGFudCB0ZW5hbnQtYm91bmRhcnkgZml4OiB0aGUgYG9yZ19pZGAgY29sdW1uIERFRkFVTFRzXG4gICAqIHRvIGBTWVNURU1fT1JHX0lEYCAoc2NoZW1hL3BpcGVsaW5lLnRzLCBzY2hlbWEvcGx1Z2luLnRzKSwgc28gYW4gaW5zZXJ0IHRoYXRcbiAgICogb21pdHMgYG9yZ0lkYCB3b3VsZCBvdGhlcndpc2UgbGFuZCB0aGUgdGVuYW50J3Mgcm93IGluIHRoZSBwdWJsaWMgc3lzdGVtXG4gICAqIGNhdGFsb2cg4oCUIGEgY3Jvc3MtdGVuYW50IGZhaWwtb3Blbi4gQWx3YXlzIGluamVjdGluZyBgY3R4Lm9yZ0lkYCBjbG9zZXMgaXQuXG4gICAqXG4gICAqIFN5c2FkbWluIChhbmQgb3V0LW9mLWNvbnRleHQgd29ya2VyL3N5c3RlbSBwYXRocywgd2hlcmUgYGdldFRlbmFudENvbnRleHQoKWBcbiAgICogaXMgdW5kZWZpbmVkKSBrZWVwIHRoZSBzdXBwbGllZCBvcmcsIG1hdGNoaW5nIHRoZSBSTFMgcG9saWN5XG4gICAqIGBjdXJyZW50X2lzX3N5c2FkbWluKCkgT1Igb3JnX2lkID0gY3VycmVudF9vcmdfaWQoKWAuXG4gICAqL1xuICAvLyBHZW5lcmljIG92ZXIgdGhlIHBheWxvYWQgc2hhcGUgc28gYm90aCB0aGUgY3JlYXRlIChgVEluc2VydGApIGFuZCB1cGRhdGVcbiAgLy8gKGBQYXJ0aWFsPFRVcGRhdGU+YCkgY2FsbCBzaXRlcyB1c2UgaXQg4oCUIHRoZSBvcmctc3RhbXAgbG9naWMgb25seSB0b3VjaGVzXG4gIC8vIHRoZSBgb3JnSWRgIGtleS5cbiAgcHJvdGVjdGVkIGVuZm9yY2VPcmdJZDxUPihkYXRhOiBULCBpc0NyZWF0ZSA9IGZhbHNlKTogVCB7XG4gICAgY29uc3QgY3R4ID0gZ2V0VGVuYW50Q29udGV4dCgpO1xuICAgIGNvbnN0IGQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8vIFJlZnVzZSBhIGNvbnRleHQtbGVzcywgb3JnSWQtbGVzcyBJTlNFUlQgb24gYW4gb3JnLXNjb3BlZCBlbnRpdHk6IHRoZSBgb3JnSWRgXG4gICAgLy8gY29sdW1uIGRlZmF1bHRzIHRvIFNZU1RFTV9PUkdfSUQsIHNvIHN1Y2ggYSByb3cgd291bGQgc2lsZW50bHkgbGFuZCBpbiB0aGVcbiAgICAvLyBwdWJsaWMgY3Jvc3Mtb3JnIGNhdGFsb2cuIEEgYmFja2dyb3VuZCBqb2IgdGhhdCBmb3Jnb3QgYHJ1bldpdGhUZW5hbnRDb250ZXh0YFxuICAgIC8vIChhbmQgZGlkbid0IHBhc3MgYW4gZXhwbGljaXQgb3JnSWQpIG11c3QgZmFpbCBsb3VkbHksIG5vdCBsZWFrIGludG8gYHN5c3RlbWAuXG4gICAgLy8gKFN5c2FkbWluL3NlZWQgd3JpdGVzIGNhcnJ5IGEgY29udGV4dCBvciBhbiBleHBsaWNpdCBvcmdJZCwgc28gdGhleSBwYXNzLilcbiAgICBpZiAoaXNDcmVhdGUgJiYgIWN0eCAmJiBkLm9yZ0lkID09IG51bGwgJiYgdGhpcy5jb2xzLm9yZ0lkICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmNyZWF0ZSByZXF1aXJlcyBhbiBvcmdJZCAobm8gdGVuYW50IGNvbnRleHQgYW5kIG5vbmUgc3VwcGxpZWQpIOKAlCByZWZ1c2luZyB0byBkZWZhdWx0IHRvIHRoZSBzeXN0ZW0gb3JnYCk7XG4gICAgfVxuICAgIGlmIChjdHggJiYgIWN0eC5pc1N1cGVyQWRtaW4gJiYgY3R4Lm9yZ0lkICYmIGQub3JnSWQgIT09IGN0eC5vcmdJZCkge1xuICAgICAgLy8gRGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyB0aGF0IHJlYWNoIGhlcmUgc28gdGhlIGxvZyBzdGF5cyB1c2VmdWwgYW5kXG4gICAgICAvLyBxdWlldDogYSBQUkVTRU5ULWJ1dC1taXNtYXRjaGVkIGBvcmdJZGAgaXMgYW4gYWN0dWFsIG92ZXJyaWRlIGF0dGVtcHRcbiAgICAgIC8vICh3YXJuKSwgd2hpbGUgYW4gQUJTRU5UIGBvcmdJZGAgaXMgdGhlIGNvbW1vbiBub3JtYWwtd3JpdGUgcGF0aCB0aGF0IGp1c3RcbiAgICAgIC8vIG5lZWRzIHRoZSBkZWZhdWx0IHN0YW1wIChkZWJ1Zykg4oCUIGxvZ2dpbmcgdGhhdCBhdCB3YXJuIGZsb29kcyB0aGUgbG9nIG9uXG4gICAgICAvLyBldmVyeSB3cml0ZSB0aGF0IG9taXRzIG9yZ0lkLlxuICAgICAgY29uc3QgbWV0YSA9IHsgc3VwcGxpZWQ6ICdvcmdJZCcgaW4gZCA/IGQub3JnSWQgOiB1bmRlZmluZWQsIGVuZm9yY2VkOiBjdHgub3JnSWQgfTtcbiAgICAgIGlmICgnb3JnSWQnIGluIGQpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0NydWRTZXJ2aWNlOiBvdmVycmlkaW5nIG1pc21hdGNoZWQgb3JnIG9uIHdyaXRlJywgbWV0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ0NydWRTZXJ2aWNlOiBzdGFtcGluZyB0ZW5hbnQtY29udGV4dCBvcmcgb24gd3JpdGUnLCBtZXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLmQsIG9yZ0lkOiBjdHgub3JnSWQgfSBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5XG4gICAqL1xuICBhc3luYyBjcmVhdGUoZGF0YTogVEluc2VydCwgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHk+IHtcbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEsIC8qIGlzQ3JlYXRlICovIHRydWUpO1xuICAgIC8vIENyZWF0ZSBuZXZlciBvdmVyd3JpdGVzLiBUaGUgY29uZmxpY3Qga2V5IGNhbiBtYXRjaCBhIExJVkUgcm93IChhbm90aGVyXG4gICAgLy8gYXV0aG9yJ3MsIG9yIG9uZSB0aGUgY2FsbGVyIGNvdWxkbid0IGVkaXQgdGhyb3VnaCB1cGRhdGUpIG9yIGEgc29mdC1kZWxldGVkXG4gICAgLy8gVE9NQlNUT05FOyByZXBsYWNpbmcgZWl0aGVyIHdvdWxkIGJ5cGFzcyB1cGRhdGUncyBhY2Nlc3MgY2hlY2tzIG9yIHJlc3RvcmUnc1xuICAgIC8vIHN0ZXAtdXAuIE9uIGFueSBjb25mbGljdCBub3RoaW5nIGlzIHdyaXR0ZW4gYW5kIHRoZSBjYWxsZXIgZ2V0cyBhIDQwOS5cbiAgICBjb25zdCBbY3JlYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLmluc2VydCh0aGlzLnNjaGVtYSlcbiAgICAgIC52YWx1ZXModGhpcy5yb3coe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgY3JlYXRlZEJ5OiB0aGlzLmFjdG9yKHVzZXJJZCksXG4gICAgICAgIHVwZGF0ZWRCeTogdGhpcy5hY3Rvcih1c2VySWQpLFxuICAgICAgfSkpXG4gICAgICAub25Db25mbGljdERvTm90aGluZyh7IHRhcmdldDogdGhpcy5jb25mbGljdFRhcmdldCBhcyBhbnkgfSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoJ0EgcmVjb3JkIHdpdGggdGhlIHNhbWUgaWRlbnRpdHkgYWxyZWFkeSBleGlzdHMuIElmIGl0IHdhcyBkZWxldGVkLCByZXN0b3JlIGl0IGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQXdhaXRlZCBpbnRlbnRpb25hbGx5OiBjYWNoZSBpbnZhbGlkYXRpb24gaGFwcGVucyBpbiB0aGUgaG9vaywgYW5kIGFcbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQgcGF0dGVybiBsZXRzIGEgc3Vic2VxdWVudCByZWFkIGluc2lkZSB0aGUgc2FtZSByZXF1ZXN0XG4gICAgLy8gcmV0dXJuIHRoZSBzdGFsZSBwcmUtd3JpdGUgZW50cnkuIFRoZSBob29rIGlzIGV4cGVjdGVkIHRvIGJlIGZhc3RcbiAgICAvLyAoc2luZ2xlIFJlZGlzIG9wKTsgc2xvdyBob29rcyBzaG91bGQgcnVuIHRoZWlyIG93biBiYWNrZ3JvdW5kIHdvcmsuXG4gICAgYXdhaXQgdGhpcy5ydW5Ib29rKCgpID0+IHRoaXMub25BZnRlckNyZWF0ZShjcmVhdGVkLCB1c2VySWQpKTtcblxuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuXG4gICAgLy8gU2NydWIgYSBjYWxsZXItc3VwcGxpZWQgYG9yZ0lkYCBpbiB0aGUgdXBkYXRlIHBheWxvYWQgKGFzIGNyZWF0ZSBkb2VzKTogdGhlXG4gICAgLy8gV0hFUkUgb25seSBwaW5zIHdoaWNoIHJvd3MgeW91IGNhbiBUQVJHRVQsIG5vdCB3aGF0IHlvdSBjYW4gc2V0IOKAlCB3aXRob3V0IHRoaXNcbiAgICAvLyBhIHRlbmFudCBjb3VsZCByZS1ob21lIGEgcm93IGl0IG93bnMgaW50byBhbm90aGVyIG9yZyB2aWEgYGRhdGEub3JnSWRgLlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG5cbiAgICBjb25zdCBbdXBkYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQodGhpcy5yb3coe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHRoaXMuYWN0b3IodXNlcklkKSxcbiAgICAgIH0pKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICBhd2FpdCB0aGlzLnJ1bkhvb2soKCkgPT4gdGhpcy5vbkFmdGVyVXBkYXRlKGlkLCB1cGRhdGVkLCB1c2VySWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBlbnRpdHkgKHNvZnQgZGVsZXRlIGJ5IHNldHRpbmcgaXNBY3RpdmUgPSBmYWxzZSlcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy53cml0ZUNvbmRpdGlvbnMoaWQsIG9yZ0lkKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgY29uc3QgW2RlbGV0ZWRdID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHRoaXMucm93KHRoaXMudG9tYnN0b25lU2V0KG5vdywgdXNlcklkKSkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgaWYgKGRlbGV0ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMucnVuSG9vaygoKSA9PiB0aGlzLm9uQWZ0ZXJEZWxldGUoaWQsIGRlbGV0ZWQsIHVzZXJJZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGVudGl0eSBhcyB0aGUgZGVmYXVsdCBmb3IgYSBwcm9qZWN0L29yZ2FuaXphdGlvbiBzY29wZS5cbiAgICogTWFya3MgYWxsIG90aGVyIGVudGl0aWVzIGFzIG5vbi1kZWZhdWx0LCB0aGVuIHNldHMgdGhlIHNwZWNpZmllZCBlbnRpdHkuXG4gICAqIFVzZXMgYSB0cmFuc2FjdGlvbiB0byBlbnN1cmUgYXRvbWljaXR5LlxuICAgKi9cbiAgYXN5bmMgc2V0RGVmYXVsdChcbiAgICBwcm9qZWN0OiBzdHJpbmcsXG4gICAgb3JnOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgLy8gQSBub24tc3lzYWRtaW4gbWF5IG9ubHkgZmxpcCBkZWZhdWx0cyB3aXRoaW4gaXRzIE9XTiBvcmcg4oCUIHBpbiB0aGUgc2NvcGUgdG9cbiAgICAvLyB0aGUgdHJ1c3RlZCB0ZW5hbnQgY29udGV4dCBzbyBhIGZvcndhcmRlZCBgb3JnYCBhcmcgY2FuJ3QgdG91Y2ggYW5vdGhlclxuICAgIC8vIHRlbmFudCdzIGRlZmF1bHRzIChhcHAtbGF5ZXIgcGluLCBpbiBhZGRpdGlvbiB0byBSTFMpLlxuICAgIGNvbnN0IGN0eCA9IGdldFRlbmFudENvbnRleHQoKTtcbiAgICBpZiAoY3R4ICYmICFjdHguaXNTdXBlckFkbWluICYmIGN0eC5vcmdJZCkgb3JnID0gY3R4Lm9yZ0lkO1xuICAgIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBvcmdDb2x1bW4gPSB0aGlzLmdldE9yZ0NvbHVtbigpO1xuICAgICAgY29uc3QgcHJvamVjdENvbHVtbiA9IHRoaXMuZ2V0UHJvamVjdENvbHVtbigpO1xuXG4gICAgICAvLyBCdWlsZCBzY29waW5nIGNvbmRpdGlvbnMgZm9yIGNsZWFyaW5nIGRlZmF1bHRzXG4gICAgICBjb25zdCBzY29wZUNvbmRpdGlvbnMgPSBbXG4gICAgICAgIGVxKG9yZ0NvbHVtbiwgb3JnKSxcbiAgICAgICAgZXEodGhpcy5jb2xzLmlzRGVmYXVsdCwgdHJ1ZSksXG4gICAgICBdO1xuICAgICAgaWYgKHByb2plY3RDb2x1bW4pIHtcbiAgICAgICAgc2NvcGVDb25kaXRpb25zLnB1c2goZXEocHJvamVjdENvbHVtbiwgcHJvamVjdCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2NrIGV4aXN0aW5nIGRlZmF1bHRzIHdpdGggRk9SIFVQREFURSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgc2V0RGVmYXVsdCByYWNlc1xuICAgICAgYXdhaXQgdHguZXhlY3V0ZShcbiAgICAgICAgc3FsYFNFTEVDVCBpZCBGUk9NICR7dGhpcy5zY2hlbWF9XG4gICAgICAgICAgICBXSEVSRSAke29yZ0NvbHVtbn0gPSAke29yZ31cbiAgICAgICAgICAgICAgQU5EICR7dGhpcy5jb2xzLmlzRGVmYXVsdH0gPSB0cnVlXG4gICAgICAgICAgICAke3Byb2plY3RDb2x1bW4gPyBzcWxgQU5EICR7cHJvamVjdENvbHVtbn0gPSAke3Byb2plY3R9YCA6IHNxbGBgfVxuICAgICAgICAgICAgRk9SIFVQREFURWAsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFsbCBlbnRpdGllcyBpbiBzY29wZSBhcyBub24tZGVmYXVsdFxuICAgICAgYXdhaXQgdHhcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLnNldCh0aGlzLnJvdyh7XG4gICAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXBkYXRlZEJ5OiB0aGlzLmFjdG9yKHVzZXJJZCksXG4gICAgICAgIH0pKVxuICAgICAgICAud2hlcmUoYW5kKC4uLnNjb3BlQ29uZGl0aW9ucykpO1xuXG4gICAgICAvLyBTZXQgdGhlIHNwZWNpZmllZCBlbnRpdHkgYXMgZGVmYXVsdC4gR3VhcmQgYWdhaW5zdCBwcm9tb3RpbmcgYVxuICAgICAgLy8gc29mdC1kZWxldGVkIHJvdyAoaXNBY3RpdmUgPSB0cnVlKSDigJQgYSBkZWxldGVkIGVudGl0eSBtdXN0IG5ldmVyIGJlY29tZVxuICAgICAgLy8gdGhlIGFjdGl2ZSBkZWZhdWx0IOKAlCBhbmQgcGluIHRoZSBpZCB3aXRoIHRoZSBzYW1lIGxvd2VyY2FzZWRcbiAgICAgIC8vIGV4YWN0SWRDb25kaXRpb24gdGhlIG11dGF0aW9uIHBhdGhzIHVzZSAodGhlIHJhdyBgZXEoY29scy5pZCwgaWQpYCBoZXJlXG4gICAgICAvLyBza2lwcGVkIHRoZSBsb3dlci1jYXNpbmcgdGhhdCBgYnVpbGRJZEZpbHRlcmAvYHdyaXRlQ29uZGl0aW9uc2AgYXBwbHksXG4gICAgICAvLyBzbyBhIG1peGVkLWNhc2UgaWQgY291bGQgbWlzcyBpdHMgcm93KS4gQSBub24tbWF0Y2gg4oaSIE5vdEZvdW5kRXJyb3IgYmVsb3cuXG4gICAgICBjb25zdCBbdXBkYXRlZF0gPSBhd2FpdCB0eFxuICAgICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgICAuc2V0KHRoaXMucm93KHtcbiAgICAgICAgICBpc0RlZmF1bHQ6IHRydWUsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdGhpcy5hY3Rvcih1c2VySWQpLFxuICAgICAgICB9KSlcbiAgICAgICAgLndoZXJlKFxuICAgICAgICAgIGFuZChcbiAgICAgICAgICAgIHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCksXG4gICAgICAgICAgICBlcShvcmdDb2x1bW4sIG9yZyksXG4gICAgICAgICAgICBlcSh0aGlzLmNvbHMuaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSk7XG5cbiAgICAgIGlmICghdXBkYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgRW50aXR5IHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtdWx0aXBsZSBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXJcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU1hbnkoXG4gICAgZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCk7XG4gICAgLy8gT3duLW9yZyB3cml0ZS1waW46IGJ1aWxkQ29uZGl0aW9ucyBhbHNvIG1hdGNoZXMgc3lzdGVtL290aGVyLW9yZyBQVUJMSUNcbiAgICAvLyByb3dzLCBzbyB3aXRob3V0IHRoZSBzdHJpY3Qgb3JnSWQgcGluIGEgZmlsdGVyLWJhc2VkIHVwZGF0ZSBjb3VsZCBtdXRhdGVcbiAgICAvLyBzaGFyZWQgKG9yIGFub3RoZXIgdGVuYW50J3MgcHVibGljKSByZWNvcmRzLiBNaXJyb3IgdXBkYXRlL2RlbGV0ZS9cbiAgICAvLyBidWxrRGVsZXRlLiAoU2VlIHdyaXRlQ29uZGl0aW9ucy4pIEFuIG9yZ0lkLWxlc3MgKHN5c2FkbWluKSBjb250ZXh0IGtlZXBzXG4gICAgLy8gZnVsbCBhY2Nlc3MuXG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcblxuICAgIC8vIFNjcnViIGEgY2FsbGVyLXN1cHBsaWVkIG9yZ0lkIChzZWUgdXBkYXRlKCkpIHNvIGEgZmlsdGVyLWJhc2VkIHVwZGF0ZSBjYW4ndFxuICAgIC8vIHJlLWhvbWUgcm93cyBpbnRvIGFub3RoZXIgdGVuYW50LlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG5cbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHRoaXMucm93KHtcbiAgICAgICAgLi4uc2FmZURhdGEsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB0aGlzLmFjdG9yKHVzZXJJZCksXG4gICAgICB9KSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBUaGUgYHZpc2liaWxpdHlgIHByZWRpY2F0ZSBmb3IgYSBidWxrIHNvZnQtZGVsZXRlLCBtaXJyb3JpbmdcbiAgICogYHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3NgIHJ1bmcgZm9yIHJ1bmcgc28gYnVsayBhbmQgc2luZ2xlLXJvdyBkZWxldGVcbiAgICogY2FuIG5ldmVyIGRpc2FncmVlIGFib3V0IHdoYXQgYSBjYWxsZXIgbWF5IHJlbW92ZS5cbiAgICpcbiAgICogUmV0dXJucyBubyBjb25kaXRpb24gYXQgYWxsIGZvciBhIHN5c3RlbSBhZG1pbiwgb3IgZm9yIGFuIGVudGl0eSB3aXRoIG5vXG4gICAqIGB2aXNpYmlsaXR5YCBjb2x1bW4gKG5vdGhpbmcgdG8gZ2F0ZSBvbikuXG4gICAqL1xuICBwcml2YXRlIHZpc2liaWxpdHlEZWxldGVDb25kaXRpb25zKFxuICAgIGFjY2VzczogeyBpc1N5c3RlbUFkbWluOiBib29sZWFuOyBjYW5QdWJsaXNoOiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgYWNjZXNzQ29sPzogQW55Q29sdW1uLFxuICAgIGNyZWF0ZWRCeUNvbD86IEFueUNvbHVtbixcbiAgKTogU1FMW10ge1xuICAgIGlmICghYWNjZXNzQ29sKSByZXR1cm4gW107XG4gICAgaWYgKCFhY2Nlc3MgfHwgYWNjZXNzLmlzU3lzdGVtQWRtaW4pIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHJ1bmdzOiBTUUxbXSA9IFtlcShhY2Nlc3NDb2wsICdvcmcnKV07XG4gICAgLy8gYHByaXZhdGVgIGlzIGF1dGhvci1vbmx5LiBXaXRoIG5vIGF1dGhvciBjb2x1bW4gb3Igbm8gY2FsbGVyIGlkZW50aXR5IHdlXG4gICAgLy8gY2Fubm90IHByb3ZlIGF1dGhvcnNoaXAsIHNvIHRoZSBydW5nIGlzIHNpbXBseSBub3Qgb2ZmZXJlZCAoZmFpbCBjbG9zZWQpXG4gICAgLy8gcmF0aGVyIHRoYW4gbWF0Y2hpbmcgZXZlcnkgcHJpdmF0ZSByb3cuXG4gICAgaWYgKGNyZWF0ZWRCeUNvbCAmJiB1c2VySWQpIHtcbiAgICAgIHJ1bmdzLnB1c2goYW5kKGVxKGFjY2Vzc0NvbCwgJ3ByaXZhdGUnKSwgZXEoY3JlYXRlZEJ5Q29sLCB1c2VySWQpKSBhcyBTUUwpO1xuICAgIH1cbiAgICBpZiAoYWNjZXNzLmNhblB1Ymxpc2gpIHJ1bmdzLnB1c2goZXEoYWNjZXNzQ29sLCAncHVibGljJykpO1xuXG4gICAgcmV0dXJuIFtvciguLi5ydW5ncykgYXMgU1FMXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb2Z0LWRlbGV0ZSBtdWx0aXBsZSBlbnRpdGllcyBieSBJRHMgaW4gYSBzaW5nbGUgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgYnVsa0RlbGV0ZShcbiAgICBpZHM6IHN0cmluZ1tdLFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIGNhbGxlcidzIGF1dGhvcml0eSBvbiB0aGUgdGhyZWUtcnVuZyBgdmlzaWJpbGl0eWAgbGFkZGVyLiBPbWl0IChvclxuICAgICAqIHBhc3MgYGlzU3lzdGVtQWRtaW46IHRydWVgKSBmb3IgYW4gdW5yZXN0cmljdGVkIGRlbGV0ZS4gVGhlIHJ1bmdzIG1pcnJvclxuICAgICAqIGByZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzYCBleGFjdGx5LCBzbyBidWxrIGFuZCBzaW5nbGUtcm93IGRlbGV0ZSBhZ3JlZTpcbiAgICAgKiAgIC0gYHByaXZhdGVgIOKGkiBhdXRob3Igb25seSAoYGNyZWF0ZWRCeSA9PT0gdXNlcklkYClcbiAgICAgKiAgIC0gYG9yZ2AgICAgIOKGkiBhbnkgbWVtYmVyIG9mIHRoZSBvcmcgKHBsYWluIGA6d3JpdGVgKVxuICAgICAqICAgLSBgcHVibGljYCAg4oaSIHJlcXVpcmVzIHRoZSBlbnRpdHkncyBwdWJsaXNoIHBlcm1pc3Npb25cbiAgICAgKi9cbiAgICBhY2Nlc3M/OiB7IGlzU3lzdGVtQWRtaW46IGJvb2xlYW47IGNhblB1Ymxpc2g6IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAvLyBPd25lci1zY29wZSB0aGUgYnVsayBzb2Z0LWRlbGV0ZTogYnVpbGRDb25kaXRpb25zIGFsc28gbWF0Y2hlcyBzeXN0ZW0vb3RoZXJcbiAgICAvLyAtb3JnIFBVQkxJQyByb3dzLCBzbyB3aXRob3V0IHRoZSBzdHJpY3Qgb3JnSWQgcGluIGEgdGVuYW50IGNvdWxkIGRlbGV0ZVxuICAgIC8vIHNoYXJlZCByZWNvcmRzIGJ5IGlkLiAoU2VlIHdyaXRlQ29uZGl0aW9ucy4pXG4gICAgY29uc3QgYWNjZXNzQ29sID0gdGhpcy5jb2xzLnZpc2liaWxpdHk7XG4gICAgY29uc3QgY3JlYXRlZEJ5Q29sID0gdGhpcy5jb2xzLmNyZWF0ZWRCeTtcbiAgICBjb25zdCBjb25kaXRpb25zID0gW1xuICAgICAgaW5BcnJheSh0aGlzLmNvbHMuaWQsIGlkcyksXG4gICAgICAuLi50aGlzLmJ1aWxkQ29uZGl0aW9ucyh7fSBhcyBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZCksXG4gICAgICAvLyBUZW5hbnQgY29sdW1uIChnZXRPcmdDb2x1bW4sIGFzc2VydGVkIG5vbi1udWxsKSDigJQgY29uc2lzdGVudCB3aXRoXG4gICAgICAvLyB3cml0ZUNvbmRpdGlvbnM7IG5vIHNpbGVudCBmYWlsLW9wZW4gd2hlbiB0aGUgcHJvcGVydHkgaXMgYWJzZW50LlxuICAgICAgLi4uKG9yZ0lkID8gW2VxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKV0gOiBbXSksXG4gICAgICAuLi50aGlzLnZpc2liaWxpdHlEZWxldGVDb25kaXRpb25zKGFjY2VzcywgdXNlcklkLCBhY2Nlc3NDb2wsIGNyZWF0ZWRCeUNvbCksXG4gICAgICAvLyBSZS1kZWxldGluZyBhIHRvbWJzdG9uZSB3b3VsZCByZS1zdGFtcCBpdHMgcHVyZ2UgZGVhZGxpbmUuXG4gICAgICAuLi50aGlzLm5vdFRvbWJzdG9uZWQoKSxcbiAgICBdO1xuXG4gICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh0aGlzLnJvdyh0aGlzLnRvbWJzdG9uZVNldChub3csIHVzZXJJZCkpKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGRlbGV0ZWQubWFwKGVudGl0eSA9PiB0aGlzLnJ1bkhvb2soKCkgPT4gdGhpcy5vbkFmdGVyRGVsZXRlKGVudGl0eS5pZCwgZW50aXR5LCB1c2VySWQpKSkpO1xuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICAvKiogQ29uZGl0aW9ucyBtYXRjaGluZyBhIEdFTlVJTkUgdG9tYnN0b25lIChgaXNBY3RpdmU9ZmFsc2VgIEFORCBgZGVsZXRlZEF0IElTXG4gICAqICBOT1QgTlVMTGApLCBvcHRpb25hbGx5IHBpbm5lZCB0byBgaWRgIGFuZC9vciBgb3JnSWRgLiBTaW5nbGUgc291cmNlIG9mIHRydXRoXG4gICAqICBmb3IgcmVzdG9yZS9maW5kRGVsZXRlZEJ5SWQvZmluZERlbGV0ZWQgc28gdGhlIFwid2hhdCBpcyBhIHRvbWJzdG9uZVwiIHJ1bGVcbiAgICogIGxpdmVzIGluIG9uZSBwbGFjZS4gKi9cbiAgcHJpdmF0ZSB0b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkPzogc3RyaW5nLCBpZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtcbiAgICAgIGVxKHRoaXMuY29scy5pc0FjdGl2ZSwgZmFsc2UpLFxuICAgICAgc3FsYCR7dGhpcy5jb2xzLmRlbGV0ZWRBdH0gSVMgTk9UIE5VTExgLFxuICAgICAgLi4udGhpcy50b21ic3RvbmVWaXNpYmlsaXR5Q29uZGl0aW9ucygpLFxuICAgIF07XG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIGNvbmRpdGlvbnMudW5zaGlmdCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcbiAgICBpZiAob3JnSWQpIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCkpO1xuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgcHJpdmF0ZWAgcnVuZywgZm9yIFRPTUJTVE9ORSByZWFkcyBhbmQgcmVzdG9yZS5cbiAgICpcbiAgICogRGVsZXRpbmcgYSByb3cgZG9lcyBub3QgZGVjbGFzc2lmeSBpdDogd2l0aG91dCB0aGlzLCB0aGUgXCJyZWNlbnRseVxuICAgKiBkZWxldGVkXCIgbGlzdCAoYW5kIHJlc3RvcmUpIHdvdWxkIGV4cG9zZSBvdGhlciBtZW1iZXJzJyBQUklWQVRFIHJvd3MgdGhhdFxuICAgKiB0aGUgc2FtZSB2aWV3ZXIgY291bGQgbm90IHJlYWQgYmVmb3JlIHRoZXkgd2VyZSBkZWxldGVkLlxuICAgKlxuICAgKiBNaXJyb3JzIHRoZSBsaXZlIHJlYWQgbGFkZGVyIChgdmlzaWJpbGl0eSA8PiAncHJpdmF0ZScgT1IgY3JlYXRlZF9ieSA9IFZgKVxuICAgKiByYXRoZXIgdGhhbiB0aGUgZGVsZXRlIGxhZGRlcjogdGhpcyBnYXRlcyB3aG8gbWF5IFNFRSBhIHRvbWJzdG9uZSwgYW5kIGFcbiAgICogdG9tYnN0b25lIHNob3VsZCBiZSB2aXNpYmxlIHRvIGV4YWN0bHkgd2hvZXZlciBjb3VsZCBzZWUgdGhlIHJvdy4gQVxuICAgKiBzdXBlci1hZG1pbiBhZG1pbmlzdGVycyB0aGUgd2hvbGUgY2F0YWxvZywgc28gdGhlIHJ1bmcgbGlmdHMgZm9yIHRoZW0uXG4gICAqXG4gICAqIEZhaWxzIENMT1NFRDogd2l0aCBubyBhdXRob3IgY29sdW1uIG9yIG5vIHZpZXdlciAoYmFja2dyb3VuZCBqb2JzLCB0aGVcbiAgICogcmV0ZW50aW9uIHN3ZWVwKSB0aGUgcHJpdmF0ZSBydW5nIGlzIG5vdCBvZmZlcmVkIGF0IGFsbCByYXRoZXIgdGhhblxuICAgKiBtYXRjaGluZyBldmVyeSBwcml2YXRlIHJvdy4gYHB1cmdlRXhwaXJlZGAgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IHVzZSB0aGlzIOKAlFxuICAgKiBpdCBydW5zIG9yZy13aWRlIHVuZGVyIGEgc3lzYWRtaW4gc2NvcGUgYW5kIG11c3QgcmVhY2ggZXZlcnkgdG9tYnN0b25lLlxuICAgKi9cbiAgcHJpdmF0ZSB0b21ic3RvbmVWaXNpYmlsaXR5Q29uZGl0aW9ucygpOiBTUUxbXSB7XG4gICAgY29uc3QgYWNjZXNzQ29sID0gdGhpcy5jb2xzLnZpc2liaWxpdHk7XG4gICAgaWYgKCFhY2Nlc3NDb2wpIHJldHVybiBbXTtcbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgaWYgKGN0eD8uaXNTdXBlckFkbWluKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBjcmVhdGVkQnlDb2wgPSB0aGlzLmNvbHMuY3JlYXRlZEJ5O1xuICAgIGNvbnN0IHZpZXdlciA9IGN0eD8udXNlcklkO1xuICAgIGNvbnN0IHJ1bmdzOiBTUUxbXSA9IFtzcWxgJHthY2Nlc3NDb2x9IDw+ICdwcml2YXRlJ2BdO1xuICAgIGlmIChjcmVhdGVkQnlDb2wgJiYgdmlld2VyKSBydW5ncy5wdXNoKGVxKGNyZWF0ZWRCeUNvbCwgdmlld2VyKSk7XG4gICAgcmV0dXJuIFtvciguLi5ydW5ncykgYXMgU1FMXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGEgc29mdC1kZWxldGVkICh0b21ic3RvbmVkKSBlbnRpdHk6IGNsZWFyIGBpc0FjdGl2ZWAvYGRlbGV0ZWRBdGAvXG4gICAqIGBkZWxldGVkQnlgL2BwdXJnZUFmdGVyYCBzbyBpdCByZWFwcGVhcnMgaW4gbm9ybWFsIHJlYWRzLlxuICAgKlxuICAgKiBNYXRjaGVzIE9OTFkgYSBnZW51aW5lIHRvbWJzdG9uZSDigJQgYGlzQWN0aXZlID0gZmFsc2VgIEFORCBgZGVsZXRlZEF0IElTIE5PVFxuICAgKiBOVUxMYCDigJQgc28gYSBtZXJlbHkgKmRlYWN0aXZhdGVkKiByb3cgKGlzQWN0aXZlPWZhbHNlLCBubyBkZWxldGVkQXQpIGlzIG5ldmVyXG4gICAqIHNpbGVudGx5IFwicmVzdG9yZWRcIi4gUGlubmVkIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIChvcmdJZC1sZXNzIHN5c2FkbWluXG4gICAqIGNvbnRleHQgc3BhbnMgb3JncywgbWF0Y2hpbmcgZGVsZXRlL3VwZGF0ZSkuIFJldHVybnMgbnVsbCB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIHN1Y2ggdG9tYnN0b25lIChhbHJlYWR5IGFjdGl2ZSwgcHVyZ2VkLCBvciB1bmtub3duKSBzbyB0aGUgcm91dGUgY2FuIDQwNC5cbiAgICogQSB1bmlxdWUta2V5IGNvbGxpc2lvbiAoYSBsaXZlIHJvdyBhbHJlYWR5IGhvbGRzIHRoZSBrZXkpIHN1cmZhY2VzIGFzIHRoZVxuICAgKiBkcml2ZXIncyB1bmlxdWUtdmlvbGF0aW9uIGZvciB0aGUgcm91dGUgdG8gbWFwIHRvIDQwOSDigJQgaW4gcHJhY3RpY2UgdGhlXG4gICAqIHRvbWJzdG9uZSBJUyB0aGUga2V5IGhvbGRlciwgc28gdGhpcyBpcyBkZWZlbnNpdmUuXG4gICAqL1xuICBhc3luYyByZXN0b3JlKGlkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCkgcmV0dXJuIG51bGw7IC8vIGVudGl0eSBoYXMgbm8gc29mdC1kZWxldGUgbGlmZWN5Y2xlXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMudG9tYnN0b25lQ29uZGl0aW9ucyhvcmdJZCwgaWQpO1xuXG4gICAgY29uc3QgW3Jlc3RvcmVkXSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh0aGlzLnJvdyh7XG4gICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdGhpcy5hY3Rvcih1c2VySWQpLFxuICAgICAgICBkZWxldGVkQXQ6IG51bGwsXG4gICAgICAgIGRlbGV0ZWRCeTogbnVsbCxcbiAgICAgICAgLi4uKHRoaXMuY29scy5wdXJnZUFmdGVyID8geyBwdXJnZUFmdGVyOiBudWxsIH0gOiB7fSksXG4gICAgICB9KSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBpZiAocmVzdG9yZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMucnVuSG9vaygoKSA9PiB0aGlzLm9uQWZ0ZXJSZXN0b3JlKGlkLCByZXN0b3JlZCwgdXNlcklkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3RvcmVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhIHNvZnQtZGVsZXRlZCBlbnRpdHkgYnkgaWQgKHRoZSBpbnZlcnNlIG9mIHRoZSBkZWZhdWx0IGBpc0FjdGl2ZT10cnVlYFxuICAgKiByZWFkcykg4oCUIHVzZWQgYnkgcmVzdG9yZSByb3V0ZXMgdG8gbG9hZCB0aGUgdG9tYnN0b25lIGZvciBhY2Nlc3MtY29udHJvbFxuICAgKiBnYXRpbmcgYmVmb3JlIHJlc3RvcmluZy4gUmV0dXJucyBudWxsIHVubGVzcyB0aGUgcm93IGV4aXN0cyBBTkQgaXMgYSBnZW51aW5lXG4gICAqIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCArIGBkZWxldGVkQXQgSVMgTk9UIE5VTExgKS5cbiAgICovXG4gIGFzeW5jIGZpbmREZWxldGVkQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAubGltaXQoMSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYW4gb3JnJ3Mgc29mdC1kZWxldGVkIHRvbWJzdG9uZXMgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVFxuICAgKiBOVUxMYCksIG1vc3QtcmVjZW50bHktZGVsZXRlZCBmaXJzdCDigJQgcG93ZXJzIHRoZSBcInJlY2VudGx5IGRlbGV0ZWRcIiByZXN0b3JlXG4gICAqIFVJLiBSZXR1cm5zIGBbXWAgZm9yIGVudGl0aWVzIHdpdGhvdXQgYSBzb2Z0LWRlbGV0ZSBsaWZlY3ljbGUuIGBsaW1pdGAgaXNcbiAgICogY2xhbXBlZCB0byBbMSwgMjAwXSB0byBrZWVwIHRoZSByZXNwb25zZSBib3VuZGVkICh0aGUgcmV0ZW50aW9uIHN3ZWVwIGhhcmQtXG4gICAqIGRlbGV0ZXMgb2xkIHRvbWJzdG9uZXMgYW55d2F5LCBzbyB0aGlzIGlzIGEgc2hvcnQsIHNlbGYtbGltaXRpbmcgbGlzdCkuXG4gICAqL1xuICBhc3luYyBmaW5kRGVsZXRlZChcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIG9wdHM6IHsgbGltaXQ/OiBudW1iZXI7IG9mZnNldD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gW107XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heCgxLCBvcHRzLmxpbWl0ID8/IDUwKSwgMjAwKTtcbiAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCgwLCBvcHRzLm9mZnNldCA/PyAwKTtcblxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQpO1xuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5vcmRlckJ5KGRlc2ModGhpcy5jb2xzLmRlbGV0ZWRBdCEpKVxuICAgICAgLmxpbWl0KGxpbWl0KVxuICAgICAgLm9mZnNldChvZmZzZXQpXG4gICAgICAudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFyZC1kZWxldGUgYSBiYXRjaCBvZiB0b21ic3RvbmVzIHdob3NlIHB1cmdlIGRlYWRsaW5lIGhhcyBwYXNzZWRcbiAgICogKGBkZWxldGVkQXQgSVMgTk9UIE5VTEwgQU5EIHB1cmdlX2FmdGVyIDwgbm93YCkuIEJhdGNoZWQgKGBsaW1pdGApIHNvIGFcbiAgICogc3dlZXAgdGljayBzdGF5cyBib3VuZGVkOyB0aGUgcGVyLXNlcnZpY2Ugc3dlZXAgbG9vcHMgdW50aWwgYSB0aWNrIHJldHVybnNcbiAgICogYDwgbGltaXRgLiBSdW5zIGFjcm9zcyBBTEwgb3Jncywgc28gY2FsbGVycyBNVVNUIGludm9rZSBpdCBmcm9tIGEgc3lzYWRtaW5cbiAgICogc2NvcGUgKGBydW5Tb2Z0RGVsZXRlUHVyZ2VgIGVzdGFibGlzaGVzIG9uZSkuIGBvbkJlZm9yZVB1cmdlKGlkcywgdHgpYCB0ZWFyc1xuICAgKiBkb3duIGRlcGVuZGVudHMgbGFja2luZyBPTiBERUxFVEUgQ0FTQ0FERSBpbnNpZGUgdGhlIHNhbWUgdHg7IGBvbkFmdGVyUHVyZ2VgXG4gICAqIGhhbmRsZXMgZXh0ZXJuYWwgc2lkZS1lZmZlY3RzLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBwdXJnZWQuIE5vLW9wICgwKSBmb3IgZW50aXRpZXMgd2l0aG91dCB0aGUgY29sdW1ucy5cbiAgICovXG4gIGFzeW5jIHB1cmdlRXhwaXJlZChub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQgfHwgIXRoaXMuY29scy5wdXJnZUFmdGVyKSByZXR1cm4gMDtcbiAgICBjb25zdCBndWFyZCA9IHRoaXMucHVyZ2VHdWFyZCgpO1xuICAgIGNvbnN0IHB1cmdlZCA9IGF3YWl0IHRoaXMucHVyZ2VXaGVyZShbc3FsYCR7dGhpcy5jb2xzLmRlbGV0ZWRBdH0gSVMgTk9UIE5VTExgLCBzcWxgJHt0aGlzLmNvbHMucHVyZ2VBZnRlcn0gPCAke25vd31gLCAuLi4oZ3VhcmQgPyBbZ3VhcmRdIDogW10pXSwgbGltaXQpO1xuICAgIHJldHVybiBwdXJnZWQubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV4dHJhIGNvbmRpdGlvbiBldmVyeSBwdXJnZSAoc3dlZXAgYW5kIG1hbnVhbCkgYWRkczogYSB0b21ic3RvbmUgdGhhdFxuICAgKiBmYWlscyBpdCBpcyBLRVBULiBEZWZhdWx0IG5vbmUuIFRoZSBwbHVnaW4gc2VydmljZSBrZWVwcyBhIHZlcnNpb24gYW55XG4gICAqIHBpcGVsaW5lIHN0aWxsIHJlZmVyZW5jZXMgKHNlZSAuL3ZlcnNpb24tcmVmZXJlbmNlcy50cykg4oCUIHN1Y2ggYSByb3cgc3RheXNcbiAgICogYSB0b21ic3RvbmUgdW50aWwgdGhlIGxhc3QgcmVmZXJlbmNlIGdvZXMsIGFuZCB0aGUgc3dlZXAgcmV0cmllcyBpdC5cbiAgICovXG4gIHByb3RlY3RlZCBwdXJnZUd1YXJkKCk6IFNRTCB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uLWRlbWFuZCBoYXJkLWRlbGV0ZSBvZiBhIFNJTkdMRSB0b21ic3RvbmUgYnkgaWQg4oCUIHRoZSBtYW51YWwgY291bnRlcnBhcnRcbiAgICogdG8gdGhlIHJldGVudGlvbiBzd2VlcCdzIGBwdXJnZUV4cGlyZWRgLiBQZXJtYW5lbnRseSByZW1vdmVzIHRoZSByb3cgT05MWVxuICAgKiB3aGVuIGl0IGlzIGEgZ2VudWluZSB0b21ic3RvbmUgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVCBOVUxMYCksXG4gICAqIG9wdGlvbmFsbHkgcGlubmVkIHRvIGBvcmdJZGAgKGFuIG9yZ0lkLWxlc3Mgc3lzYWRtaW4gY29udGV4dCBzcGFucyBvcmdzLFxuICAgKiBtYXRjaGluZyByZXN0b3JlL2RlbGV0ZSkuIFJ1bnMgdGhlIHNhbWUgYG9uQmVmb3JlUHVyZ2VgIGRlcGVuZGVudCB0ZWFyZG93blxuICAgKiBpbnNpZGUgdGhlIHR4IGFuZCB0aGUgc2FtZSBgb25BZnRlclB1cmdlYCBzaWRlLWVmZmVjdHMgYXMgdGhlIHN3ZWVwLlxuICAgKlxuICAgKiBJZ25vcmVzIGBwdXJnZUFmdGVyYDogYSBtYW51YWwgcHVyZ2UgZmluYWxpemVzIGFuIGFscmVhZHktc29mdC1kZWxldGVkIGl0ZW1cbiAgICogaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHJldGVudGlvbiBkZWFkbGluZS4gUmV0dXJucyB0aGVcbiAgICogcHVyZ2VkIGlkLCBvciBudWxsIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCB0b21ic3RvbmUgKGFscmVhZHkgYWN0aXZlLCBwdXJnZWQsXG4gICAqIG91dCBvZiBzY29wZSwgb3IgdW5rbm93bikgc28gdGhlIHJvdXRlIGNhbiA0MDQuXG4gICAqL1xuICBhc3luYyBwdXJnZUJ5SWQoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGd1YXJkID0gdGhpcy5wdXJnZUd1YXJkKCk7XG4gICAgY29uc3QgW3B1cmdlZElkXSA9IGF3YWl0IHRoaXMucHVyZ2VXaGVyZShbLi4udGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkLCBpZCksIC4uLihndWFyZCA/IFtndWFyZF0gOiBbXSldLCAxKTtcbiAgICByZXR1cm4gcHVyZ2VkSWQgPz8gbnVsbDtcbiAgfVxufVxuIl19
872
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2NydWQtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JKLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFJLElBQWE7SUFDMUMsT0FBTyxJQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQWE7SUFDeEMsT0FBTyxJQUEyQixDQUFDO0FBQ3JDLENBQUM7QUF5RUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFNUc7Ozs2RUFHNkU7QUFDN0UsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxPQUFPLHdCQUF3QixDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7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QUFDO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxjQUFjLEVBQUUsR0FBRyxDQUFBLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6SixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sVUFBVTtRQUNsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQVUsRUFBRSxLQUFjO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pILE9BQU8sUUFBUSxJQUFJLElBQUksQ0FBQztJQUMxQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQ29uZmxpY3RFcnJvciwgTm90Rm91bmRFcnJvciwgY3JlYXRlTG9nZ2VyLCBERUZBVUxUX1BBR0VfTElNSVQsIE1BWF9QQUdFX0xJTUlULCBTWVNURU1fQUNUT1JfSUQsIGVudkludCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IFNRTCwgZXEsIGFuZCwgb3IsIGFzYywgZGVzYywgc3FsLCBpbkFycmF5LCBpc051bGwsIGdldFRhYmxlQ29sdW1ucyB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQW55Q29sdW1uIH0gZnJvbSAnZHJpenpsZS1vcm0vY29sdW1uJztcbmltcG9ydCB0eXBlIHsgUGdUYWJsZSB9IGZyb20gJ2RyaXp6bGUtb3JtL3BnLWNvcmUnO1xuaW1wb3J0IHsgQ1VSU09SX1NPUlRfS0VZLCBkZWNvZGVDdXJzb3IsIGVuY29kZUN1cnNvciwgaXNDYXN0YWJsZVRvLCBrZXlzZXRBZnRlciB9IGZyb20gJy4va2V5c2V0LWN1cnNvci5qcyc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHgsIHJ1bldpdGhUZW5hbnRDb250ZXh0LCBnZXRUZW5hbnRDb250ZXh0IH0gZnJvbSAnLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5cblxuLyoqXG4gKiBDYXN0IERyaXp6bGUgcXVlcnkgcmVzdWx0cyB0byBhIHR5cGVkIGFycmF5LlxuICogRHJpenpsZSdzIGdlbmVyaWMgcmV0dXJuIHR5cGUgKGBQZ1NlbGVjdEJhc2U8Li4uPmApIGRvZXNuJ3QgbmFycm93IHRvIG91clxuICogZW50aXR5IGdlbmVyaWNzLCBzbyBhbiBleHBsaWNpdCBjYXN0IGlzIG5lZWRlZC4gQ2VudHJhbGlzZWQgaGVyZSBzbyBldmVyeVxuICogY2FsbC1zaXRlIHN0YXlzIG9uZS1saW5lciBjbGVhbiBhbmQgdGhlIGNhc3QgaXMgZG9jdW1lbnRlZCBpbiBvbmUgcGxhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcml6emxlUm93czxUPihyb3dzOiB1bmtub3duKTogVFtdIHtcbiAgcmV0dXJuIHJvd3MgYXMgVFtdO1xufVxuXG4vKiogQ2FzdCBhIERyaXp6bGUgYWdncmVnYXRlIHJlc3VsdCB0byBleHRyYWN0IGBbeyBjb3VudDogbnVtYmVyIH1dYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcml6emxlQ291bnQocm93czogdW5rbm93bik6IFt7IGNvdW50OiBudW1iZXIgfV0ge1xuICByZXR1cm4gcm93cyBhcyBbeyBjb3VudDogbnVtYmVyIH1dO1xufVxuXG4vKiogVGhlIERyaXp6bGUgdHJhbnNhY3Rpb24gb2JqZWN0IGhhbmRlZCB0byBgd2l0aFRlbmFudFR4YCBjYWxsYmFja3MuIFBhc3NlZCB0b1xuICogIGBvbkJlZm9yZVB1cmdlYCBzbyBhIHN1YmNsYXNzJ3MgZGVwZW5kZW50IHRlYXJkb3duIHJ1bnMgaW4gdGhlIFNBTUUgcHVyZ2VcbiAqICB0cmFuc2FjdGlvbiAoYXRvbWljIHdpdGggdGhlIHBhcmVudCBERUxFVEUpLCBub3QgYSBmcmVzaCBjb25uZWN0aW9uLiAqL1xuZXhwb3J0IHR5cGUgQ3J1ZFR4ID0gUGFyYW1ldGVyczxQYXJhbWV0ZXJzPHR5cGVvZiB3aXRoVGVuYW50VHg+WzBdPlswXTtcblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgZW50aXRpZXMgd2l0aCBjb21tb24gZmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUVudGl0eSB7XG4gIGlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIGlzRGVmYXVsdDogYm9vbGVhbjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICB1cGRhdGVkQXQ6IERhdGU7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICB1cGRhdGVkQnk6IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBQYWdpbmF0aW9uIGFuZCBzb3J0aW5nIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeU9wdGlvbnMge1xuICBsaW1pdD86IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBzb3J0Qnk/OiBzdHJpbmc7XG4gIHNvcnRPcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuICAvKiogV2hlbiB0cnVlLCBydW5zIGEgc2VwYXJhdGUgQ09VTlQoKikgcXVlcnkgdG8gaW5jbHVkZSBleGFjdCB0b3RhbC4gRGVmYXVsdDogZmFsc2UuICovXG4gIGluY2x1ZGVUb3RhbD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBLZXlzZXQgcGFnaW5hdGlvbjogdGhlIG9wYXF1ZSBgbmV4dEN1cnNvcmAgb2YgdGhlIHByZXZpb3VzIHBhZ2UuIENvbnRpbnVlc1xuICAgKiBzdHJpY3RseSBhZnRlciB0aGF0IHJvdyBpbiAoc29ydEJ5LCBpZCkgb3JkZXI7IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgb2Zmc2V0YC5cbiAgICovXG4gIGN1cnNvcj86IHN0cmluZztcbiAgLyoqIFNwYXJzZSBmaWVsZHNldDogY29sdW1uIG5hbWVzIHRvIHNlbGVjdC4gUmV0dXJucyBhbGwgY29sdW1ucyB3aGVuIG9taXR0ZWQuICovXG4gIGZpZWxkcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhZ2luYXRlZCByZXN1bHQgd2l0aCBtZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZFJlc3VsdDxUPiB7XG4gIGRhdGE6IFRbXTtcbiAgLyoqIFRvdGFsIGNvdW50IG9mIG1hdGNoaW5nIGVudGl0aWVzLiBPbmx5IHByZXNlbnQgd2hlbiBpbmNsdWRlVG90YWwgaXMgdHJ1ZS4gKi9cbiAgdG90YWw/OiBudW1iZXI7XG4gIGxpbWl0OiBudW1iZXI7XG4gIG9mZnNldDogbnVtYmVyO1xuICBoYXNNb3JlOiBib29sZWFuO1xuICAvKiogT3BhcXVlIGN1cnNvciBmb3IgdGhlIG5leHQgcGFnZS4gUHJlc2VudCBvbmx5IHdoZW4gYGhhc01vcmVgLiAqL1xuICBuZXh0Q3Vyc29yPzogc3RyaW5nO1xufVxuXG4vKiogU3RydWN0dXJhbCB2aWV3IG9mIHRoZSBzdWJjbGFzcyB0YWJsZSdzIGNvbHVtbnMgdGhlIGJhc2UgY2xhc3MgdG91Y2hlc1xuICogIGRpcmVjdGx5LiBgaWRgL2Bpc0FjdGl2ZWAvYGlzRGVmYXVsdGAgYXJlIGFsd2F5cyBwcmVzZW50IG9uIGEgQ1JVRCBlbnRpdHk7XG4gKiAgYHZpc2liaWxpdHlgIG9ubHkgb24gdmlzaWJpbGl0eS1iZWFyaW5nIGVudGl0aWVzOyB0aGUgaW5kZXggc2lnbmF0dXJlXG4gKiAgY292ZXJzIGR5bmFtaWMgKHNwYXJzZS1maWVsZHNldCkgY29sdW1uIGFjY2Vzcy4gKi9cbmludGVyZmFjZSBDcnVkQ29sdW1ucyB7XG4gIGlkOiBBbnlDb2x1bW47XG4gIGlzQWN0aXZlOiBBbnlDb2x1bW47XG4gIGlzRGVmYXVsdDogQW55Q29sdW1uO1xuICB2aXNpYmlsaXR5PzogQW55Q29sdW1uO1xuICAvKiogQXV0aG9yIGNvbHVtbiDigJQgdGhlIGBwcml2YXRlYCBydW5nIG9mIHRoZSB2aXNpYmlsaXR5IGxhZGRlciBpcyBhdXRob3Itb25seS4gKi9cbiAgY3JlYXRlZEJ5PzogQW55Q29sdW1uO1xuICAvLyBTb2Z0LWRlbGV0ZSBsaWZlY3ljbGUgY29sdW1ucyAocHJlc2VudCBvbiB0b21ic3RvbmUtYmVhcmluZyBlbnRpdGllcyBvbmx5O1xuICAvLyBgcmVzdG9yZWAvYHB1cmdlRXhwaXJlZGAgYXJlIG5vLW9wcyB3aGVuIGFic2VudCkuXG4gIGRlbGV0ZWRBdD86IEFueUNvbHVtbjtcbiAgcHVyZ2VBZnRlcj86IEFueUNvbHVtbjtcbiAgW2tleTogc3RyaW5nXTogQW55Q29sdW1uIHwgdW5kZWZpbmVkO1xufVxuXG5cbi8qKlxuICogUmV0ZW50aW9uIGJlZm9yZSBhIHNvZnQtZGVsZXRlZCByb3cgYmVjb21lcyBwdXJnZS1lbGlnaWJsZSwgc2hhcmVkIGFjcm9zc1xuICogZXZlcnkgQ3J1ZFNlcnZpY2UgZW50aXR5ICh1bmlmaWVkIGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2AsIGRlZmF1bHQgMzBkKS5cbiAqIFN0YW1wZWQgaW50byBgcHVyZ2VfYWZ0ZXJgIGF0IGRlbGV0ZSB0aW1lOyB0aGUgcGVyLXNlcnZpY2UgcHVyZ2Ugc3dlZXAgaGFyZC1cbiAqIGRlbGV0ZXMgdG9tYnN0b25lcyBvbmNlIGl0IGhhcyBwYXNzZWQuIGAwYCBkaXNhYmxlcyBwdXJnZS1kZWFkbGluZSBzdGFtcGluZy5cbiAqL1xuY29uc3QgU09GVF9ERUxFVEVfUkVURU5USU9OX01TID0gZW52SW50KCdTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZUycsIDMwLCB7IG1pbjogMCB9KSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKiBUaGUgc2hhcmVkIHNvZnQtZGVsZXRlIHJldGVudGlvbiB3aW5kb3cgaW4gbXMgKGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2AsXG4gKiAgZGVmYXVsdCAzMGQ7IDAgZGlzYWJsZXMgcHVyZ2UtZGVhZGxpbmUgc3RhbXBpbmcpLiBFeHBvc2VkIHNvIG5vbi1DcnVkU2VydmljZVxuICogIHNvZnQtZGVsZXRlIHBhdGhzIChlLmcuIHBsYXRmb3JtJ3MgaGFuZC1yb2xsZWQgZGFzaGJvYXJkL2FsZXJ0IHNlcnZpY2VzKVxuICogIHN0YW1wIGBwdXJnZV9hZnRlcmAgd2l0aCB0aGUgU0FNRSB3aW5kb3cgdGhlIENydWRTZXJ2aWNlIGVudGl0aWVzIHVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUztcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBDUlVEIHNlcnZpY2Ugd2l0aCBtdWx0aS10ZW5hbnQgYWNjZXNzIGNvbnRyb2wgYW5kIHBhZ2luYXRpb24uXG4gKlxuICogU3ViY2xhc3NlcyBiaW5kIHRvIGEgc3BlY2lmaWMgRHJpenpsZSB0YWJsZSBieSBpbXBsZW1lbnRpbmcgYHNjaGVtYWAsXG4gKiBgYnVpbGRDb25kaXRpb25zYCwgYGdldFNvcnRDb2x1bW5gLCBhbmQgdGhlIG9yZy9wcm9qZWN0LWNvbHVtbiBhY2Nlc3NvcnMuXG4gKlxuICogQHR5cGVQYXJhbSBURW50aXR5IC0gRW50aXR5IHR5cGUgZXh0ZW5kaW5nIEJhc2VFbnRpdHlcbiAqIEB0eXBlUGFyYW0gVEZpbHRlciAtIEZpbHRlciB0eXBlIGZvciBxdWVyeSBwYXJhbWV0ZXJzXG4gKiBAdHlwZVBhcmFtIFRJbnNlcnQgLSBJbnNlcnQgRFRPIHR5cGVcbiAqIEB0eXBlUGFyYW0gVFVwZGF0ZSAtIFVwZGF0ZSBEVE8gdHlwZVxuICpcbiAqICoqQSBub3RlIG9uIHRoZSB0eXBlIGNhc3RzLioqIERyaXp6bGUncyByb3cgdHlwZXMgYXJlIGluZmVycmVkIGZyb21cbiAqIGBwZ1RhYmxlKC4uLilgIGFuZCBkb24ndCBnZW5lcmljYWxseSBuYXJyb3cgdGhyb3VnaCB0aGUgYWJzdHJhY3QgYHNjaGVtYWBcbiAqIGdldHRlciwgc28gdGhlIGJhc2UgY2xhc3MgY2FzdHMgcXVlcnkgcmVzdWx0cyB0byBgVEVudGl0eWAgYW5kIGJhY2suIFRoZVxuICogY2FzdCBpcyAqbm90KiBhIHJ1bnRpbWUgc2FmZXR5IGd1YXJhbnRlZSDigJQgaXQgcmVsaWVzIG9uIGVhY2ggc3ViY2xhc3NcbiAqIHBhc3NpbmcgdGhlIG1hdGNoaW5nIGVudGl0eSB0eXBlLiBPcmctc2NvcGluZyBpcyBlbmZvcmNlZCBieSBldmVyeVxuICogc3ViY2xhc3MncyBgYnVpbGRDb25kaXRpb25zYCBpbmplY3RpbmcgYFdIRVJFIG9yZ19pZCA9ICQxYDsgdGhpcyBjbGFzc1xuICogZG9lcyBub3QgYWRkIHRoYXQgZmlsdGVyIGl0c2VsZi5cbiAqXG4gKiAqKkVycm9yIHBvbGljeS4qKiBFcnJvcnMgcHJvcGFnYXRlIHVwIHRvIHRoZSByb3V0ZS1sZXZlbCBoYW5kbGVyXG4gKiAoYHdpdGhSb3V0ZWApOyBubyBjYXRjaC1hbmQtc3dhbGxvdyBoZXJlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBQaXBlbGluZVNlcnZpY2UgZXh0ZW5kcyBDcnVkU2VydmljZTxQaXBlbGluZSwgUGlwZWxpbmVGaWx0ZXIsIFBpcGVsaW5lSW5zZXJ0LCBQaXBlbGluZVVwZGF0ZT4ge1xuICogICBwcm90ZWN0ZWQgZ2V0IHNjaGVtYSgpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZTsgfVxuICogICBwcm90ZWN0ZWQgYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpIHsgcmV0dXJuIGJ1aWxkUGlwZWxpbmVDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpOyB9XG4gKiAgIHByb3RlY3RlZCBnZXRTb3J0Q29sdW1uKHNvcnRCeSkgeyByZXR1cm4gT2JqZWN0Lmhhc093bihzb3J0Q29sdW1uTWFwLCBzb3J0QnkpID8gc29ydENvbHVtbk1hcFtzb3J0QnldIDogbnVsbDsgfVxuICogICBwcm90ZWN0ZWQgZ2V0UHJvamVjdENvbHVtbigpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZS5wcm9qZWN0OyB9XG4gKiAgIHByb3RlY3RlZCBnZXRPcmdDb2x1bW4oKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmUub3JnSWQ7IH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3J1ZFNlcnZpY2U8XG4gIFRFbnRpdHkgZXh0ZW5kcyBCYXNlRW50aXR5LFxuICBURmlsdGVyLFxuICBUSW5zZXJ0LFxuICBUVXBkYXRlLFxuPiB7XG4gIC8qKiBEcml6emxlIHNjaGVtYSB0YWJsZSBmb3IgdGhpcyBlbnRpdHkgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBzY2hlbWEoKTogUGdUYWJsZTtcblxuICAvKipcbiAgICogVHlwZWQgY29sdW1uIHZpZXcgb2Yge0BsaW5rIHNjaGVtYX0uIGBQZ1RhYmxlYCBleHBvc2VzIG5vIHN0YXRpYyBjb2x1bW5zLCBzb1xuICAgKiB0aGlzIGlzIHRoZSBzaW5nbGUgdW5hdm9pZGFibGUgY2FzdCBmb3IgY29sdW1uIGFjY2Vzcy4gYHZpc2liaWxpdHlgIGlzXG4gICAqIG9wdGlvbmFsIChub3QgZXZlcnkgZW50aXR5IGhhcyBpdCkgYW5kIHRoZSBpbmRleCBzaWduYXR1cmUgY292ZXJzIGR5bmFtaWNcbiAgICogc3BhcnNlLWZpZWxkc2V0IGNvbHVtbiBsb29rdXAuXG4gICAqL1xuICBwcml2YXRlIGdldCBjb2xzKCk6IENydWRDb2x1bW5zIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEgYXMgdW5rbm93biBhcyBDcnVkQ29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgZmlsdGVyaW5nIGVudGl0aWVzLlxuICAgKiBgcGFyZW50T3JnSWRgIChvcmcg4oaSIHRlYW0gaGllcmFyY2h5KSBpcyBvcHRpb25hbCBhbmQgb25seSBob25vcmVkIGJ5XG4gICAqIHNlcnZpY2VzIHRoYXQgb3B0IGludG8gcGFyZW50LWluaGVyaXRlZCB2aXNpYmlsaXR5IChlLmcuIHBsdWdpbnMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdO1xuXG4gIC8qKiBHZXQgdGhlIHNjaGVtYSBjb2x1bW4gZm9yIHNvcnRpbmcgYnkgZmllbGQgbmFtZSAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U29ydENvbHVtbihzb3J0Qnk6IHN0cmluZyk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqIEdldCB0aGUgcHJvamVjdCBjb2x1bW4gZm9yIHNldERlZmF1bHQgc2NvcGluZyAobnVsbCBpZiBlbnRpdHkgaGFzIG5vIHByb2plY3Qgc2NvcGUpICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9qZWN0Q29sdW1uKCk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGVuYW50IG9yZy1pZCBjb2x1bW4uIFVzZWQgYm90aCB0byBzY29wZSBgc2V0RGVmYXVsdGAgYW5kIHRvIHBpblxuICAgKiBldmVyeSB3cml0ZSAodXBkYXRlL2RlbGV0ZS9idWxrRGVsZXRlKSB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyDigJQgc28gaXQgTVVTVFxuICAgKiBiZSB0aGUgdGVuYW50IGBvcmdJZGAgY29sdW1uLCBub3QgYSBkaXNwbGF5L25hbWUgY29sdW1uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldE9yZ0NvbHVtbigpOiBBbnlDb2x1bW47XG5cbiAgLyoqIFRoZSB1bmlxdWUtY29uc3RyYWludCBjb2x1bW5zIGEgY3JlYXRlIG11c3Qgbm90IGNvbmZsaWN0IG9uIChzZWUge0BsaW5rIGNyZWF0ZX0pLiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IGNvbmZsaWN0VGFyZ2V0KCk6IEFueUNvbHVtbltdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlciA9IGNyZWF0ZUxvZ2dlcignY3J1ZC1zZXJ2aWNlJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRmFpbCBmYXN0IGlmIGEgc3ViY2xhc3MgZG9lc24ndCBleHBvc2UgYSB0ZW5hbnQgb3JnIGNvbHVtbi4gVGhlIHdyaXRlXG4gICAgLy8gcGF0aHMgKHdyaXRlQ29uZGl0aW9ucyAvIGJ1bGtEZWxldGUpIHBpbiBtdXRhdGlvbnMgdG8gdGhlIGNhbGxlcidzIG93blxuICAgIC8vIG9yZyB0aHJvdWdoIGl0OyBhIG1pc3NpbmcgY29sdW1uIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhhdCBndWFyZCDigJQgYVxuICAgIC8vIGNyb3NzLXRlbmFudCBmYWlsLW9wZW4g4oCUIHNvIGFzc2VydCBpdHMgcHJlc2VuY2UgdXAgZnJvbnQuXG4gICAgaWYgKHRoaXMuZ2V0T3JnQ29sdW1uKCkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IGdldE9yZ0NvbHVtbigpIG11c3QgcmV0dXJuIHRoZSB0ZW5hbnQgb3JnIGNvbHVtbmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCBjb25kaXRpb25zIGZvciBhIHNpbmdsZSBlbnRpdHkgYnkgSUQuXG4gICAqICBgcGFyZW50T3JnSWRgIHdpZGVucyB2aXNpYmlsaXR5IHRvIGEgcGFyZW50IG9yZydzIHB1YmxpYyByb3dzIChvcmcg4oaSIHRlYW1cbiAgICogIGhpZXJhcmNoeSkg4oCUIHNhbWUgb3B0LWluIHNlbWFudGljcyBhcyBgZmluZGAvYGZpbmRQYWdpbmF0ZWRgLiBPbWl0dGVkIGJ5IHRoZVxuICAgKiAgd3JpdGUgcGF0aCAoYHdyaXRlQ29uZGl0aW9uc2ApLCB3aGljaCBtdXN0IHN0YXkgb3duLW9yZyBzY29wZWQuICovXG4gIHByaXZhdGUgaWRDb25kaXRpb25zKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4udGhpcy5idWlsZENvbmRpdGlvbnMoeyBpZCB9IGFzIHVua25vd24gYXMgUGFydGlhbDxURmlsdGVyPiwgb3JnSWQsIHBhcmVudE9yZ0lkKSxcbiAgICAgIC4uLnRoaXMubm90VG9tYnN0b25lZCgpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogRXhjbHVkZXMgc29mdC1kZWxldGVkIHRvbWJzdG9uZXMgb24gZW50aXRpZXMgd2l0aCBhIGBkZWxldGVkQXRgIGNvbHVtbi4gVGhlXG4gICAqIGJ5LWlkIGZpbHRlciBkZWxpYmVyYXRlbHkgc2tpcHMgdGhlIGBpc0FjdGl2ZWAgZGVmYXVsdCAoYSBkZWFjdGl2YXRlZCByb3cgaXNcbiAgICogc3RpbGwgcmVhZGFibGUgYnkgaWQpLCBzbyB3aXRob3V0IHRoaXMgYSB0b21ic3RvbmUgd291bGQgYmUgcmVhZGFibGUgYW5kIOKAlFxuICAgKiB0aHJvdWdoIGB1cGRhdGVgIOKAlCBoYWxmLXJldml2YWJsZSAoYGlzQWN0aXZlYCBmbGlwcGVkIGJhY2sgd2hpbGVcbiAgICogYGRlbGV0ZWRBdGAvYHB1cmdlQWZ0ZXJgIHN0YXkgc2V0LCBzbyB0aGUgc3dlZXAgbGF0ZXIgcHVyZ2VzIGEgcm93IHRoZSBVSVxuICAgKiBzaG93cyBhcyBsaXZlKS4gVG9tYnN0b25lcyBhcmUgcmVhY2hlZCBvbmx5IHZpYSB0aGUgZGVkaWNhdGVkXG4gICAqIHJlc3RvcmUvcHVyZ2UvZmluZERlbGV0ZWQgcGF0aHMuXG4gICAqL1xuICBwcml2YXRlIG5vdFRvbWJzdG9uZWQoKTogU1FMW10ge1xuICAgIHJldHVybiB0aGlzLmNvbHMuZGVsZXRlZEF0ID8gW2lzTnVsbCh0aGlzLmNvbHMuZGVsZXRlZEF0KV0gOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25kaXRpb25zIGZvciBhIE1VVEFUSU9OICh1cGRhdGUvZGVsZXRlKSBvZiBhIHNpbmdsZSBlbnRpdHkuXG4gICAqXG4gICAqIGBpZENvbmRpdGlvbnNgIHJldXNlcyB0aGUgUkVBRCBhY2Nlc3MtY29udHJvbCBjbGF1c2UsIHdoaWNoIGFsc28gbWF0Y2hlc1xuICAgKiBzeXN0ZW0tb3JnIC8gb3RoZXItb3JnIFBVQkxJQyByZWNvcmRzIOKAlCBzbyB3aXRob3V0IGFuIGV4dHJhIG93bmVyc2hpcCBwaW4gYW55XG4gICAqIHRlbmFudCBjb3VsZCB1cGRhdGUgb3Igc29mdC1kZWxldGUgYW5vdGhlciBvcmcncyAob3IgdGhlIHN5c3RlbSBvcmcncykgcHVibGljXG4gICAqIHJlY29yZHMuIEFORCBhIHN0cmljdCBgb3JnSWQgPT09IGNhbGxlcmAgcHJlZGljYXRlOiB0aGUgcmVhZCBjbGF1c2Unc1xuICAgKiBwdWJsaWMtT1IgYnJhbmNoIHJlcXVpcmVzIGBvcmdfaWQgPSAnc3lzdGVtJ2AsIHdoaWNoIHRoZW4gY2FuJ3QgYmUgc2F0aXNmaWVkLFxuICAgKiBsZWF2aW5nIG9ubHkgb3duLW9yZyByb3dzLiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwcyBmdWxsIGFjY2Vzcy5cbiAgICovXG4gIHByaXZhdGUgd3JpdGVDb25kaXRpb25zKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nKTogU1FMW10ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmlkQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuICAgIC8vIFBpbiB0aGUgbXV0YXRpb24gdG8gdGhlIGNhbGxlcidzIG93biBvcmcgdmlhIHRoZSB0ZW5hbnQgY29sdW1uXG4gICAgLy8gKGdldE9yZ0NvbHVtbiwgYXNzZXJ0ZWQgbm9uLW51bGwgaW4gdGhlIGNvbnN0cnVjdG9yKSDigJQgY29uc2lzdGVudCB3aXRoXG4gICAgLy8gc2V0RGVmYXVsdCwgYW5kIG5ldmVyIHNpbGVudGx5IGZhaWwtb3BlbiB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBhYnNlbnQuXG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcbiAgICAvLyBGb3JjZSBFWEFDVCBpZCBlcXVhbGl0eSBvbiB0aGUgbXV0YXRpb24gcGF0aC4gYGlkQ29uZGl0aW9uc2AgcmV1c2VzIHRoZVxuICAgIC8vIGxpc3QtZmlsdGVyIGNsYXVzZSwgd2hvc2UgYGJ1aWxkSWRGaWx0ZXJgIFBSRUZJWC1tYXRjaGVzIChgaWQ6OnRleHQgTElLRVxuICAgIC8vICd2YWwlJ2ApIGFueSBub24tZnVsbC1VVUlEIHZhbHVlIOKAlCBzbyBhIHBhcnRpYWwgaWQgKGBERUxFVEUgL3gvYWJgKSB3b3VsZFxuICAgIC8vIHNvZnQtZGVsZXRlL211dGF0ZSBFVkVSWSBvd24tb3JnIHJvdyB3aG9zZSBpZCBzdGFydHMgd2l0aCBgYWJgIGFuZCByZXBvcnRcbiAgICAvLyB0b3VjaGluZyBvbmUuIEFORGluZyBhbiBleGFjdCBgaWQgPSB2YWxgIGNvbGxhcHNlcyB0aGUgcHJlZml4IGNsYXVzZSB0byBhdFxuICAgIC8vIG1vc3QgdGhlIHNpbmdsZSBleGFjdCByb3c7IGEgbWFsZm9ybWVkL3BhcnRpYWwgaWQgdGhlbiBtYXRjaGVzIG5vdGhpbmdcbiAgICAvLyAo4oaSIDQwNCB2aWEgdGhlIGNhbGxlcnMnIGBpZiAoIWRlbGV0ZWQpYCBndWFyZCkgaW5zdGVhZCBvZiBtYXNzLW11dGF0aW5nLlxuICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIC8qKiBFeGFjdCBpZCBlcXVhbGl0eSwgbG93ZXItY2FzZWQgdG8gbWF0Y2ggYGJ1aWxkSWRGaWx0ZXJgJ3MgZnVsbC1VVUlEIGJyYW5jaC5cbiAgICogIGBzY2hlbWFgIGlzIHR5cGVkIGBQZ1RhYmxlYCAobm8gc3RhdGljIGAuaWRgKSwgc28gY2FzdCDigJQgc2FtZSBwYXR0ZXJuIHRoZVxuICAgKiAgc29ydC9kZWZhdWx0IGhlbHBlcnMgdXNlIGZvciBjb2x1bW4gYWNjZXNzLiAqL1xuICBwcml2YXRlIGV4YWN0SWRDb25kaXRpb24oaWQ6IHN0cmluZyk6IFNRTCB7XG4gICAgcmV0dXJuIGVxKHRoaXMuY29scy5pZCwgU3RyaW5nKGlkKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIC8qKiBUaGUgYWN0b3Igc3RhbXBlZCBvbiBhIHdyaXRlOiB0aGUgY2FsbGVyLCBvciB0aGUgc3lzdGVtIGFjdG9yIGZvciBiYWNrZ3JvdW5kIHdvcmsuICovXG4gIHByaXZhdGUgYWN0b3IodXNlcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1c2VySWQgfHwgU1lTVEVNX0FDVE9SX0lEO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvbmUgY2FzdCBwb2ludCBmb3IgYC5zZXQoKWAgLyBgLnZhbHVlcygpYCAvIGAuc2VsZWN0KClgIHNoYXBlcy4gVGhlIGJhc2UgY2xhc3Mgd3JpdGVzXG4gICAqIHRoZSBzaGFyZWQgY29sdW1ucyAoYHVwZGF0ZWRCeWAsIGBkZWxldGVkQXRgLCDigKYpIHRocm91Z2ggdGhlIGFic3RyYWN0XG4gICAqIGBQZ1RhYmxlYCwgd2hvc2UgaW5zZXJ0L3VwZGF0ZSB0eXBlcyBjYW4ndCBwcm92ZSB0aG9zZSBjb2x1bW5zIGV4aXN0LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSByb3codmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IGFueSB7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIC8qKiBSdW4gYSBsaWZlY3ljbGUgaG9vayBiZXN0LWVmZm9ydDogYSBmYWlsdXJlIGlzIGxvZ2dlZCwgbmV2ZXIgdGhyb3duLiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkhvb2soaG9vazogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBob29rKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBjb2x1bW5zIGEgc29mdC1kZWxldGUgc3RhbXBzLCBpbmNsdWRpbmcgdGhlIHB1cmdlIGRlYWRsaW5lLiAqL1xuICBwcml2YXRlIHRvbWJzdG9uZVNldChub3c6IERhdGUsIHVzZXJJZDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmFjdG9yKHVzZXJJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgdXBkYXRlZEJ5OiB1c2VyLFxuICAgICAgZGVsZXRlZEF0OiBub3csXG4gICAgICBkZWxldGVkQnk6IHVzZXIsXG4gICAgICAvLyBTdGFtcCB0aGUgcHVyZ2UgZGVhZGxpbmUgc28gdGhlIHJldGVudGlvbiBzd2VlcCBjYW4gaGFyZC1kZWxldGUgbGF0ZXIuXG4gICAgICAuLi50aGlzLnB1cmdlQWZ0ZXJTdGFtcChub3cpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSGFyZC1kZWxldGUgdXAgdG8gYGxpbWl0YCByb3dzIG1hdGNoaW5nIGBjb25kaXRpb25zYCBpbiBvbmUgdHJhbnNhY3Rpb246XG4gICAqIGRlcGVuZGVudHMgYXJlIHRvcm4gZG93biBmaXJzdCBieSBgb25CZWZvcmVQdXJnZWAgaW4gdGhlIFNBTUUgdHggKGFcbiAgICogRkstYmxvY2tpbmcgY2hpbGQgY2FuJ3Qgc3RyYW5kIHRoZSBwYXJlbnQ7IGEgdGhyb3cgYWJvcnRzIHRoZSBiYXRjaCksIHRoZW5cbiAgICogYG9uQWZ0ZXJQdXJnZWAgaGFuZGxlcyBleHRlcm5hbCBzaWRlLWVmZmVjdHMgYmVzdC1lZmZvcnQuIFJldHVybnMgdGhlIGlkcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHVyZ2VXaGVyZShjb25kaXRpb25zOiBTUUxbXSwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBwdXJnZWRJZHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBkb29tZWQgPSBhd2FpdCB0eFxuICAgICAgICAuc2VsZWN0KHRoaXMucm93KHsgaWQ6IHRoaXMuY29scy5pZCB9KSlcbiAgICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAgIC5saW1pdChsaW1pdClcbiAgICAgICAgLnRoZW4ociA9PiAociBhcyBBcnJheTx7IGlkOiB1bmtub3duIH0+KS5tYXAoZCA9PiBTdHJpbmcoZC5pZCkpKTtcblxuICAgICAgaWYgKGRvb21lZC5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVQdXJnZShkb29tZWQsIHR4KTtcbiAgICAgIGF3YWl0IHR4LmRlbGV0ZSh0aGlzLnNjaGVtYSkud2hlcmUoaW5BcnJheSh0aGlzLmNvbHMuaWQsIGRvb21lZCkpO1xuICAgICAgcmV0dXJuIGRvb21lZDtcbiAgICB9KTtcblxuICAgIGlmIChwdXJnZWRJZHMubGVuZ3RoID4gMCkgYXdhaXQgdGhpcy5ydW5Ib29rKCgpID0+IHRoaXMub25BZnRlclB1cmdlKHB1cmdlZElkcykpO1xuICAgIHJldHVybiBwdXJnZWRJZHM7XG4gIH1cblxuICAvLyBMaWZlY3ljbGUgaG9va3Mg4oCUIG92ZXJyaWRlIGluIHN1YmNsYXNzZXMgdG8gcmVhY3QgdG8gbXV0YXRpb25zXG4gIC8vIFRoZXNlIGFyZSBmaXJlLWFuZC1mb3JnZXQ6IGVycm9ycyBhcmUgbG9nZ2VkIGJ1dCBuZXZlciBibG9jayB0aGUgY2FsbGVyLlxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWQgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJDcmVhdGUoX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYW4gZW50aXR5IGlzIHVwZGF0ZWQgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJVcGRhdGUoX2lkOiBzdHJpbmcsIF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIGFuIGVudGl0eSBpcyBzb2Z0LWRlbGV0ZWQgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJEZWxldGUoX2lkOiBzdHJpbmcsIF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIGEgc29mdC1kZWxldGVkIGVudGl0eSBpcyByZXN0b3JlZCAodW5kbyB0aGUgZGVsZXRlKS4gT3ZlcnJpZGVcbiAgICogIGZvciBlbnRpdGllcyB3aG9zZSByZXN0b3JlIGhhcyBzaWRlLWVmZmVjdHMgKGUuZy4gcmUtbm90aWZ5KS4gQmVzdC1lZmZvcnQuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyUmVzdG9yZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgd2l0aCB0aGUgaWRzIGFib3V0IHRvIGJlIGhhcmQtcHVyZ2VkLCBCRUZPUkUgdGhlIGRlbGV0ZSwgaW5zaWRlIHRoZVxuICAgKiAgcHVyZ2UgdHJhbnNhY3Rpb24gKGB0eGApIOKAlCBhIHN1YmNsYXNzIHRlYXJpbmcgZG93biBkZXBlbmRlbnRzIHRoYXQgbGFjayBPTlxuICAgKiAgREVMRVRFIENBU0NBREUgTVVTVCB1c2UgYHR4YCBzbyB0aGUgdGVhcmRvd24gaXMgYXRvbWljIHdpdGggdGhlIHBhcmVudFxuICAgKiAgREVMRVRFIChhbmQgY2FuJ3Qgc2VsZi1kZWFkbG9jayBhZ2FpbnN0IGl0cyByb3cgbG9ja3MpLiBUaHJvd2luZyBhYm9ydHMgdGhhdFxuICAgKiAgYmF0Y2gncyBwdXJnZSAocm93cyBzdGF5IHRvbWJzdG9uZWQsIHJldHJpZWQgbmV4dCB0aWNrKS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQmVmb3JlUHVyZ2UoX2lkczogc3RyaW5nW10sIF90eDogQ3J1ZFR4KTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgcm93cyBhcmUgaGFyZC1wdXJnZWQsIGZvciBleHRlcm5hbCBzaWRlLWVmZmVjdHMgKGUuZy4gcGx1Z2luXG4gICAqICBpbWFnZSBHQykuIEJlc3QtZWZmb3J0OiBlcnJvcnMgYXJlIGxvZ2dlZCwgbmV2ZXIgYmxvY2sgdGhlIHN3ZWVwLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclB1cmdlKF9pZHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBSZXRlbnRpb24gYmVmb3JlIGEgc29mdC1kZWxldGVkIHJvdyBiZWNvbWVzIHB1cmdlLWVsaWdpYmxlLiBEZWZhdWx0cyB0byB0aGVcbiAgICogIHNoYXJlZCBgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgOyBvdmVycmlkZSBwZXIgZW50aXR5IGZvciBhIGJlc3Bva2Ugd2luZG93LiAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNvZnREZWxldGVSZXRlbnRpb25NcygpOiBudW1iZXIge1xuICAgIHJldHVybiBTT0ZUX0RFTEVURV9SRVRFTlRJT05fTVM7XG4gIH1cblxuICAvKiogVGhlIGBwdXJnZV9hZnRlcmAgdmFsdWUgdG8gc3RhbXAgb24gYSBzb2Z0LWRlbGV0ZTogYG5vdyArIHJldGVudGlvbmAsIG9yIHRoZVxuICAgKiAgc3ByZWFkLWZyaWVuZGx5IGVtcHR5IG9iamVjdCB3aGVuIHRoZSBlbnRpdHkgaGFzIG5vIGBwdXJnZV9hZnRlcmAgY29sdW1uLlxuICAgKiAgYHByb3RlY3RlZGAgc28gc3ViY2xhc3NlcyB3aXRoIGhhbmQtcm9sbGVkIHNvZnQtZGVsZXRlIHBhdGhzIChlLmcuXG4gICAqICBtZXNzYWdlLXNlcnZpY2UncyB0aHJlYWQgY2FzY2FkZSAvIHN5c2FkbWluIG1vZGVyYXRpb24pIHN0YW1wIGl0IHRvbyDigJQgYW5cbiAgICogIHVuLXN0YW1wZWQgdG9tYnN0b25lIGhhcyBOVUxMIGBwdXJnZV9hZnRlcmAgYW5kIGlzIG5ldmVyIGhhcmQtcHVyZ2VkLiAqL1xuICBwcm90ZWN0ZWQgcHVyZ2VBZnRlclN0YW1wKG5vdzogRGF0ZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMuY29scy5wdXJnZUFmdGVyIHx8IHRoaXMuc29mdERlbGV0ZVJldGVudGlvbk1zIDw9IDApIHJldHVybiB7fTtcbiAgICByZXR1cm4geyBwdXJnZUFmdGVyOiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgdGhpcy5zb2Z0RGVsZXRlUmV0ZW50aW9uTXMpIH07XG4gIH1cblxuICAvKipcbiAgICogT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2hlbiBhIHJlYWQgaXMgd2lkZW5lZCB0byBhIHBhcmVudCBvcmcgKGBwYXJlbnRPcmdJZGBcbiAgICogc2V0KSwgdGhlIHBhcmVudCdzIHJvd3MgYXJlIG91dHNpZGUgdGhlIGNhbGxlcidzIFJMUyBzY29wZSwgc28gdGhlIHJlYWQgbXVzdFxuICAgKiBydW4gdW5kZXIgc3lzYWRtaW4gY29udGV4dCDigJQgdGhlIGFjY2Vzcy1jb250cm9sIFdIRVJFIGNsYXVzZSAob3duICsgcGFyZW50ICtcbiAgICogc3lzdGVtIHB1YmxpYywgYnVpbHQgc2VydmVyLXNpZGUgZnJvbSBhIHRydXN0ZWQgSldUIGNsYWltKSBpcyB0aGVuIHRoZVxuICAgKiBhdXRob3JpdGF0aXZlIHRlbmFuY3kgZ2F0ZS4gV2l0aG91dCBgcGFyZW50T3JnSWRgIGl0IHN0YXlzIFJMUy1zY29wZWQuXG4gICAqXG4gICAqIElOVkFSSUFOVCAod2h5IHRoZSBzeXNhZG1pbiBieXBhc3MgaXMgc2FmZSk6IHRoZSBXSEVSRSBjbGF1c2UgaXMgYWx3YXlzXG4gICAqIHNlcnZlci1idWlsdCBieSBgYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKWAgZnJvbSB2YWx1ZXNcbiAgICogZGVyaXZlZCBmcm9tIHRoZSB2YWxpZGF0ZWQgSldUIChgb3JnSWRgID0gYWN0aXZlIG9yZywgYHBhcmVudE9yZ0lkYCA9IHRoZVxuICAgKiBhY3RpdmUgb3JnJ3MgcGFyZW50KS4gTm9uZSBvZiB0aGVtIGlzIGEgcmF3IHVzZXItc3VwcGxpZWQgcHJlZGljYXRlLCBzbyB0aGVcbiAgICogYnlwYXNzIG9ubHkgZXZlciB3aWRlbnMgdGhlIHJlYWQgdG8gdGhlIGNhbGxlcidzIG93biBzdWJ0cmVlICsgc3lzdGVtIHB1YmxpY1xuICAgKiByb3dzIOKAlCBpdCBjYW4gTk9UIGJlIHN0ZWVyZWQgYXQgYW4gYXJiaXRyYXJ5IG9yZy4gTk9URTogdGhpcyBkb2VzIHJlbW92ZSB0aGVcbiAgICogUkxTIGJhY2tzdG9wIGZvciB0aGUgd2lkZW5lZCByZWFkOyBhIHNpbmdsZS1HVUMgYGFwcC5vcmdfaWRgIGNhbid0IGV4cHJlc3NcbiAgICogdGhlIFwib3duIE9SIHBhcmVudCBPUiBzeXN0ZW1cIiBzZXQgdGhlIHBvbGljeSB3b3VsZCBuZWVkLCBzbyByZXBsYWNpbmcgdGhlXG4gICAqIGJ5cGFzcyB3b3VsZCByZXF1aXJlIGEgdGVuYW5jeS1sYXllciBjaGFuZ2UgKGUuZy4gYSBtdWx0aS1vcmcgUkxTIHBvbGljeSkuXG4gICAqIERlZmVycmVkIGRlbGliZXJhdGVseSDigJQgZG8gbm90IHN3YXAgdGhpcyBmb3IgYSBibGFua2V0IGJ5cGFzcyB3aXRob3V0XG4gICAqIHJlLWNoZWNraW5nIHRoZSBXSEVSRSBpcyBzdGlsbCBmdWxseSBzZXJ2ZXItYnVpbHQuXG4gICAqL1xuICBwcml2YXRlIHJ1blJlYWQ8VD4ocGFyZW50T3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gcGFyZW50T3JnSWQgPyBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBmbikgOiBmbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyIGNyaXRlcmlhXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKi9cbiAgYXN5bmMgZmluZChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIHJldHVybiB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9SREVSIEJZIGZvciB7QGxpbmsgZmluZEZpcnN0fSwgc28gXCJ0YWtlIG9uZVwiIGlzIGRldGVybWluaXN0aWMgcmF0aGVyIHRoYW5cbiAgICogd2hhdGV2ZXIgcm93IHRoZSBwbGFubmVyIG1lZXRzIGZpcnN0OiB0aGUgZGVmYXVsdCByb3csIHRoZW4gdGhlIG5ld2VzdCxcbiAgICogdGhlbiBpZCBhcyB0aGUgZmluYWwgdGllYnJlYWsuIFNlcnZpY2VzIG92ZXJyaWRlIGl0IHRvIHJhbmsgYnkgdGhlaXIgb3duXG4gICAqIG5vdGlvbiBvZiBcImJlc3QgbWF0Y2hcIiAocGx1Z2luczogb3duIG9yZyBmaXJzdCwgdGhlbiBzZW12ZXIpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGZpbmRGaXJzdE9yZGVyQnkoX2ZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgX29yZ0lkPzogc3RyaW5nLCBfcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgY29uc3QgeyBpc0RlZmF1bHQsIGNyZWF0ZWRBdCwgaWQgfSA9IHRoaXMuY29scztcbiAgICByZXR1cm4gW2Rlc2MoaXNEZWZhdWx0KSwgLi4uKGNyZWF0ZWRBdCA/IFtkZXNjKGNyZWF0ZWRBdCldIDogW10pLCBhc2MoaWQpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBGSVJTVCBlbnRpdHkgbWF0Y2hpbmcgYGZpbHRlcmAg4oCUIGEgYm91bmRlZCAoYExJTUlUIDFgKSB2YXJpYW50IG9mXG4gICAqIGBmaW5kYCBmb3IgdGhlIFwibWF0Y2ggYnkgZmlsdGVyLCB0YWtlIG9uZVwiIHJlYWQgcGF0aHMgKGUuZy4gYEdFVCAvZmluZGApLCBzb1xuICAgKiB0aGV5IGRvbid0IGBTRUxFQ1RgIGV2ZXJ5IG1hdGNoaW5nIG9yZyByb3cganVzdCB0byByZXR1cm4gYFswXWAuIFJhbmtlZCBieVxuICAgKiB7QGxpbmsgZmluZEZpcnN0T3JkZXJCeX0uXG4gICAqL1xuICBhc3luYyBmaW5kRmlyc3QoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgICBjb25zdCBvcmRlckJ5ID0gdGhpcy5maW5kRmlyc3RPcmRlckJ5KGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5vcmRlckJ5KC4uLm9yZGVyQnkpXG4gICAgICAubGltaXQoMSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGVudGl0aWVzIHdpdGggcGFnaW5hdGlvbiBhbmQgc29ydGluZ1xuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQYWdpbmF0aW9uIGFuZCBzb3J0aW5nIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIGZpbmRQYWdpbmF0ZWQoXG4gICAgZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LFxuICAgIG9yZ0lkPzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFF1ZXJ5T3B0aW9ucyA9IHt9LFxuICAgIHBhcmVudE9yZ0lkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2luYXRlZFJlc3VsdDxURW50aXR5Pj4ge1xuICAgIGNvbnN0IHsgbGltaXQ6IHJhd0xpbWl0ID0gREVGQVVMVF9QQUdFX0xJTUlULCBvZmZzZXQgPSAwLCBzb3J0QnksIHNvcnRPcmRlciA9ICdhc2MnLCBpbmNsdWRlVG90YWwgPSBmYWxzZSwgY3Vyc29yLCBmaWVsZHMgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heCgxLCByYXdMaW1pdCksIE1BWF9QQUdFX0xJTUlUKTtcblxuICAgIC8vIFRvdGFsLCBkZXRlcm1pbmlzdGljIG9yZGVyOiAoc29ydCBjb2x1bW4sIGlkKS4gYGlkYCBpcyB1bmlxdWUsIHNvIHJvd3MgdGhhdFxuICAgIC8vIHNoYXJlIGEgc29ydCB2YWx1ZSBoYXZlIGEgc3RhYmxlIHJlbGF0aXZlIG9yZGVyIGFuZCBhIGtleXNldCBjdXJzb3IgY2FuXG4gICAgLy8gbmV2ZXIgc2tpcCBvciByZXBlYXQgdGhlbS4gQW4gYWJzZW50IG9yIFVOS05PV04gYHNvcnRCeWAgb3JkZXJzIGJ5IGBpZGBcbiAgICAvLyBhbG9uZSDigJQgYW4gdW5rbm93biBzb3J0IHRoYXQgYWRkZWQgbm8gV0hFUkUgYW5kIG5vIE9SREVSIEJZIHdoaWxlIHN0aWxsXG4gICAgLy8gZW1pdHRpbmcgYSBjdXJzb3Igd291bGQgbG9vcCBhIGN1cnNvciBjbGllbnQgb24gcGFnZSAxIGZvcmV2ZXIuXG4gICAgY29uc3QgaWRDb2x1bW4gPSB0aGlzLmNvbHMuaWQ7XG4gICAgY29uc3Qgc29ydENvbHVtbiA9IChzb3J0QnkgPyB0aGlzLmdldFNvcnRDb2x1bW4oc29ydEJ5KSA6IG51bGwpID8/IGlkQ29sdW1uO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHNvcnRPcmRlciA9PT0gJ2Rlc2MnID8gZGVzYyA6IGFzYztcbiAgICBjb25zdCBvcmRlckJ5ID0gc29ydENvbHVtbiA9PT0gaWRDb2x1bW4gPyBbZGlyZWN0aW9uKGlkQ29sdW1uKV0gOiBbZGlyZWN0aW9uKHNvcnRDb2x1bW4pLCBkaXJlY3Rpb24oaWRDb2x1bW4pXTtcblxuICAgIC8vIEN1cnNvciBhbmQgb2Zmc2V0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUg4oCUIGEgdmFsaWQgY3Vyc29yIHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gQSBtYWxmb3JtZWQvdGFtcGVyZWQgY3Vyc29yIOKAlCBpbmNsdWRpbmcgd2VsbC1mb3JtZWQgSlNPTiB3aG9zZSB2YWx1ZXNcbiAgICAvLyBjYW4ndCBiZSBjYXN0IHRvIHRoZSBpZCAvIHNvcnQgY29sdW1uIHR5cGVzIOKAlCBpcyBpZ25vcmVkIChyZWFkcyBmcm9tIHRoZVxuICAgIC8vIHN0YXJ0KSBpbnN0ZWFkIG9mIHJlYWNoaW5nIFBvc3RncmVzIGFuZCBmYWlsaW5nIHRoZSBxdWVyeS5cbiAgICBjb25zdCByYXdDdXJzb3IgPSBjdXJzb3IgPyBkZWNvZGVDdXJzb3IoY3Vyc29yKSA6IG51bGw7XG4gICAgY29uc3QgZGVjb2RlZEN1cnNvciA9IHJhd0N1cnNvclxuICAgICAgJiYgaXNDYXN0YWJsZVRvKGlkQ29sdW1uLCByYXdDdXJzb3IuaWQpXG4gICAgICAvLyAoYW4gaWQtb25seSBvcmRlciBuZXZlciBiaW5kcyB0aGUgc29ydCB2YWx1ZSDigJQgc2VlIGtleXNldEFmdGVyKVxuICAgICAgJiYgKHNvcnRDb2x1bW4gPT09IGlkQ29sdW1uIHx8IHJhd0N1cnNvci5zb3J0VGV4dCA9PT0gbnVsbCB8fCBpc0Nhc3RhYmxlVG8oc29ydENvbHVtbiwgcmF3Q3Vyc29yLnNvcnRUZXh0KSlcbiAgICAgID8gcmF3Q3Vyc29yXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGN1cnNvciAmJiAhZGVjb2RlZEN1cnNvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0lnbm9yaW5nIG1hbGZvcm1lZCBwYWdpbmF0aW9uIGN1cnNvcicsIHsgZW50aXR5OiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgICBpZiAoZGVjb2RlZEN1cnNvcikge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGtleXNldEFmdGVyKHNvcnRDb2x1bW4sIGlkQ29sdW1uLCBzb3J0T3JkZXIsIGRlY29kZWRDdXJzb3Iuc29ydFRleHQsIGRlY29kZWRDdXJzb3IuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBXcmFwIHRoZSB3aG9sZSBwYWdpbmF0ZWQgcmVhZCAoU0VMRUNUICsgb3B0aW9uYWwgQ09VTlQpIGluIG9uZVxuICAgIC8vIHRlbmFudCB0eC4gQm90aCBxdWVyaWVzIGFyZSB2aXNpYmlsaXR5LXNjb3BlZCBieSB0aGUgc2FtZSBSTFMgcG9saWN5LFxuICAgIC8vIGFuZCBwaW5uaW5nIHRoZW0gdG8gYSBzaW5nbGUgdHgga2VlcHMgdGhlIGBhcHAub3JnX2lkYCBHVUMgc3RhYmxlXG4gICAgLy8gYmV0d2VlbiB0aGVtLiBXaGVuIHdpZGVuaW5nIHRvIGEgcGFyZW50IG9yZywgdGhlIHdob2xlIHJlYWQgcnVucyB1bmRlclxuICAgIC8vIHN5c2FkbWluIGNvbnRleHQgKHNlZSBydW5SZWFkKSBzbyB0aGUgYWNjZXNzLWNvbnRyb2wgV0hFUkUgaXMgdGhlIGdhdGUuXG4gICAgcmV0dXJuIHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gUHJvamVjdGlvbjogdGhlIHNwYXJzZSBmaWVsZHNldCAoYWx3YXlzIGluY2x1ZGVzIGBpZGApIG9yIGV2ZXJ5IGNvbHVtbixcbiAgICAgIC8vIHBsdXMgdGhlIHNvcnQgY29sdW1uJ3MgZXhhY3QgdGV4dCBmb3IgdGhlIG5leHQgY3Vyc29yLlxuICAgICAgY29uc3QgYmFzZVNlbGVjdCA9IChmaWVsZHMgPyB0aGlzLmJ1aWxkRmllbGRTZWxlY3QoZmllbGRzKSA6IHVuZGVmaW5lZCkgPz8gZ2V0VGFibGVDb2x1bW5zKHRoaXMuc2NoZW1hKTtcbiAgICAgIGNvbnN0IHNlbGVjdFNwZWMgPSB7IC4uLmJhc2VTZWxlY3QsIFtDVVJTT1JfU09SVF9LRVldOiBzcWw8c3RyaW5nIHwgbnVsbD5gJHtzb3J0Q29sdW1ufTo6dGV4dGAgfTtcblxuICAgICAgLy8gRmV0Y2ggbGltaXQrMSB0byBkZXRlY3QgaGFzTW9yZSB3aXRob3V0IENPVU5UKCopXG4gICAgICBjb25zdCBlZmZlY3RpdmVPZmZzZXQgPSBkZWNvZGVkQ3Vyc29yID8gMCA6IG9mZnNldDtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0eC5zZWxlY3Qoc2VsZWN0U3BlYyBhcyBhbnkpLmZyb20odGhpcy5zY2hlbWEpLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgICAgLm9yZGVyQnkoLi4ub3JkZXJCeSlcbiAgICAgICAgLmxpbWl0KGxpbWl0ICsgMSlcbiAgICAgICAgLm9mZnNldChlZmZlY3RpdmVPZmZzZXQpLnRoZW4ociA9PiBkcml6emxlUm93czxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ocikpO1xuXG4gICAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdDtcbiAgICAgIGNvbnN0IHBhZ2UgPSBoYXNNb3JlID8gcm93cy5zbGljZSgwLCBsaW1pdCkgOiByb3dzO1xuICAgICAgY29uc3QgZGF0YSA9IHBhZ2UubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0geyAuLi5yb3cgfTtcbiAgICAgICAgZGVsZXRlIGVudGl0eVtDVVJTT1JfU09SVF9LRVldO1xuICAgICAgICByZXR1cm4gZW50aXR5IGFzIFRFbnRpdHk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0OiBQYWdpbmF0ZWRSZXN1bHQ8VEVudGl0eT4gPSB7IGRhdGEsIGxpbWl0LCBvZmZzZXQ6IGVmZmVjdGl2ZU9mZnNldCwgaGFzTW9yZSB9O1xuXG4gICAgICBpZiAoaGFzTW9yZSkge1xuICAgICAgICBjb25zdCBsYXN0ID0gcGFnZVtwYWdlLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBzb3J0VGV4dCA9IGxhc3RbQ1VSU09SX1NPUlRfS0VZXTtcbiAgICAgICAgcmVzdWx0Lm5leHRDdXJzb3IgPSBlbmNvZGVDdXJzb3Ioc29ydFRleHQgPT0gbnVsbCA/IG51bGwgOiBTdHJpbmcoc29ydFRleHQpLCBTdHJpbmcobGFzdC5pZCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHJ1biB0aGUgQ09VTlQoKikgcXVlcnkgd2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgbmVlZHMgdGhlIHRvdGFsLlxuICAgICAgLy8gTXVzdCBpbmNsdWRlIHBhcmVudE9yZ0lkIHNvIGB0b3RhbGAgbWF0Y2hlcyB0aGUgd2lkZW5lZCBkYXRhIHNldC5cbiAgICAgIGlmIChpbmNsdWRlVG90YWwpIHtcbiAgICAgICAgY29uc3QgYmFzZUNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgICAgIGNvbnN0IFtjb3VudFJlc3VsdF0gPSBhd2FpdCB0eFxuICAgICAgICAgIC5zZWxlY3QoeyBjb3VudDogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAgICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICAud2hlcmUoYW5kKC4uLmJhc2VDb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVDb3VudChyKSk7XG4gICAgICAgIHJlc3VsdC50b3RhbCA9IGNvdW50UmVzdWx0Py5jb3VudCB8fCAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbHVtbiBzZWxlY3Rpb24gbWFwIGZvciBzcGFyc2UgZmllbGRzZXRzLlxuICAgKiBGYWxscyBiYWNrIHRvIGZ1bGwgc2VsZWN0IGlmIG5vIGZpZWxkcyBhcmUgcmVxdWVzdGVkLlxuICAgKlxuICAgKiBgaWRgIGlzIGFsd2F5cyBpbmNsdWRlZCDigJQgaXQgaXMgdGhlIGVudGl0eSBpZGVudGl0eSBBTkQgdGhlIGtleXNldCBjdXJzb3Inc1xuICAgKiB0aWUtYnJlYWtlci4gVGhlIHNvcnQgdmFsdWUgZm9yIHRoZSBjdXJzb3IgaXMgcHJvamVjdGVkIHNlcGFyYXRlbHkgKGFzIHRleHQpXG4gICAqIGJ5IGBmaW5kUGFnaW5hdGVkYCwgc28gdGhlIGZpZWxkc2V0IG5lZWQgbm90IGNhcnJ5IHRoZSBzb3J0IGNvbHVtbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGaWVsZFNlbGVjdChmaWVsZHM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29sdW1uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAvLyBBbHdheXMgaW5jbHVkZSBpZCBmb3IgZW50aXR5IGlkZW50aXR5XG4gICAgY29sdW1ucy5pZCA9IHRoaXMuY29scy5pZDtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQgPT09ICdpZCcpIGNvbnRpbnVlOyAvLyBBbHJlYWR5IGluY2x1ZGVkXG4gICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHNbZmllbGRdO1xuICAgICAgaWYgKGNvbCkgY29sdW1uc1tmaWVsZF0gPSBjb2w7XG4gICAgfVxuXG4gICAgLy8gQXQgbWluaW11bSB3ZSdsbCBoYXZlIHsgaWQgfSwgd2hpY2ggaXMgdmFsaWRcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudCBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXIgY3JpdGVyaWFcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqIEBwYXJhbSBwYXJlbnRPcmdJZCAtIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdpZGVuIHRoZSBjb3VudCB0byB0aGUgcGFyZW50IG9yZydzXG4gICAqICAgcHVibGljIHJvd3MuIE1VU1QgbWlycm9yIGBmaW5kYC9gZmluZFBhZ2luYXRlZGAncyB3aWRlbmluZyAoc2FtZVxuICAgKiAgIGBidWlsZENvbmRpdGlvbnNgIGFyZ3MgKyBzeXNhZG1pbi1zY29wZWQgcmVhZCB2aWEgYHJ1blJlYWRgKSBzbyBhIHBhZ2VkXG4gICAqICAgbGlzdCdzIGB0b3RhbGAgbWF0Y2hlcyB0aGUgcm93cyBhIHdpZGVuZWQgYGZpbmQoKWAgcmV0dXJucyDigJQgb3RoZXJ3aXNlIHRoZVxuICAgKiAgIGNvdW50IG9taXRzIHRoZSBwYXJlbnQncyByb3dzIGFuZCByZXBvcnRzIGEgbmFycm93ZXIgdG90YWwgdGhhbiB0aGUgZGF0YSBzZXQuXG4gICAqL1xuICBhc3luYyBjb3VudChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCh7IGNvdW50OiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZUNvdW50KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdD8uY291bnQgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgc2luZ2xlIGVudGl0eSBieSBJRFxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBFbnRpdHkgSURcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aWRlbiB2aXNpYmlsaXR5IHRvIHRoZSBwYXJlbnRcbiAgICogICBvcmcncyBwdWJsaWMgcm93cyAoc28gYSB0ZWFtIGNhbiBmZXRjaCBhIHBhcmVudCdzIHB1YmxpYyBlbnRpdHkgYnkgaWQpLlxuICAgKiAgIFNhbWUgb3B0LWluICsgc3lzYWRtaW4tc2NvcGVkIHJlYWQgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYDsgdGhlXG4gICAqICAgYWNjZXNzLWNvbnRyb2wgV0hFUkUgY2xhdXNlIGlzIHRoZSBhdXRob3JpdGF0aXZlIHRlbmFuY3kgZ2F0ZS5cbiAgICovXG4gIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgLy8gRXhhY3QgaWQg4oCUIGBmaW5kQnlJZGAgbWVhbnMgVEhFIHJvdyB3aXRoIHRoaXMgaWQsIG5vdCBhIHByZWZpeCBtYXRjaC4gVGhlXG4gICAgLy8gc2hhcmVkIGBidWlsZElkRmlsdGVyYCBwcmVmaXgtbWF0Y2hlcyBub24tZnVsbC1VVUlEIHZhbHVlcyAoYSBsaXN0LXNlYXJjaFxuICAgIC8vIGZlYXR1cmUpLCB3aGljaCBoZXJlIHdvdWxkIHJldHVybiBhbiBhcmJpdHJhcnkgZmlyc3QgcHJlZml4IGhpdCBmb3IgYVxuICAgIC8vIHBhcnRpYWwgaWQ7IHBpbiBpdCB0byBleGFjdCBzbyBhIG1hbGZvcm1lZCBpZCByZXR1cm5zIG51bGwuXG4gICAgY29uZGl0aW9ucy5wdXNoKHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCkpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XG4gIH1cblxuICAvLyBNdXRhdGlvbiBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIERlZmVuc2UtaW4tZGVwdGggdGVuYW50IHN0YW1wIGFsb25nc2lkZSBSTFM6IGEgTk9OLXN5c2FkbWluIGNhbGxlciBtYXkgb25seVxuICAgKiB3cml0ZSBpbnRvIGl0cyBPV04gb3JnLCBzbyBwaW4gdGhlIHJvdyB0byB0aGUgdHJ1c3RlZCB0ZW5hbnQtY29udGV4dCBvcmcuXG4gICAqXG4gICAqIFRoZSBzdGFtcCBmaXJlcyB3aGVuZXZlciB0aGUgcGF5bG9hZCdzIGBvcmdJZGAgZGlmZmVycyBmcm9tIHRoZSBjb250ZXh0IG9yZyDigJRcbiAgICogd2hpY2ggY292ZXJzIEJPVEggYSBmb3JnZWQvbWlzbWF0Y2hlZCBgZGF0YS5vcmdJZGAgQU5EIGFuIEFCU0VOVCBvbmUuIFRoZVxuICAgKiBhYnNlbnQgY2FzZSBpcyB0aGUgaW1wb3J0YW50IHRlbmFudC1ib3VuZGFyeSBmaXg6IHRoZSBgb3JnX2lkYCBjb2x1bW4gREVGQVVMVHNcbiAgICogdG8gYFNZU1RFTV9PUkdfSURgIChzY2hlbWEvcGlwZWxpbmUudHMsIHNjaGVtYS9wbHVnaW4udHMpLCBzbyBhbiBpbnNlcnQgdGhhdFxuICAgKiBvbWl0cyBgb3JnSWRgIHdvdWxkIG90aGVyd2lzZSBsYW5kIHRoZSB0ZW5hbnQncyByb3cgaW4gdGhlIHB1YmxpYyBzeXN0ZW1cbiAgICogY2F0YWxvZyDigJQgYSBjcm9zcy10ZW5hbnQgZmFpbC1vcGVuLiBBbHdheXMgaW5qZWN0aW5nIGBjdHgub3JnSWRgIGNsb3NlcyBpdC5cbiAgICpcbiAgICogU3lzYWRtaW4gKGFuZCBvdXQtb2YtY29udGV4dCB3b3JrZXIvc3lzdGVtIHBhdGhzLCB3aGVyZSBgZ2V0VGVuYW50Q29udGV4dCgpYFxuICAgKiBpcyB1bmRlZmluZWQpIGtlZXAgdGhlIHN1cHBsaWVkIG9yZywgbWF0Y2hpbmcgdGhlIFJMUyBwb2xpY3lcbiAgICogYGN1cnJlbnRfaXNfc3lzYWRtaW4oKSBPUiBvcmdfaWQgPSBjdXJyZW50X29yZ19pZCgpYC5cbiAgICovXG4gIC8vIEdlbmVyaWMgb3ZlciB0aGUgcGF5bG9hZCBzaGFwZSBzbyBib3RoIHRoZSBjcmVhdGUgKGBUSW5zZXJ0YCkgYW5kIHVwZGF0ZVxuICAvLyAoYFBhcnRpYWw8VFVwZGF0ZT5gKSBjYWxsIHNpdGVzIHVzZSBpdCDigJQgdGhlIG9yZy1zdGFtcCBsb2dpYyBvbmx5IHRvdWNoZXNcbiAgLy8gdGhlIGBvcmdJZGAga2V5LlxuICBwcm90ZWN0ZWQgZW5mb3JjZU9yZ0lkPFQ+KGRhdGE6IFQsIGlzQ3JlYXRlID0gZmFsc2UpOiBUIHtcbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgY29uc3QgZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgLy8gUmVmdXNlIGEgY29udGV4dC1sZXNzLCBvcmdJZC1sZXNzIElOU0VSVCBvbiBhbiBvcmctc2NvcGVkIGVudGl0eTogdGhlIGBvcmdJZGBcbiAgICAvLyBjb2x1bW4gZGVmYXVsdHMgdG8gU1lTVEVNX09SR19JRCwgc28gc3VjaCBhIHJvdyB3b3VsZCBzaWxlbnRseSBsYW5kIGluIHRoZVxuICAgIC8vIHB1YmxpYyBjcm9zcy1vcmcgY2F0YWxvZy4gQSBiYWNrZ3JvdW5kIGpvYiB0aGF0IGZvcmdvdCBgcnVuV2l0aFRlbmFudENvbnRleHRgXG4gICAgLy8gKGFuZCBkaWRuJ3QgcGFzcyBhbiBleHBsaWNpdCBvcmdJZCkgbXVzdCBmYWlsIGxvdWRseSwgbm90IGxlYWsgaW50byBgc3lzdGVtYC5cbiAgICAvLyAoU3lzYWRtaW4vc2VlZCB3cml0ZXMgY2FycnkgYSBjb250ZXh0IG9yIGFuIGV4cGxpY2l0IG9yZ0lkLCBzbyB0aGV5IHBhc3MuKVxuICAgIGlmIChpc0NyZWF0ZSAmJiAhY3R4ICYmIGQub3JnSWQgPT0gbnVsbCAmJiB0aGlzLmNvbHMub3JnSWQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uY3JlYXRlIHJlcXVpcmVzIGFuIG9yZ0lkIChubyB0ZW5hbnQgY29udGV4dCBhbmQgbm9uZSBzdXBwbGllZCkg4oCUIHJlZnVzaW5nIHRvIGRlZmF1bHQgdG8gdGhlIHN5c3RlbSBvcmdgKTtcbiAgICB9XG4gICAgaWYgKGN0eCAmJiAhY3R4LmlzU3VwZXJBZG1pbiAmJiBjdHgub3JnSWQgJiYgZC5vcmdJZCAhPT0gY3R4Lm9yZ0lkKSB7XG4gICAgICAvLyBEaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIHRoYXQgcmVhY2ggaGVyZSBzbyB0aGUgbG9nIHN0YXlzIHVzZWZ1bCBhbmRcbiAgICAgIC8vIHF1aWV0OiBhIFBSRVNFTlQtYnV0LW1pc21hdGNoZWQgYG9yZ0lkYCBpcyBhbiBhY3R1YWwgb3ZlcnJpZGUgYXR0ZW1wdFxuICAgICAgLy8gKHdhcm4pLCB3aGlsZSBhbiBBQlNFTlQgYG9yZ0lkYCBpcyB0aGUgY29tbW9uIG5vcm1hbC13cml0ZSBwYXRoIHRoYXQganVzdFxuICAgICAgLy8gbmVlZHMgdGhlIGRlZmF1bHQgc3RhbXAgKGRlYnVnKSDigJQgbG9nZ2luZyB0aGF0IGF0IHdhcm4gZmxvb2RzIHRoZSBsb2cgb25cbiAgICAgIC8vIGV2ZXJ5IHdyaXRlIHRoYXQgb21pdHMgb3JnSWQuXG4gICAgICBjb25zdCBtZXRhID0geyBzdXBwbGllZDogJ29yZ0lkJyBpbiBkID8gZC5vcmdJZCA6IHVuZGVmaW5lZCwgZW5mb3JjZWQ6IGN0eC5vcmdJZCB9O1xuICAgICAgaWYgKCdvcmdJZCcgaW4gZCkge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignQ3J1ZFNlcnZpY2U6IG92ZXJyaWRpbmcgbWlzbWF0Y2hlZCBvcmcgb24gd3JpdGUnLCBtZXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnQ3J1ZFNlcnZpY2U6IHN0YW1waW5nIHRlbmFudC1jb250ZXh0IG9yZyBvbiB3cml0ZScsIG1ldGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uZCwgb3JnSWQ6IGN0eC5vcmdJZCB9IGFzIFQ7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShkYXRhOiBUSW5zZXJ0LCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSwgLyogaXNDcmVhdGUgKi8gdHJ1ZSk7XG4gICAgLy8gQ3JlYXRlIG5ldmVyIG92ZXJ3cml0ZXMuIFRoZSBjb25mbGljdCBrZXkgY2FuIG1hdGNoIGEgTElWRSByb3cgKGFub3RoZXJcbiAgICAvLyBhdXRob3Incywgb3Igb25lIHRoZSBjYWxsZXIgY291bGRuJ3QgZWRpdCB0aHJvdWdoIHVwZGF0ZSkgb3IgYSBzb2Z0LWRlbGV0ZWRcbiAgICAvLyBUT01CU1RPTkU7IHJlcGxhY2luZyBlaXRoZXIgd291bGQgYnlwYXNzIHVwZGF0ZSdzIGFjY2VzcyBjaGVja3Mgb3IgcmVzdG9yZSdzXG4gICAgLy8gc3RlcC11cC4gT24gYW55IGNvbmZsaWN0IG5vdGhpbmcgaXMgd3JpdHRlbiBhbmQgdGhlIGNhbGxlciBnZXRzIGEgNDA5LlxuICAgIGNvbnN0IFtjcmVhdGVkXSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuaW5zZXJ0KHRoaXMuc2NoZW1hKVxuICAgICAgLnZhbHVlcyh0aGlzLnJvdyh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICBjcmVhdGVkQnk6IHRoaXMuYWN0b3IodXNlcklkKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB0aGlzLmFjdG9yKHVzZXJJZCksXG4gICAgICB9KSlcbiAgICAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKHsgdGFyZ2V0OiB0aGlzLmNvbmZsaWN0VGFyZ2V0IGFzIGFueSB9KVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgaWYgKCFjcmVhdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcignQSByZWNvcmQgd2l0aCB0aGUgc2FtZSBpZGVudGl0eSBhbHJlYWR5IGV4aXN0cy4gSWYgaXQgd2FzIGRlbGV0ZWQsIHJlc3RvcmUgaXQgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICAvLyBBd2FpdGVkIGludGVudGlvbmFsbHk6IGNhY2hlIGludmFsaWRhdGlvbiBoYXBwZW5zIGluIHRoZSBob29rLCBhbmQgYVxuICAgIC8vIGZpcmUtYW5kLWZvcmdldCBwYXR0ZXJuIGxldHMgYSBzdWJzZXF1ZW50IHJlYWQgaW5zaWRlIHRoZSBzYW1lIHJlcXVlc3RcbiAgICAvLyByZXR1cm4gdGhlIHN0YWxlIHByZS13cml0ZSBlbnRyeS4gVGhlIGhvb2sgaXMgZXhwZWN0ZWQgdG8gYmUgZmFzdFxuICAgIC8vIChzaW5nbGUgUmVkaXMgb3ApOyBzbG93IGhvb2tzIHNob3VsZCBydW4gdGhlaXIgb3duIGJhY2tncm91bmQgd29yay5cbiAgICBhd2FpdCB0aGlzLnJ1bkhvb2soKCkgPT4gdGhpcy5vbkFmdGVyQ3JlYXRlKGNyZWF0ZWQsIHVzZXJJZCkpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFuIGV4aXN0aW5nIGVudGl0eVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGF0YTogUGFydGlhbDxUVXBkYXRlPixcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMud3JpdGVDb25kaXRpb25zKGlkLCBvcmdJZCk7XG5cbiAgICAvLyBTY3J1YiBhIGNhbGxlci1zdXBwbGllZCBgb3JnSWRgIGluIHRoZSB1cGRhdGUgcGF5bG9hZCAoYXMgY3JlYXRlIGRvZXMpOiB0aGVcbiAgICAvLyBXSEVSRSBvbmx5IHBpbnMgd2hpY2ggcm93cyB5b3UgY2FuIFRBUkdFVCwgbm90IHdoYXQgeW91IGNhbiBzZXQg4oCUIHdpdGhvdXQgdGhpc1xuICAgIC8vIGEgdGVuYW50IGNvdWxkIHJlLWhvbWUgYSByb3cgaXQgb3ducyBpbnRvIGFub3RoZXIgb3JnIHZpYSBgZGF0YS5vcmdJZGAuXG4gICAgY29uc3Qgc2FmZURhdGEgPSB0aGlzLmVuZm9yY2VPcmdJZChkYXRhKTtcblxuICAgIGNvbnN0IFt1cGRhdGVkXSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh0aGlzLnJvdyh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdGhpcy5hY3Rvcih1c2VySWQpLFxuICAgICAgfSkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMucnVuSG9vaygoKSA9PiB0aGlzLm9uQWZ0ZXJVcGRhdGUoaWQsIHVwZGF0ZWQsIHVzZXJJZCkpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVudGl0eSAoc29mdCBkZWxldGUgYnkgc2V0dGluZyBpc0FjdGl2ZSA9IGZhbHNlKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBbZGVsZXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQodGhpcy5yb3codGhpcy50b21ic3RvbmVTZXQobm93LCB1c2VySWQpKSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgYXdhaXQgdGhpcy5ydW5Ib29rKCgpID0+IHRoaXMub25BZnRlckRlbGV0ZShpZCwgZGVsZXRlZCwgdXNlcklkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYW4gZW50aXR5IGFzIHRoZSBkZWZhdWx0IGZvciBhIHByb2plY3Qvb3JnYW5pemF0aW9uIHNjb3BlLlxuICAgKiBNYXJrcyBhbGwgb3RoZXIgZW50aXRpZXMgYXMgbm9uLWRlZmF1bHQsIHRoZW4gc2V0cyB0aGUgc3BlY2lmaWVkIGVudGl0eS5cbiAgICogVXNlcyBhIHRyYW5zYWN0aW9uIHRvIGVuc3VyZSBhdG9taWNpdHkuXG4gICAqL1xuICBhc3luYyBzZXREZWZhdWx0KFxuICAgIHByb2plY3Q6IHN0cmluZyxcbiAgICBvcmc6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRFbnRpdHk+IHtcbiAgICAvLyBBIG5vbi1zeXNhZG1pbiBtYXkgb25seSBmbGlwIGRlZmF1bHRzIHdpdGhpbiBpdHMgT1dOIG9yZyDigJQgcGluIHRoZSBzY29wZSB0b1xuICAgIC8vIHRoZSB0cnVzdGVkIHRlbmFudCBjb250ZXh0IHNvIGEgZm9yd2FyZGVkIGBvcmdgIGFyZyBjYW4ndCB0b3VjaCBhbm90aGVyXG4gICAgLy8gdGVuYW50J3MgZGVmYXVsdHMgKGFwcC1sYXllciBwaW4sIGluIGFkZGl0aW9uIHRvIFJMUykuXG4gICAgY29uc3QgY3R4ID0gZ2V0VGVuYW50Q29udGV4dCgpO1xuICAgIGlmIChjdHggJiYgIWN0eC5pc1N1cGVyQWRtaW4gJiYgY3R4Lm9yZ0lkKSBvcmcgPSBjdHgub3JnSWQ7XG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIGNvbnN0IG9yZ0NvbHVtbiA9IHRoaXMuZ2V0T3JnQ29sdW1uKCk7XG4gICAgICBjb25zdCBwcm9qZWN0Q29sdW1uID0gdGhpcy5nZXRQcm9qZWN0Q29sdW1uKCk7XG5cbiAgICAgIC8vIEJ1aWxkIHNjb3BpbmcgY29uZGl0aW9ucyBmb3IgY2xlYXJpbmcgZGVmYXVsdHNcbiAgICAgIGNvbnN0IHNjb3BlQ29uZGl0aW9ucyA9IFtcbiAgICAgICAgZXEob3JnQ29sdW1uLCBvcmcpLFxuICAgICAgICBlcSh0aGlzLmNvbHMuaXNEZWZhdWx0LCB0cnVlKSxcbiAgICAgIF07XG4gICAgICBpZiAocHJvamVjdENvbHVtbikge1xuICAgICAgICBzY29wZUNvbmRpdGlvbnMucHVzaChlcShwcm9qZWN0Q29sdW1uLCBwcm9qZWN0KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvY2sgZXhpc3RpbmcgZGVmYXVsdHMgd2l0aCBGT1IgVVBEQVRFIHRvIHByZXZlbnQgY29uY3VycmVudCBzZXREZWZhdWx0IHJhY2VzXG4gICAgICBhd2FpdCB0eC5leGVjdXRlKFxuICAgICAgICBzcWxgU0VMRUNUIGlkIEZST00gJHt0aGlzLnNjaGVtYX1cbiAgICAgICAgICAgIFdIRVJFICR7b3JnQ29sdW1ufSA9ICR7b3JnfVxuICAgICAgICAgICAgICBBTkQgJHt0aGlzLmNvbHMuaXNEZWZhdWx0fSA9IHRydWVcbiAgICAgICAgICAgICR7cHJvamVjdENvbHVtbiA/IHNxbGBBTkQgJHtwcm9qZWN0Q29sdW1ufSA9ICR7cHJvamVjdH1gIDogc3FsYGB9XG4gICAgICAgICAgICBGT1IgVVBEQVRFYCxcbiAgICAgICk7XG5cbiAgICAgIC8vIE1hcmsgYWxsIGVudGl0aWVzIGluIHNjb3BlIGFzIG5vbi1kZWZhdWx0XG4gICAgICBhd2FpdCB0eFxuICAgICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgICAuc2V0KHRoaXMucm93KHtcbiAgICAgICAgICBpc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHRoaXMuYWN0b3IodXNlcklkKSxcbiAgICAgICAgfSkpXG4gICAgICAgIC53aGVyZShhbmQoLi4uc2NvcGVDb25kaXRpb25zKSk7XG5cbiAgICAgIC8vIFNldCB0aGUgc3BlY2lmaWVkIGVudGl0eSBhcyBkZWZhdWx0LiBHdWFyZCBhZ2FpbnN0IHByb21vdGluZyBhXG4gICAgICAvLyBzb2Z0LWRlbGV0ZWQgcm93IChpc0FjdGl2ZSA9IHRydWUpIOKAlCBhIGRlbGV0ZWQgZW50aXR5IG11c3QgbmV2ZXIgYmVjb21lXG4gICAgICAvLyB0aGUgYWN0aXZlIGRlZmF1bHQg4oCUIGFuZCBwaW4gdGhlIGlkIHdpdGggdGhlIHNhbWUgbG93ZXJjYXNlZFxuICAgICAgLy8gZXhhY3RJZENvbmRpdGlvbiB0aGUgbXV0YXRpb24gcGF0aHMgdXNlICh0aGUgcmF3IGBlcShjb2xzLmlkLCBpZClgIGhlcmVcbiAgICAgIC8vIHNraXBwZWQgdGhlIGxvd2VyLWNhc2luZyB0aGF0IGBidWlsZElkRmlsdGVyYC9gd3JpdGVDb25kaXRpb25zYCBhcHBseSxcbiAgICAgIC8vIHNvIGEgbWl4ZWQtY2FzZSBpZCBjb3VsZCBtaXNzIGl0cyByb3cpLiBBIG5vbi1tYXRjaCDihpIgTm90Rm91bmRFcnJvciBiZWxvdy5cbiAgICAgIGNvbnN0IFt1cGRhdGVkXSA9IGF3YWl0IHR4XG4gICAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAgIC5zZXQodGhpcy5yb3coe1xuICAgICAgICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXBkYXRlZEJ5OiB0aGlzLmFjdG9yKHVzZXJJZCksXG4gICAgICAgIH0pKVxuICAgICAgICAud2hlcmUoXG4gICAgICAgICAgYW5kKFxuICAgICAgICAgICAgdGhpcy5leGFjdElkQ29uZGl0aW9uKGlkKSxcbiAgICAgICAgICAgIGVxKG9yZ0NvbHVtbiwgb3JnKSxcbiAgICAgICAgICAgIGVxKHRoaXMuY29scy5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKTtcblxuICAgICAgaWYgKCF1cGRhdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBFbnRpdHkgd2l0aCBpZCAke2lkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG11bHRpcGxlIGVudGl0aWVzIG1hdGNoaW5nIGZpbHRlclxuICAgKi9cbiAgYXN5bmMgdXBkYXRlTWFueShcbiAgICBmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sXG4gICAgZGF0YTogUGFydGlhbDxUVXBkYXRlPixcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKTtcbiAgICAvLyBPd24tb3JnIHdyaXRlLXBpbjogYnVpbGRDb25kaXRpb25zIGFsc28gbWF0Y2hlcyBzeXN0ZW0vb3RoZXItb3JnIFBVQkxJQ1xuICAgIC8vIHJvd3MsIHNvIHdpdGhvdXQgdGhlIHN0cmljdCBvcmdJZCBwaW4gYSBmaWx0ZXItYmFzZWQgdXBkYXRlIGNvdWxkIG11dGF0ZVxuICAgIC8vIHNoYXJlZCAob3IgYW5vdGhlciB0ZW5hbnQncyBwdWJsaWMpIHJlY29yZHMuIE1pcnJvciB1cGRhdGUvZGVsZXRlL1xuICAgIC8vIGJ1bGtEZWxldGUuIChTZWUgd3JpdGVDb25kaXRpb25zLikgQW4gb3JnSWQtbGVzcyAoc3lzYWRtaW4pIGNvbnRleHQga2VlcHNcbiAgICAvLyBmdWxsIGFjY2Vzcy5cbiAgICBpZiAob3JnSWQpIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCkpO1xuXG4gICAgLy8gU2NydWIgYSBjYWxsZXItc3VwcGxpZWQgb3JnSWQgKHNlZSB1cGRhdGUoKSkgc28gYSBmaWx0ZXItYmFzZWQgdXBkYXRlIGNhbid0XG4gICAgLy8gcmUtaG9tZSByb3dzIGludG8gYW5vdGhlciB0ZW5hbnQuXG4gICAgY29uc3Qgc2FmZURhdGEgPSB0aGlzLmVuZm9yY2VPcmdJZChkYXRhKTtcblxuICAgIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQodGhpcy5yb3coe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHRoaXMuYWN0b3IodXNlcklkKSxcbiAgICAgIH0pKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRoZSBgdmlzaWJpbGl0eWAgcHJlZGljYXRlIGZvciBhIGJ1bGsgc29mdC1kZWxldGUsIG1pcnJvcmluZ1xuICAgKiBgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2Vzc2AgcnVuZyBmb3IgcnVuZyBzbyBidWxrIGFuZCBzaW5nbGUtcm93IGRlbGV0ZVxuICAgKiBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgd2hhdCBhIGNhbGxlciBtYXkgcmVtb3ZlLlxuICAgKlxuICAgKiBSZXR1cm5zIG5vIGNvbmRpdGlvbiBhdCBhbGwgZm9yIGEgc3lzdGVtIGFkbWluLCBvciBmb3IgYW4gZW50aXR5IHdpdGggbm9cbiAgICogYHZpc2liaWxpdHlgIGNvbHVtbiAobm90aGluZyB0byBnYXRlIG9uKS5cbiAgICovXG4gIHByaXZhdGUgdmlzaWJpbGl0eURlbGV0ZUNvbmRpdGlvbnMoXG4gICAgYWNjZXNzOiB7IGlzU3lzdGVtQWRtaW46IGJvb2xlYW47IGNhblB1Ymxpc2g6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBhY2Nlc3NDb2w/OiBBbnlDb2x1bW4sXG4gICAgY3JlYXRlZEJ5Q29sPzogQW55Q29sdW1uLFxuICApOiBTUUxbXSB7XG4gICAgaWYgKCFhY2Nlc3NDb2wpIHJldHVybiBbXTtcbiAgICBpZiAoIWFjY2VzcyB8fCBhY2Nlc3MuaXNTeXN0ZW1BZG1pbikgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgcnVuZ3M6IFNRTFtdID0gW2VxKGFjY2Vzc0NvbCwgJ29yZycpXTtcbiAgICAvLyBgcHJpdmF0ZWAgaXMgYXV0aG9yLW9ubHkuIFdpdGggbm8gYXV0aG9yIGNvbHVtbiBvciBubyBjYWxsZXIgaWRlbnRpdHkgd2VcbiAgICAvLyBjYW5ub3QgcHJvdmUgYXV0aG9yc2hpcCwgc28gdGhlIHJ1bmcgaXMgc2ltcGx5IG5vdCBvZmZlcmVkIChmYWlsIGNsb3NlZClcbiAgICAvLyByYXRoZXIgdGhhbiBtYXRjaGluZyBldmVyeSBwcml2YXRlIHJvdy5cbiAgICBpZiAoY3JlYXRlZEJ5Q29sICYmIHVzZXJJZCkge1xuICAgICAgcnVuZ3MucHVzaChhbmQoZXEoYWNjZXNzQ29sLCAncHJpdmF0ZScpLCBlcShjcmVhdGVkQnlDb2wsIHVzZXJJZCkpIGFzIFNRTCk7XG4gICAgfVxuICAgIGlmIChhY2Nlc3MuY2FuUHVibGlzaCkgcnVuZ3MucHVzaChlcShhY2Nlc3NDb2wsICdwdWJsaWMnKSk7XG5cbiAgICByZXR1cm4gW29yKC4uLnJ1bmdzKSBhcyBTUUxdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvZnQtZGVsZXRlIG11bHRpcGxlIGVudGl0aWVzIGJ5IElEcyBpbiBhIHNpbmdsZSBiYXRjaCBvcGVyYXRpb24uXG4gICAqL1xuICBhc3luYyBidWxrRGVsZXRlKFxuICAgIGlkczogc3RyaW5nW10sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBUaGUgY2FsbGVyJ3MgYXV0aG9yaXR5IG9uIHRoZSB0aHJlZS1ydW5nIGB2aXNpYmlsaXR5YCBsYWRkZXIuIE9taXQgKG9yXG4gICAgICogcGFzcyBgaXNTeXN0ZW1BZG1pbjogdHJ1ZWApIGZvciBhbiB1bnJlc3RyaWN0ZWQgZGVsZXRlLiBUaGUgcnVuZ3MgbWlycm9yXG4gICAgICogYHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3NgIGV4YWN0bHksIHNvIGJ1bGsgYW5kIHNpbmdsZS1yb3cgZGVsZXRlIGFncmVlOlxuICAgICAqICAgLSBgcHJpdmF0ZWAg4oaSIGF1dGhvciBvbmx5IChgY3JlYXRlZEJ5ID09PSB1c2VySWRgKVxuICAgICAqICAgLSBgb3JnYCAgICAg4oaSIGFueSBtZW1iZXIgb2YgdGhlIG9yZyAocGxhaW4gYDp3cml0ZWApXG4gICAgICogICAtIGBwdWJsaWNgICDihpIgcmVxdWlyZXMgdGhlIGVudGl0eSdzIHB1Ymxpc2ggcGVybWlzc2lvblxuICAgICAqL1xuICAgIGFjY2Vzcz86IHsgaXNTeXN0ZW1BZG1pbjogYm9vbGVhbjsgY2FuUHVibGlzaDogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIC8vIE93bmVyLXNjb3BlIHRoZSBidWxrIHNvZnQtZGVsZXRlOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlclxuICAgIC8vIC1vcmcgUFVCTElDIHJvd3MsIHNvIHdpdGhvdXQgdGhlIHN0cmljdCBvcmdJZCBwaW4gYSB0ZW5hbnQgY291bGQgZGVsZXRlXG4gICAgLy8gc2hhcmVkIHJlY29yZHMgYnkgaWQuIChTZWUgd3JpdGVDb25kaXRpb25zLilcbiAgICBjb25zdCBhY2Nlc3NDb2wgPSB0aGlzLmNvbHMudmlzaWJpbGl0eTtcbiAgICBjb25zdCBjcmVhdGVkQnlDb2wgPSB0aGlzLmNvbHMuY3JlYXRlZEJ5O1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBbXG4gICAgICBpbkFycmF5KHRoaXMuY29scy5pZCwgaWRzKSxcbiAgICAgIC4uLnRoaXMuYnVpbGRDb25kaXRpb25zKHt9IGFzIFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkKSxcbiAgICAgIC8vIFRlbmFudCBjb2x1bW4gKGdldE9yZ0NvbHVtbiwgYXNzZXJ0ZWQgbm9uLW51bGwpIOKAlCBjb25zaXN0ZW50IHdpdGhcbiAgICAgIC8vIHdyaXRlQ29uZGl0aW9uczsgbm8gc2lsZW50IGZhaWwtb3BlbiB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBhYnNlbnQuXG4gICAgICAuLi4ob3JnSWQgPyBbZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpXSA6IFtdKSxcbiAgICAgIC4uLnRoaXMudmlzaWJpbGl0eURlbGV0ZUNvbmRpdGlvbnMoYWNjZXNzLCB1c2VySWQsIGFjY2Vzc0NvbCwgY3JlYXRlZEJ5Q29sKSxcbiAgICAgIC8vIFJlLWRlbGV0aW5nIGEgdG9tYnN0b25lIHdvdWxkIHJlLXN0YW1wIGl0cyBwdXJnZSBkZWFkbGluZS5cbiAgICAgIC4uLnRoaXMubm90VG9tYnN0b25lZCgpLFxuICAgIF07XG5cbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHRoaXMucm93KHRoaXMudG9tYnN0b25lU2V0KG5vdywgdXNlcklkKSkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZGVsZXRlZC5tYXAoZW50aXR5ID0+IHRoaXMucnVuSG9vaygoKSA9PiB0aGlzLm9uQWZ0ZXJEZWxldGUoZW50aXR5LmlkLCBlbnRpdHksIHVzZXJJZCkpKSk7XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIC8qKiBDb25kaXRpb25zIG1hdGNoaW5nIGEgR0VOVUlORSB0b21ic3RvbmUgKGBpc0FjdGl2ZT1mYWxzZWAgQU5EIGBkZWxldGVkQXQgSVNcbiAgICogIE5PVCBOVUxMYCksIG9wdGlvbmFsbHkgcGlubmVkIHRvIGBpZGAgYW5kL29yIGBvcmdJZGAuIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGhcbiAgICogIGZvciByZXN0b3JlL2ZpbmREZWxldGVkQnlJZC9maW5kRGVsZXRlZCBzbyB0aGUgXCJ3aGF0IGlzIGEgdG9tYnN0b25lXCIgcnVsZVxuICAgKiAgbGl2ZXMgaW4gb25lIHBsYWNlLiAqL1xuICBwcml2YXRlIHRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQ/OiBzdHJpbmcsIGlkPzogc3RyaW5nKTogU1FMW10ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW1xuICAgICAgZXEodGhpcy5jb2xzLmlzQWN0aXZlLCBmYWxzZSksXG4gICAgICBzcWxgJHt0aGlzLmNvbHMuZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsXG4gICAgICAuLi50aGlzLnRvbWJzdG9uZVZpc2liaWxpdHlDb25kaXRpb25zKCksXG4gICAgXTtcbiAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkgY29uZGl0aW9ucy51bnNoaWZ0KHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCkpO1xuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGBwcml2YXRlYCBydW5nLCBmb3IgVE9NQlNUT05FIHJlYWRzIGFuZCByZXN0b3JlLlxuICAgKlxuICAgKiBEZWxldGluZyBhIHJvdyBkb2VzIG5vdCBkZWNsYXNzaWZ5IGl0OiB3aXRob3V0IHRoaXMsIHRoZSBcInJlY2VudGx5XG4gICAqIGRlbGV0ZWRcIiBsaXN0IChhbmQgcmVzdG9yZSkgd291bGQgZXhwb3NlIG90aGVyIG1lbWJlcnMnIFBSSVZBVEUgcm93cyB0aGF0XG4gICAqIHRoZSBzYW1lIHZpZXdlciBjb3VsZCBub3QgcmVhZCBiZWZvcmUgdGhleSB3ZXJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIE1pcnJvcnMgdGhlIGxpdmUgcmVhZCBsYWRkZXIgKGB2aXNpYmlsaXR5IDw+ICdwcml2YXRlJyBPUiBjcmVhdGVkX2J5ID0gVmApXG4gICAqIHJhdGhlciB0aGFuIHRoZSBkZWxldGUgbGFkZGVyOiB0aGlzIGdhdGVzIHdobyBtYXkgU0VFIGEgdG9tYnN0b25lLCBhbmQgYVxuICAgKiB0b21ic3RvbmUgc2hvdWxkIGJlIHZpc2libGUgdG8gZXhhY3RseSB3aG9ldmVyIGNvdWxkIHNlZSB0aGUgcm93LiBBXG4gICAqIHN1cGVyLWFkbWluIGFkbWluaXN0ZXJzIHRoZSB3aG9sZSBjYXRhbG9nLCBzbyB0aGUgcnVuZyBsaWZ0cyBmb3IgdGhlbS5cbiAgICpcbiAgICogRmFpbHMgQ0xPU0VEOiB3aXRoIG5vIGF1dGhvciBjb2x1bW4gb3Igbm8gdmlld2VyIChiYWNrZ3JvdW5kIGpvYnMsIHRoZVxuICAgKiByZXRlbnRpb24gc3dlZXApIHRoZSBwcml2YXRlIHJ1bmcgaXMgbm90IG9mZmVyZWQgYXQgYWxsIHJhdGhlciB0aGFuXG4gICAqIG1hdGNoaW5nIGV2ZXJ5IHByaXZhdGUgcm93LiBgcHVyZ2VFeHBpcmVkYCBkZWxpYmVyYXRlbHkgZG9lcyBub3QgdXNlIHRoaXMg4oCUXG4gICAqIGl0IHJ1bnMgb3JnLXdpZGUgdW5kZXIgYSBzeXNhZG1pbiBzY29wZSBhbmQgbXVzdCByZWFjaCBldmVyeSB0b21ic3RvbmUuXG4gICAqL1xuICBwcml2YXRlIHRvbWJzdG9uZVZpc2liaWxpdHlDb25kaXRpb25zKCk6IFNRTFtdIHtcbiAgICBjb25zdCBhY2Nlc3NDb2wgPSB0aGlzLmNvbHMudmlzaWJpbGl0eTtcbiAgICBpZiAoIWFjY2Vzc0NvbCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGN0eCA9IGdldFRlbmFudENvbnRleHQoKTtcbiAgICBpZiAoY3R4Py5pc1N1cGVyQWRtaW4pIHJldHVybiBbXTtcblxuICAgIGNvbnN0IGNyZWF0ZWRCeUNvbCA9IHRoaXMuY29scy5jcmVhdGVkQnk7XG4gICAgY29uc3Qgdmlld2VyID0gY3R4Py51c2VySWQ7XG4gICAgY29uc3QgcnVuZ3M6IFNRTFtdID0gW3NxbGAke2FjY2Vzc0NvbH0gPD4gJ3ByaXZhdGUnYF07XG4gICAgaWYgKGNyZWF0ZWRCeUNvbCAmJiB2aWV3ZXIpIHJ1bmdzLnB1c2goZXEoY3JlYXRlZEJ5Q29sLCB2aWV3ZXIpKTtcbiAgICByZXR1cm4gW29yKC4uLnJ1bmdzKSBhcyBTUUxdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgYSBzb2Z0LWRlbGV0ZWQgKHRvbWJzdG9uZWQpIGVudGl0eTogY2xlYXIgYGlzQWN0aXZlYC9gZGVsZXRlZEF0YC9cbiAgICogYGRlbGV0ZWRCeWAvYHB1cmdlQWZ0ZXJgIHNvIGl0IHJlYXBwZWFycyBpbiBub3JtYWwgcmVhZHMuXG4gICAqXG4gICAqIE1hdGNoZXMgT05MWSBhIGdlbnVpbmUgdG9tYnN0b25lIOKAlCBgaXNBY3RpdmUgPSBmYWxzZWAgQU5EIGBkZWxldGVkQXQgSVMgTk9UXG4gICAqIE5VTExgIOKAlCBzbyBhIG1lcmVseSAqZGVhY3RpdmF0ZWQqIHJvdyAoaXNBY3RpdmU9ZmFsc2UsIG5vIGRlbGV0ZWRBdCkgaXMgbmV2ZXJcbiAgICogc2lsZW50bHkgXCJyZXN0b3JlZFwiLiBQaW5uZWQgdG8gdGhlIGNhbGxlcidzIG93biBvcmcgKG9yZ0lkLWxlc3Mgc3lzYWRtaW5cbiAgICogY29udGV4dCBzcGFucyBvcmdzLCBtYXRjaGluZyBkZWxldGUvdXBkYXRlKS4gUmV0dXJucyBudWxsIHdoZW4gdGhlcmUgaXMgbm9cbiAgICogc3VjaCB0b21ic3RvbmUgKGFscmVhZHkgYWN0aXZlLCBwdXJnZWQsIG9yIHVua25vd24pIHNvIHRoZSByb3V0ZSBjYW4gNDA0LlxuICAgKiBBIHVuaXF1ZS1rZXkgY29sbGlzaW9uIChhIGxpdmUgcm93IGFscmVhZHkgaG9sZHMgdGhlIGtleSkgc3VyZmFjZXMgYXMgdGhlXG4gICAqIGRyaXZlcidzIHVuaXF1ZS12aW9sYXRpb24gZm9yIHRoZSByb3V0ZSB0byBtYXAgdG8gNDA5IOKAlCBpbiBwcmFjdGljZSB0aGVcbiAgICogdG9tYnN0b25lIElTIHRoZSBrZXkgaG9sZGVyLCBzbyB0aGlzIGlzIGRlZmVuc2l2ZS5cbiAgICovXG4gIGFzeW5jIHJlc3RvcmUoaWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gbnVsbDsgLy8gZW50aXR5IGhhcyBubyBzb2Z0LWRlbGV0ZSBsaWZlY3ljbGVcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkLCBpZCk7XG5cbiAgICBjb25zdCBbcmVzdG9yZWRdID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHRoaXMucm93KHtcbiAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB0aGlzLmFjdG9yKHVzZXJJZCksXG4gICAgICAgIGRlbGV0ZWRBdDogbnVsbCxcbiAgICAgICAgZGVsZXRlZEJ5OiBudWxsLFxuICAgICAgICAuLi4odGhpcy5jb2xzLnB1cmdlQWZ0ZXIgPyB7IHB1cmdlQWZ0ZXI6IG51bGwgfSA6IHt9KSxcbiAgICAgIH0pKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmIChyZXN0b3JlZCkge1xuICAgICAgYXdhaXQgdGhpcy5ydW5Ib29rKCgpID0+IHRoaXMub25BZnRlclJlc3RvcmUoaWQsIHJlc3RvcmVkLCB1c2VySWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdG9yZWQgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGEgc29mdC1kZWxldGVkIGVudGl0eSBieSBpZCAodGhlIGludmVyc2Ugb2YgdGhlIGRlZmF1bHQgYGlzQWN0aXZlPXRydWVgXG4gICAqIHJlYWRzKSDigJQgdXNlZCBieSByZXN0b3JlIHJvdXRlcyB0byBsb2FkIHRoZSB0b21ic3RvbmUgZm9yIGFjY2Vzcy1jb250cm9sXG4gICAqIGdhdGluZyBiZWZvcmUgcmVzdG9yaW5nLiBSZXR1cm5zIG51bGwgdW5sZXNzIHRoZSByb3cgZXhpc3RzIEFORCBpcyBhIGdlbnVpbmVcbiAgICogdG9tYnN0b25lIChgaXNBY3RpdmU9ZmFsc2VgICsgYGRlbGV0ZWRBdCBJUyBOT1QgTlVMTGApLlxuICAgKi9cbiAgYXN5bmMgZmluZERlbGV0ZWRCeUlkKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMudG9tYnN0b25lQ29uZGl0aW9ucyhvcmdJZCwgaWQpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5saW1pdCgxKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbiBvcmcncyBzb2Z0LWRlbGV0ZWQgdG9tYnN0b25lcyAoYGlzQWN0aXZlPWZhbHNlYCArIGBkZWxldGVkQXQgSVMgTk9UXG4gICAqIE5VTExgKSwgbW9zdC1yZWNlbnRseS1kZWxldGVkIGZpcnN0IOKAlCBwb3dlcnMgdGhlIFwicmVjZW50bHkgZGVsZXRlZFwiIHJlc3RvcmVcbiAgICogVUkuIFJldHVybnMgYFtdYCBmb3IgZW50aXRpZXMgd2l0aG91dCBhIHNvZnQtZGVsZXRlIGxpZmVjeWNsZS4gYGxpbWl0YCBpc1xuICAgKiBjbGFtcGVkIHRvIFsxLCAyMDBdIHRvIGtlZXAgdGhlIHJlc3BvbnNlIGJvdW5kZWQgKHRoZSByZXRlbnRpb24gc3dlZXAgaGFyZC1cbiAgICogZGVsZXRlcyBvbGQgdG9tYnN0b25lcyBhbnl3YXksIHNvIHRoaXMgaXMgYSBzaG9ydCwgc2VsZi1saW1pdGluZyBsaXN0KS5cbiAgICovXG4gIGFzeW5jIGZpbmREZWxldGVkKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgb3B0czogeyBsaW1pdD86IG51bWJlcjsgb2Zmc2V0PzogbnVtYmVyIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBbXTtcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWluKE1hdGgubWF4KDEsIG9wdHMubGltaXQgPz8gNTApLCAyMDApO1xuICAgIGNvbnN0IG9mZnNldCA9IE1hdGgubWF4KDAsIG9wdHMub2Zmc2V0ID8/IDApO1xuXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMudG9tYnN0b25lQ29uZGl0aW9ucyhvcmdJZCk7XG5cbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLm9yZGVyQnkoZGVzYyh0aGlzLmNvbHMuZGVsZXRlZEF0ISkpXG4gICAgICAubGltaXQobGltaXQpXG4gICAgICAub2Zmc2V0KG9mZnNldClcbiAgICAgIC50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYXJkLWRlbGV0ZSBhIGJhdGNoIG9mIHRvbWJzdG9uZXMgd2hvc2UgcHVyZ2UgZGVhZGxpbmUgaGFzIHBhc3NlZFxuICAgKiAoYGRlbGV0ZWRBdCBJUyBOT1QgTlVMTCBBTkQgcHVyZ2VfYWZ0ZXIgPCBub3dgKS4gQmF0Y2hlZCAoYGxpbWl0YCkgc28gYVxuICAgKiBzd2VlcCB0aWNrIHN0YXlzIGJvdW5kZWQ7IHRoZSBwZXItc2VydmljZSBzd2VlcCBsb29wcyB1bnRpbCBhIHRpY2sgcmV0dXJuc1xuICAgKiBgPCBsaW1pdGAuIFJ1bnMgYWNyb3NzIEFMTCBvcmdzLCBzbyBjYWxsZXJzIE1VU1QgaW52b2tlIGl0IGZyb20gYSBzeXNhZG1pblxuICAgKiBzY29wZSAoYHJ1blNvZnREZWxldGVQdXJnZWAgZXN0YWJsaXNoZXMgb25lKS4gYG9uQmVmb3JlUHVyZ2UoaWRzLCB0eClgIHRlYXJzXG4gICAqIGRvd24gZGVwZW5kZW50cyBsYWNraW5nIE9OIERFTEVURSBDQVNDQURFIGluc2lkZSB0aGUgc2FtZSB0eDsgYG9uQWZ0ZXJQdXJnZWBcbiAgICogaGFuZGxlcyBleHRlcm5hbCBzaWRlLWVmZmVjdHMuXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIHB1cmdlZC4gTm8tb3AgKDApIGZvciBlbnRpdGllcyB3aXRob3V0IHRoZSBjb2x1bW5zLlxuICAgKi9cbiAgYXN5bmMgcHVyZ2VFeHBpcmVkKG5vdzogRGF0ZSwgbGltaXQgPSA1MDApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCB8fCAhdGhpcy5jb2xzLnB1cmdlQWZ0ZXIpIHJldHVybiAwO1xuICAgIGNvbnN0IGd1YXJkID0gdGhpcy5wdXJnZUd1YXJkKCk7XG4gICAgY29uc3QgcHVyZ2VkID0gYXdhaXQgdGhpcy5wdXJnZVdoZXJlKFtzcWxgJHt0aGlzLmNvbHMuZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsIHNxbGAke3RoaXMuY29scy5wdXJnZUFmdGVyfSA8ICR7bm93fWAsIC4uLihndWFyZCA/IFtndWFyZF0gOiBbXSldLCBsaW1pdCk7XG4gICAgcmV0dXJuIHB1cmdlZC5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQW4gZXh0cmEgY29uZGl0aW9uIGV2ZXJ5IHB1cmdlIChzd2VlcCBhbmQgbWFudWFsKSBhZGRzOiBhIHRvbWJzdG9uZSB0aGF0XG4gICAqIGZhaWxzIGl0IGlzIEtFUFQuIERlZmF1bHQgbm9uZS4gVGhlIHBsdWdpbiBzZXJ2aWNlIGtlZXBzIGEgdmVyc2lvbiBhbnlcbiAgICogcGlwZWxpbmUgc3RpbGwgcmVmZXJlbmNlcyAoc2VlIC4vdmVyc2lvbi1yZWZlcmVuY2VzLnRzKSDigJQgc3VjaCBhIHJvdyBzdGF5c1xuICAgKiBhIHRvbWJzdG9uZSB1bnRpbCB0aGUgbGFzdCByZWZlcmVuY2UgZ29lcywgYW5kIHRoZSBzd2VlcCByZXRyaWVzIGl0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHB1cmdlR3VhcmQoKTogU1FMIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogT24tZGVtYW5kIGhhcmQtZGVsZXRlIG9mIGEgU0lOR0xFIHRvbWJzdG9uZSBieSBpZCDigJQgdGhlIG1hbnVhbCBjb3VudGVycGFydFxuICAgKiB0byB0aGUgcmV0ZW50aW9uIHN3ZWVwJ3MgYHB1cmdlRXhwaXJlZGAuIFBlcm1hbmVudGx5IHJlbW92ZXMgdGhlIHJvdyBPTkxZXG4gICAqIHdoZW4gaXQgaXMgYSBnZW51aW5lIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCArIGBkZWxldGVkQXQgSVMgTk9UIE5VTExgKSxcbiAgICogb3B0aW9uYWxseSBwaW5uZWQgdG8gYG9yZ0lkYCAoYW4gb3JnSWQtbGVzcyBzeXNhZG1pbiBjb250ZXh0IHNwYW5zIG9yZ3MsXG4gICAqIG1hdGNoaW5nIHJlc3RvcmUvZGVsZXRlKS4gUnVucyB0aGUgc2FtZSBgb25CZWZvcmVQdXJnZWAgZGVwZW5kZW50IHRlYXJkb3duXG4gICAqIGluc2lkZSB0aGUgdHggYW5kIHRoZSBzYW1lIGBvbkFmdGVyUHVyZ2VgIHNpZGUtZWZmZWN0cyBhcyB0aGUgc3dlZXAuXG4gICAqXG4gICAqIElnbm9yZXMgYHB1cmdlQWZ0ZXJgOiBhIG1hbnVhbCBwdXJnZSBmaW5hbGl6ZXMgYW4gYWxyZWFkeS1zb2Z0LWRlbGV0ZWQgaXRlbVxuICAgKiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgcmV0ZW50aW9uIGRlYWRsaW5lLiBSZXR1cm5zIHRoZVxuICAgKiBwdXJnZWQgaWQsIG9yIG51bGwgd2hlbiB0aGVyZSBpcyBubyBzdWNoIHRvbWJzdG9uZSAoYWxyZWFkeSBhY3RpdmUsIHB1cmdlZCxcbiAgICogb3V0IG9mIHNjb3BlLCBvciB1bmtub3duKSBzbyB0aGUgcm91dGUgY2FuIDQwNC5cbiAgICovXG4gIGFzeW5jIHB1cmdlQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZ3VhcmQgPSB0aGlzLnB1cmdlR3VhcmQoKTtcbiAgICBjb25zdCBbcHVyZ2VkSWRdID0gYXdhaXQgdGhpcy5wdXJnZVdoZXJlKFsuLi50aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKSwgLi4uKGd1YXJkID8gW2d1YXJkXSA6IFtdKV0sIDEpO1xuICAgIHJldHVybiBwdXJnZWRJZCA/PyBudWxsO1xuICB9XG59XG4iXX0=