diff --git a/dist/ts-angular-jsonapi.js b/dist/ts-angular-jsonapi.js index d20ad1b..d68b05f 100644 --- a/dist/ts-angular-jsonapi.js +++ b/dist/ts-angular-jsonapi.js @@ -751,5 +751,3 @@ var Jsonapi; }()); Jsonapi.JsonapiStorage = JsonapiStorage; })(Jsonapi || (Jsonapi = {})); - -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcC5tb2R1bGUudHMiLCJhcHAubW9kdWxlLmpzIiwic2VydmljZXMvYmFzZS50cyIsInNlcnZpY2VzL2Jhc2UuanMiLCJzZXJ2aWNlcy9odHRwLnNlcnZpY2UudHMiLCJzZXJ2aWNlcy9odHRwLnNlcnZpY2UuanMiLCJzZXJ2aWNlcy9maWx0ZXIudHMiLCJzZXJ2aWNlcy9maWx0ZXIuanMiLCJzZXJ2aWNlcy9wYXRoLW1ha2VyLnRzIiwic2VydmljZXMvcGF0aC1tYWtlci5qcyIsInNlcnZpY2VzL3Jlc291cmNlLWNvbnZlcnRlci50cyIsInNlcnZpY2VzL3Jlc291cmNlLWNvbnZlcnRlci5qcyIsImNvcmUudHMiLCJjb3JlLmpzIiwicmVzb3VyY2UudHMiLCJyZXNvdXJjZS5qcyIsIl9hbGwudHMiLCJfYWxsLmpzIiwic2VydmljZXMvY29yZS1zZXJ2aWNlcy5zZXJ2aWNlLnRzIiwic2VydmljZXMvY29yZS1zZXJ2aWNlcy5zZXJ2aWNlLmpzIiwic2VydmljZXMvanNvbmFwaS1wYXJzZXIuc2VydmljZS50cyIsInNlcnZpY2VzL2pzb25hcGktcGFyc2VyLnNlcnZpY2UuanMiLCJzZXJ2aWNlcy9qc29uYXBpLXN0b3JhZ2Uuc2VydmljZS50cyIsInNlcnZpY2VzL2pzb25hcGktc3RvcmFnZS5zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBRUEsQ0FBQyxVQUFVLFNBQU87O0lBRWQsUUFBUSxPQUFPLGtCQUFrQjtTQUNoQyxTQUFTLG1CQUFtQjtRQUN6QixLQUFLO1FBQ0wsT0FBTztRQUNQLG1CQUFtQjtRQUNuQixtQkFBbUI7O0lBR3ZCLFFBQVEsT0FBTyxvQkFBb0I7SUFFbkMsUUFBUSxPQUFPLGFBQWE7O1FBRXhCO1FBQ0E7O0dBR0w7QUNISDtBQ2pCQSxJQUFPO0FBQVAsQ0FBQSxVQUFPLFNBQVE7SUFDWCxJQUFBLFFBQUEsWUFBQTtRQUFBLFNBQUEsT0FBQTs7UUFDVyxLQUFBLFNBQTBCO1lBQzdCLElBQUk7WUFDSixTQUFTOztRQUdOLEtBQUEsU0FBUztZQUNaLFlBQVk7WUFDWixlQUFlOztRQUV2QixPQUFBOztJQVZhLFFBQUEsT0FBSTtHQURkLFlBQUEsVUFBTztBQ2lCZDtBQ2pCQTtBQUVBLElBQU87QUFBUCxDQUFBLFVBQU8sU0FBUTtJQUNYLElBQUEsUUFBQSxZQUFBOzs7UUFHSSxTQUFBLEtBQ2MsT0FDQSxVQUNBLGlCQUNBLElBQUU7WUFIRixLQUFBLFFBQUE7WUFDQSxLQUFBLFdBQUE7WUFDQSxLQUFBLGtCQUFBO1lBQ0EsS0FBQSxLQUFBOztRQUtQLEtBQUEsVUFBQSxTQUFQLFVBQWMsTUFBWTtZQUN0QixPQUFPLEtBQUssS0FBSyxNQUFNOztRQUdwQixLQUFBLFVBQUEsTUFBUCxVQUFXLE1BQVk7WUFDbkIsT0FBTyxLQUFLLEtBQUssTUFBTTs7UUFHakIsS0FBQSxVQUFBLE9BQVYsVUFBZSxNQUFjLFFBQWdCLE1BQTBCO1lBQ25FLElBQUksTUFBTTtnQkFDTixRQUFRO2dCQUNSLEtBQUssS0FBSyxnQkFBZ0IsTUFBTTtnQkFDaEMsU0FBUztvQkFDTCxnQkFBZ0I7OztZQUd4QixTQUFTLElBQUksVUFBVTtZQUN2QixJQUFJLFVBQVUsS0FBSyxNQUFNO1lBRXpCLElBQUksV0FBVyxLQUFLLEdBQUc7WUFDdkIsSUFBSSxPQUFPO1lBQ1gsUUFBUSxLQUFLLEdBQUcsZ0JBQWdCO1lBQ2hDLFFBQVEsS0FDSixVQUFBLFNBQU87O2dCQUVILEtBQUssU0FBVSxZQUFBO29CQUNYLFFBQVEsS0FBSyxHQUFHLGdCQUFnQixDQUFDO29CQUNqQyxTQUFTLFFBQVE7bUJBQ2xCLEtBQUssZ0JBQWdCO2VBRTVCLFVBQUEsT0FBSztnQkFDRCxRQUFRLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztnQkFDakMsSUFBSSxNQUFNLFVBQVUsR0FBRzs7b0JBRW5CLElBQUksQ0FBQyxRQUFRLEtBQUssR0FBRyxnQkFBZ0IsUUFBUTt3QkFDekMsUUFBUSxLQUFLLDZFQUE2RTs7O3FCQUUzRjtvQkFDSCxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUcsY0FBYyxRQUFRO3dCQUN2QyxRQUFRLEtBQUssMkVBQTJFOzs7Z0JBR2hHLFNBQVMsT0FBTzs7WUFHeEIsT0FBTyxTQUFTOztRQUV4QixPQUFBOztJQTNEYSxRQUFBLE9BQUk7SUE0RGpCLFFBQVEsT0FBTyxvQkFBb0IsUUFBUSxlQUFlO0dBN0R2RCxZQUFBLFVBQU87QUN3RGQ7QUMxREEsSUFBTztBQUFQLENBQUEsVUFBTyxTQUFRO0lBQ1gsSUFBQSxVQUFBLFlBQUE7UUFBQSxTQUFBLFNBQUE7O1FBRVcsT0FBQSxVQUFBLGFBQVAsVUFBa0IsVUFBcUIsUUFBTTtZQUN6QyxLQUFLLElBQUksYUFBYyxRQUFRO2dCQUMzQixJQUFJLGFBQWEsU0FBUyxjQUFjLFNBQVMsV0FBVyxlQUFlLE9BQU8sWUFBWTtvQkFDMUYsT0FBTzs7O1lBR2YsT0FBTzs7UUFHZixPQUFBOztJQVhhLFFBQUEsU0FBTTtHQURoQixZQUFBLFVBQU87QUNpQmQ7QUNqQkEsSUFBTztBQUFQLENBQUEsVUFBTyxTQUFRO0lBQ1gsSUFBQSxhQUFBLFlBQUE7UUFBQSxTQUFBLFlBQUE7WUFDVyxLQUFBLFFBQXVCO1lBQ3ZCLEtBQUEsV0FBMEI7O1FBRTFCLFVBQUEsVUFBQSxVQUFQLFVBQWUsT0FBYTtZQUN4QixLQUFLLE1BQU0sS0FBSzs7UUFHYixVQUFBLFVBQUEsYUFBUCxVQUFrQixlQUE0QjtZQUMxQyxLQUFLLFdBQVc7O1FBR2IsVUFBQSxVQUFBLE1BQVAsWUFBQTtZQUNJLElBQUksYUFBNEI7WUFFaEMsSUFBSSxLQUFLLFNBQVMsU0FBUyxHQUFHO2dCQUMxQixXQUFXLEtBQUssYUFBYSxLQUFLLFNBQVMsS0FBSzs7WUFHcEQsT0FBTyxLQUFLLE1BQU0sS0FBSztpQkFDbEIsV0FBVyxTQUFTLElBQUksTUFBTSxXQUFXLEtBQUssT0FBTzs7UUFFbEUsT0FBQTs7SUF0QmEsUUFBQSxZQUFTO0dBRG5CLFlBQUEsVUFBTztBQ3lCZDtBQ3pCQSxJQUFPO0FBQVAsQ0FBQSxVQUFPLFNBQVE7SUFDWCxJQUFBLGFBQUEsWUFBQTtRQUFBLFNBQUEsWUFBQTs7Ozs7UUFLVyxVQUFBLDZCQUFQLFVBQ0ksWUFDQTtZQUNBLGdCQUFzQjtZQUF0QixJQUFBLG1CQUFBLEtBQUEsR0FBc0IsRUFBdEIsaUJBQUE7WUFFQSxJQUFJLENBQUMsbUJBQW1CO2dCQUNwQixvQkFBb0I7O1lBRXhCLElBQUksUUFBUTtZQUNaLEtBQWlCLElBQUEsS0FBQSxHQUFBLGVBQUEsWUFBQSxLQUFBLGFBQUEsUUFBQSxNQUFXO2dCQUF2QixJQUFJLE9BQUksYUFBQTtnQkFDVCxJQUFJLFdBQVcsUUFBUSxVQUFVLGNBQWMsTUFBTTtnQkFDckQsSUFBSSxnQkFBZ0I7b0JBQ2hCLGtCQUFrQixTQUFTLE1BQU07O3FCQUM5Qjs7b0JBRUgsa0JBQWtCLFNBQVMsT0FBTyxNQUFNLFNBQVMsTUFBTTs7Z0JBRzNEOzs7WUFHSixPQUFPOzs7OztRQU1KLFVBQUEscUNBQVAsVUFDSSxZQUNBLHdCQUErQjtZQUUvQixJQUFJLGdCQUFvQjtZQUN4QixVQUFVLDJCQUEyQixZQUFZLGVBQWU7WUFDaEUsSUFBSSxZQUFZO1lBQ2hCLFFBQVEsUUFBUSxlQUFlLFVBQUMsVUFBUTtnQkFDcEMsSUFBSSxFQUFFLFNBQVMsUUFBUSxZQUFZO29CQUMvQixVQUFVLFNBQVMsUUFBUTs7Z0JBRS9CLFVBQVUsU0FBUyxNQUFNLFNBQVMsTUFBTTs7WUFFNUMsT0FBTzs7UUFHSixVQUFBLGdCQUFQLFVBQXFCLGVBQXNDLHdCQUFzQjtZQUM3RSxJQUFJLG1CQUFtQixRQUFRLFVBQVUsV0FBVyxjQUFjO1lBQ2xFLElBQUksa0JBQWtCO2dCQUNsQixPQUFPLFFBQVEsVUFBVSxVQUFVLGtCQUFrQjs7aUJBQ2xEOztnQkFFSCxRQUFRLEtBQUssTUFBTSxjQUFjLE9BQU8sS0FBSztnQkFDN0MsSUFBSSxPQUFPLElBQUksUUFBUTtnQkFDdkIsS0FBSyxLQUFLLGNBQWM7Z0JBQ3hCLEtBQUssT0FBTyxjQUFjO2dCQUMxQixPQUFPOzs7UUFJUixVQUFBLGFBQVAsVUFBa0IsTUFBWTtZQUMxQixJQUFJLG1CQUFtQixRQUFRLEtBQUssR0FBRyxZQUFZO1lBQ25ELElBQUksUUFBUSxZQUFZLG1CQUFtQjtnQkFDdkMsUUFBUSxLQUFLLE1BQU0sT0FBTyxLQUFLOztZQUVuQyxPQUFPOzs7UUFJSixVQUFBLFlBQVAsVUFBaUIsa0JBQXFDLE1BQTJCO1lBQzdFLElBQUksRUFBRSxVQUFVLFFBQVEsUUFBUSxPQUFPO2dCQUNuQyxRQUFRLE1BQU0sbUNBQW1DOztZQUVyRCxJQUFJLFdBQVcsSUFBVSxpQkFBaUI7WUFDMUMsU0FBUztZQUNULFNBQVMsS0FBSyxLQUFLO1lBQ25CLFNBQVMsYUFBYSxLQUFLLGFBQWEsS0FBSyxhQUFhO1lBQzFELFNBQVMsU0FBUztZQUNsQixPQUFPOztRQUdKLFVBQUEsUUFBUCxVQUFhLGVBQW9CLGVBQW9CLFFBQWU7O1lBRWhFLElBQUksV0FBVztZQUNmLElBQUksY0FBYyxlQUFlO2dCQUM3QixXQUFXLFVBQVUsbUNBQW1DLGNBQWMsVUFBVTs7WUFHcEYsSUFBSSxRQUFRLFFBQVEsY0FBYyxPQUFPO2dCQUNyQyxVQUFVLGdCQUFnQixlQUFlLGVBQWUsUUFBUTs7aUJBQzdEO2dCQUNILFVBQVUsZUFBZSxjQUFjLE1BQU0sZUFBZSxRQUFROzs7UUFJckUsVUFBQSxrQkFBUCxVQUF1QixlQUFnQyxlQUF1QyxRQUFpQixVQUFRO1lBQ25ILEtBQWlCLElBQUEsS0FBQSxHQUFBLEtBQUEsY0FBYyxNQUFkLEtBQUEsR0FBQSxRQUFBLE1BQW1CO2dCQUEvQixJQUFJLE9BQUksR0FBQTtnQkFDVCxJQUFJLFdBQVcsUUFBUSxVQUFVLFdBQVcsS0FBSztnQkFDakQsSUFBSSxFQUFFLEtBQUssTUFBTSxnQkFBZ0I7b0JBQzdCLGNBQWMsS0FBSyxNQUFNLElBQVUsU0FBUztvQkFDNUMsY0FBYyxLQUFLLElBQUk7O2dCQUUzQixVQUFVLGVBQWUsTUFBTSxjQUFjLEtBQUssS0FBSyxRQUFROzs7UUFJaEUsVUFBQSxpQkFBUCxVQUFzQixlQUE4QixlQUEwQixRQUFpQixVQUFRO1lBQ25HLGNBQWMsYUFBYSxjQUFjO1lBQ3pDLGNBQWMsS0FBSyxjQUFjO1lBQ2pDLGNBQWMsU0FBUztZQUN2QixVQUFVLHFCQUFxQixjQUFjLGVBQWUsY0FBYyxlQUFlLFVBQVU7O1FBR2hHLFVBQUEsdUJBQVAsVUFBNEIsb0JBQWdDLG9CQUFnQyxnQkFBZ0IsUUFBZTs7WUFFdkgsUUFBUSxRQUFRLG9CQUFvQixVQUFDLGdCQUFnQixjQUFZOztnQkFHN0QsSUFBSSxFQUFFLGdCQUFnQix3QkFBd0IsVUFBVSxpQkFBaUI7b0JBQ3JFLG1CQUFtQixnQkFBZ0IsRUFBRSxNQUFNOzs7Z0JBSS9DLElBQUksQ0FBQyxlQUFlO29CQUNoQjtnQkFFSixJQUFJLE9BQU8sY0FBYyxpQkFBaUIsT0FBTyxjQUFjLGNBQWMsU0FBUztvQkFDbEYsSUFBSSxlQUFlLEtBQUssU0FBUzt3QkFDN0I7b0JBQ0osSUFBSSxtQkFBbUIsUUFBUSxVQUFVLFdBQVcsZUFBZSxLQUFLLEdBQUc7b0JBQzNFLElBQUksa0JBQWtCO3dCQUNsQixtQkFBbUIsY0FBYyxPQUFPO3dCQUN4QyxRQUFRLFFBQVEsZUFBZSxNQUFNLFVBQUMsZ0JBQXFDOzRCQUN2RSxJQUFJLE1BQU0sVUFBVSxvQkFBb0IsZ0JBQWdCOzRCQUN4RCxtQkFBbUIsY0FBYyxLQUFLLElBQUksTUFBTTs7OztxQkFHckQ7b0JBQ0gsbUJBQW1CLGNBQWMsT0FBTyxVQUFVLG9CQUFvQixlQUFlLE1BQU07Ozs7UUFLaEcsVUFBQSxzQkFBUCxVQUEyQixVQUFpQyxnQkFBYztZQUN0RSxJQUFJLFNBQVMsUUFBUTtnQkFDakIsU0FBUyxNQUFNLGVBQWUsU0FBUyxPQUN6Qzs7Z0JBRUUsT0FBTyxlQUFlLFNBQVMsTUFBTSxTQUFTOztpQkFDM0M7O2dCQUVILE9BQU87OztRQVFuQixPQUFBOztJQWpLYSxRQUFBLFlBQVM7R0FEbkIsWUFBQSxVQUFPO0FDc0pkO0FDdEpBO0FBRUEsSUFBTztBQUFQLENBQUEsVUFBTyxTQUFRO0lBQ1gsSUFBQSxRQUFBLFlBQUE7OztRQWNJLFNBQUEsS0FDYyxpQkFDQSxxQkFBbUI7WUFEbkIsS0FBQSxrQkFBQTtZQUNBLEtBQUEsc0JBQUE7WUFmUCxLQUFBLFdBQW1CO1lBQ25CLEtBQUEsWUFBc0M7WUFFdEMsS0FBQSxrQkFBMEI7WUFDMUIsS0FBQSxnQkFBZ0IsWUFBQTtZQUNoQixLQUFBLGVBQWUsWUFBQTtZQUNmLEtBQUEsZ0JBQWdCLFlBQUE7WUFDaEIsS0FBQSxrQkFBa0IsWUFBQTtZQVVyQixRQUFRLEtBQUssS0FBSztZQUNsQixRQUFRLEtBQUssV0FBVzs7UUFHckIsS0FBQSxVQUFBLFlBQVAsVUFBaUIsT0FBSztZQUNsQixJQUFJLE1BQU0sUUFBUSxLQUFLLFdBQVc7Z0JBQzlCLE9BQU87O1lBRVgsS0FBSyxVQUFVLE1BQU0sUUFBUTtZQUM3QixPQUFPOztRQUdKLEtBQUEsVUFBQSxjQUFQLFVBQW1CLE1BQVk7WUFDM0IsT0FBTyxLQUFLLFVBQVU7O1FBR25CLEtBQUEsVUFBQSxrQkFBUCxVQUF1QixRQUFjO1lBQ2pDLEtBQUssbUJBQW1CO1lBQ3hCLElBQUksS0FBSyxvQkFBb0IsR0FBRztnQkFDNUIsS0FBSzs7aUJBQ0YsSUFBSSxLQUFLLG9CQUFvQixHQUFHO2dCQUNuQyxLQUFLOzs7UUE3QkMsS0FBQSxLQUFvQjtRQUNwQixLQUFBLFdBQWdCO1FBK0JsQyxPQUFBOztJQTFDYSxRQUFBLE9BQUk7SUEyQ2pCLFFBQVEsT0FBTyxvQkFBb0IsUUFBUSxlQUFlO0dBNUN2RCxZQUFBLFVBQU87QUMwQ2Q7QUM1Q0EsSUFBTztBQUFQLENBQUEsVUFBTyxTQUFRO0lBQ1gsSUFBQSxZQUFBLFlBQUE7UUFBQSxTQUFBLFdBQUE7WUFJVyxLQUFBLFNBQVM7WUFJVCxLQUFBLGdCQUFxQjtZQUdyQixLQUFBLGFBQXFCOztRQUVyQixTQUFBLFVBQUEsUUFBUCxZQUFBO1lBQ0ksSUFBSSxXQUFXLElBQVUsS0FBSztZQUM5QixLQUFLLElBQUksWUFBWSxNQUFNO2dCQUN2QixJQUFJLE9BQU8sS0FBSyxjQUFjLFVBQVU7b0JBQ3BDLFNBQVMsWUFBWSxLQUFLOzs7WUFHbEMsT0FBTzs7Ozs7O1FBT0osU0FBQSxVQUFBLFdBQVAsWUFBQTtZQUNJLElBQUksUUFBUSxLQUFLLE9BQU8sTUFBTTtnQkFDMUIsTUFBTSx3Q0FBd0MsS0FBSyxPQUFPOzs7WUFHOUQsS0FBSyxRQUFRO1lBQ2IsT0FBTyxRQUFRLEtBQUssR0FBRyxVQUFVOztRQUc5QixTQUFBLFVBQUEsVUFBUCxZQUFBO1lBQ0ksT0FBTyxLQUFLLE9BQU8sS0FBSyxPQUFPLEtBQUs7OztRQUlqQyxTQUFBLFVBQUEsTUFBUCxZQUFBO1lBQ0ksSUFBSSxXQUFXLEtBQUs7WUFDcEIsU0FBUztZQUNULE9BQU87O1FBR0osU0FBQSxVQUFBLFFBQVAsWUFBQTtZQUNJLElBQUksT0FBTztZQUNYLEtBQUssS0FBSztZQUNWLEtBQUssYUFBYTtZQUNsQixLQUFLLGdCQUFnQjtZQUNyQixRQUFRLFFBQVEsS0FBSyxPQUFPLGVBQWUsVUFBQyxPQUFPLEtBQUc7Z0JBQ2xELEtBQUssY0FBYyxPQUFPO2dCQUMxQixLQUFLLGNBQWMsS0FBSyxVQUFVOztZQUV0QyxLQUFLLFNBQVM7O1FBR1gsU0FBQSxVQUFBLFdBQVAsVUFBZ0IsUUFBd0I7WUFBeEMsSUFBQSxRQUFBO1lBQ0ksU0FBUyxRQUFRLE9BQU8sSUFBSSxRQUFRLEtBQUssUUFBUTtZQUNqRCxLQUFLLFNBQVMsUUFBUSxPQUFPLElBQUksUUFBUSxLQUFLLFFBQVEsS0FBSztZQUUzRCxJQUFJLGdCQUFnQjtZQUNwQixJQUFJLFdBQVc7WUFDZixJQUFJLGVBQWU7O1lBR25CLFFBQVEsUUFBUSxLQUFLLGVBQWUsVUFBQyxjQUFjLGdCQUFjO2dCQUU3RCxJQUFJLE1BQUssT0FBTyxjQUFjLG1CQUFtQixNQUFLLE9BQU8sY0FBYyxnQkFBZ0IsU0FBUzs7b0JBRWhHLGNBQWMsa0JBQWtCLEVBQUUsTUFBTTtvQkFFeEMsUUFBUSxRQUFRLGFBQWEsTUFBTSxVQUFDLFVBQTJCO3dCQUMzRCxJQUFJLG1CQUFtQixFQUFFLElBQUksU0FBUyxJQUFJLE1BQU0sU0FBUzt3QkFDekQsY0FBYyxnQkFBZ0IsUUFBUSxLQUFLOzt3QkFHM0MsSUFBSSxjQUFjLFNBQVMsT0FBTyxNQUFNLFNBQVM7d0JBQ2pELElBQUksYUFBYSxRQUFRLGlCQUFpQixDQUFDLEtBQUssT0FBTyxRQUFRLFFBQVEsb0JBQW9CLENBQUMsR0FBRzs0QkFDM0YsYUFBYSxLQUFLOzRCQUNsQixTQUFTLEtBQUssU0FBUyxTQUFTLElBQUs7Ozs7cUJBRzFDOztvQkFFSCxJQUFJLEVBQUUsUUFBUSxhQUFhLFNBQVMsQ0FBQyxRQUFRLE9BQU8sSUFBSSxhQUFhLE9BQU87d0JBQ3hFLFFBQVEsS0FBSyxpQkFBaUI7O29CQUdsQyxJQUFJLGFBQWEsS0FBSyxNQUFNLGFBQWEsS0FBSyxNQUFNO3dCQUNoRCxjQUFjLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxJQUFJLGFBQWEsS0FBSyxJQUFJLE1BQU0sYUFBYSxLQUFLOzt5QkFDekY7d0JBQ0gsY0FBYyxrQkFBa0IsRUFBRSxNQUFNOzs7b0JBSTVDLElBQUksY0FBYyxhQUFhLEtBQUssT0FBTyxNQUFNLGFBQWEsS0FBSztvQkFDbkUsSUFBSSxhQUFhLFFBQVEsaUJBQWlCLENBQUMsS0FBSyxPQUFPLFFBQVEsUUFBUSxhQUFhLEtBQUssVUFBVSxDQUFDLEdBQUc7d0JBQ25HLGFBQWEsS0FBSzt3QkFDbEIsU0FBUyxLQUFLLGFBQWEsS0FBSyxTQUFTLElBQUs7Ozs7WUFLMUQsSUFBSSxNQUFtQjtnQkFDbkIsTUFBTTtvQkFDRixNQUFNLEtBQUs7b0JBQ1gsSUFBSSxLQUFLO29CQUNULFlBQVksS0FBSztvQkFDakIsZUFBZTs7O1lBSXZCLElBQUksU0FBUyxTQUFTLEdBQUc7Z0JBQ3JCLElBQUksV0FBVzs7WUFHbkIsT0FBTzs7UUFHSixTQUFBLFVBQUEsTUFBUCxVQUF3QyxJQUFZLFFBQTRCLFlBQXVCLFVBQW1CO1lBQ3RILE9BQU8sS0FBSyxPQUFPLElBQUksUUFBUSxZQUFZLFVBQVU7O1FBR2xELFNBQUEsVUFBQSxTQUFQLFVBQWMsSUFBWSxRQUE0QixZQUF1QixVQUFtQjtZQUM1RixLQUFLLE9BQU8sSUFBSSxRQUFRLFlBQVksVUFBVTs7UUFHM0MsU0FBQSxVQUFBLE1BQVAsVUFBd0MsUUFBNEIsWUFBdUIsVUFBbUI7WUFDMUcsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLFlBQVksVUFBVTs7UUFHcEQsU0FBQSxVQUFBLG1CQUFQLFVBQXFELGdCQUNqRCxRQUE0QixZQUF1QixVQUFtQjtZQUV0RSxPQUFPLEtBQUssT0FBTyxnQkFBZ0IsUUFBUSxZQUFZLFVBQVU7O1FBRzlELFNBQUEsVUFBQSxPQUFQLFVBQXlDLFFBQTRCLFlBQXVCLFVBQW1CO1lBQzNHLE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxZQUFZLFVBQVU7Ozs7O1FBTW5ELFNBQUEsVUFBQSxTQUFSLFVBQWUsSUFBWSxRQUF5QixZQUFZLFVBQVUsV0FBaUI7O1lBRXZGLElBQUksUUFBUSxXQUFXLFNBQVM7Z0JBQzVCLFdBQVc7Z0JBQ1gsYUFBYTtnQkFDYixTQUFTLFFBQVEsT0FBTyxJQUFJLFFBQVEsS0FBSzs7aUJBQ3RDO2dCQUNILElBQUksUUFBUSxZQUFZLFNBQVM7b0JBQzdCLFNBQVMsUUFBUSxPQUFPLElBQUksUUFBUSxLQUFLOztxQkFDdEM7b0JBQ0gsU0FBUyxRQUFRLE9BQU8sSUFBSSxRQUFRLEtBQUssUUFBUTs7O1lBSXpELGFBQWEsUUFBUSxXQUFXLGNBQWMsYUFBYSxZQUFBO1lBQzNELFdBQVcsUUFBUSxXQUFXLFlBQVksV0FBVyxZQUFBO1lBRXJELEtBQUssU0FBUyxRQUFRLE9BQU8sSUFBSSxRQUFRLEtBQUssUUFBUSxLQUFLO1lBRTNELFFBQVE7Z0JBQ0osS0FBSztvQkFDTCxPQUFPLEtBQUssS0FBSyxJQUFJLFFBQVEsWUFBWTtnQkFDekMsS0FBSztvQkFDTCxPQUFPLE9BQU87b0JBQ2QsT0FBTyxLQUFLLEtBQUssUUFBUSxZQUFZO2dCQUNyQyxLQUFLO29CQUNMLE9BQU8sS0FBSyxRQUFRLElBQUksUUFBUSxZQUFZO2dCQUM1QyxLQUFLO29CQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVEsWUFBWTtnQkFDckMsS0FBSztvQkFDTCxPQUFPLEtBQUssTUFBTSxRQUFRLFlBQVk7OztRQUl2QyxTQUFBLFVBQUEsT0FBUCxVQUFZLElBQVksUUFBUSxZQUFZLFVBQVE7WUFBcEQsSUFBQSxRQUFBOztZQUVJLElBQUksT0FBTyxJQUFJLFFBQVE7WUFDdkIsS0FBSyxRQUFRLEtBQUs7WUFDbEIsS0FBSyxRQUFRO1lBQ2IsT0FBTyxVQUFVLEtBQUssV0FBVyxPQUFPLFdBQVc7WUFFbkQsSUFBSSxXQUFXLEtBQUssYUFBYSxTQUFTLEtBQUssYUFBYSxNQUFNLE1BQU0sS0FBSyxhQUFhLE1BQU0sTUFBTSxLQUFLO1lBRTNHLFFBQVEsS0FBSyxTQUFTO2lCQUNyQixJQUFJLEtBQUs7aUJBQ1QsS0FDRyxVQUFBLFNBQU87Z0JBQ0gsUUFBQSxVQUFVLE1BQU0sUUFBUSxNQUFNLFVBQVUsTUFBSztnQkFDN0MsTUFBSyxrQkFBa0I7Z0JBQ3ZCLFdBQVc7ZUFFZixVQUFBLE9BQUs7Z0JBQ0QsU0FBUzs7WUFJakIsT0FBTzs7UUFHSixTQUFBLFVBQUEsT0FBUCxVQUFZLFFBQVEsWUFBWSxVQUFRO1lBQXhDLElBQUEsUUFBQTs7WUFHSSxJQUFJLE9BQU8sSUFBSSxRQUFRO1lBQ3ZCLEtBQUssUUFBUSxLQUFLO1lBQ2xCLE9BQU8sT0FBTyxLQUFLLFFBQVEsT0FBTyxRQUFRO1lBQzFDLE9BQU8sVUFBVSxLQUFLLFdBQVcsT0FBTyxXQUFXOztZQUduRCxJQUFJO1lBRUosV0FBVyxPQUFPLGlCQUFpQixJQUFJO2dCQUNuQyxXQUFXO29CQUNQLEtBQUssWUFBQSxFQUFhLE9BQU8sT0FBTyxLQUFLLE1BQU07b0JBQzNDLFlBQVk7O2dCQUVoQixjQUFjLEVBQUUsT0FBTyxPQUFPLFlBQVksT0FBTyxVQUFVO2dCQUMzRCxXQUFXLEVBQUUsT0FBTyxJQUFJLFlBQVksT0FBTyxVQUFVOzs7O1lBS3pELElBQUksQ0FBQyxPQUFPLFFBQVEsS0FBSyxhQUFhLFNBQVMsS0FBSyxhQUFhLFdBQVcsY0FBYyxLQUFLLFdBQVc7O2dCQUV0RyxTQUFTLFVBQVU7Z0JBQ25CLElBQUksV0FBUyxJQUFJLFFBQVE7Z0JBQ3pCLFFBQVEsUUFBUSxLQUFLLGFBQWEsT0FBTyxVQUFDLE9BQU8sS0FBRztvQkFDaEQsSUFBSSxDQUFDLE9BQU8sVUFBVSxTQUFPLFdBQVcsT0FBTyxPQUFPLFNBQVM7d0JBQzNELFNBQVMsT0FBTzs7OztZQUs1QixTQUFTLGdCQUFnQjtZQUN6QixRQUFRLEtBQUssU0FBUztpQkFDckIsSUFBSSxLQUFLO2lCQUNULEtBQ0csVUFBQSxTQUFPO2dCQUNILFNBQVMsVUFBVTtnQkFDbkIsU0FBUyxhQUFhO2dCQUN0QixRQUFBLFVBQVUsTUFBTSxRQUFRLE1BQU0sVUFBVSxNQUFLOzs7OztnQkFLN0MsSUFBSSxDQUFDLE9BQU8sTUFBTTtvQkFDZCxNQUFLLFVBQVU7OztnQkFJbkIsSUFBSSxPQUFPLFFBQVE7b0JBQ2YsSUFBSSxXQUFTLElBQUksUUFBUTtvQkFDekIsUUFBUSxRQUFRLFVBQVUsVUFBQyxPQUFPLEtBQUc7d0JBQ2pDLElBQUksQ0FBQyxTQUFPLFdBQVcsT0FBTyxPQUFPLFNBQVM7NEJBQzFDLE9BQU8sU0FBUzs7OztnQkFLNUIsV0FBVztlQUVmLFVBQUEsT0FBSztnQkFDRCxTQUFTLFVBQVU7Z0JBQ25CLFNBQVMsYUFBYTtnQkFDdEIsU0FBUzs7WUFHakIsT0FBTzs7UUFHSixTQUFBLFVBQUEsVUFBUCxVQUFlLElBQVksUUFBUSxZQUFZLFVBQVE7WUFBdkQsSUFBQSxRQUFBOztZQUVJLElBQUksT0FBTyxJQUFJLFFBQVE7WUFDdkIsS0FBSyxRQUFRLEtBQUs7WUFDbEIsS0FBSyxRQUFRO1lBRWIsUUFBUSxLQUFLLFNBQVM7aUJBQ3JCLE9BQU8sS0FBSztpQkFDWixLQUNHLFVBQUEsU0FBTztnQkFDSCxJQUFJLE1BQUssYUFBYSxTQUFTLE1BQUssYUFBYSxNQUFNLEtBQUs7b0JBQ3hELE1BQUssYUFBYSxNQUFNLElBQUksUUFBUTtvQkFDcEMsTUFBSyxhQUFhLE1BQU0sSUFBSSxnQkFBZ0I7b0JBQzVDLE9BQU8sTUFBSyxhQUFhLE1BQU07O2dCQUVuQyxXQUFXO2VBRWYsVUFBQSxPQUFLO2dCQUNELFNBQVM7OztRQUtkLFNBQUEsVUFBQSxRQUFQLFVBQWEsUUFBaUIsWUFBc0IsVUFBa0I7WUFDbEUsSUFBSSxTQUFTLEtBQUssU0FBUzs7WUFHM0IsSUFBSSxPQUFPLElBQUksUUFBUTtZQUN2QixLQUFLLFFBQVEsS0FBSztZQUNsQixLQUFLLE1BQU0sS0FBSyxRQUFRLEtBQUs7WUFDN0IsT0FBTyxVQUFVLEtBQUssV0FBVyxPQUFPLFdBQVc7WUFFbkQsSUFBSSxXQUFXLEtBQUs7WUFFcEIsSUFBSSxVQUFVLFFBQVEsS0FBSyxTQUFTLFlBQVksS0FBSyxLQUFLLE9BQU8sS0FBSyxLQUFLLFFBQVEsUUFBUTtZQUUzRixRQUFRLEtBQ0osVUFBQSxTQUFPO2dCQUNILElBQUksUUFBUSxRQUFRLEtBQUs7Z0JBQ3pCLFNBQVMsYUFBYSxNQUFNO2dCQUM1QixTQUFTLEtBQUssTUFBTTtnQkFFcEIsV0FBVztlQUVmLFVBQUEsT0FBSztnQkFDRCxTQUFTLFVBQVUsUUFBUSxNQUFNLE9BQU87O1lBSWhELE9BQU87O1FBR0osU0FBQSxVQUFBLGtCQUFQLFVBQW9ELFVBQWEsWUFBbUI7WUFDaEYsSUFBSSxhQUFhLFNBQVM7WUFDMUIsSUFBSSxDQUFDLFlBQVk7Z0JBQ2IsYUFBYSxVQUFVLEtBQUssTUFBTSxLQUFLLFdBQVc7O1lBR3RELGNBQWMsYUFBYSxhQUFhLFNBQVM7WUFDakQsSUFBSSxFQUFFLGNBQWMsS0FBSyxnQkFBZ0I7Z0JBQ3JDLEtBQUssY0FBYyxjQUFjLEVBQUUsTUFBTTs7WUFHN0MsSUFBSSxLQUFLLE9BQU8sY0FBYyxZQUFZLFNBQVM7Z0JBQy9DLEtBQUssY0FBYyxZQUFZLFFBQVEsY0FBYzs7aUJBQ2xEO2dCQUNILEtBQUssY0FBYyxZQUFZLFVBQVU7OztRQUkxQyxTQUFBLFVBQUEsbUJBQVAsVUFBcUQsV0FBcUIsWUFBa0I7WUFBNUYsSUFBQSxRQUFBO1lBQ0ksSUFBSSxFQUFFLGNBQWMsS0FBSyxnQkFBZ0I7Z0JBQ3JDLEtBQUssY0FBYyxjQUFjLEVBQUUsTUFBTTs7WUFHN0MsSUFBSSxDQUFDLEtBQUssT0FBTyxjQUFjLFlBQVksU0FBUztnQkFDaEQsUUFBUSxLQUFLLHVDQUF1QyxLQUFLLE9BQU87O1lBR3BFLFFBQVEsUUFBUSxXQUFXLFVBQUMsVUFBUTtnQkFDaEMsTUFBSyxjQUFjLFlBQVksUUFBUSxTQUFTLE1BQU07OztRQUl2RCxTQUFBLFVBQUEscUJBQVAsVUFBMEIsWUFBb0IsSUFBVTtZQUNwRCxJQUFJLEVBQUUsY0FBYyxLQUFLLGdCQUFnQjtnQkFDckMsT0FBTzs7WUFFWCxJQUFJLEVBQUUsVUFBVSxLQUFLLGNBQWMsY0FBYztnQkFDN0MsT0FBTzs7WUFFWCxJQUFJLEVBQUUsTUFBTSxLQUFLLGNBQWMsWUFBWSxVQUFVO2dCQUNqRCxPQUFPOztZQUVYLE9BQU8sS0FBSyxjQUFjLFlBQVksUUFBUTtZQUM5QyxPQUFPOztRQUdILFNBQUEsVUFBQSxZQUFSLFVBQWtCLFdBQVM7WUFDdkIsSUFBSSxVQUFVLElBQUk7Z0JBQ2QsS0FBSyxrQkFBa0I7O2lCQUNwQjtnQkFDSCxLQUFLLGFBQWEsV0FBVyxZQUFZLEtBQUs7Z0JBQzlDLEtBQUssbUJBQW1COzs7UUFJeEIsU0FBQSxVQUFBLHFCQUFSLFVBQXdELFdBQW1CO1lBQTNFLElBQUEsUUFBQTtZQUNJLFFBQVEsUUFBUSxXQUFXLFVBQUMsVUFBUTtnQkFDaEMsTUFBSyxrQkFBa0I7OztRQUl2QixTQUFBLFVBQUEsb0JBQVIsVUFBdUQsVUFBVztZQUM5RCxJQUFJLFNBQVMsSUFBSTtnQkFDYixLQUFLLGFBQWEsTUFBTSxTQUFTLE1BQU07Ozs7OztRQU94QyxTQUFBLFVBQUEsYUFBUCxZQUFBO1lBQ0ksT0FBTyxRQUFBLFVBQVUsV0FBVyxLQUFLOztRQUV6QyxPQUFBOztJQWpaYSxRQUFBLFdBQVE7R0FEbEIsWUFBQSxVQUFPO0FDc1ZkO0FDdFZBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeUJBO0FDekJBO0FBRUEsSUFBTztBQUFQLENBQUEsVUFBTyxTQUFRO0lBQ1gsSUFBQSxnQkFBQSxZQUFBOzs7UUFHSSxTQUFBLGFBQ2MsYUFBVztZQUFYLEtBQUEsY0FBQTs7UUFJbEIsT0FBQTs7SUFSYSxRQUFBLGVBQVk7SUFVekIsUUFBUSxPQUFPLG9CQUFvQixRQUFRLHVCQUF1QjtHQVgvRCxZQUFBLFVBQU87QUNXZDtBQ2JBLElBQU87QUFBUCxDQUFBLFVBQU8sU0FBUTtJQUNYLElBQUEsaUJBQUEsWUFBQTs7UUFHSSxTQUFBLGdCQUFBOztRQUlPLGNBQUEsVUFBQSxXQUFQLFVBQWdCLGFBQW1CO1lBQy9CLE9BQU87O1FBRWYsT0FBQTs7SUFWYSxRQUFBLGdCQUFhO0dBRHZCLFlBQUEsVUFBTztBQ2FkO0FDYkEsSUFBTztBQUFQLENBQUEsVUFBTyxTQUFRO0lBQ1gsSUFBQSxrQkFBQSxZQUFBOztRQUdJLFNBQUEsaUJBQUE7O1FBT08sZUFBQSxVQUFBLE1BQVAsVUFBVyxLQUFHOzs7O1FBS1AsZUFBQSxVQUFBLFFBQVAsVUFBYSxLQUFLLE1BQUk7Ozs7UUFNMUIsT0FBQTs7SUFyQmEsUUFBQSxpQkFBYztHQUR4QixZQUFBLFVBQU87QUNrQmQiLCJmaWxlIjoidHMtYW5ndWxhci1qc29uYXBpLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vX2FsbC50c1wiIC8+XG5cbihmdW5jdGlvbiAoYW5ndWxhcikge1xuICAgIC8vIENvbmZpZ1xuICAgIGFuZ3VsYXIubW9kdWxlKCdKc29uYXBpLmNvbmZpZycsIFtdKVxuICAgIC5jb25zdGFudCgncnNKc29uYXBpQ29uZmlnJywge1xuICAgICAgICB1cmw6ICdodHRwOi8veW91cmRvbWFpbi9hcGkvdjEvJyxcbiAgICAgICAgZGVsYXk6IDAsXG4gICAgICAgIHVuaWZ5X2NvbmN1cnJlbmN5OiB0cnVlLFxuICAgICAgICBjYWNoZV9wcmVyZXF1ZXN0czogdHJ1ZVxuICAgIH0pO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ0pzb25hcGkuc2VydmljZXMnLCBbXSk7XG5cbiAgICBhbmd1bGFyLm1vZHVsZSgncnNKc29uYXBpJywgW1xuICAgICAgICAvLyAnYW5ndWxhci1zdG9yYWdlJyxcbiAgICAgICAgJ0pzb25hcGkuY29uZmlnJyxcbiAgICAgICAgJ0pzb25hcGkuc2VydmljZXMnXG4gICAgXSk7XG5cbn0pKGFuZ3VsYXIpO1xuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vX2FsbC50c1wiIC8+XG4oZnVuY3Rpb24gKGFuZ3VsYXIpIHtcbiAgICAvLyBDb25maWdcbiAgICBhbmd1bGFyLm1vZHVsZSgnSnNvbmFwaS5jb25maWcnLCBbXSlcbiAgICAgICAgLmNvbnN0YW50KCdyc0pzb25hcGlDb25maWcnLCB7XG4gICAgICAgIHVybDogJ2h0dHA6Ly95b3VyZG9tYWluL2FwaS92MS8nLFxuICAgICAgICBkZWxheTogMCxcbiAgICAgICAgdW5pZnlfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICAgIGNhY2hlX3ByZXJlcXVlc3RzOiB0cnVlXG4gICAgfSk7XG4gICAgYW5ndWxhci5tb2R1bGUoJ0pzb25hcGkuc2VydmljZXMnLCBbXSk7XG4gICAgYW5ndWxhci5tb2R1bGUoJ3JzSnNvbmFwaScsIFtcbiAgICAgICAgLy8gJ2FuZ3VsYXItc3RvcmFnZScsXG4gICAgICAgICdKc29uYXBpLmNvbmZpZycsXG4gICAgICAgICdKc29uYXBpLnNlcnZpY2VzJ1xuICAgIF0pO1xufSkoYW5ndWxhcik7XG4iLCJtb2R1bGUgSnNvbmFwaSB7XG4gICAgZXhwb3J0IGNsYXNzIEJhc2Uge1xuICAgICAgICBzdGF0aWMgUGFyYW1zOiBKc29uYXBpLklQYXJhbXMgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBpbmNsdWRlOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIHN0YXRpYyBTY2hlbWEgPSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgIHJlbGF0aW9uc2hpcHM6IHt9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwidmFyIEpzb25hcGk7XG4oZnVuY3Rpb24gKEpzb25hcGkpIHtcbiAgICB2YXIgQmFzZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIEJhc2UoKSB7XG4gICAgICAgIH1cbiAgICAgICAgQmFzZS5QYXJhbXMgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBpbmNsdWRlOiBbXVxuICAgICAgICB9O1xuICAgICAgICBCYXNlLlNjaGVtYSA9IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgcmVsYXRpb25zaGlwczoge31cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEJhc2U7XG4gICAgfSgpKTtcbiAgICBKc29uYXBpLkJhc2UgPSBCYXNlO1xufSkoSnNvbmFwaSB8fCAoSnNvbmFwaSA9IHt9KSk7XG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vX2FsbC50c1wiIC8+XG5cbm1vZHVsZSBKc29uYXBpIHtcbiAgICBleHBvcnQgY2xhc3MgSHR0cCB7XG5cbiAgICAgICAgLyoqIEBuZ0luamVjdCAqL1xuICAgICAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgICAgICBwcm90ZWN0ZWQgJGh0dHAsXG4gICAgICAgICAgICBwcm90ZWN0ZWQgJHRpbWVvdXQsXG4gICAgICAgICAgICBwcm90ZWN0ZWQgcnNKc29uYXBpQ29uZmlnLFxuICAgICAgICAgICAgcHJvdGVjdGVkICRxXG4gICAgICAgICkge1xuXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZGVsZXRlKHBhdGg6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhlYyhwYXRoLCAnREVMRVRFJyk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZ2V0KHBhdGg6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhlYyhwYXRoLCAnR0VUJyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm90ZWN0ZWQgZXhlYyhwYXRoOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nLCBkYXRhPzogSnNvbmFwaS5JRGF0YU9iamVjdCkge1xuICAgICAgICAgICAgbGV0IHJlcSA9IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICB1cmw6IHRoaXMucnNKc29uYXBpQ29uZmlnLnVybCArIHBhdGgsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3ZuZC5hcGkranNvbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGF0YSAmJiAocmVxWydkYXRhJ10gPSBkYXRhKTtcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gdGhpcy4kaHR0cChyZXEpO1xuXG4gICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7XG4gICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBKc29uYXBpLkNvcmUuTWUucmVmcmVzaExvYWRpbmdzKDEpO1xuICAgICAgICAgICAgcHJvbWlzZS50aGVuKFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IGp1c3QgZm9yIGRldmVsb3AgZW52aXJvbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgc2VsZi4kdGltZW91dCggKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgSnNvbmFwaS5Db3JlLk1lLnJlZnJlc2hMb2FkaW5ncygtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgICAgICB9LCBzZWxmLnJzSnNvbmFwaUNvbmZpZy5kZWxheSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIEpzb25hcGkuQ29yZS5NZS5yZWZyZXNoTG9hZGluZ3MoLTEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZmxpbmU/XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpzb25hcGkuQ29yZS5NZS5sb2FkaW5nc09mZmxpbmUoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdKc29uYXBpLkh0dHAuZXhlYyAodXNlIEpzb25hcGlDb3JlLmxvYWRpbmdzT2ZmbGluZSBmb3IgY2F0Y2ggaXQpIGVycm9yID0+JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKc29uYXBpLkNvcmUuTWUubG9hZGluZ3NFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0pzb25hcGkuSHR0cC5leGVjICh1c2UgSnNvbmFwaUNvcmUubG9hZGluZ3NFcnJvciBmb3IgY2F0Y2ggaXQpIGVycm9yID0+JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFuZ3VsYXIubW9kdWxlKCdKc29uYXBpLnNlcnZpY2VzJykuc2VydmljZSgnSnNvbmFwaUh0dHAnLCBIdHRwKTtcbn1cbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9fYWxsLnRzXCIgLz5cbnZhciBKc29uYXBpO1xuKGZ1bmN0aW9uIChKc29uYXBpKSB7XG4gICAgdmFyIEh0dHAgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiogQG5nSW5qZWN0ICovXG4gICAgICAgIGZ1bmN0aW9uIEh0dHAoJGh0dHAsICR0aW1lb3V0LCByc0pzb25hcGlDb25maWcsICRxKSB7XG4gICAgICAgICAgICB0aGlzLiRodHRwID0gJGh0dHA7XG4gICAgICAgICAgICB0aGlzLiR0aW1lb3V0ID0gJHRpbWVvdXQ7XG4gICAgICAgICAgICB0aGlzLnJzSnNvbmFwaUNvbmZpZyA9IHJzSnNvbmFwaUNvbmZpZztcbiAgICAgICAgICAgIHRoaXMuJHEgPSAkcTtcbiAgICAgICAgfVxuICAgICAgICBIdHRwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhlYyhwYXRoLCAnREVMRVRFJyk7XG4gICAgICAgIH07XG4gICAgICAgIEh0dHAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjKHBhdGgsICdHRVQnKTtcbiAgICAgICAgfTtcbiAgICAgICAgSHR0cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uIChwYXRoLCBtZXRob2QsIGRhdGEpIHtcbiAgICAgICAgICAgIHZhciByZXEgPSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgdXJsOiB0aGlzLnJzSnNvbmFwaUNvbmZpZy51cmwgKyBwYXRoLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRhdGEgJiYgKHJlcVsnZGF0YSddID0gZGF0YSk7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuJGh0dHAocmVxKTtcbiAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTtcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIEpzb25hcGkuQ29yZS5NZS5yZWZyZXNoTG9hZGluZ3MoMSk7XG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IGp1c3QgZm9yIGRldmVsb3AgZW52aXJvbm1lbnRcbiAgICAgICAgICAgICAgICBzZWxmLiR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgSnNvbmFwaS5Db3JlLk1lLnJlZnJlc2hMb2FkaW5ncygtMSk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgfSwgc2VsZi5yc0pzb25hcGlDb25maWcuZGVsYXkpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgSnNvbmFwaS5Db3JlLk1lLnJlZnJlc2hMb2FkaW5ncygtMSk7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9mZmxpbmU/XG4gICAgICAgICAgICAgICAgICAgIGlmICghSnNvbmFwaS5Db3JlLk1lLmxvYWRpbmdzT2ZmbGluZShlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignSnNvbmFwaS5IdHRwLmV4ZWMgKHVzZSBKc29uYXBpQ29yZS5sb2FkaW5nc09mZmxpbmUgZm9yIGNhdGNoIGl0KSBlcnJvciA9PicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFKc29uYXBpLkNvcmUuTWUubG9hZGluZ3NFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignSnNvbmFwaS5IdHRwLmV4ZWMgKHVzZSBKc29uYXBpQ29yZS5sb2FkaW5nc0Vycm9yIGZvciBjYXRjaCBpdCkgZXJyb3IgPT4nLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBIdHRwO1xuICAgIH0oKSk7XG4gICAgSnNvbmFwaS5IdHRwID0gSHR0cDtcbiAgICBhbmd1bGFyLm1vZHVsZSgnSnNvbmFwaS5zZXJ2aWNlcycpLnNlcnZpY2UoJ0pzb25hcGlIdHRwJywgSHR0cCk7XG59KShKc29uYXBpIHx8IChKc29uYXBpID0ge30pKTtcbiIsIm1vZHVsZSBKc29uYXBpIHtcbiAgICBleHBvcnQgY2xhc3MgRmlsdGVyIHtcblxuICAgICAgICBwdWJsaWMgcGFzc0ZpbHRlcihyZXNvdXJjZTogSVJlc291cmNlLCBmaWx0ZXIpOiBib29sZWFuIHtcbiAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiAgZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSBpbiByZXNvdXJjZS5hdHRyaWJ1dGVzICYmIHJlc291cmNlLmF0dHJpYnV0ZXNbYXR0cmlidXRlXSA9PT0gZmlsdGVyW2F0dHJpYnV0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICB9XG59XG4iLCJ2YXIgSnNvbmFwaTtcbihmdW5jdGlvbiAoSnNvbmFwaSkge1xuICAgIHZhciBGaWx0ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBGaWx0ZXIoKSB7XG4gICAgICAgIH1cbiAgICAgICAgRmlsdGVyLnByb3RvdHlwZS5wYXNzRmlsdGVyID0gZnVuY3Rpb24gKHJlc291cmNlLCBmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGF0dHJpYnV0ZSBpbiBmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlIGluIHJlc291cmNlLmF0dHJpYnV0ZXMgJiYgcmVzb3VyY2UuYXR0cmlidXRlc1thdHRyaWJ1dGVdID09PSBmaWx0ZXJbYXR0cmlidXRlXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBGaWx0ZXI7XG4gICAgfSgpKTtcbiAgICBKc29uYXBpLkZpbHRlciA9IEZpbHRlcjtcbn0pKEpzb25hcGkgfHwgKEpzb25hcGkgPSB7fSkpO1xuIiwibW9kdWxlIEpzb25hcGkge1xuICAgIGV4cG9ydCBjbGFzcyBQYXRoTWFrZXIge1xuICAgICAgICBwdWJsaWMgcGF0aHM6IEFycmF5PFN0cmluZz4gPSBbXTtcbiAgICAgICAgcHVibGljIGluY2x1ZGVzOiBBcnJheTxTdHJpbmc+ID0gW107XG5cbiAgICAgICAgcHVibGljIGFkZFBhdGgodmFsdWU6IFN0cmluZykge1xuICAgICAgICAgICAgdGhpcy5wYXRocy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzZXRJbmNsdWRlKHN0cmluZ3NfYXJyYXk6IEFycmF5PFN0cmluZz4pIHtcbiAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSBzdHJpbmdzX2FycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGdldCgpOiBTdHJpbmcge1xuICAgICAgICAgICAgbGV0IGdldF9wYXJhbXM6IEFycmF5PFN0cmluZz4gPSBbXTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5jbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGdldF9wYXJhbXMucHVzaCgnaW5jbHVkZT0nICsgdGhpcy5pbmNsdWRlcy5qb2luKCcsJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXRocy5qb2luKCcvJykgK1xuICAgICAgICAgICAgICAgIChnZXRfcGFyYW1zLmxlbmd0aCA+IDAgPyAnPycgKyBnZXRfcGFyYW1zLmpvaW4oJyYnKSA6ICcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsInZhciBKc29uYXBpO1xuKGZ1bmN0aW9uIChKc29uYXBpKSB7XG4gICAgdmFyIFBhdGhNYWtlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFBhdGhNYWtlcigpIHtcbiAgICAgICAgICAgIHRoaXMucGF0aHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBQYXRoTWFrZXIucHJvdG90eXBlLmFkZFBhdGggPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucGF0aHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIFBhdGhNYWtlci5wcm90b3R5cGUuc2V0SW5jbHVkZSA9IGZ1bmN0aW9uIChzdHJpbmdzX2FycmF5KSB7XG4gICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gc3RyaW5nc19hcnJheTtcbiAgICAgICAgfTtcbiAgICAgICAgUGF0aE1ha2VyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZ2V0X3BhcmFtcyA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5jbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGdldF9wYXJhbXMucHVzaCgnaW5jbHVkZT0nICsgdGhpcy5pbmNsdWRlcy5qb2luKCcsJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF0aHMuam9pbignLycpICtcbiAgICAgICAgICAgICAgICAoZ2V0X3BhcmFtcy5sZW5ndGggPiAwID8gJz8nICsgZ2V0X3BhcmFtcy5qb2luKCcmJykgOiAnJyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBQYXRoTWFrZXI7XG4gICAgfSgpKTtcbiAgICBKc29uYXBpLlBhdGhNYWtlciA9IFBhdGhNYWtlcjtcbn0pKEpzb25hcGkgfHwgKEpzb25hcGkgPSB7fSkpO1xuIiwibW9kdWxlIEpzb25hcGkge1xuICAgIGV4cG9ydCBjbGFzcyBDb252ZXJ0ZXIge1xuXG4gICAgICAgIC8qKlxuICAgICAgICBDb252ZXJ0IGpzb24gYXJyYXlzIChsaWtlIGluY2x1ZGVkKSB0byBhbiBSZXNvdXJjZXMgYXJyYXlzIHdpdGhvdXQgW2tleXNdXG4gICAgICAgICoqL1xuICAgICAgICBzdGF0aWMganNvbl9hcnJheTJyZXNvdXJjZXNfYXJyYXkoXG4gICAgICAgICAgICBqc29uX2FycmF5OiBBcnJheTxKc29uYXBpLklEYXRhUmVzb3VyY2U+LFxuICAgICAgICAgICAgZGVzdGluYXRpb25fYXJyYXk/OiBPYmplY3QsIC8vIEFycmF5PEpzb25hcGkuSVJlc291cmNlPixcbiAgICAgICAgICAgIHVzZV9pZF9mb3Jfa2V5ID0gZmFsc2VcbiAgICAgICAgKTogT2JqZWN0IHsgLy8gQXJyYXk8SnNvbmFwaS5JUmVzb3VyY2U+IHtcbiAgICAgICAgICAgIGlmICghZGVzdGluYXRpb25fYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9hcnJheSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGRhdGEgb2YganNvbl9hcnJheSkge1xuICAgICAgICAgICAgICAgIGxldCByZXNvdXJjZSA9IEpzb25hcGkuQ29udmVydGVyLmpzb24ycmVzb3VyY2UoZGF0YSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh1c2VfaWRfZm9yX2tleSkge1xuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9hcnJheVtyZXNvdXJjZS5pZF0gPSByZXNvdXJjZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlZCBmb3IgZXhhbXBsZSBuZWVkIGEgZXh0cmEgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uX2FycmF5W3Jlc291cmNlLnR5cGUgKyAnXycgKyByZXNvdXJjZS5pZF0gPSByZXNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVzdGluYXRpb25fYXJyYXkucHVzaChyZXNvdXJjZS5pZCArIHJlc291cmNlLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZGVzdGluYXRpb25fYXJyYXlbJyRjb3VudCddID0gY291bnQ7IC8vIHByb2JsZW0gd2l0aCB0b0FycmF5IG9yIGFuZ3VsYXIuZm9yRWFjaCBuZWVkIGEgIWlzT2JqZWN0XG4gICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25fYXJyYXk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgQ29udmVydCBqc29uIGFycmF5cyAobGlrZSBpbmNsdWRlZCkgdG8gYW4gaW5kZXhlZCBSZXNvdXJjZXMgYXJyYXkgYnkgW3R5cGVdW2lkXVxuICAgICAgICAqKi9cbiAgICAgICAgc3RhdGljIGpzb25fYXJyYXkycmVzb3VyY2VzX2FycmF5X2J5X3R5cGUgKFxuICAgICAgICAgICAganNvbl9hcnJheTogQXJyYXk8SnNvbmFwaS5JRGF0YVJlc291cmNlPixcbiAgICAgICAgICAgIGluc3RhbmNlX3JlbGF0aW9uc2hpcHM6IGJvb2xlYW5cbiAgICAgICAgKTogT2JqZWN0IHsgLy8gQXJyYXk8SnNvbmFwaS5JUmVzb3VyY2U+IHtcbiAgICAgICAgICAgIGxldCBhbGxfcmVzb3VyY2VzOmFueSA9IHsgfSA7XG4gICAgICAgICAgICBDb252ZXJ0ZXIuanNvbl9hcnJheTJyZXNvdXJjZXNfYXJyYXkoanNvbl9hcnJheSwgYWxsX3Jlc291cmNlcywgZmFsc2UpO1xuICAgICAgICAgICAgbGV0IHJlc291cmNlcyA9IHsgfTtcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChhbGxfcmVzb3VyY2VzLCAocmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShyZXNvdXJjZS50eXBlIGluIHJlc291cmNlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzW3Jlc291cmNlLnR5cGVdID0geyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvdXJjZXNbcmVzb3VyY2UudHlwZV1bcmVzb3VyY2UuaWRdID0gcmVzb3VyY2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZXM7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0aWMganNvbjJyZXNvdXJjZShqc29uX3Jlc291cmNlOiBKc29uYXBpLklEYXRhUmVzb3VyY2UsIGluc3RhbmNlX3JlbGF0aW9uc2hpcHMpOiBKc29uYXBpLklSZXNvdXJjZSB7XG4gICAgICAgICAgICBsZXQgcmVzb3VyY2Vfc2VydmljZSA9IEpzb25hcGkuQ29udmVydGVyLmdldFNlcnZpY2UoanNvbl9yZXNvdXJjZS50eXBlKTtcbiAgICAgICAgICAgIGlmIChyZXNvdXJjZV9zZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpzb25hcGkuQ29udmVydGVyLnByb2NyZWF0ZShyZXNvdXJjZV9zZXJ2aWNlLCBqc29uX3Jlc291cmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc2VydmljZSBub3QgcmVnaXN0ZXJlZFxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignYCcgKyBqc29uX3Jlc291cmNlLnR5cGUgKyAnYCcsICdzZXJ2aWNlIG5vdCBmb3VuZCBvbiBqc29uMnJlc291cmNlKCknKTtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcCA9IG5ldyBKc29uYXBpLlJlc291cmNlKCk7XG4gICAgICAgICAgICAgICAgdGVtcC5pZCA9IGpzb25fcmVzb3VyY2UuaWQ7XG4gICAgICAgICAgICAgICAgdGVtcC50eXBlID0ganNvbl9yZXNvdXJjZS50eXBlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGljIGdldFNlcnZpY2UodHlwZTogc3RyaW5nKTogSnNvbmFwaS5JUmVzb3VyY2Uge1xuICAgICAgICAgICAgbGV0IHJlc291cmNlX3NlcnZpY2UgPSBKc29uYXBpLkNvcmUuTWUuZ2V0UmVzb3VyY2UodHlwZSk7XG4gICAgICAgICAgICBpZiAoYW5ndWxhci5pc1VuZGVmaW5lZChyZXNvdXJjZV9zZXJ2aWNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignYCcgKyB0eXBlICsgJ2AnLCAnc2VydmljZSBub3QgZm91bmQgb24gZ2V0U2VydmljZSgpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2Vfc2VydmljZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIHJldHVybiBhIHJlc291cmNlIHR5cGUocmVzb3J1Y2Vfc2VydmljZSkgd2l0aCBkYXRhKGRhdGEpICovXG4gICAgICAgIHN0YXRpYyBwcm9jcmVhdGUocmVzb3VyY2Vfc2VydmljZTogSnNvbmFwaS5JUmVzb3VyY2UsIGRhdGE6IEpzb25hcGkuSURhdGFSZXNvdXJjZSk6IEpzb25hcGkuSVJlc291cmNlIHtcbiAgICAgICAgICAgIGlmICghKCd0eXBlJyBpbiBkYXRhICYmICdpZCcgaW4gZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdKc29uYXBpIFJlc291cmNlIGlzIG5vdCBjb3JyZWN0JywgZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzb3VyY2UgPSBuZXcgKDxhbnk+cmVzb3VyY2Vfc2VydmljZS5jb25zdHJ1Y3RvcikoKTtcbiAgICAgICAgICAgIHJlc291cmNlLm5ldygpO1xuICAgICAgICAgICAgcmVzb3VyY2UuaWQgPSBkYXRhLmlkO1xuICAgICAgICAgICAgcmVzb3VyY2UuYXR0cmlidXRlcyA9IGRhdGEuYXR0cmlidXRlcyA/IGRhdGEuYXR0cmlidXRlcyA6IHt9O1xuICAgICAgICAgICAgcmVzb3VyY2UuaXNfbmV3ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0aWMgYnVpbGQoZG9jdW1lbnRfZnJvbTogYW55LCByZXNvdXJjZV9kZXN0OiBhbnksIHNjaGVtYTogSVNjaGVtYSkge1xuICAgICAgICAgICAgLy8gaW5zdGFuY2lvIGxvcyBpbmNsdWRlIHkgbG9zIGd1YXJkbyBlbiBpbmNsdWRlZCBhcnJhcnlcbiAgICAgICAgICAgIGxldCBpbmNsdWRlZCA9IHt9O1xuICAgICAgICAgICAgaWYgKCdpbmNsdWRlZCcgaW4gZG9jdW1lbnRfZnJvbSkge1xuICAgICAgICAgICAgICAgIGluY2x1ZGVkID0gQ29udmVydGVyLmpzb25fYXJyYXkycmVzb3VyY2VzX2FycmF5X2J5X3R5cGUoZG9jdW1lbnRfZnJvbS5pbmNsdWRlZCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYW5ndWxhci5pc0FycmF5KGRvY3VtZW50X2Zyb20uZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBDb252ZXJ0ZXIuX2J1aWxkUmVzb3VyY2VzKGRvY3VtZW50X2Zyb20sIHJlc291cmNlX2Rlc3QsIHNjaGVtYSwgaW5jbHVkZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBDb252ZXJ0ZXIuX2J1aWxkUmVzb3VyY2UoZG9jdW1lbnRfZnJvbS5kYXRhLCByZXNvdXJjZV9kZXN0LCBzY2hlbWEsIGluY2x1ZGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRpYyBfYnVpbGRSZXNvdXJjZXMoZG9jdW1lbnRfZnJvbTogSURhdGFDb2xsZWN0aW9uLCByZXNvdXJjZV9kZXN0OiBBcnJheTxJRGF0YUNvbGxlY3Rpb24+LCBzY2hlbWE6IElTY2hlbWEsIGluY2x1ZGVkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkYXRhIG9mIGRvY3VtZW50X2Zyb20uZGF0YSkge1xuICAgICAgICAgICAgICAgIGxldCByZXNvdXJjZSA9IEpzb25hcGkuQ29udmVydGVyLmdldFNlcnZpY2UoZGF0YS50eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoIShkYXRhLmlkIGluIHJlc291cmNlX2Rlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlX2Rlc3RbZGF0YS5pZF0gPSBuZXcgKDxhbnk+cmVzb3VyY2UuY29uc3RydWN0b3IpKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlX2Rlc3RbZGF0YS5pZF0ucmVzZXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ29udmVydGVyLl9idWlsZFJlc291cmNlKGRhdGEsIHJlc291cmNlX2Rlc3RbZGF0YS5pZF0sIHNjaGVtYSwgaW5jbHVkZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGljIF9idWlsZFJlc291cmNlKGRvY3VtZW50X2Zyb206IElEYXRhUmVzb3VyY2UsIHJlc291cmNlX2Rlc3Q6IElSZXNvdXJjZSwgc2NoZW1hOiBJU2NoZW1hLCBpbmNsdWRlZCkge1xuICAgICAgICAgICAgcmVzb3VyY2VfZGVzdC5hdHRyaWJ1dGVzID0gZG9jdW1lbnRfZnJvbS5hdHRyaWJ1dGVzO1xuICAgICAgICAgICAgcmVzb3VyY2VfZGVzdC5pZCA9IGRvY3VtZW50X2Zyb20uaWQ7XG4gICAgICAgICAgICByZXNvdXJjZV9kZXN0LmlzX25ldyA9IGZhbHNlO1xuICAgICAgICAgICAgQ29udmVydGVyLl9fYnVpbGRSZWxhdGlvbnNoaXBzKGRvY3VtZW50X2Zyb20ucmVsYXRpb25zaGlwcywgcmVzb3VyY2VfZGVzdC5yZWxhdGlvbnNoaXBzLCBpbmNsdWRlZCwgc2NoZW1hKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRpYyBfX2J1aWxkUmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXBzX2Zyb206IEFycmF5PGFueT4sIHJlbGF0aW9uc2hpcHNfZGVzdDogQXJyYXk8YW55PiwgaW5jbHVkZWRfYXJyYXksIHNjaGVtYTogSVNjaGVtYSkge1xuICAgICAgICAgICAgLy8gcmVjb3JybyBsb3MgcmVsYXRpb25zaGlwcyBsZXZhbnRvIGVsIHNlcnZpY2UgY29ycmVzcG9uZGllbnRlXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocmVsYXRpb25zaGlwc19mcm9tLCAocmVsYXRpb25fdmFsdWUsIHJlbGF0aW9uX2tleSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy8gcmVsYXRpb24gaXMgaW4gc2NoZW1hPyBoYXZlIGRhdGEgb3IganVzdCBsaW5rcz9cbiAgICAgICAgICAgICAgICBpZiAoIShyZWxhdGlvbl9rZXkgaW4gcmVsYXRpb25zaGlwc19kZXN0KSAmJiAoJ2RhdGEnIGluIHJlbGF0aW9uX3ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzX2Rlc3RbcmVsYXRpb25fa2V5XSA9IHsgZGF0YTogW10gfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBzb21ldGltZSBkYXRhPW51bGwgb3Igc2ltcGxlIHsgfVxuICAgICAgICAgICAgICAgIGlmICghcmVsYXRpb25fdmFsdWUuZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDtcblxuICAgICAgICAgICAgICAgIGlmIChzY2hlbWEucmVsYXRpb25zaGlwc1tyZWxhdGlvbl9rZXldICYmIHNjaGVtYS5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uX2tleV0uaGFzTWFueSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25fdmFsdWUuZGF0YS5sZW5ndGggPCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc291cmNlX3NlcnZpY2UgPSBKc29uYXBpLkNvbnZlcnRlci5nZXRTZXJ2aWNlKHJlbGF0aW9uX3ZhbHVlLmRhdGFbMF0udHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZV9zZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzX2Rlc3RbcmVsYXRpb25fa2V5XS5kYXRhID0ge307IC8vIGZvcmNlIHRvIG9iamVjdCAobm90IGFycmF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHJlbGF0aW9uX3ZhbHVlLmRhdGEsIChyZWxhdGlvbl92YWx1ZTogSnNvbmFwaS5JRGF0YVJlc291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRtcCA9IENvbnZlcnRlci5fX2J1aWxkUmVsYXRpb25zaGlwKHJlbGF0aW9uX3ZhbHVlLCBpbmNsdWRlZF9hcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwc19kZXN0W3JlbGF0aW9uX2tleV0uZGF0YVt0bXAuaWRdID0gdG1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzX2Rlc3RbcmVsYXRpb25fa2V5XS5kYXRhID0gQ29udmVydGVyLl9fYnVpbGRSZWxhdGlvbnNoaXAocmVsYXRpb25fdmFsdWUuZGF0YSwgaW5jbHVkZWRfYXJyYXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGljIF9fYnVpbGRSZWxhdGlvbnNoaXAocmVsYXRpb246IEpzb25hcGkuSURhdGFSZXNvdXJjZSwgaW5jbHVkZWRfYXJyYXkpOiBKc29uYXBpLklSZXNvdXJjZSB8IEpzb25hcGkuSURhdGFSZXNvdXJjZSB7XG4gICAgICAgICAgICBpZiAocmVsYXRpb24udHlwZSBpbiBpbmNsdWRlZF9hcnJheSAmJlxuICAgICAgICAgICAgICAgIHJlbGF0aW9uLmlkIGluIGluY2x1ZGVkX2FycmF5W3JlbGF0aW9uLnR5cGVdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBpdCdzIGluIGluY2x1ZGVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVkX2FycmF5W3JlbGF0aW9uLnR5cGVdW3JlbGF0aW9uLmlkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzb3VyY2Ugbm90IGluY2x1ZGVkLCByZXR1cm4gZGlyZWN0bHkgdGhlIG9iamVjdFxuICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cblxuXG5cbiAgICB9XG59XG4iLCJ2YXIgSnNvbmFwaTtcbihmdW5jdGlvbiAoSnNvbmFwaSkge1xuICAgIHZhciBDb252ZXJ0ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBDb252ZXJ0ZXIoKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgIENvbnZlcnQganNvbiBhcnJheXMgKGxpa2UgaW5jbHVkZWQpIHRvIGFuIFJlc291cmNlcyBhcnJheXMgd2l0aG91dCBba2V5c11cbiAgICAgICAgKiovXG4gICAgICAgIENvbnZlcnRlci5qc29uX2FycmF5MnJlc291cmNlc19hcnJheSA9IGZ1bmN0aW9uIChqc29uX2FycmF5LCBkZXN0aW5hdGlvbl9hcnJheSwgLy8gQXJyYXk8SnNvbmFwaS5JUmVzb3VyY2U+LFxuICAgICAgICAgICAgdXNlX2lkX2Zvcl9rZXkpIHtcbiAgICAgICAgICAgIGlmICh1c2VfaWRfZm9yX2tleSA9PT0gdm9pZCAwKSB7IHVzZV9pZF9mb3Jfa2V5ID0gZmFsc2U7IH1cbiAgICAgICAgICAgIGlmICghZGVzdGluYXRpb25fYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9hcnJheSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwganNvbl9hcnJheV8xID0ganNvbl9hcnJheTsgX2kgPCBqc29uX2FycmF5XzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBqc29uX2FycmF5XzFbX2ldO1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IEpzb25hcGkuQ29udmVydGVyLmpzb24ycmVzb3VyY2UoZGF0YSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh1c2VfaWRfZm9yX2tleSkge1xuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9hcnJheVtyZXNvdXJjZS5pZF0gPSByZXNvdXJjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGVkIGZvciBleGFtcGxlIG5lZWQgYSBleHRyYSBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25fYXJyYXlbcmVzb3VyY2UudHlwZSArICdfJyArIHJlc291cmNlLmlkXSA9IHJlc291cmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZGVzdGluYXRpb25fYXJyYXlbJyRjb3VudCddID0gY291bnQ7IC8vIHByb2JsZW0gd2l0aCB0b0FycmF5IG9yIGFuZ3VsYXIuZm9yRWFjaCBuZWVkIGEgIWlzT2JqZWN0XG4gICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25fYXJyYXk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICBDb252ZXJ0IGpzb24gYXJyYXlzIChsaWtlIGluY2x1ZGVkKSB0byBhbiBpbmRleGVkIFJlc291cmNlcyBhcnJheSBieSBbdHlwZV1baWRdXG4gICAgICAgICoqL1xuICAgICAgICBDb252ZXJ0ZXIuanNvbl9hcnJheTJyZXNvdXJjZXNfYXJyYXlfYnlfdHlwZSA9IGZ1bmN0aW9uIChqc29uX2FycmF5LCBpbnN0YW5jZV9yZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgICAgICB2YXIgYWxsX3Jlc291cmNlcyA9IHt9O1xuICAgICAgICAgICAgQ29udmVydGVyLmpzb25fYXJyYXkycmVzb3VyY2VzX2FycmF5KGpzb25fYXJyYXksIGFsbF9yZXNvdXJjZXMsIGZhbHNlKTtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSB7fTtcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChhbGxfcmVzb3VyY2VzLCBmdW5jdGlvbiAocmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShyZXNvdXJjZS50eXBlIGluIHJlc291cmNlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzW3Jlc291cmNlLnR5cGVdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc291cmNlc1tyZXNvdXJjZS50eXBlXVtyZXNvdXJjZS5pZF0gPSByZXNvdXJjZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlcztcbiAgICAgICAgfTtcbiAgICAgICAgQ29udmVydGVyLmpzb24ycmVzb3VyY2UgPSBmdW5jdGlvbiAoanNvbl9yZXNvdXJjZSwgaW5zdGFuY2VfcmVsYXRpb25zaGlwcykge1xuICAgICAgICAgICAgdmFyIHJlc291cmNlX3NlcnZpY2UgPSBKc29uYXBpLkNvbnZlcnRlci5nZXRTZXJ2aWNlKGpzb25fcmVzb3VyY2UudHlwZSk7XG4gICAgICAgICAgICBpZiAocmVzb3VyY2Vfc2VydmljZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBKc29uYXBpLkNvbnZlcnRlci5wcm9jcmVhdGUocmVzb3VyY2Vfc2VydmljZSwganNvbl9yZXNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzZXJ2aWNlIG5vdCByZWdpc3RlcmVkXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdgJyArIGpzb25fcmVzb3VyY2UudHlwZSArICdgJywgJ3NlcnZpY2Ugbm90IGZvdW5kIG9uIGpzb24ycmVzb3VyY2UoKScpO1xuICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gbmV3IEpzb25hcGkuUmVzb3VyY2UoKTtcbiAgICAgICAgICAgICAgICB0ZW1wLmlkID0ganNvbl9yZXNvdXJjZS5pZDtcbiAgICAgICAgICAgICAgICB0ZW1wLnR5cGUgPSBqc29uX3Jlc291cmNlLnR5cGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIENvbnZlcnRlci5nZXRTZXJ2aWNlID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZV9zZXJ2aWNlID0gSnNvbmFwaS5Db3JlLk1lLmdldFJlc291cmNlKHR5cGUpO1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQocmVzb3VyY2Vfc2VydmljZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2AnICsgdHlwZSArICdgJywgJ3NlcnZpY2Ugbm90IGZvdW5kIG9uIGdldFNlcnZpY2UoKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlX3NlcnZpY2U7XG4gICAgICAgIH07XG4gICAgICAgIC8qIHJldHVybiBhIHJlc291cmNlIHR5cGUocmVzb3J1Y2Vfc2VydmljZSkgd2l0aCBkYXRhKGRhdGEpICovXG4gICAgICAgIENvbnZlcnRlci5wcm9jcmVhdGUgPSBmdW5jdGlvbiAocmVzb3VyY2Vfc2VydmljZSwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKCEoJ3R5cGUnIGluIGRhdGEgJiYgJ2lkJyBpbiBkYXRhKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0pzb25hcGkgUmVzb3VyY2UgaXMgbm90IGNvcnJlY3QnLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IG5ldyByZXNvdXJjZV9zZXJ2aWNlLmNvbnN0cnVjdG9yKCk7XG4gICAgICAgICAgICByZXNvdXJjZS5uZXcoKTtcbiAgICAgICAgICAgIHJlc291cmNlLmlkID0gZGF0YS5pZDtcbiAgICAgICAgICAgIHJlc291cmNlLmF0dHJpYnV0ZXMgPSBkYXRhLmF0dHJpYnV0ZXMgPyBkYXRhLmF0dHJpYnV0ZXMgOiB7fTtcbiAgICAgICAgICAgIHJlc291cmNlLmlzX25ldyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlO1xuICAgICAgICB9O1xuICAgICAgICBDb252ZXJ0ZXIuYnVpbGQgPSBmdW5jdGlvbiAoZG9jdW1lbnRfZnJvbSwgcmVzb3VyY2VfZGVzdCwgc2NoZW1hKSB7XG4gICAgICAgICAgICAvLyBpbnN0YW5jaW8gbG9zIGluY2x1ZGUgeSBsb3MgZ3VhcmRvIGVuIGluY2x1ZGVkIGFycmFyeVxuICAgICAgICAgICAgdmFyIGluY2x1ZGVkID0ge307XG4gICAgICAgICAgICBpZiAoJ2luY2x1ZGVkJyBpbiBkb2N1bWVudF9mcm9tKSB7XG4gICAgICAgICAgICAgICAgaW5jbHVkZWQgPSBDb252ZXJ0ZXIuanNvbl9hcnJheTJyZXNvdXJjZXNfYXJyYXlfYnlfdHlwZShkb2N1bWVudF9mcm9tLmluY2x1ZGVkLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW5ndWxhci5pc0FycmF5KGRvY3VtZW50X2Zyb20uZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBDb252ZXJ0ZXIuX2J1aWxkUmVzb3VyY2VzKGRvY3VtZW50X2Zyb20sIHJlc291cmNlX2Rlc3QsIHNjaGVtYSwgaW5jbHVkZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgQ29udmVydGVyLl9idWlsZFJlc291cmNlKGRvY3VtZW50X2Zyb20uZGF0YSwgcmVzb3VyY2VfZGVzdCwgc2NoZW1hLCBpbmNsdWRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIENvbnZlcnRlci5fYnVpbGRSZXNvdXJjZXMgPSBmdW5jdGlvbiAoZG9jdW1lbnRfZnJvbSwgcmVzb3VyY2VfZGVzdCwgc2NoZW1hLCBpbmNsdWRlZCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IGRvY3VtZW50X2Zyb20uZGF0YTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBKc29uYXBpLkNvbnZlcnRlci5nZXRTZXJ2aWNlKGRhdGEudHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZGF0YS5pZCBpbiByZXNvdXJjZV9kZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9kZXN0W2RhdGEuaWRdID0gbmV3IHJlc291cmNlLmNvbnN0cnVjdG9yKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlX2Rlc3RbZGF0YS5pZF0ucmVzZXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ29udmVydGVyLl9idWlsZFJlc291cmNlKGRhdGEsIHJlc291cmNlX2Rlc3RbZGF0YS5pZF0sIHNjaGVtYSwgaW5jbHVkZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBDb252ZXJ0ZXIuX2J1aWxkUmVzb3VyY2UgPSBmdW5jdGlvbiAoZG9jdW1lbnRfZnJvbSwgcmVzb3VyY2VfZGVzdCwgc2NoZW1hLCBpbmNsdWRlZCkge1xuICAgICAgICAgICAgcmVzb3VyY2VfZGVzdC5hdHRyaWJ1dGVzID0gZG9jdW1lbnRfZnJvbS5hdHRyaWJ1dGVzO1xuICAgICAgICAgICAgcmVzb3VyY2VfZGVzdC5pZCA9IGRvY3VtZW50X2Zyb20uaWQ7XG4gICAgICAgICAgICByZXNvdXJjZV9kZXN0LmlzX25ldyA9IGZhbHNlO1xuICAgICAgICAgICAgQ29udmVydGVyLl9fYnVpbGRSZWxhdGlvbnNoaXBzKGRvY3VtZW50X2Zyb20ucmVsYXRpb25zaGlwcywgcmVzb3VyY2VfZGVzdC5yZWxhdGlvbnNoaXBzLCBpbmNsdWRlZCwgc2NoZW1hKTtcbiAgICAgICAgfTtcbiAgICAgICAgQ29udmVydGVyLl9fYnVpbGRSZWxhdGlvbnNoaXBzID0gZnVuY3Rpb24gKHJlbGF0aW9uc2hpcHNfZnJvbSwgcmVsYXRpb25zaGlwc19kZXN0LCBpbmNsdWRlZF9hcnJheSwgc2NoZW1hKSB7XG4gICAgICAgICAgICAvLyByZWNvcnJvIGxvcyByZWxhdGlvbnNoaXBzIGxldmFudG8gZWwgc2VydmljZSBjb3JyZXNwb25kaWVudGVcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChyZWxhdGlvbnNoaXBzX2Zyb20sIGZ1bmN0aW9uIChyZWxhdGlvbl92YWx1ZSwgcmVsYXRpb25fa2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gcmVsYXRpb24gaXMgaW4gc2NoZW1hPyBoYXZlIGRhdGEgb3IganVzdCBsaW5rcz9cbiAgICAgICAgICAgICAgICBpZiAoIShyZWxhdGlvbl9rZXkgaW4gcmVsYXRpb25zaGlwc19kZXN0KSAmJiAoJ2RhdGEnIGluIHJlbGF0aW9uX3ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzX2Rlc3RbcmVsYXRpb25fa2V5XSA9IHsgZGF0YTogW10gfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gc29tZXRpbWUgZGF0YT1udWxsIG9yIHNpbXBsZSB7IH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlbGF0aW9uX3ZhbHVlLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25fa2V5XSAmJiBzY2hlbWEucmVsYXRpb25zaGlwc1tyZWxhdGlvbl9rZXldLmhhc01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uX3ZhbHVlLmRhdGEubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlX3NlcnZpY2UgPSBKc29uYXBpLkNvbnZlcnRlci5nZXRTZXJ2aWNlKHJlbGF0aW9uX3ZhbHVlLmRhdGFbMF0udHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZV9zZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzX2Rlc3RbcmVsYXRpb25fa2V5XS5kYXRhID0ge307IC8vIGZvcmNlIHRvIG9iamVjdCAobm90IGFycmF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHJlbGF0aW9uX3ZhbHVlLmRhdGEsIGZ1bmN0aW9uIChyZWxhdGlvbl92YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSBDb252ZXJ0ZXIuX19idWlsZFJlbGF0aW9uc2hpcChyZWxhdGlvbl92YWx1ZSwgaW5jbHVkZWRfYXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHNfZGVzdFtyZWxhdGlvbl9rZXldLmRhdGFbdG1wLmlkXSA9IHRtcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzX2Rlc3RbcmVsYXRpb25fa2V5XS5kYXRhID0gQ29udmVydGVyLl9fYnVpbGRSZWxhdGlvbnNoaXAocmVsYXRpb25fdmFsdWUuZGF0YSwgaW5jbHVkZWRfYXJyYXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBDb252ZXJ0ZXIuX19idWlsZFJlbGF0aW9uc2hpcCA9IGZ1bmN0aW9uIChyZWxhdGlvbiwgaW5jbHVkZWRfYXJyYXkpIHtcbiAgICAgICAgICAgIGlmIChyZWxhdGlvbi50eXBlIGluIGluY2x1ZGVkX2FycmF5ICYmXG4gICAgICAgICAgICAgICAgcmVsYXRpb24uaWQgaW4gaW5jbHVkZWRfYXJyYXlbcmVsYXRpb24udHlwZV0pIHtcbiAgICAgICAgICAgICAgICAvLyBpdCdzIGluIGluY2x1ZGVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVkX2FycmF5W3JlbGF0aW9uLnR5cGVdW3JlbGF0aW9uLmlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHJlc291cmNlIG5vdCBpbmNsdWRlZCwgcmV0dXJuIGRpcmVjdGx5IHRoZSBvYmplY3RcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBDb252ZXJ0ZXI7XG4gICAgfSgpKTtcbiAgICBKc29uYXBpLkNvbnZlcnRlciA9IENvbnZlcnRlcjtcbn0pKEpzb25hcGkgfHwgKEpzb25hcGkgPSB7fSkpO1xuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vX2FsbC50c1wiIC8+XG5cbm1vZHVsZSBKc29uYXBpIHtcbiAgICBleHBvcnQgY2xhc3MgQ29yZSBpbXBsZW1lbnRzIEpzb25hcGkuSUNvcmUge1xuICAgICAgICBwdWJsaWMgcm9vdFBhdGg6IHN0cmluZyA9ICdodHRwOi8vcmV5ZXNvZnQuZGRucy5uZXQ6OTk5OS9hcGkvdjEvY29tcGFuaWVzLzInO1xuICAgICAgICBwdWJsaWMgcmVzb3VyY2VzOiBBcnJheTxKc29uYXBpLklSZXNvdXJjZT4gPSBbXTtcblxuICAgICAgICBwdWJsaWMgbG9hZGluZ3NDb3VudGVyOiBudW1iZXIgPSAwO1xuICAgICAgICBwdWJsaWMgbG9hZGluZ3NTdGFydCA9ICgpID0+IHt9O1xuICAgICAgICBwdWJsaWMgbG9hZGluZ3NEb25lID0gKCkgPT4ge307XG4gICAgICAgIHB1YmxpYyBsb2FkaW5nc0Vycm9yID0gKCkgPT4ge307XG4gICAgICAgIHB1YmxpYyBsb2FkaW5nc09mZmxpbmUgPSAoKSA9PiB7fTtcblxuICAgICAgICBwdWJsaWMgc3RhdGljIE1lOiBKc29uYXBpLklDb3JlID0gbnVsbDtcbiAgICAgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlczogYW55ID0gbnVsbDtcblxuICAgICAgICAvKiogQG5nSW5qZWN0ICovXG4gICAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgICAgIHByb3RlY3RlZCByc0pzb25hcGlDb25maWcsXG4gICAgICAgICAgICBwcm90ZWN0ZWQgSnNvbmFwaUNvcmVTZXJ2aWNlc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIEpzb25hcGkuQ29yZS5NZSA9IHRoaXM7XG4gICAgICAgICAgICBKc29uYXBpLkNvcmUuU2VydmljZXMgPSBKc29uYXBpQ29yZVNlcnZpY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIF9yZWdpc3RlcihjbGFzZSk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgaWYgKGNsYXNlLnR5cGUgaW4gdGhpcy5yZXNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlc1tjbGFzZS50eXBlXSA9IGNsYXNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZ2V0UmVzb3VyY2UodHlwZTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXNbdHlwZV07XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgcmVmcmVzaExvYWRpbmdzKGZhY3RvcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdzQ291bnRlciArPSBmYWN0b3I7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2FkaW5nc0NvdW50ZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdzRG9uZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvYWRpbmdzQ291bnRlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ3NTdGFydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFuZ3VsYXIubW9kdWxlKCdKc29uYXBpLnNlcnZpY2VzJykuc2VydmljZSgnSnNvbmFwaUNvcmUnLCBDb3JlKTtcbn1cbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL19hbGwudHNcIiAvPlxudmFyIEpzb25hcGk7XG4oZnVuY3Rpb24gKEpzb25hcGkpIHtcbiAgICB2YXIgQ29yZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKiBAbmdJbmplY3QgKi9cbiAgICAgICAgZnVuY3Rpb24gQ29yZShyc0pzb25hcGlDb25maWcsIEpzb25hcGlDb3JlU2VydmljZXMpIHtcbiAgICAgICAgICAgIHRoaXMucnNKc29uYXBpQ29uZmlnID0gcnNKc29uYXBpQ29uZmlnO1xuICAgICAgICAgICAgdGhpcy5Kc29uYXBpQ29yZVNlcnZpY2VzID0gSnNvbmFwaUNvcmVTZXJ2aWNlcztcbiAgICAgICAgICAgIHRoaXMucm9vdFBhdGggPSAnaHR0cDovL3JleWVzb2Z0LmRkbnMubmV0Ojk5OTkvYXBpL3YxL2NvbXBhbmllcy8yJztcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gW107XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdzQ291bnRlciA9IDA7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdzU3RhcnQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdzRG9uZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ3NFcnJvciA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ3NPZmZsaW5lID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAgICAgSnNvbmFwaS5Db3JlLk1lID0gdGhpcztcbiAgICAgICAgICAgIEpzb25hcGkuQ29yZS5TZXJ2aWNlcyA9IEpzb25hcGlDb3JlU2VydmljZXM7XG4gICAgICAgIH1cbiAgICAgICAgQ29yZS5wcm90b3R5cGUuX3JlZ2lzdGVyID0gZnVuY3Rpb24gKGNsYXNlKSB7XG4gICAgICAgICAgICBpZiAoY2xhc2UudHlwZSBpbiB0aGlzLnJlc291cmNlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzW2NsYXNlLnR5cGVdID0gY2xhc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgQ29yZS5wcm90b3R5cGUuZ2V0UmVzb3VyY2UgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzW3R5cGVdO1xuICAgICAgICB9O1xuICAgICAgICBDb3JlLnByb3RvdHlwZS5yZWZyZXNoTG9hZGluZ3MgPSBmdW5jdGlvbiAoZmFjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdzQ291bnRlciArPSBmYWN0b3I7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2FkaW5nc0NvdW50ZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdzRG9uZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5sb2FkaW5nc0NvdW50ZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdzU3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgQ29yZS5NZSA9IG51bGw7XG4gICAgICAgIENvcmUuU2VydmljZXMgPSBudWxsO1xuICAgICAgICByZXR1cm4gQ29yZTtcbiAgICB9KCkpO1xuICAgIEpzb25hcGkuQ29yZSA9IENvcmU7XG4gICAgYW5ndWxhci5tb2R1bGUoJ0pzb25hcGkuc2VydmljZXMnKS5zZXJ2aWNlKCdKc29uYXBpQ29yZScsIENvcmUpO1xufSkoSnNvbmFwaSB8fCAoSnNvbmFwaSA9IHt9KSk7XG4iLCJtb2R1bGUgSnNvbmFwaSB7XG4gICAgZXhwb3J0IGNsYXNzIFJlc291cmNlIGltcGxlbWVudHMgSVJlc291cmNlIHtcbiAgICAgICAgcHVibGljIHNjaGVtYTogSVNjaGVtYTtcbiAgICAgICAgcHJvdGVjdGVkIHBhdGg6IHN0cmluZzsgICAvLyB3aXRob3V0IHNsYXNoZXNcblxuICAgICAgICBwdWJsaWMgaXNfbmV3ID0gdHJ1ZTtcbiAgICAgICAgcHVibGljIHR5cGU6IHN0cmluZztcbiAgICAgICAgcHVibGljIGlkOiBzdHJpbmc7XG4gICAgICAgIHB1YmxpYyBhdHRyaWJ1dGVzOiBhbnkgO1xuICAgICAgICBwdWJsaWMgcmVsYXRpb25zaGlwczogYW55ID0ge307IC8vW107XG5cbiAgICAgICAgcHVibGljIGNhY2hlOiBPYmplY3Q7XG4gICAgICAgIHB1YmxpYyBjYWNoZV92YXJzOiBPYmplY3QgPSB7fTtcblxuICAgICAgICBwdWJsaWMgY2xvbmUoKTogYW55IHtcbiAgICAgICAgICAgIHZhciBjbG9uZU9iaiA9IG5ldyAoPGFueT50aGlzLmNvbnN0cnVjdG9yKSgpO1xuICAgICAgICAgICAgZm9yICh2YXIgYXR0cmlidXQgaW4gdGhpcykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1thdHRyaWJ1dF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lT2JqW2F0dHJpYnV0XSA9IHRoaXNbYXR0cmlidXRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbG9uZU9iajtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICBSZWdpc3RlciBzY2hlbWEgb24gSnNvbmFwaS5Db3JlXG4gICAgICAgIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgZG9uJ3QgZXhpc3QgYW5kIHJlZ2lzdGVyZWQgb2tcbiAgICAgICAgKiovXG4gICAgICAgIHB1YmxpYyByZWdpc3RlcigpOiBib29sZWFuIHtcbiAgICAgICAgICAgIGlmIChKc29uYXBpLkNvcmUuTWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnRXJyb3I6IHlvdSBhcmUgdHJ5aW5nIHJlZ2lzdGVyIC0tPiAnICsgdGhpcy50eXBlICsgJyA8LS0gYmVmb3JlIGluamVjdCBKc29uYXBpQ29yZSBzb21ld2hlcmUsIGFsbW9zdCBvbmUgdGltZS4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gb25seSB3aGVuIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZCwgbm90IGNsb25lZCBvYmplY3RcbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSB7fTtcbiAgICAgICAgICAgIHJldHVybiBKc29uYXBpLkNvcmUuTWUuX3JlZ2lzdGVyKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGdldFBhdGgoKTogc3RyaW5nIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGggPyB0aGlzLnBhdGggOiB0aGlzLnR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbXB0eSBzZWxmIG9iamVjdFxuICAgICAgICBwdWJsaWMgbmV3PFQgZXh0ZW5kcyBKc29uYXBpLklSZXNvdXJjZT4oKTogVCB7XG4gICAgICAgICAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgICAgICByZXNvdXJjZS5yZXNldCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5pZCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHMgPSB7fTtcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCh0aGlzLnNjaGVtYS5yZWxhdGlvbnNoaXBzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHNlbGYucmVsYXRpb25zaGlwc1trZXldID0ge307XG4gICAgICAgICAgICAgICAgc2VsZi5yZWxhdGlvbnNoaXBzW2tleV1bJ2RhdGEnXSA9IHt9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmlzX25ldyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgdG9PYmplY3QocGFyYW1zPzogSnNvbmFwaS5JUGFyYW1zKTogSURhdGFPYmplY3Qge1xuICAgICAgICAgICAgcGFyYW1zID0gYW5ndWxhci5leHRlbmQoe30sIEpzb25hcGkuQmFzZS5QYXJhbXMsIHBhcmFtcyk7XG4gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBKc29uYXBpLkJhc2UuU2NoZW1hLCB0aGlzLnNjaGVtYSk7XG5cbiAgICAgICAgICAgIGxldCByZWxhdGlvbnNoaXBzID0geyB9O1xuICAgICAgICAgICAgbGV0IGluY2x1ZGVkID0gWyBdO1xuICAgICAgICAgICAgbGV0IGluY2x1ZGVkX2lkcyA9IFsgXTsgLy9qdXN0IGZvciBjb250cm9sIGRvbid0IHJlcGVhdCBhbnkgcmVzb3VyY2VcblxuICAgICAgICAgICAgLy8gUkVBTFRJT05TSElQU1xuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRoaXMucmVsYXRpb25zaGlwcywgKHJlbGF0aW9uc2hpcCwgcmVsYXRpb25fYWxpYXMpID0+IHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uX2FsaWFzXSAmJiB0aGlzLnNjaGVtYS5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uX2FsaWFzXS5oYXNNYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhcyBtYW55IChoYXNNYW55OnRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHNbcmVsYXRpb25fYWxpYXNdID0geyBkYXRhOiBbXSB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChyZWxhdGlvbnNoaXAuZGF0YSwgKHJlc291cmNlOiBKc29uYXBpLklSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYXRpb25hbF9vYmplY3QgPSB7IGlkOiByZXNvdXJjZS5pZCwgdHlwZTogcmVzb3VyY2UudHlwZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwc1tyZWxhdGlvbl9hbGlhc11bJ2RhdGEnXS5wdXNoKHJlYXRpb25hbF9vYmplY3QpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzZSBhZ3JlZ8OzIGHDum4gYSBpbmNsdWRlZCAmJiBzZSBoYSBwZWRpZG8gaW5jbHVpciBjb24gZWwgcGFybXMuaW5jbHVkZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBvcmFsX2lkID0gcmVzb3VyY2UudHlwZSArICdfJyArIHJlc291cmNlLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkX2lkcy5pbmRleE9mKHRlbXBvcmFsX2lkKSA9PT0gLTEgJiYgcGFyYW1zLmluY2x1ZGUuaW5kZXhPZihyZWxhdGlvbl9hbGlhcykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRfaWRzLnB1c2godGVtcG9yYWxfaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkLnB1c2gocmVzb3VyY2UudG9PYmplY3QoeyB9KS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaGFzIG9uZSAoaGFzTWFueTpmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoJ2lkJyBpbiByZWxhdGlvbnNoaXAuZGF0YSkgJiYgIWFuZ3VsYXIuZXF1YWxzKHt9LCByZWxhdGlvbnNoaXAuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihyZWxhdGlvbl9hbGlhcyArICcgZGVmaW5lZCB3aXRoIGhhc01hbnk6ZmFsc2UsIGJ1dCBJIGhhdmUgYSBjb2xsZWN0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwLmRhdGEuaWQgJiYgcmVsYXRpb25zaGlwLmRhdGEudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwc1tyZWxhdGlvbl9hbGlhc10gPSB7IGRhdGE6IHsgaWQ6IHJlbGF0aW9uc2hpcC5kYXRhLmlkLCB0eXBlOiByZWxhdGlvbnNoaXAuZGF0YS50eXBlIH0gfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHNbcmVsYXRpb25fYWxpYXNdID0geyBkYXRhOiB7IH0gfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlIGFncmVnw7MgYcO6biBhIGluY2x1ZGVkICYmIHNlIGhhIHBlZGlkbyBpbmNsdWlyIGNvbiBlbCBwYXJtcy5pbmNsdWRlXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wb3JhbF9pZCA9IHJlbGF0aW9uc2hpcC5kYXRhLnR5cGUgKyAnXycgKyByZWxhdGlvbnNoaXAuZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkX2lkcy5pbmRleE9mKHRlbXBvcmFsX2lkKSA9PT0gLTEgJiYgcGFyYW1zLmluY2x1ZGUuaW5kZXhPZihyZWxhdGlvbnNoaXAuZGF0YS50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkX2lkcy5wdXNoKHRlbXBvcmFsX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkLnB1c2gocmVsYXRpb25zaGlwLmRhdGEudG9PYmplY3QoeyB9KS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgcmV0OiBJRGF0YU9iamVjdCA9IHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwczogcmVsYXRpb25zaGlwc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChpbmNsdWRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0LmluY2x1ZGVkID0gaW5jbHVkZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZ2V0PFQgZXh0ZW5kcyBKc29uYXBpLklSZXNvdXJjZT4oaWQ6IHN0cmluZywgcGFyYW1zPzogT2JqZWN0IHwgRnVuY3Rpb24sIGZjX3N1Y2Nlc3M/OiBGdW5jdGlvbiwgZmNfZXJyb3I/OiBGdW5jdGlvbik6IFQge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19leGVjKGlkLCBwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yLCAnZ2V0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZGVsZXRlKGlkOiBzdHJpbmcsIHBhcmFtcz86IE9iamVjdCB8IEZ1bmN0aW9uLCBmY19zdWNjZXNzPzogRnVuY3Rpb24sIGZjX2Vycm9yPzogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgICAgIHRoaXMuX19leGVjKGlkLCBwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yLCAnZGVsZXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgYWxsPFQgZXh0ZW5kcyBKc29uYXBpLklSZXNvdXJjZT4ocGFyYW1zPzogT2JqZWN0IHwgRnVuY3Rpb24sIGZjX3N1Y2Nlc3M/OiBGdW5jdGlvbiwgZmNfZXJyb3I/OiBGdW5jdGlvbik6IEFycmF5PFQ+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fZXhlYyhudWxsLCBwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yLCAnYWxsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZ2V0UmVsYXRpb25zaGlwczxUIGV4dGVuZHMgSnNvbmFwaS5JUmVzb3VyY2U+KHBhcmVudF9wYXRoX2lkOiBzdHJpbmcsXG4gICAgICAgICAgICBwYXJhbXM/OiBPYmplY3QgfCBGdW5jdGlvbiwgZmNfc3VjY2Vzcz86IEZ1bmN0aW9uLCBmY19lcnJvcj86IEZ1bmN0aW9uXG4gICAgICAgICk6IEFycmF5PFQ+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fZXhlYyhwYXJlbnRfcGF0aF9pZCwgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvciwgJ2dldFJlbGF0aW9uc2hpcHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzYXZlPFQgZXh0ZW5kcyBKc29uYXBpLklSZXNvdXJjZT4ocGFyYW1zPzogT2JqZWN0IHwgRnVuY3Rpb24sIGZjX3N1Y2Nlc3M/OiBGdW5jdGlvbiwgZmNfZXJyb3I/OiBGdW5jdGlvbik6IEFycmF5PFQ+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fZXhlYyhudWxsLCBwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yLCAnc2F2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgIFRoaXMgbWV0aG9kIHNvcnQgcGFyYW1zIGZvciBuZXcoKSwgZ2V0KCkgYW5kIHVwZGF0ZSgpXG4gICAgICAgICovXG4gICAgICAgIHByaXZhdGUgX19leGVjKGlkOiBzdHJpbmcsIHBhcmFtczogSnNvbmFwaS5JUGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvciwgZXhlY190eXBlOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICAgICAgLy8gbWFrZXMgYHBhcmFtc2Agb3B0aW9uYWxcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24ocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgIGZjX2Vycm9yID0gZmNfc3VjY2VzcztcbiAgICAgICAgICAgICAgICBmY19zdWNjZXNzID0gcGFyYW1zO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBKc29uYXBpLkJhc2UuUGFyYW1zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhbmd1bGFyLmV4dGVuZCh7fSwgSnNvbmFwaS5CYXNlLlBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYW5ndWxhci5leHRlbmQoe30sIEpzb25hcGkuQmFzZS5QYXJhbXMsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmY19zdWNjZXNzID0gYW5ndWxhci5pc0Z1bmN0aW9uKGZjX3N1Y2Nlc3MpID8gZmNfc3VjY2VzcyA6IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICAgICAgZmNfZXJyb3IgPSBhbmd1bGFyLmlzRnVuY3Rpb24oZmNfZXJyb3IpID8gZmNfZXJyb3IgOiBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBhbmd1bGFyLmV4dGVuZCh7fSwgSnNvbmFwaS5CYXNlLlNjaGVtYSwgdGhpcy5zY2hlbWEpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGV4ZWNfdHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2dldCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldChpZCwgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcik7XG4gICAgICAgICAgICAgICAgY2FzZSAnZ2V0UmVsYXRpb25zaGlwcyc6XG4gICAgICAgICAgICAgICAgcGFyYW1zLnBhdGggPSBpZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYWxsKHBhcmFtcywgZmNfc3VjY2VzcywgZmNfZXJyb3IpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGV0ZShpZCwgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcik7XG4gICAgICAgICAgICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYWxsKHBhcmFtcywgZmNfc3VjY2VzcywgZmNfZXJyb3IpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NhdmUnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zYXZlKHBhcmFtcywgZmNfc3VjY2VzcywgZmNfZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIF9nZXQoaWQ6IHN0cmluZywgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcik6IElSZXNvdXJjZSB7XG4gICAgICAgICAgICAvLyBodHRwIHJlcXVlc3RcbiAgICAgICAgICAgIGxldCBwYXRoID0gbmV3IEpzb25hcGkuUGF0aE1ha2VyKCk7XG4gICAgICAgICAgICBwYXRoLmFkZFBhdGgodGhpcy5nZXRQYXRoKCkpO1xuICAgICAgICAgICAgcGF0aC5hZGRQYXRoKGlkKTtcbiAgICAgICAgICAgIHBhcmFtcy5pbmNsdWRlID8gcGF0aC5zZXRJbmNsdWRlKHBhcmFtcy5pbmNsdWRlKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGxldCByZXNvdXJjZSA9IHRoaXMuZ2V0U2VydmljZSgpLmNhY2hlICYmIHRoaXMuZ2V0U2VydmljZSgpLmNhY2hlW2lkXSA/IHRoaXMuZ2V0U2VydmljZSgpLmNhY2hlW2lkXSA6IHRoaXMubmV3KCk7XG5cbiAgICAgICAgICAgIEpzb25hcGkuQ29yZS5TZXJ2aWNlcy5Kc29uYXBpSHR0cFxuICAgICAgICAgICAgLmdldChwYXRoLmdldCgpKVxuICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgc3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIENvbnZlcnRlci5idWlsZChzdWNjZXNzLmRhdGEsIHJlc291cmNlLCB0aGlzLnNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsbENhY2hlUmVzb3VyY2UocmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICBmY19zdWNjZXNzKHN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmY19lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIF9hbGwocGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcik6IElDb2xsZWN0aW9uIHsgLy8gQXJyYXk8SVJlc291cmNlPiB7XG5cbiAgICAgICAgICAgIC8vIGh0dHAgcmVxdWVzdFxuICAgICAgICAgICAgbGV0IHBhdGggPSBuZXcgSnNvbmFwaS5QYXRoTWFrZXIoKTtcbiAgICAgICAgICAgIHBhdGguYWRkUGF0aCh0aGlzLmdldFBhdGgoKSk7XG4gICAgICAgICAgICBwYXJhbXMucGF0aCA/IHBhdGguYWRkUGF0aChwYXJhbXMucGF0aCkgOiBudWxsO1xuICAgICAgICAgICAgcGFyYW1zLmluY2x1ZGUgPyBwYXRoLnNldEluY2x1ZGUocGFyYW1zLmluY2x1ZGUpIDogbnVsbDtcblxuICAgICAgICAgICAgLy8gbWFrZSByZXF1ZXN0XG4gICAgICAgICAgICBsZXQgcmVzb3VyY2U6IElDb2xsZWN0aW9uO1xuXG4gICAgICAgICAgICByZXNvdXJjZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHt9LCB7XG4gICAgICAgICAgICAgICAgJyRsZW5ndGgnOiB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGg7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnJGlzbG9hZGluZyc6IHsgdmFsdWU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAnJHNvdXJjZSc6IHsgdmFsdWU6ICcnLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBNRU1PUllfQ0FDSEVcbiAgICAgICAgICAgIC8vICghcGFyYW1zLnBhdGgpOiBiZWNvdXNlIHdlIG5lZWQgcmVhbCB0eXBlLCBub3QgdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGVcbiAgICAgICAgICAgIGlmICghcGFyYW1zLnBhdGggJiYgdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGUgJiYgdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGVfdmFyc1snX19wYXRoJ10gPT09IHRoaXMuZ2V0UGF0aCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbWFrZVxuICAgICAgICAgICAgICAgIHJlc291cmNlLiRzb3VyY2UgPSAnY2FjaGUnO1xuICAgICAgICAgICAgICAgIGxldCBmaWx0ZXIgPSBuZXcgSnNvbmFwaS5GaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2godGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGUsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1zLmZpbHRlciB8fCBmaWx0ZXIucGFzc0ZpbHRlcih2YWx1ZSwgcGFyYW1zLmZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvdXJjZVsnJGlzbG9hZGluZyddID0gdHJ1ZTtcbiAgICAgICAgICAgIEpzb25hcGkuQ29yZS5TZXJ2aWNlcy5Kc29uYXBpSHR0cFxuICAgICAgICAgICAgLmdldChwYXRoLmdldCgpKVxuICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgc3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLiRzb3VyY2UgPSAnc2VydmVyJztcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuJGlzbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXIuYnVpbGQoc3VjY2Vzcy5kYXRhLCByZXNvdXJjZSwgdGhpcy5zY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAoIXBhcmFtcy5wYXRoKTogZmlsbCBjYWNoZSBuZWVkIHdvcmsgd2l0aCByZWxhdGlvbnNoaXBzIHRvbyxcbiAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtb21tZW50IHdlJ3JlIGNyZWF0ZWQgdGhpcyBpZlxuICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGxDYWNoZShyZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgZ2V0dGVkIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWx0ZXIgPSBuZXcgSnNvbmFwaS5GaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChyZXNvdXJjZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbHRlci5wYXNzRmlsdGVyKHZhbHVlLCBwYXJhbXMuZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVzb3VyY2Vba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZjX3N1Y2Nlc3Moc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLiRzb3VyY2UgPSAnc2VydmVyJztcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuJGlzbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmY19lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBfZGVsZXRlKGlkOiBzdHJpbmcsIHBhcmFtcywgZmNfc3VjY2VzcywgZmNfZXJyb3IpOiB2b2lkIHtcbiAgICAgICAgICAgIC8vIGh0dHAgcmVxdWVzdFxuICAgICAgICAgICAgbGV0IHBhdGggPSBuZXcgSnNvbmFwaS5QYXRoTWFrZXIoKTtcbiAgICAgICAgICAgIHBhdGguYWRkUGF0aCh0aGlzLmdldFBhdGgoKSk7XG4gICAgICAgICAgICBwYXRoLmFkZFBhdGgoaWQpO1xuXG4gICAgICAgICAgICBKc29uYXBpLkNvcmUuU2VydmljZXMuSnNvbmFwaUh0dHBcbiAgICAgICAgICAgIC5kZWxldGUocGF0aC5nZXQoKSlcbiAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGUgJiYgdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGVbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UoKS5jYWNoZVtpZF1bJ2lkJ10gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSgpLmNhY2hlW2lkXVsnYXR0cmlidXRlcyddID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmdldFNlcnZpY2UoKS5jYWNoZVtpZF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmNfc3VjY2VzcyhzdWNjZXNzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmNfZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgX3NhdmUocGFyYW1zOiBJUGFyYW1zLCBmY19zdWNjZXNzOiBGdW5jdGlvbiwgZmNfZXJyb3I6IEZ1bmN0aW9uKTogSVJlc291cmNlIHtcbiAgICAgICAgICAgIGxldCBvYmplY3QgPSB0aGlzLnRvT2JqZWN0KHBhcmFtcyk7XG5cbiAgICAgICAgICAgIC8vIGh0dHAgcmVxdWVzdFxuICAgICAgICAgICAgbGV0IHBhdGggPSBuZXcgSnNvbmFwaS5QYXRoTWFrZXIoKTtcbiAgICAgICAgICAgIHBhdGguYWRkUGF0aCh0aGlzLmdldFBhdGgoKSk7XG4gICAgICAgICAgICB0aGlzLmlkICYmIHBhdGguYWRkUGF0aCh0aGlzLmlkKTtcbiAgICAgICAgICAgIHBhcmFtcy5pbmNsdWRlID8gcGF0aC5zZXRJbmNsdWRlKHBhcmFtcy5pbmNsdWRlKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGxldCByZXNvdXJjZSA9IHRoaXMubmV3KCk7XG5cbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gSnNvbmFwaS5Db3JlLlNlcnZpY2VzLkpzb25hcGlIdHRwLmV4ZWMocGF0aC5nZXQoKSwgdGhpcy5pZCA/ICdQVVQnIDogJ1BPU1QnLCBvYmplY3QpO1xuXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oXG4gICAgICAgICAgICAgICAgc3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHN1Y2Nlc3MuZGF0YS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5hdHRyaWJ1dGVzID0gdmFsdWUuYXR0cmlidXRlcztcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuaWQgPSB2YWx1ZS5pZDtcblxuICAgICAgICAgICAgICAgICAgICBmY19zdWNjZXNzKHN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmY19lcnJvcignZGF0YScgaW4gZXJyb3IgPyBlcnJvci5kYXRhIDogZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBhZGRSZWxhdGlvbnNoaXA8VCBleHRlbmRzIEpzb25hcGkuSVJlc291cmNlPihyZXNvdXJjZTogVCwgdHlwZV9hbGlhcz86IHN0cmluZykge1xuICAgICAgICAgICAgbGV0IG9iamVjdF9rZXkgPSByZXNvdXJjZS5pZDtcbiAgICAgICAgICAgIGlmICghb2JqZWN0X2tleSkge1xuICAgICAgICAgICAgICAgIG9iamVjdF9rZXkgPSAnbmV3XycgKyAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHR5cGVfYWxpYXMgPSAodHlwZV9hbGlhcyA/IHR5cGVfYWxpYXMgOiByZXNvdXJjZS50eXBlKTtcbiAgICAgICAgICAgIGlmICghKHR5cGVfYWxpYXMgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXSA9IHsgZGF0YTogeyB9IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5yZWxhdGlvbnNoaXBzW3R5cGVfYWxpYXNdLmhhc01hbnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbdHlwZV9hbGlhc11bJ2RhdGEnXVtvYmplY3Rfa2V5XSA9IHJlc291cmNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbdHlwZV9hbGlhc11bJ2RhdGEnXSA9IHJlc291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGFkZFJlbGF0aW9uc2hpcHM8VCBleHRlbmRzIEpzb25hcGkuSVJlc291cmNlPihyZXNvdXJjZXM6IEFycmF5PFQ+LCB0eXBlX2FsaWFzOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICghKHR5cGVfYWxpYXMgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXSA9IHsgZGF0YTogeyB9IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXS5oYXNNYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdhZGRSZWxhdGlvbnNoaXBzIG5vdCBzdXBwb3J0ZWQgb24gJyArIHRoaXMudHlwZSArICcgc2NoZW1hLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocmVzb3VyY2VzLCAocmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbdHlwZV9hbGlhc11bJ2RhdGEnXVtyZXNvdXJjZS5pZF0gPSByZXNvdXJjZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHJlbW92ZVJlbGF0aW9uc2hpcCh0eXBlX2FsaWFzOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICAgIGlmICghKHR5cGVfYWxpYXMgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKCdkYXRhJyBpbiB0aGlzLnJlbGF0aW9uc2hpcHNbdHlwZV9hbGlhc10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoaWQgaW4gdGhpcy5yZWxhdGlvbnNoaXBzW3R5cGVfYWxpYXNdWydkYXRhJ10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXVsnZGF0YSddW2lkXTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpdmF0ZSBmaWxsQ2FjaGUocmVzb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAocmVzb3VyY2VzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxsQ2FjaGVSZXNvdXJjZShyZXNvdXJjZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UoKS5jYWNoZV92YXJzWydfX3BhdGgnXSA9IHRoaXMuZ2V0UGF0aCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsbENhY2hlUmVzb3VyY2VzKHJlc291cmNlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwcml2YXRlIGZpbGxDYWNoZVJlc291cmNlczxUIGV4dGVuZHMgSnNvbmFwaS5JUmVzb3VyY2U+KHJlc291cmNlczogQXJyYXk8VD4pIHtcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChyZXNvdXJjZXMsIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsbENhY2hlUmVzb3VyY2UocmVzb3VyY2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcml2YXRlIGZpbGxDYWNoZVJlc291cmNlPFQgZXh0ZW5kcyBKc29uYXBpLklSZXNvdXJjZT4ocmVzb3VyY2U6IFQpIHtcbiAgICAgICAgICAgIGlmIChyZXNvdXJjZS5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSgpLmNhY2hlW3Jlc291cmNlLmlkXSA9IHJlc291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgIEByZXR1cm4gVGhpcyByZXNvdXJjZSBsaWtlIGEgc2VydmljZVxuICAgICAgICAqKi9cbiAgICAgICAgcHVibGljIGdldFNlcnZpY2UoKTogYW55IHtcbiAgICAgICAgICAgIHJldHVybiBDb252ZXJ0ZXIuZ2V0U2VydmljZSh0aGlzLnR5cGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIEpzb25hcGk7XG4oZnVuY3Rpb24gKEpzb25hcGkpIHtcbiAgICB2YXIgUmVzb3VyY2UgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBSZXNvdXJjZSgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNfbmV3ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwcyA9IHt9OyAvL1tdO1xuICAgICAgICAgICAgdGhpcy5jYWNoZV92YXJzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNsb25lT2JqID0gbmV3IHRoaXMuY29uc3RydWN0b3IoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGF0dHJpYnV0IGluIHRoaXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbYXR0cmlidXRdICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBjbG9uZU9ialthdHRyaWJ1dF0gPSB0aGlzW2F0dHJpYnV0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVPYmo7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICBSZWdpc3RlciBzY2hlbWEgb24gSnNvbmFwaS5Db3JlXG4gICAgICAgIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgZG9uJ3QgZXhpc3QgYW5kIHJlZ2lzdGVyZWQgb2tcbiAgICAgICAgKiovXG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5yZWdpc3RlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChKc29uYXBpLkNvcmUuTWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnRXJyb3I6IHlvdSBhcmUgdHJ5aW5nIHJlZ2lzdGVyIC0tPiAnICsgdGhpcy50eXBlICsgJyA8LS0gYmVmb3JlIGluamVjdCBKc29uYXBpQ29yZSBzb21ld2hlcmUsIGFsbW9zdCBvbmUgdGltZS4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gb25seSB3aGVuIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZCwgbm90IGNsb25lZCBvYmplY3RcbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSB7fTtcbiAgICAgICAgICAgIHJldHVybiBKc29uYXBpLkNvcmUuTWUuX3JlZ2lzdGVyKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZ2V0UGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGggPyB0aGlzLnBhdGggOiB0aGlzLnR5cGU7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVtcHR5IHNlbGYgb2JqZWN0XG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5uZXcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgICAgICByZXNvdXJjZS5yZXNldCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlO1xuICAgICAgICB9O1xuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmlkID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwcyA9IHt9O1xuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRoaXMuc2NoZW1hLnJlbGF0aW9uc2hpcHMsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgc2VsZi5yZWxhdGlvbnNoaXBzW2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICBzZWxmLnJlbGF0aW9uc2hpcHNba2V5XVsnZGF0YSddID0ge307XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaXNfbmV3ID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHBhcmFtcyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBKc29uYXBpLkJhc2UuUGFyYW1zLCBwYXJhbXMpO1xuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBhbmd1bGFyLmV4dGVuZCh7fSwgSnNvbmFwaS5CYXNlLlNjaGVtYSwgdGhpcy5zY2hlbWEpO1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uc2hpcHMgPSB7fTtcbiAgICAgICAgICAgIHZhciBpbmNsdWRlZCA9IFtdO1xuICAgICAgICAgICAgdmFyIGluY2x1ZGVkX2lkcyA9IFtdOyAvL2p1c3QgZm9yIGNvbnRyb2wgZG9uJ3QgcmVwZWF0IGFueSByZXNvdXJjZVxuICAgICAgICAgICAgLy8gUkVBTFRJT05TSElQU1xuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRoaXMucmVsYXRpb25zaGlwcywgZnVuY3Rpb24gKHJlbGF0aW9uc2hpcCwgcmVsYXRpb25fYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25fYWxpYXNdICYmIF90aGlzLnNjaGVtYS5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uX2FsaWFzXS5oYXNNYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhcyBtYW55IChoYXNNYW55OnRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHNbcmVsYXRpb25fYWxpYXNdID0geyBkYXRhOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocmVsYXRpb25zaGlwLmRhdGEsIGZ1bmN0aW9uIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlYXRpb25hbF9vYmplY3QgPSB7IGlkOiByZXNvdXJjZS5pZCwgdHlwZTogcmVzb3VyY2UudHlwZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwc1tyZWxhdGlvbl9hbGlhc11bJ2RhdGEnXS5wdXNoKHJlYXRpb25hbF9vYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2UgYWdyZWfDsyBhw7puIGEgaW5jbHVkZWQgJiYgc2UgaGEgcGVkaWRvIGluY2x1aXIgY29uIGVsIHBhcm1zLmluY2x1ZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wb3JhbF9pZCA9IHJlc291cmNlLnR5cGUgKyAnXycgKyByZXNvdXJjZS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlZF9pZHMuaW5kZXhPZih0ZW1wb3JhbF9pZCkgPT09IC0xICYmIHBhcmFtcy5pbmNsdWRlLmluZGV4T2YocmVsYXRpb25fYWxpYXMpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkX2lkcy5wdXNoKHRlbXBvcmFsX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZC5wdXNoKHJlc291cmNlLnRvT2JqZWN0KHt9KS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBoYXMgb25lIChoYXNNYW55OmZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBpZiAoISgnaWQnIGluIHJlbGF0aW9uc2hpcC5kYXRhKSAmJiAhYW5ndWxhci5lcXVhbHMoe30sIHJlbGF0aW9uc2hpcC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKHJlbGF0aW9uX2FsaWFzICsgJyBkZWZpbmVkIHdpdGggaGFzTWFueTpmYWxzZSwgYnV0IEkgaGF2ZSBhIGNvbGxlY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwLmRhdGEuaWQgJiYgcmVsYXRpb25zaGlwLmRhdGEudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwc1tyZWxhdGlvbl9hbGlhc10gPSB7IGRhdGE6IHsgaWQ6IHJlbGF0aW9uc2hpcC5kYXRhLmlkLCB0eXBlOiByZWxhdGlvbnNoaXAuZGF0YS50eXBlIH0gfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHNbcmVsYXRpb25fYWxpYXNdID0geyBkYXRhOiB7fSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlIGFncmVnw7MgYcO6biBhIGluY2x1ZGVkICYmIHNlIGhhIHBlZGlkbyBpbmNsdWlyIGNvbiBlbCBwYXJtcy5pbmNsdWRlXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wb3JhbF9pZCA9IHJlbGF0aW9uc2hpcC5kYXRhLnR5cGUgKyAnXycgKyByZWxhdGlvbnNoaXAuZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkX2lkcy5pbmRleE9mKHRlbXBvcmFsX2lkKSA9PT0gLTEgJiYgcGFyYW1zLmluY2x1ZGUuaW5kZXhPZihyZWxhdGlvbnNoaXAuZGF0YS50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkX2lkcy5wdXNoKHRlbXBvcmFsX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkLnB1c2gocmVsYXRpb25zaGlwLmRhdGEudG9PYmplY3Qoe30pLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgcmV0ID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzOiByZWxhdGlvbnNoaXBzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpbmNsdWRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0LmluY2x1ZGVkID0gaW5jbHVkZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9O1xuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGlkLCBwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX2V4ZWMoaWQsIHBhcmFtcywgZmNfc3VjY2VzcywgZmNfZXJyb3IsICdnZXQnKTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChpZCwgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fX2V4ZWMoaWQsIHBhcmFtcywgZmNfc3VjY2VzcywgZmNfZXJyb3IsICdkZWxldGUnKTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmFsbCA9IGZ1bmN0aW9uIChwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX2V4ZWMobnVsbCwgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvciwgJ2FsbCcpO1xuICAgICAgICB9O1xuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZ2V0UmVsYXRpb25zaGlwcyA9IGZ1bmN0aW9uIChwYXJlbnRfcGF0aF9pZCwgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19leGVjKHBhcmVudF9wYXRoX2lkLCBwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yLCAnZ2V0UmVsYXRpb25zaGlwcycpO1xuICAgICAgICB9O1xuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX2V4ZWMobnVsbCwgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvciwgJ3NhdmUnKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoaXMgbWV0aG9kIHNvcnQgcGFyYW1zIGZvciBuZXcoKSwgZ2V0KCkgYW5kIHVwZGF0ZSgpXG4gICAgICAgICovXG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5fX2V4ZWMgPSBmdW5jdGlvbiAoaWQsIHBhcmFtcywgZmNfc3VjY2VzcywgZmNfZXJyb3IsIGV4ZWNfdHlwZSkge1xuICAgICAgICAgICAgLy8gbWFrZXMgYHBhcmFtc2Agb3B0aW9uYWxcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24ocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgIGZjX2Vycm9yID0gZmNfc3VjY2VzcztcbiAgICAgICAgICAgICAgICBmY19zdWNjZXNzID0gcGFyYW1zO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBKc29uYXBpLkJhc2UuUGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYW5ndWxhci5leHRlbmQoe30sIEpzb25hcGkuQmFzZS5QYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYW5ndWxhci5leHRlbmQoe30sIEpzb25hcGkuQmFzZS5QYXJhbXMsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmNfc3VjY2VzcyA9IGFuZ3VsYXIuaXNGdW5jdGlvbihmY19zdWNjZXNzKSA/IGZjX3N1Y2Nlc3MgOiBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICBmY19lcnJvciA9IGFuZ3VsYXIuaXNGdW5jdGlvbihmY19lcnJvcikgPyBmY19lcnJvciA6IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gYW5ndWxhci5leHRlbmQoe30sIEpzb25hcGkuQmFzZS5TY2hlbWEsIHRoaXMuc2NoZW1hKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZXhlY190eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZ2V0JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldChpZCwgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcik7XG4gICAgICAgICAgICAgICAgY2FzZSAnZ2V0UmVsYXRpb25zaGlwcyc6XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wYXRoID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbGwocGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcik7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGV0ZShpZCwgcGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcik7XG4gICAgICAgICAgICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FsbChwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yKTtcbiAgICAgICAgICAgICAgICBjYXNlICdzYXZlJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NhdmUocGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5fZ2V0ID0gZnVuY3Rpb24gKGlkLCBwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgLy8gaHR0cCByZXF1ZXN0XG4gICAgICAgICAgICB2YXIgcGF0aCA9IG5ldyBKc29uYXBpLlBhdGhNYWtlcigpO1xuICAgICAgICAgICAgcGF0aC5hZGRQYXRoKHRoaXMuZ2V0UGF0aCgpKTtcbiAgICAgICAgICAgIHBhdGguYWRkUGF0aChpZCk7XG4gICAgICAgICAgICBwYXJhbXMuaW5jbHVkZSA/IHBhdGguc2V0SW5jbHVkZShwYXJhbXMuaW5jbHVkZSkgOiBudWxsO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlID0gdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGUgJiYgdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGVbaWRdID8gdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGVbaWRdIDogdGhpcy5uZXcoKTtcbiAgICAgICAgICAgIEpzb25hcGkuQ29yZS5TZXJ2aWNlcy5Kc29uYXBpSHR0cFxuICAgICAgICAgICAgICAgIC5nZXQocGF0aC5nZXQoKSlcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIEpzb25hcGkuQ29udmVydGVyLmJ1aWxkKHN1Y2Nlc3MuZGF0YSwgcmVzb3VyY2UsIF90aGlzLnNjaGVtYSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZmlsbENhY2hlUmVzb3VyY2UocmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGZjX3N1Y2Nlc3Moc3VjY2Vzcyk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBmY19lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLl9hbGwgPSBmdW5jdGlvbiAocGFyYW1zLCBmY19zdWNjZXNzLCBmY19lcnJvcikge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIC8vIGh0dHAgcmVxdWVzdFxuICAgICAgICAgICAgdmFyIHBhdGggPSBuZXcgSnNvbmFwaS5QYXRoTWFrZXIoKTtcbiAgICAgICAgICAgIHBhdGguYWRkUGF0aCh0aGlzLmdldFBhdGgoKSk7XG4gICAgICAgICAgICBwYXJhbXMucGF0aCA/IHBhdGguYWRkUGF0aChwYXJhbXMucGF0aCkgOiBudWxsO1xuICAgICAgICAgICAgcGFyYW1zLmluY2x1ZGUgPyBwYXRoLnNldEluY2x1ZGUocGFyYW1zLmluY2x1ZGUpIDogbnVsbDtcbiAgICAgICAgICAgIC8vIG1ha2UgcmVxdWVzdFxuICAgICAgICAgICAgdmFyIHJlc291cmNlO1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSwge1xuICAgICAgICAgICAgICAgICckbGVuZ3RoJzoge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICckaXNsb2FkaW5nJzogeyB2YWx1ZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICckc291cmNlJzogeyB2YWx1ZTogJycsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIE1FTU9SWV9DQUNIRVxuICAgICAgICAgICAgLy8gKCFwYXJhbXMucGF0aCk6IGJlY291c2Ugd2UgbmVlZCByZWFsIHR5cGUsIG5vdCB0aGlzLmdldFNlcnZpY2UoKS5jYWNoZVxuICAgICAgICAgICAgaWYgKCFwYXJhbXMucGF0aCAmJiB0aGlzLmdldFNlcnZpY2UoKS5jYWNoZSAmJiB0aGlzLmdldFNlcnZpY2UoKS5jYWNoZV92YXJzWydfX3BhdGgnXSA9PT0gdGhpcy5nZXRQYXRoKCkpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYWtlXG4gICAgICAgICAgICAgICAgcmVzb3VyY2UuJHNvdXJjZSA9ICdjYWNoZSc7XG4gICAgICAgICAgICAgICAgdmFyIGZpbHRlcl8xID0gbmV3IEpzb25hcGkuRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRoaXMuZ2V0U2VydmljZSgpLmNhY2hlLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5maWx0ZXIgfHwgZmlsdGVyXzEucGFzc0ZpbHRlcih2YWx1ZSwgcGFyYW1zLmZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb3VyY2VbJyRpc2xvYWRpbmcnXSA9IHRydWU7XG4gICAgICAgICAgICBKc29uYXBpLkNvcmUuU2VydmljZXMuSnNvbmFwaUh0dHBcbiAgICAgICAgICAgICAgICAuZ2V0KHBhdGguZ2V0KCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICByZXNvdXJjZS4kc291cmNlID0gJ3NlcnZlcic7XG4gICAgICAgICAgICAgICAgcmVzb3VyY2UuJGlzbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIEpzb25hcGkuQ29udmVydGVyLmJ1aWxkKHN1Y2Nlc3MuZGF0YSwgcmVzb3VyY2UsIF90aGlzLnNjaGVtYSk7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAoIXBhcmFtcy5wYXRoKTogZmlsbCBjYWNoZSBuZWVkIHdvcmsgd2l0aCByZWxhdGlvbnNoaXBzIHRvbyxcbiAgICAgICAgICAgICAgICBmb3IgdGhlIG1vbW1lbnQgd2UncmUgY3JlYXRlZCB0aGlzIGlmXG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmZpbGxDYWNoZShyZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBnZXR0ZWQgZGF0YVxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJfMiA9IG5ldyBKc29uYXBpLkZpbHRlcigpO1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocmVzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcl8yLnBhc3NGaWx0ZXIodmFsdWUsIHBhcmFtcy5maWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc291cmNlW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmY19zdWNjZXNzKHN1Y2Nlc3MpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVzb3VyY2UuJHNvdXJjZSA9ICdzZXJ2ZXInO1xuICAgICAgICAgICAgICAgIHJlc291cmNlLiRpc2xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmY19lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLl9kZWxldGUgPSBmdW5jdGlvbiAoaWQsIHBhcmFtcywgZmNfc3VjY2VzcywgZmNfZXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBodHRwIHJlcXVlc3RcbiAgICAgICAgICAgIHZhciBwYXRoID0gbmV3IEpzb25hcGkuUGF0aE1ha2VyKCk7XG4gICAgICAgICAgICBwYXRoLmFkZFBhdGgodGhpcy5nZXRQYXRoKCkpO1xuICAgICAgICAgICAgcGF0aC5hZGRQYXRoKGlkKTtcbiAgICAgICAgICAgIEpzb25hcGkuQ29yZS5TZXJ2aWNlcy5Kc29uYXBpSHR0cFxuICAgICAgICAgICAgICAgIC5kZWxldGUocGF0aC5nZXQoKSlcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGUgJiYgX3RoaXMuZ2V0U2VydmljZSgpLmNhY2hlW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGVbaWRdWydpZCddID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmdldFNlcnZpY2UoKS5jYWNoZVtpZF1bJ2F0dHJpYnV0ZXMnXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5nZXRTZXJ2aWNlKCkuY2FjaGVbaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmY19zdWNjZXNzKHN1Y2Nlc3MpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZmNfZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5fc2F2ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGZjX3N1Y2Nlc3MsIGZjX2Vycm9yKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy50b09iamVjdChwYXJhbXMpO1xuICAgICAgICAgICAgLy8gaHR0cCByZXF1ZXN0XG4gICAgICAgICAgICB2YXIgcGF0aCA9IG5ldyBKc29uYXBpLlBhdGhNYWtlcigpO1xuICAgICAgICAgICAgcGF0aC5hZGRQYXRoKHRoaXMuZ2V0UGF0aCgpKTtcbiAgICAgICAgICAgIHRoaXMuaWQgJiYgcGF0aC5hZGRQYXRoKHRoaXMuaWQpO1xuICAgICAgICAgICAgcGFyYW1zLmluY2x1ZGUgPyBwYXRoLnNldEluY2x1ZGUocGFyYW1zLmluY2x1ZGUpIDogbnVsbDtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMubmV3KCk7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IEpzb25hcGkuQ29yZS5TZXJ2aWNlcy5Kc29uYXBpSHR0cC5leGVjKHBhdGguZ2V0KCksIHRoaXMuaWQgPyAnUFVUJyA6ICdQT1NUJywgb2JqZWN0KTtcbiAgICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHN1Y2Nlc3MuZGF0YS5kYXRhO1xuICAgICAgICAgICAgICAgIHJlc291cmNlLmF0dHJpYnV0ZXMgPSB2YWx1ZS5hdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICAgIHJlc291cmNlLmlkID0gdmFsdWUuaWQ7XG4gICAgICAgICAgICAgICAgZmNfc3VjY2VzcyhzdWNjZXNzKTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGZjX2Vycm9yKCdkYXRhJyBpbiBlcnJvciA/IGVycm9yLmRhdGEgOiBlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmFkZFJlbGF0aW9uc2hpcCA9IGZ1bmN0aW9uIChyZXNvdXJjZSwgdHlwZV9hbGlhcykge1xuICAgICAgICAgICAgdmFyIG9iamVjdF9rZXkgPSByZXNvdXJjZS5pZDtcbiAgICAgICAgICAgIGlmICghb2JqZWN0X2tleSkge1xuICAgICAgICAgICAgICAgIG9iamVjdF9rZXkgPSAnbmV3XycgKyAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0eXBlX2FsaWFzID0gKHR5cGVfYWxpYXMgPyB0eXBlX2FsaWFzIDogcmVzb3VyY2UudHlwZSk7XG4gICAgICAgICAgICBpZiAoISh0eXBlX2FsaWFzIGluIHRoaXMucmVsYXRpb25zaGlwcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbdHlwZV9hbGlhc10gPSB7IGRhdGE6IHt9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXS5oYXNNYW55KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3R5cGVfYWxpYXNdWydkYXRhJ11bb2JqZWN0X2tleV0gPSByZXNvdXJjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXVsnZGF0YSddID0gcmVzb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5hZGRSZWxhdGlvbnNoaXBzID0gZnVuY3Rpb24gKHJlc291cmNlcywgdHlwZV9hbGlhcykge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIGlmICghKHR5cGVfYWxpYXMgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXSA9IHsgZGF0YToge30gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXS5oYXNNYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdhZGRSZWxhdGlvbnNoaXBzIG5vdCBzdXBwb3J0ZWQgb24gJyArIHRoaXMudHlwZSArICcgc2NoZW1hLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHJlc291cmNlcywgZnVuY3Rpb24gKHJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXVsnZGF0YSddW3Jlc291cmNlLmlkXSA9IHJlc291cmNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5yZW1vdmVSZWxhdGlvbnNoaXAgPSBmdW5jdGlvbiAodHlwZV9hbGlhcywgaWQpIHtcbiAgICAgICAgICAgIGlmICghKHR5cGVfYWxpYXMgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKCdkYXRhJyBpbiB0aGlzLnJlbGF0aW9uc2hpcHNbdHlwZV9hbGlhc10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoaWQgaW4gdGhpcy5yZWxhdGlvbnNoaXBzW3R5cGVfYWxpYXNdWydkYXRhJ10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVsYXRpb25zaGlwc1t0eXBlX2FsaWFzXVsnZGF0YSddW2lkXTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZmlsbENhY2hlID0gZnVuY3Rpb24gKHJlc291cmNlcykge1xuICAgICAgICAgICAgaWYgKHJlc291cmNlcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsbENhY2hlUmVzb3VyY2UocmVzb3VyY2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSgpLmNhY2hlX3ZhcnNbJ19fcGF0aCddID0gdGhpcy5nZXRQYXRoKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxsQ2FjaGVSZXNvdXJjZXMocmVzb3VyY2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmZpbGxDYWNoZVJlc291cmNlcyA9IGZ1bmN0aW9uIChyZXNvdXJjZXMpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocmVzb3VyY2VzLCBmdW5jdGlvbiAocmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5maWxsQ2FjaGVSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmZpbGxDYWNoZVJlc291cmNlID0gZnVuY3Rpb24gKHJlc291cmNlKSB7XG4gICAgICAgICAgICBpZiAocmVzb3VyY2UuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UoKS5jYWNoZVtyZXNvdXJjZS5pZF0gPSByZXNvdXJjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgIEByZXR1cm4gVGhpcyByZXNvdXJjZSBsaWtlIGEgc2VydmljZVxuICAgICAgICAqKi9cbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmdldFNlcnZpY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gSnNvbmFwaS5Db252ZXJ0ZXIuZ2V0U2VydmljZSh0aGlzLnR5cGUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVzb3VyY2U7XG4gICAgfSgpKTtcbiAgICBKc29uYXBpLlJlc291cmNlID0gUmVzb3VyY2U7XG59KShKc29uYXBpIHx8IChKc29uYXBpID0ge30pKTtcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi90eXBpbmdzL2luZGV4LmQudHNcIiAvPlxuXG4vLyBKc29uYXBpIGludGVyZmFjZXMgcGFydCBvZiB0b3AgbGV2ZWxcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvZG9jdW1lbnQuZC50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvZGF0YS1jb2xsZWN0aW9uLmQudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbnRlcmZhY2VzL2RhdGEtb2JqZWN0LmQudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbnRlcmZhY2VzL2RhdGEtcmVzb3VyY2UuZC50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvcGFyYW1zLmQudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbnRlcmZhY2VzL2Vycm9ycy5kLnRzXCIvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW50ZXJmYWNlcy9saW5rcy5kLnRzXCIvPlxuXG4vLyBQYXJhbWV0ZXJzIGZvciBUUy1Kc29uYXBpIENsYXNzZXNcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvc2NoZW1hLmQudHNcIi8+XG5cbi8vIFRTLUpzb25hcGkgQ2xhc3NlcyBJbnRlcmZhY2VzXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbnRlcmZhY2VzL2NvcmUuZC50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvY29sbGVjdGlvbi5kLnRzXCIvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW50ZXJmYWNlcy9yZXNvdXJjZS5kLnRzXCIvPlxuXG4vLyBUUy1Kc29uYXBpIGNsYXNzZXNcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2FwcC5tb2R1bGUudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9zZXJ2aWNlcy9iYXNlLnRzXCIvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vc2VydmljZXMvaHR0cC5zZXJ2aWNlLnRzXCIvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vc2VydmljZXMvZmlsdGVyLnRzXCIvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vc2VydmljZXMvcGF0aC1tYWtlci50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL3NlcnZpY2VzL3Jlc291cmNlLWNvbnZlcnRlci50c1wiLz5cbi8vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9zZXJ2aWNlcy9jb3JlLXNlcnZpY2VzLnNlcnZpY2UudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9jb3JlLnRzXCIvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vcmVzb3VyY2UudHNcIi8+XG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy9pbmRleC5kLnRzXCIgLz5cbi8vIEpzb25hcGkgaW50ZXJmYWNlcyBwYXJ0IG9mIHRvcCBsZXZlbFxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW50ZXJmYWNlcy9kb2N1bWVudC5kLnRzXCIvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW50ZXJmYWNlcy9kYXRhLWNvbGxlY3Rpb24uZC50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvZGF0YS1vYmplY3QuZC50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvZGF0YS1yZXNvdXJjZS5kLnRzXCIvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW50ZXJmYWNlcy9wYXJhbXMuZC50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvZXJyb3JzLmQudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbnRlcmZhY2VzL2xpbmtzLmQudHNcIi8+XG4vLyBQYXJhbWV0ZXJzIGZvciBUUy1Kc29uYXBpIENsYXNzZXNcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvc2NoZW1hLmQudHNcIi8+XG4vLyBUUy1Kc29uYXBpIENsYXNzZXMgSW50ZXJmYWNlc1xuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW50ZXJmYWNlcy9jb3JlLmQudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbnRlcmZhY2VzL2NvbGxlY3Rpb24uZC50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2ludGVyZmFjZXMvcmVzb3VyY2UuZC50c1wiLz5cbi8vIFRTLUpzb25hcGkgY2xhc3Nlc1xuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vYXBwLm1vZHVsZS50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL3NlcnZpY2VzL2Jhc2UudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9zZXJ2aWNlcy9odHRwLnNlcnZpY2UudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9zZXJ2aWNlcy9maWx0ZXIudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9zZXJ2aWNlcy9wYXRoLW1ha2VyLnRzXCIvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vc2VydmljZXMvcmVzb3VyY2UtY29udmVydGVyLnRzXCIvPlxuLy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL3NlcnZpY2VzL2NvcmUtc2VydmljZXMuc2VydmljZS50c1wiLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2NvcmUudHNcIi8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9yZXNvdXJjZS50c1wiLz5cbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9fYWxsLnRzXCIgLz5cblxubW9kdWxlIEpzb25hcGkge1xuICAgIGV4cG9ydCBjbGFzcyBDb3JlU2VydmljZXMge1xuXG4gICAgICAgIC8qKiBAbmdJbmplY3QgKi9cbiAgICAgICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgcHJvdGVjdGVkIEpzb25hcGlIdHRwXG4gICAgICAgICkge1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhbmd1bGFyLm1vZHVsZSgnSnNvbmFwaS5zZXJ2aWNlcycpLnNlcnZpY2UoJ0pzb25hcGlDb3JlU2VydmljZXMnLCBDb3JlU2VydmljZXMpO1xufVxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL19hbGwudHNcIiAvPlxudmFyIEpzb25hcGk7XG4oZnVuY3Rpb24gKEpzb25hcGkpIHtcbiAgICB2YXIgQ29yZVNlcnZpY2VzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqIEBuZ0luamVjdCAqL1xuICAgICAgICBmdW5jdGlvbiBDb3JlU2VydmljZXMoSnNvbmFwaUh0dHApIHtcbiAgICAgICAgICAgIHRoaXMuSnNvbmFwaUh0dHAgPSBKc29uYXBpSHR0cDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ29yZVNlcnZpY2VzO1xuICAgIH0oKSk7XG4gICAgSnNvbmFwaS5Db3JlU2VydmljZXMgPSBDb3JlU2VydmljZXM7XG4gICAgYW5ndWxhci5tb2R1bGUoJ0pzb25hcGkuc2VydmljZXMnKS5zZXJ2aWNlKCdKc29uYXBpQ29yZVNlcnZpY2VzJywgQ29yZVNlcnZpY2VzKTtcbn0pKEpzb25hcGkgfHwgKEpzb25hcGkgPSB7fSkpO1xuIiwibW9kdWxlIEpzb25hcGkge1xuICAgIGV4cG9ydCBjbGFzcyBKc29uYXBpUGFyc2VyIHtcblxuICAgICAgICAvKiogQG5nSW5qZWN0ICovXG4gICAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcblxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHRvT2JqZWN0KGpzb25fc3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBqc29uX3N0cmluZztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsInZhciBKc29uYXBpO1xuKGZ1bmN0aW9uIChKc29uYXBpKSB7XG4gICAgdmFyIEpzb25hcGlQYXJzZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiogQG5nSW5qZWN0ICovXG4gICAgICAgIGZ1bmN0aW9uIEpzb25hcGlQYXJzZXIoKSB7XG4gICAgICAgIH1cbiAgICAgICAgSnNvbmFwaVBhcnNlci5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbiAoanNvbl9zdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBqc29uX3N0cmluZztcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEpzb25hcGlQYXJzZXI7XG4gICAgfSgpKTtcbiAgICBKc29uYXBpLkpzb25hcGlQYXJzZXIgPSBKc29uYXBpUGFyc2VyO1xufSkoSnNvbmFwaSB8fCAoSnNvbmFwaSA9IHt9KSk7XG4iLCJtb2R1bGUgSnNvbmFwaSB7XG4gICAgZXhwb3J0IGNsYXNzIEpzb25hcGlTdG9yYWdlIHtcblxuICAgICAgICAvKiogQG5nSW5qZWN0ICovXG4gICAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgICAgIC8vIHByb3RlY3RlZCBzdG9yZSxcbiAgICAgICAgICAgIC8vIHByb3RlY3RlZCBSZWFsSnNvbmFwaVxuICAgICAgICApIHtcblxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGdldChrZXkpIHtcbiAgICAgICAgICAgIC8qIGxldCBkYXRhID0gdGhpcy5zdG9yZS5nZXQoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiBhbmd1bGFyLmZyb21Kc29uKGRhdGEpOyovXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2Uoa2V5LCBkYXRhKSB7XG4gICAgICAgICAgICAvKiBsZXQgYWN0dWFsX2RhdGEgPSB0aGlzLmdldChrZXkpO1xuICAgICAgICAgICAgbGV0IGFjdHVhbF9pbmZvID0gYW5ndWxhci5mcm9tSnNvbihhY3R1YWxfZGF0YSk7ICovXG5cblxuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIEpzb25hcGk7XG4oZnVuY3Rpb24gKEpzb25hcGkpIHtcbiAgICB2YXIgSnNvbmFwaVN0b3JhZ2UgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiogQG5nSW5qZWN0ICovXG4gICAgICAgIGZ1bmN0aW9uIEpzb25hcGlTdG9yYWdlKCkge1xuICAgICAgICB9XG4gICAgICAgIEpzb25hcGlTdG9yYWdlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAvKiBsZXQgZGF0YSA9IHRoaXMuc3RvcmUuZ2V0KGtleSk7XG4gICAgICAgICAgICByZXR1cm4gYW5ndWxhci5mcm9tSnNvbihkYXRhKTsqL1xuICAgICAgICB9O1xuICAgICAgICBKc29uYXBpU3RvcmFnZS5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbiAoa2V5LCBkYXRhKSB7XG4gICAgICAgICAgICAvKiBsZXQgYWN0dWFsX2RhdGEgPSB0aGlzLmdldChrZXkpO1xuICAgICAgICAgICAgbGV0IGFjdHVhbF9pbmZvID0gYW5ndWxhci5mcm9tSnNvbihhY3R1YWxfZGF0YSk7ICovXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBKc29uYXBpU3RvcmFnZTtcbiAgICB9KCkpO1xuICAgIEpzb25hcGkuSnNvbmFwaVN0b3JhZ2UgPSBKc29uYXBpU3RvcmFnZTtcbn0pKEpzb25hcGkgfHwgKEpzb25hcGkgPSB7fSkpO1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9 diff --git a/dist/tsd.d.ts b/dist/tsd.d.ts index 6733499..ad88c7c 100644 --- a/dist/tsd.d.ts +++ b/dist/tsd.d.ts @@ -129,7 +129,7 @@ declare module Jsonapi { } } -/// + declare module Jsonapi { class Base { @@ -141,7 +141,7 @@ declare module Jsonapi { } } -/// + declare module Jsonapi { class Http { protected $http: any; @@ -193,7 +193,7 @@ declare module Jsonapi { } } -/// + declare module Jsonapi { class Core implements Jsonapi.ICore { protected rsJsonapiConfig: any; @@ -262,27 +262,27 @@ declare module Jsonapi { } } -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// + + + + + + + + + + + + + + + + + + + + + declare module Jsonapi { class CoreServices { protected JsonapiHttp: any; diff --git a/gulpfile.js b/gulpfile.js index 999f854..938e2ec 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -77,6 +77,7 @@ gulp.task('lib', function() { }); var merge = require('merge-stream'); +var stripLine = require('gulp-strip-line'); gulp.task('dist', function() { // get ts interfaces @@ -92,22 +93,20 @@ gulp.task('dist', function() { })); var content1 = tsResult.dts; - // get ts definitions - var content2 = gulp.src(['src/library/**/*.d.ts']) - .pipe(sourcemaps.init()) // This means sourcemaps will be generated - .pipe(concat('ts-angular-jsonapi.d.ts')) // You can use other plugins that also support gulp-sourcemaps - .pipe(sourcemaps.write()) // Now the sourcemaps are added to the .js file - ; + // // get ts definitions + var content2 = gulp.src(['src/library/**/*.d.ts']); // put all ts information var final_content = merge(content1, content2); final_content .pipe(concat('tsd.d.ts')) + // remove lines with triple-slash references + // ref: https://www.typescriptlang.org/docs/handbook/typings-for-npm-packages.html + .pipe(stripLine([/^\/\/\//, 'use strict'])) .pipe(gulp.dest('dist')) // get all ts information for compression var tsResult = gulp.src(['src/library/**/*.ts', 'src/*.ts']) - .pipe(sourcemaps.init()) // This means sourcemaps will be generated .pipe(ts({ sortOutput: true, })); diff --git a/index.js b/index.js new file mode 100644 index 0000000..d0e80f4 --- /dev/null +++ b/index.js @@ -0,0 +1,8 @@ +// Should already be required, here for clarity +require('angular'); + +// Now load Ts Angular Jsonapi +require('./dist/ts-angular-jsonapi.js'); + +// Export namespace +module.exports = 'ts-angular-jsonapi'; diff --git a/package.json b/package.json index 4ebafc8..e0aa080 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,18 @@ { "name": "ts-angular-jsonapi", - "version": "0.0.3", - "description": "ts-angular-jsonapi", - "contributors": [ - { - "name": "Pablo Reyes", - "email": "pablo@reyesoft.com" - } - ], + "version": "0.0.7", + "description": "JSONAPI library developed for AngularJS in Typescript", "repository": { "type": "git", - "url": "https://github.com/DanWahlin/AngularIn20TypeScript" + "url": "https://github.com/reyesoft/ts-angular-jsonapi" }, "bugs": { "url": "https://github.com/reyesoft/ts-angular-jsonapi/issues" }, - "main": "dist/ts-angular-jsonapi.js", + "main": "index.js", + "typings": "./dist/tsd.d.ts", "files": [ - "dist/ts-angular-jsonapi.js", + "index.js", "dist/**", "LICENSE", "README.md", @@ -30,6 +25,7 @@ }, "keywords": [ "angularjs", + "jsonapi", "typescript" ], "license": "ISC", @@ -43,6 +39,7 @@ "gulp-inject": "^4.0.0", "gulp-ng-annotate": "^2.0.0", "gulp-sourcemaps": "^1.6.0", + "gulp-strip-line": "0.0.1", "gulp-tslint": "^5.0.0", "gulp-typescript": "^2.13.0", "gulp-uglify": "^1.5.3",