@decaf-ts/utils 0.2.11 → 0.2.12

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.
@@ -2892,12 +2892,12 @@ class RegexpOutputWriter extends StandardOutputWriter {
2892
2892
  * @description Represents the current version of the module.
2893
2893
  * @summary This constant stores the version number of the @asdasdasd/utils module.
2894
2894
  * The actual version number is replaced during the build process,
2895
- * with the placeholder "0.2.11" being substituted with the current version.
2895
+ * with the placeholder "0.2.12" being substituted with the current version.
2896
2896
  *
2897
2897
  * @const VERSION
2898
2898
  * @memberOf module:@decaf-ts/utils
2899
2899
  */
2900
- const VERSION = "0.2.11";
2900
+ const VERSION = "0.2.12";
2901
2901
 
2902
2902
  export { AbortCode, Command, DefaultCommandOptions, DefaultCommandValues, Encoding, Environment, HttpClient, NoCIFLag, RegexpOutputWriter, SemVersion, SemVersionRegex, SetupScriptKey, StandardOutputWriter, Tokens, UserInput, VERSION, chainAbortController, copyFile, deletePath, escapeRegExp, getAllFiles, getDependencies, getPackage, getPackageVersion, getSlogan, installDependencies, installIfNotAvailable, lockify, normalizeImport, padEnd, patchFile, patchPlaceholders, patchString, printBanner, pushToGit, readFile, renameFile, runCommand, setPackageAttribute, spawnCommand, toCamelCase, toENVFormat, toKebabCase, toPascalCase, toSnakeCase, updateDependencies, writeFile };
2903
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2lucHV0L2lucHV0LnRzIiwiLi4vc3JjL2NsaS9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvdGV4dC50cyIsIi4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi9zcmMvd3JpdGVycy9TdGFuZGFyZE91dHB1dFdyaXRlci50cyIsIi4uL3NyYy91dGlscy91dGlscy50cyIsIi4uL3NyYy91dGlscy9mcy50cyIsIi4uL3NyYy9vdXRwdXQvY29tbW9uLnRzIiwiLi4vc3JjL3V0aWxzL3dlYi50cyIsIi4uL3NyYy91dGlscy9lbnZpcm9ubWVudC50cyIsIi4uL3NyYy9jbGkvY29tbWFuZC50cyIsIi4uL3NyYy91dGlscy9odHRwLnRzIiwiLi4vc3JjL3dyaXRlcnMvUmVnZXhwT3V0cHV0V3JpdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFuc3dlcnMsXG4gIENob2ljZSxcbiAgRmFsc3ksXG4gIEluaXRpYWxSZXR1cm5WYWx1ZSxcbiAgUHJldkNhbGxlcixcbiAgUHJvbXB0T2JqZWN0LFxuICBQcm9tcHRUeXBlLFxuICBWYWx1ZU9yRnVuYyxcbn0gZnJvbSBcInByb21wdHNcIjtcbmltcG9ydCBwcm9tcHRzIGZyb20gXCJwcm9tcHRzXCI7XG5pbXBvcnQgeyBwYXJzZUFyZ3MsIFBhcnNlQXJnc0NvbmZpZyB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBXcml0YWJsZSwgUmVhZGFibGUgfSBmcm9tIFwic3RyZWFtXCI7XG5pbXBvcnQgeyBLbGV1ciwgUGFyc2VBcmdzT3B0aW9uc0NvbmZpZywgUGFyc2VBcmdzUmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyBhIHVzZXIgaW5wdXQgcHJvbXB0IHdpdGggdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZmxleGlibGUgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgdXNlciBpbnB1dCBwcm9tcHRzLlxuICogSXQgaW1wbGVtZW50cyB0aGUgUHJvbXB0T2JqZWN0IGludGVyZmFjZSBmcm9tIHRoZSAncHJvbXB0cycgbGlicmFyeSBhbmQgb2ZmZXJzIG1ldGhvZHMgdG8gc2V0XG4gKiB2YXJpb3VzIHByb3BlcnRpZXMgb2YgdGhlIHByb21wdC4gVGhlIGNsYXNzIGFsc28gaW5jbHVkZXMgc3RhdGljIG1ldGhvZHMgZm9yIGNvbW1vbiBpbnB1dCBzY2VuYXJpb3NcbiAqIGFuZCBhcmd1bWVudCBwYXJzaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJJbnB1dDxSIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiBpbXBsZW1lbnRzIFByb21wdE9iamVjdDxSPiB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IExvZ2dpbmcuZm9yKFVzZXJJbnB1dCk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHR5cGUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgaW5wdXQgbWV0aG9kIChlLmcuLCB0ZXh0LCBudW1iZXIsIGNvbmZpcm0pLlxuICAgKi9cbiAgdHlwZTogUHJvbXB0VHlwZSB8IEZhbHN5IHwgUHJldkNhbGxlcjxSLCBQcm9tcHRUeXBlIHwgRmFsc3k+ID0gXCJ0ZXh0XCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBVc2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKi9cbiAgbmFtZTogVmFsdWVPckZ1bmM8Uj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBzdW1tYXJ5IFRoZSBxdWVzdGlvbiBvciBpbnN0cnVjdGlvbiBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBtZXNzYWdlPzogVmFsdWVPckZ1bmM8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFRoZSBkZWZhdWx0IHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICovXG4gIGluaXRpYWw/OlxuICAgIHwgSW5pdGlhbFJldHVyblZhbHVlXG4gICAgfCBQcmV2Q2FsbGVyPFIsIEluaXRpYWxSZXR1cm5WYWx1ZSB8IFByb21pc2U8SW5pdGlhbFJldHVyblZhbHVlPj5cbiAgICB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHByb21wdC5cbiAgICovXG4gIHN0eWxlPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZm9ybWF0IGZ1bmN0aW9uIGZvciB0aGUgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IEEgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSB1c2VyJ3MgaW5wdXQgYmVmb3JlIGl0J3MgcmV0dXJuZWQuXG4gICAqL1xuICBmb3JtYXQ/OiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBpbnB1dC5cbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKi9cbiAgdmFsaWRhdGU/OlxuICAgIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgc3RyaW5nIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPj5cbiAgICB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBvblN0YXRlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgcHJvbXB0IGNoYW5nZXMuXG4gICAqL1xuICBvblN0YXRlPzogUHJldkNhbGxlcjxSLCB2b2lkPiB8IHVuZGVmaW5lZDtcblxuICBvblJlbmRlcj86ICgoa2xldXI6IEtsZXVyKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtaW5pbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgbG93ZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqL1xuICBtaW4/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgaGlnaGVzdCBudW1iZXIgdGhlIHVzZXIgY2FuIGlucHV0LlxuICAgKi9cbiAgbWF4PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRvIGFsbG93IGZsb2F0IHZhbHVlcyBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgSWYgdHJ1ZSwgYWxsb3dzIGRlY2ltYWwgbnVtYmVycy5cbiAgICovXG4gIGZsb2F0PzogYm9vbGVhbiB8IFByZXZDYWxsZXI8UiwgYm9vbGVhbiB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdG8gZm9yIGZsb2F0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgcHJlY2lzaW9uIG9mIGZsb2F0IGlucHV0cy5cbiAgICovXG4gIHJvdW5kPzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnN0cnVjdGlvbnMgZm9yIHRoZSB1c2VyLlxuICAgKiBAc3VtbWFyeSBBZGRpdGlvbmFsIGd1aWRhbmNlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBzdGVwIHNpemUgd2hlbiBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgdGhlIG51bWJlci5cbiAgICovXG4gIGluY3JlbWVudD86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNlcGFyYXRvciBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBzZXBhcmF0ZSBsaXN0IGl0ZW1zLlxuICAgKi9cbiAgc2VwYXJhdG9yPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0eWxlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uXG4gICAqL1xuICBhY3RpdmU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmFjdGl2ZSBvcHRpb24gc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBzdHlsZSBhcHBsaWVkIHRvIG5vbi1zZWxlY3RlZCBvcHRpb25zLlxuICAgKi9cbiAgaW5hY3RpdmU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICBjaG9pY2VzPzogQ2hvaWNlW10gfCBQcmV2Q2FsbGVyPFIsIENob2ljZVtdIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGhpbnQgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBoaW50Pzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgd2FybmluZyB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBBIHdhcm5pbmcgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICB3YXJuPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgc3VnZ2VzdD86ICgoaW5wdXQ6IGFueSwgY2hvaWNlczogQ2hvaWNlW10pID0+IFByb21pc2U8YW55PikgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGltaXQgZm9yIGxpc3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqL1xuICBsaW1pdD86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1hc2sgZm9yIHBhc3N3b3JkIGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIGNoYXJhY3RlciB1c2VkIHRvIGhpZGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICovXG4gIG1hc2s/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdGRvdXQgc3RyZWFtIGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBUaGUgb3V0cHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQuXG4gICAqL1xuICBzdGRvdXQ/OiBXcml0YWJsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdGRpbiBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFRoZSBpbnB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0LlxuICAgKi9cbiAgc3RkaW4/OiBSZWFkYWJsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVXNlcklucHV0IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBVc2VySW5wdXQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWU6IFZhbHVlT3JGdW5jPFI+KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBpbnB1dCBtZXRob2QgZm9yIHRoZSBwcm9tcHQuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFR5cGUodHlwZTogUHJvbXB0VHlwZSB8IEZhbHN5IHwgUHJldkNhbGxlcjxSLCBQcm9tcHRUeXBlIHwgRmFsc3k+KTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHR5cGUgdG86ICR7dHlwZX1gKTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtZXNzYWdlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHF1ZXN0aW9uIG9yIGluc3RydWN0aW9uIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWVzc2FnZSh2YWx1ZTogVmFsdWVPckZ1bmM8c3RyaW5nPiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBtZXNzYWdlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGRlZmF1bHQgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEluaXRpYWwoXG4gICAgdmFsdWU6XG4gICAgICB8IEluaXRpYWxSZXR1cm5WYWx1ZVxuICAgICAgfCBQcmV2Q2FsbGVyPFIsIEluaXRpYWxSZXR1cm5WYWx1ZSB8IFByb21pc2U8SW5pdGlhbFJldHVyblZhbHVlPj5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBpbml0aWFsIHZhbHVlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5pdGlhbCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHByb21wdC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0eWxlIHRvIGJlIGFwcGxpZWQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdHlsZSh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3R5bGUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5zdHlsZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBmb3JtYXQgZnVuY3Rpb24gb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgdXNlcidzIGlucHV0IGJlZm9yZSBpdCdzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgZm9ybWF0IGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0Rm9ybWF0KHZhbHVlOiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGZvcm1hdCBmdW5jdGlvbmApO1xuICAgIHRoaXMuZm9ybWF0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0VmFsaWRhdGUoXG4gICAgdmFsdWU6XG4gICAgICB8IFByZXZDYWxsZXI8UiwgYm9vbGVhbiB8IHN0cmluZyB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4+XG4gICAgICB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgdmFsaWRhdGUgZnVuY3Rpb25gKTtcbiAgICB0aGlzLnZhbGlkYXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG9uU3RhdGUgY2FsbGJhY2sgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgcHJvbXB0IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvblN0YXRlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0T25TdGF0ZSh2YWx1ZTogUHJldkNhbGxlcjxSLCB2b2lkPiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBvblN0YXRlIGNhbGxiYWNrYCk7XG4gICAgdGhpcy5vblN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG9uUmVuZGVyIGNhbGxiYWNrIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcHJvbXB0IGlzIHJlbmRlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgb25SZW5kZXIgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRPblJlbmRlcih2YWx1ZTogKChrbGV1cjogS2xldXIpID0+IHZvaWQpIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG9uUmVuZGVyIGNhbGxiYWNrYCk7XG4gICAgdGhpcy5vblJlbmRlciA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBsb3dlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1pbmltdW0gdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNaW4odmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1pbiB2YWx1ZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLm1pbiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBoaWdoZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBtYXhpbXVtIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWF4KHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBtYXggdmFsdWUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tYXggPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB3aGV0aGVyIHRvIGFsbG93IGZsb2F0IHZhbHVlcyBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB3aGV0aGVyIGRlY2ltYWwgbnVtYmVycyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gV2hldGhlciB0byBhbGxvdyBmbG9hdCB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRGbG9hdCh2YWx1ZTogYm9vbGVhbiB8IFByZXZDYWxsZXI8UiwgYm9vbGVhbiB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBmbG9hdCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmZsb2F0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0byBmb3IgZmxvYXQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBwcmVjaXNpb24gb2YgZmxvYXQgaW5wdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0Um91bmQodmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHJvdW5kIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMucm91bmQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgdXNlci5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhZGRpdGlvbmFsIGd1aWRhbmNlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5zdHJ1Y3Rpb25zLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5zdHJ1Y3Rpb25zKHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluc3RydWN0aW9ucyB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmluc3RydWN0aW9ucyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHN0ZXAgc2l6ZSB3aGVuIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgbnVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5jcmVtZW50IHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5jcmVtZW50KFxuICAgIHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaW5jcmVtZW50IHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5jcmVtZW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHNlcGFyYXRvciBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIGxpc3QgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0U2VwYXJhdG9yKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc2VwYXJhdG9yIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuc2VwYXJhdG9yID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGFjdGl2ZSBvcHRpb24gc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHN0eWxlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhY3RpdmUgb3B0aW9uIHN0eWxlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0QWN0aXZlKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBhY3RpdmUgc3R5bGUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5hY3RpdmUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaW5hY3RpdmUgb3B0aW9uIHN0eWxlIGZvciBzZWxlY3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBzdHlsZSBhcHBsaWVkIHRvIG5vbi1zZWxlY3RlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5hY3RpdmUgb3B0aW9uIHN0eWxlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5hY3RpdmUodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluYWN0aXZlIHN0eWxlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5hY3RpdmUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENob2ljZXMoXG4gICAgdmFsdWU6IENob2ljZVtdIHwgUHJldkNhbGxlcjxSLCBDaG9pY2VbXSB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgY2hvaWNlczogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgdGhpcy5jaG9pY2VzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGhpbnQgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGhpbnQgdGV4dC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEhpbnQodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGhpbnQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5oaW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHdhcm5pbmcgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIHdhcm5pbmcgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB3YXJuaW5nIHRleHQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRXYXJuKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyB3YXJuIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMud2FybiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0U3VnZ2VzdChcbiAgICB2YWx1ZTogKChpbnB1dDogYW55LCBjaG9pY2VzOiBDaG9pY2VbXSkgPT4gUHJvbWlzZTxhbnk+KSB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3VnZ2VzdCBmdW5jdGlvbmApO1xuICAgIHRoaXMuc3VnZ2VzdCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBsaW1pdCBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGluIGxpc3QtdHlwZSBwcm9tcHRzLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkLCBvciBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGlzIHZhbHVlLlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRMaW1pdCh2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbGltaXQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5saW1pdCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXNrIGZvciBwYXNzd29yZCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIGhpZGUgdGhlIHVzZXIncyBpbnB1dCBpbiBwYXNzd29yZC10eXBlIHByb21wdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQsIG9yIGEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoaXMgdmFsdWUuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE1hc2sodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1hc2sgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tYXNrID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHN0ZG91dCBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIG91dHB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0IGZvciBkaXNwbGF5aW5nIG1lc3NhZ2VzIGFuZCByZXN1bHRzLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgV3JpdGFibGUgc3RyZWFtIHRvIGJlIHVzZWQgYXMgc3Rkb3V0LlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdGRvdXQodmFsdWU6IFdyaXRhYmxlIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHN0ZG91dCBzdHJlYW1gKTtcbiAgICB0aGlzLnN0ZG91dCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc3RkaW4gc3RyZWFtIGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBpbnB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0IGZvciByZWNlaXZpbmcgdXNlciBpbnB1dC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIFJlYWRhYmxlIHN0cmVhbSB0byBiZSB1c2VkIGFzIHN0ZGluLlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdGRpbih2YWx1ZTogUmVhZGFibGUgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICB0aGlzLnN0ZGluID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGlucHV0IGJhc2VkIG9uIHRoZSBjdXJyZW50IFVzZXJJbnB1dCBjb25maWd1cmF0aW9uLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIGFuZCByZXR1cm5zIHRoZWlyIHJlc3BvbnNlIGFzIGEgc2luZ2xlIHZhbHVlLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXNlcidzIGFuc3dlci5cbiAgICovXG4gIGFzeW5jIGFzaygpIHtcbiAgICByZXR1cm4gKGF3YWl0IFVzZXJJbnB1dC5hc2sodGhpcykpW3RoaXMubmFtZSBhcyBrZXlvZiBBbnN3ZXJzPFI+XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBvbmUgb3IgbW9yZSBxdWVzdGlvbnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIFVzZXJJbnB1dCBjb25maWd1cmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB3aXRoIG9uZSBvciBtb3JlIHF1ZXN0aW9ucyBhbmQgcmV0dXJucyB0aGVpciBhbnN3ZXJzIGFzIGFuIG9iamVjdC5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIEEgc2luZ2xlIFVzZXJJbnB1dCBpbnN0YW5jZSBvciBhbiBhcnJheSBvZiBVc2VySW5wdXQgaW5zdGFuY2VzLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB1c2VyJ3MgYW5zd2Vycy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBhc2sgbWV0aG9kXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBwcm9tcHRzIGxpYnJhcnlcbiAgICogICBBLT4+UDogQ2FsbCBwcm9tcHRzIHdpdGggcXVlc3Rpb24ocylcbiAgICogICBQLT4+VTogRGlzcGxheSBwcm9tcHQocylcbiAgICogICBVLT4+UDogUHJvdmlkZSBpbnB1dFxuICAgKiAgIFAtPj5BOiBSZXR1cm4gYW5zd2Vyc1xuICAgKiAgIEEtPj5BOiBQcm9jZXNzIGFuc3dlcnNcbiAgICogICBBLS0+PkNhbGxlcjogUmV0dXJuIHByb2Nlc3NlZCBhbnN3ZXJzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrPFIgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIHF1ZXN0aW9uOiBVc2VySW5wdXQ8Uj4gfCBVc2VySW5wdXQ8Uj5bXVxuICApIHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFzayk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHF1ZXN0aW9uKSkge1xuICAgICAgcXVlc3Rpb24gPSBbcXVlc3Rpb25dO1xuICAgIH1cbiAgICBsZXQgYW5zd2VyczogQW5zd2VyczxSPjtcbiAgICB0cnkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBBc2tpbmcgcXVlc3Rpb25zOiAke3F1ZXN0aW9uLm1hcCgocSkgPT4gcS5uYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIGFuc3dlcnMgPSBhd2FpdCBwcm9tcHRzKHF1ZXN0aW9uKTtcbiAgICAgIGxvZy52ZXJib3NlKGBSZWNlaXZlZCBhbnN3ZXJzOiAke0pTT04uc3RyaW5naWZ5KGFuc3dlcnMsIG51bGwsIDIpfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGdldHRpbmcgaW5wdXQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICAgIHJldHVybiBhbnN3ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIG51bWJlciBpbnB1dC5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIG51bWJlciwgd2l0aCBvcHRpb25hbCBtaW5pbXVtLCBtYXhpbXVtLCBhbmQgaW5pdGlhbCB2YWx1ZXMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gbWluIC0gVGhlIG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gbWF4IC0gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBudW1iZXIgZW50ZXJlZCBieSB0aGUgdXNlci5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2tOdW1iZXIoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgbWluPzogbnVtYmVyLFxuICAgIG1heD86IG51bWJlcixcbiAgICBpbml0aWFsPzogbnVtYmVyXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5hc2tOdW1iZXIpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyBudW1iZXIgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBtaW46ICR7bWlufSwgbWF4OiAke21heH0sIGluaXRpYWw6ICR7aW5pdGlhbH1gXG4gICAgKTtcbiAgICBjb25zdCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KG5hbWUpXG4gICAgICAuc2V0TWVzc2FnZShxdWVzdGlvbilcbiAgICAgIC5zZXRUeXBlKFwibnVtYmVyXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNaW4obWluKTtcblxuICAgIGlmICh0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWF4KG1heCk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmFzayh1c2VySW5wdXQpKVtuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBmb3IgYSB0ZXh0IGlucHV0LlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIHRleHQsIHdpdGggb3B0aW9uYWwgbWFza2luZyBhbmQgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBtYXNrIC0gVGhlIGNoYXJhY3RlciB1c2VkIHRvIG1hc2sgdGhlIGlucHV0IChvcHRpb25hbCwgZm9yIHBhc3N3b3JkLWxpa2UgaW5wdXRzKS5cbiAgICogQHBhcmFtIGluaXRpYWwgLSBUaGUgaW5pdGlhbCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdGV4dCBlbnRlcmVkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza1RleHQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgbWFzazogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGluaXRpYWw/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFza1RleHQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyB0ZXh0IGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgbWFzazogJHttYXNrfSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSkuc2V0TWVzc2FnZShxdWVzdGlvbik7XG5cbiAgICBpZiAobWFzaykgdXNlcklucHV0LnNldE1hc2sobWFzayk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcInN0cmluZ1wiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIGNvbmZpcm1hdGlvbiAoeWVzL25vKS5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB3aXRoIGEgeWVzL25vIHF1ZXN0aW9uIGFuZCByZXR1cm5zIGEgYm9vbGVhbiByZXN1bHQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHVzZXIncyBhbnN3ZXIuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrQ29uZmlybWF0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbjogc3RyaW5nLFxuICAgIGluaXRpYWw/OiBib29sZWFuXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrQ29uZmlybWF0aW9uKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBBc2tpbmcgY29uZmlybWF0aW9uIGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSlcbiAgICAgIC5zZXRNZXNzYWdlKHF1ZXN0aW9uKVxuICAgICAgLnNldFR5cGUoXCJjb25maXJtXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsICE9PSBcInVuZGVmaW5lZFwiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwZWF0ZWRseSBhc2tzIGZvciBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBleHBlY3RlZCByZXN1bHQuXG4gICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBVc2VySW5wdXQgaW5zdGFuY2UgdG8gdXNlIGZvciBwcm9tcHRpbmcuXG4gICAqIEBwYXJhbSB0ZXN0IC0gQSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgYWxsb3dlZCAoZGVmYXVsdCBpcyAxKS5cbiAgICogQHBhcmFtIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWQgaW5wdXQgb3IgdW5kZWZpbmVkIGlmIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBJIGFzIGluc2lzdCBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIGFzayBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIHRlc3QgZnVuY3Rpb25cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIGFza0NvbmZpcm1hdGlvbiBtZXRob2RcbiAgICogICBsb29wIFVudGlsIHZhbGlkIGlucHV0IG9yIGxpbWl0IHJlYWNoZWRcbiAgICogICAgIEktPj5BOiBDYWxsIGFzayB3aXRoIGlucHV0XG4gICAqICAgICBBLT4+VTogUHJvbXB0IHVzZXJcbiAgICogICAgIFUtPj5BOiBQcm92aWRlIGlucHV0XG4gICAqICAgICBBLT4+STogUmV0dXJuIHJlc3VsdFxuICAgKiAgICAgSS0+PlQ6IFRlc3QgcmVzdWx0XG4gICAqICAgICBhbHQgVGVzdCBwYXNzZXNcbiAgICogICAgICAgSS0+PkM6IEFzayBmb3IgY29uZmlybWF0aW9uXG4gICAqICAgICAgIEMtPj5VOiBDb25maXJtIGlucHV0XG4gICAqICAgICAgIFUtPj5DOiBQcm92aWRlIGNvbmZpcm1hdGlvblxuICAgKiAgICAgICBDLT4+STogUmV0dXJuIGNvbmZpcm1hdGlvblxuICAgKiAgICAgICBhbHQgQ29uZmlybWVkXG4gICAqICAgICAgICAgSS0tPj5DYWxsZXI6IFJldHVybiB2YWxpZCByZXN1bHRcbiAgICogICAgICAgZWxzZSBOb3QgY29uZmlybWVkXG4gICAqICAgICAgICAgSS0+Pkk6IENvbnRpbnVlIGxvb3BcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIFRlc3QgZmFpbHNcbiAgICogICAgICAgSS0+Pkk6IENvbnRpbnVlIGxvb3BcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIEktLT4+Q2FsbGVyOiBSZXR1cm4gdW5kZWZpbmVkIGlmIGxpbWl0IHJlYWNoZWRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbnNpc3Q8Uj4oXG4gICAgaW5wdXQ6IFVzZXJJbnB1dCxcbiAgICB0ZXN0OiAocmVzOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgZGVmYXVsdENvbmZpcm1hdGlvbjogYm9vbGVhbixcbiAgICBsaW1pdCA9IDFcbiAgKTogUHJvbWlzZTxSIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5pbnNpc3QpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEluc2lzdGluZyBvbiBpbnB1dDogJHtpbnB1dC5uYW1lfSwgdGVzdDogJHt0ZXN0LnRvU3RyaW5nKCl9LCBkZWZhdWx0Q29uZmlybWF0aW9uOiAke2RlZmF1bHRDb25maXJtYXRpb259LCBsaW1pdDogJHtsaW1pdH1gXG4gICAgKTtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgY29uZmlybWF0aW9uOiBib29sZWFuO1xuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IChhd2FpdCBVc2VySW5wdXQuYXNrKGlucHV0KSlbXG4gICAgICAgICAgaW5wdXQubmFtZSBhcyBrZXlvZiBBbnN3ZXJzPHN0cmluZz5cbiAgICAgICAgXSBhcyBzdHJpbmc7XG4gICAgICAgIGlmICghdGVzdChyZXN1bHQpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpcm1hdGlvbiA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgICAgYCR7aW5wdXQubmFtZX0tY29uZmlybWAsXG4gICAgICAgICAgYElzIHRoZSAke2lucHV0LnR5cGV9IGNvcnJlY3Q/YCxcbiAgICAgICAgICBkZWZhdWx0Q29uZmlybWF0aW9uXG4gICAgICAgICk7XG4gICAgICAgIGlmICghY29uZmlybWF0aW9uKSByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB9IHdoaWxlICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiICYmIGxpbWl0ID4gMSAmJiBjb3VudCsrIDwgbGltaXQpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRXJyb3Igd2hpbGUgaW5zaXN0aW5nOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSBsb2cuaW5mbyhcIm5vIHNlbGVjdGlvbi4uLlwiKTtcbiAgICByZXR1cm4gcmVzdWx0IGFzIFIgfCB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBlYXRlZGx5IGFza3MgZm9yIHRleHQgaW5wdXQgdW50aWwgYSB2YWxpZCByZXNwb25zZSBpcyBnaXZlbiBvciB0aGUgbGltaXQgaXMgcmVhY2hlZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaW5zaXN0cyBvbiBnZXR0aW5nIGEgdmFsaWQgdGV4dCBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQsIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIHRlc3QgLSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqIEBwYXJhbSBtYXNrIC0gVGhlIGNoYXJhY3RlciB1c2VkIHRvIG1hc2sgdGhlIGlucHV0IChvcHRpb25hbCwgZm9yIHBhc3N3b3JkLWxpa2UgaW5wdXRzKS5cbiAgICogQHBhcmFtIGluaXRpYWwgLSBUaGUgaW5pdGlhbCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgKG9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICogQHBhcmFtIGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIGFsbG93ZWQgKGRlZmF1bHQgaXMgLTEsIG1lYW5pbmcgdW5saW1pdGVkKS5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWQgaW5wdXQgb3IgdW5kZWZpbmVkIGlmIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluc2lzdEZvclRleHQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgdGVzdDogKHJlczogc3RyaW5nKSA9PiBib29sZWFuLFxuICAgIG1hc2s6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBpbml0aWFsPzogc3RyaW5nLFxuICAgIGRlZmF1bHRDb25maXJtYXRpb24gPSBmYWxzZSxcbiAgICBsaW1pdCA9IC0xXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5pbnNpc3RGb3JUZXh0KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBJbnNpc3RpbmcgZm9yIHRleHQgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIG1hc2s6ICR7bWFza30sIGluaXRpYWw6ICR7aW5pdGlhbH0sIGRlZmF1bHRDb25maXJtYXRpb246ICR7ZGVmYXVsdENvbmZpcm1hdGlvbn0sIGxpbWl0OiAke2xpbWl0fWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSkuc2V0TWVzc2FnZShxdWVzdGlvbik7XG5cbiAgICBpZiAobWFzaykgdXNlcklucHV0LnNldE1hc2sobWFzayk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcInN0cmluZ1wiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuaW5zaXN0KFxuICAgICAgdXNlcklucHV0LFxuICAgICAgdGVzdCBhcyAocmVzOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgICBkZWZhdWx0Q29uZmlybWF0aW9uLFxuICAgICAgbGltaXRcbiAgICApKSBhcyBzdHJpbmc7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBlYXRlZGx5IGFza3MgZm9yIG51bWJlciBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCBudW1iZXIgaW5wdXQgZnJvbSB0aGUgdXNlciwgYWxsb3dpbmcgZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBhdHRlbXB0cy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSB0ZXN0IC0gQSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKiBAcGFyYW0gbWluIC0gVGhlIG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gbWF4IC0gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZGVmYXVsdENvbmZpcm1hdGlvblxuICAgKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgYWxsb3dlZCAoZGVmYXVsdCBpcyAtMSwgbWVhbmluZyB1bmxpbWl0ZWQpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5zaXN0Rm9yTnVtYmVyKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbjogc3RyaW5nLFxuICAgIHRlc3Q6IChyZXM6IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICBtaW4/OiBudW1iZXIsXG4gICAgbWF4PzogbnVtYmVyLFxuICAgIGluaXRpYWw/OiBudW1iZXIsXG4gICAgZGVmYXVsdENvbmZpcm1hdGlvbiA9IGZhbHNlLFxuICAgIGxpbWl0ID0gLTFcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdEZvck51bWJlcik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgSW5zaXN0aW5nIGZvciBudW1iZXIgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIG1pbjogJHttaW59LCBtYXg6ICR7bWF4fSwgaW5pdGlhbDogJHtpbml0aWFsfSwgZGVmYXVsdENvbmZpcm1hdGlvbjogJHtkZWZhdWx0Q29uZmlybWF0aW9ufSwgbGltaXQ6ICR7bGltaXR9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKVxuICAgICAgLnNldE1lc3NhZ2UocXVlc3Rpb24pXG4gICAgICAuc2V0VHlwZShcIm51bWJlclwiKTtcblxuICAgIGlmICh0eXBlb2YgbWluID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWluKG1pbik7XG5cbiAgICBpZiAodHlwZW9mIG1heCA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldE1heChtYXgpO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuaW5zaXN0KFxuICAgICAgdXNlcklucHV0LFxuICAgICAgdGVzdCBhcyAocmVzOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgICBkZWZhdWx0Q29uZmlybWF0aW9uLFxuICAgICAgbGltaXRcbiAgICApKSBhcyBudW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICAgKiBAc3VtbWFyeSBVc2VzIE5vZGUuanMncyB1dGlsLnBhcnNlQXJncyB0byBwYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCByZXR1cm4gdGhlIHJlc3VsdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHBhcnNpbmcgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXJzZWQgYXJndW1lbnRzLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgcGFyc2VBcmdzIG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgdXRpbC5wYXJzZUFyZ3NcbiAgICogICBDLT4+UDogQ2FsbCB3aXRoIG9wdGlvbnNcbiAgICogICBQLT4+UDogUHJlcGFyZSBhcmdzIG9iamVjdFxuICAgKiAgIFAtPj5VOiBDYWxsIHBhcnNlQXJncyB3aXRoIHByZXBhcmVkIGFyZ3NcbiAgICogICBVLT4+UDogUmV0dXJuIHBhcnNlZCByZXN1bHRcbiAgICogICBQLS0+PkM6IFJldHVybiBQYXJzZUFyZ3NSZXN1bHRcbiAgICovXG4gIHN0YXRpYyBwYXJzZUFyZ3Mob3B0aW9uczogUGFyc2VBcmdzT3B0aW9uc0NvbmZpZyk6IFBhcnNlQXJnc1Jlc3VsdCB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5wYXJzZUFyZ3MpO1xuICAgIGNvbnN0IGFyZ3M6IFBhcnNlQXJnc0NvbmZpZyA9IHtcbiAgICAgIGFyZ3M6IHByb2Nlc3MuYXJndi5zbGljZSgyKSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfTtcbiAgICBsb2cuZGVidWcoYFBhcnNpbmcgYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MsIG51bGwsIDIpfWApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcGFyc2VBcmdzKGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBFcnJvciB3aGlsZSBwYXJzaW5nIGFyZ3VtZW50czpcXG4ke0pTT04uc3RyaW5naWZ5KGFyZ3MsIG51bGwsIDIpfVxcbiB8IG9wdGlvbnNcXG4ke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMsIG51bGwsIDIpfVxcbiB8ICR7ZXJyb3J9YFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgcGFyc2luZyBhcmd1bWVudHM6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbW1hbmQgb3B0aW9ucyBmb3IgQ0xJIGNvbW1hbmRzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc3RydWN0dXJlIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgY29tbW9uIGNvbW1hbmQtbGluZSBvcHRpb25zIHVzZWQgYWNyb3NzIHZhcmlvdXMgQ0xJIGNvbW1hbmRzLlxuICogQGNvbnN0IERlZmF1bHRDb21tYW5kT3B0aW9uc1xuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdENvbW1hbmRPcHRpb25zXG4gKiBAcHJvcGVydHkge09iamVjdH0gdmVyYm9zZSAtIFZlcmJvc2l0eSBsZXZlbCBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyYm9zZS50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHZlcmJvc2Ugb3B0aW9uIChudW1iZXIpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcmJvc2Uuc2hvcnQgLSBUaGUgc2hvcnQgZmxhZyBmb3IgdGhlIHZlcmJvc2Ugb3B0aW9uIChWKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdmVyYm9zaXR5ICgwKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB2ZXJzaW9uIC0gVmVyc2lvbiBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdmVyc2lvbiBvcHRpb24gKGJvb2xlYW4pLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24uc2hvcnQgLSBUaGUgc2hvcnQgZmxhZyBmb3IgdGhlIHZlcnNpb24gb3B0aW9uICh2KS5cbiAqIEBwcm9wZXJ0eSB7dW5kZWZpbmVkfSB2ZXJzaW9uLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdmVyc2lvbiBkaXNwbGF5ICh1bmRlZmluZWQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGhlbHAgLSBIZWxwIGRpc3BsYXkgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhlbHAudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBoZWxwIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGVscC5zaG9ydCAtIFRoZSBzaG9ydCBmbGFnIGZvciB0aGUgaGVscCBvcHRpb24gKGgpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBoZWxwLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgaGVscCBkaXNwbGF5IChmYWxzZSkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwgLSBMb2cgbGV2ZWwgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvZ0xldmVsLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgbG9nTGV2ZWwgb3B0aW9uIChzdHJpbmcpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvZ0xldmVsLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbG9nIGxldmVsIChcImluZm9cIikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nU3R5bGUgLSBMb2cgc3R5bGluZyBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9nU3R5bGUudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBsb2dTdHlsZSBvcHRpb24gKGJvb2xlYW4pLlxuICogQHByb3BlcnR5IHtib29sZWFufSBsb2dTdHlsZS5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGxvZyBzdHlsaW5nICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0aW1lc3RhbXAgLSBUaW1lc3RhbXAgZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGltZXN0YW1wLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdGltZXN0YW1wIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRpbWVzdGFtcC5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRpbWVzdGFtcCBkaXNwbGF5ICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBiYW5uZXIgLSBCYW5uZXIgZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYmFubmVyLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgYmFubmVyIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJhbm5lci5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGJhbm5lciBkaXNwbGF5IChmYWxzZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q29tbWFuZE9wdGlvbnMgPSB7XG4gIHZlcmJvc2U6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJWXCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICB2ZXJzaW9uOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwidlwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbiAgaGVscDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcImhcIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgbG9nTGV2ZWw6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIGRlZmF1bHQ6IFwiaW5mb1wiLFxuICB9LFxuICBsb2dTdHlsZToge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHRpbWVzdGFtcDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIGJhbm5lcjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbW1hbmQgdmFsdWVzIGRlcml2ZWQgZnJvbSBEZWZhdWx0Q29tbWFuZE9wdGlvbnMuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiBhbGwgb3B0aW9ucyBkZWZpbmVkIGluIERlZmF1bHRDb21tYW5kT3B0aW9ucy5cbiAqIEBjb25zdCBEZWZhdWx0Q29tbWFuZFZhbHVlc1xuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdENvbW1hbmRWYWx1ZXNcbiAqIEBwcm9wZXJ0eSB7dW5rbm93bn0gW2tleTogc3RyaW5nXSAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIG9wdGlvbiBpbiBEZWZhdWx0Q29tbWFuZE9wdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q29tbWFuZFZhbHVlczoge1xuICBbayBpbiBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zXTogdW5rbm93bjtcbn0gPSBPYmplY3Qua2V5cyhEZWZhdWx0Q29tbWFuZE9wdGlvbnMpLnJlZHVjZShcbiAgKGFjYzogUmVjb3JkPGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIHVua25vd24+LCBrZXk6IHN0cmluZykgPT4ge1xuICAgIGFjY1trZXkgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRDb21tYW5kT3B0aW9uc10gPVxuICAgICAgRGVmYXVsdENvbW1hbmRPcHRpb25zW2tleSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zXS5kZWZhdWx0O1xuICAgIHJldHVybiBhY2M7XG4gIH0sXG4gIHt9IGFzIFJlY29yZDxrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRWYWx1ZXMsIHVua25vd24+XG4pO1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFkcyB0aGUgZW5kIG9mIGEgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgY2hhcmFjdGVyLlxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgaW5wdXQgc3RyaW5nIHRvIGEgc3BlY2lmaWVkIGxlbmd0aCBieSBhZGRpbmcgYSBwYWRkaW5nIGNoYXJhY3RlciB0byB0aGUgZW5kLlxuICogSWYgdGhlIGlucHV0IHN0cmluZyBpcyBhbHJlYWR5IGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgcGFkZGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSBkZXNpcmVkIHRvdGFsIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcj1cIiBcIl0gLSBUaGUgY2hhcmFjdGVyIHRvIHVzZSBmb3IgcGFkZGluZy4gRGVmYXVsdHMgdG8gYSBzcGFjZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhZGRlZCBzdHJpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHBhZGRpbmcgY2hhcmFjdGVyIGlzIG5vdCBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgbG9uZy5cbiAqXG4gKiBAZnVuY3Rpb24gcGFkRW5kXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZEVuZChcbiAgc3RyOiBzdHJpbmcsXG4gIGxlbmd0aDogbnVtYmVyLFxuICBjaGFyOiBzdHJpbmcgPSBcIiBcIlxuKTogc3RyaW5nIHtcbiAgaWYgKGNoYXIubGVuZ3RoICE9PSAxKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyIGxlbmd0aCBmb3IgcGFkZGluZy4gbXVzdCBiZSBvbmUhXCIpO1xuICByZXR1cm4gc3RyLnBhZEVuZChsZW5ndGgsIGNoYXIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlcyBwbGFjZWhvbGRlcnMgaW4gYSBzdHJpbmcgd2l0aCBwcm92aWRlZCB2YWx1ZXMuXG4gKiBAc3VtbWFyeSBJbnRlcnBvbGF0ZXMgYSBzdHJpbmcgYnkgcmVwbGFjaW5nIHBsYWNlaG9sZGVycyBvZiB0aGUgZm9ybSAke3ZhcmlhYmxlTmFtZX1cbiAqIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZXMgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LiBJZiBhIHBsYWNlaG9sZGVyIGRvZXNuJ3QgaGF2ZVxuICogYSBjb3JyZXNwb25kaW5nIHZhbHVlLCBpdCBpcyBsZWZ0IHVuY2hhbmdlZCBpbiB0aGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIFRoZSBpbnB1dCBzdHJpbmcgY29udGFpbmluZyBwbGFjZWhvbGRlcnMgdG8gYmUgcmVwbGFjZWQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz59IHZhbHVlcyAtIEFuIG9iamVjdCBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgcmVwbGFjZW1lbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzIHJlcGxhY2VkIGJ5IHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaFBsYWNlaG9sZGVyc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHBhdGNoU3RyaW5nXG4gKiAgIHBhcnRpY2lwYW50IFN0cmluZy5yZXBsYWNlXG4gKiAgIENhbGxlci0+PnBhdGNoU3RyaW5nOiBDYWxsIHdpdGggaW5wdXQgYW5kIHZhbHVlc1xuICogICBwYXRjaFN0cmluZy0+PlN0cmluZy5yZXBsYWNlOiBDYWxsIHdpdGggcmVnZXggYW5kIHJlcGxhY2VtZW50IGZ1bmN0aW9uXG4gKiAgIFN0cmluZy5yZXBsYWNlLT4+cGF0Y2hTdHJpbmc6IFJldHVybiByZXBsYWNlZCBzdHJpbmdcbiAqICAgcGF0Y2hTdHJpbmctLT4+Q2FsbGVyOiBSZXR1cm4gcGF0Y2hlZCBzdHJpbmdcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hQbGFjZWhvbGRlcnMoXG4gIGlucHV0OiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPlxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlucHV0LnJlcGxhY2UoXG4gICAgL1xcJFxceyhbYS16QS1aMC05X10rKVxcfS9nLFxuICAgIChtYXRjaCwgdmFyaWFibGUpID0+ICh2YWx1ZXNbdmFyaWFibGUgYXMgc3RyaW5nXSBhcyBzdHJpbmcpIHx8IG1hdGNoXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFN0cmluZyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+LFxuICBmbGFnczogc3RyaW5nID0gXCJnXCJcbik6IHN0cmluZyB7XG4gIE9iamVjdC5lbnRyaWVzKHZhbHVlcykuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXhwKGtleSksIGZsYWdzKTtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UocmVnZXhwLCB2YWwgYXMgc3RyaW5nKTtcbiAgfSk7XG4gIHJldHVybiBpbnB1dDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gY2FtZWxDYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gY2FtZWxDYXNlIGZvcm1hdCwgd2hlcmUgd29yZHMgYXJlIGpvaW5lZCB3aXRob3V0IHNwYWNlc1xuICogYW5kIGVhY2ggd29yZCBhZnRlciB0aGUgZmlyc3Qgc3RhcnRzIHdpdGggYSBjYXBpdGFsIGxldHRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBjYW1lbENhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvQ2FtZWxDYXNlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2FtZWxDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAod29yZCwgaW5kZXgpID0+XG4gICAgICBpbmRleCA9PT0gMCA/IHdvcmQudG9Mb3dlckNhc2UoKSA6IHdvcmQudG9VcHBlckNhc2UoKVxuICAgIClcbiAgICAucmVwbGFjZSgvXFxzKy9nLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gRU5WSVJPTk1FTlRfVkFSSUFCTEUgZm9ybWF0LlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gdXBwZXJjYXNlIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzLFxuICogdHlwaWNhbGx5IHVzZWQgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIEVOVklST05NRU5UX1ZBUklBQkxFIGZvcm1hdC5cbiAqXG4gKiBAZnVuY3Rpb24gdG9FTlZGb3JtYXRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9FTlZGb3JtYXQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvU25ha2VDYXNlKHRleHQpLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIHNuYWtlX2Nhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBsb3dlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gc25ha2VfY2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9TbmFrZUNhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TbmFrZUNhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMV8kMlwiKVxuICAgIC5yZXBsYWNlKC9bXFxzLV0rL2csIFwiX1wiKVxuICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBrZWJhYi1jYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gbG93ZXJjYXNlIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IGh5cGhlbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8ga2ViYWItY2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9LZWJhYkNhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9LZWJhYkNhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMS0kMlwiKVxuICAgIC5yZXBsYWNlKC9bXFxzX10rL2csIFwiLVwiKVxuICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBQYXNjYWxDYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gUGFzY2FsQ2FzZSBmb3JtYXQsIHdoZXJlIHdvcmRzIGFyZSBqb2luZWQgd2l0aG91dCBzcGFjZXNcbiAqIGFuZCBlYWNoIHdvcmQgc3RhcnRzIHdpdGggYSBjYXBpdGFsIGxldHRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBQYXNjYWxDYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b1Bhc2NhbENhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXNjYWxDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAod29yZCkgPT4gd29yZC50b1VwcGVyQ2FzZSgpKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZzogc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpOyAvLyAkJiBtZWFucyB0aGUgd2hvbGUgbWF0Y2hlZCBzdHJpbmdcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZW5jb2RpbmcgZm9yIHRleHQgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBzdGFuZGFyZCBVVEYtOCBlbmNvZGluZyB1c2VkIGZvciB0ZXh0IHByb2Nlc3NpbmcuXG4gKiBAY29uc3Qge3N0cmluZ30gRW5jb2RpbmdcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IEVuY29kaW5nID0gXCJ1dGYtOFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNlbWFudGljIHZlcnNpb25pbmcuXG4gKiBAc3VtbWFyeSBBIHJlZ2V4IHBhdHRlcm4gdG8gbWF0Y2ggYW5kIHBhcnNlIHNlbWFudGljIHZlcnNpb24gc3RyaW5ncy5cbiAqIEBjb25zdCB7UmVnRXhwfSBTZW1WZXJzaW9uUmVnZXhcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbVZlcnNpb25SZWdleCA9XG4gIC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspKD86LShbMC05QS1aYS16LV0rKD86XFwuWzAtOUEtWmEtel0pKSkvZztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bSBmb3Igc2VtYW50aWMgdmVyc2lvbiBjb21wb25lbnRzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdGhyZWUgbGV2ZWxzIG9mIHNlbWFudGljIHZlcnNpb25pbmc6IFBBVENILCBNSU5PUiwgYW5kIE1BSk9SLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGVudW0gU2VtVmVyc2lvbiB7XG4gIC8qKiBQYXRjaCB2ZXJzaW9uIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBidWcgZml4ZXMuICovXG4gIFBBVENIID0gXCJwYXRjaFwiLFxuICAvKiogTWlub3IgdmVyc2lvbiBmb3IgYmFja3dhcmRzLWNvbXBhdGlibGUgbmV3IGZlYXR1cmVzLiAqL1xuICBNSU5PUiA9IFwibWlub3JcIixcbiAgLyoqIE1ham9yIHZlcnNpb24gZm9yIGNoYW5nZXMgdGhhdCBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi9cbiAgTUFKT1IgPSBcIm1ham9yXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZsYWcgdG8gaW5kaWNhdGUgbm9uLUNJIGVudmlyb25tZW50LlxuICogQHN1bW1hcnkgVXNlZCB0byBzcGVjaWZ5IHRoYXQgYSBjb21tYW5kIHNob3VsZCBydW4gb3V0c2lkZSBvZiBhIENvbnRpbnVvdXMgSW50ZWdyYXRpb24gZW52aXJvbm1lbnQuXG4gKiBAY29uc3Qge3N0cmluZ30gTm9DSUZMYWdcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IE5vQ0lGTGFnID0gXCItbm8tY2lcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5IGZvciB0aGUgc2V0dXAgc2NyaXB0IGluIHBhY2thZ2UuanNvbi5cbiAqIEBzdW1tYXJ5IElkZW50aWZpZXMgdGhlIHNjcmlwdCB0aGF0IHJ1bnMgYWZ0ZXIgcGFja2FnZSBpbnN0YWxsYXRpb24uXG4gKiBAY29uc3Qge3N0cmluZ30gU2V0dXBTY3JpcHRLZXlcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNldHVwU2NyaXB0S2V5ID0gXCJwb3N0aW5zdGFsbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIHRva2Vucy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGZpbGUgbmFtZXMgZm9yIHN0b3JpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGF1dGhlbnRpY2F0aW9uIHRva2Vucy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBlbnVtIFRva2VucyB7XG4gIC8qKiBHaXQgYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBHSVQgPSBcIi50b2tlblwiLFxuICAvKiogTlBNIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgTlBNID0gXCIubnBtdG9rZW5cIixcbiAgLyoqIERvY2tlciBhdXRoZW50aWNhdGlvbiB0b2tlbiBmaWxlIG5hbWUuICovXG4gIERPQ0tFUiA9IFwiLmRvY2tlcnRva2VuXCIsXG4gIC8qKiBDb25mbHVlbmNlIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgQ09ORkxVRU5DRSA9IFwiLmNvbmZsdWVuY2UtdG9rZW5cIixcbn1cblxuZXhwb3J0IGNvbnN0IEFib3J0Q29kZSA9IFwiQWJvcnRlZFwiO1xuIiwiaW1wb3J0IHsgRW5jb2RpbmcgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPdXRwdXRXcml0ZXIgfSBmcm9tIFwiLi9PdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IFByb21pc2VFeGVjdXRvciB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiO1xuaW1wb3J0IHsgT3V0cHV0VHlwZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBzdHlsZSB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHN0YW5kYXJkIG91dHB1dCB3cml0ZXIgZm9yIGhhbmRsaW5nIGNvbW1hbmQgZXhlY3V0aW9uIG91dHB1dC5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgT3V0cHV0V3JpdGVyIGludGVyZmFjZSBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3JcbiAqIGhhbmRsaW5nIHZhcmlvdXMgdHlwZXMgb2Ygb3V0cHV0IGZyb20gY29tbWFuZCBleGVjdXRpb24sIGluY2x1ZGluZyBzdGFuZGFyZCBvdXRwdXQsXG4gKiBlcnJvciBvdXRwdXQsIGFuZCBleGl0IGNvZGVzLiBJdCBhbHNvIGluY2x1ZGVzIHV0aWxpdHkgbWV0aG9kcyBmb3IgcGFyc2luZyBjb21tYW5kc1xuICogYW5kIHJlc29sdmluZyBvciByZWplY3RpbmcgcHJvbWlzZXMgYmFzZWQgb24gZXhlY3V0aW9uIHJlc3VsdHMuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcmVzb2x2ZWQgdmFsdWUsIGRlZmF1bHRpbmcgdG8gbnVtYmVyLlxuICpcbiAqIEBwYXJhbSBsb2NrIC0gQSBQcm9taXNlRXhlY3V0b3IgdG8gY29udHJvbCB0aGUgYXN5bmNocm9ub3VzIGZsb3cuXG4gKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzICh1bnVzZWQgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pLlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgU3RhbmRhcmRPdXRwdXRXcml0ZXI8UiA9IHN0cmluZz4gaW1wbGVtZW50cyBPdXRwdXRXcml0ZXIge1xuICBwcm90ZWN0ZWQgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiBTdGFuZGFyZE91dHB1dFdyaXRlci5cbiAgICogQHN1bW1hcnkgQ29uc3RydWN0cyB0aGUgU3RhbmRhcmRPdXRwdXRXcml0ZXIgd2l0aCBhIGxvY2sgbWVjaGFuaXNtIGFuZCBvcHRpb25hbCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBjbWRcbiAgICogQHBhcmFtIGxvY2sgLSBBIFByb21pc2VFeGVjdXRvciB0byBjb250cm9sIHRoZSBhc3luY2hyb25vdXMgZmxvdy5cbiAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyAoY3VycmVudGx5IHVudXNlZCkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY21kOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGxvY2s6IFByb21pc2VFeGVjdXRvcjxSPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogdW5rbm93bltdXG4gICkge1xuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2luZy5mb3IodGhpcy5jbWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIG91dHB1dCB0byB0aGUgY29uc29sZS5cbiAgICogQHN1bW1hcnkgRm9ybWF0cyBhbmQgbG9ncyB0aGUgZ2l2ZW4gZGF0YSB3aXRoIGEgdGltZXN0YW1wIGFuZCB0eXBlIGluZGljYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiBvdXRwdXQgKHN0ZG91dCBvciBzdGRlcnIpLlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHByb3RlY3RlZCBsb2codHlwZTogT3V0cHV0VHlwZSwgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgZGF0YSA9IEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSA/IGRhdGEudG9TdHJpbmcoRW5jb2RpbmcpIDogZGF0YTtcbiAgICBjb25zdCBsb2cgPSB0eXBlID09PSBcInN0ZGVyclwiID8gc3R5bGUoZGF0YSkucmVkLnRleHQgOiBkYXRhO1xuICAgIHRoaXMubG9nZ2VyLmluZm8obG9nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzdGFuZGFyZCBvdXRwdXQgZGF0YS5cbiAgICogQHN1bW1hcnkgTG9ncyB0aGUgZ2l2ZW4gY2h1bmsgYXMgc3RhbmRhcmQgb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0gY2h1bmsgLSBUaGUgZGF0YSBjaHVuayB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBkYXRhKGNodW5rOiBhbnkpIHtcbiAgICB0aGlzLmxvZyhcInN0ZG91dFwiLCBTdHJpbmcoY2h1bmspKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBlcnJvciBvdXRwdXQgZGF0YS5cbiAgICogQHN1bW1hcnkgTG9ncyB0aGUgZ2l2ZW4gY2h1bmsgYXMgZXJyb3Igb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0gY2h1bmsgLSBUaGUgZXJyb3IgZGF0YSBjaHVuayB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBlcnJvcihjaHVuazogYW55KSB7XG4gICAgdGhpcy5sb2coXCJzdGRlcnJcIiwgU3RyaW5nKGNodW5rKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZXJyb3Igb2JqZWN0cy5cbiAgICogQHN1bW1hcnkgTG9ncyB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSBlcnIgLSBUaGUgRXJyb3Igb2JqZWN0IHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGVycm9ycyhlcnI6IEVycm9yKSB7XG4gICAgdGhpcy5sb2coXCJzdGRlcnJcIiwgYEVycm9yIGV4ZWN1dGluZyBjb21tYW5kIGV4aXRlZCA6ICR7ZXJyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHRoZSBleGl0IG9mIGEgY29tbWFuZC5cbiAgICogQHN1bW1hcnkgTG9ncyB0aGUgZXhpdCBjb2RlIGFuZCByZXNvbHZlcyBvciByZWplY3RzIHRoZSBwcm9taXNlIGJhc2VkIG9uIHRoZSBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gY29kZSAtIFRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBsb2dzXG4gICAqL1xuICBleGl0KGNvZGU6IG51bWJlciB8IHN0cmluZywgbG9nczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIFwic3Rkb3V0XCIsXG4gICAgICBgY29tbWFuZCBleGl0ZWQgY29kZSA6ICR7Y29kZSA9PT0gMCA/IHN0eWxlKGNvZGUudG9TdHJpbmcoKSkuZ3JlZW4udGV4dCA6IHN0eWxlKGNvZGUgPT09IG51bGwgPyBcIm51bGxcIiA6IGNvZGUudG9TdHJpbmcoKSkucmVkLnRleHR9YFxuICAgICk7XG4gICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgIHRoaXMucmVzb2x2ZShsb2dzLm1hcCgobCkgPT4gbC50cmltKCkpLmpvaW4oXCJcXG5cIikgYXMgUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcihsb2dzLmxlbmd0aCA/IGxvZ3Muam9pbihcIlxcblwiKSA6IGNvZGUudG9TdHJpbmcoKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29tbWFuZCBzdHJpbmcgb3IgYXJyYXkgaW50byBjb21wb25lbnRzLlxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgY29tbWFuZCBpbnRvIGEgY29uc2lzdGVudCBmb3JtYXQgYW5kIHN0b3JlcyBpdCwgdGhlbiByZXR1cm5zIGl0IHNwbGl0IGludG8gY29tbWFuZCBhbmQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIGFzIGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MuXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSBjb21tYW5kIGFuZCBpdHMgYXJndW1lbnRzIGFzIHNlcGFyYXRlIGVsZW1lbnRzLlxuICAgKi9cbiAgcGFyc2VDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyB8IHN0cmluZ1tdKTogW3N0cmluZywgc3RyaW5nW11dIHtcbiAgICBjb21tYW5kID0gdHlwZW9mIGNvbW1hbmQgPT09IFwic3RyaW5nXCIgPyBjb21tYW5kLnNwbGl0KFwiIFwiKSA6IGNvbW1hbmQ7XG4gICAgdGhpcy5jbWQgPSBjb21tYW5kLmpvaW4oXCIgXCIpO1xuICAgIHJldHVybiBbY29tbWFuZFswXSwgY29tbWFuZC5zbGljZSgxKV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggYSBzdWNjZXNzIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBzdWNjZXNzIG1lc3NhZ2UgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggdGhlIGdpdmVuIHJlYXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIFRoZSByZWFzb24gZm9yIHJlc29sdmluZyB0aGUgcHJvbWlzZS5cbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlKHJlYXNvbjogUikge1xuICAgIHRoaXMubG9nKFxuICAgICAgXCJzdGRvdXRcIixcbiAgICAgIGAke3RoaXMuY21kfSBleGVjdXRlZCBzdWNjZXNzZnVsbHk6ICR7c3R5bGUocmVhc29uID8gXCJyYW4gdG8gY29tcGxldGlvblwiIDogKHJlYXNvbiBhcyBzdHJpbmcpKS5ncmVlbn1gXG4gICAgKTtcbiAgICB0aGlzLmxvY2sucmVzb2x2ZShyZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWplY3RzIHRoZSBwcm9taXNlIHdpdGggYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhbiBlcnJvciBtZXNzYWdlIGFuZCByZWplY3RzIHRoZSBwcm9taXNlIHdpdGggdGhlIGdpdmVuIHJlYXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIFRoZSByZWFzb24gZm9yIHJlamVjdGluZyB0aGUgcHJvbWlzZSwgZWl0aGVyIGEgbnVtYmVyIChleGl0IGNvZGUpIG9yIGEgc3RyaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlamVjdChyZWFzb246IG51bWJlciB8IHN0cmluZyB8IEVycm9yKSB7XG4gICAgaWYgKCEocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZWFzb24gPSBuZXcgRXJyb3IoXG4gICAgICAgIHR5cGVvZiByZWFzb24gPT09IFwibnVtYmVyXCIgPyBgRXhpdCBjb2RlICR7cmVhc29ufWAgOiByZWFzb25cbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubG9nKFxuICAgICAgXCJzdGRlcnJcIixcbiAgICAgIGAke3RoaXMuY21kfSBmYWlsZWQgdG8gZXhlY3V0ZTogJHtzdHlsZShyZWFzb24ubWVzc2FnZSkucmVkfWBcbiAgICApO1xuICAgIHRoaXMubG9jay5yZWplY3QocmVhc29uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2hpbGRQcm9jZXNzV2l0aG91dE51bGxTdHJlYW1zLFxuICBzcGF3bixcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxufSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgU3RhbmRhcmRPdXRwdXRXcml0ZXIgfSBmcm9tIFwiLi4vd3JpdGVycy9TdGFuZGFyZE91dHB1dFdyaXRlclwiO1xuaW1wb3J0IHsgQ29tbWFuZFJlc3VsdCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBPdXRwdXRXcml0ZXJDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi93cml0ZXJzL3R5cGVzXCI7XG5pbXBvcnQgeyBBYm9ydENvZGUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9ja2VkIHZlcnNpb24gb2YgYSBmdW5jdGlvbi5cbiAqIEBzdW1tYXJ5IFRoaXMgaGlnaGVyLW9yZGVyIGZ1bmN0aW9uIHRha2VzIGEgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCBlbnN1cmVzXG4gKiBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGV2ZW4gd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5LlxuICogSXQgdXNlcyBhIFByb21pc2UtYmFzZWQgbG9ja2luZyBtZWNoYW5pc20gdG8gcXVldWUgZnVuY3Rpb24gY2FsbHMuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGlucHV0IGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBmIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGxvY2tlZC4gSXQgY2FuIHRha2UgYW55IG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gYSB2YWx1ZSBvZiB0eXBlIFIuXG4gKiBAcmV0dXJuIEEgbmV3IGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBpbnB1dCBmdW5jdGlvbiwgYnV0IHdpdGggc2VxdWVudGlhbCBleGVjdXRpb24gZ3VhcmFudGVlZC5cbiAqXG4gKiBAZnVuY3Rpb24gbG9ja2lmeVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IExvY2tlZEZ1bmN0aW9uXG4gKiAgIHBhcnRpY2lwYW50IE9yaWdpbmFsRnVuY3Rpb25cbiAqICAgQ2FsbGVyLT4+TG9ja2VkRnVuY3Rpb246IENhbGwgd2l0aCBwYXJhbXNcbiAqICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogQ2hlY2sgY3VycmVudCBsb2NrXG4gKiAgIGFsdCBMb2NrIGlzIHJlc29sdmVkXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5PcmlnaW5hbEZ1bmN0aW9uOiBFeGVjdXRlIHdpdGggcGFyYW1zXG4gKiAgICAgT3JpZ2luYWxGdW5jdGlvbi0tPj5Mb2NrZWRGdW5jdGlvbjogUmV0dXJuIHJlc3VsdFxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmV0dXJuIHJlc3VsdFxuICogICBlbHNlIExvY2sgaXMgcGVuZGluZ1xuICogICAgIExvY2tlZEZ1bmN0aW9uLT4+TG9ja2VkRnVuY3Rpb246IFF1ZXVlIGV4ZWN1dGlvblxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmV0dXJuIHByb21pc2VcbiAqICAgICBOb3RlIG92ZXIgTG9ja2VkRnVuY3Rpb246IFdhaXQgZm9yIHByZXZpb3VzIGV4ZWN1dGlvblxuICogICAgIExvY2tlZEZ1bmN0aW9uLT4+T3JpZ2luYWxGdW5jdGlvbjogRXhlY3V0ZSB3aXRoIHBhcmFtc1xuICogICAgIE9yaWdpbmFsRnVuY3Rpb24tLT4+TG9ja2VkRnVuY3Rpb246IFJldHVybiByZXN1bHRcbiAqICAgICBMb2NrZWRGdW5jdGlvbi0tPj5DYWxsZXI6IFJlc29sdmUgcHJvbWlzZSB3aXRoIHJlc3VsdFxuICogICBlbmRcbiAqICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogVXBkYXRlIGxvY2tcbiAqXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NraWZ5PFI+KGY6ICguLi5wYXJhbXM6IHVua25vd25bXSkgPT4gUikge1xuICBsZXQgbG9jazogUHJvbWlzZTxSIHwgdm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuICguLi5wYXJhbXM6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGxvY2sudGhlbigoKSA9PiBmKC4uLnBhcmFtcykpO1xuICAgIGxvY2sgPSByZXN1bHQuY2F0Y2goKCkgPT4ge30pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICAuLi5zaWduYWxzOiBBYm9ydFNpZ25hbFtdXG4pOiBBYm9ydENvbnRyb2xsZXI7XG5leHBvcnQgZnVuY3Rpb24gY2hhaW5BYm9ydENvbnRyb2xsZXIoXG4gIC4uLnNpZ25hbHM6IEFib3J0U2lnbmFsW11cbik6IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgYXJndW1lbnQwOiBBYm9ydENvbnRyb2xsZXIgfCBBYm9ydFNpZ25hbCxcbiAgLi4ucmVtYWluZGVyOiBBYm9ydFNpZ25hbFtdXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBsZXQgc2lnbmFsczogQWJvcnRTaWduYWxbXTtcbiAgbGV0IGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAvLyBub3JtYWxpemUgYXJnc1xuICBpZiAoYXJndW1lbnQwIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpIHtcbiAgICBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHNpZ25hbHMgPSBbYXJndW1lbnQwLCAuLi5yZW1haW5kZXJdO1xuICB9IGVsc2Uge1xuICAgIGNvbnRyb2xsZXIgPSBhcmd1bWVudDA7XG4gICAgc2lnbmFscyA9IHJlbWFpbmRlcjtcbiAgfVxuXG4gIC8vIGlmIHRoZSBjb250cm9sbGVyIGlzIGFscmVhZHkgYWJvcnRlZCwgZXhpdCBlYXJseVxuICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybiBjb250cm9sbGVyO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9ICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcblxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7XG4gICAgLy8gY2hlY2sgYmVmb3JlIGFkZGluZyEgKGFuZCBhc3N1bWUgdGhlcmUgaXMgbm8gcG9zc2libGUgd2F5IHRoYXQgdGhlIHNpZ25hbCBjb3VsZFxuICAgIC8vIGFib3J0IGJldHdlZW4gdGhlIGBpZmAgY2hlY2sgYW5kIGFkZGluZyB0aGUgZXZlbnQgbGlzdGVuZXIpXG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBoYW5kbGVyLCB7XG4gICAgICBvbmNlOiB0cnVlLFxuICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25Db21tYW5kPFIgPSBzdHJpbmc+KFxuICBvdXRwdXQ6IFN0YW5kYXJkT3V0cHV0V3JpdGVyPFI+LFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdHM6IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgYWJvcnQ6IEFib3J0Q29udHJvbGxlcixcbiAgbG9nZ2VyOiBMb2dnZXJcbik6IENoaWxkUHJvY2Vzc1dpdGhvdXROdWxsU3RyZWFtcyB7XG4gIGZ1bmN0aW9uIHNwYXduSW5uZXIoY29tbWFuZDogc3RyaW5nLCBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBbY21kLCBhcmd6XSA9IG91dHB1dC5wYXJzZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgbG9nZ2VyLmluZm8oYFJ1bm5pbmcgY29tbWFuZDogJHtjbWR9YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGB3aXRoIGFyZ3M6ICR7YXJnei5qb2luKFwiIFwiKX1gKTtcbiAgICBjb25zdCBjaGlsZFByb2Nlc3MgPSBzcGF3bihjbWQsIGFyZ3osIHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICBjd2Q6IG9wdHMuY3dkIHx8IHByb2Nlc3MuY3dkKCksXG4gICAgICBlbnY6IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCBvcHRzLmVudiwgeyBQQVRIOiBwcm9jZXNzLmVudi5QQVRIIH0pLFxuICAgICAgc2hlbGw6IG9wdHMuc2hlbGwgfHwgZmFsc2UsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIGxvZ2dlci52ZXJib3NlKGBwaWQgOiAke2NoaWxkUHJvY2Vzcy5waWR9YCk7XG4gICAgcmV0dXJuIGNoaWxkUHJvY2VzcztcbiAgfVxuXG4gIGNvbnN0IG0gPSBjb21tYW5kLm1hdGNoKC9bPD4kI10vZyk7XG4gIGlmIChtKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGNvbW1hbmQ6ICR7Y29tbWFuZH0uIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyczogJHttfWBcbiAgICApO1xuICBpZiAoY29tbWFuZC5pbmNsdWRlcyhcIiB8IFwiKSkge1xuICAgIGNvbnN0IGNtZHMgPSBjb21tYW5kLnNwbGl0KFwiIHwgXCIpO1xuICAgIGNvbnN0IHNwYXducyA9IFtdO1xuICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gbmV3IEFycmF5KGNtZHMubGVuZ3RoKTtcbiAgICBjb250cm9sbGVyc1swXSA9IGFib3J0O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgIT09IDApXG4gICAgICAgIGNvbnRyb2xsZXJzW2ldID0gY2hhaW5BYm9ydENvbnRyb2xsZXIoY29udHJvbGxlcnNbaSAtIDFdLnNpZ25hbCk7XG4gICAgICBzcGF3bnMucHVzaChzcGF3bklubmVyKGNtZHNbaV0sIGNvbnRyb2xsZXJzW2ldKSk7XG4gICAgICBpZiAoaSA9PT0gMCkgY29udGludWU7XG4gICAgICBzcGF3bnNbaSAtIDFdLnN0ZG91dC5waXBlKHNwYXduc1tpXS5zdGRpbik7XG4gICAgfVxuICAgIHJldHVybiBzcGF3bnNbY21kcy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHJldHVybiBzcGF3bklubmVyKGNvbW1hbmQsIGFib3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBjb21tYW5kIGFzeW5jaHJvbm91c2x5IHdpdGggY3VzdG9taXphYmxlIG91dHB1dCBoYW5kbGluZy5cbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gcnVucyBhIHNoZWxsIGNvbW1hbmQgYXMgYSBjaGlsZCBwcm9jZXNzLCBwcm92aWRpbmcgZmluZS1ncmFpbmVkXG4gKiBjb250cm9sIG92ZXIgaXRzIGV4ZWN1dGlvbiBhbmQgb3V0cHV0IGhhbmRsaW5nLiBJdCBzdXBwb3J0cyBjdXN0b20gb3V0cHV0IHdyaXRlcnMsXG4gKiBhbGxvd3MgZm9yIGNvbW1hbmQgYWJvcnRpb24sIGFuZCBjYXB0dXJlcyBib3RoIHN0ZG91dCBhbmQgc3RkZXJyLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHJlc29sdmVkIHZhbHVlIGZyb20gdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuLCBlaXRoZXIgYXMgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBvcHRzIC0gU3Bhd24gb3B0aW9ucyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MuIERlZmF1bHRzIHRvIGFuIGVtcHR5IG9iamVjdC5cbiAqIEBwYXJhbSBvdXRwdXRDb25zdHJ1Y3RvciAtIENvbnN0cnVjdG9yIGZvciB0aGUgb3V0cHV0IHdyaXRlci4gRGVmYXVsdHMgdG8gU3RhbmRhcmRPdXRwdXRXcml0ZXIuXG4gKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG91dHB1dCBjb25zdHJ1Y3Rvci5cbiAqIEByZXR1cm4ge0NvbW1hbmRSZXN1bHR9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb21tYW5kIHJlc3VsdCBvZiB0eXBlIFIuXG4gKlxuICogQGZ1bmN0aW9uIHJ1bkNvbW1hbmRcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBydW5Db21tYW5kXG4gKiAgIHBhcnRpY2lwYW50IE91dHB1dFdyaXRlclxuICogICBwYXJ0aWNpcGFudCBDaGlsZFByb2Nlc3NcbiAqICAgQ2FsbGVyLT4+cnVuQ29tbWFuZDogQ2FsbCB3aXRoIGNvbW1hbmQgYW5kIG9wdGlvbnNcbiAqICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogQ3JlYXRlIG5ldyBpbnN0YW5jZVxuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBQYXJzZSBjb21tYW5kXG4gKiAgIHJ1bkNvbW1hbmQtPj5DaGlsZFByb2Nlc3M6IFNwYXduIHByb2Nlc3NcbiAqICAgQ2hpbGRQcm9jZXNzLS0+PnJ1bkNvbW1hbmQ6IFJldHVybiBwcm9jZXNzIG9iamVjdFxuICogICBydW5Db21tYW5kLT4+Q2hpbGRQcm9jZXNzOiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzXG4gKiAgIGxvb3AgRm9yIGVhY2ggc3Rkb3V0IGRhdGFcbiAqICAgICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IHN0ZG91dCBkYXRhXG4gKiAgICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIHN0ZG91dCBkYXRhXG4gKiAgIGVuZFxuICogICBsb29wIEZvciBlYWNoIHN0ZGVyciBkYXRhXG4gKiAgICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBzdGRlcnIgZGF0YVxuICogICAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBzdGRlcnIgZGF0YVxuICogICBlbmRcbiAqICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBlcnJvciAoaWYgYW55KVxuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBIYW5kbGUgZXJyb3JcbiAqICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBleGl0XG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBleGl0XG4gKiAgIE91dHB1dFdyaXRlci0tPj5ydW5Db21tYW5kOiBSZXNvbHZlIG9yIHJlamVjdCBwcm9taXNlXG4gKiAgIHJ1bkNvbW1hbmQtLT4+Q2FsbGVyOiBSZXR1cm4gQ29tbWFuZFJlc3VsdFxuICpcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbW1hbmQ8UiA9IHN0cmluZz4oXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0czogU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvID0ge30sXG4gIG91dHB1dENvbnN0cnVjdG9yOiBPdXRwdXRXcml0ZXJDb25zdHJ1Y3RvcjxcbiAgICBSLFxuICAgIFN0YW5kYXJkT3V0cHV0V3JpdGVyPFI+LFxuICAgIEVycm9yXG4gID4gPSBTdGFuZGFyZE91dHB1dFdyaXRlcjxSPixcbiAgLi4uYXJnczogdW5rbm93bltdXG4pOiBDb21tYW5kUmVzdWx0PFI+IHtcbiAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IocnVuQ29tbWFuZCk7XG4gIGNvbnN0IGFib3J0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IHJlc3VsdDogT21pdDxDb21tYW5kUmVzdWx0LCBcInByb21pc2VcIiB8IFwicGlwZVwiPiA9IHtcbiAgICBhYm9ydDogYWJvcnQsXG4gICAgY29tbWFuZDogY29tbWFuZCxcbiAgICBsb2dzOiBbXSxcbiAgICBlcnJzOiBbXSxcbiAgfTtcblxuICBjb25zdCBsb2NrID0gbmV3IFByb21pc2U8Uj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBvdXRwdXQ7XG4gICAgdHJ5IHtcbiAgICAgIG91dHB1dCA9IG5ldyBvdXRwdXRDb25zdHJ1Y3RvcihcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAge1xuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuXG4gICAgICByZXN1bHQuY21kID0gc3Bhd25Db21tYW5kPFI+KG91dHB1dCwgY29tbWFuZCwgb3B0cywgYWJvcnQsIGxvZ2dlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEVycm9yIHJ1bm5pbmcgY29tbWFuZCAke2NvbW1hbmR9OiAke2V9YCkpO1xuICAgIH1cblxuICAgIHJlc3VsdC5jbWQuc3Rkb3V0LnNldEVuY29kaW5nKFwidXRmOFwiKTtcblxuICAgIHJlc3VsdC5jbWQuc3Rkb3V0Lm9uKFwiZGF0YVwiLCAoY2h1bms6IGFueSkgPT4ge1xuICAgICAgY2h1bmsgPSBjaHVuay50b1N0cmluZygpO1xuICAgICAgcmVzdWx0LmxvZ3MucHVzaChjaHVuayk7XG4gICAgICBvdXRwdXQuZGF0YShjaHVuayk7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuY21kLnN0ZGVyci5vbihcImRhdGFcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIHJlc3VsdC5lcnJzLnB1c2goZGF0YSk7XG4gICAgICBvdXRwdXQuZXJyb3IoZGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuY21kLm9uY2UoXCJlcnJvclwiLCAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgb3V0cHV0LmV4aXQoZXJyLm1lc3NhZ2UsIHJlc3VsdC5lcnJzKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jbWQub25jZShcImV4aXRcIiwgKGNvZGU6IG51bWJlciA9IDApID0+IHtcbiAgICAgIGlmIChhYm9ydC5zaWduYWwuYWJvcnRlZCAmJiBjb2RlID09PSBudWxsKSBjb2RlID0gQWJvcnRDb2RlIGFzIGFueTtcbiAgICAgIG91dHB1dC5leGl0KGNvZGUsIGNvZGUgPT09IDAgPyByZXN1bHQubG9ncyA6IHJlc3VsdC5lcnJzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHtcbiAgICBwcm9taXNlOiBsb2NrLFxuICAgIHBpcGU6IGFzeW5jIDxFPihjYjogKHI6IFIpID0+IEUpID0+IHtcbiAgICAgIGNvbnN0IGwgPSBsb2dnZXIuZm9yKFwicGlwZVwiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGwudmVyYm9zZShgRXhlY3V0aW5nIHBpcGUgZnVuY3Rpb24gJHtjb21tYW5kfS4uLmApO1xuICAgICAgICBjb25zdCByZXN1bHQ6IFIgPSBhd2FpdCBsb2NrO1xuICAgICAgICBsLnZlcmJvc2UoYFBpcGluZyBvdXRwdXQgdG8gJHtjYi5uYW1lfTogJHtyZXN1bHR9YCk7XG4gICAgICAgIHJldHVybiBjYihyZXN1bHQpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsLmVycm9yKGBFcnJvciBwaXBpbmcgY29tbWFuZCBvdXRwdXQ6ICR7ZX1gKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0IGFzIENvbW1hbmRSZXN1bHQ8Uj47XG59XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcGF0Y2hTdHJpbmcgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lNYXAsIFNpbXBsZURlcGVuZGVuY3lNYXAgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG5jb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihcImZzXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYXRjaGVzIGEgZmlsZSB3aXRoIGdpdmVuIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZmlsZSwgYXBwbGllcyBwYXRjaGVzIHVzaW5nIFRleHRVdGlscywgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBwYXRjaGVkLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+fSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIHBhdGNoIGludG8gdGhlIGZpbGUuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaEZpbGVcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwYXRjaEZpbGVcbiAqICAgcGFydGljaXBhbnQgZnNcbiAqICAgcGFydGljaXBhbnQgcmVhZEZpbGVcbiAqICAgcGFydGljaXBhbnQgVGV4dFV0aWxzXG4gKiAgIHBhcnRpY2lwYW50IHdyaXRlRmlsZVxuICogICBDYWxsZXItPj5wYXRjaEZpbGU6IENhbGwgd2l0aCBwYXRoIGFuZCB2YWx1ZXNcbiAqICAgcGF0Y2hGaWxlLT4+ZnM6IENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gKiAgIHBhdGNoRmlsZS0+PnJlYWRGaWxlOiBSZWFkIGZpbGUgY29udGVudFxuICogICByZWFkRmlsZS0+PmZzOiBSZWFkIGZpbGVcbiAqICAgZnMtLT4+cmVhZEZpbGU6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgcmVhZEZpbGUtLT4+cGF0Y2hGaWxlOiBSZXR1cm4gZmlsZSBjb250ZW50XG4gKiAgIHBhdGNoRmlsZS0+PlRleHRVdGlsczogUGF0Y2ggc3RyaW5nXG4gKiAgIFRleHRVdGlscy0tPj5wYXRjaEZpbGU6IFJldHVybiBwYXRjaGVkIGNvbnRlbnRcbiAqICAgcGF0Y2hGaWxlLT4+d3JpdGVGaWxlOiBXcml0ZSBwYXRjaGVkIGNvbnRlbnRcbiAqICAgd3JpdGVGaWxlLT4+ZnM6IFdyaXRlIHRvIGZpbGVcbiAqICAgZnMtLT4+d3JpdGVGaWxlOiBGaWxlIHdyaXR0ZW5cbiAqICAgd3JpdGVGaWxlLS0+PnBhdGNoRmlsZTogRmlsZSB3cml0dGVuXG4gKiAgIHBhdGNoRmlsZS0tPj5DYWxsZXI6IFBhdGNoaW5nIGNvbXBsZXRlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hGaWxlKFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPlxuKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocGF0Y2hGaWxlKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGgpKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgYXQgcGF0aCBcIiR7cGF0aH1cIi5gKTtcbiAgbGV0IGNvbnRlbnQgPSByZWFkRmlsZShwYXRoKTtcblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBQYXRjaGluZyBmaWxlIFwiJHtwYXRofVwiLi4uYCk7XG4gICAgbG9nLmRlYnVnKGB3aXRoIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlcyl9YCk7XG4gICAgY29udGVudCA9IHBhdGNoU3RyaW5nKGNvbnRlbnQsIHZhbHVlcyk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXRjaGluZyBmaWxlOiAke2Vycm9yfWApO1xuICB9XG4gIHdyaXRlRmlsZShwYXRoLCBjb250ZW50KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50LlxuICogQHN1bW1hcnkgUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgcmV0dXJucyBpdCBhcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIHJlYWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb250ZW50IG9mIHRoZSBmaWxlLlxuICpcbiAqIEBmdW5jdGlvbiByZWFkRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWxlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocmVhZEZpbGUpO1xuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nIGZpbGUgXCIke3BhdGh9XCIuLi5gKTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFdyaXRlcyBkYXRhIHRvIGEgZmlsZS5cbiAqIEBzdW1tYXJ5IFdyaXRlcyB0aGUgcHJvdmlkZWQgZGF0YSB0byBhIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgd3JpdHRlbi5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSBkYXRhIC0gVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHdyaXRlRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcik6IHZvaWQge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHdyaXRlRmlsZSk7XG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFdyaXRpbmcgZmlsZSBcIiR7cGF0aH0gd2l0aCAke2RhdGEubGVuZ3RofSBieXRlcy4uLmApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aCwgZGF0YSwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBmaWxlcyByZWN1cnNpdmVseSBmcm9tIGEgZGlyZWN0b3J5LlxuICogQHN1bW1hcnkgVHJhdmVyc2VzIHRocm91Z2ggZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzIHRvIGNvbGxlY3QgYWxsIGZpbGUgcGF0aHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHAgLSBUaGUgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS5cbiAqIEBwYXJhbSBmaWx0ZXJcbiAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiBmaWxlIHBhdGhzLlxuICpcbiAqIEBmdW5jdGlvbiBnZXRBbGxGaWxlc1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZnMtdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZpbGVzKFxuICBwOiBzdHJpbmcsXG4gIGZpbHRlcj86IChmOiBzdHJpbmcsIGk/OiBudW1iZXIpID0+IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihnZXRBbGxGaWxlcyk7XG4gIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgYWxsIGZpbGVzIGZyb20gXCIke3B9XCIuLi5gKTtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMocCk7XG5cbiAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihwLCBlbnRyeSk7XG4gICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpO1xuXG4gICAgICBpZiAoc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgICBmaWxlcy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGZpbGVzLnB1c2goLi4uZ2V0QWxsRmlsZXMoZnVsbFBhdGgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWZpbHRlcikgcmV0dXJuIGZpbGVzO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZmlsdGVyKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgcmV0cmlldmluZyBmaWxlcyBmcm9tIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcmV0cmlldmluZyBmaWxlcyBmcm9tIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVGaWxlKHNvdXJjZTogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihyZW5hbWVGaWxlKTtcbiAgbGV0IGRlc2NyaXB0b3JTb3VyY2UsIGRlc2NyaXB0b3JEZXN0O1xuXG4gIHRyeSB7XG4gICAgZGVzY3JpcHRvclNvdXJjZSA9IGZzLnN0YXRTeW5jKHNvdXJjZSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgcGF0aCBcIiR7c291cmNlfVwiIGRvZXMgbm90IGV4aXN0OiAke2Vycm9yfWApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yRGVzdCA9IGZzLnN0YXRTeW5jKGRlc3QpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIGRvIG5vdGhpbmcuIGl0cyBva1xuICB9XG4gIGlmIChkZXNjcmlwdG9yRGVzdCkge1xuICAgIGxvZy52ZXJib3NlKGBEZXN0aW5hdGlvbiBwYXRoIFwiJHtkZXN0fVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEZXN0aW5hdGlvbiBwYXRoIFwiJHtkZXN0fVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gIH1cblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYFJlbmFtaW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH0uLi5gXG4gICAgKTtcbiAgICBmcy5yZW5hbWVTeW5jKHNvdXJjZSwgZGVzdCk7XG4gICAgbG9nLnZlcmJvc2UoYFN1Y2Nlc3NmdWxseSByZW5hbWVkIHRvIFwiJHtkZXN0fVwiYCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgRXJyb3IgcmVuYW1pbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fVwiOiAke2Vycm9yfWBcbiAgICApO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFcnJvciByZW5hbWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9XCI6ICR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlGaWxlKHNvdXJjZTogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihjb3B5RmlsZSk7XG4gIGxldCBkZXNjcmlwdG9yU291cmNlLCBkZXNjcmlwdG9yRGVzdDtcbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yU291cmNlID0gZnMuc3RhdFN5bmMoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVzY3JpcHRvckRlc3QgPSBmcy5zdGF0U3luYyhkZXN0KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGRlc2NyaXB0b3JTb3VyY2UuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgbG9nLnZlcmJvc2UoYERlc3QgcGF0aCBcIiR7ZGVzdH1cIiBkb2VzIG5vdCBleGlzdC4gY3JlYXRpbmdgKTtcbiAgICAgIGZzLm1rZGlyU3luYyhkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYENvcHlpbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fS4uLmBcbiAgICApO1xuICAgIGZzLmNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEVycm9yIGNvcHlpbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fTogJHtlcnJvcn1gXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXJyb3IgY29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9OiAke2Vycm9yfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVQYXRoKHA6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGRlbGV0ZVBhdGgpO1xuICB0cnkge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBmcy5zdGF0U3luYyhwKTtcbiAgICBpZiAoZGVzY3JpcHRvci5pc0ZpbGUoKSkge1xuICAgICAgbG9nLnZlcmJvc2UoYERlbGV0aW5nIGZpbGUgXCIke3B9Li4uYCk7XG4gICAgICBmcy5ybVN5bmMocCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5pc0RpcmVjdG9yeSgpKVxuICAgICAgZnMucm1TeW5jKHAsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgRGVsZXRpbmcgXCIke3B9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBEZWxldGluZyBcIiR7cH1cIjogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBzdW1tYXJ5IExvYWRzIGFuZCBwYXJzZXMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGZyb20gYSBzcGVjaWZpZWQgZGlyZWN0b3J5IG9yIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBDYW4gcmV0dXJuIHRoZSBlbnRpcmUgcGFja2FnZSBvYmplY3Qgb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcD1wcm9jZXNzLmN3ZCgpXSAtIFRoZSBkaXJlY3RvcnkgcGF0aCB3aGVyZSB0aGUgcGFja2FnZS5qc29uIGZpbGUgaXMgbG9jYXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gT3B0aW9uYWwuIFRoZSBzcGVjaWZpYyBwcm9wZXJ0eSB0byByZXRyaWV2ZSBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEByZXR1cm4ge29iamVjdCB8IHN0cmluZ30gVGhlIHBhcnNlZCBjb250ZW50cyBvZiBwYWNrYWdlLmpzb24gb3IgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZnVuY3Rpb24gZ2V0UGFja2FnZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZ2V0UGFja2FnZVxuICogICBwYXJ0aWNpcGFudCByZWFkRmlsZVxuICogICBwYXJ0aWNpcGFudCBKU09OXG4gKiAgIENhbGxlci0+PmdldFBhY2thZ2U6IENhbGwgd2l0aCBwYXRoIGFuZCBvcHRpb25hbCBwcm9wZXJ0eVxuICogICBnZXRQYWNrYWdlLT4+cmVhZEZpbGU6IFJlYWQgcGFja2FnZS5qc29uXG4gKiAgIHJlYWRGaWxlLS0+PmdldFBhY2thZ2U6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgZ2V0UGFja2FnZS0+PkpTT046IFBhcnNlIGZpbGUgY29udGVudFxuICogICBKU09OLS0+PmdldFBhY2thZ2U6IFJldHVybiBwYXJzZWQgb2JqZWN0XG4gKiAgIGFsdCBwcm9wZXJ0eSBzcGVjaWZpZWRcbiAqICAgICBnZXRQYWNrYWdlLT4+Z2V0UGFja2FnZTogQ2hlY2sgaWYgcHJvcGVydHkgZXhpc3RzXG4gKiAgICAgYWx0IHByb3BlcnR5IGV4aXN0c1xuICogICAgICAgZ2V0UGFja2FnZS0tPj5DYWxsZXI6IFJldHVybiBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIGVsc2UgcHJvcGVydHkgZG9lc24ndCBleGlzdFxuICogICAgICAgZ2V0UGFja2FnZS0tPj5DYWxsZXI6IFRocm93IEVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVsc2Ugbm8gcHJvcGVydHkgc3BlY2lmaWVkXG4gKiAgICAgZ2V0UGFja2FnZS0tPj5DYWxsZXI6IFJldHVybiBlbnRpcmUgcGFja2FnZSBvYmplY3RcbiAqICAgZW5kXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlKFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBwcm9wZXJ0eT86IHN0cmluZ1xuKTogb2JqZWN0IHwgc3RyaW5nIHtcbiAgbGV0IHBrZzogYW55O1xuICB0cnkge1xuICAgIHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGUocGF0aC5qb2luKHAsIGBwYWNrYWdlLmpzb25gKSkpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJldHJpZXZlIHBhY2thZ2UgaW5mb3JtYXRpb25cIiAke2Vycm9yfWApO1xuICB9XG5cbiAgaWYgKHByb3BlcnR5KSB7XG4gICAgaWYgKCEocHJvcGVydHkgaW4gcGtnKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgXCIke3Byb3BlcnR5fVwiIG5vdCBmb3VuZCBpbiBwYWNrYWdlLmpzb25gKTtcbiAgICByZXR1cm4gcGtnW3Byb3BlcnR5XSBhcyBzdHJpbmc7XG4gIH1cbiAgcmV0dXJuIHBrZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFBhY2thZ2VBdHRyaWJ1dGUoXG4gIGF0dHI6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKVxuKTogdm9pZCB7XG4gIGNvbnN0IHBrZyA9IGdldFBhY2thZ2UocCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcGtnW2F0dHJdID0gdmFsdWU7XG4gIHdyaXRlRmlsZShwYXRoLmpvaW4ocCwgYHBhY2thZ2UuanNvbmApLCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgQSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNhbGxzIGdldFBhY2thZ2UgdG8gcmV0cmlldmUgdGhlIFwidmVyc2lvblwiIHByb3BlcnR5IGZyb20gcGFja2FnZS5qc29uLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwPXByb2Nlc3MuY3dkKCldIC0gVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmVyc2lvbiBzdHJpbmcgZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAZnVuY3Rpb24gZ2V0UGFja2FnZVZlcnNpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZnMtdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uKHAgPSBwcm9jZXNzLmN3ZCgpKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFBhY2thZ2UocCwgXCJ2ZXJzaW9uXCIpIGFzIHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgcHJvamVjdC5cbiAqIEBzdW1tYXJ5IEV4ZWN1dGVzICducG0gbHMgLS1qc29uJyBjb21tYW5kIHRvIGdldCBhIGRldGFpbGVkIGxpc3Qgb2YgYWxsIGRlcGVuZGVuY2llcyAocHJvZHVjdGlvbiwgZGV2ZWxvcG1lbnQsIGFuZCBwZWVyKSBhbmQgdGhlaXIgdmVyc2lvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGg9cHJvY2Vzcy5jd2QoKV0gLSBUaGUgZGlyZWN0b3J5IHBhdGggb2YgdGhlIHByb2plY3QuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHtwcm9kOiBBcnJheTx7bmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9PiwgZGV2OiBBcnJheTx7bmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9PiwgcGVlcjogQXJyYXk8e25hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT59Pn0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgYXJyYXlzIG9mIHByb2R1Y3Rpb24sIGRldmVsb3BtZW50LCBhbmQgcGVlciBkZXBlbmRlbmNpZXMuXG4gKiBAZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZXREZXBlbmRlbmNpZXNcbiAqICAgcGFydGljaXBhbnQgcnVuQ29tbWFuZFxuICogICBwYXJ0aWNpcGFudCBKU09OXG4gKiAgIENhbGxlci0+PmdldERlcGVuZGVuY2llczogQ2FsbCB3aXRoIG9wdGlvbmFsIHBhdGhcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLT4+cnVuQ29tbWFuZDogRXhlY3V0ZSAnbnBtIGxzIC0tanNvbidcbiAqICAgcnVuQ29tbWFuZC0tPj5nZXREZXBlbmRlbmNpZXM6IFJldHVybiBjb21tYW5kIG91dHB1dFxuICogICBnZXREZXBlbmRlbmNpZXMtPj5KU09OOiBQYXJzZSBjb21tYW5kIG91dHB1dFxuICogICBKU09OLS0+PmdldERlcGVuZGVuY2llczogUmV0dXJuIHBhcnNlZCBvYmplY3RcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLT4+Z2V0RGVwZW5kZW5jaWVzOiBQcm9jZXNzIGRlcGVuZGVuY2llc1xuICogICBnZXREZXBlbmRlbmNpZXMtLT4+Q2FsbGVyOiBSZXR1cm4gcHJvY2Vzc2VkIGRlcGVuZGVuY2llc1xuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzKFxuICBwYXRoOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpXG4pOiBQcm9taXNlPERlcGVuZGVuY3lNYXA+IHtcbiAgbGV0IHBrZzogYW55O1xuXG4gIHRyeSB7XG4gICAgcGtnID0gSlNPTi5wYXJzZShhd2FpdCBydW5Db21tYW5kKGBucG0gbHMgLS1qc29uYCwgeyBjd2Q6IHBhdGggfSkucHJvbWlzZSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBkZXBlbmRlbmNpZXM6ICR7ZX1gKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29uc3QgbWFwcGVyID0gKGVudHJ5OiBbc3RyaW5nLCB1bmtub3duXSwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICBuYW1lOiBlbnRyeVswXSxcbiAgICB2ZXJzaW9uOiAoZW50cnlbMV0gYXMgYW55KS52ZXJzaW9uLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHByb2Q6IE9iamVjdC5lbnRyaWVzKHBrZy5kZXBlbmRlbmNpZXMgfHwge30pLm1hcChtYXBwZXIpLFxuICAgIGRldjogT2JqZWN0LmVudHJpZXMocGtnLmRldkRlcGVuZGVuY2llcyB8fCB7fSkubWFwKG1hcHBlciksXG4gICAgcGVlcjogT2JqZWN0LmVudHJpZXMocGtnLnBlZXJEZXBlbmRlbmNpZXMgfHwge30pLm1hcChtYXBwZXIpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRGVwZW5kZW5jaWVzKCkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHVwZGF0ZURlcGVuZGVuY2llcyk7XG4gIGxvZy5pbmZvKFwiY2hlY2tpbmcgZm9yIHVwZGF0ZXMuLi5cIik7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoXCJucHggbnBtLWNoZWNrLXVwZGF0ZXMgLXVcIikucHJvbWlzZTtcbiAgbG9nLmluZm8oXCJ1cGRhdGluZy4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcIm5weCBucG0gcnVuIGRvLWluc3RhbGxcIikucHJvbWlzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxJZk5vdEF2YWlsYWJsZShcbiAgZGVwczogc3RyaW5nW10gfCBzdHJpbmcsXG4gIGRlcGVuZGVuY2llcz86IFNpbXBsZURlcGVuZGVuY3lNYXBcbikge1xuICBpZiAoIWRlcGVuZGVuY2llcykge1xuICAgIGNvbnN0IGQ6IERlcGVuZGVuY3lNYXAgPSBhd2FpdCBnZXREZXBlbmRlbmNpZXMoKTtcbiAgICBkZXBlbmRlbmNpZXMgPSB7XG4gICAgICBwcm9kOiBkLnByb2Q/Lm1hcCgocCkgPT4gcC5uYW1lKSB8fCBbXSxcbiAgICAgIGRldjogZC5kZXY/Lm1hcCgoZCkgPT4gZC5uYW1lKSB8fCBbXSxcbiAgICAgIHBlZXI6IGQucGVlcj8ubWFwKChwKSA9PiBwLm5hbWUpIHx8IFtdLFxuICAgIH07XG4gIH1cbiAgY29uc3QgeyBwcm9kLCBkZXYsIHBlZXIgfSA9IGRlcGVuZGVuY2llcztcbiAgY29uc3QgaW5zdGFsbGVkID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFsuLi4ocHJvZCB8fCBbXSksIC4uLihkZXYgfHwgW10pLCAuLi4ocGVlciB8fCBbXSldKVxuICApO1xuICBkZXBzID0gdHlwZW9mIGRlcHMgPT09IFwic3RyaW5nXCIgPyBbZGVwc10gOiBkZXBzO1xuICBjb25zdCB0b0luc3RhbGwgPSBkZXBzLmZpbHRlcigoZCkgPT4gIWluc3RhbGxlZC5pbmNsdWRlcyhkKSk7XG5cbiAgaWYgKHRvSW5zdGFsbC5sZW5ndGgpIGF3YWl0IGluc3RhbGxEZXBlbmRlbmNpZXMoeyBkZXY6IHRvSW5zdGFsbCB9KTtcbiAgZGVwZW5kZW5jaWVzLmRldiA9IGRlcGVuZGVuY2llcy5kZXYgfHwgW107XG4gIGRlcGVuZGVuY2llcy5kZXYucHVzaCguLi50b0luc3RhbGwpO1xuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVzaFRvR2l0KCkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHB1c2hUb0dpdCk7XG4gIGNvbnN0IGdpdFVzZXIgPSBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGNvbmZpZyB1c2VyLm5hbWVcIikucHJvbWlzZTtcbiAgY29uc3QgZ2l0RW1haWwgPSBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGNvbmZpZyB1c2VyLmVtYWlsXCIpLnByb21pc2U7XG4gIGxvZy52ZXJib3NlKGBjYWNoZWQgZ2l0IGlkOiAke2dpdFVzZXJ9LyR7Z2l0RW1haWx9LiBjaGFuZ2luZyB0byBhdXRvbWF0aW9uYCk7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCBjb25maWcgdXNlci5lbWFpbCBcImF1dG9tYXRpb25AZGVjYWYudHNcIicpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCBjb25maWcgdXNlci5uYW1lIFwiZGVjYWZcIicpLnByb21pc2U7XG4gIGxvZy5pbmZvKFwiUHVzaGluZyBjaGFuZ2VzIHRvIGdpdC4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBhZGQgLlwiKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29tbWl0IC1tIFwicmVmcyAjMSAtIGFmdGVyIHJlcG8gc2V0dXBcImApLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgcHVzaFwiKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29uZmlnIHVzZXIuZW1haWwgXCIke2dpdEVtYWlsfVwiYCkucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZChgZ2l0IGNvbmZpZyB1c2VyLm5hbWUgXCIke2dpdFVzZXJ9XCJgKS5wcm9taXNlO1xuICBsb2cudmVyYm9zZShgcmV2ZXJ0ZWQgdG8gZ2l0IGlkOiAke2dpdFVzZXJ9LyR7Z2l0RW1haWx9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llczoge1xuICBwcm9kPzogc3RyaW5nW107XG4gIGRldj86IHN0cmluZ1tdO1xuICBwZWVyPzogc3RyaW5nW107XG59KSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoaW5zdGFsbERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IHByb2QgPSBkZXBlbmRlbmNpZXMucHJvZCB8fCBbXTtcbiAgY29uc3QgZGV2ID0gZGVwZW5kZW5jaWVzLmRldiB8fCBbXTtcbiAgY29uc3QgcGVlciA9IGRlcGVuZGVuY2llcy5wZWVyIHx8IFtdO1xuICBpZiAocHJvZC5sZW5ndGgpIHtcbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMgJHtwcm9kLmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAke3Byb2Quam9pbihcIiBcIil9YCwgeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSlcbiAgICAgIC5wcm9taXNlO1xuICB9XG4gIGlmIChkZXYubGVuZ3RoKSB7XG4gICAgbG9nLmluZm8oYEluc3RhbGxpbmcgZGV2RGVwZW5kZW5jaWVzICR7ZGV2LmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAtLXNhdmUtZGV2ICR7ZGV2LmpvaW4oXCIgXCIpfWAsIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KS5wcm9taXNlO1xuICB9XG4gIGlmIChwZWVyLmxlbmd0aCkge1xuICAgIGxvZy5pbmZvKGBJbnN0YWxsaW5nIHBlZXJEZXBlbmRlbmNpZXMgJHtwZWVyLmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAtLXNhdmUtcGVlciAke3BlZXIuam9pbihcIiBcIil9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUltcG9ydDxUPihcbiAgaW1wb3J0UHJvbWlzZTogUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIC8vIENvbW1vbkpTJ3MgYG1vZHVsZS5leHBvcnRzYCBpcyB3cmFwcGVkIGFzIGBkZWZhdWx0YCBpbiBFU01vZHVsZS5cbiAgcmV0dXJuIGltcG9ydFByb21pc2UudGhlbigobTogYW55KSA9PiAobS5kZWZhdWx0IHx8IG0pIGFzIFQpO1xufVxuIiwiaW1wb3J0IHNsb2dhbnMgZnJvbSBcIi4uL2Fzc2V0cy9zbG9nYW5zLmpzb25cIjtcbmltcG9ydCB7IHN0eWxlIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIEFOU0kgY29sb3IgY29kZXMgZm9yIGJhbm5lciBzdHlsaW5nLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIHNldCBvZiBBTlNJIGNvbG9yIGNvZGVzIHVzZWQgdG8gc3R5bGUgdGhlIGJhbm5lciB0ZXh0LlxuICovXG5jb25zdCBjb2xvcnMgPSBbXG4gIFwiXFx4MWJbMzg7NTsyMTVtXCIsIC8vIHNvZnQgb3JhbmdlXG4gIFwiXFx4MWJbMzg7NTsyMDltXCIsIC8vIGNvcmFsXG4gIFwiXFx4MWJbMzg7NTsyMDVtXCIsIC8vIHBpbmtcbiAgXCJcXHgxYlszODs1OzIxMG1cIiwgLy8gcGVhY2h5XG4gIFwiXFx4MWJbMzg7NTsyMTdtXCIsIC8vIHNhbG1vblxuICBcIlxceDFiWzM4OzU7MjE2bVwiLCAvLyBsaWdodCBjb3JhbFxuICBcIlxceDFiWzM4OzU7MjI0bVwiLCAvLyBsaWdodCBwZWFjaFxuICBcIlxceDFiWzM4OzU7MjMwbVwiLCAvLyBzb2Z0IGNyZWFtXG4gIFwiXFx4MWJbMzg7NTsyMzBtXCIsIC8vIHNvZnQgY3JlYW1cbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW50cyBhIHN0eWxlZCBiYW5uZXIgdG8gdGhlIGNvbnNvbGUuXG4gKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYW5kIHByaW50cyBhIGNvbG9yZnVsIEFTQ0lJIGFydCBiYW5uZXIgd2l0aCBhIHJhbmRvbSBzbG9nYW4uXG4gKiBAcGFyYW0ge0xvZ2dlcn0gW2xvZ2dlcl0gLSBPcHRpb25hbCBsb2dnZXIgZm9yIHZlcmJvc2Ugb3V0cHV0LlxuICogQGZ1bmN0aW9uIHByaW50QmFubmVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IHByaW50QmFubmVyXG4gKiAgIHBhcnRpY2lwYW50IGdldFNsb2dhblxuICogICBwYXJ0aWNpcGFudCBwYWRFbmRcbiAqICAgcGFydGljaXBhbnQgY29uc29sZVxuICogICBwcmludEJhbm5lci0+PmdldFNsb2dhbjogQ2FsbCBnZXRTbG9nYW4oKVxuICogICBnZXRTbG9nYW4tLT4+cHJpbnRCYW5uZXI6IFJldHVybiByYW5kb20gc2xvZ2FuXG4gKiAgIHByaW50QmFubmVyLT4+cHJpbnRCYW5uZXI6IENyZWF0ZSBiYW5uZXIgQVNDSUkgYXJ0XG4gKiAgIHByaW50QmFubmVyLT4+cHJpbnRCYW5uZXI6IFNwbGl0IGJhbm5lciBpbnRvIGxpbmVzXG4gKiAgIHByaW50QmFubmVyLT4+cHJpbnRCYW5uZXI6IENhbGN1bGF0ZSBtYXggbGluZSBsZW5ndGhcbiAqICAgcHJpbnRCYW5uZXItPj5wYWRFbmQ6IENhbGwgcGFkRW5kIHdpdGggc2xvZ2FuXG4gKiAgIHBhZEVuZC0tPj5wcmludEJhbm5lcjogUmV0dXJuIHBhZGRlZCBzbG9nYW4gbGluZVxuICogICBsb29wIEZvciBlYWNoIGJhbm5lciBsaW5lXG4gKiAgICAgcHJpbnRCYW5uZXItPj5zdHlsZTogQ2FsbCBzdHlsZShsaW5lKVxuICogICAgIHN0eWxlLS0+PnByaW50QmFubmVyOiBSZXR1cm4gc3R5bGVkIGxpbmVcbiAqICAgICBwcmludEJhbm5lci0+PmNvbnNvbGU6IExvZyBzdHlsZWQgbGluZVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50QmFubmVyKGxvZ2dlcj86IExvZ2dlcikge1xuICBjb25zdCBtZXNzYWdlID0gZ2V0U2xvZ2FuKCk7XG4gIGNvbnN0IGJhbm5lcjogc3RyaW5nIHwgc3RyaW5nW10gPVxuICAgIGAjICAgICAgICAgICAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEgICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgXG4jICAgICAgKCAoICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIFxuIyAgICAgICApICkgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgXG4jICAgIFs9PT09PT09XSAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICBcbiMgICAgIFxcYC0tLS0twrQgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRIFxuIyAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSBcbiMgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICBcbiNgLnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBtYXhMZW5ndGggPSBiYW5uZXIucmVkdWNlKChtYXgsIGxpbmUpID0+IE1hdGgubWF4KG1heCwgbGluZS5sZW5ndGgpLCAwKTtcbiAgYmFubmVyLnB1c2goYCMgICR7bWVzc2FnZS5wYWRTdGFydChtYXhMZW5ndGggLSAzKX1gKTtcbiAgYmFubmVyLmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XG4gICAgKGxvZ2dlciA/IGxvZ2dlci5pbmZvLmJpbmQobG9nZ2VyKSA6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkpKFxuICAgICAgc3R5bGUobGluZSB8fCBcIlwiKS5yYXcoY29sb3JzW2luZGV4XSkudGV4dFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBzbG9nYW4gZnJvbSB0aGUgcHJlZGVmaW5lZCBsaXN0LlxuICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJhbmRvbSBzbG9nYW4gb3IgYSBzcGVjaWZpYyBvbmUgYnkgaW5kZXggZnJvbSB0aGUgc2xvZ2FucyBsaXN0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpXSAtIE9wdGlvbmFsIGluZGV4IHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgc2xvZ2FuLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2VsZWN0ZWQgc2xvZ2FuLlxuICogQGZ1bmN0aW9uIGdldFNsb2dhblxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBnZXRTbG9nYW5cbiAqICAgcGFydGljaXBhbnQgTWF0aC5yYW5kb21cbiAqICAgcGFydGljaXBhbnQgc2xvZ2Fuc1xuICogICBhbHQgaSBpcyB1bmRlZmluZWRcbiAqICAgICBnZXRTbG9nYW4tPj5NYXRoLnJhbmRvbTogR2VuZXJhdGUgcmFuZG9tIGluZGV4XG4gKiAgICAgTWF0aC5yYW5kb20tLT4+Z2V0U2xvZ2FuOiBSZXR1cm4gcmFuZG9tIGluZGV4XG4gKiAgIGVsc2UgaSBpcyBkZWZpbmVkXG4gKiAgICAgTm90ZSBvdmVyIGdldFNsb2dhbjogVXNlIHByb3ZpZGVkIGluZGV4XG4gKiAgIGVuZFxuICogICBnZXRTbG9nYW4tPj5zbG9nYW5zOiBBY2Nlc3Mgc2xvZ2FuIGF0IGluZGV4XG4gKiAgIHNsb2dhbnMtLT4+Z2V0U2xvZ2FuOiBSZXR1cm4gc2xvZ2FuXG4gKiAgIGFsdCBFcnJvciBvY2N1cnNcbiAqICAgICBnZXRTbG9nYW4tPj5nZXRTbG9nYW46IFRocm93IGVycm9yXG4gKiAgIGVuZFxuICogICBnZXRTbG9nYW4tLT4+Q2FsbGVyOiBSZXR1cm4gc2xvZ2FuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTbG9nYW4oaT86IG51bWJlcik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgaSA9XG4gICAgICB0eXBlb2YgaSA9PT0gXCJ1bmRlZmluZWRcIiA/IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHNsb2dhbnMubGVuZ3RoKSA6IGk7XG4gICAgcmV0dXJuIHNsb2dhbnNbaV0uU2xvZ2FuO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJldHJpZXZlIHNsb2dhbnM6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGZ1bmN0aW9uIGlzQnJvd3NlclxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyIGJ5IGNoZWNraW5nIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBAc3VtbWFyeSBDaGVja3MgaWYgdGhlIGNvZGUgaXMgcnVubmluZyBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWxUaGlzKSkgIT09XG4gICAgT2JqZWN0LnByb3RvdHlwZVxuICApO1xufVxuIiwiaW1wb3J0IHsgdG9FTlZGb3JtYXQgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBFbnZpcm9ubWVudEZhY3RvcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSBcIi4vd2ViXCI7XG5pbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCJ0eXBlZC1vYmplY3QtYWNjdW11bGF0b3JcIjtcblxuLyoqXG4gKiBAY2xhc3MgRW52aXJvbm1lbnRcbiAqIEBleHRlbmRzIHtPYmplY3RBY2N1bXVsYXRvcjxUPn1cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAZGVzY3JpcHRpb24gQSBjbGFzcyByZXByZXNlbnRpbmcgYW4gZW52aXJvbm1lbnQgd2l0aCBhY2N1bXVsYXRpb24gY2FwYWJpbGl0aWVzLlxuICogQHN1bW1hcnkgTWFuYWdlcyBlbnZpcm9ubWVudC1yZWxhdGVkIGRhdGEgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGFjY3VtdWxhdGlvbiBhbmQga2V5IHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7VH0gW2luaXRpYWxEYXRhXSAtIFRoZSBpbml0aWFsIGRhdGEgdG8gcG9wdWxhdGUgdGhlIGVudmlyb25tZW50IHdpdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudDxUIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIE9iamVjdEFjY3VtdWxhdG9yPFQ+IHtcbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByb3RlY3RlZFxuICAgKiBAZGVzY3JpcHRpb24gQSBmYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBFbnZpcm9ubWVudCBpbnN0YW5jZXMuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgaG93IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEVudmlyb25tZW50IGNsYXNzIHNob3VsZCBiZSBjcmVhdGVkLlxuICAgKiBAcmV0dXJuIHtFbnZpcm9ubWVudDxhbnk+fSBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZhY3Rvcnk6IEVudmlyb25tZW50RmFjdG9yeTxhbnksIGFueT4gPVxuICAgICgpOiBFbnZpcm9ubWVudDxhbnk+ID0+IG5ldyBFbnZpcm9ubWVudCgpO1xuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBwcml2YXRlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICogQHR5cGUge0Vudmlyb25tZW50PGFueT59XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEVudmlyb25tZW50PGFueT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZnJvbUVudihrOiBzdHJpbmcpIHtcbiAgICBsZXQgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgIGVudiA9IChnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYgeyBFTlY6IFJlY29yZDxzdHJpbmcsIGFueT4gfSlbXG4gICAgICAgIFwiRU5WXCJcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9IGdsb2JhbFRoaXMucHJvY2Vzcy5lbnY7XG4gICAgICBrID0gdG9FTlZGb3JtYXQoayk7XG4gICAgfVxuICAgIHJldHVybiBlbnZba107XG4gIH1cblxuICBwcm90ZWN0ZWQgZXhwYW5kPFYgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWKTogdm9pZCB7XG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGssIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbUVudiA9IHRoaXMuZnJvbUVudihrKTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGZyb21FbnYgPT09IFwidW5kZWZpbmVkXCIgPyB2IDogZnJvbUVudjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAodmFsOiBWW2tleW9mIFZdKSA9PiB7XG4gICAgICAgICAgdiA9IHZhbDtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgY3JlYXRlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MgZXhpc3RzLlxuICAgKiBAdGVtcGxhdGUgRVxuICAgKiBAcGFyYW0gey4uLnVua25vd25bXX0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGlmIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0V9IFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBpbnN0YW5jZTxFIGV4dGVuZHMgRW52aXJvbm1lbnQ8YW55Pj4oLi4uYXJnczogdW5rbm93bltdKTogRSB7XG4gICAgRW52aXJvbm1lbnQuX2luc3RhbmNlID0gIUVudmlyb25tZW50Ll9pbnN0YW5jZVxuICAgICAgPyBFbnZpcm9ubWVudC5mYWN0b3J5KC4uLmFyZ3MpXG4gICAgICA6IEVudmlyb25tZW50Ll9pbnN0YW5jZTtcbiAgICByZXR1cm4gRW52aXJvbm1lbnQuX2luc3RhbmNlIGFzIEU7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gQWNjdW11bGF0ZXMgdGhlIGdpdmVuIHZhbHVlIGludG8gdGhlIGVudmlyb25tZW50LlxuICAgKiBAc3VtbWFyeSBBZGRzIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZSBlbnZpcm9ubWVudCBmcm9tIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gICAqIEB0ZW1wbGF0ZSBWXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBUaGUgb2JqZWN0IHRvIGFjY3VtdWxhdGUgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEByZXR1cm4ge1Z9IFRoZSB1cGRhdGVkIGVudmlyb25tZW50IGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGFjY3VtdWxhdGU8ViBleHRlbmRzIG9iamVjdD4oXG4gICAgdmFsdWU6IFZcbiAgKTogdHlwZW9mIEVudmlyb25tZW50Ll9pbnN0YW5jZSAmXG4gICAgViAmXG4gICAgT2JqZWN0QWNjdW11bGF0b3I8dHlwZW9mIEVudmlyb25tZW50Ll9pbnN0YW5jZSAmIFY+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IEVudmlyb25tZW50Lmluc3RhbmNlKCk7XG4gICAgcmV0dXJuIGluc3RhbmNlLmFjY3VtdWxhdGUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUga2V5cyBvZiB0aGUgZW52aXJvbm1lbnQsIG9wdGlvbmFsbHkgY29udmVydGluZyB0aGVtIHRvIEVOViBmb3JtYXQuXG4gICAqIEBzdW1tYXJ5IEdldHMgYWxsIGtleXMgaW4gdGhlIGVudmlyb25tZW50LCB3aXRoIGFuIG9wdGlvbiB0byBmb3JtYXQgdGhlbSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0b0Vudj10cnVlXSAtIFdoZXRoZXIgdG8gY29udmVydCB0aGUga2V5cyB0byBFTlYgZm9ybWF0LlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2Yga2V5cyBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAgICovXG4gIHN0YXRpYyBrZXlzKHRvRW52OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnQuaW5zdGFuY2UoKVxuICAgICAgLmtleXMoKVxuICAgICAgLm1hcCgoaykgPT4gKHRvRW52ID8gdG9FTlZGb3JtYXQoaykgOiBrKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBhcnNlQXJnc1Jlc3VsdCB9IGZyb20gXCIuLi9pbnB1dC90eXBlc1wiO1xuaW1wb3J0IHsgQ29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgVXNlcklucHV0IH0gZnJvbSBcIi4uL2lucHV0L2lucHV0XCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZXBlbmRlbmNpZXMsIGdldFBhY2thZ2VWZXJzaW9uIH0gZnJvbSBcIi4uL3V0aWxzL2ZzXCI7XG5pbXBvcnQgeyBwcmludEJhbm5lciB9IGZyb20gXCIuLi9vdXRwdXQvY29tbW9uXCI7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gXCIuLi91dGlscy9lbnZpcm9ubWVudFwiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIExvZ2dlcixcbiAgTG9nZ2luZyxcbiAgTG9nZ2luZ0NvbmZpZyxcbiAgTG9nTGV2ZWwsXG59IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBjbGFzcyBDb21tYW5kXG4gKiBAYWJzdHJhY3RcbiAqIEB0ZW1wbGF0ZSBJIC0gVGhlIHR5cGUgb2YgaW5wdXQgb3B0aW9ucyBmb3IgdGhlIGNvbW1hbmQuXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgY29tbWFuZCBleGVjdXRpb24uXG4gKiBAbWVtYmVyT2YgdXRpbHMvY2xpXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZCBpbXBsZW1lbnRhdGlvbi5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGNvbW1hbmRzIHdpdGggaW5wdXQgaGFuZGxpbmcsIGxvZ2dpbmcsIGFuZCBleGVjdXRpb24gZmxvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICogQHBhcmFtIHtDb21tYW5kT3B0aW9uczxJPn0gW2lucHV0c10gLSBUaGUgaW5wdXQgb3B0aW9ucyBmb3IgdGhlIGNvbW1hbmQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbcmVxdWlyZW1lbnRzXSAtIFRoZSBsaXN0IG9mIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBmb3IgdGhlIGNvbW1hbmQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21tYW5kPEksIFI+IHtcbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBsb2dnZXIgZm9yIHRoZSBDb21tYW5kIGNsYXNzLlxuICAgKiBAdHlwZSB7TG9nZ2VyfVxuICAgKi9cbiAgc3RhdGljIGxvZzogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBJbnN0YW5jZSBsb2dnZXIgZm9yIHRoZSBjb21tYW5kLlxuICAgKiBAdHlwZSB7TG9nZ2VyfVxuICAgKi9cbiAgcHJvdGVjdGVkIGxvZzogTG9nZ2VyO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgbmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBpbnB1dHM6IENvbW1hbmRPcHRpb25zPEk+ID0ge30gYXMgdW5rbm93biBhcyBDb21tYW5kT3B0aW9uczxJPixcbiAgICBwcm90ZWN0ZWQgcmVxdWlyZW1lbnRzOiBzdHJpbmdbXSA9IFtdXG4gICkge1xuICAgIGlmICghQ29tbWFuZC5sb2cpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21tYW5kLCBcImxvZ1wiLCB7XG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IExvZ2dpbmcuZm9yKENvbW1hbmQubmFtZSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMubG9nID0gQ29tbWFuZC5sb2c7XG4gICAgfVxuICAgIHRoaXMubG9nID0gQ29tbWFuZC5sb2cuZm9yKHRoaXMubmFtZSk7XG4gICAgdGhpcy5pbnB1dHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsXG4gICAgICBpbnB1dHNcbiAgICApIGFzIENvbW1hbmRPcHRpb25zPEk+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGFzeW5jXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBhcmUgcHJlc2VudC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBhbmQgY29tcGFyZXMgaXQgYWdhaW5zdCB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqICAgcGFydGljaXBhbnQgZ2V0RGVwZW5kZW5jaWVzXG4gICAqICAgcGFydGljaXBhbnQgU2V0XG4gICAqICAgQ29tbWFuZC0+PmdldERlcGVuZGVuY2llczogQ2FsbFxuICAgKiAgIGdldERlcGVuZGVuY2llcy0tPj5Db21tYW5kOiBSZXR1cm4ge3Byb2QsIGRldiwgcGVlcn1cbiAgICogICBDb21tYW5kLT4+U2V0OiBDcmVhdGUgU2V0IGZyb20gcHJvZCwgZGV2LCBwZWVyXG4gICAqICAgU2V0LS0+PkNvbW1hbmQ6IFJldHVybiB1bmlxdWUgZGVwZW5kZW5jaWVzXG4gICAqICAgQ29tbWFuZC0+PkNvbW1hbmQ6IENvbXBhcmUgYWdhaW5zdCByZXF1aXJlbWVudHNcbiAgICogICBhbHQgTWlzc2luZyBkZXBlbmRlbmNpZXNcbiAgICogICAgIENvbW1hbmQtPj5Db21tYW5kOiBBZGQgdG8gbWlzc2luZyBsaXN0XG4gICAqICAgZW5kXG4gICAqICAgTm90ZSBvdmVyIENvbW1hbmQ6IElmIG1pc3NpbmcubGVuZ3RoID4gMCwgaGFuZGxlIG1pc3NpbmcgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tSZXF1aXJlbWVudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBwcm9kLCBkZXYsIHBlZXIgfSA9IGF3YWl0IGdldERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBbXTtcbiAgICBjb25zdCBmdWxsTGlzdCA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFsuLi5wcm9kLCAuLi5kZXYsIC4uLnBlZXJdKS52YWx1ZXMoKVxuICAgICkubWFwKChkKSA9PiBkLm5hbWUpO1xuICAgIGZvciAoY29uc3QgZGVwIG9mIHRoaXMucmVxdWlyZW1lbnRzKVxuICAgICAgaWYgKCFmdWxsTGlzdC5pbmNsdWRlcyhkZXApKSBtaXNzaW5nLnB1c2goZGVwKTtcblxuICAgIGlmICghbWlzc2luZy5sZW5ndGgpIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gZGVyaXZlZCBjbGFzc2VzIHRvIHByb3ZpZGUgc3BlY2lmaWMgaGVscCBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtQYXJzZUFyZ3NSZXN1bHR9IGFyZ3MgLSBUaGUgcGFyc2VkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgaGVscChhcmdzOiBQYXJzZUFyZ3NSZXN1bHQpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBUaGlzIGlzIGhlbHAuIEknbSBubyB1c2UgYmVjYXVzZSBJIHNob3VsZCBoYXZlIGJlZW4gb3ZlcnJpZGRlbi5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgY29tbWFuZCB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZGVmaW5lIHRoZSBjb21tYW5kJ3MgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhbnN3ZXJzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSIHwgc3RyaW5nIHwgdm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQncyByZXN1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcnVuPFI+KFxuICAgIGFuc3dlcnM6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiBJXTogdW5rbm93biB9XG4gICk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAYXN5bmNcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBjb21tYW5kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBvdmVyYWxsIGV4ZWN1dGlvbiBmbG93IG9mIHRoZSBjb21tYW5kLCBpbmNsdWRpbmcgcGFyc2luZyBhcmd1bWVudHMsXG4gICAqIHNldHRpbmcgdXAgbG9nZ2luZywgY2hlY2tpbmcgZm9yIHZlcnNpb24gb3IgaGVscCByZXF1ZXN0cywgYW5kIHJ1bm5pbmcgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFIgfCBzdHJpbmcgfCB2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCdzIHJlc3VsdC5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ29tbWFuZFxuICAgKiAgIHBhcnRpY2lwYW50IFVzZXJJbnB1dFxuICAgKiAgIHBhcnRpY2lwYW50IExvZ2dpbmdcbiAgICogICBwYXJ0aWNpcGFudCBnZXRQYWNrYWdlVmVyc2lvblxuICAgKiAgIHBhcnRpY2lwYW50IHByaW50QmFubmVyXG4gICAqICAgQ29tbWFuZC0+PlVzZXJJbnB1dDogcGFyc2VBcmdzKGlucHV0cylcbiAgICogICBVc2VySW5wdXQtLT4+Q29tbWFuZDogUmV0dXJuIFBhcnNlQXJnc1Jlc3VsdFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBQcm9jZXNzIG9wdGlvbnNcbiAgICogICBDb21tYW5kLT4+TG9nZ2luZzogc2V0Q29uZmlnKG9wdGlvbnMpXG4gICAqICAgYWx0IHZlcnNpb24gcmVxdWVzdGVkXG4gICAqICAgICBDb21tYW5kLT4+Z2V0UGFja2FnZVZlcnNpb246IENhbGxcbiAgICogICAgIGdldFBhY2thZ2VWZXJzaW9uLS0+PkNvbW1hbmQ6IFJldHVybiB2ZXJzaW9uXG4gICAqICAgZWxzZSBoZWxwIHJlcXVlc3RlZFxuICAgKiAgICAgQ29tbWFuZC0+PkNvbW1hbmQ6IGhlbHAoYXJncylcbiAgICogICBlbHNlIGJhbm5lciByZXF1ZXN0ZWRcbiAgICogICAgIENvbW1hbmQtPj5wcmludEJhbm5lcjogQ2FsbFxuICAgKiAgIGVuZFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBydW4oYXJncylcbiAgICogICBhbHQgZXJyb3Igb2NjdXJzXG4gICAqICAgICBDb21tYW5kLT4+Q29tbWFuZDogTG9nIGVycm9yXG4gICAqICAgZW5kXG4gICAqICAgQ29tbWFuZC0tPj5Db21tYW5kOiBSZXR1cm4gcmVzdWx0XG4gICAqL1xuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzOiBQYXJzZUFyZ3NSZXN1bHQgPSBVc2VySW5wdXQucGFyc2VBcmdzKHRoaXMuaW5wdXRzKTtcbiAgICBjb25zdCBlbnYgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKERlZmF1bHRMb2dnaW5nQ29uZmlnKVxuICAgICAgLmFjY3VtdWxhdGUoRGVmYXVsdENvbW1hbmRWYWx1ZXMpXG4gICAgICAuYWNjdW11bGF0ZShhcmdzLnZhbHVlcyk7XG4gICAgY29uc3QgeyB0aW1lc3RhbXAsIHZlcmJvc2UsIHZlcnNpb24sIGhlbHAsIGxvZ0xldmVsLCBsb2dTdHlsZSwgYmFubmVyIH0gPVxuICAgICAgZW52O1xuXG4gICAgdGhpcy5sb2cuc2V0Q29uZmlnKHtcbiAgICAgIC4uLmVudixcbiAgICAgIHRpbWVzdGFtcDogISF0aW1lc3RhbXAsXG4gICAgICBsZXZlbDogbG9nTGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICBzdHlsZTogISFsb2dTdHlsZSxcbiAgICAgIHZlcmJvc2U6ICh2ZXJib3NlIGFzIG51bWJlcikgfHwgMCxcbiAgICB9KTtcblxuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZ2V0UGFja2FnZVZlcnNpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoaGVscCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGVscChhcmdzKTtcbiAgICB9XG5cbiAgICBpZiAoYmFubmVyKVxuICAgICAgcHJpbnRCYW5uZXIoXG4gICAgICAgIHRoaXMubG9nLmZvcihwcmludEJhbm5lciwge1xuICAgICAgICAgIHRpbWVzdGFtcDogZmFsc2UsXG4gICAgICAgICAgc3R5bGU6IGZhbHNlLFxuICAgICAgICAgIGNvbnRleHQ6IGZhbHNlLFxuICAgICAgICAgIGxvZ0xldmVsOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bihlbnYpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFcnJvciB3aGlsZSBydW5uaW5nIHByb3ZpZGVkIGNsaSBmdW5jdGlvbjogJHtlfWApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIFI7XG4gIH1cbn1cbiIsImltcG9ydCBodHRwcyBmcm9tIFwiaHR0cHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzaW1wbGUgSFRUUCBjbGllbnQgZm9yIGRvd25sb2FkaW5nIGZpbGVzLlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIGRvd25sb2FkIGZpbGVzIGZyb20gSFRUUFMgVVJMcy5cbiAqIEl0IHVzZXMgTm9kZS5qcyBidWlsdC1pbiBodHRwcyBtb2R1bGUgdG8gbWFrZSByZXF1ZXN0cy5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDbGllbnQge1xuICBwcm90ZWN0ZWQgc3RhdGljIGxvZyA9IExvZ2dpbmcuZm9yKEh0dHBDbGllbnQpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhIGZpbGUgZnJvbSBhIGdpdmVuIFVSTC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2VuZHMgYSBHRVQgcmVxdWVzdCB0byB0aGUgc3BlY2lmaWVkIFVSTCBhbmQgcmV0dXJucyB0aGUgcmVzcG9uc2UgYm9keSBhcyBhIHN0cmluZy5cbiAgICogSXQgaGFuZGxlcyBkaWZmZXJlbnQgc2NlbmFyaW9zIHN1Y2ggYXMgbm9uLTIwMCBzdGF0dXMgY29kZXMgYW5kIG5ldHdvcmsgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCBvZiB0aGUgZmlsZSB0byBkb3dubG9hZC5cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBmaWxlIGNvbnRlbnQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEh0dHBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBIVFRQU1xuICAgKiAgIHBhcnRpY2lwYW50IFNlcnZlclxuICAgKiAgIENsaWVudC0+Pkh0dHBDbGllbnQ6IGRvd25sb2FkRmlsZSh1cmwpXG4gICAqICAgSHR0cENsaWVudC0+PkhUVFBTOiBnZXQodXJsKVxuICAgKiAgIEhUVFBTLT4+U2VydmVyOiBHRVQgcmVxdWVzdFxuICAgKiAgIFNlcnZlci0tPj5IVFRQUzogUmVzcG9uc2VcbiAgICogICBIVFRQUy0tPj5IdHRwQ2xpZW50OiBSZXNwb25zZSBvYmplY3RcbiAgICogICBhbHQgU3RhdHVzIGNvZGUgaXMgMjAwXG4gICAqICAgICBsb29wIEZvciBlYWNoIGRhdGEgY2h1bmtcbiAgICogICAgICAgSFRUUFMtPj5IdHRwQ2xpZW50OiAnZGF0YScgZXZlbnRcbiAgICogICAgICAgSHR0cENsaWVudC0+Pkh0dHBDbGllbnQ6IEFjY3VtdWxhdGUgZGF0YVxuICAgKiAgICAgZW5kXG4gICAqICAgICBIVFRQUy0+Pkh0dHBDbGllbnQ6ICdlbmQnIGV2ZW50XG4gICAqICAgICBIdHRwQ2xpZW50LS0+PkNsaWVudDogUmVzb2x2ZSB3aXRoIGRhdGFcbiAgICogICBlbHNlIFN0YXR1cyBjb2RlIGlzIG5vdCAyMDBcbiAgICogICAgIEh0dHBDbGllbnQtLT4+Q2xpZW50OiBSZWplY3Qgd2l0aCBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRvd25sb2FkRmlsZSh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZnVuY3Rpb24gcmVxdWVzdCh1cmw6IHN0cmluZykge1xuICAgICAgICB1cmwgPSBlbmNvZGVVUkkodXJsKTtcbiAgICAgICAgaHR0cHMuZ2V0KHVybCwgKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDcpXG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdChyZXMuaGVhZGVycy5sb2NhdGlvbiBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICAgIEh0dHBDbGllbnQubG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoICR7dXJsfSAoc3RhdHVzOiAke3Jlcy5zdGF0dXNDb2RlfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICAgICAgICByZXMub24oXCJkYXRhXCIsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXMub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXF1ZXN0KHVybCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN0YW5kYXJkT3V0cHV0V3JpdGVyIH0gZnJvbSBcIi4vU3RhbmRhcmRPdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IFByb21pc2VFeGVjdXRvciB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHNwZWNpYWxpemVkIG91dHB1dCB3cml0ZXIgdGhhdCB1c2VzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gcHJvY2VzcyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIGV4dGVuZHMgU3RhbmRhcmRPdXRwdXRXcml0ZXIgdG8gcHJvdmlkZSByZWdleC1iYXNlZCBvdXRwdXQgcHJvY2Vzc2luZy5cbiAqIEl0IGFsbG93cyBmb3IgcGF0dGVybiBtYXRjaGluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgY2FuIHRyaWdnZXIgc3BlY2lmaWMgYWN0aW9uc1xuICogYmFzZWQgb24gbWF0Y2hlZCBwYXR0ZXJucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSByZXNvbHZlZCB2YWx1ZSwgZGVmYXVsdGluZyB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGxvY2sgLSBBIFByb21pc2VFeGVjdXRvciB0byBjb250cm9sIHRoZSBhc3luY2hyb25vdXMgZmxvdy5cbiAqIEBwYXJhbSByZWdleHAgLSBBIHN0cmluZyBvciBSZWdFeHAgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgb3V0cHV0LlxuICogQHBhcmFtIGZsYWdzIC0gT3B0aW9uYWwgZmxhZ3MgZm9yIHRoZSBSZWdFeHAgY29uc3RydWN0b3IuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdleHBPdXRwdXRXcml0ZXIgZXh0ZW5kcyBTdGFuZGFyZE91dHB1dFdyaXRlcjxzdHJpbmc+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIG1hdGNoaW5nIG91dHB1dC5cbiAgICogQHN1bW1hcnkgVGhpcyByZWFkb25seSBwcm9wZXJ0eSBzdG9yZXMgdGhlIGNvbXBpbGVkIFJlZ0V4cCB1c2VkIGZvciBwYXR0ZXJuIG1hdGNoaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZ2V4cDogUmVnRXhwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVnZXhwT3V0cHV0V3JpdGVyLlxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIHRoZSBSZWdleHBPdXRwdXRXcml0ZXIgd2l0aCBhIGxvY2sgbWVjaGFuaXNtIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGNtZFxuICAgKiBAcGFyYW0gbG9jayAtIEEgUHJvbWlzZUV4ZWN1dG9yIHRvIGNvbnRyb2wgdGhlIGFzeW5jaHJvbm91cyBmbG93LlxuICAgKiBAcGFyYW0gcmVnZXhwIC0gQSBzdHJpbmcgb3IgUmVnRXhwIHRvIG1hdGNoIGFnYWluc3QgdGhlIG91dHB1dC5cbiAgICogQHBhcmFtIGZsYWdzIC0gT3B0aW9uYWwgZmxhZ3MgZm9yIHRoZSBSZWdFeHAgY29uc3RydWN0b3IsIGRlZmF1bHRzIHRvIFwiZ1wiLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgY21kOiBzdHJpbmcsXG4gICAgbG9jazogUHJvbWlzZUV4ZWN1dG9yPHN0cmluZywgRXJyb3I+LFxuICAgIHJlZ2V4cDogc3RyaW5nIHwgUmVnRXhwLFxuICAgIGZsYWdzID0gXCJnXCJcbiAgKSB7XG4gICAgc3VwZXIoY21kLCBsb2NrKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZWdleHAgPVxuICAgICAgICB0eXBlb2YgcmVnZXhwID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChyZWdleHAsIGZsYWdzKSA6IHJlZ2V4cDtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyB0aGUgaW5wdXQgZGF0YSBhZ2FpbnN0IHRoZSBzdG9yZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIG9uIHRoZSBpbnB1dCBkYXRhIGFuZCByZXR1cm5zIHRoZSBtYXRjaCByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHN0cmluZyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZXhlY3V0aW9uLCBvciB1bmRlZmluZWQgaWYgYW4gZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0ZXN0KGRhdGE6IHN0cmluZykge1xuICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IDA7XG4gICAgbGV0IG1hdGNoO1xuICAgIHRyeSB7XG4gICAgICBtYXRjaCA9IHRoaXMucmVnZXhwLmV4ZWMoZGF0YSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZGVidWcoYEZhaWxlZCB0byBwYXJzZSBjaHVuazogJHtkYXRhfVxcbkVycm9yOiAke2V9IGApO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlc3RzIHRoZSBkYXRhIGFuZCByZXNvbHZlcyB0aGUgcHJvbWlzZSBpZiBhIG1hdGNoIGlzIGZvdW5kLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgdGVzdCBtZXRob2QgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggdGhlIGZpcnN0IG1hdGNoIGdyb3VwIGlmIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHN0cmluZyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICovXG4gIHByb3RlY3RlZCB0ZXN0QW5kUmVzb2x2ZShkYXRhOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGVzdChkYXRhKTtcbiAgICBpZiAobWF0Y2gpIHRoaXMucmVzb2x2ZShtYXRjaFswXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlc3RzIHRoZSBkYXRhIGFuZCByZWplY3RzIHRoZSBwcm9taXNlIGlmIGEgbWF0Y2ggaXMgZm91bmQuXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHRoZSB0ZXN0IG1ldGhvZCBhbmQgcmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBmaXJzdCBtYXRjaCBncm91cCBpZiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgdGVzdEFuZFJlamVjdChkYXRhOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGVzdChkYXRhKTtcbiAgICBpZiAobWF0Y2gpIHRoaXMucmVqZWN0KG1hdGNoWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGRhdGEgY2h1bmtzLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IGNsYXNzIGRhdGEgbWV0aG9kIGFuZCB0aGVuIHRlc3RzIHRoZSBkYXRhIGZvciBhIG1hdGNoIHRvIHBvdGVudGlhbGx5IHJlc29sdmUgdGhlIHByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBkYXRhIGNodW5rIHRvIHByb2Nlc3MuXG4gICAqL1xuICBkYXRhKGNodW5rOiBhbnkpIHtcbiAgICBzdXBlci5kYXRhKGNodW5rKTtcbiAgICB0aGlzLnRlc3RBbmRSZXNvbHZlKFN0cmluZyhjaHVuaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgZXJyb3IgY2h1bmtzLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IGNsYXNzIGVycm9yIG1ldGhvZCBhbmQgdGhlbiB0ZXN0cyB0aGUgZGF0YSBmb3IgYSBtYXRjaCB0byBwb3RlbnRpYWxseSByZWplY3QgdGhlIHByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBlcnJvciBjaHVuayB0byBwcm9jZXNzLlxuICAgKi9cbiAgZXJyb3IoY2h1bms6IGFueSkge1xuICAgIHN1cGVyLmVycm9yKGNodW5rKTtcbiAgICB0aGlzLnRlc3RBbmRSZWplY3QoU3RyaW5nKGNodW5rKSk7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2NsaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL291dHB1dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dyaXRlcnNcIjtcblxuLyoqXG4gKiBAbW9kdWxlIEBkZWNhZi10cy91dGlsc1xuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYSBsaWdodCB2ZXJzaW9uIG9mIERlY2FmIENMSSB0b29sLCBwcm92aWRpbmcgYSBjb21wcmVoZW5zaXZlIHNldCBvZiB1dGlsaXRpZXNcbiAqIGFuZCBmdW5jdGlvbmFsaXRpZXMgZm9yIGNvbW1hbmQtbGluZSBpbnRlcmZhY2Ugb3BlcmF0aW9ucy4gSXQgZW5jb21wYXNzZXMgc2V2ZXJhbCBrZXkgY29tcG9uZW50czpcbiAqXG4gKiAxLiBJbnB1dCBIYW5kbGluZzogTWFuYWdlcyB1c2VyIGlucHV0IGFuZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHByb2Nlc3NpbmcuXG4gKiAyLiBVdGlsaXR5IEZ1bmN0aW9uczogT2ZmZXJzIGEgY29sbGVjdGlvbiBvZiBoZWxwZXIgZnVuY3Rpb25zIGFuZCBjb25zdGFudHMgZm9yIHZhcmlvdXMgb3BlcmF0aW9ucy5cbiAqIDMuIFR5cGUgRGVmaW5pdGlvbnM6IERlZmluZXMgY3VzdG9tIHR5cGVzIGFuZCBpbnRlcmZhY2VzIHVzZWQgdGhyb3VnaG91dCB0aGUgbW9kdWxlLlxuICogNC4gT3V0cHV0IE1hbmFnZW1lbnQ6IFByb3ZpZGVzIGRpZmZlcmVudCBvdXRwdXQgd3JpdGluZyBzdHJhdGVnaWVzIGZvciBmbGV4aWJsZSBjb25zb2xlIG91dHB1dCBoYW5kbGluZy5cbiAqXG4gKiBUaGUgbW9kdWxlIGlzIGRlc2lnbmVkIHRvIGZhY2lsaXRhdGUgdGhlIGNyZWF0aW9uIG9mIHJvYnVzdCBDTEkgYXBwbGljYXRpb25zIGJ5IG9mZmVyaW5nOlxuICogLSBTdGFuZGFyZGl6ZWQgaW5wdXQgcGFyc2luZyBhbmQgdmFsaWRhdGlvblxuICogLSBDb25zaXN0ZW50IG91dHB1dCBmb3JtYXR0aW5nIGFuZCBoYW5kbGluZ1xuICogLSBSZXVzYWJsZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgY29tbW9uIENMSSB0YXNrc1xuICogLSBFeHRlbnNpYmxlIGFyY2hpdGVjdHVyZSBmb3IgYWRkaW5nIG5ldyBjb21tYW5kcyBhbmQgZmVhdHVyZXNcbiAqXG4gKiBJdCBzdXBwb3J0cyB2YXJpb3VzIG91dHB1dCBtb2RlcywgaW5jbHVkaW5nIHN0YW5kYXJkIGNvbnNvbGUgb3V0cHV0IGFuZCByZWd1bGFyIGV4cHJlc3Npb24tYmFzZWQgb3V0cHV0LFxuICogYWxsb3dpbmcgZm9yIHZlcnNhdGlsZSBkYXRhIHByZXNlbnRhdGlvbiBhbmQgcHJvY2Vzc2luZy4gVGhlIG1vZHVsYXIgc3RydWN0dXJlIGVuYWJsZXMgZWFzeSBtYWludGVuYW5jZVxuICogYW5kIGV4dGVuc2lvbiBvZiB0aGUgQ0xJIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZGV2ZWxvcGVycyBidWlsZGluZyBjb21wbGV4IGNvbW1hbmQtbGluZSB0b29scyB0aGF0IHJlcXVpcmVcbiAqIHN0cnVjdHVyZWQgaW5wdXQgaGFuZGxpbmcsIGZsZXhpYmxlIG91dHB1dCBmb3JtYXR0aW5nLCBhbmQgYSByaWNoIHNldCBvZiB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFRoaXMgY29uc3RhbnQgc3RvcmVzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgQGFzZGFzZGFzZC91dGlscyBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcyxcbiAqIHdpdGggdGhlIHBsYWNlaG9sZGVyIFwiIyNWRVJTSU9OIyNcIiBiZWluZyBzdWJzdGl0dXRlZCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24uXG4gKlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6QGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFnQkE7Ozs7Ozs7Ozs7OztBQVlHO01BQ1UsU0FBUyxDQUFBO2FBQ0ksSUFBTSxDQUFBLE1BQUEsR0FB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LEVBQ1IsQ0FBeUIsc0JBQUEsRUFBQSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFFLENBQUEsQ0FDckk7QUFDRCxRQUFBLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFNLENBQUM7O2FBQ2xEO1lBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7OztBQUkzRTs7Ozs7O0FBTUc7QUFDSCxJQUFBLFlBQVksQ0FBQyxPQUEwQixFQUFBO0FBQ3JDLFFBQUEsT0FBTyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU87UUFDcEUsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUM1QixRQUFBLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFHdkM7Ozs7O0FBS0c7QUFDTyxJQUFBLE9BQU8sQ0FBQyxNQUFTLEVBQUE7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FDTixRQUFRLEVBQ1IsQ0FBRyxFQUFBLElBQUksQ0FBQyxHQUFHLENBQTJCLHdCQUFBLEVBQUEsS0FBSyxDQUFDLE1BQU0sR0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlhQTs7O0FBR0c7QUFDSCxNQUFNLE1BQU0sR0FBRztBQUNiLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0NBQ2pCO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJHO0FBQ0csU0FB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
2903
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2lucHV0L2lucHV0LnRzIiwiLi4vc3JjL2NsaS9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvdGV4dC50cyIsIi4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi9zcmMvd3JpdGVycy9TdGFuZGFyZE91dHB1dFdyaXRlci50cyIsIi4uL3NyYy91dGlscy91dGlscy50cyIsIi4uL3NyYy91dGlscy9mcy50cyIsIi4uL3NyYy9vdXRwdXQvY29tbW9uLnRzIiwiLi4vc3JjL3V0aWxzL3dlYi50cyIsIi4uL3NyYy91dGlscy9lbnZpcm9ubWVudC50cyIsIi4uL3NyYy9jbGkvY29tbWFuZC50cyIsIi4uL3NyYy91dGlscy9odHRwLnRzIiwiLi4vc3JjL3dyaXRlcnMvUmVnZXhwT3V0cHV0V3JpdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFuc3dlcnMsXG4gIENob2ljZSxcbiAgRmFsc3ksXG4gIEluaXRpYWxSZXR1cm5WYWx1ZSxcbiAgUHJldkNhbGxlcixcbiAgUHJvbXB0T2JqZWN0LFxuICBQcm9tcHRUeXBlLFxuICBWYWx1ZU9yRnVuYyxcbn0gZnJvbSBcInByb21wdHNcIjtcbmltcG9ydCBwcm9tcHRzIGZyb20gXCJwcm9tcHRzXCI7XG5pbXBvcnQgeyBwYXJzZUFyZ3MsIFBhcnNlQXJnc0NvbmZpZyB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBXcml0YWJsZSwgUmVhZGFibGUgfSBmcm9tIFwic3RyZWFtXCI7XG5pbXBvcnQgeyBLbGV1ciwgUGFyc2VBcmdzT3B0aW9uc0NvbmZpZywgUGFyc2VBcmdzUmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyBhIHVzZXIgaW5wdXQgcHJvbXB0IHdpdGggdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZmxleGlibGUgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgdXNlciBpbnB1dCBwcm9tcHRzLlxuICogSXQgaW1wbGVtZW50cyB0aGUgUHJvbXB0T2JqZWN0IGludGVyZmFjZSBmcm9tIHRoZSAncHJvbXB0cycgbGlicmFyeSBhbmQgb2ZmZXJzIG1ldGhvZHMgdG8gc2V0XG4gKiB2YXJpb3VzIHByb3BlcnRpZXMgb2YgdGhlIHByb21wdC4gVGhlIGNsYXNzIGFsc28gaW5jbHVkZXMgc3RhdGljIG1ldGhvZHMgZm9yIGNvbW1vbiBpbnB1dCBzY2VuYXJpb3NcbiAqIGFuZCBhcmd1bWVudCBwYXJzaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJJbnB1dDxSIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiBpbXBsZW1lbnRzIFByb21wdE9iamVjdDxSPiB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IExvZ2dpbmcuZm9yKFVzZXJJbnB1dCk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHR5cGUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgaW5wdXQgbWV0aG9kIChlLmcuLCB0ZXh0LCBudW1iZXIsIGNvbmZpcm0pLlxuICAgKi9cbiAgdHlwZTogUHJvbXB0VHlwZSB8IEZhbHN5IHwgUHJldkNhbGxlcjxSLCBQcm9tcHRUeXBlIHwgRmFsc3k+ID0gXCJ0ZXh0XCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBVc2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKi9cbiAgbmFtZTogVmFsdWVPckZ1bmM8Uj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBzdW1tYXJ5IFRoZSBxdWVzdGlvbiBvciBpbnN0cnVjdGlvbiBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBtZXNzYWdlPzogVmFsdWVPckZ1bmM8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFRoZSBkZWZhdWx0IHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICovXG4gIGluaXRpYWw/OlxuICAgIHwgSW5pdGlhbFJldHVyblZhbHVlXG4gICAgfCBQcmV2Q2FsbGVyPFIsIEluaXRpYWxSZXR1cm5WYWx1ZSB8IFByb21pc2U8SW5pdGlhbFJldHVyblZhbHVlPj5cbiAgICB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHByb21wdC5cbiAgICovXG4gIHN0eWxlPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZm9ybWF0IGZ1bmN0aW9uIGZvciB0aGUgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IEEgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSB1c2VyJ3MgaW5wdXQgYmVmb3JlIGl0J3MgcmV0dXJuZWQuXG4gICAqL1xuICBmb3JtYXQ/OiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBpbnB1dC5cbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKi9cbiAgdmFsaWRhdGU/OlxuICAgIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgc3RyaW5nIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPj5cbiAgICB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBvblN0YXRlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgcHJvbXB0IGNoYW5nZXMuXG4gICAqL1xuICBvblN0YXRlPzogUHJldkNhbGxlcjxSLCB2b2lkPiB8IHVuZGVmaW5lZDtcblxuICBvblJlbmRlcj86ICgoa2xldXI6IEtsZXVyKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtaW5pbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgbG93ZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqL1xuICBtaW4/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgaGlnaGVzdCBudW1iZXIgdGhlIHVzZXIgY2FuIGlucHV0LlxuICAgKi9cbiAgbWF4PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRvIGFsbG93IGZsb2F0IHZhbHVlcyBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgSWYgdHJ1ZSwgYWxsb3dzIGRlY2ltYWwgbnVtYmVycy5cbiAgICovXG4gIGZsb2F0PzogYm9vbGVhbiB8IFByZXZDYWxsZXI8UiwgYm9vbGVhbiB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdG8gZm9yIGZsb2F0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgcHJlY2lzaW9uIG9mIGZsb2F0IGlucHV0cy5cbiAgICovXG4gIHJvdW5kPzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnN0cnVjdGlvbnMgZm9yIHRoZSB1c2VyLlxuICAgKiBAc3VtbWFyeSBBZGRpdGlvbmFsIGd1aWRhbmNlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBzdGVwIHNpemUgd2hlbiBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgdGhlIG51bWJlci5cbiAgICovXG4gIGluY3JlbWVudD86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNlcGFyYXRvciBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBzZXBhcmF0ZSBsaXN0IGl0ZW1zLlxuICAgKi9cbiAgc2VwYXJhdG9yPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0eWxlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uXG4gICAqL1xuICBhY3RpdmU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmFjdGl2ZSBvcHRpb24gc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBzdHlsZSBhcHBsaWVkIHRvIG5vbi1zZWxlY3RlZCBvcHRpb25zLlxuICAgKi9cbiAgaW5hY3RpdmU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICBjaG9pY2VzPzogQ2hvaWNlW10gfCBQcmV2Q2FsbGVyPFIsIENob2ljZVtdIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGhpbnQgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBoaW50Pzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgd2FybmluZyB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBBIHdhcm5pbmcgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICB3YXJuPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgc3VnZ2VzdD86ICgoaW5wdXQ6IGFueSwgY2hvaWNlczogQ2hvaWNlW10pID0+IFByb21pc2U8YW55PikgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGltaXQgZm9yIGxpc3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqL1xuICBsaW1pdD86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1hc2sgZm9yIHBhc3N3b3JkIGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIGNoYXJhY3RlciB1c2VkIHRvIGhpZGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICovXG4gIG1hc2s/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdGRvdXQgc3RyZWFtIGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBUaGUgb3V0cHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQuXG4gICAqL1xuICBzdGRvdXQ/OiBXcml0YWJsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdGRpbiBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFRoZSBpbnB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0LlxuICAgKi9cbiAgc3RkaW4/OiBSZWFkYWJsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVXNlcklucHV0IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBVc2VySW5wdXQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWU6IFZhbHVlT3JGdW5jPFI+KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBpbnB1dCBtZXRob2QgZm9yIHRoZSBwcm9tcHQuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFR5cGUodHlwZTogUHJvbXB0VHlwZSB8IEZhbHN5IHwgUHJldkNhbGxlcjxSLCBQcm9tcHRUeXBlIHwgRmFsc3k+KTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHR5cGUgdG86ICR7dHlwZX1gKTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtZXNzYWdlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHF1ZXN0aW9uIG9yIGluc3RydWN0aW9uIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWVzc2FnZSh2YWx1ZTogVmFsdWVPckZ1bmM8c3RyaW5nPiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBtZXNzYWdlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGRlZmF1bHQgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEluaXRpYWwoXG4gICAgdmFsdWU6XG4gICAgICB8IEluaXRpYWxSZXR1cm5WYWx1ZVxuICAgICAgfCBQcmV2Q2FsbGVyPFIsIEluaXRpYWxSZXR1cm5WYWx1ZSB8IFByb21pc2U8SW5pdGlhbFJldHVyblZhbHVlPj5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBpbml0aWFsIHZhbHVlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5pdGlhbCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHByb21wdC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0eWxlIHRvIGJlIGFwcGxpZWQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdHlsZSh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3R5bGUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5zdHlsZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBmb3JtYXQgZnVuY3Rpb24gb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgdXNlcidzIGlucHV0IGJlZm9yZSBpdCdzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgZm9ybWF0IGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0Rm9ybWF0KHZhbHVlOiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGZvcm1hdCBmdW5jdGlvbmApO1xuICAgIHRoaXMuZm9ybWF0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0VmFsaWRhdGUoXG4gICAgdmFsdWU6XG4gICAgICB8IFByZXZDYWxsZXI8UiwgYm9vbGVhbiB8IHN0cmluZyB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4+XG4gICAgICB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgdmFsaWRhdGUgZnVuY3Rpb25gKTtcbiAgICB0aGlzLnZhbGlkYXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG9uU3RhdGUgY2FsbGJhY2sgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgcHJvbXB0IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvblN0YXRlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0T25TdGF0ZSh2YWx1ZTogUHJldkNhbGxlcjxSLCB2b2lkPiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBvblN0YXRlIGNhbGxiYWNrYCk7XG4gICAgdGhpcy5vblN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG9uUmVuZGVyIGNhbGxiYWNrIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcHJvbXB0IGlzIHJlbmRlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgb25SZW5kZXIgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRPblJlbmRlcih2YWx1ZTogKChrbGV1cjogS2xldXIpID0+IHZvaWQpIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG9uUmVuZGVyIGNhbGxiYWNrYCk7XG4gICAgdGhpcy5vblJlbmRlciA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBsb3dlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1pbmltdW0gdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNaW4odmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1pbiB2YWx1ZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLm1pbiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBoaWdoZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBtYXhpbXVtIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWF4KHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBtYXggdmFsdWUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tYXggPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB3aGV0aGVyIHRvIGFsbG93IGZsb2F0IHZhbHVlcyBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB3aGV0aGVyIGRlY2ltYWwgbnVtYmVycyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gV2hldGhlciB0byBhbGxvdyBmbG9hdCB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRGbG9hdCh2YWx1ZTogYm9vbGVhbiB8IFByZXZDYWxsZXI8UiwgYm9vbGVhbiB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBmbG9hdCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmZsb2F0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0byBmb3IgZmxvYXQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBwcmVjaXNpb24gb2YgZmxvYXQgaW5wdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0Um91bmQodmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHJvdW5kIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMucm91bmQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgdXNlci5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhZGRpdGlvbmFsIGd1aWRhbmNlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5zdHJ1Y3Rpb25zLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5zdHJ1Y3Rpb25zKHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluc3RydWN0aW9ucyB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmluc3RydWN0aW9ucyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHN0ZXAgc2l6ZSB3aGVuIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgbnVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5jcmVtZW50IHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5jcmVtZW50KFxuICAgIHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaW5jcmVtZW50IHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5jcmVtZW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHNlcGFyYXRvciBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIGxpc3QgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0U2VwYXJhdG9yKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc2VwYXJhdG9yIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuc2VwYXJhdG9yID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGFjdGl2ZSBvcHRpb24gc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHN0eWxlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhY3RpdmUgb3B0aW9uIHN0eWxlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0QWN0aXZlKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBhY3RpdmUgc3R5bGUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5hY3RpdmUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaW5hY3RpdmUgb3B0aW9uIHN0eWxlIGZvciBzZWxlY3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBzdHlsZSBhcHBsaWVkIHRvIG5vbi1zZWxlY3RlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5hY3RpdmUgb3B0aW9uIHN0eWxlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5hY3RpdmUodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluYWN0aXZlIHN0eWxlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5hY3RpdmUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENob2ljZXMoXG4gICAgdmFsdWU6IENob2ljZVtdIHwgUHJldkNhbGxlcjxSLCBDaG9pY2VbXSB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgY2hvaWNlczogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgdGhpcy5jaG9pY2VzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGhpbnQgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGhpbnQgdGV4dC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEhpbnQodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGhpbnQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5oaW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHdhcm5pbmcgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIHdhcm5pbmcgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB3YXJuaW5nIHRleHQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRXYXJuKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyB3YXJuIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMud2FybiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0U3VnZ2VzdChcbiAgICB2YWx1ZTogKChpbnB1dDogYW55LCBjaG9pY2VzOiBDaG9pY2VbXSkgPT4gUHJvbWlzZTxhbnk+KSB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3VnZ2VzdCBmdW5jdGlvbmApO1xuICAgIHRoaXMuc3VnZ2VzdCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBsaW1pdCBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGluIGxpc3QtdHlwZSBwcm9tcHRzLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkLCBvciBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGlzIHZhbHVlLlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRMaW1pdCh2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbGltaXQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5saW1pdCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXNrIGZvciBwYXNzd29yZCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIGhpZGUgdGhlIHVzZXIncyBpbnB1dCBpbiBwYXNzd29yZC10eXBlIHByb21wdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQsIG9yIGEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoaXMgdmFsdWUuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE1hc2sodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1hc2sgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tYXNrID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHN0ZG91dCBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIG91dHB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0IGZvciBkaXNwbGF5aW5nIG1lc3NhZ2VzIGFuZCByZXN1bHRzLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgV3JpdGFibGUgc3RyZWFtIHRvIGJlIHVzZWQgYXMgc3Rkb3V0LlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdGRvdXQodmFsdWU6IFdyaXRhYmxlIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHN0ZG91dCBzdHJlYW1gKTtcbiAgICB0aGlzLnN0ZG91dCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc3RkaW4gc3RyZWFtIGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBpbnB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0IGZvciByZWNlaXZpbmcgdXNlciBpbnB1dC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIFJlYWRhYmxlIHN0cmVhbSB0byBiZSB1c2VkIGFzIHN0ZGluLlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdGRpbih2YWx1ZTogUmVhZGFibGUgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICB0aGlzLnN0ZGluID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGlucHV0IGJhc2VkIG9uIHRoZSBjdXJyZW50IFVzZXJJbnB1dCBjb25maWd1cmF0aW9uLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIGFuZCByZXR1cm5zIHRoZWlyIHJlc3BvbnNlIGFzIGEgc2luZ2xlIHZhbHVlLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXNlcidzIGFuc3dlci5cbiAgICovXG4gIGFzeW5jIGFzaygpIHtcbiAgICByZXR1cm4gKGF3YWl0IFVzZXJJbnB1dC5hc2sodGhpcykpW3RoaXMubmFtZSBhcyBrZXlvZiBBbnN3ZXJzPFI+XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBvbmUgb3IgbW9yZSBxdWVzdGlvbnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIFVzZXJJbnB1dCBjb25maWd1cmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB3aXRoIG9uZSBvciBtb3JlIHF1ZXN0aW9ucyBhbmQgcmV0dXJucyB0aGVpciBhbnN3ZXJzIGFzIGFuIG9iamVjdC5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIEEgc2luZ2xlIFVzZXJJbnB1dCBpbnN0YW5jZSBvciBhbiBhcnJheSBvZiBVc2VySW5wdXQgaW5zdGFuY2VzLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB1c2VyJ3MgYW5zd2Vycy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBhc2sgbWV0aG9kXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBwcm9tcHRzIGxpYnJhcnlcbiAgICogICBBLT4+UDogQ2FsbCBwcm9tcHRzIHdpdGggcXVlc3Rpb24ocylcbiAgICogICBQLT4+VTogRGlzcGxheSBwcm9tcHQocylcbiAgICogICBVLT4+UDogUHJvdmlkZSBpbnB1dFxuICAgKiAgIFAtPj5BOiBSZXR1cm4gYW5zd2Vyc1xuICAgKiAgIEEtPj5BOiBQcm9jZXNzIGFuc3dlcnNcbiAgICogICBBLS0+PkNhbGxlcjogUmV0dXJuIHByb2Nlc3NlZCBhbnN3ZXJzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrPFIgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIHF1ZXN0aW9uOiBVc2VySW5wdXQ8Uj4gfCBVc2VySW5wdXQ8Uj5bXVxuICApIHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFzayk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHF1ZXN0aW9uKSkge1xuICAgICAgcXVlc3Rpb24gPSBbcXVlc3Rpb25dO1xuICAgIH1cbiAgICBsZXQgYW5zd2VyczogQW5zd2VyczxSPjtcbiAgICB0cnkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBBc2tpbmcgcXVlc3Rpb25zOiAke3F1ZXN0aW9uLm1hcCgocSkgPT4gcS5uYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIGFuc3dlcnMgPSBhd2FpdCBwcm9tcHRzKHF1ZXN0aW9uKTtcbiAgICAgIGxvZy52ZXJib3NlKGBSZWNlaXZlZCBhbnN3ZXJzOiAke0pTT04uc3RyaW5naWZ5KGFuc3dlcnMsIG51bGwsIDIpfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGdldHRpbmcgaW5wdXQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICAgIHJldHVybiBhbnN3ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIG51bWJlciBpbnB1dC5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIG51bWJlciwgd2l0aCBvcHRpb25hbCBtaW5pbXVtLCBtYXhpbXVtLCBhbmQgaW5pdGlhbCB2YWx1ZXMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gbWluIC0gVGhlIG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gbWF4IC0gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBudW1iZXIgZW50ZXJlZCBieSB0aGUgdXNlci5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2tOdW1iZXIoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgbWluPzogbnVtYmVyLFxuICAgIG1heD86IG51bWJlcixcbiAgICBpbml0aWFsPzogbnVtYmVyXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5hc2tOdW1iZXIpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyBudW1iZXIgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBtaW46ICR7bWlufSwgbWF4OiAke21heH0sIGluaXRpYWw6ICR7aW5pdGlhbH1gXG4gICAgKTtcbiAgICBjb25zdCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KG5hbWUpXG4gICAgICAuc2V0TWVzc2FnZShxdWVzdGlvbilcbiAgICAgIC5zZXRUeXBlKFwibnVtYmVyXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNaW4obWluKTtcblxuICAgIGlmICh0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWF4KG1heCk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmFzayh1c2VySW5wdXQpKVtuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBmb3IgYSB0ZXh0IGlucHV0LlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIHRleHQsIHdpdGggb3B0aW9uYWwgbWFza2luZyBhbmQgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBtYXNrIC0gVGhlIGNoYXJhY3RlciB1c2VkIHRvIG1hc2sgdGhlIGlucHV0IChvcHRpb25hbCwgZm9yIHBhc3N3b3JkLWxpa2UgaW5wdXRzKS5cbiAgICogQHBhcmFtIGluaXRpYWwgLSBUaGUgaW5pdGlhbCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdGV4dCBlbnRlcmVkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza1RleHQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgbWFzazogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGluaXRpYWw/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFza1RleHQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyB0ZXh0IGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgbWFzazogJHttYXNrfSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSkuc2V0TWVzc2FnZShxdWVzdGlvbik7XG5cbiAgICBpZiAobWFzaykgdXNlcklucHV0LnNldE1hc2sobWFzayk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcInN0cmluZ1wiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIGNvbmZpcm1hdGlvbiAoeWVzL25vKS5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB3aXRoIGEgeWVzL25vIHF1ZXN0aW9uIGFuZCByZXR1cm5zIGEgYm9vbGVhbiByZXN1bHQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHVzZXIncyBhbnN3ZXIuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrQ29uZmlybWF0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbjogc3RyaW5nLFxuICAgIGluaXRpYWw/OiBib29sZWFuXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrQ29uZmlybWF0aW9uKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBBc2tpbmcgY29uZmlybWF0aW9uIGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSlcbiAgICAgIC5zZXRNZXNzYWdlKHF1ZXN0aW9uKVxuICAgICAgLnNldFR5cGUoXCJjb25maXJtXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsICE9PSBcInVuZGVmaW5lZFwiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwZWF0ZWRseSBhc2tzIGZvciBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBleHBlY3RlZCByZXN1bHQuXG4gICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBVc2VySW5wdXQgaW5zdGFuY2UgdG8gdXNlIGZvciBwcm9tcHRpbmcuXG4gICAqIEBwYXJhbSB0ZXN0IC0gQSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgYWxsb3dlZCAoZGVmYXVsdCBpcyAxKS5cbiAgICogQHBhcmFtIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWQgaW5wdXQgb3IgdW5kZWZpbmVkIGlmIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBJIGFzIGluc2lzdCBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIGFzayBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIHRlc3QgZnVuY3Rpb25cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIGFza0NvbmZpcm1hdGlvbiBtZXRob2RcbiAgICogICBsb29wIFVudGlsIHZhbGlkIGlucHV0IG9yIGxpbWl0IHJlYWNoZWRcbiAgICogICAgIEktPj5BOiBDYWxsIGFzayB3aXRoIGlucHV0XG4gICAqICAgICBBLT4+VTogUHJvbXB0IHVzZXJcbiAgICogICAgIFUtPj5BOiBQcm92aWRlIGlucHV0XG4gICAqICAgICBBLT4+STogUmV0dXJuIHJlc3VsdFxuICAgKiAgICAgSS0+PlQ6IFRlc3QgcmVzdWx0XG4gICAqICAgICBhbHQgVGVzdCBwYXNzZXNcbiAgICogICAgICAgSS0+PkM6IEFzayBmb3IgY29uZmlybWF0aW9uXG4gICAqICAgICAgIEMtPj5VOiBDb25maXJtIGlucHV0XG4gICAqICAgICAgIFUtPj5DOiBQcm92aWRlIGNvbmZpcm1hdGlvblxuICAgKiAgICAgICBDLT4+STogUmV0dXJuIGNvbmZpcm1hdGlvblxuICAgKiAgICAgICBhbHQgQ29uZmlybWVkXG4gICAqICAgICAgICAgSS0tPj5DYWxsZXI6IFJldHVybiB2YWxpZCByZXN1bHRcbiAgICogICAgICAgZWxzZSBOb3QgY29uZmlybWVkXG4gICAqICAgICAgICAgSS0+Pkk6IENvbnRpbnVlIGxvb3BcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIFRlc3QgZmFpbHNcbiAgICogICAgICAgSS0+Pkk6IENvbnRpbnVlIGxvb3BcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIEktLT4+Q2FsbGVyOiBSZXR1cm4gdW5kZWZpbmVkIGlmIGxpbWl0IHJlYWNoZWRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbnNpc3Q8Uj4oXG4gICAgaW5wdXQ6IFVzZXJJbnB1dCxcbiAgICB0ZXN0OiAocmVzOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgZGVmYXVsdENvbmZpcm1hdGlvbjogYm9vbGVhbixcbiAgICBsaW1pdCA9IDFcbiAgKTogUHJvbWlzZTxSIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5pbnNpc3QpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEluc2lzdGluZyBvbiBpbnB1dDogJHtpbnB1dC5uYW1lfSwgdGVzdDogJHt0ZXN0LnRvU3RyaW5nKCl9LCBkZWZhdWx0Q29uZmlybWF0aW9uOiAke2RlZmF1bHRDb25maXJtYXRpb259LCBsaW1pdDogJHtsaW1pdH1gXG4gICAgKTtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgY29uZmlybWF0aW9uOiBib29sZWFuO1xuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IChhd2FpdCBVc2VySW5wdXQuYXNrKGlucHV0KSlbXG4gICAgICAgICAgaW5wdXQubmFtZSBhcyBrZXlvZiBBbnN3ZXJzPHN0cmluZz5cbiAgICAgICAgXSBhcyBzdHJpbmc7XG4gICAgICAgIGlmICghdGVzdChyZXN1bHQpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpcm1hdGlvbiA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgICAgYCR7aW5wdXQubmFtZX0tY29uZmlybWAsXG4gICAgICAgICAgYElzIHRoZSAke2lucHV0LnR5cGV9IGNvcnJlY3Q/YCxcbiAgICAgICAgICBkZWZhdWx0Q29uZmlybWF0aW9uXG4gICAgICAgICk7XG4gICAgICAgIGlmICghY29uZmlybWF0aW9uKSByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB9IHdoaWxlICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiICYmIGxpbWl0ID4gMSAmJiBjb3VudCsrIDwgbGltaXQpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRXJyb3Igd2hpbGUgaW5zaXN0aW5nOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSBsb2cuaW5mbyhcIm5vIHNlbGVjdGlvbi4uLlwiKTtcbiAgICByZXR1cm4gcmVzdWx0IGFzIFIgfCB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBlYXRlZGx5IGFza3MgZm9yIHRleHQgaW5wdXQgdW50aWwgYSB2YWxpZCByZXNwb25zZSBpcyBnaXZlbiBvciB0aGUgbGltaXQgaXMgcmVhY2hlZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaW5zaXN0cyBvbiBnZXR0aW5nIGEgdmFsaWQgdGV4dCBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQsIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIHRlc3QgLSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqIEBwYXJhbSBtYXNrIC0gVGhlIGNoYXJhY3RlciB1c2VkIHRvIG1hc2sgdGhlIGlucHV0IChvcHRpb25hbCwgZm9yIHBhc3N3b3JkLWxpa2UgaW5wdXRzKS5cbiAgICogQHBhcmFtIGluaXRpYWwgLSBUaGUgaW5pdGlhbCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgKG9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICogQHBhcmFtIGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIGFsbG93ZWQgKGRlZmF1bHQgaXMgLTEsIG1lYW5pbmcgdW5saW1pdGVkKS5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWQgaW5wdXQgb3IgdW5kZWZpbmVkIGlmIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluc2lzdEZvclRleHQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgdGVzdDogKHJlczogc3RyaW5nKSA9PiBib29sZWFuLFxuICAgIG1hc2s6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBpbml0aWFsPzogc3RyaW5nLFxuICAgIGRlZmF1bHRDb25maXJtYXRpb24gPSBmYWxzZSxcbiAgICBsaW1pdCA9IC0xXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5pbnNpc3RGb3JUZXh0KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBJbnNpc3RpbmcgZm9yIHRleHQgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIG1hc2s6ICR7bWFza30sIGluaXRpYWw6ICR7aW5pdGlhbH0sIGRlZmF1bHRDb25maXJtYXRpb246ICR7ZGVmYXVsdENvbmZpcm1hdGlvbn0sIGxpbWl0OiAke2xpbWl0fWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSkuc2V0TWVzc2FnZShxdWVzdGlvbik7XG5cbiAgICBpZiAobWFzaykgdXNlcklucHV0LnNldE1hc2sobWFzayk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcInN0cmluZ1wiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuaW5zaXN0KFxuICAgICAgdXNlcklucHV0LFxuICAgICAgdGVzdCBhcyAocmVzOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgICBkZWZhdWx0Q29uZmlybWF0aW9uLFxuICAgICAgbGltaXRcbiAgICApKSBhcyBzdHJpbmc7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBlYXRlZGx5IGFza3MgZm9yIG51bWJlciBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCBudW1iZXIgaW5wdXQgZnJvbSB0aGUgdXNlciwgYWxsb3dpbmcgZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBhdHRlbXB0cy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSB0ZXN0IC0gQSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKiBAcGFyYW0gbWluIC0gVGhlIG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gbWF4IC0gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZGVmYXVsdENvbmZpcm1hdGlvblxuICAgKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgYWxsb3dlZCAoZGVmYXVsdCBpcyAtMSwgbWVhbmluZyB1bmxpbWl0ZWQpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5zaXN0Rm9yTnVtYmVyKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbjogc3RyaW5nLFxuICAgIHRlc3Q6IChyZXM6IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICBtaW4/OiBudW1iZXIsXG4gICAgbWF4PzogbnVtYmVyLFxuICAgIGluaXRpYWw/OiBudW1iZXIsXG4gICAgZGVmYXVsdENvbmZpcm1hdGlvbiA9IGZhbHNlLFxuICAgIGxpbWl0ID0gLTFcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdEZvck51bWJlcik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgSW5zaXN0aW5nIGZvciBudW1iZXIgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIG1pbjogJHttaW59LCBtYXg6ICR7bWF4fSwgaW5pdGlhbDogJHtpbml0aWFsfSwgZGVmYXVsdENvbmZpcm1hdGlvbjogJHtkZWZhdWx0Q29uZmlybWF0aW9ufSwgbGltaXQ6ICR7bGltaXR9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKVxuICAgICAgLnNldE1lc3NhZ2UocXVlc3Rpb24pXG4gICAgICAuc2V0VHlwZShcIm51bWJlclwiKTtcblxuICAgIGlmICh0eXBlb2YgbWluID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWluKG1pbik7XG5cbiAgICBpZiAodHlwZW9mIG1heCA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldE1heChtYXgpO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuaW5zaXN0KFxuICAgICAgdXNlcklucHV0LFxuICAgICAgdGVzdCBhcyAocmVzOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgICBkZWZhdWx0Q29uZmlybWF0aW9uLFxuICAgICAgbGltaXRcbiAgICApKSBhcyBudW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICAgKiBAc3VtbWFyeSBVc2VzIE5vZGUuanMncyB1dGlsLnBhcnNlQXJncyB0byBwYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCByZXR1cm4gdGhlIHJlc3VsdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHBhcnNpbmcgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXJzZWQgYXJndW1lbnRzLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgcGFyc2VBcmdzIG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgdXRpbC5wYXJzZUFyZ3NcbiAgICogICBDLT4+UDogQ2FsbCB3aXRoIG9wdGlvbnNcbiAgICogICBQLT4+UDogUHJlcGFyZSBhcmdzIG9iamVjdFxuICAgKiAgIFAtPj5VOiBDYWxsIHBhcnNlQXJncyB3aXRoIHByZXBhcmVkIGFyZ3NcbiAgICogICBVLT4+UDogUmV0dXJuIHBhcnNlZCByZXN1bHRcbiAgICogICBQLS0+PkM6IFJldHVybiBQYXJzZUFyZ3NSZXN1bHRcbiAgICovXG4gIHN0YXRpYyBwYXJzZUFyZ3Mob3B0aW9uczogUGFyc2VBcmdzT3B0aW9uc0NvbmZpZyk6IFBhcnNlQXJnc1Jlc3VsdCB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5wYXJzZUFyZ3MpO1xuICAgIGNvbnN0IGFyZ3M6IFBhcnNlQXJnc0NvbmZpZyA9IHtcbiAgICAgIGFyZ3M6IHByb2Nlc3MuYXJndi5zbGljZSgyKSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfTtcbiAgICBsb2cuZGVidWcoYFBhcnNpbmcgYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MsIG51bGwsIDIpfWApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcGFyc2VBcmdzKGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBFcnJvciB3aGlsZSBwYXJzaW5nIGFyZ3VtZW50czpcXG4ke0pTT04uc3RyaW5naWZ5KGFyZ3MsIG51bGwsIDIpfVxcbiB8IG9wdGlvbnNcXG4ke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMsIG51bGwsIDIpfVxcbiB8ICR7ZXJyb3J9YFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgcGFyc2luZyBhcmd1bWVudHM6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbW1hbmQgb3B0aW9ucyBmb3IgQ0xJIGNvbW1hbmRzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc3RydWN0dXJlIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgY29tbW9uIGNvbW1hbmQtbGluZSBvcHRpb25zIHVzZWQgYWNyb3NzIHZhcmlvdXMgQ0xJIGNvbW1hbmRzLlxuICogQGNvbnN0IERlZmF1bHRDb21tYW5kT3B0aW9uc1xuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdENvbW1hbmRPcHRpb25zXG4gKiBAcHJvcGVydHkge09iamVjdH0gdmVyYm9zZSAtIFZlcmJvc2l0eSBsZXZlbCBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyYm9zZS50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHZlcmJvc2Ugb3B0aW9uIChudW1iZXIpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcmJvc2Uuc2hvcnQgLSBUaGUgc2hvcnQgZmxhZyBmb3IgdGhlIHZlcmJvc2Ugb3B0aW9uIChWKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdmVyYm9zaXR5ICgwKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB2ZXJzaW9uIC0gVmVyc2lvbiBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdmVyc2lvbiBvcHRpb24gKGJvb2xlYW4pLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24uc2hvcnQgLSBUaGUgc2hvcnQgZmxhZyBmb3IgdGhlIHZlcnNpb24gb3B0aW9uICh2KS5cbiAqIEBwcm9wZXJ0eSB7dW5kZWZpbmVkfSB2ZXJzaW9uLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdmVyc2lvbiBkaXNwbGF5ICh1bmRlZmluZWQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGhlbHAgLSBIZWxwIGRpc3BsYXkgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhlbHAudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBoZWxwIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGVscC5zaG9ydCAtIFRoZSBzaG9ydCBmbGFnIGZvciB0aGUgaGVscCBvcHRpb24gKGgpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBoZWxwLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgaGVscCBkaXNwbGF5IChmYWxzZSkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwgLSBMb2cgbGV2ZWwgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvZ0xldmVsLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgbG9nTGV2ZWwgb3B0aW9uIChzdHJpbmcpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvZ0xldmVsLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbG9nIGxldmVsIChcImluZm9cIikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nU3R5bGUgLSBMb2cgc3R5bGluZyBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9nU3R5bGUudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBsb2dTdHlsZSBvcHRpb24gKGJvb2xlYW4pLlxuICogQHByb3BlcnR5IHtib29sZWFufSBsb2dTdHlsZS5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGxvZyBzdHlsaW5nICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0aW1lc3RhbXAgLSBUaW1lc3RhbXAgZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGltZXN0YW1wLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdGltZXN0YW1wIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRpbWVzdGFtcC5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRpbWVzdGFtcCBkaXNwbGF5ICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBiYW5uZXIgLSBCYW5uZXIgZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYmFubmVyLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgYmFubmVyIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJhbm5lci5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGJhbm5lciBkaXNwbGF5IChmYWxzZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q29tbWFuZE9wdGlvbnMgPSB7XG4gIHZlcmJvc2U6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJWXCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICB2ZXJzaW9uOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwidlwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbiAgaGVscDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcImhcIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgbG9nTGV2ZWw6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIGRlZmF1bHQ6IFwiaW5mb1wiLFxuICB9LFxuICBsb2dTdHlsZToge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHRpbWVzdGFtcDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIGJhbm5lcjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbW1hbmQgdmFsdWVzIGRlcml2ZWQgZnJvbSBEZWZhdWx0Q29tbWFuZE9wdGlvbnMuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiBhbGwgb3B0aW9ucyBkZWZpbmVkIGluIERlZmF1bHRDb21tYW5kT3B0aW9ucy5cbiAqIEBjb25zdCBEZWZhdWx0Q29tbWFuZFZhbHVlc1xuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdENvbW1hbmRWYWx1ZXNcbiAqIEBwcm9wZXJ0eSB7dW5rbm93bn0gW2tleTogc3RyaW5nXSAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIG9wdGlvbiBpbiBEZWZhdWx0Q29tbWFuZE9wdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q29tbWFuZFZhbHVlczoge1xuICBbayBpbiBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zXTogdW5rbm93bjtcbn0gPSBPYmplY3Qua2V5cyhEZWZhdWx0Q29tbWFuZE9wdGlvbnMpLnJlZHVjZShcbiAgKGFjYzogUmVjb3JkPGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIHVua25vd24+LCBrZXk6IHN0cmluZykgPT4ge1xuICAgIGFjY1trZXkgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRDb21tYW5kT3B0aW9uc10gPVxuICAgICAgRGVmYXVsdENvbW1hbmRPcHRpb25zW2tleSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zXS5kZWZhdWx0O1xuICAgIHJldHVybiBhY2M7XG4gIH0sXG4gIHt9IGFzIFJlY29yZDxrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRWYWx1ZXMsIHVua25vd24+XG4pO1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFkcyB0aGUgZW5kIG9mIGEgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgY2hhcmFjdGVyLlxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgaW5wdXQgc3RyaW5nIHRvIGEgc3BlY2lmaWVkIGxlbmd0aCBieSBhZGRpbmcgYSBwYWRkaW5nIGNoYXJhY3RlciB0byB0aGUgZW5kLlxuICogSWYgdGhlIGlucHV0IHN0cmluZyBpcyBhbHJlYWR5IGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgcGFkZGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSBkZXNpcmVkIHRvdGFsIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcj1cIiBcIl0gLSBUaGUgY2hhcmFjdGVyIHRvIHVzZSBmb3IgcGFkZGluZy4gRGVmYXVsdHMgdG8gYSBzcGFjZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhZGRlZCBzdHJpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHBhZGRpbmcgY2hhcmFjdGVyIGlzIG5vdCBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgbG9uZy5cbiAqXG4gKiBAZnVuY3Rpb24gcGFkRW5kXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZEVuZChcbiAgc3RyOiBzdHJpbmcsXG4gIGxlbmd0aDogbnVtYmVyLFxuICBjaGFyOiBzdHJpbmcgPSBcIiBcIlxuKTogc3RyaW5nIHtcbiAgaWYgKGNoYXIubGVuZ3RoICE9PSAxKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyIGxlbmd0aCBmb3IgcGFkZGluZy4gbXVzdCBiZSBvbmUhXCIpO1xuICByZXR1cm4gc3RyLnBhZEVuZChsZW5ndGgsIGNoYXIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlcyBwbGFjZWhvbGRlcnMgaW4gYSBzdHJpbmcgd2l0aCBwcm92aWRlZCB2YWx1ZXMuXG4gKiBAc3VtbWFyeSBJbnRlcnBvbGF0ZXMgYSBzdHJpbmcgYnkgcmVwbGFjaW5nIHBsYWNlaG9sZGVycyBvZiB0aGUgZm9ybSAke3ZhcmlhYmxlTmFtZX1cbiAqIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZXMgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LiBJZiBhIHBsYWNlaG9sZGVyIGRvZXNuJ3QgaGF2ZVxuICogYSBjb3JyZXNwb25kaW5nIHZhbHVlLCBpdCBpcyBsZWZ0IHVuY2hhbmdlZCBpbiB0aGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIFRoZSBpbnB1dCBzdHJpbmcgY29udGFpbmluZyBwbGFjZWhvbGRlcnMgdG8gYmUgcmVwbGFjZWQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz59IHZhbHVlcyAtIEFuIG9iamVjdCBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgcmVwbGFjZW1lbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzIHJlcGxhY2VkIGJ5IHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaFBsYWNlaG9sZGVyc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHBhdGNoU3RyaW5nXG4gKiAgIHBhcnRpY2lwYW50IFN0cmluZy5yZXBsYWNlXG4gKiAgIENhbGxlci0+PnBhdGNoU3RyaW5nOiBDYWxsIHdpdGggaW5wdXQgYW5kIHZhbHVlc1xuICogICBwYXRjaFN0cmluZy0+PlN0cmluZy5yZXBsYWNlOiBDYWxsIHdpdGggcmVnZXggYW5kIHJlcGxhY2VtZW50IGZ1bmN0aW9uXG4gKiAgIFN0cmluZy5yZXBsYWNlLT4+cGF0Y2hTdHJpbmc6IFJldHVybiByZXBsYWNlZCBzdHJpbmdcbiAqICAgcGF0Y2hTdHJpbmctLT4+Q2FsbGVyOiBSZXR1cm4gcGF0Y2hlZCBzdHJpbmdcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hQbGFjZWhvbGRlcnMoXG4gIGlucHV0OiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPlxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlucHV0LnJlcGxhY2UoXG4gICAgL1xcJFxceyhbYS16QS1aMC05X10rKVxcfS9nLFxuICAgIChtYXRjaCwgdmFyaWFibGUpID0+ICh2YWx1ZXNbdmFyaWFibGUgYXMgc3RyaW5nXSBhcyBzdHJpbmcpIHx8IG1hdGNoXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFN0cmluZyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+LFxuICBmbGFnczogc3RyaW5nID0gXCJnXCJcbik6IHN0cmluZyB7XG4gIE9iamVjdC5lbnRyaWVzKHZhbHVlcykuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXhwKGtleSksIGZsYWdzKTtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UocmVnZXhwLCB2YWwgYXMgc3RyaW5nKTtcbiAgfSk7XG4gIHJldHVybiBpbnB1dDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gY2FtZWxDYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gY2FtZWxDYXNlIGZvcm1hdCwgd2hlcmUgd29yZHMgYXJlIGpvaW5lZCB3aXRob3V0IHNwYWNlc1xuICogYW5kIGVhY2ggd29yZCBhZnRlciB0aGUgZmlyc3Qgc3RhcnRzIHdpdGggYSBjYXBpdGFsIGxldHRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBjYW1lbENhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvQ2FtZWxDYXNlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2FtZWxDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAod29yZCwgaW5kZXgpID0+XG4gICAgICBpbmRleCA9PT0gMCA/IHdvcmQudG9Mb3dlckNhc2UoKSA6IHdvcmQudG9VcHBlckNhc2UoKVxuICAgIClcbiAgICAucmVwbGFjZSgvXFxzKy9nLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gRU5WSVJPTk1FTlRfVkFSSUFCTEUgZm9ybWF0LlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gdXBwZXJjYXNlIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzLFxuICogdHlwaWNhbGx5IHVzZWQgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIEVOVklST05NRU5UX1ZBUklBQkxFIGZvcm1hdC5cbiAqXG4gKiBAZnVuY3Rpb24gdG9FTlZGb3JtYXRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9FTlZGb3JtYXQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvU25ha2VDYXNlKHRleHQpLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIHNuYWtlX2Nhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBsb3dlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gc25ha2VfY2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9TbmFrZUNhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TbmFrZUNhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMV8kMlwiKVxuICAgIC5yZXBsYWNlKC9bXFxzLV0rL2csIFwiX1wiKVxuICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBrZWJhYi1jYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gbG93ZXJjYXNlIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IGh5cGhlbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8ga2ViYWItY2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9LZWJhYkNhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9LZWJhYkNhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMS0kMlwiKVxuICAgIC5yZXBsYWNlKC9bXFxzX10rL2csIFwiLVwiKVxuICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBQYXNjYWxDYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gUGFzY2FsQ2FzZSBmb3JtYXQsIHdoZXJlIHdvcmRzIGFyZSBqb2luZWQgd2l0aG91dCBzcGFjZXNcbiAqIGFuZCBlYWNoIHdvcmQgc3RhcnRzIHdpdGggYSBjYXBpdGFsIGxldHRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBQYXNjYWxDYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b1Bhc2NhbENhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXNjYWxDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAod29yZCkgPT4gd29yZC50b1VwcGVyQ2FzZSgpKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZzogc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpOyAvLyAkJiBtZWFucyB0aGUgd2hvbGUgbWF0Y2hlZCBzdHJpbmdcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZW5jb2RpbmcgZm9yIHRleHQgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBzdGFuZGFyZCBVVEYtOCBlbmNvZGluZyB1c2VkIGZvciB0ZXh0IHByb2Nlc3NpbmcuXG4gKiBAY29uc3Qge3N0cmluZ30gRW5jb2RpbmdcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IEVuY29kaW5nID0gXCJ1dGYtOFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNlbWFudGljIHZlcnNpb25pbmcuXG4gKiBAc3VtbWFyeSBBIHJlZ2V4IHBhdHRlcm4gdG8gbWF0Y2ggYW5kIHBhcnNlIHNlbWFudGljIHZlcnNpb24gc3RyaW5ncy5cbiAqIEBjb25zdCB7UmVnRXhwfSBTZW1WZXJzaW9uUmVnZXhcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbVZlcnNpb25SZWdleCA9XG4gIC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspKD86LShbMC05QS1aYS16LV0rKD86XFwuWzAtOUEtWmEtel0pKSkvZztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bSBmb3Igc2VtYW50aWMgdmVyc2lvbiBjb21wb25lbnRzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdGhyZWUgbGV2ZWxzIG9mIHNlbWFudGljIHZlcnNpb25pbmc6IFBBVENILCBNSU5PUiwgYW5kIE1BSk9SLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGVudW0gU2VtVmVyc2lvbiB7XG4gIC8qKiBQYXRjaCB2ZXJzaW9uIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBidWcgZml4ZXMuICovXG4gIFBBVENIID0gXCJwYXRjaFwiLFxuICAvKiogTWlub3IgdmVyc2lvbiBmb3IgYmFja3dhcmRzLWNvbXBhdGlibGUgbmV3IGZlYXR1cmVzLiAqL1xuICBNSU5PUiA9IFwibWlub3JcIixcbiAgLyoqIE1ham9yIHZlcnNpb24gZm9yIGNoYW5nZXMgdGhhdCBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi9cbiAgTUFKT1IgPSBcIm1ham9yXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZsYWcgdG8gaW5kaWNhdGUgbm9uLUNJIGVudmlyb25tZW50LlxuICogQHN1bW1hcnkgVXNlZCB0byBzcGVjaWZ5IHRoYXQgYSBjb21tYW5kIHNob3VsZCBydW4gb3V0c2lkZSBvZiBhIENvbnRpbnVvdXMgSW50ZWdyYXRpb24gZW52aXJvbm1lbnQuXG4gKiBAY29uc3Qge3N0cmluZ30gTm9DSUZMYWdcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IE5vQ0lGTGFnID0gXCItbm8tY2lcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5IGZvciB0aGUgc2V0dXAgc2NyaXB0IGluIHBhY2thZ2UuanNvbi5cbiAqIEBzdW1tYXJ5IElkZW50aWZpZXMgdGhlIHNjcmlwdCB0aGF0IHJ1bnMgYWZ0ZXIgcGFja2FnZSBpbnN0YWxsYXRpb24uXG4gKiBAY29uc3Qge3N0cmluZ30gU2V0dXBTY3JpcHRLZXlcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNldHVwU2NyaXB0S2V5ID0gXCJwb3N0aW5zdGFsbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIHRva2Vucy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGZpbGUgbmFtZXMgZm9yIHN0b3JpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGF1dGhlbnRpY2F0aW9uIHRva2Vucy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBlbnVtIFRva2VucyB7XG4gIC8qKiBHaXQgYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBHSVQgPSBcIi50b2tlblwiLFxuICAvKiogTlBNIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgTlBNID0gXCIubnBtdG9rZW5cIixcbiAgLyoqIERvY2tlciBhdXRoZW50aWNhdGlvbiB0b2tlbiBmaWxlIG5hbWUuICovXG4gIERPQ0tFUiA9IFwiLmRvY2tlcnRva2VuXCIsXG4gIC8qKiBDb25mbHVlbmNlIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgQ09ORkxVRU5DRSA9IFwiLmNvbmZsdWVuY2UtdG9rZW5cIixcbn1cblxuZXhwb3J0IGNvbnN0IEFib3J0Q29kZSA9IFwiQWJvcnRlZFwiO1xuIiwiaW1wb3J0IHsgRW5jb2RpbmcgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPdXRwdXRXcml0ZXIgfSBmcm9tIFwiLi9PdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IFByb21pc2VFeGVjdXRvciB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiO1xuaW1wb3J0IHsgT3V0cHV0VHlwZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBzdHlsZSB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHN0YW5kYXJkIG91dHB1dCB3cml0ZXIgZm9yIGhhbmRsaW5nIGNvbW1hbmQgZXhlY3V0aW9uIG91dHB1dC5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgT3V0cHV0V3JpdGVyIGludGVyZmFjZSBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3JcbiAqIGhhbmRsaW5nIHZhcmlvdXMgdHlwZXMgb2Ygb3V0cHV0IGZyb20gY29tbWFuZCBleGVjdXRpb24sIGluY2x1ZGluZyBzdGFuZGFyZCBvdXRwdXQsXG4gKiBlcnJvciBvdXRwdXQsIGFuZCBleGl0IGNvZGVzLiBJdCBhbHNvIGluY2x1ZGVzIHV0aWxpdHkgbWV0aG9kcyBmb3IgcGFyc2luZyBjb21tYW5kc1xuICogYW5kIHJlc29sdmluZyBvciByZWplY3RpbmcgcHJvbWlzZXMgYmFzZWQgb24gZXhlY3V0aW9uIHJlc3VsdHMuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcmVzb2x2ZWQgdmFsdWUsIGRlZmF1bHRpbmcgdG8gbnVtYmVyLlxuICpcbiAqIEBwYXJhbSBsb2NrIC0gQSBQcm9taXNlRXhlY3V0b3IgdG8gY29udHJvbCB0aGUgYXN5bmNocm9ub3VzIGZsb3cuXG4gKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzICh1bnVzZWQgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pLlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgU3RhbmRhcmRPdXRwdXRXcml0ZXI8UiA9IHN0cmluZz4gaW1wbGVtZW50cyBPdXRwdXRXcml0ZXIge1xuICBwcm90ZWN0ZWQgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiBTdGFuZGFyZE91dHB1dFdyaXRlci5cbiAgICogQHN1bW1hcnkgQ29uc3RydWN0cyB0aGUgU3RhbmRhcmRPdXRwdXRXcml0ZXIgd2l0aCBhIGxvY2sgbWVjaGFuaXNtIGFuZCBvcHRpb25hbCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBjbWRcbiAgICogQHBhcmFtIGxvY2sgLSBBIFByb21pc2VFeGVjdXRvciB0byBjb250cm9sIHRoZSBhc3luY2hyb25vdXMgZmxvdy5cbiAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyAoY3VycmVudGx5IHVudXNlZCkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY21kOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGxvY2s6IFByb21pc2VFeGVjdXRvcjxSPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogdW5rbm93bltdXG4gICkge1xuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2luZy5mb3IodGhpcy5jbWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIG91dHB1dCB0byB0aGUgY29uc29sZS5cbiAgICogQHN1bW1hcnkgRm9ybWF0cyBhbmQgbG9ncyB0aGUgZ2l2ZW4gZGF0YSB3aXRoIGEgdGltZXN0YW1wIGFuZCB0eXBlIGluZGljYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiBvdXRwdXQgKHN0ZG91dCBvciBzdGRlcnIpLlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHByb3RlY3RlZCBsb2codHlwZTogT3V0cHV0VHlwZSwgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgZGF0YSA9IEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSA/IGRhdGEudG9TdHJpbmcoRW5jb2RpbmcpIDogZGF0YTtcbiAgICBjb25zdCBsb2cgPSB0eXBlID09PSBcInN0ZGVyclwiID8gc3R5bGUoZGF0YSkucmVkLnRleHQgOiBkYXRhO1xuICAgIHRoaXMubG9nZ2VyLmluZm8obG9nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzdGFuZGFyZCBvdXRwdXQgZGF0YS5cbiAgICogQHN1bW1hcnkgTG9ncyB0aGUgZ2l2ZW4gY2h1bmsgYXMgc3RhbmRhcmQgb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0gY2h1bmsgLSBUaGUgZGF0YSBjaHVuayB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBkYXRhKGNodW5rOiBhbnkpIHtcbiAgICB0aGlzLmxvZyhcInN0ZG91dFwiLCBTdHJpbmcoY2h1bmspKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBlcnJvciBvdXRwdXQgZGF0YS5cbiAgICogQHN1bW1hcnkgTG9ncyB0aGUgZ2l2ZW4gY2h1bmsgYXMgZXJyb3Igb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0gY2h1bmsgLSBUaGUgZXJyb3IgZGF0YSBjaHVuayB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBlcnJvcihjaHVuazogYW55KSB7XG4gICAgdGhpcy5sb2coXCJzdGRlcnJcIiwgU3RyaW5nKGNodW5rKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZXJyb3Igb2JqZWN0cy5cbiAgICogQHN1bW1hcnkgTG9ncyB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSBlcnIgLSBUaGUgRXJyb3Igb2JqZWN0IHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGVycm9ycyhlcnI6IEVycm9yKSB7XG4gICAgdGhpcy5sb2coXCJzdGRlcnJcIiwgYEVycm9yIGV4ZWN1dGluZyBjb21tYW5kIGV4aXRlZCA6ICR7ZXJyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHRoZSBleGl0IG9mIGEgY29tbWFuZC5cbiAgICogQHN1bW1hcnkgTG9ncyB0aGUgZXhpdCBjb2RlIGFuZCByZXNvbHZlcyBvciByZWplY3RzIHRoZSBwcm9taXNlIGJhc2VkIG9uIHRoZSBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gY29kZSAtIFRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBsb2dzXG4gICAqL1xuICBleGl0KGNvZGU6IG51bWJlciB8IHN0cmluZywgbG9nczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIFwic3Rkb3V0XCIsXG4gICAgICBgY29tbWFuZCBleGl0ZWQgY29kZSA6ICR7Y29kZSA9PT0gMCA/IHN0eWxlKGNvZGUudG9TdHJpbmcoKSkuZ3JlZW4udGV4dCA6IHN0eWxlKGNvZGUgPT09IG51bGwgPyBcIm51bGxcIiA6IGNvZGUudG9TdHJpbmcoKSkucmVkLnRleHR9YFxuICAgICk7XG4gICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgIHRoaXMucmVzb2x2ZShsb2dzLm1hcCgobCkgPT4gbC50cmltKCkpLmpvaW4oXCJcXG5cIikgYXMgUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcihsb2dzLmxlbmd0aCA/IGxvZ3Muam9pbihcIlxcblwiKSA6IGNvZGUudG9TdHJpbmcoKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29tbWFuZCBzdHJpbmcgb3IgYXJyYXkgaW50byBjb21wb25lbnRzLlxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgY29tbWFuZCBpbnRvIGEgY29uc2lzdGVudCBmb3JtYXQgYW5kIHN0b3JlcyBpdCwgdGhlbiByZXR1cm5zIGl0IHNwbGl0IGludG8gY29tbWFuZCBhbmQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIGFzIGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MuXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSBjb21tYW5kIGFuZCBpdHMgYXJndW1lbnRzIGFzIHNlcGFyYXRlIGVsZW1lbnRzLlxuICAgKi9cbiAgcGFyc2VDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyB8IHN0cmluZ1tdKTogW3N0cmluZywgc3RyaW5nW11dIHtcbiAgICBjb21tYW5kID0gdHlwZW9mIGNvbW1hbmQgPT09IFwic3RyaW5nXCIgPyBjb21tYW5kLnNwbGl0KFwiIFwiKSA6IGNvbW1hbmQ7XG4gICAgdGhpcy5jbWQgPSBjb21tYW5kLmpvaW4oXCIgXCIpO1xuICAgIHJldHVybiBbY29tbWFuZFswXSwgY29tbWFuZC5zbGljZSgxKV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggYSBzdWNjZXNzIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBzdWNjZXNzIG1lc3NhZ2UgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggdGhlIGdpdmVuIHJlYXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIFRoZSByZWFzb24gZm9yIHJlc29sdmluZyB0aGUgcHJvbWlzZS5cbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlKHJlYXNvbjogUikge1xuICAgIHRoaXMubG9nKFxuICAgICAgXCJzdGRvdXRcIixcbiAgICAgIGAke3RoaXMuY21kfSBleGVjdXRlZCBzdWNjZXNzZnVsbHk6ICR7c3R5bGUocmVhc29uID8gXCJyYW4gdG8gY29tcGxldGlvblwiIDogKHJlYXNvbiBhcyBzdHJpbmcpKS5ncmVlbn1gXG4gICAgKTtcbiAgICB0aGlzLmxvY2sucmVzb2x2ZShyZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWplY3RzIHRoZSBwcm9taXNlIHdpdGggYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhbiBlcnJvciBtZXNzYWdlIGFuZCByZWplY3RzIHRoZSBwcm9taXNlIHdpdGggdGhlIGdpdmVuIHJlYXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIFRoZSByZWFzb24gZm9yIHJlamVjdGluZyB0aGUgcHJvbWlzZSwgZWl0aGVyIGEgbnVtYmVyIChleGl0IGNvZGUpIG9yIGEgc3RyaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlamVjdChyZWFzb246IG51bWJlciB8IHN0cmluZyB8IEVycm9yKSB7XG4gICAgaWYgKCEocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZWFzb24gPSBuZXcgRXJyb3IoXG4gICAgICAgIHR5cGVvZiByZWFzb24gPT09IFwibnVtYmVyXCIgPyBgRXhpdCBjb2RlICR7cmVhc29ufWAgOiByZWFzb25cbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubG9nKFxuICAgICAgXCJzdGRlcnJcIixcbiAgICAgIGAke3RoaXMuY21kfSBmYWlsZWQgdG8gZXhlY3V0ZTogJHtzdHlsZShyZWFzb24ubWVzc2FnZSkucmVkfWBcbiAgICApO1xuICAgIHRoaXMubG9jay5yZWplY3QocmVhc29uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2hpbGRQcm9jZXNzV2l0aG91dE51bGxTdHJlYW1zLFxuICBzcGF3bixcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxufSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgU3RhbmRhcmRPdXRwdXRXcml0ZXIgfSBmcm9tIFwiLi4vd3JpdGVycy9TdGFuZGFyZE91dHB1dFdyaXRlclwiO1xuaW1wb3J0IHsgQ29tbWFuZFJlc3VsdCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBPdXRwdXRXcml0ZXJDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi93cml0ZXJzL3R5cGVzXCI7XG5pbXBvcnQgeyBBYm9ydENvZGUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9ja2VkIHZlcnNpb24gb2YgYSBmdW5jdGlvbi5cbiAqIEBzdW1tYXJ5IFRoaXMgaGlnaGVyLW9yZGVyIGZ1bmN0aW9uIHRha2VzIGEgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCBlbnN1cmVzXG4gKiBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGV2ZW4gd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5LlxuICogSXQgdXNlcyBhIFByb21pc2UtYmFzZWQgbG9ja2luZyBtZWNoYW5pc20gdG8gcXVldWUgZnVuY3Rpb24gY2FsbHMuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGlucHV0IGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBmIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGxvY2tlZC4gSXQgY2FuIHRha2UgYW55IG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gYSB2YWx1ZSBvZiB0eXBlIFIuXG4gKiBAcmV0dXJuIEEgbmV3IGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBpbnB1dCBmdW5jdGlvbiwgYnV0IHdpdGggc2VxdWVudGlhbCBleGVjdXRpb24gZ3VhcmFudGVlZC5cbiAqXG4gKiBAZnVuY3Rpb24gbG9ja2lmeVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IExvY2tlZEZ1bmN0aW9uXG4gKiAgIHBhcnRpY2lwYW50IE9yaWdpbmFsRnVuY3Rpb25cbiAqICAgQ2FsbGVyLT4+TG9ja2VkRnVuY3Rpb246IENhbGwgd2l0aCBwYXJhbXNcbiAqICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogQ2hlY2sgY3VycmVudCBsb2NrXG4gKiAgIGFsdCBMb2NrIGlzIHJlc29sdmVkXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5PcmlnaW5hbEZ1bmN0aW9uOiBFeGVjdXRlIHdpdGggcGFyYW1zXG4gKiAgICAgT3JpZ2luYWxGdW5jdGlvbi0tPj5Mb2NrZWRGdW5jdGlvbjogUmV0dXJuIHJlc3VsdFxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmV0dXJuIHJlc3VsdFxuICogICBlbHNlIExvY2sgaXMgcGVuZGluZ1xuICogICAgIExvY2tlZEZ1bmN0aW9uLT4+TG9ja2VkRnVuY3Rpb246IFF1ZXVlIGV4ZWN1dGlvblxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmV0dXJuIHByb21pc2VcbiAqICAgICBOb3RlIG92ZXIgTG9ja2VkRnVuY3Rpb246IFdhaXQgZm9yIHByZXZpb3VzIGV4ZWN1dGlvblxuICogICAgIExvY2tlZEZ1bmN0aW9uLT4+T3JpZ2luYWxGdW5jdGlvbjogRXhlY3V0ZSB3aXRoIHBhcmFtc1xuICogICAgIE9yaWdpbmFsRnVuY3Rpb24tLT4+TG9ja2VkRnVuY3Rpb246IFJldHVybiByZXN1bHRcbiAqICAgICBMb2NrZWRGdW5jdGlvbi0tPj5DYWxsZXI6IFJlc29sdmUgcHJvbWlzZSB3aXRoIHJlc3VsdFxuICogICBlbmRcbiAqICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogVXBkYXRlIGxvY2tcbiAqXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NraWZ5PFI+KGY6ICguLi5wYXJhbXM6IHVua25vd25bXSkgPT4gUikge1xuICBsZXQgbG9jazogUHJvbWlzZTxSIHwgdm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuICguLi5wYXJhbXM6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGxvY2sudGhlbigoKSA9PiBmKC4uLnBhcmFtcykpO1xuICAgIGxvY2sgPSByZXN1bHQuY2F0Y2goKCkgPT4ge30pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICAuLi5zaWduYWxzOiBBYm9ydFNpZ25hbFtdXG4pOiBBYm9ydENvbnRyb2xsZXI7XG5leHBvcnQgZnVuY3Rpb24gY2hhaW5BYm9ydENvbnRyb2xsZXIoXG4gIC4uLnNpZ25hbHM6IEFib3J0U2lnbmFsW11cbik6IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgYXJndW1lbnQwOiBBYm9ydENvbnRyb2xsZXIgfCBBYm9ydFNpZ25hbCxcbiAgLi4ucmVtYWluZGVyOiBBYm9ydFNpZ25hbFtdXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBsZXQgc2lnbmFsczogQWJvcnRTaWduYWxbXTtcbiAgbGV0IGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAvLyBub3JtYWxpemUgYXJnc1xuICBpZiAoYXJndW1lbnQwIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpIHtcbiAgICBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHNpZ25hbHMgPSBbYXJndW1lbnQwLCAuLi5yZW1haW5kZXJdO1xuICB9IGVsc2Uge1xuICAgIGNvbnRyb2xsZXIgPSBhcmd1bWVudDA7XG4gICAgc2lnbmFscyA9IHJlbWFpbmRlcjtcbiAgfVxuXG4gIC8vIGlmIHRoZSBjb250cm9sbGVyIGlzIGFscmVhZHkgYWJvcnRlZCwgZXhpdCBlYXJseVxuICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybiBjb250cm9sbGVyO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9ICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcblxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7XG4gICAgLy8gY2hlY2sgYmVmb3JlIGFkZGluZyEgKGFuZCBhc3N1bWUgdGhlcmUgaXMgbm8gcG9zc2libGUgd2F5IHRoYXQgdGhlIHNpZ25hbCBjb3VsZFxuICAgIC8vIGFib3J0IGJldHdlZW4gdGhlIGBpZmAgY2hlY2sgYW5kIGFkZGluZyB0aGUgZXZlbnQgbGlzdGVuZXIpXG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBoYW5kbGVyLCB7XG4gICAgICBvbmNlOiB0cnVlLFxuICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25Db21tYW5kPFIgPSBzdHJpbmc+KFxuICBvdXRwdXQ6IFN0YW5kYXJkT3V0cHV0V3JpdGVyPFI+LFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdHM6IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgYWJvcnQ6IEFib3J0Q29udHJvbGxlcixcbiAgbG9nZ2VyOiBMb2dnZXJcbik6IENoaWxkUHJvY2Vzc1dpdGhvdXROdWxsU3RyZWFtcyB7XG4gIGZ1bmN0aW9uIHNwYXduSW5uZXIoY29tbWFuZDogc3RyaW5nLCBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBbY21kLCBhcmd6XSA9IG91dHB1dC5wYXJzZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgbG9nZ2VyLmluZm8oYFJ1bm5pbmcgY29tbWFuZDogJHtjbWR9YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGB3aXRoIGFyZ3M6ICR7YXJnei5qb2luKFwiIFwiKX1gKTtcbiAgICBjb25zdCBjaGlsZFByb2Nlc3MgPSBzcGF3bihjbWQsIGFyZ3osIHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICBjd2Q6IG9wdHMuY3dkIHx8IHByb2Nlc3MuY3dkKCksXG4gICAgICBlbnY6IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCBvcHRzLmVudiwgeyBQQVRIOiBwcm9jZXNzLmVudi5QQVRIIH0pLFxuICAgICAgc2hlbGw6IG9wdHMuc2hlbGwgfHwgZmFsc2UsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIGxvZ2dlci52ZXJib3NlKGBwaWQgOiAke2NoaWxkUHJvY2Vzcy5waWR9YCk7XG4gICAgcmV0dXJuIGNoaWxkUHJvY2VzcztcbiAgfVxuXG4gIGNvbnN0IG0gPSBjb21tYW5kLm1hdGNoKC9bPD4kI10vZyk7XG4gIGlmIChtKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGNvbW1hbmQ6ICR7Y29tbWFuZH0uIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyczogJHttfWBcbiAgICApO1xuICBpZiAoY29tbWFuZC5pbmNsdWRlcyhcIiB8IFwiKSkge1xuICAgIGNvbnN0IGNtZHMgPSBjb21tYW5kLnNwbGl0KFwiIHwgXCIpO1xuICAgIGNvbnN0IHNwYXducyA9IFtdO1xuICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gbmV3IEFycmF5KGNtZHMubGVuZ3RoKTtcbiAgICBjb250cm9sbGVyc1swXSA9IGFib3J0O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgIT09IDApXG4gICAgICAgIGNvbnRyb2xsZXJzW2ldID0gY2hhaW5BYm9ydENvbnRyb2xsZXIoY29udHJvbGxlcnNbaSAtIDFdLnNpZ25hbCk7XG4gICAgICBzcGF3bnMucHVzaChzcGF3bklubmVyKGNtZHNbaV0sIGNvbnRyb2xsZXJzW2ldKSk7XG4gICAgICBpZiAoaSA9PT0gMCkgY29udGludWU7XG4gICAgICBzcGF3bnNbaSAtIDFdLnN0ZG91dC5waXBlKHNwYXduc1tpXS5zdGRpbik7XG4gICAgfVxuICAgIHJldHVybiBzcGF3bnNbY21kcy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHJldHVybiBzcGF3bklubmVyKGNvbW1hbmQsIGFib3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBjb21tYW5kIGFzeW5jaHJvbm91c2x5IHdpdGggY3VzdG9taXphYmxlIG91dHB1dCBoYW5kbGluZy5cbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gcnVucyBhIHNoZWxsIGNvbW1hbmQgYXMgYSBjaGlsZCBwcm9jZXNzLCBwcm92aWRpbmcgZmluZS1ncmFpbmVkXG4gKiBjb250cm9sIG92ZXIgaXRzIGV4ZWN1dGlvbiBhbmQgb3V0cHV0IGhhbmRsaW5nLiBJdCBzdXBwb3J0cyBjdXN0b20gb3V0cHV0IHdyaXRlcnMsXG4gKiBhbGxvd3MgZm9yIGNvbW1hbmQgYWJvcnRpb24sIGFuZCBjYXB0dXJlcyBib3RoIHN0ZG91dCBhbmQgc3RkZXJyLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHJlc29sdmVkIHZhbHVlIGZyb20gdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuLCBlaXRoZXIgYXMgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBvcHRzIC0gU3Bhd24gb3B0aW9ucyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MuIERlZmF1bHRzIHRvIGFuIGVtcHR5IG9iamVjdC5cbiAqIEBwYXJhbSBvdXRwdXRDb25zdHJ1Y3RvciAtIENvbnN0cnVjdG9yIGZvciB0aGUgb3V0cHV0IHdyaXRlci4gRGVmYXVsdHMgdG8gU3RhbmRhcmRPdXRwdXRXcml0ZXIuXG4gKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG91dHB1dCBjb25zdHJ1Y3Rvci5cbiAqIEByZXR1cm4ge0NvbW1hbmRSZXN1bHR9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb21tYW5kIHJlc3VsdCBvZiB0eXBlIFIuXG4gKlxuICogQGZ1bmN0aW9uIHJ1bkNvbW1hbmRcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBydW5Db21tYW5kXG4gKiAgIHBhcnRpY2lwYW50IE91dHB1dFdyaXRlclxuICogICBwYXJ0aWNpcGFudCBDaGlsZFByb2Nlc3NcbiAqICAgQ2FsbGVyLT4+cnVuQ29tbWFuZDogQ2FsbCB3aXRoIGNvbW1hbmQgYW5kIG9wdGlvbnNcbiAqICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogQ3JlYXRlIG5ldyBpbnN0YW5jZVxuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBQYXJzZSBjb21tYW5kXG4gKiAgIHJ1bkNvbW1hbmQtPj5DaGlsZFByb2Nlc3M6IFNwYXduIHByb2Nlc3NcbiAqICAgQ2hpbGRQcm9jZXNzLS0+PnJ1bkNvbW1hbmQ6IFJldHVybiBwcm9jZXNzIG9iamVjdFxuICogICBydW5Db21tYW5kLT4+Q2hpbGRQcm9jZXNzOiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzXG4gKiAgIGxvb3AgRm9yIGVhY2ggc3Rkb3V0IGRhdGFcbiAqICAgICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IHN0ZG91dCBkYXRhXG4gKiAgICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIHN0ZG91dCBkYXRhXG4gKiAgIGVuZFxuICogICBsb29wIEZvciBlYWNoIHN0ZGVyciBkYXRhXG4gKiAgICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBzdGRlcnIgZGF0YVxuICogICAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBzdGRlcnIgZGF0YVxuICogICBlbmRcbiAqICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBlcnJvciAoaWYgYW55KVxuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBIYW5kbGUgZXJyb3JcbiAqICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBleGl0XG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBleGl0XG4gKiAgIE91dHB1dFdyaXRlci0tPj5ydW5Db21tYW5kOiBSZXNvbHZlIG9yIHJlamVjdCBwcm9taXNlXG4gKiAgIHJ1bkNvbW1hbmQtLT4+Q2FsbGVyOiBSZXR1cm4gQ29tbWFuZFJlc3VsdFxuICpcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbW1hbmQ8UiA9IHN0cmluZz4oXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0czogU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvID0ge30sXG4gIG91dHB1dENvbnN0cnVjdG9yOiBPdXRwdXRXcml0ZXJDb25zdHJ1Y3RvcjxcbiAgICBSLFxuICAgIFN0YW5kYXJkT3V0cHV0V3JpdGVyPFI+LFxuICAgIEVycm9yXG4gID4gPSBTdGFuZGFyZE91dHB1dFdyaXRlcjxSPixcbiAgLi4uYXJnczogdW5rbm93bltdXG4pOiBDb21tYW5kUmVzdWx0PFI+IHtcbiAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IocnVuQ29tbWFuZCk7XG4gIGNvbnN0IGFib3J0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IHJlc3VsdDogT21pdDxDb21tYW5kUmVzdWx0LCBcInByb21pc2VcIiB8IFwicGlwZVwiPiA9IHtcbiAgICBhYm9ydDogYWJvcnQsXG4gICAgY29tbWFuZDogY29tbWFuZCxcbiAgICBsb2dzOiBbXSxcbiAgICBlcnJzOiBbXSxcbiAgfTtcblxuICBjb25zdCBsb2NrID0gbmV3IFByb21pc2U8Uj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBvdXRwdXQ7XG4gICAgdHJ5IHtcbiAgICAgIG91dHB1dCA9IG5ldyBvdXRwdXRDb25zdHJ1Y3RvcihcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAge1xuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuXG4gICAgICByZXN1bHQuY21kID0gc3Bhd25Db21tYW5kPFI+KG91dHB1dCwgY29tbWFuZCwgb3B0cywgYWJvcnQsIGxvZ2dlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEVycm9yIHJ1bm5pbmcgY29tbWFuZCAke2NvbW1hbmR9OiAke2V9YCkpO1xuICAgIH1cblxuICAgIHJlc3VsdC5jbWQuc3Rkb3V0LnNldEVuY29kaW5nKFwidXRmOFwiKTtcblxuICAgIHJlc3VsdC5jbWQuc3Rkb3V0Lm9uKFwiZGF0YVwiLCAoY2h1bms6IGFueSkgPT4ge1xuICAgICAgY2h1bmsgPSBjaHVuay50b1N0cmluZygpO1xuICAgICAgcmVzdWx0LmxvZ3MucHVzaChjaHVuayk7XG4gICAgICBvdXRwdXQuZGF0YShjaHVuayk7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuY21kLnN0ZGVyci5vbihcImRhdGFcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIHJlc3VsdC5lcnJzLnB1c2goZGF0YSk7XG4gICAgICBvdXRwdXQuZXJyb3IoZGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuY21kLm9uY2UoXCJlcnJvclwiLCAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgb3V0cHV0LmV4aXQoZXJyLm1lc3NhZ2UsIHJlc3VsdC5lcnJzKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jbWQub25jZShcImV4aXRcIiwgKGNvZGU6IG51bWJlciA9IDApID0+IHtcbiAgICAgIGlmIChhYm9ydC5zaWduYWwuYWJvcnRlZCAmJiBjb2RlID09PSBudWxsKSBjb2RlID0gQWJvcnRDb2RlIGFzIGFueTtcbiAgICAgIG91dHB1dC5leGl0KGNvZGUsIGNvZGUgPT09IDAgPyByZXN1bHQubG9ncyA6IHJlc3VsdC5lcnJzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHtcbiAgICBwcm9taXNlOiBsb2NrLFxuICAgIHBpcGU6IGFzeW5jIDxFPihjYjogKHI6IFIpID0+IEUpID0+IHtcbiAgICAgIGNvbnN0IGwgPSBsb2dnZXIuZm9yKFwicGlwZVwiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGwudmVyYm9zZShgRXhlY3V0aW5nIHBpcGUgZnVuY3Rpb24gJHtjb21tYW5kfS4uLmApO1xuICAgICAgICBjb25zdCByZXN1bHQ6IFIgPSBhd2FpdCBsb2NrO1xuICAgICAgICBsLnZlcmJvc2UoYFBpcGluZyBvdXRwdXQgdG8gJHtjYi5uYW1lfTogJHtyZXN1bHR9YCk7XG4gICAgICAgIHJldHVybiBjYihyZXN1bHQpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsLmVycm9yKGBFcnJvciBwaXBpbmcgY29tbWFuZCBvdXRwdXQ6ICR7ZX1gKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0IGFzIENvbW1hbmRSZXN1bHQ8Uj47XG59XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcGF0Y2hTdHJpbmcgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lNYXAsIFNpbXBsZURlcGVuZGVuY3lNYXAgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG5jb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihcImZzXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYXRjaGVzIGEgZmlsZSB3aXRoIGdpdmVuIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZmlsZSwgYXBwbGllcyBwYXRjaGVzIHVzaW5nIFRleHRVdGlscywgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBwYXRjaGVkLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+fSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIHBhdGNoIGludG8gdGhlIGZpbGUuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaEZpbGVcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwYXRjaEZpbGVcbiAqICAgcGFydGljaXBhbnQgZnNcbiAqICAgcGFydGljaXBhbnQgcmVhZEZpbGVcbiAqICAgcGFydGljaXBhbnQgVGV4dFV0aWxzXG4gKiAgIHBhcnRpY2lwYW50IHdyaXRlRmlsZVxuICogICBDYWxsZXItPj5wYXRjaEZpbGU6IENhbGwgd2l0aCBwYXRoIGFuZCB2YWx1ZXNcbiAqICAgcGF0Y2hGaWxlLT4+ZnM6IENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gKiAgIHBhdGNoRmlsZS0+PnJlYWRGaWxlOiBSZWFkIGZpbGUgY29udGVudFxuICogICByZWFkRmlsZS0+PmZzOiBSZWFkIGZpbGVcbiAqICAgZnMtLT4+cmVhZEZpbGU6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgcmVhZEZpbGUtLT4+cGF0Y2hGaWxlOiBSZXR1cm4gZmlsZSBjb250ZW50XG4gKiAgIHBhdGNoRmlsZS0+PlRleHRVdGlsczogUGF0Y2ggc3RyaW5nXG4gKiAgIFRleHRVdGlscy0tPj5wYXRjaEZpbGU6IFJldHVybiBwYXRjaGVkIGNvbnRlbnRcbiAqICAgcGF0Y2hGaWxlLT4+d3JpdGVGaWxlOiBXcml0ZSBwYXRjaGVkIGNvbnRlbnRcbiAqICAgd3JpdGVGaWxlLT4+ZnM6IFdyaXRlIHRvIGZpbGVcbiAqICAgZnMtLT4+d3JpdGVGaWxlOiBGaWxlIHdyaXR0ZW5cbiAqICAgd3JpdGVGaWxlLS0+PnBhdGNoRmlsZTogRmlsZSB3cml0dGVuXG4gKiAgIHBhdGNoRmlsZS0tPj5DYWxsZXI6IFBhdGNoaW5nIGNvbXBsZXRlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hGaWxlKFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPlxuKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocGF0Y2hGaWxlKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGgpKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgYXQgcGF0aCBcIiR7cGF0aH1cIi5gKTtcbiAgbGV0IGNvbnRlbnQgPSByZWFkRmlsZShwYXRoKTtcblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBQYXRjaGluZyBmaWxlIFwiJHtwYXRofVwiLi4uYCk7XG4gICAgbG9nLmRlYnVnKGB3aXRoIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlcyl9YCk7XG4gICAgY29udGVudCA9IHBhdGNoU3RyaW5nKGNvbnRlbnQsIHZhbHVlcyk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXRjaGluZyBmaWxlOiAke2Vycm9yfWApO1xuICB9XG4gIHdyaXRlRmlsZShwYXRoLCBjb250ZW50KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50LlxuICogQHN1bW1hcnkgUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgcmV0dXJucyBpdCBhcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIHJlYWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb250ZW50IG9mIHRoZSBmaWxlLlxuICpcbiAqIEBmdW5jdGlvbiByZWFkRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWxlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocmVhZEZpbGUpO1xuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nIGZpbGUgXCIke3BhdGh9XCIuLi5gKTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFdyaXRlcyBkYXRhIHRvIGEgZmlsZS5cbiAqIEBzdW1tYXJ5IFdyaXRlcyB0aGUgcHJvdmlkZWQgZGF0YSB0byBhIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgd3JpdHRlbi5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSBkYXRhIC0gVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHdyaXRlRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcik6IHZvaWQge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHdyaXRlRmlsZSk7XG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFdyaXRpbmcgZmlsZSBcIiR7cGF0aH0gd2l0aCAke2RhdGEubGVuZ3RofSBieXRlcy4uLmApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aCwgZGF0YSwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBmaWxlcyByZWN1cnNpdmVseSBmcm9tIGEgZGlyZWN0b3J5LlxuICogQHN1bW1hcnkgVHJhdmVyc2VzIHRocm91Z2ggZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzIHRvIGNvbGxlY3QgYWxsIGZpbGUgcGF0aHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHAgLSBUaGUgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS5cbiAqIEBwYXJhbSBmaWx0ZXJcbiAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiBmaWxlIHBhdGhzLlxuICpcbiAqIEBmdW5jdGlvbiBnZXRBbGxGaWxlc1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZnMtdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZpbGVzKFxuICBwOiBzdHJpbmcsXG4gIGZpbHRlcj86IChmOiBzdHJpbmcsIGk/OiBudW1iZXIpID0+IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihnZXRBbGxGaWxlcyk7XG4gIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgYWxsIGZpbGVzIGZyb20gXCIke3B9XCIuLi5gKTtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMocCk7XG5cbiAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihwLCBlbnRyeSk7XG4gICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpO1xuXG4gICAgICBpZiAoc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgICBmaWxlcy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGZpbGVzLnB1c2goLi4uZ2V0QWxsRmlsZXMoZnVsbFBhdGgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWZpbHRlcikgcmV0dXJuIGZpbGVzO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZmlsdGVyKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgcmV0cmlldmluZyBmaWxlcyBmcm9tIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcmV0cmlldmluZyBmaWxlcyBmcm9tIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVGaWxlKHNvdXJjZTogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihyZW5hbWVGaWxlKTtcbiAgbGV0IGRlc2NyaXB0b3JTb3VyY2UsIGRlc2NyaXB0b3JEZXN0O1xuXG4gIHRyeSB7XG4gICAgZGVzY3JpcHRvclNvdXJjZSA9IGZzLnN0YXRTeW5jKHNvdXJjZSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgcGF0aCBcIiR7c291cmNlfVwiIGRvZXMgbm90IGV4aXN0OiAke2Vycm9yfWApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yRGVzdCA9IGZzLnN0YXRTeW5jKGRlc3QpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIGRvIG5vdGhpbmcuIGl0cyBva1xuICB9XG4gIGlmIChkZXNjcmlwdG9yRGVzdCkge1xuICAgIGxvZy52ZXJib3NlKGBEZXN0aW5hdGlvbiBwYXRoIFwiJHtkZXN0fVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEZXN0aW5hdGlvbiBwYXRoIFwiJHtkZXN0fVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gIH1cblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYFJlbmFtaW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH0uLi5gXG4gICAgKTtcbiAgICBmcy5yZW5hbWVTeW5jKHNvdXJjZSwgZGVzdCk7XG4gICAgbG9nLnZlcmJvc2UoYFN1Y2Nlc3NmdWxseSByZW5hbWVkIHRvIFwiJHtkZXN0fVwiYCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgRXJyb3IgcmVuYW1pbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fVwiOiAke2Vycm9yfWBcbiAgICApO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFcnJvciByZW5hbWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9XCI6ICR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlGaWxlKHNvdXJjZTogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihjb3B5RmlsZSk7XG4gIGxldCBkZXNjcmlwdG9yU291cmNlLCBkZXNjcmlwdG9yRGVzdDtcbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yU291cmNlID0gZnMuc3RhdFN5bmMoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVzY3JpcHRvckRlc3QgPSBmcy5zdGF0U3luYyhkZXN0KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGRlc2NyaXB0b3JTb3VyY2UuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgbG9nLnZlcmJvc2UoYERlc3QgcGF0aCBcIiR7ZGVzdH1cIiBkb2VzIG5vdCBleGlzdC4gY3JlYXRpbmdgKTtcbiAgICAgIGZzLm1rZGlyU3luYyhkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYENvcHlpbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fS4uLmBcbiAgICApO1xuICAgIGZzLmNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEVycm9yIGNvcHlpbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fTogJHtlcnJvcn1gXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXJyb3IgY29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9OiAke2Vycm9yfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVQYXRoKHA6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGRlbGV0ZVBhdGgpO1xuICB0cnkge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBmcy5zdGF0U3luYyhwKTtcbiAgICBpZiAoZGVzY3JpcHRvci5pc0ZpbGUoKSkge1xuICAgICAgbG9nLnZlcmJvc2UoYERlbGV0aW5nIGZpbGUgXCIke3B9Li4uYCk7XG4gICAgICBmcy5ybVN5bmMocCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5pc0RpcmVjdG9yeSgpKVxuICAgICAgZnMucm1TeW5jKHAsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgRGVsZXRpbmcgXCIke3B9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBEZWxldGluZyBcIiR7cH1cIjogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBzdW1tYXJ5IExvYWRzIGFuZCBwYXJzZXMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGZyb20gYSBzcGVjaWZpZWQgZGlyZWN0b3J5IG9yIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBDYW4gcmV0dXJuIHRoZSBlbnRpcmUgcGFja2FnZSBvYmplY3Qgb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcD1wcm9jZXNzLmN3ZCgpXSAtIFRoZSBkaXJlY3RvcnkgcGF0aCB3aGVyZSB0aGUgcGFja2FnZS5qc29uIGZpbGUgaXMgbG9jYXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gT3B0aW9uYWwuIFRoZSBzcGVjaWZpYyBwcm9wZXJ0eSB0byByZXRyaWV2ZSBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEByZXR1cm4ge29iamVjdCB8IHN0cmluZ30gVGhlIHBhcnNlZCBjb250ZW50cyBvZiBwYWNrYWdlLmpzb24gb3IgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZnVuY3Rpb24gZ2V0UGFja2FnZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZ2V0UGFja2FnZVxuICogICBwYXJ0aWNpcGFudCByZWFkRmlsZVxuICogICBwYXJ0aWNpcGFudCBKU09OXG4gKiAgIENhbGxlci0+PmdldFBhY2thZ2U6IENhbGwgd2l0aCBwYXRoIGFuZCBvcHRpb25hbCBwcm9wZXJ0eVxuICogICBnZXRQYWNrYWdlLT4+cmVhZEZpbGU6IFJlYWQgcGFja2FnZS5qc29uXG4gKiAgIHJlYWRGaWxlLS0+PmdldFBhY2thZ2U6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgZ2V0UGFja2FnZS0+PkpTT046IFBhcnNlIGZpbGUgY29udGVudFxuICogICBKU09OLS0+PmdldFBhY2thZ2U6IFJldHVybiBwYXJzZWQgb2JqZWN0XG4gKiAgIGFsdCBwcm9wZXJ0eSBzcGVjaWZpZWRcbiAqICAgICBnZXRQYWNrYWdlLT4+Z2V0UGFja2FnZTogQ2hlY2sgaWYgcHJvcGVydHkgZXhpc3RzXG4gKiAgICAgYWx0IHByb3BlcnR5IGV4aXN0c1xuICogICAgICAgZ2V0UGFja2FnZS0tPj5DYWxsZXI6IFJldHVybiBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIGVsc2UgcHJvcGVydHkgZG9lc24ndCBleGlzdFxuICogICAgICAgZ2V0UGFja2FnZS0tPj5DYWxsZXI6IFRocm93IEVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVsc2Ugbm8gcHJvcGVydHkgc3BlY2lmaWVkXG4gKiAgICAgZ2V0UGFja2FnZS0tPj5DYWxsZXI6IFJldHVybiBlbnRpcmUgcGFja2FnZSBvYmplY3RcbiAqICAgZW5kXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlKFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBwcm9wZXJ0eT86IHN0cmluZ1xuKTogb2JqZWN0IHwgc3RyaW5nIHtcbiAgbGV0IHBrZzogYW55O1xuICB0cnkge1xuICAgIHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGUocGF0aC5qb2luKHAsIGBwYWNrYWdlLmpzb25gKSkpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJldHJpZXZlIHBhY2thZ2UgaW5mb3JtYXRpb25cIiAke2Vycm9yfWApO1xuICB9XG5cbiAgaWYgKHByb3BlcnR5KSB7XG4gICAgaWYgKCEocHJvcGVydHkgaW4gcGtnKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgXCIke3Byb3BlcnR5fVwiIG5vdCBmb3VuZCBpbiBwYWNrYWdlLmpzb25gKTtcbiAgICByZXR1cm4gcGtnW3Byb3BlcnR5XSBhcyBzdHJpbmc7XG4gIH1cbiAgcmV0dXJuIHBrZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFBhY2thZ2VBdHRyaWJ1dGUoXG4gIGF0dHI6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKVxuKTogdm9pZCB7XG4gIGNvbnN0IHBrZyA9IGdldFBhY2thZ2UocCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcGtnW2F0dHJdID0gdmFsdWU7XG4gIHdyaXRlRmlsZShwYXRoLmpvaW4ocCwgYHBhY2thZ2UuanNvbmApLCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgQSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNhbGxzIGdldFBhY2thZ2UgdG8gcmV0cmlldmUgdGhlIFwidmVyc2lvblwiIHByb3BlcnR5IGZyb20gcGFja2FnZS5qc29uLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwPXByb2Nlc3MuY3dkKCldIC0gVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmVyc2lvbiBzdHJpbmcgZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAZnVuY3Rpb24gZ2V0UGFja2FnZVZlcnNpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZnMtdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uKHAgPSBwcm9jZXNzLmN3ZCgpKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFBhY2thZ2UocCwgXCJ2ZXJzaW9uXCIpIGFzIHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgcHJvamVjdC5cbiAqIEBzdW1tYXJ5IEV4ZWN1dGVzICducG0gbHMgLS1qc29uJyBjb21tYW5kIHRvIGdldCBhIGRldGFpbGVkIGxpc3Qgb2YgYWxsIGRlcGVuZGVuY2llcyAocHJvZHVjdGlvbiwgZGV2ZWxvcG1lbnQsIGFuZCBwZWVyKSBhbmQgdGhlaXIgdmVyc2lvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGg9cHJvY2Vzcy5jd2QoKV0gLSBUaGUgZGlyZWN0b3J5IHBhdGggb2YgdGhlIHByb2plY3QuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHtwcm9kOiBBcnJheTx7bmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9PiwgZGV2OiBBcnJheTx7bmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9PiwgcGVlcjogQXJyYXk8e25hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT59Pn0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgYXJyYXlzIG9mIHByb2R1Y3Rpb24sIGRldmVsb3BtZW50LCBhbmQgcGVlciBkZXBlbmRlbmNpZXMuXG4gKiBAZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZXREZXBlbmRlbmNpZXNcbiAqICAgcGFydGljaXBhbnQgcnVuQ29tbWFuZFxuICogICBwYXJ0aWNpcGFudCBKU09OXG4gKiAgIENhbGxlci0+PmdldERlcGVuZGVuY2llczogQ2FsbCB3aXRoIG9wdGlvbmFsIHBhdGhcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLT4+cnVuQ29tbWFuZDogRXhlY3V0ZSAnbnBtIGxzIC0tanNvbidcbiAqICAgcnVuQ29tbWFuZC0tPj5nZXREZXBlbmRlbmNpZXM6IFJldHVybiBjb21tYW5kIG91dHB1dFxuICogICBnZXREZXBlbmRlbmNpZXMtPj5KU09OOiBQYXJzZSBjb21tYW5kIG91dHB1dFxuICogICBKU09OLS0+PmdldERlcGVuZGVuY2llczogUmV0dXJuIHBhcnNlZCBvYmplY3RcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLT4+Z2V0RGVwZW5kZW5jaWVzOiBQcm9jZXNzIGRlcGVuZGVuY2llc1xuICogICBnZXREZXBlbmRlbmNpZXMtLT4+Q2FsbGVyOiBSZXR1cm4gcHJvY2Vzc2VkIGRlcGVuZGVuY2llc1xuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzKFxuICBwYXRoOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpXG4pOiBQcm9taXNlPERlcGVuZGVuY3lNYXA+IHtcbiAgbGV0IHBrZzogYW55O1xuXG4gIHRyeSB7XG4gICAgcGtnID0gSlNPTi5wYXJzZShhd2FpdCBydW5Db21tYW5kKGBucG0gbHMgLS1qc29uYCwgeyBjd2Q6IHBhdGggfSkucHJvbWlzZSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBkZXBlbmRlbmNpZXM6ICR7ZX1gKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29uc3QgbWFwcGVyID0gKGVudHJ5OiBbc3RyaW5nLCB1bmtub3duXSwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICBuYW1lOiBlbnRyeVswXSxcbiAgICB2ZXJzaW9uOiAoZW50cnlbMV0gYXMgYW55KS52ZXJzaW9uLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHByb2Q6IE9iamVjdC5lbnRyaWVzKHBrZy5kZXBlbmRlbmNpZXMgfHwge30pLm1hcChtYXBwZXIpLFxuICAgIGRldjogT2JqZWN0LmVudHJpZXMocGtnLmRldkRlcGVuZGVuY2llcyB8fCB7fSkubWFwKG1hcHBlciksXG4gICAgcGVlcjogT2JqZWN0LmVudHJpZXMocGtnLnBlZXJEZXBlbmRlbmNpZXMgfHwge30pLm1hcChtYXBwZXIpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRGVwZW5kZW5jaWVzKCkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHVwZGF0ZURlcGVuZGVuY2llcyk7XG4gIGxvZy5pbmZvKFwiY2hlY2tpbmcgZm9yIHVwZGF0ZXMuLi5cIik7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoXCJucHggbnBtLWNoZWNrLXVwZGF0ZXMgLXVcIikucHJvbWlzZTtcbiAgbG9nLmluZm8oXCJ1cGRhdGluZy4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcIm5weCBucG0gcnVuIGRvLWluc3RhbGxcIikucHJvbWlzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxJZk5vdEF2YWlsYWJsZShcbiAgZGVwczogc3RyaW5nW10gfCBzdHJpbmcsXG4gIGRlcGVuZGVuY2llcz86IFNpbXBsZURlcGVuZGVuY3lNYXBcbikge1xuICBpZiAoIWRlcGVuZGVuY2llcykge1xuICAgIGNvbnN0IGQ6IERlcGVuZGVuY3lNYXAgPSBhd2FpdCBnZXREZXBlbmRlbmNpZXMoKTtcbiAgICBkZXBlbmRlbmNpZXMgPSB7XG4gICAgICBwcm9kOiBkLnByb2Q/Lm1hcCgocCkgPT4gcC5uYW1lKSB8fCBbXSxcbiAgICAgIGRldjogZC5kZXY/Lm1hcCgoZCkgPT4gZC5uYW1lKSB8fCBbXSxcbiAgICAgIHBlZXI6IGQucGVlcj8ubWFwKChwKSA9PiBwLm5hbWUpIHx8IFtdLFxuICAgIH07XG4gIH1cbiAgY29uc3QgeyBwcm9kLCBkZXYsIHBlZXIgfSA9IGRlcGVuZGVuY2llcztcbiAgY29uc3QgaW5zdGFsbGVkID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFsuLi4ocHJvZCB8fCBbXSksIC4uLihkZXYgfHwgW10pLCAuLi4ocGVlciB8fCBbXSldKVxuICApO1xuICBkZXBzID0gdHlwZW9mIGRlcHMgPT09IFwic3RyaW5nXCIgPyBbZGVwc10gOiBkZXBzO1xuICBjb25zdCB0b0luc3RhbGwgPSBkZXBzLmZpbHRlcigoZCkgPT4gIWluc3RhbGxlZC5pbmNsdWRlcyhkKSk7XG5cbiAgaWYgKHRvSW5zdGFsbC5sZW5ndGgpIGF3YWl0IGluc3RhbGxEZXBlbmRlbmNpZXMoeyBkZXY6IHRvSW5zdGFsbCB9KTtcbiAgZGVwZW5kZW5jaWVzLmRldiA9IGRlcGVuZGVuY2llcy5kZXYgfHwgW107XG4gIGRlcGVuZGVuY2llcy5kZXYucHVzaCguLi50b0luc3RhbGwpO1xuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVzaFRvR2l0KCkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHB1c2hUb0dpdCk7XG4gIGNvbnN0IGdpdFVzZXIgPSBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGNvbmZpZyB1c2VyLm5hbWVcIikucHJvbWlzZTtcbiAgY29uc3QgZ2l0RW1haWwgPSBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGNvbmZpZyB1c2VyLmVtYWlsXCIpLnByb21pc2U7XG4gIGxvZy52ZXJib3NlKGBjYWNoZWQgZ2l0IGlkOiAke2dpdFVzZXJ9LyR7Z2l0RW1haWx9LiBjaGFuZ2luZyB0byBhdXRvbWF0aW9uYCk7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCBjb25maWcgdXNlci5lbWFpbCBcImF1dG9tYXRpb25AZGVjYWYudHNcIicpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCBjb25maWcgdXNlci5uYW1lIFwiZGVjYWZcIicpLnByb21pc2U7XG4gIGxvZy5pbmZvKFwiUHVzaGluZyBjaGFuZ2VzIHRvIGdpdC4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBhZGQgLlwiKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29tbWl0IC1tIFwicmVmcyAjMSAtIGFmdGVyIHJlcG8gc2V0dXBcImApLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgcHVzaFwiKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29uZmlnIHVzZXIuZW1haWwgXCIke2dpdEVtYWlsfVwiYCkucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZChgZ2l0IGNvbmZpZyB1c2VyLm5hbWUgXCIke2dpdFVzZXJ9XCJgKS5wcm9taXNlO1xuICBsb2cudmVyYm9zZShgcmV2ZXJ0ZWQgdG8gZ2l0IGlkOiAke2dpdFVzZXJ9LyR7Z2l0RW1haWx9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llczoge1xuICBwcm9kPzogc3RyaW5nW107XG4gIGRldj86IHN0cmluZ1tdO1xuICBwZWVyPzogc3RyaW5nW107XG59KSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoaW5zdGFsbERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IHByb2QgPSBkZXBlbmRlbmNpZXMucHJvZCB8fCBbXTtcbiAgY29uc3QgZGV2ID0gZGVwZW5kZW5jaWVzLmRldiB8fCBbXTtcbiAgY29uc3QgcGVlciA9IGRlcGVuZGVuY2llcy5wZWVyIHx8IFtdO1xuICBpZiAocHJvZC5sZW5ndGgpIHtcbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMgJHtwcm9kLmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAke3Byb2Quam9pbihcIiBcIil9YCwgeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSlcbiAgICAgIC5wcm9taXNlO1xuICB9XG4gIGlmIChkZXYubGVuZ3RoKSB7XG4gICAgbG9nLmluZm8oYEluc3RhbGxpbmcgZGV2RGVwZW5kZW5jaWVzICR7ZGV2LmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAtLXNhdmUtZGV2ICR7ZGV2LmpvaW4oXCIgXCIpfWAsIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KS5wcm9taXNlO1xuICB9XG4gIGlmIChwZWVyLmxlbmd0aCkge1xuICAgIGxvZy5pbmZvKGBJbnN0YWxsaW5nIHBlZXJEZXBlbmRlbmNpZXMgJHtwZWVyLmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAtLXNhdmUtcGVlciAke3BlZXIuam9pbihcIiBcIil9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUltcG9ydDxUPihcbiAgaW1wb3J0UHJvbWlzZTogUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIC8vIENvbW1vbkpTJ3MgYG1vZHVsZS5leHBvcnRzYCBpcyB3cmFwcGVkIGFzIGBkZWZhdWx0YCBpbiBFU01vZHVsZS5cbiAgcmV0dXJuIGltcG9ydFByb21pc2UudGhlbigobTogYW55KSA9PiAobS5kZWZhdWx0IHx8IG0pIGFzIFQpO1xufVxuIiwiaW1wb3J0IHNsb2dhbnMgZnJvbSBcIi4uL2Fzc2V0cy9zbG9nYW5zLmpzb25cIjtcbmltcG9ydCB7IHN0eWxlIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIEFOU0kgY29sb3IgY29kZXMgZm9yIGJhbm5lciBzdHlsaW5nLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIHNldCBvZiBBTlNJIGNvbG9yIGNvZGVzIHVzZWQgdG8gc3R5bGUgdGhlIGJhbm5lciB0ZXh0LlxuICovXG5jb25zdCBjb2xvcnMgPSBbXG4gIFwiXFx4MWJbMzg7NTsyMTVtXCIsIC8vIHNvZnQgb3JhbmdlXG4gIFwiXFx4MWJbMzg7NTsyMDltXCIsIC8vIGNvcmFsXG4gIFwiXFx4MWJbMzg7NTsyMDVtXCIsIC8vIHBpbmtcbiAgXCJcXHgxYlszODs1OzIxMG1cIiwgLy8gcGVhY2h5XG4gIFwiXFx4MWJbMzg7NTsyMTdtXCIsIC8vIHNhbG1vblxuICBcIlxceDFiWzM4OzU7MjE2bVwiLCAvLyBsaWdodCBjb3JhbFxuICBcIlxceDFiWzM4OzU7MjI0bVwiLCAvLyBsaWdodCBwZWFjaFxuICBcIlxceDFiWzM4OzU7MjMwbVwiLCAvLyBzb2Z0IGNyZWFtXG4gIFwiXFx4MWJbMzg7NTsyMzBtXCIsIC8vIHNvZnQgY3JlYW1cbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW50cyBhIHN0eWxlZCBiYW5uZXIgdG8gdGhlIGNvbnNvbGUuXG4gKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYW5kIHByaW50cyBhIGNvbG9yZnVsIEFTQ0lJIGFydCBiYW5uZXIgd2l0aCBhIHJhbmRvbSBzbG9nYW4uXG4gKiBAcGFyYW0ge0xvZ2dlcn0gW2xvZ2dlcl0gLSBPcHRpb25hbCBsb2dnZXIgZm9yIHZlcmJvc2Ugb3V0cHV0LlxuICogQGZ1bmN0aW9uIHByaW50QmFubmVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IHByaW50QmFubmVyXG4gKiAgIHBhcnRpY2lwYW50IGdldFNsb2dhblxuICogICBwYXJ0aWNpcGFudCBwYWRFbmRcbiAqICAgcGFydGljaXBhbnQgY29uc29sZVxuICogICBwcmludEJhbm5lci0+PmdldFNsb2dhbjogQ2FsbCBnZXRTbG9nYW4oKVxuICogICBnZXRTbG9nYW4tLT4+cHJpbnRCYW5uZXI6IFJldHVybiByYW5kb20gc2xvZ2FuXG4gKiAgIHByaW50QmFubmVyLT4+cHJpbnRCYW5uZXI6IENyZWF0ZSBiYW5uZXIgQVNDSUkgYXJ0XG4gKiAgIHByaW50QmFubmVyLT4+cHJpbnRCYW5uZXI6IFNwbGl0IGJhbm5lciBpbnRvIGxpbmVzXG4gKiAgIHByaW50QmFubmVyLT4+cHJpbnRCYW5uZXI6IENhbGN1bGF0ZSBtYXggbGluZSBsZW5ndGhcbiAqICAgcHJpbnRCYW5uZXItPj5wYWRFbmQ6IENhbGwgcGFkRW5kIHdpdGggc2xvZ2FuXG4gKiAgIHBhZEVuZC0tPj5wcmludEJhbm5lcjogUmV0dXJuIHBhZGRlZCBzbG9nYW4gbGluZVxuICogICBsb29wIEZvciBlYWNoIGJhbm5lciBsaW5lXG4gKiAgICAgcHJpbnRCYW5uZXItPj5zdHlsZTogQ2FsbCBzdHlsZShsaW5lKVxuICogICAgIHN0eWxlLS0+PnByaW50QmFubmVyOiBSZXR1cm4gc3R5bGVkIGxpbmVcbiAqICAgICBwcmludEJhbm5lci0+PmNvbnNvbGU6IExvZyBzdHlsZWQgbGluZVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50QmFubmVyKGxvZ2dlcj86IExvZ2dlcikge1xuICBjb25zdCBtZXNzYWdlID0gZ2V0U2xvZ2FuKCk7XG4gIGNvbnN0IGJhbm5lcjogc3RyaW5nIHwgc3RyaW5nW10gPVxuICAgIGAjICAgICAgICAgICAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEgICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgXG4jICAgICAgKCAoICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIFxuIyAgICAgICApICkgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgXG4jICAgIFs9PT09PT09XSAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICBcbiMgICAgIFxcYC0tLS0twrQgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRIFxuIyAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSBcbiMgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICBcbiNgLnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBtYXhMZW5ndGggPSBiYW5uZXIucmVkdWNlKChtYXgsIGxpbmUpID0+IE1hdGgubWF4KG1heCwgbGluZS5sZW5ndGgpLCAwKTtcbiAgYmFubmVyLnB1c2goYCMgICR7bWVzc2FnZS5wYWRTdGFydChtYXhMZW5ndGggLSAzKX1gKTtcbiAgYmFubmVyLmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XG4gICAgKGxvZ2dlciA/IGxvZ2dlci5pbmZvLmJpbmQobG9nZ2VyKSA6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkpKFxuICAgICAgc3R5bGUobGluZSB8fCBcIlwiKS5yYXcoY29sb3JzW2luZGV4XSkudGV4dFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBzbG9nYW4gZnJvbSB0aGUgcHJlZGVmaW5lZCBsaXN0LlxuICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJhbmRvbSBzbG9nYW4gb3IgYSBzcGVjaWZpYyBvbmUgYnkgaW5kZXggZnJvbSB0aGUgc2xvZ2FucyBsaXN0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpXSAtIE9wdGlvbmFsIGluZGV4IHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgc2xvZ2FuLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2VsZWN0ZWQgc2xvZ2FuLlxuICogQGZ1bmN0aW9uIGdldFNsb2dhblxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBnZXRTbG9nYW5cbiAqICAgcGFydGljaXBhbnQgTWF0aC5yYW5kb21cbiAqICAgcGFydGljaXBhbnQgc2xvZ2Fuc1xuICogICBhbHQgaSBpcyB1bmRlZmluZWRcbiAqICAgICBnZXRTbG9nYW4tPj5NYXRoLnJhbmRvbTogR2VuZXJhdGUgcmFuZG9tIGluZGV4XG4gKiAgICAgTWF0aC5yYW5kb20tLT4+Z2V0U2xvZ2FuOiBSZXR1cm4gcmFuZG9tIGluZGV4XG4gKiAgIGVsc2UgaSBpcyBkZWZpbmVkXG4gKiAgICAgTm90ZSBvdmVyIGdldFNsb2dhbjogVXNlIHByb3ZpZGVkIGluZGV4XG4gKiAgIGVuZFxuICogICBnZXRTbG9nYW4tPj5zbG9nYW5zOiBBY2Nlc3Mgc2xvZ2FuIGF0IGluZGV4XG4gKiAgIHNsb2dhbnMtLT4+Z2V0U2xvZ2FuOiBSZXR1cm4gc2xvZ2FuXG4gKiAgIGFsdCBFcnJvciBvY2N1cnNcbiAqICAgICBnZXRTbG9nYW4tPj5nZXRTbG9nYW46IFRocm93IGVycm9yXG4gKiAgIGVuZFxuICogICBnZXRTbG9nYW4tLT4+Q2FsbGVyOiBSZXR1cm4gc2xvZ2FuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTbG9nYW4oaT86IG51bWJlcik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgaSA9XG4gICAgICB0eXBlb2YgaSA9PT0gXCJ1bmRlZmluZWRcIiA/IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHNsb2dhbnMubGVuZ3RoKSA6IGk7XG4gICAgcmV0dXJuIHNsb2dhbnNbaV0uU2xvZ2FuO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJldHJpZXZlIHNsb2dhbnM6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGZ1bmN0aW9uIGlzQnJvd3NlclxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyIGJ5IGNoZWNraW5nIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBAc3VtbWFyeSBDaGVja3MgaWYgdGhlIGNvZGUgaXMgcnVubmluZyBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWxUaGlzKSkgIT09XG4gICAgT2JqZWN0LnByb3RvdHlwZVxuICApO1xufVxuIiwiaW1wb3J0IHsgdG9FTlZGb3JtYXQgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBFbnZpcm9ubWVudEZhY3RvcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSBcIi4vd2ViXCI7XG5pbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCJ0eXBlZC1vYmplY3QtYWNjdW11bGF0b3JcIjtcblxuLyoqXG4gKiBAY2xhc3MgRW52aXJvbm1lbnRcbiAqIEBleHRlbmRzIHtPYmplY3RBY2N1bXVsYXRvcjxUPn1cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAZGVzY3JpcHRpb24gQSBjbGFzcyByZXByZXNlbnRpbmcgYW4gZW52aXJvbm1lbnQgd2l0aCBhY2N1bXVsYXRpb24gY2FwYWJpbGl0aWVzLlxuICogQHN1bW1hcnkgTWFuYWdlcyBlbnZpcm9ubWVudC1yZWxhdGVkIGRhdGEgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGFjY3VtdWxhdGlvbiBhbmQga2V5IHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7VH0gW2luaXRpYWxEYXRhXSAtIFRoZSBpbml0aWFsIGRhdGEgdG8gcG9wdWxhdGUgdGhlIGVudmlyb25tZW50IHdpdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudDxUIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIE9iamVjdEFjY3VtdWxhdG9yPFQ+IHtcbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByb3RlY3RlZFxuICAgKiBAZGVzY3JpcHRpb24gQSBmYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBFbnZpcm9ubWVudCBpbnN0YW5jZXMuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgaG93IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEVudmlyb25tZW50IGNsYXNzIHNob3VsZCBiZSBjcmVhdGVkLlxuICAgKiBAcmV0dXJuIHtFbnZpcm9ubWVudDxhbnk+fSBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZhY3Rvcnk6IEVudmlyb25tZW50RmFjdG9yeTxhbnksIGFueT4gPVxuICAgICgpOiBFbnZpcm9ubWVudDxhbnk+ID0+IG5ldyBFbnZpcm9ubWVudCgpO1xuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBwcml2YXRlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICogQHR5cGUge0Vudmlyb25tZW50PGFueT59XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEVudmlyb25tZW50PGFueT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZnJvbUVudihrOiBzdHJpbmcpIHtcbiAgICBsZXQgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgIGVudiA9IChnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYgeyBFTlY6IFJlY29yZDxzdHJpbmcsIGFueT4gfSlbXG4gICAgICAgIFwiRU5WXCJcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9IGdsb2JhbFRoaXMucHJvY2Vzcy5lbnY7XG4gICAgICBrID0gdG9FTlZGb3JtYXQoayk7XG4gICAgfVxuICAgIHJldHVybiBlbnZba107XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZXhwYW5kPFYgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWKTogdm9pZCB7XG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGssIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbUVudiA9IHRoaXMuZnJvbUVudihrKTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGZyb21FbnYgPT09IFwidW5kZWZpbmVkXCIgPyB2IDogZnJvbUVudjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAodmFsOiBWW2tleW9mIFZdKSA9PiB7XG4gICAgICAgICAgdiA9IHZhbDtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgY3JlYXRlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MgZXhpc3RzLlxuICAgKiBAdGVtcGxhdGUgRVxuICAgKiBAcGFyYW0gey4uLnVua25vd25bXX0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGlmIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0V9IFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBpbnN0YW5jZTxFIGV4dGVuZHMgRW52aXJvbm1lbnQ8YW55Pj4oLi4uYXJnczogdW5rbm93bltdKTogRSB7XG4gICAgRW52aXJvbm1lbnQuX2luc3RhbmNlID0gIUVudmlyb25tZW50Ll9pbnN0YW5jZVxuICAgICAgPyBFbnZpcm9ubWVudC5mYWN0b3J5KC4uLmFyZ3MpXG4gICAgICA6IEVudmlyb25tZW50Ll9pbnN0YW5jZTtcbiAgICByZXR1cm4gRW52aXJvbm1lbnQuX2luc3RhbmNlIGFzIEU7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gQWNjdW11bGF0ZXMgdGhlIGdpdmVuIHZhbHVlIGludG8gdGhlIGVudmlyb25tZW50LlxuICAgKiBAc3VtbWFyeSBBZGRzIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZSBlbnZpcm9ubWVudCBmcm9tIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gICAqIEB0ZW1wbGF0ZSBWXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBUaGUgb2JqZWN0IHRvIGFjY3VtdWxhdGUgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEByZXR1cm4ge1Z9IFRoZSB1cGRhdGVkIGVudmlyb25tZW50IGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGFjY3VtdWxhdGU8ViBleHRlbmRzIG9iamVjdD4oXG4gICAgdmFsdWU6IFZcbiAgKTogdHlwZW9mIEVudmlyb25tZW50Ll9pbnN0YW5jZSAmXG4gICAgViAmXG4gICAgT2JqZWN0QWNjdW11bGF0b3I8dHlwZW9mIEVudmlyb25tZW50Ll9pbnN0YW5jZSAmIFY+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IEVudmlyb25tZW50Lmluc3RhbmNlKCk7XG4gICAgcmV0dXJuIGluc3RhbmNlLmFjY3VtdWxhdGUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUga2V5cyBvZiB0aGUgZW52aXJvbm1lbnQsIG9wdGlvbmFsbHkgY29udmVydGluZyB0aGVtIHRvIEVOViBmb3JtYXQuXG4gICAqIEBzdW1tYXJ5IEdldHMgYWxsIGtleXMgaW4gdGhlIGVudmlyb25tZW50LCB3aXRoIGFuIG9wdGlvbiB0byBmb3JtYXQgdGhlbSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0b0Vudj10cnVlXSAtIFdoZXRoZXIgdG8gY29udmVydCB0aGUga2V5cyB0byBFTlYgZm9ybWF0LlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2Yga2V5cyBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAgICovXG4gIHN0YXRpYyBrZXlzKHRvRW52OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnQuaW5zdGFuY2UoKVxuICAgICAgLmtleXMoKVxuICAgICAgLm1hcCgoaykgPT4gKHRvRW52ID8gdG9FTlZGb3JtYXQoaykgOiBrKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBhcnNlQXJnc1Jlc3VsdCB9IGZyb20gXCIuLi9pbnB1dC90eXBlc1wiO1xuaW1wb3J0IHsgQ29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgVXNlcklucHV0IH0gZnJvbSBcIi4uL2lucHV0L2lucHV0XCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZXBlbmRlbmNpZXMsIGdldFBhY2thZ2VWZXJzaW9uIH0gZnJvbSBcIi4uL3V0aWxzL2ZzXCI7XG5pbXBvcnQgeyBwcmludEJhbm5lciB9IGZyb20gXCIuLi9vdXRwdXQvY29tbW9uXCI7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gXCIuLi91dGlscy9lbnZpcm9ubWVudFwiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIExvZ2dlcixcbiAgTG9nZ2luZyxcbiAgTG9nZ2luZ0NvbmZpZyxcbiAgTG9nTGV2ZWwsXG59IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBjbGFzcyBDb21tYW5kXG4gKiBAYWJzdHJhY3RcbiAqIEB0ZW1wbGF0ZSBJIC0gVGhlIHR5cGUgb2YgaW5wdXQgb3B0aW9ucyBmb3IgdGhlIGNvbW1hbmQuXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgY29tbWFuZCBleGVjdXRpb24uXG4gKiBAbWVtYmVyT2YgdXRpbHMvY2xpXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZCBpbXBsZW1lbnRhdGlvbi5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGNvbW1hbmRzIHdpdGggaW5wdXQgaGFuZGxpbmcsIGxvZ2dpbmcsIGFuZCBleGVjdXRpb24gZmxvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICogQHBhcmFtIHtDb21tYW5kT3B0aW9uczxJPn0gW2lucHV0c10gLSBUaGUgaW5wdXQgb3B0aW9ucyBmb3IgdGhlIGNvbW1hbmQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbcmVxdWlyZW1lbnRzXSAtIFRoZSBsaXN0IG9mIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBmb3IgdGhlIGNvbW1hbmQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21tYW5kPEksIFI+IHtcbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBsb2dnZXIgZm9yIHRoZSBDb21tYW5kIGNsYXNzLlxuICAgKiBAdHlwZSB7TG9nZ2VyfVxuICAgKi9cbiAgc3RhdGljIGxvZzogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBJbnN0YW5jZSBsb2dnZXIgZm9yIHRoZSBjb21tYW5kLlxuICAgKiBAdHlwZSB7TG9nZ2VyfVxuICAgKi9cbiAgcHJvdGVjdGVkIGxvZzogTG9nZ2VyO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgbmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBpbnB1dHM6IENvbW1hbmRPcHRpb25zPEk+ID0ge30gYXMgdW5rbm93biBhcyBDb21tYW5kT3B0aW9uczxJPixcbiAgICBwcm90ZWN0ZWQgcmVxdWlyZW1lbnRzOiBzdHJpbmdbXSA9IFtdXG4gICkge1xuICAgIGlmICghQ29tbWFuZC5sb2cpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21tYW5kLCBcImxvZ1wiLCB7XG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IExvZ2dpbmcuZm9yKENvbW1hbmQubmFtZSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMubG9nID0gQ29tbWFuZC5sb2c7XG4gICAgfVxuICAgIHRoaXMubG9nID0gQ29tbWFuZC5sb2cuZm9yKHRoaXMubmFtZSk7XG4gICAgdGhpcy5pbnB1dHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsXG4gICAgICBpbnB1dHNcbiAgICApIGFzIENvbW1hbmRPcHRpb25zPEk+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGFzeW5jXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBhcmUgcHJlc2VudC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBhbmQgY29tcGFyZXMgaXQgYWdhaW5zdCB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqICAgcGFydGljaXBhbnQgZ2V0RGVwZW5kZW5jaWVzXG4gICAqICAgcGFydGljaXBhbnQgU2V0XG4gICAqICAgQ29tbWFuZC0+PmdldERlcGVuZGVuY2llczogQ2FsbFxuICAgKiAgIGdldERlcGVuZGVuY2llcy0tPj5Db21tYW5kOiBSZXR1cm4ge3Byb2QsIGRldiwgcGVlcn1cbiAgICogICBDb21tYW5kLT4+U2V0OiBDcmVhdGUgU2V0IGZyb20gcHJvZCwgZGV2LCBwZWVyXG4gICAqICAgU2V0LS0+PkNvbW1hbmQ6IFJldHVybiB1bmlxdWUgZGVwZW5kZW5jaWVzXG4gICAqICAgQ29tbWFuZC0+PkNvbW1hbmQ6IENvbXBhcmUgYWdhaW5zdCByZXF1aXJlbWVudHNcbiAgICogICBhbHQgTWlzc2luZyBkZXBlbmRlbmNpZXNcbiAgICogICAgIENvbW1hbmQtPj5Db21tYW5kOiBBZGQgdG8gbWlzc2luZyBsaXN0XG4gICAqICAgZW5kXG4gICAqICAgTm90ZSBvdmVyIENvbW1hbmQ6IElmIG1pc3NpbmcubGVuZ3RoID4gMCwgaGFuZGxlIG1pc3NpbmcgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tSZXF1aXJlbWVudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBwcm9kLCBkZXYsIHBlZXIgfSA9IGF3YWl0IGdldERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBbXTtcbiAgICBjb25zdCBmdWxsTGlzdCA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFsuLi5wcm9kLCAuLi5kZXYsIC4uLnBlZXJdKS52YWx1ZXMoKVxuICAgICkubWFwKChkKSA9PiBkLm5hbWUpO1xuICAgIGZvciAoY29uc3QgZGVwIG9mIHRoaXMucmVxdWlyZW1lbnRzKVxuICAgICAgaWYgKCFmdWxsTGlzdC5pbmNsdWRlcyhkZXApKSBtaXNzaW5nLnB1c2goZGVwKTtcblxuICAgIGlmICghbWlzc2luZy5sZW5ndGgpIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gZGVyaXZlZCBjbGFzc2VzIHRvIHByb3ZpZGUgc3BlY2lmaWMgaGVscCBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtQYXJzZUFyZ3NSZXN1bHR9IGFyZ3MgLSBUaGUgcGFyc2VkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgaGVscChhcmdzOiBQYXJzZUFyZ3NSZXN1bHQpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBUaGlzIGlzIGhlbHAuIEknbSBubyB1c2UgYmVjYXVzZSBJIHNob3VsZCBoYXZlIGJlZW4gb3ZlcnJpZGRlbi5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgY29tbWFuZCB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZGVmaW5lIHRoZSBjb21tYW5kJ3MgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhbnN3ZXJzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSIHwgc3RyaW5nIHwgdm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQncyByZXN1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcnVuPFI+KFxuICAgIGFuc3dlcnM6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiBJXTogdW5rbm93biB9XG4gICk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAYXN5bmNcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBjb21tYW5kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBvdmVyYWxsIGV4ZWN1dGlvbiBmbG93IG9mIHRoZSBjb21tYW5kLCBpbmNsdWRpbmcgcGFyc2luZyBhcmd1bWVudHMsXG4gICAqIHNldHRpbmcgdXAgbG9nZ2luZywgY2hlY2tpbmcgZm9yIHZlcnNpb24gb3IgaGVscCByZXF1ZXN0cywgYW5kIHJ1bm5pbmcgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFIgfCBzdHJpbmcgfCB2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCdzIHJlc3VsdC5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ29tbWFuZFxuICAgKiAgIHBhcnRpY2lwYW50IFVzZXJJbnB1dFxuICAgKiAgIHBhcnRpY2lwYW50IExvZ2dpbmdcbiAgICogICBwYXJ0aWNpcGFudCBnZXRQYWNrYWdlVmVyc2lvblxuICAgKiAgIHBhcnRpY2lwYW50IHByaW50QmFubmVyXG4gICAqICAgQ29tbWFuZC0+PlVzZXJJbnB1dDogcGFyc2VBcmdzKGlucHV0cylcbiAgICogICBVc2VySW5wdXQtLT4+Q29tbWFuZDogUmV0dXJuIFBhcnNlQXJnc1Jlc3VsdFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBQcm9jZXNzIG9wdGlvbnNcbiAgICogICBDb21tYW5kLT4+TG9nZ2luZzogc2V0Q29uZmlnKG9wdGlvbnMpXG4gICAqICAgYWx0IHZlcnNpb24gcmVxdWVzdGVkXG4gICAqICAgICBDb21tYW5kLT4+Z2V0UGFja2FnZVZlcnNpb246IENhbGxcbiAgICogICAgIGdldFBhY2thZ2VWZXJzaW9uLS0+PkNvbW1hbmQ6IFJldHVybiB2ZXJzaW9uXG4gICAqICAgZWxzZSBoZWxwIHJlcXVlc3RlZFxuICAgKiAgICAgQ29tbWFuZC0+PkNvbW1hbmQ6IGhlbHAoYXJncylcbiAgICogICBlbHNlIGJhbm5lciByZXF1ZXN0ZWRcbiAgICogICAgIENvbW1hbmQtPj5wcmludEJhbm5lcjogQ2FsbFxuICAgKiAgIGVuZFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBydW4oYXJncylcbiAgICogICBhbHQgZXJyb3Igb2NjdXJzXG4gICAqICAgICBDb21tYW5kLT4+Q29tbWFuZDogTG9nIGVycm9yXG4gICAqICAgZW5kXG4gICAqICAgQ29tbWFuZC0tPj5Db21tYW5kOiBSZXR1cm4gcmVzdWx0XG4gICAqL1xuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzOiBQYXJzZUFyZ3NSZXN1bHQgPSBVc2VySW5wdXQucGFyc2VBcmdzKHRoaXMuaW5wdXRzKTtcbiAgICBjb25zdCBlbnYgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKERlZmF1bHRMb2dnaW5nQ29uZmlnKVxuICAgICAgLmFjY3VtdWxhdGUoRGVmYXVsdENvbW1hbmRWYWx1ZXMpXG4gICAgICAuYWNjdW11bGF0ZShhcmdzLnZhbHVlcyk7XG4gICAgY29uc3QgeyB0aW1lc3RhbXAsIHZlcmJvc2UsIHZlcnNpb24sIGhlbHAsIGxvZ0xldmVsLCBsb2dTdHlsZSwgYmFubmVyIH0gPVxuICAgICAgZW52O1xuXG4gICAgdGhpcy5sb2cuc2V0Q29uZmlnKHtcbiAgICAgIC4uLmVudixcbiAgICAgIHRpbWVzdGFtcDogISF0aW1lc3RhbXAsXG4gICAgICBsZXZlbDogbG9nTGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICBzdHlsZTogISFsb2dTdHlsZSxcbiAgICAgIHZlcmJvc2U6ICh2ZXJib3NlIGFzIG51bWJlcikgfHwgMCxcbiAgICB9KTtcblxuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZ2V0UGFja2FnZVZlcnNpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoaGVscCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGVscChhcmdzKTtcbiAgICB9XG5cbiAgICBpZiAoYmFubmVyKVxuICAgICAgcHJpbnRCYW5uZXIoXG4gICAgICAgIHRoaXMubG9nLmZvcihwcmludEJhbm5lciwge1xuICAgICAgICAgIHRpbWVzdGFtcDogZmFsc2UsXG4gICAgICAgICAgc3R5bGU6IGZhbHNlLFxuICAgICAgICAgIGNvbnRleHQ6IGZhbHNlLFxuICAgICAgICAgIGxvZ0xldmVsOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bihlbnYpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFcnJvciB3aGlsZSBydW5uaW5nIHByb3ZpZGVkIGNsaSBmdW5jdGlvbjogJHtlfWApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIFI7XG4gIH1cbn1cbiIsImltcG9ydCBodHRwcyBmcm9tIFwiaHR0cHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzaW1wbGUgSFRUUCBjbGllbnQgZm9yIGRvd25sb2FkaW5nIGZpbGVzLlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIGRvd25sb2FkIGZpbGVzIGZyb20gSFRUUFMgVVJMcy5cbiAqIEl0IHVzZXMgTm9kZS5qcyBidWlsdC1pbiBodHRwcyBtb2R1bGUgdG8gbWFrZSByZXF1ZXN0cy5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDbGllbnQge1xuICBwcm90ZWN0ZWQgc3RhdGljIGxvZyA9IExvZ2dpbmcuZm9yKEh0dHBDbGllbnQpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhIGZpbGUgZnJvbSBhIGdpdmVuIFVSTC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2VuZHMgYSBHRVQgcmVxdWVzdCB0byB0aGUgc3BlY2lmaWVkIFVSTCBhbmQgcmV0dXJucyB0aGUgcmVzcG9uc2UgYm9keSBhcyBhIHN0cmluZy5cbiAgICogSXQgaGFuZGxlcyBkaWZmZXJlbnQgc2NlbmFyaW9zIHN1Y2ggYXMgbm9uLTIwMCBzdGF0dXMgY29kZXMgYW5kIG5ldHdvcmsgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCBvZiB0aGUgZmlsZSB0byBkb3dubG9hZC5cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBmaWxlIGNvbnRlbnQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEh0dHBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBIVFRQU1xuICAgKiAgIHBhcnRpY2lwYW50IFNlcnZlclxuICAgKiAgIENsaWVudC0+Pkh0dHBDbGllbnQ6IGRvd25sb2FkRmlsZSh1cmwpXG4gICAqICAgSHR0cENsaWVudC0+PkhUVFBTOiBnZXQodXJsKVxuICAgKiAgIEhUVFBTLT4+U2VydmVyOiBHRVQgcmVxdWVzdFxuICAgKiAgIFNlcnZlci0tPj5IVFRQUzogUmVzcG9uc2VcbiAgICogICBIVFRQUy0tPj5IdHRwQ2xpZW50OiBSZXNwb25zZSBvYmplY3RcbiAgICogICBhbHQgU3RhdHVzIGNvZGUgaXMgMjAwXG4gICAqICAgICBsb29wIEZvciBlYWNoIGRhdGEgY2h1bmtcbiAgICogICAgICAgSFRUUFMtPj5IdHRwQ2xpZW50OiAnZGF0YScgZXZlbnRcbiAgICogICAgICAgSHR0cENsaWVudC0+Pkh0dHBDbGllbnQ6IEFjY3VtdWxhdGUgZGF0YVxuICAgKiAgICAgZW5kXG4gICAqICAgICBIVFRQUy0+Pkh0dHBDbGllbnQ6ICdlbmQnIGV2ZW50XG4gICAqICAgICBIdHRwQ2xpZW50LS0+PkNsaWVudDogUmVzb2x2ZSB3aXRoIGRhdGFcbiAgICogICBlbHNlIFN0YXR1cyBjb2RlIGlzIG5vdCAyMDBcbiAgICogICAgIEh0dHBDbGllbnQtLT4+Q2xpZW50OiBSZWplY3Qgd2l0aCBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRvd25sb2FkRmlsZSh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZnVuY3Rpb24gcmVxdWVzdCh1cmw6IHN0cmluZykge1xuICAgICAgICB1cmwgPSBlbmNvZGVVUkkodXJsKTtcbiAgICAgICAgaHR0cHMuZ2V0KHVybCwgKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDcpXG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdChyZXMuaGVhZGVycy5sb2NhdGlvbiBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICAgIEh0dHBDbGllbnQubG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoICR7dXJsfSAoc3RhdHVzOiAke3Jlcy5zdGF0dXNDb2RlfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICAgICAgICByZXMub24oXCJkYXRhXCIsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXMub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXF1ZXN0KHVybCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN0YW5kYXJkT3V0cHV0V3JpdGVyIH0gZnJvbSBcIi4vU3RhbmRhcmRPdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IFByb21pc2VFeGVjdXRvciB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHNwZWNpYWxpemVkIG91dHB1dCB3cml0ZXIgdGhhdCB1c2VzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gcHJvY2VzcyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIGV4dGVuZHMgU3RhbmRhcmRPdXRwdXRXcml0ZXIgdG8gcHJvdmlkZSByZWdleC1iYXNlZCBvdXRwdXQgcHJvY2Vzc2luZy5cbiAqIEl0IGFsbG93cyBmb3IgcGF0dGVybiBtYXRjaGluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgY2FuIHRyaWdnZXIgc3BlY2lmaWMgYWN0aW9uc1xuICogYmFzZWQgb24gbWF0Y2hlZCBwYXR0ZXJucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSByZXNvbHZlZCB2YWx1ZSwgZGVmYXVsdGluZyB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGxvY2sgLSBBIFByb21pc2VFeGVjdXRvciB0byBjb250cm9sIHRoZSBhc3luY2hyb25vdXMgZmxvdy5cbiAqIEBwYXJhbSByZWdleHAgLSBBIHN0cmluZyBvciBSZWdFeHAgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgb3V0cHV0LlxuICogQHBhcmFtIGZsYWdzIC0gT3B0aW9uYWwgZmxhZ3MgZm9yIHRoZSBSZWdFeHAgY29uc3RydWN0b3IuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdleHBPdXRwdXRXcml0ZXIgZXh0ZW5kcyBTdGFuZGFyZE91dHB1dFdyaXRlcjxzdHJpbmc+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIG1hdGNoaW5nIG91dHB1dC5cbiAgICogQHN1bW1hcnkgVGhpcyByZWFkb25seSBwcm9wZXJ0eSBzdG9yZXMgdGhlIGNvbXBpbGVkIFJlZ0V4cCB1c2VkIGZvciBwYXR0ZXJuIG1hdGNoaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZ2V4cDogUmVnRXhwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVnZXhwT3V0cHV0V3JpdGVyLlxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIHRoZSBSZWdleHBPdXRwdXRXcml0ZXIgd2l0aCBhIGxvY2sgbWVjaGFuaXNtIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGNtZFxuICAgKiBAcGFyYW0gbG9jayAtIEEgUHJvbWlzZUV4ZWN1dG9yIHRvIGNvbnRyb2wgdGhlIGFzeW5jaHJvbm91cyBmbG93LlxuICAgKiBAcGFyYW0gcmVnZXhwIC0gQSBzdHJpbmcgb3IgUmVnRXhwIHRvIG1hdGNoIGFnYWluc3QgdGhlIG91dHB1dC5cbiAgICogQHBhcmFtIGZsYWdzIC0gT3B0aW9uYWwgZmxhZ3MgZm9yIHRoZSBSZWdFeHAgY29uc3RydWN0b3IsIGRlZmF1bHRzIHRvIFwiZ1wiLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgY21kOiBzdHJpbmcsXG4gICAgbG9jazogUHJvbWlzZUV4ZWN1dG9yPHN0cmluZywgRXJyb3I+LFxuICAgIHJlZ2V4cDogc3RyaW5nIHwgUmVnRXhwLFxuICAgIGZsYWdzID0gXCJnXCJcbiAgKSB7XG4gICAgc3VwZXIoY21kLCBsb2NrKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZWdleHAgPVxuICAgICAgICB0eXBlb2YgcmVnZXhwID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChyZWdleHAsIGZsYWdzKSA6IHJlZ2V4cDtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyB0aGUgaW5wdXQgZGF0YSBhZ2FpbnN0IHRoZSBzdG9yZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIG9uIHRoZSBpbnB1dCBkYXRhIGFuZCByZXR1cm5zIHRoZSBtYXRjaCByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHN0cmluZyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZXhlY3V0aW9uLCBvciB1bmRlZmluZWQgaWYgYW4gZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0ZXN0KGRhdGE6IHN0cmluZykge1xuICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IDA7XG4gICAgbGV0IG1hdGNoO1xuICAgIHRyeSB7XG4gICAgICBtYXRjaCA9IHRoaXMucmVnZXhwLmV4ZWMoZGF0YSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZGVidWcoYEZhaWxlZCB0byBwYXJzZSBjaHVuazogJHtkYXRhfVxcbkVycm9yOiAke2V9IGApO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlc3RzIHRoZSBkYXRhIGFuZCByZXNvbHZlcyB0aGUgcHJvbWlzZSBpZiBhIG1hdGNoIGlzIGZvdW5kLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgdGVzdCBtZXRob2QgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggdGhlIGZpcnN0IG1hdGNoIGdyb3VwIGlmIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHN0cmluZyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICovXG4gIHByb3RlY3RlZCB0ZXN0QW5kUmVzb2x2ZShkYXRhOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGVzdChkYXRhKTtcbiAgICBpZiAobWF0Y2gpIHRoaXMucmVzb2x2ZShtYXRjaFswXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlc3RzIHRoZSBkYXRhIGFuZCByZWplY3RzIHRoZSBwcm9taXNlIGlmIGEgbWF0Y2ggaXMgZm91bmQuXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHRoZSB0ZXN0IG1ldGhvZCBhbmQgcmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBmaXJzdCBtYXRjaCBncm91cCBpZiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgdGVzdEFuZFJlamVjdChkYXRhOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGVzdChkYXRhKTtcbiAgICBpZiAobWF0Y2gpIHRoaXMucmVqZWN0KG1hdGNoWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGRhdGEgY2h1bmtzLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IGNsYXNzIGRhdGEgbWV0aG9kIGFuZCB0aGVuIHRlc3RzIHRoZSBkYXRhIGZvciBhIG1hdGNoIHRvIHBvdGVudGlhbGx5IHJlc29sdmUgdGhlIHByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBkYXRhIGNodW5rIHRvIHByb2Nlc3MuXG4gICAqL1xuICBvdmVycmlkZSBkYXRhKGNodW5rOiBhbnkpIHtcbiAgICBzdXBlci5kYXRhKGNodW5rKTtcbiAgICB0aGlzLnRlc3RBbmRSZXNvbHZlKFN0cmluZyhjaHVuaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgZXJyb3IgY2h1bmtzLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IGNsYXNzIGVycm9yIG1ldGhvZCBhbmQgdGhlbiB0ZXN0cyB0aGUgZGF0YSBmb3IgYSBtYXRjaCB0byBwb3RlbnRpYWxseSByZWplY3QgdGhlIHByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBlcnJvciBjaHVuayB0byBwcm9jZXNzLlxuICAgKi9cbiAgb3ZlcnJpZGUgZXJyb3IoY2h1bms6IGFueSkge1xuICAgIHN1cGVyLmVycm9yKGNodW5rKTtcbiAgICB0aGlzLnRlc3RBbmRSZWplY3QoU3RyaW5nKGNodW5rKSk7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2NsaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL291dHB1dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dyaXRlcnNcIjtcblxuLyoqXG4gKiBAbW9kdWxlIEBkZWNhZi10cy91dGlsc1xuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYSBsaWdodCB2ZXJzaW9uIG9mIERlY2FmIENMSSB0b29sLCBwcm92aWRpbmcgYSBjb21wcmVoZW5zaXZlIHNldCBvZiB1dGlsaXRpZXNcbiAqIGFuZCBmdW5jdGlvbmFsaXRpZXMgZm9yIGNvbW1hbmQtbGluZSBpbnRlcmZhY2Ugb3BlcmF0aW9ucy4gSXQgZW5jb21wYXNzZXMgc2V2ZXJhbCBrZXkgY29tcG9uZW50czpcbiAqXG4gKiAxLiBJbnB1dCBIYW5kbGluZzogTWFuYWdlcyB1c2VyIGlucHV0IGFuZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHByb2Nlc3NpbmcuXG4gKiAyLiBVdGlsaXR5IEZ1bmN0aW9uczogT2ZmZXJzIGEgY29sbGVjdGlvbiBvZiBoZWxwZXIgZnVuY3Rpb25zIGFuZCBjb25zdGFudHMgZm9yIHZhcmlvdXMgb3BlcmF0aW9ucy5cbiAqIDMuIFR5cGUgRGVmaW5pdGlvbnM6IERlZmluZXMgY3VzdG9tIHR5cGVzIGFuZCBpbnRlcmZhY2VzIHVzZWQgdGhyb3VnaG91dCB0aGUgbW9kdWxlLlxuICogNC4gT3V0cHV0IE1hbmFnZW1lbnQ6IFByb3ZpZGVzIGRpZmZlcmVudCBvdXRwdXQgd3JpdGluZyBzdHJhdGVnaWVzIGZvciBmbGV4aWJsZSBjb25zb2xlIG91dHB1dCBoYW5kbGluZy5cbiAqXG4gKiBUaGUgbW9kdWxlIGlzIGRlc2lnbmVkIHRvIGZhY2lsaXRhdGUgdGhlIGNyZWF0aW9uIG9mIHJvYnVzdCBDTEkgYXBwbGljYXRpb25zIGJ5IG9mZmVyaW5nOlxuICogLSBTdGFuZGFyZGl6ZWQgaW5wdXQgcGFyc2luZyBhbmQgdmFsaWRhdGlvblxuICogLSBDb25zaXN0ZW50IG91dHB1dCBmb3JtYXR0aW5nIGFuZCBoYW5kbGluZ1xuICogLSBSZXVzYWJsZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgY29tbW9uIENMSSB0YXNrc1xuICogLSBFeHRlbnNpYmxlIGFyY2hpdGVjdHVyZSBmb3IgYWRkaW5nIG5ldyBjb21tYW5kcyBhbmQgZmVhdHVyZXNcbiAqXG4gKiBJdCBzdXBwb3J0cyB2YXJpb3VzIG91dHB1dCBtb2RlcywgaW5jbHVkaW5nIHN0YW5kYXJkIGNvbnNvbGUgb3V0cHV0IGFuZCByZWd1bGFyIGV4cHJlc3Npb24tYmFzZWQgb3V0cHV0LFxuICogYWxsb3dpbmcgZm9yIHZlcnNhdGlsZSBkYXRhIHByZXNlbnRhdGlvbiBhbmQgcHJvY2Vzc2luZy4gVGhlIG1vZHVsYXIgc3RydWN0dXJlIGVuYWJsZXMgZWFzeSBtYWludGVuYW5jZVxuICogYW5kIGV4dGVuc2lvbiBvZiB0aGUgQ0xJIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZGV2ZWxvcGVycyBidWlsZGluZyBjb21wbGV4IGNvbW1hbmQtbGluZSB0b29scyB0aGF0IHJlcXVpcmVcbiAqIHN0cnVjdHVyZWQgaW5wdXQgaGFuZGxpbmcsIGZsZXhpYmxlIG91dHB1dCBmb3JtYXR0aW5nLCBhbmQgYSByaWNoIHNldCBvZiB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFRoaXMgY29uc3RhbnQgc3RvcmVzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgQGFzZGFzZGFzZC91dGlscyBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcyxcbiAqIHdpdGggdGhlIHBsYWNlaG9sZGVyIFwiIyNWRVJTSU9OIyNcIiBiZWluZyBzdWJzdGl0dXRlZCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24uXG4gKlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6QGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFnQkE7Ozs7Ozs7Ozs7OztBQVlHO01BQ1UsU0FBUyxD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eEMsSUFBSSxDQUFDLEdBQUcsQ0FDTixRQUFRLEVBQ1IsQ0FBeUIsc0JBQUEsRUFBQSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFFLENBQUEsQ0FDckk7QUFDRCxRQUFBLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFNLENBQUM7O2FBQ2xEO1lBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7OztBQUkzRTs7Ozs7O0FBTUc7QUFDSCxJQUFBLFlBQVksQ0FBQyxPQUEwQixFQUFBO0FBQ3JDLFFBQUEsT0FBTyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU87UUFDcEUsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUM1QixRQUFBLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFHdkM7Ozs7O0FBS0c7QUFDTyxJQUFBLE9BQU8sQ0FBQyxNQUFTLEVBQUE7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FDTixRQUFRLEVBQ1IsQ0FBRyxFQUFBLElBQUksQ0FBQyxHQUFHLENBQTJCLHdC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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlhQTs7O0FBR0c7QUFDSCxNQUFNLE1BQU0sR0FBRztBQUNiLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0FBQ2hCLElBQUEsZ0JBQWdCO0NBQ2pCO0FBRUQ7Ozs7Ozs7Ozs7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