@dollhousemcp/mcp-server 2.0.29 → 2.0.30

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.
@@ -224,7 +224,14 @@ export async function startWebServer(options) {
224
224
  // NVM is absent or on Windows. Never delays server startup.
225
225
  repairNvmLauncherOnStartup().catch(err => logger.warn(`[Setup] NVM startup repair threw unexpectedly: ${err instanceof Error ? err.message : String(err)}`));
226
226
  if (process.env.NODE_ENV !== 'test') {
227
- repairPermissionHooksOnStartup().catch(err => logger.warn(`[Setup] Permission hook startup repair threw unexpectedly: ${err instanceof Error ? err.message : String(err)}`));
227
+ repairPermissionHooksOnStartup()
228
+ .then((summary) => {
229
+ if (summary.needsRepairCount > 0) {
230
+ logger.warn(`[Setup] Permission hook startup repair completed with ${summary.needsRepairCount} issue(s) ` +
231
+ `across ${summary.hostResults.length} host(s)`);
232
+ }
233
+ })
234
+ .catch(err => logger.warn(`[Setup] Permission hook startup repair threw unexpectedly: ${err instanceof Error ? err.message : String(err)}`));
228
235
  }
229
236
  // API routes — use MCP-AQL gateway when handler is available (Issue #796)
230
237
  if (options.mcpAqlHandler) {
@@ -540,4 +547,4 @@ export async function openPortfolioBrowser(options) {
540
547
  ...(browserResult.error ? { warning: `Browser could not be opened automatically: ${browserResult.error}. Open ${url} manually.` } : {}),
541
548
  };
542
549
  }
543
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQTRCLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLGFBQWE7SUFDYixvQkFBb0I7SUFDcEIsaUJBQWlCO0lBQ2pCLG1CQUFtQjtJQUNuQixvQkFBb0I7Q0FDckIsQ0FBQztBQUVGLGlGQUFpRjtBQUNqRixNQUFNLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDO0FBQ25ELGtGQUFrRjtBQUNsRixNQUFNLHdCQUF3QixHQUFHLHVCQUF1QixDQUFDO0FBQ3pELHVGQUF1RjtBQUN2RixNQUFNLDJCQUEyQixHQUFHLDBCQUEwQixDQUFDO0FBQy9ELDhFQUE4RTtBQUM5RSxNQUFNLG1DQUFtQyxHQUFHLGtDQUFrQyxDQUFDO0FBQy9FLHVGQUF1RjtBQUN2RixNQUFNLDhCQUE4QixHQUFHLDZCQUE2QixDQUFDO0FBRXJFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFEOzs7OztHQUtHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0FBQ3BELE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDO0FBQzNDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMzRCxtR0FBbUc7QUFDbkcsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0Isa0VBQWtFO0FBQ2xFLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztBQUMxQixJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDOUIsK0VBQStFO0FBQy9FLElBQUksZ0JBQWdCLEdBQXNDLElBQUksQ0FBQztBQUMvRCxtR0FBbUc7QUFDbkcsSUFBSSxnQkFBZ0IsR0FBNkIsSUFBSSxDQUFDO0FBRXRELHFFQUFxRTtBQUNyRSxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBQ0QsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixVQUFVLEdBQUcsWUFBWSxDQUFDO0lBQzFCLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUMxQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztBQUNILENBQUM7QUE4RUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsYUFBYSxDQUFDLEdBQVc7SUFDaEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDcEMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87Z0JBQzVCLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFFZiw4RUFBOEU7UUFDOUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsNERBQTRELENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0UsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU87UUFDVCxDQUFDO1FBQ0QsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixNQUFNLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsT0FBeUI7SUFDNUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxZQUFZLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQW9CLEVBQUUsQ0FBQztJQUVuQyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLGFBQWEsQ0FBQyxVQUFVLFlBQVksSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDdEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUU1QixtQkFBbUI7SUFDbkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDMUIsR0FBRyxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuRCxHQUFHLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLEdBQUcsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbkQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNoRCxHQUFHLENBQUMsU0FBUyxDQUFDLDZCQUE2QixFQUFFLFVBQVUsWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0UsR0FBRyxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsRUFBRTtZQUN2QyxvQkFBb0I7WUFDcEIseURBQXlEO1lBQ3pELHdFQUF3RTtZQUN4RSxzQkFBc0I7WUFDdEIsOENBQThDO1lBQzlDLGlCQUFpQjtTQUNsQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztJQUVILDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsZ0ZBQWdGO0lBQ2hGLGtGQUFrRjtJQUNsRixJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztZQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDekIsT0FBTyxFQUFFLEdBQUcsQ0FBQywwQkFBMEI7WUFDdkMsa0JBQWtCLEVBQUUsb0JBQW9CO1lBQ3hDLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLElBQUksQ0FDVCwyQ0FBMkMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixFQUFFLENBQ3RILENBQUM7UUFFRix5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsd0VBQXdFO1FBQ3hFLGdDQUFnQztRQUNoQyxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxDQUFDLElBQUksQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO1FBRWpGLDBFQUEwRTtRQUMxRSwwRUFBMEU7UUFDMUUsaUVBQWlFO1FBQ2pFLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLENBQUMsSUFBSSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELG1GQUFtRjtJQUNuRiw4RkFBOEY7SUFDOUYsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLE1BQU0sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUIsRUFBRSxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFDN00sR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDaEUsR0FBRyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN2RSxHQUFHLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNqRCxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ25FLEdBQUcsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDN0UsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxlQUFlLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUNsRixNQUFNLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFFMUQsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSw0REFBNEQ7SUFDNUQsMEJBQTBCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FDbEgsQ0FBQztJQUNGLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDcEMsOEJBQThCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyw4REFBOEQsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FDOUgsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUVyRixvRkFBb0Y7UUFDcEYsTUFBTSxFQUFFLHdCQUF3QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRixNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEQsd0JBQXdCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1QixNQUFNLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDOUUsQ0FBQztTQUFNLENBQUM7UUFDTixHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxDQUFDLElBQUksQ0FBQyxrRkFBa0YsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsMkNBQTJDO0lBQzNDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFekMsb0ZBQW9GO0lBQ3BGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyw2Q0FBOEMsR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQyxDQUFDLENBQUM7SUFDSCxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFNUM7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDeEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsTUFBTSxLQUFLLEdBQUcsS0FBSztpQkFDaEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDMUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0MsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsNEZBQTRGO0lBQzVGLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFOUQsd0JBQXdCO0lBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUMsbUVBQW1FO0lBQ25FLHFFQUFxRTtJQUNyRSxrRUFBa0U7SUFDbEUscURBQXFEO0lBQ3JELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2pGLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDaEMsS0FBSyxFQUFFLEtBQUs7UUFDWixtRUFBbUU7UUFDbkUsaUVBQWlFO1FBQ2pFLEdBQUcsQ0FBQyxPQUFPO1lBQ1QsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDakQsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSixxREFBcUQ7SUFDckQsbUZBQW1GO0lBQ25GLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0Usa0VBQWtFO0lBQ2xFLElBQUksZUFBZSxHQUFrQixJQUFJLENBQUM7SUFDMUMsSUFBSSxnQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO0lBQzNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFcEQsTUFBTSxlQUFlLEdBQUcsS0FBSyxJQUFxQixFQUFFO1FBQ2xELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDcEUsMkRBQTJEO1FBQzNELGlGQUFpRjtRQUNqRixJQUFJLENBQUMsT0FBTyxJQUFJLGVBQWUsS0FBSyxJQUFJLElBQUksZ0JBQWdCLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDNUUsT0FBTyxlQUFlLENBQUM7UUFDekIsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCwyRUFBMkU7UUFDM0Usd0VBQXdFO1FBQ3hFLDRFQUE0RTtRQUM1RSxNQUFNLFlBQVksR0FBRyxVQUFVO2FBQzVCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO2FBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO2FBQ3pCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO2FBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO2FBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO2FBQy9DLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO2FBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO2FBQ3pCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO2FBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO2FBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0IsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7YUFDN0QsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7YUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7YUFDekIsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7YUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7YUFDdkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzQixlQUFlLEdBQUcsUUFBUTthQUN2QixVQUFVLENBQUMsc0JBQXNCLEVBQUUsWUFBWSxDQUFDO2FBQ2hELFVBQVUsQ0FBQyx3QkFBd0IsRUFBRSxlQUFlLENBQUM7YUFDckQsVUFBVSxDQUFDLDJCQUEyQixFQUFFLGdCQUFnQixDQUFDO2FBQ3pELFVBQVUsQ0FBQyxtQ0FBbUMsRUFBRSx1QkFBdUIsQ0FBQzthQUN4RSxVQUFVLENBQUMsOEJBQThCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDL0QsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUMsQ0FBQztJQUVGLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDckMsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdkMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsd0JBQXdCLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksY0FBYyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckUsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLGVBQWUsRUFBRSxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLDBCQUEwQixDQUFDLENBQUM7WUFDMUQsb0VBQW9FO1lBQ3BFLG1FQUFtRTtZQUNuRSxnREFBZ0Q7WUFDaEQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUscUNBQXFDLENBQUMsQ0FBQztZQUN0RSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyx3Q0FBeUMsR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDL0UsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCx1RkFBdUY7SUFDdkYsa0ZBQWtGO0lBQ2xGLGtGQUFrRjtJQUNsRixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVSxFQUFFLElBQStCLEVBQUUsR0FBK0IsRUFBRSxLQUFxQyxFQUFFLEVBQUU7UUFDOUgsTUFBTSxNQUFNLEdBQUksR0FBVyxDQUFDLE1BQU0sSUFBSyxHQUFXLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQztRQUNyRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILDZEQUE2RDtJQUM3RCxrRkFBa0Y7SUFDbEYsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsa0JBQWtCLENBQ3pCLEdBQThCLEVBQzlCLE9BQXlCLEVBQ3pCLE1BQXVCO0lBRXZCLElBQUksU0FBc0MsQ0FBQztJQUMzQyxJQUFJLGFBQThDLENBQUM7SUFFbkQsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsU0FBUyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7WUFDdEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztZQUNoQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzNELGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN4RSxDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNoQyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsa0JBQWtCLENBQUMsSUFBWSxFQUFFLFVBQXlDO0lBQ2pGLE1BQU0sR0FBRyxHQUFHLFVBQVUsWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzdDLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztJQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsMENBQTBDLEdBQUcsT0FBTyxXQUFXLGVBQWUsQ0FBQyxDQUFDO0lBQzlGLElBQUksVUFBVSxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELGlHQUFpRztBQUNqRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFdEc7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FDbEIsR0FBOEIsRUFDOUIsSUFBWSxFQUNaLE9BQXlCO0lBRXpCLE9BQU8sSUFBSSxPQUFPLENBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUN6QyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQ3BELGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDckIsVUFBVSxHQUFHLElBQUksQ0FBQztZQUNsQixnQkFBZ0IsR0FBRyxVQUFVLENBQUM7WUFDOUIsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3QyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDeEIsYUFBYSxDQUFDLFVBQVUsWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUNELE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUEwQixFQUFFLEVBQUU7WUFDcEQsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUM5QixPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDMUYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLElBQUksS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNuRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsYUFBYSxDQUMxQixHQUE4QixFQUM5QixJQUFZLEVBQ1osT0FBeUI7SUFFekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxZQUFZO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFFbkUsMkRBQTJEO0lBQzNELElBQUksTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxXQUFXLENBQUMsT0FBTztZQUFFLE9BQU8sV0FBVyxDQUFDO0lBQzlDLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxtREFBbUQsQ0FBQyxDQUFDO0lBQ3JGLE9BQU8sQ0FBQyxLQUFLLENBQUMscUVBQXFFLFlBQVksSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzdHLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLGFBQWEsQ0FBQyxVQUFVLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBNEJEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsT0FBMkIsRUFBRSxJQUFZO0lBQzFFLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFDcEMsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUV0QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3JGLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4SCxDQUFDO0lBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ2pHLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDMUUsZ0JBQWdCLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDO1lBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQ3hFLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsdUZBQXVGO0lBQ3ZGLElBQUksYUFBMkYsQ0FBQztJQUNoRyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQ3RDLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQy9DLG9CQUFvQixFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztLQUN0RSxDQUFDLENBQUM7SUFDSCxZQUFZLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUV0QyxNQUFNLFNBQVMsR0FBRyxNQUFNLGNBQWMsQ0FBQztRQUNyQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7UUFDbEMsSUFBSTtRQUNKLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtRQUNwQyxVQUFVO1FBQ1YsV0FBVztRQUNYLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsaUJBQWlCLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0tBQ3pDLENBQUMsQ0FBQztJQUVILGFBQWEsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO0FBQ3pDLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUFDLE9BQTJCO0lBQ3BFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLFVBQVUsWUFBWSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBRXZELHdEQUF3RDtJQUN4RCxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUM7SUFDbEIsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEYsR0FBRyxHQUFHLEdBQUcsT0FBTyxLQUFLLE9BQU8sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUMxRCxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxRSxNQUFNLEVBQUUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0QsR0FBRyxHQUFHLEdBQUcsT0FBTyxlQUFlLEVBQUUsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUM7SUFFckMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUvQyxPQUFPO1FBQ0wsR0FBRztRQUNILGNBQWM7UUFDZCxhQUFhLEVBQUUsYUFBYSxDQUFDLE9BQU87UUFDcEMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLDhDQUE4QyxhQUFhLENBQUMsS0FBSyxVQUFVLEdBQUcsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN4SSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRG9sbGhvdXNlTUNQIFdlYiBVSSBTZXJ2ZXJcbiAqXG4gKiBMaWdodHdlaWdodCBFeHByZXNzIHNlcnZlciBmb3IgYnJvd3NpbmcgcG9ydGZvbGlvIGVsZW1lbnRzIGluIGEgYnJvd3Nlci5cbiAqIEJvdW5kIHRvIDEyNy4wLjAuMSBvbmx5IChsb2NhbGhvc3QpLiBSZWFkLW9ubHkgZm9yIFYxLlxuICpcbiAqIENhbiBiZSBzdGFydGVkIHN0YW5kYWxvbmUgKGAtLXdlYmAgZmxhZykgb3IgZnJvbSB3aXRoaW4gdGhlIE1DUCBzZXJ2ZXJcbiAqIHByb2Nlc3MgdmlhIGBvcGVuUG9ydGZvbGlvQnJvd3NlcigpYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvbWNwLXNlcnZlci12Mi1yZWZhY3Rvci9pc3N1ZXMvNzA0XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvbWNwLXNlcnZlci12Mi1yZWZhY3Rvci9pc3N1ZXMvNzc0XG4gKi9cblxuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lLCBleHRuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlIGFzIHJlYWRGaWxlRnMgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGNyZWF0ZUFwaVJvdXRlcywgY3JlYXRlR2F0ZXdheUFwaVJvdXRlcyB9IGZyb20gJy4vcm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ1JvdXRlcywgdHlwZSBMb2dSb3V0ZXNSZXN1bHQgfSBmcm9tICcuL3JvdXRlcy9sb2dSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTWV0cmljc1JvdXRlcywgdHlwZSBNZXRyaWNzUm91dGVzUmVzdWx0IH0gZnJvbSAnLi9yb3V0ZXMvbWV0cmljc1JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVIZWFsdGhSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy9oZWFsdGhSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2V0dXBSb3V0ZXMsIHJlcGFpck52bUxhdW5jaGVyT25TdGFydHVwIH0gZnJvbSAnLi9yb3V0ZXMvc2V0dXBSb3V0ZXMuanMnO1xuaW1wb3J0IHsgcmVwYWlyUGVybWlzc2lvbkhvb2tzT25TdGFydHVwIH0gZnJvbSAnLi4vdXRpbHMvcGVybWlzc2lvbkhvb2tzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVRvdHBSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy90b3RwUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVRva2VuUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvdG9rZW5Sb3V0ZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uL2NvbmZpZy9lbnYuanMnO1xuaW1wb3J0IHR5cGUgeyBNQ1BBUUxIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvbWNwLWFxbC9NQ1BBUUxIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TG9nU2luayB9IGZyb20gJy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeU1ldHJpY3NTaW5rIH0gZnJvbSAnLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbnNvbGVUb2tlblN0b3JlIH0gZnJvbSAnLi9jb25zb2xlL2NvbnNvbGVUb2tlbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVBdXRoTWlkZGxld2FyZSB9IGZyb20gJy4vbWlkZGxld2FyZS9hdXRoTWlkZGxld2FyZS5qcyc7XG5pbXBvcnQgeyBQQUNLQUdFX1ZFUlNJT04gfSBmcm9tICcuLi9nZW5lcmF0ZWQvdmVyc2lvbi5qcyc7XG5cbi8qKlxuICogUHVibGljIHBhdGggcHJlZml4ZXMgdGhhdCBuZXZlciByZXF1aXJlIGF1dGhlbnRpY2F0aW9uICgjMTc4MCkuXG4gKiBUaGVzZSBlbmRwb2ludHMgcmV0dXJuIHNhZmUgbWV0YWRhdGEgb3IgYWN0IGFzIGhlYWx0aCBwcm9iZXMg4oCUIHJlcXVpcmluZ1xuICogdG9rZW5zIG9uIHRoZW0gd291bGQgYnJlYWsgbW9uaXRvcmluZyBhbmQgY2xpZW50IGRldGVjdGlvbiB3aXRob3V0IGFkZGluZ1xuICogcmVhbCBzZWN1cml0eSB2YWx1ZS5cbiAqL1xuY29uc3QgUFVCTElDX1BBVEhfUFJFRklYRVMgPSBbXG4gICcvYXBpL2hlYWx0aCcsXG4gICcvYXBpL3NldHVwL3ZlcnNpb24nLFxuICAnL2FwaS9zZXR1cC9tY3BiJyxcbiAgJy9hcGkvc2V0dXAvZGV0ZWN0JyxcbiAgJy9hcGkvc2V0dXAvbGljZW5zZScsXG5dO1xuXG4vKiogUGxhY2Vob2xkZXIgaW4gaW5kZXguaHRtbCB0aGF0IGlzIHJlcGxhY2VkIHdpdGggdGhlIGN1cnJlbnQgY29uc29sZSB0b2tlbi4gKi9cbmNvbnN0IFRPS0VOX01FVEFfUExBQ0VIT0xERVIgPSAne3tDT05TT0xFX1RPS0VOfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBydW5uaW5nIHNlcnZlciB2ZXJzaW9uLiAqL1xuY29uc3QgVkVSU0lPTl9NRVRBX1BMQUNFSE9MREVSID0gJ3t7RE9MTEhPVVNFX1ZFUlNJT059fSc7XG4vKiogUGxhY2Vob2xkZXIgaW4gaW5kZXguaHRtbCB0aGF0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0YWJsZSBEb2xsaG91c2Ugc2Vzc2lvbiBJRC4gKi9cbmNvbnN0IFNFU1NJT05fSURfTUVUQV9QTEFDRUhPTERFUiA9ICd7e0RPTExIT1VTRV9TRVNTSU9OX0lEfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBydW50aW1lIHNlc3Npb24gSUQuICovXG5jb25zdCBSVU5USU1FX1NFU1NJT05fSURfTUVUQV9QTEFDRUhPTERFUiA9ICd7e0RPTExIT1VTRV9SVU5USU1FX1NFU1NJT05fSUR9fSc7XG4vKiogUGxhY2Vob2xkZXIgaW4gaW5kZXguaHRtbCB0aGF0IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc2V0IGNhY2hlLWJ1c3RpbmcgdmVyc2lvbi4gKi9cbmNvbnN0IEFTU0VUX1ZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiA9ICd7e0RPTExIT1VTRV9BU1NFVF9WRVJTSU9OfX0nO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4vKipcbiAqIERlZmF1bHQgcG9ydCBmb3Igc3RhbmRhbG9uZSBgc3RhcnRXZWJTZXJ2ZXJgIGNhbGxzLiBSZWFkcyBmcm9tIHRoZVxuICogYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCBlbnYgdmFyIHNvIHRoZXJlIGlzIGEgc2luZ2xlIHNvdXJjZSBvZlxuICogdHJ1dGggKHNlZSBgc3JjL2NvbmZpZy9lbnYudHNgKS4gQ2FsbGVycyBwYXNzaW5nIGFuIGV4cGxpY2l0IGBwb3J0YCBpblxuICogYFdlYlNlcnZlck9wdGlvbnNgIG92ZXJyaWRlIHRoaXMgZGVmYXVsdC5cbiAqL1xuY29uc3QgREVGQVVMVF9QT1JUID0gZW52LkRPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUO1xuY29uc3QgQ09OU09MRV9IT1NUID0gJ2RvbGxob3VzZS5sb2NhbGhvc3QnO1xuY29uc3QgQUxMT1dFRF9QQUdFX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFsnLmh0bWwnLCAnLmh0bSddKTtcbi8qKiBNYXggSlNPTiBib2R5IGZvciBzZXR1cCByb3V0ZXMgKGluc3RhbGwvb3Blbi1jb25maWcpLiBJbmdlc3Qgcm91dGVzIHVzZSB0aGVpciBvd24gMW1iIGxpbWl0LiAqL1xuY29uc3QgU0VUVVBfQk9EWV9MSU1JVCA9ICcxa2InO1xuXG4vKiogVHJhY2sgd2hldGhlciB0aGUgd2ViIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcgaW4tcHJvY2Vzcy4gKi9cbmxldCBzZXJ2ZXJSdW5uaW5nID0gZmFsc2U7XG5sZXQgc2VydmVyUG9ydCA9IERFRkFVTFRfUE9SVDtcbi8qKiBBY3RpdmUgSFRUUCBzZXJ2ZXIgaW5zdGFuY2Ug4oCUIHRyYWNrZWQgc28gX3Jlc2V0U2VydmVyU3RhdGUgY2FuIGNsb3NlIGl0LiAqL1xubGV0IGFjdGl2ZUh0dHBTZXJ2ZXI6IGltcG9ydCgnbm9kZTpodHRwJykuU2VydmVyIHwgbnVsbCA9IG51bGw7XG4vKiogQ2FjaGVkIHRva2VuIHN0b3JlIGZvciBvcGVuUG9ydGZvbGlvQnJvd3NlciDigJQgcHJldmVudHMgZHVwbGljYXRlIGluc3RhbmNlcyBvbiB0aGUgc2FtZSBmaWxlLiAqL1xubGV0IGNhY2hlZFRva2VuU3RvcmU6IENvbnNvbGVUb2tlblN0b3JlIHwgbnVsbCA9IG51bGw7XG5cbi8qKiBDaGVjayB3aGV0aGVyIHRoZSB3ZWIgc2VydmVyIGhhcyBiZWVuIHN0YXJ0ZWQgaW4gdGhpcyBwcm9jZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViU2VydmVyUnVubmluZygpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNlcnZlclJ1bm5pbmc7XG59XG5cbi8qKlxuICogUmVzZXQgbW9kdWxlLWxldmVsIHNlcnZlciBzdGF0ZS4gRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seSDigJRcbiAqIGFsbG93cyB0ZXN0cyB0byBleGVyY2lzZSBzdGFydFdlYlNlcnZlci9iaW5kQW5kTGlzdGVuIHdpdGhvdXRcbiAqIGludGVyZmVyZW5jZSBmcm9tIHByaW9yIHJ1bnMgaW4gdGhlIHNhbWUgcHJvY2Vzcy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0U2VydmVyU3RhdGUoKTogdm9pZCB7XG4gIGlmIChhY3RpdmVIdHRwU2VydmVyKSB7XG4gICAgYWN0aXZlSHR0cFNlcnZlci5jbG9zZSgpO1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBudWxsO1xuICB9XG4gIHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbiAgc2VydmVyUG9ydCA9IERFRkFVTFRfUE9SVDtcbiAgY2FjaGVkVG9rZW5TdG9yZSA9IG51bGw7XG59XG5cbi8qKlxuICogR3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIEhUVFAgc2VydmVyICgjMTg1NikuXG4gKiBDbG9zZXMgdGhlIGFjdGl2ZSBzZXJ2ZXIgYW5kIHJlc2V0cyBtb2R1bGUgc3RhdGUgc28gdGhlIHBvcnQgaXMgZnJlZWRcbiAqIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGxpbmdlcmluZyB1bnRpbCBwcm9jZXNzIGV4aXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaHV0ZG93bldlYlNlcnZlcigpOiB2b2lkIHtcbiAgaWYgKGFjdGl2ZUh0dHBTZXJ2ZXIpIHtcbiAgICBhY3RpdmVIdHRwU2VydmVyLmNsb3NlKCk7XG4gICAgYWN0aXZlSHR0cFNlcnZlciA9IG51bGw7XG4gICAgc2VydmVyUnVubmluZyA9IGZhbHNlO1xuICAgIGxvZ2dlci5pbmZvKGBbV2ViVUldIEhUVFAgc2VydmVyIGNsb3NlZCBvbiBwb3J0ICR7c2VydmVyUG9ydH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIHRoZSB3ZWIgc2VydmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlck9wdGlvbnMge1xuICAvKiogUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0cyB0byBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgLCBzZWUgYHNyYy9jb25maWcvZW52LnRzYCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFBhdGggdG8gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnkgKGUuZy4sIH4vLmRvbGxob3VzZS9wb3J0Zm9saW8pICovXG4gIHBvcnRmb2xpb0Rpcjogc3RyaW5nO1xuICAvKiogT3BlbiB0aGUgYnJvd3NlciBhdXRvbWF0aWNhbGx5IGFmdGVyIHN0YXJ0aW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgb3BlbkJyb3dzZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogTUNQQVFMSGFuZGxlciBmb3Igcm91dGluZyB0aHJvdWdoIHRoZSBNQ1AtQVFMIHBpcGVsaW5lLlxuICAgKiBXaGVuIHByb3ZpZGVkLCBBUEkgcm91dGVzIHVzZSB0aGUgZ2F0ZXdheSAodmFsaWRhdGVkLCBjYWNoZWQsIGdhdGVrZWVwZXItY2hlY2tlZCkuXG4gICAqIFdoZW4gYWJzZW50LCBmYWxscyBiYWNrIHRvIGRpcmVjdCBmaWxlc3lzdGVtIGFjY2VzcyAobGVnYWN5IGJlaGF2aW9yKS5cbiAgICogSXNzdWUgIzc5NjogV2ViIE1DUC1BUUwgR2F0ZXdheS5cbiAgICovXG4gIG1jcEFxbEhhbmRsZXI/OiBNQ1BBUUxIYW5kbGVyO1xuICAvKiogTWVtb3J5TG9nU2luayBmb3IgbG9nIHJvdXRlcyAob3B0aW9uYWwg4oCUIGxvZ3MgdGFiIGRpc2FibGVkIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgbWVtb3J5U2luaz86IE1lbW9yeUxvZ1Npbms7XG4gIC8qKiBNZW1vcnlNZXRyaWNzU2luayBmb3IgbWV0cmljcyByb3V0ZXMgKG9wdGlvbmFsIOKAlCBtZXRyaWNzIHRhYiBkaXNhYmxlZCBpZiBub3QgcHJvdmlkZWQpICovXG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG4gIC8qKiBBZGRpdGlvbmFsIHJvdXRlcnMgdG8gbW91bnQgYmVmb3JlIHRoZSBTUEEgZmFsbGJhY2sgKGUuZy4sIGluZ2VzdCByb3V0ZXMpICovXG4gIGFkZGl0aW9uYWxSb3V0ZXJzPzogaW1wb3J0KCdleHByZXNzJykuUm91dGVyW107XG4gIC8qKlxuICAgKiBDb25zb2xlIHRva2VuIHN0b3JlICgjMTc4MCkuIFdoZW4gcHJvdmlkZWQsIHRoZSBzZXJ2ZXIgd2lsbDpcbiAgICogICAxLiBNb3VudCBCZWFyZXIgdG9rZW4gYXV0aCBtaWRkbGV3YXJlIGJlZm9yZSBwcm90ZWN0ZWQgcm91dGVycy5cbiAgICogICAyLiBJbmplY3QgdGhlIHByaW1hcnkgdG9rZW4gaW50byBpbmRleC5odG1sIHNvIHRoZSBicm93c2VyIGNsaWVudFxuICAgKiAgICAgIGNhbiBhdHRhY2ggaXQgdG8gZmV0Y2ggY2FsbHMgYW5kIEV2ZW50U291cmNlIFVSTHMuXG4gICAqICAgMy4gQXBwZW5kIHRoZSB0b2tlbiBmaWxlIGxvY2F0aW9uIHRvIHRoZSBzdGFydHVwIGJhbm5lci5cbiAgICogQXV0aCBlbmZvcmNlbWVudCBpcyBzdGlsbCBnYXRlZCBvbiBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCDigJQgdGhlXG4gICAqIG1pZGRsZXdhcmUgaXMgYSBwYXNzLXRocm91Z2ggd2hlbiB0aGUgZmxhZyBpcyBmYWxzZSAodGhlIFBoYXNlIDEgZGVmYXVsdCkuXG4gICAqL1xuICB0b2tlblN0b3JlPzogQ29uc29sZVRva2VuU3RvcmU7XG4gIC8qKiBTdGFibGUgRG9sbGhvdXNlIHNlc3Npb24gaWRlbnRpdHkgc2hvd24gaW4gdGhlIHdlYiBjb25zb2xlIFVJLiAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBSdW50aW1lLXVuaXF1ZSBzZXNzaW9uIGlkZW50aXR5IGZvciBkaWFnbm9zdGljcy4gKi9cbiAgcnVudGltZVNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBiaW5kIHRoZSBIVFRQIHNlcnZlciB0byBhIHBvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluZFJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGVycm9yPzogJ0VBRERSSU5VU0UnIHwgJ09USEVSJztcbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzdGFydGluZyB0aGUgd2ViIHNlcnZlciwgaW5jbHVkaW5nIGhvb2tzIGZvciBESSB3aXJpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU2VydmVyUmVzdWx0IHtcbiAgLyoqIEV4cHJlc3MgYXBwIGluc3RhbmNlIOKAlCBmb3IgbW91bnRpbmcgYWRkaXRpb25hbCByb3V0ZXMgKGUuZy4sIGluZ2VzdCByb3V0ZXMpICovXG4gIGFwcD86IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3M7XG4gIC8qKiBMb2cgYnJvYWRjYXN0IGZ1bmN0aW9uIOKAlCBjYWxsIHdpdGggZWFjaCBlbnRyeSB0byBwdXNoIHRvIFNTRSBjbGllbnRzICovXG4gIGxvZ0Jyb2FkY2FzdD86IChlbnRyeTogaW1wb3J0KCcuLi9sb2dnaW5nL3R5cGVzLmpzJykuVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkO1xuICAvKiogTWV0cmljcyBzbmFwc2hvdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggc25hcHNob3QgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBtZXRyaWNzT25TbmFwc2hvdD86IChzbmFwc2hvdDogaW1wb3J0KCcuLi9tZXRyaWNzL3R5cGVzLmpzJykuTWV0cmljU25hcHNob3QpID0+IHZvaWQ7XG4gIC8qKiBSZXN1bHQgb2YgdGhlIHBvcnQgYmluZGluZyBhdHRlbXB0ICovXG4gIGJpbmRSZXN1bHQ/OiBCaW5kUmVzdWx0O1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhdHRlbXB0aW5nIHRvIG9wZW4gdGhlIGJyb3dzZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3Nlck9wZW5SZXN1bHQge1xuICAvKiogVGhlIFVSTCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgb24gKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgcnVubmluZyAodHJ1ZSkgb3IganVzdCBzdGFydGVkIChmYWxzZSkgKi9cbiAgYWxyZWFkeVJ1bm5pbmc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBicm93c2VyIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkICovXG4gIGJyb3dzZXJPcGVuZWQ6IGJvb2xlYW47XG4gIC8qKiBXYXJuaW5nIG1lc3NhZ2UgaWYgdGhlIGJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCAqL1xuICB3YXJuaW5nPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wZW4gYSBVUkwgaW4gdGhlIHN5c3RlbSdzIGRlZmF1bHQgYnJvd3Nlci5cbiAqXG4gKiBQbGF0Zm9ybS1hd2FyZTpcbiAqIC0gbWFjT1M6IGBvcGVuYFxuICogLSBMaW51eDogYHhkZy1vcGVuYFxuICogLSBXaW5kb3dzOiBgc3RhcnRgXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gb3BlblxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIGJyb3dzZXIgb3BlbmVkLCBmYWxzZSB3aXRoIGVycm9yIG1lc3NhZ2UgaWYgbm90XG4gKi9cbmZ1bmN0aW9uIG9wZW5JbkJyb3dzZXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBwbGF0ID0gcGxhdGZvcm0oKTtcbiAgICBjb25zdCBjbWQgPSBwbGF0ID09PSAnZGFyd2luJyA/ICdvcGVuJ1xuICAgICAgOiBwbGF0ID09PSAnd2luMzInID8gJ3N0YXJ0J1xuICAgICAgOiAneGRnLW9wZW4nO1xuXG4gICAgLy8gU2VjdXJpdHk6IHVzZSBleGVjRmlsZSB3aXRoIFVSTCBhcyBhcmd1bWVudCBhcnJheSwgbm90IHN0cmluZyBpbnRlcnBvbGF0aW9uXG4gICAgY29uc3QgdXJsU3RyID0gU3RyaW5nKHVybCk7XG4gICAgLy8gQWNjZXB0IGxvY2FsaG9zdCwgMTI3LjAuMC4xLCBhbmQgKi5sb2NhbGhvc3Qgc3ViZG9tYWlucyAoUkZDIDY3NjEpXG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC8obG9jYWxob3N0fDEyN1xcLjBcXC4wXFwuMXxbXFx3LV0rXFwubG9jYWxob3N0KVs6L10vLnRlc3QodXJsU3RyKSkge1xuICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VSTCBtdXN0IGJlIGEgbG9jYWxob3N0IEhUVFAgVVJMJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXhlY0ZpbGUoY21kLCBbdXJsU3RyXSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihgW1dlYlVJXSBDb3VsZCBub3QgYXV0by1vcGVuIGJyb3dzZXI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0IHRoZSBwb3J0Zm9saW8gd2ViIHNlcnZlci5cbiAqXG4gKiBCaW5kcyB0byAxMjcuMC4wLjEgb25seSAobG9jYWxob3N0KS4gU2VydmVzIHRoZSBwb3J0Zm9saW8gYnJvd3NlclxuICogZnJvbnRlbmQgYW5kIEFQSSByb3V0ZXMgZm9yIHJlYWRpbmcgZWxlbWVudHMuXG4gKlxuICogSWRlbXBvdGVudDogaWYgdGhlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcsIG9wdGlvbmFsbHkgb3BlbnMgdGhlXG4gKiBicm93c2VyIHdpdGhvdXQgc3RhcnRpbmcgYSBzZWNvbmQgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBTZXJ2ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgSG9va3MgZm9yIERJIHdpcmluZyAobG9nIGJyb2FkY2FzdCwgbWV0cmljcyBvblNuYXBzaG90KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRXZWJTZXJ2ZXIob3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyk6IFByb21pc2U8V2ViU2VydmVyUmVzdWx0PiB7XG4gIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCByZXN1bHQ6IFdlYlNlcnZlclJlc3VsdCA9IHt9O1xuXG4gIGlmIChzZXJ2ZXJSdW5uaW5nKSB7XG4gICAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICAgIG9wZW5JbkJyb3dzZXIoYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtzZXJ2ZXJQb3J0fWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuICByZXN1bHQuYXBwID0gYXBwO1xuICBhcHAuZGlzYWJsZSgneC1wb3dlcmVkLWJ5Jyk7XG5cbiAgLy8gU2VjdXJpdHkgaGVhZGVyc1xuICBhcHAudXNlKChfcmVxLCByZXMsIG5leHQpID0+IHtcbiAgICByZXMuc2V0SGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLUZyYW1lLU9wdGlvbnMnLCAnREVOWScpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtWFNTLVByb3RlY3Rpb24nLCAnMTsgbW9kZT1ibG9jaycpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1JlZmVycmVyLVBvbGljeScsICduby1yZWZlcnJlcicpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsIGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFtcbiAgICAgIFwiZGVmYXVsdC1zcmMgJ3NlbGYnXCIsXG4gICAgICBcInNjcmlwdC1zcmMgJ3NlbGYnIGNkbi5qc2RlbGl2ci5uZXQgY2RuanMuY2xvdWRmbGFyZS5jb21cIixcbiAgICAgIFwic3R5bGUtc3JjICdzZWxmJyAndW5zYWZlLWlubGluZScgY2RuanMuY2xvdWRmbGFyZS5jb20gY2RuLmpzZGVsaXZyLm5ldFwiLFxuICAgICAgXCJpbWctc3JjICdzZWxmJyBkYXRhOlwiLFxuICAgICAgXCJjb25uZWN0LXNyYyAnc2VsZicgcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbVwiLFxuICAgICAgXCJmb250LXNyYyAnc2VsZidcIixcbiAgICBdLmpvaW4oJzsgJykpO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gQ29uc29sZSB0b2tlbiBhdXRoZW50aWNhdGlvbiBtaWRkbGV3YXJlICgjMTc4MCkuIE1vdW50ZWQgYmVmb3JlIGFueSAvYXBpXG4gIC8vIHJvdXRlcyBzbyBldmVyeSBwcm90ZWN0ZWQgZW5kcG9pbnQgZ29lcyB0aHJvdWdoIGl0LiBXaGVuIHRoZSBmZWF0dXJlIGZsYWdcbiAgLy8gRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgaXMgZmFsc2UgKFBoYXNlIDEgZGVmYXVsdCkgdGhpcyBpcyBhIHBhc3MtdGhyb3VnaC5cbiAgLy8gUHVibGljIGVuZHBvaW50cyBpbiBQVUJMSUNfUEFUSF9QUkVGSVhFUyBhbHdheXMgYnlwYXNzIGF1dGggcmVnYXJkbGVzcyBvZiBmbGFnLlxuICBpZiAob3B0aW9ucy50b2tlblN0b3JlKSB7XG4gICAgY29uc3QgYXV0aE1pZGRsZXdhcmUgPSBjcmVhdGVBdXRoTWlkZGxld2FyZSh7XG4gICAgICBzdG9yZTogb3B0aW9ucy50b2tlblN0b3JlLFxuICAgICAgZW5hYmxlZDogZW52LkRPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVELFxuICAgICAgcHVibGljUGF0aFByZWZpeGVzOiBQVUJMSUNfUEFUSF9QUkVGSVhFUyxcbiAgICAgIGxhYmVsOiAnYXBpJyxcbiAgICB9KTtcbiAgICBhcHAudXNlKCcvYXBpJywgYXV0aE1pZGRsZXdhcmUpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFtXZWJVSV0gQ29uc29sZSBhdXRoIG1pZGRsZXdhcmUgbW91bnRlZCAke2Vudi5ET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCA/ICdFTkZPUkNJTkcnIDogJ3Bhc3MtdGhyb3VnaCAoZmxhZyBvZmYpJ31gLFxuICAgICk7XG5cbiAgICAvLyBUT1RQIGVucm9sbG1lbnQgcm91dGVzICgjMTc5NCkuIE1vdW50ZWQgQUZURVIgdGhlIC9hcGkgYXV0aCBtaWRkbGV3YXJlXG4gICAgLy8gYmVjYXVzZSB0aGUgcm91dGVyIGFkZHMgaXRzIG93biBhbHdheXMtb24gYXV0aCBndWFyZCDigJQgdGhlIGdsb2JhbCBhdXRoXG4gICAgLy8gbWlkZGxld2FyZSBhdCAvYXBpIGlzIGEgcGFzcy10aHJvdWdoIGR1cmluZyBQaGFzZSAxIHJvbGxvdXQsIGJ1dCB0aGVcbiAgICAvLyBUT1RQIHJvdXRlciBlbmZvcmNlcyByZWdhcmRsZXNzIG9mIERPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEIHNvIGFuXG4gICAgLy8gYXR0YWNrZXIgd2l0aCBsb2NhbCBwb3J0IGFjY2VzcyBjYW5ub3QgcHJlLWVucm9sbCBhIHNlY29uZCBmYWN0b3IgYW5kXG4gICAgLy8gbG9jayB0aGUgbGVnaXRpbWF0ZSB1c2VyIG91dC5cbiAgICBhcHAudXNlKCcvYXBpL2NvbnNvbGUvdG90cCcsIGNyZWF0ZVRvdHBSb3V0ZXMoeyBzdG9yZTogb3B0aW9ucy50b2tlblN0b3JlIH0pKTtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBUT1RQIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvY29uc29sZS90b3RwIChhbHdheXMtb24gYXV0aCknKTtcblxuICAgIC8vIFRva2VuIG1hbmFnZW1lbnQgcm91dGVzICgjMTc5NSkuIE1vdW50ZWQgYWxvbmdzaWRlIHRoZSBUT1RQIHJvdXRlciB3aXRoXG4gICAgLy8gdGhlIHNhbWUgYWx3YXlzLW9uIGF1dGggcGF0dGVybi4gQ3VycmVudGx5IGhvc3RzIHRoZSByb3RhdGlvbiBlbmRwb2ludDtcbiAgICAvLyBmdXR1cmUgdG9rZW4gbWFuYWdlbWVudCBvcGVyYXRpb25zIChsaXN0LCByZXZva2UpIGdvIGhlcmUgdG9vLlxuICAgIGFwcC51c2UoJy9hcGkvY29uc29sZS90b2tlbicsIGNyZWF0ZVRva2VuUm91dGVzKHsgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSB9KSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gVG9rZW4gcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9jb25zb2xlL3Rva2VuIChhbHdheXMtb24gYXV0aCknKTtcbiAgfVxuXG4gIC8vIFNldHVwIHJvdXRlczogYXV0by1pbnN0YWxsIERvbGxob3VzZU1DUCB0byBNQ1AgY2xpZW50cyAobW91bnQgQkVGT1JFIEFQSSByb3V0ZXMpXG4gIC8vIEJvZHkgbGltaXQgc2NvcGVkIHRvIHNldHVwIHJvdXRlcyBvbmx5IOKAlCBpbmdlc3Qgcm91dGVzIG5lZWQgMW1iIGZvciBmb2xsb3dlciBsb2cgZm9yd2FyZGluZ1xuICBjb25zdCBzZXR1cEpzb25QYXJzZXIgPSBleHByZXNzLmpzb24oeyBsaW1pdDogU0VUVVBfQk9EWV9MSU1JVCwgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICBjb25zdCB7IGluc3RhbGxIYW5kbGVyLCBvcGVuQ29uZmlnSGFuZGxlciwgdmVyc2lvbkhhbmRsZXIsIG1jcGJSZWRpcmVjdEhhbmRsZXIsIGRldGVjdEhhbmRsZXIsIGdldExpY2Vuc2VIYW5kbGVyLCBzZXRMaWNlbnNlSGFuZGxlciwgdmVyaWZ5TGljZW5zZUhhbmRsZXIsIHJlc2VuZFZlcmlmaWNhdGlvbkhhbmRsZXIgfSA9IGNyZWF0ZVNldHVwUm91dGVzKCk7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL2luc3RhbGwnLCBzZXR1cEpzb25QYXJzZXIsIGluc3RhbGxIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvb3Blbi1jb25maWcnLCBzZXR1cEpzb25QYXJzZXIsIG9wZW5Db25maWdIYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC92ZXJzaW9uJywgdmVyc2lvbkhhbmRsZXIpO1xuICBhcHAuZ2V0KCcvYXBpL3NldHVwL21jcGInLCBtY3BiUmVkaXJlY3RIYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9kZXRlY3QnLCBkZXRlY3RIYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9saWNlbnNlJywgZ2V0TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlJywgc2V0dXBKc29uUGFyc2VyLCBzZXRMaWNlbnNlSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL2xpY2Vuc2UvdmVyaWZ5Jywgc2V0dXBKc29uUGFyc2VyLCB2ZXJpZnlMaWNlbnNlSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL2xpY2Vuc2UvcmVzZW5kJywgc2V0dXBKc29uUGFyc2VyLCByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyKTtcbiAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gU2V0dXAgcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9zZXR1cCcpO1xuXG4gIC8vIEZpcmUtYW5kLWZvcmdldCBOVk0gbGF1bmNoZXIgcmVwYWlyOiByZWNyZWF0ZXMgdGhlIHdyYXBwZXIgaWYgZGVsZXRlZCBhbmRcbiAgLy8gcGF0Y2hlcyBhbnkgcHJlLWV4aXN0aW5nIGNvbmZpZ3MgdGhhdCBzdGlsbCB1c2UgYmFyZSBgbnB4YC4gTm8tb3BzIHdoZW5cbiAgLy8gTlZNIGlzIGFic2VudCBvciBvbiBXaW5kb3dzLiBOZXZlciBkZWxheXMgc2VydmVyIHN0YXJ0dXAuXG4gIHJlcGFpck52bUxhdW5jaGVyT25TdGFydHVwKCkuY2F0Y2goZXJyID0+XG4gICAgbG9nZ2VyLndhcm4oYFtTZXR1cF0gTlZNIHN0YXJ0dXAgcmVwYWlyIHRocmV3IHVuZXhwZWN0ZWRseTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YClcbiAgKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcpIHtcbiAgICByZXBhaXJQZXJtaXNzaW9uSG9va3NPblN0YXJ0dXAoKS5jYXRjaChlcnIgPT5cbiAgICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIFBlcm1pc3Npb24gaG9vayBzdGFydHVwIHJlcGFpciB0aHJldyB1bmV4cGVjdGVkbHk6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFQSSByb3V0ZXMg4oCUIHVzZSBNQ1AtQVFMIGdhdGV3YXkgd2hlbiBoYW5kbGVyIGlzIGF2YWlsYWJsZSAoSXNzdWUgIzc5NilcbiAgaWYgKG9wdGlvbnMubWNwQXFsSGFuZGxlcikge1xuICAgIGFwcC51c2UoJy9hcGknLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzKG9wdGlvbnMubWNwQXFsSGFuZGxlciwgb3B0aW9ucy5wb3J0Zm9saW9EaXIpKTtcblxuICAgIC8vIFBlcm1pc3Npb24gZXZhbHVhdGlvbiByb3V0ZXMgKFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24sIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzKVxuICAgIGNvbnN0IHsgcmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMuanMnKTtcbiAgICBjb25zdCBwZXJtUm91dGVyID0gKGF3YWl0IGltcG9ydCgnZXhwcmVzcycpKS5Sb3V0ZXIoKTtcbiAgICByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMocGVybVJvdXRlciwgb3B0aW9ucy5tY3BBcWxIYW5kbGVyKTtcbiAgICBhcHAudXNlKCcvYXBpJywgcGVybVJvdXRlcik7XG5cbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBBUEkgcm91dGVzIHVzaW5nIE1DUC1BUUwgR2F0ZXdheSArIHBlcm1pc3Npb24gcm91dGVzJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUFwaVJvdXRlcyhvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuICAgIGxvZ2dlci53YXJuKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChubyBNQ1AtQVFMIGhhbmRsZXIgYXZhaWxhYmxlKScpO1xuICB9XG5cbiAgLy8gQ29uc29sZSByb3V0ZXM6IGxvZ3MsIG1ldHJpY3MsIGhlYWx0aCDigJQgZXh0cmFjdGVkIHRvIGtlZXAgY29nbml0aXZlXG4gIC8vIGNvbXBsZXhpdHkgb2Ygc3RhcnRXZWJTZXJ2ZXIgbWFuYWdlYWJsZS5cbiAgbW91bnRDb25zb2xlUm91dGVzKGFwcCwgb3B0aW9ucywgcmVzdWx0KTtcblxuICAvLyBTZXJ2ZSB+Ly5kb2xsaG91c2UvcGFnZXMvIGF0IC9wYWdlcy8g4oCUIGRhc2hib2FyZHMsIGdlbmVyYXRlZCBjb250ZW50LCBzdGFjayB2aWV3c1xuICBjb25zdCBwYWdlc0RpciA9IGpvaW4oZGlybmFtZShvcHRpb25zLnBvcnRmb2xpb0RpciksICdwYWdlcycpO1xuICBta2RpcihwYWdlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSkuY2F0Y2goZXJyID0+IHtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSBDb3VsZCBub3QgY3JlYXRlIHBhZ2VzIGRpcmVjdG9yeTogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9KTtcbiAgYXBwLnVzZSgnL3BhZ2VzJywgZXhwcmVzcy5zdGF0aWMocGFnZXNEaXIpKTtcblxuICAvKipcbiAgICogR0VUIC9hcGkvcGFnZXNcbiAgICogTGlzdHMgYXZhaWxhYmxlIEhUTUwgcGFnZXMgaW4gfi8uZG9sbGhvdXNlL3BhZ2VzLy5cbiAgICogUmV0dXJucyBwYWdlIG5hbWVzIGFuZCB0aGVpciBVUkxzIGZvciB0aGUgbWFuYWdlbWVudCBjb25zb2xlLlxuICAgKi9cbiAgYXBwLmdldCgnL2FwaS9wYWdlcycsIGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKHBhZ2VzRGlyKTtcbiAgICAgIGNvbnN0IHBhZ2VzID0gZmlsZXNcbiAgICAgICAgLmZpbHRlcihmID0+ICFmLnN0YXJ0c1dpdGgoJy4nKSAmJiBBTExPV0VEX1BBR0VfRVhURU5TSU9OUy5oYXMoZXh0bmFtZShmKSkpXG4gICAgICAgIC5tYXAoZiA9PiAoeyBuYW1lOiBmLCB1cmw6IGAvcGFnZXMvJHtmfWAgfSkpO1xuICAgICAgcmVzLmpzb24oeyBwYWdlcywgZGlyZWN0b3J5OiBwYWdlc0RpciB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlcy5qc29uKHsgcGFnZXM6IFtdLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkaXRpb25hbCByb3V0ZXJzIChlLmcuLCB1bmlmaWVkIGNvbnNvbGUgaW5nZXN0IHJvdXRlcykg4oCUIG11c3QgbW91bnQgYmVmb3JlIFNQQSBmYWxsYmFja1xuICBvcHRpb25zLmFkZGl0aW9uYWxSb3V0ZXJzPy5mb3JFYWNoKHJvdXRlciA9PiBhcHAudXNlKHJvdXRlcikpO1xuXG4gIC8vIFN0YXRpYyBmcm9udGVuZCBmaWxlc1xuICBjb25zdCBwdWJsaWNEaXIgPSBqb2luKF9fZGlybmFtZSwgJ3B1YmxpYycpO1xuICAvLyBTZXJ2ZSBzdGF0aWMgYXNzZXRzIGJ1dCBza2lwIGluZGV4Lmh0bWwg4oCUIHRoZSBTUEEgZmFsbGJhY2sgYmVsb3dcbiAgLy8gaGFuZGxlcyBpdCB3aXRoIHRva2VuIGluamVjdGlvbiAocmVwbGFjZXMge3tDT05TT0xFX1RPS0VOfX0gaW4gdGhlXG4gIC8vIG1ldGEgdGFnKS4gV2l0aG91dCB0aGlzLCBleHByZXNzLnN0YXRpYyBzZXJ2ZXMgdGhlIHJhdyB0ZW1wbGF0ZVxuICAvLyBhbmQgdGhlIGJyb3dzZXIgbmV2ZXIgZ2V0cyB0aGUgYXV0aCB0b2tlbiAoIzE3ODApLlxuICBjb25zdCBpc0RlYnVnID0gQm9vbGVhbihwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcgfHwgcHJvY2Vzcy5lbnYuRU5BQkxFX0RFQlVHKTtcbiAgYXBwLnVzZShleHByZXNzLnN0YXRpYyhwdWJsaWNEaXIsIHtcbiAgICBpbmRleDogZmFsc2UsXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgZGlzYWJsZSBjYWNoaW5nIG9uIGFsbCBzdGF0aWMgYXNzZXRzIChKUywgQ1NTKSBzb1xuICAgIC8vIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiBub3JtYWwgcmVsb2FkIHdpdGhvdXQgQ21kK1NoaWZ0K1IuXG4gICAgLi4uKGlzRGVidWdcbiAgICAgID8geyBldGFnOiBmYWxzZSwgbGFzdE1vZGlmaWVkOiBmYWxzZSwgbWF4QWdlOiAwIH1cbiAgICAgIDogeyBtYXhBZ2U6ICcxeScsIGltbXV0YWJsZTogdHJ1ZSB9KSxcbiAgfSkpO1xuXG4gIC8vIFNQQSBmYWxsYmFjayB3aXRoIGNvbnNvbGUgdG9rZW4gaW5qZWN0aW9uICgjMTc4MCkuXG4gIC8vIFJlYWRzIGluZGV4Lmh0bWwgb24gZmlyc3QgcmVxdWVzdCwgc3Vic3RpdHV0ZXMgdGhlIHt7Q09OU09MRV9UT0tFTn19IHBsYWNlaG9sZGVyXG4gIC8vIHdpdGggdGhlIGN1cnJlbnQgdG9rZW4gdmFsdWUsIGFuZCBjYWNoZXMgdGhlIHJlbmRlcmVkIHN0cmluZy4gVGhlIGNhY2hlIGlzXG4gIC8vIGF1dG8taW52YWxpZGF0ZWQgd2hlbiB0aGUgcHJpbWFyeSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbiksIHNvIGEgcGFnZSByZWxvYWRcbiAgLy8gYWZ0ZXIgcm90YXRpb24gcGlja3MgdXAgdGhlIG5ldyB0b2tlbiB3aXRob3V0IGEgc2VydmVyIHJlc3RhcnQuXG4gIGxldCBjYWNoZWRJbmRleEh0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgY2FjaGVkVG9rZW5WYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGluZGV4SHRtbFBhdGggPSBqb2luKHB1YmxpY0RpciwgJ2luZGV4Lmh0bWwnKTtcblxuICBjb25zdCByZW5kZXJJbmRleEh0bWwgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCB0b2tlblZhbHVlID0gb3B0aW9ucy50b2tlblN0b3JlPy5nZXRQcmltYXJ5VG9rZW5WYWx1ZSgpID8/ICcnO1xuICAgIC8vIEF1dG8taW52YWxpZGF0ZSBjYWNoZSB3aGVuIHRoZSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbikuXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgYWx3YXlzIHJlLXJlYWQgZnJvbSBkaXNrIHNvIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiByZWxvYWQuXG4gICAgaWYgKCFpc0RlYnVnICYmIGNhY2hlZEluZGV4SHRtbCAhPT0gbnVsbCAmJiBjYWNoZWRUb2tlblZhbHVlID09PSB0b2tlblZhbHVlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkSW5kZXhIdG1sO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHJlYWRGaWxlRnMoaW5kZXhIdG1sUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBEZWZlbnNpdmUgSFRNTCBhdHRyaWJ1dGUgZXNjYXBlLiBUb2tlbnMgYXJlIHN0cmljdCA2NC1jaGFyIGxvd2VyY2FzZSBoZXhcbiAgICAvLyB0b2RheSBzbyBubyBlc2NhcGluZyBpcyBhY3R1YWxseSBuZWVkZWQsIGJ1dCBpZiB0aGUgdG9rZW4gZm9ybWF0IGV2ZXJcbiAgICAvLyBjaGFuZ2VzIHRoaXMgcHJldmVudHMgYW4gSFRNTC1pbmplY3Rpb24gcmVncmVzc2lvbiBmcm9tIGxhbmRpbmcgc2lsZW50bHkuXG4gICAgY29uc3QgZXNjYXBlZFRva2VuID0gdG9rZW5WYWx1ZVxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpO1xuICAgIGNvbnN0IGVzY2FwZWRTZXNzaW9uSWQgPSAob3B0aW9ucy5zZXNzaW9uSWQgPz8gJycpXG4gICAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXG4gICAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKVxuICAgICAgLnJlcGxhY2VBbGwoJzwnLCAnJmx0OycpXG4gICAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7Jyk7XG4gICAgY29uc3QgZXNjYXBlZFJ1bnRpbWVTZXNzaW9uSWQgPSAob3B0aW9ucy5ydW50aW1lU2Vzc2lvbklkID8/ICcnKVxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpO1xuICAgIGNhY2hlZEluZGV4SHRtbCA9IHRlbXBsYXRlXG4gICAgICAucmVwbGFjZUFsbChUT0tFTl9NRVRBX1BMQUNFSE9MREVSLCBlc2NhcGVkVG9rZW4pXG4gICAgICAucmVwbGFjZUFsbChWRVJTSU9OX01FVEFfUExBQ0VIT0xERVIsIFBBQ0tBR0VfVkVSU0lPTilcbiAgICAgIC5yZXBsYWNlQWxsKFNFU1NJT05fSURfTUVUQV9QTEFDRUhPTERFUiwgZXNjYXBlZFNlc3Npb25JZClcbiAgICAgIC5yZXBsYWNlQWxsKFJVTlRJTUVfU0VTU0lPTl9JRF9NRVRBX1BMQUNFSE9MREVSLCBlc2NhcGVkUnVudGltZVNlc3Npb25JZClcbiAgICAgIC5yZXBsYWNlQWxsKEFTU0VUX1ZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiwgUEFDS0FHRV9WRVJTSU9OKTtcbiAgICBjYWNoZWRUb2tlblZhbHVlID0gdG9rZW5WYWx1ZTtcbiAgICByZXR1cm4gY2FjaGVkSW5kZXhIdG1sO1xuICB9O1xuXG4gIGFwcC5nZXQoJy97KnBhdGh9JywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByZXEucGF0aC5ub3JtYWxpemUoJ05GQycpO1xuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvYXBpLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgQVBJIHJvdXRlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCgnL3BhZ2VzLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgUGFnZSBub3QgZm91bmQ6ICR7bm9ybWFsaXplZFBhdGh9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJJbmRleEh0bWwoKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIC8vIFRoZSBzaGVsbCBzaG91bGQgYWx3YXlzIHJldmFsaWRhdGUgc28gYSBmb3JjZWQgcmVsb2FkIGNhbiBwaWNrIHVwXG4gICAgICAvLyBhIG5ldyBsZWFkZXIvdmVyc2lvbiBpbW1lZGlhdGVseS4gQXNzZXQgZmlsZXMgdGhlbXNlbHZlcyBjYXJyeSBhXG4gICAgICAvLyB2ZXJzaW9uIHF1ZXJ5IGFuZCBjYW4gYmUgY2FjaGVkIGFnZ3Jlc3NpdmVseS5cbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NhY2hlLUNvbnRyb2wnLCAnbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUnKTtcbiAgICAgIHJlcy5zZW5kKGh0bWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUldIEZhaWxlZCB0byByZW5kZXIgaW5kZXguaHRtbDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoJ0ZhaWxlZCB0byBsb2FkIGNvbnNvbGUnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEdsb2JhbCBlcnJvciBoYW5kbGVyIOKAlCBjYXRjaCBFeHByZXNzIGVycm9ycyBhbmQgcm91dGUgdG8gbG9nZ2VyIGluc3RlYWQgb2YgdGVybWluYWwuXG4gIC8vIFdpdGhvdXQgdGhpcywgRXhwcmVzcyBkdW1wcyBzdGFjayB0cmFjZXMgdG8gc3RkZXJyICh2aXNpYmxlIGluIC0td2ViIHRlcm1pbmFsKS5cbiAgLy8gQWxsIGVycm9ycyBzdGlsbCBhcHBlYXIgaW4gdGhlIG1hbmFnZW1lbnQgY29uc29sZSdzIExvZ3MgdGFiIHZpYSBNZW1vcnlMb2dTaW5rLlxuICBhcHAudXNlKChlcnI6IEVycm9yLCBfcmVxOiBpbXBvcnQoJ2V4cHJlc3MnKS5SZXF1ZXN0LCByZXM6IGltcG9ydCgnZXhwcmVzcycpLlJlc3BvbnNlLCBfbmV4dDogaW1wb3J0KCdleHByZXNzJykuTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVyciBhcyBhbnkpLnN0YXR1cyB8fCAoZXJyIGFzIGFueSkuc3RhdHVzQ29kZSB8fCA1MDA7XG4gICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gJHtlcnIubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29uKHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQmluZCB0byBsb2NhbGhvc3Qgb25seSDigJQgaGFuZGxlIHBvcnQgY29uZmxpY3RzIGdyYWNlZnVsbHkuXG4gIC8vIEV4dHJhY3RlZCB0byBhIGhlbHBlciB0byBrZWVwIHN0YXJ0V2ViU2VydmVyJ3MgY29nbml0aXZlIGNvbXBsZXhpdHkgbWFuYWdlYWJsZS5cbiAgcmVzdWx0LmJpbmRSZXN1bHQgPSBhd2FpdCBiaW5kQW5kTGlzdGVuKGFwcCwgcG9ydCwgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBNb3VudCB0aGUgbG9ncywgbWV0cmljcywgYW5kIGhlYWx0aCByb3V0ZXMuIFRoZXNlIGFyZSBvbmx5IG1vdW50ZWQgd2hlbiB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgc2lua3MgYXJlIHByb3ZpZGVkIChtZW1vcnkgbG9nIHNpbmsgZm9yIGxvZ3MraGVhbHRoLCBtZXRyaWNzXG4gKiBzaW5rIGZvciB0aGUgbWV0cmljcyB0YWIpLiBFeHRyYWN0ZWQgZnJvbSBzdGFydFdlYlNlcnZlciB0byBjYXAgdGhlIG1haW5cbiAqIGZ1bmN0aW9uJ3MgY29nbml0aXZlIGNvbXBsZXhpdHkuXG4gKi9cbmZ1bmN0aW9uIG1vdW50Q29uc29sZVJvdXRlcyhcbiAgYXBwOiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzLFxuICBvcHRpb25zOiBXZWJTZXJ2ZXJPcHRpb25zLFxuICByZXN1bHQ6IFdlYlNlcnZlclJlc3VsdCxcbik6IHZvaWQge1xuICBsZXQgbG9nUm91dGVzOiBMb2dSb3V0ZXNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gIGxldCBtZXRyaWNzUm91dGVzOiBNZXRyaWNzUm91dGVzUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zLm1lbW9yeVNpbmspIHtcbiAgICBsb2dSb3V0ZXMgPSBjcmVhdGVMb2dSb3V0ZXMob3B0aW9ucy5tZW1vcnlTaW5rKTtcbiAgICBhcHAudXNlKCcvYXBpJywgbG9nUm91dGVzLnJvdXRlcik7XG4gICAgcmVzdWx0LmxvZ0Jyb2FkY2FzdCA9IGxvZ1JvdXRlcy5icm9hZGNhc3Q7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gTG9nIHZpZXdlciByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2xvZ3MnKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm1ldHJpY3NTaW5rKSB7XG4gICAgbWV0cmljc1JvdXRlcyA9IGNyZWF0ZU1ldHJpY3NSb3V0ZXMob3B0aW9ucy5tZXRyaWNzU2luayk7XG4gICAgYXBwLnVzZSgnL2FwaScsIG1ldHJpY3NSb3V0ZXMucm91dGVyKTtcbiAgICByZXN1bHQubWV0cmljc09uU25hcHNob3QgPSBtZXRyaWNzUm91dGVzLm9uU25hcHNob3Q7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gTWV0cmljcyByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL21ldHJpY3MnKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm1lbW9yeVNpbmspIHtcbiAgICBjb25zdCBoZWFsdGhSb3V0ZXIgPSBjcmVhdGVIZWFsdGhSb3V0ZXMoe1xuICAgICAgbWVtb3J5U2luazogb3B0aW9ucy5tZW1vcnlTaW5rLFxuICAgICAgbWV0cmljc1Npbms6IG9wdGlvbnMubWV0cmljc1NpbmssXG4gICAgICBsb2dDbGllbnRDb3VudDogbG9nUm91dGVzID8gbG9nUm91dGVzLmNsaWVudENvdW50IDogKCkgPT4gMCxcbiAgICAgIG1ldHJpY3NDbGllbnRDb3VudDogbWV0cmljc1JvdXRlcyA/IG1ldHJpY3NSb3V0ZXMuY2xpZW50Q291bnQgOiAoKSA9PiAwLFxuICAgIH0pO1xuICAgIGFwcC51c2UoJy9hcGknLCBoZWFsdGhSb3V0ZXIpO1xuICB9XG59XG5cbi8qKlxuICogUHJpbnQgdGhlIHN0YXJ0dXAgYmFubmVyIHRvIHN0ZGVyci5cbiAqXG4gKiBOT1RFOiBVc2Ugc3RkZXJyIGZvciB0ZXJtaW5hbCBvdXRwdXQsIG5vdCBzdGRvdXQuIEluIE1DUCBzdGRpbyBtb2RlLCBzdGRvdXRcbiAqIGlzIHJlc2VydmVkIGZvciBKU09OLVJQQyBtZXNzYWdlcyDigJQgYW55IG5vbi1KU09OIG91dHB1dCBjb3JydXB0cyB0aGUgcHJvdG9jb2wuXG4gKiBzdGRlcnIgaXMgc2FmZSBmb3IgaHVtYW4tcmVhZGFibGUgbWVzc2FnZXMgaW4gYm90aCBNQ1AgYW5kIHN0YW5kYWxvbmUgbW9kZXMuXG4gKi9cbmZ1bmN0aW9uIHByaW50U3RhcnR1cEJhbm5lcihwb3J0OiBudW1iZXIsIHRva2VuU3RvcmU6IENvbnNvbGVUb2tlblN0b3JlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IHVybCA9IGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gO1xuICBjb25zdCBmYWxsYmFja1VybCA9IGBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBNYW5hZ2VtZW50IGNvbnNvbGUgcnVubmluZyBhdCAke3VybH1gKTtcbiAgY29uc29sZS5lcnJvcihgXFxuICBEb2xsaG91c2VNQ1AgTWFuYWdlbWVudCBDb25zb2xlXFxuICAke3VybH1cXG4gICR7ZmFsbGJhY2tVcmx9IChmYWxsYmFjaylcXG5gKTtcbiAgaWYgKHRva2VuU3RvcmUpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgIFNlc3Npb24gdG9rZW46ICR7dG9rZW5TdG9yZS5nZXRGaWxlUGF0aCgpfVxcbmApO1xuICB9XG4gIGNvbnNvbGUuZXJyb3IoYCAgVHlwZSBcInFcIiBvciBcInF1aXRcIiB0byBleGl0LlxcbmApO1xufVxuXG4vLyBTdGFsZSBwcm9jZXNzIHJlY292ZXJ5IOKAlCBleHRyYWN0ZWQgdG8gU3RhbGVQcm9jZXNzUmVjb3ZlcnkudHMgZm9yIGluZGVwZW5kZW50IHRlc3RpbmcgKCMxODUwKS5cbmltcG9ydCB7IHJlY292ZXJTdGFsZVBvcnQgfSBmcm9tICcuL2NvbnNvbGUvU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMnO1xuZXhwb3J0IHsgZmluZFBpZE9uUG9ydCwga2lsbFN0YWxlUHJvY2VzcywgcmVjb3ZlclN0YWxlUG9ydCB9IGZyb20gJy4vY29uc29sZS9TdGFsZVByb2Nlc3NSZWNvdmVyeS5qcyc7XG5cbi8qKlxuICogQXR0ZW1wdCBhIHNpbmdsZSBwb3J0IGJpbmQuIFJldHVybnMgYSBCaW5kUmVzdWx0IHdpdGhvdXQgYW55IHJlY292ZXJ5IGxvZ2ljLlxuICovXG5mdW5jdGlvbiBhdHRlbXB0QmluZChcbiAgYXBwOiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzLFxuICBwb3J0OiBudW1iZXIsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4pOiBQcm9taXNlPEJpbmRSZXN1bHQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPEJpbmRSZXN1bHQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgaHR0cFNlcnZlciA9IGFwcC5saXN0ZW4ocG9ydCwgJzEyNy4wLjAuMScsICgpID0+IHtcbiAgICAgIHNlcnZlclJ1bm5pbmcgPSB0cnVlO1xuICAgICAgc2VydmVyUG9ydCA9IHBvcnQ7XG4gICAgICBhY3RpdmVIdHRwU2VydmVyID0gaHR0cFNlcnZlcjtcbiAgICAgIHByaW50U3RhcnR1cEJhbm5lcihwb3J0LCBvcHRpb25zLnRva2VuU3RvcmUpO1xuICAgICAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICAgICAgb3BlbkluQnJvd3NlcihgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICBodHRwU2VydmVyLm9uKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VBRERSSU5VU0UnLCBkZXRhaWw6IGBQb3J0ICR7cG9ydH0gYWxyZWFkeSBpbiB1c2VgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUldIEZhaWxlZCB0byBiaW5kIHBvcnQgJHtwb3J0fTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ09USEVSJywgZGV0YWlsOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQmluZCB0aGUgRXhwcmVzcyBhcHAgdG8gMTI3LjAuMC4xOnBvcnQuIE9uIEVBRERSSU5VU0UsIGF0dGVtcHQgdG8gZmluZFxuICogYW5kIGtpbGwgdGhlIHN0YWxlIERvbGxob3VzZU1DUCBwcm9jZXNzIGhvbGRpbmcgdGhlIHBvcnQsIHRoZW4gcmV0cnkgb25jZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYmluZEFuZExpc3RlbihcbiAgYXBwOiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzLFxuICBwb3J0OiBudW1iZXIsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4pOiBQcm9taXNlPEJpbmRSZXN1bHQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXR0ZW1wdEJpbmQoYXBwLCBwb3J0LCBvcHRpb25zKTtcbiAgaWYgKHJlc3VsdC5zdWNjZXNzIHx8IHJlc3VsdC5lcnJvciAhPT0gJ0VBRERSSU5VU0UnKSByZXR1cm4gcmVzdWx0O1xuXG4gIC8vIFBvcnQgb2NjdXBpZWQg4oCUIGF0dGVtcHQgc3RhbGUgcHJvY2VzcyByZWNvdmVyeSBhbmQgcmV0cnlcbiAgaWYgKGF3YWl0IHJlY292ZXJTdGFsZVBvcnQocG9ydCkpIHtcbiAgICBjb25zdCByZXRyeVJlc3VsdCA9IGF3YWl0IGF0dGVtcHRCaW5kKGFwcCwgcG9ydCwgb3B0aW9ucyk7XG4gICAgaWYgKHJldHJ5UmVzdWx0LnN1Y2Nlc3MpIHJldHVybiByZXRyeVJlc3VsdDtcbiAgfVxuXG4gIC8vIFN0aWxsIGNhbid0IGJpbmQg4oCUIGZhbGwgdGhyb3VnaCB3aXRoIHdhcm5pbmdcbiAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gUG9ydCAke3BvcnR9IGFscmVhZHkgaW4gdXNlIOKAlCBhbm90aGVyIHByb2Nlc3MgaG9sZHMgdGhpcyBwb3J0YCk7XG4gIGNvbnNvbGUuZXJyb3IoYFxcbiAgRG9sbGhvdXNlTUNQIE1hbmFnZW1lbnQgQ29uc29sZSAoZXhpc3RpbmcgaW5zdGFuY2UpXFxuICBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1cXG5gKTtcbiAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE9wZW4gdGhlIHBvcnRmb2xpbyBicm93c2VyIGZyb20gd2l0aGluIHRoZSBNQ1Agc2VydmVyIHByb2Nlc3MuXG4gKlxuICogU3RhcnRzIHRoZSB3ZWIgc2VydmVyIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcsIHRoZW4gb3BlbnMgdGhlIHN5c3RlbVxuICogYnJvd3NlciB0byB0aGUgcG9ydGZvbGlvIFVJLiBSZXR1cm5zIGEgcmVzdWx0IG9iamVjdCBpbmRpY2F0aW5nXG4gKiB3aGV0aGVyIHRoZSBzZXJ2ZXIgc3RhcnRlZCBhbmQgdGhlIGJyb3dzZXIgb3BlbmVkIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBDYWxsZWQgYnkgdGhlIGBvcGVuX3BvcnRmb2xpb19icm93c2VyYCBNQ1AtQVFMIG9wZXJhdGlvbiAoSXNzdWUgIzc3NCkuXG4gKlxuICogQHBhcmFtIHBvcnRmb2xpb0RpciAtIFBhdGggdG8gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnkgKGUuZy4sIH4vLmRvbGxob3VzZS9wb3J0Zm9saW8pXG4gKiBAcGFyYW0gcG9ydCAtIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdHMgdG8gYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYClcbiAqIEByZXR1cm5zIFJlc3VsdCB3aXRoIFVSTCwgc2VydmVyIHN0YXR1cywgYW5kIGJyb3dzZXIgb3BlbiBzdGF0dXNcbiAqL1xuLyoqXG4gKiBPcHRpb25zIGZvciBvcGVuaW5nIHRoZSBwb3J0Zm9saW8gYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQnJvd3Nlck9wdGlvbnMge1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgbWNwQXFsSGFuZGxlcj86IE1DUEFRTEhhbmRsZXI7XG4gIHRhYj86IHN0cmluZztcbiAgdXJsUGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgbWVtb3J5U2luaz86IE1lbW9yeUxvZ1Npbms7XG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG59XG5cbi8qKlxuICogU2VsZi1wcm92aXNpb24gc2lua3MsIHRva2VuIHN0b3JlLCBhbmQgaW5nZXN0IHJvdXRlcywgdGhlbiBzdGFydCB0aGUgd2ViXG4gKiBzZXJ2ZXIuIEV4dHJhY3RlZCBmcm9tIG9wZW5Qb3J0Zm9saW9Ccm93c2VyIHRvIGtlZXAgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAqIG1hbmFnZWFibGUgKFNvbmFyQ2xvdWQgUzM3NzYpLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEZhbGxiYWNrU2VydmVyKG9wdGlvbnM6IE9wZW5Ccm93c2VyT3B0aW9ucywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBtZW1vcnlTaW5rID0gb3B0aW9ucy5tZW1vcnlTaW5rO1xuICBsZXQgbWV0cmljc1NpbmsgPSBvcHRpb25zLm1ldHJpY3NTaW5rO1xuXG4gIGlmICghbWVtb3J5U2luaykge1xuICAgIGNvbnN0IHsgTWVtb3J5TG9nU2luazogTG9nU2luayB9ID0gYXdhaXQgaW1wb3J0KCcuLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnKTtcbiAgICBtZW1vcnlTaW5rID0gbmV3IExvZ1NpbmsoeyBhcHBDYXBhY2l0eTogMTAwMDAsIHNlY3VyaXR5Q2FwYWNpdHk6IDUwMDAsIHBlcmZDYXBhY2l0eTogMjAwMCwgdGVsZW1ldHJ5Q2FwYWNpdHk6IDEwMDAgfSk7XG4gIH1cbiAgaWYgKCFtZXRyaWNzU2luaykge1xuICAgIGNvbnN0IHsgTWVtb3J5TWV0cmljc1Npbms6IE1ldHJpY3NTaW5rIH0gPSBhd2FpdCBpbXBvcnQoJy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnKTtcbiAgICBtZXRyaWNzU2luayA9IG5ldyBNZXRyaWNzU2luaygyNDApO1xuICB9XG5cbiAgLy8gUmV1c2UgY2FjaGVkIHRva2VuIHN0b3JlIOKAlCB0d28gaW5zdGFuY2VzIG9uIHRoZSBzYW1lIGZpbGUgY2FuIHJhY2Ugb24gd3JpdGVzLlxuICBpZiAoIWNhY2hlZFRva2VuU3RvcmUpIHtcbiAgICBjb25zdCB7IENvbnNvbGVUb2tlblN0b3JlOiBUb2tlblN0b3JlIH0gPSBhd2FpdCBpbXBvcnQoJy4vY29uc29sZS9jb25zb2xlVG9rZW4uanMnKTtcbiAgICBjb25zdCB7IHBpY2tSYW5kb21Ub2tlbk5hbWUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL1Nlc3Npb25OYW1lcy5qcycpO1xuICAgIGNhY2hlZFRva2VuU3RvcmUgPSBuZXcgVG9rZW5TdG9yZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gICAgdHJ5IHsgYXdhaXQgY2FjaGVkVG9rZW5TdG9yZS5lbnN1cmVJbml0aWFsaXplZChwaWNrUmFuZG9tVG9rZW5OYW1lKCkpOyB9XG4gICAgY2F0Y2ggKGVycikgeyBsb2dnZXIud2FybignW1dlYlVJXSBGYWlsZWQgdG8gaW5pdCB0b2tlbiBzdG9yZSBmb3IgYnJvd3NlciBvcGVuJywgZXJyKTsgfVxuICB9XG5cbiAgLy8gbG9nQnJvYWRjYXN0IGlzIGRlZmVycmVkIOKAlCB3aXJlZCBhZnRlciBzdGFydFdlYlNlcnZlciByZXR1cm5zIHRoZSByZWFsIGJyb2FkY2FzdCBmbi5cbiAgbGV0IGxpdmVCcm9hZGNhc3Q6ICgoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgY3JlYXRlSW5nZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vY29uc29sZS9Jbmdlc3RSb3V0ZXMuanMnKTtcbiAgY29uc3QgaW5nZXN0UmVzdWx0ID0gY3JlYXRlSW5nZXN0Um91dGVzKHtcbiAgICBsb2dCcm9hZGNhc3Q6IChlbnRyeSkgPT4gbGl2ZUJyb2FkY2FzdD8uKGVudHJ5KSxcbiAgICBzdG9yZU1ldHJpY3NTbmFwc2hvdDogKHNuYXBzaG90KSA9PiBtZXRyaWNzU2luaz8ub25TbmFwc2hvdChzbmFwc2hvdCksXG4gIH0pO1xuICBpbmdlc3RSZXN1bHQucmVnaXN0ZXJDb25zb2xlU2Vzc2lvbigpO1xuXG4gIGNvbnN0IHdlYlJlc3VsdCA9IGF3YWl0IHN0YXJ0V2ViU2VydmVyKHtcbiAgICBwb3J0Zm9saW9EaXI6IG9wdGlvbnMucG9ydGZvbGlvRGlyLFxuICAgIHBvcnQsXG4gICAgb3BlbkJyb3dzZXI6IGZhbHNlLFxuICAgIG1jcEFxbEhhbmRsZXI6IG9wdGlvbnMubWNwQXFsSGFuZGxlcixcbiAgICBtZW1vcnlTaW5rLFxuICAgIG1ldHJpY3NTaW5rLFxuICAgIHRva2VuU3RvcmU6IGNhY2hlZFRva2VuU3RvcmUsXG4gICAgYWRkaXRpb25hbFJvdXRlcnM6IFtpbmdlc3RSZXN1bHQucm91dGVyXSxcbiAgfSk7XG5cbiAgbGl2ZUJyb2FkY2FzdCA9IHdlYlJlc3VsdC5sb2dCcm9hZGNhc3Q7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuUG9ydGZvbGlvQnJvd3NlcihvcHRpb25zOiBPcGVuQnJvd3Nlck9wdGlvbnMpOiBQcm9taXNlPEJyb3dzZXJPcGVuUmVzdWx0PiB7XG4gIGNvbnN0IHRhcmdldFBvcnQgPSBvcHRpb25zLnBvcnQgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCBiYXNlVXJsID0gYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHt0YXJnZXRQb3J0fWA7XG5cbiAgLy8gQnVpbGQgVVJMIHdpdGggb3B0aW9uYWwgdGFiIGhhc2ggYW5kIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgbGV0IHVybCA9IGJhc2VVcmw7XG4gIGlmIChvcHRpb25zLnRhYikge1xuICAgIGNvbnN0IHFzID0gb3B0aW9ucy51cmxQYXJhbXMgPyBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdGlvbnMudXJsUGFyYW1zKS50b1N0cmluZygpIDogJyc7XG4gICAgdXJsID0gYCR7YmFzZVVybH0vIyR7b3B0aW9ucy50YWJ9JHtxcyA/ICc/JyArIHFzIDogJyd9YDtcbiAgfSBlbHNlIGlmIChvcHRpb25zLnVybFBhcmFtcyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLnVybFBhcmFtcykubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRpb25zLnVybFBhcmFtcykudG9TdHJpbmcoKTtcbiAgICB1cmwgPSBgJHtiYXNlVXJsfS8jcG9ydGZvbGlvPyR7cXN9YDtcbiAgfVxuXG4gIGNvbnN0IGFscmVhZHlSdW5uaW5nID0gc2VydmVyUnVubmluZztcblxuICBpZiAoIXNlcnZlclJ1bm5pbmcpIHtcbiAgICBhd2FpdCBzdGFydEZhbGxiYWNrU2VydmVyKG9wdGlvbnMsIHRhcmdldFBvcnQpO1xuICB9XG5cbiAgY29uc3QgYnJvd3NlclJlc3VsdCA9IGF3YWl0IG9wZW5JbkJyb3dzZXIodXJsKTtcblxuICByZXR1cm4ge1xuICAgIHVybCxcbiAgICBhbHJlYWR5UnVubmluZyxcbiAgICBicm93c2VyT3BlbmVkOiBicm93c2VyUmVzdWx0LnN1Y2Nlc3MsXG4gICAgLi4uKGJyb3dzZXJSZXN1bHQuZXJyb3IgPyB7IHdhcm5pbmc6IGBCcm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgYXV0b21hdGljYWxseTogJHticm93c2VyUmVzdWx0LmVycm9yfS4gT3BlbiAke3VybH0gbWFudWFsbHkuYCB9IDoge30pLFxuICB9O1xufVxuIl19
550
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQTRCLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2QyxPQUFPLEVBQUUs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R0FBRyxHQUFHLE9BQU8sZUFBZSxFQUFFLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDO0lBRXJDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixNQUFNLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFL0MsT0FBTztRQUNMLEdBQUc7UUFDSCxjQUFjO1FBQ2QsYUFBYSxFQUFFLGFBQWEsQ0FBQyxPQUFPO1FBQ3BDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSw4Q0FBOEMsYUFBYSxDQUFDLEtBQUssVUFBVSxHQUFHLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDeEksQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERvbGxob3VzZU1DUCBXZWIgVUkgU2VydmVyXG4gKlxuICogTGlnaHR3ZWlnaHQgRXhwcmVzcyBzZXJ2ZXIgZm9yIGJyb3dzaW5nIHBvcnRmb2xpbyBlbGVtZW50cyBpbiBhIGJyb3dzZXIuXG4gKiBCb3VuZCB0byAxMjcuMC4wLjEgb25seSAobG9jYWxob3N0KS4gUmVhZC1vbmx5IGZvciBWMS5cbiAqXG4gKiBDYW4gYmUgc3RhcnRlZCBzdGFuZGFsb25lIChgLS13ZWJgIGZsYWcpIG9yIGZyb20gd2l0aGluIHRoZSBNQ1Agc2VydmVyXG4gKiBwcm9jZXNzIHZpYSBgb3BlblBvcnRmb2xpb0Jyb3dzZXIoKWAuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzcwNFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzc3NFxuICovXG5cbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgam9pbiwgZGlybmFtZSwgZXh0bmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgZXhlY0ZpbGUgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCByZWFkRmlsZSBhcyByZWFkRmlsZUZzIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVBcGlSb3V0ZXMsIGNyZWF0ZUdhdGV3YXlBcGlSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dSb3V0ZXMsIHR5cGUgTG9nUm91dGVzUmVzdWx0IH0gZnJvbSAnLi9yb3V0ZXMvbG9nUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZU1ldHJpY3NSb3V0ZXMsIHR5cGUgTWV0cmljc1JvdXRlc1Jlc3VsdCB9IGZyb20gJy4vcm91dGVzL21ldHJpY3NSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlSGVhbHRoUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvaGVhbHRoUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNldHVwUm91dGVzLCByZXBhaXJOdm1MYXVuY2hlck9uU3RhcnR1cCB9IGZyb20gJy4vcm91dGVzL3NldHVwUm91dGVzLmpzJztcbmltcG9ydCB7IHJlcGFpclBlcm1pc3Npb25Ib29rc09uU3RhcnR1cCB9IGZyb20gJy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUb3RwUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvdG90cFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUb2tlblJvdXRlcyB9IGZyb20gJy4vcm91dGVzL3Rva2VuUm91dGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB0eXBlIHsgTUNQQVFMSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlNZXRyaWNzU2luayB9IGZyb20gJy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBDb25zb2xlVG9rZW5TdG9yZSB9IGZyb20gJy4vY29uc29sZS9jb25zb2xlVG9rZW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aE1pZGRsZXdhcmUgfSBmcm9tICcuL21pZGRsZXdhcmUvYXV0aE1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIFB1YmxpYyBwYXRoIHByZWZpeGVzIHRoYXQgbmV2ZXIgcmVxdWlyZSBhdXRoZW50aWNhdGlvbiAoIzE3ODApLlxuICogVGhlc2UgZW5kcG9pbnRzIHJldHVybiBzYWZlIG1ldGFkYXRhIG9yIGFjdCBhcyBoZWFsdGggcHJvYmVzIOKAlCByZXF1aXJpbmdcbiAqIHRva2VucyBvbiB0aGVtIHdvdWxkIGJyZWFrIG1vbml0b3JpbmcgYW5kIGNsaWVudCBkZXRlY3Rpb24gd2l0aG91dCBhZGRpbmdcbiAqIHJlYWwgc2VjdXJpdHkgdmFsdWUuXG4gKi9cbmNvbnN0IFBVQkxJQ19QQVRIX1BSRUZJWEVTID0gW1xuICAnL2FwaS9oZWFsdGgnLFxuICAnL2FwaS9zZXR1cC92ZXJzaW9uJyxcbiAgJy9hcGkvc2V0dXAvbWNwYicsXG4gICcvYXBpL3NldHVwL2RldGVjdCcsXG4gICcvYXBpL3NldHVwL2xpY2Vuc2UnLFxuXTtcblxuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBjdXJyZW50IGNvbnNvbGUgdG9rZW4uICovXG5jb25zdCBUT0tFTl9NRVRBX1BMQUNFSE9MREVSID0gJ3t7Q09OU09MRV9UT0tFTn19Jztcbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgcnVubmluZyBzZXJ2ZXIgdmVyc2lvbi4gKi9cbmNvbnN0IFZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiA9ICd7e0RPTExIT1VTRV9WRVJTSU9OfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdGFibGUgRG9sbGhvdXNlIHNlc3Npb24gSUQuICovXG5jb25zdCBTRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfU0VTU0lPTl9JRH19Jztcbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgcnVudGltZSBzZXNzaW9uIElELiAqL1xuY29uc3QgUlVOVElNRV9TRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfUlVOVElNRV9TRVNTSU9OX0lEfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhc3NldCBjYWNoZS1idXN0aW5nIHZlcnNpb24uICovXG5jb25zdCBBU1NFVF9WRVJTSU9OX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfQVNTRVRfVkVSU0lPTn19JztcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuLyoqXG4gKiBEZWZhdWx0IHBvcnQgZm9yIHN0YW5kYWxvbmUgYHN0YXJ0V2ViU2VydmVyYCBjYWxscy4gUmVhZHMgZnJvbSB0aGVcbiAqIGBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVGAgZW52IHZhciBzbyB0aGVyZSBpcyBhIHNpbmdsZSBzb3VyY2Ugb2ZcbiAqIHRydXRoIChzZWUgYHNyYy9jb25maWcvZW52LnRzYCkuIENhbGxlcnMgcGFzc2luZyBhbiBleHBsaWNpdCBgcG9ydGAgaW5cbiAqIGBXZWJTZXJ2ZXJPcHRpb25zYCBvdmVycmlkZSB0aGlzIGRlZmF1bHQuXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVDtcbmNvbnN0IENPTlNPTEVfSE9TVCA9ICdkb2xsaG91c2UubG9jYWxob3N0JztcbmNvbnN0IEFMTE9XRURfUEFHRV9FWFRFTlNJT05TID0gbmV3IFNldChbJy5odG1sJywgJy5odG0nXSk7XG4vKiogTWF4IEpTT04gYm9keSBmb3Igc2V0dXAgcm91dGVzIChpbnN0YWxsL29wZW4tY29uZmlnKS4gSW5nZXN0IHJvdXRlcyB1c2UgdGhlaXIgb3duIDFtYiBsaW1pdC4gKi9cbmNvbnN0IFNFVFVQX0JPRFlfTElNSVQgPSAnMWtiJztcblxuLyoqIFRyYWNrIHdoZXRoZXIgdGhlIHdlYiBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nIGluLXByb2Nlc3MuICovXG5sZXQgc2VydmVyUnVubmluZyA9IGZhbHNlO1xubGV0IHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4vKiogQWN0aXZlIEhUVFAgc2VydmVyIGluc3RhbmNlIOKAlCB0cmFja2VkIHNvIF9yZXNldFNlcnZlclN0YXRlIGNhbiBjbG9zZSBpdC4gKi9cbmxldCBhY3RpdmVIdHRwU2VydmVyOiBpbXBvcnQoJ25vZGU6aHR0cCcpLlNlcnZlciB8IG51bGwgPSBudWxsO1xuLyoqIENhY2hlZCB0b2tlbiBzdG9yZSBmb3Igb3BlblBvcnRmb2xpb0Jyb3dzZXIg4oCUIHByZXZlbnRzIGR1cGxpY2F0ZSBpbnN0YW5jZXMgb24gdGhlIHNhbWUgZmlsZS4gKi9cbmxldCBjYWNoZWRUb2tlblN0b3JlOiBDb25zb2xlVG9rZW5TdG9yZSB8IG51bGwgPSBudWxsO1xuXG4vKiogQ2hlY2sgd2hldGhlciB0aGUgd2ViIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIGluIHRoaXMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYlNlcnZlclJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gIHJldHVybiBzZXJ2ZXJSdW5uaW5nO1xufVxuXG4vKipcbiAqIFJlc2V0IG1vZHVsZS1sZXZlbCBzZXJ2ZXIgc3RhdGUuIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHkg4oCUXG4gKiBhbGxvd3MgdGVzdHMgdG8gZXhlcmNpc2Ugc3RhcnRXZWJTZXJ2ZXIvYmluZEFuZExpc3RlbiB3aXRob3V0XG4gKiBpbnRlcmZlcmVuY2UgZnJvbSBwcmlvciBydW5zIGluIHRoZSBzYW1lIHByb2Nlc3MuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFNlcnZlclN0YXRlKCk6IHZvaWQge1xuICBpZiAoYWN0aXZlSHR0cFNlcnZlcikge1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIuY2xvc2UoKTtcbiAgICBhY3RpdmVIdHRwU2VydmVyID0gbnVsbDtcbiAgfVxuICBzZXJ2ZXJSdW5uaW5nID0gZmFsc2U7XG4gIHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4gIGNhY2hlZFRva2VuU3RvcmUgPSBudWxsO1xufVxuXG4vKipcbiAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBIVFRQIHNlcnZlciAoIzE4NTYpLlxuICogQ2xvc2VzIHRoZSBhY3RpdmUgc2VydmVyIGFuZCByZXNldHMgbW9kdWxlIHN0YXRlIHNvIHRoZSBwb3J0IGlzIGZyZWVkXG4gKiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBsaW5nZXJpbmcgdW50aWwgcHJvY2VzcyBleGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2h1dGRvd25XZWJTZXJ2ZXIoKTogdm9pZCB7XG4gIGlmIChhY3RpdmVIdHRwU2VydmVyKSB7XG4gICAgYWN0aXZlSHR0cFNlcnZlci5jbG9zZSgpO1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBudWxsO1xuICAgIHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbiAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBIVFRQIHNlcnZlciBjbG9zZWQgb24gcG9ydCAke3NlcnZlclBvcnR9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyB0aGUgd2ViIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZXJ2ZXJPcHRpb25zIHtcbiAgLyoqIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdHMgdG8gYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCwgc2VlIGBzcmMvY29uZmlnL2Vudi50c2ApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBQYXRoIHRvIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5IChlLmcuLCB+Ly5kb2xsaG91c2UvcG9ydGZvbGlvKSAqL1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgLyoqIE9wZW4gdGhlIGJyb3dzZXIgYXV0b21hdGljYWxseSBhZnRlciBzdGFydGluZyAoZGVmYXVsdDogZmFsc2UpICovXG4gIG9wZW5Ccm93c2VyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE1DUEFRTEhhbmRsZXIgZm9yIHJvdXRpbmcgdGhyb3VnaCB0aGUgTUNQLUFRTCBwaXBlbGluZS5cbiAgICogV2hlbiBwcm92aWRlZCwgQVBJIHJvdXRlcyB1c2UgdGhlIGdhdGV3YXkgKHZhbGlkYXRlZCwgY2FjaGVkLCBnYXRla2VlcGVyLWNoZWNrZWQpLlxuICAgKiBXaGVuIGFic2VudCwgZmFsbHMgYmFjayB0byBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MgKGxlZ2FjeSBiZWhhdmlvcikuXG4gICAqIElzc3VlICM3OTY6IFdlYiBNQ1AtQVFMIEdhdGV3YXkuXG4gICAqL1xuICBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcjtcbiAgLyoqIE1lbW9yeUxvZ1NpbmsgZm9yIGxvZyByb3V0ZXMgKG9wdGlvbmFsIOKAlCBsb2dzIHRhYiBkaXNhYmxlZCBpZiBub3QgcHJvdmlkZWQpICovXG4gIG1lbW9yeVNpbms/OiBNZW1vcnlMb2dTaW5rO1xuICAvKiogTWVtb3J5TWV0cmljc1NpbmsgZm9yIG1ldHJpY3Mgcm91dGVzIChvcHRpb25hbCDigJQgbWV0cmljcyB0YWIgZGlzYWJsZWQgaWYgbm90IHByb3ZpZGVkKSAqL1xuICBtZXRyaWNzU2luaz86IE1lbW9yeU1ldHJpY3NTaW5rO1xuICAvKiogQWRkaXRpb25hbCByb3V0ZXJzIHRvIG1vdW50IGJlZm9yZSB0aGUgU1BBIGZhbGxiYWNrIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhZGRpdGlvbmFsUm91dGVycz86IGltcG9ydCgnZXhwcmVzcycpLlJvdXRlcltdO1xuICAvKipcbiAgICogQ29uc29sZSB0b2tlbiBzdG9yZSAoIzE3ODApLiBXaGVuIHByb3ZpZGVkLCB0aGUgc2VydmVyIHdpbGw6XG4gICAqICAgMS4gTW91bnQgQmVhcmVyIHRva2VuIGF1dGggbWlkZGxld2FyZSBiZWZvcmUgcHJvdGVjdGVkIHJvdXRlcnMuXG4gICAqICAgMi4gSW5qZWN0IHRoZSBwcmltYXJ5IHRva2VuIGludG8gaW5kZXguaHRtbCBzbyB0aGUgYnJvd3NlciBjbGllbnRcbiAgICogICAgICBjYW4gYXR0YWNoIGl0IHRvIGZldGNoIGNhbGxzIGFuZCBFdmVudFNvdXJjZSBVUkxzLlxuICAgKiAgIDMuIEFwcGVuZCB0aGUgdG9rZW4gZmlsZSBsb2NhdGlvbiB0byB0aGUgc3RhcnR1cCBiYW5uZXIuXG4gICAqIEF1dGggZW5mb3JjZW1lbnQgaXMgc3RpbGwgZ2F0ZWQgb24gRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQg4oCUIHRoZVxuICAgKiBtaWRkbGV3YXJlIGlzIGEgcGFzcy10aHJvdWdoIHdoZW4gdGhlIGZsYWcgaXMgZmFsc2UgKHRoZSBQaGFzZSAxIGRlZmF1bHQpLlxuICAgKi9cbiAgdG9rZW5TdG9yZT86IENvbnNvbGVUb2tlblN0b3JlO1xuICAvKiogU3RhYmxlIERvbGxob3VzZSBzZXNzaW9uIGlkZW50aXR5IHNob3duIGluIHRoZSB3ZWIgY29uc29sZSBVSS4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAvKiogUnVudGltZS11bmlxdWUgc2Vzc2lvbiBpZGVudGl0eSBmb3IgZGlhZ25vc3RpY3MuICovXG4gIHJ1bnRpbWVTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8gYSBwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBlcnJvcj86ICdFQUREUklOVVNFJyB8ICdPVEhFUic7XG4gIGRldGFpbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgdGhlIHdlYiBzZXJ2ZXIsIGluY2x1ZGluZyBob29rcyBmb3IgREkgd2lyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlclJlc3VsdCB7XG4gIC8qKiBFeHByZXNzIGFwcCBpbnN0YW5jZSDigJQgZm9yIG1vdW50aW5nIGFkZGl0aW9uYWwgcm91dGVzIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhcHA/OiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzO1xuICAvKiogTG9nIGJyb2FkY2FzdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggZW50cnkgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBsb2dCcm9hZGNhc3Q/OiAoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDtcbiAgLyoqIE1ldHJpY3Mgc25hcHNob3QgZnVuY3Rpb24g4oCUIGNhbGwgd2l0aCBlYWNoIHNuYXBzaG90IHRvIHB1c2ggdG8gU1NFIGNsaWVudHMgKi9cbiAgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IGltcG9ydCgnLi4vbWV0cmljcy90eXBlcy5qcycpLk1ldHJpY1NuYXBzaG90KSA9PiB2b2lkO1xuICAvKiogUmVzdWx0IG9mIHRoZSBwb3J0IGJpbmRpbmcgYXR0ZW1wdCAqL1xuICBiaW5kUmVzdWx0PzogQmluZFJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBvcGVuIHRoZSBicm93c2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJPcGVuUmVzdWx0IHtcbiAgLyoqIFRoZSBVUkwgdGhlIHNlcnZlciBpcyBydW5uaW5nIG9uICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IHJ1bm5pbmcgKHRydWUpIG9yIGp1c3Qgc3RhcnRlZCAoZmFsc2UpICovXG4gIGFscmVhZHlSdW5uaW5nOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYnJvd3NlciB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZCAqL1xuICBicm93c2VyT3BlbmVkOiBib29sZWFuO1xuICAvKiogV2FybmluZyBtZXNzYWdlIGlmIHRoZSBicm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgKi9cbiAgd2FybmluZz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcGVuIGEgVVJMIGluIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJyb3dzZXIuXG4gKlxuICogUGxhdGZvcm0tYXdhcmU6XG4gKiAtIG1hY09TOiBgb3BlbmBcbiAqIC0gTGludXg6IGB4ZGctb3BlbmBcbiAqIC0gV2luZG93czogYHN0YXJ0YFxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG9wZW5cbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBicm93c2VyIG9wZW5lZCwgZmFsc2Ugd2l0aCBlcnJvciBtZXNzYWdlIGlmIG5vdFxuICovXG5mdW5jdGlvbiBvcGVuSW5Ccm93c2VyKHVybDogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgY29uc3QgY21kID0gcGxhdCA9PT0gJ2RhcndpbicgPyAnb3BlbidcbiAgICAgIDogcGxhdCA9PT0gJ3dpbjMyJyA/ICdzdGFydCdcbiAgICAgIDogJ3hkZy1vcGVuJztcblxuICAgIC8vIFNlY3VyaXR5OiB1c2UgZXhlY0ZpbGUgd2l0aCBVUkwgYXMgYXJndW1lbnQgYXJyYXksIG5vdCBzdHJpbmcgaW50ZXJwb2xhdGlvblxuICAgIGNvbnN0IHVybFN0ciA9IFN0cmluZyh1cmwpO1xuICAgIC8vIEFjY2VwdCBsb2NhbGhvc3QsIDEyNy4wLjAuMSwgYW5kICoubG9jYWxob3N0IHN1YmRvbWFpbnMgKFJGQyA2NzYxKVxuICAgIGlmICghL15odHRwcz86XFwvXFwvKGxvY2FsaG9zdHwxMjdcXC4wXFwuMFxcLjF8W1xcdy1dK1xcLmxvY2FsaG9zdClbOi9dLy50ZXN0KHVybFN0cikpIHtcbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVUkwgbXVzdCBiZSBhIGxvY2FsaG9zdCBIVFRQIFVSTCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4ZWNGaWxlKGNtZCwgW3VybFN0cl0sIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gQ291bGQgbm90IGF1dG8tb3BlbiBicm93c2VyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgcG9ydGZvbGlvIHdlYiBzZXJ2ZXIuXG4gKlxuICogQmluZHMgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFNlcnZlcyB0aGUgcG9ydGZvbGlvIGJyb3dzZXJcbiAqIGZyb250ZW5kIGFuZCBBUEkgcm91dGVzIGZvciByZWFkaW5nIGVsZW1lbnRzLlxuICpcbiAqIElkZW1wb3RlbnQ6IGlmIHRoZSBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nLCBvcHRpb25hbGx5IG9wZW5zIHRoZVxuICogYnJvd3NlciB3aXRob3V0IHN0YXJ0aW5nIGEgc2Vjb25kIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEhvb2tzIGZvciBESSB3aXJpbmcgKGxvZyBicm9hZGNhc3QsIG1ldHJpY3Mgb25TbmFwc2hvdClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0V2ViU2VydmVyKG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdlYlNlcnZlclJlc3VsdD4ge1xuICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0IHx8IERFRkFVTFRfUE9SVDtcbiAgY29uc3QgcmVzdWx0OiBXZWJTZXJ2ZXJSZXN1bHQgPSB7fTtcblxuICBpZiAoc2VydmVyUnVubmluZykge1xuICAgIGlmIChvcHRpb25zLm9wZW5Ccm93c2VyKSB7XG4gICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7c2VydmVyUG9ydH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgcmVzdWx0LmFwcCA9IGFwcDtcbiAgYXBwLmRpc2FibGUoJ3gtcG93ZXJlZC1ieScpO1xuXG4gIC8vIFNlY3VyaXR5IGhlYWRlcnNcbiAgYXBwLnVzZSgoX3JlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgcmVzLnNldEhlYWRlcignWC1GcmFtZS1PcHRpb25zJywgJ0RFTlknKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLVhTUy1Qcm90ZWN0aW9uJywgJzE7IG1vZGU9YmxvY2snKTtcbiAgICByZXMuc2V0SGVhZGVyKCdSZWZlcnJlci1Qb2xpY3knLCAnbm8tcmVmZXJyZXInKTtcbiAgICByZXMuc2V0SGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBbXG4gICAgICBcImRlZmF1bHQtc3JjICdzZWxmJ1wiLFxuICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyBjZG4uanNkZWxpdnIubmV0IGNkbmpzLmNsb3VkZmxhcmUuY29tXCIsXG4gICAgICBcInN0eWxlLXNyYyAnc2VsZicgJ3Vuc2FmZS1pbmxpbmUnIGNkbmpzLmNsb3VkZmxhcmUuY29tIGNkbi5qc2RlbGl2ci5uZXRcIixcbiAgICAgIFwiaW1nLXNyYyAnc2VsZicgZGF0YTpcIixcbiAgICAgIFwiY29ubmVjdC1zcmMgJ3NlbGYnIHJhdy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgIFwiZm9udC1zcmMgJ3NlbGYnXCIsXG4gICAgXS5qb2luKCc7ICcpKTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIENvbnNvbGUgdG9rZW4gYXV0aGVudGljYXRpb24gbWlkZGxld2FyZSAoIzE3ODApLiBNb3VudGVkIGJlZm9yZSBhbnkgL2FwaVxuICAvLyByb3V0ZXMgc28gZXZlcnkgcHJvdGVjdGVkIGVuZHBvaW50IGdvZXMgdGhyb3VnaCBpdC4gV2hlbiB0aGUgZmVhdHVyZSBmbGFnXG4gIC8vIERPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEIGlzIGZhbHNlIChQaGFzZSAxIGRlZmF1bHQpIHRoaXMgaXMgYSBwYXNzLXRocm91Z2guXG4gIC8vIFB1YmxpYyBlbmRwb2ludHMgaW4gUFVCTElDX1BBVEhfUFJFRklYRVMgYWx3YXlzIGJ5cGFzcyBhdXRoIHJlZ2FyZGxlc3Mgb2YgZmxhZy5cbiAgaWYgKG9wdGlvbnMudG9rZW5TdG9yZSkge1xuICAgIGNvbnN0IGF1dGhNaWRkbGV3YXJlID0gY3JlYXRlQXV0aE1pZGRsZXdhcmUoe1xuICAgICAgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSxcbiAgICAgIGVuYWJsZWQ6IGVudi5ET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCxcbiAgICAgIHB1YmxpY1BhdGhQcmVmaXhlczogUFVCTElDX1BBVEhfUFJFRklYRVMsXG4gICAgICBsYWJlbDogJ2FwaScsXG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGF1dGhNaWRkbGV3YXJlKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBbV2ViVUldIENvbnNvbGUgYXV0aCBtaWRkbGV3YXJlIG1vdW50ZWQgJHtlbnYuRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgPyAnRU5GT1JDSU5HJyA6ICdwYXNzLXRocm91Z2ggKGZsYWcgb2ZmKSd9YCxcbiAgICApO1xuXG4gICAgLy8gVE9UUCBlbnJvbGxtZW50IHJvdXRlcyAoIzE3OTQpLiBNb3VudGVkIEFGVEVSIHRoZSAvYXBpIGF1dGggbWlkZGxld2FyZVxuICAgIC8vIGJlY2F1c2UgdGhlIHJvdXRlciBhZGRzIGl0cyBvd24gYWx3YXlzLW9uIGF1dGggZ3VhcmQg4oCUIHRoZSBnbG9iYWwgYXV0aFxuICAgIC8vIG1pZGRsZXdhcmUgYXQgL2FwaSBpcyBhIHBhc3MtdGhyb3VnaCBkdXJpbmcgUGhhc2UgMSByb2xsb3V0LCBidXQgdGhlXG4gICAgLy8gVE9UUCByb3V0ZXIgZW5mb3JjZXMgcmVnYXJkbGVzcyBvZiBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCBzbyBhblxuICAgIC8vIGF0dGFja2VyIHdpdGggbG9jYWwgcG9ydCBhY2Nlc3MgY2Fubm90IHByZS1lbnJvbGwgYSBzZWNvbmQgZmFjdG9yIGFuZFxuICAgIC8vIGxvY2sgdGhlIGxlZ2l0aW1hdGUgdXNlciBvdXQuXG4gICAgYXBwLnVzZSgnL2FwaS9jb25zb2xlL3RvdHAnLCBjcmVhdGVUb3RwUm91dGVzKHsgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSB9KSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gVE9UUCByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2NvbnNvbGUvdG90cCAoYWx3YXlzLW9uIGF1dGgpJyk7XG5cbiAgICAvLyBUb2tlbiBtYW5hZ2VtZW50IHJvdXRlcyAoIzE3OTUpLiBNb3VudGVkIGFsb25nc2lkZSB0aGUgVE9UUCByb3V0ZXIgd2l0aFxuICAgIC8vIHRoZSBzYW1lIGFsd2F5cy1vbiBhdXRoIHBhdHRlcm4uIEN1cnJlbnRseSBob3N0cyB0aGUgcm90YXRpb24gZW5kcG9pbnQ7XG4gICAgLy8gZnV0dXJlIHRva2VuIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyAobGlzdCwgcmV2b2tlKSBnbyBoZXJlIHRvby5cbiAgICBhcHAudXNlKCcvYXBpL2NvbnNvbGUvdG9rZW4nLCBjcmVhdGVUb2tlblJvdXRlcyh7IHN0b3JlOiBvcHRpb25zLnRva2VuU3RvcmUgfSkpO1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIFRva2VuIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvY29uc29sZS90b2tlbiAoYWx3YXlzLW9uIGF1dGgpJyk7XG4gIH1cblxuICAvLyBTZXR1cCByb3V0ZXM6IGF1dG8taW5zdGFsbCBEb2xsaG91c2VNQ1AgdG8gTUNQIGNsaWVudHMgKG1vdW50IEJFRk9SRSBBUEkgcm91dGVzKVxuICAvLyBCb2R5IGxpbWl0IHNjb3BlZCB0byBzZXR1cCByb3V0ZXMgb25seSDigJQgaW5nZXN0IHJvdXRlcyBuZWVkIDFtYiBmb3IgZm9sbG93ZXIgbG9nIGZvcndhcmRpbmdcbiAgY29uc3Qgc2V0dXBKc29uUGFyc2VyID0gZXhwcmVzcy5qc29uKHsgbGltaXQ6IFNFVFVQX0JPRFlfTElNSVQsIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgY29uc3QgeyBpbnN0YWxsSGFuZGxlciwgb3BlbkNvbmZpZ0hhbmRsZXIsIHZlcnNpb25IYW5kbGVyLCBtY3BiUmVkaXJlY3RIYW5kbGVyLCBkZXRlY3RIYW5kbGVyLCBnZXRMaWNlbnNlSGFuZGxlciwgc2V0TGljZW5zZUhhbmRsZXIsIHZlcmlmeUxpY2Vuc2VIYW5kbGVyLCByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyIH0gPSBjcmVhdGVTZXR1cFJvdXRlcygpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9pbnN0YWxsJywgc2V0dXBKc29uUGFyc2VyLCBpbnN0YWxsSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL29wZW4tY29uZmlnJywgc2V0dXBKc29uUGFyc2VyLCBvcGVuQ29uZmlnSGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvdmVyc2lvbicsIHZlcnNpb25IYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9tY3BiJywgbWNwYlJlZGlyZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvZGV0ZWN0JywgZGV0ZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvbGljZW5zZScsIGdldExpY2Vuc2VIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvbGljZW5zZScsIHNldHVwSnNvblBhcnNlciwgc2V0TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3ZlcmlmeScsIHNldHVwSnNvblBhcnNlciwgdmVyaWZ5TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3Jlc2VuZCcsIHNldHVwSnNvblBhcnNlciwgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlcik7XG4gIGxvZ2dlci5pbmZvKCdbV2ViVUldIFNldHVwIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvc2V0dXAnKTtcblxuICAvLyBGaXJlLWFuZC1mb3JnZXQgTlZNIGxhdW5jaGVyIHJlcGFpcjogcmVjcmVhdGVzIHRoZSB3cmFwcGVyIGlmIGRlbGV0ZWQgYW5kXG4gIC8vIHBhdGNoZXMgYW55IHByZS1leGlzdGluZyBjb25maWdzIHRoYXQgc3RpbGwgdXNlIGJhcmUgYG5weGAuIE5vLW9wcyB3aGVuXG4gIC8vIE5WTSBpcyBhYnNlbnQgb3Igb24gV2luZG93cy4gTmV2ZXIgZGVsYXlzIHNlcnZlciBzdGFydHVwLlxuICByZXBhaXJOdm1MYXVuY2hlck9uU3RhcnR1cCgpLmNhdGNoKGVyciA9PlxuICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIE5WTSBzdGFydHVwIHJlcGFpciB0aHJldyB1bmV4cGVjdGVkbHk6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApXG4gICk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgcmVwYWlyUGVybWlzc2lvbkhvb2tzT25TdGFydHVwKClcbiAgICAgIC50aGVuKChzdW1tYXJ5KSA9PiB7XG4gICAgICAgIGlmIChzdW1tYXJ5Lm5lZWRzUmVwYWlyQ291bnQgPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgW1NldHVwXSBQZXJtaXNzaW9uIGhvb2sgc3RhcnR1cCByZXBhaXIgY29tcGxldGVkIHdpdGggJHtzdW1tYXJ5Lm5lZWRzUmVwYWlyQ291bnR9IGlzc3VlKHMpIGAgK1xuICAgICAgICAgICAgYGFjcm9zcyAke3N1bW1hcnkuaG9zdFJlc3VsdHMubGVuZ3RofSBob3N0KHMpYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PlxuICAgICAgICBsb2dnZXIud2FybihgW1NldHVwXSBQZXJtaXNzaW9uIGhvb2sgc3RhcnR1cCByZXBhaXIgdGhyZXcgdW5leHBlY3RlZGx5OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEFQSSByb3V0ZXMg4oCUIHVzZSBNQ1AtQVFMIGdhdGV3YXkgd2hlbiBoYW5kbGVyIGlzIGF2YWlsYWJsZSAoSXNzdWUgIzc5NilcbiAgaWYgKG9wdGlvbnMubWNwQXFsSGFuZGxlcikge1xuICAgIGFwcC51c2UoJy9hcGknLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzKG9wdGlvbnMubWNwQXFsSGFuZGxlciwgb3B0aW9ucy5wb3J0Zm9saW9EaXIpKTtcblxuICAgIC8vIFBlcm1pc3Npb24gZXZhbHVhdGlvbiByb3V0ZXMgKFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24sIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzKVxuICAgIGNvbnN0IHsgcmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMuanMnKTtcbiAgICBjb25zdCBwZXJtUm91dGVyID0gKGF3YWl0IGltcG9ydCgnZXhwcmVzcycpKS5Sb3V0ZXIoKTtcbiAgICByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMocGVybVJvdXRlciwgb3B0aW9ucy5tY3BBcWxIYW5kbGVyKTtcbiAgICBhcHAudXNlKCcvYXBpJywgcGVybVJvdXRlcik7XG5cbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBBUEkgcm91dGVzIHVzaW5nIE1DUC1BUUwgR2F0ZXdheSArIHBlcm1pc3Npb24gcm91dGVzJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUFwaVJvdXRlcyhvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuICAgIGxvZ2dlci53YXJuKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChubyBNQ1AtQVFMIGhhbmRsZXIgYXZhaWxhYmxlKScpO1xuICB9XG5cbiAgLy8gQ29uc29sZSByb3V0ZXM6IGxvZ3MsIG1ldHJpY3MsIGhlYWx0aCDigJQgZXh0cmFjdGVkIHRvIGtlZXAgY29nbml0aXZlXG4gIC8vIGNvbXBsZXhpdHkgb2Ygc3RhcnRXZWJTZXJ2ZXIgbWFuYWdlYWJsZS5cbiAgbW91bnRDb25zb2xlUm91dGVzKGFwcCwgb3B0aW9ucywgcmVzdWx0KTtcblxuICAvLyBTZXJ2ZSB+Ly5kb2xsaG91c2UvcGFnZXMvIGF0IC9wYWdlcy8g4oCUIGRhc2hib2FyZHMsIGdlbmVyYXRlZCBjb250ZW50LCBzdGFjayB2aWV3c1xuICBjb25zdCBwYWdlc0RpciA9IGpvaW4oZGlybmFtZShvcHRpb25zLnBvcnRmb2xpb0RpciksICdwYWdlcycpO1xuICBta2RpcihwYWdlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSkuY2F0Y2goZXJyID0+IHtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSBDb3VsZCBub3QgY3JlYXRlIHBhZ2VzIGRpcmVjdG9yeTogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9KTtcbiAgYXBwLnVzZSgnL3BhZ2VzJywgZXhwcmVzcy5zdGF0aWMocGFnZXNEaXIpKTtcblxuICAvKipcbiAgICogR0VUIC9hcGkvcGFnZXNcbiAgICogTGlzdHMgYXZhaWxhYmxlIEhUTUwgcGFnZXMgaW4gfi8uZG9sbGhvdXNlL3BhZ2VzLy5cbiAgICogUmV0dXJucyBwYWdlIG5hbWVzIGFuZCB0aGVpciBVUkxzIGZvciB0aGUgbWFuYWdlbWVudCBjb25zb2xlLlxuICAgKi9cbiAgYXBwLmdldCgnL2FwaS9wYWdlcycsIGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKHBhZ2VzRGlyKTtcbiAgICAgIGNvbnN0IHBhZ2VzID0gZmlsZXNcbiAgICAgICAgLmZpbHRlcihmID0+ICFmLnN0YXJ0c1dpdGgoJy4nKSAmJiBBTExPV0VEX1BBR0VfRVhURU5TSU9OUy5oYXMoZXh0bmFtZShmKSkpXG4gICAgICAgIC5tYXAoZiA9PiAoeyBuYW1lOiBmLCB1cmw6IGAvcGFnZXMvJHtmfWAgfSkpO1xuICAgICAgcmVzLmpzb24oeyBwYWdlcywgZGlyZWN0b3J5OiBwYWdlc0RpciB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlcy5qc29uKHsgcGFnZXM6IFtdLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkaXRpb25hbCByb3V0ZXJzIChlLmcuLCB1bmlmaWVkIGNvbnNvbGUgaW5nZXN0IHJvdXRlcykg4oCUIG11c3QgbW91bnQgYmVmb3JlIFNQQSBmYWxsYmFja1xuICBvcHRpb25zLmFkZGl0aW9uYWxSb3V0ZXJzPy5mb3JFYWNoKHJvdXRlciA9PiBhcHAudXNlKHJvdXRlcikpO1xuXG4gIC8vIFN0YXRpYyBmcm9udGVuZCBmaWxlc1xuICBjb25zdCBwdWJsaWNEaXIgPSBqb2luKF9fZGlybmFtZSwgJ3B1YmxpYycpO1xuICAvLyBTZXJ2ZSBzdGF0aWMgYXNzZXRzIGJ1dCBza2lwIGluZGV4Lmh0bWwg4oCUIHRoZSBTUEEgZmFsbGJhY2sgYmVsb3dcbiAgLy8gaGFuZGxlcyBpdCB3aXRoIHRva2VuIGluamVjdGlvbiAocmVwbGFjZXMge3tDT05TT0xFX1RPS0VOfX0gaW4gdGhlXG4gIC8vIG1ldGEgdGFnKS4gV2l0aG91dCB0aGlzLCBleHByZXNzLnN0YXRpYyBzZXJ2ZXMgdGhlIHJhdyB0ZW1wbGF0ZVxuICAvLyBhbmQgdGhlIGJyb3dzZXIgbmV2ZXIgZ2V0cyB0aGUgYXV0aCB0b2tlbiAoIzE3ODApLlxuICBjb25zdCBpc0RlYnVnID0gQm9vbGVhbihwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcgfHwgcHJvY2Vzcy5lbnYuRU5BQkxFX0RFQlVHKTtcbiAgYXBwLnVzZShleHByZXNzLnN0YXRpYyhwdWJsaWNEaXIsIHtcbiAgICBpbmRleDogZmFsc2UsXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgZGlzYWJsZSBjYWNoaW5nIG9uIGFsbCBzdGF0aWMgYXNzZXRzIChKUywgQ1NTKSBzb1xuICAgIC8vIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiBub3JtYWwgcmVsb2FkIHdpdGhvdXQgQ21kK1NoaWZ0K1IuXG4gICAgLi4uKGlzRGVidWdcbiAgICAgID8geyBldGFnOiBmYWxzZSwgbGFzdE1vZGlmaWVkOiBmYWxzZSwgbWF4QWdlOiAwIH1cbiAgICAgIDogeyBtYXhBZ2U6ICcxeScsIGltbXV0YWJsZTogdHJ1ZSB9KSxcbiAgfSkpO1xuXG4gIC8vIFNQQSBmYWxsYmFjayB3aXRoIGNvbnNvbGUgdG9rZW4gaW5qZWN0aW9uICgjMTc4MCkuXG4gIC8vIFJlYWRzIGluZGV4Lmh0bWwgb24gZmlyc3QgcmVxdWVzdCwgc3Vic3RpdHV0ZXMgdGhlIHt7Q09OU09MRV9UT0tFTn19IHBsYWNlaG9sZGVyXG4gIC8vIHdpdGggdGhlIGN1cnJlbnQgdG9rZW4gdmFsdWUsIGFuZCBjYWNoZXMgdGhlIHJlbmRlcmVkIHN0cmluZy4gVGhlIGNhY2hlIGlzXG4gIC8vIGF1dG8taW52YWxpZGF0ZWQgd2hlbiB0aGUgcHJpbWFyeSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbiksIHNvIGEgcGFnZSByZWxvYWRcbiAgLy8gYWZ0ZXIgcm90YXRpb24gcGlja3MgdXAgdGhlIG5ldyB0b2tlbiB3aXRob3V0IGEgc2VydmVyIHJlc3RhcnQuXG4gIGxldCBjYWNoZWRJbmRleEh0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgY2FjaGVkVG9rZW5WYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGluZGV4SHRtbFBhdGggPSBqb2luKHB1YmxpY0RpciwgJ2luZGV4Lmh0bWwnKTtcblxuICBjb25zdCByZW5kZXJJbmRleEh0bWwgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCB0b2tlblZhbHVlID0gb3B0aW9ucy50b2tlblN0b3JlPy5nZXRQcmltYXJ5VG9rZW5WYWx1ZSgpID8/ICcnO1xuICAgIC8vIEF1dG8taW52YWxpZGF0ZSBjYWNoZSB3aGVuIHRoZSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbikuXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgYWx3YXlzIHJlLXJlYWQgZnJvbSBkaXNrIHNvIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiByZWxvYWQuXG4gICAgaWYgKCFpc0RlYnVnICYmIGNhY2hlZEluZGV4SHRtbCAhPT0gbnVsbCAmJiBjYWNoZWRUb2tlblZhbHVlID09PSB0b2tlblZhbHVlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkSW5kZXhIdG1sO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHJlYWRGaWxlRnMoaW5kZXhIdG1sUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBEZWZlbnNpdmUgSFRNTCBhdHRyaWJ1dGUgZXNjYXBlLiBUb2tlbnMgYXJlIHN0cmljdCA2NC1jaGFyIGxvd2VyY2FzZSBoZXhcbiAgICAvLyB0b2RheSBzbyBubyBlc2NhcGluZyBpcyBhY3R1YWxseSBuZWVkZWQsIGJ1dCBpZiB0aGUgdG9rZW4gZm9ybWF0IGV2ZXJcbiAgICAvLyBjaGFuZ2VzIHRoaXMgcHJldmVudHMgYW4gSFRNTC1pbmplY3Rpb24gcmVncmVzc2lvbiBmcm9tIGxhbmRpbmcgc2lsZW50bHkuXG4gICAgY29uc3QgZXNjYXBlZFRva2VuID0gdG9rZW5WYWx1ZVxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpO1xuICAgIGNvbnN0IGVzY2FwZWRTZXNzaW9uSWQgPSAob3B0aW9ucy5zZXNzaW9uSWQgPz8gJycpXG4gICAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXG4gICAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKVxuICAgICAgLnJlcGxhY2VBbGwoJzwnLCAnJmx0OycpXG4gICAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7Jyk7XG4gICAgY29uc3QgZXNjYXBlZFJ1bnRpbWVTZXNzaW9uSWQgPSAob3B0aW9ucy5ydW50aW1lU2Vzc2lvbklkID8/ICcnKVxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpO1xuICAgIGNhY2hlZEluZGV4SHRtbCA9IHRlbXBsYXRlXG4gICAgICAucmVwbGFjZUFsbChUT0tFTl9NRVRBX1BMQUNFSE9MREVSLCBlc2NhcGVkVG9rZW4pXG4gICAgICAucmVwbGFjZUFsbChWRVJTSU9OX01FVEFfUExBQ0VIT0xERVIsIFBBQ0tBR0VfVkVSU0lPTilcbiAgICAgIC5yZXBsYWNlQWxsKFNFU1NJT05fSURfTUVUQV9QTEFDRUhPTERFUiwgZXNjYXBlZFNlc3Npb25JZClcbiAgICAgIC5yZXBsYWNlQWxsKFJVTlRJTUVfU0VTU0lPTl9JRF9NRVRBX1BMQUNFSE9MREVSLCBlc2NhcGVkUnVudGltZVNlc3Npb25JZClcbiAgICAgIC5yZXBsYWNlQWxsKEFTU0VUX1ZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiwgUEFDS0FHRV9WRVJTSU9OKTtcbiAgICBjYWNoZWRUb2tlblZhbHVlID0gdG9rZW5WYWx1ZTtcbiAgICByZXR1cm4gY2FjaGVkSW5kZXhIdG1sO1xuICB9O1xuXG4gIGFwcC5nZXQoJy97KnBhdGh9JywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByZXEucGF0aC5ub3JtYWxpemUoJ05GQycpO1xuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvYXBpLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgQVBJIHJvdXRlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCgnL3BhZ2VzLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgUGFnZSBub3QgZm91bmQ6ICR7bm9ybWFsaXplZFBhdGh9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJJbmRleEh0bWwoKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIC8vIFRoZSBzaGVsbCBzaG91bGQgYWx3YXlzIHJldmFsaWRhdGUgc28gYSBmb3JjZWQgcmVsb2FkIGNhbiBwaWNrIHVwXG4gICAgICAvLyBhIG5ldyBsZWFkZXIvdmVyc2lvbiBpbW1lZGlhdGVseS4gQXNzZXQgZmlsZXMgdGhlbXNlbHZlcyBjYXJyeSBhXG4gICAgICAvLyB2ZXJzaW9uIHF1ZXJ5IGFuZCBjYW4gYmUgY2FjaGVkIGFnZ3Jlc3NpdmVseS5cbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NhY2hlLUNvbnRyb2wnLCAnbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUnKTtcbiAgICAgIHJlcy5zZW5kKGh0bWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUldIEZhaWxlZCB0byByZW5kZXIgaW5kZXguaHRtbDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoJ0ZhaWxlZCB0byBsb2FkIGNvbnNvbGUnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEdsb2JhbCBlcnJvciBoYW5kbGVyIOKAlCBjYXRjaCBFeHByZXNzIGVycm9ycyBhbmQgcm91dGUgdG8gbG9nZ2VyIGluc3RlYWQgb2YgdGVybWluYWwuXG4gIC8vIFdpdGhvdXQgdGhpcywgRXhwcmVzcyBkdW1wcyBzdGFjayB0cmFjZXMgdG8gc3RkZXJyICh2aXNpYmxlIGluIC0td2ViIHRlcm1pbmFsKS5cbiAgLy8gQWxsIGVycm9ycyBzdGlsbCBhcHBlYXIgaW4gdGhlIG1hbmFnZW1lbnQgY29uc29sZSdzIExvZ3MgdGFiIHZpYSBNZW1vcnlMb2dTaW5rLlxuICBhcHAudXNlKChlcnI6IEVycm9yLCBfcmVxOiBpbXBvcnQoJ2V4cHJlc3MnKS5SZXF1ZXN0LCByZXM6IGltcG9ydCgnZXhwcmVzcycpLlJlc3BvbnNlLCBfbmV4dDogaW1wb3J0KCdleHByZXNzJykuTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVyciBhcyBhbnkpLnN0YXR1cyB8fCAoZXJyIGFzIGFueSkuc3RhdHVzQ29kZSB8fCA1MDA7XG4gICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gJHtlcnIubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29uKHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQmluZCB0byBsb2NhbGhvc3Qgb25seSDigJQgaGFuZGxlIHBvcnQgY29uZmxpY3RzIGdyYWNlZnVsbHkuXG4gIC8vIEV4dHJhY3RlZCB0byBhIGhlbHBlciB0byBrZWVwIHN0YXJ0V2ViU2VydmVyJ3MgY29nbml0aXZlIGNvbXBsZXhpdHkgbWFuYWdlYWJsZS5cbiAgcmVzdWx0LmJpbmRSZXN1bHQgPSBhd2FpdCBiaW5kQW5kTGlzdGVuKGFwcCwgcG9ydCwgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBNb3VudCB0aGUgbG9ncywgbWV0cmljcywgYW5kIGhlYWx0aCByb3V0ZXMuIFRoZXNlIGFyZSBvbmx5IG1vdW50ZWQgd2hlbiB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgc2lua3MgYXJlIHByb3ZpZGVkIChtZW1vcnkgbG9nIHNpbmsgZm9yIGxvZ3MraGVhbHRoLCBtZXRyaWNzXG4gKiBzaW5rIGZvciB0aGUgbWV0cmljcyB0YWIpLiBFeHRyYWN0ZWQgZnJvbSBzdGFydFdlYlNlcnZlciB0byBjYXAgdGhlIG1haW5cbiAqIGZ1bmN0aW9uJ3MgY29nbml0aXZlIGNvbXBsZXhpdHkuXG4gKi9cbmZ1bmN0aW9uIG1vdW50Q29uc29sZVJvdXRlcyhcbiAgYXBwOiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzLFxuICBvcHRpb25zOiBXZWJTZXJ2ZXJPcHRpb25zLFxuICByZXN1bHQ6IFdlYlNlcnZlclJlc3VsdCxcbik6IHZvaWQge1xuICBsZXQgbG9nUm91dGVzOiBMb2dSb3V0ZXNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gIGxldCBtZXRyaWNzUm91dGVzOiBNZXRyaWNzUm91dGVzUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zLm1lbW9yeVNpbmspIHtcbiAgICBsb2dSb3V0ZXMgPSBjcmVhdGVMb2dSb3V0ZXMob3B0aW9ucy5tZW1vcnlTaW5rKTtcbiAgICBhcHAudXNlKCcvYXBpJywgbG9nUm91dGVzLnJvdXRlcik7XG4gICAgcmVzdWx0LmxvZ0Jyb2FkY2FzdCA9IGxvZ1JvdXRlcy5icm9hZGNhc3Q7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gTG9nIHZpZXdlciByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2xvZ3MnKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm1ldHJpY3NTaW5rKSB7XG4gICAgbWV0cmljc1JvdXRlcyA9IGNyZWF0ZU1ldHJpY3NSb3V0ZXMob3B0aW9ucy5tZXRyaWNzU2luayk7XG4gICAgYXBwLnVzZSgnL2FwaScsIG1ldHJpY3NSb3V0ZXMucm91dGVyKTtcbiAgICByZXN1bHQubWV0cmljc09uU25hcHNob3QgPSBtZXRyaWNzUm91dGVzLm9uU25hcHNob3Q7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gTWV0cmljcyByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL21ldHJpY3MnKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm1lbW9yeVNpbmspIHtcbiAgICBjb25zdCBoZWFsdGhSb3V0ZXIgPSBjcmVhdGVIZWFsdGhSb3V0ZXMoe1xuICAgICAgbWVtb3J5U2luazogb3B0aW9ucy5tZW1vcnlTaW5rLFxuICAgICAgbWV0cmljc1Npbms6IG9wdGlvbnMubWV0cmljc1NpbmssXG4gICAgICBsb2dDbGllbnRDb3VudDogbG9nUm91dGVzID8gbG9nUm91dGVzLmNsaWVudENvdW50IDogKCkgPT4gMCxcbiAgICAgIG1ldHJpY3NDbGllbnRDb3VudDogbWV0cmljc1JvdXRlcyA/IG1ldHJpY3NSb3V0ZXMuY2xpZW50Q291bnQgOiAoKSA9PiAwLFxuICAgIH0pO1xuICAgIGFwcC51c2UoJy9hcGknLCBoZWFsdGhSb3V0ZXIpO1xuICB9XG59XG5cbi8qKlxuICogUHJpbnQgdGhlIHN0YXJ0dXAgYmFubmVyIHRvIHN0ZGVyci5cbiAqXG4gKiBOT1RFOiBVc2Ugc3RkZXJyIGZvciB0ZXJtaW5hbCBvdXRwdXQsIG5vdCBzdGRvdXQuIEluIE1DUCBzdGRpbyBtb2RlLCBzdGRvdXRcbiAqIGlzIHJlc2VydmVkIGZvciBKU09OLVJQQyBtZXNzYWdlcyDigJQgYW55IG5vbi1KU09OIG91dHB1dCBjb3JydXB0cyB0aGUgcHJvdG9jb2wuXG4gKiBzdGRlcnIgaXMgc2FmZSBmb3IgaHVtYW4tcmVhZGFibGUgbWVzc2FnZXMgaW4gYm90aCBNQ1AgYW5kIHN0YW5kYWxvbmUgbW9kZXMuXG4gKi9cbmZ1bmN0aW9uIHByaW50U3RhcnR1cEJhbm5lcihwb3J0OiBudW1iZXIsIHRva2VuU3RvcmU6IENvbnNvbGVUb2tlblN0b3JlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IHVybCA9IGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gO1xuICBjb25zdCBmYWxsYmFja1VybCA9IGBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBNYW5hZ2VtZW50IGNvbnNvbGUgcnVubmluZyBhdCAke3VybH1gKTtcbiAgY29uc29sZS5lcnJvcihgXFxuICBEb2xsaG91c2VNQ1AgTWFuYWdlbWVudCBDb25zb2xlXFxuICAke3VybH1cXG4gICR7ZmFsbGJhY2tVcmx9IChmYWxsYmFjaylcXG5gKTtcbiAgaWYgKHRva2VuU3RvcmUpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgIFNlc3Npb24gdG9rZW46ICR7dG9rZW5TdG9yZS5nZXRGaWxlUGF0aCgpfVxcbmApO1xuICB9XG4gIGNvbnNvbGUuZXJyb3IoYCAgVHlwZSBcInFcIiBvciBcInF1aXRcIiB0byBleGl0LlxcbmApO1xufVxuXG4vLyBTdGFsZSBwcm9jZXNzIHJlY292ZXJ5IOKAlCBleHRyYWN0ZWQgdG8gU3RhbGVQcm9jZXNzUmVjb3ZlcnkudHMgZm9yIGluZGVwZW5kZW50IHRlc3RpbmcgKCMxODUwKS5cbmltcG9ydCB7IHJlY292ZXJTdGFsZVBvcnQgfSBmcm9tICcuL2NvbnNvbGUvU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMnO1xuZXhwb3J0IHsgZmluZFBpZE9uUG9ydCwga2lsbFN0YWxlUHJvY2VzcywgcmVjb3ZlclN0YWxlUG9ydCB9IGZyb20gJy4vY29uc29sZS9TdGFsZVByb2Nlc3NSZWNvdmVyeS5qcyc7XG5cbi8qKlxuICogQXR0ZW1wdCBhIHNpbmdsZSBwb3J0IGJpbmQuIFJldHVybnMgYSBCaW5kUmVzdWx0IHdpdGhvdXQgYW55IHJlY292ZXJ5IGxvZ2ljLlxuICovXG5mdW5jdGlvbiBhdHRlbXB0QmluZChcbiAgYXBwOiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzLFxuICBwb3J0OiBudW1iZXIsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4pOiBQcm9taXNlPEJpbmRSZXN1bHQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPEJpbmRSZXN1bHQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgaHR0cFNlcnZlciA9IGFwcC5saXN0ZW4ocG9ydCwgJzEyNy4wLjAuMScsICgpID0+IHtcbiAgICAgIHNlcnZlclJ1bm5pbmcgPSB0cnVlO1xuICAgICAgc2VydmVyUG9ydCA9IHBvcnQ7XG4gICAgICBhY3RpdmVIdHRwU2VydmVyID0gaHR0cFNlcnZlcjtcbiAgICAgIHByaW50U3RhcnR1cEJhbm5lcihwb3J0LCBvcHRpb25zLnRva2VuU3RvcmUpO1xuICAgICAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICAgICAgb3BlbkluQnJvd3NlcihgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICBodHRwU2VydmVyLm9uKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VBRERSSU5VU0UnLCBkZXRhaWw6IGBQb3J0ICR7cG9ydH0gYWxyZWFkeSBpbiB1c2VgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUldIEZhaWxlZCB0byBiaW5kIHBvcnQgJHtwb3J0fTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ09USEVSJywgZGV0YWlsOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQmluZCB0aGUgRXhwcmVzcyBhcHAgdG8gMTI3LjAuMC4xOnBvcnQuIE9uIEVBRERSSU5VU0UsIGF0dGVtcHQgdG8gZmluZFxuICogYW5kIGtpbGwgdGhlIHN0YWxlIERvbGxob3VzZU1DUCBwcm9jZXNzIGhvbGRpbmcgdGhlIHBvcnQsIHRoZW4gcmV0cnkgb25jZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYmluZEFuZExpc3RlbihcbiAgYXBwOiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzLFxuICBwb3J0OiBudW1iZXIsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4pOiBQcm9taXNlPEJpbmRSZXN1bHQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXR0ZW1wdEJpbmQoYXBwLCBwb3J0LCBvcHRpb25zKTtcbiAgaWYgKHJlc3VsdC5zdWNjZXNzIHx8IHJlc3VsdC5lcnJvciAhPT0gJ0VBRERSSU5VU0UnKSByZXR1cm4gcmVzdWx0O1xuXG4gIC8vIFBvcnQgb2NjdXBpZWQg4oCUIGF0dGVtcHQgc3RhbGUgcHJvY2VzcyByZWNvdmVyeSBhbmQgcmV0cnlcbiAgaWYgKGF3YWl0IHJlY292ZXJTdGFsZVBvcnQocG9ydCkpIHtcbiAgICBjb25zdCByZXRyeVJlc3VsdCA9IGF3YWl0IGF0dGVtcHRCaW5kKGFwcCwgcG9ydCwgb3B0aW9ucyk7XG4gICAgaWYgKHJldHJ5UmVzdWx0LnN1Y2Nlc3MpIHJldHVybiByZXRyeVJlc3VsdDtcbiAgfVxuXG4gIC8vIFN0aWxsIGNhbid0IGJpbmQg4oCUIGZhbGwgdGhyb3VnaCB3aXRoIHdhcm5pbmdcbiAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gUG9ydCAke3BvcnR9IGFscmVhZHkgaW4gdXNlIOKAlCBhbm90aGVyIHByb2Nlc3MgaG9sZHMgdGhpcyBwb3J0YCk7XG4gIGNvbnNvbGUuZXJyb3IoYFxcbiAgRG9sbGhvdXNlTUNQIE1hbmFnZW1lbnQgQ29uc29sZSAoZXhpc3RpbmcgaW5zdGFuY2UpXFxuICBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1cXG5gKTtcbiAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE9wZW4gdGhlIHBvcnRmb2xpbyBicm93c2VyIGZyb20gd2l0aGluIHRoZSBNQ1Agc2VydmVyIHByb2Nlc3MuXG4gKlxuICogU3RhcnRzIHRoZSB3ZWIgc2VydmVyIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcsIHRoZW4gb3BlbnMgdGhlIHN5c3RlbVxuICogYnJvd3NlciB0byB0aGUgcG9ydGZvbGlvIFVJLiBSZXR1cm5zIGEgcmVzdWx0IG9iamVjdCBpbmRpY2F0aW5nXG4gKiB3aGV0aGVyIHRoZSBzZXJ2ZXIgc3RhcnRlZCBhbmQgdGhlIGJyb3dzZXIgb3BlbmVkIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBDYWxsZWQgYnkgdGhlIGBvcGVuX3BvcnRmb2xpb19icm93c2VyYCBNQ1AtQVFMIG9wZXJhdGlvbiAoSXNzdWUgIzc3NCkuXG4gKlxuICogQHBhcmFtIHBvcnRmb2xpb0RpciAtIFBhdGggdG8gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnkgKGUuZy4sIH4vLmRvbGxob3VzZS9wb3J0Zm9saW8pXG4gKiBAcGFyYW0gcG9ydCAtIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdHMgdG8gYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYClcbiAqIEByZXR1cm5zIFJlc3VsdCB3aXRoIFVSTCwgc2VydmVyIHN0YXR1cywgYW5kIGJyb3dzZXIgb3BlbiBzdGF0dXNcbiAqL1xuLyoqXG4gKiBPcHRpb25zIGZvciBvcGVuaW5nIHRoZSBwb3J0Zm9saW8gYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQnJvd3Nlck9wdGlvbnMge1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgbWNwQXFsSGFuZGxlcj86IE1DUEFRTEhhbmRsZXI7XG4gIHRhYj86IHN0cmluZztcbiAgdXJsUGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgbWVtb3J5U2luaz86IE1lbW9yeUxvZ1Npbms7XG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG59XG5cbi8qKlxuICogU2VsZi1wcm92aXNpb24gc2lua3MsIHRva2VuIHN0b3JlLCBhbmQgaW5nZXN0IHJvdXRlcywgdGhlbiBzdGFydCB0aGUgd2ViXG4gKiBzZXJ2ZXIuIEV4dHJhY3RlZCBmcm9tIG9wZW5Qb3J0Zm9saW9Ccm93c2VyIHRvIGtlZXAgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAqIG1hbmFnZWFibGUgKFNvbmFyQ2xvdWQgUzM3NzYpLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEZhbGxiYWNrU2VydmVyKG9wdGlvbnM6IE9wZW5Ccm93c2VyT3B0aW9ucywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBtZW1vcnlTaW5rID0gb3B0aW9ucy5tZW1vcnlTaW5rO1xuICBsZXQgbWV0cmljc1NpbmsgPSBvcHRpb25zLm1ldHJpY3NTaW5rO1xuXG4gIGlmICghbWVtb3J5U2luaykge1xuICAgIGNvbnN0IHsgTWVtb3J5TG9nU2luazogTG9nU2luayB9ID0gYXdhaXQgaW1wb3J0KCcuLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnKTtcbiAgICBtZW1vcnlTaW5rID0gbmV3IExvZ1NpbmsoeyBhcHBDYXBhY2l0eTogMTAwMDAsIHNlY3VyaXR5Q2FwYWNpdHk6IDUwMDAsIHBlcmZDYXBhY2l0eTogMjAwMCwgdGVsZW1ldHJ5Q2FwYWNpdHk6IDEwMDAgfSk7XG4gIH1cbiAgaWYgKCFtZXRyaWNzU2luaykge1xuICAgIGNvbnN0IHsgTWVtb3J5TWV0cmljc1Npbms6IE1ldHJpY3NTaW5rIH0gPSBhd2FpdCBpbXBvcnQoJy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnKTtcbiAgICBtZXRyaWNzU2luayA9IG5ldyBNZXRyaWNzU2luaygyNDApO1xuICB9XG5cbiAgLy8gUmV1c2UgY2FjaGVkIHRva2VuIHN0b3JlIOKAlCB0d28gaW5zdGFuY2VzIG9uIHRoZSBzYW1lIGZpbGUgY2FuIHJhY2Ugb24gd3JpdGVzLlxuICBpZiAoIWNhY2hlZFRva2VuU3RvcmUpIHtcbiAgICBjb25zdCB7IENvbnNvbGVUb2tlblN0b3JlOiBUb2tlblN0b3JlIH0gPSBhd2FpdCBpbXBvcnQoJy4vY29uc29sZS9jb25zb2xlVG9rZW4uanMnKTtcbiAgICBjb25zdCB7IHBpY2tSYW5kb21Ub2tlbk5hbWUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL1Nlc3Npb25OYW1lcy5qcycpO1xuICAgIGNhY2hlZFRva2VuU3RvcmUgPSBuZXcgVG9rZW5TdG9yZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gICAgdHJ5IHsgYXdhaXQgY2FjaGVkVG9rZW5TdG9yZS5lbnN1cmVJbml0aWFsaXplZChwaWNrUmFuZG9tVG9rZW5OYW1lKCkpOyB9XG4gICAgY2F0Y2ggKGVycikgeyBsb2dnZXIud2FybignW1dlYlVJXSBGYWlsZWQgdG8gaW5pdCB0b2tlbiBzdG9yZSBmb3IgYnJvd3NlciBvcGVuJywgZXJyKTsgfVxuICB9XG5cbiAgLy8gbG9nQnJvYWRjYXN0IGlzIGRlZmVycmVkIOKAlCB3aXJlZCBhZnRlciBzdGFydFdlYlNlcnZlciByZXR1cm5zIHRoZSByZWFsIGJyb2FkY2FzdCBmbi5cbiAgbGV0IGxpdmVCcm9hZGNhc3Q6ICgoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgY3JlYXRlSW5nZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vY29uc29sZS9Jbmdlc3RSb3V0ZXMuanMnKTtcbiAgY29uc3QgaW5nZXN0UmVzdWx0ID0gY3JlYXRlSW5nZXN0Um91dGVzKHtcbiAgICBsb2dCcm9hZGNhc3Q6IChlbnRyeSkgPT4gbGl2ZUJyb2FkY2FzdD8uKGVudHJ5KSxcbiAgICBzdG9yZU1ldHJpY3NTbmFwc2hvdDogKHNuYXBzaG90KSA9PiBtZXRyaWNzU2luaz8ub25TbmFwc2hvdChzbmFwc2hvdCksXG4gIH0pO1xuICBpbmdlc3RSZXN1bHQucmVnaXN0ZXJDb25zb2xlU2Vzc2lvbigpO1xuXG4gIGNvbnN0IHdlYlJlc3VsdCA9IGF3YWl0IHN0YXJ0V2ViU2VydmVyKHtcbiAgICBwb3J0Zm9saW9EaXI6IG9wdGlvbnMucG9ydGZvbGlvRGlyLFxuICAgIHBvcnQsXG4gICAgb3BlbkJyb3dzZXI6IGZhbHNlLFxuICAgIG1jcEFxbEhhbmRsZXI6IG9wdGlvbnMubWNwQXFsSGFuZGxlcixcbiAgICBtZW1vcnlTaW5rLFxuICAgIG1ldHJpY3NTaW5rLFxuICAgIHRva2VuU3RvcmU6IGNhY2hlZFRva2VuU3RvcmUsXG4gICAgYWRkaXRpb25hbFJvdXRlcnM6IFtpbmdlc3RSZXN1bHQucm91dGVyXSxcbiAgfSk7XG5cbiAgbGl2ZUJyb2FkY2FzdCA9IHdlYlJlc3VsdC5sb2dCcm9hZGNhc3Q7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuUG9ydGZvbGlvQnJvd3NlcihvcHRpb25zOiBPcGVuQnJvd3Nlck9wdGlvbnMpOiBQcm9taXNlPEJyb3dzZXJPcGVuUmVzdWx0PiB7XG4gIGNvbnN0IHRhcmdldFBvcnQgPSBvcHRpb25zLnBvcnQgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCBiYXNlVXJsID0gYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHt0YXJnZXRQb3J0fWA7XG5cbiAgLy8gQnVpbGQgVVJMIHdpdGggb3B0aW9uYWwgdGFiIGhhc2ggYW5kIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgbGV0IHVybCA9IGJhc2VVcmw7XG4gIGlmIChvcHRpb25zLnRhYikge1xuICAgIGNvbnN0IHFzID0gb3B0aW9ucy51cmxQYXJhbXMgPyBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdGlvbnMudXJsUGFyYW1zKS50b1N0cmluZygpIDogJyc7XG4gICAgdXJsID0gYCR7YmFzZVVybH0vIyR7b3B0aW9ucy50YWJ9JHtxcyA/ICc/JyArIHFzIDogJyd9YDtcbiAgfSBlbHNlIGlmIChvcHRpb25zLnVybFBhcmFtcyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLnVybFBhcmFtcykubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRpb25zLnVybFBhcmFtcykudG9TdHJpbmcoKTtcbiAgICB1cmwgPSBgJHtiYXNlVXJsfS8jcG9ydGZvbGlvPyR7cXN9YDtcbiAgfVxuXG4gIGNvbnN0IGFscmVhZHlSdW5uaW5nID0gc2VydmVyUnVubmluZztcblxuICBpZiAoIXNlcnZlclJ1bm5pbmcpIHtcbiAgICBhd2FpdCBzdGFydEZhbGxiYWNrU2VydmVyKG9wdGlvbnMsIHRhcmdldFBvcnQpO1xuICB9XG5cbiAgY29uc3QgYnJvd3NlclJlc3VsdCA9IGF3YWl0IG9wZW5JbkJyb3dzZXIodXJsKTtcblxuICByZXR1cm4ge1xuICAgIHVybCxcbiAgICBhbHJlYWR5UnVubmluZyxcbiAgICBicm93c2VyT3BlbmVkOiBicm93c2VyUmVzdWx0LnN1Y2Nlc3MsXG4gICAgLi4uKGJyb3dzZXJSZXN1bHQuZXJyb3IgPyB7IHdhcm5pbmc6IGBCcm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgYXV0b21hdGljYWxseTogJHticm93c2VyUmVzdWx0LmVycm9yfS4gT3BlbiAke3VybH0gbWFudWFsbHkuYCB9IDoge30pLFxuICB9O1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "2.0.29",
3
+ "version": "2.0.30",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -44,6 +44,7 @@
44
44
  "test:all": "npm test && npm run test:performance && npm run test:integration",
45
45
  "test:all:coverage": "npm run test:coverage && npm run test:integration:coverage",
46
46
  "lint": "eslint --max-warnings=0 --ext .ts src tests scripts",
47
+ "lint:shell": "shellcheck -x scripts/pretooluse-dollhouse.sh scripts/pretooluse-codex.sh scripts/pretooluse-cursor.sh scripts/pretooluse-gemini.sh scripts/pretooluse-vscode.sh scripts/pretooluse-windsurf.sh scripts/permission-port-discovery.sh scripts/permission-hook-config.sh",
47
48
  "lint:fix": "eslint --ext .ts src tests scripts --fix",
48
49
  "security:critical": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/security/tests --testNamePattern=\"(Command Injection|Path Traversal|YAML)\" --maxWorkers=4",
49
50
  "security:rapid": "npm run security:critical -- --testTimeout=30000",
@@ -144,6 +145,7 @@
144
145
  "dist/seed-elements/**",
145
146
  "scripts/pretooluse-dollhouse.sh",
146
147
  "scripts/permission-port-discovery.sh",
148
+ "scripts/permission-hook-config.sh",
147
149
  "scripts/pretooluse-vscode.sh",
148
150
  "scripts/pretooluse-cursor.sh",
149
151
  "scripts/pretooluse-windsurf.sh",
@@ -0,0 +1,67 @@
1
+ #!/bin/bash
2
+ # permission-hook-config.sh — shared runtime configuration helpers for
3
+ # Dollhouse permission hook wrappers.
4
+
5
+ PERMISSION_HOOK_DEFAULT_AUTHORITY_CACHE_TTL_SECONDS=2
6
+ PERMISSION_HOOK_MIN_AUTHORITY_CACHE_TTL_SECONDS=0
7
+ PERMISSION_HOOK_MAX_AUTHORITY_CACHE_TTL_SECONDS=30
8
+
9
+ PERMISSION_HOOK_DEFAULT_MAX_RETRIES=2
10
+ PERMISSION_HOOK_MIN_MAX_RETRIES=0
11
+ PERMISSION_HOOK_MAX_MAX_RETRIES=5
12
+
13
+ PERMISSION_HOOK_DEFAULT_INITIAL_TIMEOUT=5
14
+ PERMISSION_HOOK_MIN_INITIAL_TIMEOUT=1
15
+ PERMISSION_HOOK_MAX_INITIAL_TIMEOUT=30
16
+
17
+ permission_hook_resolve_bounded_int() {
18
+ local raw_value="$1"
19
+ local fallback_value="$2"
20
+ local minimum_value="$3"
21
+ local maximum_value="$4"
22
+
23
+ if [[ ! "$raw_value" =~ ^[0-9]+$ ]]; then
24
+ echo "$fallback_value"
25
+ return 0
26
+ fi
27
+
28
+ if (( raw_value < minimum_value )); then
29
+ echo "$minimum_value"
30
+ return 0
31
+ fi
32
+
33
+ if (( raw_value > maximum_value )); then
34
+ echo "$maximum_value"
35
+ return 0
36
+ fi
37
+
38
+ echo "$raw_value"
39
+ return 0
40
+ }
41
+
42
+ permission_hook_load_runtime_config() {
43
+ AUTHORITY_CACHE_TTL_SECONDS="$(
44
+ permission_hook_resolve_bounded_int \
45
+ "${DOLLHOUSE_HOOK_AUTHORITY_CACHE_TTL_SECONDS:-$PERMISSION_HOOK_DEFAULT_AUTHORITY_CACHE_TTL_SECONDS}" \
46
+ "$PERMISSION_HOOK_DEFAULT_AUTHORITY_CACHE_TTL_SECONDS" \
47
+ "$PERMISSION_HOOK_MIN_AUTHORITY_CACHE_TTL_SECONDS" \
48
+ "$PERMISSION_HOOK_MAX_AUTHORITY_CACHE_TTL_SECONDS"
49
+ )"
50
+ MAX_RETRIES="$(
51
+ permission_hook_resolve_bounded_int \
52
+ "${DOLLHOUSE_HOOK_MAX_RETRIES:-$PERMISSION_HOOK_DEFAULT_MAX_RETRIES}" \
53
+ "$PERMISSION_HOOK_DEFAULT_MAX_RETRIES" \
54
+ "$PERMISSION_HOOK_MIN_MAX_RETRIES" \
55
+ "$PERMISSION_HOOK_MAX_MAX_RETRIES"
56
+ )"
57
+ INITIAL_TIMEOUT="$(
58
+ permission_hook_resolve_bounded_int \
59
+ "${DOLLHOUSE_HOOK_INITIAL_TIMEOUT:-$PERMISSION_HOOK_DEFAULT_INITIAL_TIMEOUT}" \
60
+ "$PERMISSION_HOOK_DEFAULT_INITIAL_TIMEOUT" \
61
+ "$PERMISSION_HOOK_MIN_INITIAL_TIMEOUT" \
62
+ "$PERMISSION_HOOK_MAX_INITIAL_TIMEOUT"
63
+ )"
64
+
65
+ export AUTHORITY_CACHE_TTL_SECONDS MAX_RETRIES INITIAL_TIMEOUT
66
+ return 0
67
+ }
@@ -17,16 +17,14 @@
17
17
  # Set DOLLHOUSE_HOOK_PLATFORM to override the platform sent to the server.
18
18
 
19
19
  RUN_DIR="$HOME/.dollhouse/run"
20
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
21
+ # shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
22
+ source "$SCRIPT_DIR/permission-hook-config.sh"
23
+ # shellcheck disable=SC2034 # Consumed by permission-port-discovery.sh after sourcing.
20
24
  PORT_FILE="$RUN_DIR/permission-server.port"
21
25
  AUTHORITY_FILE="$RUN_DIR/permission-authority.json"
22
- AUTHORITY_CACHE_TTL_SECONDS=2
23
- MAX_RETRIES="${DOLLHOUSE_HOOK_MAX_RETRIES:-2}"
24
- INITIAL_TIMEOUT="${DOLLHOUSE_HOOK_INITIAL_TIMEOUT:-5}"
25
26
  HOOK_PLATFORM="${DOLLHOUSE_HOOK_PLATFORM:-claude_code}"
26
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
27
-
28
- [[ "$MAX_RETRIES" =~ ^[0-9]+$ ]] || MAX_RETRIES=2
29
- [[ "$INITIAL_TIMEOUT" =~ ^[0-9]+$ ]] || INITIAL_TIMEOUT=5
27
+ permission_hook_load_runtime_config
30
28
 
31
29
  # Debug logging helper — writes to stderr so it doesn't pollute stdout
32
30
  debug() {
@@ -36,6 +34,35 @@ debug() {
36
34
  return 0
37
35
  }
38
36
 
37
+ emit_allow_response() {
38
+ case "$HOOK_PLATFORM" in
39
+ claude_code|vscode)
40
+ printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
41
+ ;;
42
+ codex)
43
+ printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","permissionDecisionReason":""}}'
44
+ ;;
45
+ cursor)
46
+ printf '%s\n' '{"permission":"allow"}'
47
+ ;;
48
+ gemini)
49
+ printf '%s\n' '{"decision":"allow"}'
50
+ ;;
51
+ *)
52
+ printf '%s\n' '{}'
53
+ ;;
54
+ esac
55
+
56
+ return 0
57
+ }
58
+
59
+ fail_open() {
60
+ local message="$1"
61
+ debug "$message"
62
+ emit_allow_response
63
+ return 0
64
+ }
65
+
39
66
  authority_host_for_platform() {
40
67
  case "$HOOK_PLATFORM" in
41
68
  claude_code) echo "claude-code" ;;
@@ -156,11 +183,12 @@ normalize_response() {
156
183
  return 0
157
184
  }
158
185
 
186
+ # shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
159
187
  source "$SCRIPT_DIR/permission-port-discovery.sh"
160
188
 
161
189
  # Discover the port from the shared file or the newest live PID-keyed file
162
190
  if ! PORT=$(resolve_permission_port); then
163
- debug "No usable permission server port file found — fail open"
191
+ fail_open "No usable permission server port file found — fail open"
164
192
  exit 0
165
193
  fi
166
194
 
@@ -176,7 +204,7 @@ TOOL_INPUT=$(echo "$INPUT" | jq -c '.tool_input // .toolInput // .input // {}' 2
176
204
 
177
205
  # If we can't parse the input, fail open
178
206
  if [[ -z "$TOOL_NAME" ]]; then
179
- debug "Could not parse tool_name from input — fail open"
207
+ fail_open "Could not parse tool_name from input — fail open"
180
208
  exit 0
181
209
  fi
182
210
 
@@ -188,7 +216,7 @@ AUTHORITY_MODE=$(resolve_authority_mode "$AUTHORITY_HOST")
188
216
  debug "Authority mode for ${AUTHORITY_HOST:-unknown}: $AUTHORITY_MODE"
189
217
 
190
218
  if [[ "$AUTHORITY_MODE" == "off" ]]; then
191
- debug "Authority mode is off — hook no-op"
219
+ fail_open "Authority mode is off — hook no-op"
192
220
  exit 0
193
221
  fi
194
222
 
@@ -222,14 +250,15 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
222
250
  if [[ $CURL_EXIT -eq 0 ]] && [[ -n "$RESPONSE" ]]; then
223
251
  debug "Response (attempt $((ATTEMPT+1))): $RESPONSE"
224
252
  if ! echo "$RESPONSE" | jq -e . >/dev/null 2>&1; then
225
- debug "Non-JSON response for platform $HOOK_PLATFORM — fail open"
253
+ fail_open "Non-JSON response for platform $HOOK_PLATFORM — fail open"
226
254
  exit 0
227
255
  fi
228
256
  NORMALIZED_RESPONSE=$(normalize_response "$RESPONSE")
229
257
  if [[ -n "$NORMALIZED_RESPONSE" ]]; then
230
258
  echo "$NORMALIZED_RESPONSE"
231
259
  else
232
- debug "Malformed response for platform $HOOK_PLATFORM — fail open"
260
+ fail_open "Malformed response for platform $HOOK_PLATFORM — fail open"
261
+ exit 0
233
262
  fi
234
263
  exit 0
235
264
  fi
@@ -244,5 +273,5 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
244
273
  done
245
274
 
246
275
  # All retries exhausted — fail open
247
- debug "All $((MAX_RETRIES + 1)) attempts failed — fail open"
276
+ fail_open "All $((MAX_RETRIES + 1)) attempts failed — fail open"
248
277
  exit 0
@@ -6,14 +6,13 @@
6
6
  # most relevant built-in tool names into Dollhouse's existing permission model.
7
7
 
8
8
  RUN_DIR="$HOME/.dollhouse/run"
9
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
+ # shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
11
+ source "$SCRIPT_DIR/permission-hook-config.sh"
12
+ # shellcheck disable=SC2034 # Consumed by permission-port-discovery.sh after sourcing.
9
13
  PORT_FILE="$RUN_DIR/permission-server.port"
10
- MAX_RETRIES="${DOLLHOUSE_HOOK_MAX_RETRIES:-2}"
11
- INITIAL_TIMEOUT="${DOLLHOUSE_HOOK_INITIAL_TIMEOUT:-5}"
12
14
  HOOK_PLATFORM="vscode"
13
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
-
15
- [[ "$MAX_RETRIES" =~ ^[0-9]+$ ]] || MAX_RETRIES=2
16
- [[ "$INITIAL_TIMEOUT" =~ ^[0-9]+$ ]] || INITIAL_TIMEOUT=5
15
+ permission_hook_load_runtime_config
17
16
 
18
17
  debug() {
19
18
  if [[ "${DOLLHOUSE_HOOK_DEBUG:-0}" == "1" ]]; then
@@ -22,10 +21,23 @@ debug() {
22
21
  return 0
23
22
  }
24
23
 
24
+ emit_allow_response() {
25
+ printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
26
+ return 0
27
+ }
28
+
29
+ fail_open() {
30
+ local message="$1"
31
+ debug "$message"
32
+ emit_allow_response
33
+ return 0
34
+ }
35
+
36
+ # shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
25
37
  source "$SCRIPT_DIR/permission-port-discovery.sh"
26
38
 
27
39
  if ! PORT=$(resolve_permission_port); then
28
- debug "No usable permission server port file found — fail open"
40
+ fail_open "No usable permission server port file found — fail open"
29
41
  exit 0
30
42
  fi
31
43
 
@@ -84,7 +96,7 @@ case "$RAW_TOOL_NAME" in
84
96
  esac
85
97
 
86
98
  if [[ -z "$TOOL_NAME" ]]; then
87
- debug "Could not parse VS Code tool name — fail open"
99
+ fail_open "Could not parse VS Code tool name — fail open"
88
100
  exit 0
89
101
  fi
90
102
 
@@ -147,7 +159,8 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
147
159
  if [[ -n "$HOOK_RESPONSE" ]]; then
148
160
  echo "$HOOK_RESPONSE"
149
161
  else
150
- debug "Permission evaluation returned an unrecognized response — fail open"
162
+ fail_open "Permission evaluation returned an unrecognized response — fail open"
163
+ exit 0
151
164
  fi
152
165
  exit 0
153
166
  fi
@@ -159,5 +172,5 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
159
172
  fi
160
173
  done
161
174
 
162
- debug "Permission evaluation failed — fail open"
175
+ fail_open "Permission evaluation failed — fail open"
163
176
  exit 0
@@ -6,14 +6,13 @@
6
6
  # evaluations and then maps the response back to Windsurf exit codes.
7
7
 
8
8
  RUN_DIR="$HOME/.dollhouse/run"
9
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
+ # shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
11
+ source "$SCRIPT_DIR/permission-hook-config.sh"
12
+ # shellcheck disable=SC2034 # Consumed by permission-port-discovery.sh after sourcing.
9
13
  PORT_FILE="$RUN_DIR/permission-server.port"
10
- MAX_RETRIES="${DOLLHOUSE_HOOK_MAX_RETRIES:-2}"
11
- INITIAL_TIMEOUT="${DOLLHOUSE_HOOK_INITIAL_TIMEOUT:-5}"
12
14
  HOOK_PLATFORM="windsurf"
13
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
-
15
- [[ "$MAX_RETRIES" =~ ^[0-9]+$ ]] || MAX_RETRIES=2
16
- [[ "$INITIAL_TIMEOUT" =~ ^[0-9]+$ ]] || INITIAL_TIMEOUT=5
15
+ permission_hook_load_runtime_config
17
16
 
18
17
  debug() {
19
18
  if [[ "${DOLLHOUSE_HOOK_DEBUG:-0}" == "1" ]]; then
@@ -22,6 +21,7 @@ debug() {
22
21
  return 0
23
22
  }
24
23
 
24
+ # shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
25
25
  source "$SCRIPT_DIR/permission-port-discovery.sh"
26
26
 
27
27
  if ! PORT=$(resolve_permission_port); then
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.DollhouseMCP/mcp-server",
4
4
  "title": "DollhouseMCP",
5
5
  "description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
6
- "version": "2.0.29",
6
+ "version": "2.0.30",
7
7
  "homepage": "https://dollhousemcp.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "registryType": "npm",
31
31
  "identifier": "@dollhousemcp/mcp-server",
32
- "version": "2.0.29",
32
+ "version": "2.0.30",
33
33
  "transport": {
34
34
  "type": "stdio"
35
35
  }