velocious 1.0.358 → 1.0.359

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -422,6 +422,7 @@ export default class VelociousHttpServerClientWebsocketSession {
422
422
  const request = new WebsocketRequest({
423
423
  body,
424
424
  headers,
425
+ metadata: this.getMetadata(),
425
426
  method,
426
427
  path,
427
428
  remoteAddress: this.client.remoteAddress
@@ -1473,4 +1474,4 @@ export default class VelociousHttpServerClientWebsocketSession {
1473
1474
  }
1474
1475
  }
1475
1476
  }
1476
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxnQkFBZ0IsTUFBTSx5QkFBeUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsc0NBQXNDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV0RixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyx3RUFBd0U7QUFDeEUsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFFdkMsbUVBQW1FO0FBQ25FLE1BQU0sc0NBQXNDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7QUFFL0QsNkRBQTZEO0FBQzdELE1BQU0sMENBQTBDLEdBQUcsSUFBSSxDQUFBO0FBRXZEOztHQUVHO0FBRUg7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPO0lBQy9CLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXO1FBQ2pDLENBQUMsQ0FBQyx1R0FBdUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNuSCxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ1YsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsY0FBYyxDQUFDLE9BQU87SUFDN0IsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTNELE9BQU8sMklBQTJJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUM5SixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ3hCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ3hDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUVoRSxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8seUNBQXlDO0lBQzVELE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO0lBQzNCLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3pCLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3BCLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDaEMsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNoQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUMxQixtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQy9CLHdDQUF3QztJQUN4QyxZQUFZLEdBQUcsRUFBRSxDQUFBO0lBRWpCOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFDO1FBQ3hGLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQTtRQUNwQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQTtRQUNwQyxJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUE7UUFDbEQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQzNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFOUIsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO1FBRW5COzs7OztXQUtHO1FBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUE7UUFFZCx3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTdCLDBHQUEwRztRQUMxRyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUV0Qzs7Ozs7O1dBTUc7UUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsRUFBRSxDQUFBO1FBRTdCLGtGQUFrRjtRQUNsRixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtRQUVwQix1RUFBdUU7UUFDdkUsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUE7UUFFeEIsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO1FBRWxCOzs7Ozs7O1dBT0c7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUV0Qzs7Ozs7O1dBTUc7UUFDSCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFBO1FBRXZDOzs7OztXQUtHO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQTtRQUUvQjs7Ozs7V0FLRztRQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7UUFFN0I7Ozs7O1dBS0c7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHNCQUFzQjtRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ1osSUFBSSxFQUFFLHFCQUFxQjtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsK0JBQStCLEVBQUUsRUFBRSxJQUFJLEdBQUc7U0FDNUUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxpQkFBaUIsQ0FBQyxZQUFZO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFFRCxrRkFBa0Y7SUFDbEYsV0FBVztRQUNULE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQTtJQUM1QixDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDckIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWUsQ0FBQyxPQUFPO1FBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRCxPQUFPO1FBQ0wsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUE7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWUsQ0FBQyxPQUFPO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxJQUFJO1FBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2hELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtJQUN2QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUU7UUFDNUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM5RCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksZUFBZSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUMvRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRXpELElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRCxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtZQUMzQixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCO1lBQUUsT0FBTTtRQUVqRSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBRS9DLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUN4RCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRTt3QkFDckMsTUFBTSxPQUFPLENBQUMsaUJBQWlCLENBQUM7NEJBQzlCLE9BQU87NEJBQ1AsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTOzRCQUM1QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87NEJBQ3hCLE9BQU87NEJBQ1AsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFROzRCQUMxQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7eUJBQzNCLENBQUMsQ0FBQTtvQkFDSixDQUFDLENBQUMsQ0FBQTtnQkFDSixDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDSCxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixPQUFPO1lBQ1AsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixPQUFPO1lBQ1AsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFBO1lBRTFDLElBQUksSUFBSSxDQUFDLGNBQWM7Z0JBQUUsT0FBTTtRQUNqQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtZQUNuQyxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFBO1FBRW5FLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTTtRQUVyQixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDNUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pFLE9BQU8sTUFBTSxRQUFRLENBQUM7b0JBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO29CQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWM7b0JBQzVCLGdCQUFnQixFQUFFLElBQUk7aUJBQ3ZCLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsT0FBTTtZQUVyQixNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsS0FBSyxVQUFVO2dCQUM1QyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUMsQ0FBQztnQkFDOUgsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtZQUVaLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUE7WUFDNUUsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUM5QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxNQUFNO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsR0FBRyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBRWpGLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPO1FBQzFCLGdFQUFnRTtRQUNoRSw2REFBNkQ7UUFDN0QscURBQXFEO1FBQ3JELG1EQUFtRDtRQUNuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFBO1FBQ25DLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFFaEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sSUFBSSxDQUFBO0lBQ1osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFBO1FBRWhFLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7WUFDNUQsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPO1FBQy9CLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDL0IsT0FBTTtRQUNSLENBQUM7UUFFRCxrRUFBa0U7UUFDbEUsaUVBQWlFO1FBQ2pFLGlFQUFpRTtRQUNqRSxpRUFBaUU7UUFDakUsd0RBQXdEO1FBQ3hELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQy9FLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzdDLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUVsRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFDLEdBQUcsZ0JBQWdCLENBQUE7WUFFdkQsSUFBSSxDQUFDLE9BQU87Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1lBQ2xFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFBO1lBRW5FLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFDdkUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFDbEYsQ0FBQztZQUVELE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sZUFBZSxHQUFHLDJDQUEyQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFN0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxJQUFJLE9BQU8sZUFBZSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUVsSCxLQUFLLE1BQU0sRUFBQyxZQUFZLEVBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDakUsSUFBSSxPQUFPLFlBQVksQ0FBQyxpQkFBaUIsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDekQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUU7d0JBQ3JDLE1BQU0sWUFBWSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtvQkFDdEQsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3hDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDekMsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM1QyxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzFDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLG1CQUFtQixFQUFFLENBQUM7WUFDekMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDM0MsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM3QyxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxLQUFLLEVBQUUseUJBQXlCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtZQUM5RSxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUU5QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUssRUFBRSx5QkFBeUIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1lBQzlFLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsR0FBRyxjQUFjLENBQUE7UUFFeEQsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDbEQsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFFOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztZQUNuQyxJQUFJO1lBQ0osT0FBTztZQUNQLE1BQU07WUFDTixJQUFJO1lBQ0osYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYTtTQUN6QyxDQUFDLENBQUE7UUFDRixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBQztZQUN0QyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsT0FBTztTQUNSLENBQUMsQ0FBQTtRQUVGLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDbkMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQTtZQUN2QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUE7WUFDL0IsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQTtZQUVoQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLElBQUk7Z0JBQ0osT0FBTztnQkFDUCxFQUFFO2dCQUNGLFVBQVUsRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUNwQyxhQUFhLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixFQUFFO2dCQUMxQyxJQUFJLEVBQUUsVUFBVTthQUNqQixDQUFDLENBQUE7WUFDRixLQUFLLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUM1RCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2pDLE1BQU0sT0FBTyxHQUFHLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLEtBQUsscUJBQXFCLENBQUE7WUFDN0UsTUFBTSxNQUFNLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQTtZQUMvQixNQUFNLFFBQVEsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUE7WUFDN0MsSUFBSSxhQUFhLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQTtZQUNyQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUE7WUFFZCxJQUFJLGFBQWEsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQztvQkFBRSxPQUFNO2dCQUMzQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ2hELE1BQU0sSUFBSSxDQUFDLENBQUE7WUFDYixDQUFDO2lCQUFNLElBQUksYUFBYSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDO29CQUFFLE9BQU07Z0JBQzNDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUVyRCxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUNqQyxNQUFNLElBQUksQ0FBQyxDQUFBO1lBQ2IsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFFbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsVUFBVSxHQUFHLGFBQWE7Z0JBQUUsT0FBTTtZQUVwRSxxQkFBcUI7WUFDckIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsRUFBRSxNQUFNLEdBQUcsVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFBO1lBRXpGLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQTtnQkFDM0QsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQzlDLENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUE7WUFFcEUsNERBQTREO1lBQzVELDZEQUE2RDtZQUM3RCwyREFBMkQ7WUFDM0QsZUFBZTtZQUNmLElBQUksTUFBTSxLQUFLLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQTtnQkFDdEQsU0FBUTtZQUNWLENBQUM7WUFFRCxJQUFJLE1BQU0sS0FBSyxzQkFBc0IsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDN0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO2dCQUNuQixTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtnQkFDbkUsU0FBUTtZQUNWLENBQUM7WUFFRCw4REFBOEQ7WUFDOUQsOERBQThEO1lBQzlELDREQUE0RDtZQUM1RCwwREFBMEQ7WUFDMUQsc0RBQXNEO1lBQ3RELDhEQUE4RDtZQUM5RCxlQUFlO1lBQ2YsSUFBSSxNQUFNLEtBQUssNkJBQTZCLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDLENBQUE7b0JBQ3RGLFNBQVE7Z0JBQ1YsQ0FBQztnQkFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7b0JBQUUsT0FBTTtnQkFFMUMsSUFBSSxDQUFDLE9BQU87b0JBQUUsU0FBUTtZQUN4QixDQUFDO2lCQUFNLElBQUksTUFBTSxLQUFLLHFCQUFxQixJQUFJLE1BQU0sS0FBSyx1QkFBdUIsRUFBRSxDQUFDO2dCQUNsRixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0dBQWdHLENBQUMsQ0FBQTtvQkFDbEgsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7Z0JBQzdCLENBQUM7Z0JBRUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNiLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFBO29CQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQTtvQkFFdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTt3QkFBRSxPQUFNO29CQUUxQyxTQUFRO2dCQUNWLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLE1BQU0sRUFBRSxDQUFDLENBQUE7Z0JBQ2hFLFNBQVE7WUFDVixDQUFDO1lBRUQscUJBQXFCO1lBQ3JCLElBQUksWUFBWSxDQUFBO1lBQ2hCLHFCQUFxQjtZQUNyQixJQUFJLFdBQVcsQ0FBQTtZQUVmLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN0QyxJQUFJLE1BQU0sS0FBSyw2QkFBNkIsRUFBRSxDQUFDO29CQUM3QyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtvQkFDdEQsV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxxQkFBcUIsQ0FBQTtnQkFDL0QsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFlBQVksR0FBRyxPQUFPLENBQUE7b0JBQ3RCLFdBQVcsR0FBRyxNQUFNLENBQUE7Z0JBQ3RCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7WUFDN0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksR0FBRyxPQUFPLENBQUE7Z0JBQ3RCLFdBQVcsR0FBRyxNQUFNLENBQUE7WUFDdEIsQ0FBQztZQUVELElBQUksV0FBVyxLQUFLLHFCQUFxQixFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxXQUFXLEVBQUUsQ0FBQyxDQUFBO2dCQUN0RixTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtnQkFFMUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO29CQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7Z0JBQ3RELENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO2dCQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSyxFQUFFLDJCQUEyQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1lBQ3BFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxlQUFlLENBQUMsT0FBTztRQUNyQixpRUFBaUU7UUFDakUsNkRBQTZEO1FBQzdELHNCQUFzQjtRQUN0QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFBO1FBRXZDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxzQkFBc0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRWxELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUE7UUFDckQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLHNDQUFzQyxDQUFBO1FBQ2hGLE1BQU0sYUFBYSxHQUFHLGFBQWEsR0FBRywwQ0FBMEMsQ0FBQTtRQUVoRixJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRTdDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLGdFQUFnRTtZQUNoRTtnQkFDRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtnQkFDcEMsYUFBYTtnQkFDYixRQUFRLEVBQUUsc0NBQXNDO2dCQUNoRCxZQUFZLEVBQUUsMENBQTBDO2FBQ3pEO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzdCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUVuQixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUE7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE9BQU87UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLEdBQUcsTUFBTSxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFBO1FBRTFCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxJQUFJO1FBQ1gsMERBQTBEO1FBQzFELDhEQUE4RDtRQUM5RCwwREFBMEQ7UUFDMUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGNBQWMsS0FBSyxFQUFFLENBQUE7WUFFMUIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSwwQkFBMEIsRUFBRSxDQUFDO2dCQUM3RCwwREFBMEQ7Z0JBQzFELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDN0IsQ0FBQztZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzlCLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTTtZQUFFLE9BQU07UUFFaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMxQyxJQUFJLE1BQU0sQ0FBQTtRQUVWLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUN6QixNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQTtRQUM1QixDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ2xDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUE7WUFDZixNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFBO1lBQ2YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDcEQsQ0FBQztRQUVELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQTtRQUV6RCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxtQkFBbUI7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUE7UUFFdkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUE7UUFFeEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBQyxXQUFXLEdBQUcsSUFBSSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFDLEdBQUcsRUFBRTtRQUNuSCxNQUFNLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUUvRixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUNqRCxPQUFPO1lBQ1AsV0FBVztZQUNYLG1CQUFtQixFQUFFLG1CQUFtQixJQUFJLE9BQU87WUFDbkQsa0JBQWtCLEVBQUUsTUFBTTtTQUMzQixDQUFDLENBQUE7UUFFRixJQUFJLFdBQVcsS0FBSyxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFDdkMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUNwRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUU3QixJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQTtZQUNuRCxDQUFDO1lBRUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUE7WUFFM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBQzFELENBQUM7WUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM3RCxDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtZQUN6RCxDQUFDO29CQUFTLENBQUM7Z0JBQ1QsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ3JELENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO1FBQzlDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxZQUFZO1FBQ1YseURBQXlEO1FBQ3pELDREQUE0RDtRQUM1RCxpRUFBaUU7UUFDakUsOERBQThEO1FBQzlELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBRTNGLElBQUksaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUE7WUFDbEIsK0RBQStEO1lBQy9ELG9EQUFvRDtZQUNwRCxnRUFBZ0U7WUFDaEUsOERBQThEO1lBQzlELGVBQWU7WUFDZixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7WUFDM0QsS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtZQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFBO1lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3pCLE9BQU07UUFDUixDQUFDO1FBRUQsS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUNuQyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzVCLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFDbkQsS0FBSyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQTtRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMzQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsb0JBQW9CO1FBQ2xCLEtBQUssSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFDbkMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUM1QixLQUFLLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUMvQyxLQUFLLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFBO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQjtRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG1DQUFtQyxFQUFFLEVBQUUsQ0FBQTtRQUUzRSxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVU7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUVwRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzdCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxxREFBcUQsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ3ZGLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sVUFBVSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUE7WUFDbkMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQywyQkFBMkIsVUFBVSxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDeEYsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLE1BQU0sRUFBQyxZQUFZLEVBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxZQUFZLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQTtZQUNyQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QyxZQUFZLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUN4RyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxhQUFhO1FBQ2pCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQztnQkFDSCxNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFBO1lBQy9CLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsdUJBQXVCLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ3BGLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxNQUFNLEVBQUMsWUFBWSxFQUFDLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDO2dCQUNILE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUE7WUFDakMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxtQ0FBbUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDcEcsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBTztRQUNoQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFBO1FBRXpDLElBQUksT0FBTyxlQUFlLEtBQUssUUFBUSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO1lBQ3JDLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUU5RSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUE7WUFDckMsT0FBTTtRQUNSLENBQUM7UUFFRCxrRUFBa0U7UUFDbEUsK0RBQStEO1FBQy9ELDREQUE0RDtRQUM1RCxnREFBZ0Q7UUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsRUFBRSxFQUFFLENBQUE7UUFFM0UsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLGNBQWMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQTtZQUMxRCxJQUFJLGFBQWEsQ0FBQTtZQUVqQixJQUFJLENBQUM7Z0JBQ0gsYUFBYSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3RDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsc0RBQXNELEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQkFDeEYsYUFBYSxHQUFHLFNBQVMsQ0FBQTtZQUMzQixDQUFDO1lBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxlQUFlLENBQUMsQ0FBQTtnQkFDaEUsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUE7Z0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQTtnQkFDckMsT0FBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUVoRSxnRUFBZ0U7UUFDaEUsaURBQWlEO1FBQ2pELEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0QsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7WUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ2pELENBQUM7UUFFRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDMUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1lBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzlDLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFDLENBQUE7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFBO1FBRWhDLDZEQUE2RDtRQUM3RCwrREFBK0Q7UUFDL0QsZ0NBQWdDO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFBO1FBRTFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFBO1FBQzFCLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDM0IsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO1FBRXRCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBQyxDQUFDLENBQUE7UUFDcEUsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUM1QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNO1FBQy9CLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFFbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUV6QixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1lBRXpCLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDckMsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUNsQyxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsa0NBQWtDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQy9GLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQU87UUFDakMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQTtRQUN6QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFBO1FBQzdDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFBO1FBRW5DLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLHVDQUF1QyxFQUFDLENBQUMsQ0FBQTtZQUM5RSxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLDRCQUE0QixFQUFDLENBQUMsQ0FBQTtZQUM5RixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsOEJBQThCLEVBQUMsQ0FBQyxDQUFBO1lBQ2hHLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRXhGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsNEJBQTRCLGNBQWMsRUFBRSxFQUFDLENBQUMsQ0FBQTtZQUM5RyxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxDQUFDLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUU3RSxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDckMsTUFBTSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDOUIsQ0FBQyxDQUFDLENBQUE7WUFDRixpRUFBaUU7WUFDakUsNkRBQTZEO1lBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQTtZQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBQyxDQUFDLENBQUE7UUFDMUQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDZCQUE2QixjQUFjLElBQUksWUFBWSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUMvRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLElBQUksMkJBQTJCLEVBQUMsQ0FBQyxDQUFBO1FBQ3ZJLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQUMsT0FBTztRQUNwQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFBO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUVoRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFDLENBQUMsQ0FBQTtZQUN6RixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNyQyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzFDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDJDQUEyQyxZQUFZLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQzNGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sSUFBSSwwQkFBMEIsRUFBQyxDQUFDLENBQUE7UUFDdEksQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsc0JBQXNCLENBQUMsT0FBTztRQUNsQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFBO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUVoRyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU07UUFFdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDdEMsNERBQTREO1FBQzVELG9FQUFvRTtRQUNwRSxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUV6QixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDckMsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQzFDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGtDQUFrQyxZQUFZLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3BGLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQTtJQUNsRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPO1FBQ25DLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUE7UUFDN0MsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQTtRQUN2QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQTtRQUNuQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFBO1FBRXZDLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLDJDQUEyQyxFQUFDLENBQUMsQ0FBQTtZQUNsRixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsRUFBQyxDQUFDLENBQUE7WUFDMUYsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLGdDQUFnQyxFQUFDLENBQUMsQ0FBQTtZQUNqRyxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUUvRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsV0FBVyxFQUFFLEVBQUMsQ0FBQyxDQUFBO1lBQ3ZHLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBRTlFLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUV4RSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDeEQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFBO2dCQUVuQixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDckMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO2dCQUN0RCxDQUFDLENBQUMsQ0FBQTtnQkFFRixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSw2QkFBNkIsRUFBQyxDQUFDLENBQUE7b0JBQzlGLE9BQU07Z0JBQ1IsQ0FBQztnQkFFRCxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO2dCQUMzRSxJQUFJLENBQUMsYUFBYSxDQUFDLHFDQUFxQyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQTtnQkFFbkYsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO2dCQUV4RSw0REFBNEQ7Z0JBQzVELDBEQUEwRDtnQkFDMUQsc0NBQXNDO2dCQUN0QyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM5RCxNQUFNLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtnQkFDMUYsQ0FBQztnQkFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUE7WUFDN0QsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDakQsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1Q0FBdUMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUE7WUFDckYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQywrQkFBK0IsV0FBVyxJQUFJLGNBQWMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDaEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sSUFBSSxxQkFBcUIsRUFBQyxDQUFDLENBQUE7UUFDaEksQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUM7UUFDaEYsTUFBTSxLQUFLLEdBQUcsc0NBQXNDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXhFLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBRWpELE1BQU0sVUFBVSxHQUFHLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUE7UUFFcEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osSUFBSSxFQUFFLG9CQUFvQjtnQkFDMUIsY0FBYyxFQUFFLFlBQVksQ0FBQyxjQUFjO2dCQUMzQyxXQUFXO2FBQ1osQ0FBQyxDQUFBO1lBQ0YsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFdkQsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLElBQUksVUFBVSxDQUFDLFFBQVE7WUFBRSxPQUFNO1FBRXRELE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUN4QyxPQUFPLEVBQUUsV0FBVztZQUNwQixRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsWUFBWSxFQUFFLE9BQU87U0FDdEIsQ0FBQyxDQUFBO1FBRUYsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQUUsTUFBSztZQUVsQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUE7UUFFN0MsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRO1lBQUUsT0FBTTtRQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRTVELElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTTtRQUVsQixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsdUNBQXVDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDakcsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBRWpDLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUE7UUFDbEYsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQyxLQUFLLENBQUMsV0FBVyxJQUFJLGNBQWMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDMUcsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyw2QkFBNkI7UUFDakMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBRXhELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUVsQyxLQUFLLE1BQU0sRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1Q0FBdUMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUE7WUFDckYsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7WUFFM0IsSUFBSSxDQUFDO2dCQUNILE1BQU0sWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFBO1lBQ25DLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsa0NBQWtDLFdBQVcsSUFBSSxZQUFZLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUNsSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzVDLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLE9BQU87UUFDbEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFL0MsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO29CQUNyQyxNQUFNLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFBO2dCQUNqQyxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDMUUsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFNUQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU0sbUJBQW1CLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBRW5FLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbkUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2dCQUN2RCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNO1FBQ3BDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTTtRQUVwQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDeEMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDeEQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3JDLE1BQU0sT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUE7WUFDL0IsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUTtRQUM3QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDcEQsTUFBTSxRQUFRLEVBQUUsQ0FBQTtRQUNsQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBQztRQUM3RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsQ0FBQTtRQUVuRSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU07UUFFckIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFDM0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pFLE9BQU8sTUFBTSxRQUFRLENBQUM7b0JBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO29CQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWM7b0JBQzVCLFlBQVksRUFBRSxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUM7b0JBQy9CLGdCQUFnQixFQUFFLElBQUk7aUJBQ3ZCLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO2dCQUN2RSxPQUFNO1lBQ1IsQ0FBQztZQUVELE1BQU0sZUFBZSxHQUFHLE9BQU8sUUFBUSxLQUFLLFVBQVU7Z0JBQ3BELENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQztvQkFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtvQkFDakMsV0FBVztvQkFDWCxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWM7b0JBQzVCLG1CQUFtQixFQUFFLE9BQU87b0JBQzVCLGtCQUFrQixFQUFFLE1BQU07b0JBQzFCLGdCQUFnQixFQUFFLElBQUk7aUJBQ3ZCLENBQUM7Z0JBQ0YsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtZQUVaLElBQUksZUFBZSxJQUFJLENBQUMsQ0FBQyxlQUFlLFlBQVksZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUE7WUFDNUUsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUN4RSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFDO1FBQ3ZGLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFN0IsTUFBTSxLQUFLLEdBQUcsc0NBQXNDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUV2RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO1lBQzFHLE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztRQUVELE9BQU87WUFDTCxRQUFRLEVBQUUsS0FBSztZQUNmLGVBQWUsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRO1lBQzdFLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQ3ZDLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUE7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUN4RSxNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDeEMsT0FBTztZQUNQLFFBQVEsRUFBRSxXQUFXLENBQUMsa0JBQWtCO1lBQ3hDLFlBQVksRUFBRSxXQUFXLENBQUMsZUFBZTtTQUMxQyxDQUFDLENBQUE7UUFFRixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDM0MsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTthQUN6QixDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFdBQVc7UUFDM0MsTUFBTSxLQUFLLEdBQUcsc0NBQXNDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXhFLFdBQVcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1FBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO1lBQUUsT0FBTTtRQUVqQyxNQUFNLFVBQVUsR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDNUMsT0FBTztZQUNQLFFBQVEsRUFBRSxXQUFXLENBQUMsZUFBZTtTQUN0QyxDQUFDLENBQUE7UUFFRixLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDM0MsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTthQUN6QixDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQTtRQUNyRCxNQUFNLFlBQVksR0FBRztZQUNuQixHQUFHLENBQUMsYUFBYSxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUUsR0FBRyxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3hELENBQUE7UUFFRCxPQUFPLGlEQUFpRCxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7WUFDekYsTUFBTSxFQUFFLFlBQVk7WUFDcEIsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQzVCLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3RELENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUk7UUFDMUIscUJBQXFCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3RDLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCO1FBQzFCLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUE7WUFDbkMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7WUFFOUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxNQUFNLE1BQU0sQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPO1FBQ3JDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUE7WUFDbkMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7WUFFcEQsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxNQUFNLFNBQVMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtZQUMzQyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDcEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQTtZQUNuQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtZQUVoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sT0FBTyxDQUFDLEVBQUMsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7WUFDbEcsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QjtRQUMzQixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO1lBQ25DLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBRWhELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtZQUNoQyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGdDQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxPQUFPO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFBO1FBQzdCLEtBQUssSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyw2QkFBNkI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUI7WUFBRSxPQUFNO1FBRXZDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFBO1lBRWhELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtnQkFDbEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQTtnQkFDdEMsMkRBQTJEO2dCQUMzRCxpRUFBaUU7Z0JBQ2pFLDZEQUE2RDtnQkFDN0Qsd0RBQXdEO2dCQUN4RCw2REFBNkQ7Z0JBQzdELFNBQVM7Z0JBQ1QsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUE7Z0JBQzdCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7Z0JBQ25DLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUMsVUFBVSxFQUFFLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUMsQ0FBQyxDQUFBO2dCQUN0RixPQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQy9FLENBQUM7UUFFRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFBO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUE7UUFDdEMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtJQUN0RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUMsVUFBVSxFQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU07UUFFMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUV0QixLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzdCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDL0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJub2RlOmNyeXB0b1wiXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBSZXF1ZXN0UnVubmVyIGZyb20gXCIuL3JlcXVlc3QtcnVubmVyLmpzXCJcbmltcG9ydCBXZWJzb2NrZXRSZXF1ZXN0IGZyb20gXCIuL3dlYnNvY2tldC1yZXF1ZXN0LmpzXCJcbmltcG9ydCBXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge3dlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9ufSBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50LWxvZy1zdG9yZS5qc1wiXG5cbmNvbnN0IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSA9IDB4ODBcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfQ09OVElOVUFUSU9OID0gMHgwXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1RFWFQgPSAweDFcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfQklOQVJZID0gMHgyXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFID0gMHg4XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BJTkcgPSAweDlcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfUE9ORyA9IDB4QVxuXG4vKiogQ2FwIG9uIHRoZSBwYXVzZWQgb3V0Ym91bmQgcXVldWU7IG9sZGVzdCBmcmFtZXMgZHJvcCBvbiBvdmVyZmxvdy4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9QQVVTRURfUVVFVUVfQ0FQID0gMTAwMFxuXG4vKiogQ2FwIG9uIHRvdGFsIGJ5dGVzIGJ1ZmZlcmVkIGZvciBhIHNpbmdsZSBmcmFnbWVudGVkIG1lc3NhZ2UuICovXG5jb25zdCBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFUyA9IDE2ICogMTAyNCAqIDEwMjRcblxuLyoqIENhcCBvbiBmcmFnbWVudCBjb3VudCBmb3IgYSBzaW5nbGUgZnJhZ21lbnRlZCBtZXNzYWdlLiAqL1xuY29uc3QgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfRlJBR01FTlRTID0gMTAyNFxuXG4vKipcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn0gfCB7dHlwZTogXCJtZXRhZGF0YVwiLCBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pn0gfCB7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogdW5rbm93biwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgbWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZ30gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn0gfCBudWxsfSAtIFN1YnNjcmliZSBtZXNzYWdlIHdoZW4gbWF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gc3Vic2NyaWJlTWVzc2FnZShtZXNzYWdlKSB7XG4gIHJldHVybiBtZXNzYWdlLnR5cGUgPT09IFwic3Vic2NyaWJlXCJcbiAgICA/IC8qKiBAdHlwZSB7e3R5cGU6IFwic3Vic2NyaWJlXCIsIGNoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT59fSAqLyAobWVzc2FnZSlcbiAgICA6IG51bGxcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gUmF3IHdlYnNvY2tldCBtZXNzYWdlLlxuICogQHJldHVybnMge3t0eXBlPzogXCJyZXF1ZXN0XCIsIGJvZHk/OiB1bmtub3duLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgYW55PiwgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLCBtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nfSB8IG51bGx9IC0gUmVxdWVzdCBtZXNzYWdlIHdoZW4gbWF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSkge1xuICBpZiAobWVzc2FnZS50eXBlICYmIG1lc3NhZ2UudHlwZSAhPT0gXCJyZXF1ZXN0XCIpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7e3R5cGU/OiBcInJlcXVlc3RcIiwgYm9keT86IHVua25vd24sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9fSAqLyAobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gaWRlbnRpdHkgdmFsdWVzIGZyb20gYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC5cbiAqIE51bGxpc2ggdmFsdWVzIGNvbXBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciBidXQgbm90IHRvIGEgcmVhbCBpZGVudGl0eS5cbiAqIFBsYWluIG9iamVjdHMgYXJlIGNvbXBhcmVkIHZpYSBKU09OIHJvdW5kLXRyaXAgc28gYXBwcyBjYW4gcmV0dXJuIGFcbiAqIGB7dXNlcklkLCB0ZW5hbnRJZH1gLXN0eWxlIG9iamVjdCB3aXRob3V0IGJ1aWxkaW5nIHRoZWlyIG93biBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYSAtIFBhdXNlZC10aW1lIGlkZW50aXR5LlxuICogQHBhcmFtIHthbnl9IGIgLSBSZXN1bWUtdGltZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgd2hlbiB0aGUgdHdvIGlkZW50aXRpZXMgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgY2FsbGVyLlxuICovXG5mdW5jdGlvbiBpZGVudGl0aWVzTWF0Y2goYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWVcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpID09PSBKU09OLnN0cmluZ2lmeShiKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50V2Vic29ja2V0U2Vzc2lvbiB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBzdWJzY3JpcHRpb25zID0gbmV3IFNldCgpXG4gIGNoYW5uZWxzID0gbmV3IFNldCgpXG4gIHN1YnNjcmlwdGlvbkhhbmRsZXJzID0gbmV3IE1hcCgpXG4gIGhhbmRsZXJTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG4gIGNoYW5uZWxUZW5hbnRzID0gbmV3IE1hcCgpXG4gIGNoYW5uZWxSZXBsYXlTdGF0ZXMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZVtdfSAqL1xuICBtZXNzYWdlUXVldWUgPSBbXVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSBbYXJncy51cGdyYWRlUmVxdWVzdF0gLSBJbml0aWFsIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlcn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJdIC0gT3B0aW9uYWwgcmF3IG1lc3NhZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkPn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJQcm9taXNlXSAtIE9wdGlvbmFsIHJhdyBtZXNzYWdlIGhhbmRsZXIgcHJvbWlzZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnQsIGNvbmZpZ3VyYXRpb24sIHVwZ3JhZGVSZXF1ZXN0LCBtZXNzYWdlSGFuZGxlciwgbWVzc2FnZUhhbmRsZXJQcm9taXNlfSkge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy51cGdyYWRlUmVxdWVzdCA9IHVwZ3JhZGVSZXF1ZXN0XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UgPSBtZXNzYWdlSGFuZGxlclByb21pc2VcbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IEJvb2xlYW4obWVzc2FnZUhhbmRsZXJQcm9taXNlKVxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuX21ldGFkYXRhID0ge31cblxuICAgIC8qKlxuICAgICAqIExvbmctbGl2ZWQgcGVyLXNlc3Npb24gc3RhdGUgYmFnLiBTdGFibGUgYWNyb3NzIHJlY29ubmVjdHMgb25jZVxuICAgICAqIGdyYWNlLXBlcmlvZCByZXN1bXB0aW9uIGxhbmRzIGluIFBoYXNlIDI7IHRvZGF5IGl0IGp1c3QgbGl2ZXNcbiAgICAgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICAgKi9cbiAgICB0aGlzLmRhdGEgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY29ubmVjdGlvbi5qc1wiKS5kZWZhdWx0Pn0gKi9cbiAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7Y2hhbm5lbFR5cGU6IHN0cmluZywgc3Vic2NyaXB0aW9uOiBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fT59ICovXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZCBhc3NpZ25lZCB0byB0aGlzIHNlc3Npb24gb24gZmlyc3QgY29ubmVjdC4gU2VudCB0byB0aGVcbiAgICAgKiBjbGllbnQgdmlhIGBzZXNzaW9uLWVzdGFibGlzaGVkYDsgdGhlIGNsaWVudCBlY2hvZXMgaXQgYmFjayB2aWFcbiAgICAgKiBgc2Vzc2lvbi1yZXN1bWVgIGFmdGVyIGEgV1MgZHJvcCB0byByZWF0dGFjaCB0byB0aGlzIHNlc3Npb25cbiAgICAgKiB3aXRoaW4gdGhlIGdyYWNlIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc2Vzc2lvbklkID0gcmFuZG9tVVVJRCgpXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBhZnRlciBgX2hhbmRsZUNsb3NlYCBwYXVzZXMgaW5zdGVhZCBvZiB0ZWFyaW5nIGRvd24uICovXG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7YW55W119IC0gZnJhbWVzIHByb2R1Y2VkIHdoaWxlIHBhdXNlZDsgZmx1c2hlZCBvbiByZXN1bWUuICovXG4gICAgdGhpcy5fb3V0Ym91bmRRdWV1ZSA9IFtdXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgdGhpcy5zb2NrZXQgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUYWlsIG9mIGEgcGVyLXNlc3Npb24gcHJvbWlzZSBjaGFpbiB0aGF0IHNlcmlhbGl6ZXMgbWVzc2FnZVxuICAgICAqIGhhbmRsaW5nLiBQcmV2ZW50cyByYWNlcyB3aGVyZSBtZXNzYWdlIEIgcmVhZHMgYHNlc3Npb24uZGF0YWBcbiAgICAgKiBiZWZvcmUgbWVzc2FnZSBBJ3MgaGFuZGxlciBmaW5pc2hlcyB3cml0aW5nIGl0IChlLmcuIGFcbiAgICAgKiBjb25uZWN0aW9uLW1lc3NhZ2Ugc2V0dGluZyB0aGUgbG9jYWxlIHZzLiBhIHN1YnNlcXVlbnQgcmVxdWVzdFxuICAgICAqIHdob3NlIGFyb3VuZFJlcXVlc3Qgd3JhcHBlciByZWFkcyBpdCkuXG4gICAgICogQHR5cGUge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgdGhpcy5fbWVzc2FnZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXV0aCBpZGVudGl0eSBjYXB0dXJlZCBhdCBwYXVzZVxuICAgICAqIHRpbWUgYnkgYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC4gQXdhaXRlZCBhdCByZXN1bWVcbiAgICAgKiB0aW1lIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgZnJlc2ggY2FsbGVyJ3MgaWRlbnRpdHkuIFVuZGVmaW5lZFxuICAgICAqIG9uIGEgbGl2ZSAobm9uLXBhdXNlZCkgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTxhbnk+IHwgdW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHRoaXMuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZSA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogQWNjdW11bGF0ZXMgcGF5bG9hZHMgZm9yIGEgZnJhZ21lbnRlZCB3ZWJzb2NrZXQgbWVzc2FnZSBwZXJcbiAgICAgKiBSRkMgNjQ1NS4gTm9uLW51bGwgd2hpbGUgbWlkLWZyYWdtZW50OyBjbGVhcmVkIHdoZW4gdGhlIGZyYW1lXG4gICAgICogd2l0aCBGSU49MSBjb21wbGV0ZXMgYW5kIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQuXG4gICAgICogQHR5cGUge0J1ZmZlcltdIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBPcGNvZGUgKFRFWFQvQklOQVJZKSBjYXB0dXJlZCBmcm9tIHRoZSBmaXJzdCBmcmFtZSBvZiBhXG4gICAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBDb250aW51YXRpb24gZnJhbWVzIChvcGNvZGUgMCkgaW5oZXJpdCBpdFxuICAgICAqIGF0IHJlYXNzZW1ibHkgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogUnVubmluZyBieXRlIHRvdGFsIGZvciBgX2ZyYWdtZW50ZWRQYXlsb2Fkc2AuIFVzZWQgdG8gZW5mb3JjZVxuICAgICAqIGBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU2Agc28gYSBwZWVyIGNhbm5vdFxuICAgICAqIGV4aGF1c3QgbWVtb3J5IGJ5IHN0cmVhbWluZyBub24tZmluYWwgZnJhZ21lbnRzIGluZGVmaW5pdGVseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgY2xpZW50IGl0cyBzZXNzaW9uSWQgKyBncmFjZSB3aW5kb3cuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudGAgYWZ0ZXIgdGhlIFdTIHVwZ3JhZGUgY29tcGxldGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNlbmRTZXNzaW9uRXN0YWJsaXNoZWQoKSB7XG4gICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICB0eXBlOiBcInNlc3Npb24tZXN0YWJsaXNoZWRcIixcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICBncmFjZVNlY29uZHM6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uR3JhY2VTZWNvbmRzPy4oKSB8fCAzMDBcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbG9zZWQgY29ubmVjdGlvbiBmcm9tIHRoZSBzZXNzaW9uIHJlZ2lzdHJ5LiBDYWxsZWQgYnlcbiAgICogYFZlbG9jaW91c1dlYnNvY2tldENvbm5lY3Rpb24uY2xvc2UoKWAgYWZ0ZXIgaXQgc2VuZHMgdGhlIGZpbmFsXG4gICAqIGBjb25uZWN0aW9uLWNsb3NlZGAgZnJhbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uSWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uSWQpIHtcbiAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIENsaWVudC1wcm92aWRlZCBtZXRhZGF0YSAoZGVmZW5zaXZlIGNvcHkpLiAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gey4uLnRoaXMuX21ldGFkYXRhfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgd2hpbGUgdGhlIHNlc3Npb24gaXMgaW4gdGhlIHBhdXNlZC9ncmFjZSByZWdpc3RyeS4gKi9cbiAgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdXNlZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRTdWJzY3JpcHRpb24oY2hhbm5lbCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY2hhbm5lbClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgaXQgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25EYXRhKGRhdGEpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBkYXRhXSlcbiAgICB0aGlzLl9wcm9jZXNzQnVmZmVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHthbnl9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7e2NyZWF0ZWRBdD86IHN0cmluZywgZXZlbnRJZD86IHN0cmluZywgcmVwbGF5ZWQ/OiBib29sZWFuLCBzZXF1ZW5jZT86IG51bWJlcn19IFtvcHRpb25zXSAtIEV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEV2ZW50KGNoYW5uZWwsIHBheWxvYWQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGNoYW5uZWxIYW5kbGVycyA9IHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpXG4gICAgY29uc3QgaGFzQ2hhbm5lbEhhbmRsZXJzID0gQm9vbGVhbihjaGFubmVsSGFuZGxlcnMgJiYgY2hhbm5lbEhhbmRsZXJzLnNpemUgPiAwKVxuICAgIGNvbnN0IHJlcGxheVN0YXRlID0gdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmdldChjaGFubmVsKVxuXG4gICAgaWYgKHJlcGxheVN0YXRlPy5yZXBsYXlpbmcgJiYgIW9wdGlvbnMucmVwbGF5ZWQpIHtcbiAgICAgIHJlcGxheVN0YXRlLmJ1ZmZlcmVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSAmJiAhaGFzQ2hhbm5lbEhhbmRsZXJzKSByZXR1cm5cblxuICAgIGlmIChoYXNDaGFubmVsSGFuZGxlcnMpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oY2hhbm5lbEhhbmRsZXJzKS5tYXAoYXN5bmMgKGhhbmRsZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGVuYW50ID0gdGhpcy5jaGFubmVsVGVuYW50cy5nZXQoaGFuZGxlcilcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5yZWNlaXZlZEJyb2FkY2FzdCh7XG4gICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgIGV2ZW50SWQ6IG9wdGlvbnMuZXZlbnRJZCxcbiAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICAgICAgICAgIHNlcXVlbmNlOiBvcHRpb25zLnNlcXVlbmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICBldmVudElkOiBvcHRpb25zLmV2ZW50SWQsXG4gICAgICBwYXlsb2FkLFxuICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICBzZXF1ZW5jZTogb3B0aW9ucy5zZXF1ZW5jZSxcbiAgICAgIHR5cGU6IFwiZXZlbnRcIlxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVDaGFubmVsKCkge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5fcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpXG5cbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgIGlmICghcmVzb2x2ZXIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe30pXG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIoe1xuICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7Y2xpZW50OiB0aGlzLmNsaWVudCwgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LCB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAoY2hhbm5lbCAmJiAhKGNoYW5uZWwgaW5zdGFuY2VvZiBXZWJzb2NrZXRDaGFubmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvbHZlZCB3ZWJzb2NrZXQgY2hhbm5lbCBtdXN0IGV4dGVuZCBXZWJzb2NrZXRDaGFubmVsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsLCB0ZW5hbnQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBpbml0aWFsaXplIHdlYnNvY2tldCBjaGFubmVsXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGNsaWVudCAtIENsaWVudCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2VuZEdvb2RieWUoY2xpZW50KSB7XG4gICAgY29uc3QgZnJhbWUgPSBCdWZmZXIuZnJvbShbV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9DTE9TRSwgMHgwMF0pXG5cbiAgICBjbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgZnJhbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAvLyBTZXJpYWxpemUgcGVyLXNlc3Npb246IGNoYWluIG9udG8gYF9tZXNzYWdlQ2hhaW5gIHNvIG1lc3NhZ2VzXG4gICAgLy8gYXJlIHByb2Nlc3NlZCBvbmUgYXQgYSB0aW1lLiBXaXRob3V0IHRoaXMsIGZpcmUtYW5kLWZvcmdldFxuICAgIC8vIGRpc3BhdGNoIGZyb20gYF9wcm9jZXNzQnVmZmVyYCBsZXRzIG1lc3NhZ2UgQiByZWFkXG4gICAgLy8gYHNlc3Npb24uZGF0YWAgYmVmb3JlIEEgaGFzIGZpbmlzaGVkIHdyaXRpbmcgaXQuXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLl9tZXNzYWdlQ2hhaW5cbiAgICBjb25zdCBuZXh0ID0gcHJldmlvdXMudGhlbigoKSA9PiB0aGlzLl9kaXNwYXRjaE1lc3NhZ2UobWVzc2FnZSkpXG5cbiAgICB0aGlzLl9tZXNzYWdlQ2hhaW4gPSBuZXh0LmNhdGNoKCgpID0+IHt9KVxuICAgIGF3YWl0IG5leHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Rpc3BhdGNoTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRBcm91bmRSZXF1ZXN0Py4oKVxuXG4gICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgIGF3YWl0IHdyYXBwZXIodGhpcywgKCkgPT4gdGhpcy5faGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5faGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpXG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdHVhbCBtZXNzYWdlIGRpc3BhdGNoLCBleHRyYWN0ZWQgc29cbiAgICogYGNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0QXJvdW5kUmVxdWVzdCgpYCBjYW4gd3JhcCBpdCBpbiBhbnlcbiAgICogcGVyLXJlcXVlc3QgY29udGV4dCAoQXN5bmNMb2NhbFN0b3JhZ2UsIHRyYWNpbmcsIGV0Yy4pLlxuICAgKlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUaGUgbWVzc2FnZUhhbmRsZXIgc2hvcnQtY2lyY3VpdHMgZGVmYXVsdCByb3V0aW5nIG9ubHkgd2hlbiB0aGVcbiAgICAvLyBhcHAgYWN0dWFsbHkgZGVjbGFyZWQgYW4gYG9uTWVzc2FnZWAgaG9vay4gQXBwcyB0aGF0IG9ubHkgd2FudFxuICAgIC8vIHNlc3Npb24tbGlmZWN5Y2xlIHRyYWNraW5nIChgb25PcGVuYC9gb25DbG9zZWApIHN0aWxsIG5lZWQgdGhlXG4gICAgLy8gYnVpbHQtaW4gc3Vic2NyaWJlL2Nvbm5lY3Rpb24vY2hhbm5lbC1zdWJzY3JpYmUgcm91dGluZyBiZWxvdyxcbiAgICAvLyBvdGhlcndpc2UgZXZlcnkgaW5jb21pbmcgbWVzc2FnZSBpcyBzaWxlbnRseSBkcm9wcGVkLlxuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyICYmIHR5cGVvZiB0aGlzLm1lc3NhZ2VIYW5kbGVyLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmliZVBheWxvYWQgPSBzdWJzY3JpYmVNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICBpZiAoc3Vic2NyaWJlUGF5bG9hZCkge1xuICAgICAgY29uc3Qge2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9ID0gc3Vic2NyaWJlUGF5bG9hZFxuXG4gICAgICBpZiAoIWNoYW5uZWwpIHRocm93IG5ldyBFcnJvcihcImNoYW5uZWwgaXMgcmVxdWlyZWQgZm9yIHN1YnNjcmliZVwiKVxuICAgICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyPy4oKVxuXG4gICAgICBpZiAocmVzb2x2ZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ2hhbm5lbFN1YnNjcmlwdGlvbih7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtc30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnN1YnNjcmliZVRvQ2hhbm5lbChjaGFubmVsLCB7YWNrbm93bGVkZ2U6IHRydWUsIGxhc3RFdmVudElkLCBwYXJhbXN9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcIm1ldGFkYXRhXCIpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhUGF5bG9hZCA9IC8qKiBAdHlwZSB7e2RhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gKi8gKG1lc3NhZ2UpXG5cbiAgICAgIHRoaXMuX21ldGFkYXRhID0gbWV0YWRhdGFQYXlsb2FkLmRhdGEgJiYgdHlwZW9mIG1ldGFkYXRhUGF5bG9hZC5kYXRhID09PSBcIm9iamVjdFwiID8gey4uLm1ldGFkYXRhUGF5bG9hZC5kYXRhfSA6IHt9XG5cbiAgICAgIGZvciAoY29uc3Qge3N1YnNjcmlwdGlvbn0gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpcHRpb24ub25NZXRhZGF0YUNoYW5nZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb24ub25NZXRhZGF0YUNoYW5nZWQodGhpcy5fbWV0YWRhdGEpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcInNlc3Npb24tcmVzdW1lXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZVNlc3Npb25SZXN1bWUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1vcGVuXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25PcGVuKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tbWVzc2FnZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDb25uZWN0aW9uTWVzc2FnZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLWNsb3NlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25DbG9zZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjaGFubmVsLXN1YnNjcmliZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsU3Vic2NyaWJlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ2hhbm5lbFVuc3Vic2NyaWJlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlICYmIG1lc3NhZ2UudHlwZSAhPT0gXCJyZXF1ZXN0XCIpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWAsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICBpZiAoIXJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogYFVua25vd24gbWVzc2FnZSB0eXBlOiAke21lc3NhZ2UudHlwZX1gLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qge2JvZHksIGhlYWRlcnMsIGlkLCBtZXRob2QsIHBhdGh9ID0gcmVxdWVzdFBheWxvYWRcblxuICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoXCJtZXRob2QgaXMgcmVxdWlyZWRcIilcbiAgICBpZiAoIXBhdGgpIHRocm93IG5ldyBFcnJvcihcInBhdGggaXMgcmVxdWlyZWRcIilcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgV2Vic29ja2V0UmVxdWVzdCh7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHBhdGgsXG4gICAgICByZW1vdGVBZGRyZXNzOiB0aGlzLmNsaWVudC5yZW1vdGVBZGRyZXNzXG4gICAgfSlcbiAgICBjb25zdCByZXF1ZXN0UnVubmVyID0gbmV3IFJlcXVlc3RSdW5uZXIoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVxdWVzdFxuICAgIH0pXG5cbiAgICByZXF1ZXN0UnVubmVyLmV2ZW50cy5vbihcImRvbmVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXF1ZXN0UnVubmVyLnJlc3BvbnNlXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuZ2V0Qm9keSgpXG4gICAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVyc1xuXG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgaWQsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKSxcbiAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzcG9uc2UuZ2V0U3RhdHVzTWVzc2FnZSgpLFxuICAgICAgICB0eXBlOiBcInJlc3BvbnNlXCJcbiAgICAgIH0pXG4gICAgICB2b2lkIHJlcXVlc3RSdW5uZXIubG9nQ29tcGxldGVkUmVxdWVzdCgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGxvZyBjb21wbGV0ZWQgcmVxdWVzdFwiLCBlcnJvcilcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGF3YWl0IHJlcXVlc3RSdW5uZXIucnVuKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfcHJvY2Vzc0J1ZmZlcigpIHtcbiAgICB3aGlsZSAodGhpcy5idWZmZXIubGVuZ3RoID49IDIpIHtcbiAgICAgIGNvbnN0IGZpcnN0Qnl0ZSA9IHRoaXMuYnVmZmVyWzBdXG4gICAgICBjb25zdCBzZWNvbmRCeXRlID0gdGhpcy5idWZmZXJbMV1cbiAgICAgIGNvbnN0IGlzRmluYWwgPSAoZmlyc3RCeXRlICYgV0VCU09DS0VUX0ZJTkFMX0ZSQU1FKSA9PT0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FXG4gICAgICBjb25zdCBvcGNvZGUgPSBmaXJzdEJ5dGUgJiAweDBGXG4gICAgICBjb25zdCBpc01hc2tlZCA9IChzZWNvbmRCeXRlICYgMHg4MCkgPT09IDB4ODBcbiAgICAgIGxldCBwYXlsb2FkTGVuZ3RoID0gc2Vjb25kQnl0ZSAmIDB4N0ZcbiAgICAgIGxldCBvZmZzZXQgPSAyXG5cbiAgICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IG9mZnNldCArIDIpIHJldHVyblxuICAgICAgICBwYXlsb2FkTGVuZ3RoID0gdGhpcy5idWZmZXIucmVhZFVJbnQxNkJFKG9mZnNldClcbiAgICAgICAgb2Zmc2V0ICs9IDJcbiAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBvZmZzZXQgKyA4KSByZXR1cm5cbiAgICAgICAgY29uc3QgYmlnTGVuZ3RoID0gdGhpcy5idWZmZXIucmVhZEJpZ1VJbnQ2NEJFKG9mZnNldClcblxuICAgICAgICBwYXlsb2FkTGVuZ3RoID0gTnVtYmVyKGJpZ0xlbmd0aClcbiAgICAgICAgb2Zmc2V0ICs9IDhcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFza0xlbmd0aCA9IGlzTWFza2VkID8gNCA6IDBcblxuICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IG9mZnNldCArIG1hc2tMZW5ndGggKyBwYXlsb2FkTGVuZ3RoKSByZXR1cm5cblxuICAgICAgLyoqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgICBsZXQgcGF5bG9hZCA9IHRoaXMuYnVmZmVyLnNsaWNlKG9mZnNldCArIG1hc2tMZW5ndGgsIG9mZnNldCArIG1hc2tMZW5ndGggKyBwYXlsb2FkTGVuZ3RoKVxuXG4gICAgICBpZiAoaXNNYXNrZWQpIHtcbiAgICAgICAgY29uc3QgbWFzayA9IHRoaXMuYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbWFza0xlbmd0aClcbiAgICAgICAgcGF5bG9hZCA9IHRoaXMuX3VubWFza1BheWxvYWQocGF5bG9hZCwgbWFzaylcbiAgICAgIH1cblxuICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zbGljZShvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aClcblxuICAgICAgLy8gQ29udHJvbCBmcmFtZXMgKG9wY29kZSA+PSAweDgpIG11c3Qgbm90IGJlIGZyYWdtZW50ZWQgcGVyXG4gICAgICAvLyBSRkMgNjQ1NSBhbmQgY2FuIGFycml2ZSBpbnRlcmxlYXZlZCB3aXRoIGEgZnJhZ21lbnRlZCBkYXRhXG4gICAgICAvLyBtZXNzYWdlLiBIYW5kbGUgdGhlbSBmaXJzdCB3aXRob3V0IHRvdWNoaW5nIHRoZSBmcmFnbWVudFxuICAgICAgLy8gYWNjdW11bGF0b3IuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX1BJTkcpIHtcbiAgICAgICAgdGhpcy5fc2VuZENvbnRyb2xGcmFtZShXRUJTT0NLRVRfT1BDT0RFX1BPTkcsIHBheWxvYWQpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQ0xPU0UpIHtcbiAgICAgICAgdGhpcy5zZW5kR29vZGJ5ZSh0aGlzLmNsaWVudClcbiAgICAgICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID49IDB4OCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgY29udHJvbCBvcGNvZGU6ICR7b3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIERhdGEgZnJhbWUgKFRFWFQvQklOQVJZL0NPTlRJTlVBVElPTikuIFJlYXNzZW1ibGUgZnJhZ21lbnRzXG4gICAgICAvLyBiZWZvcmUgZGlzcGF0Y2hpbmcuIEJyb3dzZXJzIChDaHJvbWUpIGxlZ2l0aW1hdGVseSBmcmFnbWVudFxuICAgICAgLy8gbG9uZ2VyIGNsaWVudOKGknNlcnZlciB0ZXh0IGZyYW1lczsgYSBwcmlvciB2ZXJzaW9uIGRyb3BwZWRcbiAgICAgIC8vIGV2ZXJ5IGZyYWdtZW50ZWQgbWVzc2FnZSBzaWxlbnRseSwgc28gYW55IHBheWxvYWQgbGFyZ2VcbiAgICAgIC8vIGVub3VnaCB0byBoaXQgdGhlIGJyb3dzZXIncyBmcmFnbWVudGF0aW9uIHRocmVzaG9sZFxuICAgICAgLy8gKGUuZy4gYSBjaGFubmVsLXN1YnNjcmliZSB3aXRoIGFuIGF1dGggdG9rZW4pIG5ldmVyIHJlYWNoZWRcbiAgICAgIC8vIHRoZSBoYW5kbGVyLlxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DT05USU5VQVRJT04pIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJSZWNlaXZlZCBjb250aW51YXRpb24gZnJhbWUgd2l0aCBubyBmcmFnbWVudGVkIG1lc3NhZ2UgaW4gcHJvZ3Jlc3NcIilcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hcHBlbmRGcmFnbWVudChwYXlsb2FkKSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKCFpc0ZpbmFsKSBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfVEVYVCB8fCBvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQklOQVJZKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiUmVjZWl2ZWQgbmV3IGRhdGEgZnJhbWUgd2hpbGUgYSBmcmFnbWVudGVkIG1lc3NhZ2Ugd2FzIGluIHByb2dyZXNzOyBkaXNjYXJkaW5nIHByaW9yIGZyYWdtZW50c1wiKVxuICAgICAgICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0ZpbmFsKSB7XG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gW3BheWxvYWRdXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA9IG9wY29kZVxuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IHBheWxvYWQubGVuZ3RoXG5cbiAgICAgICAgICBpZiAoIXRoaXMuX2VuZm9yY2VGcmFnbWVudExpbWl0cygpKSByZXR1cm5cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBkYXRhIG9wY29kZTogJHtvcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLyoqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgICBsZXQgZmluYWxQYXlsb2FkXG4gICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgIGxldCBmaW5hbE9wY29kZVxuXG4gICAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQ09OVElOVUFUSU9OKSB7XG4gICAgICAgICAgZmluYWxQYXlsb2FkID0gQnVmZmVyLmNvbmNhdCh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMpXG4gICAgICAgICAgZmluYWxPcGNvZGUgPSB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID8/IFdFQlNPQ0tFVF9PUENPREVfVEVYVFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgICBmaW5hbE9wY29kZSA9IG9wY29kZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluYWxQYXlsb2FkID0gcGF5bG9hZFxuICAgICAgICBmaW5hbE9wY29kZSA9IG9wY29kZVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxPcGNvZGUgIT09IFdFQlNPQ0tFVF9PUENPREVfVEVYVCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgZGF0YSBvcGNvZGUgYWZ0ZXIgcmVhc3NlbWJseTogJHtmaW5hbE9wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShmaW5hbFBheWxvYWQudG9TdHJpbmcoXCJ1dGYtOFwiKSlcblxuICAgICAgICB0aGlzLl9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZSwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBwYXJzZSB3ZWJzb2NrZXQgbWVzc2FnZVwiLCBlcnJvcl0pXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBcIkludmFsaWQgd2Vic29ja2V0IG1lc3NhZ2VcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGNvbnRpbnVhdGlvbi1mcmFtZSBwYXlsb2FkIHRvIHRoZSBpbi1wcm9ncmVzc1xuICAgKiBmcmFnbWVudGVkIG1lc3NhZ2UuIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBmcmFnbWVudCB3YXMgYWNjZXB0ZWRcbiAgICogYW5kIGZhbHNlIHdoZW4gdGhlIHBlci1tZXNzYWdlIGNhcCB3YXMgaGl0IGFuZCB0aGUgc29ja2V0IGhhc1xuICAgKiBiZWVuIGNsb3NlZC5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBfYXBwZW5kRnJhZ21lbnQocGF5bG9hZCkge1xuICAgIC8vIEd1YXJkIHB1c2hpbmcgZmlyc3Qgc28gYF9lbmZvcmNlRnJhZ21lbnRMaW1pdHNgIHNlZXMgdGhlIGZpbmFsXG4gICAgLy8gc3RhdGU7IG9uIG92ZXJmbG93IHRoZSByZXNldCBpbnNpZGUgdGhlIGVuZm9yY2VyIGRyb3BzIHRoZVxuICAgIC8vIGJ1ZmZlcmVkIGZyYWdtZW50cy5cbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHM/LnB1c2gocGF5bG9hZClcbiAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgKz0gcGF5bG9hZC5sZW5ndGhcblxuICAgIHJldHVybiB0aGlzLl9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBmcmFnbWVudGVkIG1lc3NhZ2UgaGFzIG5vdCBleGNlZWRlZCB0aGUgYnl0ZSBvclxuICAgKiBmcmFnbWVudC1jb3VudCBjYXBzLiBPbiBvdmVyZmxvdywgY2xlYXJzIHRoZSBidWZmZXIsIHNlbmRzIGFcbiAgICogY2xvc2UgZnJhbWUsIGFuZCB0ZWFycyB0aGUgc2Vzc2lvbiBkb3duLiBSZXR1cm5zIHRydWUgd2hlbiB0aGVcbiAgICogY2FsbGVyIGNhbiBjb250aW51ZSBwcm9jZXNzaW5nLCBmYWxzZSB3aGVuIHRoZSBzZXNzaW9uIGlzIGJlaW5nXG4gICAqIGNsb3NlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBfZW5mb3JjZUZyYWdtZW50TGltaXRzKCkge1xuICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPT09IG51bGwpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBmcmFnbWVudENvdW50ID0gdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzLmxlbmd0aFxuICAgIGNvbnN0IG92ZXJCeXRlcyA9IHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA+IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTXG4gICAgY29uc3Qgb3ZlckZyYWdtZW50cyA9IGZyYWdtZW50Q291bnQgPiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9GUkFHTUVOVFNcblxuICAgIGlmICghb3ZlckJ5dGVzICYmICFvdmVyRnJhZ21lbnRzKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXG4gICAgICBcIkZyYWdtZW50ZWQgd2Vic29ja2V0IG1lc3NhZ2UgZXhjZWVkZWQgY2FwczsgY2xvc2luZyBjb25uZWN0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIGZyYWdtZW50Qnl0ZXM6IHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyxcbiAgICAgICAgZnJhZ21lbnRDb3VudCxcbiAgICAgICAgbWF4Qnl0ZXM6IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTLFxuICAgICAgICBtYXhGcmFnbWVudHM6IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UU1xuICAgICAgfVxuICAgIF0pXG5cbiAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKVxuICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQpXG4gICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIF9yZXNldEZyYWdtZW50QnVmZmVyKCkge1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IG51bGxcbiAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gbnVsbFxuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gb3Bjb2RlIC0gT3Bjb2RlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRDb250cm9sRnJhbWUob3Bjb2RlLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG5cbiAgICBoZWFkZXJbMF0gPSBXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBvcGNvZGVcbiAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgLSBSZXF1ZXN0IGJvZHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNlbmRKc29uKGJvZHkpIHtcbiAgICAvLyBXaGlsZSBwYXVzZWQgKHdhaXRpbmcgZm9yIGEgcmVzdW1lKSwgc3Rhc2ggZnJhbWVzIGluIGFuXG4gICAgLy8gb3V0Ym91bmQgcXVldWUgYW5kIGZsdXNoIHRoZW0gaW4gb3JkZXIgb24gcmVzdW1lLiBDYXBwZWQgdG9cbiAgICAvLyBwcmV2ZW50IHJ1bmF3YXkgbWVtb3J5IHVzZSB3aGlsZSB0aGUgY2xpZW50IGlzIG9mZmxpbmUuXG4gICAgaWYgKHRoaXMuX3BhdXNlZCkge1xuICAgICAgdGhpcy5fb3V0Ym91bmRRdWV1ZSB8fD0gW11cblxuICAgICAgaWYgKHRoaXMuX291dGJvdW5kUXVldWUubGVuZ3RoID49IFdFQlNPQ0tFVF9QQVVTRURfUVVFVUVfQ0FQKSB7XG4gICAgICAgIC8vIERyb3Agb2xkZXN0IHNvIHRoZSBtb3N0IHJlY2VudCBhY3Rpdml0eSB3aW5zIG9uIHJlc3VtZS5cbiAgICAgICAgdGhpcy5fb3V0Ym91bmRRdWV1ZS5zaGlmdCgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX291dGJvdW5kUXVldWUucHVzaChib2R5KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNsaWVudD8uZXZlbnRzKSByZXR1cm5cblxuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuZnJvbShqc29uLCBcInV0Zi04XCIpXG4gICAgbGV0IGhlYWRlclxuXG4gICAgaWYgKHBheWxvYWQubGVuZ3RoIDwgMTI2KSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMilcbiAgICAgIGhlYWRlclsxXSA9IHBheWxvYWQubGVuZ3RoXG4gICAgfSBlbHNlIGlmIChwYXlsb2FkLmxlbmd0aCA8IDY1NTM2KSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoNClcbiAgICAgIGhlYWRlclsxXSA9IDEyNlxuICAgICAgaGVhZGVyLndyaXRlVUludDE2QkUocGF5bG9hZC5sZW5ndGgsIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYygxMClcbiAgICAgIGhlYWRlclsxXSA9IDEyN1xuICAgICAgaGVhZGVyLndyaXRlQmlnVUludDY0QkUoQmlnSW50KHBheWxvYWQubGVuZ3RoKSwgMilcbiAgICB9XG5cbiAgICBoZWFkZXJbMF0gPSBXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBXRUJTT0NLRVRfT1BDT0RFX1RFWFRcblxuICAgIHRoaXMuY2xpZW50LmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgcGF5bG9hZF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoZXMgdGhlIHBhdXNlZCBvdXRib3VuZCBxdWV1ZSBvdmVyIHRoZSBjdXJyZW50IHNvY2tldC5cbiAgICogQ2FsbGVkIGR1cmluZyByZXN1bWUgYWZ0ZXIgYHNlc3Npb24tcmVzdW1lZGAgaGFzIGJlZW4gc2VudCBvblxuICAgKiB0aGUgTkVXIHNlc3Npb24ncyBzb2NrZXQgKG5vdCB0aGlzIHNlc3Npb24ncykuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2ZsdXNoT3V0Ym91bmRRdWV1ZSgpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMuX291dGJvdW5kUXVldWUgfHwgW11cblxuICAgIHRoaXMuX291dGJvdW5kUXVldWUgPSBbXVxuXG4gICAgZm9yIChjb25zdCBib2R5IG9mIHF1ZXVlKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKGJvZHkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3thY2tub3dsZWRnZT86IGJvb2xlYW4sIGNoYW5uZWxIYW5kbGVyPzogaW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdCwgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIHN1YnNjcmlwdGlvbkNoYW5uZWw/OiBzdHJpbmd9fSBbb3B0aW9uc10gLSBTdWJzY3JpYmUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIHdhcyBhZGRlZC5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVRvQ2hhbm5lbChjaGFubmVsLCB7YWNrbm93bGVkZ2UgPSB0cnVlLCBjaGFubmVsSGFuZGxlciwgbGFzdEV2ZW50SWQsIHBhcmFtcywgc3Vic2NyaXB0aW9uQ2hhbm5lbH0gPSB7fSkge1xuICAgIGF3YWl0IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbikubWFya0NoYW5uZWxJbnRlcmVzdGVkKGNoYW5uZWwpXG5cbiAgICBjb25zdCByZXBsYXlTdGF0ZSA9IGF3YWl0IHRoaXMuX3ByZXBhcmVSZXBsYXlTdGF0ZSh7XG4gICAgICBjaGFubmVsLFxuICAgICAgbGFzdEV2ZW50SWQsXG4gICAgICBzdWJzY3JpcHRpb25DaGFubmVsOiBzdWJzY3JpcHRpb25DaGFubmVsIHx8IGNoYW5uZWwsXG4gICAgICBzdWJzY3JpcHRpb25QYXJhbXM6IHBhcmFtc1xuICAgIH0pXG5cbiAgICBpZiAocmVwbGF5U3RhdGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcbiAgICBpZiAocmVwbGF5U3RhdGUpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5zZXQoY2hhbm5lbCwgcmVwbGF5U3RhdGUpXG4gICAgfVxuXG4gICAgdGhpcy5hZGRTdWJzY3JpcHRpb24oY2hhbm5lbClcblxuICAgIGlmIChjaGFubmVsSGFuZGxlcikge1xuICAgICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmhhcyhjaGFubmVsKSkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLnNldChjaGFubmVsLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpPy5hZGQoY2hhbm5lbEhhbmRsZXIpXG5cbiAgICAgIGlmICghdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbEhhbmRsZXIpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuc2V0KGNoYW5uZWxIYW5kbGVyLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWxIYW5kbGVyKT8uYWRkKGNoYW5uZWwpXG4gICAgfVxuXG4gICAgaWYgKHJlcGxheVN0YXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZXBsYXlDaGFubmVsRXZlbnRzKHtjaGFubmVsLCByZXBsYXlTdGF0ZX0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLl9maW5pc2hSZXBsYXlTdGF0ZShjaGFubmVsLCByZXBsYXlTdGF0ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWNrbm93bGVkZ2UpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIHR5cGU6IFwic3Vic2NyaWJlZFwifSlcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9oYW5kbGVDbG9zZSgpIHtcbiAgICAvLyBJZiB0aGUgc2Vzc2lvbiBoYXMgcmVzdW1hYmxlIHN0YXRlIChsaXZlIENvbm5lY3Rpb24gb3JcbiAgICAvLyBDaGFubmVsVjIgc3Vic2NyaXB0aW9uKSwgbW92ZSBpdCBpbnRvIHRoZSBwYXVzZWQgcmVnaXN0cnlcbiAgICAvLyBpbnN0ZWFkIG9mIHRlYXJpbmcgZG93bjsgYSBuZXcgc29ja2V0IHByZXNlbnRpbmcgdGhlIHNlc3Npb25JZFxuICAgIC8vIHZpYSBgc2Vzc2lvbi1yZXN1bWVgIHdpdGhpbiB0aGUgZ3JhY2Ugd2luZG93IHdpbGwgcmVhdHRhY2guXG4gICAgY29uc3QgaGFzUmVzdW1hYmxlU3RhdGUgPSB0aGlzLl9jb25uZWN0aW9ucy5zaXplID4gMCB8fCB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5zaXplID4gMFxuXG4gICAgaWYgKGhhc1Jlc3VtYWJsZVN0YXRlICYmICF0aGlzLl9wYXVzZWQpIHtcbiAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWVcbiAgICAgIHRoaXMuc29ja2V0ID0gbnVsbFxuICAgICAgLy8gS2ljayBvZmYgYXV0aC1pZGVudGl0eSBjYXB0dXJlIGZvciByZXN1bWUgdmVyaWZpY2F0aW9uLiBSdW5zXG4gICAgICAvLyBpbiB0aGUgYmFja2dyb3VuZCDigJQgYF9oYW5kbGVTZXNzaW9uUmVzdW1lYCBhd2FpdHNcbiAgICAgIC8vIGBfcmVzdW1lSWRlbnRpdHlQcm9taXNlYCBiZWZvcmUgY29tcGFyaW5nLiBQYXVzZSByZWdpc3RyYXRpb25cbiAgICAgIC8vIGlzIHN5bmNocm9ub3VzIHNvIGEgcmVzdW1lIGFycml2aW5nIGltbWVkaWF0ZWx5IHN0aWxsIGZpbmRzXG4gICAgICAvLyB0aGUgc2Vzc2lvbi5cbiAgICAgIHRoaXMuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZSA9IHRoaXMuX2NhcHR1cmVSZXN1bWVJZGVudGl0eSgpXG4gICAgICB2b2lkIHRoaXMuX2ZpcmVPbkRpc2Nvbm5lY3QoKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl9wYXVzZVdlYnNvY2tldFNlc3Npb24odGhpcylcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdm9pZCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlckNsb3NlKClcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbCgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNvbm5lY3Rpb25zKFwic2Vzc2lvbl9kZXN0cm95ZWRcIilcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgZ3JhY2UgdGltZXIgd2hlbiB0aGUgcGF1c2VkIHBlcmlvZCBleHBpcmVzIHdpdGhvdXRcbiAgICogYSByZXN1bWUuIFRlYXJzIGRvd24gYWxsIGxpdmUgQ29ubmVjdGlvbnMgKyBDaGFubmVsIHN1YnMgYW5kXG4gICAqIGRyb3BzIHRoZSBzZXNzaW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9maW5hbGl6ZUdyYWNlRXhwaXJ5KCkge1xuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcImdyYWNlX2V4cGlyZWRcIilcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGNvbmZpZ3VyZWQgaWRlbnRpdHkgcmVzb2x2ZXIgYWdhaW5zdCB0aGlzIHNlc3Npb24uXG4gICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGlzIHN0b3JlZCBhdCBwYXVzZSB0aW1lIGFuZCBhd2FpdGVkIGF0XG4gICAqIHJlc3VtZSB0aW1lIHNvIHdlIGNhbiByZWplY3QgcmVzdW1lIGF0dGVtcHRzIGZyb20gYSBkaWZmZXJlbnRcbiAgICogYXV0aGVudGljYXRlZCBjYWxsZXIgKHNpZ25lZCBvdXQsIHN3YXBwZWQgdXNlciwgZXhwaXJlZCBjb29raWUpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgX2NhcHR1cmVSZXN1bWVJZGVudGl0eSgpIHtcbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcj8uKClcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZXIgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlcih0aGlzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgc2Vzc2lvbiBpZGVudGl0eSByZXNvbHZlciBmYWlsZWQgYXQgcGF1c2VcIiwgZXJyb3JdKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25EaXNjb25uZWN0YCBvbiBldmVyeSBsaXZlIENvbm5lY3Rpb24gYW5kIENoYW5uZWwgc3ViIHNvXG4gICAqIGFwcHMgY2FuIHBhdXNlIHBlci1pbnN0YW5jZSB3b3JrIHdoaWxlIHRoZSBzZXNzaW9uIGlzIHBhdXNlZC5cbiAgICogRXJyb3JzIGFyZSBsb2dnZWQsIG5vdCByZXRocm93biDigJQgb25lIGJyb2tlbiBoYW5kbGVyIG11c3Qgbm90XG4gICAqIGJsb2NrIHRoZSByZXN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9maXJlT25EaXNjb25uZWN0KCkge1xuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5vbkRpc2Nvbm5lY3Q/LigpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYG9uRGlzY29ubmVjdCBmYWlsZWQgZm9yICR7Y29ubmVjdGlvbi5jb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qge3N1YnNjcmlwdGlvbn0gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN1YnNjcmlwdGlvbi5vbkRpc2Nvbm5lY3Q/LigpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYG9uRGlzY29ubmVjdCBmYWlsZWQgZm9yIGNoYW5uZWwgc3ViICR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYG9uUmVzdW1lYCBvbiBldmVyeSBsaXZlIENvbm5lY3Rpb24gYW5kIENoYW5uZWwgc3ViIGFmdGVyXG4gICAqIGEgc3VjY2Vzc2Z1bCBgc2Vzc2lvbi1yZXN1bWVgIGhhbmRvZmYuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpcmVPblJlc3VtZSgpIHtcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25SZXN1bWU/LigpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYG9uUmVzdW1lIGZhaWxlZCBmb3IgJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7c3Vic2NyaXB0aW9ufSBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3Vic2NyaXB0aW9uLm9uUmVzdW1lPy4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BvblJlc3VtZSBmYWlsZWQgZm9yIGNoYW5uZWwgc3ViICR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBge3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVcIn1gLiBUaGlzIHNlc3Npb24gKHRoZSBuZXdseS1cbiAgICogY3JlYXRlZCBvbmUgd2hvc2Ugc29ja2V0IGp1c3QgY29ubmVjdGVkKSB0cmFuc2ZlcnMgc3RhdGUgZnJvbVxuICAgKiB0aGUgcGF1c2VkIHNlc3Npb24gYW5kIGluc3RydWN0cyB0aGUgY2xpZW50IHZpYVxuICAgKiBgc2Vzc2lvbi1yZXN1bWVkYCBvciBgc2Vzc2lvbi1nb25lYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZVNlc3Npb25SZXN1bWUobWVzc2FnZSkge1xuICAgIGNvbnN0IHJlc3VtZVNlc3Npb25JZCA9IG1lc3NhZ2Uuc2Vzc2lvbklkXG5cbiAgICBpZiAodHlwZW9mIHJlc3VtZVNlc3Npb25JZCAhPT0gXCJzdHJpbmdcIiB8fCAhcmVzdW1lU2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5fZmluZFBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgaWYgKCFwYXVzZWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQXV0aCByZS12ZXJpZnk6IGNvbXBhcmUgdGhlIGZyZXNoIGNhbGxlcidzIGlkZW50aXR5IGFnYWluc3QgdGhlXG4gICAgLy8gb25lIGNhcHR1cmVkIGF0IHBhdXNlLiBNaXNtYXRjaCBtZWFucyBhIGRpZmZlcmVudCB1c2VyIChvciBhXG4gICAgLy8gc2lnbmVkLW91dCBzZXNzaW9uKSBpcyB0cnlpbmcgdG8gcmVjbGFpbSBzdGF0ZSB0aGF0IGlzbid0XG4gICAgLy8gdGhlaXJzIOKAlCBkZXN0cm95IHRoZSBwYXVzZWQgc2Vzc2lvbiBvdXRyaWdodC5cbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcj8uKClcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgcGF1c2VkSWRlbnRpdHkgPSBhd2FpdCBwYXVzZWQuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZVxuICAgICAgbGV0IGZyZXNoSWRlbnRpdHlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IGF3YWl0IHJlc29sdmVyKHRoaXMpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgc2Vzc2lvbiBpZGVudGl0eSByZXNvbHZlciBmYWlsZWQgYXQgcmVzdW1lXCIsIGVycm9yXSlcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAoIWlkZW50aXRpZXNNYXRjaChwYXVzZWRJZGVudGl0eSwgZnJlc2hJZGVudGl0eSkpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuICAgICAgICBwYXVzZWQuX2ZpbmFsaXplR3JhY2VFeHBpcnkoKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgLy8gVHJhbnNmZXIgcmVzdW1hYmxlIHN0YXRlIG9udG8gdGhpcyAobGl2ZSkgc2Vzc2lvbi4gVGhlIHBhdXNlZFxuICAgIC8vIHNlc3Npb24gc2hlbGwgaXMgZGlzY2FyZGVkIGFmdGVyIHRoZSB0cmFuc2Zlci5cbiAgICBmb3IgKGNvbnN0IFtjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb25dIG9mIHBhdXNlZC5fY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3ViSWQsIGVudHJ5XSBvZiBwYXVzZWQuX2NoYW5uZWxTdWJzY3JpcHRpb25zKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNldChzdWJJZCwgZW50cnkpXG4gICAgfVxuXG4gICAgdGhpcy5fbWV0YWRhdGEgPSB7Li4ucGF1c2VkLl9tZXRhZGF0YX1cbiAgICB0aGlzLmRhdGEgPSBwYXVzZWQuZGF0YVxuICAgIHRoaXMuc2Vzc2lvbklkID0gcmVzdW1lU2Vzc2lvbklkXG5cbiAgICAvLyBUcmFuc2ZlciBhbnkgZnJhbWVzIHF1ZXVlZCB3aGlsZSB0aGUgcGF1c2VkIHNlc3Npb24gaGFkIG5vXG4gICAgLy8gc29ja2V0LiBUaGV5IGZsdXNoIEFGVEVSIHNlc3Npb24tcmVzdW1lZCBzbyB0aGUgY2xpZW50IGtub3dzXG4gICAgLy8gd2hpY2ggc2Vzc2lvbiB0aGV5IGJlbG9uZyB0by5cbiAgICBjb25zdCBxdWV1ZWQgPSBwYXVzZWQuX291dGJvdW5kUXVldWUgfHwgW11cblxuICAgIHBhdXNlZC5fb3V0Ym91bmRRdWV1ZSA9IFtdXG4gICAgcGF1c2VkLl9jb25uZWN0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9wYXVzZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLXJlc3VtZWRcIiwgc2Vzc2lvbklkOiByZXN1bWVTZXNzaW9uSWR9KVxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZWQpIHRoaXMuc2VuZEpzb24oYm9keSlcbiAgICBhd2FpdCB0aGlzLl9maXJlT25SZXN1bWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvbkNsb3NlKHJlYXNvbilgIG9uIGV2ZXJ5IGxpdmUgYXBwLWRlZmluZWQgY29ubmVjdGlvbiwgdGhlblxuICAgKiBkcm9wcyB0aGVtIGZyb20gdGhlIHJlZ2lzdHJ5LiBObyBuZXR3b3JrIGZyYW1lIGlzIHNlbnQg4oCUIHRoZVxuICAgKiBzb2NrZXQgaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKlxuICAgKiBAcGFyYW0ge1wic2Vzc2lvbl9kZXN0cm95ZWRcIiB8IFwiZ3JhY2VfZXhwaXJlZFwiIHwgXCJlcnJvclwifSByZWFzb25cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfdGVhcmRvd25Db25uZWN0aW9ucyhyZWFzb24pIHtcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IFsuLi50aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKV1cblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmNsZWFyKClcblxuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiBjb25uZWN0aW9ucykge1xuICAgICAgY29ubmVjdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25DbG9zZShyZWFzb24pXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB0ZWFyIGRvd24gY29ubmVjdGlvbiAke2Nvbm5lY3Rpb24uY29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGB7dHlwZTogXCJjb25uZWN0aW9uLW9wZW5cIn1gIG1lc3NhZ2Ug4oCUIGluc3RhbnRpYXRlcyB0aGVcbiAgICogcmVnaXN0ZXJlZCBjb25uZWN0aW9uIGNsYXNzLCBzdG9yZXMgaXQgb24gYF9jb25uZWN0aW9uc2AsIGFuZFxuICAgKiBmaXJlcyBgb25Db25uZWN0KClgLiBTZW5kcyBgY29ubmVjdGlvbi1vcGVuZWRgIG9uIHN1Y2Nlc3Mgb3JcbiAgICogYGNvbm5lY3Rpb24tZXJyb3JgIG9uIGZhaWx1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uT3BlbihtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uVHlwZSA9IG1lc3NhZ2UuY29ubmVjdGlvblR5cGVcbiAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcyB8fCB7fVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIWNvbm5lY3Rpb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJlcnJvclwiLCBlcnJvcjogXCJjb25uZWN0aW9uLW9wZW4gcmVxdWlyZXMgY29ubmVjdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY29ubmVjdGlvblR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiY29ubmVjdGlvblR5cGUgaXMgcmVxdWlyZWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiQ29ubmVjdGlvbiBpZCBhbHJlYWR5IGluIHVzZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IENvbm5lY3Rpb25DbGFzcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDb25uZWN0aW9uQ2xhc3M/Lihjb25uZWN0aW9uVHlwZSlcblxuICAgIGlmICghQ29ubmVjdGlvbkNsYXNzKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBgVW5rbm93biBjb25uZWN0aW9uIHR5cGU6ICR7Y29ubmVjdGlvblR5cGV9YH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb25DbGFzcyh7Y29ubmVjdGlvbklkLCBwYXJhbXMsIHNlc3Npb246IHRoaXN9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25Db25uZWN0KClcbiAgICAgIH0pXG4gICAgICAvLyBSZWdpc3RlciBvbmx5IGFmdGVyIG9uQ29ubmVjdCByZXNvbHZlcyBzbyBhIGNvbm5lY3Rpb24tbWVzc2FnZVxuICAgICAgLy8gY2FuIG5ldmVyIGJlIHJvdXRlZCB0byBhIHBhcnRpYWxseSBpbml0aWFsaXplZCBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuZWRcIiwgY29ubmVjdGlvbklkfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uICR7Y29ubmVjdGlvblR5cGV9OiR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb25cIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1tZXNzYWdlXCJ9YCBmcm9tIHRoZSBjbGllbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdHlwZW9mIGNvbm5lY3Rpb25JZCA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpIDogbnVsbFxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBcIlVua25vd24gY29ubmVjdGlvbiBpZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byBoYW5kbGUgY29ubmVjdGlvbi1tZXNzYWdlIGZvciAke2Nvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gaGFuZGxlIG1lc3NhZ2VcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1jbG9zZVwifWAgZnJvbSB0aGUgY2xpZW50IOKAlCBmaXJlc1xuICAgKiBgb25DbG9zZShcImNsaWVudF9jbG9zZVwiKWAgYW5kIGNvbmZpcm1zIHdpdGggYGNvbm5lY3Rpb24tY2xvc2VkYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNvbm5lY3Rpb25DbG9zZShtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdHlwZW9mIGNvbm5lY3Rpb25JZCA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpIDogbnVsbFxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gICAgLy8gTWFyayBjbG9zZWQgYmVmb3JlIGZpcmluZyBvbkNsb3NlIHNvIGFwcCBjb2RlIGhvbGRpbmcgdGhlXG4gICAgLy8gaGFuZGxlIHNlZXMgYGlzQ2xvc2VkKCkgPT09IHRydWVgIGFuZCBjYW4ndCByZS1lbnRlciBzZW5kTWVzc2FnZS5cbiAgICBjb25uZWN0aW9uLl9jbG9zZWQgPSB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5vbkNsb3NlKFwiY2xpZW50X2Nsb3NlXCIpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB0ZWFyIGRvd24gY29ubmVjdGlvbiAke2Nvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWNsb3NlZFwiLCBjb25uZWN0aW9uSWQsIHJlYXNvbjogXCJjbGllbnRfY2xvc2VcIn0pXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBge3R5cGU6IFwiY2hhbm5lbC1zdWJzY3JpYmVcIn1gIOKAlCBydW5zIGBjYW5TdWJzY3JpYmUoKWAsXG4gICAqIHJlZ2lzdGVycyB3aXRoIHRoZSBDb25maWd1cmF0aW9uJ3MgZ2xvYmFsIHJvdXRpbmcgcmVnaXN0cnkgb25cbiAgICogc3VjY2VzcywgYW5kIHNlbmRzIGBjaGFubmVsLXN1YnNjcmliZWRgIG9yIGBjaGFubmVsLWVycm9yYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxTdWJzY3JpYmUobWVzc2FnZSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gbWVzc2FnZS5zdWJzY3JpcHRpb25JZFxuICAgIGNvbnN0IGNoYW5uZWxUeXBlID0gbWVzc2FnZS5jaGFubmVsVHlwZVxuICAgIGNvbnN0IHBhcmFtcyA9IG1lc3NhZ2UucGFyYW1zIHx8IHt9XG4gICAgY29uc3QgbGFzdEV2ZW50SWQgPSBtZXNzYWdlLmxhc3RFdmVudElkXG5cbiAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiIHx8ICFzdWJzY3JpcHRpb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJlcnJvclwiLCBlcnJvcjogXCJjaGFubmVsLXN1YnNjcmliZSByZXF1aXJlcyBzdWJzY3JpcHRpb25JZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2hhbm5lbFR5cGUgIT09IFwic3RyaW5nXCIgfHwgIWNoYW5uZWxUeXBlKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiY2hhbm5lbFR5cGUgaXMgcmVxdWlyZWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuaGFzKHN1YnNjcmlwdGlvbklkKSkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLWVycm9yXCIsIHN1YnNjcmlwdGlvbklkLCBtZXNzYWdlOiBcIlN1YnNjcmlwdGlvbiBpZCBhbHJlYWR5IGluIHVzZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IENoYW5uZWxDbGFzcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsQ2xhc3M/LihjaGFubmVsVHlwZSlcblxuICAgIGlmICghQ2hhbm5lbENsYXNzKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IGBVbmtub3duIGNoYW5uZWwgdHlwZTogJHtjaGFubmVsVHlwZX1gfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG5ldyBDaGFubmVsQ2xhc3Moe3N1YnNjcmlwdGlvbklkLCBwYXJhbXMsIHNlc3Npb246IHRoaXN9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBwYXJhbXN9KVxuXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBmYWxzZVxuXG4gICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYWxsb3dlZCA9IEJvb2xlYW4oYXdhaXQgc3Vic2NyaXB0aW9uLmNhblN1YnNjcmliZSgpKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogXCJTdWJzY3JpcHRpb24gbm90IGF1dGhvcml6ZWRcIn0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5zZXQoc3Vic2NyaXB0aW9uSWQsIHtjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9ufSlcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl9yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oY2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbilcblxuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4gYXdhaXQgc3Vic2NyaXB0aW9uLnN1YnNjcmliZWQoKSlcblxuICAgICAgICAvLyBSZXBsYXkgbWlzc2VkIGV2ZW50cyBCRUZPUkUgc2VuZGluZyBjaGFubmVsLXN1YnNjcmliZWQgc29cbiAgICAgICAgLy8gdGhlIGNsaWVudCBrbm93czogZXZlcnl0aGluZyBiZWZvcmUgdGhlIGNvbmZpcm1hdGlvbiBpc1xuICAgICAgICAvLyByZXBsYXllZCwgZXZlcnl0aGluZyBhZnRlciBpcyBsaXZlLlxuICAgICAgICBpZiAodHlwZW9mIGxhc3RFdmVudElkID09PSBcInN0cmluZ1wiICYmIGxhc3RFdmVudElkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZXBsYXlDaGFubmVsRXZlbnRzRm9yU3Vic2NyaXB0aW9uKHtjaGFubmVsVHlwZSwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbn0pXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtc3Vic2NyaWJlZFwiLCBzdWJzY3JpcHRpb25JZH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uSWQpXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3VucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byBzdWJzY3JpYmUgY2hhbm5lbCAke2NoYW5uZWxUeXBlfToke3N1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKS5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIHN1YnNjcmliZVwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5cyBtaXNzZWQgZXZlbnRzIGZyb20gdGhlIHBlcnNpc3RlbnQgZXZlbnQtbG9nIHN0b3JlIGZvciBhXG4gICAqIGNoYW5uZWwgc3Vic2NyaXB0aW9uIHRoYXQgcHJvdmlkZWQgYGxhc3RFdmVudElkYC4gU2VuZHMgZWFjaFxuICAgKiBtaXNzZWQgZXZlbnQgYXMgYSBgY2hhbm5lbC1tZXNzYWdlYCB3aXRoIGByZXBsYXllZDogdHJ1ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbFR5cGUgLSBDaGFubmVsIHR5cGUgbmFtZSAoZXZlbnQtbG9nIGtleSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhc3RFdmVudElkIC0gQ2xpZW50J3MgbGFzdC1zZWVuIGV2ZW50IGlkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHR9IGFyZ3Muc3Vic2NyaXB0aW9uIC0gTGl2ZSBzdWJzY3JpcHRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3JlcGxheUNoYW5uZWxFdmVudHNGb3JTdWJzY3JpcHRpb24oe2NoYW5uZWxUeXBlLCBsYXN0RXZlbnRJZCwgc3Vic2NyaXB0aW9ufSkge1xuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmF3YWl0UGVuZGluZ0Jyb2FkY2FzdHMoKVxuXG4gICAgY29uc3QgY2hlY2twb2ludCA9IGF3YWl0IHN0b3JlLmdldEV2ZW50QnlJZCh7Y2hhbm5lbDogY2hhbm5lbFR5cGUsIGlkOiBsYXN0RXZlbnRJZH0pXG5cbiAgICBpZiAoIWNoZWNrcG9pbnQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgICB0eXBlOiBcImNoYW5uZWwtcmVwbGF5LWdhcFwiLFxuICAgICAgICBzdWJzY3JpcHRpb25JZDogc3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkLFxuICAgICAgICBsYXN0RXZlbnRJZFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNlaWxpbmcgPSBhd2FpdCBzdG9yZS5sYXRlc3RTZXF1ZW5jZShjaGFubmVsVHlwZSlcblxuICAgIGlmICghY2VpbGluZyB8fCBjZWlsaW5nIDw9IGNoZWNrcG9pbnQuc2VxdWVuY2UpIHJldHVyblxuXG4gICAgY29uc3QgZXZlbnRzID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRzQWZ0ZXIoe1xuICAgICAgY2hhbm5lbDogY2hhbm5lbFR5cGUsXG4gICAgICBzZXF1ZW5jZTogY2hlY2twb2ludC5zZXF1ZW5jZSxcbiAgICAgIHVwVG9TZXF1ZW5jZTogY2VpbGluZ1xuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKHN1YnNjcmlwdGlvbi5pc0Nsb3NlZCgpKSBicmVha1xuXG4gICAgICBzdWJzY3JpcHRpb24uc2VuZE1lc3NhZ2UoZXZlbnQucGF5bG9hZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBge3R5cGU6IFwiY2hhbm5lbC11bnN1YnNjcmliZVwifWAgZnJvbSB0aGUgY2xpZW50IOKAlCBjYWxsc1xuICAgKiBgdW5zdWJzY3JpYmVkKClgIGFuZCBzZW5kcyBgY2hhbm5lbC11bnN1YnNjcmliZWRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1lc3NhZ2VcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFVuc3Vic2NyaWJlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBzdWJzY3JpcHRpb25JZCA9IG1lc3NhZ2Uuc3Vic2NyaXB0aW9uSWRcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uSWQgIT09IFwic3RyaW5nXCIpIHJldHVyblxuXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQoc3Vic2NyaXB0aW9uSWQpXG5cbiAgICBpZiAoIWVudHJ5KSByZXR1cm5cblxuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25JZClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3VucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGVudHJ5LmNoYW5uZWxUeXBlLCBlbnRyeS5zdWJzY3JpcHRpb24pXG4gICAgZW50cnkuc3Vic2NyaXB0aW9uLl9jbG9zZWQgPSB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IGVudHJ5LnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZWQoKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdW5zdWJzY3JpYmUgY2hhbm5lbCAke2VudHJ5LmNoYW5uZWxUeXBlfToke3N1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVkXCIsIHN1YnNjcmlwdGlvbklkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgdW5zdWJzY3JpYmVkKClgIG9uIGV2ZXJ5IGxpdmUgY2hhbm5lbC12MiBzdWJzY3JpcHRpb24sXG4gICAqIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBDb25maWd1cmF0aW9uJ3MgZ2xvYmFsIHJlZ2lzdHJ5LCBhbmRcbiAgICogZHJvcHMgdGhlIHNlc3Npb24ncyBvd24gbWFwLiBObyBuZXR3b3JrIGZyYW1lcyDigJQgdGhlIHNvY2tldFxuICAgKiBpcyBhbHJlYWR5IGdvaW5nIGF3YXkuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKSB7XG4gICAgY29uc3QgZW50cmllcyA9IFsuLi50aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKV1cblxuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcblxuICAgIGZvciAoY29uc3Qge2NoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb259IG9mIGVudHJpZXMpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oY2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbilcbiAgICAgIHN1YnNjcmlwdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmVkKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjaGFubmVsLXYyICR7Y2hhbm5lbFR5cGV9OiR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfdGVhcmRvd25DaGFubmVsKCkge1xuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiB0aGlzLmNoYW5uZWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbClcbiAgICB9XG4gICAgdGhpcy5jaGFubmVscy5jbGVhcigpXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldENoYW5uZWx9IGNoYW5uZWwgLSBDaGFubmVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duU2luZ2xlQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2hhbm5lbFRlbmFudHMuZ2V0KGNoYW5uZWwpXG5cbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGNoYW5uZWw/LnVuc3Vic2NyaWJlZD8uKClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byB0ZWFyZG93biB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWwpXG5cbiAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb25DaGFubmVsIG9mIHN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoc3Vic2NyaXB0aW9uQ2hhbm5lbCk/LmRlbGV0ZShjaGFubmVsKVxuXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChzdWJzY3JpcHRpb25DaGFubmVsKT8uc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZGVsZXRlKHN1YnNjcmlwdGlvbkNoYW5uZWwpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5kZWxldGUoY2hhbm5lbClcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxUZW5hbnRzLmRlbGV0ZShjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0Q2hhbm5lbCB8IHVuZGVmaW5lZH0gY2hhbm5lbCAtIENoYW5uZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gdGVuYW50IC0gVGVuYW50IGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbCwgdGVuYW50KSB7XG4gICAgaWYgKCFjaGFubmVsKSByZXR1cm5cblxuICAgIHRoaXMuY2hhbm5lbHMuYWRkKGNoYW5uZWwpXG4gICAgdGhpcy5jaGFubmVsVGVuYW50cy5zZXQoY2hhbm5lbCwgdGVuYW50KVxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY2hhbm5lbD8uc3Vic2NyaWJlZD8uKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfd2l0aENvbm5lY3Rpb25zKGNhbGxiYWNrKSB7XG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2NoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT59fSBhcmdzIC0gU3Vic2NyaXB0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmlwdGlvbih7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtc30pIHtcbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXI/LigpXG5cbiAgICBpZiAoIXJlc29sdmVyKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlVGVuYW50KHtjaGFubmVsLCBwYXJhbXN9KVxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVyKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjoge2NoYW5uZWwsIHBhcmFtc30sXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsLCBlcnJvcjogXCJTdWJzY3JpcHRpb24gcmVqZWN0ZWRcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxJbnN0YW5jZSA9IHR5cGVvZiByZXNvbHZlZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gbmV3IHJlc29sdmVkKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICBsYXN0RXZlbnRJZCxcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbkNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uUGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgICA6IHJlc29sdmVkXG5cbiAgICAgIGlmIChjaGFubmVsSW5zdGFuY2UgJiYgIShjaGFubmVsSW5zdGFuY2UgaW5zdGFuY2VvZiBXZWJzb2NrZXRDaGFubmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvbHZlZCB3ZWJzb2NrZXQgY2hhbm5lbCBtdXN0IGV4dGVuZCBXZWJzb2NrZXRDaGFubmVsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsSW5zdGFuY2UsIHRlbmFudClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXCJXZWJzb2NrZXQgY2hhbm5lbCBzdWJzY3JpcHRpb24gZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIGVycm9yOiBcIlN1YnNjcmlwdGlvbiByZWplY3RlZFwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBJbnRlcm5hbCBjaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmxhc3RFdmVudElkIC0gTGFzdCByZWNlaXZlZCBldmVudCBpZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3Vic2NyaXB0aW9uQ2hhbm5lbCAtIENsaWVudC1mYWNpbmcgY2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWR9IGFyZ3Muc3Vic2NyaXB0aW9uUGFyYW1zIC0gQ2xpZW50LWZhY2luZyBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGZhbHNlIHwge2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn0gfCBudWxsPn0gLSBSZXBsYXkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBfcHJlcGFyZVJlcGxheVN0YXRlKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgc3Vic2NyaXB0aW9uQ2hhbm5lbCwgc3Vic2NyaXB0aW9uUGFyYW1zfSkge1xuICAgIGlmICghbGFzdEV2ZW50SWQpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcbiAgICBjb25zdCBjaGVja3BvaW50ID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRCeUlkKHtjaGFubmVsLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsOiBzdWJzY3JpcHRpb25DaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zOiBzdWJzY3JpcHRpb25QYXJhbXMsIHR5cGU6IFwicmVwbGF5LWdhcFwifSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBidWZmZXJlZDogZmFsc2UsXG4gICAgICBjZWlsaW5nU2VxdWVuY2U6IChhd2FpdCBzdG9yZS5sYXRlc3RTZXF1ZW5jZShjaGFubmVsKSkgfHwgY2hlY2twb2ludC5zZXF1ZW5jZSxcbiAgICAgIGNoZWNrcG9pbnRTZXF1ZW5jZTogY2hlY2twb2ludC5zZXF1ZW5jZSxcbiAgICAgIHJlcGxheWluZzogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn19IGFyZ3MucmVwbGF5U3RhdGUgLSBSZXBsYXkgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcmVwbGF5IGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzKHtjaGFubmVsLCByZXBsYXlTdGF0ZX0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcbiAgICBjb25zdCBldmVudHMgPSBhd2FpdCBzdG9yZS5nZXRFdmVudHNBZnRlcih7XG4gICAgICBjaGFubmVsLFxuICAgICAgc2VxdWVuY2U6IHJlcGxheVN0YXRlLmNoZWNrcG9pbnRTZXF1ZW5jZSxcbiAgICAgIHVwVG9TZXF1ZW5jZTogcmVwbGF5U3RhdGUuY2VpbGluZ1NlcXVlbmNlXG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFdmVudChjaGFubmVsLCBldmVudC5wYXlsb2FkLCB7XG4gICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBldmVudElkOiBldmVudC5pZCxcbiAgICAgICAgcmVwbGF5ZWQ6IHRydWUsXG4gICAgICAgIHNlcXVlbmNlOiBldmVudC5zZXF1ZW5jZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn19IHJlcGxheVN0YXRlIC0gUmVwbGF5IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGJ1ZmZlcmVkIGV2ZW50cyBhcmUgZmx1c2hlZC5cbiAgICovXG4gIGFzeW5jIF9maW5pc2hSZXBsYXlTdGF0ZShjaGFubmVsLCByZXBsYXlTdGF0ZSkge1xuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuXG4gICAgcmVwbGF5U3RhdGUucmVwbGF5aW5nID0gZmFsc2VcbiAgICB0aGlzLmNoYW5uZWxSZXBsYXlTdGF0ZXMuZGVsZXRlKGNoYW5uZWwpXG5cbiAgICBpZiAoIXJlcGxheVN0YXRlLmJ1ZmZlcmVkKSByZXR1cm5cblxuICAgIGNvbnN0IGxpdmVFdmVudHMgPSBhd2FpdCBzdG9yZS5nZXRFdmVudHNBZnRlcih7XG4gICAgICBjaGFubmVsLFxuICAgICAgc2VxdWVuY2U6IHJlcGxheVN0YXRlLmNlaWxpbmdTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGxpdmVFdmVudHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KGNoYW5uZWwsIGV2ZW50LnBheWxvYWQsIHtcbiAgICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmlkLFxuICAgICAgICBzZXF1ZW5jZTogZXZlbnQuc2VxdWVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2NoYW5uZWw/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+fX0gYXJncyAtIFRlbmFudCByZXNvbHV0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+fSAtIFJlc29sdmVkIHRlbmFudC5cbiAgICovXG4gIGFzeW5jIF9yZXNvbHZlVGVuYW50KHtjaGFubmVsLCBwYXJhbXN9KSB7XG4gICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IHRoaXMudXBncmFkZVJlcXVlc3Q/LnBhcmFtcz8uKClcbiAgICBjb25zdCBtZXJnZWRQYXJhbXMgPSB7XG4gICAgICAuLi4ocmVxdWVzdFBhcmFtcyAmJiB0eXBlb2YgcmVxdWVzdFBhcmFtcyA9PT0gXCJvYmplY3RcIiA/IHJlcXVlc3RQYXJhbXMgOiB7fSksXG4gICAgICAuLi4ocGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgPyBwYXJhbXMgOiB7fSlcbiAgICB9XG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+fSAqLyAodGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQoe1xuICAgICAgcGFyYW1zOiBtZXJnZWRQYXJhbXMsXG4gICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgcmVzcG9uc2U6IHVuZGVmaW5lZCxcbiAgICAgIHN1YnNjcmlwdGlvbjogY2hhbm5lbCA/IHtjaGFubmVsLCBwYXJhbXN9IDogdW5kZWZpbmVkXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIC0gTWFzay5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBUaGUgdW5tYXNrIHBheWxvYWQuXG4gICAqL1xuICBfdW5tYXNrUGF5bG9hZChwYXlsb2FkLCBtYXNrKSB7XG4gICAgLyoqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgY29uc3QgcmVzdWx0ID0gQnVmZmVyLmFsbG9jKHBheWxvYWQubGVuZ3RoKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBwYXlsb2FkW2ldIF4gbWFza1tpICUgNF1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBhc3luYyBfcnVuTWVzc2FnZUhhbmRsZXJPcGVuKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25PcGVuID0gaGFuZGxlciA/IGhhbmRsZXIub25PcGVuIDogbnVsbFxuXG4gICAgICBpZiAob25PcGVuKSB7XG4gICAgICAgIGF3YWl0IG9uT3Blbih7c2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBvcGVuIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIEluY29taW5nIHdlYnNvY2tldCBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbk1lc3NhZ2UgPSBoYW5kbGVyID8gaGFuZGxlci5vbk1lc3NhZ2UgOiBudWxsXG5cbiAgICAgIGlmIChvbk1lc3NhZ2UpIHtcbiAgICAgICAgYXdhaXQgb25NZXNzYWdlKHttZXNzYWdlLCBzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uRXJyb3IgPSBoYW5kbGVyID8gaGFuZGxlci5vbkVycm9yIDogbnVsbFxuXG4gICAgICBpZiAob25FcnJvcikge1xuICAgICAgICBhd2FpdCBvbkVycm9yKHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLCBzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uQ2xvc2UgPSBoYW5kbGVyID8gaGFuZGxlci5vbkNsb3NlIDogbnVsbFxuXG4gICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICBhd2FpdCBvbkNsb3NlKHtzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IGNsb3NlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyfSBoYW5kbGVyIC0gSGFuZGxlciBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRNZXNzYWdlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IGhhbmRsZXJcbiAgICB2b2lkIHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gIH1cblxuICBhc3luYyBfcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2VcblxuICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBmYWxzZVxuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAvLyBJbnN0YWxsIGhhbmRsZXIgYW5kIGRyYWluIG9uT3BlbiBiZWZvcmUgcmVwbGF5aW5nIHF1ZXVlZFxuICAgICAgICAvLyBtZXNzYWdlcy4gc2V0TWVzc2FnZUhhbmRsZXIoKSBmaXJlcyBvbk9wZW4gYXMgZmlyZS1hbmQtZm9yZ2V0O1xuICAgICAgICAvLyBhd2FpdGluZyBfcnVuTWVzc2FnZUhhbmRsZXJPcGVuKCkgZGlyZWN0bHkgaGVyZSBjbG9zZXMgdGhlXG4gICAgICAgIC8vIHJhY2Ugd2hlcmUgcXVldWVkIHN1YnNjcmliZS9jb25uZWN0aW9uLSogZnJhbWVzIHdvdWxkXG4gICAgICAgIC8vIGRpc3BhdGNoIHdoaWxlIGFuIGFzeW5jIG9uT3BlbiBpcyBzdGlsbCBzZXR0aW5nIHVwIHNlc3Npb25cbiAgICAgICAgLy8gc3RhdGUuXG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gICAgICAgIGF3YWl0IHRoaXMuX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXI6IHR5cGVvZiBoYW5kbGVyLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgcmVzb2x2ZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IGZhbHNlXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UgPSB1bmRlZmluZWRcbiAgICBhd2FpdCB0aGlzLl9mbHVzaFF1ZXVlZE1lc3NhZ2VzKHt1c2VIYW5kbGVyOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7dXNlSGFuZGxlcjogYm9vbGVhbn19IGFyZ3MgLSBBcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXJ9KSB7XG4gICAgaWYgKHRoaXMubWVzc2FnZVF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBxdWV1ZWQgPSB0aGlzLm1lc3NhZ2VRdWV1ZS5zbGljZSgpXG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXVxuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHF1ZXVlZCkge1xuICAgICAgaWYgKHVzZUhhbmRsZXIgJiYgdGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
1477
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxnQkFBZ0IsTUFBTSx5QkFBeUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsc0NBQXNDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV0RixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyx3RUFBd0U7QUFDeEUsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFFdkMsbUVBQW1FO0FBQ25FLE1BQU0sc0NBQXNDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7QUFFL0QsNkRBQTZEO0FBQzdELE1BQU0sMENBQTBDLEdBQUcsSUFBSSxDQUFBO0FBRXZEOztHQUVHO0FBRUg7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPO0lBQy9CLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXO1FBQ2pDLENB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QUMsVUFBVSxFQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU07UUFFMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUV0QixLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzdCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDL0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJub2RlOmNyeXB0b1wiXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBSZXF1ZXN0UnVubmVyIGZyb20gXCIuL3JlcXVlc3QtcnVubmVyLmpzXCJcbmltcG9ydCBXZWJzb2NrZXRSZXF1ZXN0IGZyb20gXCIuL3dlYnNvY2tldC1yZXF1ZXN0LmpzXCJcbmltcG9ydCBXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge3dlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9ufSBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50LWxvZy1zdG9yZS5qc1wiXG5cbmNvbnN0IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSA9IDB4ODBcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfQ09OVElOVUFUSU9OID0gMHgwXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1RFWFQgPSAweDFcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfQklOQVJZID0gMHgyXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFID0gMHg4XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BJTkcgPSAweDlcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfUE9ORyA9IDB4QVxuXG4vKiogQ2FwIG9uIHRoZSBwYXVzZWQgb3V0Ym91bmQgcXVldWU7IG9sZGVzdCBmcmFtZXMgZHJvcCBvbiBvdmVyZmxvdy4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9QQVVTRURfUVVFVUVfQ0FQID0gMTAwMFxuXG4vKiogQ2FwIG9uIHRvdGFsIGJ5dGVzIGJ1ZmZlcmVkIGZvciBhIHNpbmdsZSBmcmFnbWVudGVkIG1lc3NhZ2UuICovXG5jb25zdCBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFUyA9IDE2ICogMTAyNCAqIDEwMjRcblxuLyoqIENhcCBvbiBmcmFnbWVudCBjb3VudCBmb3IgYSBzaW5nbGUgZnJhZ21lbnRlZCBtZXNzYWdlLiAqL1xuY29uc3QgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfRlJBR01FTlRTID0gMTAyNFxuXG4vKipcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn0gfCB7dHlwZTogXCJtZXRhZGF0YVwiLCBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pn0gfCB7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogdW5rbm93biwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgbWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZ30gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn0gfCBudWxsfSAtIFN1YnNjcmliZSBtZXNzYWdlIHdoZW4gbWF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gc3Vic2NyaWJlTWVzc2FnZShtZXNzYWdlKSB7XG4gIHJldHVybiBtZXNzYWdlLnR5cGUgPT09IFwic3Vic2NyaWJlXCJcbiAgICA/IC8qKiBAdHlwZSB7e3R5cGU6IFwic3Vic2NyaWJlXCIsIGNoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT59fSAqLyAobWVzc2FnZSlcbiAgICA6IG51bGxcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gUmF3IHdlYnNvY2tldCBtZXNzYWdlLlxuICogQHJldHVybnMge3t0eXBlPzogXCJyZXF1ZXN0XCIsIGJvZHk/OiB1bmtub3duLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgYW55PiwgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLCBtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nfSB8IG51bGx9IC0gUmVxdWVzdCBtZXNzYWdlIHdoZW4gbWF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSkge1xuICBpZiAobWVzc2FnZS50eXBlICYmIG1lc3NhZ2UudHlwZSAhPT0gXCJyZXF1ZXN0XCIpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7e3R5cGU/OiBcInJlcXVlc3RcIiwgYm9keT86IHVua25vd24sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9fSAqLyAobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gaWRlbnRpdHkgdmFsdWVzIGZyb20gYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC5cbiAqIE51bGxpc2ggdmFsdWVzIGNvbXBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciBidXQgbm90IHRvIGEgcmVhbCBpZGVudGl0eS5cbiAqIFBsYWluIG9iamVjdHMgYXJlIGNvbXBhcmVkIHZpYSBKU09OIHJvdW5kLXRyaXAgc28gYXBwcyBjYW4gcmV0dXJuIGFcbiAqIGB7dXNlcklkLCB0ZW5hbnRJZH1gLXN0eWxlIG9iamVjdCB3aXRob3V0IGJ1aWxkaW5nIHRoZWlyIG93biBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYSAtIFBhdXNlZC10aW1lIGlkZW50aXR5LlxuICogQHBhcmFtIHthbnl9IGIgLSBSZXN1bWUtdGltZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgd2hlbiB0aGUgdHdvIGlkZW50aXRpZXMgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgY2FsbGVyLlxuICovXG5mdW5jdGlvbiBpZGVudGl0aWVzTWF0Y2goYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWVcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpID09PSBKU09OLnN0cmluZ2lmeShiKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50V2Vic29ja2V0U2Vzc2lvbiB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBzdWJzY3JpcHRpb25zID0gbmV3IFNldCgpXG4gIGNoYW5uZWxzID0gbmV3IFNldCgpXG4gIHN1YnNjcmlwdGlvbkhhbmRsZXJzID0gbmV3IE1hcCgpXG4gIGhhbmRsZXJTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG4gIGNoYW5uZWxUZW5hbnRzID0gbmV3IE1hcCgpXG4gIGNoYW5uZWxSZXBsYXlTdGF0ZXMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZVtdfSAqL1xuICBtZXNzYWdlUXVldWUgPSBbXVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSBbYXJncy51cGdyYWRlUmVxdWVzdF0gLSBJbml0aWFsIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlcn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJdIC0gT3B0aW9uYWwgcmF3IG1lc3NhZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkPn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJQcm9taXNlXSAtIE9wdGlvbmFsIHJhdyBtZXNzYWdlIGhhbmRsZXIgcHJvbWlzZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnQsIGNvbmZpZ3VyYXRpb24sIHVwZ3JhZGVSZXF1ZXN0LCBtZXNzYWdlSGFuZGxlciwgbWVzc2FnZUhhbmRsZXJQcm9taXNlfSkge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy51cGdyYWRlUmVxdWVzdCA9IHVwZ3JhZGVSZXF1ZXN0XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UgPSBtZXNzYWdlSGFuZGxlclByb21pc2VcbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IEJvb2xlYW4obWVzc2FnZUhhbmRsZXJQcm9taXNlKVxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuX21ldGFkYXRhID0ge31cblxuICAgIC8qKlxuICAgICAqIExvbmctbGl2ZWQgcGVyLXNlc3Npb24gc3RhdGUgYmFnLiBTdGFibGUgYWNyb3NzIHJlY29ubmVjdHMgb25jZVxuICAgICAqIGdyYWNlLXBlcmlvZCByZXN1bXB0aW9uIGxhbmRzIGluIFBoYXNlIDI7IHRvZGF5IGl0IGp1c3QgbGl2ZXNcbiAgICAgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICAgKi9cbiAgICB0aGlzLmRhdGEgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY29ubmVjdGlvbi5qc1wiKS5kZWZhdWx0Pn0gKi9cbiAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7Y2hhbm5lbFR5cGU6IHN0cmluZywgc3Vic2NyaXB0aW9uOiBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fT59ICovXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZCBhc3NpZ25lZCB0byB0aGlzIHNlc3Npb24gb24gZmlyc3QgY29ubmVjdC4gU2VudCB0byB0aGVcbiAgICAgKiBjbGllbnQgdmlhIGBzZXNzaW9uLWVzdGFibGlzaGVkYDsgdGhlIGNsaWVudCBlY2hvZXMgaXQgYmFjayB2aWFcbiAgICAgKiBgc2Vzc2lvbi1yZXN1bWVgIGFmdGVyIGEgV1MgZHJvcCB0byByZWF0dGFjaCB0byB0aGlzIHNlc3Npb25cbiAgICAgKiB3aXRoaW4gdGhlIGdyYWNlIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc2Vzc2lvbklkID0gcmFuZG9tVVVJRCgpXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBhZnRlciBgX2hhbmRsZUNsb3NlYCBwYXVzZXMgaW5zdGVhZCBvZiB0ZWFyaW5nIGRvd24uICovXG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7YW55W119IC0gZnJhbWVzIHByb2R1Y2VkIHdoaWxlIHBhdXNlZDsgZmx1c2hlZCBvbiByZXN1bWUuICovXG4gICAgdGhpcy5fb3V0Ym91bmRRdWV1ZSA9IFtdXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgdGhpcy5zb2NrZXQgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUYWlsIG9mIGEgcGVyLXNlc3Npb24gcHJvbWlzZSBjaGFpbiB0aGF0IHNlcmlhbGl6ZXMgbWVzc2FnZVxuICAgICAqIGhhbmRsaW5nLiBQcmV2ZW50cyByYWNlcyB3aGVyZSBtZXNzYWdlIEIgcmVhZHMgYHNlc3Npb24uZGF0YWBcbiAgICAgKiBiZWZvcmUgbWVzc2FnZSBBJ3MgaGFuZGxlciBmaW5pc2hlcyB3cml0aW5nIGl0IChlLmcuIGFcbiAgICAgKiBjb25uZWN0aW9uLW1lc3NhZ2Ugc2V0dGluZyB0aGUgbG9jYWxlIHZzLiBhIHN1YnNlcXVlbnQgcmVxdWVzdFxuICAgICAqIHdob3NlIGFyb3VuZFJlcXVlc3Qgd3JhcHBlciByZWFkcyBpdCkuXG4gICAgICogQHR5cGUge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgdGhpcy5fbWVzc2FnZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXV0aCBpZGVudGl0eSBjYXB0dXJlZCBhdCBwYXVzZVxuICAgICAqIHRpbWUgYnkgYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC4gQXdhaXRlZCBhdCByZXN1bWVcbiAgICAgKiB0aW1lIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgZnJlc2ggY2FsbGVyJ3MgaWRlbnRpdHkuIFVuZGVmaW5lZFxuICAgICAqIG9uIGEgbGl2ZSAobm9uLXBhdXNlZCkgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTxhbnk+IHwgdW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHRoaXMuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZSA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogQWNjdW11bGF0ZXMgcGF5bG9hZHMgZm9yIGEgZnJhZ21lbnRlZCB3ZWJzb2NrZXQgbWVzc2FnZSBwZXJcbiAgICAgKiBSRkMgNjQ1NS4gTm9uLW51bGwgd2hpbGUgbWlkLWZyYWdtZW50OyBjbGVhcmVkIHdoZW4gdGhlIGZyYW1lXG4gICAgICogd2l0aCBGSU49MSBjb21wbGV0ZXMgYW5kIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQuXG4gICAgICogQHR5cGUge0J1ZmZlcltdIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBPcGNvZGUgKFRFWFQvQklOQVJZKSBjYXB0dXJlZCBmcm9tIHRoZSBmaXJzdCBmcmFtZSBvZiBhXG4gICAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBDb250aW51YXRpb24gZnJhbWVzIChvcGNvZGUgMCkgaW5oZXJpdCBpdFxuICAgICAqIGF0IHJlYXNzZW1ibHkgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogUnVubmluZyBieXRlIHRvdGFsIGZvciBgX2ZyYWdtZW50ZWRQYXlsb2Fkc2AuIFVzZWQgdG8gZW5mb3JjZVxuICAgICAqIGBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU2Agc28gYSBwZWVyIGNhbm5vdFxuICAgICAqIGV4aGF1c3QgbWVtb3J5IGJ5IHN0cmVhbWluZyBub24tZmluYWwgZnJhZ21lbnRzIGluZGVmaW5pdGVseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgY2xpZW50IGl0cyBzZXNzaW9uSWQgKyBncmFjZSB3aW5kb3cuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudGAgYWZ0ZXIgdGhlIFdTIHVwZ3JhZGUgY29tcGxldGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNlbmRTZXNzaW9uRXN0YWJsaXNoZWQoKSB7XG4gICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICB0eXBlOiBcInNlc3Npb24tZXN0YWJsaXNoZWRcIixcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICBncmFjZVNlY29uZHM6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uR3JhY2VTZWNvbmRzPy4oKSB8fCAzMDBcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbG9zZWQgY29ubmVjdGlvbiBmcm9tIHRoZSBzZXNzaW9uIHJlZ2lzdHJ5LiBDYWxsZWQgYnlcbiAgICogYFZlbG9jaW91c1dlYnNvY2tldENvbm5lY3Rpb24uY2xvc2UoKWAgYWZ0ZXIgaXQgc2VuZHMgdGhlIGZpbmFsXG4gICAqIGBjb25uZWN0aW9uLWNsb3NlZGAgZnJhbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uSWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uSWQpIHtcbiAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIENsaWVudC1wcm92aWRlZCBtZXRhZGF0YSAoZGVmZW5zaXZlIGNvcHkpLiAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gey4uLnRoaXMuX21ldGFkYXRhfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgd2hpbGUgdGhlIHNlc3Npb24gaXMgaW4gdGhlIHBhdXNlZC9ncmFjZSByZWdpc3RyeS4gKi9cbiAgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdXNlZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRTdWJzY3JpcHRpb24oY2hhbm5lbCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY2hhbm5lbClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgaXQgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25EYXRhKGRhdGEpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBkYXRhXSlcbiAgICB0aGlzLl9wcm9jZXNzQnVmZmVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHthbnl9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7e2NyZWF0ZWRBdD86IHN0cmluZywgZXZlbnRJZD86IHN0cmluZywgcmVwbGF5ZWQ/OiBib29sZWFuLCBzZXF1ZW5jZT86IG51bWJlcn19IFtvcHRpb25zXSAtIEV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEV2ZW50KGNoYW5uZWwsIHBheWxvYWQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGNoYW5uZWxIYW5kbGVycyA9IHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpXG4gICAgY29uc3QgaGFzQ2hhbm5lbEhhbmRsZXJzID0gQm9vbGVhbihjaGFubmVsSGFuZGxlcnMgJiYgY2hhbm5lbEhhbmRsZXJzLnNpemUgPiAwKVxuICAgIGNvbnN0IHJlcGxheVN0YXRlID0gdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmdldChjaGFubmVsKVxuXG4gICAgaWYgKHJlcGxheVN0YXRlPy5yZXBsYXlpbmcgJiYgIW9wdGlvbnMucmVwbGF5ZWQpIHtcbiAgICAgIHJlcGxheVN0YXRlLmJ1ZmZlcmVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSAmJiAhaGFzQ2hhbm5lbEhhbmRsZXJzKSByZXR1cm5cblxuICAgIGlmIChoYXNDaGFubmVsSGFuZGxlcnMpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oY2hhbm5lbEhhbmRsZXJzKS5tYXAoYXN5bmMgKGhhbmRsZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGVuYW50ID0gdGhpcy5jaGFubmVsVGVuYW50cy5nZXQoaGFuZGxlcilcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5yZWNlaXZlZEJyb2FkY2FzdCh7XG4gICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgIGV2ZW50SWQ6IG9wdGlvbnMuZXZlbnRJZCxcbiAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICAgICAgICAgIHNlcXVlbmNlOiBvcHRpb25zLnNlcXVlbmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICBldmVudElkOiBvcHRpb25zLmV2ZW50SWQsXG4gICAgICBwYXlsb2FkLFxuICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICBzZXF1ZW5jZTogb3B0aW9ucy5zZXF1ZW5jZSxcbiAgICAgIHR5cGU6IFwiZXZlbnRcIlxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVDaGFubmVsKCkge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5fcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpXG5cbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgIGlmICghcmVzb2x2ZXIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe30pXG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIoe1xuICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7Y2xpZW50OiB0aGlzLmNsaWVudCwgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LCB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAoY2hhbm5lbCAmJiAhKGNoYW5uZWwgaW5zdGFuY2VvZiBXZWJzb2NrZXRDaGFubmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvbHZlZCB3ZWJzb2NrZXQgY2hhbm5lbCBtdXN0IGV4dGVuZCBXZWJzb2NrZXRDaGFubmVsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsLCB0ZW5hbnQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBpbml0aWFsaXplIHdlYnNvY2tldCBjaGFubmVsXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGNsaWVudCAtIENsaWVudCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2VuZEdvb2RieWUoY2xpZW50KSB7XG4gICAgY29uc3QgZnJhbWUgPSBCdWZmZXIuZnJvbShbV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9DTE9TRSwgMHgwMF0pXG5cbiAgICBjbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgZnJhbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAvLyBTZXJpYWxpemUgcGVyLXNlc3Npb246IGNoYWluIG9udG8gYF9tZXNzYWdlQ2hhaW5gIHNvIG1lc3NhZ2VzXG4gICAgLy8gYXJlIHByb2Nlc3NlZCBvbmUgYXQgYSB0aW1lLiBXaXRob3V0IHRoaXMsIGZpcmUtYW5kLWZvcmdldFxuICAgIC8vIGRpc3BhdGNoIGZyb20gYF9wcm9jZXNzQnVmZmVyYCBsZXRzIG1lc3NhZ2UgQiByZWFkXG4gICAgLy8gYHNlc3Npb24uZGF0YWAgYmVmb3JlIEEgaGFzIGZpbmlzaGVkIHdyaXRpbmcgaXQuXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLl9tZXNzYWdlQ2hhaW5cbiAgICBjb25zdCBuZXh0ID0gcHJldmlvdXMudGhlbigoKSA9PiB0aGlzLl9kaXNwYXRjaE1lc3NhZ2UobWVzc2FnZSkpXG5cbiAgICB0aGlzLl9tZXNzYWdlQ2hhaW4gPSBuZXh0LmNhdGNoKCgpID0+IHt9KVxuICAgIGF3YWl0IG5leHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Rpc3BhdGNoTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRBcm91bmRSZXF1ZXN0Py4oKVxuXG4gICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgIGF3YWl0IHdyYXBwZXIodGhpcywgKCkgPT4gdGhpcy5faGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5faGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpXG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdHVhbCBtZXNzYWdlIGRpc3BhdGNoLCBleHRyYWN0ZWQgc29cbiAgICogYGNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0QXJvdW5kUmVxdWVzdCgpYCBjYW4gd3JhcCBpdCBpbiBhbnlcbiAgICogcGVyLXJlcXVlc3QgY29udGV4dCAoQXN5bmNMb2NhbFN0b3JhZ2UsIHRyYWNpbmcsIGV0Yy4pLlxuICAgKlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUaGUgbWVzc2FnZUhhbmRsZXIgc2hvcnQtY2lyY3VpdHMgZGVmYXVsdCByb3V0aW5nIG9ubHkgd2hlbiB0aGVcbiAgICAvLyBhcHAgYWN0dWFsbHkgZGVjbGFyZWQgYW4gYG9uTWVzc2FnZWAgaG9vay4gQXBwcyB0aGF0IG9ubHkgd2FudFxuICAgIC8vIHNlc3Npb24tbGlmZWN5Y2xlIHRyYWNraW5nIChgb25PcGVuYC9gb25DbG9zZWApIHN0aWxsIG5lZWQgdGhlXG4gICAgLy8gYnVpbHQtaW4gc3Vic2NyaWJlL2Nvbm5lY3Rpb24vY2hhbm5lbC1zdWJzY3JpYmUgcm91dGluZyBiZWxvdyxcbiAgICAvLyBvdGhlcndpc2UgZXZlcnkgaW5jb21pbmcgbWVzc2FnZSBpcyBzaWxlbnRseSBkcm9wcGVkLlxuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyICYmIHR5cGVvZiB0aGlzLm1lc3NhZ2VIYW5kbGVyLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmliZVBheWxvYWQgPSBzdWJzY3JpYmVNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICBpZiAoc3Vic2NyaWJlUGF5bG9hZCkge1xuICAgICAgY29uc3Qge2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9ID0gc3Vic2NyaWJlUGF5bG9hZFxuXG4gICAgICBpZiAoIWNoYW5uZWwpIHRocm93IG5ldyBFcnJvcihcImNoYW5uZWwgaXMgcmVxdWlyZWQgZm9yIHN1YnNjcmliZVwiKVxuICAgICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyPy4oKVxuXG4gICAgICBpZiAocmVzb2x2ZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ2hhbm5lbFN1YnNjcmlwdGlvbih7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtc30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnN1YnNjcmliZVRvQ2hhbm5lbChjaGFubmVsLCB7YWNrbm93bGVkZ2U6IHRydWUsIGxhc3RFdmVudElkLCBwYXJhbXN9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcIm1ldGFkYXRhXCIpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhUGF5bG9hZCA9IC8qKiBAdHlwZSB7e2RhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gKi8gKG1lc3NhZ2UpXG5cbiAgICAgIHRoaXMuX21ldGFkYXRhID0gbWV0YWRhdGFQYXlsb2FkLmRhdGEgJiYgdHlwZW9mIG1ldGFkYXRhUGF5bG9hZC5kYXRhID09PSBcIm9iamVjdFwiID8gey4uLm1ldGFkYXRhUGF5bG9hZC5kYXRhfSA6IHt9XG5cbiAgICAgIGZvciAoY29uc3Qge3N1YnNjcmlwdGlvbn0gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpcHRpb24ub25NZXRhZGF0YUNoYW5nZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb24ub25NZXRhZGF0YUNoYW5nZWQodGhpcy5fbWV0YWRhdGEpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcInNlc3Npb24tcmVzdW1lXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZVNlc3Npb25SZXN1bWUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1vcGVuXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25PcGVuKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tbWVzc2FnZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDb25uZWN0aW9uTWVzc2FnZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLWNsb3NlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25DbG9zZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjaGFubmVsLXN1YnNjcmliZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsU3Vic2NyaWJlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ2hhbm5lbFVuc3Vic2NyaWJlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlICYmIG1lc3NhZ2UudHlwZSAhPT0gXCJyZXF1ZXN0XCIpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWAsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICBpZiAoIXJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogYFVua25vd24gbWVzc2FnZSB0eXBlOiAke21lc3NhZ2UudHlwZX1gLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qge2JvZHksIGhlYWRlcnMsIGlkLCBtZXRob2QsIHBhdGh9ID0gcmVxdWVzdFBheWxvYWRcblxuICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoXCJtZXRob2QgaXMgcmVxdWlyZWRcIilcbiAgICBpZiAoIXBhdGgpIHRocm93IG5ldyBFcnJvcihcInBhdGggaXMgcmVxdWlyZWRcIilcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgV2Vic29ja2V0UmVxdWVzdCh7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLmdldE1ldGFkYXRhKCksXG4gICAgICBtZXRob2QsXG4gICAgICBwYXRoLFxuICAgICAgcmVtb3RlQWRkcmVzczogdGhpcy5jbGllbnQucmVtb3RlQWRkcmVzc1xuICAgIH0pXG4gICAgY29uc3QgcmVxdWVzdFJ1bm5lciA9IG5ldyBSZXF1ZXN0UnVubmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHJlcXVlc3RcbiAgICB9KVxuXG4gICAgcmVxdWVzdFJ1bm5lci5ldmVudHMub24oXCJkb25lXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVxdWVzdFJ1bm5lci5yZXNwb25zZVxuICAgICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmdldEJvZHkoKVxuICAgICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnNcblxuICAgICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGlkLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCksXG4gICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKSxcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZVwiXG4gICAgICB9KVxuICAgICAgdm9pZCByZXF1ZXN0UnVubmVyLmxvZ0NvbXBsZXRlZFJlcXVlc3QoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBsb2cgY29tcGxldGVkIHJlcXVlc3RcIiwgZXJyb3IpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBhd2FpdCByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3Byb2Nlc3NCdWZmZXIoKSB7XG4gICAgd2hpbGUgKHRoaXMuYnVmZmVyLmxlbmd0aCA+PSAyKSB7XG4gICAgICBjb25zdCBmaXJzdEJ5dGUgPSB0aGlzLmJ1ZmZlclswXVxuICAgICAgY29uc3Qgc2Vjb25kQnl0ZSA9IHRoaXMuYnVmZmVyWzFdXG4gICAgICBjb25zdCBpc0ZpbmFsID0gKGZpcnN0Qnl0ZSAmIFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSkgPT09IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRVxuICAgICAgY29uc3Qgb3Bjb2RlID0gZmlyc3RCeXRlICYgMHgwRlxuICAgICAgY29uc3QgaXNNYXNrZWQgPSAoc2Vjb25kQnl0ZSAmIDB4ODApID09PSAweDgwXG4gICAgICBsZXQgcGF5bG9hZExlbmd0aCA9IHNlY29uZEJ5dGUgJiAweDdGXG4gICAgICBsZXQgb2Zmc2V0ID0gMlxuXG4gICAgICBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBvZmZzZXQgKyAyKSByZXR1cm5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MTZCRShvZmZzZXQpXG4gICAgICAgIG9mZnNldCArPSAyXG4gICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgb2Zmc2V0ICsgOCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IGJpZ0xlbmd0aCA9IHRoaXMuYnVmZmVyLnJlYWRCaWdVSW50NjRCRShvZmZzZXQpXG5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IE51bWJlcihiaWdMZW5ndGgpXG4gICAgICAgIG9mZnNldCArPSA4XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hc2tMZW5ndGggPSBpc01hc2tlZCA/IDQgOiAwXG5cbiAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aCkgcmV0dXJuXG5cbiAgICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgICAgbGV0IHBheWxvYWQgPSB0aGlzLmJ1ZmZlci5zbGljZShvZmZzZXQgKyBtYXNrTGVuZ3RoLCBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aClcblxuICAgICAgaWYgKGlzTWFza2VkKSB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIG1hc2tMZW5ndGgpXG4gICAgICAgIHBheWxvYWQgPSB0aGlzLl91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuc2xpY2Uob2Zmc2V0ICsgbWFza0xlbmd0aCArIHBheWxvYWRMZW5ndGgpXG5cbiAgICAgIC8vIENvbnRyb2wgZnJhbWVzIChvcGNvZGUgPj0gMHg4KSBtdXN0IG5vdCBiZSBmcmFnbWVudGVkIHBlclxuICAgICAgLy8gUkZDIDY0NTUgYW5kIGNhbiBhcnJpdmUgaW50ZXJsZWF2ZWQgd2l0aCBhIGZyYWdtZW50ZWQgZGF0YVxuICAgICAgLy8gbWVzc2FnZS4gSGFuZGxlIHRoZW0gZmlyc3Qgd2l0aG91dCB0b3VjaGluZyB0aGUgZnJhZ21lbnRcbiAgICAgIC8vIGFjY3VtdWxhdG9yLlxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9QSU5HKSB7XG4gICAgICAgIHRoaXMuX3NlbmRDb250cm9sRnJhbWUoV0VCU09DS0VUX09QQ09ERV9QT05HLCBwYXlsb2FkKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFKSB7XG4gICAgICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQpXG4gICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlKClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA+PSAweDgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGNvbnRyb2wgb3Bjb2RlOiAke29wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBEYXRhIGZyYW1lIChURVhUL0JJTkFSWS9DT05USU5VQVRJT04pLiBSZWFzc2VtYmxlIGZyYWdtZW50c1xuICAgICAgLy8gYmVmb3JlIGRpc3BhdGNoaW5nLiBCcm93c2VycyAoQ2hyb21lKSBsZWdpdGltYXRlbHkgZnJhZ21lbnRcbiAgICAgIC8vIGxvbmdlciBjbGllbnTihpJzZXJ2ZXIgdGV4dCBmcmFtZXM7IGEgcHJpb3IgdmVyc2lvbiBkcm9wcGVkXG4gICAgICAvLyBldmVyeSBmcmFnbWVudGVkIG1lc3NhZ2Ugc2lsZW50bHksIHNvIGFueSBwYXlsb2FkIGxhcmdlXG4gICAgICAvLyBlbm91Z2ggdG8gaGl0IHRoZSBicm93c2VyJ3MgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGRcbiAgICAgIC8vIChlLmcuIGEgY2hhbm5lbC1zdWJzY3JpYmUgd2l0aCBhbiBhdXRoIHRva2VuKSBuZXZlciByZWFjaGVkXG4gICAgICAvLyB0aGUgaGFuZGxlci5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQ09OVElOVUFUSU9OKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiUmVjZWl2ZWQgY29udGludWF0aW9uIGZyYW1lIHdpdGggbm8gZnJhZ21lbnRlZCBtZXNzYWdlIGluIHByb2dyZXNzXCIpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fYXBwZW5kRnJhZ21lbnQocGF5bG9hZCkpIHJldHVyblxuXG4gICAgICAgIGlmICghaXNGaW5hbCkgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX1RFWFQgfHwgb3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0JJTkFSWSkge1xuICAgICAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlJlY2VpdmVkIG5ldyBkYXRhIGZyYW1lIHdoaWxlIGEgZnJhZ21lbnRlZCBtZXNzYWdlIHdhcyBpbiBwcm9ncmVzczsgZGlzY2FyZGluZyBwcmlvciBmcmFnbWVudHNcIilcbiAgICAgICAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IFtwYXlsb2FkXVxuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBvcGNvZGVcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgICAgICAgaWYgKCF0aGlzLl9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKSkgcmV0dXJuXG5cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgZGF0YSBvcGNvZGU6ICR7b3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgICAgbGV0IGZpbmFsUGF5bG9hZFxuICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICBsZXQgZmluYWxPcGNvZGVcblxuICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyAhPT0gbnVsbCkge1xuICAgICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTikge1xuICAgICAgICAgIGZpbmFsUGF5bG9hZCA9IEJ1ZmZlci5jb25jYXQodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzKVxuICAgICAgICAgIGZpbmFsT3Bjb2RlID0gdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA/PyBXRUJTT0NLRVRfT1BDT0RFX1RFWFRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBheWxvYWQgPSBwYXlsb2FkXG4gICAgICAgICAgZmluYWxPcGNvZGUgPSBvcGNvZGVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFsUGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgZmluYWxPcGNvZGUgPSBvcGNvZGVcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsT3Bjb2RlICE9PSBXRUJTT0NLRVRfT1BDT0RFX1RFWFQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGRhdGEgb3Bjb2RlIGFmdGVyIHJlYXNzZW1ibHk6ICR7ZmluYWxPcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoZmluYWxQYXlsb2FkLnRvU3RyaW5nKFwidXRmLThcIikpXG5cbiAgICAgICAgdGhpcy5faGFuZGxlTWVzc2FnZShtZXNzYWdlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2UsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gcGFyc2Ugd2Vic29ja2V0IG1lc3NhZ2VcIiwgZXJyb3JdKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogXCJJbnZhbGlkIHdlYnNvY2tldCBtZXNzYWdlXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjb250aW51YXRpb24tZnJhbWUgcGF5bG9hZCB0byB0aGUgaW4tcHJvZ3Jlc3NcbiAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZnJhZ21lbnQgd2FzIGFjY2VwdGVkXG4gICAqIGFuZCBmYWxzZSB3aGVuIHRoZSBwZXItbWVzc2FnZSBjYXAgd2FzIGhpdCBhbmQgdGhlIHNvY2tldCBoYXNcbiAgICogYmVlbiBjbG9zZWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgX2FwcGVuZEZyYWdtZW50KHBheWxvYWQpIHtcbiAgICAvLyBHdWFyZCBwdXNoaW5nIGZpcnN0IHNvIGBfZW5mb3JjZUZyYWdtZW50TGltaXRzYCBzZWVzIHRoZSBmaW5hbFxuICAgIC8vIHN0YXRlOyBvbiBvdmVyZmxvdyB0aGUgcmVzZXQgaW5zaWRlIHRoZSBlbmZvcmNlciBkcm9wcyB0aGVcbiAgICAvLyBidWZmZXJlZCBmcmFnbWVudHMuXG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzPy5wdXNoKHBheWxvYWQpXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzICs9IHBheWxvYWQubGVuZ3RoXG5cbiAgICByZXR1cm4gdGhpcy5fZW5mb3JjZUZyYWdtZW50TGltaXRzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZnJhZ21lbnRlZCBtZXNzYWdlIGhhcyBub3QgZXhjZWVkZWQgdGhlIGJ5dGUgb3JcbiAgICogZnJhZ21lbnQtY291bnQgY2Fwcy4gT24gb3ZlcmZsb3csIGNsZWFycyB0aGUgYnVmZmVyLCBzZW5kcyBhXG4gICAqIGNsb3NlIGZyYW1lLCBhbmQgdGVhcnMgdGhlIHNlc3Npb24gZG93bi4gUmV0dXJucyB0cnVlIHdoZW4gdGhlXG4gICAqIGNhbGxlciBjYW4gY29udGludWUgcHJvY2Vzc2luZywgZmFsc2Ugd2hlbiB0aGUgc2Vzc2lvbiBpcyBiZWluZ1xuICAgKiBjbG9zZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgX2VuZm9yY2VGcmFnbWVudExpbWl0cygpIHtcbiAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID09PSBudWxsKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgZnJhZ21lbnRDb3VudCA9IHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2Fkcy5sZW5ndGhcbiAgICBjb25zdCBvdmVyQnl0ZXMgPSB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgPiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU1xuICAgIGNvbnN0IG92ZXJGcmFnbWVudHMgPSBmcmFnbWVudENvdW50ID4gV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfRlJBR01FTlRTXG5cbiAgICBpZiAoIW92ZXJCeXRlcyAmJiAhb3ZlckZyYWdtZW50cykgcmV0dXJuIHRydWVcblxuICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1xuICAgICAgXCJGcmFnbWVudGVkIHdlYnNvY2tldCBtZXNzYWdlIGV4Y2VlZGVkIGNhcHM7IGNsb3NpbmcgY29ubmVjdGlvblwiLFxuICAgICAge1xuICAgICAgICBmcmFnbWVudEJ5dGVzOiB0aGlzLl9mcmFnbWVudGVkQnl0ZXMsXG4gICAgICAgIGZyYWdtZW50Q291bnQsXG4gICAgICAgIG1heEJ5dGVzOiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFUyxcbiAgICAgICAgbWF4RnJhZ21lbnRzOiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9GUkFHTUVOVFNcbiAgICAgIH1cbiAgICBdKVxuXG4gICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMClcbiAgICB0aGlzLnNlbmRHb29kYnllKHRoaXMuY2xpZW50KVxuICAgIHRoaXMuX2hhbmRsZUNsb3NlKClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBfcmVzZXRGcmFnbWVudEJ1ZmZlcigpIHtcbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPSBudWxsXG4gICAgdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA9IG51bGxcbiAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgPSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9wY29kZSAtIE9wY29kZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9zZW5kQ29udHJvbEZyYW1lKG9wY29kZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgb3Bjb2RlXG4gICAgaGVhZGVyWzFdID0gcGF5bG9hZC5sZW5ndGhcblxuICAgIHRoaXMuY2xpZW50LmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgcGF5bG9hZF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kSnNvbihib2R5KSB7XG4gICAgLy8gV2hpbGUgcGF1c2VkICh3YWl0aW5nIGZvciBhIHJlc3VtZSksIHN0YXNoIGZyYW1lcyBpbiBhblxuICAgIC8vIG91dGJvdW5kIHF1ZXVlIGFuZCBmbHVzaCB0aGVtIGluIG9yZGVyIG9uIHJlc3VtZS4gQ2FwcGVkIHRvXG4gICAgLy8gcHJldmVudCBydW5hd2F5IG1lbW9yeSB1c2Ugd2hpbGUgdGhlIGNsaWVudCBpcyBvZmZsaW5lLlxuICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgIHRoaXMuX291dGJvdW5kUXVldWUgfHw9IFtdXG5cbiAgICAgIGlmICh0aGlzLl9vdXRib3VuZFF1ZXVlLmxlbmd0aCA+PSBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCkge1xuICAgICAgICAvLyBEcm9wIG9sZGVzdCBzbyB0aGUgbW9zdCByZWNlbnQgYWN0aXZpdHkgd2lucyBvbiByZXN1bWUuXG4gICAgICAgIHRoaXMuX291dGJvdW5kUXVldWUuc2hpZnQoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlLnB1c2goYm9keSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5jbGllbnQ/LmV2ZW50cykgcmV0dXJuXG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmZyb20oanNvbiwgXCJ1dGYtOFwiKVxuICAgIGxldCBoZWFkZXJcblxuICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8IDEyNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG4gICAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5sZW5ndGggPCA2NTUzNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgICBoZWFkZXJbMV0gPSAxMjZcbiAgICAgIGhlYWRlci53cml0ZVVJbnQxNkJFKHBheWxvYWQubGVuZ3RoLCAyKVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMTApXG4gICAgICBoZWFkZXJbMV0gPSAxMjdcbiAgICAgIGhlYWRlci53cml0ZUJpZ1VJbnQ2NEJFKEJpZ0ludChwYXlsb2FkLmxlbmd0aCksIDIpXG4gICAgfVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9URVhUXG5cbiAgICB0aGlzLmNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBCdWZmZXIuY29uY2F0KFtoZWFkZXIsIHBheWxvYWRdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBwYXVzZWQgb3V0Ym91bmQgcXVldWUgb3ZlciB0aGUgY3VycmVudCBzb2NrZXQuXG4gICAqIENhbGxlZCBkdXJpbmcgcmVzdW1lIGFmdGVyIGBzZXNzaW9uLXJlc3VtZWRgIGhhcyBiZWVuIHNlbnQgb25cbiAgICogdGhlIE5FVyBzZXNzaW9uJ3Mgc29ja2V0IChub3QgdGhpcyBzZXNzaW9uJ3MpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9mbHVzaE91dGJvdW5kUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9vdXRib3VuZFF1ZXVlIHx8IFtdXG5cbiAgICB0aGlzLl9vdXRib3VuZFF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbihib2R5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YWNrbm93bGVkZ2U/OiBib29sZWFuLCBjaGFubmVsSGFuZGxlcj86IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzdWJzY3JpcHRpb25DaGFubmVsPzogc3RyaW5nfX0gW29wdGlvbnNdIC0gU3Vic2NyaWJlIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHN1YnNjcmlwdGlvbiB3YXMgYWRkZWQuXG4gICAqL1xuICBhc3luYyBzdWJzY3JpYmVUb0NoYW5uZWwoY2hhbm5lbCwge2Fja25vd2xlZGdlID0gdHJ1ZSwgY2hhbm5lbEhhbmRsZXIsIGxhc3RFdmVudElkLCBwYXJhbXMsIHN1YnNjcmlwdGlvbkNoYW5uZWx9ID0ge30pIHtcbiAgICBhd2FpdCB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pLm1hcmtDaGFubmVsSW50ZXJlc3RlZChjaGFubmVsKVxuXG4gICAgY29uc3QgcmVwbGF5U3RhdGUgPSBhd2FpdCB0aGlzLl9wcmVwYXJlUmVwbGF5U3RhdGUoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIGxhc3RFdmVudElkLFxuICAgICAgc3Vic2NyaXB0aW9uQ2hhbm5lbDogc3Vic2NyaXB0aW9uQ2hhbm5lbCB8fCBjaGFubmVsLFxuICAgICAgc3Vic2NyaXB0aW9uUGFyYW1zOiBwYXJhbXNcbiAgICB9KVxuXG4gICAgaWYgKHJlcGxheVN0YXRlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHJlcGxheVN0YXRlKSB7XG4gICAgICB0aGlzLmNoYW5uZWxSZXBsYXlTdGF0ZXMuc2V0KGNoYW5uZWwsIHJlcGxheVN0YXRlKVxuICAgIH1cblxuICAgIHRoaXMuYWRkU3Vic2NyaXB0aW9uKGNoYW5uZWwpXG5cbiAgICBpZiAoY2hhbm5lbEhhbmRsZXIpIHtcbiAgICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5oYXMoY2hhbm5lbCkpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5zZXQoY2hhbm5lbCwgbmV3IFNldCgpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChjaGFubmVsKT8uYWRkKGNoYW5uZWxIYW5kbGVyKVxuXG4gICAgICBpZiAoIXRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuaGFzKGNoYW5uZWxIYW5kbGVyKSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLnNldChjaGFubmVsSGFuZGxlciwgbmV3IFNldCgpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmdldChjaGFubmVsSGFuZGxlcik/LmFkZChjaGFubmVsKVxuICAgIH1cblxuICAgIGlmIChyZXBsYXlTdGF0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVwbGF5Q2hhbm5lbEV2ZW50cyh7Y2hhbm5lbCwgcmVwbGF5U3RhdGV9KVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fZmluaXNoUmVwbGF5U3RhdGUoY2hhbm5lbCwgcmVwbGF5U3RhdGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFja25vd2xlZGdlKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsLCB0eXBlOiBcInN1YnNjcmliZWRcIn0pXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBfaGFuZGxlQ2xvc2UoKSB7XG4gICAgLy8gSWYgdGhlIHNlc3Npb24gaGFzIHJlc3VtYWJsZSBzdGF0ZSAobGl2ZSBDb25uZWN0aW9uIG9yXG4gICAgLy8gQ2hhbm5lbFYyIHN1YnNjcmlwdGlvbiksIG1vdmUgaXQgaW50byB0aGUgcGF1c2VkIHJlZ2lzdHJ5XG4gICAgLy8gaW5zdGVhZCBvZiB0ZWFyaW5nIGRvd247IGEgbmV3IHNvY2tldCBwcmVzZW50aW5nIHRoZSBzZXNzaW9uSWRcbiAgICAvLyB2aWEgYHNlc3Npb24tcmVzdW1lYCB3aXRoaW4gdGhlIGdyYWNlIHdpbmRvdyB3aWxsIHJlYXR0YWNoLlxuICAgIGNvbnN0IGhhc1Jlc3VtYWJsZVN0YXRlID0gdGhpcy5fY29ubmVjdGlvbnMuc2l6ZSA+IDAgfHwgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2l6ZSA+IDBcblxuICAgIGlmIChoYXNSZXN1bWFibGVTdGF0ZSAmJiAhdGhpcy5fcGF1c2VkKSB7XG4gICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlXG4gICAgICB0aGlzLnNvY2tldCA9IG51bGxcbiAgICAgIC8vIEtpY2sgb2ZmIGF1dGgtaWRlbnRpdHkgY2FwdHVyZSBmb3IgcmVzdW1lIHZlcmlmaWNhdGlvbi4gUnVuc1xuICAgICAgLy8gaW4gdGhlIGJhY2tncm91bmQg4oCUIGBfaGFuZGxlU2Vzc2lvblJlc3VtZWAgYXdhaXRzXG4gICAgICAvLyBgX3Jlc3VtZUlkZW50aXR5UHJvbWlzZWAgYmVmb3JlIGNvbXBhcmluZy4gUGF1c2UgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBpcyBzeW5jaHJvbm91cyBzbyBhIHJlc3VtZSBhcnJpdmluZyBpbW1lZGlhdGVseSBzdGlsbCBmaW5kc1xuICAgICAgLy8gdGhlIHNlc3Npb24uXG4gICAgICB0aGlzLl9yZXN1bWVJZGVudGl0eVByb21pc2UgPSB0aGlzLl9jYXB0dXJlUmVzdW1lSWRlbnRpdHkoKVxuICAgICAgdm9pZCB0aGlzLl9maXJlT25EaXNjb25uZWN0KClcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fcGF1c2VXZWJzb2NrZXRTZXNzaW9uKHRoaXMpXG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyYWNlIHRpbWVyIHdoZW4gdGhlIHBhdXNlZCBwZXJpb2QgZXhwaXJlcyB3aXRob3V0XG4gICAqIGEgcmVzdW1lLiBUZWFycyBkb3duIGFsbCBsaXZlIENvbm5lY3Rpb25zICsgQ2hhbm5lbCBzdWJzIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbi5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmluYWxpemVHcmFjZUV4cGlyeSgpIHtcbiAgICB2b2lkIHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyQ2xvc2UoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25DaGFubmVsKClcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ29ubmVjdGlvbnMoXCJncmFjZV9leHBpcmVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBjb25maWd1cmVkIGlkZW50aXR5IHJlc29sdmVyIGFnYWluc3QgdGhpcyBzZXNzaW9uLlxuICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzdG9yZWQgYXQgcGF1c2UgdGltZSBhbmQgYXdhaXRlZCBhdFxuICAgKiByZXN1bWUgdGltZSBzbyB3ZSBjYW4gcmVqZWN0IHJlc3VtZSBhdHRlbXB0cyBmcm9tIGEgZGlmZmVyZW50XG4gICAqIGF1dGhlbnRpY2F0ZWQgY2FsbGVyIChzaWduZWQgb3V0LCBzd2FwcGVkIHVzZXIsIGV4cGlyZWQgY29va2llKS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIF9jYXB0dXJlUmVzdW1lSWRlbnRpdHkoKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXI/LigpXG5cbiAgICBpZiAodHlwZW9mIHJlc29sdmVyICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IHNlc3Npb24gaWRlbnRpdHkgcmVzb2x2ZXIgZmFpbGVkIGF0IHBhdXNlXCIsIGVycm9yXSlcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYG9uRGlzY29ubmVjdGAgb24gZXZlcnkgbGl2ZSBDb25uZWN0aW9uIGFuZCBDaGFubmVsIHN1YiBzb1xuICAgKiBhcHBzIGNhbiBwYXVzZSBwZXItaW5zdGFuY2Ugd29yayB3aGlsZSB0aGUgc2Vzc2lvbiBpcyBwYXVzZWQuXG4gICAqIEVycm9ycyBhcmUgbG9nZ2VkLCBub3QgcmV0aHJvd24g4oCUIG9uZSBicm9rZW4gaGFuZGxlciBtdXN0IG5vdFxuICAgKiBibG9jayB0aGUgcmVzdC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfZmlyZU9uRGlzY29ubmVjdCgpIHtcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25EaXNjb25uZWN0Py4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BvbkRpc2Nvbm5lY3QgZmFpbGVkIGZvciAke2Nvbm5lY3Rpb24uY29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHtzdWJzY3JpcHRpb259IG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb24ub25EaXNjb25uZWN0Py4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BvbkRpc2Nvbm5lY3QgZmFpbGVkIGZvciBjaGFubmVsIHN1YiAke3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvblJlc3VtZWAgb24gZXZlcnkgbGl2ZSBDb25uZWN0aW9uIGFuZCBDaGFubmVsIHN1YiBhZnRlclxuICAgKiBhIHN1Y2Nlc3NmdWwgYHNlc3Npb24tcmVzdW1lYCBoYW5kb2ZmLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9maXJlT25SZXN1bWUoKSB7XG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uUmVzdW1lPy4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BvblJlc3VtZSBmYWlsZWQgZm9yICR7Y29ubmVjdGlvbi5jb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qge3N1YnNjcmlwdGlvbn0gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN1YnNjcmlwdGlvbi5vblJlc3VtZT8uKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgb25SZXN1bWUgZmFpbGVkIGZvciBjaGFubmVsIHN1YiAke3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcInNlc3Npb24tcmVzdW1lXCJ9YC4gVGhpcyBzZXNzaW9uICh0aGUgbmV3bHktXG4gICAqIGNyZWF0ZWQgb25lIHdob3NlIHNvY2tldCBqdXN0IGNvbm5lY3RlZCkgdHJhbnNmZXJzIHN0YXRlIGZyb21cbiAgICogdGhlIHBhdXNlZCBzZXNzaW9uIGFuZCBpbnN0cnVjdHMgdGhlIGNsaWVudCB2aWFcbiAgICogYHNlc3Npb24tcmVzdW1lZGAgb3IgYHNlc3Npb24tZ29uZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVTZXNzaW9uUmVzdW1lKG1lc3NhZ2UpIHtcbiAgICBjb25zdCByZXN1bWVTZXNzaW9uSWQgPSBtZXNzYWdlLnNlc3Npb25JZFxuXG4gICAgaWYgKHR5cGVvZiByZXN1bWVTZXNzaW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIXJlc3VtZVNlc3Npb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLWdvbmVcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwYXVzZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uX2ZpbmRQYXVzZWRXZWJzb2NrZXRTZXNzaW9uKHJlc3VtZVNlc3Npb25JZClcblxuICAgIGlmICghcGF1c2VkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEF1dGggcmUtdmVyaWZ5OiBjb21wYXJlIHRoZSBmcmVzaCBjYWxsZXIncyBpZGVudGl0eSBhZ2FpbnN0IHRoZVxuICAgIC8vIG9uZSBjYXB0dXJlZCBhdCBwYXVzZS4gTWlzbWF0Y2ggbWVhbnMgYSBkaWZmZXJlbnQgdXNlciAob3IgYVxuICAgIC8vIHNpZ25lZC1vdXQgc2Vzc2lvbikgaXMgdHJ5aW5nIHRvIHJlY2xhaW0gc3RhdGUgdGhhdCBpc24ndFxuICAgIC8vIHRoZWlycyDigJQgZGVzdHJveSB0aGUgcGF1c2VkIHNlc3Npb24gb3V0cmlnaHQuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXI/LigpXG5cbiAgICBpZiAodHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHBhdXNlZElkZW50aXR5ID0gYXdhaXQgcGF1c2VkLl9yZXN1bWVJZGVudGl0eVByb21pc2VcbiAgICAgIGxldCBmcmVzaElkZW50aXR5XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZyZXNoSWRlbnRpdHkgPSBhd2FpdCByZXNvbHZlcih0aGlzKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IHNlc3Npb24gaWRlbnRpdHkgcmVzb2x2ZXIgZmFpbGVkIGF0IHJlc3VtZVwiLCBlcnJvcl0pXG4gICAgICAgIGZyZXNoSWRlbnRpdHkgPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKCFpZGVudGl0aWVzTWF0Y2gocGF1c2VkSWRlbnRpdHksIGZyZXNoSWRlbnRpdHkpKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fY2xlYXJQYXVzZWRXZWJzb2NrZXRTZXNzaW9uKHJlc3VtZVNlc3Npb25JZClcbiAgICAgICAgcGF1c2VkLl9maW5hbGl6ZUdyYWNlRXhwaXJ5KClcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLWdvbmVcIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fY2xlYXJQYXVzZWRXZWJzb2NrZXRTZXNzaW9uKHJlc3VtZVNlc3Npb25JZClcblxuICAgIC8vIFRyYW5zZmVyIHJlc3VtYWJsZSBzdGF0ZSBvbnRvIHRoaXMgKGxpdmUpIHNlc3Npb24uIFRoZSBwYXVzZWRcbiAgICAvLyBzZXNzaW9uIHNoZWxsIGlzIGRpc2NhcmRlZCBhZnRlciB0aGUgdHJhbnNmZXIuXG4gICAgZm9yIChjb25zdCBbY29ubmVjdGlvbklkLCBjb25uZWN0aW9uXSBvZiBwYXVzZWQuX2Nvbm5lY3Rpb25zKSB7XG4gICAgICBjb25uZWN0aW9uLnNlc3Npb24gPSB0aGlzXG4gICAgICB0aGlzLl9jb25uZWN0aW9ucy5zZXQoY29ubmVjdGlvbklkLCBjb25uZWN0aW9uKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YklkLCBlbnRyeV0gb2YgcGF1c2VkLl9jaGFubmVsU3Vic2NyaXB0aW9ucykge1xuICAgICAgZW50cnkuc3Vic2NyaXB0aW9uLnNlc3Npb24gPSB0aGlzXG4gICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5zZXQoc3ViSWQsIGVudHJ5KVxuICAgIH1cblxuICAgIHRoaXMuX21ldGFkYXRhID0gey4uLnBhdXNlZC5fbWV0YWRhdGF9XG4gICAgdGhpcy5kYXRhID0gcGF1c2VkLmRhdGFcbiAgICB0aGlzLnNlc3Npb25JZCA9IHJlc3VtZVNlc3Npb25JZFxuXG4gICAgLy8gVHJhbnNmZXIgYW55IGZyYW1lcyBxdWV1ZWQgd2hpbGUgdGhlIHBhdXNlZCBzZXNzaW9uIGhhZCBub1xuICAgIC8vIHNvY2tldC4gVGhleSBmbHVzaCBBRlRFUiBzZXNzaW9uLXJlc3VtZWQgc28gdGhlIGNsaWVudCBrbm93c1xuICAgIC8vIHdoaWNoIHNlc3Npb24gdGhleSBiZWxvbmcgdG8uXG4gICAgY29uc3QgcXVldWVkID0gcGF1c2VkLl9vdXRib3VuZFF1ZXVlIHx8IFtdXG5cbiAgICBwYXVzZWQuX291dGJvdW5kUXVldWUgPSBbXVxuICAgIHBhdXNlZC5fY29ubmVjdGlvbnMuY2xlYXIoKVxuICAgIHBhdXNlZC5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgIHBhdXNlZC5fcGF1c2VkID0gZmFsc2VcblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVkXCIsIHNlc3Npb25JZDogcmVzdW1lU2Vzc2lvbklkfSlcbiAgICBmb3IgKGNvbnN0IGJvZHkgb2YgcXVldWVkKSB0aGlzLnNlbmRKc29uKGJvZHkpXG4gICAgYXdhaXQgdGhpcy5fZmlyZU9uUmVzdW1lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25DbG9zZShyZWFzb24pYCBvbiBldmVyeSBsaXZlIGFwcC1kZWZpbmVkIGNvbm5lY3Rpb24sIHRoZW5cbiAgICogZHJvcHMgdGhlbSBmcm9tIHRoZSByZWdpc3RyeS4gTm8gbmV0d29yayBmcmFtZSBpcyBzZW50IOKAlCB0aGVcbiAgICogc29ja2V0IGlzIGFscmVhZHkgZ29pbmcgYXdheS5cbiAgICpcbiAgICogQHBhcmFtIHtcInNlc3Npb25fZGVzdHJveWVkXCIgfCBcImdyYWNlX2V4cGlyZWRcIiB8IFwiZXJyb3JcIn0gcmVhc29uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duQ29ubmVjdGlvbnMocmVhc29uKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ2xvc2UocmVhc29uKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuXCJ9YCBtZXNzYWdlIOKAlCBpbnN0YW50aWF0ZXMgdGhlXG4gICAqIHJlZ2lzdGVyZWQgY29ubmVjdGlvbiBjbGFzcywgc3RvcmVzIGl0IG9uIGBfY29ubmVjdGlvbnNgLCBhbmRcbiAgICogZmlyZXMgYG9uQ29ubmVjdCgpYC4gU2VuZHMgYGNvbm5lY3Rpb24tb3BlbmVkYCBvbiBzdWNjZXNzIG9yXG4gICAqIGBjb25uZWN0aW9uLWVycm9yYCBvbiBmYWlsdXJlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1lc3NhZ2VcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ29ubmVjdGlvbk9wZW4obWVzc2FnZSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IG1lc3NhZ2UuY29ubmVjdGlvbklkXG4gICAgY29uc3QgY29ubmVjdGlvblR5cGUgPSBtZXNzYWdlLmNvbm5lY3Rpb25UeXBlXG4gICAgY29uc3QgcGFyYW1zID0gbWVzc2FnZS5wYXJhbXMgfHwge31cblxuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbklkICE9PSBcInN0cmluZ1wiIHx8ICFjb25uZWN0aW9uSWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiZXJyb3JcIiwgZXJyb3I6IFwiY29ubmVjdGlvbi1vcGVuIHJlcXVpcmVzIGNvbm5lY3Rpb25JZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvblR5cGUgIT09IFwic3RyaW5nXCIgfHwgIWNvbm5lY3Rpb25UeXBlKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBcImNvbm5lY3Rpb25UeXBlIGlzIHJlcXVpcmVkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2Nvbm5lY3Rpb25zLmhhcyhjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBcIkNvbm5lY3Rpb24gaWQgYWxyZWFkeSBpbiB1c2VcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBDb25uZWN0aW9uQ2xhc3MgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q29ubmVjdGlvbkNsYXNzPy4oY29ubmVjdGlvblR5cGUpXG5cbiAgICBpZiAoIUNvbm5lY3Rpb25DbGFzcykge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWVycm9yXCIsIGNvbm5lY3Rpb25JZCwgbWVzc2FnZTogYFVua25vd24gY29ubmVjdGlvbiB0eXBlOiAke2Nvbm5lY3Rpb25UeXBlfWB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uQ2xhc3Moe2Nvbm5lY3Rpb25JZCwgcGFyYW1zLCBzZXNzaW9uOiB0aGlzfSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ29ubmVjdCgpXG4gICAgICB9KVxuICAgICAgLy8gUmVnaXN0ZXIgb25seSBhZnRlciBvbkNvbm5lY3QgcmVzb2x2ZXMgc28gYSBjb25uZWN0aW9uLW1lc3NhZ2VcbiAgICAgIC8vIGNhbiBuZXZlciBiZSByb3V0ZWQgdG8gYSBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgY29ubmVjdGlvbi5cbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tb3BlbmVkXCIsIGNvbm5lY3Rpb25JZH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiAke2Nvbm5lY3Rpb25UeXBlfToke2Nvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgYHt0eXBlOiBcImNvbm5lY3Rpb24tbWVzc2FnZVwifWAgZnJvbSB0aGUgY2xpZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1lc3NhZ2VcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ29ubmVjdGlvbk1lc3NhZ2UobWVzc2FnZSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IG1lc3NhZ2UuY29ubmVjdGlvbklkXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHR5cGVvZiBjb25uZWN0aW9uSWQgPT09IFwic3RyaW5nXCIgPyB0aGlzLl9jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKSA6IG51bGxcblxuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWVycm9yXCIsIGNvbm5lY3Rpb25JZCwgbWVzc2FnZTogXCJVbmtub3duIGNvbm5lY3Rpb24gaWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5vbk1lc3NhZ2UobWVzc2FnZS5ib2R5KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gaGFuZGxlIGNvbm5lY3Rpb24tbWVzc2FnZSBmb3IgJHtjb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWVycm9yXCIsIGNvbm5lY3Rpb25JZCwgbWVzc2FnZTogLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKS5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGhhbmRsZSBtZXNzYWdlXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgYHt0eXBlOiBcImNvbm5lY3Rpb24tY2xvc2VcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgZmlyZXNcbiAgICogYG9uQ2xvc2UoXCJjbGllbnRfY2xvc2VcIilgIGFuZCBjb25maXJtcyB3aXRoIGBjb25uZWN0aW9uLWNsb3NlZGAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uQ2xvc2UobWVzc2FnZSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IG1lc3NhZ2UuY29ubmVjdGlvbklkXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHR5cGVvZiBjb25uZWN0aW9uSWQgPT09IFwic3RyaW5nXCIgPyB0aGlzLl9jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKSA6IG51bGxcblxuICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKVxuICAgIC8vIE1hcmsgY2xvc2VkIGJlZm9yZSBmaXJpbmcgb25DbG9zZSBzbyBhcHAgY29kZSBob2xkaW5nIHRoZVxuICAgIC8vIGhhbmRsZSBzZWVzIGBpc0Nsb3NlZCgpID09PSB0cnVlYCBhbmQgY2FuJ3QgcmUtZW50ZXIgc2VuZE1lc3NhZ2UuXG4gICAgY29ubmVjdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25DbG9zZShcImNsaWVudF9jbG9zZVwiKVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1jbG9zZWRcIiwgY29ubmVjdGlvbklkLCByZWFzb246IFwiY2xpZW50X2Nsb3NlXCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtc3Vic2NyaWJlXCJ9YCDigJQgcnVucyBgY2FuU3Vic2NyaWJlKClgLFxuICAgKiByZWdpc3RlcnMgd2l0aCB0aGUgQ29uZmlndXJhdGlvbidzIGdsb2JhbCByb3V0aW5nIHJlZ2lzdHJ5IG9uXG4gICAqIHN1Y2Nlc3MsIGFuZCBzZW5kcyBgY2hhbm5lbC1zdWJzY3JpYmVkYCBvciBgY2hhbm5lbC1lcnJvcmAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDaGFubmVsU3Vic2NyaWJlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBzdWJzY3JpcHRpb25JZCA9IG1lc3NhZ2Uuc3Vic2NyaXB0aW9uSWRcbiAgICBjb25zdCBjaGFubmVsVHlwZSA9IG1lc3NhZ2UuY2hhbm5lbFR5cGVcbiAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcyB8fCB7fVxuICAgIGNvbnN0IGxhc3RFdmVudElkID0gbWVzc2FnZS5sYXN0RXZlbnRJZFxuXG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpcHRpb25JZCAhPT0gXCJzdHJpbmdcIiB8fCAhc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiZXJyb3JcIiwgZXJyb3I6IFwiY2hhbm5lbC1zdWJzY3JpYmUgcmVxdWlyZXMgc3Vic2NyaXB0aW9uSWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNoYW5uZWxUeXBlICE9PSBcInN0cmluZ1wiIHx8ICFjaGFubmVsVHlwZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLWVycm9yXCIsIHN1YnNjcmlwdGlvbklkLCBtZXNzYWdlOiBcImNoYW5uZWxUeXBlIGlzIHJlcXVpcmVkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmhhcyhzdWJzY3JpcHRpb25JZCkpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogXCJTdWJzY3JpcHRpb24gaWQgYWxyZWFkeSBpbiB1c2VcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBDaGFubmVsQ2xhc3MgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbENsYXNzPy4oY2hhbm5lbFR5cGUpXG5cbiAgICBpZiAoIUNoYW5uZWxDbGFzcykge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLWVycm9yXCIsIHN1YnNjcmlwdGlvbklkLCBtZXNzYWdlOiBgVW5rbm93biBjaGFubmVsIHR5cGU6ICR7Y2hhbm5lbFR5cGV9YH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgQ2hhbm5lbENsYXNzKHtzdWJzY3JpcHRpb25JZCwgcGFyYW1zLCBzZXNzaW9uOiB0aGlzfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlVGVuYW50KHtjaGFubmVsOiBjaGFubmVsVHlwZSwgcGFyYW1zfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gZmFsc2VcblxuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGFsbG93ZWQgPSBCb29sZWFuKGF3YWl0IHN1YnNjcmlwdGlvbi5jYW5TdWJzY3JpYmUoKSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIG5vdCBhdXRob3JpemVkXCJ9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbklkLCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0pXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fcmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkKCkpXG5cbiAgICAgICAgLy8gUmVwbGF5IG1pc3NlZCBldmVudHMgQkVGT1JFIHNlbmRpbmcgY2hhbm5lbC1zdWJzY3JpYmVkIHNvXG4gICAgICAgIC8vIHRoZSBjbGllbnQga25vd3M6IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBjb25maXJtYXRpb24gaXNcbiAgICAgICAgLy8gcmVwbGF5ZWQsIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXMgbGl2ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0RXZlbnRJZCA9PT0gXCJzdHJpbmdcIiAmJiBsYXN0RXZlbnRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVwbGF5Q2hhbm5lbEV2ZW50c0ZvclN1YnNjcmlwdGlvbih7Y2hhbm5lbFR5cGUsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb259KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbklkKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9uKVxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gc3Vic2NyaWJlIGNoYW5uZWwgJHtjaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBzdWJzY3JpYmVcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgbWlzc2VkIGV2ZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW50IGV2ZW50LWxvZyBzdG9yZSBmb3IgYVxuICAgKiBjaGFubmVsIHN1YnNjcmlwdGlvbiB0aGF0IHByb3ZpZGVkIGBsYXN0RXZlbnRJZGAuIFNlbmRzIGVhY2hcbiAgICogbWlzc2VkIGV2ZW50IGFzIGEgYGNoYW5uZWwtbWVzc2FnZWAgd2l0aCBgcmVwbGF5ZWQ6IHRydWVgLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWxUeXBlIC0gQ2hhbm5lbCB0eXBlIG5hbWUgKGV2ZW50LWxvZyBrZXkpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYXN0RXZlbnRJZCAtIENsaWVudCdzIGxhc3Qtc2VlbiBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fSBhcmdzLnN1YnNjcmlwdGlvbiAtIExpdmUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzRm9yU3Vic2NyaXB0aW9uKHtjaGFubmVsVHlwZSwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbn0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcblxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsLXJlcGxheS1nYXBcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgbGFzdEV2ZW50SWRcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjZWlsaW5nID0gYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbFR5cGUpXG5cbiAgICBpZiAoIWNlaWxpbmcgfHwgY2VpbGluZyA8PSBjaGVja3BvaW50LnNlcXVlbmNlKSByZXR1cm5cblxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWw6IGNoYW5uZWxUeXBlLFxuICAgICAgc2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IGNlaWxpbmdcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24uaXNDbG9zZWQoKSkgYnJlYWtcblxuICAgICAgc3Vic2NyaXB0aW9uLnNlbmRNZXNzYWdlKGV2ZW50LnBheWxvYWQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgY2FsbHNcbiAgICogYHVuc3Vic2NyaWJlZCgpYCBhbmQgc2VuZHMgYGNoYW5uZWwtdW5zdWJzY3JpYmVkYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxVbnN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG5cbiAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSByZXR1cm5cblxuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbklkKVxuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uSWQpXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihlbnRyeS5jaGFubmVsVHlwZSwgZW50cnkuc3Vic2NyaXB0aW9uKVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiBhd2FpdCBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmVkKCkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGNoYW5uZWwgJHtlbnRyeS5jaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXVuc3Vic2NyaWJlZFwiLCBzdWJzY3JpcHRpb25JZH0pXG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYHVuc3Vic2NyaWJlZCgpYCBvbiBldmVyeSBsaXZlIGNoYW5uZWwtdjIgc3Vic2NyaXB0aW9uLFxuICAgKiByZW1vdmVzIHRoZW0gZnJvbSB0aGUgQ29uZmlndXJhdGlvbidzIGdsb2JhbCByZWdpc3RyeSwgYW5kXG4gICAqIGRyb3BzIHRoZSBzZXNzaW9uJ3Mgb3duIG1hcC4gTm8gbmV0d29yayBmcmFtZXMg4oCUIHRoZSBzb2NrZXRcbiAgICogaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbLi4udGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IHtjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9ufSBvZiBlbnRyaWVzKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3VucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG4gICAgICBzdWJzY3JpcHRpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlZCgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB0ZWFyIGRvd24gY2hhbm5lbC12MiAke2NoYW5uZWxUeXBlfToke3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3RlYXJkb3duQ2hhbm5lbCgpIHtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgdGhpcy5jaGFubmVscykge1xuICAgICAgYXdhaXQgdGhpcy5fdGVhcmRvd25TaW5nbGVDaGFubmVsKGNoYW5uZWwpXG4gICAgfVxuICAgIHRoaXMuY2hhbm5lbHMuY2xlYXIoKVxuICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5jbGVhcigpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtXZWJzb2NrZXRDaGFubmVsfSBjaGFubmVsIC0gQ2hhbm5lbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSB0aGlzLmNoYW5uZWxUZW5hbnRzLmdldChjaGFubmVsKVxuXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjaGFubmVsPy51bnN1YnNjcmliZWQ/LigpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gdGVhcmRvd24gd2Vic29ja2V0IGNoYW5uZWxcIiwgZXJyb3JdKVxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmdldChjaGFubmVsKVxuXG4gICAgaWYgKHN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uQ2hhbm5lbCBvZiBzdWJzY3JpcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KHN1YnNjcmlwdGlvbkNoYW5uZWwpPy5kZWxldGUoY2hhbm5lbClcblxuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoc3Vic2NyaXB0aW9uQ2hhbm5lbCk/LnNpemUgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25DaGFubmVsKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZGVsZXRlKGNoYW5uZWwpXG4gICAgfVxuXG4gICAgdGhpcy5jaGFubmVsVGVuYW50cy5kZWxldGUoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldENoYW5uZWwgfCB1bmRlZmluZWR9IGNoYW5uZWwgLSBDaGFubmVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHRlbmFudCAtIFRlbmFudCBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcmVnaXN0ZXJDaGFubmVsKGNoYW5uZWwsIHRlbmFudCkge1xuICAgIGlmICghY2hhbm5lbCkgcmV0dXJuXG5cbiAgICB0aGlzLmNoYW5uZWxzLmFkZChjaGFubmVsKVxuICAgIHRoaXMuY2hhbm5lbFRlbmFudHMuc2V0KGNoYW5uZWwsIHRlbmFudClcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNoYW5uZWw/LnN1YnNjcmliZWQ/LigpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3dpdGhDb25uZWN0aW9ucyhjYWxsYmFjaykge1xuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3tjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gYXJncyAtIFN1YnNjcmlwdGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxTdWJzY3JpcHRpb24oe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9KSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyPy4oKVxuXG4gICAgaWYgKCFyZXNvbHZlcikgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVuYW50ID0gYXdhaXQgdGhpcy5fcmVzb2x2ZVRlbmFudCh7Y2hhbm5lbCwgcGFyYW1zfSlcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlcih7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICBzdWJzY3JpcHRpb246IHtjaGFubmVsLCBwYXJhbXN9LFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgZXJyb3I6IFwiU3Vic2NyaXB0aW9uIHJlamVjdGVkXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsSW5zdGFuY2UgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgbGFzdEV2ZW50SWQsXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICBzdWJzY3JpcHRpb25DaGFubmVsOiBjaGFubmVsLFxuICAgICAgICAgIHN1YnNjcmlwdGlvblBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAoY2hhbm5lbEluc3RhbmNlICYmICEoY2hhbm5lbEluc3RhbmNlIGluc3RhbmNlb2YgV2Vic29ja2V0Q2hhbm5lbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb2x2ZWQgd2Vic29ja2V0IGNoYW5uZWwgbXVzdCBleHRlbmQgV2Vic29ja2V0Q2hhbm5lbFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbEluc3RhbmNlLCB0ZW5hbnQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1wiV2Vic29ja2V0IGNoYW5uZWwgc3Vic2NyaXB0aW9uIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsLCBlcnJvcjogXCJTdWJzY3JpcHRpb24gcmVqZWN0ZWRcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gSW50ZXJuYWwgY2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5sYXN0RXZlbnRJZCAtIExhc3QgcmVjZWl2ZWQgZXZlbnQgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN1YnNjcmlwdGlvbkNoYW5uZWwgLSBDbGllbnQtZmFjaW5nIGNoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkfSBhcmdzLnN1YnNjcmlwdGlvblBhcmFtcyAtIENsaWVudC1mYWNpbmcgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxmYWxzZSB8IHtidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59IHwgbnVsbD59IC0gUmVwbGF5IHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgX3ByZXBhcmVSZXBsYXlTdGF0ZSh7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbkNoYW5uZWwsIHN1YnNjcmlwdGlvblBhcmFtc30pIHtcbiAgICBpZiAoIWxhc3RFdmVudElkKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgY2hlY2twb2ludCA9IGF3YWl0IHN0b3JlLmdldEV2ZW50QnlJZCh7Y2hhbm5lbCwgaWQ6IGxhc3RFdmVudElkfSlcblxuICAgIGlmICghY2hlY2twb2ludCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbDogc3Vic2NyaXB0aW9uQ2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtczogc3Vic2NyaXB0aW9uUGFyYW1zLCB0eXBlOiBcInJlcGxheS1nYXBcIn0pXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyZWQ6IGZhbHNlLFxuICAgICAgY2VpbGluZ1NlcXVlbmNlOiAoYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbCkpIHx8IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICBjaGVja3BvaW50U2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICByZXBsYXlpbmc6IHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59fSBhcmdzLnJlcGxheVN0YXRlIC0gUmVwbGF5IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlcGxheSBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBfcmVwbGF5Q2hhbm5lbEV2ZW50cyh7Y2hhbm5lbCwgcmVwbGF5U3RhdGV9KSB7XG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgZXZlbnRzID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRzQWZ0ZXIoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHNlcXVlbmNlOiByZXBsYXlTdGF0ZS5jaGVja3BvaW50U2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IHJlcGxheVN0YXRlLmNlaWxpbmdTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kRXZlbnQoY2hhbm5lbCwgZXZlbnQucGF5bG9hZCwge1xuICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuaWQsXG4gICAgICAgIHJlcGxheWVkOiB0cnVlLFxuICAgICAgICBzZXF1ZW5jZTogZXZlbnQuc2VxdWVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59fSByZXBsYXlTdGF0ZSAtIFJlcGxheSBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBidWZmZXJlZCBldmVudHMgYXJlIGZsdXNoZWQuXG4gICAqL1xuICBhc3luYyBfZmluaXNoUmVwbGF5U3RhdGUoY2hhbm5lbCwgcmVwbGF5U3RhdGUpIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIHJlcGxheVN0YXRlLnJlcGxheWluZyA9IGZhbHNlXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmRlbGV0ZShjaGFubmVsKVxuXG4gICAgaWYgKCFyZXBsYXlTdGF0ZS5idWZmZXJlZCkgcmV0dXJuXG5cbiAgICBjb25zdCBsaXZlRXZlbnRzID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRzQWZ0ZXIoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHNlcXVlbmNlOiByZXBsYXlTdGF0ZS5jZWlsaW5nU2VxdWVuY2VcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBsaXZlRXZlbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFdmVudChjaGFubmVsLCBldmVudC5wYXlsb2FkLCB7XG4gICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBldmVudElkOiBldmVudC5pZCxcbiAgICAgICAgc2VxdWVuY2U6IGV2ZW50LnNlcXVlbmNlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3tjaGFubmVsPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn19IGFyZ3MgLSBUZW5hbnQgcmVzb2x1dGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gLSBSZXNvbHZlZCB0ZW5hbnQuXG4gICAqL1xuICBhc3luYyBfcmVzb2x2ZVRlbmFudCh7Y2hhbm5lbCwgcGFyYW1zfSkge1xuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSB0aGlzLnVwZ3JhZGVSZXF1ZXN0Py5wYXJhbXM/LigpXG4gICAgY29uc3QgbWVyZ2VkUGFyYW1zID0ge1xuICAgICAgLi4uKHJlcXVlc3RQYXJhbXMgJiYgdHlwZW9mIHJlcXVlc3RQYXJhbXMgPT09IFwib2JqZWN0XCIgPyByZXF1ZXN0UGFyYW1zIDoge30pLFxuICAgICAgLi4uKHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiID8gcGFyYW1zIDoge30pXG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gKi8gKHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlVGVuYW50KHtcbiAgICAgIHBhcmFtczogbWVyZ2VkUGFyYW1zLFxuICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB1bmRlZmluZWQsXG4gICAgICBzdWJzY3JpcHRpb246IGNoYW5uZWwgPyB7Y2hhbm5lbCwgcGFyYW1zfSA6IHVuZGVmaW5lZFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayAtIE1hc2suXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIHVubWFzayBwYXlsb2FkLlxuICAgKi9cbiAgX3VubWFza1BheWxvYWQocGF5bG9hZCwgbWFzaykge1xuICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvYyhwYXlsb2FkLmxlbmd0aClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gcGF5bG9hZFtpXSBeIG1hc2tbaSAlIDRdXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uT3BlbiA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uT3BlbiA6IG51bGxcblxuICAgICAgaWYgKG9uT3Blbikge1xuICAgICAgICBhd2FpdCBvbk9wZW4oe3Nlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgb3BlbiBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBJbmNvbWluZyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25NZXNzYWdlID0gaGFuZGxlciA/IGhhbmRsZXIub25NZXNzYWdlIDogbnVsbFxuXG4gICAgICBpZiAob25NZXNzYWdlKSB7XG4gICAgICAgIGF3YWl0IG9uTWVzc2FnZSh7bWVzc2FnZSwgc2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbkVycm9yID0gaGFuZGxlciA/IGhhbmRsZXIub25FcnJvciA6IG51bGxcblxuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgYXdhaXQgb25FcnJvcih7ZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSwgc2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyQ2xvc2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbkNsb3NlID0gaGFuZGxlciA/IGhhbmRsZXIub25DbG9zZSA6IG51bGxcblxuICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgYXdhaXQgb25DbG9zZSh7c2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBjbG9zZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlcn0gaGFuZGxlciAtIEhhbmRsZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TWVzc2FnZUhhbmRsZXIoaGFuZGxlcikge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyXG4gICAgdm9pZCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKVxuICB9XG5cbiAgYXN5bmMgX3Jlc29sdmVNZXNzYWdlSGFuZGxlclByb21pc2UoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlXG5cbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyID0gZmFsc2VcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UgPSB1bmRlZmluZWRcbiAgICAgICAgLy8gSW5zdGFsbCBoYW5kbGVyIGFuZCBkcmFpbiBvbk9wZW4gYmVmb3JlIHJlcGxheWluZyBxdWV1ZWRcbiAgICAgICAgLy8gbWVzc2FnZXMuIHNldE1lc3NhZ2VIYW5kbGVyKCkgZmlyZXMgb25PcGVuIGFzIGZpcmUtYW5kLWZvcmdldDtcbiAgICAgICAgLy8gYXdhaXRpbmcgX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpIGRpcmVjdGx5IGhlcmUgY2xvc2VzIHRoZVxuICAgICAgICAvLyByYWNlIHdoZXJlIHF1ZXVlZCBzdWJzY3JpYmUvY29ubmVjdGlvbi0qIGZyYW1lcyB3b3VsZFxuICAgICAgICAvLyBkaXNwYXRjaCB3aGlsZSBhbiBhc3luYyBvbk9wZW4gaXMgc3RpbGwgc2V0dGluZyB1cCBzZXNzaW9uXG4gICAgICAgIC8vIHN0YXRlLlxuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlclxuICAgICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKVxuICAgICAgICBhd2FpdCB0aGlzLl9mbHVzaFF1ZXVlZE1lc3NhZ2VzKHt1c2VIYW5kbGVyOiB0eXBlb2YgaGFuZGxlci5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIHJlc29sdmVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBmYWxzZVxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgdGhpcy5fZmx1c2hRdWV1ZWRNZXNzYWdlcyh7dXNlSGFuZGxlcjogZmFsc2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e3VzZUhhbmRsZXI6IGJvb2xlYW59fSBhcmdzIC0gQXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9mbHVzaFF1ZXVlZE1lc3NhZ2VzKHt1c2VIYW5kbGVyfSkge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VRdWV1ZS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgcXVldWVkID0gdGhpcy5tZXNzYWdlUXVldWUuc2xpY2UoKVxuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBxdWV1ZWQpIHtcbiAgICAgIGlmICh1c2VIYW5kbGVyICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLl9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=