@decaf-ts/for-typeorm 0.0.8 → 0.0.9

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.
@@ -2592,7 +2592,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2592
2592
  * @const VERSION
2593
2593
  * @memberOf module:for-typeorm
2594
2594
  */
2595
- const VERSION = "0.0.8";
2595
+ const VERSION = "0.0.9";
2596
2596
 
2597
2597
  exports.IndexError = IndexError;
2598
2598
  exports.TypeORMAdapter = TypeORMAdapter;
@@ -2595,7 +2595,7 @@ TypeORMAdapter.decoration();
2595
2595
  * @const VERSION
2596
2596
  * @memberOf module:for-typeorm
2597
2597
  */
2598
- const VERSION = "0.0.8";
2598
+ const VERSION = "0.0.9";
2599
2599
 
2600
2600
  export { IndexError, SQLOperator, TypeORMAdapter, TypeORMConst, TypeORMDispatch, TypeORMFlavour, TypeORMGroupOperator, TypeORMKeys, TypeORMOperator, TypeORMPaginator, TypeORMQueryLimit, TypeORMRepository, TypeORMSequence, TypeORMStatement, VERSION, convertJsRegexToPostgres, createdByOnPostgresCreateUpdate, generateIndexes, reservedAttributes, translateOperators };
2601
2601
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9lcnJvcnMudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvcXVlcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyIsIi4uL3NyYy9xdWVyeS90cmFuc2xhdGUudHMiLCIuLi9zcmMvcXVlcnkvU3RhdGVtZW50LnRzIiwiLi4vc3JjL3NlcXVlbmNlcy9TZXF1ZW5jZS50cyIsIi4uL3NyYy9pbmRleGVzL2dlbmVyYXRvci50cyIsIi4uL3NyYy9UeXBlT1JNUmVwb3NpdG9yeS50cyIsIi4uL3NyYy9UeXBlT1JNRXZlbnRTdWJzY3JpYmVyLnRzIiwiLi4vc3JjL1R5cGVPUk1EaXNwYXRjaC50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvdXRpbHMudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL0NvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvVXBkYXRlRGF0ZUNvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ3JlYXRlRGF0ZUNvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvT2JqZWN0VXRpbHMudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW4udHMiLCIuLi9zcmMvb3ZlcnJpZGVzL1ByaW1hcnlDb2x1bW4udHMiLCIuLi9zcmMvb3ZlcnJpZGVzL0VudGl0eS50cyIsIi4uL3NyYy9UeXBlT1JNQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWRlbnRpZnkgcmVzZXJ2ZWQgYXR0cmlidXRlcyBmb3IgU1FMIGNvbnRleHRzLlxuICogQHN1bW1hcnkgTWF0Y2hlcyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIFNRTCByZXNlcnZlZCBrZXl3b3JkcyB0byBwcmV2ZW50IGludmFsaWQgc2NoZW1hIG9yIHF1ZXJ5IGdlbmVyYXRpb24uXG4gKiBAY29uc3QgcmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXMgPVxuICAvXihzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8aW5zZXJ0fHVwZGF0ZXxkZWxldGV8ZHJvcHxjcmVhdGV8dGFibGV8aW5kZXh8cHJpbWFyeXxrZXl8Zm9yZWlnbnxyZWZlcmVuY2VzfGNvbnN0cmFpbnR8dW5pcXVlfGNoZWNrfGRlZmF1bHR8bnVsbHxub3R8YXN8b3JkZXJ8Ynl8Z3JvdXB8aGF2aW5nfGxpbWl0fG9mZnNldHxqb2lufGlubmVyfG91dGVyfGxlZnR8cmlnaHR8ZnVsbHxvbnx1c2luZ3x2YWx1ZXN8cmV0dXJuaW5nfHNldHxpbnRvfGNhc2V8d2hlbnx0aGVufGVsc2V8ZW5kfGNhc3R8Y29hbGVzY2V8ZXhpc3RzfGFueXxhbGx8c29tZXxpbnxiZXR3ZWVufGxpa2V8aWxpa2V8c2ltaWxhcnx0b3xpc3x0cnVlfGZhbHNlfGFzY3xkZXNjfGRpc3RpbmN0fHVuaW9ufGludGVyc2VjdHxleGNlcHR8bmF0dXJhbHxsYXRlcmFsfHdpbmRvd3xvdmVyfHBhcnRpdGlvbnxyYW5nZXxyb3dzfHVuYm91bmRlZHxwcmVjZWRpbmd8Zm9sbG93aW5nfGN1cnJlbnR8cm93fHdpdGh8cmVjdXJzaXZlfG1hdGVyaWFsaXplZHx2aWV3fGZ1bmN0aW9ufHRyaWdnZXJ8cHJvY2VkdXJlfGxhbmd1YWdlfHJldHVybnN8cmV0dXJufGRlY2xhcmV8YmVnaW58Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHx0cmFuc2FjdGlvbnx0ZW1wb3Jhcnl8dGVtcHxpZnxsb29wfHdoaWxlfGZvcnxjb250aW51ZXxleGl0fHJhaXNlfGV4Y2VwdGlvbnxub3RpY2V8aW5mb3xsb2d8ZGVidWd8YXNzZXJ0fGV4ZWN1dGV8cGVyZm9ybXxnZXR8ZGlhZ25vc3RpY3N8Y2FsbHxkb3xhbGlhc3xjb21tZW50fHZhY3V1bXxhbmFseXplfGV4cGxhaW58Y29weXxncmFudHxyZXZva2V8cHJpdmlsZWdlc3xwdWJsaWN8dXNhZ2V8c2NoZW1hfHNlcXVlbmNlfG93bmVkfG93bmVyfHRhYmxlc3BhY2V8c3RvcmFnZXxpbmhlcml0c3x0eXBlfG9wZXJhdG9yfGNvbGxhdGV8Y29sbGF0aW9ufGNhc2NhZGV8cmVzdHJpY3R8YWRkfGFsdGVyfGNvbHVtbnxyZW5hbWV8dG98ZW5hYmxlfGRpc2FibGV8Zm9yY2V8bm98aW5zdGVhZHxvZnxiZWZvcmV8YWZ0ZXJ8ZWFjaHxzdGF0ZW1lbnR8cm93fGV4ZWN1dGV8YWxzb3xvbmx5fGV4Y2x1ZGV8bnVsbHN8b3RoZXJzfG9yZGluYWxpdHl8dGllc3xub3RoaW5nfGNhY2hlfGN5Y2xlfGluY3JlbWVudHxtaW52YWx1ZXxtYXh2YWx1ZXxzdGFydHxyZXN0YXJ0fGJ5fGNhbGxlZHxyZXR1cm5zfGxhbmd1YWdlfGltbXV0YWJsZXxzdGFibGV8dm9sYXRpbGV8c3RyaWN0fHNlY3VyaXR5fGRlZmluZXJ8aW52b2tlcnxjb3N0fHJvd3N8c3VwcG9ydHxoYW5kbGVyfGlubGluZXx2YWxpZGF0b3J8b3B0aW9uc3xzdG9yYWdlfGluaGVyaXRhbmNlfG9pZHN8d2l0aG91dHxkYXRhfGRpY3Rpb25hcnl8ZW5jb2Rpbmd8bGNfY29sbGF0ZXxsY19jdHlwZXxjb25uZWN0aW9ufGxpbWl0fHBhc3N3b3JkfHZhbGlkfHVudGlsfHN1cGVydXNlcnxub3N1cGVydXNlcnxjcmVhdGVkYnxub2NyZWF0ZWRifGNyZWF0ZXJvbGV8bm9jcmVhdGVyb2xlfGluaGVyaXR8bm9pbmhlcml0fGxvZ2lufG5vbG9naW58cmVwbGljYXRpb258bm9yZXBsaWNhdGlvbnxieXBhc3NybHN8bm9ieXBhc3NybHN8ZW5jcnlwdGVkfHVuZW5jcnlwdGVkfG5ld3xvbGR8c2Vzc2lvbl91c2VyfGN1cnJlbnRfdXNlcnxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8bG9jYWx0aW1lfGxvY2FsdGltZXN0YW1wfGN1cnJlbnRfZGF0YWJhc2V8aW5ldHxjaWRyfG1hY2FkZHJ8bWFjYWRkcjh8Yml0fHZhcmJpdHx0c3ZlY3Rvcnx0c3F1ZXJ5fHV1aWR8eG1sfGpzb258anNvbmJ8aW50fGludGVnZXJ8c21hbGxpbnR8YmlnaW50fGRlY2ltYWx8bnVtZXJpY3xyZWFsfGRvdWJsZXxwcmVjaXNpb258ZmxvYXR8Ym9vbGVhbnxib29sfGNoYXJ8Y2hhcmFjdGVyfHZhcmNoYXJ8dGV4dHxieXRlYXxkYXRlfHRpbWV8dGltZXN0YW1wfGludGVydmFsfHBvaW50fGxpbmV8bHNlZ3xib3h8cGF0aHxwb2x5Z29ufGNpcmNsZXxtb25leXx2b2lkKSQvaTtcblxuZXhwb3J0IGNvbnN0IFR5cGVPUk1GbGF2b3VyID0gXCJ0eXBlLW9ybVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaGFwZSBvZiB0aGUgVHlwZU9STUtleXMgY29uc3RhbnQuXG4gKiBAc3VtbWFyeSBEZXNjcmliZXMgdGhlIGtleXMgYW5kIHRoZWlyIG1lYW5pbmdzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEB0eXBlZGVmIFR5cGVPUk1LZXlzRGVmXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VQQVJBVE9SIFNlcGFyYXRvciB1c2VkIHRvIGpvaW4gdGFibGUgYW5kIGNvbHVtbiBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJRCBEZWZhdWx0IHByaW1hcnkga2V5IGZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVkVSU0lPTiBWZXJzaW9uIGZpZWxkIHVzZWQgZm9yIG9wdGltaXN0aWMgbG9ja2luZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUxFVEVEIFNvZnQtZGVsZXRlIHRpbWVzdGFtcCBmaWVsZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUQUJMRSBEYXRhYmFzZSB0YWJsZSBpZGVudGlmaWVyIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTQ0hFTUEgRGF0YWJhc2Ugc2NoZW1hIGlkZW50aWZpZXIga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUVVFTkNFIERhdGFiYXNlIHNlcXVlbmNlIG5hbWUga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOREVYIEluZGV4IGlkZW50aWZpZXIga2V5LlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgY29uc3RhbnRzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0YW50cyB0aGF0IGlkZW50aWZ5IGNvbW1vbiBkYXRhYmFzZSBwcm9wZXJ0aWVzIGFuZCBhZGFwdGVyLXNwZWNpZmljIGtleXMuXG4gKiBAY29uc3QgVHlwZU9STUtleXNcbiAqIEB0eXBlIHtUeXBlT1JNS2V5c0RlZn1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1LZXlzID0ge1xuICBTRVBBUkFUT1I6IFwiLlwiLFxuICBJRDogXCJpZFwiLFxuICBWRVJTSU9OOiBcInZlcnNpb25cIixcbiAgREVMRVRFRDogXCJkZWxldGVkX2F0XCIsXG4gIFRBQkxFOiBcInRhYmxlX25hbWVcIixcbiAgU0NIRU1BOiBcInNjaGVtYV9uYW1lXCIsXG4gIFNFUVVFTkNFOiBcInNlcXVlbmNlX25hbWVcIixcbiAgSU5ERVg6IFwiaW5kZXhcIixcbn07XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBUeXBlT1JNIGluZGV4ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGVycm9yIHJlbGF0ZWQgdG8gaW5kZXggZ2VuZXJhdGlvbiBvciBoYW5kbGluZyB3aXRoaW4gdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0LlxuICogQGNsYXNzXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBJbmRleEVycm9yXG4gKiB0cnkge1xuICogICAvLyBTb21lIGNvZGUgdGhhdCBtaWdodCB0aHJvdyBhbiBpbmRleCBlcnJvclxuICogICB0aHJvdyBuZXcgSW5kZXhFcnJvcihcIkluZGV4IG5vdCBmb3VuZFwiKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEluZGV4RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKFwiSW5kZXggZXJyb3Igb2NjdXJyZWQ6XCIsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEluZGV4RXJyb3IubmFtZSwgbXNnLCA0MDQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU1FMIG9wZXJhdG9ycyBhdmFpbGFibGUgZm9yIGJ1aWxkaW5nIFR5cGVPUk0gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGNvbW1vbiBTUUwgb3BlcmF0b3JzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIFR5cGVPUk0gcXVlcnkgY29uc3RydWN0aW9uIGFuZCB0cmFuc2xhdGlvbiBsYXllcnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZW51bSBTUUxPcGVyYXRvciB7XG4gIEVRVUFMID0gXCI9XCIsXG4gIE5PVF9FUVVBTCA9IFwiPD5cIixcbiAgTEVTU19USEFOID0gXCI8XCIsXG4gIExFU1NfVEhBTl9PUl9FUVVBTCA9IFwiPD1cIixcbiAgR1JFQVRFUl9USEFOID0gXCI+XCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTCA9IFwiPj1cIixcbiAgSU4gPSBcIklOXCIsXG4gIE5PVF9JTiA9IFwiTk9UIElOXCIsXG4gIExJS0UgPSBcIkxJS0VcIixcbiAgSUxJS0UgPSBcIklMSUtFXCIsXG4gIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgSVNfTlVMTCA9IFwiSVMgTlVMTFwiLFxuICBJU19OT1RfTlVMTCA9IFwiSVMgTk9UIE5VTExcIixcbiAgRVhJU1RTID0gXCJFWElTVFNcIixcbiAgTk9UX0VYSVNUUyA9IFwiTk9UIEVYSVNUU1wiLFxuICBBTlkgPSBcIkFOWVwiLFxuICBBTEwgPSBcIkFMTFwiLFxuICBTT01FID0gXCJTT01FXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFF1ZXJ5IGNvbnRhaW5lciB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVpdGhlciBhIHJhdyBTUUwgc3RyaW5nIG9yIGEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgYWxvbmcgd2l0aCBvcHRpb25hbCBib3VuZCB2YWx1ZXMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGFkYXB0ZXIuXG4gKiBAdGVtcGxhdGUgTSBUaGUgTW9kZWwgdHlwZSBmb3Igd2hpY2ggdGhlIFNlbGVjdFF1ZXJ5QnVpbGRlciBpcyBwYXJhbWV0ZXJpemVkLlxuICogQHRlbXBsYXRlIFQgVGhlIHVuZGVybHlpbmcgcXVlcnkgdHlwZSwgZWl0aGVyIGEgc3RyaW5nIG9yIGEgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LlxuICogQGludGVyZmFjZSBUeXBlT1JNUXVlcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlT1JNUXVlcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCA9IE1vZGVsLFxuICBUIGV4dGVuZHMgc3RyaW5nIHwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+ID0gc3RyaW5nLFxuPiB7XG4gIHF1ZXJ5OiBUO1xuICB2YWx1ZXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmbGFncyBmb3IgVHlwZU9STSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgRXh0ZW5kZWQgcmVwb3NpdG9yeSBmbGFncyBpbmNsdWRpbmcgY29ubmVjdGlvbi91c2VyIGNvbnRleHQgdGhhdCBjYW4gYmUgbGV2ZXJhZ2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAaW50ZXJmYWNlIFR5cGVPUk1GbGFnc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVPUk1GbGFncyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXNlciBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUG9zdGdyZXMgZGF0YWJhc2UgY29ubmVjdGlvbnNcbiAgICovXG4gIHVzZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWNhdGlvbiBmb3IgYSB0YWJsZSBjcmVhdGlvbi9jaGFuZ2Ugc3RhdGVtZW50IHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgYSBUeXBlT1JNUXVlcnkgd2l0aCB0YWJsZSBtZXRhZGF0YSBzdWNoIGFzIHByaW1hcnkga2V5IGZsYWcsIGNvbnN0cmFpbnRzLCBhbmQgZm9yZWlnbiBrZXlzLlxuICogQHR5cGVkZWYgVHlwZU9STVRhYmxlU3BlY1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcmltYXJ5S2V5IEluZGljYXRlcyBpZiB0aGUgdGFyZ2V0IGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNvbnN0cmFpbnRzIEEgbGlzdCBvZiByYXcgU1FMIGNvbnN0cmFpbnRzIHRvIGFwcGx5IHRvIHRoZSB0YWJsZS9jb2x1bW4uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmb3JlaWduS2V5cyBBIGxpc3Qgb2YgZm9yZWlnbiBrZXkgY29uc3RyYWludCBkZWZpbml0aW9ucy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZU9STVRhYmxlU3BlYyA9IFR5cGVPUk1RdWVyeSAmIHtcbiAgcHJpbWFyeUtleTogYm9vbGVhbjtcbiAgY29uc3RyYWludHM6IHN0cmluZ1tdO1xuICBmb3JlaWduS2V5czogc3RyaW5nW107XG59O1xuIiwiaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBxdWVyeSBsaW1pdCBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IE1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuIGluIGEgc2luZ2xlIHBhZ2Ugd2hlbiBwYWdpbmF0aW5nIHJlc3VsdHMuXG4gKiBAY29uc3QgVHlwZU9STVF1ZXJ5TGltaXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1RdWVyeUxpbWl0ID0gMjUwO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIHVzZWQgd2hlbiB0cmFuc2xhdGluZyBoaWdoLWxldmVsIGZpbHRlcnMgaW50byBTUUwgdmlhIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUwgRXF1YWxpdHkgb3BlcmF0b3IgKD0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRkVSRU5UIEluZXF1YWxpdHkgb3BlcmF0b3IgKDw+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0dFUiBHcmVhdGVyIHRoYW4gb3BlcmF0b3IgKD4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHR0VSX0VRIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCBvcGVyYXRvciAoPj0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUiBMZXNzIHRoYW4gb3BlcmF0b3IgKDwpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUl9FUSBMZXNzIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKDw9KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5PVCBOZWdhdGlvbiBvcGVyYXRvciAoTk9UKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOIEluIGFycmF5IG9wZXJhdG9yIChJTilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUdFWFAgUmVndWxhciBleHByZXNzaW9uIG9wZXJhdG9yICh+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElSRUdFWFAgQ2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0b3IgKH4qKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJS0UgUGF0dGVybiBtYXRjaGluZyBvcGVyYXRvciAoTElLRSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTElLRSBDYXNlLWluc2Vuc2l0aXZlIHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0b3IgKElMSUtFKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJFVFdFRU4gUmFuZ2Ugb3BlcmF0b3IgKEJFVFdFRU4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVNfTlVMTCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOVUxMKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElTX05PVF9OVUxMIE5PVCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOT1QgTlVMTClcbiAqIEBjb25zdCBUeXBlT1JNT3BlcmF0b3JcbiAqIEB0eXBlIHtQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STU9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBTUUxPcGVyYXRvciB8IHN0cmluZz4gPSB7XG4gIEVRVUFMOiBTUUxPcGVyYXRvci5FUVVBTCxcbiAgRElGRkVSRU5UOiBTUUxPcGVyYXRvci5OT1RfRVFVQUwsXG4gIEJJR0dFUjogU1FMT3BlcmF0b3IuR1JFQVRFUl9USEFOLFxuICBCSUdHRVJfRVE6IFNRTE9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTCxcbiAgU01BTExFUjogU1FMT3BlcmF0b3IuTEVTU19USEFOLFxuICBTTUFMTEVSX0VROiBTUUxPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gIEJFVFdFRU46IFNRTE9wZXJhdG9yLkJFVFdFRU4sXG4gIE5PVDogXCJOT1RcIixcbiAgSU46IFNRTE9wZXJhdG9yLklOLFxuICBJU19OVUxMOiBTUUxPcGVyYXRvci5JU19OVUxMLFxuICBJU19OT1RfTlVMTDogU1FMT3BlcmF0b3IuSVNfTk9UX05VTEwsXG4gIFJFR0VYUDogXCJ+XCIsXG4gIElSRUdFWFA6IFwifipcIixcbiAgTElLRTogU1FMT3BlcmF0b3IuTElLRSxcbiAgSUxJS0U6IFNRTE9wZXJhdG9yLklMSUtFLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBsb2dpY2FsIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIHVzZWQgd2hlbiBidWlsZGluZyBXSEVSRSBjbGF1c2UgZ3JvdXBzIGluIFR5cGVPUk0gcXVlcmllcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxHcm91cE9wZXJhdG9yVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFORCBMb2dpY2FsIEFORCBvcGVyYXRvciAoQU5EKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE9SIExvZ2ljYWwgT1Igb3BlcmF0b3IgKE9SKVxuICogQGNvbnN0IFR5cGVPUk1Hcm91cE9wZXJhdG9yXG4gKiBAdHlwZSB7UG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUdyb3VwT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEFORDogXCJBTkRcIixcbiAgT1I6IFwiT1JcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpYWwgY29uc3RhbnQgdmFsdWVzIHVzZWQgaW4gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFN0cmluZyBjb25zdGFudHMgcmVwcmVzZW50aW5nIHNwZWNpYWwgdmFsdWVzIHVzZWQgd2hpbGUgY29tcG9zaW5nIFNRTCB3aXRoIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMQ29uc3RUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVMTCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVsbCB2YWx1ZS5cbiAqIEBjb25zdCBUeXBlT1JNQ29uc3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1Db25zdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgTlVMTDogXCJOVUxMXCIsXG59O1xuIiwiaW1wb3J0IHsgUGFnaW5hdG9yLCBQYWdpbmdFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFJlcG9zaXRvcnkgYXMgUmVwbyB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAqIEBzdW1tYXJ5IEltcGxlbWVudHMgcGFnaW5hdGlvbiBmb3IgVHlwZU9STS1idWlsdCBxdWVyaWVzIHVzaW5nIHRha2Uvc2tpcCBmb3IgZWZmaWNpZW50IG5hdmlnYXRpb24gdGhyb3VnaCByZXN1bHQgc2V0cy5cbiAqIEB0ZW1wbGF0ZSBNIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBuZXcgVHlwZU9STVBhZ2luYXRvcihhZGFwdGVyLCB7IHF1ZXJ5OiBxYiB9LCAxMCwgVXNlcik7XG4gKiBjb25zdCBwYWdlMSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDEpO1xuICogY29uc3QgcGFnZTIgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1QYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgUixcbiAgVHlwZU9STVF1ZXJ5XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSByZWNvcmQgY291bnQgYW5kIHBhZ2Ugc2l6ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldCB0b3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRvdGFsIHJlY29yZCBjb3VudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3JlcG8/OiBSZXBvPGFueT47XG5cbiAgcHJvdGVjdGVkIGdldCByZXBvKCkge1xuICAgIGlmICghdGhpcy5fX3JlcG8pIHtcbiAgICAgIHRoaXMuX19yZXBvID0gKHRoaXMuYWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlcikuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgICB0aGlzLmNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhenpdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3JlcG87XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVHlwZU9STVBhZ2luYXRvciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBwYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIFR5cGVPUk0gcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlcixcbiAgICBxdWVyeTogVHlwZU9STVF1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgUG9zdGdyZVNRTCBxdWVyeVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBwcmVwYXJlZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBUeXBlT1JNUXVlcnkpOiBUeXBlT1JNUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBUeXBlT1JNUXVlcnkgPSB7IC4uLnJhd1N0YXRlbWVudCB9O1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0cy5cbiAgICogQHRocm93cyB7UGFnaW5nRXJyb3J9IElmIHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBwYWdlIG9yIGlmIG5vIGNsYXNzIGlzIGRlZmluZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRvciBhcyBUeXBlT1JNUGFnaW5hdG9yXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKHBhZ2VOdW1iZXIpXG4gICAqICAgTm90ZSBvdmVyIFBhZ2luYXRvcjogUHJlcGFyZSBvcHRpb25zIChza2lwL3Rha2UpXG4gICAqXG4gICAqICAgYWx0IEZpcnN0IHRpbWUgb3IgbmVlZCBjb3VudFxuICAgKiAgICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogR2V0IGNvdW50XG4gICAqICAgICBBZGFwdGVyLT4+REI6IEV4ZWN1dGUgQ09VTlRcbiAgICogICAgIERCLS0+PkFkYXB0ZXI6IGNvdW50XG4gICAqICAgICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIEFkYXB0ZXItPj5EQjogZmluZEFuZENvdW50KG9wdGlvbnMpXG4gICAqICAgREItLT4+QWRhcHRlcjogcm93cywgY291bnRcbiAgICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcm93cywgY291bnRcbiAgICpcbiAgICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IE1hcCByb3dzIHRvIG1vZGVsc1xuICAgKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJlc3VsdHNcbiAgICovXG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB7IC4uLnRoaXMuc3RhdGVtZW50IH07XG5cbiAgICAvLyBHZXQgdG90YWwgY291bnQgaWYgbm90IGFscmVhZHkgY2FsY3VsYXRlZFxuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0czogRmluZE1hbnlPcHRpb25zPE0+ID0gT2JqZWN0LmFzc2lnbihzdGF0ZW1lbnQsIHtcbiAgICAgIHNraXA6ICh0aGlzLmN1cnJlbnQgfHwgMCkgKiB0aGlzLnNpemUsXG4gICAgICB0YWtlOiB0aGlzLnNpemUsXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVwby5maW5kQW5kQ291bnQob3B0cyk7XG5cbiAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdFsxXTtcbiAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gdGhpcy5zaXplKTtcblxuICAgIGlmICghdGhpcy5jbGF6eikgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuXG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGF6eigpKTtcbiAgICBjb25zdCByb3dzID0gcmVzdWx0WzBdIHx8IFtdO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAvLyBzdGF0ZW1lbnQuY29sdW1ucyAmJiBzdGF0ZW1lbnQuY29sdW1ucy5sZW5ndGhcbiAgICAgIC8vICAgPyByb3dzIC8vIGhhcyBjb2x1bW5zIG1lYW5zIGl0J3Mgbm90IGZ1bGwgbW9kZWxcbiAgICAgIHJvd3MubWFwKChyb3c6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyb3csIHRoaXMuY2xhenosIHBrRGVmLmlkLCByb3dbcGtEZWYuaWRdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUltdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUdyb3VwT3BlcmF0b3IsIFR5cGVPUk1PcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBjb3JlIG9wZXJhdG9ycyB0byBUeXBlT1JNIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBEZWNhZi50cyBjb3JlIG9wZXJhdG9ycyB0byB0aGVpciBlcXVpdmFsZW50IFNRTCBvcGVyYXRvcnMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3J9IG9wZXJhdG9yIFRoZSBjb3JlIG9wZXJhdG9yIHRvIHRyYW5zbGF0ZS5cbiAqIEByZXR1cm4ge1NRTE9wZXJhdG9yIHwgc3RyaW5nfSBUaGUgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3IuXG4gKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiBubyB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiBvcGVyYXRvci5cbiAqIEBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogICBwYXJ0aWNpcGFudCBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JcbiAqXG4gKiAgIENhbGxlci0+PnRyYW5zbGF0ZU9wZXJhdG9yczogb3BlcmF0b3JcbiAqXG4gKiAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0+PlBvc3RncmVTUUxPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgICBQb3N0Z3JlU1FMT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBSZXR1cm4gU1FMT3BlcmF0b3JcbiAqICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMR3JvdXBPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgICAgYWx0IEZvdW5kIGluIFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKiAgICAgICBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIHN0cmluZ1xuICogICAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBUaHJvdyBRdWVyeUVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzKFxuICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4pOiBTUUxPcGVyYXRvciB8IHN0cmluZyB7XG4gIGZvciAoY29uc3Qgb3BlcmF0b3JzIG9mIFtUeXBlT1JNT3BlcmF0b3IsIFR5cGVPUk1Hcm91cE9wZXJhdG9yXSkge1xuICAgIGNvbnN0IGVsID0gT2JqZWN0LmtleXMob3BlcmF0b3JzKS5maW5kKChrKSA9PiBrID09PSBvcGVyYXRvcik7XG4gICAgaWYgKGVsKSByZXR1cm4gb3BlcmF0b3JzW2VsXTtcbiAgfVxuICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICBgQ291bGQgbm90IGZpbmQgYWRhcHRlciB0cmFuc2xhdGlvbiBmb3Igb3BlcmF0b3IgJHtvcGVyYXRvcn1gXG4gICk7XG59XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBSZXBvc2l0b3J5LFxuICBTdGF0ZW1lbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5TGltaXQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFR5cGVPUk1QYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcInR5cGVvcm0vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zV2hlcmVcIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zT3JkZXIgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNPcmRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgYnVpbGRpbmcgU1FMIHF1ZXJpZXMgdmlhIFR5cGVPUk0ncyBTZWxlY3RRdWVyeUJ1aWxkZXIgd2l0aCB0eXBlIHNhZmV0eSBhbmQgRGVjYWYudHMgYWJzdHJhY3Rpb25zLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzaW5nIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBUeXBlT1JNU3RhdGVtZW50PFVzZXIsIFVzZXJbXT4oYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZTxVc2VyPignYWdlJykuZ3QoMTgpKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBUeXBlT1JNUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWRhcHRlciE6IFR5cGVPUk1BZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGZyb20gdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIFR5cGVPUk0tYmFja2VkIHF1ZXJ5IG9iamVjdC5cbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgYnVpbHQgVHlwZU9STSBxdWVyeSBjb250YWluZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgaW52YWxpZCBxdWVyeSBjb25kaXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBJbml0aWFsaXplIHF1ZXJ5XG4gICAqICAgU3RhdGVtZW50LT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAgICogICBSZXBvc2l0b3J5LS0+PlN0YXRlbWVudDogUmV0dXJuIHRhYmxlIG5hbWVcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBiYXNlIHF1ZXJ5XG4gICAqXG4gICAqICAgYWx0IEhhcyBzZWxlY3RTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29sdW1ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgd2hlcmVDb25kaXRpb25cbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbWJpbmVkIGNvbmRpdGlvbiB3aXRoIHRhYmxlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5wYXJzZUNvbmRpdGlvbjogUGFyc2UgY29uZGl0aW9uXG4gICAqICAgICBwYXJzZUNvbmRpdGlvbi0tPj5TdGF0ZW1lbnQ6IFJldHVybiBwYXJzZWQgY29uZGl0aW9uc1xuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29uZGl0aW9ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb3JkZXJCeVNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBvcmRlckJ5IHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBvZmZzZXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBtID0gbmV3IHRoaXMuZnJvbVNlbGVjdG9yKCk7XG5cbiAgICBjb25zdCBxOiBUeXBlT1JNUXVlcnk8TSwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+PiA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZVxuICAgICAgICAuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvcltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmZyb21TZWxlY3Rvcl1cbiAgICAgICAgKVxuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHRhYmxlTmFtZSkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdChcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5tYXAoKHMpID0+IGAke3RhYmxlTmFtZX0uJHtzIGFzIHN0cmluZ31gKVxuICAgICAgKTtcbiAgICBlbHNlIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdCgpO1xuICAgIC8vXG4gICAgLy8gcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5mcm9tKFxuICAgIC8vICAgdGhpcy5mcm9tU2VsZWN0b3JbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5mcm9tU2VsZWN0b3JdLFxuICAgIC8vICAgdGFibGVOYW1lXG4gICAgLy8gKTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKVxuICAgICAgcS5xdWVyeSA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PlxuICAgICAgKS5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcblxuICAgIGxldCBvcmRlckJ5QXJnczogW3N0cmluZywgXCJERVNDXCIgfCBcIkFTQ1wiXTtcbiAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHtmaW5kUHJpbWFyeUtleShtKS5pZCBhcyBzdHJpbmd9YCxcbiAgICAgICAgT3JkZXJEaXJlY3Rpb24uQVNDLnRvVXBwZXJDYXNlKCkgYXMgXCJBU0NcIixcbiAgICAgIF07XG4gICAgZWxzZVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHt0aGlzLm9yZGVyQnlTZWxlY3RvclswXSBhcyBzdHJpbmd9YCxcbiAgICAgICAgdGhpcy5vcmRlckJ5U2VsZWN0b3JbMV0udG9VcHBlckNhc2UoKSBhcyBcIkRFU0NcIiB8IFwiQVNDXCIsXG4gICAgICBdO1xuXG4gICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5vcmRlckJ5KC4uLm9yZGVyQnlBcmdzKTtcbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmxpbWl0KHRoaXMubGltaXRTZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgbGltaXQgb2YgJHtUeXBlT1JNUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdChUeXBlT1JNUXVlcnlMaW1pdCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG9mZnNldFxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5za2lwKHRoaXMub2Zmc2V0U2VsZWN0b3IpO1xuXG4gICAgcmV0dXJuIHEgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgc3RhdGVtZW50LlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGEgVHlwZU9STVBhZ2luYXRvciBmb3IgcGFnaW5hdGVkIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgVHlwZU9STVF1ZXJ5Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSdzIGFuIGVycm9yIGJ1aWxkaW5nIHRoZSBxdWVyeS5cbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlPFI+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IFR5cGVPUk1RdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUXVlcnk6IEZpbmRNYW55T3B0aW9uczxNPiA9IHt9O1xuICAgICAgY29uc3QgYSA9IHF1ZXJ5LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkud2hlcmUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS5vcmRlciA9IHtcbiAgICAgICAgICBbdGhpcy5vcmRlckJ5U2VsZWN0b3JbMF1dOiB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1N0cmluZygpLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgcmV0dXJuIG5ldyBUeXBlT1JNUGFnaW5hdG9yKFxuICAgICAgICB0aGlzLmFkYXB0ZXIgYXMgYW55LFxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSByYXcgcmVzdWx0IHJvdyB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge2FueX0gciBUaGUgcmF3IHJlY29yZC5cbiAgICogQHBhcmFtIHtrZXlvZiBNfSBwa0F0dHIgVGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBvZiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7XCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWR9IHNlcXVlbmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgc2VxdWVuY2UuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb2Nlc3NlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NSZWNvcmQocjogYW55LCBwa0F0dHI6IGtleW9mIE0pIHtcbiAgICBpZiAodHlwZW9mIHJbcGtBdHRyXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5mcm9tU2VsZWN0b3IsIHBrQXR0ciwgcltwa0F0dHJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IFR5cGVPUk0gcXVlcnkgYnVpbGRlci5cbiAgICogQHN1bW1hcnkgU2VuZHMgdGhlIGJ1aWx0IFNlbGVjdFF1ZXJ5QnVpbGRlciB0byB0aGUgZGF0YWJhc2UgdmlhIFR5cGVPUk0gYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHJhd0lucHV0IFRoZSBxdWVyeSBjb250YWluZXIgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFR5cGVPUk1RdWVyeTxNPik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJhdyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyByYXcgcXVlcnk6ICR7KHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+KS5nZXRTcWwoKX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGNvbmRpdGlvbmFsT3A/OiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3JcbiAgKTogRmluZE9wdGlvbnNXaGVyZTxNPltdIHwgRmluZE9wdGlvbnNXaGVyZTxNPiB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBQb3N0Z3JlU1FMIGNvbmRpdGlvbiBzdHJ1Y3R1cmVzXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVOYW1lXSAtIHRoZSBwb3NpdGlvbmFsIGluZGV4IG9mIHRoZSBhcmd1bWVudHNcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgUG9zdGdyZXNTUUwgY29uZGl0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogRXh0cmFjdCBjb25kaXRpb24gcGFydHNcbiAgICpcbiAgICogICBhbHQgU2ltcGxlIGNvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PnRyYW5zbGF0ZU9wZXJhdG9yczogdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIFBvc3RncmVTUUwgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbmRpdGlvbiB3aXRoIGNvbHVtbiwgb3BlcmF0b3IsIGFuZCB2YWx1ZVxuICAgKiAgIGVsc2UgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgTk9UIHRvIGNvbmRpdGlvbnNcbiAgICogICBlbHNlIEFORC9PUiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihhdHRyMSlcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29tcGFyaXNvbilcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ29tYmluZSBjb25kaXRpb25zIHdpdGggQU5EL09SXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIGNvbmRpdGlvbnMgYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgY291bnRlciA9IDAsXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2UoKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICAgIGNvbnN0IHNxbE9wZXJhdG9yID0gdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IGF0dHJSZWYgPSBgJHthdHRyMX0ke2NvdW50ZXJ9YDtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyID0gYCR7dGFibGVOYW1lfS4ke2F0dHIxfSAke3NxbE9wZXJhdG9yfSA6JHthdHRyUmVmfWA7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgIFthdHRyUmVmXTogY29tcGFyaXNvbixcbiAgICAgIH07XG4gICAgICBzd2l0Y2ggKGNvbmRpdGlvbmFsT3ApIHtcbiAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLmFuZFdoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuT1I6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi5vcldoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIE9wZXJhdG9yLk5PVDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1Qgb3BlcmF0b3Igbm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIud2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGFyc2UoKTtcbiAgICB9XG4gICAgLy8gRm9yIE5PVCBvcGVyYXRvclxuICAgIGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIC8vIEZvciBBTkQvT1Igb3BlcmF0b3JzXG4gICAgZWxzZSB7XG4gICAgICBxYiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+LCB0YWJsZU5hbWUsIHFiLCArK2NvdW50ZXIpXG4gICAgICAgIC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBjb21wYXJpc29uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHFiLFxuICAgICAgICArK2NvdW50ZXIsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBkYXRhYmFzZSBzZXF1ZW5jZSBmb3IgVHlwZU9STS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciB7QGxpbmsgU2VxdWVuY2V9cywgZGVsZWdhdGluZyB0byB0aGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSB0byBmZXRjaCBhbmQgaW5jcmVtZW50IHZhbHVlcyB3aGlsZSBoYW5kbGluZyB0eXBlIHBhcnNpbmcgYW5kIGVycm9yIHRyYW5zbGF0aW9uLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAobmFtZSwgdHlwZSwgc3RhcnRXaXRoLCBpbmNyZW1lbnRCeSwgZXRjLikuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG4gKiBAY2xhc3MgVHlwZU9STVNlcXVlbmNlXG4gKiBAaW1wbGVtZW50cyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhbmQgdXNlIGEgVHlwZU9STS1iYWNrZWQgc2VxdWVuY2VcbiAqIGNvbnN0IHNlcSA9IG5ldyBUeXBlT1JNU2VxdWVuY2UoeyBuYW1lOiBcInVzZXJfaWRfc2VxXCIsIHR5cGU6IFwiTnVtYmVyXCIsIHN0YXJ0V2l0aDogMSwgaW5jcmVtZW50Qnk6IDEgfSwgYWRhcHRlcik7XG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXEubmV4dCgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFNlcSBhcyBUeXBlT1JNU2VxdWVuY2VcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBBcHAtPj5TZXE6IG5leHQoKVxuICogICBTZXEtPj5TZXE6IGN1cnJlbnQoKVxuICogICBTZXEtPj5BZGFwdGVyOiByYXcoU0VMRUNUIGN1cnJlbnRfdmFsdWUgLi4uKVxuICogICBBZGFwdGVyLT4+REI6IFF1ZXJ5IGN1cnJlbnQgdmFsdWVcbiAqICAgREItLT4+QWRhcHRlcjogY3VycmVudF92YWx1ZVxuICogICBBZGFwdGVyLS0+PlNlcTogdmFsdWVcbiAqICAgU2VxLT4+U2VxOiBpbmNyZW1lbnQoY3VycmVudClcbiAqICAgU2VxLT4+QWRhcHRlcjogcmF3KG5leHR2YWwobmFtZSkpXG4gKiAgIEFkYXB0ZXItPj5EQjogbmV4dHZhbCgpXG4gKiAgIERCLS0+PkFkYXB0ZXI6IG5leHQgdmFsdWVcbiAqICAgQWRhcHRlci0tPj5TZXE6IHZhbHVlXG4gKiAgIFNlcS0tPj5BcHA6IHBhcnNlZCBuZXh0IHZhbHVlXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyxcbiAgICBwcm90ZWN0ZWQgYWRhcHRlcjogVHlwZU9STUFkYXB0ZXJcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXE6IGFueSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBjdXJyZW50X3ZhbHVlIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnNlcXVlbmNlcyBXSEVSRSBzZXF1ZW5jZV9uYW1lID0gJDFgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc2VxLmN1cnJlbnRfdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLmFkYXB0ZXIucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUGFyc2VzIHRoZSB7QGxpbmsgU2VxdWVuY2V9IHZhbHVlXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHJldHVybiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMub3B0aW9ucy50eXBlLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNlcXVlbmNlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBjdXJyZW50XG4gICAqIEBwYXJhbSBjb3VudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudChcbiAgICBjdXJyZW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgY291bnQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IHR5cGUsIGluY3JlbWVudEJ5LCBuYW1lLCBzdGFydFdpdGggfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAodHlwZSAhPT0gXCJOdW1iZXJcIiAmJiB0eXBlICE9PSBcIkJpZ0ludFwiKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgaW5jcmVtZW50IHNlcXVlbmNlIG9mIHR5cGUgJHt0eXBlfSB3aXRoICR7Y291bnR9YFxuICAgICAgKTtcbiAgICBsZXQgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICAgIHRyeSB7XG4gICAgICBuZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgU0VMRUNUIG5leHR2YWwoJDEpO2AsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgbmV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYENSRUFURSBTRVFVRU5DRSBJRiBOT1QgRVhJU1RTICQxIFNUQVJUIFdJVEggJDIgSU5DUkVNRU5UIEJZICQzIE5PIENZQ0xFO2AsXG4gICAgICAgIHZhbHVlczogW25hbWUsIHN0YXJ0V2l0aCwgaW5jcmVtZW50QnldLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aCBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gY2FsbHMge0BsaW5rIFNlcXVlbmNlI3BhcnNlfSBvbiB0aGUgY3VycmVudCB2YWx1ZVxuICAgKiBmb2xsb3dlZCBieSB7QGxpbmsgU2VxdWVuY2UjaW5jcmVtZW50fVxuICAgKlxuICAgKi9cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY3VycmVudCk7XG4gIH1cblxuICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPiB7XG4gICAgY29uc3QgY3VycmVudCA9IChhd2FpdCB0aGlzLmN1cnJlbnQoKSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGluY3JlbWVudEJ5ID0gdGhpcy5wYXJzZSh0aGlzLm9wdGlvbnMuaW5jcmVtZW50QnkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBhd2FpdCB0aGlzLmluY3JlbWVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICAodGhpcy5wYXJzZShjb3VudCkgYXMgbnVtYmVyKSAqIGluY3JlbWVudEJ5XG4gICAgKTtcbiAgICBjb25zdCByYW5nZTogKG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgcmFuZ2UucHVzaChjdXJyZW50ICsgaW5jcmVtZW50QnkgKiAodGhpcy5wYXJzZShpKSBhcyBudW1iZXIpKTtcbiAgICB9XG4gICAgaWYgKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICE9PSBuZXh0KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNjYWxjdWxhdGlvbiBvZiByYW5nZVwiKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluZGV4TWV0YWRhdGEsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4XG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIG5hbWUgZm9yIGEgQ291Y2hEQiBpbmRleCBieSBjb21iaW5pbmcgbmFtZSBwYXJ0cywgY29tcG9zaXRpb25zLCBhbmQgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lIC0gQXJyYXkgb2YgbmFtZSBwYXJ0cyBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbZGlyZWN0aW9uXSAtIE9wdGlvbmFsIHNvcnQgZGlyZWN0aW9uIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIGluY2x1ZGUgaW4gdGhlIGluZGV4IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gVGhlIHNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBwYXJ0cyBvZiB0aGUgaW5kZXggbmFtZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGluZGV4IG5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJbmRleE5hbWUoXG4gIG5hbWU6IHN0cmluZ1tdLFxuICBkaXJlY3Rpb24/OiBPcmRlckRpcmVjdGlvbixcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbikge1xuICByZXR1cm4gW1xuICAgIC4uLm5hbWUubWFwKChuKSA9PiAobiA9PT0gVHlwZU9STUtleXMuVEFCTEUgPyBcInRhYmxlXCIgOiBuKSksXG4gICAgLi4uKGNvbXBvc2l0aW9ucyB8fCBbXSksXG4gICAgLi4uKGRpcmVjdGlvbiA/IFtkaXJlY3Rpb25dIDogW10pLFxuICAgIFR5cGVPUk1LZXlzLklOREVYLFxuICBdLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgZm9yIG1vZGVsc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvdmlkZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIG1vZGVscyAtIEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBnZW5lcmF0ZSBpbmRleGVzIGZvclxuICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBBcnJheSBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVJbmRleGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4ZXNcbiAqICAgcGFydGljaXBhbnQgZ2VuZXJhdGVJbmRleE5hbWVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICpcbiAqICAgQ2FsbGVyLT4+Z2VuZXJhdGVJbmRleGVzOiBtb2RlbHNcbiAqXG4gKiAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBiYXNlIHRhYmxlIGluZGV4XG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhOYW1lOiBbQ291Y2hEQktleXMuVEFCTEVdXG4gKiAgIGdlbmVyYXRlSW5kZXhOYW1lLS0+PmdlbmVyYXRlSW5kZXhlczogdGFibGVOYW1lXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIHRhYmxlIGluZGV4IGNvbmZpZ1xuICpcbiAqICAgbG9vcCBGb3IgZWFjaCBtb2RlbFxuICogICAgIGdlbmVyYXRlSW5kZXhlcy0+PlJlcG9zaXRvcnk6IEdldCBpbmRleGVzIG1ldGFkYXRhXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IGluZGV4IG1ldGFkYXRhXG4gKlxuICogICAgIGxvb3AgRm9yIGVhY2ggaW5kZXggaW4gbWV0YWRhdGFcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IEV4dHJhY3QgaW5kZXggcHJvcGVydGllc1xuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBEZWZpbmUgbmVzdGVkIGdlbmVyYXRlIGZ1bmN0aW9uXG4gKlxuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDYWxsIGdlbmVyYXRlKCkgZm9yIGRlZmF1bHQgb3JkZXJcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBpbmRleCBuYW1lIGFuZCBjb25maWdcbiAqXG4gKiAgICAgICBhbHQgSGFzIGRpcmVjdGlvbnNcbiAqICAgICAgICAgbG9vcCBGb3IgZWFjaCBkaXJlY3Rpb25cbiAqICAgICAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoZGlyZWN0aW9uKVxuICogICAgICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBvcmRlcmVkIGluZGV4IGNvbmZpZ1xuICogICAgICAgICBlbmRcbiAqICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0tPj5DYWxsZXI6IEFycmF5IG9mIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4pOiBUeXBlT1JNUXVlcnlbXSB7XG4gIGNvbnN0IHRhYmxlTmFtZSA9IGdlbmVyYXRlSW5kZXhOYW1lKFtUeXBlT1JNS2V5cy5UQUJMRV0pO1xuICBjb25zdCBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNUXVlcnk+ID0ge307XG4gIGluZGV4ZXNbdGFibGVOYW1lXSA9IHtcbiAgICBxdWVyeTogYGAsXG4gICAgdmFsdWVzOiBbXSxcbiAgfTtcblxuICBtb2RlbHMuZm9yRWFjaCgobSkgPT4ge1xuICAgIGNvbnN0IGluZDogUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4gPSBSZXBvc2l0b3J5LmluZGV4ZXMobSk7XG4gICAgT2JqZWN0LmVudHJpZXMoaW5kKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGsgPSBPYmplY3Qua2V5cyh2YWx1ZSlbMF07XG5cbiAgICAgIGxldCB7IGNvbXBvc2l0aW9ucyB9ID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG0pO1xuICAgICAgY29tcG9zaXRpb25zID0gY29tcG9zaXRpb25zIHx8IFtdO1xuXG4gICAgICBmdW5jdGlvbiBnZW5lcmF0ZSgpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtrZXksIC4uLihjb21wb3NpdGlvbnMgYXMgW10pLCBQZXJzaXN0ZW5jZUtleXMuSU5ERVhdLmpvaW4oXG4gICAgICAgICAgRGVmYXVsdFNlcGFyYXRvclxuICAgICAgICApO1xuXG4gICAgICAgIGluZGV4ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgcXVlcnk6IGBDUkVBVEUgSU5ERVggJDEgT04gJDIgKCQzKTtgLFxuICAgICAgICAgIHZhbHVlczogW25hbWUsIHRhYmxlTmFtZSwga2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdGUoKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGluZGV4ZXMpO1xufVxuIiwiaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gYmFja2VkIGJ5IFR5cGVPUk0uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gTW9kZWwgdXNpbmcgdGhlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0sIGluY2x1ZGluZyBidWxrIG9wZXJhdGlvbnMgYW5kIHF1ZXJ5IGJ1aWxkZXIgYWNjZXNzIHdoaWxlIHByZXNlcnZpbmcgRGVjYWYudHMgcmVwb3NpdG9yeSBzZW1hbnRpY3MuXG4gKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbCB0aGF0IHRoaXMgcmVwb3NpdG9yeSB3aWxsIG1hbmFnZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHBlcnNpc3RlbmNlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUaGUgTW9kZWwgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVwb3NpdG9yeS5cbiAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIGZvcndhcmRlZCB0byB0aGUgYmFzZSBSZXBvc2l0b3J5LlxuICogQGNsYXNzIFR5cGVPUk1SZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSByZXBvc2l0b3J5XG4gKiBjb25zdCByZXBvID0gbmV3IFR5cGVPUk1SZXBvc2l0b3J5PFVzZXI+KGFkYXB0ZXIsIFVzZXIpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoY3JlYXRlZC5pZCk7XG4gKlxuICogLy8gQnVsayBjcmVhdGVcbiAqIGF3YWl0IHJlcG8uY3JlYXRlQWxsKFtuZXcgVXNlcih7IG5hbWU6IFwiQVwiIH0pLCBuZXcgVXNlcih7IG5hbWU6IFwiQlwiIH0pXSk7XG4gKlxuICogLy8gVXNpbmcgdGhlIHF1ZXJ5IGJ1aWxkZXJcbiAqIGNvbnN0IHFiID0gcmVwby5xdWVyeUJ1aWxkZXIoKTtcbiAqIGNvbnN0IHJvd3MgPSBhd2FpdCBxYi53aGVyZShcIm5hbWUgPSA6bmFtZVwiLCB7IG5hbWU6IFwiQWxpY2VcIiB9KS5nZXRNYW55KCk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIFR5cGVPUk0vRGF0YVNvdXJjZVxuICpcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+QWRhcHRlcjogcHJlcGFyZShtb2RlbCwgcGspXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIC4uLmFyZ3MpXG4gKiAgIEFkYXB0ZXItPj5EQjogSU5TRVJUIC4uLlxuICogICBEQi0tPj5BZGFwdGVyOiByb3dcbiAqICAgQWRhcHRlci0tPj5SZXBvOiByb3dcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHJldmVydChyb3csIGNsYXp6LCBwaywgaWQpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogbW9kZWxcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbkB1c2VzKFR5cGVPUk1GbGF2b3VyKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1SZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICBNLFxuICBUeXBlT1JNUXVlcnk8TSwgYW55PixcbiAgVHlwZU9STUFkYXB0ZXIsXG4gIFR5cGVPUk1GbGFncyxcbiAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogVHlwZU9STUFkYXB0ZXIsIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiwgLi4uYXJnczogYW55W10pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBtb2RlbCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBUeXBlT1JNIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSByZXBvc2l0b3J5IGVudGl0eS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIFNlbGVjdFF1ZXJ5QnVpbGRlciBib3VuZCB0byB0aGlzIHJlcG9zaXRvcnkncyBlbnRpdHkgZm9yIGFkdmFuY2VkIHF1ZXJ5aW5nLlxuICAgKiBAcmV0dXJuIHtpbXBvcnQoXCJ0eXBlb3JtXCIpLlNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+fSBBIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGluc3RhbmNlLlxuICAgKi9cbiAgcXVlcnlCdWlsZGVyKCkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgdGhpcy5jbGFzc1tNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmNsYXNzXVxuICAgICk7XG4gICAgcmV0dXJuIHJlcG8uY3JlYXRlUXVlcnlCdWlsZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIGluc2VydGlvbiB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgY3JlYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCBhcyBhbnksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBsZXQgYzogQ29udGV4dDxUeXBlT1JNRmxhZ3M+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChhcmdzLmxlbmd0aCkgYyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXSBhcyBDb250ZXh0PFR5cGVPUk1GbGFncz47XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgdGhpcy5wayxcbiAgICAgIGlkLFxuICAgICAgYyAmJiBjLmdldChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpID8gdHJhbnNpZW50IDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZChcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkIGFzIHN0cmluZyxcbiAgICAgIHRoaXMucGsgYXMgc3RyaW5nXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIHVwZGF0ZSB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQsIHRyYW5zaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCBhcyBzdHJpbmcsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGFuZCBwcmVwYXJlcyBtb2RlbHMgZm9yIGJ1bGsgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IEFwcGxpZXMgZGVjb3JhdG9yLWJhc2VkIHZhbGlkYXRpb25zIGFuZCByZXR1cm5zIHRyYW5zZm9ybWVkIG1vZGVscyB3aXRoIGNvbnRleHQgYXJncyBmb3IgY3JlYXRlQWxsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIFRoZSBtb2RlbHMgdG8gYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxbTVtdLCAuLi5hbnlbXV0+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBmb3J3YXJkZWQgYXJncyB0dXBsZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMsIHBlcnNpc3RzLCBhbmQgcmVoeWRyYXRlcyBhIGJhdGNoIG9mIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIG1vZGVscyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXlzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIGJhdGNoIG9mIG1vZGVsIHVwZGF0ZXMgYW5kIHJldHVybnMgdGhlaXIgcmVoeWRyYXRlZCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgbW9kZWxzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbGlzdCBvZiBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzIGFuZCByZXR1cm5zIHRoZWlyIGxhc3QgcGVyc2lzdGVkIHN0YXRlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2UsXG4gIEV2ZW50U3Vic2NyaWJlcixcbiAgSW5zZXJ0RXZlbnQsXG4gIFJlbW92ZUV2ZW50LFxuICBVcGRhdGVFdmVudCxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBldmVudCBzdWJzY3JpYmVyIHRoYXQgZm9yd2FyZHMgZW50aXR5IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBpbnNlcnQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBldmVudHMgZW1pdHRlZCBieSBUeXBlT1JNIGFuZCBub3RpZmllcyB0aGUgRGVjYWYudHMgYWRhcHRlciBzbyB0aGF0IG9ic2VydmVycyBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYW5kIGxvb2sgdXAgbWV0YWRhdGEuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlcmluZyB0aGUgc3Vic2NyaWJlciB3aGVuIGNyZWF0aW5nIGEgRGF0YVNvdXJjZVxuICogLy8gZGF0YVNvdXJjZU9wdGlvbnMuc3Vic2NyaWJlcnMgPSBbbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIoYWRhcHRlcildO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVHlwZU9STVxuICogICBwYXJ0aWNpcGFudCBTdWJzY3JpYmVyIGFzIFR5cGVPUk1FdmVudFN1YnNjcmliZXJcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlckluc2VydChlbnRpdHkpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBDUkVBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJVcGRhdGUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIFVQREFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBVUERBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJSZW1vdmUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIERFTEVURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBERUxFVEUsIFtpZF0pXG4gKi9cbkBFdmVudFN1YnNjcmliZXIoKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgaW1wbGVtZW50cyBFbnRpdHlTdWJzY3JpYmVySW50ZXJmYWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXI6IChcbiAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgICAgaWRzOiBFdmVudElkc1xuICAgICkgPT4gdm9pZFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtaW5zZXJ0IGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY3JlYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGluc2VydGVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtJbnNlcnRFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSBpbnNlcnQgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVySW5zZXJ0KGV2ZW50OiBJbnNlcnRFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1yZW1vdmUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBkZWxldGUgb3BlcmF0aW9uIGZvciB0aGUgcmVtb3ZlZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7UmVtb3ZlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gcmVtb3ZlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclJlbW92ZShldmVudDogUmVtb3ZlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgW2V2ZW50LmVudGl0eUlkIGFzIGFueV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtdXBkYXRlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGFuIHVwZGF0ZSBvcGVyYXRpb24gZm9yIHRoZSBtb2RpZmllZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7VXBkYXRlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gdXBkYXRlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclVwZGF0ZShldmVudDogVXBkYXRlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmRhdGFiYXNlRW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuVVBEQVRFLCBbXG4gICAgICAoZXZlbnQuZW50aXR5IGFzIGFueSlbXCJpZFwiXSBhcyBhbnksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgVHlwZU9STUV2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL1R5cGVPUk1FdmVudFN1YnNjcmliZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlciBmb3IgVHlwZU9STS1kcml2ZW4gY2hhbmdlIGV2ZW50cy5cbiAqIEBzdW1tYXJ5IFN1YnNjcmliZXMgYSBUeXBlT1JNIERhdGFTb3VyY2Ugd2l0aCBhIGN1c3RvbSBFbnRpdHlTdWJzY3JpYmVyIHRvIG5vdGlmeSBvYnNlcnZlcnMgd2hlbiByZWNvcmRzIGFyZSBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0PTUwMDBdIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbiByZXRyaWVzLlxuICogQGNsYXNzIFR5cGVPUk1EaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIGRpc3BhdGNoZXIgZm9yIGEgVHlwZU9STSBEYXRhU291cmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAqIGF3YWl0IGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlciwgYWRhcHRlci5kYXRhU291cmNlLm9wdGlvbnMpO1xuICpcbiAqIC8vIFRoZSBkaXNwYXRjaGVyIHJlZ2lzdGVycyBhIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgYW5kIG5vdGlmaWVzIG9ic2VydmVycyB3aGVuIGVudGl0aWVzIGNoYW5nZS5cbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgRGlzcGF0Y2gge1xuICogICAgICtpbml0aWFsaXplKClcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKClcbiAqICAgfVxuICogICBjbGFzcyBUeXBlT1JNRGlzcGF0Y2gge1xuICogICAgIC1vYnNlcnZlckxhc3RVcGRhdGU/OiBzdHJpbmdcbiAqICAgICAtYXR0ZW1wdENvdW50ZXI6IG51bWJlclxuICogICAgIC10aW1lb3V0OiBudW1iZXJcbiAqICAgICArY29uc3RydWN0b3IodGltZW91dClcbiAqICAgICAjbm90aWZpY2F0aW9uSGFuZGxlcigpXG4gKiAgICAgI2luaXRpYWxpemUoKVxuICogICB9XG4gKiAgIERpc3BhdGNoIDx8LS0gVHlwZU9STURpc3BhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxEYXRhU291cmNlT3B0aW9ucz4ge1xuICBwcml2YXRlIG9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRlbXB0Q291bnRlcjogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVvdXQgPSA1MDAwKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIFR5cGVPUk0gbm90aWZpY2F0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgSGFuZGxlcyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyAodHJhbnNsYXRlZCBmcm9tIFR5cGVPUk0gZXZlbnRzKSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IHJlY29yZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgVGhlIG5vdGlmaWNhdGlvbiBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkcyBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG5vdGlmaWNhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBQb3N0Z3JlU1FMRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JzZXJ2ZXJzXG4gICAqICAgTm90ZSBvdmVyIEQ6IFJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20gUG9zdGdyZVNRTFxuICAgKiAgIEQtPj5EOiBQYXJzZSBub3RpZmljYXRpb24gcGF5bG9hZFxuICAgKiAgIEQtPj5EOiBFeHRyYWN0IHRhYmxlLCBvcGVyYXRpb24sIGFuZCBpZHNcbiAgICogICBELT4+TzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcylcbiAgICogICBELT4+RDogVXBkYXRlIG9ic2VydmVyTGFzdFVwZGF0ZVxuICAgKiAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBkaXNwYXRjaFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgaWRzOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyKTtcbiAgICB0cnkge1xuICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbG9nLnZlcmJvc2UoYE9ic2VydmVyIHJlZnJlc2ggZGlzcGF0Y2hlZCBieSAke29wZXJhdGlvbn0gZm9yICR7dGFibGV9YCk7XG4gICAgICBsb2cuZGVidWcoYHBrczogJHtpZHN9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBub3RpZmljYXRpb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBkaXNwYXRjaGVyIGFuZCBzdWJzY3JpYmVzIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyIG9uIHRoZSBEYXRhU291cmNlIGFuZCBsb2dzIHRoZSBzdWJzY3JpcHRpb24gbGlmZWN5Y2xlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgVHlwZU9STURpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBzdWJzY3JpYmVUb1R5cGVPUk1cbiAgICogICBwYXJ0aWNpcGFudCBEUyBhcyBUeXBlT1JNIERhdGFTb3VyY2VcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIEQtPj5TOiBDYWxsIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIFMtPj5TOiBDaGVjayBhZGFwdGVyIGFuZCBuYXRpdmVcbiAgICogICBhbHQgTm8gYWRhcHRlciBvciBuYXRpdmVcbiAgICogICAgIFMtLT4+UzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFMtPj5EUzogaW5pdGlhbGl6ZSgpXG4gICAqICAgUy0+PkRTOiBzdWJzY3JpYmVycy5wdXNoKFR5cGVPUk1FdmVudFN1YnNjcmliZXIpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERTLS0+PlM6IFN1YnNjcmlwdGlvbiBlc3RhYmxpc2hlZFxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlc29sdmVzXG4gICAqICAgICBELT4+TDogTG9nIHN1Y2Nlc3NmdWwgc3Vic2NyaXB0aW9uXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgRFMtLT4+UzogRXJyb3JcbiAgICogICAgIFMtLT4+RDogUHJvbWlzZSByZWplY3RzXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBzdWJzY3JpYmVUb1R5cGVPUk0odGhpczogVHlwZU9STURpc3BhdGNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5uYXRpdmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIvbmF0aXZlIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWFkYXB0ZXIuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKVxuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuZGF0YVNvdXJjZS5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgYWRhcHRlci5kYXRhU291cmNlLnN1YnNjcmliZXJzLnB1c2goXG4gICAgICAgICAgbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyLmJpbmQodGhpcykpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNjcmliZVRvVHlwZU9STVxuICAgICAgLmNhbGwodGhpcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3Vic2NyaWJlZCB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnNgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gVHlwZU9STSBub3RpZmljYXRpb25zOiAke2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCBtZXRob2QgdG8gcmVsZWFzZSByZXNvdXJjZXMgd2hlbiB0aGUgZGlzcGF0Y2hlciBpcyBubyBsb25nZXIgbmVlZGVkXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICAvLyBpZiAodGhpcy5hZGFwdGVyKSB7XG4gICAgLy9cbiAgICAvLyAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXI7XG4gICAgLy8gICBhd2FpdCBhZGFwdGVyLmRhdGFTb3VyY2UuZGVzdHJveSgpO1xuICAgIC8vIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBKYXZhU2NyaXB0IFJlZ0V4cCBwYXR0ZXJuIHRvIGEgUG9zdGdyZVNRTCBQT1NJWCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBzdW1tYXJ5IEFjY2VwdHMgZWl0aGVyIGEgUmVnRXhwIG9iamVjdCBvciBhIHN0cmluZyByZXByZXNlbnRhdGlvbiAoL3BhdHRlcm4vZmxhZ3MpIGFuZCByZXR1cm5zIHRoZSByYXcgcGF0dGVybiBjb21wYXRpYmxlIHdpdGggUG9zdGdyZVNRTCdzIH4gYW5kIH4qIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30ganNSZWdleCBKYXZhU2NyaXB0IFJlZ0V4cCBvYmplY3Qgb3IgcGF0dGVybiBzdHJpbmcuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFBvc3RncmVTUUwtY29tcGF0aWJsZSByZWdleCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBmdW5jdGlvbiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFV0aWxzIGFzIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlc1xuICogICBBcHAtPj5VdGlsczogY29udmVydEpzUmVnZXhUb1Bvc3RncmVzKFJlZ0V4cChcImZvby4qXCIsXCJpXCIpKVxuICogICBVdGlscy0+PlV0aWxzOiBQYXJzZSBzdHJpbmcgb3IgdXNlIFJlZ0V4cC5zb3VyY2VcbiAqICAgVXRpbHMtLT4+QXBwOiBcImZvby4qXCJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcyhqc1JlZ2V4OiBSZWdFeHAgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByeHAgPSBuZXcgUmVnRXhwKC9eXFwvKC4rKVxcLyhcXHcrKSQvZyk7XG4gIGlmICh0eXBlb2YganNSZWdleCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1hdGNoID0gcnhwLmV4ZWMoanNSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBwXSA9IG1hdGNoO1xuICAgICAganNSZWdleCA9IHA7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlZ2V4ID0gdHlwZW9mIGpzUmVnZXggPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKGpzUmVnZXgpIDoganNSZWdleDtcblxuICBjb25zdCBwYXR0ZXJuID0gcmVnZXguc291cmNlO1xuXG4gIHJldHVybiBwYXR0ZXJuO1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9Db2x1bW5NZXRhZGF0YUFyZ3NcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgY29sdW1uczogQ29sdW1uTWV0YWRhdGFBcmdzW10sXG4gIG9wdGlvbnM6IGFueSA9IHt9LFxuICBtb2RlOiBzdHJpbmcgPSBcInJlZ3VsYXJcIlxuKSB7XG4gIGNvbnN0IGNvbHMgPSBjb2x1bW5zLmZpbHRlcihcbiAgICAoYzogQ29sdW1uTWV0YWRhdGFBcmdzKSA9PlxuICAgICAgYy50YXJnZXQgPT09IHRhcmdldCAmJiBjLnByb3BlcnR5TmFtZSA9PT0gcHJvcGVydHlcbiAgKTtcblxuICBpZiAoY29scy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNdWx0aXBsZSBjb2x1bW5zIGZvciAke3Byb3BlcnR5fSBmb3VuZCBmb3IgZ2l2ZW4gdGFyZ2V0OiAke2NvbHVtbnMubWFwKChjKSA9PiBjLnByb3BlcnR5TmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICApO1xuXG4gIGlmIChjb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbHVtbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHksXG4gICAgICBtb2RlOiBtb2RlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9IGFzIENvbHVtbk1ldGFkYXRhQXJncyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sdW1uID0gY29sc1swXTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbHVtbiwgXCJvcHRpb25zXCIsIHtcbiAgICB2YWx1ZTogeyAuLi5jb2x1bW4ub3B0aW9ucywgLi4ub3B0aW9ucyB9LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICB9KTtcblxuICBpZiAobW9kZSAhPT0gXCJyZWd1bGFyXCIpXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbHVtbiwgXCJtb2RlXCIsIHtcbiAgICAgIHZhbHVlOiBtb2RlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHtcbiAgQ29sdW1uT3B0aW9ucyxcbiAgQ29sdW1uVHlwZSxcbiAgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yLFxuICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHtcbiAgU2ltcGxlQ29sdW1uVHlwZSxcbiAgU3BhdGlhbENvbHVtblR5cGUsXG4gIFdpdGhMZW5ndGhDb2x1bW5UeXBlLFxuICBXaXRoUHJlY2lzaW9uQ29sdW1uVHlwZSxcbiAgV2l0aFdpZHRoQ29sdW1uVHlwZSxcbn0gZnJvbSBcInR5cGVvcm0vZHJpdmVyL3R5cGVzL0NvbHVtblR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbkNvbW1vbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5Db21tb25PcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxDb2x1bW5PcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvU3BhdGlhbENvbHVtbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uV2l0aExlbmd0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoTGVuZ3RoT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoV2lkdGhPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uV2l0aFdpZHRoT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5OdW1lcmljT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbk51bWVyaWNPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbkVudW1PcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uRW51bU9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uSHN0b3JlT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkhzdG9yZU9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW1iZWRkZWRPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uRW1iZWRkZWRPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IEVtYmVkZGVkTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9FbWJlZGRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzXG4gKiBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKCk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKG9wdGlvbnM6IENvbHVtbk9wdGlvbnMpOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogU2ltcGxlQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBTcGF0aWFsQ29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFdpdGhMZW5ndGhDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbldpdGhMZW5ndGhPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aFdpZHRoQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5XaXRoV2lkdGhPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aFByZWNpc2lvbkNvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImVudW1cIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwic2ltcGxlLWVudW1cIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwic2V0XCIsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uRW51bU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG4vLyBAdHMtZXhwZWN0LWVycm9yIHNvbWUgdHlwZW9ybSB0aGluZ1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJoc3RvcmVcIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5Ic3RvcmVPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqXG4gKiBQcm9wZXJ0eSBpbiBlbnRpdHkgY2FuIGJlIG1hcmtlZCBhcyBFbWJlZGRlZCwgYW5kIG9uIHBlcnNpc3QgYWxsIGNvbHVtbnMgZnJvbSB0aGUgZW1iZWRkZWQgYXJlIG1hcHBlZCB0byB0aGVcbiAqIHNpbmdsZSB0YWJsZSBvZiB0aGUgZW50aXR5IHdoZXJlIEVtYmVkZGVkIGlzIHVzZWQuIEFuZCBvbiBoeWRyYXRpb24gYWxsIGNvbHVtbnMgd2hpY2ggc3VwcG9zZWQgdG8gYmUgaW4gdGhlXG4gKiBlbWJlZGRlZCB3aWxsIGJlIG1hcHBlZCB0byBpdCBmcm9tIHRoZSBzaW5nbGUgdGFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgdHlwZTogKHR5cGU/OiBhbnkpID0+IEZ1bmN0aW9uLFxuICBvcHRpb25zPzogQ29sdW1uRW1iZWRkZWRPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZU9yT3B0aW9ucz86IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgfCAoKHR5cGU/OiBhbnkpID0+IEZ1bmN0aW9uKVxuICAgIHwgQ29sdW1uVHlwZVxuICAgIHwgKENvbHVtbk9wdGlvbnMgJiBDb2x1bW5FbWJlZGRlZE9wdGlvbnMpLFxuICBvcHRpb25zPzogQ29sdW1uT3B0aW9ucyAmIENvbHVtbkVtYmVkZGVkT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogb2JqZWN0LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgbGV0IHR5cGU6IENvbHVtblR5cGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiB0eXBlT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCJcbiAgICApIHtcbiAgICAgIHR5cGUgPSA8Q29sdW1uVHlwZT50eXBlT3JPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAodHlwZU9yT3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IDxDb2x1bW5PcHRpb25zPnR5cGVPck9wdGlvbnM7XG4gICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucy50eXBlO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBDb2x1bW5PcHRpb25zO1xuXG4gICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgIGNvbnN0IHJlZmxlY3RNZXRhZGF0YVR5cGUgPVxuICAgICAgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhXG4gICAgICAgID8gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR5cGUgJiYgcmVmbGVjdE1ldGFkYXRhVHlwZSlcbiAgICAgIC8vIGlmIHR5cGUgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHkgdGhlbiB0cnkgdG8gZ3Vlc3MgaXRcbiAgICAgIHR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbm8gdHlwZSBpbiBjb2x1bW4gb3B0aW9ucyB0aGVuIHNldCB0eXBlIGZyb20gZmlyc3QgZnVuY3Rpb24gYXJndW1lbnQsIG9yIGd1ZXNzZWQgb25lXG4gICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSkgb3B0aW9ucy50eXBlID0gdHlwZTtcblxuICAgIC8vIHNwZWNpZnkgSFNUT1JFIHR5cGUgaWYgY29sdW1uIGlzIEhTVE9SRVxuICAgIGlmIChvcHRpb25zLnR5cGUgPT09IFwiaHN0b3JlXCIgJiYgIW9wdGlvbnMuaHN0b3JlVHlwZSlcbiAgICAgIG9wdGlvbnMuaHN0b3JlVHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGUgPT09IE9iamVjdCA/IFwib2JqZWN0XCIgOiBcInN0cmluZ1wiO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIHJlZ2lzdGVyIGFuIGVtYmVkZGVkXG4gICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW1iZWRkZWRzLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIGlzQXJyYXk6IHJlZmxlY3RNZXRhZGF0YVR5cGUgPT09IEFycmF5IHx8IG9wdGlvbnMuYXJyYXkgPT09IHRydWUsXG4gICAgICAgIHByZWZpeDogb3B0aW9ucy5wcmVmaXggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZml4IDogdW5kZWZpbmVkLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgIHR5cGU6IHR5cGVPck9wdGlvbnMgYXMgKHR5cGU/OiBhbnkpID0+IEZ1bmN0aW9uLFxuICAgICAgfSBhcyBFbWJlZGRlZE1ldGFkYXRhQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlZ2lzdGVyIGEgcmVndWxhciBjb2x1bW5cblxuICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUgdGhlbiB3ZSBuZWVkIHRvIGdpdmUgZXJyb3IgdG8gdXNlciB0aGF0IHR5cGUgaXMgcmVxdWlyZWRcbiAgICAgIGlmICghb3B0aW9ucy50eXBlKVxuICAgICAgICB0aHJvdyBuZXcgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKTtcblxuICAgICAgLy8gY3JlYXRlIHVuaXF1ZVxuICAgICAgaWYgKG9wdGlvbnMudW5pcXVlID09PSB0cnVlKVxuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkudW5pcXVlcy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBjb2x1bW5zOiBbcHJvcGVydHlOYW1lXSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucztcbiAgICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBjb2x1bW5zLCBvcHRpb25zKTtcblxuICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICBzdHJhdGVneTpcbiAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IG9wdGlvbnMuZ2VuZXJhdGVkXG4gICAgICAgICAgICAgIDogXCJpbmNyZW1lbnRcIixcbiAgICAgICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNvbHVtbnM7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgb3B0aW9ucyB8fCB7fSxcbiAgICAgIFwidXBkYXRlRGF0ZVwiXG4gICAgKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNvbHVtbnM7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgb3B0aW9ucyB8fCB7fSxcbiAgICAgIFwiY3JlYXRlRGF0ZVwiXG4gICAgKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBjbGFzcyBPYmplY3RVdGlscyB7XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0LlxuICAgKiBXZSBjYW5ub3QgdXNlIGluc3RhbmNlb2YgYmVjYXVzZSBpdCBoYXMgcHJvYmxlbXMgd2hlbiBydW5uaW5nIG9uIGRpZmZlcmVudCBjb250ZXh0cy5cbiAgICogQW5kIHdlIGRvbid0IHNpbXBseSB1c2UgdHlwZW9mIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09IFwib2JqZWN0XCIuXG4gICAqL1xuICBzdGF0aWMgaXNPYmplY3QodmFsOiBhbnkpOiB2YWwgaXMgb2JqZWN0IHtcbiAgICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGdpdmVuIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAgICogV2UgY2Fubm90IHVzZSBpbnN0YW5jZW9mIGJlY2F1c2UgaXQgaGFzIHByb2JsZW1zIHdoZW4gcnVubmluZyBvbiBkaWZmZXJlbnQgY29udGV4dHMuXG4gICAqIEFuZCB3ZSBkb24ndCBzaW1wbHkgdXNlIHR5cGVvZiBiZWNhdXNlIHR5cGVvZiBudWxsID09PSBcIm9iamVjdFwiLlxuICAgKi9cbiAgc3RhdGljIGlzT2JqZWN0V2l0aE5hbWUodmFsOiBhbnkpOiB2YWwgaXMgb2JqZWN0ICYgeyBuYW1lOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmIHZhbFtcIm5hbWVcIl0gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFU+KHRhcmdldDogVCwgc291cmNlOiBVKTogdm9pZDtcblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlMSBUaGUgZmlyc3Qgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTIgVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc3RhdGljIGFzc2lnbjxULCBVLCBWPih0YXJnZXQ6IFQsIHNvdXJjZTE6IFUsIHNvdXJjZTI6IFYpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2UxIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMiBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UzIFRoZSB0aGlyZCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc3RhdGljIGFzc2lnbjxULCBVLCBWLCBXPihcbiAgICB0YXJnZXQ6IFQsXG4gICAgc291cmNlMTogVSxcbiAgICBzb3VyY2UyOiBWLFxuICAgIHNvdXJjZTM6IFdcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlcyBPbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllc1xuICAgKi9cbiAgc3RhdGljIGFzc2lnbih0YXJnZXQ6IG9iamVjdCwgLi4uc291cmNlczogYW55W10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlKSkge1xuICAgICAgICAodGFyZ2V0IGFzIGFueSlbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vXG4gIC8vIC8qKlxuICAvLyAgKiBDb252ZXJ0cyBNaXhlZExpc3Q8VD4gdG8gc3RyaWN0bHkgYW4gYXJyYXkgb2YgaXRzIFQgaXRlbXMuXG4gIC8vICAqL1xuICAvLyBzdGF0aWMgbWl4ZWRMaXN0VG9BcnJheTxUPihsaXN0OiBNaXhlZExpc3Q8VD4pOiBUW10ge1xuICAvLyAgIGlmIChsaXN0ICE9PSBudWxsICYmIHR5cGVvZiBsaXN0ID09PSBcIm9iamVjdFwiKSB7XG4gIC8vICAgICByZXR1cm4gT2JqZWN0LmtleXMobGlzdCkubWFwKFxuICAvLyAgICAgICAoa2V5KSA9PiAobGlzdCBhcyB7IFtrZXk6IHN0cmluZ106IFQgfSlba2V5XVxuICAvLyAgICAgKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgcmV0dXJuIGxpc3Q7XG4gIC8vICAgfVxuICAvLyB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcIjtcbmltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9HZW5lcmF0ZWRNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgb3B0aW9uczogUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaW5jcmVtZW50XCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJ1dWlkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJyb3dpZFwiLFxuICBvcHRpb25zPzogUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcImlkZW50aXR5XCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFRoaXMgY29sdW1uIGNyZWF0ZXMgYW4gaW50ZWdlciBQUklNQVJZIENPTFVNTiB3aXRoIGdlbmVyYXRlZCBzZXQgdG8gdHJ1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5T3JPcHRpb25zPzpcbiAgICB8IFwiaW5jcmVtZW50XCJcbiAgICB8IFwidXVpZFwiXG4gICAgfCBcInJvd2lkXCJcbiAgICB8IFwiaWRlbnRpdHlcIlxuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnMsXG4gIG1heWJlT3B0aW9ucz86XG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICBjb25zdCBvcHRpb25zOiBDb2x1bW5PcHRpb25zID0ge307XG4gIGxldCBzdHJhdGVneTogXCJpbmNyZW1lbnRcIiB8IFwidXVpZFwiIHwgXCJyb3dpZFwiIHwgXCJpZGVudGl0eVwiO1xuICBpZiAoc3RyYXRlZ3lPck9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHN0cmF0ZWd5T3JPcHRpb25zID09PSBcInN0cmluZ1wiKVxuICAgICAgc3RyYXRlZ3kgPSBzdHJhdGVneU9yT3B0aW9ucyBhc1xuICAgICAgICB8IFwiaW5jcmVtZW50XCJcbiAgICAgICAgfCBcInV1aWRcIlxuICAgICAgICB8IFwicm93aWRcIlxuICAgICAgICB8IFwiaWRlbnRpdHlcIjtcblxuICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChzdHJhdGVneU9yT3B0aW9ucykpIHtcbiAgICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgc3RyYXRlZ3lPck9wdGlvbnMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHJhdGVneSA9IFwiaW5jcmVtZW50XCI7XG4gIH1cbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KG1heWJlT3B0aW9ucykpIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgbWF5YmVPcHRpb25zKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIGlmIGNvbHVtbiB0eXBlIGlzIG5vdCBleHBsaWNpdGx5IHNldCB0aGVuIGRldGVybWluZSBpdCBiYXNlZCBvbiBnZW5lcmF0aW9uIHN0cmF0ZWd5XG4gICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIiB8fCBzdHJhdGVneSA9PT0gXCJpZGVudGl0eVwiKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IE51bWJlcjtcbiAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFwidXVpZFwiO1xuICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJyb3dpZFwiKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFwiaW50XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IGFuZCBnZW5lcmF0ZWQgdG8gY29sdW1uIG9wdGlvbnNcbiAgICBvcHRpb25zLnByaW1hcnkgPSB0cnVlO1xuXG4gICAgY29uc3QgY29sdW1ucyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBjb2x1bW5zLCBvcHRpb25zKTtcbiAgICAvLyByZWdpc3RlciBnZW5lcmF0ZWQgbWV0YWRhdGEgYXJnc1xuICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQ29sdW1uT3B0aW9ucyxcbiAgQ29sdW1uVHlwZSxcbiAgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yLFxuICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLFxuICBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yLFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERlc2NyaWJlcyBhbGwgcHJpbWFyeSBrZXkgY29sdW1uJ3Mgb3B0aW9ucy5cbiAqIElmIHNwZWNpZmllZCwgdGhlIG51bGxhYmxlIGZpZWxkIG11c3QgYmUgc2V0IHRvIGZhbHNlLlxuICovXG5leHBvcnQgdHlwZSBQcmltYXJ5Q29sdW1uT3B0aW9ucyA9IENvbHVtbk9wdGlvbnMgJiB7IG51bGxhYmxlPzogZmFsc2UgfTtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBQcmltYXJ5IGNvbHVtbnMgYWxzbyBjcmVhdGVzIGEgUFJJTUFSWSBLRVkgZm9yIHRoaXMgY29sdW1uIGluIGEgZGIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uKFxuICB0eXBlPzogQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGVPck9wdGlvbnM/OiBDb2x1bW5UeXBlIHwgUHJpbWFyeUNvbHVtbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgbGV0IHR5cGU6IENvbHVtblR5cGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVPck9wdGlvbnMgPT09IFN0cmluZyB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gQm9vbGVhbiB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gTnVtYmVyXG4gICAgKSB7XG4gICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucyBhcyBDb2x1bW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgPFByaW1hcnlDb2x1bW5PcHRpb25zPnR5cGVPck9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBQcmltYXJ5Q29sdW1uT3B0aW9ucztcblxuICAgIC8vIGlmIHR5cGUgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHkgdGhlbiB0cnkgdG8gZ3Vlc3MgaXRcbiAgICBjb25zdCByZWZsZWN0TWV0YWRhdGFUeXBlID1cbiAgICAgIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YVxuICAgICAgICA/IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpIHR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbm8gdHlwZSBpbiBjb2x1bW4gb3B0aW9ucyB0aGVuIHNldCB0eXBlIGZyb20gZmlyc3QgZnVuY3Rpb24gYXJndW1lbnQsIG9yIGd1ZXNzZWQgb25lXG4gICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSkgb3B0aW9ucy50eXBlID0gdHlwZTtcblxuICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSB0eXBlIHRoZW4gd2UgbmVlZCB0byBnaXZlIGVycm9yIHRvIHVzZXIgdGhhdCB0eXBlIGlzIHJlcXVpcmVkXG4gICAgaWYgKCFvcHRpb25zLnR5cGUpIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gY2hlY2sgaWYgY29sdW1uIGlzIG5vdCBudWxsYWJsZSwgYmVjYXVzZSB3ZSBjYW5ub3QgYWxsb3cgYSBwcmltYXJ5IGtleSB0byBiZSBudWxsYWJsZVxuICAgIGlmIChvcHRpb25zLm51bGxhYmxlKVxuICAgICAgdGhyb3cgbmV3IFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IHRvIGNvbHVtbiBvcHRpb25zXG4gICAgb3B0aW9ucy5wcmltYXJ5ID0gdHJ1ZTtcblxuICAgIGNvbnN0IGNvbHVtbnMgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucztcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihvYmplY3QuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgY29sdW1ucywgb3B0aW9ucyk7XG5cbiAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZWQpIHtcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICBzdHJhdGVneTpcbiAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gb3B0aW9ucy5nZW5lcmF0ZWRcbiAgICAgICAgICAgIDogXCJpbmNyZW1lbnRcIixcbiAgICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlPcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgVGFibGVNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1RhYmxlTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KFxuICBuYW1lT3JPcHRpb25zPzogc3RyaW5nIHwgRW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzogRW50aXR5T3B0aW9uc1xuKTogQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBvcHRpb25zID1cbiAgICAoT2JqZWN0VXRpbHMuaXNPYmplY3QobmFtZU9yT3B0aW9ucylcbiAgICAgID8gKG5hbWVPck9wdGlvbnMgYXMgRW50aXR5T3B0aW9ucylcbiAgICAgIDogbWF5YmVPcHRpb25zKSB8fCB7fTtcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JPcHRpb25zID09PSBcInN0cmluZ1wiID8gbmFtZU9yT3B0aW9ucyA6IG9wdGlvbnMubmFtZTtcblxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGNvbnN0IHRhYmxlcyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50YWJsZXM7XG4gICAgdGFibGVzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogXCJyZWd1bGFyXCIsXG4gICAgICBvcmRlckJ5OiBvcHRpb25zLm9yZGVyQnkgPyBvcHRpb25zLm9yZGVyQnkgOiB1bmRlZmluZWQsXG4gICAgICBlbmdpbmU6IG9wdGlvbnMuZW5naW5lID8gb3B0aW9ucy5lbmdpbmUgOiB1bmRlZmluZWQsXG4gICAgICBkYXRhYmFzZTogb3B0aW9ucy5kYXRhYmFzZSA/IG9wdGlvbnMuZGF0YWJhc2UgOiB1bmRlZmluZWQsXG4gICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hID8gb3B0aW9ucy5zY2hlbWEgOiB1bmRlZmluZWQsXG4gICAgICBzeW5jaHJvbml6ZTogb3B0aW9ucy5zeW5jaHJvbml6ZSxcbiAgICAgIHdpdGhvdXRSb3dpZDogb3B0aW9ucy53aXRob3V0Um93aWQsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQgPyBvcHRpb25zLmNvbW1lbnQgOiB1bmRlZmluZWQsXG4gICAgfSBhcyBUYWJsZU1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDYXNjYWRlLFxuICBDYXNjYWRlTWV0YWRhdGEsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgZmluYWwsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFJlcG9zaXRvcnksXG4gIFNlcXVlbmNlLFxuICBzZXF1ZW5jZU5hbWVGb3JNb2RlbCxcbiAgdHlwZSBTZXF1ZW5jZU9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgcmVzZXJ2ZWRBdHRyaWJ1dGVzLCBUeXBlT1JNRmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBDb250ZXh0LFxuICBEQktleXMsXG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMgYXMgREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIHJlYWRvbmx5LFxuICBVcGRhdGVWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBkYXRlLFxuICBEZWNvcmF0aW9uLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBsaXN0LFxuICBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5WYWxpZGF0b3JPcHRpb25zLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxuICBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbiAgVHlwZU1ldGFkYXRhLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STVN0YXRlbWVudCB9IGZyb20gXCIuL3F1ZXJ5XCI7XG5pbXBvcnQgeyBUeXBlT1JNU2VxdWVuY2UgfSBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5kZXhlcyB9IGZyb20gXCIuL2luZGV4ZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5LCBUeXBlT1JNVGFibGVTcGVjIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGFwcGx5LCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUmVwb3NpdG9yeSB9IGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBUeXBlT1JNRGlzcGF0Y2ggfSBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmltcG9ydCB7IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3JlcyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBEYXRhU291cmNlLFxuICBGaW5kT25lT3B0aW9ucyxcbiAgSW4sXG4gIEluc2VydFJlc3VsdCxcbiAgUmVsYXRpb25PcHRpb25zLFxuICBPbmVUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgTWFueVRvTWFueSxcbiAgU2VsZWN0UXVlcnlCdWlsZGVyLFxuICBWZXJzaW9uQ29sdW1uLFxuICBPbmVUb01hbnksXG4gIE1hbnlUb09uZSxcbiAgSm9pblRhYmxlLFxuICBDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NvbHVtblwiO1xuaW1wb3J0IHsgVXBkYXRlRGF0ZUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uXCI7XG5pbXBvcnQgeyBDcmVhdGVEYXRlQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NyZWF0ZURhdGVDb2x1bW5cIjtcbmltcG9ydCB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvUHJpbWFyeUdlbmVyYXRlZENvbHVtblwiO1xuaW1wb3J0IHsgUHJpbWFyeUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi9vdmVycmlkZXMvRW50aXR5XCI7XG5pbXBvcnQgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVHlwZSB9IGZyb20gXCJ0eXBlb3JtL2RyaXZlci90eXBlcy9Db2x1bW5UeXBlc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25Qb3N0Z3Jlc0NyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgVHlwZU9STVJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8VHlwZU9STUZsYWdzPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwidXNlclwiKTtcbiAgICBtb2RlbFtrZXldID0gdXNlciBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBUeXBlT1JNLWJhY2tlZCBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgRGVjYWYudHMgQWRhcHRlciBvdmVyIGEgVHlwZU9STSBEYXRhU291cmNlLCBwcm92aWRpbmcgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeS9zdGF0ZW1lbnQgZmFjdG9yaWVzLCBzZXF1ZW5jZSBtYW5hZ2VtZW50LCBlcnJvciBwYXJzaW5nLCBhbmQgZGVjb3JhdGlvbiBoZWxwZXJzLlxuICogQHRlbXBsYXRlIFkgVGhlIG5hdGl2ZSBjb25maWd1cmF0aW9uIHR5cGUgKFR5cGVPUk0gRGF0YVNvdXJjZU9wdGlvbnMpLlxuICogQHRlbXBsYXRlIEYgVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAcGFyYW0ge0RhdGFTb3VyY2VPcHRpb25zfSBzY29wZSBUaGUgRGF0YVNvdXJjZSBvcHRpb25zIGZvciB0aGUgYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIFRoZSBmbGF2b3VyIG9mIHRoZSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1BZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWRhcHRlciA9IG5ldyBUeXBlT1JNQWRhcHRlcih7IHR5cGU6ICdwb3N0Z3JlcycsIC8qIC4uLiAqXFwvIH0pO1xuICogYXdhaXQgYWRhcHRlci5pbml0aWFsaXplKCk7XG4gKiBjb25zdCByZXBvID0gbmV3IChhZGFwdGVyLnJlcG9zaXRvcnk8VXNlcj4oKSkoYWRhcHRlciwgVXNlcik7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiAnQWxpY2UnIH0pKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gKlxuICogICBBcHAtPj5BZGFwdGVyOiBuZXcgVHlwZU9STUFkYXB0ZXIob3B0cylcbiAqICAgQWRhcHRlci0+PkRTOiBpbml0aWFsaXplKClcbiAqICAgQXBwLT4+QWRhcHRlcjogcmVwb3NpdG9yeSgpXG4gKiAgIEFkYXB0ZXItLT4+QXBwOiBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBwcmVwYXJlL2NyZWF0ZS9yZXZlcnRcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBNb2RlbFxuICogICBSZXBvLS0+PkFwcDogTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gIFR5cGVPUk1RdWVyeSxcbiAgVHlwZU9STUZsYWdzLFxuICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbj4ge1xuICBwcml2YXRlIF9kYXRhU291cmNlPzogRGF0YVNvdXJjZTtcblxuICBnZXQgZGF0YVNvdXJjZSgpOiBEYXRhU291cmNlIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFTb3VyY2UpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKHRoaXMuZmxhdm91cik7XG4gICAgICB0aGlzLl9kYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2UoXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5uYXRpdmUsIHtcbiAgICAgICAgICBlbnRpdGllczogbW9kZWxzLm1hcCgoYykgPT4gY1tNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjXSksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZTtcbiAgfVxuICAvLyBwcm90ZWN0ZWQgZGF0YVNvdVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERhdGFTb3VyY2VPcHRpb25zLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKG9wdGlvbnMsIFR5cGVPUk1GbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFR5cGVPUk1GbGFncz5cbiAgKTogUHJvbWlzZTxUeXBlT1JNRmxhZ3M+IHtcbiAgICBjb25zdCBmID0gYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpO1xuICAgIGNvbnN0IG5ld09iajogYW55ID0ge1xuICAgICAgdXNlcjogKGF3YWl0IFR5cGVPUk1BZGFwdGVyLmdldEN1cnJlbnRVc2VyKHRoaXMuZGF0YVNvdXJjZSkpIGFzIHN0cmluZyxcbiAgICB9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoKTtcblxuICAgIGNvbnN0IGV4Y2VwdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUpIHtcbiAgICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobSkuaWQ7XG4gICAgICBleGNlcHRpb25zLnB1c2gocGsgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFIHx8XG4gICAgICBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgKSB7XG4gICAgICBjb25zdCBkZWNzID0gT2JqZWN0LmtleXMobSkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55Piwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIG0sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGVjID0gZGVjcy5kZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgKGRlYzogYW55KSA9PlxuICAgICAgICAgICAgZGVjLmtleSA9PT0gREJLZXlzLlRJTUVTVEFNUCAmJlxuICAgICAgICAgICAgZGVjLnByb3BzLm9wZXJhdGlvbi5pbmRleE9mKG9wZXJhdGlvbikgIT09IC0xXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkZWMpIHtcbiAgICAgICAgICBhY2N1bVtrZXldID0gZGVjLnByb3BzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgZXhjZXB0aW9ucy5wdXNoKC4uLk9iamVjdC5rZXlzKGRlY3MpKTtcbiAgICB9XG5cbiAgICBuZXdPYmouaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzID0gKFxuICAgICAgZi5pZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXMgPyBmLmlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllcyA6IFtdXG4gICAgKS5jb25jYXQoLi4uZXhjZXB0aW9ucyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZiwgbmV3T2JqKSBhcyBUeXBlT1JNRmxhZ3M7XG4gIH1cblxuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGlzcGF0Y2goKTogVHlwZU9STURpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1EaXNwYXRjaCgpO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbnN0cnVjdG9yPFR5cGVPUk1SZXBvc2l0b3J5PE0+PiB7XG4gICAgcmV0dXJuIFR5cGVPUk1SZXBvc2l0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFBvc3RncmVzIHN0YXRlbWVudCBmb3IgcXVlcnlpbmdcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFBvc3RncmVzU3RhdGVtZW50IGluc3RhbmNlIGZvciBidWlsZGluZyBxdWVyaWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7VHlwZU9STVN0YXRlbWVudDxNLCBhbnk+fSBBIG5ldyBQb3N0Z3Jlc1N0YXRlbWVudCBpbnN0YW5jZVxuICAgKi9cbiAgQGZpbmFsKClcbiAgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oKTogVHlwZU9STVN0YXRlbWVudDxNLCBhbnk+IHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1TdGF0ZW1lbnQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgUG9zdGdyZVNRTCBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUG9zdGdyZVNRTFNlcXVlbmNlIGluc3RhbmNlIGZvciBtYW5hZ2luZyBzZXF1ZW5jZXNcbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2VxdWVuY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIG5ldyBTZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgQGZpbmFsKClcbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgVHlwZU9STVNlcXVlbmNlKG9wdGlvbnMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlciBieSBjcmVhdGluZyBpbmRleGVzIGZvciBhbGwgbWFuYWdlZCBtb2RlbHNcbiAgICogQHN1bW1hcnkgU2V0cyB1cCB0aGUgbmVjZXNzYXJ5IGRhdGFiYXNlIGluZGV4ZXMgZm9yIGFsbCBtb2RlbHMgbWFuYWdlZCBieSB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkcyA9IHRoaXMuZGF0YVNvdXJjZTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHMuaW5pdGlhbGl6ZSgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgbG9nLnZlcmJvc2UoYCR7dGhpcy5mbGF2b3VyfSBhZGFwdGVyIGluaXRpYWxpemVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgaW5kZXhlcyBmb3IgdGhlIGdpdmVuIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBkYXRhYmFzZSBpbmRleGVzIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7Li4uQ29uc3RydWN0b3I8TT59IG1vZGVscyAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvcnMgdG8gY3JlYXRlIGluZGV4ZXMgZm9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGluZGV4ZXMgYXJlIGNyZWF0ZWRcbiAgICovXG4gIEBmaW5hbCgpXG4gIHByb3RlY3RlZCBhc3luYyBpbmRleDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIC4uLm1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleGVzOiBUeXBlT1JNUXVlcnlbXSA9IGdlbmVyYXRlSW5kZXhlcyhtb2RlbHMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShcIkJFR0lOXCIpO1xuXG4gICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KGluZGV4LnF1ZXJ5LCBpbmRleC52YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2UucXVlcnkoXCJDT01NSVRcIik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KFwiUk9MTEJBQ0tcIik7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBTUUwgcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBleGVjdXRlIHJhdyBTUUwgcXVlcmllc1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZVxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcSAtIFRoZSBxdWVyeSB0byBleGVjdXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihxOiBUeXBlT1JNUXVlcnkpOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yYXcpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UuaW5pdGlhbGl6ZSgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcXVlcnksIHZhbHVlcyB9ID0gcTtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYGV4ZWN1dGluZyBxdWVyeTogJHsocXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikuZ2V0U3FsKCl9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KHF1ZXJ5LCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazoga2V5b2YgTSxcbiAgICBjaGlsZCA9IGZhbHNlXG4gICk6IHtcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaWQ6IHN0cmluZztcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9IHtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHN1cGVyLnByZXBhcmUobW9kZWwsIHBrKTtcblxuICAgIHByZXBhcmVkLnJlY29yZCA9IE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBIHx8IHRoaXMuaXNSZXNlcnZlZChrZXkpKVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKE1vZGVsLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnByZXBhcmUodmFsdWUsIGZpbmRQcmltYXJ5S2V5KHZhbHVlKS5pZCwgdHJ1ZSkucmVjb3JkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy9kbyBub3RoaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgY29uc3QgY29uc3RyOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0gTW9kZWwuZ2V0KFxuICAgICAgbW9kZWwuY29uc3RydWN0b3IubmFtZVxuICAgICk7XG4gICAgaWYgKCFjb25zdHIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gbm90IGZvdW5kIGluIHJlZ2lzdHJ5YFxuICAgICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBjaGlsZFxuICAgICAgPyBuZXcgKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0oKVxuICAgICAgOiBuZXcgY29uc3RyKCk7XG4gICAgaWYgKGNoaWxkKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkuZm9yRWFjaChcbiAgICAgIChba2V5LCB2YWxdKSA9PiAocmVzdWx0W2tleSBhcyBrZXlvZiB0eXBlb2YgcmVzdWx0XSA9IHZhbClcbiAgICApO1xuICAgIHByZXBhcmVkLnJlY29yZCA9IHJlc3VsdDtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBNIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZXZlcnQpO1xuICAgIGlmICh0cmFuc2llbnQpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBvYmopXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke3R5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IGNsYXp6IDogY2xhenoubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pKG9iaik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBhIG5ldyByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcG8uc2F2ZShtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byByZWFkIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIHByaW1hcnkga2V5IGNvbHVtXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWFkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHBrOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgcTogRmluZE9uZU9wdGlvbnMgPSB7XG4gICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgW3BrXTogaWQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmVzdWx0ID0gKGF3YWl0IHJlcG8uZmluZE9uZShxKSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGlmICghcmVzdWx0KVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZDogJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiA/IHRhYmxlTmFtZSA6IFJlcG9zaXRvcnkudGFibGUodGFibGVOYW1lKX1gXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gdXBkYXRlIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVsZXRlIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHRhYmxlTmFtZSwgaWQsIHBrKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlcG8uZGVsZXRlKGlkKTtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCByZXN1bHQ6IEluc2VydFJlc3VsdCA9IGF3YWl0IHJlcG8uaW5zZXJ0KG1vZGVsKTtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcmVzdWx0LmlkZW50aWZpZXJzLm1hcCgoaWQpID0+IGlkLmlkKSxcbiAgICAgICAgXCJpZFwiXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKCFpZC5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgcmV0dXJuIHJlcG8uZmluZEJ5KHsgW3BrXTogSW4oaWQpIH0pO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgcGs6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAoY29uc3QgbSBvZiBtb2RlbCkge1xuICAgICAgcmVzdWx0LnB1c2goYXdhaXQgdGhpcy51cGRhdGUodGFibGVOYW1lLCBtW3BrXSwgbSwgLi4uYXJncykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgbW9kZWxzID0gYXdhaXQgdGhpcy5yZWFkQWxsKHRhYmxlTmFtZSwgaWRzLCBwayk7XG4gICAgICBhd2FpdCByZXBvLmRlbGV0ZShpZHMpO1xuICAgICAgcmV0dXJuIG1vZGVscztcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgYW5kIGNvbnZlcnRzIGl0IHRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHZhcmlvdXMgZXJyb3IgdHlwZXMgdG8gYXBwcm9wcmlhdGUgQmFzZUVycm9yIHN1YnR5cGVzXG4gICAqIEBwYXJhbSB7RXJyb3J8c3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yIGFzIGEgQmFzZUVycm9yXG4gICAqL1xuICBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgcmV0dXJuIFR5cGVPUk1BZGFwdGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWQgaW4gUG9zdGdyZVNRTFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGlzUmVzZXJ2ZWQoYXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhYXR0ci5tYXRjaChyZXNlcnZlZEF0dHJpYnV0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWV0aG9kIHRvIHBhcnNlIGFuIGVycm9yIGFuZCBjb252ZXJ0IGl0IHRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHZhcmlvdXMgZXJyb3IgdHlwZXMgdG8gYXBwcm9wcmlhdGUgQmFzZUVycm9yIHN1YnR5cGVzIGJhc2VkIG9uIFBvc3RncmVTUUwgZXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSB7RXJyb3J8c3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yIGFzIGEgQmFzZUVycm9yXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlRXJyb3JcbiAgICogICBwYXJ0aWNpcGFudCBFcnJvclR5cGVzXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+cGFyc2VFcnJvcjogZXJyLCByZWFzb25cbiAgICogICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogQ2hlY2sgaWYgZXJyIGlzIGFscmVhZHkgYSBCYXNlRXJyb3JcbiAgICogICBhbHQgZXJyIGlzIEJhc2VFcnJvclxuICAgKiAgICAgcGFyc2VFcnJvci0tPj5DYWxsZXI6IHJldHVybiBlcnJcbiAgICogICBlbHNlIGVyciBpcyBzdHJpbmdcbiAgICogICAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBFeHRyYWN0IGNvZGUgZnJvbSBzdHJpbmdcbiAgICogICAgIGFsdCBjb2RlIG1hdGNoZXMgXCJkdXBsaWNhdGUga2V5fGFscmVhZHkgZXhpc3RzXCJcbiAgICogICAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKGNvZGUpXG4gICAqICAgICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIGNvZGUgbWF0Y2hlcyBcImRvZXMgbm90IGV4aXN0fG5vdCBmb3VuZFwiXG4gICAqICAgICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKVxuICAgKiAgICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBlcnIgaGFzIGNvZGUgcHJvcGVydHlcbiAgICogICAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBFeHRyYWN0IGNvZGUgYW5kIHJlYXNvblxuICAgKiAgIGVsc2VcbiAgICogICAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBVc2UgZXJyLm1lc3NhZ2UgYXMgY29kZVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBTd2l0Y2ggb24gUG9zdGdyZVNRTCBlcnJvciBjb2RlXG4gICAqICAgYWx0IGNvZGUgaXMgMjM1MDUgKHVuaXF1ZV92aW9sYXRpb24pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgMjM1MDMgKGZvcmVpZ25fa2V5X3Zpb2xhdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAwMSAodW5kZWZpbmVkX3RhYmxlKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyNzAzICh1bmRlZmluZWRfY29sdW1uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDA3IChkdXBsaWNhdGVfdGFibGUpXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMTYgKGludmFsaWRfdGFibGVfZGVmaW5pdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgSW5kZXhFcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogSW5kZXhFcnJvclxuICAgKiAgIGVsc2UgY29kZSBtYXRjaGVzIFwiRUNPTk5SRUZVU0VEXCJcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25uZWN0aW9uRXJyb3JcbiAgICogICBlbHNlXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IEludGVybmFsRXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgYW55O1xuICAgIGNvbnN0IGNvZGU6IHN0cmluZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcblxuICAgIGlmIChjb2RlLm1hdGNoKC9kdXBsaWNhdGUga2V5fGFscmVhZHkgZXhpc3RzL2cpKVxuICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGNvZGUpO1xuICAgIGlmIChjb2RlLm1hdGNoKC9kb2VzIG5vdCBleGlzdHxub3QgZm91bmQvZykpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcblxuICAgIC8vIFBvc3RncmVTUUwgZXJyb3IgY29kZXM6IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9lcnJjb2Rlcy1hcHBlbmRpeC5odG1sXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIC8vIEludGVncml0eSBjb25zdHJhaW50IHZpb2xhdGlvbnNcbiAgICAgIGNhc2UgXCIyMzUwNVwiOiAvLyB1bmlxdWVfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiMjM1MDNcIjogLy8gZm9yZWlnbl9rZXlfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiNDJQMDdcIjogLy8gZHVwbGljYXRlX3RhYmxlXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gT2JqZWN0IG5vdCBmb3VuZCBlcnJvcnNcbiAgICAgIGNhc2UgXCI0MlAwMVwiOiAvLyB1bmRlZmluZWRfdGFibGVcbiAgICAgIGNhc2UgXCI0MjcwM1wiOiAvLyB1bmRlZmluZWRfY29sdW1uXG4gICAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gSW52YWxpZCBvYmplY3QgZGVmaW5pdGlvblxuICAgICAgY2FzZSBcIjQyUDE2XCI6IC8vIGludmFsaWRfdGFibGVfZGVmaW5pdGlvblxuICAgICAgICByZXR1cm4gbmV3IEluZGV4RXJyb3IoZXJyKTtcblxuICAgICAgLy8gQ29ubmVjdGlvbiBlcnJvcnNcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY29ubmVjdChjb25maWc6IERhdGFTb3VyY2VPcHRpb25zKTogUHJvbWlzZTxEYXRhU291cmNlPiB7XG4gICAgY29uc3QgY29uID0gbmV3IERhdGFTb3VyY2UoY29uZmlnKTtcbiAgICBpZiAoIWNvbi5pc0luaXRpYWxpemVkKSBhd2FpdCBjb24uaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiBjb247XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNyZWF0ZURhdGFiYXNlKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgZGF0YWJhc2UgJHtkYk5hbWV9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBEQVRBQkFTRSAke2RiTmFtZX1gKTtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGVkIGRhdGFiYXNlICR7ZGJOYW1lfWApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTm90aWZ5RnVuY3Rpb24oXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5jcmVhdGVOb3RpZnlGdW5jdGlvbik7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nIG5vdGlmeSBmdW5jdGlvbmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKVxuUkVUVVJOUyB0cmlnZ2VyIEFTICQkXG5CRUdJTlxuICAgIFBFUkZPUk0gcGdfbm90aWZ5KFxuICAgICAgICAndGFibGVfY2hhbmdlcycsXG4gICAgICAgIGpzb25fYnVpbGRfb2JqZWN0KFxuICAgICAgICAgICAgJ3RhYmxlJywgVEdfVEFCTEVfTkFNRSxcbiAgICAgICAgICAgICdhY3Rpb24nLCBUR19PUCxcbiAgICAgICAgICAgICdkYXRhJywgcm93X3RvX2pzb24oTkVXKSxcbiAgICAgICAgICAgICdvbGRfZGF0YScsIHJvd190b19qc29uKE9MRClcbiAgICAgICAgKTo6dGV4dFxuICAgICk7XG4gICAgUkVUVVJOIE5FVztcbkVORDtcbiQkIExBTkdVQUdFIHBscGdzcWwgU0VDVVJJVFkgREVGSU5FUlxuO2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBPV05FUiBUTyAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBcbiAgICAgICAgICAgIEdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBUTyBwdWJsaWM7XG4gICAgICAgIGApO1xuICAgICAgbG9nLmluZm8oYENyZWF0ZWQgbm90aWZ5IGZ1bmN0aW9uYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVEYXRhYmFzZShcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nLFxuICAgIHVzZXI/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh1c2VyKSBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERTtgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYERST1AgREFUQUJBU0UgJHtkYk5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBVU0VSICR7dXNlcn0gV0lUSCBQQVNTV09SRCAnJHtwYXNzd29yZH0nYCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBDT05ORUNUIE9OIERBVEFCQVNFICR7ZGJOYW1lfSBUTyAke3VzZXJ9YCk7XG5cbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgQ1JFQVRFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgcHVibGljIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFRBQkxFUyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHB1YmxpYyBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBTRVFVRU5DRVMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVVc2VyKFxuICAgIGNsaWVudDogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgYWRtaW46IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRUFTU0lHTiBPV05FRCBCWSAke3VzZXJ9IFRPICR7YWRtaW59YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRVZPS0UgQUxMIE9OIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIFRBQkxFUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIEZPUiBST0xFICR7YWRtaW59IElOIFNDSEVNQSBwdWJsaWMgUkVWT0tFIEFMTCBPTiBTRVFVRU5DRVMgRlJPTSAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIEZVTkNUSU9OUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERWApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIFVTRVIgSUYgRVhJU1RTIFwiJHt1c2VyfVwiYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlzUGs6IGJvb2xlYW4sXG4gICAgaXNGayA9IGZhbHNlXG4gICkge1xuICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBpc1BrID8gXCJURVhUIFBSSU1BUlkgS0VZXCIgOiBpc0ZrID8gXCJURVhUXCIgOiBcIlZBUkNIQVJcIjtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIlNFUklBTCBQUklNQVJZIEtFWVwiIDogXCJJTlRFR0VSXCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJCT09MRUFOXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJUSU1FU1RBTVBcIjtcbiAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIkJJR0lOVCBQUklNQVJZIEtFWVwiIDogXCJCSUdJTlRcIjtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBjb25zdCBtbSA9IG5ldyBtKCk7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gICAgICAgICAgICBtbSxcbiAgICAgICAgICAgIGZpbmRQcmltYXJ5S2V5KG1tKS5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGVsOiBtLFxuICAgICAgICAgICAgcGtUeXBlOiB0eXBlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaXNQazogYm9vbGVhbixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBWYWxpZGF0b3JPcHRpb25zXG4gICkge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEOlxuICAgICAgICByZXR1cm4gXCJOT1QgTlVMTFwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIOlxuICAgICAgICBpZiAoaXNQayB8fCAhb3B0aW9ucyB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgkeyhvcHRpb25zIGFzIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV9taW5fbGVuZ3RoX2NoZWNrIENIRUNLIChMRU5HVEgoJHtwcm9wfSkgPj0gJHsob3B0aW9ucyBhcyBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFUVEVSTjpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuVVJMOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5FTUFJTDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fcGF0dGVybl9jaGVjayBDSEVDSyAoJHtwcm9wfSB+ICcke2NvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcygob3B0aW9ucyBhcyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuUEFUVEVSTl0gYXMgc3RyaW5nKX0nKWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLkRBVEU6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU46XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9XyR7a2V5fV9jaGVjayBDSEVDSyAoJHtwcm9wfSA+PSAkeyhvcHRpb25zIGFzIE1pblZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1JTl19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1BWDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fJHtrZXl9X2NoZWNrIENIRUNLICgke3Byb3B9IDw9ICR7KG9wdGlvbnMgYXMgTWF4VmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUFYXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFTU1dPUkQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VSZWxhdGlvbnNUb1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAga2V5OiBQZXJzaXN0ZW5jZUtleXMsXG4gICAgb3B0aW9uczogUmVsYXRpb25zTWV0YWRhdGFcbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjbGF6eik7XG4gICAgY29uc3QgeyBjYXNjYWRlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhc2NhZGVTdHIgPSBgJHtjYXNjYWRlLnVwZGF0ZSA/IFwiIE9OIFVQREFURSBDQVNDQURFXCIgOiBcIlwifSR7Y2FzY2FkZS5kZWxldGUgPyBcIiBPTiBERUxFVEUgQ0FTQ0FERVwiIDogXCJcIn1gO1xuICAgIHN3aXRjaCAoYHJlbGF0aW9ucyR7a2V5fWApIHtcbiAgICAgIGNhc2UgUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkU6XG4gICAgICAgIHJldHVybiBgRk9SRUlHTiBLRVkgKCR7cHJvcH0pIFJFRkVSRU5DRVMgJHt0YWJsZU5hbWV9KCR7cGt9KSR7Y2FzY2FkZVN0cn1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xpZW50OiBEYXRhU291cmNlLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFR5cGVPUk1UYWJsZVNwZWM+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNVGFibGVTcGVjPiA9IHt9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoe30pO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGNvbnN0IHsgaWQgfSA9IGZpbmRQcmltYXJ5S2V5KG0pO1xuXG4gICAgbGV0IGlzUGs6IGJvb2xlYW4sIGNvbHVtbjogc3RyaW5nO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtKSBhcyAoa2V5b2YgTSlbXTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KVtwcm9wXSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgIHByb3AudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICBwcm9wID09PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaXNQayA9IHByb3AgPT09IGlkO1xuICAgICAgY29sdW1uID0gUmVwb3NpdG9yeS5jb2x1bW4obSwgcHJvcC50b1N0cmluZygpKTtcblxuICAgICAgY29uc3QgYWxsRGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICBtLFxuICAgICAgICBwcm9wLnRvU3RyaW5nKCksXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkZWNvcmF0b3JEYXRhID0gYWxsRGVjcy5kZWNvcmF0b3JzLnJlZHVjZShcbiAgICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBlbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZWw7XG4gICAgICAgICAgaWYgKGtleSA9PT0gTW9kZWxLZXlzLlRZUEUgJiYgIWFjY3VtW1ZhbGlkYXRpb25LZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICBhY2N1bVtWYWxpZGF0aW9uS2V5cy5UWVBFXSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tVHlwZXM6IFtwcm9wcy5uYW1lIGFzIHN0cmluZ10sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiZGVmaW5lcyB0aGUgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoZSBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFZhbGlkYXRpb25LZXlzLlRZUEUpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGNhbiBvbmx5IHN1cHBvcnQgYmFzaXMgY3R5cGVzIGF0IHRoaXMgdGltZVxuICAgICAgICAgICAgYWNjdW1ba2V5XSA9IHByb3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBkYkRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgUmVwb3NpdG9yeS5rZXkoXCJyZWxhdGlvbnNcIiksXG4gICAgICAgIG0sXG4gICAgICAgIHByb3AudG9TdHJpbmcoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcXVlcnk6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBjb25zdHJhaW50czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IHR5cGVEYXRhOiBUeXBlTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2hpbGRDbGFzczogQ29uc3RydWN0b3I8TW9kZWw+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGNoaWxkUGs6IGFueTtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRlY29yYXRvckRhdGEpLmxlbmd0aCkge1xuICAgICAgICB0eXBlRGF0YSA9IGRlY29yYXRvckRhdGFbVmFsaWRhdGlvbktleXMuVFlQRV0gYXMgVHlwZU1ldGFkYXRhO1xuXG4gICAgICAgIGlmICghdHlwZURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZFR5cGU6XG4gICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICB8IHsgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHN0cmluZzsgcGtUeXBlPzogc3RyaW5nIH0gPVxuICAgICAgICAgIHRoaXMucGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIHR5cGVvZiAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55W10pWzBdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgPyAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55KVswXSgpXG4gICAgICAgICAgICAgIDogKHR5cGVEYXRhLmN1c3RvbVR5cGVzIGFzIGFueSlbMF0sXG4gICAgICAgICAgICBpc1BrXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcGFyc2VkVHlwZSA9IHsgbW9kZWw6IHBhcnNlZFR5cGUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwZVN0cjpcbiAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgcGFyc2VkVHlwZS5tb2RlbCBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHR5cGVTdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlU3RyKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codHlwZVN0cik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgLy8gY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBQb3N0Z3Jlc1RhYmxlU3BlYz4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKHBvb2wsIHR5cGVTdHIpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGlsZENsYXNzID0gcGFyc2VkVHlwZS5tb2RlbCBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgICAgICAgICBjb25zdCBtID0gbmV3IGNoaWxkQ2xhc3MoKTtcbiAgICAgICAgICAgIGNoaWxkUGsgPSBmaW5kUHJpbWFyeUtleShtKTtcbiAgICAgICAgICAgIHR5cGVTdHIgPSB0aGlzLnBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgICAgICAgICAgIHBhcnNlZFR5cGUucGtUeXBlIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGNsaWVudCwgY2hpbGRDbGFzcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvbmZsaWN0RXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cCA9IEFycmF5LmlzQXJyYXkodHlwZURhdGEuY3VzdG9tVHlwZXMpXG4gICAgICAgICAgPyB0eXBlRGF0YS5jdXN0b21UeXBlc1swXVxuICAgICAgICAgIDogdHlwZURhdGEuY3VzdG9tVHlwZXM7XG4gICAgICAgIHRwID0gdHlwZW9mIHRwID09PSBcImZ1bmN0aW9uXCIgJiYgIXRwLm5hbWUgPyB0cCgpIDogdHA7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25TdHIgPSB0aGlzLnBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICBpc1BrLFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gICAgICAgICAgKGRlY29yYXRvckRhdGFbXG4gICAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXG4gICAgICAgICAgXSBhcyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zKSB8fCB7XG4gICAgICAgICAgICBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF06IDI1NSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcSA9IGAke2NvbHVtbn0gJHt0eXBlU3RyfSR7dmFsaWRhdGlvblN0cn1gO1xuXG4gICAgICAgIGlmIChpc1BrKSB7XG4gICAgICAgICAgcXVlcnkudW5zaGlmdChxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVyeS5wdXNoKHEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcm9wc10gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9yRGF0YSkuZmlsdGVyKFxuICAgICAgICAgIChba10pID0+XG4gICAgICAgICAgICAhW1ZhbGlkYXRpb25LZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdLmluY2x1ZGVzKGsgYXMgYW55KVxuICAgICAgICApKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICAgIGlzUGssXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb24uc3RhcnRzV2l0aChcIkNPTlNUUkFJTlRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8gaWdub3JlIGZvciBub3cuIHRoaXMgbGVhdmVzIGZvcmVpZ24ga2V5cyBvdXRcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1iaW5hcnktZXhwcmVzc2lvblxuICAgICAgaWYgKGZhbHNlIHx8IChkYkRlY3MgJiYgZGJEZWNzLmRlY29yYXRvcnMubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIXR5cGVEYXRhKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkYkRlY3MuZGVjb3JhdG9ycykge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjb3JhdG9yO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnBhcnNlUmVsYXRpb25zVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIGNoaWxkQ2xhc3MgYXMgQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgICAgICAgICAgY2hpbGRQay5pZCxcbiAgICAgICAgICAgIGtleSBhcyBQZXJzaXN0ZW5jZUtleXMsXG4gICAgICAgICAgICBwcm9wcyBhcyB1bmtub3duIGFzIFJlbGF0aW9uc01ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi5zdGFydHNXaXRoKFwiRk9SRUlHTlwiKSkge1xuICAgICAgICAgICAgZm9yZWlnbktleXMucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHJlbGF0aW9uOiAke2tleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3Byb3AudG9TdHJpbmcoKV0gPSB7XG4gICAgICAgIHF1ZXJ5OiBxdWVyeS5qb2luKFwiIFwiKSxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgcHJpbWFyeUtleTogaXNQayxcbiAgICAgICAgY29uc3RyYWludHM6IGNvbnN0cmFpbnRzLFxuICAgICAgICBmb3JlaWduS2V5czogZm9yZWlnbktleXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KTtcbiAgICBjb25zdCBxdWVyeSA9IHZhbHVlcy5tYXAoKHIpID0+IHIucXVlcnkpLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdmFsdWVzXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuY29uc3RyYWludHMubGVuZ3RoKVxuICAgICAgLm1hcCgocikgPT4gci5jb25zdHJhaW50cylcbiAgICAgIC5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCBmb3JlaWduS2V5cyA9IHZhbHVlc1xuICAgICAgLmZpbHRlcigoYykgPT4gISFjLmZvcmVpZ25LZXlzLmxlbmd0aClcbiAgICAgIC5tYXAoKHIpID0+IHIuZm9yZWlnbktleXMpXG4gICAgICAuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgdmFscyA9IFtxdWVyeSwgY29uc3RyYWludHNdO1xuICAgIGlmIChmb3JlaWduS2V5cykge1xuICAgICAgdmFscy5wdXNoKGZvcmVpZ25LZXlzKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgQ1JFQVRFIFRBQkxFICR7dGFibGVOYW1lfSAoJHt2YWxzLmZpbHRlcigodikgPT4gISF2KS5qb2luKFwiLFxcblwiKX0pYDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5U3RyaW5nKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUUklHR0VSIG5vdGlmeV9jaGFuZ2VzXyR7dGFibGVOYW1lfVxuQUZURVIgSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUgT04gJHt0YWJsZU5hbWV9XG4gICAgRk9SIEVBQ0ggUk9XXG4gICAgRVhFQ1VURSBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpO2BcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKGNsaWVudDogRGF0YVNvdXJjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgU0VMRUNUIENVUlJFTlRfVVNFUjtgO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnlTdHJpbmcpO1xuICAgICAgcmV0dXJuIHJlc3VsdFswXS5jdXJyZW50X3VzZXI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZWNvcmF0aW9uKCkge1xuICAgIC8vIEB0YWJsZSgpID0+IEBFbnRpdHkoKVxuICAgIGNvbnN0IHRhYmxlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0YWJsZUtleSlcbiAgICAgIC5leHRlbmQoKG9yaWdpbmFsOiBhbnkpID0+XG4gICAgICAgIEVudGl0eSgpKG9yaWdpbmFsW01vZGVsS2V5cy5BTkNIT1JdIHx8IG9yaWdpbmFsKVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAcGsoKSA9PiBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpIHwgQFByaW1hcnlDb2x1bW4oKVxuICAgIGNvbnN0IHBrS2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcblxuICAgIGZ1bmN0aW9uIHBrRGVjKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICAgICAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIHByb3BNZXRhZGF0YShwa0tleSwgb3B0aW9ucyksXG4gICAgICBdO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBrRGVjKG9yaWdpbmFsOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICBsZXQgdHlwZSA9XG4gICAgICAgICAgb3B0aW9ucy50eXBlIHx8IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3Iob3JpZ2luYWwsIHByb3ApO1xuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgTWlzc2luZyB0eXBlIGluZm9ybWF0aW9uIGZvciBwcm9wZXJ0eSAke3Byb3B9IG9mICR7b3JpZ2luYWwubmFtZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG9wdGlvbnMubmFtZSB8fCBzZXF1ZW5jZU5hbWVGb3JNb2RlbChvcmlnaW5hbCwgXCJwa1wiKTtcbiAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgICAgICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKHtcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICB0eXBlID0gXCJudW1lcmljXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICB0eXBlID0gXCJ2YXJjaGFyXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgICB0eXBlID0gXCJiaWdpbnRcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHt0eXBlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgICAgICBQcmltYXJ5Q29sdW1uKHtcbiAgICAgICAgICAgICAgdHlwZTogdHlwZSBhcyBDb2x1bW5UeXBlLFxuICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpKG9yaWdpbmFsLCBwcm9wKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IocGtLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBwa0RlYyxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBjb2x1bW4oXCJjb2x1bW5OYW1lXCIpID0+IEBDb2x1bW4oe25hbWU6IFwiY29sdW1uTmFtZVwifSlcbiAgICBjb25zdCBjb2x1bW5LZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihjb2x1bW5LZXkpXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW0obmFtZTogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbHVtbihvYmo6IGFueSwgcHJvcDogYW55KSB7XG4gICAgICAgICAgICByZXR1cm4gQ29sdW1uKHtcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSB8fCBwcm9wLFxuICAgICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXJnc1sxXTtcbiAgICAgICAgICByZXR1cm4gW2NvbHVtbk5hbWVdO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHVuaXF1ZSA9PiBAQ29sdW1uKHt1bmlxdWU6IHRydWV9KVxuICAgIGNvbnN0IHVuaXF1ZUtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5VTklRVUUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVuaXF1ZUtleSlcbiAgICAgIC5kZWZpbmUocHJvcE1ldGFkYXRhKHVuaXF1ZUtleSwge30pKVxuICAgICAgLmV4dGVuZChDb2x1bW4oeyB1bmlxdWU6IHRydWUgfSkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEByZXF1aXJlZCA9PiBAQ29sdW1uKHsgbnVsbGFibGU6IGZhbHNlIH0pXG4gICAgY29uc3QgcmVxdWlyZWRLZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IocmVxdWlyZWRLZXkpXG4gICAgICAuZXh0ZW5kKENvbHVtbih7IG51bGxhYmxlOiBmYWxzZSB9KSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHZlcnNpb24gPT4gQFZlcnNpb25Db2x1bW4oKVxuICAgIGNvbnN0IHZlcnNpb25LZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuVkVSU0lPTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodmVyc2lvbktleSlcbiAgICAgIC5kZWZpbmUodHlwZShOdW1iZXIubmFtZSksIFZlcnNpb25Db2x1bW4oKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgZnVuY3Rpb24gVmFsaWRhdGlvblVwZGF0ZUtleShrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG4gICAgfVxuXG4gICAgLy8gQHRpbWVzdGFtcChvcCkgPT4gQENyZWF0ZURhdGVDb2x1bW4oKSB8fCBAVXBkYXRlRGF0ZUNvbHVtbigpXG4gICAgY29uc3QgdGltZXN0YW1wS2V5ID0gVmFsaWRhdGlvblVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKTtcblxuICAgIGZ1bmN0aW9uIHRzKG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdLCBmb3JtYXQ6IHN0cmluZykge1xuICAgICAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgICAgIGRhdGUoZm9ybWF0LCBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICAgICAgcmVxdWlyZWQoREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgfSksXG4gICAgICBdO1xuICAgICAgaWYgKG9wZXJhdGlvbi5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICBwcm9wTWV0YWRhdGEodGltZXN0YW1wS2V5LCB7XG4gICAgICAgICAgICBtZXNzYWdlOiBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElELFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICBlbHNlIGRlY29yYXRvcnMucHVzaChyZWFkb25seSgpKTtcbiAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0aW1lc3RhbXBLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiB0cyxcbiAgICAgIH0pXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0aW1lc3RhbXAoLi4ub3BzOiBPcGVyYXRpb25LZXlzW10pIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdGltZXN0YW1wKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChvcHMuaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgICAgICAgICAgICByZXR1cm4gVXBkYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICByZXR1cm4gQ3JlYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICByZXR1cm4gYXJnc1swXTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBvbmVUb09uZShjbGF6eikgPT4gQE9uZVRvT25lKCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvT25lS2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG9uZVRvT25lS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9PbmUoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAoY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6eikgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgdHlwZShbXG4gICAgICAgICAgICAgICh0eXBlb2YgY2xhenogPT09IFwiZnVuY3Rpb25cIiAmJiAhY2xhenoubmFtZVxuICAgICAgICAgICAgICAgID8gY2xhenpcbiAgICAgICAgICAgICAgICA6IGNsYXp6Lm5hbWUpIGFzIGFueSxcbiAgICAgICAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG9uZVRvT25lS2V5LCBtZXRhZGF0YSksXG4gICAgICAgICAgICBPbmVUb09uZShcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKSkuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW3BrXTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEpvaW5Db2x1bW4oKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAb25lVG9NYW55KGNsYXp6KSA9PiBAT25lVG9NYW55KCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3Iob25lVG9NYW55S2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhblxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogKGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogY2xhenopIGFzIHN0cmluZyxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgbGlzdChjbGF6eiksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEob25lVG9NYW55S2V5LCBtZXRhZGF0YSksXG4gICAgICAgICAgICBmdW5jdGlvbiBPbmVUb01hbnlXcmFwcGVyKG9iajogYW55LCBwcm9wOiBhbnkpOiBhbnkge1xuICAgICAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIE9uZVRvTWFueShcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyb3NzUmVsYXRpb25LZXkgPSBPYmplY3Qua2V5cyhtKS5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAgayxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVjcyB8fCAhZGVjcy5kZWNvcmF0b3JzIHx8ICFkZWNzLmRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzaWduVHlwZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgICAgICAgICAgTW9kZWxLZXlzLlRZUEUsXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVzaWduVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBObyBUeXBlIERlZmluaXRpb24gZm91bmQgZm9yICR7a30gaW4gJHttLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNpZ25UeXBlLm5hbWUgPT09IG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNyb3NzUmVsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIGBDcm9zcyByZWxhdGlvbiBub3QgZm91bmQuIERpZCB5b3UgdXNlIEBtYW55VG9PbmUgb24gdGhlICR7Y2xhenoubmFtZX0/YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW2Nyb3NzUmVsYXRpb25LZXldO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgICApKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBtYW55VG9PbmUoY2xhenopID0+IEBNYW55VG9PbmUoKCkgPT4gY2xhenopXG4gICAgY29uc3QgbWFueVRvT25lS2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fT05FKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihtYW55VG9PbmVLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYW55VG9PbmUoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAoY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6eikgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgdHlwZShbXG4gICAgICAgICAgICAgICh0eXBlb2YgY2xhenogPT09IFwiZnVuY3Rpb25cIiAmJiAhY2xhenoubmFtZVxuICAgICAgICAgICAgICAgID8gY2xhenpcbiAgICAgICAgICAgICAgICA6IGNsYXp6Lm5hbWUpIGFzIGFueSxcbiAgICAgICAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG1hbnlUb09uZUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgZnVuY3Rpb24gTWFueVRvT25lV3JhcHBlcihvYmo6IGFueSwgcHJvcDogYW55KTogYW55IHtcbiAgICAgICAgICAgICAgcmV0dXJuIE1hbnlUb09uZShcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyb3NzUmVsYXRpb25LZXkgPSBPYmplY3Qua2V5cyhtKS5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX01BTlkpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAgayxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVjcyB8fCAhZGVjcy5kZWNvcmF0b3JzIHx8ICFkZWNzLmRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdERlYyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTElTVCksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGlzdERlYylcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBObyBUeXBlIERlZmluaXRpb24gZm91bmQgZm9yICR7a30gaW4gJHttLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBsaXN0RGVjLmNsYXp6WzBdKCkubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNyb3NzUmVsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIGBDcm9zcyByZWxhdGlvbiBub3QgZm91bmQuIERpZCB5b3UgdXNlIEBtYW55VG9PbmUgb24gdGhlICR7Y2xhenoubmFtZX0/YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW2Nyb3NzUmVsYXRpb25LZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKShvYmosIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAbWFueVRvTWFueShjbGF6eikgPT4gQE1hbnlUb01hbnkoKCkgPT4gY2xhenopXG4gICAgY29uc3QgbWFueVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX01BTlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb01hbnlLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYW55VG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhblxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG1hbnlUb01hbnlLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIE1hbnlUb01hbnkoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luVGFibGUoKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcblxuVHlwZU9STUFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pbmRleGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9xdWVyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2VxdWVuY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1EaXNwYXRjaFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STVJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlT1JNIGludGVncmF0aW9uIGZvciBEZWNhZi50cy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBUeXBlT1JNLWJhY2tlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGVjYWYudHMgZGF0YSBhY2Nlc3MgYWJzdHJhY3Rpb25zLCBpbmNsdWRpbmcgdGhlIGFkYXB0ZXIsIHJlcG9zaXRvcnksIHN0YXRlbWVudCBidWlsZGVyLCBwYWdpbmF0aW9uIHV0aWxpdGllcywgaW5kZXggaGVscGVycywgYW5kIHR5cGUgZGVmaW5pdGlvbnMuIEtleSBleHBvcnRzIGluY2x1ZGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSwge0BsaW5rIFR5cGVPUk1SZXBvc2l0b3J5fSwge0BsaW5rIFR5cGVPUk1TdGF0ZW1lbnR9LCB7QGxpbmsgVHlwZU9STVBhZ2luYXRvcn0sIGFuZCBpbmRleCBnZW5lcmF0aW9uIHV0aWxpdGllcy5cbiAqIEBtb2R1bGUgZm9yLXR5cGVvcm1cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uLlxuICogQHN1bW1hcnkgVGhlIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBmb3ItdHlwZW9ybSBwYWNrYWdlLlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7Ozs7O0FBS0c7QUFDSSxNQUFNLGtCQUFrQixHQUM3QjtBQUVLLE1BQU0sY0FBYyxHQUFHO0FBRTlCOzs7Ozs7Ozs7Ozs7O0FBYUc7QUFDSDs7Ozs7O0FBTUc7QUFDSSxNQUFNLFdBQVcsR0FBRztBQUN6QixJQUFBLFNBQVMsRUFBRSxHQUFHO0FBQ2QsSUFBQSxFQUFFLEVBQUUsSUFBSTtBQUNSLElBQUEsT0FBTyxFQUFFLFNBQVM7QUFDbEIsSUFBQSxPQUFPLEVBQUUsWUFBWTtBQUNyQixJQUFBLEtBQUssRUFBRSxZQUFZO0FBQ25CLElBQUEsTUFBTSxFQUFFLGFBQWE7QUFDckIsSUFBQSxRQUFRLEVBQUUsZUFBZTtBQUN6QixJQUFBLEtBQUssRUFBRSxPQUFPOzs7QUN0Q2hCOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JHO0FBQ0csTUFBTyxVQUFXLFNBQVEsU0FBUyxDQUFBO0FBQ3ZDLElBQUEsV0FBQSxDQUFZLEdBQW1CLEVBQUE7UUFDN0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUNsQztBQUNEOztBQ25CRDs7Ozs7QUFLRztJQUNTO0FBQVosQ0FBQSxVQUFZLFdBQVcsRUFBQTtBQUNyQixJQUFBLFdBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxHQUFXO0FBQ1gsSUFBQSxXQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsSUFBZ0I7QUFDaEIsSUFBQSxXQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsR0FBZTtBQUNmLElBQUEsV0FBQSxDQUFBLG9CQUFB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
@@ -19,4 +19,4 @@ export * from "./utils";
19
19
  * @const VERSION
20
20
  * @memberOf module:for-typeorm
21
21
  */
22
- export declare const VERSION = "0.0.8";
22
+ export declare const VERSION = "0.0.9";
package/lib/esm/index.js CHANGED
@@ -21,5 +21,5 @@ export * from "./utils.js";
21
21
  * @const VERSION
22
22
  * @memberOf module:for-typeorm
23
23
  */
24
- export const VERSION = "0.0.8";
24
+ export const VERSION = "0.0.9";
25
25
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSw0QkFBeUI7QUFFbEQsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBRTVCLG1DQUEwQjtBQUMxQixpQ0FBd0I7QUFDeEIscUNBQTRCO0FBQzVCLG9DQUFpQztBQUNqQywrQkFBNEI7QUFDNUIsNEJBQXlCO0FBQ3pCLHFDQUFrQztBQUNsQyx1Q0FBb0M7QUFDcEMsMkJBQXdCO0FBQ3hCLDJCQUF3QjtBQUV4Qjs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuXG5UeXBlT1JNQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2luZGV4ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STURpc3BhdGNoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGVPUk0gaW50ZWdyYXRpb24gZm9yIERlY2FmLnRzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIFR5cGVPUk0tYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEZWNhZi50cyBkYXRhIGFjY2VzcyBhYnN0cmFjdGlvbnMsIGluY2x1ZGluZyB0aGUgYWRhcHRlciwgcmVwb3NpdG9yeSwgc3RhdGVtZW50IGJ1aWxkZXIsIHBhZ2luYXRpb24gdXRpbGl0aWVzLCBpbmRleCBoZWxwZXJzLCBhbmQgdHlwZSBkZWZpbml0aW9ucy4gS2V5IGV4cG9ydHMgaW5jbHVkZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCB7QGxpbmsgVHlwZU9STVJlcG9zaXRvcnl9LCB7QGxpbmsgVHlwZU9STVN0YXRlbWVudH0sIHtAbGluayBUeXBlT1JNUGFnaW5hdG9yfSwgYW5kIGluZGV4IGdlbmVyYXRpb24gdXRpbGl0aWVzLlxuICogQG1vZHVsZSBmb3ItdHlwZW9ybVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24uXG4gKiBAc3VtbWFyeSBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGZvci10eXBlb3JtIHBhY2thZ2UuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
package/lib/index.cjs CHANGED
@@ -38,5 +38,5 @@ __exportStar(require("./utils.cjs"), exports);
38
38
  * @const VERSION
39
39
  * @memberOf module:for-typeorm
40
40
  */
41
- exports.VERSION = "0.0.8";
41
+ exports.VERSION = "0.0.9";
42
42
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBa0Q7QUFFbEQsK0JBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUU1QixzREFBMEI7QUFDMUIsb0RBQXdCO0FBQ3hCLHdEQUE0QjtBQUM1Qix1REFBaUM7QUFDakMsa0RBQTRCO0FBQzVCLCtDQUF5QjtBQUN6Qix3REFBa0M7QUFDbEMsMERBQW9DO0FBQ3BDLDhDQUF3QjtBQUN4Qiw4Q0FBd0I7QUFFeEI7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBQ1UsUUFBQSxPQUFPLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuXG5UeXBlT1JNQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2luZGV4ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STURpc3BhdGNoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGVPUk0gaW50ZWdyYXRpb24gZm9yIERlY2FmLnRzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIFR5cGVPUk0tYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEZWNhZi50cyBkYXRhIGFjY2VzcyBhYnN0cmFjdGlvbnMsIGluY2x1ZGluZyB0aGUgYWRhcHRlciwgcmVwb3NpdG9yeSwgc3RhdGVtZW50IGJ1aWxkZXIsIHBhZ2luYXRpb24gdXRpbGl0aWVzLCBpbmRleCBoZWxwZXJzLCBhbmQgdHlwZSBkZWZpbml0aW9ucy4gS2V5IGV4cG9ydHMgaW5jbHVkZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCB7QGxpbmsgVHlwZU9STVJlcG9zaXRvcnl9LCB7QGxpbmsgVHlwZU9STVN0YXRlbWVudH0sIHtAbGluayBUeXBlT1JNUGFnaW5hdG9yfSwgYW5kIGluZGV4IGdlbmVyYXRpb24gdXRpbGl0aWVzLlxuICogQG1vZHVsZSBmb3ItdHlwZW9ybVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24uXG4gKiBAc3VtbWFyeSBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGZvci10eXBlb3JtIHBhY2thZ2UuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -19,4 +19,4 @@ export * from "./utils";
19
19
  * @const VERSION
20
20
  * @memberOf module:for-typeorm
21
21
  */
22
- export declare const VERSION = "0.0.8";
22
+ export declare const VERSION = "0.0.9";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decaf-ts/for-typeorm",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "description": "decaf typeorm wrapper",
5
5
  "type": "module",
6
6
  "exports": {