schema-shield 0.0.6 → 1.0.1

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 (39) hide show
  1. package/README.md +219 -65
  2. package/dist/formats.d.ts.map +1 -1
  3. package/dist/index.d.ts +25 -6
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1837 -484
  6. package/dist/index.min.js +1 -1
  7. package/dist/index.min.js.map +1 -1
  8. package/dist/index.mjs +1837 -484
  9. package/dist/keywords/array-keywords.d.ts.map +1 -1
  10. package/dist/keywords/object-keywords.d.ts.map +1 -1
  11. package/dist/keywords/other-keywords.d.ts.map +1 -1
  12. package/dist/keywords/string-keywords.d.ts.map +1 -1
  13. package/dist/types.d.ts.map +1 -1
  14. package/dist/utils/deep-freeze.d.ts +5 -0
  15. package/dist/utils/deep-freeze.d.ts.map +1 -0
  16. package/dist/utils/has-changed.d.ts +2 -0
  17. package/dist/utils/has-changed.d.ts.map +1 -0
  18. package/dist/utils/index.d.ts +5 -0
  19. package/dist/utils/index.d.ts.map +1 -0
  20. package/dist/{utils.d.ts → utils/main-utils.d.ts} +7 -9
  21. package/dist/utils/main-utils.d.ts.map +1 -0
  22. package/dist/utils/pattern-matcher.d.ts +3 -0
  23. package/dist/utils/pattern-matcher.d.ts.map +1 -0
  24. package/lib/formats.ts +468 -155
  25. package/lib/index.ts +702 -107
  26. package/lib/keywords/array-keywords.ts +260 -52
  27. package/lib/keywords/number-keywords.ts +1 -1
  28. package/lib/keywords/object-keywords.ts +295 -88
  29. package/lib/keywords/other-keywords.ts +263 -70
  30. package/lib/keywords/string-keywords.ts +123 -7
  31. package/lib/types.ts +5 -18
  32. package/lib/utils/deep-freeze.ts +208 -0
  33. package/lib/utils/has-changed.ts +51 -0
  34. package/lib/utils/index.ts +4 -0
  35. package/lib/{utils.ts → utils/main-utils.ts} +63 -77
  36. package/lib/utils/pattern-matcher.ts +66 -0
  37. package/package.json +2 -2
  38. package/tsconfig.json +4 -4
  39. package/dist/utils.d.ts.map +0 -1
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleSIsImtleSIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiZGVlcEVxdWFsIiwib2JqIiwib3RoZXIiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJpIiwia2V5cyIsIk9iamVjdCIsImlzT2JqZWN0IiwiZGVlcENsb25lIiwicmVzdWx0IiwiY29uc3RydWN0b3IiLCJuYW1lIiwiaXNDb21waWxlZFNjaGVtYSIsInN1YlNjaGVtYSIsImZuIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIkZvcm1hdHMiLCJtYXRjaCIsImRheSIsIk51bWJlciIsInllYXJTdHIiLCJtb250aFN0ciIsImhvdXJTdHIiLCJtaW51dGVTdHIiLCJzZWNvbmRTdHIiLCJ0aW1lem9uZVNpZ24iLCJ0aW1lem9uZUhvdXJTdHIiLCJ0aW1lem9uZU1pbnV0ZVN0ciIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJ0aW1lem9uZUhvdXIiLCJ0aW1lem9uZU1pbnV0ZSIsInVyaSIsInRlc3QiLCJlbWFpbCIsImlwdjQiLCJpcHY2IiwiaW5kZXhPZiIsImhhc0lwdjQiLCJhZGRyZXNzUGFydHMiLCJzcGxpdCIsImlwdjRQYXJ0IiwicG9wIiwiaXNTaG9ydGVuZWQiLCJpcHY2UGFydCIsImpvaW4iLCJpc0lwdjZWYWxpZCIsImhhc0ludmFsaWRDaGFyIiwiaG9zdG5hbWUiLCJkYXRlIiwiaXNOYU4iLCJEYXRlIiwiZ2V0VGltZSIsInJlZ2V4IiwiUmVnRXhwIiwiZSIsInRpbWUiLCJkdXJhdGlvbiIsInV1aWQiLCJpcmkiLCJUeXBlcyIsIm9iamVjdCIsImFycmF5Iiwic3RyaW5nIiwibnVtYmVyIiwiaW50ZWdlciIsImJvb2xlYW4iLCJudWxsIiwidGltZXN0YW1wIiwiaW50OCIsInVuaXQ4IiwiaW50MTYiLCJ1bml0MTYiLCJpbnQzMiIsInVuaXQzMiIsImZsb2F0MzIiLCJmbG9hdDY0Iiwia2V5d29yZHMiLCJyZXF1aXJlZCIsImRlZmluZUVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiZXJyb3IiLCIkdmFsaWRhdGUiLCJzY2hlbWFQcm9wIiwiZGVmYXVsdCIsInZhbHVlcyIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJpc0NvbXBpbGVkIiwicGF0dGVyblByb3BlcnRpZXMiLCJwYXR0ZXJuIiwicGF0dGVybnMiLCJwcm9wZXJ0eU5hbWVzIiwiZGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeSIsInRoZW4iLCJlbHNlIiwiJHJlZiIsImRlZmluaXRpb25zIiwiJGlkIiwiJHNjaGVtYSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCIkY29tbWVudCIsImV4YW1wbGVzIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRFbmNvZGluZyIsImRpc2NyaW1pbmF0b3IiLCJudWxsYWJsZSIsIml0ZW1zIiwic2NoZW1hSXRlbXMiLCJkYXRhTGVuZ3RoIiwic2NoZW1hSXRlbXNMZW5ndGgiLCJpdGVtc0xlbmd0aCIsIk1hdGgiLCJtaW4iLCJzY2hlbWFJdGVtIiwiZWxlbWVudHMiLCJtaW5JdGVtcyIsIm1heEl0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwidW5pcXVlSXRlbXMiLCJ1bmlxdWUiLCJTZXQiLCJpdGVtU3RyIiwiSlNPTiIsInN0cmluZ2lmeSIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJTdHJpbmciLCJoYXMiLCJhZGQiLCJjb250YWlucyIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsInBhdHRlcm5SZWdleHAiLCJmb3JtYXQiLCJpbnN0YW5jZSIsImZvcm1hdFZhbGlkYXRlIiwiZ2V0Rm9ybWF0IiwibWluaW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiZXBzaWxvbiIsImFicyIsImFyZUNsb3NlRW5vdWdoIiwicm91bmQiLCJlbnVtIiwiZW51bUl0ZW0iLCJhbGxPZiIsIkJvb2xlYW4iLCJhbnlPZiIsIm9uZU9mIiwidmFsaWRDb3VudCIsImNvbnN0IiwiaWYiLCJub3QiLCJ0eXBlcyIsImZvcm1hdHMiLCJpbW11dGFibGUiLCJ0eXBlIiwidmFsaWRhdG9yIiwiYWRkVHlwZSIsImFkZEtleXdvcmQiLCJhZGRGb3JtYXQiLCJvdmVyd3JpdGUiLCJnZXRUeXBlIiwiZ2V0S2V5d29yZCIsImNvbXBpbGUiLCJjb21waWxlZFNjaGVtYSIsImNvbXBpbGVTY2hlbWEiLCJpc1NjaGVtYUxpa2UiLCJ2YWxpZGF0ZSIsImNsb25lZERhdGEiLCJ2YWxpZCIsImRlZmluZVR5cGVFcnJvciIsInR5cGVWYWxpZGF0aW9ucyIsIm1ldGhvZE5hbWUiLCJtYXAiLCJ0IiwidHJpbSIsInB1c2giLCJ0eXBlVmFsaWRhdGlvbnNMZW5ndGgiLCJ0eXBlVmFsaWRhdGlvbiIsImtleXdvcmRWYWxpZGF0b3IiLCJwcmV2VmFsaWRhdG9yIiwic3ViS2V5IiwiaW5kZXgiXSwic291cmNlcyI6WyIuLi9saWIvdXRpbHMudHMiLCIuLi9saWIvZm9ybWF0cy50cyIsIi4uL2xpYi90eXBlcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvYXJyYXkta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvc3RyaW5nLWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL251bWJlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21waWxlZFNjaGVtYSB9IGZyb20gXCIuL2luZGV4XCI7XG5cbmludGVyZmFjZSBFcnJvclRyZWUge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZztcbiAgZGF0YT86IGFueTtcbiAgY2F1c2U/OiBFcnJvclRyZWU7XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLml0ZW0gaW4gdGhpcy5zY2hlbWEpIHtcbiAgICAgICAgc2NoZW1hUGF0aCArPSBgLyR7dGhpcy5pdGVtfWA7XG4gICAgICB9XG4gICAgICBpbnN0YW5jZVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VQYXRoID0gaW5zdGFuY2VQYXRoO1xuICAgIHRoaXMuc2NoZW1hUGF0aCA9IHNjaGVtYVBhdGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBjYXVzZSBvciB0aGUgY2F1c2UgaXMgbm90IGEgVmFsaWRhdGlvbkVycm9yLCByZXR1cm4gdGhpc1xuICAgIGlmICghdGhpcy5jYXVzZSB8fCAhKHRoaXMuY2F1c2UgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYXVzZS5fZ2V0Q2F1c2Uoc2NoZW1hUGF0aCwgaW5zdGFuY2VQYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCk6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhdXNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgY29uc3QgdHJlZTogRXJyb3JUcmVlID0ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgaXRlbTogdGhpcy5pdGVtLFxuICAgICAgc2NoZW1hUGF0aDogdGhpcy5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiB0aGlzLmluc3RhbmNlUGF0aCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jYXVzZSkge1xuICAgICAgdHJlZS5jYXVzZSA9IHRoaXMuY2F1c2UuX2dldFRyZWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGdldFRyZWUoKTogRXJyb3JUcmVlIHtcbiAgICB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRyZWUoKTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgY29uc3QgY2F1c2UgPSB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYVBhdGg6IGNhdXNlLnNjaGVtYVBhdGgsXG4gICAgICBpbnN0YW5jZVBhdGg6IGNhdXNlLmluc3RhbmNlUGF0aFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvck9wdGlvbnMge1xuICBpdGVtPzogYW55OyAvLyBGaW5hbCBpdGVtIGluIHRoZSBzY2hlbWFQYXRoXG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yOyAvLyBDYXVzZSBvZiB0aGUgZXJyb3JcbiAgZGF0YT86IGFueTsgLy8gRGF0YSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Jcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvckZ1bmN0aW9uIHtcbiAgKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IERlZmluZUVycm9yT3B0aW9ucyk6IFZhbGlkYXRpb25FcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICBrZXk6IHN0cmluZyxcbiAgc2NoZW1hOiBDb21waWxlZFNjaGVtYVxuKSB7XG4gIGNvbnN0IEtleXdvcmRFcnJvciA9IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgJHtrZXl9YCk7XG4gIEtleXdvcmRFcnJvci5rZXl3b3JkID0ga2V5O1xuICBLZXl3b3JkRXJyb3Iuc2NoZW1hID0gc2NoZW1hO1xuXG4gIGNvbnN0IGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uID0gKG1lc3NhZ2UsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIEtleXdvcmRFcnJvci5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICBLZXl3b3JkRXJyb3IuaXRlbSA9IG9wdGlvbnMuaXRlbTtcbiAgICBLZXl3b3JkRXJyb3IuY2F1c2UgPSBvcHRpb25zLmNhdXNlO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChcbiAgb2JqOiBBcnJheTxhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3RoZXI6IEFycmF5PGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSAmJiBBcnJheS5pc0FycmF5KG90aGVyKSkge1xuICAgIGlmIChvYmoubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2ldLCBvdGhlcltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG90aGVyID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvdGhlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gb3RoZXI7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhvdGhlcikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2tleV0sIG90aGVyW2tleV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmogPT09IG90aGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUNsb3NlRW5vdWdoKGEsIGIsIGVwc2lsb24gPSAxZS0xNSkge1xuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDw9IGVwc2lsb24gKiBNYXRoLm1heChNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVRGMTZMZW5ndGgoc3RyKSB7XG4gIGxldCBsZW5ndGggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGVQb2ludCA9IHN0ci5jb2RlUG9pbnRBdChpKTtcbiAgICBpZiAoY29kZVBvaW50ID4gMHhmZmZmKSB7XG4gICAgICBpKys7XG4gICAgfVxuICAgIGxlbmd0aCsrO1xuICB9XG4gIHJldHVybiBsZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqOiBhbnkpOiBhbnkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IGRlZXBDbG9uZShvYmpbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gSXMgY2xhc3MgaW5zdGFuY2Ugb2YgYW55IGtpbmRcbiAgaWYgKG9iaiAmJiBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT09IFwiT2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KG9iaikpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5vYmpcbiAgICB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwQ2xvbmUob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGlsZWRTY2hlbWEoc3ViU2NoZW1hOiBhbnkpOiBzdWJTY2hlbWEgaXMgQ29tcGlsZWRTY2hlbWEge1xuICByZXR1cm4gaXNPYmplY3Qoc3ViU2NoZW1hKSAmJiBcIiR2YWxpZGF0ZVwiIGluIHN1YlNjaGVtYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVkRnVuY3Rpb248VD4obmFtZTogc3RyaW5nLCBmbjogVCk6IFQge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBcIm5hbWVcIiwgeyB2YWx1ZTogbmFtZSB9KTtcbn1cbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICBbXCJkYXRlLXRpbWVcIl0oZGF0YSkge1xuICAgIGNvbnN0IG1hdGNoID0gZGF0YS5tYXRjaChcbiAgICAgIC9eKFxcZHs0fSktKDBbMC05XXwxWzAtMl0pLShcXGR7Mn0pVCgwWzAtOV18MVxcZHwyWzAtM10pOihbMC01XVxcZCk6KCg/OlswLTVdXFxkfDYwKSkoPzouXFxkKyk/KD86KFsrLV0pKDBbMC05XXwxXFxkfDJbMC0zXSk6KFswLTVdXFxkKXxaKT8kL2lcbiAgICApO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBkYXkgPSBOdW1iZXIobWF0Y2hbM10pO1xuXG4gICAgaWYgKG1hdGNoWzJdID09PSBcIjAyXCIgJiYgZGF5ID4gMjkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBbXG4gICAgICAsXG4gICAgICB5ZWFyU3RyLFxuICAgICAgbW9udGhTdHIsXG4gICAgICAsXG4gICAgICBob3VyU3RyLFxuICAgICAgbWludXRlU3RyLFxuICAgICAgc2Vjb25kU3RyLFxuICAgICAgdGltZXpvbmVTaWduLFxuICAgICAgdGltZXpvbmVIb3VyU3RyLFxuICAgICAgdGltZXpvbmVNaW51dGVTdHJcbiAgICBdID0gbWF0Y2g7XG5cbiAgICBsZXQgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBsZXQgbW9udGggPSBOdW1iZXIobW9udGhTdHIpO1xuICAgIGxldCBob3VyID0gTnVtYmVyKGhvdXJTdHIpO1xuICAgIGxldCBtaW51dGUgPSBOdW1iZXIobWludXRlU3RyKTtcbiAgICBsZXQgc2Vjb25kID0gTnVtYmVyKHNlY29uZFN0cik7XG5cbiAgICBpZiAodGltZXpvbmVTaWduID09PSBcIi1cIiB8fCB0aW1lem9uZVNpZ24gPT09IFwiK1wiKSB7XG4gICAgICBjb25zdCB0aW1lem9uZUhvdXIgPSBOdW1iZXIodGltZXpvbmVIb3VyU3RyKTtcbiAgICAgIGNvbnN0IHRpbWV6b25lTWludXRlID0gTnVtYmVyKHRpbWV6b25lTWludXRlU3RyKTtcblxuICAgICAgaWYgKHRpbWV6b25lU2lnbiA9PT0gXCItXCIpIHtcbiAgICAgICAgaG91ciArPSB0aW1lem9uZUhvdXI7XG4gICAgICAgIG1pbnV0ZSArPSB0aW1lem9uZU1pbnV0ZTtcbiAgICAgIH0gZWxzZSBpZiAodGltZXpvbmVTaWduID09PSBcIitcIikge1xuICAgICAgICBob3VyIC09IHRpbWV6b25lSG91cjtcbiAgICAgICAgbWludXRlIC09IHRpbWV6b25lTWludXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWludXRlID4gNTkpIHtcbiAgICAgICAgaG91ciArPSAxO1xuICAgICAgICBtaW51dGUgLT0gNjA7XG4gICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA8IDApIHtcbiAgICAgICAgaG91ciAtPSAxO1xuICAgICAgICBtaW51dGUgKz0gNjA7XG4gICAgICB9XG5cbiAgICAgIGlmIChob3VyID4gMjMpIHtcbiAgICAgICAgZGF5ICs9IDE7XG4gICAgICAgIGhvdXIgLT0gMjQ7XG4gICAgICB9IGVsc2UgaWYgKGhvdXIgPCAwKSB7XG4gICAgICAgIGRheSAtPSAxO1xuICAgICAgICBob3VyICs9IDI0O1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF5ID4gMzEpIHtcbiAgICAgICAgbW9udGggKz0gMTtcbiAgICAgICAgZGF5IC09IDMxO1xuICAgICAgfSBlbHNlIGlmIChkYXkgPCAxKSB7XG4gICAgICAgIG1vbnRoIC09IDE7XG4gICAgICAgIGRheSArPSAzMTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vbnRoID4gMTIpIHtcbiAgICAgICAgeWVhciArPSAxO1xuICAgICAgICBtb250aCAtPSAxMjtcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAxKSB7XG4gICAgICAgIHllYXIgLT0gMTtcbiAgICAgICAgbW9udGggKz0gMTI7XG4gICAgICB9XG5cbiAgICAgIGlmICh5ZWFyIDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBbMzEsICwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuICAgIGNvbnN0IG1heERheXMgPVxuICAgICAgbW9udGggPT09IDJcbiAgICAgICAgPyB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKVxuICAgICAgICAgID8gMjlcbiAgICAgICAgICA6IDI4XG4gICAgICAgIDogZGF5c0luTW9udGhbbW9udGggLSAxXTtcblxuICAgIGlmIChkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTGVhcCBzZWNvbmRzXG4gICAgaWYgKHNlY29uZCA9PT0gNjAgJiYgKG1pbnV0ZSAhPT0gNTkgfHwgaG91ciAhPT0gMjMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHVyaShkYXRhKSB7XG4gICAgcmV0dXJuIC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC8udGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiAvXig/IVxcLikoPyEuKlxcLiQpW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjB9KD86XFwuW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjF9KXswLDJ9QFthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyg/OlxcLlthLXowLTldKD86W2EtejAtOS1dezAsNjB9W2EtejAtOV0pPyl7MCwzfSQvaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIGlwdjQoZGF0YSkge1xuICAgIC8vIE1hdGNoZXMgYSBzdHJpbmcgZm9ybWVkIGJ5IDQgbnVtYmVycyBiZXR3ZWVuIDAgYW5kIDI1NSBzZXBhcmF0ZWQgYnkgZG90cyB3aXRob3V0IGxlYWRpbmcgemVyb3NcbiAgICAvLyAvXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC9cbiAgICByZXR1cm4gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKSQvLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcblxuICAvLyBpcHY2OiBpc015SXBWYWxpZCh7IHZlcnNpb246IDYgfSksXG4gIGlwdjYoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIjo6XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRhdGEuaW5kZXhPZihcIjpcIikgPT09IC0xIHx8XG4gICAgICAvKD86XFxzK3w6OjorfF5cXHd7NSx9fFxcd3s1fSR8Xjp7MX1cXHd8XFx3OnsxfSQpLy50ZXN0KGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzSXB2NCA9IGRhdGEuaW5kZXhPZihcIi5cIikgIT09IC0xO1xuICAgIGxldCBhZGRyZXNzUGFydHMgPSBkYXRhO1xuXG4gICAgaWYgKGhhc0lwdjQpIHtcbiAgICAgIGFkZHJlc3NQYXJ0cyA9IGRhdGEuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgaXB2NFBhcnQgPSBhZGRyZXNzUGFydHMucG9wKCk7XG4gICAgICBpZiAoXG4gICAgICAgICEvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC8udGVzdChcbiAgICAgICAgICBpcHY0UGFydFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2hvcnRlbmVkID0gZGF0YS5pbmRleE9mKFwiOjpcIikgIT09IC0xO1xuICAgIGNvbnN0IGlwdjZQYXJ0ID0gaGFzSXB2NCA/IGFkZHJlc3NQYXJ0cy5qb2luKFwiOlwiKSA6IGRhdGE7XG5cbiAgICBpZiAoaXNTaG9ydGVuZWQpIHtcbiAgICAgIGlmIChpcHY2UGFydC5zcGxpdChcIjo6XCIpLmxlbmd0aCAtIDEgPiAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEvXlswLTlhLWZBLUY6Ll0qJC8udGVzdChpcHY2UGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gL14oPzooPzooPzpbMC05YS1mQS1GXXsxLDR9KD86OnwkKSl7MSw2fSkpfCg/Ojo6KD86WzAtOWEtZkEtRl17MSw0fSkpezAsNX0kLy50ZXN0KFxuICAgICAgICBpcHY2UGFydFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0lwdjZWYWxpZCA9XG4gICAgICAvXig/Oig/OlswLTlhLWZBLUZdezEsNH06KXs3fSg/OlswLTlhLWZBLUZdezEsNH18OikpJC8udGVzdChpcHY2UGFydCk7XG5cbiAgICBjb25zdCBoYXNJbnZhbGlkQ2hhciA9IC8oPzpbMC05YS1mQS1GXXs1LH18XFxEWzAtOWEtZkEtRl17M306KS8udGVzdChcbiAgICAgIGlwdjZQYXJ0XG4gICAgKTtcblxuICAgIGlmIChoYXNJcHY0KSB7XG4gICAgICByZXR1cm4gaXNJcHY2VmFsaWQgfHwgIWhhc0ludmFsaWRDaGFyO1xuICAgIH1cblxuICAgIHJldHVybiBpc0lwdjZWYWxpZCAmJiAhaGFzSW52YWxpZENoYXI7XG4gIH0sXG5cbiAgaG9zdG5hbWUoZGF0YSkge1xuICAgIHJldHVybiAvXlthLXowLTldW2EtejAtOS1dezAsNjJ9KD86XFwuW2EtejAtOV1bYS16MC05LV17MCw2Mn0pKlthLXowLTldJC9pLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgaWYgKC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLy50ZXN0KGRhdGEpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOYU4obmV3IERhdGUoZGF0YSkuZ2V0VGltZSgpKTtcbiAgfSxcbiAgcmVnZXgoZGF0YSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgUmVnRXhwKGRhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgXCJqc29uLXBvaW50ZXJcIihkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAvXlxcLyg/Oltefl18fjB8fjEpKiQvLnRlc3QoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gL14oWzAtOV0rKSgjfFxcLyg/Oltefl18fjB8fjEpKik/JC8udGVzdChkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIC9eKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkoXFwuXFxkKyk/KFp8KFsrLV0pKFxcZHsyfSk6KFxcZHsyfSkpJC8udGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuICBcInVyaS1yZWZlcmVuY2VcIihkYXRhKSB7XG4gICAgaWYgKC9cXFxcLy50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIFwidXJpLXRlbXBsYXRlXCIoZGF0YSkge1xuICAgIHJldHVybiAvXig/Oig/Omh0dHBzPzpcXC9cXC9bXFx3Li1dKyk/XFwvPyk/W1xcdy0gOywuXFwvPyUmPV0qKD86XFx7W1xcdy1dKyg/OjpcXGQrKT9cXH1bXFx3LSA7LC5cXC8/JSY9XSopKlxcLz8kLy50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG5cbiAgLy8gTm90IHN1cHBvcnRlZCB5ZXRcbiAgZHVyYXRpb246IGZhbHNlLFxuICB1dWlkOiBmYWxzZSxcbiAgXCJpZG4tZW1haWxcIjogZmFsc2UsXG4gIFwiaWRuLWhvc3RuYW1lXCI6IGZhbHNlLFxuICBpcmk6IGZhbHNlLFxuICBcImlyaS1yZWZlcmVuY2VcIjogZmFsc2Vcbn07XG4iLCJpbXBvcnQgeyBUeXBlRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgVHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgb2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICBkYXRhICE9PSBudWxsICYmXG4gICAgICBcImxlbmd0aFwiIGluIGRhdGEgJiZcbiAgICAgIFwiMFwiIGluIGRhdGEgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCAtIDEgPT09IGRhdGEubGVuZ3RoXG4gICAgKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVuaXQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1bml0MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVuaXQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxuXG5cbn07XG4iLCJpbXBvcnQgeyBBcnJheUtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvYXJyYXkta2V5d29yZHNcIjtcbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgeyBOdW1iZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL251bWJlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT2JqZWN0S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHNcIjtcbmltcG9ydCB7IE90aGVyS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgU3RyaW5nS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9zdHJpbmcta2V5d29yZHNcIjtcblxuZXhwb3J0IGNvbnN0IGtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC4uLk9iamVjdEtleXdvcmRzLFxuICAuLi5BcnJheUtleXdvcmRzLFxuICAuLi5TdHJpbmdLZXl3b3JkcyxcbiAgLi4uTnVtYmVyS2V5d29yZHMsXG4gIC4uLk90aGVyS2V5d29yZHNcbn07XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE9iamVjdEtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC8vIE9iamVjdFxuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMpKSB7XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYVByb3ApICYmIFwiZGVmYXVsdFwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBkYXRhW2tleV0gPSBzY2hlbWFQcm9wLmRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLnByb3BlcnRpZXNba2V5XSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0pIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucHJvcGVydGllc1trZXldLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHZhbHVlcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEudmFsdWVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS52YWx1ZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoIDw9IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIG1hbnkgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWluUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJUb28gZmV3IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgIGNvbnN0IGlzQ29tcGlsZWQgPSBpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzICYmIHNjaGVtYS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBpbiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgICBpZiAobmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIikudGVzdChrZXkpKSB7XG4gICAgICAgICAgICBtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQ29tcGlsZWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwYXR0ZXJuUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgaWYgKFwiJHZhbGlkYXRlXCIgaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5dKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXS4kdmFsaWRhdGUoXG4gICAgICAgICAgICAgIGRhdGFba2V5XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcHJvcGVydHlOYW1lcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBmYWxzZSAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnRpZXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnByb3BlcnR5TmFtZXMpKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wcm9wZXJ0eU5hbWVzLiR2YWxpZGF0ZShrZXkpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBuYW1lIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZGVwZW5kZW5jaWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLmRlcGVuZGVuY2llcykge1xuICAgICAgaWYgKGtleSBpbiBkYXRhID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHNjaGVtYS5kZXBlbmRlbmNpZXNba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlcGVuZGVuY3kpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwZW5kZW5jeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghKGRlcGVuZGVuY3lbaV0gaW4gZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICAgIGRhdGE6IGRlcGVuZGVuY3lbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwgeyBkYXRhOiBkZXBlbmRlbmN5IH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlcGVuZGVuY3kgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IGRlcGVuZGVuY3kuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIC8vIFJlcXVpcmVkIGJ5IG90aGVyIGtleXdvcmRzIGJ1dCBub3QgdXNlZCBhcyBhIGZ1bmN0aW9uIGl0c2VsZlxuICB0aGVuOiBmYWxzZSxcbiAgZWxzZTogZmFsc2UsXG4gIGRlZmF1bHQ6IGZhbHNlLFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgJHJlZjogZmFsc2UsXG4gIGRlZmluaXRpb25zOiBmYWxzZSxcbiAgJGlkOiBmYWxzZSxcbiAgJHNjaGVtYTogZmFsc2UsXG5cbiAgLy8gTWV0YWRhdGEga2V5d29yZHMgKG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24pXG4gIHRpdGxlOiBmYWxzZSxcbiAgZGVzY3JpcHRpb246IGZhbHNlLFxuICAkY29tbWVudDogZmFsc2UsXG4gIGV4YW1wbGVzOiBmYWxzZSxcbiAgY29udGVudE1lZGlhVHlwZTogZmFsc2UsXG4gIGNvbnRlbnRFbmNvZGluZzogZmFsc2UsXG5cbiAgLy8gTm90IHN1cHBvcnRlZCBPcGVuIEFQSSBrZXl3b3Jkc1xuICBkaXNjcmltaW5hdG9yOiBmYWxzZSxcbiAgbnVsbGFibGU6IGZhbHNlXG59O1xuIiwiaW1wb3J0IHsgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBBcnJheUtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYUl0ZW1zKSkge1xuICAgICAgY29uc3Qgc2NoZW1hSXRlbXNMZW5ndGggPSBzY2hlbWFJdGVtcy5sZW5ndGg7XG4gICAgICBjb25zdCBpdGVtc0xlbmd0aCA9IE1hdGgubWluKHNjaGVtYUl0ZW1zTGVuZ3RoLCBkYXRhTGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoc2NoZW1hSXRlbSA9PT0gZmFsc2UgJiYgdHlwZW9mIGRhdGFbaV0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWFJdGVtKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hSXRlbS4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hSXRlbXMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYUl0ZW1zLiR2YWxpZGF0ZShkYXRhW2ldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZWxlbWVudHMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxlbWVudHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5lbGVtZW50cy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5JdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8IGRhdGEubGVuZ3RoID49IHNjaGVtYS5taW5JdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBzaG9ydFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4SXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA8PSBzY2hlbWEubWF4SXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIXNjaGVtYS5pdGVtcyB8fCBpc09iamVjdChzY2hlbWEuaXRlbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiBzY2hlbWEuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykpIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzY2hlbWEuaXRlbXMubGVuZ3RoOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgdW5pcXVlSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5pcXVlID0gbmV3IFNldCgpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcbiAgICAgIGxldCBpdGVtU3RyO1xuXG4gICAgICAvLyBDaGFuZ2Ugc3RyaW5nIHRvIFwic3RyaW5nXCIgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzXG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaXRlbVN0ciA9IGBzOiR7aXRlbX1gO1xuICAgICAgICAvLyBTb3J0IG9iamVjdCBrZXlzIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpdGVtKSkge1xuICAgICAgICBpdGVtU3RyID0gYG86JHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhpdGVtKS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgICAgIClcbiAgICAgICAgKX1gO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1TdHIgPSBKU09OLnN0cmluZ2lmeShpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1TdHIgPSBTdHJpbmcoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bmlxdWUuaGFzKGl0ZW1TdHIpKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgIH1cbiAgICAgIHVuaXF1ZS5hZGQoaXRlbVN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFN0cmluZ0tleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5MZW5ndGgoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgc2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4TGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgcGF0dGVybihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVyblJlZ2V4cCA9IG5ldyBSZWdFeHAoc2NoZW1hLnBhdHRlcm4sIFwidVwiKTtcblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwIGluc3RhbmNlb2YgUmVnRXhwID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwLnRlc3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpZiB3ZSByZWNlaXZlIGEgZm9ybWF0IHRoYXQgaXMgbm90IGRlZmluZWQsIHdlXG4gIC8vIHdpbGwgbm90IHRocm93IGFuIGVycm9yLCB3ZSBqdXN0IGlnbm9yZSBpdC5cbiAgZm9ybWF0KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSB8fCBmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBhcmVDbG9zZUVub3VnaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgTnVtYmVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIG1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWluID0gc2NoZW1hLm1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWluID0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSB0cnVlKSB7XG4gICAgICBtaW4gKz0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPCBtaW4pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWF4ID0gc2NoZW1hLm1heGltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWF4ID0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gLSAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID09PSB0cnVlKSB7XG4gICAgICBtYXggLT0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPiBtYXgpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG11bHRpcGxlT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdW90aWVudCA9IGRhdGEgLyBzY2hlbWEubXVsdGlwbGVPZjtcblxuICAgIGlmICghaXNGaW5pdGUocXVvdGllbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhcmVDbG9zZUVub3VnaChxdW90aWVudCwgTWF0aC5yb3VuZChxdW90aWVudCkpKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbXVsdGlwbGVPZlwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1pbmltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA8PSBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSArIDFlLTE1KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1pbmltdW1cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1heGltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA+PSBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFxuICAgICAgICBcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhjbHVzaXZlTWF4aW11bVwiLFxuICAgICAgICB7IGRhdGEgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBkZWVwRXF1YWwsIGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgT3RoZXJLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgZW51bShzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhbiBhcnJheSBvciBhbiBvYmplY3RcbiAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICBjb25zdCBpc09iamVjdCA9IHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5lbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnVtSXRlbSA9IHNjaGVtYS5lbnVtW2ldO1xuXG4gICAgICAvLyBTaW1wbGUgZXF1YWxpdHkgY2hlY2tcbiAgICAgIGlmIChlbnVtSXRlbSA9PT0gZGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGRhdGEgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjaGVjayBmb3IgZGVlcCBlcXVhbGl0eVxuICAgICAgaWYgKFxuICAgICAgICAoaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KGVudW1JdGVtKSkgfHxcbiAgICAgICAgKGlzT2JqZWN0ICYmIHR5cGVvZiBlbnVtSXRlbSA9PT0gXCJvYmplY3RcIiAmJiBlbnVtSXRlbSAhPT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBpZiAoZGVlcEVxdWFsKGVudW1JdGVtLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYWxsT2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYWxsT2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFsbE9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFsbE9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSAhPT0gc2NoZW1hLmFsbE9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBhbnlPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYW55T2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYW55T2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFueU9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFueU9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLm9uZU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm9uZU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5vbmVPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEub25lT2ZbaV0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgPT09IHNjaGVtYS5vbmVPZltpXSkge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhID09PSBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRDb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgY29uc3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcbiAgICAgIGRhdGEgPT09IHNjaGVtYS5jb25zdCB8fFxuICAgICAgKGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzT2JqZWN0KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgaWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm5vdCkpIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEubm90LiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQge1xuICBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIGRlZXBDbG9uZSxcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIGlzT2JqZWN0XG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHMgfSBmcm9tIFwiLi9mb3JtYXRzXCI7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzXCI7XG5cbmV4cG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHZvaWQgfCBWYWxpZGF0aW9uRXJyb3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHsgZGF0YTogYW55OyBlcnJvcjogVmFsaWRhdGlvbkVycm9yIHwgbnVsbDsgdmFsaWQ6IGJvb2xlYW4gfTtcbiAgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hO1xufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hU2hpZWxkIHtcbiAgcHJpdmF0ZSB0eXBlczogUmVjb3JkPHN0cmluZywgVHlwZUZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgZm9ybWF0czogUmVjb3JkPHN0cmluZywgRm9ybWF0RnVuY3Rpb24gfCBmYWxzZT4gPSB7fTtcbiAgcHJpdmF0ZSBrZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgaW1tdXRhYmxlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGltbXV0YWJsZSA9IGZhbHNlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICB0aGlzLmltbXV0YWJsZSA9IGltbXV0YWJsZTtcblxuICAgIGZvciAoY29uc3QgW3R5cGUsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoVHlwZXMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkVHlwZSh0eXBlLCB2YWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoa2V5d29yZHMpKSB7XG4gICAgICB0aGlzLmFkZEtleXdvcmQoa2V5d29yZCwgdmFsaWRhdG9yIGFzIEtleXdvcmRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZm9ybWF0LCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKEZvcm1hdHMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkRm9ybWF0KGZvcm1hdCwgdmFsaWRhdG9yIGFzIEZvcm1hdEZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRUeXBlKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMudHlwZXNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVHlwZSBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLnR5cGVzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0VHlwZSh0eXBlOiBzdHJpbmcpOiBUeXBlRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZXNbdHlwZV07XG4gIH1cblxuICBhZGRGb3JtYXQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmZvcm1hdHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgRm9ybWF0IFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMuZm9ybWF0c1tuYW1lXSA9IHZhbGlkYXRvcjtcbiAgfVxuXG4gIGdldEZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdHNbZm9ybWF0XTtcbiAgfVxuXG4gIGFkZEtleXdvcmQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEtleXdvcmRGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5rZXl3b3Jkc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBLZXl3b3JkIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMua2V5d29yZHNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRLZXl3b3JkKGtleXdvcmQ6IHN0cmluZyk6IEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5rZXl3b3Jkc1trZXl3b3JkXTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgaWYgKCFjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWEpID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiSW52YWxpZCBzY2hlbWFcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgIFwiYW55XCIsXG4gICAgICAgICgpID0+IHt9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICBjb25zdCBjbG9uZWREYXRhID0gdGhpcy5pbW11dGFibGUgPyBkZWVwQ2xvbmUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgZXJyb3IgPSBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUoY2xvbmVkRGF0YSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGNsb25lZERhdGEsXG4gICAgICAgIGVycm9yOiBlcnJvciA/IGVycm9yIDogbnVsbCxcbiAgICAgICAgdmFsaWQ6ICFlcnJvclxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuY29tcGlsZWRTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdHJ1ZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgYW55T2Y6IFt7fV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtdXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtzY2hlbWFdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hID0gZGVlcENsb25lKHNjaGVtYSkgYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgY29uc3QgZGVmaW5lVHlwZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXCJ0eXBlXCIsIHNjaGVtYSk7XG4gICAgY29uc3QgdHlwZVZhbGlkYXRpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuXG4gICAgbGV0IG1ldGhvZE5hbWUgPSBcIlwiO1xuXG4gICAgaWYgKFwidHlwZVwiIGluIHNjaGVtYSkge1xuICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKVxuICAgICAgICA/IHNjaGVtYS50eXBlXG4gICAgICAgIDogc2NoZW1hLnR5cGUuc3BsaXQoXCIsXCIpLm1hcCgodCkgPT4gdC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRpb25zLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICBtZXRob2ROYW1lICs9IChtZXRob2ROYW1lID8gXCJfT1JfXCIgOiBcIlwiKSArIHZhbGlkYXRvci5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9IHR5cGVWYWxpZGF0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdGlvbiA9IHR5cGVWYWxpZGF0aW9uc1swXTtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR5cGVWYWxpZGF0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVZhbGlkYXRpb25zTGVuZ3RoID4gMSkge1xuICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVZhbGlkYXRpb25zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkpIHtcbiAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLnR5cGUgPSBzY2hlbWEudHlwZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXdvcmRWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoa2V5KTtcbiAgICAgIGlmIChrZXl3b3JkVmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoa2V5LCBzY2hlbWFba2V5XSk7XG4gICAgICAgIGlmIChjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgICAgICBjb25zdCBwcmV2VmFsaWRhdG9yID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlO1xuICAgICAgICAgIG1ldGhvZE5hbWUgKz0gYF9BTkRfJHtrZXl3b3JkVmFsaWRhdG9yLm5hbWV9YDtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcHJldlZhbGlkYXRvcihkYXRhKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWV0aG9kTmFtZSA9IGtleXdvcmRWYWxpZGF0b3IubmFtZTtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PlxuICAgICAgICAgICAgICAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIC8vIElmIHRoZSBrZXkgaXMgcHJvcGVydGllcyBnbyB0aHJvdWdoIGVhY2ggcHJvcGVydHkgYW5kIHRyeSB0byBjb21waWxlIGl0IGFzIGEgc2NoZW1hXG4gICAgICAgIGlmIChrZXkgPT09IFwicHJvcGVydGllc1wiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdWJLZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoXG4gICAgICAgICAgICAgIHNjaGVtYVtrZXldW3N1YktleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XS5tYXAoKHN1YlNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgdGhpcy5pc1NjaGVtYUxpa2Uoc3ViU2NoZW1hKVxuICAgICAgICAgICAgPyB0aGlzLmNvbXBpbGVTY2hlbWEoc3ViU2NoZW1hKVxuICAgICAgICAgICAgOiBzdWJTY2hlbWFcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGlsZWRTY2hlbWEgYXMgQ29tcGlsZWRTY2hlbWE7XG4gIH1cblxuICBpc1NjaGVtYUxpa2Uoc3ViU2NoZW1hOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoaXNPYmplY3Qoc3ViU2NoZW1hKSkge1xuICAgICAgaWYgKFwidHlwZVwiIGluIHN1YlNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc3ViS2V5IGluIHN1YlNjaGVtYSkge1xuICAgICAgICBpZiAoc3ViS2V5IGluIHRoaXMua2V5d29yZHMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxJQUFLQyxFQUFrQixLQUNqRCxJQUFJTixFQUFhLEdBQUdLLEtBQVdFLEtBQUtULFVBQ2hDRyxFQUFlLEdBQUdLLElBWXRCLFlBWHlCLElBQWRDLEtBQUtWLE9BQ1csaUJBQWRVLEtBQUtWLE1BQXFCVSxLQUFLVixRQUFRVSxLQUFLSixTQUNyREgsR0FBYyxJQUFJTyxLQUFLVixRQUV6QkksR0FBZ0IsSUFBSU0sS0FBS1YsUUFHM0JVLEtBQUtOLGFBQWVBLEVBQ3BCTSxLQUFLUCxXQUFhQSxFQUdiTyxLQUFLUixPQUFXUSxLQUFLUixpQkFBaUJMLEVBSXBDYSxLQUFLUixNQUFNSyxVQUFVSixFQUFZQyxHQUgvQk0sSUFJWCxDQUVBQyxXQUNFLE9B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
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJGQUlMX0ZBU1RfREVGSU5FX0VSUk9SIiwiZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkiLCJrZXkiLCJmYWlsRmFzdCIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiaXNDb21waWxlZFNjaGVtYSIsInN1YlNjaGVtYSIsIkFycmF5IiwiaXNBcnJheSIsIm5hbWUiLCJmbiIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJVVUlEX1JFR0VYIiwiRFVSQVRJT05fUkVHRVgiLCJVUklfUkVHRVgiLCJFTUFJTF9SRUdFWCIsIkhPU1ROQU1FX1JFR0VYIiwiREFURV9SRUdFWCIsIlRJTUVfUkVHRVgiLCJVUklfUkVGRVJFTkNFX1JFR0VYIiwiSVJJX1JFR0VYIiwiSVJJX1JFRkVSRU5DRV9SRUdFWCIsIklETl9FTUFJTF9SRUdFWCIsIklETl9IT1NUTkFNRV9SRUdFWCIsIkRBWVNfSU5fTU9OVEgiLCJwYXJzZVR3b0RpZ2l0cyIsImluZGV4IiwiZmlyc3QiLCJjaGFyQ29kZUF0Iiwic2Vjb25kIiwiaXNWYWxpZElwdjRSYW5nZSIsInN0YXJ0IiwiZW5kIiwic2VnbWVudENvdW50Iiwic2VnbWVudFN0YXJ0IiwiaSIsInNlZ21lbnRMZW5ndGgiLCJqIiwiZGlnaXQiLCJGb3JtYXRzIiwibGVuZ3RoIiwidENvZGUiLCJ5ZWFyIiwiYSIsImIiLCJjIiwiZCIsInBhcnNlRm91ckRpZ2l0cyIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsImN1cnNvciIsIm9mZnNldFNpZ24iLCJvZmZzZXRIb3VyIiwib2Zmc2V0TWludXRlIiwiZnJhY1N0YXJ0IiwiY29kZSIsInR6Q29kZSIsIm1heERheXMiLCJ1dGNUb3RhbE1pbnV0ZXMiLCJvZmZzZXRUb3RhbE1pbnV0ZXMiLCJ1cmkiLCJ0ZXN0IiwiZW1haWwiLCJpcHY0IiwiaXNWYWxpZElwdjQiLCJpcHY2IiwiaGFzQ29sb24iLCJoYXNEb3VibGVDb2xvbiIsImhleHRldENvdW50IiwiaXNWYWxpZElwdjYiLCJob3N0bmFtZSIsImRhdGUiLCJtYXRjaCIsImV4ZWMiLCJ5ZWFyU3RyIiwibW9udGhTdHIiLCJkYXlTdHIiLCJOdW1iZXIiLCJyZWdleCIsIlJlZ0V4cCIsImUiLCJuZXh0IiwiaXNWYWxpZEpzb25Qb2ludGVyIiwiaXNWYWxpZFJlbGF0aXZlSnNvblBvaW50ZXIiLCJ0aW1lIiwiaW5jbHVkZXMiLCJjbG9zZUluZGV4IiwiaW5kZXhPZiIsImlzVmFsaWRVcmlUZW1wbGF0ZSIsImR1cmF0aW9uIiwidXVpZCIsImlyaSIsIlR5cGVzIiwib2JqZWN0IiwiYXJyYXkiLCJzdHJpbmciLCJudW1iZXIiLCJpbnRlZ2VyIiwiYm9vbGVhbiIsIm51bGwiLCJ0aW1lc3RhbXAiLCJpbnQ4IiwidWludDgiLCJpbnQxNiIsInVpbnQxNiIsImludDMyIiwidWludDMyIiwiZmxvYXQzMiIsImZsb2F0NjQiLCJoYXNDaGFuZ2VkIiwicHJldiIsImN1cnJlbnQiLCJpcyIsImlzVW5pcXVlUHJpbWl0aXZlIiwiZ2V0QXJyYXlCdWNrZXRLZXkiLCJsYXN0IiwiZmlyc3RUeXBlIiwibGFzdFR5cGUiLCJmaXJzdEFycmF5TWFya2VyIiwiZmlyc3RTaWduYXR1cmUiLCJnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZSIsImxhc3RBcnJheU1hcmtlciIsImxhc3RTaWduYXR1cmUiLCJnZXRPYmplY3RTaGFwZUtleSIsImtleXMiLCJzb3J0Iiwiam9pbiIsInNpZ25hdHVyZSIsImlzTmFOIiwiQXJyYXlLZXl3b3JkcyIsIml0ZW1zIiwiZGVmaW5lRXJyb3IiLCJzY2hlbWFJdGVtcyIsImRhdGFMZW5ndGgiLCJzY2hlbWFJdGVtc0xlbmd0aCIsIml0ZW1zTGVuZ3RoIiwic2NoZW1hSXRlbSIsInZhbGlkYXRlIiwiJHZhbGlkYXRlIiwiZXJyb3IiLCJlbGVtZW50cyIsImVsZW1lbnRzU2NoZW1hIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsImFkZGl0aW9uYWxJdGVtcyIsInR1cGxlTGVuZ3RoIiwiX3R1cGxlSXRlbXNMZW5ndGgiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ1bmlxdWVJdGVtcyIsImxlbiIsImxlZnQiLCJyaWdodCIsInByaW1pdGl2ZVNlZW4iLCJTZXQiLCJwcmltaXRpdmVBcnJheVNpZ25hdHVyZXMiLCJhcnJheUJ1Y2tldHMiLCJvYmplY3RCdWNrZXRzIiwiaGFzIiwiYWRkIiwiTWFwIiwiYnVja2V0S2V5IiwiY2FuZGlkYXRlcyIsImdldCIsInNldCIsInB1c2giLCJjb250YWlucyIsImNvbnRhaW5zVmFsaWRhdGUiLCJkZWVwQ2xvbmVVbmZyZWV6ZSIsIm9iaiIsImNsb25lQ2xhc3NJbnN0YW5jZXMiLCJzZWVuIiwiV2Vha01hcCIsInNvdXJjZSIsInN0cnVjdHVyZWRDbG9uZSIsIkJ1ZmZlciIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJwcm90b3R5cGUiLCJpc1BsYWluT2JqZWN0IiwiRGF0ZSIsIkFycmF5QnVmZmVyIiwiaXNWaWV3IiwiY2xvbmVkIiwiY2xvbmUiLCJsIiwiZ2V0VGltZSIsImZsYWdzIiwiZW50cmllcyIsInZhbHVlcyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJidWZmZXIiLCJmcm9tIiwiUHJvbWlzZSIsIldlYWtTZXQiLCJjcmVhdGUiLCJSZWZsZWN0Iiwib3duS2V5cyIsImRlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlc2NyaXB0b3IiLCJOdW1iZXJLZXl3b3JkcyIsIm1pbmltdW0iLCJpbnN0YW5jZSIsIm1pbiIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiZXBzaWxvbiIsIk1hdGgiLCJhYnMiLCJhcmVDbG9zZUVub3VnaCIsInJvdW5kIiwiUkVHRVhfTUVUQV9DSEFSUyIsImhhc1JlZ2V4TWV0YSIsIlBBVFRFUk5fQ0FDSEUiLCJjb21waWxlUGF0dGVybk1hdGNoZXIiLCJwYXR0ZXJuIiwiY2FjaGVkIiwiY29tcGlsZWQiLCJfdmFsdWUiLCJwYXR0ZXJuTGVuZ3RoIiwiaW5uZXIiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCIsImdldFBhdHRlcm5Qcm9wZXJ0eUVudHJpZXMiLCJfcGF0dGVyblByb3BlcnR5RW50cmllcyIsInBhdHRlcm5Qcm9wZXJ0aWVzIiwicGF0dGVybktleXMiLCJjb21waWxlZE1hdGNoZXIiLCJzY2hlbWFQcm9wIiwiZ2V0UGF0dGVybktleU1hdGNoSW5kZXhlcyIsImNhY2hlIiwiX3BhdHRlcm5LZXlNYXRjaEluZGV4Q2FjaGUiLCJpbmRleGVzIiwic2l6ZSIsImdldEJyYW5jaEVudHJpZXMiLCJjYWNoZUtleSIsImtpbmQiLCJrZXl3b3JkcyIsInJlcXVpcmVkIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicHJvcGVydGllcyIsInByb3BLZXlzIiwiX3Byb3BLZXlzIiwicmVxdWlyZWRTZXQiLCJfcmVxdWlyZWRTZXQiLCJkZWZhdWx0IiwidmFsdWVTY2hlbWEiLCJtYXhQcm9wZXJ0aWVzIiwiY291bnQiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJhcFZhbGlkYXRlIiwiX2FwVmFsaWRhdGUiLCJwYXR0ZXJuRW50cmllcyIsIm1hdGNoaW5nSW5kZXhlcyIsInByb3BlcnR5TmFtZXMiLCJwbiIsImRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3kiLCJ0aGVuIiwiZWxzZSIsImRlZmluaXRpb25zIiwiJGlkIiwiJHNjaGVtYSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCIkY29tbWVudCIsImV4YW1wbGVzIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRFbmNvZGluZyIsImRpc2NyaW1pbmF0b3IiLCJudWxsYWJsZSIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsInBhdHRlcm5NYXRjaCIsIl9wYXR0ZXJuTWF0Y2giLCJwYXR0ZXJuTWF0Y2hDYWNoZSIsIl9wYXR0ZXJuTWF0Y2hDYWNoZSIsImlzTWF0Y2giLCJmb3JtYXQiLCJmb3JtYXRWYWxpZGF0ZSIsIl9mb3JtYXRWYWxpZGF0ZSIsImZvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCIsIl9mb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQiLCJmb3JtYXRSZXN1bHRDYWNoZSIsIl9mb3JtYXRSZXN1bHRDYWNoZSIsImdldEZvcm1hdCIsImlzRGVmYXVsdEZvcm1hdFZhbGlkYXRvciIsImlzVmFsaWQiLCJlbnVtIiwiZW51bUNhY2hlIiwiX2VudW1DYWNoZSIsInByaW1pdGl2ZVNldCIsIm9iamVjdFZhbHVlcyIsImxpc3QiLCJlbnVtSXRlbSIsImFsbE9mIiwiYnJhbmNoZXMiLCJvbmx5QnJhbmNoIiwiYnJhbmNoIiwiYW55T2YiLCJvbmVPZiIsInZhbGlkQ291bnQiLCJjb25zdCIsImlmIiwibm90IiwiJHJlZiIsIl9yZXNvbHZlZFJlZiIsInJlZlBhdGgiLCJ0YXJnZXRTY2hlbWEiLCJnZXRTY2hlbWFSZWYiLCJnZXRTY2hlbWFCeUlkIiwidHlwZXMiLCJmb3JtYXRzIiwiaW1tdXRhYmxlIiwicm9vdFNjaGVtYSIsImlkUmVnaXN0cnkiLCJ0eXBlIiwidmFsaWRhdG9yIiwiYWRkVHlwZSIsImFkZEtleXdvcmQiLCJhZGRGb3JtYXQiLCJvdmVyd3JpdGUiLCJnZXRUeXBlIiwiZ2V0S2V5d29yZCIsInBhdGgiLCJyb290IiwicGFydHMiLCJzcGxpdCIsInBhcnQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlIiwiZGVmcyIsInJlc29sdmVQYXRoIiwiaWQiLCJjb21waWxlIiwiY2xlYXIiLCJjb21waWxlZFNjaGVtYSIsImNvbXBpbGVTY2hlbWEiLCJfaGFzUmVmIiwibGlua1JlZmVyZW5jZXMiLCJpc1NjaGVtYUxpa2UiLCJjbG9uZWREYXRhIiwicmVzIiwidmFsaWQiLCJpc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSIsInNoYWxsb3dBcnJheUVxdWFscyIsImZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzIiwib3V0IiwibmVzdGVkIiwiZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZiIsIm5vcm1hbGl6ZVNjaGVtYUZvckNvbXBpbGUiLCJub3JtYWxpemVkIiwic2NoZW1hS2V5cyIsImhhc09ubHlLZXkiLCJzZXROb3JtYWxpemVkIiwiZmxhdHRlbmVkQWxsT2YiLCJmaWx0ZXIiLCJmbGF0dGVuZWRBbnlPZiIsImZsYXR0ZW5lZE9uZU9mIiwibWFya1NjaGVtYUhhc1JlZiIsInNob3VsZFNraXBLZXl3b3JkIiwiaGFzUmVxdWlyZWREZWZhdWx0cyIsImlzRGVmYXVsdFR5cGVWYWxpZGF0b3IiLCJzY2hlbWFIYXNSZWYiLCJyZWZWYWxpZGF0b3IiLCJ2YWxpZGF0b3JzIiwiYWN0aXZlTmFtZXMiLCJkZWZpbmVUeXBlRXJyb3IiLCJtYXAiLCJ0IiwidHJpbSIsInR5cGVGdW5jdGlvbnMiLCJ0eXBlTmFtZXMiLCJkZWZhdWx0VHlwZU5hbWVzIiwiY29tYmluZWRUeXBlVmFsaWRhdG9yIiwiYWxsVHlwZXNEZWZhdWx0IiwidHlwZU1ldGhvZE5hbWUiLCJzaW5nbGVUeXBlTmFtZSIsImlzSW50ZWdlciIsInNpbmdsZVR5cGVGbiIsImFsbG93c09iamVjdCIsImFsbG93c0FycmF5IiwiYWxsb3dzU3RyaW5nIiwiYWxsb3dzTnVtYmVyIiwiYWxsb3dzSW50ZWdlciIsImFsbG93c0Jvb2xlYW4iLCJhbGxvd3NOdWxsIiwiZGF0YVR5cGUiLCJvdGhlcktleXMiLCJrZXlPcmRlciIsImtleXdvcmRGbiIsImZuTmFtZSIsImxpdGVyYWxLZXl3b3JkcyIsImNvbXBpbGVkU3ViU2NoZW1hIiwic3ViS2V5IiwidiIsImNvbXBvc2l0ZU5hbWUiLCJtYXN0ZXJWYWxpZGF0b3IiLCJzdGFjayIsIm5vZGUiLCJwb3AiLCJ0YXJnZXQiLCJfZGF0YSJdLCJzb3VyY2VzIjpbIi4uL2xpYi91dGlscy9tYWluLXV0aWxzLnRzIiwiLi4vbGliL2Zvcm1hdHMudHMiLCIuLi9saWIvdHlwZXMudHMiLCIuLi9saWIvdXRpbHMvaGFzLWNoYW5nZWQudHMiLCIuLi9saWIva2V5d29yZHMvYXJyYXkta2V5d29yZHMudHMiLCIuLi9saWIvdXRpbHMvZGVlcC1mcmVlemUudHMiLCIuLi9saWIva2V5d29yZHMvbnVtYmVyLWtleXdvcmRzLnRzIiwiLi4vbGliL3V0aWxzL3BhdHRlcm4tbWF0Y2hlci50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb3RoZXIta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvc3RyaW5nLWtleXdvcmRzLnRzIiwiLi4vbGliL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmludGVyZmFjZSBFcnJvclRyZWUge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZztcbiAgZGF0YT86IGFueTtcbiAgY2F1c2U/OiBFcnJvclRyZWU7XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLml0ZW0gaW4gdGhpcy5zY2hlbWEpIHtcbiAgICAgICAgc2NoZW1hUGF0aCArPSBgLyR7dGhpcy5pdGVtfWA7XG4gICAgICB9XG4gICAgICBpbnN0YW5jZVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VQYXRoID0gaW5zdGFuY2VQYXRoO1xuICAgIHRoaXMuc2NoZW1hUGF0aCA9IHNjaGVtYVBhdGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBjYXVzZSBvciB0aGUgY2F1c2UgaXMgbm90IGEgVmFsaWRhdGlvbkVycm9yLCByZXR1cm4gdGhpc1xuICAgIGlmICghdGhpcy5jYXVzZSB8fCAhKHRoaXMuY2F1c2UgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYXVzZS5fZ2V0Q2F1c2Uoc2NoZW1hUGF0aCwgaW5zdGFuY2VQYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCk6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhdXNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgY29uc3QgdHJlZTogRXJyb3JUcmVlID0ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgaXRlbTogdGhpcy5pdGVtLFxuICAgICAgc2NoZW1hUGF0aDogdGhpcy5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiB0aGlzLmluc3RhbmNlUGF0aCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jYXVzZSkge1xuICAgICAgdHJlZS5jYXVzZSA9IHRoaXMuY2F1c2UuX2dldFRyZWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGdldFRyZWUoKTogRXJyb3JUcmVlIHtcbiAgICB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRyZWUoKTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgY29uc3QgY2F1c2UgPSB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYVBhdGg6IGNhdXNlLnNjaGVtYVBhdGgsXG4gICAgICBpbnN0YW5jZVBhdGg6IGNhdXNlLmluc3RhbmNlUGF0aFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvck9wdGlvbnMge1xuICBpdGVtPzogYW55OyAvLyBGaW5hbCBpdGVtIGluIHRoZSBzY2hlbWFQYXRoXG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yIHwgdHJ1ZTsgLy8gQ2F1c2Ugb2YgdGhlIGVycm9yXG4gIGRhdGE/OiBhbnk7IC8vIERhdGEgdGhhdCBjYXVzZWQgdGhlIGVycm9yXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JGdW5jdGlvbiB7XG4gIChcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IERlZmluZUVycm9yT3B0aW9uc1xuICApOiBWYWxpZGF0aW9uRXJyb3IgfCB2b2lkIHwgdHJ1ZTtcbn1cbmNvbnN0IEZBSUxfRkFTVF9ERUZJTkVfRVJST1I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAoKSA9PiB0cnVlO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gIGtleTogc3RyaW5nLFxuICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hLFxuICBmYWlsRmFzdDogYm9vbGVhblxuKSB7XG4gIGlmIChmYWlsRmFzdCkge1xuICAgIHJldHVybiBGQUlMX0ZBU1RfREVGSU5FX0VSUk9SO1xuICB9XG5cbiAgY29uc3QgS2V5d29yZEVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke2tleX1gKTtcbiAgS2V5d29yZEVycm9yLmtleXdvcmQgPSBrZXk7XG4gIEtleXdvcmRFcnJvci5zY2hlbWEgPSBzY2hlbWE7XG5cbiAgY29uc3QgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAobWVzc2FnZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgS2V5d29yZEVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIEtleXdvcmRFcnJvci5pdGVtID0gb3B0aW9ucy5pdGVtO1xuICAgIEtleXdvcmRFcnJvci5jYXVzZSA9XG4gICAgICBvcHRpb25zLmNhdXNlICYmIG9wdGlvbnMuY2F1c2UgIT09IHRydWUgPyBvcHRpb25zLmNhdXNlIDogdW5kZWZpbmVkO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVURjE2TGVuZ3RoKHN0cikge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZW5ndGgrKztcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21waWxlZFNjaGVtYShzdWJTY2hlbWE6IGFueSk6IHN1YlNjaGVtYSBpcyBDb21waWxlZFNjaGVtYSB7XG4gIHJldHVybiAoXG4gICAgISFzdWJTY2hlbWEgJiZcbiAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgIUFycmF5LmlzQXJyYXkoc3ViU2NoZW1hKSAmJlxuICAgIFwiJHZhbGlkYXRlXCIgaW4gc3ViU2NoZW1hXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZEZ1bmN0aW9uPFQ+KG5hbWU6IHN0cmluZywgZm46IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJuYW1lXCIsIHsgdmFsdWU6IG5hbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aChyb290OiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGlmICghcGF0aCB8fCBwYXRoID09PSBcIiNcIikge1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLy8gSlNPTiBQb2ludGVyXG4gIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIjL1wiKSkge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMSk7XG4gICAgbGV0IGN1cnJlbnQgPSByb290O1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCBkZWNvZGVkVXJpUGFydCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0KTtcbiAgICAgIGNvbnN0IGtleSA9IGRlY29kZWRVcmlQYXJ0LnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIik7XG5cbiAgICAgIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiICYmIGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLy8gU2ltcGxlIGxvb2t1cCBieSBkZWZpbml0aW9uIG5hbWUgKG5vbi1zdGFuZGFyZCwgYnV0IHVzZWZ1bClcbiAgaWYgKCFwYXRoLmluY2x1ZGVzKFwiI1wiKSkge1xuICAgIGlmIChyb290LmRlZmluaXRpb25zICYmIHJvb3QuZGVmaW5pdGlvbnNbcGF0aF0pIHtcbiAgICAgIHJldHVybiByb290LmRlZmluaXRpb25zW3BhdGhdO1xuICAgIH1cbiAgICBpZiAocm9vdC5kZWZzICYmIHJvb3QuZGVmc1twYXRoXSkge1xuICAgICAgcmV0dXJuIHJvb3QuZGVmc1twYXRoXTtcbiAgICB9XG5cbiAgICBpZiAocm9vdC4kaWQgJiYgdHlwZW9mIHJvb3QuJGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAocm9vdC4kaWQgPT09IHBhdGggfHwgcm9vdC4kaWQuZW5kc1dpdGgoXCIvXCIgKyBwYXRoKSkge1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVDbG9zZUVub3VnaChhOiBudW1iZXIsIGI6IG51bWJlciwgZXBzaWxvbiA9IDFlLTE1KTogYm9vbGVhbiB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gZXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5cbi8vIFJlZ2V4IGhlbHBlcnNcbmNvbnN0IFVVSURfUkVHRVggPVxuICAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaTtcbi8vIElTTyA4NjAxIER1cmF0aW9uIChQM1k2TTREVDEySDMwTTVTKVxuY29uc3QgRFVSQVRJT05fUkVHRVggPVxuICAvXlAoPyEkKSgoXFxkK1kpPyhcXGQrTSk/KFxcZCtXKT8oXFxkK0QpPykoVCg/PVxcZCkoXFxkK0gpPyhcXGQrTSk/KFxcZCtTKT8pPyQvO1xuY29uc3QgVVJJX1JFR0VYID0gL15bYS16QS1aXVthLXpBLVowLTkrXFwtLl0qOlteXFxzXSokLztcbmNvbnN0IEVNQUlMX1JFR0VYID1cbiAgL14oPyFcXC4pKD8hLipcXC4kKVthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIwfSg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIxfSl7MCwyfUBbYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT8oPzpcXC5bYS16MC05XSg/OlthLXowLTktXXswLDYwfVthLXowLTldKT8pezAsM30kL2k7XG5jb25zdCBIT1NUTkFNRV9SRUdFWCA9XG4gIC9eW2EtejAtOV1bYS16MC05LV17MCw2Mn0oPzpcXC5bYS16MC05XVthLXowLTktXXswLDYyfSkqW2EtejAtOV0kL2k7XG5jb25zdCBEQVRFX1JFR0VYID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvO1xuY29uc3QgVElNRV9SRUdFWCA9XG4gIC9eKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpOihbMC01XVxcZCkoXFwuXFxkKyk/KFp8KFsrLV0pKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpKSQvO1xuY29uc3QgVVJJX1JFRkVSRU5DRV9SRUdFWCA9XG4gIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaTtcbmNvbnN0IElSSV9SRUdFWCA9IC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC87XG5jb25zdCBJUklfUkVGRVJFTkNFX1JFR0VYID1cbiAgL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKCg/IVteI10qXFxcXClbXiNdKikpPy9pO1xuY29uc3QgSUROX0VNQUlMX1JFR0VYID0gL15bXkBcXHNdK0BbXkBcXHNdK1xcLlteQFxcc10rJC87XG5jb25zdCBJRE5fSE9TVE5BTUVfUkVHRVggPSAvXlteXFxzIUAjJCVeJiooKV8rXFw9XFxbXFxde307JzpcIlxcXFx8LDw+XFwvP10rJC87XG5cbmNvbnN0IERBWVNfSU5fTU9OVEggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5cbmZ1bmN0aW9uIGlzRGlnaXRDaGFyQ29kZShjb2RlOiBudW1iZXIpIHtcbiAgcmV0dXJuIGNvZGUgPj0gNDggJiYgY29kZSA8PSA1Nztcbn1cblxuZnVuY3Rpb24gcGFyc2VUd29EaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGZpcnN0ID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4KSAtIDQ4O1xuICBjb25zdCBzZWNvbmQgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuXG4gIGlmIChmaXJzdCA8IDAgfHwgZmlyc3QgPiA5IHx8IHNlY29uZCA8IDAgfHwgc2Vjb25kID4gOSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdCAqIDEwICsgc2Vjb25kO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZvdXJEaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGEgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXgpIC0gNDg7XG4gIGNvbnN0IGIgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuICBjb25zdCBjID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4ICsgMikgLSA0ODtcbiAgY29uc3QgZCA9IGRhdGEuY2hhckNvZGVBdChpbmRleCArIDMpIC0gNDg7XG5cbiAgaWYgKFxuICAgIGEgPCAwIHx8XG4gICAgYSA+IDkgfHxcbiAgICBiIDwgMCB8fFxuICAgIGIgPiA5IHx8XG4gICAgYyA8IDAgfHxcbiAgICBjID4gOSB8fFxuICAgIGQgPCAwIHx8XG4gICAgZCA+IDlcbiAgKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcmV0dXJuIGEgKiAxMDAwICsgYiAqIDEwMCArIGMgKiAxMCArIGQ7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YTogc3RyaW5nLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICBsZXQgc2VnbWVudENvdW50ID0gMDtcbiAgbGV0IHNlZ21lbnRTdGFydCA9IHN0YXJ0O1xuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgIGlmIChpICE9PSBlbmQgJiYgZGF0YS5jaGFyQ29kZUF0KGkpICE9PSA0Nikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudExlbmd0aCA9IGkgLSBzZWdtZW50U3RhcnQ7XG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPCAxIHx8IHNlZ21lbnRMZW5ndGggPiAzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPiAxICYmIGRhdGEuY2hhckNvZGVBdChzZWdtZW50U3RhcnQpID09PSA0OCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IHNlZ21lbnRTdGFydDsgaiA8IGk7IGorKykge1xuICAgICAgY29uc3QgZGlnaXQgPSBkYXRhLmNoYXJDb2RlQXQoaikgLSA0ODtcbiAgICAgIGlmIChkaWdpdCA8IDAgfHwgZGlnaXQgPiA5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgZGlnaXQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID4gMjU1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VnbWVudENvdW50Kys7XG4gICAgc2VnbWVudFN0YXJ0ID0gaSArIDE7XG4gIH1cblxuICByZXR1cm4gc2VnbWVudENvdW50ID09PSA0O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSXB2NChkYXRhOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc0hleENoYXJDb2RlKGNvZGU6IG51bWJlcikge1xuICByZXR1cm4gKFxuICAgIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHx8XG4gICAgKGNvZGUgPj0gNjUgJiYgY29kZSA8PSA3MCkgfHxcbiAgICAoY29kZSA+PSA5NyAmJiBjb2RlIDw9IDEwMilcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZElwdjYoZGF0YTogc3RyaW5nKSB7XG4gIGNvbnN0IGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0NvbG9uID0gZmFsc2U7XG4gIGxldCBoYXNEb3VibGVDb2xvbiA9IGZhbHNlO1xuICBsZXQgaGV4dGV0Q291bnQgPSAwO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaGFzQ29sb24gPSB0cnVlO1xuXG4gICAgICBpZiAoaSArIDEgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkgKyAxKSA9PT0gNTgpIHtcbiAgICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgICBpICs9IDI7XG5cbiAgICAgICAgaWYgKGkgPT09IGxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50U3RhcnQgPSBpO1xuICAgIGxldCBzZWdtZW50TGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGlzSGV4Q2hhckNvZGUoZGF0YS5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgc2VnbWVudExlbmd0aCsrO1xuICAgICAgaWYgKHNlZ21lbnRMZW5ndGggPiA0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50TGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGkgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkpID09PSA0Nikge1xuICAgICAgaWYgKCFoYXNDb2xvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNWYWxpZElwdjRSYW5nZShkYXRhLCBzZWdtZW50U3RhcnQsIGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICAgICAgcmV0dXJuIGhleHRldENvdW50IDwgNjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhleHRldENvdW50ID09PSA2O1xuICAgIH1cblxuICAgIGhleHRldENvdW50Kys7XG4gICAgaWYgKGhleHRldENvdW50ID4gOCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDU4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzQ29sb24gPSB0cnVlO1xuICAgIGkrKztcblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgaSsrO1xuXG4gICAgICBpZiAoaSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaGFzQ29sb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICByZXR1cm4gaGV4dGV0Q291bnQgPCA4O1xuICB9XG5cbiAgcmV0dXJuIGhleHRldENvdW50ID09PSA4O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YTogc3RyaW5nKSB7XG4gIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZGF0YS5jaGFyQ29kZUF0KDApICE9PSA0Nykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDEyNikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IGRhdGEuY2hhckNvZGVBdChpICsgMSk7XG4gICAgaWYgKG5leHQgIT09IDQ4ICYmIG5leHQgIT09IDQ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRSZWxhdGl2ZUpzb25Qb2ludGVyKGRhdGE6IHN0cmluZykge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpKys7XG4gIH1cblxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpID09PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSA9PT0gMzUpIHtcbiAgICByZXR1cm4gaSArIDEgPT09IGRhdGEubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSAhPT0gNDcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGkgPSBpICsgMTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpICE9PSAxMjYpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBkYXRhLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgIGlmIChuZXh0ICE9PSA0OCAmJiBuZXh0ICE9PSA0OSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkVXJpVGVtcGxhdGUoZGF0YTogc3RyaW5nKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoY29kZSA9PT0gMTI1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgIT09IDEyMykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2xvc2VJbmRleCA9IGRhdGEuaW5kZXhPZihcIn1cIiwgaSArIDEpO1xuICAgIGlmIChjbG9zZUluZGV4ID09PSAtMSB8fCBjbG9zZUluZGV4ID09PSBpICsgMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkgPSBjbG9zZUluZGV4O1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtYXRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgW1wiZGF0ZS10aW1lXCJdKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgMTkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNCkgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNykgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoMTMpICE9PSA1OCB8fFxuICAgICAgZGF0YS5jaGFyQ29kZUF0KDE2KSAhPT0gNThcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0Q29kZSA9IGRhdGEuY2hhckNvZGVBdCgxMCk7XG4gICAgaWYgKHRDb2RlICE9PSA4NCAmJiB0Q29kZSAhPT0gMTE2KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeWVhciA9IHBhcnNlRm91ckRpZ2l0cyhkYXRhLCAwKTtcbiAgICBjb25zdCBtb250aCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDUpO1xuICAgIGNvbnN0IGRheSA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDgpO1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCAxMSk7XG4gICAgY29uc3QgbWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgMTQpO1xuICAgIGNvbnN0IHNlY29uZCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDE3KTtcblxuICAgIGlmIChcbiAgICAgIHllYXIgPCAwIHx8XG4gICAgICBtb250aCA8IDAgfHxcbiAgICAgIGRheSA8IDAgfHxcbiAgICAgIGhvdXIgPCAwIHx8XG4gICAgICBtaW51dGUgPCAwIHx8XG4gICAgICBzZWNvbmQgPCAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGhvdXIgPiAyMyB8fCBtaW51dGUgPiA1OSB8fCBzZWNvbmQgPiA2MCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBjdXJzb3IgPSAxOTtcbiAgICBsZXQgb2Zmc2V0U2lnbjogXCIrXCIgfCBcIi1cIiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBvZmZzZXRIb3VyID0gMDtcbiAgICBsZXQgb2Zmc2V0TWludXRlID0gMDtcblxuICAgIGlmIChjdXJzb3IgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGN1cnNvcikgPT09IDQ2KSB7XG4gICAgICBjdXJzb3IrKztcbiAgICAgIGNvbnN0IGZyYWNTdGFydCA9IGN1cnNvcjtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBsZW5ndGggJiYgaXNEaWdpdENoYXJDb2RlKGRhdGEuY2hhckNvZGVBdChjdXJzb3IpKSkge1xuICAgICAgICBjdXJzb3IrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnNvciA9PT0gZnJhY1N0YXJ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3Vyc29yIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCB0ekNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoY3Vyc29yKTtcblxuICAgICAgaWYgKHR6Q29kZSA9PT0gOTAgfHwgdHpDb2RlID09PSAxMjIpIHtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9IGVsc2UgaWYgKHR6Q29kZSA9PT0gNDMgfHwgdHpDb2RlID09PSA0NSkge1xuICAgICAgICBvZmZzZXRTaWduID0gdHpDb2RlID09PSA0MyA/IFwiK1wiIDogXCItXCI7XG5cbiAgICAgICAgaWYgKGN1cnNvciArIDYgPiBsZW5ndGggfHwgZGF0YS5jaGFyQ29kZUF0KGN1cnNvciArIDMpICE9PSA1OCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9mZnNldEhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCBjdXJzb3IgKyAxKTtcbiAgICAgICAgb2Zmc2V0TWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgY3Vyc29yICsgNCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9mZnNldEhvdXIgPCAwIHx8XG4gICAgICAgICAgb2Zmc2V0TWludXRlIDwgMCB8fFxuICAgICAgICAgIG9mZnNldEhvdXIgPiAyMyB8fFxuICAgICAgICAgIG9mZnNldE1pbnV0ZSA+IDU5XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnNvciArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJzb3IgIT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE1lcyAx4oCTMTJcbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRMOtYSA+PSAxXG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIGlmICghbWF4RGF5cyB8fCBkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlY29uZCA9PT0gNjApIHtcbiAgICAgIGxldCB1dGNUb3RhbE1pbnV0ZXMgPSBob3VyICogNjAgKyBtaW51dGU7XG5cbiAgICAgIGlmIChvZmZzZXRTaWduKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IG9mZnNldEhvdXIgKiA2MCArIG9mZnNldE1pbnV0ZTtcbiAgICAgICAgdXRjVG90YWxNaW51dGVzICs9XG4gICAgICAgICAgb2Zmc2V0U2lnbiA9PT0gXCIrXCIgPyAtb2Zmc2V0VG90YWxNaW51dGVzIDogb2Zmc2V0VG90YWxNaW51dGVzO1xuICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgJT0gMjQgKiA2MDtcbiAgICAgICAgaWYgKHV0Y1RvdGFsTWludXRlcyA8IDApIHtcbiAgICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgKz0gMjQgKiA2MDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodXRjVG90YWxNaW51dGVzICE9PSAyMyAqIDYwICsgNTkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICB1cmkoZGF0YSkge1xuICAgIHJldHVybiBVUklfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiBFTUFJTF9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuICBpcHY0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNWYWxpZElwdjQoZGF0YSk7XG4gIH0sXG5cbiAgaXB2NihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRJcHY2KGRhdGEpO1xuICB9LFxuXG4gIGhvc3RuYW1lKGRhdGEpIHtcbiAgICByZXR1cm4gSE9TVE5BTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBEQVRFX1JFR0VYLmV4ZWMoZGF0YSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHJdID0gbWF0Y2g7XG4gICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihtb250aFN0cik7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRheVN0cik7XG5cbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIHJldHVybiAhIW1heERheXMgJiYgZGF5IDw9IG1heERheXM7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFwianNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkUmVsYXRpdmVKc29uUG9pbnRlcihkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIFRJTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgXCJ1cmktcmVmZXJlbmNlXCIoZGF0YSkge1xuICAgIGlmIChkYXRhLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBVUklfUkVGRVJFTkNFX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJ1cmktdGVtcGxhdGVcIihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRVcmlUZW1wbGF0ZShkYXRhKTtcbiAgfSxcblxuICBkdXJhdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIERVUkFUSU9OX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgdXVpZChkYXRhKSB7XG4gICAgcmV0dXJuIFVVSURfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBJUkkgaXMgbGlrZSBVUkkgYnV0IGFsbG93cyBVbmljb2RlLiBXZSByZXVzZSBhIHBlcm1pc3NpdmUgbG9naWMuXG4gIGlyaShkYXRhKSB7XG4gICAgcmV0dXJuIElSSV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIFwiaXJpLXJlZmVyZW5jZVwiKGRhdGEpIHtcbiAgICBpZiAoZGF0YS5pbmNsdWRlcyhcIlxcXFxcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIElSSV9SRUZFUkVOQ0VfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBCZXN0LWVmZm9ydCBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZm9yIElETiAobm8gcHVueWNvZGUvdGFibGVzKVxuICBcImlkbi1lbWFpbFwiKGRhdGEpIHtcbiAgICByZXR1cm4gSUROX0VNQUlMX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJpZG4taG9zdG5hbWVcIihkYXRhKSB7XG4gICAgLy8gQWxsb3dzIHVuaWNvZGUsIGZvcmJpZHMgc3BhY2VzIGFuZCB0eXBpY2FsIGludmFsaWQgVVJMIGNoYXJzXG4gICAgcmV0dXJuIElETl9IT1NUTkFNRV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgVHlwZUZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIG9iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVpbnQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1aW50MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVpbnQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxufTtcbiIsIi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZCByZWN1cnNpdmVseVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBoYXNDaGFuZ2VkKHByZXY6IGFueSwgY3VycmVudDogYW55KSB7XG4gIGlmIChPYmplY3QuaXMocHJldiwgY3VycmVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwcmV2KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2ldLCBjdXJyZW50W2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZXYgPT09IFwib2JqZWN0XCIgJiYgcHJldiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIiB8fCBjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjdXJyZW50KSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJldikge1xuICAgICAgaWYgKGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBoYXNDaGFuZ2VkIH0gZnJvbSBcIi4uL3V0aWxzL2hhcy1jaGFuZ2VkXCI7XG5cbmZ1bmN0aW9uIGlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QXJyYXlCdWNrZXRLZXkodmFsdWU6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiMFwiO1xuICB9XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW2xlbmd0aCAtIDFdO1xuICBjb25zdCBmaXJzdFR5cGUgPSBmaXJzdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGZpcnN0O1xuICBjb25zdCBsYXN0VHlwZSA9IGxhc3QgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBsYXN0O1xuXG4gIGxldCBmaXJzdEFycmF5TWFya2VyID0gXCJcIjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmlyc3QpKSB7XG4gICAgY29uc3QgZmlyc3RTaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShmaXJzdCk7XG4gICAgZmlyc3RBcnJheU1hcmtlciA9IGZpcnN0U2lnbmF0dXJlID09PSBudWxsID8gYGE6JHtmaXJzdC5sZW5ndGh9YCA6IGZpcnN0U2lnbmF0dXJlO1xuICB9XG5cbiAgbGV0IGxhc3RBcnJheU1hcmtlciA9IFwiXCI7XG4gIGlmIChBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgY29uc3QgbGFzdFNpZ25hdHVyZSA9IGdldFByaW1pdGl2ZUFycmF5U2lnbmF0dXJlKGxhc3QpO1xuICAgIGxhc3RBcnJheU1hcmtlciA9IGxhc3RTaWduYXR1cmUgPT09IG51bGwgPyBgYToke2xhc3QubGVuZ3RofWAgOiBsYXN0U2lnbmF0dXJlO1xuICB9XG5cbiAgcmV0dXJuIGAke2xlbmd0aH06JHtmaXJzdFR5cGV9OiR7Zmlyc3RBcnJheU1hcmtlcn06JHtsYXN0VHlwZX06JHtsYXN0QXJyYXlNYXJrZXJ9YDtcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0U2hhcGVLZXkodmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKTtcbiAgcmV0dXJuIGAke2tleXMubGVuZ3RofToke2tleXMuam9pbihcIlxcdTAwMDFcIil9YDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpbWl0aXZlQXJyYXlTaWduYXR1cmUodmFsdWU6IGFueVtdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiYTowXCI7XG4gIH1cblxuICBpZiAoIWlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlWzBdKSB8fCAhaXNVbmlxdWVQcmltaXRpdmUodmFsdWVbbGVuZ3RoIC0gMV0pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgc2lnbmF0dXJlID0gYGE6JHtsZW5ndGh9OmA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcblxuICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICBzaWduYXR1cmUgKz0gXCJsO1wiO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzaWduYXR1cmUgKz0gYHMke2l0ZW0ubGVuZ3RofToke2l0ZW19O2A7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaXRlbSkpIHtcbiAgICAgICAgc2lnbmF0dXJlICs9IFwibjpOYU47XCI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmlzKGl0ZW0sIC0wKSkge1xuICAgICAgICBzaWduYXR1cmUgKz0gXCJuOi0wO1wiO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc2lnbmF0dXJlICs9IGBuOiR7aXRlbX07YDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHNpZ25hdHVyZSArPSBpdGVtID8gXCJiOjE7XCIgOiBcImI6MDtcIjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hdHVyZTtcbn1cblxuZXhwb3J0IGNvbnN0IEFycmF5S2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIC8vIGxpYi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkcy50c1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFJdGVtcykpIHtcbiAgICAgIGNvbnN0IHNjaGVtYUl0ZW1zTGVuZ3RoID0gc2NoZW1hSXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgaXRlbXNMZW5ndGggPVxuICAgICAgICBzY2hlbWFJdGVtc0xlbmd0aCA8IGRhdGFMZW5ndGggPyBzY2hlbWFJdGVtc0xlbmd0aCA6IGRhdGFMZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChzY2hlbWFJdGVtID09PSBmYWxzZSAmJiBkYXRhW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHNjaGVtYUl0ZW0gJiYgc2NoZW1hSXRlbS4kdmFsaWRhdGU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGUgPSBzY2hlbWFJdGVtcyAmJiBzY2hlbWFJdGVtcy4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBlbGVtZW50cyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHNTY2hlbWEgPSBzY2hlbWEuZWxlbWVudHM7XG4gICAgY29uc3QgdmFsaWRhdGUgPSBlbGVtZW50c1NjaGVtYSAmJiBlbGVtZW50c1NjaGVtYS4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWluSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gc2hvcnRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXMgdG9vIGxvbmdcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxJdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdHVwbGVMZW5ndGggPSAoc2NoZW1hIGFzIGFueSkuX3R1cGxlSXRlbXNMZW5ndGggYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0dXBsZUxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0dXBsZUxlbmd0aCA9IHNjaGVtYS5pdGVtcy5sZW5ndGg7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl90dXBsZUl0ZW1zTGVuZ3RoXCIsIHtcbiAgICAgICAgdmFsdWU6IHR1cGxlTGVuZ3RoLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPD0gdHVwbGVMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEuYWRkaXRpb25hbEl0ZW1zICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcylcbiAgICApIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0dXBsZUxlbmd0aDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHVuaXF1ZUl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIXNjaGVtYS51bmlxdWVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsZW4gPD0gOCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YVtpXTtcblxuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YVtqXTtcblxuICAgICAgICAgIGlmIChsZWZ0ID09PSByaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgbGVmdCA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHJpZ2h0ID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICBOdW1iZXIuaXNOYU4obGVmdCkgJiZcbiAgICAgICAgICAgIE51bWJlci5pc05hTihyaWdodClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogcmlnaHQgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGVmdCAmJlxuICAgICAgICAgICAgcmlnaHQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBsZWZ0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgcmlnaHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICFoYXNDaGFuZ2VkKGxlZnQsIHJpZ2h0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW1pdGl2ZVNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBsZXQgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYXJyYXlCdWNrZXRzOiBNYXA8c3RyaW5nLCBhbnlbXT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IG9iamVjdEJ1Y2tldHM6IE1hcDxzdHJpbmcsIGFueVtdPiB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW2ldO1xuXG4gICAgICBpZiAoaXNVbmlxdWVQcmltaXRpdmUoaXRlbSkpIHtcbiAgICAgICAgaWYgKHByaW1pdGl2ZVNlZW4uaGFzKGl0ZW0pKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICB9XG4gICAgICAgIHByaW1pdGl2ZVNlZW4uYWRkKGl0ZW0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShpdGVtKTtcbiAgICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICghcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzKSB7XG4gICAgICAgICAgICBwcmltaXRpdmVBcnJheVNpZ25hdHVyZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmhhcyhzaWduYXR1cmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmFkZChzaWduYXR1cmUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhcnJheUJ1Y2tldHMpIHtcbiAgICAgICAgICBhcnJheUJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRBcnJheUJ1Y2tldEtleShpdGVtKTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBhcnJheUJ1Y2tldHMuZ2V0KGJ1Y2tldEtleSk7XG5cbiAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgY2FuZGlkYXRlcyA9IFtdO1xuICAgICAgICAgIGFycmF5QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaChpdGVtKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghb2JqZWN0QnVja2V0cykge1xuICAgICAgICBvYmplY3RCdWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRPYmplY3RTaGFwZUtleShpdGVtKTtcbiAgICAgIGxldCBjYW5kaWRhdGVzID0gb2JqZWN0QnVja2V0cy5nZXQoYnVja2V0S2V5KTtcblxuICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMgPSBbXTtcbiAgICAgICAgb2JqZWN0QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYW5kaWRhdGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYW5kaWRhdGVzLnB1c2goaXRlbSk7XG4gICAgfVxuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbnNWYWxpZGF0ZSA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGNvbnRhaW5zVmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJleHBvcnQgZnVuY3Rpb24gZGVlcEZyZWV6ZShcbiAgb2JqOiBhbnksXG4gIGZyZWV6ZUNsYXNzSW5zdGFuY2VzOiBib29sZWFuID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha1NldCgpXG4pOiBhbnkge1xuICBpZiAoXG4gICAgb2JqID09PSBudWxsIHx8XG4gICAgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fFxuICAgIHNlZW4uaGFzKG9iaikgfHxcbiAgICBPYmplY3QuaXNGcm96ZW4ob2JqKVxuICApIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgc2Vlbi5hZGQob2JqKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtpXSwgZnJlZXplQ2xhc3NJbnN0YW5jZXMsIHNlZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9wcyA9IFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJvcHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtwcm9wc1tpXV0sIGZyZWV6ZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgKG5vdCBhIHBsYWluIG9iamVjdCBvciBhcnJheSkgd2UgbmVlZCB0byBmcmVlemUgdGhlIHByb3RvdHlwZVxuICAgIGlmIChmcmVlemVDbGFzc0luc3RhbmNlcykge1xuICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICAgIGlmIChwcm90byAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBkZWVwRnJlZXplKHByb3RvLCBmcmVlemVDbGFzc0luc3RhbmNlcywgc2Vlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmZyZWV6ZShvYmopO1xuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgeyBpc1BsYWluT2JqZWN0IH07XG5cbmZ1bmN0aW9uIGNhblVzZVN0cnVjdHVyZWRDbG9uZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc3RydWN0dXJlZENsb25lICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIFNldCB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmVVbmZyZWV6ZTxUPihcbiAgb2JqOiBULFxuICBjbG9uZUNsYXNzSW5zdGFuY2VzID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha01hcCgpXG4pOiBUIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgfHwgb2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gb2JqIGFzIGFueTtcblxuICBpZiAoc2Vlbi5oYXMoc291cmNlKSkge1xuICAgIHJldHVybiBzZWVuLmdldChzb3VyY2UpO1xuICB9XG5cbiAgaWYgKGNhblVzZVN0cnVjdHVyZWRDbG9uZShzb3VyY2UpKSB7XG4gICAgY29uc3QgY2xvbmVkID0gc3RydWN0dXJlZENsb25lKHNvdXJjZSk7XG4gICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZWQpO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICBsZXQgY2xvbmU6IGFueTtcblxuICBzd2l0Y2ggKHRydWUpIHtcbiAgICBjYXNlIEFycmF5LmlzQXJyYXkoc291cmNlKToge1xuICAgICAgY2xvbmUgPSBbXTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNsb25lW2ldID0gZGVlcENsb25lVW5mcmVlemUoc291cmNlW2ldLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY2FzZSBzb3VyY2UgaW5zdGFuY2VvZiBEYXRlOiB7XG4gICAgICBjbG9uZSA9IG5ldyBEYXRlKHNvdXJjZS5nZXRUaW1lKCkpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgUmVnRXhwOiB7XG4gICAgICBjbG9uZSA9IG5ldyBSZWdFeHAoc291cmNlLnNvdXJjZSwgc291cmNlLmZsYWdzKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIE1hcDoge1xuICAgICAgY2xvbmUgPSBuZXcgTWFwKCk7XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgY2xvbmUuc2V0KFxuICAgICAgICAgIGRlZXBDbG9uZVVuZnJlZXplKGtleSwgY2xvbmVDbGFzc0luc3RhbmNlcywgc2VlbiksXG4gICAgICAgICAgZGVlcENsb25lVW5mcmVlemUodmFsdWUsIGNsb25lQ2xhc3NJbnN0YW5jZXMsIHNlZW4pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgU2V0OiB7XG4gICAgICBjbG9uZSA9IG5ldyBTZXQoKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UudmFsdWVzKCkpIHtcbiAgICAgICAgY2xvbmUuYWRkKGRlZXBDbG9uZVVuZnJlZXplKHZhbHVlLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gc291cmNlLnNsaWNlKDApO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIFR5cGVkQXJyYXlzIGFuZCBEYXRhVmlld1xuICAgIGNhc2UgQXJyYXlCdWZmZXIuaXNWaWV3KHNvdXJjZSk6IHtcbiAgICAgIGNsb25lID0gbmV3IHNvdXJjZS5jb25zdHJ1Y3Rvcihzb3VyY2UuYnVmZmVyLnNsaWNlKDApKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICAvLyBOb2RlLmpzIEJ1ZmZlclxuICAgIGNhc2UgdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzb3VyY2UgaW5zdGFuY2VvZiBCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIEVycm9yOiB7XG4gICAgICBjbG9uZSA9IG5ldyBzb3VyY2UuY29uc3RydWN0b3Ioc291cmNlLm1lc3NhZ2UpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm9uIGNsb25hYmxlIG9iamVjdHNcbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtTZXQ6IHtcbiAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIEluc3RhbmNlIG9mIGEgY2xhc3NcbiAgICBjYXNlIHNvdXJjZS5jb25zdHJ1Y3RvciAmJiBzb3VyY2UuY29uc3RydWN0b3IgIT09IE9iamVjdDoge1xuICAgICAgaWYgKCFjbG9uZUNsYXNzSW5zdGFuY2VzKSB7XG4gICAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgfVxuICAgICAgY2xvbmUgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGxhaW4gb2JqZWN0c1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNsb25lID0ge307XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcblxuICAgICAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhzb3VyY2UpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBjbG9uZVtrZXkgYXMgc3RyaW5nXSA9IGRlZXBDbG9uZVVuZnJlZXplKFxuICAgICAgICAgIHNvdXJjZVtrZXkgYXMgc3RyaW5nXSxcbiAgICAgICAgICBjbG9uZUNsYXNzSW5zdGFuY2VzLFxuICAgICAgICAgIHNlZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhkZXNjcmlwdG9ycykpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNba2V5IGFzIHN0cmluZ107XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLnZhbHVlID0gZGVlcENsb25lVW5mcmVlemUoXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWUsXG4gICAgICAgIGNsb25lQ2xhc3NJbnN0YW5jZXMsXG4gICAgICAgIHNlZW5cbiAgICAgICk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9uZSwga2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxuXG4gIHJldHVybiBjbG9uZTtcbn1cbiIsImltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgYXJlQ2xvc2VFbm91Z2ggfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE51bWJlcktleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1pbiA9IHNjaGVtYS5taW5pbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1pbiA9IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICsgMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWluICs9IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhIDwgbWluKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1heCA9IHNjaGVtYS5tYXhpbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1heCA9IHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtIC0gMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWF4IC09IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhID4gbWF4KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtdWx0aXBsZU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVvdGllbnQgPSBkYXRhIC8gc2NoZW1hLm11bHRpcGxlT2Y7XG5cbiAgICBpZiAoIWlzRmluaXRlKHF1b3RpZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghYXJlQ2xvc2VFbm91Z2gocXVvdGllbnQsIE1hdGgucm91bmQocXVvdGllbnQpKSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2ZcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtaW5pbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPD0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBleGNsdXNpdmVNaW5pbXVtXCIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtYXhpbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPj0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcbiAgICAgICAgXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1heGltdW1cIixcbiAgICAgICAgeyBkYXRhIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG59O1xuIiwiY29uc3QgUkVHRVhfTUVUQV9DSEFSUyA9IC9bXFxcXC5eJCorPygpW1xcXXt9fF0vO1xuXG5mdW5jdGlvbiBoYXNSZWdleE1ldGEodmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gUkVHRVhfTUVUQV9DSEFSUy50ZXN0KHZhbHVlKTtcbn1cblxuY29uc3QgUEFUVEVSTl9DQUNIRSA9IG5ldyBNYXA8c3RyaW5nLCBDb21waWxlZFBhdHRlcm5NYXRjaGVyPigpO1xuXG5leHBvcnQgdHlwZSBDb21waWxlZFBhdHRlcm5NYXRjaGVyID0gUmVnRXhwIHwgKCh2YWx1ZTogc3RyaW5nKSA9PiBib29sZWFuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVQYXR0ZXJuTWF0Y2hlcihwYXR0ZXJuOiBzdHJpbmcpOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyIHtcbiAgY29uc3QgY2FjaGVkID0gUEFUVEVSTl9DQUNIRS5nZXQocGF0dGVybik7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgbGV0IGNvbXBpbGVkOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyO1xuXG4gIGlmIChwYXR0ZXJuLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICB9IGVsc2UgaWYgKCFoYXNSZWdleE1ldGEocGF0dGVybikpIHtcbiAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5pbmNsdWRlcyhwYXR0ZXJuKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG5cbiAgICBpZiAocGF0dGVybkxlbmd0aCA+PSAyICYmIHBhdHRlcm5bMF0gPT09IFwiXlwiICYmIHBhdHRlcm5bcGF0dGVybkxlbmd0aCAtIDFdID09PSBcIiRcIikge1xuICAgICAgY29uc3QgaW5uZXIgPSBwYXR0ZXJuLnNsaWNlKDEsIC0xKTtcbiAgICAgIGlmICghaGFzUmVnZXhNZXRhKGlubmVyKSkge1xuICAgICAgICBpZiAoaW5uZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29tcGlsZWQgPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUubGVuZ3RoID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlID09PSBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGlsZWQgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIFwidVwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhdHRlcm5bMF0gPT09IFwiXlwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMSk7XG4gICAgICBpZiAoIWhhc1JlZ2V4TWV0YShpbm5lcikpIHtcbiAgICAgICAgaWYgKGlubmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnN0YXJ0c1dpdGgoaW5uZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21waWxlZCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGF0dGVybltwYXR0ZXJuTGVuZ3RoIC0gMV0gPT09IFwiJFwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMCwgLTEpO1xuICAgICAgaWYgKCFoYXNSZWdleE1ldGEoaW5uZXIpKSB7XG4gICAgICAgIGlmIChpbm5lci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb21waWxlZCA9IChfdmFsdWU6IHN0cmluZykgPT4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5lbmRzV2l0aChpbm5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgfVxuICB9XG5cbiAgUEFUVEVSTl9DQUNIRS5zZXQocGF0dGVybiwgY29tcGlsZWQpO1xuICByZXR1cm4gY29tcGlsZWQ7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSB9IGZyb20gXCIuLi91dGlscy9kZWVwLWZyZWV6ZVwiO1xuaW1wb3J0IHsgY29tcGlsZVBhdHRlcm5NYXRjaGVyIH0gZnJvbSBcIi4uL3V0aWxzL3BhdHRlcm4tbWF0Y2hlclwiO1xuXG5jb25zdCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCA9IDUxMjtcblxudHlwZSBQYXR0ZXJuUHJvcGVydHlFbnRyeSA9IHtcbiAgc2NoZW1hUHJvcDogYW55O1xuICBtYXRjaDogKGtleTogc3RyaW5nKSA9PiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gZ2V0UGF0dGVyblByb3BlcnR5RW50cmllcyhzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgbGV0IGVudHJpZXMgPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXMgYXNcbiAgICB8IFBhdHRlcm5Qcm9wZXJ0eUVudHJ5W11cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgaWYgKFxuICAgICFzY2hlbWEucGF0dGVyblByb3BlcnRpZXMgfHxcbiAgICB0eXBlb2Ygc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzICE9PSBcIm9iamVjdFwiIHx8XG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwYXR0ZXJuS2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7XG4gIGVudHJpZXMgPSBuZXcgQXJyYXkocGF0dGVybktleXMubGVuZ3RoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5LZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0dGVybktleXNbaV07XG4gICAgY29uc3QgY29tcGlsZWRNYXRjaGVyID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKGtleSk7XG4gICAgY29uc3QgbWF0Y2ggPVxuICAgICAgY29tcGlsZWRNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgID8gKHZhbHVlOiBzdHJpbmcpID0+IGNvbXBpbGVkTWF0Y2hlci50ZXN0KHZhbHVlKVxuICAgICAgICA6IGNvbXBpbGVkTWF0Y2hlcjtcblxuICAgIGVudHJpZXNbaV0gPSB7XG4gICAgICBzY2hlbWFQcm9wOiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNba2V5XSxcbiAgICAgIG1hdGNoXG4gICAgfTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzY2hlbWEsIFwiX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXNcIiwge1xuICAgIHZhbHVlOiBlbnRyaWVzLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKFxuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyaWVzOiBQYXR0ZXJuUHJvcGVydHlFbnRyeVtdXG4pIHtcbiAgbGV0IGNhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlIGFzXG4gICAgfCBNYXA8c3RyaW5nLCBudW1iZXJbXT5cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlXCIsIHtcbiAgICAgIHZhbHVlOiBjYWNoZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZW50cmllc1tpXS5tYXRjaChrZXkpKSB7XG4gICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhY2hlLnNpemUgPCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCkge1xuICAgIGNhY2hlLnNldChrZXksIGluZGV4ZXMpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5yZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gc2NoZW1hLnJlcXVpcmVkW2ldO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwcm9wS2V5cyA9IChzY2hlbWEgYXMgYW55KS5fcHJvcEtleXMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFwcm9wS2V5cykge1xuICAgICAgcHJvcEtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyB8fCB7fSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wcm9wS2V5c1wiLCB7XG4gICAgICAgIHZhbHVlOiBwcm9wS2V5cyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVpcmVkU2V0ID0gKHNjaGVtYSBhcyBhbnkpLl9yZXF1aXJlZFNldCBhc1xuICAgICAgfCBTZXQ8c3RyaW5nPlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWlyZWRTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWlyZWRTZXQgPSBBcnJheS5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZClcbiAgICAgICAgPyBuZXcgU2V0PHN0cmluZz4oc2NoZW1hLnJlcXVpcmVkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9yZXF1aXJlZFNldFwiLCB7XG4gICAgICAgIHZhbHVlOiByZXF1aXJlZFNldCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcEtleXNbaV07XG4gICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcblxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWlyZWRTZXQgJiZcbiAgICAgICAgICByZXF1aXJlZFNldC5oYXMoa2V5KSAmJlxuICAgICAgICAgIHNjaGVtYVByb3AgJiZcbiAgICAgICAgICB0eXBlb2Ygc2NoZW1hUHJvcCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYVByb3ApICYmXG4gICAgICAgICAgXCJkZWZhdWx0XCIgaW4gc2NoZW1hUHJvcFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IChzY2hlbWFQcm9wIGFzIGFueSkuJHZhbGlkYXRlKHNjaGVtYVByb3AuZGVmYXVsdCk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZWZhdWx0IHByb3BlcnR5IGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgZGF0YTogc2NoZW1hUHJvcC5kZWZhdWx0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YVtrZXldID0gZGVlcENsb25lVW5mcmVlemUoc2NoZW1hUHJvcC5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWFQcm9wID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoc2NoZW1hUHJvcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYVByb3AgJiYgXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgdmFsdWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU2NoZW1hID0gc2NoZW1hLnZhbHVlcztcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHZhbHVlU2NoZW1hICYmIHZhbHVlU2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY291bnQrKztcbiAgICAgIGlmIChjb3VudCA+IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBtYW55IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5Qcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvdW50Kys7XG4gICAgICBpZiAoY291bnQgPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBmZXcgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFwVmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2FwVmFsaWRhdGUgYXNcbiAgICAgIHwgKChkYXRhOiBhbnkpID0+IGFueSlcbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFwVmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXBWYWxpZGF0ZSA9IGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKVxuICAgICAgICA/IHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcy4kdmFsaWRhdGVcbiAgICAgICAgOiBudWxsO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfYXBWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBhcFZhbGlkYXRlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuRW50cmllcyA9IGdldFBhdHRlcm5Qcm9wZXJ0eUVudHJpZXMoc2NoZW1hKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjaGVtYS5wcm9wZXJ0aWVzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXR0ZXJuRW50cmllcyAmJiBwYXR0ZXJuRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGdldFBhdHRlcm5LZXlNYXRjaEluZGV4ZXMoc2NoZW1hLCBrZXksIHBhdHRlcm5FbnRyaWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwVmFsaWRhdGUpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhcFZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgcGF0dGVyblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybkVudHJpZXMgPSBnZXRQYXR0ZXJuUHJvcGVydHlFbnRyaWVzKHNjaGVtYSk7XG4gICAgaWYgKCFwYXR0ZXJuRW50cmllcyB8fCBwYXR0ZXJuRW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaGluZ0luZGV4ZXMgPSBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKHNjaGVtYSwga2V5LCBwYXR0ZXJuRW50cmllcyk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0luZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlICYmXG4gICAgICAgICAgIShzY2hlbWEucHJvcGVydGllcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2NoZW1hLnByb3BlcnRpZXMsIGtleSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGluZ0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvcCA9IHBhdHRlcm5FbnRyaWVzW21hdGNoaW5nSW5kZXhlc1tqXV0uc2NoZW1hUHJvcDtcblxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYVByb3AgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYVByb3AgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYVByb3AuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuICBwcm9wZXJ0eU5hbWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBuID0gc2NoZW1hLnByb3BlcnR5TmFtZXM7XG5cbiAgICBpZiAodHlwZW9mIHBuID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHBuID09PSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBuICYmIHBuLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZShrZXkpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IG5hbWUgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRlcGVuZGVuY2llcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAoa2V5IGluIGRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXBlbmRlbmN5ID0gc2NoZW1hLmRlcGVuZGVuY2llc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCEoZGVwZW5kZW5jeVtpXSBpbiBkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGVwZW5kZW5jeVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSBpbiBkYXRhKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gZGVwZW5kZW5jeS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgLy8gUmVxdWlyZWQgYnkgb3RoZXIga2V5d29yZHMgYnV0IG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24gaXRzZWxmXG4gIHRoZW46IGZhbHNlLFxuICBlbHNlOiBmYWxzZSxcbiAgZGVmYXVsdDogZmFsc2UsXG5cbiAgLy8gTm90IGltcGxlbWVudGVkIHlldFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGlzQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGhhc0NoYW5nZWQgfSBmcm9tIFwiLi4vdXRpbHMvaGFzLWNoYW5nZWRcIjtcblxudHlwZSBCcmFuY2hFbnRyeSA9XG4gIHwgeyBraW5kOiBcInZhbGlkYXRlXCI7IHZhbGlkYXRlOiAoZGF0YTogYW55KSA9PiBhbnkgfVxuICB8IHsga2luZDogXCJhbHdheXNWYWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwiYWx3YXlzSW52YWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwibGl0ZXJhbFwiOyB2YWx1ZTogYW55IH07XG5cbmZ1bmN0aW9uIHRvQnJhbmNoRW50cnkoaXRlbTogYW55KTogQnJhbmNoRW50cnkge1xuICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIGl0ZW0gJiYgdHlwZW9mIGl0ZW0uJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwidmFsaWRhdGVcIiwgdmFsaWRhdGU6IGl0ZW0uJHZhbGlkYXRlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsga2luZDogXCJhbHdheXNWYWxpZFwiIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHsga2luZDogaXRlbSA/IFwiYWx3YXlzVmFsaWRcIiA6IFwiYWx3YXlzSW52YWxpZFwiIH07XG4gIH1cblxuICByZXR1cm4geyBraW5kOiBcImxpdGVyYWxcIiwgdmFsdWU6IGl0ZW0gfTtcbn1cblxuZnVuY3Rpb24gZ2V0QnJhbmNoRW50cmllcyhzY2hlbWE6IGFueSwga2V5OiBcImFsbE9mXCIgfCBcImFueU9mXCIgfCBcIm9uZU9mXCIpIHtcbiAgY29uc3QgY2FjaGVLZXkgPSBgXyR7a2V5fUJyYW5jaEVudHJpZXNgO1xuICBsZXQgZW50cmllcyA9IHNjaGVtYVtjYWNoZUtleV0gYXMgQnJhbmNoRW50cnlbXSB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gc2NoZW1hW2tleV0gfHwgW107XG4gIGVudHJpZXMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIGVudHJpZXMucHVzaCh0b0JyYW5jaEVudHJ5KHNvdXJjZVtpXSkpO1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgY2FjaGVLZXksIHtcbiAgICB2YWx1ZTogZW50cmllcyxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcblxuICByZXR1cm4gZW50cmllcztcbn1cblxuZXhwb3J0IGNvbnN0IE90aGVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIGVudW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGxldCBlbnVtQ2FjaGUgPSAoc2NoZW1hIGFzIGFueSkuX2VudW1DYWNoZSBhc1xuICAgICAgfCB7IHByaW1pdGl2ZVNldDogU2V0PGFueT47IG9iamVjdFZhbHVlczogYW55W10gfVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWVudW1DYWNoZSkge1xuICAgICAgY29uc3QgcHJpbWl0aXZlU2V0ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgICBjb25zdCBvYmplY3RWYWx1ZXM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBsaXN0ID0gc2NoZW1hLmVudW07XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbnVtSXRlbSA9IGxpc3RbaV07XG4gICAgICAgIGlmIChlbnVtSXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgZW51bUl0ZW0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBvYmplY3RWYWx1ZXMucHVzaChlbnVtSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbWl0aXZlU2V0LmFkZChlbnVtSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW51bUNhY2hlID0geyBwcmltaXRpdmVTZXQsIG9iamVjdFZhbHVlcyB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZW51bUNhY2hlXCIsIHtcbiAgICAgICAgdmFsdWU6IGVudW1DYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgISh0eXBlb2YgZGF0YSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNOYU4oZGF0YSkpICYmXG4gICAgICBlbnVtQ2FjaGUucHJpbWl0aXZlU2V0LmhhcyhkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDb25zZXJ2YXRpdmUgZXhhY3Qtc2VtYW50aWNzIHBhdGguXG4gICAgICAvLyBGdXR1cmUgb3B0LWluIG9wdGltaXphdGlvbjogc3RydWN0dXJhbCBoYXNoaW5nIGJ1Y2tldHMgZm9yIGxhcmdlIGVudW1zLlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnVtQ2FjaGUub2JqZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChlbnVtQ2FjaGUub2JqZWN0VmFsdWVzW2ldLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJhbGxPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNJbnZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IG9ubHlCcmFuY2gudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IGJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSAhPT0gYnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGFueU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IGdldEJyYW5jaEVudHJpZXMoc2NoZW1hLCBcImFueU9mXCIpO1xuXG4gICAgaWYgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qgb25seUJyYW5jaCA9IGJyYW5jaGVzWzBdO1xuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBvbmx5QnJhbmNoLnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhID09PSBvbmx5QnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSBicmFuY2hlc1tpXTtcblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBicmFuY2gudmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChicmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgPT09IGJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJvbmVPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c1ZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSA9PT0gb25seUJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBicmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYnJhbmNoID0gYnJhbmNoZXNbaV07XG4gICAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBpc1ZhbGlkID0gIWJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzVmFsaWQgPSBkYXRhID09PSBicmFuY2gudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZENvdW50ID09PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBjb25zdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKGRhdGEgPT09IHNjaGVtYS5jb25zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChkYXRhICYmXG4gICAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIHNjaGVtYS5jb25zdCAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hLmNvbnN0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgIWhhc0NoYW5nZWQoZGF0YSwgc2NoZW1hLmNvbnN0KSkgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hLmNvbnN0KSAmJlxuICAgICAgICAhaGFzQ2hhbmdlZChkYXRhLCBzY2hlbWEuY29uc3QpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGlmKHNjaGVtYSwgZGF0YSkge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEubm90ICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLm5vdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLm5vdClcbiAgICApIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoc2NoZW1hLm5vdCBhcyBhbnkpLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gICRyZWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoc2NoZW1hLl9yZXNvbHZlZFJlZikge1xuICAgICAgaWYgKHNjaGVtYS4kdmFsaWRhdGUgIT09IHNjaGVtYS5fcmVzb2x2ZWRSZWYpIHtcbiAgICAgICAgc2NoZW1hLiR2YWxpZGF0ZSA9IHNjaGVtYS5fcmVzb2x2ZWRSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWEuX3Jlc29sdmVkUmVmKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZlBhdGggPSBzY2hlbWEuJHJlZjtcbiAgICBsZXQgdGFyZ2V0U2NoZW1hID0gaW5zdGFuY2UuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHRhcmdldFNjaGVtYSA9IGluc3RhbmNlLmdldFNjaGVtYUJ5SWQocmVmUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihgTWlzc2luZyByZWZlcmVuY2U6ICR7cmVmUGF0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlbWEuX3Jlc29sdmVkUmVmID0gdGFyZ2V0U2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBzY2hlbWEuJHZhbGlkYXRlID0gc2NoZW1hLl9yZXNvbHZlZFJlZjtcbiAgICByZXR1cm4gc2NoZW1hLl9yZXNvbHZlZFJlZihkYXRhKTtcbiAgfVxufTtcbiIsImltcG9ydCB7IEFycmF5S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IE51bWJlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvbnVtYmVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPYmplY3RLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT3RoZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL290aGVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBTdHJpbmdLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkc1wiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgLi4uT2JqZWN0S2V5d29yZHMsXG4gIC4uLkFycmF5S2V5d29yZHMsXG4gIC4uLlN0cmluZ0tleXdvcmRzLFxuICAuLi5OdW1iZXJLZXl3b3JkcyxcbiAgLi4uT3RoZXJLZXl3b3Jkc1xufTtcbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uLCBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGNvbXBpbGVQYXR0ZXJuTWF0Y2hlciB9IGZyb20gXCIuLi91dGlscy9wYXR0ZXJuLW1hdGNoZXJcIjtcblxuY29uc3QgUEFUVEVSTl9NQVRDSF9DQUNIRV9MSU1JVCA9IDUxMjtcbmNvbnN0IEZPUk1BVF9SRVNVTFRfQ0FDSEVfTElNSVQgPSA1MTI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwYXR0ZXJuTWF0Y2ggPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5NYXRjaCBhc1xuICAgICAgfCAoKHZhbHVlOiBzdHJpbmcpID0+IGJvb2xlYW4pXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGxldCBwYXR0ZXJuTWF0Y2hDYWNoZSA9IChzY2hlbWEgYXMgYW55KS5fcGF0dGVybk1hdGNoQ2FjaGUgYXNcbiAgICAgIHwgTWFwPHN0cmluZywgYm9vbGVhbj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFwYXR0ZXJuTWF0Y2gpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKHNjaGVtYS5wYXR0ZXJuKTtcbiAgICAgICAgcGF0dGVybk1hdGNoID1cbiAgICAgICAgICBjb21waWxlZCBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgICAgICAgPyAodmFsdWU6IHN0cmluZykgPT4gY29tcGlsZWQudGVzdCh2YWx1ZSlcbiAgICAgICAgICAgIDogY29tcGlsZWQ7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfcGF0dGVybk1hdGNoXCIsIHtcbiAgICAgICAgICB2YWx1ZTogcGF0dGVybk1hdGNoLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGF0dGVybk1hdGNoQ2FjaGUpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuTWF0Y2hDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBwYXR0ZXJuTWF0Y2hDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNYXRjaCA9IHBhdHRlcm5NYXRjaChkYXRhKTtcbiAgICBpZiAocGF0dGVybk1hdGNoQ2FjaGUuc2l6ZSA8IFBBVFRFUk5fTUFUQ0hfQ0FDSEVfTElNSVQpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlLnNldChkYXRhLCBpc01hdGNoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICAvLyBUYWtlIGludG8gYWNjb3VudCB0aGF0IGlmIHdlIHJlY2VpdmUgYSBmb3JtYXQgdGhhdCBpcyBub3QgZGVmaW5lZCwgd2VcbiAgLy8gd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IsIHdlIGp1c3QgaWdub3JlIGl0LlxuICBmb3JtYXQoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZm9ybWF0VmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2Zvcm1hdFZhbGlkYXRlIGFzXG4gICAgICB8IEZvcm1hdEZ1bmN0aW9uXG4gICAgICB8IGZhbHNlXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgYXNcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZvcm1hdFJlc3VsdENhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZSBhc1xuICAgICAgfCBNYXA8c3RyaW5nLCBib29sZWFuPlxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZm9ybWF0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWxpZGF0ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gaW5zdGFuY2UuaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKFxuICAgICAgICBzY2hlbWEuZm9ybWF0LFxuICAgICAgICBmb3JtYXRWYWxpZGF0ZVxuICAgICAgKTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkXCIsIHtcbiAgICAgICAgdmFsdWU6IGZvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQpIHtcbiAgICAgIGlmIChmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmICghZm9ybWF0UmVzdWx0Q2FjaGUpIHtcbiAgICAgIGZvcm1hdFJlc3VsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRSZXN1bHRDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRSZXN1bHRDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1ZhbGlkID0gZm9ybWF0VmFsaWRhdGUoZGF0YSk7XG4gICAgaWYgKGZvcm1hdFJlc3VsdENhY2hlLnNpemUgPCBGT1JNQVRfUkVTVUxUX0NBQ0hFX0xJTUlUKSB7XG4gICAgICBmb3JtYXRSZXN1bHRDYWNoZS5zZXQoZGF0YSwgaXNWYWxpZCk7XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgfVxufTtcbiIsIi8qKioqKioqKioqKioqKioqKiogUGF0aDogbGliL2luZGV4LnRzICoqKioqKioqKioqKioqKioqKi9cbmltcG9ydCB7XG4gIERlZmluZUVycm9yRnVuY3Rpb24sXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIHJlc29sdmVQYXRoXG59IGZyb20gXCIuL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgRm9ybWF0cyB9IGZyb20gXCIuL2Zvcm1hdHNcIjtcbmltcG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHNcIjtcbmltcG9ydCB7IGRlZXBDbG9uZVVuZnJlZXplIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuZXhwb3J0IHsgZGVlcENsb25lVW5mcmVlemUgYXMgZGVlcENsb25lIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHR5cGUgUmVzdWx0ID0gdm9pZCB8IFZhbGlkYXRpb25FcnJvciB8IHRydWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHtcbiAgICBkYXRhOiBhbnk7XG4gICAgZXJyb3I6IFZhbGlkYXRpb25FcnJvciB8IG51bGwgfCB0cnVlO1xuICAgIHZhbGlkOiBib29sZWFuO1xuICB9O1xuICBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWE7XG59XG5cbmludGVyZmFjZSBWYWxpZGF0b3JJdGVtIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWxpZGF0ZTogVmFsaWRhdGVGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYVNoaWVsZCB7XG4gIHByaXZhdGUgdHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGltbXV0YWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHJvb3RTY2hlbWE6IENvbXBpbGVkU2NoZW1hIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaWRSZWdpc3RyeTogTWFwPHN0cmluZywgQ29tcGlsZWRTY2hlbWE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZhaWxGYXN0OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW1tdXRhYmxlID0gZmFsc2UsXG4gICAgZmFpbEZhc3QgPSB0cnVlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIGZhaWxGYXN0PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5mYWlsRmFzdCA9IGZhaWxGYXN0O1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhUeXBlcykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRUeXBlKHR5cGUsIHZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhrZXl3b3JkcykpIHtcbiAgICAgIHRoaXMuYWRkS2V5d29yZChrZXl3b3JkLCB2YWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmb3JtYXQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoRm9ybWF0cykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtYXQoZm9ybWF0LCB2YWxpZGF0b3IgYXMgRm9ybWF0RnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFR5cGUobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IFR5cGVGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy50eXBlc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUeXBlIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMudHlwZXNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRUeXBlKHR5cGU6IHN0cmluZyk6IFR5cGVGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy50eXBlc1t0eXBlXTtcbiAgfVxuXG4gIGFkZEZvcm1hdChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogRm9ybWF0RnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0c1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBGb3JtYXQgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtYXRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0Rm9ybWF0KGZvcm1hdDogc3RyaW5nKTogRm9ybWF0RnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKGZvcm1hdDogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChGb3JtYXRzIGFzIFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+KVtmb3JtYXRdID09PSB2YWxpZGF0b3I7XG4gIH1cblxuICBhZGRLZXl3b3JkKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBLZXl3b3JkRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMua2V5d29yZHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgS2V5d29yZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLmtleXdvcmRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0S2V5d29yZChrZXl3b3JkOiBzdHJpbmcpOiBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMua2V5d29yZHNba2V5d29yZF07XG4gIH1cblxuICBnZXRTY2hlbWFSZWYocGF0aDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290U2NoZW1hKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlUGF0aCh0aGlzLnJvb3RTY2hlbWEsIHBhdGgpO1xuICB9XG5cbiAgZ2V0U2NoZW1hQnlJZChpZDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmlkUmVnaXN0cnkuZ2V0KGlkKTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIHRoaXMuaWRSZWdpc3RyeS5jbGVhcigpO1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgdGhpcy5yb290U2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgaWYgKChjb21waWxlZFNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHRoaXMubGlua1JlZmVyZW5jZXMoY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmICghY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwib25lT2ZcIixcbiAgICAgICAgICBjb21waWxlZFNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICk7XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0ZhbHNlXCIsXG4gICAgICAgICAgKGRhdGEpID0+IGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChzY2hlbWEgPT09IHRydWUpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0FueVwiLFxuICAgICAgICAgICgpID0+IHt9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTY2hlbWFMaWtlKHNjaGVtYSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJJbnZhbGlkIHNjaGVtYVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9BbnlcIixcbiAgICAgICAgICAoKSA9PiB7fVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJvb3RTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgICAgY29uc3QgY2xvbmVkRGF0YSA9IHRoaXMuaW1tdXRhYmxlID8gZGVlcENsb25lVW5mcmVlemUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgcmVzID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlIShjbG9uZWREYXRhKTtcblxuICAgICAgaWYgKHJlcykge1xuICAgICAgICByZXR1cm4geyBkYXRhOiBjbG9uZWREYXRhLCBlcnJvcjogcmVzLCB2YWxpZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogY2xvbmVkRGF0YSwgZXJyb3I6IG51bGwsIHZhbGlkOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmNvbXBpbGVkU2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNoYWxsb3dBcnJheUVxdWFscyhhOiBhbnlbXSwgYjogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICBrZXk6IFwiYWxsT2ZcIiB8IFwiYW55T2ZcIixcbiAgICBicmFuY2hlczogYW55W11cbiAgKTogYW55W10ge1xuICAgIGNvbnN0IG91dDogYW55W10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBicmFuY2hlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGl0ZW1ba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKGtleSwgaXRlbVtrZXldKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXN0ZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBvdXQucHVzaChuZXN0ZWRbal0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihicmFuY2hlczogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IGN1cnJlbnQgPSBicmFuY2hlcztcblxuICAgIHdoaWxlIChjdXJyZW50Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgaXRlbSA9IGN1cnJlbnRbMF07XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChpdGVtKSAmJlxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtLm9uZU9mKVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnQgPSBpdGVtLm9uZU9mO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGxldCBub3JtYWxpemVkID0gc2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYUtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEpO1xuICAgIGNvbnN0IGhhc09ubHlLZXkgPSAoa2V5OiBzdHJpbmcpID0+XG4gICAgICBzY2hlbWFLZXlzLmxlbmd0aCA9PT0gMSAmJiBzY2hlbWFLZXlzWzBdID09PSBrZXk7XG5cbiAgICBjb25zdCBzZXROb3JtYWxpemVkID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gc2NoZW1hKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQgPSB7IC4uLnNjaGVtYSB9O1xuICAgICAgfVxuICAgICAgbm9ybWFsaXplZFtrZXldID0gdmFsdWU7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5hbGxPZikpIHtcbiAgICAgIGNvbnN0IGZsYXR0ZW5lZEFsbE9mID0gdGhpcy5mbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICAgICAgXCJhbGxPZlwiLFxuICAgICAgICBzY2hlbWEuYWxsT2ZcbiAgICAgICkuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAhKFxuICAgICAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMFxuICAgICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaGFzT25seUtleShcImFsbE9mXCIpICYmXG4gICAgICAgIGZsYXR0ZW5lZEFsbE9mLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QoZmxhdHRlbmVkQWxsT2ZbMF0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5lZEFsbE9mWzBdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2hhbGxvd0FycmF5RXF1YWxzKGZsYXR0ZW5lZEFsbE9mLCBzY2hlbWEuYWxsT2YpKSB7XG4gICAgICAgIHNldE5vcm1hbGl6ZWQoXCJhbGxPZlwiLCBmbGF0dGVuZWRBbGxPZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkQW55T2YgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKFxuICAgICAgICBcImFueU9mXCIsXG4gICAgICAgIHNjaGVtYS5hbnlPZlxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBoYXNPbmx5S2V5KFwiYW55T2ZcIikgJiZcbiAgICAgICAgZmxhdHRlbmVkQW55T2YubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChmbGF0dGVuZWRBbnlPZlswXSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmxhdHRlbmVkQW55T2ZbMF07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zaGFsbG93QXJyYXlFcXVhbHMoZmxhdHRlbmVkQW55T2YsIHNjaGVtYS5hbnlPZikpIHtcbiAgICAgICAgc2V0Tm9ybWFsaXplZChcImFueU9mXCIsIGZsYXR0ZW5lZEFueU9mKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKSB7XG4gICAgICBjb25zdCBmbGF0dGVuZWRPbmVPZiA9IHRoaXMuZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihzY2hlbWEub25lT2YpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGhhc09ubHlLZXkoXCJvbmVPZlwiKSAmJlxuICAgICAgICBmbGF0dGVuZWRPbmVPZi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGZsYXR0ZW5lZE9uZU9mWzBdKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuZWRPbmVPZlswXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNoYWxsb3dBcnJheUVxdWFscyhmbGF0dGVuZWRPbmVPZiwgc2NoZW1hLm9uZU9mKSkge1xuICAgICAgICBzZXROb3JtYWxpemVkKFwib25lT2ZcIiwgZmxhdHRlbmVkT25lT2YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrU2NoZW1hSGFzUmVmKHNjaGVtYTogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBpZiAoKHNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9oYXNSZWZcIiwge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gc2NoZW1hW2tleV07XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSBcInJlcXVpcmVkXCI6XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG4gICAgICBjYXNlIFwidW5pcXVlSXRlbXNcIjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcbiAgICAgIGNhc2UgXCJwcm9wZXJ0aWVzXCI6XG4gICAgICBjYXNlIFwicGF0dGVyblByb3BlcnRpZXNcIjpcbiAgICAgIGNhc2UgXCJkZXBlbmRlbmNpZXNcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInByb3BlcnR5TmFtZXNcIjpcbiAgICAgIGNhc2UgXCJpdGVtc1wiOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWU7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjpcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlID09PSBmYWxzZSAmJlxuICAgICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKS5sZW5ndGggPiAwXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbEl0ZW1zXCI6XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCAhQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpO1xuICAgICAgY2FzZSBcImFsbE9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFueU9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1JlcXVpcmVkRGVmYXVsdHMoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzO1xuICAgIGlmICghdGhpcy5pc1BsYWluT2JqZWN0KHByb3BlcnRpZXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViU2NoZW1hID0gcHJvcGVydGllc1trZXlzW2ldXTtcbiAgICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qoc3ViU2NoZW1hKSAmJiBcImRlZmF1bHRcIiBpbiBzdWJTY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RlZmF1bHRUeXBlVmFsaWRhdG9yKHR5cGU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFR5cGVzIGFzIFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPilbdHlwZV0gPT09IHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSB0cnVlKSB7XG4gICAgICAgIHNjaGVtYSA9IHsgYW55T2Y6IFt7fV0gfTsgLy8gQWx3YXlzIHZhbGlkXG4gICAgICB9IGVsc2UgaWYgKHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2NoZW1hID0geyBvbmVPZjogW10gfTsgLy8gQWx3YXlzIGludmFsaWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVtYSA9IHsgb25lT2Y6IFtzY2hlbWFdIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZW1hID0gdGhpcy5ub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYSk7XG5cbiAgICBjb25zdCBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWEgPSBkZWVwQ2xvbmVVbmZyZWV6ZShcbiAgICAgIHNjaGVtYVxuICAgICkgYXMgQ29tcGlsZWRTY2hlbWE7XG5cbiAgICBsZXQgc2NoZW1hSGFzUmVmID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHNjaGVtYS4kaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuaWRSZWdpc3RyeS5zZXQoc2NoZW1hLiRpZCwgY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmIChcIiRyZWZcIiBpbiBzY2hlbWEpIHtcbiAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICBjb25zdCByZWZWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoXCIkcmVmXCIpO1xuICAgICAgaWYgKHJlZlZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwiJHJlZlwiLFxuICAgICAgICAgIHNjaGVtYVtcIiRyZWZcIl0sXG4gICAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIixcbiAgICAgICAgICAoZGF0YSkgPT5cbiAgICAgICAgICAgIChyZWZWYWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgY29tcGlsZWRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGRlZmluZUVycm9yLFxuICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFya1NjaGVtYUhhc1JlZihjb21waWxlZFNjaGVtYSk7XG4gICAgICByZXR1cm4gY29tcGlsZWRTY2hlbWE7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9ySXRlbVtdID0gW107XG4gICAgY29uc3QgYWN0aXZlTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoXCJ0eXBlXCIgaW4gc2NoZW1hKSB7XG4gICAgICBjb25zdCBkZWZpbmVUeXBlRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSlcbiAgICAgICAgPyBzY2hlbWEudHlwZVxuICAgICAgICA6IHNjaGVtYS50eXBlLnNwbGl0KFwiLFwiKS5tYXAoKHQ6IHN0cmluZykgPT4gdC50cmltKCkpO1xuXG4gICAgICBjb25zdCB0eXBlRnVuY3Rpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuICAgICAgY29uc3QgdHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZGVmYXVsdFR5cGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBhbGxUeXBlc0RlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZUZ1bmN0aW9ucy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgICAgdHlwZU5hbWVzLnB1c2godmFsaWRhdG9yLm5hbWUpO1xuICAgICAgICAgIGlmICh0aGlzLmlzRGVmYXVsdFR5cGVWYWxpZGF0b3IodHlwZSwgdmFsaWRhdG9yKSkge1xuICAgICAgICAgICAgZGVmYXVsdFR5cGVOYW1lcy5wdXNoKHR5cGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGxUeXBlc0RlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwidHlwZVwiLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICkoXCJJbnZhbGlkIHR5cGUgZm9yIHNjaGVtYVwiLCB7IGRhdGE6IHNjaGVtYS50eXBlIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgY29tYmluZWRUeXBlVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICAgICAgbGV0IHR5cGVNZXRob2ROYW1lID0gXCJcIjtcblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAxICYmIGFsbFR5cGVzRGVmYXVsdCkge1xuICAgICAgICBjb25zdCBzaW5nbGVUeXBlTmFtZSA9IGRlZmF1bHRUeXBlTmFtZXNbMF07XG4gICAgICAgIHR5cGVNZXRob2ROYW1lID0gc2luZ2xlVHlwZU5hbWU7XG5cbiAgICAgICAgc3dpdGNoIChzaW5nbGVUeXBlTmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcihkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghc2luZ2xlVHlwZUZuKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID4gMSAmJiBhbGxUeXBlc0RlZmF1bHQpIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSBkZWZhdWx0VHlwZU5hbWVzLmpvaW4oXCJfT1JfXCIpO1xuXG4gICAgICAgIGNvbnN0IGFsbG93c09iamVjdCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJvYmplY3RcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0FycmF5ID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImFycmF5XCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NTdHJpbmcgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwic3RyaW5nXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NOdW1iZXIgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwibnVtYmVyXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NJbnRlZ2VyID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImludGVnZXJcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0Jvb2xlYW4gPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwiYm9vbGVhblwiKTtcbiAgICAgICAgY29uc3QgYWxsb3dzTnVsbCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJudWxsXCIpO1xuXG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlb2YgZGF0YTtcblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c051bWJlciB8fCAoYWxsb3dzSW50ZWdlciAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRhdGEpKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c1N0cmluZykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIGlmIChhbGxvd3NCb29sZWFuKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzTnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFsbG93c09iamVjdCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlRnVuY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0eXBlTWV0aG9kTmFtZSA9IHR5cGVOYW1lc1swXTtcbiAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIXNpbmdsZVR5cGVGbihkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSB0eXBlTmFtZXMuam9pbihcIl9PUl9cIik7XG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZUZ1bmN0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiB0eXBlTWV0aG9kTmFtZSxcbiAgICAgICAgdmFsaWRhdGU6IGdldE5hbWVkRnVuY3Rpb24odHlwZU1ldGhvZE5hbWUsIGNvbWJpbmVkVHlwZVZhbGlkYXRvcilcbiAgICAgIH0pO1xuICAgICAgYWN0aXZlTmFtZXMucHVzaCh0eXBlTWV0aG9kTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlLCAkaWQsICRyZWYsICR2YWxpZGF0ZSwgcmVxdWlyZWQsIC4uLm90aGVyS2V5cyB9ID0gc2NoZW1hOyAvLyBFeGNsdWRlIGhhbmRsZWQga2V5c1xuXG4gICAgLy8gSW4gaGVyZSB3ZSBjcmVhdGUgYW4gYXJyYXkgb2Yga2V5cyBwdXR0aW5nIHRoZSByZXF1aXJlIGtleXdvcmQgbGFzdFxuICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQgYWZ0ZXIgZGVmYXVsdHMgYXJlIGFwcGxpZWRcbiAgICBjb25zdCBrZXlPcmRlciA9IHJlcXVpcmVkXG4gICAgICA/IHRoaXMuaGFzUmVxdWlyZWREZWZhdWx0cyhzY2hlbWEpXG4gICAgICAgID8gWy4uLk9iamVjdC5rZXlzKG90aGVyS2V5cyksIFwicmVxdWlyZWRcIl1cbiAgICAgICAgOiBbXCJyZXF1aXJlZFwiLCAuLi5PYmplY3Qua2V5cyhvdGhlcktleXMpXVxuICAgICAgOiBPYmplY3Qua2V5cyhvdGhlcktleXMpO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGtleXdvcmRGbiA9IHRoaXMuZ2V0S2V5d29yZChrZXkpO1xuXG4gICAgICBpZiAoIWtleXdvcmRGbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICBrZXksXG4gICAgICAgIHNjaGVtYVtrZXldLFxuICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICApO1xuICAgICAgY29uc3QgZm5OYW1lID0ga2V5d29yZEZuLm5hbWUgfHwga2V5O1xuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiBmbk5hbWUsXG4gICAgICAgIHZhbGlkYXRlOiBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KGZuTmFtZSwgKGRhdGEpID0+XG4gICAgICAgICAgKGtleXdvcmRGbiBhcyBLZXl3b3JkRnVuY3Rpb24pKGNvbXBpbGVkU2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgdGhpcylcbiAgICAgICAgKVxuICAgICAgfSk7XG5cbiAgICAgIGFjdGl2ZU5hbWVzLnB1c2goZm5OYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXRlcmFsS2V5d29yZHMgPSBbXCJlbnVtXCIsIFwiY29uc3RcIiwgXCJkZWZhdWx0XCIsIFwiZXhhbXBsZXNcIl07XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGlmIChsaXRlcmFsS2V5d29yZHMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzY2hlbWFba2V5XSAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hW2tleV0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJwcm9wZXJ0aWVzXCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1YktleSBvZiBPYmplY3Qua2V5cyhzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKFxuICAgICAgICAgICAgICBzY2hlbWFba2V5XVtzdWJLZXldXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBzY2hlbWFIYXNSZWYgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcGlsZWRTdWJTY2hlbWEgPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldID0gY29tcGlsZWRTdWJTY2hlbWE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWFba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWFba2V5XVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYVtrZXldW2ldKTtcbiAgICAgICAgICAgIGlmICgoY29tcGlsZWRTdWJTY2hlbWEgYXMgYW55KS5faGFzUmVmID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV1baV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYUhhc1JlZikge1xuICAgICAgdGhpcy5tYXJrU2NoZW1hSGFzUmVmKGNvbXBpbGVkU2NoZW1hKTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjb21waWxlZFNjaGVtYTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHYgPSB2YWxpZGF0b3JzWzBdO1xuICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbih2Lm5hbWUsIHYudmFsaWRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb21wb3NpdGVOYW1lID0gXCJWYWxpZGF0ZV9cIiArIGFjdGl2ZU5hbWVzLmpvaW4oXCJfQU5EX1wiKTtcblxuICAgICAgY29uc3QgbWFzdGVyVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uID0gKGRhdGEpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHZhbGlkYXRvcnNbaV07XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB2LnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9O1xuXG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKFxuICAgICAgICBjb21wb3NpdGVOYW1lLFxuICAgICAgICBtYXN0ZXJWYWxpZGF0b3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBpbGVkU2NoZW1hIGFzIENvbXBpbGVkU2NoZW1hO1xuICB9XG5cbiAgaXNTY2hlbWFMaWtlKHN1YlNjaGVtYTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgc3ViU2NoZW1hICYmXG4gICAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShzdWJTY2hlbWEpXG4gICAgKSB7XG4gICAgICBpZiAoXCJ0eXBlXCIgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBzdWJLZXkgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIGlmIChzdWJLZXkgaW4gdGhpcy5rZXl3b3Jkcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgbGlua1JlZmVyZW5jZXMocm9vdDogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBjb25zdCBzdGFjazogYW55W10gPSBbcm9vdF07XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBub2RlLiRyZWYgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgbm9kZS4kdmFsaWRhdGUubmFtZSA9PT0gXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlZlBhdGggPSBub2RlLiRyZWYgYXMgc3RyaW5nO1xuXG4gICAgICAgIGxldCB0YXJnZXQ6IGFueSA9IHRoaXMuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHRhcmdldCA9IHRoaXMuZ2V0U2NoZW1hQnlJZChyZWZQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmICh0YXJnZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5vZGUuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbihcIlZhbGlkYXRlX1JlZl9UcnVlXCIsICgpID0+IHt9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVmaW5lRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgICAgICAgXCIkcmVmXCIsXG4gICAgICAgICAgICAgIG5vZGUgYXMgYW55LFxuICAgICAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb24oXG4gICAgICAgICAgICAgIFwiVmFsaWRhdGVfUmVmX0ZhbHNlXCIsXG4gICAgICAgICAgICAgIChfZGF0YTogYW55KSA9PiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IHRhcmdldC4kdmFsaWRhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbm9kZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaCh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxJQUFLQyxFQUFrQixLQUNqRCxJQUFJTixFQUFhLEdBQUdLLEtBQVdFLEtBQUtULFVBQ2hDRyxFQUFlLEdBQUdLLElBWXRCLFlBWHlCLElBQWRDLEtBQUtWLE9BQ1csaUJBQWRVLEtBQUtWLE1BQXFCVSxLQUFLVixRQUFRVSxLQUFLSixTQUNyREgsR0FBYyxJQUFJTyxLQUFLVixRQUV6QkksR0FBZ0IsSUFBSU0sS0FBS1YsUUFHM0JVLEtBQUtOLGFBQWVBLEVBQ3BCTSxLQUFL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