@dollhousemcp/mcp-server 2.0.30 → 2.0.32

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/data/ensembles/welcome-to-the-dollhouse.md +94 -0
  3. package/data/personas/dollhouse-expert.md +242 -14
  4. package/data/skills/research-to-elements.md +136 -0
  5. package/dist/elements/agents/AgentManager.d.ts +8 -1
  6. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  7. package/dist/elements/agents/AgentManager.js +49 -9
  8. package/dist/elements/ensembles/EnsembleManager.d.ts +36 -0
  9. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
  10. package/dist/elements/ensembles/EnsembleManager.js +94 -5
  11. package/dist/generated/version.d.ts +2 -2
  12. package/dist/generated/version.js +3 -3
  13. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  14. package/dist/handlers/mcp-aql/MCPAQLHandler.js +31 -2
  15. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  16. package/dist/handlers/mcp-aql/OperationSchema.js +8 -7
  17. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -1
  18. package/dist/handlers/mcp-aql/evaluatePermission.js +6 -3
  19. package/dist/server/tools/MCPAQLTools.js +21 -5
  20. package/dist/services/BuildInfoService.d.ts +3 -1
  21. package/dist/services/BuildInfoService.d.ts.map +1 -1
  22. package/dist/services/BuildInfoService.js +27 -5
  23. package/dist/utils/permissionHookShared.d.ts +39 -0
  24. package/dist/utils/permissionHookShared.d.ts.map +1 -1
  25. package/dist/utils/permissionHookShared.js +38 -1
  26. package/dist/utils/permissionHookStatus.d.ts.map +1 -1
  27. package/dist/utils/permissionHookStatus.js +6 -2
  28. package/dist/utils/permissionHooks.d.ts +1 -1
  29. package/dist/utils/permissionHooks.d.ts.map +1 -1
  30. package/dist/utils/permissionHooks.js +2 -2
  31. package/dist/web/public/app.js +213 -12
  32. package/dist/web/public/index.html +16 -7
  33. package/dist/web/public/styles.css +229 -30
  34. package/dist/web/routes/healthRoutes.d.ts.map +1 -1
  35. package/dist/web/routes/healthRoutes.js +3 -1
  36. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  37. package/dist/web/routes/permissionRoutes.js +10 -2
  38. package/package.json +1 -1
  39. package/scripts/pretooluse-dollhouse.sh +157 -39
  40. package/server.json +2 -2
@@ -722,7 +722,10 @@ export class AgentManager extends BaseElementManager {
722
722
  *
723
723
  * @since v2.0.0 - Agentic Loop Redesign
724
724
  */
725
- async executeAgent(name, parameters) {
725
+ async executeAgent(name, parameters,
726
+ // Thread the triggering MCP lifecycle op through validation so error messages
727
+ // can distinguish a fresh execute_agent call from a misused continue_execution.
728
+ context = {}) {
726
729
  try {
727
730
  // 1. Load agent by name
728
731
  const agent = await this.read(name);
@@ -766,7 +769,10 @@ export class AgentManager extends BaseElementManager {
766
769
  // 2b. Security validation of template parameters (Issue #103)
767
770
  this.validateParameterSecurity(clonedParameters);
768
771
  // 3. Validate parameters against goal.parameters schema
769
- this.validateParameters(metadata.goal, clonedParameters);
772
+ this.validateParameters(metadata.goal, clonedParameters, {
773
+ agentName: name,
774
+ operationName: context.operationName ?? 'execute_agent',
775
+ });
770
776
  // 4. Render goal template by replacing {parameter} placeholders
771
777
  const renderedGoal = this.renderGoalTemplate(metadata.goal.template, clonedParameters);
772
778
  // 4b. Detect unmatched placeholders after rendering (Issue #126)
@@ -957,13 +963,15 @@ export class AgentManager extends BaseElementManager {
957
963
  * Validate parameters against goal parameter schema
958
964
  * @private
959
965
  */
960
- validateParameters(goalConfig, parameters) {
966
+ validateParameters(goalConfig, parameters, context = {}) {
961
967
  const paramDefs = goalConfig.parameters || [];
968
+ const requiredParamNames = paramDefs
969
+ .filter(paramDef => paramDef.required)
970
+ .map(paramDef => paramDef.name);
962
971
  // Check all required parameters are present
963
- for (const paramDef of paramDefs) {
964
- if (paramDef.required && !(paramDef.name in parameters)) {
965
- throw new Error(`Missing required parameter: ${paramDef.name}`);
966
- }
972
+ const missingRequired = requiredParamNames.filter(paramName => !(paramName in parameters));
973
+ if (missingRequired.length > 0) {
974
+ throw new Error(this.formatMissingRequiredParametersError(missingRequired, requiredParamNames, context));
967
975
  }
968
976
  // Type check provided parameters
969
977
  for (const [key, value] of Object.entries(parameters)) {
@@ -999,6 +1007,26 @@ export class AgentManager extends BaseElementManager {
999
1007
  }
1000
1008
  }
1001
1009
  }
1010
+ /**
1011
+ * Build an actionable missing-parameter error for execute/continue calls.
1012
+ * @private
1013
+ */
1014
+ formatMissingRequiredParametersError(missingRequired, requiredParamNames, context) {
1015
+ const agentSuffix = context.agentName ? ` for agent '${context.agentName}'` : '';
1016
+ let message = `Missing required parameters${agentSuffix}: ${missingRequired.join(', ')}.`;
1017
+ if (requiredParamNames.length > 0) {
1018
+ message += ` Required goal parameters: ${requiredParamNames.join(', ')}.`;
1019
+ }
1020
+ message += ' Discover the full execution contract via mcp_aql_read introspect: ' +
1021
+ '{ operation: "introspect", params: { query: "operations", name: "execute_agent" } }.';
1022
+ if (context.operationName === 'continue_execution') {
1023
+ message += ' If you are reporting progress after execute_agent, use ' +
1024
+ 'mcp_aql_create record_execution_step instead. continue_execution is only ' +
1025
+ 'for resuming a previously paused execution and still requires the same ' +
1026
+ 'goal parameters as execute_agent.';
1027
+ }
1028
+ return message;
1029
+ }
1002
1030
  /**
1003
1031
  * Render goal template by replacing {parameter} placeholders
1004
1032
  * @private
@@ -2397,11 +2425,23 @@ export class AgentManager extends BaseElementManager {
2397
2425
  }
2398
2426
  // 2. Get current state
2399
2427
  const state = agent.getState();
2428
+ const activeGoal = state.goals.find(goal => goal.status === 'in_progress');
2429
+ if (!activeGoal) {
2430
+ throw new Error(`continue_execution requires an in-progress goal for agent '${params.agentName}'. ` +
2431
+ `Use execute_agent to start a new goal. If you are reporting progress for ` +
2432
+ `the current goal, use mcp_aql_create record_execution_step.`);
2433
+ }
2434
+ const activeGoalDecisions = state.decisions.filter(decision => decision.goalId === activeGoal.id);
2435
+ if (activeGoalDecisions.length === 0) {
2436
+ throw new Error(`continue_execution is only for resuming a paused execution after at least ` +
2437
+ `one recorded step for agent '${params.agentName}'. After execute_agent, the ` +
2438
+ `next lifecycle call is mcp_aql_create record_execution_step.`);
2439
+ }
2400
2440
  // 3. Check if agent has been executed before
2401
2441
  const isResuming = state.sessionCount > 0 || state.decisions.length > 0;
2402
2442
  // 4. Execute agent normally (this activates elements and gets context)
2403
2443
  const executionParams = params.parameters || {};
2404
- const executionResult = await this.executeAgent(params.agentName, executionParams);
2444
+ const executionResult = await this.executeAgent(params.agentName, executionParams, { operationName: 'continue_execution' });
2405
2445
  // 5. Build previous state summary
2406
2446
  const recentDecisions = state.decisions.slice(-5).map(d => ({
2407
2447
  decision: d.decision,
@@ -2468,4 +2508,4 @@ export class AgentManager extends BaseElementManager {
2468
2508
  return suggestions;
2469
2509
  }
2470
2510
  }
2471
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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QUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQztRQUN4QyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsV0FBVyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsY0FBYyxDQUFDLE1BQU0sb0JBQW9CLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnRNYW5hZ2VyIC0gUmVmYWN0b3JlZCB0byBleHRlbmQgQmFzZUVsZW1lbnRNYW5hZ2VyXG4gKiBNYW5hZ2VzIGFnZW50IENSVUQgb3BlcmF0aW9ucywgbWV0YWRhdGEgc2FuaXRpemF0aW9uLCBhbmQgc3RhdGUgcGVyc2lzdGVuY2UuXG4gKi9cblxuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi9BZ2VudC5qcyc7XG5pbXBvcnQge1xuICBDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT04sXG4gIEFHRU5UX0xJTUlUUyxcbiAgUklTS19UT0xFUkFOQ0VfTEVWRUxTLFxuICBTVEVQX0xJTUlUX0FDVElPTlMsXG4gIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMsXG4gIEJBQ0tPRkZfU1RSQVRFR0lFUyxcbiAgaXNPbmVPZixcbiAgbm9ybWFsaXplQXV0b25vbXlLZXlzLFxuICBub3JtYWxpemVSZXNpbGllbmNlS2V5cyxcbiAgbm9ybWFsaXplR29hbEtleXMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7XG4gIEFnZW50TWV0YWRhdGEsXG4gIEFnZW50U3RhdGUsXG4gIEV4ZWN1dGVBZ2VudFJlc3VsdCxcbiAgQWdlbnRHb2FsQ29uZmlnLFxuICBBZ2VudEdvYWxQYXJhbWV0ZXIsXG4gIEFnZW50TWV0YWRhdGFWMixcbiAgQWdlbnRHb2FsLFxuICBERUZBVUxUX1NBRkVUWV9DT05GSUcsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEF1dG9ub215RGlyZWN0aXZlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEdhdGhlcmVkRGF0YSwgdHlwZSBHYXRoZXJlZERhdGEgfSBmcm9tICcuL2dhdGhlcmVkRGF0YS5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZUF1dG9ub215IH0gZnJvbSAnLi9hdXRvbm9teUV2YWx1YXRvci5qcyc7XG5pbXBvcnQge1xuICBpc1YxQWdlbnQsXG4gIGNvbnZlcnRWMVRvVjIsXG59IGZyb20gJy4vdjFUb1YyQ29udmVydGVyLmpzJztcbmltcG9ydCB7XG4gIGRldGVybWluZVNhZmV0eVRpZXIsXG4gIGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZSxcbiAgY3JlYXRlQ29uZmlybWF0aW9uUmVxdWVzdCxcbiAgY3JlYXRlRGFuZ2VyWm9uZU9wZXJhdGlvbixcbiAgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSAnLi9zYWZldHlUaWVyU2VydmljZS5qcyc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyB0b1Npbmd1bGFyTGFiZWwgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVQYXRoIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgSW5wdXROb3JtYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXROb3JtYWxpemVyLmpzJztcbmltcG9ydCB7IFNhZmVSZWdleCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2Rvc1Byb3RlY3Rpb24uanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuXG5jb25zdCBBR0VOVF9GSUxFX0VYVEVOU0lPTiA9ICcubWQnO1xuY29uc3QgU1RBVEVfRElSRUNUT1JZID0gJy5zdGF0ZSc7XG5jb25zdCBTVEFURV9GSUxFX0VYVEVOU0lPTiA9ICcuc3RhdGUueWFtbCc7XG5jb25zdCBNQVhfWUFNTF9TSVpFID0gNjQgKiAxMDI0O1xuY29uc3QgTUFYX0ZJTEVfU0laRSA9IDEwMCAqIDEwMjQ7XG5cbi8vIElzc3VlICM4MzogQ2VudHJhbGl6ZWQgYWN0aXZlIGVsZW1lbnQgbGltaXRzIChjb25maWd1cmFibGUgdmlhIGVudiB2YXJzKVxuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnLCBnZXRNYXhBY3RpdmVMaW1pdCB9IGZyb20gJy4uLy4uL2NvbmZpZy9hY3RpdmUtZWxlbWVudC1saW1pdHMuanMnO1xuXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBlbGVtZW50PzogQWdlbnQ7XG59XG5cbmludGVyZmFjZSBQYXJzZWRBZ2VudEZpbGUge1xuICBtZXRhZGF0YTogQWdlbnRNZXRhZGF0YTtcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG50eXBlIEFnZW50Q3JlYXRlTWV0YWRhdGEgPSAoUGFydGlhbDxBZ2VudE1ldGFkYXRhPiAmIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPikgJiB7XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgQWdlbnRNYW5hZ2VyIGV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyPEFnZW50PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZUNhY2hlOiBNYXA8c3RyaW5nLCBBZ2VudFN0YXRlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlO1xuICAvLyBUcmFjayBhY3RpdmUgYWdlbnRzIGJ5IG5hbWUgKHN0YWJsZSBpZGVudGlmaWVyKVxuICBwcml2YXRlIGFjdGl2ZUFnZW50TmFtZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIC8vIFN0YXRpYyByZXNvbHZlciBmb3IgZWxlbWVudCBtYW5hZ2VyIGxvb2t1cCAoREkgcGF0dGVybilcbiAgLy8gVGhpcyBhbGxvd3MgQWdlbnQgaW5zdGFuY2VzIHRvIHJlc29sdmUgbWFuYWdlcnMgd2l0aG91dCB0aWdodCBjb3VwbGluZ1xuICBwcml2YXRlIHN0YXRpYyBlbGVtZW50TWFuYWdlclJlc29sdmVyPzogKG1hbmFnZXJOYW1lOiBzdHJpbmcpID0+IGFueTtcblxuICAvLyBJc3N1ZSAjNDAyOiBTdGF0aWMgcmVzb2x2ZXIgZm9yIERhbmdlclpvbmVFbmZvcmNlciAoREkgcGF0dGVybilcbiAgcHJpdmF0ZSBzdGF0aWMgZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXI/OiAoKSA9PiBpbXBvcnQoJy4vdHlwZXMuanMnKS5EYW5nZXJab25lQmxvY2tlcjtcblxuICAvLyBJc3N1ZSAjMTQyOiBTdGF0aWMgcmVzb2x2ZXIgZm9yIFZlcmlmaWNhdGlvblN0b3JlIChESSBwYXR0ZXJuKVxuICBwcml2YXRlIHN0YXRpYyB2ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyPzogKCkgPT4geyBzZXQ6IChpZDogc3RyaW5nLCBjaGFsbGVuZ2U6IHsgY29kZTogc3RyaW5nOyBleHBpcmVzQXQ6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfSkgPT4gdm9pZCB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgYmFzZURpcjogc3RyaW5nLFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZSxcbiAgICBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZSxcbiAgICBtZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQsXG4gICAgYmFja3VwU2VydmljZT86IGltcG9ydCgnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcycpLkJhY2t1cFNlcnZpY2VcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudERpck92ZXJyaWRlID0gcGF0aC5qb2luKGJhc2VEaXIsIEVsZW1lbnRUeXBlLkFHRU5UKTtcbiAgICBzdXBlcihFbGVtZW50VHlwZS5BR0VOVCwgcG9ydGZvbGlvTWFuYWdlciwgZmlsZUxvY2tNYW5hZ2VyLCB7IGVsZW1lbnREaXJPdmVycmlkZSwgZmlsZVdhdGNoU2VydmljZSwgbWVtb3J5QnVkZ2V0LCBiYWNrdXBTZXJ2aWNlIH0sIGZpbGVPcGVyYXRpb25zU2VydmljZSwgdmFsaWRhdGlvblJlZ2lzdHJ5KTtcbiAgICB0aGlzLnN0YXRlRGlyID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgU1RBVEVfRElSRUNUT1JZKTtcbiAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZSA9IHNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlID0gbWV0YWRhdGFTZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYWdlbnQnO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgZWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyIGZvciBlbGVtZW50LWFnbm9zdGljIGFjdGl2YXRpb25cbiAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGl6YXRpb25cbiAgICogRm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuIGFzIE1lbW9yeS5jb25maWd1cmVNZW1vcnlNYW5hZ2VyUmVzb2x2ZXJcbiAgICpcbiAgICogQHBhcmFtIHJlc29sdmVyIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBtYW5hZ2VyIG5hbWUgYW5kIHJldHVybnMgdGhlIG1hbmFnZXIgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcihyZXNvbHZlcjogKG1hbmFnZXJOYW1lOiBzdHJpbmcpID0+IGFueSk6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzQwMjogU2V0IERhbmdlclpvbmVFbmZvcmNlciByZXNvbHZlciBmb3IgREkgaW5qZWN0aW9uLlxuICAgKiBDYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldERhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiBpbXBvcnQoJy4vdHlwZXMuanMnKS5EYW5nZXJab25lQmxvY2tlcik6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci5kYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICMxNDI6IFNldCBWZXJpZmljYXRpb25TdG9yZSByZXNvbHZlciBmb3IgREkgaW5qZWN0aW9uLlxuICAgKiBDYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldFZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IHsgc2V0OiAoaWQ6IHN0cmluZywgY2hhbGxlbmdlOiB7IGNvZGU6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH0pID0+IHZvaWQgfSk6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIoKTogKChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnkpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgc3RhdGljIHJlc29sdmVycyAoZm9yIHRlc3QgY2xlYW51cClcbiAgICogQ2FsbCB0aGlzIGluIGFmdGVyRWFjaCBob29rcyB0byBwcmV2ZW50IHRlc3QgaXNvbGF0aW9uIGlzc3Vlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXNldFJlc29sdmVycygpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgQWdlbnRNYW5hZ2VyLnZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBhZ2VudHMgYW5kIHN0YXRlIGZpbGVzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuc3RhdGVEaXIpO1xuICAgIGxvZ2dlci5pbmZvKCdBZ2VudE1hbmFnZXIgaW5pdGlhbGl6ZWQnLCB7IHBhdGg6IHRoaXMuZWxlbWVudERpciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYWdlbnQgb24gZGlzay5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBBZ2VudENyZWF0ZU1ldGFkYXRhXG4gICk6IFByb21pc2U8RWxlbWVudENyZWF0aW9uUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAvLyBOb3JtYWxpemUgZ29hbCBpbnB1dCBiZWZvcmUgdmFsaWRhdGlvbiAtIExMTXMgbWF5IHBhc3Mgc3RyaW5nIG9yIG9iamVjdFxuICAgICAgLy8gU3RyaXAgJ2NvbnRlbnQnIGZyb20gbWV0YWRhdGEgdG8gcHJldmVudCBpdCBmcm9tIG92ZXJ3cml0aW5nIHRoZSBwb3NpdGlvbmFsXG4gICAgICAvLyBjb250ZW50IHBhcmFtICh3aGljaCBpcyB0aGUgYWdlbnQncyBpbnN0cnVjdGlvbnMgdGV4dCkgaW4gdGhlIHZhbGlkYXRpb24gY2FsbC5cbiAgICAgIGNvbnN0IHsgY29udGVudDogcmVmZXJlbmNlQ29udGVudCwgLi4ubWV0YWRhdGFXaXRob3V0Q29udGVudCB9ID0gbWV0YWRhdGEgPz8ge307XG4gICAgICBjb25zdCBub3JtYWxpemVkTWV0YWRhdGE6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPiA9IHtcbiAgICAgICAgLi4ubWV0YWRhdGFXaXRob3V0Q29udGVudFxuICAgICAgfTtcbiAgICAgIGlmIChtZXRhZGF0YT8uZ29hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRNZXRhZGF0YS5nb2FsID0gdGhpcy5ub3JtYWxpemVHb2FsSW5wdXQoXG4gICAgICAgICAgbWV0YWRhdGEuZ29hbCBhcyBzdHJpbmcgfCBQYXJ0aWFsPEFnZW50R29hbENvbmZpZz5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgaW5wdXQgdmFsaWRhdGlvbi5cbiAgICAgIC8vIEFnZW50cyBzdXBwb3J0IGR1YWwtZmllbGQgY3JlYXRpb246IGJlaGF2aW9yYWwgaW5zdHJ1Y3Rpb25zIGFuZCBvcHRpb25hbFxuICAgICAgLy8gcmVmZXJlbmNlIGNvbnRlbnQuIFZhbGlkYXRpb24gcHJlZmVycyBiZWhhdmlvcmFsIGluc3RydWN0aW9ucyB3aGVuIGJvdGhcbiAgICAgIC8vIGZpZWxkcyBhcmUgcHJlc2VudCBzbyBleGlzdGluZyBpbnN0cnVjdGlvbi1maXJzdCBhZ2VudHMga2VlcCB0aGVpclxuICAgICAgLy8gY3VycmVudCBzZW1hbnRpY3Mgd2hpbGUgY29udGVudC1vbmx5IGFnZW50cyBzdGlsbCB2YWxpZGF0ZSBjb3JyZWN0bHkuXG4gICAgICBjb25zdCB2YWxpZGF0aW9uSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhXG4gICAgICB9O1xuICAgICAgY29uc3QgcHJpbWFyeVRleHQgPSB0aGlzLmdldFByaW1hcnlWYWxpZGF0aW9uVGV4dChjb250ZW50LCByZWZlcmVuY2VDb250ZW50KTtcbiAgICAgIHZhbGlkYXRpb25JbnB1dC5jb250ZW50ID0gcHJpbWFyeVRleHQgPz8gJyc7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUodmFsaWRhdGlvbklucHV0KTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBpbnB1dHMgZm9yIGVsZW1lbnQgY3JlYXRpb25cbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKTtcbiAgICAgIC8vIFVzZSBDb250ZW50VmFsaWRhdG9yIGZvciBtdWx0aS1saW5lIGNvbnRlbnQgdG8gcHJlc2VydmUgZm9ybWF0dGluZyAobmV3bGluZXMsIHRhYnMpXG4gICAgICAvLyB3aGlsZSBzdGlsbCBkZXRlY3RpbmcgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfSk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGFnZW50IG5hbWUuIFVzZSBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcy4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhLFxuICAgICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb25cbiAgICAgIH0sIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgICAgYWdlbnQubWV0YWRhdGEuYXV0aG9yID0gbm9ybWFsaXplZE1ldGFkYXRhPy5hdXRob3IgPz8gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uc3BlY2lhbGl6YXRpb25zID8/IGFnZW50LmV4dGVuc2lvbnM/LnNwZWNpYWxpemF0aW9ucyA/PyBbXSxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uZGVjaXNpb25GcmFtZXdvcmsgPz8gYWdlbnQuZXh0ZW5zaW9ucz8uZGVjaXNpb25GcmFtZXdvcmssXG4gICAgICAgIHJpc2tUb2xlcmFuY2U6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ucmlza1RvbGVyYW5jZSA/PyBhZ2VudC5leHRlbnNpb25zPy5yaXNrVG9sZXJhbmNlLFxuICAgICAgICBsZWFybmluZ0VuYWJsZWQ6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ubGVhcm5pbmdFbmFibGVkID8/IGFnZW50LmV4dGVuc2lvbnM/LmxlYXJuaW5nRW5hYmxlZCxcbiAgICAgIH07XG4gICAgICAvLyBQcm9tb3RlIGluc3RydWN0aW9ucyB0byBmaXJzdC1jbGFzcyBwcm9wZXJ0eSAobm8gbG9uZ2VyIGluIGV4dGVuc2lvbnMpXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBzYW5pdGl6ZWRJbnN0cnVjdGlvbnM7XG4gICAgICAvLyBBbHNvIGtlZXAgaW4gZXh0ZW5zaW9ucyBmb3IgYmFja3dhcmQgY29tcGF0IGR1cmluZyB0cmFuc2l0aW9uXG4gICAgICBhZ2VudC5leHRlbnNpb25zLmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcblxuICAgICAgLy8gU2V0IHJlZmVyZW5jZSBjb250ZW50IGlmIHByb3ZpZGVkICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAgICAgaWYgKHR5cGVvZiByZWZlcmVuY2VDb250ZW50ID09PSAnc3RyaW5nJyAmJiByZWZlcmVuY2VDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0ID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKFxuICAgICAgICAgIHJlZmVyZW5jZUNvbnRlbnQsXG4gICAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjb250ZW50VmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYFZhbGlkYXRpb24gZmFpbGVkOiAkeyhjb250ZW50VmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zIHx8IFsnQ29udGVudCB2YWxpZGF0aW9uIGZhaWxlZCddKS5qb2luKCcsICcpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGFnZW50LmNvbnRlbnQgPSBjb250ZW50VmFsaWRhdGlvblJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNzI3OiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIFYyIGZpZWxkcyBCRUZPUkUgYXNzaWdubWVudC5cbiAgICAgIC8vIFRoaXMgaXMgdGhlIFNFQ09ORCB2YWxpZGF0aW9uIGxheWVyIOKAlCBBZ2VudEVsZW1lbnRWYWxpZGF0b3IgKGNhbGxlZCBhYm92ZSB2aWFcbiAgICAgIC8vIHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKSBpcyB0aGUgZmlyc3QuIFRoZSB2YWxpZGF0b3IgY2F0Y2hlcyBjYW1lbENhc2VcbiAgICAgIC8vIGludmFsaWQgdmFsdWVzOyB0aGlzIG1ldGhvZCBhbHNvIG5vcm1hbGl6ZXMgc25ha2VfY2FzZSBrZXlzICh3aGljaCB0aGUgdmFsaWRhdG9yXG4gICAgICAvLyBkb2Vzbid0IHNlZSkgYW5kIHZhbGlkYXRlcyB0aGVtLiBCb3RoIGxheWVycyBhcmUgbmVlZGVkLiBTZWUgSXNzdWUgIzczMC5cbiAgICAgIGNvbnN0IG1ldGFkYXRhVjIgPSBub3JtYWxpemVkTWV0YWRhdGEgYXMgUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG1ldGFkYXRhVjIpIHtcbiAgICAgICAgY29uc3QgdjJFcnJvcnMgPSB0aGlzLnZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUobWV0YWRhdGFWMik7XG4gICAgICAgIGlmICh2MkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYFYyIGZpZWxkIHZhbGlkYXRpb24gZmFpbGVkOiAke3YyRXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVjIgRklFTERTOiBTdG9yZSBWMi1zcGVjaWZpYyBmaWVsZHMgaW4gYWdlbnQgbWV0YWRhdGEgKG5vdCBqdXN0IGV4dGVuc2lvbnMpXG4gICAgICAvLyBUaGlzIGVuYWJsZXMgVjIgYWdlbnQgY3JlYXRpb24gdmlhIE1DUC1BUUwgY3JlYXRlX2VsZW1lbnQgb3BlcmF0aW9uXG4gICAgICBpZiAobWV0YWRhdGFWMj8uZ29hbCkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5nb2FsID0gbWV0YWRhdGFWMi5nb2FsO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmFjdGl2YXRlcykge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5hY3RpdmF0ZXMgPSBtZXRhZGF0YVYyLmFjdGl2YXRlcztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy50b29scykge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS50b29scyA9IG1ldGFkYXRhVjIudG9vbHM7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uc3lzdGVtUHJvbXB0KSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnN5c3RlbVByb21wdCA9IG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0O1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmF1dG9ub215KSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmF1dG9ub215ID0gbWV0YWRhdGFWMi5hdXRvbm9teTtcbiAgICAgIH1cbiAgICAgIC8vIElzc3VlICM0NDk6IFBlcnNpc3QgZ2F0ZWtlZXBlciBwb2xpY3kgZm9yIEdhdGVrZWVwZXIgZW5mb3JjZW1lbnQgZHVyaW5nIGV4ZWN1dGlvblxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmdhdGVrZWVwZXIpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuZ2F0ZWtlZXBlciA9IG1ldGFkYXRhVjIuZ2F0ZWtlZXBlcjtcbiAgICAgIH1cbiAgICAgIC8vIElzc3VlICM3MjI6IFBlcnNpc3QgcmVzaWxpZW5jZSBwb2xpY3kgKHdhcyBtaXNzaW5nIGZyb20gVjIgZmllbGQgYXNzaWdubWVudHMpXG4gICAgICBpZiAobWV0YWRhdGFWMj8ucmVzaWxpZW5jZSkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5yZXNpbGllbmNlID0gbWV0YWRhdGFWMi5yZXNpbGllbmNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNjEzOiBDaGVjayBtZXRhZGF0YSBuYW1lIHVuaXF1ZW5lc3MgKG5vdCBqdXN0IGZpbGVuYW1lKVxuICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGV4aXN0aW5nQWdlbnRzLmZpbmQoYSA9PlxuICAgICAgICBhLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2FuaXRpemVkTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgYWdlbnQgY29udGVudCBmaXJzdFxuICAgICAgY29uc3Qgc2VyaWFsaXplZENvbnRlbnQgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQpO1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVuYW1lKTtcblxuICAgICAgLy8gVXNlIGF0b21pYyBmaWxlIGNyZWF0aW9uIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uc1xuICAgICAgLy8gVGhpcyByZXBsYWNlcyB0aGUgcHJldmlvdXMgY2hlY2stdGhlbi13cml0ZSBwYXR0ZXJuIHdpdGggYSBzaW5nbGUgYXRvbWljIG9wZXJhdGlvblxuICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRmlsZUV4Y2x1c2l2ZShhYnNvbHV0ZVBhdGgsIHNlcmlhbGl6ZWRDb250ZW50LCB7XG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFjcmVhdGVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FjaGUgdGhlIGVsZW1lbnQgYWZ0ZXIgc3VjY2Vzc2Z1bCBjcmVhdGlvblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIGZpbGVuYW1lKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkKGZpbGVuYW1lLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgLy8gTm90ZTogTm8gcmVsb2FkKCkgaGVyZSDigJQgY2FjaGVFbGVtZW50KCkgc3RvcmVzIHRoZSBlbGVtZW50IGNvcnJlY3RseS5cbiAgICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGNyZWF0ZWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBhZ2VudElkOiBhZ2VudC5pZCB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYPCfpJYgKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthZ2VudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyd9YCxcbiAgICAgICAgZWxlbWVudDogYWdlbnRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCcsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gY3JlYXRlIGFnZW50J1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhbiBhZ2VudCBieSBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqIEByZXR1cm5zIEFnZW50IGluc3RhbmNlIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBhc3luYyByZWFkKG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBmbGV4aWJsZSBtYXRjaGluZyB2aWEgbGlzdCBzY2FuICgjNjA3KVxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmxleGlibHkobmFtZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgZm9yIHJlYWQoKSB3aGVuIGRpcmVjdCBmaWxlIGxvb2t1cCBmYWlscy5cbiAgICogU2VhcmNoZXMgbG9hZGVkIGFnZW50cyBieSBtZXRhZGF0YSBuYW1lIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHNsdWcgbWF0Y2hpbmcuXG4gICAqIExvZ3MgYSB3YXJuaW5nIHdoZW4gYSBtYXRjaCBpcyBmb3VuZCAoaW5kaWNhdGVzIGZpbGVuYW1lL25hbWUgbWlzbWF0Y2ggbmVlZGluZyBjbGVhbnVwKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRmlsZSBvbiBkaXNrOiBcImxlZ2FjeS1wb3N0ZXItYWdlbnQubWRcIlxuICAgKiAvLyBNZXRhZGF0YSBuYW1lOiBcImxlZ2FjeS1wb3N0ZXJcIlxuICAgKiAvLyBEaXJlY3QgbG9va3VwIGZvciBcImxlZ2FjeS1wb3N0ZXIubWRcIiBmYWlscyAoRU5PRU5UKVxuICAgKiAvLyBGbGV4aWJsZSBmYWxsYmFjayBtYXRjaGVzIHZpYSBtZXRhZGF0YSBuYW1lOlxuICAgKiBjb25zdCBhZ2VudCA9IGF3YWl0IHJlYWQoXCJsZWdhY3ktcG9zdGVyXCIpOyAvLyByZXNvbHZlcyB2aWEgZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZEZsZXhpYmx5KG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFNsdWcgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgICAvLyBQYXNzIDE6IGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggb24gbWV0YWRhdGEgbmFtZVxuICAgICAgbGV0IG1hdGNoID0gYWdlbnRzLmZpbmQoXG4gICAgICAgIChhKSA9PiBhLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoTG93ZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgMjogc2x1ZyBtYXRjaCAoaGFuZGxlcyBkYXNoZXMsIHVuZGVyc2NvcmVzLCBjYXNpbmcgZGlmZmVyZW5jZXMpXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG1hdGNoID0gYWdlbnRzLmZpbmQoKGEpID0+IHtcbiAgICAgICAgICBjb25zdCBzbHVnID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShhLm1ldGFkYXRhLm5hbWUpO1xuICAgICAgICAgIHJldHVybiBzbHVnID09PSBzZWFyY2hTbHVnIHx8IHNsdWcgPT09IHNlYXJjaExvd2VyO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCBcIiR7bmFtZX1cIiByZXNvbHZlZCB2aWEgZmxleGlibGUgbWF0Y2hpbmcgdG8gZmlsZSB3aXRoIG1ldGFkYXRhIG5hbWUgXCIke21hdGNoLm1ldGFkYXRhLm5hbWV9XCIuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciByZW5hbWluZyB0aGUgZmlsZSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgY29udmVudGlvbiAoIzYwNykuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF0Y2ggPz8gbnVsbDtcbiAgICB9IGNhdGNoIChsaXN0RXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmxleGlibGUgYWdlbnQgbG9va3VwIGZhaWxlZCBmb3IgXCIke25hbWV9XCI6ICR7bGlzdEVycm9yfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhZGF0YS9jb250ZW50IGZvciBhbiBleGlzdGluZyBhZ2VudC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlczogUGFydGlhbDxBZ2VudE1ldGFkYXRhPixcbiAgICBjb250ZW50Pzogc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQoc2FuaXRpemVkTmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IG5vdCBmb3VuZCBmb3IgdXBkYXRlOiAke25hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgZWRpdCB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlRWRpdChhZ2VudCwge1xuICAgICAgLi4udXBkYXRlcyxcbiAgICAgIGNvbnRlbnRcbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEFnZW50IHVwZGF0ZSB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCB1cGRhdGUgd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChcbiAgICAgICAgVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXBkYXRlcy5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgIDUwMFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5zcGVjaWFsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiB1cGRhdGVzLnNwZWNpYWxpemF0aW9ucy5tYXAoaXRlbSA9PiBzYW5pdGl6ZUlucHV0KGl0ZW0sIDUwKSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMucmlza1RvbGVyYW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICByaXNrVG9sZXJhbmNlOiB1cGRhdGVzLnJpc2tUb2xlcmFuY2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGxlYXJuaW5nRW5hYmxlZDogdXBkYXRlcy5sZWFybmluZ0VuYWJsZWRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLm1heENvbmN1cnJlbnRHb2FscyA9IHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzO1xuICAgIH1cblxuICAgIGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgaWYgKGNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVXNlIENvbnRlbnRWYWxpZGF0b3IgZm9yIG11bHRpLWxpbmUgY29udGVudCB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nIChuZXdsaW5lcywgdGFicylcbiAgICAgIC8vIHdoaWxlIHN0aWxsIGRldGVjdGluZyBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQsIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9KTtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGluc3RydWN0aW9uczogY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCAnJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCB1cGRhdGVkOiAke3Nhbml0aXplZE5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBwcm92aWRlZCBhZ2VudCBuYW1lLlxuICAgKi9cbiAgdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBiZSBlbXB0eScgfTtcbiAgICB9XG5cbiAgICBpZiAobmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBleGNlZWQgMTAwIGNoYXJhY3RlcnMnIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUobmFtZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdOYW1lIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBhZ2VudCBmcm9tIHNlcmlhbGl6ZWQgY29udGVudC5cbiAgICovXG4gIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUpzb24oZGF0YSwge1xuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQocGFyc2VkLm1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgICBpZiAocGFyc2VkLnN0YXRlKSB7XG4gICAgICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHBhcnNlZCkpO1xuICAgICAgfVxuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBwYXJzZWQuaW5zdHJ1Y3Rpb25zIHx8ICcnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cblxuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgcGFyc2luZ1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihkYXRhLCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICB9KTtcblxuICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHJlc3VsdC5kYXRhIGFzIEFnZW50TWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgIGluc3RydWN0aW9uczogcmVzdWx0LmNvbnRlbnQudHJpbSgpXG4gICAgfTtcbiAgICByZXR1cm4gYWdlbnQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFuIGFnZW50IHRvIEpTT04gb3IgbWFya2Rvd24gKGRlZmF1bHQpLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudChhZ2VudDogQWdlbnQsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGFnZW50LnNlcmlhbGl6ZVRvSlNPTigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gYWdlbnQgZmlsZSwgZW5mb3JjaW5nIHNpemUgYW5kIGZvcm1hdCBjaGVja3MuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkSW5wdXQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHNhbml0aXplZElucHV0LmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZWRJbnB1dFxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoc2FuaXRpemVkSW5wdXQsIDEwMCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChyZWxhdGl2ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSW52YWxpZCBhZ2VudCBwYXRoOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBNQVhfRklMRV9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgZmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke01BWF9GSUxFX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VBZ2VudEZpbGUoY29udGVudCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQubWV0YWRhdGEpO1xuICAgICAgY29uc3QgYWdlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50LCB0aGlzLnN0cmlwRXh0ZW5zaW9uKHJlbGF0aXZlUGF0aCkpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRgLFxuICAgICAgICBkZXRhaWxzOiBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGxvYWRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IGZyb20gJHtmdWxsUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIEJhc2VFbGVtZW50TWFuYWdlci5zYXZlIHRvIHBlcnNpc3Qgc3RhdGUgd2hlbiByZXF1aXJlZC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoYWdlbnQ6IEFnZW50LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN0YXRlRGlyZWN0b3J5KCk7XG4gICAgYXdhaXQgc3VwZXIuc2F2ZShhZ2VudCwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICBpZiAoYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCksIGFnZW50LmdldFN0YXRlKCkpO1xuICAgICAgYWdlbnRbQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OXShuZXdWZXJzaW9uKTsgIC8vIFN5bmMgYWdlbnQncyBpbnRlcm5hbCB2ZXJzaW9uIChJc3N1ZSAjMTIzIGZpeClcbiAgICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFnZW50IHN0YXRlIHRvIGRpc2sgKHB1YmxpYyBBUEkgZm9yIGV4dGVybmFsIGNhbGxlcnMpLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgcHJvcGVyIHdheSBmb3IgZXh0ZXJuYWwgY29kZSAoc3RyYXRlZ2llcywgaGFuZGxlcnMpIHRvXG4gICAqIHRyaWdnZXIgc3RhdGUgcGVyc2lzdGVuY2UuIEl0IGltcGxlbWVudHMgdGhlIE9wdGlvbiBDIHBhdHRlcm4gZnJvbSBJc3N1ZSAjMTIzOlxuICAgKiBzdGF0ZVZlcnNpb24gaXMgb25seSBpbmNyZW1lbnRlZCBvbiBzdWNjZXNzZnVsIHNhdmUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+IC0gVHJ1ZSBpZiBzdGF0ZSB3YXMgcGVyc2lzdGVkLCBmYWxzZSBpZiBub3QgbmVlZGVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYWdlbnQgbm90IGZvdW5kIG9yIHNhdmUgZmFpbHNcbiAgICovXG4gIGFzeW5jIHBlcnNpc3RTdGF0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IG5vdCBmb3VuZDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGlmICghYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBhZ2VudC5nZXRTdGF0ZSgpKTtcbiAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pO1xuICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlbGV0ZSB0byByZW1vdmUgYXNzb2NpYXRlZCBzdGF0ZSBmaWxlLlxuICAgKlxuICAgKiBGSVg6IFVzZXMgbm9ybWFsaXplRmlsZW5hbWUoKSB0byBlbnN1cmUgc3RhdGUgZmlsZSBkZWxldGlvbiBtYXRjaGVzXG4gICAqIHRoZSBub3JtYWxpemVkIGZpbGVuYW1lIHVzZWQgZm9yIHN0YXRlIGZpbGUgY3JlYXRpb24vbG9hZGluZy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCk7XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIGRlbGV0aW9uXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBCYWNrIHVwIHRoZSBzdGF0ZSBmaWxlIGJlZm9yZSBkZWxldGluZyBpdFxuICAgICAgaWYgKHRoaXMuYmFja3VwU2VydmljZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgICAgICBpZiAoIXJlc3VsdC5tb3ZlZE9yaWdpbmFsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQsIHtcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCwge1xuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGNhY2hlIGNsZWFudXBcbiAgICB0aGlzLnN0YXRlQ2FjaGUuZGVsZXRlKG5vcm1hbGl6ZWROYW1lKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgcmV0dXJuIHN1cGVyLmV4aXN0cyhzYW5pdGl6ZWRQYXRoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZhbGlkYXRlUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGFyZ2V0UGF0aC5pbmNsdWRlcygnLi4nKSB8fCB0YXJnZXRQYXRoLmluY2x1ZGVzKCd+JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRhcmdldFBhdGguc3RhcnRzV2l0aCgnLycpIHx8IC9eW0EtWmEtel06Ly50ZXN0KHRhcmdldFBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBBR0VOVF9GSUxFX0VYVEVOU0lPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBsaXN0IHRvIGFwcGx5IGFjdGl2ZSBzdGF0dXMgYmFzZWQgb24gYWN0aXZlQWdlbnROYW1lcyBzZXRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuXG4gICAgLy8gQXBwbHkgYWN0aXZlIHN0YXR1cyB0byBhZ2VudHMgdGhhdCBhcmUgaW4gdGhlIGFjdGl2ZSBzZXQgKGJ5IG5hbWUpXG4gICAgZm9yIChjb25zdCBhZ2VudCBvZiBhZ2VudHMpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuaGFzKGFnZW50Lm1ldGFkYXRhLm5hbWUpKSB7XG4gICAgICAgIC8vIEFjdGl2YXRlIHRoZSBhZ2VudCB0byBzZXQgc3RhdHVzIHRvIEFDVElWRVxuICAgICAgICBhd2FpdCBhZ2VudC5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhZ2VudHM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUFnZW50KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGFnZW50PzogQWdlbnQgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuQUdFTlQsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICAvLyBBZGQgdG8gYWN0aXZlIHNldCAoYnkgbmFtZSwgd2hpY2ggaXMgc3RhYmxlIGFjcm9zcyByZWxvYWRzKVxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5hZGQoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQUdFTlRfQUNUSVZBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5hY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICBnb2FsQ291bnQ6IChhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLmdvYWw/LnBhcmFtZXRlcnM/Lmxlbmd0aCB8fCAwLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IGFnZW50Lm1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyxcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuQUdFTlQsIGFnZW50Lm1ldGFkYXRhLm5hbWUpLFxuICAgICAgYWdlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlQWdlbnQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5BR0VOVCwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gYWN0aXZlIHNldFxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5kZWxldGUoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmRlYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdBR0VOVF9ERUFDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZGVhY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBkZWFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgZGVhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5BR0VOVCwgYWdlbnQubWV0YWRhdGEubmFtZSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYWN0aXZlIGFnZW50c1xuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlQWdlbnRzKCk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBhZ2VudHMuZmlsdGVyKGEgPT4gdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmhhcyhhLm1ldGFkYXRhLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3AuXG4gICAqIFRoaXMgbWV0aG9kOlxuICAgKiAxLiBMb2FkcyB0aGUgYWdlbnQgY29uZmlndXJhdGlvblxuICAgKiAyLiBWYWxpZGF0ZXMgYW5kIHJlbmRlcnMgdGhlIGdvYWwgdGVtcGxhdGUgd2l0aCBwYXJhbWV0ZXJzXG4gICAqIDMuIEFjdGl2YXRlcyBjb25maWd1cmVkIGVsZW1lbnRzIChlbGVtZW50LWFnbm9zdGljKVxuICAgKiA0LiBFdmFsdWF0ZXMgcHJvZ3JhbW1hdGljIGNvbnN0cmFpbnRzIGFuZCByaXNrXG4gICAqIDUuIFJldHVybnMgc3RydWN0dXJlZCBjb250ZXh0IGZvciBMTE1cbiAgICpcbiAgICogVGhlIExMTSB0aGVuIGRyaXZlcyB0aGUgYWdlbnRpYyBsb29wIHVzaW5nIHRoaXMgY29udGV4dC5cbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBtZXRhZGF0YSBhcyB2MiAobWF5IGhhdmUgZ29hbCBjb25maWcpXG4gICAgICBsZXQgbWV0YWRhdGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB2Mi4wIGFnZW50IHdpdGggZ29hbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBJZiBub3QsIGF1dG8tY29udmVydCBWMSB0byBWMiBpbiBwbGFjZSAoSXNzdWUgIzU4NylcbiAgICAgIGlmICghbWV0YWRhdGEuZ29hbCB8fCAhbWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoaXNWMUFnZW50KG1ldGFkYXRhKSkge1xuICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFnZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgICAgICBjb25zdCBjb252ZXJzaW9uUmVzdWx0ID0gY29udmVydFYxVG9WMihtZXRhZGF0YSwgaW5zdHJ1Y3Rpb25zKTtcblxuICAgICAgICAgIGlmIChjb252ZXJzaW9uUmVzdWx0LmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgLy8gTWVyZ2UgY29udmVydGVkIG1ldGFkYXRhIG9udG8gdGhlIGV4aXN0aW5nIGFnZW50IChpbi1wbGFjZSlcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWV0YWRhdGEsIGNvbnZlcnNpb25SZXN1bHQubWV0YWRhdGEpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihhZ2VudC5tZXRhZGF0YSwgY29udmVyc2lvblJlc3VsdC5tZXRhZGF0YSk7XG5cbiAgICAgICAgICAgIC8vIExvZyBjb252ZXJzaW9uIHdhcm5pbmdzXG4gICAgICAgICAgICBpZiAoY29udmVyc2lvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgYXV0by1jb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBpbiBwbGFjZWAsIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nczogY29udmVyc2lvblJlc3VsdC53YXJuaW5ncyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZ3JhZGVkIGFnZW50IGJhY2sgdG8gaXRzIG9yaWdpbmFsIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IHVwZ3JhZGVkRmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHVwZ3JhZGVkRmlsZW5hbWUpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEFnZW50ICcke25hbWV9JyBjb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBhbmQgc2F2ZWQgaW4gcGxhY2VgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGNhbm5vdCBiZSBleGVjdXRlZDogbWlzc2luZyBnb2FsLnRlbXBsYXRlIGFuZCBjb252ZXJzaW9uIGZhaWxlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGlzIG5vdCBhIHYyLjAgYWdlbnQuIE1pc3NpbmcgZ29hbC50ZW1wbGF0ZSBjb25maWd1cmF0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIENsb25lIHBhcmFtZXRlcnMgdG8gcHJldmVudCBtdXRhdGlvbiBvZiBjYWxsZXIncyBvYmplY3QgKElzc3VlICMxMTgpXG4gICAgICBjb25zdCBjbG9uZWRQYXJhbWV0ZXJzID0gc3RydWN0dXJlZENsb25lKHBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAyYi4gU2VjdXJpdHkgdmFsaWRhdGlvbiBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5KGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAzLiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGFnYWluc3QgZ29hbC5wYXJhbWV0ZXJzIHNjaGVtYVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlcnMobWV0YWRhdGEuZ29hbCwgY2xvbmVkUGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDQuIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICAgIGNvbnN0IHJlbmRlcmVkR29hbCA9IHRoaXMucmVuZGVyR29hbFRlbXBsYXRlKG1ldGFkYXRhLmdvYWwudGVtcGxhdGUsIGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyA0Yi4gRGV0ZWN0IHVubWF0Y2hlZCBwbGFjZWhvbGRlcnMgYWZ0ZXIgcmVuZGVyaW5nIChJc3N1ZSAjMTI2KVxuICAgICAgY29uc3QgdW5tYXRjaGVkUGxhY2Vob2xkZXJzID0gdGhpcy5kZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWRHb2FsKTtcbiAgICAgIGlmICh1bm1hdGNoZWRQbGFjZWhvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVycyBkZXRlY3RlZCBhZnRlciByZW5kZXJpbmcnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHVubWF0Y2hlZDogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gNS4gQ3JlYXRlIGV4ZWN1dGlvbiBjb250ZXh0IEJFRk9SRSBhY3RpdmF0aW5nIGVsZW1lbnRzIChJc3N1ZSAjMTA5IC0gY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24pXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChuYW1lKTtcblxuICAgICAgLy8gNWIuIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiAoSXNzdWUgIzM3NClcbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXM/LmFnZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN5Y2xlUGF0aCA9IGF3YWl0IHRoaXMuZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcyhuYW1lLCBtZXRhZGF0YS5hY3RpdmF0ZXMuYWdlbnRzKTtcbiAgICAgICAgaWYgKGN5Y2xlUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGN5Y2xlU3RhcnQgPSBjeWNsZVBhdGguaW5kZXhPZihjeWNsZVBhdGhbY3ljbGVQYXRoLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICBjb25zdCBjeWNsZSA9IGN5Y2xlUGF0aC5zbGljZShjeWNsZVN0YXJ0KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNi4gQWN0aXZhdGUgZWxlbWVudHMgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50czogUmVjb3JkPHN0cmluZywgQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICAgIGNvbnN0IGFjdGl2YXRpb25XYXJuaW5nczogQXJyYXk8eyBlbGVtZW50VHlwZTogc3RyaW5nOyBlbGVtZW50TmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+ID0gW107XG5cbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBbZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lc10gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEuYWN0aXZhdGVzKSkge1xuICAgICAgICAgIGlmICghZWxlbWVudE5hbWVzIHx8IGVsZW1lbnROYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzW2VsZW1lbnRUeXBlXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50TmFtZSBvZiBlbGVtZW50TmFtZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50Q29udGVudChlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGV4ZWN1dGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50c1tlbGVtZW50VHlwZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogZWxlbWVudENvbnRlbnRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBISUdILTE6IFJlLXRocm93IGNpcmN1bGFyIGFjdGl2YXRpb24gZXJyb3JzIGltbWVkaWF0ZWx5IChJc3N1ZSAjMTA5KVxuICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgICAgICAgIGFjdGl2YXRpb25XYXJuaW5ncy5wdXNoKHsgZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nOiBmYWlsZWQgdG8gYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JyDigJQgJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZWxlbWVudHMgcmF0aGVyIHRoYW4gZmFpbGluZyBjb21wbGV0ZWx5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDcuIEJ1aWxkIHRoZSByZXN1bHQgd2l0aCBhbGwgY29udGV4dCAoaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgc2FmZXR5IHRpZXIpXG4gICAgICBjb25zdCByZXN1bHQ6IEV4ZWN1dGVBZ2VudFJlc3VsdCA9IHtcbiAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICBnb2FsOiByZW5kZXJlZEdvYWwsXG4gICAgICAgIGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgICBhY3RpdmF0aW9uV2FybmluZ3M6IGFjdGl2YXRpb25XYXJuaW5ncy5sZW5ndGggPiAwID8gYWN0aXZhdGlvbldhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgICAgICAvLyBJc3N1ZSAjMTI2OiBXYXJuIGFib3V0IHVubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgdGVtcGxhdGVXYXJuaW5nczogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHVubWF0Y2hlZFBsYWNlaG9sZGVycy5tYXAocCA9PiBgVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVyOiB7JHtwfX1gKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhdmFpbGFibGVUb29sczogbWV0YWRhdGEudG9vbHM/LmFsbG93ZWQgfHwgW10sXG4gICAgICAgIHN1Y2Nlc3NDcml0ZXJpYTogbWV0YWRhdGEuZ29hbC5zdWNjZXNzQ3JpdGVyaWEgfHwgW10sXG4gICAgICAgIHN5c3RlbVByb21wdDogbWV0YWRhdGEuc3lzdGVtUHJvbXB0LFxuICAgICAgICBzYWZldHlUaWVyOiAnYWR2aXNvcnknLCAvLyBEZWZhdWx0LCB3aWxsIGJlIHVwZGF0ZWQgYmVsb3dcbiAgICAgIH07XG5cbiAgICAgIC8vIDguIENyZWF0ZSBhbmQgcGVyc2lzdCB0aGUgZ29hbCBmb3IgTExNIHRyYWNraW5nXG4gICAgICAvLyBUaGlzIGFsbG93cyByZWNvcmRfYWdlbnRfc3RlcCB0byBmaW5kIGFuZCB1cGRhdGUgdGhlIGdvYWxcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBnb2FsIHVzaW5nIGFnZW50LmFkZEdvYWwoKSB3aGljaCBoYW5kbGVzIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvblxuICAgICAgY29uc3QgbmV3R29hbCA9IGFnZW50LmFkZEdvYWwoe1xuICAgICAgICBkZXNjcmlwdGlvbjogcmVuZGVyZWRHb2FsLFxuICAgICAgICBwcmlvcml0eTogJ21lZGl1bScsXG4gICAgICAgIGltcG9ydGFuY2U6IDUsXG4gICAgICAgIHVyZ2VuY3k6IDUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IGdvYWwgc3RhdHVzIHRvIGluX3Byb2dyZXNzIHNpbmNlIGV4ZWN1dGlvbiBoYXMgc3RhcnRlZFxuICAgICAgbmV3R29hbC5zdGF0dXMgPSAnaW5fcHJvZ3Jlc3MnO1xuXG4gICAgICBjb25zdCBleGVjU2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShleGVjU2FuaXRpemVkTmFtZSkpO1xuXG4gICAgICAvLyBTdG9yZSBnb2FsSWQgaW4gcmVzdWx0IGZvciBMTE0gdG8gdXNlIHdpdGggcmVjb3JkX2FnZW50X3N0ZXBcbiAgICAgIHJlc3VsdC5nb2FsSWQgPSBuZXdHb2FsLmlkO1xuXG4gICAgICAvLyBGaXggIzQ0NTogSW5jbHVkZSBzdGF0ZVZlcnNpb24gc28gc3Vic2VxdWVudCBjYWxscyBjYW4gZG8gdmVyc2lvbi1hd2FyZSBvcGVyYXRpb25zXG4gICAgICBjb25zdCBwb3N0U2F2ZVN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICAgIHJlc3VsdC5zdGF0ZVZlcnNpb24gPSBwb3N0U2F2ZVN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxO1xuXG4gICAgICAvLyBDYWxsIHZhbGlkYXRlR29hbFNlY3VyaXR5IGFuZCBhZGQgd2FybmluZ3MgdG8gcmVzdWx0XG4gICAgICBjb25zdCBzZWN1cml0eVZhbGlkYXRpb24gPSBhZ2VudC52YWxpZGF0ZUdvYWxTZWN1cml0eShyZW5kZXJlZEdvYWwpO1xuICAgICAgaWYgKHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncyAmJiBzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuc2VjdXJpdHlXYXJuaW5ncyA9IHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncztcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsbCBldmFsdWF0ZUNvbnN0cmFpbnRzIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQuY29uc3RyYWludHMgPSBhZ2VudC5ldmFsdWF0ZUNvbnN0cmFpbnRzKG5ld0dvYWwpO1xuXG4gICAgICAvLyBDYWxsIGFzc2Vzc1Jpc2sgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5yaXNrQXNzZXNzbWVudCA9IGFnZW50LmFzc2Vzc1Jpc2soJ2V4ZWN1dGUnLCBuZXdHb2FsLCB7fSk7XG5cbiAgICAgIC8vIENhbGwgY2FsY3VsYXRlUHJpb3JpdHlTY29yZSBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LnByaW9yaXR5U2NvcmUgPSBhZ2VudC5jYWxjdWxhdGVQcmlvcml0eVNjb3JlKG5ld0dvYWwpO1xuXG4gICAgICAvLyA5LiBEZXRlcm1pbmUgc2FmZXR5IHRpZXIgYmFzZWQgb24gcmlzayBhc3Nlc3NtZW50IGFuZCBzZWN1cml0eSB3YXJuaW5nc1xuICAgICAgLy8gKE5vdGU6IGV4ZWN1dGlvbkNvbnRleHQgYWxyZWFkeSBjcmVhdGVkIGVhcmxpZXIgZm9yIGNpcmN1bGFyIGRldGVjdGlvbilcbiAgICAgIGNvbnN0IHNhZmV0eVRpZXJSZXN1bHQgPSBkZXRlcm1pbmVTYWZldHlUaWVyKFxuICAgICAgICByZXN1bHQucmlza0Fzc2Vzc21lbnQ/LnNjb3JlIHx8IDAsXG4gICAgICAgIHJlc3VsdC5zZWN1cml0eVdhcm5pbmdzIHx8IFtdLFxuICAgICAgICByZW5kZXJlZEdvYWwsXG4gICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRyxcbiAgICAgICAgZXhlY3V0aW9uQ29udGV4dFxuICAgICAgKTtcblxuICAgICAgLy8gMTAuIFNldCBzYWZldHkgdGllciBhbmQgcmVsYXRlZCBmaWVsZHNcbiAgICAgIHJlc3VsdC5zYWZldHlUaWVyID0gc2FmZXR5VGllclJlc3VsdC50aWVyO1xuICAgICAgcmVzdWx0LnNhZmV0eVRpZXJSZXN1bHQgPSBzYWZldHlUaWVyUmVzdWx0O1xuICAgICAgcmVzdWx0LmV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuXG4gICAgICAvLyAxMS4gQWRkIHRpZXItc3BlY2lmaWMgcmVzcG9uc2VzXG4gICAgICBzd2l0Y2ggKHNhZmV0eVRpZXJSZXN1bHQudGllcikge1xuICAgICAgICBjYXNlICdjb25maXJtJzpcbiAgICAgICAgICByZXN1bHQuY29uZmlybWF0aW9uUmVxdWlyZWQgPSBjcmVhdGVDb25maXJtYXRpb25SZXF1ZXN0KFxuICAgICAgICAgICAgJ09wZXJhdGlvbiByZXF1aXJlcyBjb25maXJtYXRpb24nLFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd2ZXJpZnknOlxuICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZShcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9ycy5qb2luKCc7ICcpLFxuICAgICAgICAgICAgJ2Rpc3BsYXlfY29kZSdcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Rhbmdlcl96b25lJzpcbiAgICAgICAgICByZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQgPSBjcmVhdGVEYW5nZXJab25lT3BlcmF0aW9uKFxuICAgICAgICAgICAgJ2FnZW50X2V4ZWN1dGlvbicsXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnMuam9pbignOyAnKSxcbiAgICAgICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRy5kYW5nZXJab25lLmVuYWJsZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIEFsc28gYWRkIHZlcmlmaWNhdGlvbiBpZiBub3QgYmxvY2tlZFxuICAgICAgICAgIGlmICghcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkLmJsb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IHJlc3VsdC5kYW5nZXJab25lQmxvY2tlZC52ZXJpZmljYXRpb25SZXF1aXJlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYWR2aXNvcnknOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgYWN0aW9uIG5lZWRlZCBmb3IgYWR2aXNvcnkgdGllclxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9FWEVDVVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmV4ZWN1dGVBZ2VudCcsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRlZDogJHtuYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ30gKHNhZmV0eTogJHtzYWZldHlUaWVyUmVzdWx0LnRpZXJ9KWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgc2FmZXR5VGllcjogc2FmZXR5VGllclJlc3VsdC50aWVyLFxuICAgICAgICAgIHJpc2tTY29yZTogc2FmZXR5VGllclJlc3VsdC5yaXNrU2NvcmUsXG4gICAgICAgICAgcGFyYW1ldGVyS2V5czogT2JqZWN0LmtleXMocGFyYW1ldGVycyB8fCB7fSksXG4gICAgICAgICAgZ29hbENvdW50OiAobWV0YWRhdGEgYXMgYW55KS5nb2FsPy5wYXJhbWV0ZXJzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWN1cml0eSB2YWxpZGF0aW9uIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKS5cbiAgICogQ2hlY2tzIGZvciBwcm90b3R5cGUgcG9sbHV0aW9uLCBVbmljb2RlIGluamVjdGlvbiwgYW5kIG92ZXJzaXplZCBwYXlsb2Fkcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgQkVGT1JFIHRlbXBsYXRlIHJlbmRlcmluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eShwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIC8vIDEuIFByb3RvdHlwZSBwb2xsdXRpb24gY2hlY2sg4oCUIHJlamVjdCBkYW5nZXJvdXMga2V5c1xuICAgIGNvbnN0IEZPUkJJRERFTl9LRVlTID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyYW1ldGVycykpIHtcbiAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgUHJvdG90eXBlIHBvbGx1dGlvbiBhdHRlbXB0IHZpYSBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcmJpZGRlbiBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9JyAocG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb24pYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTGltaXQgcGFyYW1ldGVyIGNvdW50IHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvblxuICAgIGNvbnN0IE1BWF9QQVJBTUVURVJTID0gNTA7XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCA+IE1BWF9QQVJBTUVURVJTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvbyBtYW55IHBhcmFtZXRlcnM6ICR7T2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgJHtNQVhfUEFSQU1FVEVSU31gKTtcbiAgICB9XG5cbiAgICAvLyAzLiBVbmljb2RlIG5vcm1hbGl6YXRpb24gdmlhIElucHV0Tm9ybWFsaXplclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBJbnB1dE5vcm1hbGl6ZXIubm9ybWFsaXplKHBhcmFtZXRlcnMsICckLnBhcmFtZXRlcnMnKTtcbiAgICBpZiAobm9ybWFsaXplZC5oYXNIaWdoT3JDcml0aWNhbElzc3Vlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGVtcGxhdGUgcGFyYW1ldGVyIHNlY3VyaXR5IHZhbGlkYXRpb24gZmFpbGVkOiAke25vcm1hbGl6ZWQuZXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBub3JtYWxpemVkIHZhbHVlcyBiYWNrIChpbi1wbGFjZSwgc2luY2Ugd2UgYWxyZWFkeSBjbG9uZWQpXG4gICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVkLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZERhdGEpKSB7XG4gICAgICBwYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignVGVtcGxhdGUgcGFyYW1ldGVyIG5vcm1hbGl6YXRpb24gd2FybmluZ3MnLCB7XG4gICAgICAgIHdhcm5pbmdzOiBub3JtYWxpemVkLndhcm5pbmdzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBnb2FsIHBhcmFtZXRlciBzY2hlbWFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJzKFxuICAgIGdvYWxDb25maWc6IEFnZW50R29hbENvbmZpZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbURlZnMgPSBnb2FsQ29uZmlnLnBhcmFtZXRlcnMgfHwgW107XG5cbiAgICAvLyBDaGVjayBhbGwgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgcHJlc2VudFxuICAgIGZvciAoY29uc3QgcGFyYW1EZWYgb2YgcGFyYW1EZWZzKSB7XG4gICAgICBpZiAocGFyYW1EZWYucmVxdWlyZWQgJiYgIShwYXJhbURlZi5uYW1lIGluIHBhcmFtZXRlcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6ICR7cGFyYW1EZWYubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUeXBlIGNoZWNrIHByb3ZpZGVkIHBhcmFtZXRlcnNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgY29uc3QgcGFyYW1EZWYgPSBwYXJhbURlZnMuZmluZChwID0+IHAubmFtZSA9PT0ga2V5KTtcbiAgICAgIGlmICghcGFyYW1EZWYpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gcGFyYW1ldGVyICcke2tleX0nIHByb3ZpZGVkIHRvIGFnZW50YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUeXBlIHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ3N0cmluZycgJiYgYWN0dWFsVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ251bWJlcicgJiYgYWN0dWFsVHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIG51bWJlciwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIGFjdHVhbFR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkdmlzb3J5IGxlbmd0aCB3YXJuaW5nIGZvciBzdHJpbmcgdmFsdWVzIChkZWZlbnNlLWluLWRlcHRoLCBkb2VzIG5vdCB0aHJvdylcbiAgICAgIGlmIChhY3R1YWxUeXBlID09PSAnc3RyaW5nJyAmJiAodmFsdWUgYXMgc3RyaW5nKS5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX0dPQUxfTEVOR1RIKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdQYXJhbWV0ZXIgc3RyaW5nIHZhbHVlIGV4Y2VlZHMgTUFYX0dPQUxfTEVOR1RIIChhZHZpc29yeSknLCB7XG4gICAgICAgICAgcGFyYW1OYW1lOiBrZXksXG4gICAgICAgICAgdmFsdWVMZW5ndGg6ICh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCxcbiAgICAgICAgICBtYXhMZW5ndGg6IEFHRU5UX0xJTUlUUy5NQVhfR09BTF9MRU5HVEgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHRzIGZvciBvcHRpb25hbCBwYXJhbWV0ZXJzIG5vdCBwcm92aWRlZFxuICAgIGZvciAoY29uc3QgcGFyYW1EZWYgb2YgcGFyYW1EZWZzKSB7XG4gICAgICBpZiAoIXBhcmFtRGVmLnJlcXVpcmVkICYmICEocGFyYW1EZWYubmFtZSBpbiBwYXJhbWV0ZXJzKSAmJiBwYXJhbURlZi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1ldGVyc1twYXJhbURlZi5uYW1lXSA9IHBhcmFtRGVmLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyR29hbFRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgcmVuZGVyZWQgPSB0ZW1wbGF0ZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgLy8gRXNjYXBlIGtleSB0byBwcmV2ZW50IHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIGZyb20gY2F1c2luZyBSZURvUyAoSXNzdWUgIzEwMylcbiAgICAgIGNvbnN0IGVzY2FwZWRLZXkgPSBTYWZlUmVnZXguZXNjYXBlKGtleSk7XG4gICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXHske2VzY2FwZWRLZXl9XFxcXH1gLCAnZycpLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBDYXAgcmVuZGVyZWQgZ29hbCBsZW5ndGggdG8gcHJldmVudCBvdmVyc2l6ZWQgcGF5bG9hZHNcbiAgICBpZiAocmVuZGVyZWQubGVuZ3RoID4gQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbmRlcmVkIGdvYWwgZXhjZWVkcyBNQVhfUkVOREVSRURfR09BTF9MRU5HVEgsIHRydW5jYXRpbmcnLCB7XG4gICAgICAgIHJlbmRlcmVkTGVuZ3RoOiByZW5kZXJlZC5sZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCxcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyZWQgPSByZW5kZXJlZC5zdWJzdHJpbmcoMCwgQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCB1bm1hdGNoZWQge3BsYWNlaG9sZGVyfSBwYXR0ZXJucyByZW1haW5pbmcgYWZ0ZXIgdGVtcGxhdGUgcmVuZGVyaW5nLlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIHBsYWNlaG9sZGVyIG5hbWVzIGZvdW5kIGluIHRoZSByZW5kZXJlZCBzdHJpbmcuXG4gICAqIElzc3VlICMxMjY6IFdhcm4gd2hlbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwbGFjZWhvbGRlclBhdHRlcm4gPSAvXFx7KFthLXpBLVpfXVthLXpBLVowLTlfXSopXFx9L2c7XG4gICAgY29uc3QgdW5tYXRjaGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcGxhY2Vob2xkZXJQYXR0ZXJuLmV4ZWMocmVuZGVyZWQpKSAhPT0gbnVsbCkge1xuICAgICAgdW5tYXRjaGVkLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gdW5tYXRjaGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UgZm9yIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uLlxuICAgKiBVc2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBwcmUtZmxpZ2h0IGNoZWNrIGFuZCB0aGUgcnVudGltZSBjaGFpbiBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aDogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGFnZW50TmFtZSA9IGN5Y2xlUGF0aFtjeWNsZVBhdGgubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIChcbiAgICAgIGBDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkIChjeWNsZSBvZiAke2N5Y2xlUGF0aC5sZW5ndGggLSAxfSk6IGAgK1xuICAgICAgYCR7Y3ljbGVQYXRoLmpvaW4oJyDihpIgJyl9LiBgICtcbiAgICAgIGBBZ2VudCAnJHthZ2VudE5hbWV9JyBjYW5ub3QgYWN0aXZhdGUgaXRzZWxmIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuYFxuICAgICk7XG4gIH1cblxuICAvKiogU2FmZXR5IGxpbWl0cyBmb3IgYWN0aXZhdGlvbiBncmFwaCB0cmF2ZXJzYWwgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0FDVElWQVRJT05fREVQVEggPSAxMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX05PREVTX1ZJU0lURUQgPSAxMDA7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiDigJQgTGF5ZXIgMSBvZiBkdWFsLWRldGVjdGlvbiBzdHJhdGVneSAoSXNzdWUgIzM3NClcbiAgICpcbiAgICogUGVyZm9ybXMgYXN5bmMgREZTIG9uIHRoZSBhY3RpdmF0aW9uIGdyYXBoIHRvIGRldGVjdCBjeWNsZXMgQkVGT1JFIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAqIFRoaXMgaXMgYSBwcmUtZmxpZ2h0IGNoZWNrIHRoYXQgcHJldmVudHMgY2lyY3VsYXIgYWN0aXZhdGlvbiBjaGFpbnMgZnJvbSBiZWluZyBhdHRlbXB0ZWQuXG4gICAqXG4gICAqIExheWVyIDEgKHRoaXMgbWV0aG9kKTogU3RhdGljIGdyYXBoIGFuYWx5c2lzIOKAlCB3YWxrcyB0aGUgYWN0aXZhdGlvbiBncmFwaCBmcm9tIHRoZSByb290XG4gICAqIGFnZW50LCBsb2FkaW5nIGVhY2ggYWdlbnQncyBgYWN0aXZhdGVzLmFnZW50c2AgbWV0YWRhdGEuIENhdGNoZXMgYWxsIGN5Y2xlcyByZWFjaGFibGVcbiAgICogZnJvbSB0aGUgcm9vdCB3aXRob3V0IGV4ZWN1dGluZyBhbnkgYWdlbnRzLiBCb3VuZGVkIGJ5IE1BWF9BQ1RJVkFUSU9OX0RFUFRIIGFuZFxuICAgKiBNQVhfTk9ERVNfVklTSVRFRCB0byBwcmV2ZW50IHJlc291cmNlIGV4aGF1c3Rpb24gZnJvbSBsYXJnZSBhY3ljbGljIGdyYXBocy5cbiAgICpcbiAgICogTGF5ZXIgMiAoZ2V0RWxlbWVudENvbnRlbnQgcnVudGltZSBjaGVjayk6IERlZmVuc2UtaW4tZGVwdGgg4oCUIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXNcbiAgICogbGlrZSBkeW5hbWljYWxseS1jb25zdHJ1Y3RlZCBhY3RpdmF0aW9uIGNoYWlucyBvciBhZ2VudHMgbW9kaWZpZWQgYmV0d2VlbiB0aGUgc3RhdGljXG4gICAqIGNoZWNrIGFuZCBhY3R1YWwgZXhlY3V0aW9uLiBTZWUgZ2V0RWxlbWVudENvbnRlbnQgZm9yIGRldGFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSByb290TmFtZSAtIFRoZSByb290IGFnZW50IG5hbWUgaW5pdGlhdGluZyB0aGUgYWN0aXZhdGlvbiBjaGFpblxuICAgKiBAcGFyYW0gYWN0aXZhdGVkQWdlbnRzIC0gVGhlIGltbWVkaWF0ZSBhZ2VudHMgYWN0aXZhdGVkIGJ5IHRoZSByb290XG4gICAqIEByZXR1cm5zIFRoZSBjeWNsZSBwYXRoIGFycmF5IGlmIGEgY3ljbGUgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3RBY3RpdmF0aW9uQ3ljbGVzKFxuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZhdGVkQWdlbnRzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIC8vIENhY2hlIGxvYWRlZCBhZ2VudHMgdG8gYXZvaWQgcmVkdW5kYW50IEkvTyBkdXJpbmcgREZTXG4gICAgY29uc3QgYWdlbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXSB8IG51bGw+KCk7XG5cbiAgICAvLyBIZWxwZXI6IGxvYWQgYW4gYWdlbnQncyBhY3RpdmF0ZXMuYWdlbnRzIGxpc3QgKGNhY2hlZClcbiAgICBjb25zdCBnZXRBY3RpdmF0ZWRBZ2VudHMgPSBhc3luYyAobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoYWdlbnRDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiBhZ2VudENhY2hlLmdldChjYWNoZUtleSkgfHwgW107XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgcmVmZXJlbmNlZCBpbiBhY3RpdmF0ZXMuYWdlbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBkdXJpbmcgY3ljbGUgZGV0ZWN0aW9uYCk7XG4gICAgICAgICAgYWdlbnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuICAgICAgICBjb25zdCBhZ2VudHMgPSBtZXRhLmFjdGl2YXRlcz8uYWdlbnRzIHx8IFtdO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgYWdlbnRzKTtcbiAgICAgICAgcmV0dXJuIGFnZW50cztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nIHJlZmVyZW5jZWQgaW4gYWN0aXZhdGVzLmFnZW50cyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZHVyaW5nIGN5Y2xlIGRldGVjdGlvbmApO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVHJhY2tzIG5vZGVzIHdob3NlIGVudGlyZSBzdWJ0cmVlIGhhcyBiZWVuIGV4cGxvcmVkIHdpdGhvdXQgZmluZGluZyBhIGN5Y2xlLlxuICAgIC8vIFByZXZlbnRzIGV4cG9uZW50aWFsIHJlLWV4cGxvcmF0aW9uIGluIGRpYW1vbmQvY29udmVyZ2VudCBncmFwaHMuXG4gICAgY29uc3QgZnVsbHlFeHBsb3JlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBub2Rlc1Zpc2l0ZWQgPSAwO1xuXG4gICAgLy8gREZTIOKAlCBzdGFjayBlbnRyaWVzOiBbY3VycmVudEFnZW50LCBwYXRoU29GYXIsIHBhdGhTZXRMb3dlcl1cbiAgICAvLyBwYXRoU2V0TG93ZXIgaXMgYSBTZXQ8c3RyaW5nPiBvZiBsb3dlcmNhc2VkIG5hbWVzIGZvciBPKDEpIGN5Y2xlIGNoZWNrc1xuICAgIGNvbnN0IHN0YWNrOiBBcnJheTxbc3RyaW5nLCBzdHJpbmdbXSwgU2V0PHN0cmluZz5dPiA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdExvd2VyID0gcm9vdE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGFjdGl2YXRlZEFnZW50cykge1xuICAgICAgLy8gU2VsZi1sb29wOiBhZ2VudCBkaXJlY3RseSBhY3RpdmF0ZXMgaXRzZWxmXG4gICAgICBpZiAoY2hpbGQudG9Mb3dlckNhc2UoKSA9PT0gcm9vdExvd2VyKSB7XG4gICAgICAgIHJldHVybiBbcm9vdE5hbWUsIGNoaWxkXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGhTZXQgPSBuZXcgU2V0PHN0cmluZz4oW3Jvb3RMb3dlciwgY2hpbGQudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFtyb290TmFtZSwgY2hpbGRdLCBwYXRoU2V0XSk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtjdXJyZW50LCBjdXJyZW50UGF0aCwgcGF0aFNldF0gPSBzdGFjay5wb3AoKSE7XG5cbiAgICAgIG5vZGVzVmlzaXRlZCsrO1xuICAgICAgaWYgKG5vZGVzVmlzaXRlZCA+IEFnZW50TWFuYWdlci5NQVhfTk9ERVNfVklTSVRFRCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gZm9yICcke3Jvb3ROYW1lfScgYWJvcnRlZDogZXhjZWVkZWQgJHtBZ2VudE1hbmFnZXIuTUFYX05PREVTX1ZJU0lURUR9IG5vZGVzIHZpc2l0ZWQuIGAgK1xuICAgICAgICAgIGBUaGUgYWN0aXZhdGlvbiBncmFwaCBtYXkgYmUgdG9vIGxhcmdlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50UGF0aC5sZW5ndGggPiBBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEggKyAxKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiBmb3IgJyR7cm9vdE5hbWV9JyBoaXQgZGVwdGggbGltaXQgb2YgJHtBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEh9LiBgICtcbiAgICAgICAgICBgU2tpcHBpbmcgZGVlcGVyIGJyYW5jaGVzLmBcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRMb3dlciA9IGN1cnJlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChmdWxseUV4cGxvcmVkLmhhcyhjdXJyZW50TG93ZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIHRoaXMgYWdlbnQncyBhY3RpdmF0aW9uc1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCBnZXRBY3RpdmF0ZWRBZ2VudHMoY3VycmVudCk7XG5cbiAgICAgIGxldCBmb3VuZEN5Y2xlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTG93ZXIgPSBjaGlsZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsZTogZG9lcyB0aGlzIGNoaWxkIGFwcGVhciBlYXJsaWVyIGluIHRoZSBwYXRoP1xuICAgICAgICBpZiAocGF0aFNldC5oYXMoY2hpbGRMb3dlcikpIHtcbiAgICAgICAgICByZXR1cm4gWy4uLmN1cnJlbnRQYXRoLCBjaGlsZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZ1bGx5RXhwbG9yZWQuaGFzKGNoaWxkTG93ZXIpKSB7XG4gICAgICAgICAgY29uc3QgbmV3UGF0aFNldCA9IG5ldyBTZXQocGF0aFNldCk7XG4gICAgICAgICAgbmV3UGF0aFNldC5hZGQoY2hpbGRMb3dlcik7XG4gICAgICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFsuLi5jdXJyZW50UGF0aCwgY2hpbGRdLCBuZXdQYXRoU2V0XSk7XG4gICAgICAgICAgZm91bmRDeWNsZSA9IHRydWU7IC8vIGhhcyBjaGlsZHJlbiB0byBleHBsb3JlLCBub3QgZnVsbHkgZXhwbG9yZWQgeWV0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gdW5leHBsb3JlZCBjaGlsZHJlbiwgdGhpcyBub2RlJ3Mgc3VidHJlZSBpcyBjeWNsZS1mcmVlXG4gICAgICBpZiAoIWZvdW5kQ3ljbGUpIHtcbiAgICAgICAgZnVsbHlFeHBsb3JlZC5hZGQoY3VycmVudExvd2VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEVsZW1lbnRDb250ZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBleGVjdXRpb25Db250ZXh0PzogRXhlY3V0aW9uQ29udGV4dFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIEdldCB0aGUgc3RhdGljIHJlc29sdmVyXG4gICAgY29uc3QgcmVzb2x2ZXIgPSBBZ2VudE1hbmFnZXIuZ2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcigpO1xuICAgIGlmICghcmVzb2x2ZXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBFbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgbm90IGNvbmZpZ3VyZWQgLSBjYW5ub3QgYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1gKTtcbiAgICAgIHJldHVybiBgW0VsZW1lbnQgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCBmb3IgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1dYDtcbiAgICB9XG5cbiAgICAvLyBMYXllciAyIChkZWZlbnNlLWluLWRlcHRoKTogUnVudGltZSBjaXJjdWxhciBhY3RpdmF0aW9uIGRldGVjdGlvbiAoSXNzdWUgIzEwOSlcbiAgICAvLyBUaGUgc3RhdGljIHByZS1mbGlnaHQgY2hlY2sgKGRldGVjdEFjdGl2YXRpb25DeWNsZXMsIGxheWVyIDEpIGNhdGNoZXMgbW9zdCBjeWNsZXNcbiAgICAvLyBiZWZvcmUgZXhlY3V0aW9uIGJlZ2lucy4gVGhpcyBydW50aW1lIGNoZWNrIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXMgc3VjaCBhc1xuICAgIC8vIGR5bmFtaWNhbGx5LWNvbnN0cnVjdGVkIGFjdGl2YXRpb24gY2hhaW5zIG9yIGFnZW50cyBtb2RpZmllZCBiZXR3ZWVuIHRoZSBzdGF0aWNcbiAgICAvLyBjaGVjayBhbmQgYWN0dWFsIGV4ZWN1dGlvbi4gVXNlcyBleGVjdXRpb25Db250ZXh0LmFnZW50Q2hhaW4gd2hpY2ggdHJhY2tzIHRoZVxuICAgIC8vIGN1cnJlbnQgZXhlY3V0aW9uIHBhdGgg4oCUIGVmZmVjdGl2ZSBmb3IgZGlyZWN0IGFuZCBtdWx0aS1ob3AgY2hhaW5zIHdpdGhpbiBhXG4gICAgLy8gc2luZ2xlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gJ2FnZW50cycgJiYgZXhlY3V0aW9uQ29udGV4dD8uYWdlbnRDaGFpbikge1xuICAgICAgY29uc3QgY2hhaW5TZXQgPSBuZXcgU2V0KGV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbi5tYXAobmFtZSA9PiBuYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZWxlbWVudE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKGNoYWluU2V0Lmhhcyhub3JtYWxpemVkTmFtZSkpIHtcbiAgICAgICAgY29uc3QgY3ljbGVQYXRoID0gWy4uLmV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbiwgZWxlbWVudE5hbWVdO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBNYXAgcGx1cmFsIGVsZW1lbnQgdHlwZXMgdG8gbWFuYWdlciBuYW1lc1xuICAgICAgY29uc3QgbWFuYWdlck5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIHBlcnNvbmFzOiAnUGVyc29uYU1hbmFnZXInLFxuICAgICAgICBza2lsbHM6ICdTa2lsbE1hbmFnZXInLFxuICAgICAgICBtZW1vcmllczogJ01lbW9yeU1hbmFnZXInLFxuICAgICAgICB0ZW1wbGF0ZXM6ICdUZW1wbGF0ZU1hbmFnZXInLFxuICAgICAgICBlbnNlbWJsZXM6ICdFbnNlbWJsZU1hbmFnZXInLFxuICAgICAgICBhZ2VudHM6ICdBZ2VudE1hbmFnZXInXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYW5hZ2VyTmFtZSA9IG1hbmFnZXJOYW1lTWFwW2VsZW1lbnRUeXBlXTtcbiAgICAgIGlmICghbWFuYWdlck5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWApO1xuICAgICAgICByZXR1cm4gYFtVbmtub3duIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1dYDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFuYWdlciA9IHJlc29sdmVyKG1hbmFnZXJOYW1lKTtcbiAgICAgIGlmICghbWFuYWdlcikge1xuICAgICAgICBsb2dnZXIud2FybihgTWFuYWdlciBub3QgZm91bmQgZm9yIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbiAgICAgICAgcmV0dXJuIGBbTWFuYWdlciBub3QgZm91bmQ6ICR7bWFuYWdlck5hbWV9XWA7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgb2YgdGhpcyB0eXBlXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IG1hbmFnZXIubGlzdCgpO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzLmZpbmQoKGU6IGFueSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBlbGVtZW50TmFtZSk7XG5cbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiBhcHByb3ByaWF0ZSBjb250ZW50IGJhc2VkIG9uIGVsZW1lbnQgdHlwZVxuICAgICAgc3dpdGNoIChlbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudCB8fCAnJztcblxuICAgICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50Lmluc3RydWN0aW9ucyB8fCAnJztcblxuICAgICAgICBjYXNlICdtZW1vcmllcyc6IHtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZWxlbWVudC5nZXRFbnRyaWVzKCk7XG4gICAgICAgICAgcmV0dXJuIGBNZW1vcnkgJyR7ZWxlbWVudE5hbWV9JyB3aXRoICR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXNgO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAndGVtcGxhdGVzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5jb250ZW50IHx8ICcnO1xuXG4gICAgICAgIGNhc2UgJ2Vuc2VtYmxlcyc6IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50TGlzdCA9IE9iamVjdC5lbnRyaWVzKGVsZW1lbnQuZWxlbWVudHMgfHwge30pXG4gICAgICAgICAgICAubWFwKChbdHlwZSwgbmFtZXNdKSA9PiBgJHt0eXBlfTogJHtBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzLmpvaW4oJywgJykgOiBTdHJpbmcobmFtZXMpfWApXG4gICAgICAgICAgICAuam9pbignOyAnKTtcbiAgICAgICAgICByZXR1cm4gYEVuc2VtYmxlICcke2VsZW1lbnROYW1lfScgYWN0aXZhdGVzOiAke2VsZW1lbnRMaXN0fWA7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdhZ2VudHMnOiB7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGBbQ29udGVudCBub3QgYXZhaWxhYmxlIGZvciAke2VsZW1lbnRUeXBlfV1gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGdldHRpbmcgY29udGVudCBmb3IgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JzpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ2FnZW50cycpO1xuXG4gICAgLy8gQmVsb3cgdGhyZXNob2xkIOKAlCBubyBhY3Rpb24gbmVlZGVkXG4gICAgaWYgKHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIGFnZW50cyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgYWdlbnRzIG9yIHNldHRpbmcgRE9MTEhPVVNFX01BWF9BQ1RJVkVfQUdFTlRTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX0FDVElWQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgYWdlbnRzIGxpbWl0IHJlYWNoZWQgKCR7dGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemV9LyR7bWF4fSlgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFjdGl2ZUNvdW50OiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSxcbiAgICAgICAgICBtYXhBbGxvd2VkOiBtYXgsXG4gICAgICAgICAgYWN0aXZlQWdlbnROYW1lczogQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZUFnZW50TmFtZXMpLFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSB0aHJlc2hvbGQg4oCUIHByb2FjdGl2ZWx5IGNsZWFuIHN0YWxlIGVudHJpZXNcbiAgICB2b2lkIHRoaXMuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBhZ2VudHMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0U2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBleGlzdGluZ0FnZW50TmFtZXMgPSBuZXcgU2V0KGFnZW50cy5tYXAoYSA9PiBhLm1ldGFkYXRhLm5hbWUpKTtcblxuICAgICAgY29uc3Qgc3RhbGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlTmFtZSBvZiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ0FnZW50TmFtZXMuaGFzKGFjdGl2ZU5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmRlbGV0ZShhY3RpdmVOYW1lKTtcbiAgICAgICAgICBzdGFsZU5hbWVzLnB1c2goYWN0aXZlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kU2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBhZ2VudCByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgYWdlbnRzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ2FnZW50cycpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMnLFxuICAgICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGFnZW50IHJlZmVyZW5jZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQsXG4gICAgICAgICAgICBhY3RpdmVDb3VudDogZW5kU2l6ZSxcbiAgICAgICAgICAgIHN0YWxlTmFtZXM6IHN0YWxlTmFtZXMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgc3RhbGUgYWN0aXZlIGFnZW50czonLCBlcnJvcik7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgYW4gYWdlbnQgc3RhdGUgZmlsZSAoWUFNTCkuXG4gICAqXG4gICAqIElNUFJPVkVNRU5UOiBPcHRpbWlzdGljIGxvY2tpbmcgd2l0aCB2ZXJzaW9uIGNoZWNraW5nIChJc3N1ZSAjMjQpXG4gICAqIFByZXZlbnRzIHN0YXRlIGNvcnJ1cHRpb24gZnJvbSBjb25jdXJyZW50IHVwZGF0ZXMgYnkgY29tcGFyaW5nIHZlcnNpb25zXG4gICAqXG4gICAqIEZJWDogVXNlcyBub3JtYWxpemVGaWxlbmFtZSgpIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgbmFtaW5nXG4gICAqIFRoaXMgZW5zdXJlcyBzdGF0ZSBmaWxlcyB1c2Uga2ViYWItY2FzZSAoZS5nLiwgXCJjcnVkdi1hZ2VudC1kZWx0YS5zdGF0ZS55YW1sXCIpXG4gICAqIHJlZ2FyZGxlc3Mgb2YgaW5wdXQgbmFtZSBmb3JtYXQgKGUuZy4sIFwiQ1JVRFYtQWdlbnQtRGVsdGFcIilcbiAgICpcbiAgICogRklYIChJc3N1ZSAjMTA3IC0gQ1JJVC0yKTogV3JhcCByZWFkLWNvbXBhcmUtd3JpdGUgc2VxdWVuY2UgaW4gZmlsZSBsb2NrXG4gICAqIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uIGZyb20gY29uY3VycmVudCBhZ2VudCBleGVjdXRpb25zXG4gICAqXG4gICAqIEZJWCAoSXNzdWUgIzEyMyk6IFZlcnNpb24gaW5jcmVtZW50cyBvbiBzdWNjZXNzZnVsIHNhdmUsIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmV3IHN0YXRlIHZlcnNpb24gYWZ0ZXIgc3VjY2Vzc2Z1bCBzYXZlXG4gICAqIEBwcm90ZWN0ZWQgT25seSBhY2Nlc3NpYmxlIGJ5IHN1YmNsYXNzZXMgKGUuZy4sIFRlc3RhYmxlQWdlbnRNYW5hZ2VyIGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVBZ2VudFN0YXRlKG5hbWU6IHN0cmluZywgc3RhdGU6IEFnZW50U3RhdGUpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcblxuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBuYW1pbmdcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5zdGF0ZURpciwgYCR7bm9ybWFsaXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gKTtcblxuICAgIC8vIEZJWCAoSXNzdWUgIzEwNyAtIENSSVQtMik6IEFjcXVpcmUgZmlsZSBsb2NrIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uXG4gICAgLy8gVGhlIGxvY2sgY292ZXJzIHRoZSBlbnRpcmUgcmVhZC1jb21wYXJlLXdyaXRlIHNlcXVlbmNlIHRvIGVuc3VyZSBhdG9taWNpdHlcbiAgICBhd2FpdCB0aGlzLmZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgYWdlbnQtc3RhdGU6JHtub3JtYWxpemVkTmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBGSVg6IE9wdGltaXN0aWMgbG9ja2luZyBjaGVjayAoSXNzdWUgIzI0KVxuICAgICAgLy8gTG9hZCBleGlzdGluZyBzdGF0ZSB0byBjb21wYXJlIHZlcnNpb25zIGJlZm9yZSBvdmVyd3JpdGluZ1xuICAgICAgY29uc3QgZXhpc3RpbmdTdGF0ZSA9IGF3YWl0IHRoaXMubG9hZEFnZW50U3RhdGUobmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmdTdGF0ZSAmJiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG91ciBzdGF0ZSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uXG4gICAgICAgIC8vIElmIHZlcnNpb25zIGRvbid0IG1hdGNoLCBpdCBtZWFucyBhbm90aGVyIHByb2Nlc3MgdXBkYXRlZCB0aGUgc3RhdGVcbiAgICAgICAgaWYgKGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uID4gc3RhdGUuc3RhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFN0YXRlIHZlcnNpb24gY29uZmxpY3QgZGV0ZWN0ZWQgZm9yIGFnZW50ICR7bmFtZX1gLCB7XG4gICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgYXR0ZW1wdGVkVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnTUVNT1JZX1NBVkVfRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5zYXZlQWdlbnRTdGF0ZScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3RhdGUgdmVyc2lvbiBjb25mbGljdDogYXR0ZW1wdGVkIHRvIHNhdmUgc3RhbGUgc3RhdGVgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgICBhdHRlbXB0ZWRWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0OiBjdXJyZW50IHZlcnNpb24gaXMgJHtleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbn0sIGAgK1xuICAgICAgICAgICAgYGJ1dCBhdHRlbXB0ZWQgdG8gc2F2ZSB2ZXJzaW9uICR7c3RhdGUuc3RhdGVWZXJzaW9ufS4gYCArXG4gICAgICAgICAgICBgU3RhdGUgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBjb25jdXJyZW50bHkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRklYIChJc3N1ZSAjMTIzKTogSW5jcmVtZW50IHZlcnNpb24gQkVGT1JFIHNlcmlhbGl6YXRpb24sIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgICAgLy8gVGhpcyBlbnN1cmVzIHZlcnNpb24gb25seSBpbmNyZW1lbnRzIG9uIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gKHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAwKSArIDE7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHRoaXMucHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZSk7XG5cbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5kdW1wWWFtbChzZXJpYWxpemVkU3RhdGUsIHtcbiAgICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBGaXggIzkxNDogZmFpbHNhZmUgY29ycnVwdHMgYm9vbGVhbnMvbnVtYmVycyBpbiBhZ2VudCBzdGF0ZVxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgc2l6ZVxuICAgICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS52YWxpZGF0ZVNpemUoeWFtbENvbnRlbnQsIE1BWF9ZQU1MX1NJWkUsICdBZ2VudCBzdGF0ZScpO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGxvb2t1cHNcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobm9ybWFsaXplZE5hbWUsIHN0YXRlKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBBZ2VudCBzdGF0ZSBzYXZlZCBzdWNjZXNzZnVsbHlgLCB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgbm9ybWFsaXplZE5hbWUsXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICBnb2FsQ291bnQ6IHN0YXRlLmdvYWxzPy5sZW5ndGggPz8gMFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG5ldyB2ZXJzaW9uIGZvciBjYWxsZXIgdG8gc3luYyBhZ2VudCdzIGludGVybmFsIHN0YXRlXG4gICAgLy8gc3RhdGVWZXJzaW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBudW1iZXIgYWZ0ZXIgdGhlIGluY3JlbWVudCBhYm92ZVxuICAgIHJldHVybiBzdGF0ZS5zdGF0ZVZlcnNpb24hO1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHk6IGVuc3VyZSBgLm1kYCBleHRlbnNpb24gb24gcmVxdWVzdGVkIHBhdGguXG4gICAqL1xuICBwcml2YXRlIHN0cmlwRXh0ZW5zaW9uKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gZmlsZVBhdGguc2xpY2UoMCwgLUFHRU5UX0ZJTEVfRVhURU5TSU9OLmxlbmd0aClcbiAgICAgIDogZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50OiBBZ2VudCwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmxvYWRBZ2VudFN0YXRlKG5hbWUpO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSk7XG4gICAgc2VyaWFsaXplZC5zdGF0ZSA9IHN0YXRlO1xuICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpKTtcbiAgICBhZ2VudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50U3RhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFN0YXRlIHwgbnVsbD4ge1xuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBsb29rdXBzXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGVDYWNoZS5oYXMobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZUNhY2hlLmdldChub3JtYWxpemVkTmFtZSkhO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgY29uc3Qgc3RhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIHN0YXRlRmlsZW5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKHN0YXRlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBZQU1MIHBhcnNpbmdcbiAgICAgIC8vIFN0YXRlIGZpbGVzIGFyZSBwdXJlIFlBTUwgYnV0IHBhcnNlRnJvbnRtYXR0ZXIgaGFuZGxlcyBib3RoIGZvcm1hdHNcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5sb2FkQWdlbnRTdGF0ZSdcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHJlc3VsdC5kYXRhIGFzIEFnZW50U3RhdGU7XG4gICAgICB0aGlzLm5vcm1hbGl6ZUxvYWRlZFN0YXRlKHN0YXRlKTtcbiAgICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgbG9va3Vwc1xuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChub3JtYWxpemVkTmFtZSwgc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IHN0YXRlOiAke25hbWV9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTdGF0ZURpcmVjdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8QWdlbnRNZXRhZGF0YT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0geyAuLi4oZGF0YSBhcyBhbnkpIH07XG5cbiAgICAvLyAtLS0gU1RBUlQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IGZvciBMZWdhY3kgQWdlbnQgVHlwZXMgLS0tXG4gICAgLy8gTGVnYWN5IGFnZW50IGRlZmluaXRpb24gZmlsZXMgbWlnaHQgdXNlICdhZ2VudCcgKHNpbmd1bGFyKSBpbnN0ZWFkIG9mXG4gICAgLy8gRWxlbWVudFR5cGUuQUdFTlQgKCdhZ2VudHMnKS4gVGhpcyBjb252ZXJ0cyB0aGUgc2luZ3VsYXIgZm9ybSB0byB0aGVcbiAgICAvLyBjb3JyZWN0IHBsdXJhbCBlbnVtIHZhbHVlIHRvIGVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgIGlmIChtZXRhZGF0YS50eXBlID09PSAnYWdlbnQnKSB7XG4gICAgICBtZXRhZGF0YS50eXBlID0gRWxlbWVudFR5cGUuQUdFTlQ7XG4gICAgfVxuICAgIC8vIC0tLSBFTkQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IC0tLVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgdHlwZSBpcyBub3cgRWxlbWVudFR5cGUuQUdFTlQgKHBsdXJhbClcbiAgICBpZiAobWV0YWRhdGEudHlwZSAmJiBtZXRhZGF0YS50eXBlICE9PSBFbGVtZW50VHlwZS5BR0VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZTogZXhwZWN0ZWQgJyR7RWxlbWVudFR5cGUuQUdFTlR9JywgZ290ICcke21ldGFkYXRhLnR5cGV9J2ApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgbmFtZSB2YWxpZGF0aW9uXG4gICAgaWYgKG1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5uYW1lLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IG5hbWU6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5uYW1lID0gbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGRlc2NyaXB0aW9uIHZhbGlkYXRpb25cbiAgICAvLyBGSVg6IE11c3Qgc3BlY2lmeSBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgdG8gYWxsb3cgcHVuY3R1YXRpb24gbGlrZSBjb2xvbnMsIHNlbWljb2xvbnMsIGV0Yy5cbiAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBkZXNjcmlwdGlvbjogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHNwZWNpYWxpemF0aW9ucyBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh2YWx1ZSksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcGVjaWFsaXphdGlvbiBcIiR7dmFsdWV9XCI6ICR7cmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnMucHVzaChyZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9ucztcbiAgICB9XG5cbiAgICAvLyBLRUVQOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgKGFscmVhZHkgdXNpbmcgc2VydmljZSBwYXR0ZXJuKVxuICAgIGlmIChtZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICAgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bidcbiAgICAgICk7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2VycztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjc2OiBTYW5pdGl6ZSBnYXRla2VlcGVyIHBvbGljeSBvbiBsb2FkIHRvIHByZXZlbnQgcHJvbXB0LWluamVjdGlvbiBhdHRhY2tzXG4gICAgLy8gTWFsZm9ybWVkIHBvbGljaWVzIGFyZSBzdHJpcHBlZCBhbmQgbG9nZ2VkIGFzIHNlY3VyaXR5IGV2ZW50cyAobmV2ZXIgcmVhY2ggZW5mb3JjZW1lbnQpXG4gICAgaWYgKG1ldGFkYXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kobWV0YWRhdGEuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bicsICdhZ2VudCcsIG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzIyOiBWYWxpZGF0ZSBWMiBhZ2VudCBmaWVsZHMgb24gbG9hZCDigJQgc3RydWN0dXJhbCBjaGVja3MsIHN0cmlwIG1hbGZvcm1lZCBkYXRhLlxuICAgIC8vIEZhaWwtb3BlbjogY29ycnVwdGVkIGZpZWxkcyBhcmUgcmVtb3ZlZCBhbmQgbG9nZ2VkLCBub3QgdGhyb3duLiBUaGlzIHByZXZlbnRzXG4gICAgLy8gYmFkIGRhdGEgZnJvbSByZWFjaGluZyBleGVjdXRpb24gdGltZSB3aGlsZSBrZWVwaW5nIHRoZSBhZ2VudCBsb2FkYWJsZS5cbiAgICBjb25zdCBhZ2VudE5hbWUgPSBtZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJztcblxuICAgIC8vIElzc3VlICM2OTc6IE5vcm1hbGl6ZSBgZ29hbHNgIChwbHVyYWwpIOKGkiBgZ29hbGAgKHNpbmd1bGFyKVxuICAgIGlmIChtZXRhZGF0YS5nb2FscyAhPT0gdW5kZWZpbmVkICYmIG1ldGFkYXRhLmdvYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhLmdvYWxzO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWxzO1xuICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogbWlncmF0ZWQgJ2dvYWxzJyAocGx1cmFsKSB0byAnZ29hbCdgKTtcbiAgICB9IGVsc2UgaWYgKG1ldGFkYXRhLmdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGBnb2FsYCBhbHJlYWR5IHNldCDigJQgZHJvcCB0aGUgcmVkdW5kYW50IHBsdXJhbCBmb3JtXG4gICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbHM7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmdvYWwpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1ldGFkYXRhLmdvYWwudGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkc1xuICAgICAgICBub3JtYWxpemVHb2FsS2V5cyhtZXRhZGF0YS5nb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHBhcmFtZXRlcnMgYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLmdvYWwucGFyYW1ldGVycykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnBhcmFtZXRlcnMgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIHN1Y2Nlc3NDcml0ZXJpYSBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYSkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsLnN1Y2Nlc3NDcml0ZXJpYSBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsLnN1Y2Nlc3NDcml0ZXJpYTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0YWRhdGEuZ29hbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gZ29hbCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIG9iamVjdCB3aXRoIHRlbXBsYXRlIOKAlCBhbnl0aGluZyBlbHNlIGlzIGludmFsaWRcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogZ29hbCBpcyBtYWxmb3JtZWQgKG5vIHRlbXBsYXRlKSwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYWN0aXZhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYWN0aXZhdGVzIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRWFjaCBrZXkgc2hvdWxkIG1hcCB0byBhIHN0cmluZyBhcnJheVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YS5hY3RpdmF0ZXMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhY3RpdmF0ZXMuJHtrZXl9IGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWN0aXZhdGVzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnRvb2xzKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scyBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiB0b29scy5hbGxvd2VkIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nIHRvb2xzYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdhcCAzOiBWYWxpZGF0ZSB0b29scy5kZW5pZWQgaXMgYW4gYXJyYXkgaWYgcHJlc2VudFxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzLmRlbmllZCBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS50b29scy5kZW5pZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc3lzdGVtX3Byb21wdCDihpIgc3lzdGVtUHJvbXB0IChMTE1zIGNvbW1vbmx5IHVzZSBzbmFrZV9jYXNlKVxuICAgIGNvbnN0IGFueU1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYW55TWV0YS5zeXN0ZW1fcHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFueU1ldGEuc3lzdGVtUHJvbXB0ID0gYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cbiAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuXG4gICAgaWYgKG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBzeXN0ZW1Qcm9tcHQgaXMgbm90IGEgc3RyaW5nLCBzdHJpcHBpbmdgKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQ7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzY5NzogUHJvbW90ZSByb290LWxldmVsIFYxIGF1dG9ub215IGZpZWxkcyBpbnRvIHRoZSBgYXV0b25vbXlgIGJsb2NrLlxuICAgIC8vIFYxIGFnZW50cyBzdG9yZWQgcmlza1RvbGVyYW5jZSBhbmQgbWF4QXV0b25vbW91c1N0ZXBzIGF0IHRoZSBtZXRhZGF0YSByb290LlxuICAgIC8vIFYyIG5lc3RzIHRoZW0gdW5kZXIgYGF1dG9ub215YC4gVGhpcyBwcm9tb3Rpb24gZW5zdXJlcyBkb3duc3RyZWFtIGNvZGUgb25seVxuICAgIC8vIGNoZWNrcyBvbmUgbG9jYXRpb24uIFRoZSBleGlzdGluZyBhdXRvbm9teSB2YWxpZGF0aW9uIGJlbG93IHZhbGlkYXRlcyB2YWx1ZXMuXG4gICAgLy8gUHJlY2VkZW5jZTogY2FtZWxDYXNlIHZhcmlhbnRzIGFyZSBsaXN0ZWQgYmVmb3JlIHNuYWtlX2Nhc2Uvc2hvcnQgZm9ybXMsIHNvXG4gICAgLy8gZS5nLiBgcmlza1RvbGVyYW5jZWAgd2lucyBvdmVyIGByaXNrX3RvbGVyYW5jZWAgaWYgYm90aCBhcHBlYXIgYXQgcm9vdC5cbiAgICB7XG4gICAgICBjb25zdCByb290QXV0b25vbXlGaWVsZHM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gPSBbXG4gICAgICAgIFsncmlza1RvbGVyYW5jZScsICdyaXNrVG9sZXJhbmNlJ10sXG4gICAgICAgIFsncmlza190b2xlcmFuY2UnLCAncmlza1RvbGVyYW5jZSddLFxuICAgICAgICBbJ21heEF1dG9ub21vdXNTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhfYXV0b25vbW91c19zdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgICAgWydtYXhTdGVwcycsICdtYXhBdXRvbm9tb3VzU3RlcHMnXSxcbiAgICAgIF0gYXMgY29uc3Q7XG4gICAgICBsZXQgcHJvbW90ZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgW3Jvb3RLZXksIGF1dG9ub215S2V5XSBvZiByb290QXV0b25vbXlGaWVsZHMpIHtcbiAgICAgICAgaWYgKGFueU1ldGFbcm9vdEtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFCbG9jayA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhQmxvY2tbYXV0b25vbXlLZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFCbG9ja1thdXRvbm9teUtleV0gPSBhbnlNZXRhW3Jvb3RLZXldO1xuICAgICAgICAgICAgcHJvbW90ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYW55TWV0YVtyb290S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb21vdGVkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHByb21vdGVkIHJvb3QtbGV2ZWwgYXV0b25vbXkgZmllbGRzIGludG8gYXV0b25vbXkgYmxvY2tgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0b25vbXkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYXV0b25vbXkpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215IGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEuYXV0b25vbXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvbiAod2FzIGR1cGxpY2F0ZWQgaW4gcGFyc2VNZXRhZGF0YSArIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUpXG4gICAgICAgIGNvbnN0IGEgPSBtZXRhZGF0YS5hdXRvbm9teSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplQXV0b25vbXlLZXlzKGEpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHNwZWNpZmljIGZpZWxkc1xuICAgICAgICAvLyBHYXAgNDogVmFsaWRhdGUgcmlza1RvbGVyYW5jZSBlbnVtICh1c2VzIHNoYXJlZCBjb25zdGFudHMgZnJvbSBJc3N1ZSAjNzI3KVxuICAgICAgICBpZiAoYS5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKGEucmlza1RvbGVyYW5jZSwgUklTS19UT0xFUkFOQ0VfTEVWRUxTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LnJpc2tUb2xlcmFuY2UgJyR7YS5yaXNrVG9sZXJhbmNlfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmlza1RvbGVyYW5jZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215Lm1heEF1dG9ub21vdXNTdGVwcyBpcyBub3QgYSBudW1iZXIsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBhLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5yZXF1aXJlc0FwcHJvdmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGEucmVxdWlyZXNBcHByb3ZhbCkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhdXRvbm9teS5yZXF1aXJlc0FwcHJvdmFsIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEucmVxdWlyZXNBcHByb3ZhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hdXRvQXBwcm92ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LmF1dG9BcHByb3ZlIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEuYXV0b0FwcHJvdmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEucmVzaWxpZW5jZSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5yZXNpbGllbmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnJlc2lsaWVuY2UpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5yZXNpbGllbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb24gKHdhcyBkdXBsaWNhdGVkIGluIHBhcnNlTWV0YWRhdGEgKyB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKVxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gSXNzdWUgIzcyNzogVXNlIHNoYXJlZCBlbnVtIGNvbnN0YW50cyBmb3IgcmVzaWxpZW5jZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChyLm9uU3RlcExpbWl0UmVhY2hlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uU3RlcExpbWl0UmVhY2hlZCwgU1RFUF9MSU1JVF9BQ1RJT05TKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2Uub25TdGVwTGltaXRSZWFjaGVkICcke3Iub25TdGVwTGltaXRSZWFjaGVkfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIub25TdGVwTGltaXRSZWFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm9uRXhlY3V0aW9uRmFpbHVyZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uRXhlY3V0aW9uRmFpbHVyZSwgRVhFQ1VUSU9OX0ZBSUxVUkVfQUNUSU9OUykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm9uRXhlY3V0aW9uRmFpbHVyZSAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nIGlzIGludmFsaWQsIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLm9uRXhlY3V0aW9uRmFpbHVyZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heFJldHJpZXMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhSZXRyaWVzIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4UmV0cmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhDb250aW51YXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiByLm1heENvbnRpbnVhdGlvbnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5tYXhDb250aW51YXRpb25zIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIubWF4Q29udGludWF0aW9ucztcbiAgICAgICAgfVxuICAgICAgICAvLyBHYXAgNTogVmFsaWRhdGUgcmV0cnlCYWNrb2ZmIGVudW0gYW5kIHByZXNlcnZlU3RhdGUgYm9vbGVhbiAoc2hhcmVkIGNvbnN0YW50cyBmcm9tIElzc3VlICM3MjcpXG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2UucmV0cnlCYWNrb2ZmICcke3IucmV0cnlCYWNrb2ZmfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIucmV0cnlCYWNrb2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIucHJlc2VydmVTdGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIGlzIG5vdCBhIGJvb2xlYW4sIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSByLnByZXNlcnZlU3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUYWdzOiB2YWxpZGF0ZSBhcyBzdHJpbmcgYXJyYXkgKGNvbW1vbiBmaWVsZCwgYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgaWYgKG1ldGFkYXRhLnRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRhZ3MpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRhZ3MgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRhZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGEudGFncy5maWx0ZXIoKHQ6IHVua25vd24pID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogQWdlbnRNZXRhZGF0YSwgYm9keUNvbnRlbnQ6IHN0cmluZyk6IEFnZW50IHtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEZpeCAjOTEyOiBQcmVmZXIgZXhwbGljaXQgZm9ybWF0X3ZlcnNpb24gbWFya2VyLCBmYWxsIGJhY2sgdG8gaW5zdHJ1Y3Rpb25zLXByZXNlbmNlIGNoZWNrXG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gU3RyaXAgbWFya2VyIGZyb20gcnVudGltZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIGlmIChtZXRhZGF0YUluc3RydWN0aW9ucykge1xuICAgICAgLy8gdjIgZm9ybWF0OiBpbnN0cnVjdGlvbnMgZnJvbSBZQU1MLCBib2R5IGlzIGNvbnRlbnQgKHJlZmVyZW5jZSBtYXRlcmlhbClcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zO1xuICAgICAgYWdlbnQuY29udGVudCA9IGJvZHlDb250ZW50LnRyaW0oKTtcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHYxIGZvcm1hdDogYm9keSB0ZXh0IG1hcHMgdG8gaW5zdHJ1Y3Rpb25zXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBib2R5Q29udGVudC50cmltKCk7XG4gICAgICBhZ2VudC5jb250ZW50ID0gJyc7XG4gICAgfVxuICAgIC8vIEtlZXAgZXh0ZW5zaW9ucy5pbnN0cnVjdGlvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBhZ2VudC5pbnN0cnVjdGlvbnNcbiAgICB9O1xuICAgIHJldHVybiBhZ2VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGFnZW50OiBBZ2VudCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gU3RhcnQgd2l0aCBiYXNlIG1ldGFkYXRhIGZpZWxkcyAoYWx3YXlzIHByZXNlbnQpXG4gICAgY29uc3QgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5BR0VOVCksXG4gICAgICB1bmlxdWVfaWQ6IGFnZW50LmlkLFxuICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogYWdlbnQubWV0YWRhdGEuY3JlYXRlZCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgIH07XG5cbiAgICAvLyBDYXN0IHRvIGNoZWNrIGZvciB2MiBmaWVsZHNcbiAgICBjb25zdCBtZXRhZGF0YVYyID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgLy8gQWRkIHYyIGZpZWxkcyBpZiBwcmVzZW50IChnb2FsIGlzIHJlcXVpcmVkIGluIHYyLCBvdGhlcnMgb3B0aW9uYWwpXG4gICAgaWYgKG1ldGFkYXRhVjIuZ29hbCkge1xuICAgICAgbWV0YWRhdGEuZ29hbCA9IG1ldGFkYXRhVjIuZ29hbDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYWN0aXZhdGVzKSB7XG4gICAgICBtZXRhZGF0YS5hY3RpdmF0ZXMgPSBtZXRhZGF0YVYyLmFjdGl2YXRlcztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIudG9vbHMpIHtcbiAgICAgIG1ldGFkYXRhLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0KSB7XG4gICAgICBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPSBtZXRhZGF0YVYyLnN5c3RlbVByb21wdDtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhVjIuYXV0b25vbXkpIHtcbiAgICAgIG1ldGFkYXRhLmF1dG9ub215ID0gbWV0YWRhdGFWMi5hdXRvbm9teTtcbiAgICB9XG4gICAgLy8gSXNzdWUgIzQ0OTogU2VyaWFsaXplIGdhdGVrZWVwZXIgcG9saWN5IHRvIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICBpZiAobWV0YWRhdGFWMi5nYXRla2VlcGVyKSB7XG4gICAgICBtZXRhZGF0YS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNTI2OiBTZXJpYWxpemUgcmVzaWxpZW5jZSBwb2xpY3kgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnJlc2lsaWVuY2UpIHtcbiAgICAgIG1ldGFkYXRhLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzcyMjogT25seSBzZXJpYWxpemUgdjEgZmllbGRzIGZvciBhZ2VudHMgV0lUSE9VVCBhIGdvYWwgKGxlZ2FjeSB2MSBhZ2VudHMpLlxuICAgIC8vIFYyIGFnZW50cyAod2l0aCBnb2FsKSBzaG91bGQgbm90IGNhcnJ5IGRlcHJlY2F0ZWQgdjEgYmFnZ2FnZSBsaWtlXG4gICAgLy8gZGVjaXNpb25GcmFtZXdvcmssIHJpc2tUb2xlcmFuY2UsIGxlYXJuaW5nRW5hYmxlZCwgbWF4Q29uY3VycmVudEdvYWxzLlxuICAgIC8vIFRoZSBBZ2VudCBjb25zdHJ1Y3RvciBzdGlsbCBhcHBsaWVzIHRoZXNlIGRlZmF1bHRzIGF0IHJ1bnRpbWUgZm9yIGJhY2t3YXJkXG4gICAgLy8gY29tcGF0IHdoZW4gcmVhZGluZyBvbGQgZmlsZXMg4oCUIGJ1dCB3ZSBkb24ndCB3cml0ZSB0aGVtIGludG8gbmV3IHYyIGFnZW50cy5cbiAgICBjb25zdCBpc1YyQWdlbnQgPSAhIW1ldGFkYXRhVjIuZ29hbDtcbiAgICBpZiAoIWlzVjJBZ2VudCkge1xuICAgICAgaWYgKG1ldGFkYXRhVjIuZGVjaXNpb25GcmFtZXdvcmspIHtcbiAgICAgICAgbWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmsgPSBtZXRhZGF0YVYyLmRlY2lzaW9uRnJhbWV3b3JrO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIucmlza1RvbGVyYW5jZSkge1xuICAgICAgICBtZXRhZGF0YS5yaXNrVG9sZXJhbmNlID0gbWV0YWRhdGFWMi5yaXNrVG9sZXJhbmNlO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjIubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YWRhdGEubGVhcm5pbmdFbmFibGVkID0gbWV0YWRhdGFWMi5sZWFybmluZ0VuYWJsZWQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPSBtZXRhZGF0YVYyLm1heENvbmN1cnJlbnRHb2FscztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gc3BlY2lhbGl6YXRpb25zIGlzIG5vdCBhIGRlcHJlY2F0ZWQgdjEgZmllbGQg4oCUIGFsd2F5cyBzZXJpYWxpemVcbiAgICBpZiAobWV0YWRhdGFWMi5zcGVjaWFsaXphdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IG1ldGFkYXRhVjIuc3BlY2lhbGl6YXRpb25zO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNzIyOiBTZXJpYWxpemUgdGFncyBhbmQgdHJpZ2dlcnMgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShtZXRhZGF0YVYyLnRhZ3MpICYmIG1ldGFkYXRhVjIudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBtZXRhZGF0YS50YWdzID0gbWV0YWRhdGFWMi50YWdzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi50cmlnZ2Vycykge1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSBtZXRhZGF0YVYyLnRyaWdnZXJzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5ydWxlRW5naW5lQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1ldGFkYXRhLnJ1bGVFbmdpbmVDb25maWcgPSBtZXRhZGF0YVYyLnJ1bGVFbmdpbmVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gdjIuMCBmb3JtYXQ6IGluc3RydWN0aW9ucyBpbiBZQU1MIGZyb250bWF0dGVyLCBjb250ZW50IGFzIGJvZHlcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBhZ2VudC5pbnN0cnVjdGlvbnMgfHxcbiAgICAgIChhZ2VudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgdGhpcy5idWlsZERlZmF1bHRJbnN0cnVjdGlvbnMoYWdlbnQpO1xuICAgIGlmIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IGFnZW50LmNvbnRlbnQgfHwgdGhpcy5idWlsZERlZmF1bHRCb2R5KGFnZW50KTtcblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmNyZWF0ZUZyb250bWF0dGVyKG1ldGFkYXRhLCBib2R5LCB7XG4gICAgICBtZXRob2Q6ICdtYW51YWwnLFxuICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBVc2UgSlNPTiBzY2hlbWEgdG8gcHJlc2VydmUgYm9vbGVhbnMvbnVtYmVycyBpbiB2MiBtZXRhZGF0YVxuICAgICAgY2xlYW5NZXRhZGF0YTogdHJ1ZSxcbiAgICAgIGNsZWFuaW5nU3RyYXRlZ3k6ICdyZW1vdmUtYm90aCcsICAvLyBSZW1vdmUgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEluc3RydWN0aW9ucyhhZ2VudDogQWdlbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWVIZWFkZXIgPSBhZ2VudC5tZXRhZGF0YS5uYW1lID8gYCMgJHthZ2VudC5tZXRhZGF0YS5uYW1lfVxcblxcbmAgOiAnJztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgIHJldHVybiBgJHtuYW1lSGVhZGVyfSR7ZGVzY3JpcHRpb259YC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoYWdlbnQ6IEFnZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKGFnZW50Lm1ldGFkYXRhLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSB0ZXh0IHRoYXQgc2hvdWxkIHNhdGlzZnkgY3JlYXRlLXRpbWUgY29udGVudCB2YWxpZGF0aW9uLlxuICAgKiBCZWhhdmlvcmFsIGluc3RydWN0aW9ucyByZW1haW4gdGhlIHByaW1hcnkgc291cmNlLCB3aGlsZSByZWZlcmVuY2UgY29udGVudFxuICAgKiBhY3RzIGFzIHRoZSBmYWxsYmFjayBmb3IgY29udGVudC1vbmx5IGFnZW50IGNyZWF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcmltYXJ5VmFsaWRhdGlvblRleHQoY29udGVudDogc3RyaW5nLCByZWZlcmVuY2VDb250ZW50OiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZmVyZW5jZUNvbnRlbnQgPT09ICdzdHJpbmcnICYmIHJlZmVyZW5jZUNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZWZlcmVuY2VDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3Mjc6IFZhbGlkYXRlIFYyIGFnZW50IGZpZWxkcyBhdCB3cml0ZSB0aW1lLlxuICAgKlxuICAgKiBOb3JtYWxpemVzIHNuYWtlX2Nhc2Ug4oaSIGNhbWVsQ2FzZSAoc2FtZSBhcyBwYXJzZU1ldGFkYXRhKSBhbmQgdGhlbiB2YWxpZGF0ZXNcbiAgICogc3RydWN0dXJhbCBjb25zdHJhaW50cy4gVW5saWtlIHBhcnNlTWV0YWRhdGEgKHdoaWNoIHNpbGVudGx5IHN0cmlwcyBmb3JcbiAgICogYmFja3dhcmQgY29tcGF0KSwgdGhpcyByZXR1cm5zIGVycm9ycyBzbyB0aGUgY2FsbGVyIGNhbiByZWplY3QgdGhlIGNyZWF0ZS5cbiAgICpcbiAgICogTXV0YXRlcyB0aGUgbWV0YWRhdGEgaW4gcGxhY2UgKG5vcm1hbGl6YXRpb24pLCByZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVYyRmllbGRzRm9yQ3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gLS0tIHRvb2xzIC0tLVxuICAgIGlmIChtZXRhZGF0YS50b29scyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnRvb2xzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzKSB8fCBtZXRhZGF0YS50b29scyA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhbGxvd2VkL2RlbmllZCBhcnJheXMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5hbGxvd2VkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5hbGxvd2VkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEudG9vbHMuZGVuaWVkICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuZGVuaWVkKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCd0b29scy5kZW5pZWQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gc3lzdGVtUHJvbXB0IC0tLVxuICAgIGlmIChtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JzLnB1c2goJ3N5c3RlbVByb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIC8vIHNuYWtlX2Nhc2UgdmFyaWFudCAoSXNzdWUgIzcyNTogbm9ybWFsaXplZCBhdCBkaXNwYXRjaGVyIGxldmVsIGV2ZW50dWFsbHkpXG4gICAgY29uc3QgYW55TWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChhbnlNZXRhLnN5c3RlbV9wcm9tcHQgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBhbnlNZXRhLnN5c3RlbV9wcm9tcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9IGFueU1ldGEuc3lzdGVtX3Byb21wdCBhcyBzdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcnMucHVzaCgnc3lzdGVtX3Byb21wdCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBkZWxldGUgYW55TWV0YS5zeXN0ZW1fcHJvbXB0O1xuICAgIH1cblxuICAgIC8vIC0tLSBhdXRvbm9teSAtLS1cbiAgICBpZiAobWV0YWRhdGEuYXV0b25vbXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hdXRvbm9teSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hdXRvbm9teSkgfHwgbWV0YWRhdGEuYXV0b25vbXkgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCBhID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZUF1dG9ub215S2V5cyhhKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBhZnRlciBub3JtYWxpemF0aW9uXG4gICAgICAgIGlmIChhLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2YoYS5yaXNrVG9sZXJhbmNlLCBSSVNLX1RPTEVSQU5DRV9MRVZFTFMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYGF1dG9ub215LnJpc2tUb2xlcmFuY2UgbXVzdCBiZSBvbmUgb2Y6ICR7UklTS19UT0xFUkFOQ0VfTEVWRUxTLmpvaW4oJywgJyl9IChnb3QgJyR7YS5yaXNrVG9sZXJhbmNlfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGEubWF4QXV0b25vbW91c1N0ZXBzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5tYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJlcXVpcmVzQXBwcm92YWwgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLnJlcXVpcmVzQXBwcm92YWwpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215LnJlcXVpcmVzQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuYXV0b0FwcHJvdmUgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhLmF1dG9BcHByb3ZlKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5hdXRvQXBwcm92ZSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSByZXNpbGllbmNlIC0tLVxuICAgIGlmIChtZXRhZGF0YS5yZXNpbGllbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5yZXNpbGllbmNlKSB8fCBtZXRhZGF0YS5yZXNpbGllbmNlID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvblxuICAgICAgICBjb25zdCByID0gbWV0YWRhdGEucmVzaWxpZW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMocik7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgICAgICBpZiAoci5vblN0ZXBMaW1pdFJlYWNoZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vblN0ZXBMaW1pdFJlYWNoZWQsIFNURVBfTElNSVRfQUNUSU9OUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5vblN0ZXBMaW1pdFJlYWNoZWQgbXVzdCBiZSBvbmUgb2Y6ICR7U1RFUF9MSU1JVF9BQ1RJT05TLmpvaW4oJywgJyl9IChnb3QgJyR7ci5vblN0ZXBMaW1pdFJlYWNoZWR9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5vbkV4ZWN1dGlvbkZhaWx1cmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5vbkV4ZWN1dGlvbkZhaWx1cmUsIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2Uub25FeGVjdXRpb25GYWlsdXJlIG11c3QgYmUgb25lIG9mOiAke0VYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMuam9pbignLCAnKX0gKGdvdCAnJHtyLm9uRXhlY3V0aW9uRmFpbHVyZX0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhSZXRyaWVzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heFJldHJpZXMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heENvbnRpbnVhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5tYXhDb250aW51YXRpb25zICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLm1heENvbnRpbnVhdGlvbnMgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnJldHJ5QmFja29mZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLnJldHJ5QmFja29mZiwgQkFDS09GRl9TVFJBVEVHSUVTKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLnJldHJ5QmFja29mZiBtdXN0IGJlIG9uZSBvZjogJHtCQUNLT0ZGX1NUUkFURUdJRVMuam9pbignLCAnKX0gKGdvdCAnJHtyLnJldHJ5QmFja29mZn0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLnByZXNlcnZlU3RhdGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygci5wcmVzZXJ2ZVN0YXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5wcmVzZXJ2ZVN0YXRlIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gYWN0aXZhdGVzIC0tLVxuICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hY3RpdmF0ZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYWN0aXZhdGVzKSB8fCBtZXRhZGF0YS5hY3RpdmF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ2FjdGl2YXRlcyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIHNraWxscy9wZXJzb25hcy9tZW1vcmllcy90ZW1wbGF0ZXMvZW5zZW1ibGVzIGFycmF5cycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGdvYWwgaW5wdXQgdG8gVjIgZm9ybWF0LlxuICAgKiBMTE1zIG1heSBwYXNzIGdvYWwgYXMgYSBzaW1wbGUgc3RyaW5nIG9yIGFzIGEgVjIgY29uZmlnIG9iamVjdC5cbiAgICogVGhpcyBlbnN1cmVzIHdlIGFsd2F5cyBoYXZlIGEgcHJvcGVyIFYyIHN0cnVjdHVyZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGdvYWwgLSBFaXRoZXIgYSBzdHJpbmcgZ29hbCBvciBhIFYyIGdvYWwgY29uZmlnIG9iamVjdFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIFYyIGdvYWwgY29uZmlnLCBvciB1bmRlZmluZWQgaWYgbm8gZ29hbCBwcm92aWRlZFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVHb2FsSW5wdXQoZ29hbDogc3RyaW5nIHwgUGFydGlhbDxBZ2VudEdvYWxDb25maWc+IHwgdW5kZWZpbmVkKTogQWdlbnRHb2FsQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhIHN0cmluZywgY29udmVydCB0byBWMiBmb3JtYXRcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbnZlcnRpbmcgc3RyaW5nIGdvYWwgdG8gVjIgZm9ybWF0JywgeyBnb2FsIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcGxhdGU6IGdvYWwsXG4gICAgICAgIHBhcmFtZXRlcnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCB0ZW1wbGF0ZSwgbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBpZiAodHlwZW9mIGdvYWwgPT09ICdvYmplY3QnICYmICd0ZW1wbGF0ZScgaW4gZ29hbCAmJiB0eXBlb2YgZ29hbC50ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzbmFrZV9jYXNlIGdvYWwgc3ViLWZpZWxkcyBiZWZvcmUgYWNjZXNzaW5nXG4gICAgICBub3JtYWxpemVHb2FsS2V5cyhnb2FsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICBjb25zdCB2YWxpZFBhcmFtVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddIGFzIGNvbnN0O1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGFyYW1zOiBBZ2VudEdvYWxQYXJhbWV0ZXJbXSA9IChnb2FsLnBhcmFtZXRlcnMgfHwgW10pLm1hcCgocCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBwLm5hbWUgPT09ICdzdHJpbmcnID8gcC5uYW1lIDogYHBhcmFtXyR7aW5kZXh9YDtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkUGFyYW1UeXBlcy5pbmNsdWRlcyhwLnR5cGUgYXMgdHlwZW9mIHZhbGlkUGFyYW1UeXBlc1tudW1iZXJdKVxuICAgICAgICAgID8gcC50eXBlIGFzICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbidcbiAgICAgICAgICA6ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IHR5cGVvZiBwLnJlcXVpcmVkID09PSAnYm9vbGVhbicgPyBwLnJlcXVpcmVkIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVkOiBBZ2VudEdvYWxQYXJhbWV0ZXIgPSB7IG5hbWUsIHR5cGUsIHJlcXVpcmVkIH07XG4gICAgICAgIGlmICh0eXBlb2YgcC5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgJiYgcC5kZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFsaWRhdGVkLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChwLmRlc2NyaXB0aW9uLCA1MDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFNhbml0aXplIHN0cmluZyBkZWZhdWx0cyB0byBwcmV2ZW50IGluamVjdGlvbiB3aGVuIHVzZWQgaW4gZ29hbCByZW5kZXJpbmdcbiAgICAgICAgICBpZiAodHlwZW9mIHAuZGVmYXVsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlZC5kZWZhdWx0ID0gc2FuaXRpemVJbnB1dChwLmRlZmF1bHQsIDUwMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkYXRlZC5kZWZhdWx0ID0gcC5kZWZhdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRhdGVkO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRlbXBsYXRlOiBnb2FsLnRlbXBsYXRlLFxuICAgICAgICBwYXJhbWV0ZXJzOiB2YWxpZGF0ZWRQYXJhbXMsXG4gICAgICAgIHN1Y2Nlc3NDcml0ZXJpYTogZ29hbC5zdWNjZXNzQ3JpdGVyaWFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gT2JqZWN0IHdpdGhvdXQgdGVtcGxhdGUgLSBjYW5ub3QgY29udmVydFxuICAgIGxvZ2dlci53YXJuKCdHb2FsIG9iamVjdCBtaXNzaW5nIHRlbXBsYXRlIGZpZWxkLCBjYW5ub3QgY29udmVydCB0byBWMicsIHsgZ29hbCB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUFnZW50RmlsZShjb250ZW50OiBzdHJpbmcpOiBQYXJzZWRBZ2VudEZpbGUge1xuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgcGFyc2luZ1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihjb250ZW50LCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIucGFyc2VBZ2VudEZpbGUnXG4gICAgfSk7XG5cbiAgICAvLyBTZXJpYWxpemF0aW9uU2VydmljZSBlbnN1cmVzIGZyb250bWF0dGVyIGV4aXN0cywgb3IgdGhyb3dzIGVycm9yXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiByZXN1bHQuZGF0YSBhcyBBZ2VudE1ldGFkYXRhLFxuICAgICAgY29udGVudDogcmVzdWx0LmNvbnRlbnQudHJpbSgpXG4gICAgfTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZW5hbWUgZm9yIGFuIGFnZW50IGVsZW1lbnQuXG4gICAqXG4gICAqIFVzZXMgaW5oZXJpdGVkIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZnJvbSBCYXNlRWxlbWVudE1hbmFnZXIgZm9yIGNvbnNpc3RlbnRcbiAgICogZmlsZW5hbWUgZm9ybWF0dGluZyBhY3Jvc3MgYWxsIGVsZW1lbnQgbWFuYWdlcnMuXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKiAgIFwiQ3JlYXRpdmUgV3JpdGVyXCIgLT4gXCJjcmVhdGl2ZS13cml0ZXIubWRcIlxuICAgKiAgIFwiQ1JVRFYtQWdlbnQtRGVsdGFcIiAtPiBcImNydWR2LWFnZW50LWRlbHRhLm1kXCJcbiAgICogICBcIk11bHRpX0dvYWxfQWdlbnRcIiAtPiBcIm11bHRpLWdvYWwtYWdlbnQubWRcIlxuICAgKiAgIFwiQ2FtZWxDYXNlTmFtZVwiIC0+IFwiY2FtZWwtY2FzZS1uYW1lLm1kXCJcbiAgICovXG4gIHByaXZhdGUgZ2V0RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgaW5oZXJpdGVkIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZm9yIHVuaWZpZWQgbm9ybWFsaXphdGlvblxuICAgIHJldHVybiB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVFbGVtZW50TmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15bYS16QS1aMC05Xy1dKyQvLnRlc3QobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBmb3IgYXR0cmlidXRpb25cbiAgICogUkVGQUNUT1JFRDogRGVsZWdhdGVzIHRvIE1ldGFkYXRhU2VydmljZSBmb3IgY29uc2lzdGVudCB1c2VyIGF0dHJpYnV0aW9uIGFjcm9zcyBhbGwgbWFuYWdlcnNcbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhU2VydmljZS5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlU3RhdGVGb3JTZXJpYWxpemF0aW9uKHN0YXRlOiBBZ2VudFN0YXRlKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUgaW5zdGFuY2VvZiBEYXRlID8gc3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpIDogc3RhdGUubGFzdEFjdGl2ZSxcbiAgICAgIHNlc3Npb25Db3VudDogU3RyaW5nKHN0YXRlLnNlc3Npb25Db3VudCA/PyAwKSxcbiAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoc3RhdGUuc3RhdGVWZXJzaW9uKSA6ICcxJywgIC8vIEluY2x1ZGUgdmVyc2lvbiBmb3Igb3B0aW1pc3RpYyBsb2NraW5nXG4gICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGdvYWwgPT4gKHtcbiAgICAgICAgLi4uZ29hbCxcbiAgICAgICAgY3JlYXRlZEF0OiBnb2FsLmNyZWF0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLmNyZWF0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC5jcmVhdGVkQXQsXG4gICAgICAgIHVwZGF0ZWRBdDogZ29hbC51cGRhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC51cGRhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwudXBkYXRlZEF0LFxuICAgICAgICBjb21wbGV0ZWRBdDogZ29hbC5jb21wbGV0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLmNvbXBsZXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLmNvbXBsZXRlZEF0LFxuICAgICAgICBpbXBvcnRhbmNlOiBnb2FsLmltcG9ydGFuY2UgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLmltcG9ydGFuY2UpIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmdlbmN5OiBnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLnVyZ2VuY3kpIDogdW5kZWZpbmVkLFxuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGdvYWwuZXN0aW1hdGVkRWZmb3J0ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5lc3RpbWF0ZWRFZmZvcnQpIDogdW5kZWZpbmVkXG4gICAgICB9KSksXG4gICAgICBkZWNpc2lvbnM6IHN0YXRlLmRlY2lzaW9ucy5tYXAoZGVjaXNpb24gPT4gKHtcbiAgICAgICAgLi4uZGVjaXNpb24sXG4gICAgICAgIHRpbWVzdGFtcDogZGVjaXNpb24udGltZXN0YW1wIGluc3RhbmNlb2YgRGF0ZSA/IGRlY2lzaW9uLnRpbWVzdGFtcC50b0lTT1N0cmluZygpIDogZGVjaXNpb24udGltZXN0YW1wLFxuICAgICAgICBjb25maWRlbmNlOiBkZWNpc2lvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkgOiB1bmRlZmluZWRcbiAgICAgIH0pKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUxvYWRlZFN0YXRlKHN0YXRlOiBBZ2VudFN0YXRlKTogdm9pZCB7XG4gICAgLy8gRklYIChJc3N1ZSAjMTIzKTogRGVmYXVsdCBtaXNzaW5nIGFycmF5cyB0byBwcmV2ZW50IFR5cGVFcnJvclxuICAgIC8vIElmIHN0YXRlIGZpbGUgaXMgbWlzc2luZyBnb2Fscy9kZWNpc2lvbnMvY29udGV4dCwgZGVmYXVsdCB0byBlbXB0eSBhcnJheXMvb2JqZWN0c1xuICAgIGlmICghc3RhdGUuZ29hbHMpIHtcbiAgICAgIHN0YXRlLmdvYWxzID0gW107XG4gICAgfVxuICAgIGlmICghc3RhdGUuZGVjaXNpb25zKSB7XG4gICAgICBzdGF0ZS5kZWNpc2lvbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5jb250ZXh0KSB7XG4gICAgICBzdGF0ZS5jb250ZXh0ID0ge307XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnNlc3Npb25Db3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGF0ZS5zZXNzaW9uQ291bnQgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHN0YXRlLnNlc3Npb25Db3VudCksIDEwKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBzdGF0ZVZlcnNpb24gZm9yIG9wdGltaXN0aWMgbG9ja2luZyAoSXNzdWUgIzI0KVxuICAgIGlmIChzdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhzdGF0ZS5zdGF0ZVZlcnNpb24pLCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmVyc2lvbiAxIGlmIG5vdCBwcmVzZW50IChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxhc3RBY3RpdmUpIHtcbiAgICAgIHN0YXRlLmxhc3RBY3RpdmUgPSBuZXcgRGF0ZShzdGF0ZS5sYXN0QWN0aXZlKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZ29hbHMpIHtcbiAgICAgIHN0YXRlLmdvYWxzLmZvckVhY2goZ29hbCA9PiB7XG4gICAgICAgIGlmIChnb2FsLmltcG9ydGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwuaW1wb3J0YW5jZSA9IE51bWJlci5wYXJzZUludChTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwudXJnZW5jeSA9IE51bWJlci5wYXJzZUludChTdHJpbmcoZ29hbC51cmdlbmN5KSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLmVzdGltYXRlZEVmZm9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ29hbC5lc3RpbWF0ZWRFZmZvcnQgPSBOdW1iZXIucGFyc2VGbG9hdChTdHJpbmcoZ29hbC5lc3RpbWF0ZWRFZmZvcnQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5jcmVhdGVkQXQpIHtcbiAgICAgICAgICBnb2FsLmNyZWF0ZWRBdCA9IG5ldyBEYXRlKGdvYWwuY3JlYXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC51cGRhdGVkQXQpIHtcbiAgICAgICAgICBnb2FsLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKGdvYWwudXBkYXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgIGdvYWwuY29tcGxldGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNvbXBsZXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmRlY2lzaW9ucykge1xuICAgICAgc3RhdGUuZGVjaXNpb25zLmZvckVhY2goZGVjaXNpb24gPT4ge1xuICAgICAgICBpZiAoZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGVjaXNpb24uY29uZmlkZW5jZSA9IE51bWJlci5wYXJzZUZsb2F0KFN0cmluZyhkZWNpc2lvbi5jb25maWRlbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlY2lzaW9uLnRpbWVzdGFtcCkge1xuICAgICAgICAgIGRlY2lzaW9uLnRpbWVzdGFtcCA9IG5ldyBEYXRlKGRlY2lzaW9uLnRpbWVzdGFtcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBzdGVwIGluIGFnZW50IGV4ZWN1dGlvblxuICAgKiBXcmFwcyBBZ2VudC5yZWNvcmREZWNpc2lvbigpIGZvciB0aGUgTUNQIHRvb2wgaW50ZXJmYWNlXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIHJlY29yZEFnZW50U3RlcChwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBzdGVwRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgLyoqIE9wdGlvbmFsIGZpbmRpbmdzIG9yIHJlc3VsdHMgZnJvbSB0aGlzIHN0ZXAgKi9cbiAgICBmaW5kaW5ncz86IHN0cmluZztcbiAgICBjb25maWRlbmNlPzogbnVtYmVyO1xuICAgIC8qKiBPcHRpb25hbCBoaW50IGFib3V0IHdoYXQgdGhlIExMTSBwbGFucyB0byBkbyBuZXh0IChmb3IgcHJvYWN0aXZlIHJpc2sgZXZhbHVhdGlvbikgKi9cbiAgICBuZXh0QWN0aW9uSGludD86IHN0cmluZztcbiAgICAvKiogT3B0aW9uYWwgcmlzayBzY29yZSBmb3IgdGhlIGN1cnJlbnQgc3RlcCAoMC0xMDApICovXG4gICAgcmlza1Njb3JlPzogbnVtYmVyO1xuICAgIC8qKiBSdW50aW1lIG92ZXJyaWRlIGZvciBtYXhBdXRvbm9tb3VzU3RlcHMgKElzc3VlICM0NDcpICovXG4gICAgbWF4U3RlcHNPdmVycmlkZT86IG51bWJlcjtcbiAgfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGRlY2lzaW9uOiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZ29hbElkOiBzdHJpbmc7XG4gICAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgIGZyYW1ld29yazogc3RyaW5nO1xuICAgICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIH07XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxDb3VudDogbnVtYmVyO1xuICAgICAgZGVjaXNpb25Db3VudDogbnVtYmVyO1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICAvKiogQXV0b25vbXkgZGlyZWN0aXZlIGluZGljYXRpbmcgd2hldGhlciB0byBjb250aW51ZSBvciBwYXVzZSAqL1xuICAgIGF1dG9ub215OiBBdXRvbm9teURpcmVjdGl2ZTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGFnZW50IHN0YXRlIHRvIGZpbmQgYWN0aXZlIGdvYWxzXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGFjdGl2ZUdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpO1xuXG4gICAgaWYgKCFhY3RpdmVHb2FsKSB7XG4gICAgICBjb25zdCBnb2FsU3RhdHVzZXMgPSBzdGF0ZS5nb2Fscy5tYXAoZyA9PiBgJHtnLmlkfTogJHtnLnN0YXR1c31gKS5qb2luKCcsICcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm8gYWN0aXZlIGdvYWwgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9Jy4gYCArXG4gICAgICAgIGBBdmFpbGFibGUgZ29hbHM6ICR7Z29hbFN0YXR1c2VzIHx8ICdub25lJ30uIGAgK1xuICAgICAgICBgVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZ29hbCBmaXJzdC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIENhbGwgQWdlbnQucmVjb3JkRGVjaXNpb24oKSB0byBwZXJzaXN0IHRoZSBzdGVwXG4gICAgY29uc3QgZGVjaXNpb24gPSBhZ2VudC5yZWNvcmREZWNpc2lvbih7XG4gICAgICBnb2FsSWQ6IGFjdGl2ZUdvYWwuaWQsXG4gICAgICBkZWNpc2lvbjogcGFyYW1zLnN0ZXBEZXNjcmlwdGlvbixcbiAgICAgIHJlYXNvbmluZzogcGFyYW1zLmZpbmRpbmdzID8/ICcnLFxuICAgICAgY29uZmlkZW5jZTogcGFyYW1zLmNvbmZpZGVuY2UgPz8gMC44LFxuICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICB9KTtcblxuICAgIC8vIDQuIFNhdmUgYWdlbnQgc3RhdGVcbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChwYXJhbXMuYWdlbnROYW1lLCAxMDApO1xuICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKSk7XG5cbiAgICAvLyA1LiBHZXQgdXBkYXRlZCBzdGF0ZSBmb3Igc3RlcCBjb3VudCBhbmQgYXV0b25vbXkgZXZhbHVhdGlvblxuICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG5cbiAgICAvLyA2LiBDYWxjdWxhdGUgc3RlcCBjb3VudCBmb3IgdGhpcyBnb2FsXG4gICAgLy8gc3RlcENvdW50ID0gbnVtYmVyIG9mIHN0ZXBzIGNvbXBsZXRlZCAoaW5jbHVkaW5nIHRoZSBvbmUganVzdCByZWNvcmRlZClcbiAgICAvLyBUaGUgZXZhbHVhdG9yIHVzZXMgdGhpcyB0byBjaGVjayBpZiB3ZSd2ZSBoaXQgbWF4QXV0b25vbW91c1N0ZXBzXG4gICAgLy8gYW5kIHRvIGNvbXB1dGUgc3RlcHNSZW1haW5pbmcgZm9yIHRoZSBhdXRvbm9teSBkaXJlY3RpdmUuXG4gICAgY29uc3QgZ29hbERlY2lzaW9ucyA9IHVwZGF0ZWRTdGF0ZS5kZWNpc2lvbnMuZmlsdGVyKGQgPT4gZC5nb2FsSWQgPT09IGFjdGl2ZUdvYWwuaWQpO1xuICAgIGNvbnN0IHN0ZXBDb3VudCA9IGdvYWxEZWNpc2lvbnMubGVuZ3RoO1xuXG4gICAgLy8gNy4gR2V0IGFnZW50IG1ldGFkYXRhIGZvciBhdXRvbm9teSBjb25maWdcbiAgICBjb25zdCBhZ2VudE1ldGFkYXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgLy8gOC4gRXZhbHVhdGUgYXV0b25vbXkgLSBzaG91bGQgd2UgY29udGludWUgb3IgcGF1c2U/XG4gICAgLy8gSXNzdWUgIzQwMjogUGFzcyBESS1pbmplY3RlZCBEYW5nZXJab25lRW5mb3JjZXIgdmlhIGNvbnRleHRcbiAgICAvLyBJc3N1ZSAjNDQ3OiBBcHBseSBydW50aW1lIG1heEF1dG9ub21vdXNTdGVwcyBvdmVycmlkZSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IGF1dG9ub215Q29uZmlnID0gcGFyYW1zLm1heFN0ZXBzT3ZlcnJpZGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IC4uLmFnZW50TWV0YWRhdGEuYXV0b25vbXksIG1heEF1dG9ub21vdXNTdGVwczogcGFyYW1zLm1heFN0ZXBzT3ZlcnJpZGUgfVxuICAgICAgOiBhZ2VudE1ldGFkYXRhLmF1dG9ub215O1xuXG4gICAgY29uc3QgYXV0b25vbXlEaXJlY3RpdmUgPSBldmFsdWF0ZUF1dG9ub215KHtcbiAgICAgIGFnZW50TmFtZTogcGFyYW1zLmFnZW50TmFtZSxcbiAgICAgIGF1dG9ub215Q29uZmlnLFxuICAgICAgc3RlcENvdW50LFxuICAgICAgY3VycmVudFN0ZXBEZXNjcmlwdGlvbjogcGFyYW1zLnN0ZXBEZXNjcmlwdGlvbixcbiAgICAgIGN1cnJlbnRTdGVwT3V0Y29tZTogcGFyYW1zLm91dGNvbWUsXG4gICAgICBuZXh0QWN0aW9uSGludDogcGFyYW1zLm5leHRBY3Rpb25IaW50LFxuICAgICAgcmlza1Njb3JlOiBwYXJhbXMucmlza1Njb3JlLFxuICAgICAgZGFuZ2VyWm9uZUVuZm9yY2VyOiBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXI/LigpLFxuICAgICAgdmVyaWZpY2F0aW9uU3RvcmU6IEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyPy4oKSxcbiAgICAgIGdvYWxEZXNjcmlwdGlvbjogYWN0aXZlR29hbC5kZXNjcmlwdGlvbixcbiAgICAgIGdvYWxJZDogYWN0aXZlR29hbC5pZCxcbiAgICB9KTtcblxuICAgIC8vIDkuIFJldHVybiBkZWNpc2lvbiwgc3RhdGUgc3VtbWFyeSwgYW5kIGF1dG9ub215IGRpcmVjdGl2ZVxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZTogYFN0ZXAgcmVjb3JkZWQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9J2AsXG4gICAgICBkZWNpc2lvbjoge1xuICAgICAgICBpZDogZGVjaXNpb24uaWQsXG4gICAgICAgIGdvYWxJZDogZGVjaXNpb24uZ29hbElkLFxuICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICBkZWNpc2lvbjogZGVjaXNpb24uZGVjaXNpb24sXG4gICAgICAgIHJlYXNvbmluZzogZGVjaXNpb24ucmVhc29uaW5nLFxuICAgICAgICBmcmFtZXdvcms6IGRlY2lzaW9uLmZyYW1ld29yayxcbiAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSxcbiAgICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICAgIH0sXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2FsQ291bnQ6IHVwZGF0ZWRTdGF0ZS5nb2Fscy5sZW5ndGgsXG4gICAgICAgIGRlY2lzaW9uQ291bnQ6IHVwZGF0ZWRTdGF0ZS5kZWNpc2lvbnMubGVuZ3RoLFxuICAgICAgICBsYXN0QWN0aXZlOiB1cGRhdGVkU3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHVwZGF0ZWRTdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfSxcbiAgICAgIGF1dG9ub215OiBhdXRvbm9teURpcmVjdGl2ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGUgYW4gYWdlbnQgZ29hbFxuICAgKiBXcmFwcyBBZ2VudC5jb21wbGV0ZUdvYWwoKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBjb21wbGV0ZUFnZW50R29hbChwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBnb2FsSWQ/OiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIHN1bW1hcnk6IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGdvYWw6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIjtcbiAgICAgIGNyZWF0ZWRBdDogc3RyaW5nO1xuICAgICAgY29tcGxldGVkQXQ6IHN0cmluZztcbiAgICAgIGVzdGltYXRlZEVmZm9ydD86IG51bWJlcjtcbiAgICAgIGFjdHVhbEVmZm9ydD86IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldHJpY3M6IHtcbiAgICAgIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gICAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgICAgZ29hbHNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkFjY3VyYWN5OiBudW1iZXI7XG4gICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsQ291bnQ6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEZpbmQgZ29hbCB0byBjb21wbGV0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBsZXQgZ29hbDogQWdlbnRHb2FsIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHBhcmFtcy5nb2FsSWQpIHtcbiAgICAgIGdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gcGFyYW1zLmdvYWxJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgbW9zdCByZWNlbnQgaW4tcHJvZ3Jlc3MgZ29hbFxuICAgICAgZ29hbCA9IHN0YXRlLmdvYWxzXG4gICAgICAgIC5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJylcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY3JlYXRlZEF0LmdldFRpbWUoKSAtIGEuY3JlYXRlZEF0LmdldFRpbWUoKSlbMF07XG4gICAgfVxuXG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHBhcmFtcy5nb2FsSWRcbiAgICAgICAgICA/IGBHb2FsICcke3BhcmFtcy5nb2FsSWR9JyBub3QgZm91bmRgXG4gICAgICAgICAgOiBgTm8gaW4tcHJvZ3Jlc3MgZ29hbCBmb3VuZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWNvcmQgZmluYWwgZGVjaXNpb24gd2l0aCBzdW1tYXJ5XG4gICAgYWdlbnQucmVjb3JkRGVjaXNpb24oe1xuICAgICAgZ29hbElkOiBnb2FsLmlkLFxuICAgICAgZGVjaXNpb246ICdnb2FsX2NvbXBsZXRlJyxcbiAgICAgIHJlYXNvbmluZzogcGFyYW1zLnN1bW1hcnksXG4gICAgICBjb25maWRlbmNlOiAxLjAsXG4gICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZVxuICAgIH0pO1xuXG4gICAgLy8gNC4gQ2FsbCBBZ2VudC5jb21wbGV0ZUdvYWwoKVxuICAgIGFnZW50LmNvbXBsZXRlR29hbChnb2FsLmlkLCBwYXJhbXMub3V0Y29tZSk7XG5cbiAgICAvLyA1LiBHZXQgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgIGNvbnN0IG1ldHJpY3MgPSBhZ2VudC5nZXRQZXJmb3JtYW5jZU1ldHJpY3MoKTtcblxuICAgIC8vIDYuIFNhdmUgYWdlbnQgc3RhdGVcbiAgICBjb25zdCBjb21wbGV0ZVNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KHBhcmFtcy5hZ2VudE5hbWUsIDEwMCk7XG4gICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKGNvbXBsZXRlU2FuaXRpemVkTmFtZSkpO1xuXG4gICAgLy8gNy4gUmV0dXJuIGdvYWwsIG1ldHJpY3MsIGFuZCBzdGF0ZVxuICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29tcGxldGVkR29hbCA9IHVwZGF0ZWRTdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gZ29hbC5pZCkhO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgR29hbCBjb21wbGV0ZWQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9JyB3aXRoIG91dGNvbWU6ICR7cGFyYW1zLm91dGNvbWV9YCxcbiAgICAgIGdvYWw6IHtcbiAgICAgICAgaWQ6IGNvbXBsZXRlZEdvYWwuaWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBjb21wbGV0ZWRHb2FsLmRlc2NyaXB0aW9uLFxuICAgICAgICBzdGF0dXM6IGNvbXBsZXRlZEdvYWwuc3RhdHVzIGFzIFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiLFxuICAgICAgICBjcmVhdGVkQXQ6IGNvbXBsZXRlZEdvYWwuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNvbXBsZXRlZEF0OiBjb21wbGV0ZWRHb2FsLmNvbXBsZXRlZEF0IS50b0lTT1N0cmluZygpLFxuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGNvbXBsZXRlZEdvYWwuZXN0aW1hdGVkRWZmb3J0LFxuICAgICAgICBhY3R1YWxFZmZvcnQ6IGNvbXBsZXRlZEdvYWwuYWN0dWFsRWZmb3J0XG4gICAgICB9LFxuICAgICAgbWV0cmljczoge1xuICAgICAgICBzdWNjZXNzUmF0ZTogbWV0cmljcy5zdWNjZXNzUmF0ZSxcbiAgICAgICAgZ29hbHNDb21wbGV0ZWQ6IG1ldHJpY3MuZ29hbHNDb21wbGV0ZWQsXG4gICAgICAgIGdvYWxzSW5Qcm9ncmVzczogbWV0cmljcy5nb2Fsc0luUHJvZ3Jlc3MsXG4gICAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG1ldHJpY3MuZGVjaXNpb25BY2N1cmFjeSxcbiAgICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBtZXRyaWNzLmF2ZXJhZ2VDb21wbGV0aW9uVGltZVxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGdvYWxDb3VudDogdXBkYXRlZFN0YXRlLmdvYWxzLmxlbmd0aCxcbiAgICAgICAgZGVjaXNpb25Db3VudDogdXBkYXRlZFN0YXRlLmRlY2lzaW9ucy5sZW5ndGgsXG4gICAgICAgIGxhc3RBY3RpdmU6IHVwZGF0ZWRTdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogdXBkYXRlZFN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWdlbnQgc3RhdGVcbiAgICogV3JhcHMgQWdlbnQuZ2V0U3RhdGUoKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBnZXRBZ2VudFN0YXRlKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVDb250ZXh0PzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHByaW9yaXR5OiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgICBpbXBvcnRhbmNlOiBudW1iZXI7XG4gICAgICAgIHVyZ2VuY3k6IG51bWJlcjtcbiAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50Pzogc3RyaW5nO1xuICAgICAgICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgICAgICAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gICAgICAgIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICAgICAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgcmlza0xldmVsPzogc3RyaW5nO1xuICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ/OiBudW1iZXI7XG4gICAgICAgIGFjdHVhbEVmZm9ydD86IG51bWJlcjtcbiAgICAgICAgbm90ZXM/OiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIGRlY2lzaW9uczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBnb2FsSWQ6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICAgICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgICAgICBvdXRjb21lPzogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGNvbnRleHRTdW1tYXJ5OiB7XG4gICAgICAgIGtleXM6IHN0cmluZ1tdO1xuICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc2Vzc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldHJpY3M6IHtcbiAgICAgIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gICAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgICAgZ29hbHNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkFjY3VyYWN5OiBudW1iZXI7XG4gICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBHZXQgYWdlbnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG5cbiAgICAvLyAzLiBHZXQgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgIGNvbnN0IG1ldHJpY3MgPSBhZ2VudC5nZXRQZXJmb3JtYW5jZU1ldHJpY3MoKTtcblxuICAgIC8vIDQuIEZpbHRlciBkZWNpc2lvbnMgYmFzZWQgb24gaW5jbHVkZURlY2lzaW9uSGlzdG9yeVxuICAgIGNvbnN0IGRlY2lzaW9ucyA9IHBhcmFtcy5pbmNsdWRlRGVjaXNpb25IaXN0b3J5XG4gICAgICA/IHN0YXRlLmRlY2lzaW9uc1xuICAgICAgOiBzdGF0ZS5kZWNpc2lvbnMuc2xpY2UoLTEwKTsgLy8gTGFzdCAxMCBkZWNpc2lvbnNcblxuICAgIC8vIDUuIEJ1aWxkIGNvbnRleHQgc3VtbWFyeVxuICAgIGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoc3RhdGUuY29udGV4dCk7XG4gICAgY29uc3QgY29udGV4dFNpemUgPSBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb250ZXh0KS5sZW5ndGg7XG5cbiAgICAvLyA2LiBSZXR1cm4gc3RhdGUgYW5kIG1ldHJpY3NcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFnZW50TmFtZTogcGFyYW1zLmFnZW50TmFtZSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGdvYWxzOiBzdGF0ZS5nb2Fscy5tYXAoZyA9PiAoe1xuICAgICAgICAgIGlkOiBnLmlkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByaW9yaXR5OiBnLnByaW9yaXR5LFxuICAgICAgICAgIHN0YXR1czogZy5zdGF0dXMsXG4gICAgICAgICAgaW1wb3J0YW5jZTogZy5pbXBvcnRhbmNlLFxuICAgICAgICAgIHVyZ2VuY3k6IGcudXJnZW5jeSxcbiAgICAgICAgICBlaXNlbmhvd2VyUXVhZHJhbnQ6IGcuZWlzZW5ob3dlclF1YWRyYW50LFxuICAgICAgICAgIGNyZWF0ZWRBdDogZy5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IGcudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgY29tcGxldGVkQXQ6IGcuY29tcGxldGVkQXQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgZGVwZW5kZW5jaWVzOiBnLmRlcGVuZGVuY2llcyxcbiAgICAgICAgICByaXNrTGV2ZWw6IGcucmlza0xldmVsLFxuICAgICAgICAgIGVzdGltYXRlZEVmZm9ydDogZy5lc3RpbWF0ZWRFZmZvcnQsXG4gICAgICAgICAgYWN0dWFsRWZmb3J0OiBnLmFjdHVhbEVmZm9ydCxcbiAgICAgICAgICBub3RlczogZy5ub3Rlc1xuICAgICAgICB9KSksXG4gICAgICAgIGRlY2lzaW9uczogZGVjaXNpb25zLm1hcChkID0+ICh7XG4gICAgICAgICAgaWQ6IGQuaWQsXG4gICAgICAgICAgZ29hbElkOiBkLmdvYWxJZCxcbiAgICAgICAgICB0aW1lc3RhbXA6IGQudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgZGVjaXNpb246IGQuZGVjaXNpb24sXG4gICAgICAgICAgcmVhc29uaW5nOiBkLnJlYXNvbmluZyxcbiAgICAgICAgICBmcmFtZXdvcms6IGQuZnJhbWV3b3JrLFxuICAgICAgICAgIGNvbmZpZGVuY2U6IGQuY29uZmlkZW5jZSxcbiAgICAgICAgICBvdXRjb21lOiBkLm91dGNvbWVcbiAgICAgICAgfSkpLFxuICAgICAgICBjb250ZXh0OiBwYXJhbXMuaW5jbHVkZUNvbnRleHQgPyBzdGF0ZS5jb250ZXh0IDogdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0U3VtbWFyeToge1xuICAgICAgICAgIGtleXM6IGNvbnRleHRLZXlzLFxuICAgICAgICAgIHNpemU6IGNvbnRleHRTaXplXG4gICAgICAgIH0sXG4gICAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc2Vzc2lvbkNvdW50OiBzdGF0ZS5zZXNzaW9uQ291bnQsXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIHN1Y2Nlc3NSYXRlOiBtZXRyaWNzLnN1Y2Nlc3NSYXRlLFxuICAgICAgICBnb2Fsc0NvbXBsZXRlZDogbWV0cmljcy5nb2Fsc0NvbXBsZXRlZCxcbiAgICAgICAgZ29hbHNJblByb2dyZXNzOiBtZXRyaWNzLmdvYWxzSW5Qcm9ncmVzcyxcbiAgICAgICAgZGVjaXNpb25BY2N1cmFjeTogbWV0cmljcy5kZWNpc2lvbkFjY3VyYWN5LFxuICAgICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG1ldHJpY3MuYXZlcmFnZUNvbXBsZXRpb25UaW1lXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZ2F0aGVyZWQgZGF0YSBmb3IgYSBzcGVjaWZpYyBnb2FsIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQWdncmVnYXRlcyBkZWNpc2lvbiBoaXN0b3J5LCBnb2FsIHN0YXRlLCBhbmQgc3VtbWFyeSBzdGF0aXN0aWNzXG4gICAqIGludG8gYSBzdHJ1Y3R1cmVkIEdhdGhlcmVkRGF0YSBvYmplY3QuIFRoaXMgaXMgYSByZWFkLXNpZGUgdmlld1xuICAgKiBvdmVyIGV4aXN0aW5nIGFnZW50IHN0YXRlIGRhdGEuXG4gICAqXG4gICAqIElzc3VlICM2ODogR2F0aGVyZWREYXRhRW50cnkgZm9yIHN0YXRlIHJlY29yZGluZ1xuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIENvbXBsZXRpb24gKEVwaWMgIzM4MClcbiAgICovXG4gIGFzeW5jIGdldEdhdGhlcmVkRGF0YShwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBnb2FsSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8R2F0aGVyZWREYXRhPiB7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBnYXRoZXJlZCA9IGdldEdhdGhlcmVkRGF0YShwYXJhbXMuYWdlbnROYW1lLCBwYXJhbXMuZ29hbElkLCBzdGF0ZSk7XG5cbiAgICBpZiAoIWdhdGhlcmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBHb2FsICcke3BhcmFtcy5nb2FsSWR9JyBub3QgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9Jy4gYCArXG4gICAgICAgIGBBdmFpbGFibGUgZ29hbHM6ICR7c3RhdGUuZ29hbHMubWFwKGcgPT4gZy5pZCkuam9pbignLCAnKSB8fCAnbm9uZSd9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0aGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udGludWUgYWdlbnQgZXhlY3V0aW9uIGZyb20gcHJldmlvdXMgc3RhdGVcbiAgICogQ29tYmluZXMgZXhlY3V0ZUFnZW50IHdpdGggc3RhdGUgY29udGV4dFxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyBjb250aW51ZUFnZW50RXhlY3V0aW9uKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdCAmIHtcbiAgICBwcmV2aW91c1N0YXRlOiB7XG4gICAgICBnb2FsczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgICB9PjtcbiAgICAgIHJlY2VudERlY2lzaW9uczogQXJyYXk8e1xuICAgICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgICAgb3V0Y29tZT86IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHNlc3Npb25Db3VudDogbnVtYmVyO1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBjb250aW51YXRpb246IHtcbiAgICAgIGlzUmVzdW1pbmc6IGJvb2xlYW47XG4gICAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gICAgICBzdWdnZXN0ZWROZXh0U3RlcHM/OiBzdHJpbmdbXTtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBHZXQgY3VycmVudCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcblxuICAgIC8vIDMuIENoZWNrIGlmIGFnZW50IGhhcyBiZWVuIGV4ZWN1dGVkIGJlZm9yZVxuICAgIGNvbnN0IGlzUmVzdW1pbmcgPSBzdGF0ZS5zZXNzaW9uQ291bnQgPiAwIHx8IHN0YXRlLmRlY2lzaW9ucy5sZW5ndGggPiAwO1xuXG4gICAgLy8gNC4gRXhlY3V0ZSBhZ2VudCBub3JtYWxseSAodGhpcyBhY3RpdmF0ZXMgZWxlbWVudHMgYW5kIGdldHMgY29udGV4dClcbiAgICBjb25zdCBleGVjdXRpb25QYXJhbXMgPSBwYXJhbXMucGFyYW1ldGVycyB8fCB7fTtcblxuICAgIGNvbnN0IGV4ZWN1dGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUFnZW50KFxuICAgICAgcGFyYW1zLmFnZW50TmFtZSxcbiAgICAgIGV4ZWN1dGlvblBhcmFtc1xuICAgICk7XG5cbiAgICAvLyA1LiBCdWlsZCBwcmV2aW91cyBzdGF0ZSBzdW1tYXJ5XG4gICAgY29uc3QgcmVjZW50RGVjaXNpb25zID0gc3RhdGUuZGVjaXNpb25zLnNsaWNlKC01KS5tYXAoZCA9PiAoe1xuICAgICAgZGVjaXNpb246IGQuZGVjaXNpb24sXG4gICAgICByZWFzb25pbmc6IGQucmVhc29uaW5nLFxuICAgICAgb3V0Y29tZTogZC5vdXRjb21lLFxuICAgICAgdGltZXN0YW1wOiBkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZ29hbFN1bW1hcnkgPSBzdGF0ZS5nb2Fscy5tYXAoZyA9PiAoe1xuICAgICAgaWQ6IGcuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbixcbiAgICAgIHN0YXR1czogZy5zdGF0dXMsXG4gICAgICBwcm9ncmVzczogdW5kZWZpbmVkIC8vIENvdWxkIGFkZCBwcm9ncmVzcyB0cmFja2luZyBpbiBmdXR1cmVcbiAgICB9KSk7XG5cbiAgICAvLyA2LiBHZW5lcmF0ZSBzdWdnZXN0ZWQgbmV4dCBzdGVwcyBiYXNlZCBvbiBzdGF0ZVxuICAgIGNvbnN0IHN1Z2dlc3RlZE5leHRTdGVwcyA9IHRoaXMuZ2VuZXJhdGVOZXh0U3RlcHMoc3RhdGUpO1xuXG4gICAgLy8gNy4gTWVyZ2UgZXhlY3V0aW9uIHJlc3VsdCB3aXRoIGNvbnRpbnVhdGlvbiBjb250ZXh0XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEluY2x1ZGUgYWxsIGZpZWxkcyBmcm9tIGV4ZWN1dGVfYWdlbnQgcmVzdWx0XG4gICAgICAuLi5leGVjdXRpb25SZXN1bHQsXG5cbiAgICAgIC8vIEFkZCBwcmV2aW91cyBzdGF0ZSBpbmZvcm1hdGlvblxuICAgICAgcHJldmlvdXNTdGF0ZToge1xuICAgICAgICBnb2FsczogZ29hbFN1bW1hcnksXG4gICAgICAgIHJlY2VudERlY2lzaW9ucyxcbiAgICAgICAgc2Vzc2lvbkNvdW50OiBzdGF0ZS5zZXNzaW9uQ291bnQsXG4gICAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfSxcblxuICAgICAgLy8gQWRkIGNvbnRpbnVhdGlvbiBjb250ZXh0XG4gICAgICBjb250aW51YXRpb246IHtcbiAgICAgICAgaXNSZXN1bWluZyxcbiAgICAgICAgcHJldmlvdXNTdGVwUmVzdWx0OiBwYXJhbXMucHJldmlvdXNTdGVwUmVzdWx0LFxuICAgICAgICBzdWdnZXN0ZWROZXh0U3RlcHNcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHN1Z2dlc3RlZCBuZXh0IHN0ZXBzIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVOZXh0U3RlcHMoc3RhdGU6IEFnZW50U3RhdGUpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3VnZ2VzdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBDaGVjayBmb3IgcGVuZGluZyBnb2Fsc1xuICAgIGNvbnN0IHBlbmRpbmdHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+IGcuc3RhdHVzID09PSAncGVuZGluZycpO1xuICAgIGlmIChwZW5kaW5nR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgU3RhcnQgd29yayBvbiAke3BlbmRpbmdHb2Fscy5sZW5ndGh9IHBlbmRpbmcgZ29hbChzKWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBpbi1wcm9ncmVzcyBnb2Fsc1xuICAgIGNvbnN0IGluUHJvZ3Jlc3NHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKTtcbiAgICBpZiAoaW5Qcm9ncmVzc0dvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYENvbnRpbnVlICR7aW5Qcm9ncmVzc0dvYWxzLmxlbmd0aH0gaW4tcHJvZ3Jlc3MgZ29hbChzKWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBibG9ja2VkIGdvYWxzIChkZXBlbmRlbmNpZXMpXG4gICAgY29uc3QgYmxvY2tlZEdvYWxzID0gc3RhdGUuZ29hbHMuZmlsdGVyKGcgPT5cbiAgICAgIGcuZGVwZW5kZW5jaWVzICYmIGcuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDAgJiYgZy5zdGF0dXMgPT09ICdwZW5kaW5nJ1xuICAgICk7XG4gICAgaWYgKGJsb2NrZWRHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBSZXNvbHZlIGRlcGVuZGVuY2llcyBmb3IgJHtibG9ja2VkR29hbHMubGVuZ3RofSBibG9ja2VkIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBkZWNpc2lvbiBoaXN0b3J5IGZvciBmYWlsdXJlc1xuICAgIGNvbnN0IHJlY2VudEZhaWx1cmVzID0gc3RhdGUuZGVjaXNpb25zXG4gICAgICAuc2xpY2UoLTEwKVxuICAgICAgLmZpbHRlcihkID0+IGQub3V0Y29tZSA9PT0gJ2ZhaWx1cmUnKTtcbiAgICBpZiAocmVjZW50RmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgUmV2aWV3IGFuZCBhZGRyZXNzICR7cmVjZW50RmFpbHVyZXMubGVuZ3RofSByZWNlbnQgZmFpbHVyZShzKWApO1xuICAgIH1cblxuICAgIHJldHVybiBzdWdnZXN0aW9ucztcbiAgfVxufVxuIl19
2511
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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QUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLGVBQWUsQ0FBQyxNQUFNLHNCQUFzQixDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUVELHlDQUF5QztRQUN6QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUMxQyxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FDdEUsQ0FBQztRQUNGLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QixXQUFXLENBQUMsSUFBSSxDQUFDLDRCQUE0QixZQUFZLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLFNBQVM7YUFDbkMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1YsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQztRQUN4QyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsV0FBVyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsY0FBYyxDQUFDLE1BQU0sb0JBQW9CLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnRNYW5hZ2VyIC0gUmVmYWN0b3JlZCB0byBleHRlbmQgQmFzZUVsZW1lbnRNYW5hZ2VyXG4gKiBNYW5hZ2VzIGFnZW50IENSVUQgb3BlcmF0aW9ucywgbWV0YWRhdGEgc2FuaXRpemF0aW9uLCBhbmQgc3RhdGUgcGVyc2lzdGVuY2UuXG4gKi9cblxuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi9BZ2VudC5qcyc7XG5pbXBvcnQge1xuICBDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT04sXG4gIEFHRU5UX0xJTUlUUyxcbiAgUklTS19UT0xFUkFOQ0VfTEVWRUxTLFxuICBTVEVQX0xJTUlUX0FDVElPTlMsXG4gIEVYRUNVVElPTl9GQUlMVVJFX0FDVElPTlMsXG4gIEJBQ0tPRkZfU1RSQVRFR0lFUyxcbiAgaXNPbmVPZixcbiAgbm9ybWFsaXplQXV0b25vbXlLZXlzLFxuICBub3JtYWxpemVSZXNpbGllbmNlS2V5cyxcbiAgbm9ybWFsaXplR29hbEtleXMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7XG4gIEFnZW50TWV0YWRhdGEsXG4gIEFnZW50U3RhdGUsXG4gIEV4ZWN1dGVBZ2VudFJlc3VsdCxcbiAgQWdlbnRHb2FsQ29uZmlnLFxuICBBZ2VudEdvYWxQYXJhbWV0ZXIsXG4gIEFnZW50TWV0YWRhdGFWMixcbiAgQWdlbnRHb2FsLFxuICBERUZBVUxUX1NBRkVUWV9DT05GSUcsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEF1dG9ub215RGlyZWN0aXZlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEdhdGhlcmVkRGF0YSwgdHlwZSBHYXRoZXJlZERhdGEgfSBmcm9tICcuL2dhdGhlcmVkRGF0YS5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZUF1dG9ub215IH0gZnJvbSAnLi9hdXRvbm9teUV2YWx1YXRvci5qcyc7XG5pbXBvcnQge1xuICBpc1YxQWdlbnQsXG4gIGNvbnZlcnRWMVRvVjIsXG59IGZyb20gJy4vdjFUb1YyQ29udmVydGVyLmpzJztcbmltcG9ydCB7XG4gIGRldGVybWluZVNhZmV0eVRpZXIsXG4gIGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZSxcbiAgY3JlYXRlQ29uZmlybWF0aW9uUmVxdWVzdCxcbiAgY3JlYXRlRGFuZ2VyWm9uZU9wZXJhdGlvbixcbiAgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSAnLi9zYWZldHlUaWVyU2VydmljZS5qcyc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyB0b1Npbmd1bGFyTGFiZWwgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVQYXRoIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgSW5wdXROb3JtYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXROb3JtYWxpemVyLmpzJztcbmltcG9ydCB7IFNhZmVSZWdleCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2Rvc1Byb3RlY3Rpb24uanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuXG5jb25zdCBBR0VOVF9GSUxFX0VYVEVOU0lPTiA9ICcubWQnO1xuY29uc3QgU1RBVEVfRElSRUNUT1JZID0gJy5zdGF0ZSc7XG5jb25zdCBTVEFURV9GSUxFX0VYVEVOU0lPTiA9ICcuc3RhdGUueWFtbCc7XG5jb25zdCBNQVhfWUFNTF9TSVpFID0gNjQgKiAxMDI0O1xuY29uc3QgTUFYX0ZJTEVfU0laRSA9IDEwMCAqIDEwMjQ7XG5cbi8vIElzc3VlICM4MzogQ2VudHJhbGl6ZWQgYWN0aXZlIGVsZW1lbnQgbGltaXRzIChjb25maWd1cmFibGUgdmlhIGVudiB2YXJzKVxuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnLCBnZXRNYXhBY3RpdmVMaW1pdCB9IGZyb20gJy4uLy4uL2NvbmZpZy9hY3RpdmUtZWxlbWVudC1saW1pdHMuanMnO1xuXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBlbGVtZW50PzogQWdlbnQ7XG59XG5cbmludGVyZmFjZSBQYXJzZWRBZ2VudEZpbGUge1xuICBtZXRhZGF0YTogQWdlbnRNZXRhZGF0YTtcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG50eXBlIEFnZW50Q3JlYXRlTWV0YWRhdGEgPSAoUGFydGlhbDxBZ2VudE1ldGFkYXRhPiAmIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPikgJiB7XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgQWdlbnRNYW5hZ2VyIGV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyPEFnZW50PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZUNhY2hlOiBNYXA8c3RyaW5nLCBBZ2VudFN0YXRlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlO1xuICAvLyBUcmFjayBhY3RpdmUgYWdlbnRzIGJ5IG5hbWUgKHN0YWJsZSBpZGVudGlmaWVyKVxuICBwcml2YXRlIGFjdGl2ZUFnZW50TmFtZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIC8vIFN0YXRpYyByZXNvbHZlciBmb3IgZWxlbWVudCBtYW5hZ2VyIGxvb2t1cCAoREkgcGF0dGVybilcbiAgLy8gVGhpcyBhbGxvd3MgQWdlbnQgaW5zdGFuY2VzIHRvIHJlc29sdmUgbWFuYWdlcnMgd2l0aG91dCB0aWdodCBjb3VwbGluZ1xuICBwcml2YXRlIHN0YXRpYyBlbGVtZW50TWFuYWdlclJlc29sdmVyPzogKG1hbmFnZXJOYW1lOiBzdHJpbmcpID0+IGFueTtcblxuICAvLyBJc3N1ZSAjNDAyOiBTdGF0aWMgcmVzb2x2ZXIgZm9yIERhbmdlclpvbmVFbmZvcmNlciAoREkgcGF0dGVybilcbiAgcHJpdmF0ZSBzdGF0aWMgZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXI/OiAoKSA9PiBpbXBvcnQoJy4vdHlwZXMuanMnKS5EYW5nZXJab25lQmxvY2tlcjtcblxuICAvLyBJc3N1ZSAjMTQyOiBTdGF0aWMgcmVzb2x2ZXIgZm9yIFZlcmlmaWNhdGlvblN0b3JlIChESSBwYXR0ZXJuKVxuICBwcml2YXRlIHN0YXRpYyB2ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyPzogKCkgPT4geyBzZXQ6IChpZDogc3RyaW5nLCBjaGFsbGVuZ2U6IHsgY29kZTogc3RyaW5nOyBleHBpcmVzQXQ6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfSkgPT4gdm9pZCB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgYmFzZURpcjogc3RyaW5nLFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZSxcbiAgICBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZSxcbiAgICBtZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQsXG4gICAgYmFja3VwU2VydmljZT86IGltcG9ydCgnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcycpLkJhY2t1cFNlcnZpY2VcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudERpck92ZXJyaWRlID0gcGF0aC5qb2luKGJhc2VEaXIsIEVsZW1lbnRUeXBlLkFHRU5UKTtcbiAgICBzdXBlcihFbGVtZW50VHlwZS5BR0VOVCwgcG9ydGZvbGlvTWFuYWdlciwgZmlsZUxvY2tNYW5hZ2VyLCB7IGVsZW1lbnREaXJPdmVycmlkZSwgZmlsZVdhdGNoU2VydmljZSwgbWVtb3J5QnVkZ2V0LCBiYWNrdXBTZXJ2aWNlIH0sIGZpbGVPcGVyYXRpb25zU2VydmljZSwgdmFsaWRhdGlvblJlZ2lzdHJ5KTtcbiAgICB0aGlzLnN0YXRlRGlyID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgU1RBVEVfRElSRUNUT1JZKTtcbiAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZSA9IHNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlID0gbWV0YWRhdGFTZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYWdlbnQnO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgZWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyIGZvciBlbGVtZW50LWFnbm9zdGljIGFjdGl2YXRpb25cbiAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGl6YXRpb25cbiAgICogRm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuIGFzIE1lbW9yeS5jb25maWd1cmVNZW1vcnlNYW5hZ2VyUmVzb2x2ZXJcbiAgICpcbiAgICogQHBhcmFtIHJlc29sdmVyIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBtYW5hZ2VyIG5hbWUgYW5kIHJldHVybnMgdGhlIG1hbmFnZXIgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcihyZXNvbHZlcjogKG1hbmFnZXJOYW1lOiBzdHJpbmcpID0+IGFueSk6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzQwMjogU2V0IERhbmdlclpvbmVFbmZvcmNlciByZXNvbHZlciBmb3IgREkgaW5qZWN0aW9uLlxuICAgKiBDYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldERhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiBpbXBvcnQoJy4vdHlwZXMuanMnKS5EYW5nZXJab25lQmxvY2tlcik6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci5kYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICMxNDI6IFNldCBWZXJpZmljYXRpb25TdG9yZSByZXNvbHZlciBmb3IgREkgaW5qZWN0aW9uLlxuICAgKiBDYWxsZWQgYnkgdGhlIERJIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldFZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IHsgc2V0OiAoaWQ6IHN0cmluZywgY2hhbGxlbmdlOiB7IGNvZGU6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH0pID0+IHZvaWQgfSk6IHZvaWQge1xuICAgIEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIoKTogKChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnkpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgc3RhdGljIHJlc29sdmVycyAoZm9yIHRlc3QgY2xlYW51cClcbiAgICogQ2FsbCB0aGlzIGluIGFmdGVyRWFjaCBob29rcyB0byBwcmV2ZW50IHRlc3QgaXNvbGF0aW9uIGlzc3Vlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXNldFJlc29sdmVycygpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgQWdlbnRNYW5hZ2VyLnZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBhZ2VudHMgYW5kIHN0YXRlIGZpbGVzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuc3RhdGVEaXIpO1xuICAgIGxvZ2dlci5pbmZvKCdBZ2VudE1hbmFnZXIgaW5pdGlhbGl6ZWQnLCB7IHBhdGg6IHRoaXMuZWxlbWVudERpciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYWdlbnQgb24gZGlzay5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBBZ2VudENyZWF0ZU1ldGFkYXRhXG4gICk6IFByb21pc2U8RWxlbWVudENyZWF0aW9uUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAvLyBOb3JtYWxpemUgZ29hbCBpbnB1dCBiZWZvcmUgdmFsaWRhdGlvbiAtIExMTXMgbWF5IHBhc3Mgc3RyaW5nIG9yIG9iamVjdFxuICAgICAgLy8gU3RyaXAgJ2NvbnRlbnQnIGZyb20gbWV0YWRhdGEgdG8gcHJldmVudCBpdCBmcm9tIG92ZXJ3cml0aW5nIHRoZSBwb3NpdGlvbmFsXG4gICAgICAvLyBjb250ZW50IHBhcmFtICh3aGljaCBpcyB0aGUgYWdlbnQncyBpbnN0cnVjdGlvbnMgdGV4dCkgaW4gdGhlIHZhbGlkYXRpb24gY2FsbC5cbiAgICAgIGNvbnN0IHsgY29udGVudDogcmVmZXJlbmNlQ29udGVudCwgLi4ubWV0YWRhdGFXaXRob3V0Q29udGVudCB9ID0gbWV0YWRhdGEgPz8ge307XG4gICAgICBjb25zdCBub3JtYWxpemVkTWV0YWRhdGE6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPiA9IHtcbiAgICAgICAgLi4ubWV0YWRhdGFXaXRob3V0Q29udGVudFxuICAgICAgfTtcbiAgICAgIGlmIChtZXRhZGF0YT8uZ29hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRNZXRhZGF0YS5nb2FsID0gdGhpcy5ub3JtYWxpemVHb2FsSW5wdXQoXG4gICAgICAgICAgbWV0YWRhdGEuZ29hbCBhcyBzdHJpbmcgfCBQYXJ0aWFsPEFnZW50R29hbENvbmZpZz5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgaW5wdXQgdmFsaWRhdGlvbi5cbiAgICAgIC8vIEFnZW50cyBzdXBwb3J0IGR1YWwtZmllbGQgY3JlYXRpb246IGJlaGF2aW9yYWwgaW5zdHJ1Y3Rpb25zIGFuZCBvcHRpb25hbFxuICAgICAgLy8gcmVmZXJlbmNlIGNvbnRlbnQuIFZhbGlkYXRpb24gcHJlZmVycyBiZWhhdmlvcmFsIGluc3RydWN0aW9ucyB3aGVuIGJvdGhcbiAgICAgIC8vIGZpZWxkcyBhcmUgcHJlc2VudCBzbyBleGlzdGluZyBpbnN0cnVjdGlvbi1maXJzdCBhZ2VudHMga2VlcCB0aGVpclxuICAgICAgLy8gY3VycmVudCBzZW1hbnRpY3Mgd2hpbGUgY29udGVudC1vbmx5IGFnZW50cyBzdGlsbCB2YWxpZGF0ZSBjb3JyZWN0bHkuXG4gICAgICBjb25zdCB2YWxpZGF0aW9uSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhXG4gICAgICB9O1xuICAgICAgY29uc3QgcHJpbWFyeVRleHQgPSB0aGlzLmdldFByaW1hcnlWYWxpZGF0aW9uVGV4dChjb250ZW50LCByZWZlcmVuY2VDb250ZW50KTtcbiAgICAgIHZhbGlkYXRpb25JbnB1dC5jb250ZW50ID0gcHJpbWFyeVRleHQgPz8gJyc7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUodmFsaWRhdGlvbklucHV0KTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBpbnB1dHMgZm9yIGVsZW1lbnQgY3JlYXRpb25cbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKTtcbiAgICAgIC8vIFVzZSBDb250ZW50VmFsaWRhdG9yIGZvciBtdWx0aS1saW5lIGNvbnRlbnQgdG8gcHJlc2VydmUgZm9ybWF0dGluZyAobmV3bGluZXMsIHRhYnMpXG4gICAgICAvLyB3aGlsZSBzdGlsbCBkZXRlY3RpbmcgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfSk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGFnZW50IG5hbWUuIFVzZSBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcy4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhLFxuICAgICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb25cbiAgICAgIH0sIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgICAgYWdlbnQubWV0YWRhdGEuYXV0aG9yID0gbm9ybWFsaXplZE1ldGFkYXRhPy5hdXRob3IgPz8gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uc3BlY2lhbGl6YXRpb25zID8/IGFnZW50LmV4dGVuc2lvbnM/LnNwZWNpYWxpemF0aW9ucyA/PyBbXSxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uZGVjaXNpb25GcmFtZXdvcmsgPz8gYWdlbnQuZXh0ZW5zaW9ucz8uZGVjaXNpb25GcmFtZXdvcmssXG4gICAgICAgIHJpc2tUb2xlcmFuY2U6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ucmlza1RvbGVyYW5jZSA/PyBhZ2VudC5leHRlbnNpb25zPy5yaXNrVG9sZXJhbmNlLFxuICAgICAgICBsZWFybmluZ0VuYWJsZWQ6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ubGVhcm5pbmdFbmFibGVkID8/IGFnZW50LmV4dGVuc2lvbnM/LmxlYXJuaW5nRW5hYmxlZCxcbiAgICAgIH07XG4gICAgICAvLyBQcm9tb3RlIGluc3RydWN0aW9ucyB0byBmaXJzdC1jbGFzcyBwcm9wZXJ0eSAobm8gbG9uZ2VyIGluIGV4dGVuc2lvbnMpXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBzYW5pdGl6ZWRJbnN0cnVjdGlvbnM7XG4gICAgICAvLyBBbHNvIGtlZXAgaW4gZXh0ZW5zaW9ucyBmb3IgYmFja3dhcmQgY29tcGF0IGR1cmluZyB0cmFuc2l0aW9uXG4gICAgICBhZ2VudC5leHRlbnNpb25zLmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcblxuICAgICAgLy8gU2V0IHJlZmVyZW5jZSBjb250ZW50IGlmIHByb3ZpZGVkICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAgICAgaWYgKHR5cGVvZiByZWZlcmVuY2VDb250ZW50ID09PSAnc3RyaW5nJyAmJiByZWZlcmVuY2VDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0ID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKFxuICAgICAgICAgIHJlZmVyZW5jZUNvbnRlbnQsXG4gICAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjb250ZW50VmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYFZhbGlkYXRpb24gZmFpbGVkOiAkeyhjb250ZW50VmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zIHx8IFsnQ29udGVudCB2YWxpZGF0aW9uIGZhaWxlZCddKS5qb2luKCcsICcpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGFnZW50LmNvbnRlbnQgPSBjb250ZW50VmFsaWRhdGlvblJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNzI3OiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIFYyIGZpZWxkcyBCRUZPUkUgYXNzaWdubWVudC5cbiAgICAgIC8vIFRoaXMgaXMgdGhlIFNFQ09ORCB2YWxpZGF0aW9uIGxheWVyIOKAlCBBZ2VudEVsZW1lbnRWYWxpZGF0b3IgKGNhbGxlZCBhYm92ZSB2aWFcbiAgICAgIC8vIHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKSBpcyB0aGUgZmlyc3QuIFRoZSB2YWxpZGF0b3IgY2F0Y2hlcyBjYW1lbENhc2VcbiAgICAgIC8vIGludmFsaWQgdmFsdWVzOyB0aGlzIG1ldGhvZCBhbHNvIG5vcm1hbGl6ZXMgc25ha2VfY2FzZSBrZXlzICh3aGljaCB0aGUgdmFsaWRhdG9yXG4gICAgICAvLyBkb2Vzbid0IHNlZSkgYW5kIHZhbGlkYXRlcyB0aGVtLiBCb3RoIGxheWVycyBhcmUgbmVlZGVkLiBTZWUgSXNzdWUgIzczMC5cbiAgICAgIGNvbnN0IG1ldGFkYXRhVjIgPSBub3JtYWxpemVkTWV0YWRhdGEgYXMgUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG1ldGFkYXRhVjIpIHtcbiAgICAgICAgY29uc3QgdjJFcnJvcnMgPSB0aGlzLnZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUobWV0YWRhdGFWMik7XG4gICAgICAgIGlmICh2MkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYFYyIGZpZWxkIHZhbGlkYXRpb24gZmFpbGVkOiAke3YyRXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVjIgRklFTERTOiBTdG9yZSBWMi1zcGVjaWZpYyBmaWVsZHMgaW4gYWdlbnQgbWV0YWRhdGEgKG5vdCBqdXN0IGV4dGVuc2lvbnMpXG4gICAgICAvLyBUaGlzIGVuYWJsZXMgVjIgYWdlbnQgY3JlYXRpb24gdmlhIE1DUC1BUUwgY3JlYXRlX2VsZW1lbnQgb3BlcmF0aW9uXG4gICAgICBpZiAobWV0YWRhdGFWMj8uZ29hbCkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5nb2FsID0gbWV0YWRhdGFWMi5nb2FsO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmFjdGl2YXRlcykge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5hY3RpdmF0ZXMgPSBtZXRhZGF0YVYyLmFjdGl2YXRlcztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy50b29scykge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS50b29scyA9IG1ldGFkYXRhVjIudG9vbHM7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uc3lzdGVtUHJvbXB0KSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnN5c3RlbVByb21wdCA9IG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0O1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmF1dG9ub215KSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmF1dG9ub215ID0gbWV0YWRhdGFWMi5hdXRvbm9teTtcbiAgICAgIH1cbiAgICAgIC8vIElzc3VlICM0NDk6IFBlcnNpc3QgZ2F0ZWtlZXBlciBwb2xpY3kgZm9yIEdhdGVrZWVwZXIgZW5mb3JjZW1lbnQgZHVyaW5nIGV4ZWN1dGlvblxuICAgICAgaWYgKG1ldGFkYXRhVjI/LmdhdGVrZWVwZXIpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuZ2F0ZWtlZXBlciA9IG1ldGFkYXRhVjIuZ2F0ZWtlZXBlcjtcbiAgICAgIH1cbiAgICAgIC8vIElzc3VlICM3MjI6IFBlcnNpc3QgcmVzaWxpZW5jZSBwb2xpY3kgKHdhcyBtaXNzaW5nIGZyb20gVjIgZmllbGQgYXNzaWdubWVudHMpXG4gICAgICBpZiAobWV0YWRhdGFWMj8ucmVzaWxpZW5jZSkge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5yZXNpbGllbmNlID0gbWV0YWRhdGFWMi5yZXNpbGllbmNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNjEzOiBDaGVjayBtZXRhZGF0YSBuYW1lIHVuaXF1ZW5lc3MgKG5vdCBqdXN0IGZpbGVuYW1lKVxuICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGV4aXN0aW5nQWdlbnRzLmZpbmQoYSA9PlxuICAgICAgICBhLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2FuaXRpemVkTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgYWdlbnQgY29udGVudCBmaXJzdFxuICAgICAgY29uc3Qgc2VyaWFsaXplZENvbnRlbnQgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQpO1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVuYW1lKTtcblxuICAgICAgLy8gVXNlIGF0b21pYyBmaWxlIGNyZWF0aW9uIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uc1xuICAgICAgLy8gVGhpcyByZXBsYWNlcyB0aGUgcHJldmlvdXMgY2hlY2stdGhlbi13cml0ZSBwYXR0ZXJuIHdpdGggYSBzaW5nbGUgYXRvbWljIG9wZXJhdGlvblxuICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRmlsZUV4Y2x1c2l2ZShhYnNvbHV0ZVBhdGgsIHNlcmlhbGl6ZWRDb250ZW50LCB7XG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFjcmVhdGVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FjaGUgdGhlIGVsZW1lbnQgYWZ0ZXIgc3VjY2Vzc2Z1bCBjcmVhdGlvblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIGZpbGVuYW1lKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkKGZpbGVuYW1lLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgLy8gTm90ZTogTm8gcmVsb2FkKCkgaGVyZSDigJQgY2FjaGVFbGVtZW50KCkgc3RvcmVzIHRoZSBlbGVtZW50IGNvcnJlY3RseS5cbiAgICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGNyZWF0ZWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBhZ2VudElkOiBhZ2VudC5pZCB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYPCfpJYgKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthZ2VudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyd9YCxcbiAgICAgICAgZWxlbWVudDogYWdlbnRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCcsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gY3JlYXRlIGFnZW50J1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhbiBhZ2VudCBieSBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqIEByZXR1cm5zIEFnZW50IGluc3RhbmNlIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBhc3luYyByZWFkKG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBmbGV4aWJsZSBtYXRjaGluZyB2aWEgbGlzdCBzY2FuICgjNjA3KVxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmxleGlibHkobmFtZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgZm9yIHJlYWQoKSB3aGVuIGRpcmVjdCBmaWxlIGxvb2t1cCBmYWlscy5cbiAgICogU2VhcmNoZXMgbG9hZGVkIGFnZW50cyBieSBtZXRhZGF0YSBuYW1lIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHNsdWcgbWF0Y2hpbmcuXG4gICAqIExvZ3MgYSB3YXJuaW5nIHdoZW4gYSBtYXRjaCBpcyBmb3VuZCAoaW5kaWNhdGVzIGZpbGVuYW1lL25hbWUgbWlzbWF0Y2ggbmVlZGluZyBjbGVhbnVwKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRmlsZSBvbiBkaXNrOiBcImxlZ2FjeS1wb3N0ZXItYWdlbnQubWRcIlxuICAgKiAvLyBNZXRhZGF0YSBuYW1lOiBcImxlZ2FjeS1wb3N0ZXJcIlxuICAgKiAvLyBEaXJlY3QgbG9va3VwIGZvciBcImxlZ2FjeS1wb3N0ZXIubWRcIiBmYWlscyAoRU5PRU5UKVxuICAgKiAvLyBGbGV4aWJsZSBmYWxsYmFjayBtYXRjaGVzIHZpYSBtZXRhZGF0YSBuYW1lOlxuICAgKiBjb25zdCBhZ2VudCA9IGF3YWl0IHJlYWQoXCJsZWdhY3ktcG9zdGVyXCIpOyAvLyByZXNvbHZlcyB2aWEgZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZEZsZXhpYmx5KG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFNsdWcgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgICAvLyBQYXNzIDE6IGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggb24gbWV0YWRhdGEgbmFtZVxuICAgICAgbGV0IG1hdGNoID0gYWdlbnRzLmZpbmQoXG4gICAgICAgIChhKSA9PiBhLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoTG93ZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgMjogc2x1ZyBtYXRjaCAoaGFuZGxlcyBkYXNoZXMsIHVuZGVyc2NvcmVzLCBjYXNpbmcgZGlmZmVyZW5jZXMpXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG1hdGNoID0gYWdlbnRzLmZpbmQoKGEpID0+IHtcbiAgICAgICAgICBjb25zdCBzbHVnID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShhLm1ldGFkYXRhLm5hbWUpO1xuICAgICAgICAgIHJldHVybiBzbHVnID09PSBzZWFyY2hTbHVnIHx8IHNsdWcgPT09IHNlYXJjaExvd2VyO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCBcIiR7bmFtZX1cIiByZXNvbHZlZCB2aWEgZmxleGlibGUgbWF0Y2hpbmcgdG8gZmlsZSB3aXRoIG1ldGFkYXRhIG5hbWUgXCIke21hdGNoLm1ldGFkYXRhLm5hbWV9XCIuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciByZW5hbWluZyB0aGUgZmlsZSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgY29udmVudGlvbiAoIzYwNykuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF0Y2ggPz8gbnVsbDtcbiAgICB9IGNhdGNoIChsaXN0RXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmxleGlibGUgYWdlbnQgbG9va3VwIGZhaWxlZCBmb3IgXCIke25hbWV9XCI6ICR7bGlzdEVycm9yfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhZGF0YS9jb250ZW50IGZvciBhbiBleGlzdGluZyBhZ2VudC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlczogUGFydGlhbDxBZ2VudE1ldGFkYXRhPixcbiAgICBjb250ZW50Pzogc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQoc2FuaXRpemVkTmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IG5vdCBmb3VuZCBmb3IgdXBkYXRlOiAke25hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgZWRpdCB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlRWRpdChhZ2VudCwge1xuICAgICAgLi4udXBkYXRlcyxcbiAgICAgIGNvbnRlbnRcbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEFnZW50IHVwZGF0ZSB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCB1cGRhdGUgd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChcbiAgICAgICAgVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXBkYXRlcy5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgIDUwMFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5zcGVjaWFsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiB1cGRhdGVzLnNwZWNpYWxpemF0aW9ucy5tYXAoaXRlbSA9PiBzYW5pdGl6ZUlucHV0KGl0ZW0sIDUwKSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMucmlza1RvbGVyYW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICByaXNrVG9sZXJhbmNlOiB1cGRhdGVzLnJpc2tUb2xlcmFuY2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGxlYXJuaW5nRW5hYmxlZDogdXBkYXRlcy5sZWFybmluZ0VuYWJsZWRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLm1heENvbmN1cnJlbnRHb2FscyA9IHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzO1xuICAgIH1cblxuICAgIGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgaWYgKGNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVXNlIENvbnRlbnRWYWxpZGF0b3IgZm9yIG11bHRpLWxpbmUgY29udGVudCB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nIChuZXdsaW5lcywgdGFicylcbiAgICAgIC8vIHdoaWxlIHN0aWxsIGRldGVjdGluZyBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQsIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9KTtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGluc3RydWN0aW9uczogY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCAnJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCB1cGRhdGVkOiAke3Nhbml0aXplZE5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBwcm92aWRlZCBhZ2VudCBuYW1lLlxuICAgKi9cbiAgdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBiZSBlbXB0eScgfTtcbiAgICB9XG5cbiAgICBpZiAobmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBleGNlZWQgMTAwIGNoYXJhY3RlcnMnIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUobmFtZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdOYW1lIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBhZ2VudCBmcm9tIHNlcmlhbGl6ZWQgY29udGVudC5cbiAgICovXG4gIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUpzb24oZGF0YSwge1xuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQocGFyc2VkLm1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgICBpZiAocGFyc2VkLnN0YXRlKSB7XG4gICAgICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHBhcnNlZCkpO1xuICAgICAgfVxuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBwYXJzZWQuaW5zdHJ1Y3Rpb25zIHx8ICcnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cblxuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgcGFyc2luZ1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihkYXRhLCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICB9KTtcblxuICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHJlc3VsdC5kYXRhIGFzIEFnZW50TWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgIGluc3RydWN0aW9uczogcmVzdWx0LmNvbnRlbnQudHJpbSgpXG4gICAgfTtcbiAgICByZXR1cm4gYWdlbnQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFuIGFnZW50IHRvIEpTT04gb3IgbWFya2Rvd24gKGRlZmF1bHQpLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudChhZ2VudDogQWdlbnQsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGFnZW50LnNlcmlhbGl6ZVRvSlNPTigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gYWdlbnQgZmlsZSwgZW5mb3JjaW5nIHNpemUgYW5kIGZvcm1hdCBjaGVja3MuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkSW5wdXQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHNhbml0aXplZElucHV0LmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZWRJbnB1dFxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoc2FuaXRpemVkSW5wdXQsIDEwMCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChyZWxhdGl2ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSW52YWxpZCBhZ2VudCBwYXRoOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBNQVhfRklMRV9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgZmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke01BWF9GSUxFX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VBZ2VudEZpbGUoY29udGVudCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQubWV0YWRhdGEpO1xuICAgICAgY29uc3QgYWdlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50LCB0aGlzLnN0cmlwRXh0ZW5zaW9uKHJlbGF0aXZlUGF0aCkpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRgLFxuICAgICAgICBkZXRhaWxzOiBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGxvYWRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IGZyb20gJHtmdWxsUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIEJhc2VFbGVtZW50TWFuYWdlci5zYXZlIHRvIHBlcnNpc3Qgc3RhdGUgd2hlbiByZXF1aXJlZC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoYWdlbnQ6IEFnZW50LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN0YXRlRGlyZWN0b3J5KCk7XG4gICAgYXdhaXQgc3VwZXIuc2F2ZShhZ2VudCwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICBpZiAoYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCksIGFnZW50LmdldFN0YXRlKCkpO1xuICAgICAgYWdlbnRbQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OXShuZXdWZXJzaW9uKTsgIC8vIFN5bmMgYWdlbnQncyBpbnRlcm5hbCB2ZXJzaW9uIChJc3N1ZSAjMTIzIGZpeClcbiAgICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFnZW50IHN0YXRlIHRvIGRpc2sgKHB1YmxpYyBBUEkgZm9yIGV4dGVybmFsIGNhbGxlcnMpLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgcHJvcGVyIHdheSBmb3IgZXh0ZXJuYWwgY29kZSAoc3RyYXRlZ2llcywgaGFuZGxlcnMpIHRvXG4gICAqIHRyaWdnZXIgc3RhdGUgcGVyc2lzdGVuY2UuIEl0IGltcGxlbWVudHMgdGhlIE9wdGlvbiBDIHBhdHRlcm4gZnJvbSBJc3N1ZSAjMTIzOlxuICAgKiBzdGF0ZVZlcnNpb24gaXMgb25seSBpbmNyZW1lbnRlZCBvbiBzdWNjZXNzZnVsIHNhdmUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+IC0gVHJ1ZSBpZiBzdGF0ZSB3YXMgcGVyc2lzdGVkLCBmYWxzZSBpZiBub3QgbmVlZGVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYWdlbnQgbm90IGZvdW5kIG9yIHNhdmUgZmFpbHNcbiAgICovXG4gIGFzeW5jIHBlcnNpc3RTdGF0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IG5vdCBmb3VuZDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGlmICghYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBhZ2VudC5nZXRTdGF0ZSgpKTtcbiAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pO1xuICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlbGV0ZSB0byByZW1vdmUgYXNzb2NpYXRlZCBzdGF0ZSBmaWxlLlxuICAgKlxuICAgKiBGSVg6IFVzZXMgbm9ybWFsaXplRmlsZW5hbWUoKSB0byBlbnN1cmUgc3RhdGUgZmlsZSBkZWxldGlvbiBtYXRjaGVzXG4gICAqIHRoZSBub3JtYWxpemVkIGZpbGVuYW1lIHVzZWQgZm9yIHN0YXRlIGZpbGUgY3JlYXRpb24vbG9hZGluZy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCk7XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIGRlbGV0aW9uXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBCYWNrIHVwIHRoZSBzdGF0ZSBmaWxlIGJlZm9yZSBkZWxldGluZyBpdFxuICAgICAgaWYgKHRoaXMuYmFja3VwU2VydmljZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgICAgICBpZiAoIXJlc3VsdC5tb3ZlZE9yaWdpbmFsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQsIHtcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCwge1xuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGNhY2hlIGNsZWFudXBcbiAgICB0aGlzLnN0YXRlQ2FjaGUuZGVsZXRlKG5vcm1hbGl6ZWROYW1lKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgcmV0dXJuIHN1cGVyLmV4aXN0cyhzYW5pdGl6ZWRQYXRoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZhbGlkYXRlUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGFyZ2V0UGF0aC5pbmNsdWRlcygnLi4nKSB8fCB0YXJnZXRQYXRoLmluY2x1ZGVzKCd+JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRhcmdldFBhdGguc3RhcnRzV2l0aCgnLycpIHx8IC9eW0EtWmEtel06Ly50ZXN0KHRhcmdldFBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBBR0VOVF9GSUxFX0VYVEVOU0lPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBsaXN0IHRvIGFwcGx5IGFjdGl2ZSBzdGF0dXMgYmFzZWQgb24gYWN0aXZlQWdlbnROYW1lcyBzZXRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuXG4gICAgLy8gQXBwbHkgYWN0aXZlIHN0YXR1cyB0byBhZ2VudHMgdGhhdCBhcmUgaW4gdGhlIGFjdGl2ZSBzZXQgKGJ5IG5hbWUpXG4gICAgZm9yIChjb25zdCBhZ2VudCBvZiBhZ2VudHMpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuaGFzKGFnZW50Lm1ldGFkYXRhLm5hbWUpKSB7XG4gICAgICAgIC8vIEFjdGl2YXRlIHRoZSBhZ2VudCB0byBzZXQgc3RhdHVzIHRvIEFDVElWRVxuICAgICAgICBhd2FpdCBhZ2VudC5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhZ2VudHM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUFnZW50KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGFnZW50PzogQWdlbnQgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuQUdFTlQsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICAvLyBBZGQgdG8gYWN0aXZlIHNldCAoYnkgbmFtZSwgd2hpY2ggaXMgc3RhYmxlIGFjcm9zcyByZWxvYWRzKVxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5hZGQoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQUdFTlRfQUNUSVZBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5hY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICBnb2FsQ291bnQ6IChhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLmdvYWw/LnBhcmFtZXRlcnM/Lmxlbmd0aCB8fCAwLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IGFnZW50Lm1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyxcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuQUdFTlQsIGFnZW50Lm1ldGFkYXRhLm5hbWUpLFxuICAgICAgYWdlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlQWdlbnQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5BR0VOVCwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gYWN0aXZlIHNldFxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5kZWxldGUoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmRlYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdBR0VOVF9ERUFDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZGVhY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBkZWFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgZGVhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5BR0VOVCwgYWdlbnQubWV0YWRhdGEubmFtZSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYWN0aXZlIGFnZW50c1xuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlQWdlbnRzKCk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBhZ2VudHMuZmlsdGVyKGEgPT4gdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmhhcyhhLm1ldGFkYXRhLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3AuXG4gICAqIFRoaXMgbWV0aG9kOlxuICAgKiAxLiBMb2FkcyB0aGUgYWdlbnQgY29uZmlndXJhdGlvblxuICAgKiAyLiBWYWxpZGF0ZXMgYW5kIHJlbmRlcnMgdGhlIGdvYWwgdGVtcGxhdGUgd2l0aCBwYXJhbWV0ZXJzXG4gICAqIDMuIEFjdGl2YXRlcyBjb25maWd1cmVkIGVsZW1lbnRzIChlbGVtZW50LWFnbm9zdGljKVxuICAgKiA0LiBFdmFsdWF0ZXMgcHJvZ3JhbW1hdGljIGNvbnN0cmFpbnRzIGFuZCByaXNrXG4gICAqIDUuIFJldHVybnMgc3RydWN0dXJlZCBjb250ZXh0IGZvciBMTE1cbiAgICpcbiAgICogVGhlIExMTSB0aGVuIGRyaXZlcyB0aGUgYWdlbnRpYyBsb29wIHVzaW5nIHRoaXMgY29udGV4dC5cbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAvLyBUaHJlYWQgdGhlIHRyaWdnZXJpbmcgTUNQIGxpZmVjeWNsZSBvcCB0aHJvdWdoIHZhbGlkYXRpb24gc28gZXJyb3IgbWVzc2FnZXNcbiAgICAvLyBjYW4gZGlzdGluZ3Vpc2ggYSBmcmVzaCBleGVjdXRlX2FnZW50IGNhbGwgZnJvbSBhIG1pc3VzZWQgY29udGludWVfZXhlY3V0aW9uLlxuICAgIGNvbnRleHQ6IHtcbiAgICAgIG9wZXJhdGlvbk5hbWU/OiAnZXhlY3V0ZV9hZ2VudCcgfCAnY29udGludWVfZXhlY3V0aW9uJztcbiAgICB9ID0ge31cbiAgKTogUHJvbWlzZTxFeGVjdXRlQWdlbnRSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgbWV0YWRhdGEgYXMgdjIgKG1heSBoYXZlIGdvYWwgY29uZmlnKVxuICAgICAgbGV0IG1ldGFkYXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgdjIuMCBhZ2VudCB3aXRoIGdvYWwgY29uZmlndXJhdGlvblxuICAgICAgLy8gSWYgbm90LCBhdXRvLWNvbnZlcnQgVjEgdG8gVjIgaW4gcGxhY2UgKElzc3VlICM1ODcpXG4gICAgICBpZiAoIW1ldGFkYXRhLmdvYWwgfHwgIW1ldGFkYXRhLmdvYWwudGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGlzVjFBZ2VudChtZXRhZGF0YSkpIHtcbiAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBhZ2VudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICAgICAgY29uc3QgY29udmVyc2lvblJlc3VsdCA9IGNvbnZlcnRWMVRvVjIobWV0YWRhdGEsIGluc3RydWN0aW9ucyk7XG5cbiAgICAgICAgICBpZiAoY29udmVyc2lvblJlc3VsdC5jb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgIC8vIE1lcmdlIGNvbnZlcnRlZCBtZXRhZGF0YSBvbnRvIHRoZSBleGlzdGluZyBhZ2VudCAoaW4tcGxhY2UpXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1ldGFkYXRhLCBjb252ZXJzaW9uUmVzdWx0Lm1ldGFkYXRhKTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYWdlbnQubWV0YWRhdGEsIGNvbnZlcnNpb25SZXN1bHQubWV0YWRhdGEpO1xuXG4gICAgICAgICAgICAvLyBMb2cgY29udmVyc2lvbiB3YXJuaW5nc1xuICAgICAgICAgICAgaWYgKGNvbnZlcnNpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nIGF1dG8tY29udmVydGVkIGZyb20gVjEgdG8gVjIgaW4gcGxhY2VgLCB7XG4gICAgICAgICAgICAgICAgd2FybmluZ3M6IGNvbnZlcnNpb25SZXN1bHQud2FybmluZ3MsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTYXZlIHRoZSB1cGdyYWRlZCBhZ2VudCBiYWNrIHRvIGl0cyBvcmlnaW5hbCBmaWxlXG4gICAgICAgICAgICBjb25zdCB1cGdyYWRlZEZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB1cGdyYWRlZEZpbGVuYW1lKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBBZ2VudCAnJHtuYW1lfScgY29udmVydGVkIGZyb20gVjEgdG8gVjIgYW5kIHNhdmVkIGluIHBsYWNlYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEFnZW50ICcke25hbWV9JyBjYW5ub3QgYmUgZXhlY3V0ZWQ6IG1pc3NpbmcgZ29hbC50ZW1wbGF0ZSBhbmQgY29udmVyc2lvbiBmYWlsZWQuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFnZW50ICcke25hbWV9JyBpcyBub3QgYSB2Mi4wIGFnZW50LiBNaXNzaW5nIGdvYWwudGVtcGxhdGUgY29uZmlndXJhdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBDbG9uZSBwYXJhbWV0ZXJzIHRvIHByZXZlbnQgbXV0YXRpb24gb2YgY2FsbGVyJ3Mgb2JqZWN0IChJc3N1ZSAjMTE4KVxuICAgICAgY29uc3QgY2xvbmVkUGFyYW1ldGVycyA9IHN0cnVjdHVyZWRDbG9uZShwYXJhbWV0ZXJzKTtcblxuICAgICAgLy8gMmIuIFNlY3VyaXR5IHZhbGlkYXRpb24gb2YgdGVtcGxhdGUgcGFyYW1ldGVycyAoSXNzdWUgIzEwMylcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eShjbG9uZWRQYXJhbWV0ZXJzKTtcblxuICAgICAgLy8gMy4gVmFsaWRhdGUgcGFyYW1ldGVycyBhZ2FpbnN0IGdvYWwucGFyYW1ldGVycyBzY2hlbWFcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbWV0ZXJzKG1ldGFkYXRhLmdvYWwsIGNsb25lZFBhcmFtZXRlcnMsIHtcbiAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICBvcGVyYXRpb25OYW1lOiBjb250ZXh0Lm9wZXJhdGlvbk5hbWUgPz8gJ2V4ZWN1dGVfYWdlbnQnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIDQuIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICAgIGNvbnN0IHJlbmRlcmVkR29hbCA9IHRoaXMucmVuZGVyR29hbFRlbXBsYXRlKG1ldGFkYXRhLmdvYWwudGVtcGxhdGUsIGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyA0Yi4gRGV0ZWN0IHVubWF0Y2hlZCBwbGFjZWhvbGRlcnMgYWZ0ZXIgcmVuZGVyaW5nIChJc3N1ZSAjMTI2KVxuICAgICAgY29uc3QgdW5tYXRjaGVkUGxhY2Vob2xkZXJzID0gdGhpcy5kZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWRHb2FsKTtcbiAgICAgIGlmICh1bm1hdGNoZWRQbGFjZWhvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVycyBkZXRlY3RlZCBhZnRlciByZW5kZXJpbmcnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHVubWF0Y2hlZDogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gNS4gQ3JlYXRlIGV4ZWN1dGlvbiBjb250ZXh0IEJFRk9SRSBhY3RpdmF0aW5nIGVsZW1lbnRzIChJc3N1ZSAjMTA5IC0gY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24pXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChuYW1lKTtcblxuICAgICAgLy8gNWIuIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiAoSXNzdWUgIzM3NClcbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXM/LmFnZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN5Y2xlUGF0aCA9IGF3YWl0IHRoaXMuZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcyhuYW1lLCBtZXRhZGF0YS5hY3RpdmF0ZXMuYWdlbnRzKTtcbiAgICAgICAgaWYgKGN5Y2xlUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGN5Y2xlU3RhcnQgPSBjeWNsZVBhdGguaW5kZXhPZihjeWNsZVBhdGhbY3ljbGVQYXRoLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICBjb25zdCBjeWNsZSA9IGN5Y2xlUGF0aC5zbGljZShjeWNsZVN0YXJ0KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNi4gQWN0aXZhdGUgZWxlbWVudHMgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50czogUmVjb3JkPHN0cmluZywgQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICAgIGNvbnN0IGFjdGl2YXRpb25XYXJuaW5nczogQXJyYXk8eyBlbGVtZW50VHlwZTogc3RyaW5nOyBlbGVtZW50TmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+ID0gW107XG5cbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBbZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lc10gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEuYWN0aXZhdGVzKSkge1xuICAgICAgICAgIGlmICghZWxlbWVudE5hbWVzIHx8IGVsZW1lbnROYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzW2VsZW1lbnRUeXBlXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50TmFtZSBvZiBlbGVtZW50TmFtZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50Q29udGVudChlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGV4ZWN1dGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50c1tlbGVtZW50VHlwZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogZWxlbWVudENvbnRlbnRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBISUdILTE6IFJlLXRocm93IGNpcmN1bGFyIGFjdGl2YXRpb24gZXJyb3JzIGltbWVkaWF0ZWx5IChJc3N1ZSAjMTA5KVxuICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgICAgICAgIGFjdGl2YXRpb25XYXJuaW5ncy5wdXNoKHsgZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nOiBmYWlsZWQgdG8gYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JyDigJQgJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZWxlbWVudHMgcmF0aGVyIHRoYW4gZmFpbGluZyBjb21wbGV0ZWx5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDcuIEJ1aWxkIHRoZSByZXN1bHQgd2l0aCBhbGwgY29udGV4dCAoaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgc2FmZXR5IHRpZXIpXG4gICAgICBjb25zdCByZXN1bHQ6IEV4ZWN1dGVBZ2VudFJlc3VsdCA9IHtcbiAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICBnb2FsOiByZW5kZXJlZEdvYWwsXG4gICAgICAgIGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgICBhY3RpdmF0aW9uV2FybmluZ3M6IGFjdGl2YXRpb25XYXJuaW5ncy5sZW5ndGggPiAwID8gYWN0aXZhdGlvbldhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgICAgICAvLyBJc3N1ZSAjMTI2OiBXYXJuIGFib3V0IHVubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgdGVtcGxhdGVXYXJuaW5nczogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHVubWF0Y2hlZFBsYWNlaG9sZGVycy5tYXAocCA9PiBgVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVyOiB7JHtwfX1gKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhdmFpbGFibGVUb29sczogbWV0YWRhdGEudG9vbHM/LmFsbG93ZWQgfHwgW10sXG4gICAgICAgIHN1Y2Nlc3NDcml0ZXJpYTogbWV0YWRhdGEuZ29hbC5zdWNjZXNzQ3JpdGVyaWEgfHwgW10sXG4gICAgICAgIHN5c3RlbVByb21wdDogbWV0YWRhdGEuc3lzdGVtUHJvbXB0LFxuICAgICAgICBzYWZldHlUaWVyOiAnYWR2aXNvcnknLCAvLyBEZWZhdWx0LCB3aWxsIGJlIHVwZGF0ZWQgYmVsb3dcbiAgICAgIH07XG5cbiAgICAgIC8vIDguIENyZWF0ZSBhbmQgcGVyc2lzdCB0aGUgZ29hbCBmb3IgTExNIHRyYWNraW5nXG4gICAgICAvLyBUaGlzIGFsbG93cyByZWNvcmRfYWdlbnRfc3RlcCB0byBmaW5kIGFuZCB1cGRhdGUgdGhlIGdvYWxcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBnb2FsIHVzaW5nIGFnZW50LmFkZEdvYWwoKSB3aGljaCBoYW5kbGVzIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvblxuICAgICAgY29uc3QgbmV3R29hbCA9IGFnZW50LmFkZEdvYWwoe1xuICAgICAgICBkZXNjcmlwdGlvbjogcmVuZGVyZWRHb2FsLFxuICAgICAgICBwcmlvcml0eTogJ21lZGl1bScsXG4gICAgICAgIGltcG9ydGFuY2U6IDUsXG4gICAgICAgIHVyZ2VuY3k6IDUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IGdvYWwgc3RhdHVzIHRvIGluX3Byb2dyZXNzIHNpbmNlIGV4ZWN1dGlvbiBoYXMgc3RhcnRlZFxuICAgICAgbmV3R29hbC5zdGF0dXMgPSAnaW5fcHJvZ3Jlc3MnO1xuXG4gICAgICBjb25zdCBleGVjU2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShleGVjU2FuaXRpemVkTmFtZSkpO1xuXG4gICAgICAvLyBTdG9yZSBnb2FsSWQgaW4gcmVzdWx0IGZvciBMTE0gdG8gdXNlIHdpdGggcmVjb3JkX2FnZW50X3N0ZXBcbiAgICAgIHJlc3VsdC5nb2FsSWQgPSBuZXdHb2FsLmlkO1xuXG4gICAgICAvLyBGaXggIzQ0NTogSW5jbHVkZSBzdGF0ZVZlcnNpb24gc28gc3Vic2VxdWVudCBjYWxscyBjYW4gZG8gdmVyc2lvbi1hd2FyZSBvcGVyYXRpb25zXG4gICAgICBjb25zdCBwb3N0U2F2ZVN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICAgIHJlc3VsdC5zdGF0ZVZlcnNpb24gPSBwb3N0U2F2ZVN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxO1xuXG4gICAgICAvLyBDYWxsIHZhbGlkYXRlR29hbFNlY3VyaXR5IGFuZCBhZGQgd2FybmluZ3MgdG8gcmVzdWx0XG4gICAgICBjb25zdCBzZWN1cml0eVZhbGlkYXRpb24gPSBhZ2VudC52YWxpZGF0ZUdvYWxTZWN1cml0eShyZW5kZXJlZEdvYWwpO1xuICAgICAgaWYgKHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncyAmJiBzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuc2VjdXJpdHlXYXJuaW5ncyA9IHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncztcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsbCBldmFsdWF0ZUNvbnN0cmFpbnRzIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQuY29uc3RyYWludHMgPSBhZ2VudC5ldmFsdWF0ZUNvbnN0cmFpbnRzKG5ld0dvYWwpO1xuXG4gICAgICAvLyBDYWxsIGFzc2Vzc1Jpc2sgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5yaXNrQXNzZXNzbWVudCA9IGFnZW50LmFzc2Vzc1Jpc2soJ2V4ZWN1dGUnLCBuZXdHb2FsLCB7fSk7XG5cbiAgICAgIC8vIENhbGwgY2FsY3VsYXRlUHJpb3JpdHlTY29yZSBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LnByaW9yaXR5U2NvcmUgPSBhZ2VudC5jYWxjdWxhdGVQcmlvcml0eVNjb3JlKG5ld0dvYWwpO1xuXG4gICAgICAvLyA5LiBEZXRlcm1pbmUgc2FmZXR5IHRpZXIgYmFzZWQgb24gcmlzayBhc3Nlc3NtZW50IGFuZCBzZWN1cml0eSB3YXJuaW5nc1xuICAgICAgLy8gKE5vdGU6IGV4ZWN1dGlvbkNvbnRleHQgYWxyZWFkeSBjcmVhdGVkIGVhcmxpZXIgZm9yIGNpcmN1bGFyIGRldGVjdGlvbilcbiAgICAgIGNvbnN0IHNhZmV0eVRpZXJSZXN1bHQgPSBkZXRlcm1pbmVTYWZldHlUaWVyKFxuICAgICAgICByZXN1bHQucmlza0Fzc2Vzc21lbnQ/LnNjb3JlIHx8IDAsXG4gICAgICAgIHJlc3VsdC5zZWN1cml0eVdhcm5pbmdzIHx8IFtdLFxuICAgICAgICByZW5kZXJlZEdvYWwsXG4gICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRyxcbiAgICAgICAgZXhlY3V0aW9uQ29udGV4dFxuICAgICAgKTtcblxuICAgICAgLy8gMTAuIFNldCBzYWZldHkgdGllciBhbmQgcmVsYXRlZCBmaWVsZHNcbiAgICAgIHJlc3VsdC5zYWZldHlUaWVyID0gc2FmZXR5VGllclJlc3VsdC50aWVyO1xuICAgICAgcmVzdWx0LnNhZmV0eVRpZXJSZXN1bHQgPSBzYWZldHlUaWVyUmVzdWx0O1xuICAgICAgcmVzdWx0LmV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuXG4gICAgICAvLyAxMS4gQWRkIHRpZXItc3BlY2lmaWMgcmVzcG9uc2VzXG4gICAgICBzd2l0Y2ggKHNhZmV0eVRpZXJSZXN1bHQudGllcikge1xuICAgICAgICBjYXNlICdjb25maXJtJzpcbiAgICAgICAgICByZXN1bHQuY29uZmlybWF0aW9uUmVxdWlyZWQgPSBjcmVhdGVDb25maXJtYXRpb25SZXF1ZXN0KFxuICAgICAgICAgICAgJ09wZXJhdGlvbiByZXF1aXJlcyBjb25maXJtYXRpb24nLFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd2ZXJpZnknOlxuICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZShcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9ycy5qb2luKCc7ICcpLFxuICAgICAgICAgICAgJ2Rpc3BsYXlfY29kZSdcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Rhbmdlcl96b25lJzpcbiAgICAgICAgICByZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQgPSBjcmVhdGVEYW5nZXJab25lT3BlcmF0aW9uKFxuICAgICAgICAgICAgJ2FnZW50X2V4ZWN1dGlvbicsXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnMuam9pbignOyAnKSxcbiAgICAgICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRy5kYW5nZXJab25lLmVuYWJsZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIEFsc28gYWRkIHZlcmlmaWNhdGlvbiBpZiBub3QgYmxvY2tlZFxuICAgICAgICAgIGlmICghcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkLmJsb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IHJlc3VsdC5kYW5nZXJab25lQmxvY2tlZC52ZXJpZmljYXRpb25SZXF1aXJlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYWR2aXNvcnknOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgYWN0aW9uIG5lZWRlZCBmb3IgYWR2aXNvcnkgdGllclxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9FWEVDVVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmV4ZWN1dGVBZ2VudCcsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRlZDogJHtuYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ30gKHNhZmV0eTogJHtzYWZldHlUaWVyUmVzdWx0LnRpZXJ9KWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgc2FmZXR5VGllcjogc2FmZXR5VGllclJlc3VsdC50aWVyLFxuICAgICAgICAgIHJpc2tTY29yZTogc2FmZXR5VGllclJlc3VsdC5yaXNrU2NvcmUsXG4gICAgICAgICAgcGFyYW1ldGVyS2V5czogT2JqZWN0LmtleXMocGFyYW1ldGVycyB8fCB7fSksXG4gICAgICAgICAgZ29hbENvdW50OiAobWV0YWRhdGEgYXMgYW55KS5nb2FsPy5wYXJhbWV0ZXJzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWN1cml0eSB2YWxpZGF0aW9uIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKS5cbiAgICogQ2hlY2tzIGZvciBwcm90b3R5cGUgcG9sbHV0aW9uLCBVbmljb2RlIGluamVjdGlvbiwgYW5kIG92ZXJzaXplZCBwYXlsb2Fkcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgQkVGT1JFIHRlbXBsYXRlIHJlbmRlcmluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eShwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIC8vIDEuIFByb3RvdHlwZSBwb2xsdXRpb24gY2hlY2sg4oCUIHJlamVjdCBkYW5nZXJvdXMga2V5c1xuICAgIGNvbnN0IEZPUkJJRERFTl9LRVlTID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyYW1ldGVycykpIHtcbiAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgUHJvdG90eXBlIHBvbGx1dGlvbiBhdHRlbXB0IHZpYSBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcmJpZGRlbiBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9JyAocG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb24pYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTGltaXQgcGFyYW1ldGVyIGNvdW50IHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvblxuICAgIGNvbnN0IE1BWF9QQVJBTUVURVJTID0gNTA7XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCA+IE1BWF9QQVJBTUVURVJTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvbyBtYW55IHBhcmFtZXRlcnM6ICR7T2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgJHtNQVhfUEFSQU1FVEVSU31gKTtcbiAgICB9XG5cbiAgICAvLyAzLiBVbmljb2RlIG5vcm1hbGl6YXRpb24gdmlhIElucHV0Tm9ybWFsaXplclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBJbnB1dE5vcm1hbGl6ZXIubm9ybWFsaXplKHBhcmFtZXRlcnMsICckLnBhcmFtZXRlcnMnKTtcbiAgICBpZiAobm9ybWFsaXplZC5oYXNIaWdoT3JDcml0aWNhbElzc3Vlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGVtcGxhdGUgcGFyYW1ldGVyIHNlY3VyaXR5IHZhbGlkYXRpb24gZmFpbGVkOiAke25vcm1hbGl6ZWQuZXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBub3JtYWxpemVkIHZhbHVlcyBiYWNrIChpbi1wbGFjZSwgc2luY2Ugd2UgYWxyZWFkeSBjbG9uZWQpXG4gICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVkLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZERhdGEpKSB7XG4gICAgICBwYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignVGVtcGxhdGUgcGFyYW1ldGVyIG5vcm1hbGl6YXRpb24gd2FybmluZ3MnLCB7XG4gICAgICAgIHdhcm5pbmdzOiBub3JtYWxpemVkLndhcm5pbmdzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBnb2FsIHBhcmFtZXRlciBzY2hlbWFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJzKFxuICAgIGdvYWxDb25maWc6IEFnZW50R29hbENvbmZpZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb250ZXh0OiB7XG4gICAgICBhZ2VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBvcGVyYXRpb25OYW1lPzogJ2V4ZWN1dGVfYWdlbnQnIHwgJ2NvbnRpbnVlX2V4ZWN1dGlvbic7XG4gICAgfSA9IHt9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtRGVmcyA9IGdvYWxDb25maWcucGFyYW1ldGVycyB8fCBbXTtcbiAgICBjb25zdCByZXF1aXJlZFBhcmFtTmFtZXMgPSBwYXJhbURlZnNcbiAgICAgIC5maWx0ZXIocGFyYW1EZWYgPT4gcGFyYW1EZWYucmVxdWlyZWQpXG4gICAgICAubWFwKHBhcmFtRGVmID0+IHBhcmFtRGVmLm5hbWUpO1xuXG4gICAgLy8gQ2hlY2sgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHByZXNlbnRcbiAgICBjb25zdCBtaXNzaW5nUmVxdWlyZWQgPSByZXF1aXJlZFBhcmFtTmFtZXMuZmlsdGVyKHBhcmFtTmFtZSA9PiAhKHBhcmFtTmFtZSBpbiBwYXJhbWV0ZXJzKSk7XG4gICAgaWYgKG1pc3NpbmdSZXF1aXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHRoaXMuZm9ybWF0TWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyc0Vycm9yKFxuICAgICAgICAgIG1pc3NpbmdSZXF1aXJlZCxcbiAgICAgICAgICByZXF1aXJlZFBhcmFtTmFtZXMsXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFR5cGUgY2hlY2sgcHJvdmlkZWQgcGFyYW1ldGVyc1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpKSB7XG4gICAgICBjb25zdCBwYXJhbURlZiA9IHBhcmFtRGVmcy5maW5kKHAgPT4gcC5uYW1lID09PSBrZXkpO1xuICAgICAgaWYgKCFwYXJhbURlZikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5rbm93biBwYXJhbWV0ZXIgJyR7a2V5fScgcHJvdmlkZWQgdG8gYWdlbnRgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGUgdmFsaWRhdGlvblxuICAgICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmIChwYXJhbURlZi50eXBlID09PSAnc3RyaW5nJyAmJiBhY3R1YWxUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbURlZi50eXBlID09PSAnbnVtYmVyJyAmJiBhY3R1YWxUeXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgbnVtYmVyLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbURlZi50eXBlID09PSAnYm9vbGVhbicgJiYgYWN0dWFsVHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWR2aXNvcnkgbGVuZ3RoIHdhcm5pbmcgZm9yIHN0cmluZyB2YWx1ZXMgKGRlZmVuc2UtaW4tZGVwdGgsIGRvZXMgbm90IHRocm93KVxuICAgICAgaWYgKGFjdHVhbFR5cGUgPT09ICdzdHJpbmcnICYmICh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCA+IEFHRU5UX0xJTUlUUy5NQVhfR09BTF9MRU5HVEgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1BhcmFtZXRlciBzdHJpbmcgdmFsdWUgZXhjZWVkcyBNQVhfR09BTF9MRU5HVEggKGFkdmlzb3J5KScsIHtcbiAgICAgICAgICBwYXJhbU5hbWU6IGtleSxcbiAgICAgICAgICB2YWx1ZUxlbmd0aDogKHZhbHVlIGFzIHN0cmluZykubGVuZ3RoLFxuICAgICAgICAgIG1heExlbmd0aDogQUdFTlRfTElNSVRTLk1BWF9HT0FMX0xFTkdUSCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVmYXVsdHMgZm9yIG9wdGlvbmFsIHBhcmFtZXRlcnMgbm90IHByb3ZpZGVkXG4gICAgZm9yIChjb25zdCBwYXJhbURlZiBvZiBwYXJhbURlZnMpIHtcbiAgICAgIGlmICghcGFyYW1EZWYucmVxdWlyZWQgJiYgIShwYXJhbURlZi5uYW1lIGluIHBhcmFtZXRlcnMpICYmIHBhcmFtRGVmLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbWV0ZXJzW3BhcmFtRGVmLm5hbWVdID0gcGFyYW1EZWYuZGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW4gYWN0aW9uYWJsZSBtaXNzaW5nLXBhcmFtZXRlciBlcnJvciBmb3IgZXhlY3V0ZS9jb250aW51ZSBjYWxscy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyc0Vycm9yKFxuICAgIG1pc3NpbmdSZXF1aXJlZDogc3RyaW5nW10sXG4gICAgcmVxdWlyZWRQYXJhbU5hbWVzOiBzdHJpbmdbXSxcbiAgICBjb250ZXh0OiB7XG4gICAgICBhZ2VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBvcGVyYXRpb25OYW1lPzogJ2V4ZWN1dGVfYWdlbnQnIHwgJ2NvbnRpbnVlX2V4ZWN1dGlvbic7XG4gICAgfVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGFnZW50U3VmZml4ID0gY29udGV4dC5hZ2VudE5hbWUgPyBgIGZvciBhZ2VudCAnJHtjb250ZXh0LmFnZW50TmFtZX0nYCA6ICcnO1xuICAgIGxldCBtZXNzYWdlID1cbiAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMke2FnZW50U3VmZml4fTogJHttaXNzaW5nUmVxdWlyZWQuam9pbignLCAnKX0uYDtcblxuICAgIGlmIChyZXF1aXJlZFBhcmFtTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgbWVzc2FnZSArPSBgIFJlcXVpcmVkIGdvYWwgcGFyYW1ldGVyczogJHtyZXF1aXJlZFBhcmFtTmFtZXMuam9pbignLCAnKX0uYDtcbiAgICB9XG5cbiAgICBtZXNzYWdlICs9ICcgRGlzY292ZXIgdGhlIGZ1bGwgZXhlY3V0aW9uIGNvbnRyYWN0IHZpYSBtY3BfYXFsX3JlYWQgaW50cm9zcGVjdDogJyArXG4gICAgICAneyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImV4ZWN1dGVfYWdlbnRcIiB9IH0uJztcblxuICAgIGlmIChjb250ZXh0Lm9wZXJhdGlvbk5hbWUgPT09ICdjb250aW51ZV9leGVjdXRpb24nKSB7XG4gICAgICBtZXNzYWdlICs9ICcgSWYgeW91IGFyZSByZXBvcnRpbmcgcHJvZ3Jlc3MgYWZ0ZXIgZXhlY3V0ZV9hZ2VudCwgdXNlICcgK1xuICAgICAgICAnbWNwX2FxbF9jcmVhdGUgcmVjb3JkX2V4ZWN1dGlvbl9zdGVwIGluc3RlYWQuIGNvbnRpbnVlX2V4ZWN1dGlvbiBpcyBvbmx5ICcgK1xuICAgICAgICAnZm9yIHJlc3VtaW5nIGEgcHJldmlvdXNseSBwYXVzZWQgZXhlY3V0aW9uIGFuZCBzdGlsbCByZXF1aXJlcyB0aGUgc2FtZSAnICtcbiAgICAgICAgJ2dvYWwgcGFyYW1ldGVycyBhcyBleGVjdXRlX2FnZW50Lic7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGdvYWwgdGVtcGxhdGUgYnkgcmVwbGFjaW5nIHtwYXJhbWV0ZXJ9IHBsYWNlaG9sZGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJHb2FsVGVtcGxhdGUoXG4gICAgdGVtcGxhdGU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBzdHJpbmcge1xuICAgIGxldCByZW5kZXJlZCA9IHRlbXBsYXRlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpKSB7XG4gICAgICAvLyBFc2NhcGUga2V5IHRvIHByZXZlbnQgcmVnZXggbWV0YWNoYXJhY3RlcnMgZnJvbSBjYXVzaW5nIFJlRG9TIChJc3N1ZSAjMTAzKVxuICAgICAgY29uc3QgZXNjYXBlZEtleSA9IFNhZmVSZWdleC5lc2NhcGUoa2V5KTtcbiAgICAgIHJlbmRlcmVkID0gcmVuZGVyZWQucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxceyR7ZXNjYXBlZEtleX1cXFxcfWAsICdnJyksIFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8vIENhcCByZW5kZXJlZCBnb2FsIGxlbmd0aCB0byBwcmV2ZW50IG92ZXJzaXplZCBwYXlsb2Fkc1xuICAgIGlmIChyZW5kZXJlZC5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RIKSB7XG4gICAgICBsb2dnZXIud2FybignUmVuZGVyZWQgZ29hbCBleGNlZWRzIE1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCwgdHJ1bmNhdGluZycsIHtcbiAgICAgICAgcmVuZGVyZWRMZW5ndGg6IHJlbmRlcmVkLmxlbmd0aCxcbiAgICAgICAgbWF4TGVuZ3RoOiBBR0VOVF9MSU1JVFMuTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RILFxuICAgICAgfSk7XG4gICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnN1YnN0cmluZygwLCBBR0VOVF9MSU1JVFMuTUFYX1JFTkRFUkVEX0dPQUxfTEVOR1RIKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHVubWF0Y2hlZCB7cGxhY2Vob2xkZXJ9IHBhdHRlcm5zIHJlbWFpbmluZyBhZnRlciB0ZW1wbGF0ZSByZW5kZXJpbmcuXG4gICAqIFJldHVybnMgYXJyYXkgb2YgcGxhY2Vob2xkZXIgbmFtZXMgZm91bmQgaW4gdGhlIHJlbmRlcmVkIHN0cmluZy5cbiAgICogSXNzdWUgIzEyNjogV2FybiB3aGVuIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIG1pc3NpbmcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFVubWF0Y2hlZFBsYWNlaG9sZGVycyhyZW5kZXJlZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyUGF0dGVybiA9IC9cXHsoW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXH0vZztcbiAgICBjb25zdCB1bm1hdGNoZWQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIHdoaWxlICgobWF0Y2ggPSBwbGFjZWhvbGRlclBhdHRlcm4uZXhlYyhyZW5kZXJlZCkpICE9PSBudWxsKSB7XG4gICAgICB1bm1hdGNoZWQucHVzaChtYXRjaFsxXSk7XG4gICAgfVxuICAgIHJldHVybiB1bm1hdGNoZWQ7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBhIGNvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZSBmb3IgY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24uXG4gICAqIFVzZWQgYnkgYm90aCB0aGUgc3RhdGljIHByZS1mbGlnaHQgY2hlY2sgYW5kIHRoZSBydW50aW1lIGNoYWluIGNoZWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0Q2lyY3VsYXJBY3RpdmF0aW9uRXJyb3IoY3ljbGVQYXRoOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgYWdlbnROYW1lID0gY3ljbGVQYXRoW2N5Y2xlUGF0aC5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gKFxuICAgICAgYENpcmN1bGFyIGFnZW50IGFjdGl2YXRpb24gZGV0ZWN0ZWQgKGN5Y2xlIG9mICR7Y3ljbGVQYXRoLmxlbmd0aCAtIDF9KTogYCArXG4gICAgICBgJHtjeWNsZVBhdGguam9pbignIOKGkiAnKX0uIGAgK1xuICAgICAgYEFnZW50ICcke2FnZW50TmFtZX0nIGNhbm5vdCBhY3RpdmF0ZSBpdHNlbGYgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTYWZldHkgbGltaXRzIGZvciBhY3RpdmF0aW9uIGdyYXBoIHRyYXZlcnNhbCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfQUNUSVZBVElPTl9ERVBUSCA9IDEwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfTk9ERVNfVklTSVRFRCA9IDEwMDtcblxuICAvKipcbiAgICogU3RhdGljIGFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIOKAlCBMYXllciAxIG9mIGR1YWwtZGV0ZWN0aW9uIHN0cmF0ZWd5IChJc3N1ZSAjMzc0KVxuICAgKlxuICAgKiBQZXJmb3JtcyBhc3luYyBERlMgb24gdGhlIGFjdGl2YXRpb24gZ3JhcGggdG8gZGV0ZWN0IGN5Y2xlcyBCRUZPUkUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICogVGhpcyBpcyBhIHByZS1mbGlnaHQgY2hlY2sgdGhhdCBwcmV2ZW50cyBjaXJjdWxhciBhY3RpdmF0aW9uIGNoYWlucyBmcm9tIGJlaW5nIGF0dGVtcHRlZC5cbiAgICpcbiAgICogTGF5ZXIgMSAodGhpcyBtZXRob2QpOiBTdGF0aWMgZ3JhcGggYW5hbHlzaXMg4oCUIHdhbGtzIHRoZSBhY3RpdmF0aW9uIGdyYXBoIGZyb20gdGhlIHJvb3RcbiAgICogYWdlbnQsIGxvYWRpbmcgZWFjaCBhZ2VudCdzIGBhY3RpdmF0ZXMuYWdlbnRzYCBtZXRhZGF0YS4gQ2F0Y2hlcyBhbGwgY3ljbGVzIHJlYWNoYWJsZVxuICAgKiBmcm9tIHRoZSByb290IHdpdGhvdXQgZXhlY3V0aW5nIGFueSBhZ2VudHMuIEJvdW5kZWQgYnkgTUFYX0FDVElWQVRJT05fREVQVEggYW5kXG4gICAqIE1BWF9OT0RFU19WSVNJVEVEIHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvbiBmcm9tIGxhcmdlIGFjeWNsaWMgZ3JhcGhzLlxuICAgKlxuICAgKiBMYXllciAyIChnZXRFbGVtZW50Q29udGVudCBydW50aW1lIGNoZWNrKTogRGVmZW5zZS1pbi1kZXB0aCDigJQgZ3VhcmRzIGFnYWluc3QgZWRnZSBjYXNlc1xuICAgKiBsaWtlIGR5bmFtaWNhbGx5LWNvbnN0cnVjdGVkIGFjdGl2YXRpb24gY2hhaW5zIG9yIGFnZW50cyBtb2RpZmllZCBiZXR3ZWVuIHRoZSBzdGF0aWNcbiAgICogY2hlY2sgYW5kIGFjdHVhbCBleGVjdXRpb24uIFNlZSBnZXRFbGVtZW50Q29udGVudCBmb3IgZGV0YWlscy5cbiAgICpcbiAgICogQHBhcmFtIHJvb3ROYW1lIC0gVGhlIHJvb3QgYWdlbnQgbmFtZSBpbml0aWF0aW5nIHRoZSBhY3RpdmF0aW9uIGNoYWluXG4gICAqIEBwYXJhbSBhY3RpdmF0ZWRBZ2VudHMgLSBUaGUgaW1tZWRpYXRlIGFnZW50cyBhY3RpdmF0ZWQgYnkgdGhlIHJvb3RcbiAgICogQHJldHVybnMgVGhlIGN5Y2xlIHBhdGggYXJyYXkgaWYgYSBjeWNsZSBleGlzdHMsIG51bGwgb3RoZXJ3aXNlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRldGVjdEFjdGl2YXRpb25DeWNsZXMoXG4gICAgcm9vdE5hbWU6IHN0cmluZyxcbiAgICBhY3RpdmF0ZWRBZ2VudHM6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPiB7XG4gICAgLy8gQ2FjaGUgbG9hZGVkIGFnZW50cyB0byBhdm9pZCByZWR1bmRhbnQgSS9PIGR1cmluZyBERlNcbiAgICBjb25zdCBhZ2VudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdIHwgbnVsbD4oKTtcblxuICAgIC8vIEhlbHBlcjogbG9hZCBhbiBhZ2VudCdzIGFjdGl2YXRlcy5hZ2VudHMgbGlzdCAoY2FjaGVkKVxuICAgIGNvbnN0IGdldEFjdGl2YXRlZEFnZW50cyA9IGFzeW5jIChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChhZ2VudENhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgICAgcmV0dXJuIGFnZW50Q2FjaGUuZ2V0KGNhY2hlS2V5KSB8fCBbXTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50ICcke25hbWV9JyByZWZlcmVuY2VkIGluIGFjdGl2YXRlcy5hZ2VudHMgY291bGQgbm90IGJlIHJlc29sdmVkIGR1cmluZyBjeWNsZSBkZXRlY3Rpb25gKTtcbiAgICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG4gICAgICAgIGNvbnN0IGFnZW50cyA9IG1ldGEuYWN0aXZhdGVzPy5hZ2VudHMgfHwgW107XG4gICAgICAgIGFnZW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBhZ2VudHMpO1xuICAgICAgICByZXR1cm4gYWdlbnRzO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgcmVmZXJlbmNlZCBpbiBhY3RpdmF0ZXMuYWdlbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBkdXJpbmcgY3ljbGUgZGV0ZWN0aW9uYCk7XG4gICAgICAgIGFnZW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBUcmFja3Mgbm9kZXMgd2hvc2UgZW50aXJlIHN1YnRyZWUgaGFzIGJlZW4gZXhwbG9yZWQgd2l0aG91dCBmaW5kaW5nIGEgY3ljbGUuXG4gICAgLy8gUHJldmVudHMgZXhwb25lbnRpYWwgcmUtZXhwbG9yYXRpb24gaW4gZGlhbW9uZC9jb252ZXJnZW50IGdyYXBocy5cbiAgICBjb25zdCBmdWxseUV4cGxvcmVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IG5vZGVzVmlzaXRlZCA9IDA7XG5cbiAgICAvLyBERlMg4oCUIHN0YWNrIGVudHJpZXM6IFtjdXJyZW50QWdlbnQsIHBhdGhTb0ZhciwgcGF0aFNldExvd2VyXVxuICAgIC8vIHBhdGhTZXRMb3dlciBpcyBhIFNldDxzdHJpbmc+IG9mIGxvd2VyY2FzZWQgbmFtZXMgZm9yIE8oMSkgY3ljbGUgY2hlY2tzXG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PFtzdHJpbmcsIHN0cmluZ1tdLCBTZXQ8c3RyaW5nPl0+ID0gW107XG5cbiAgICBjb25zdCByb290TG93ZXIgPSByb290TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgYWN0aXZhdGVkQWdlbnRzKSB7XG4gICAgICAvLyBTZWxmLWxvb3A6IGFnZW50IGRpcmVjdGx5IGFjdGl2YXRlcyBpdHNlbGZcbiAgICAgIGlmIChjaGlsZC50b0xvd2VyQ2FzZSgpID09PSByb290TG93ZXIpIHtcbiAgICAgICAgcmV0dXJuIFtyb290TmFtZSwgY2hpbGRdO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aFNldCA9IG5ldyBTZXQ8c3RyaW5nPihbcm9vdExvd2VyLCBjaGlsZC50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICBzdGFjay5wdXNoKFtjaGlsZCwgW3Jvb3ROYW1lLCBjaGlsZF0sIHBhdGhTZXRdKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW2N1cnJlbnQsIGN1cnJlbnRQYXRoLCBwYXRoU2V0XSA9IHN0YWNrLnBvcCgpITtcblxuICAgICAgbm9kZXNWaXNpdGVkKys7XG4gICAgICBpZiAobm9kZXNWaXNpdGVkID4gQWdlbnRNYW5hZ2VyLk1BWF9OT0RFU19WSVNJVEVEKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiBmb3IgJyR7cm9vdE5hbWV9JyBhYm9ydGVkOiBleGNlZWRlZCAke0FnZW50TWFuYWdlci5NQVhfTk9ERVNfVklTSVRFRH0gbm9kZXMgdmlzaXRlZC4gYCArXG4gICAgICAgICAgYFRoZSBhY3RpdmF0aW9uIGdyYXBoIG1heSBiZSB0b28gbGFyZ2UuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRQYXRoLmxlbmd0aCA+IEFnZW50TWFuYWdlci5NQVhfQUNUSVZBVElPTl9ERVBUSCArIDEpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFjdGl2YXRpb24gY3ljbGUgZGV0ZWN0aW9uIGZvciAnJHtyb290TmFtZX0nIGhpdCBkZXB0aCBsaW1pdCBvZiAke0FnZW50TWFuYWdlci5NQVhfQUNUSVZBVElPTl9ERVBUSH0uIGAgK1xuICAgICAgICAgIGBTa2lwcGluZyBkZWVwZXIgYnJhbmNoZXMuYFxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudExvd2VyID0gY3VycmVudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGZ1bGx5RXhwbG9yZWQuaGFzKGN1cnJlbnRMb3dlcikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgdGhpcyBhZ2VudCdzIGFjdGl2YXRpb25zXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IGdldEFjdGl2YXRlZEFnZW50cyhjdXJyZW50KTtcblxuICAgICAgbGV0IGZvdW5kQ3ljbGUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgY2hpbGRMb3dlciA9IGNoaWxkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xlOiBkb2VzIHRoaXMgY2hpbGQgYXBwZWFyIGVhcmxpZXIgaW4gdGhlIHBhdGg/XG4gICAgICAgIGlmIChwYXRoU2V0LmhhcyhjaGlsZExvd2VyKSkge1xuICAgICAgICAgIHJldHVybiBbLi4uY3VycmVudFBhdGgsIGNoaWxkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZnVsbHlFeHBsb3JlZC5oYXMoY2hpbGRMb3dlcikpIHtcbiAgICAgICAgICBjb25zdCBuZXdQYXRoU2V0ID0gbmV3IFNldChwYXRoU2V0KTtcbiAgICAgICAgICBuZXdQYXRoU2V0LmFkZChjaGlsZExvd2VyKTtcbiAgICAgICAgICBzdGFjay5wdXNoKFtjaGlsZCwgWy4uLmN1cnJlbnRQYXRoLCBjaGlsZF0sIG5ld1BhdGhTZXRdKTtcbiAgICAgICAgICBmb3VuZEN5Y2xlID0gdHJ1ZTsgLy8gaGFzIGNoaWxkcmVuIHRvIGV4cGxvcmUsIG5vdCBmdWxseSBleHBsb3JlZCB5ZXRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyB1bmV4cGxvcmVkIGNoaWxkcmVuLCB0aGlzIG5vZGUncyBzdWJ0cmVlIGlzIGN5Y2xlLWZyZWVcbiAgICAgIGlmICghZm91bmRDeWNsZSkge1xuICAgICAgICBmdWxseUV4cGxvcmVkLmFkZChjdXJyZW50TG93ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb250ZW50IGZyb20gYW4gZWxlbWVudCAoZWxlbWVudC1hZ25vc3RpYylcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RWxlbWVudENvbnRlbnQoXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyxcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBFeGVjdXRpb25Db250ZXh0XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gR2V0IHRoZSBzdGF0aWMgcmVzb2x2ZXJcbiAgICBjb25zdCByZXNvbHZlciA9IEFnZW50TWFuYWdlci5nZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKCk7XG4gICAgaWYgKCFyZXNvbHZlcikge1xuICAgICAgbG9nZ2VyLndhcm4oYEVsZW1lbnQgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCAtIGNhbm5vdCBhY3RpdmF0ZSAke2VsZW1lbnRUeXBlfS8ke2VsZW1lbnROYW1lfWApO1xuICAgICAgcmV0dXJuIGBbRWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyIG5vdCBjb25maWd1cmVkIGZvciAke2VsZW1lbnRUeXBlfS8ke2VsZW1lbnROYW1lfV1gO1xuICAgIH1cblxuICAgIC8vIExheWVyIDIgKGRlZmVuc2UtaW4tZGVwdGgpOiBSdW50aW1lIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uIChJc3N1ZSAjMTA5KVxuICAgIC8vIFRoZSBzdGF0aWMgcHJlLWZsaWdodCBjaGVjayAoZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcywgbGF5ZXIgMSkgY2F0Y2hlcyBtb3N0IGN5Y2xlc1xuICAgIC8vIGJlZm9yZSBleGVjdXRpb24gYmVnaW5zLiBUaGlzIHJ1bnRpbWUgY2hlY2sgZ3VhcmRzIGFnYWluc3QgZWRnZSBjYXNlcyBzdWNoIGFzXG4gICAgLy8gZHluYW1pY2FsbHktY29uc3RydWN0ZWQgYWN0aXZhdGlvbiBjaGFpbnMgb3IgYWdlbnRzIG1vZGlmaWVkIGJldHdlZW4gdGhlIHN0YXRpY1xuICAgIC8vIGNoZWNrIGFuZCBhY3R1YWwgZXhlY3V0aW9uLiBVc2VzIGV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbiB3aGljaCB0cmFja3MgdGhlXG4gICAgLy8gY3VycmVudCBleGVjdXRpb24gcGF0aCDigJQgZWZmZWN0aXZlIGZvciBkaXJlY3QgYW5kIG11bHRpLWhvcCBjaGFpbnMgd2l0aGluIGFcbiAgICAvLyBzaW5nbGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSAnYWdlbnRzJyAmJiBleGVjdXRpb25Db250ZXh0Py5hZ2VudENoYWluKSB7XG4gICAgICBjb25zdCBjaGFpblNldCA9IG5ldyBTZXQoZXhlY3V0aW9uQ29udGV4dC5hZ2VudENoYWluLm1hcChuYW1lID0+IG5hbWUudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBlbGVtZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoY2hhaW5TZXQuaGFzKG5vcm1hbGl6ZWROYW1lKSkge1xuICAgICAgICBjb25zdCBjeWNsZVBhdGggPSBbLi4uZXhlY3V0aW9uQ29udGV4dC5hZ2VudENoYWluLCBlbGVtZW50TmFtZV07XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihBZ2VudE1hbmFnZXIuZm9ybWF0Q2lyY3VsYXJBY3RpdmF0aW9uRXJyb3IoY3ljbGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIE1hcCBwbHVyYWwgZWxlbWVudCB0eXBlcyB0byBtYW5hZ2VyIG5hbWVzXG4gICAgICBjb25zdCBtYW5hZ2VyTmFtZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgcGVyc29uYXM6ICdQZXJzb25hTWFuYWdlcicsXG4gICAgICAgIHNraWxsczogJ1NraWxsTWFuYWdlcicsXG4gICAgICAgIG1lbW9yaWVzOiAnTWVtb3J5TWFuYWdlcicsXG4gICAgICAgIHRlbXBsYXRlczogJ1RlbXBsYXRlTWFuYWdlcicsXG4gICAgICAgIGVuc2VtYmxlczogJ0Vuc2VtYmxlTWFuYWdlcicsXG4gICAgICAgIGFnZW50czogJ0FnZW50TWFuYWdlcidcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hbmFnZXJOYW1lID0gbWFuYWdlck5hbWVNYXBbZWxlbWVudFR5cGVdO1xuICAgICAgaWYgKCFtYW5hZ2VyTmFtZSkge1xuICAgICAgICBsb2dnZXIud2FybihgVW5rbm93biBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG4gICAgICAgIHJldHVybiBgW1Vua25vd24gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfV1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYW5hZ2VyID0gcmVzb2x2ZXIobWFuYWdlck5hbWUpO1xuICAgICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBNYW5hZ2VyIG5vdCBmb3VuZCBmb3IgZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWApO1xuICAgICAgICByZXR1cm4gYFtNYW5hZ2VyIG5vdCBmb3VuZDogJHttYW5hZ2VyTmFtZX1dYDtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IGFsbCBlbGVtZW50cyBvZiB0aGlzIHR5cGVcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgbWFuYWdlci5saXN0KCk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHMuZmluZCgoZTogYW55KSA9PiBlLm1ldGFkYXRhLm5hbWUgPT09IGVsZW1lbnROYW1lKTtcblxuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JyBub3QgZm91bmRgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGFwcHJvcHJpYXRlIGNvbnRlbnQgYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgICBzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3BlcnNvbmFzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5jb250ZW50IHx8ICcnO1xuXG4gICAgICAgIGNhc2UgJ3NraWxscyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuXG4gICAgICAgIGNhc2UgJ21lbW9yaWVzJzoge1xuICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBlbGVtZW50LmdldEVudHJpZXMoKTtcbiAgICAgICAgICByZXR1cm4gYE1lbW9yeSAnJHtlbGVtZW50TmFtZX0nIHdpdGggJHtlbnRyaWVzLmxlbmd0aH0gZW50cmllc2A7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICd0ZW1wbGF0ZXMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50LmNvbnRlbnQgfHwgJyc7XG5cbiAgICAgICAgY2FzZSAnZW5zZW1ibGVzJzoge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRMaXN0ID0gT2JqZWN0LmVudHJpZXMoZWxlbWVudC5lbGVtZW50cyB8fCB7fSlcbiAgICAgICAgICAgIC5tYXAoKFt0eXBlLCBuYW1lc10pID0+IGAke3R5cGV9OiAke0FycmF5LmlzQXJyYXkobmFtZXMpID8gbmFtZXMuam9pbignLCAnKSA6IFN0cmluZyhuYW1lcyl9YClcbiAgICAgICAgICAgIC5qb2luKCc7ICcpO1xuICAgICAgICAgIHJldHVybiBgRW5zZW1ibGUgJyR7ZWxlbWVudE5hbWV9JyBhY3RpdmF0ZXM6ICR7ZWxlbWVudExpc3R9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2FnZW50cyc6IHtcbiAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBlbGVtZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gYFtDb250ZW50IG5vdCBhdmFpbGFibGUgZm9yICR7ZWxlbWVudFR5cGV9XWA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3IgZ2V0dGluZyBjb250ZW50IGZvciAke2VsZW1lbnRUeXBlfSAnJHtlbGVtZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhY3RpdmUgc2V0IGNsZWFudXAgaXMgbmVlZGVkIGFuZCBwZXJmb3JtIGNsZWFudXAgaWYgbmVjZXNzYXJ5XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTogdm9pZCB7XG4gICAgY29uc3QgeyBtYXgsIGNsZWFudXBUaHJlc2hvbGQgfSA9IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZygnYWdlbnRzJyk7XG5cbiAgICAvLyBCZWxvdyB0aHJlc2hvbGQg4oCUIG5vIGFjdGlvbiBuZWVkZWRcbiAgICBpZiAodGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemUgPCBjbGVhbnVwVGhyZXNob2xkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgbWF4IOKAlCB3YXJuIGJlZm9yZSBjbGVhbnVwXG4gICAgaWYgKHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplID49IG1heCkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBBY3RpdmUgYWdlbnRzIGxpbWl0IHJlYWNoZWQgKCR7bWF4fSkuIGAgK1xuICAgICAgICBgQ29uc2lkZXIgZGVhY3RpdmF0aW5nIHVudXNlZCBhZ2VudHMgb3Igc2V0dGluZyBET0xMSE9VU0VfTUFYX0FDVElWRV9BR0VOVFMgdG8gYSBoaWdoZXIgdmFsdWUuYFxuICAgICAgKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQUdFTlRfQUNUSVZBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0JyxcbiAgICAgICAgZGV0YWlsczogYEFjdGl2ZSBhZ2VudHMgbGltaXQgcmVhY2hlZCAoJHt0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZX0vJHttYXh9KWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWN0aXZlQ291bnQ6IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplLFxuICAgICAgICAgIG1heEFsbG93ZWQ6IG1heCxcbiAgICAgICAgICBhY3RpdmVBZ2VudE5hbWVzOiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlQWdlbnROYW1lcyksXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIHRocmVzaG9sZCDigJQgcHJvYWN0aXZlbHkgY2xlYW4gc3RhbGUgZW50cmllc1xuICAgIHZvaWQgdGhpcy5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBzdGFsZSBlbnRyaWVzIGZyb20gYWN0aXZlIGFnZW50cyBzZXRcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTaXplID0gdGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemU7XG4gICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWdlbnROYW1lcyA9IG5ldyBTZXQoYWdlbnRzLm1hcChhID0+IGEubWV0YWRhdGEubmFtZSkpO1xuXG4gICAgICBjb25zdCBzdGFsZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhY3RpdmVOYW1lIG9mIHRoaXMuYWN0aXZlQWdlbnROYW1lcykge1xuICAgICAgICBpZiAoIWV4aXN0aW5nQWdlbnROYW1lcy5oYXMoYWN0aXZlTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuZGVsZXRlKGFjdGl2ZU5hbWUpO1xuICAgICAgICAgIHN0YWxlTmFtZXMucHVzaChhY3RpdmVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRTaXplID0gdGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemU7XG4gICAgICBjb25zdCByZW1vdmVkID0gc3RhcnRTaXplIC0gZW5kU2l6ZTtcblxuICAgICAgaWYgKHJlbW92ZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBDbGVhbmVkIHVwICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGFnZW50IHJlZmVyZW5jZShzKS4gYCArXG4gICAgICAgICAgYEFjdGl2ZSBhZ2VudHM6ICR7ZW5kU2l6ZX0vJHtnZXRNYXhBY3RpdmVMaW1pdCgnYWdlbnRzJyl9YFxuICAgICAgICApO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cycsXG4gICAgICAgICAgZGV0YWlsczogYFJlbW92ZWQgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgYWdlbnQgcmVmZXJlbmNlc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZCxcbiAgICAgICAgICAgIGFjdGl2ZUNvdW50OiBlbmRTaXplLFxuICAgICAgICAgICAgc3RhbGVOYW1lczogc3RhbGVOYW1lcy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYW51cCBzdGFsZSBhY3RpdmUgYWdlbnRzOicsIGVycm9yKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzJyxcbiAgICAgICAgZGV0YWlsczogYENsZWFudXAgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdCBhbiBhZ2VudCBzdGF0ZSBmaWxlIChZQU1MKS5cbiAgICpcbiAgICogSU1QUk9WRU1FTlQ6IE9wdGltaXN0aWMgbG9ja2luZyB3aXRoIHZlcnNpb24gY2hlY2tpbmcgKElzc3VlICMyNClcbiAgICogUHJldmVudHMgc3RhdGUgY29ycnVwdGlvbiBmcm9tIGNvbmN1cnJlbnQgdXBkYXRlcyBieSBjb21wYXJpbmcgdmVyc2lvbnNcbiAgICpcbiAgICogRklYOiBVc2VzIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBuYW1pbmdcbiAgICogVGhpcyBlbnN1cmVzIHN0YXRlIGZpbGVzIHVzZSBrZWJhYi1jYXNlIChlLmcuLCBcImNydWR2LWFnZW50LWRlbHRhLnN0YXRlLnlhbWxcIilcbiAgICogcmVnYXJkbGVzcyBvZiBpbnB1dCBuYW1lIGZvcm1hdCAoZS5nLiwgXCJDUlVEVi1BZ2VudC1EZWx0YVwiKVxuICAgKlxuICAgKiBGSVggKElzc3VlICMxMDcgLSBDUklULTIpOiBXcmFwIHJlYWQtY29tcGFyZS13cml0ZSBzZXF1ZW5jZSBpbiBmaWxlIGxvY2tcbiAgICogdG8gcHJldmVudCBUT0NUT1UgcmFjZSBjb25kaXRpb24gZnJvbSBjb25jdXJyZW50IGFnZW50IGV4ZWN1dGlvbnNcbiAgICpcbiAgICogRklYIChJc3N1ZSAjMTIzKTogVmVyc2lvbiBpbmNyZW1lbnRzIG9uIHN1Y2Nlc3NmdWwgc2F2ZSwgbm90IGR1cmluZyBvcGVyYXRpb25zXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBuZXcgc3RhdGUgdmVyc2lvbiBhZnRlciBzdWNjZXNzZnVsIHNhdmVcbiAgICogQHByb3RlY3RlZCBPbmx5IGFjY2Vzc2libGUgYnkgc3ViY2xhc3NlcyAoZS5nLiwgVGVzdGFibGVBZ2VudE1hbmFnZXIgZm9yIHRlc3RpbmcpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZUFnZW50U3RhdGUobmFtZTogc3RyaW5nLCBzdGF0ZTogQWdlbnRTdGF0ZSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTdGF0ZURpcmVjdG9yeSgpO1xuXG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIG5hbWluZ1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWApO1xuXG4gICAgLy8gRklYIChJc3N1ZSAjMTA3IC0gQ1JJVC0yKTogQWNxdWlyZSBmaWxlIGxvY2sgdG8gcHJldmVudCBUT0NUT1UgcmFjZSBjb25kaXRpb25cbiAgICAvLyBUaGUgbG9jayBjb3ZlcnMgdGhlIGVudGlyZSByZWFkLWNvbXBhcmUtd3JpdGUgc2VxdWVuY2UgdG8gZW5zdXJlIGF0b21pY2l0eVxuICAgIGF3YWl0IHRoaXMuZmlsZUxvY2tNYW5hZ2VyLndpdGhMb2NrKGBhZ2VudC1zdGF0ZToke25vcm1hbGl6ZWROYW1lfWAsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEZJWDogT3B0aW1pc3RpYyBsb2NraW5nIGNoZWNrIChJc3N1ZSAjMjQpXG4gICAgICAvLyBMb2FkIGV4aXN0aW5nIHN0YXRlIHRvIGNvbXBhcmUgdmVyc2lvbnMgYmVmb3JlIG92ZXJ3cml0aW5nXG4gICAgICBjb25zdCBleGlzdGluZ1N0YXRlID0gYXdhaXQgdGhpcy5sb2FkQWdlbnRTdGF0ZShuYW1lKTtcbiAgICAgIGlmIChleGlzdGluZ1N0YXRlICYmIGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgb3VyIHN0YXRlIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb25cbiAgICAgICAgLy8gSWYgdmVyc2lvbnMgZG9uJ3QgbWF0Y2gsIGl0IG1lYW5zIGFub3RoZXIgcHJvY2VzcyB1cGRhdGVkIHRoZSBzdGF0ZVxuICAgICAgICBpZiAoZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb24gPiBzdGF0ZS5zdGF0ZVZlcnNpb24pIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgU3RhdGUgdmVyc2lvbiBjb25mbGljdCBkZXRlY3RlZCBmb3IgYWdlbnQgJHtuYW1lfWAsIHtcbiAgICAgICAgICAgIGV4aXN0aW5nVmVyc2lvbjogZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb24sXG4gICAgICAgICAgICBhdHRlbXB0ZWRWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb25cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdNRU1PUllfU0FWRV9GQUlMRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLnNhdmVBZ2VudFN0YXRlJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0OiBhdHRlbXB0ZWQgdG8gc2F2ZSBzdGFsZSBzdGF0ZWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgICBhZ2VudE5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGV4aXN0aW5nVmVyc2lvbjogZXhpc3RpbmdTdGF0ZS5zdGF0ZVZlcnNpb24sXG4gICAgICAgICAgICAgIGF0dGVtcHRlZFZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFN0YXRlIHZlcnNpb24gY29uZmxpY3Q6IGN1cnJlbnQgdmVyc2lvbiBpcyAke2V4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9ufSwgYCArXG4gICAgICAgICAgICBgYnV0IGF0dGVtcHRlZCB0byBzYXZlIHZlcnNpb24gJHtzdGF0ZS5zdGF0ZVZlcnNpb259LiBgICtcbiAgICAgICAgICAgIGBTdGF0ZSBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGNvbmN1cnJlbnRseS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGSVggKElzc3VlICMxMjMpOiBJbmNyZW1lbnQgdmVyc2lvbiBCRUZPUkUgc2VyaWFsaXphdGlvbiwgbm90IGR1cmluZyBvcGVyYXRpb25zXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdmVyc2lvbiBvbmx5IGluY3JlbWVudHMgb24gc3VjY2Vzc2Z1bCBzYXZlXG4gICAgICBzdGF0ZS5zdGF0ZVZlcnNpb24gPSAoc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDApICsgMTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplZFN0YXRlID0gdGhpcy5wcmVwYXJlU3RhdGVGb3JTZXJpYWxpemF0aW9uKHN0YXRlKTtcblxuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmR1bXBZYW1sKHNlcmlhbGl6ZWRTdGF0ZSwge1xuICAgICAgICBzY2hlbWE6ICdqc29uJywgIC8vIEZpeCAjOTE0OiBmYWlsc2FmZSBjb3JydXB0cyBib29sZWFucy9udW1iZXJzIGluIGFnZW50IHN0YXRlXG4gICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgICAgc29ydEtleXM6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBzaXplXG4gICAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnZhbGlkYXRlU2l6ZSh5YW1sQ29udGVudCwgTUFYX1lBTUxfU0laRSwgJ0FnZW50IHN0YXRlJyk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sQ29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgbG9va3Vwc1xuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChub3JtYWxpemVkTmFtZSwgc3RhdGUpO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYEFnZW50IHN0YXRlIHNhdmVkIHN1Y2Nlc3NmdWxseWAsIHtcbiAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICBub3JtYWxpemVkTmFtZSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb24sXG4gICAgICAgIGdvYWxDb3VudDogc3RhdGUuZ29hbHM/Lmxlbmd0aCA/PyAwXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFJldHVybiB0aGUgbmV3IHZlcnNpb24gZm9yIGNhbGxlciB0byBzeW5jIGFnZW50J3MgaW50ZXJuYWwgc3RhdGVcbiAgICAvLyBzdGF0ZVZlcnNpb24gaXMgZ3VhcmFudGVlZCB0byBiZSBhIG51bWJlciBhZnRlciB0aGUgaW5jcmVtZW50IGFib3ZlXG4gICAgcmV0dXJuIHN0YXRlLnN0YXRlVmVyc2lvbiE7XG4gIH1cblxuICAvKipcbiAgICogVXRpbGl0eTogZW5zdXJlIGAubWRgIGV4dGVuc2lvbiBvbiByZXF1ZXN0ZWQgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgc3RyaXBFeHRlbnNpb24oZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBmaWxlUGF0aC5zbGljZSgwLCAtQUdFTlRfRklMRV9FWFRFTlNJT04ubGVuZ3RoKVxuICAgICAgOiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaHlkcmF0ZUFnZW50U3RhdGUoYWdlbnQ6IEFnZW50LCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMubG9hZEFnZW50U3RhdGUobmFtZSk7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnBhcnNlKGFnZW50LnNlcmlhbGl6ZVRvSlNPTigpKTtcbiAgICBzZXJpYWxpemVkLnN0YXRlID0gc3RhdGU7XG4gICAgYWdlbnQuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCkpO1xuICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQWdlbnRTdGF0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50U3RhdGUgfCBudWxsPiB7XG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIGxvb2t1cHNcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG5cbiAgICBpZiAodGhpcy5zdGF0ZUNhY2hlLmhhcyhub3JtYWxpemVkTmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlQ2FjaGUuZ2V0KG5vcm1hbGl6ZWROYW1lKSE7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVGaWxlbmFtZSA9IGAke25vcm1hbGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YDtcbiAgICBjb25zdCBzdGF0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5zdGF0ZURpciwgc3RhdGVGaWxlbmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoc3RhdGVQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIFlBTUwgcGFyc2luZ1xuICAgICAgLy8gU3RhdGUgZmlsZXMgYXJlIHB1cmUgWUFNTCBidXQgcGFyc2VGcm9udG1hdHRlciBoYW5kbGVzIGJvdGggZm9ybWF0c1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGNvbnRlbnQsIHtcbiAgICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmxvYWRBZ2VudFN0YXRlJ1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gcmVzdWx0LmRhdGEgYXMgQWdlbnRTdGF0ZTtcbiAgICAgIHRoaXMubm9ybWFsaXplTG9hZGVkU3RhdGUoc3RhdGUpO1xuICAgICAgLy8gRklYOiBVc2Ugbm9ybWFsaXplZCBuYW1lIGFzIGNhY2hlIGtleSBmb3IgY29uc2lzdGVudCBsb29rdXBzXG4gICAgICB0aGlzLnN0YXRlQ2FjaGUuc2V0KG5vcm1hbGl6ZWROYW1lLCBzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgYWdlbnQgc3RhdGU6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVN0YXRlRGlyZWN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuc3RhdGVEaXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHBhcnNlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxBZ2VudE1ldGFkYXRhPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB7IC4uLihkYXRhIGFzIGFueSkgfTtcblxuICAgIC8vIC0tLSBTVEFSVDogQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBGaXggZm9yIExlZ2FjeSBBZ2VudCBUeXBlcyAtLS1cbiAgICAvLyBMZWdhY3kgYWdlbnQgZGVmaW5pdGlvbiBmaWxlcyBtaWdodCB1c2UgJ2FnZW50JyAoc2luZ3VsYXIpIGluc3RlYWQgb2ZcbiAgICAvLyBFbGVtZW50VHlwZS5BR0VOVCAoJ2FnZW50cycpLiBUaGlzIGNvbnZlcnRzIHRoZSBzaW5ndWxhciBmb3JtIHRvIHRoZVxuICAgIC8vIGNvcnJlY3QgcGx1cmFsIGVudW0gdmFsdWUgdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAgaWYgKG1ldGFkYXRhLnR5cGUgPT09ICdhZ2VudCcpIHtcbiAgICAgIG1ldGFkYXRhLnR5cGUgPSBFbGVtZW50VHlwZS5BR0VOVDtcbiAgICB9XG4gICAgLy8gLS0tIEVORDogQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBGaXggLS0tXG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSB0eXBlIGlzIG5vdyBFbGVtZW50VHlwZS5BR0VOVCAocGx1cmFsKVxuICAgIGlmIChtZXRhZGF0YS50eXBlICYmIG1ldGFkYXRhLnR5cGUgIT09IEVsZW1lbnRUeXBlLkFHRU5UKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCB0eXBlOiBleHBlY3RlZCAnJHtFbGVtZW50VHlwZS5BR0VOVH0nLCBnb3QgJyR7bWV0YWRhdGEudHlwZX0nYCk7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBuYW1lIHZhbGlkYXRpb25cbiAgICBpZiAobWV0YWRhdGEubmFtZSkge1xuICAgICAgY29uc3QgbmFtZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KG1ldGFkYXRhLm5hbWUsIHtcbiAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RILFxuICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBpZiAoIW5hbWVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYWdlbnQgbmFtZTogJHtuYW1lUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLm5hbWUgPSBuYW1lUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZGVzY3JpcHRpb24gdmFsaWRhdGlvblxuICAgIC8vIEZJWDogTXVzdCBzcGVjaWZ5IGZpZWxkVHlwZTogJ2Rlc2NyaXB0aW9uJyB0byBhbGxvdyBwdW5jdHVhdGlvbiBsaWtlIGNvbG9ucywgc2VtaWNvbG9ucywgZXRjLlxuICAgIGlmIChtZXRhZGF0YS5kZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgZGVzY1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KG1ldGFkYXRhLmRlc2NyaXB0aW9uLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEgsXG4gICAgICAgIGFsbG93U3BhY2VzOiB0cnVlLFxuICAgICAgICBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbidcbiAgICAgIH0pO1xuICAgICAgaWYgKCFkZXNjUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IGRlc2NyaXB0aW9uOiAke2Rlc2NSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgbWV0YWRhdGEuZGVzY3JpcHRpb24gPSBkZXNjUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3Igc3BlY2lhbGl6YXRpb25zIGFycmF5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGVkU3BlY2lhbGl6YXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtZXRhZGF0YS5zcGVjaWFsaXphdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKHZhbHVlKSwge1xuICAgICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9UQUdfTEVOR1RILFxuICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNwZWNpYWxpemF0aW9uIFwiJHt2YWx1ZX1cIjogJHtyZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHZhbGlkYXRlZFNwZWNpYWxpemF0aW9ucy5wdXNoKHJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSEpO1xuICAgICAgfVxuICAgICAgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zID0gdmFsaWRhdGVkU3BlY2lhbGl6YXRpb25zO1xuICAgIH1cblxuICAgIC8vIEtFRVA6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSAoYWxyZWFkeSB1c2luZyBzZXJ2aWNlIHBhdHRlcm4pXG4gICAgaWYgKG1ldGFkYXRhLnRyaWdnZXJzICYmIEFycmF5LmlzQXJyYXkobWV0YWRhdGEudHJpZ2dlcnMpKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVUcmlnZ2VycyhcbiAgICAgICAgbWV0YWRhdGEudHJpZ2dlcnMsXG4gICAgICAgIEVsZW1lbnRUeXBlLkFHRU5ULFxuICAgICAgICBtZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJ1xuICAgICAgKTtcbiAgICAgIG1ldGFkYXRhLnRyaWdnZXJzID0gdmFsaWRhdGlvblJlc3VsdC52YWxpZFRyaWdnZXJzO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM2NzY6IFNhbml0aXplIGdhdGVrZWVwZXIgcG9saWN5IG9uIGxvYWQgdG8gcHJldmVudCBwcm9tcHQtaW5qZWN0aW9uIGF0dGFja3NcbiAgICAvLyBNYWxmb3JtZWQgcG9saWNpZXMgYXJlIHN0cmlwcGVkIGFuZCBsb2dnZWQgYXMgc2VjdXJpdHkgZXZlbnRzIChuZXZlciByZWFjaCBlbmZvcmNlbWVudClcbiAgICBpZiAobWV0YWRhdGEuZ2F0ZWtlZXBlcikge1xuICAgICAgbWV0YWRhdGEuZ2F0ZWtlZXBlciA9IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeShtZXRhZGF0YS5nYXRla2VlcGVyLCBtZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJywgJ2FnZW50JywgbWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM3MjI6IFZhbGlkYXRlIFYyIGFnZW50IGZpZWxkcyBvbiBsb2FkIOKAlCBzdHJ1Y3R1cmFsIGNoZWNrcywgc3RyaXAgbWFsZm9ybWVkIGRhdGEuXG4gICAgLy8gRmFpbC1vcGVuOiBjb3JydXB0ZWQgZmllbGRzIGFyZSByZW1vdmVkIGFuZCBsb2dnZWQsIG5vdCB0aHJvd24uIFRoaXMgcHJldmVudHNcbiAgICAvLyBiYWQgZGF0YSBmcm9tIHJlYWNoaW5nIGV4ZWN1dGlvbiB0aW1lIHdoaWxlIGtlZXBpbmcgdGhlIGFnZW50IGxvYWRhYmxlLlxuICAgIGNvbnN0IGFnZW50TmFtZSA9IG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nO1xuXG4gICAgLy8gSXNzdWUgIzY5NzogTm9ybWFsaXplIGBnb2Fsc2AgKHBsdXJhbCkg4oaSIGBnb2FsYCAoc2luZ3VsYXIpXG4gICAgaWYgKG1ldGFkYXRhLmdvYWxzICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuZ29hbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXRhZGF0YS5nb2FsID0gbWV0YWRhdGEuZ29hbHM7XG4gICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbHM7XG4gICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBtaWdyYXRlZCAnZ29hbHMnIChwbHVyYWwpIHRvICdnb2FsJ2ApO1xuICAgIH0gZWxzZSBpZiAobWV0YWRhdGEuZ29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gYGdvYWxgIGFscmVhZHkgc2V0IOKAlCBkcm9wIHRoZSByZWR1bmRhbnQgcGx1cmFsIGZvcm1cbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FscztcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuZ29hbCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5nb2FsID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gSXNzdWUgIzcyNTogTm9ybWFsaXplIHNuYWtlX2Nhc2UgZ29hbCBzdWItZmllbGRzXG4gICAgICAgIG5vcm1hbGl6ZUdvYWxLZXlzKG1ldGFkYXRhLmdvYWwgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcGFyYW1ldGVycyBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS5nb2FsLnBhcmFtZXRlcnMgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGdvYWwucGFyYW1ldGVycyBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsLnBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgc3VjY2Vzc0NyaXRlcmlhIGFycmF5IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGdvYWwuc3VjY2Vzc0NyaXRlcmlhIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXRhZGF0YS5nb2FsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBnb2FsIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0IHdpdGggdGVtcGxhdGUg4oCUIGFueXRoaW5nIGVsc2UgaXMgaW52YWxpZFxuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsIGlzIG1hbGZvcm1lZCAobm8gdGVtcGxhdGUpLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmFjdGl2YXRlcykge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hY3RpdmF0ZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYWN0aXZhdGVzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhY3RpdmF0ZXMgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5hY3RpdmF0ZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFYWNoIGtleSBzaG91bGQgbWFwIHRvIGEgc3RyaW5nIGFycmF5XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGFjdGl2YXRlcy4ke2tleX0gaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5hY3RpdmF0ZXNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEudG9vbHMpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEudG9vbHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEudG9vbHM7XG4gICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzLmFsbG93ZWQpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzLmFsbG93ZWQgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmcgdG9vbHNgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gR2FwIDM6IFZhbGlkYXRlIHRvb2xzLmRlbmllZCBpcyBhbiBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS50b29scy5kZW5pZWQgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5kZW5pZWQpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogdG9vbHMuZGVuaWVkIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzLmRlbmllZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzeXN0ZW1fcHJvbXB0IOKGkiBzeXN0ZW1Qcm9tcHQgKExMTXMgY29tbW9ubHkgdXNlIHNuYWtlX2Nhc2UpXG4gICAgY29uc3QgYW55TWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChhbnlNZXRhLnN5c3RlbV9wcm9tcHQgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYW55TWV0YS5zeXN0ZW1Qcm9tcHQgPSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQ7XG4gICAgfVxuICAgIGRlbGV0ZSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQ7XG5cbiAgICBpZiAobWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHN5c3RlbVByb21wdCBpcyBub3QgYSBzdHJpbmcsIHN0cmlwcGluZ2ApO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLnN5c3RlbVByb21wdDtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjk3OiBQcm9tb3RlIHJvb3QtbGV2ZWwgVjEgYXV0b25vbXkgZmllbGRzIGludG8gdGhlIGBhdXRvbm9teWAgYmxvY2suXG4gICAgLy8gVjEgYWdlbnRzIHN0b3JlZCByaXNrVG9sZXJhbmNlIGFuZCBtYXhBdXRvbm9tb3VzU3RlcHMgYXQgdGhlIG1ldGFkYXRhIHJvb3QuXG4gICAgLy8gVjIgbmVzdHMgdGhlbSB1bmRlciBgYXV0b25vbXlgLiBUaGlzIHByb21vdGlvbiBlbnN1cmVzIGRvd25zdHJlYW0gY29kZSBvbmx5XG4gICAgLy8gY2hlY2tzIG9uZSBsb2NhdGlvbi4gVGhlIGV4aXN0aW5nIGF1dG9ub215IHZhbGlkYXRpb24gYmVsb3cgdmFsaWRhdGVzIHZhbHVlcy5cbiAgICAvLyBQcmVjZWRlbmNlOiBjYW1lbENhc2UgdmFyaWFudHMgYXJlIGxpc3RlZCBiZWZvcmUgc25ha2VfY2FzZS9zaG9ydCBmb3Jtcywgc29cbiAgICAvLyBlLmcuIGByaXNrVG9sZXJhbmNlYCB3aW5zIG92ZXIgYHJpc2tfdG9sZXJhbmNlYCBpZiBib3RoIGFwcGVhciBhdCByb290LlxuICAgIHtcbiAgICAgIGNvbnN0IHJvb3RBdXRvbm9teUZpZWxkczogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgICAgICAgWydyaXNrVG9sZXJhbmNlJywgJ3Jpc2tUb2xlcmFuY2UnXSxcbiAgICAgICAgWydyaXNrX3RvbGVyYW5jZScsICdyaXNrVG9sZXJhbmNlJ10sXG4gICAgICAgIFsnbWF4QXV0b25vbW91c1N0ZXBzJywgJ21heEF1dG9ub21vdXNTdGVwcyddLFxuICAgICAgICBbJ21heF9hdXRvbm9tb3VzX3N0ZXBzJywgJ21heEF1dG9ub21vdXNTdGVwcyddLFxuICAgICAgICBbJ21heFN0ZXBzJywgJ21heEF1dG9ub21vdXNTdGVwcyddLFxuICAgICAgXSBhcyBjb25zdDtcbiAgICAgIGxldCBwcm9tb3RlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBbcm9vdEtleSwgYXV0b25vbXlLZXldIG9mIHJvb3RBdXRvbm9teUZpZWxkcykge1xuICAgICAgICBpZiAoYW55TWV0YVtyb290S2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5hdXRvbm9teSkge1xuICAgICAgICAgICAgbWV0YWRhdGEuYXV0b25vbXkgPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYUJsb2NrID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgaWYgKGFCbG9ja1thdXRvbm9teUtleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYUJsb2NrW2F1dG9ub215S2V5XSA9IGFueU1ldGFbcm9vdEtleV07XG4gICAgICAgICAgICBwcm9tb3RlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBhbnlNZXRhW3Jvb3RLZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvbW90ZWQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcHJvbW90ZWQgcm9vdC1sZXZlbCBhdXRvbm9teSBmaWVsZHMgaW50byBhdXRvbm9teSBibG9ja2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5hdXRvbm9teSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hdXRvbm9teSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hdXRvbm9teSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5hdXRvbm9teTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElzc3VlICM3MzA6IFNoYXJlZCBub3JtYWxpemF0aW9uICh3YXMgZHVwbGljYXRlZCBpbiBwYXJzZU1ldGFkYXRhICsgdmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZSlcbiAgICAgICAgY29uc3QgYSA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVBdXRvbm9teUtleXMoYSk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgc3BlY2lmaWMgZmllbGRzXG4gICAgICAgIC8vIEdhcCA0OiBWYWxpZGF0ZSByaXNrVG9sZXJhbmNlIGVudW0gKHVzZXMgc2hhcmVkIGNvbnN0YW50cyBmcm9tIElzc3VlICM3MjcpXG4gICAgICAgIGlmIChhLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2YoYS5yaXNrVG9sZXJhbmNlLCBSSVNLX1RPTEVSQU5DRV9MRVZFTFMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkucmlza1RvbGVyYW5jZSAnJHthLnJpc2tUb2xlcmFuY2V9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5yaXNrVG9sZXJhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkubWF4QXV0b25vbW91c1N0ZXBzIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEubWF4QXV0b25vbW91c1N0ZXBzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJlcXVpcmVzQXBwcm92YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoYS5yZXF1aXJlc0FwcHJvdmFsKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LnJlcXVpcmVzQXBwcm92YWwgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5yZXF1aXJlc0FwcHJvdmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmF1dG9BcHByb3ZlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGEuYXV0b0FwcHJvdmUpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkuYXV0b0FwcHJvdmUgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5hdXRvQXBwcm92ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5yZXNpbGllbmNlKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnJlc2lsaWVuY2UgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEucmVzaWxpZW5jZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZSBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnJlc2lsaWVuY2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvbiAod2FzIGR1cGxpY2F0ZWQgaW4gcGFyc2VNZXRhZGF0YSArIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUpXG4gICAgICAgIGNvbnN0IHIgPSBtZXRhZGF0YS5yZXNpbGllbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVSZXNpbGllbmNlS2V5cyhyKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNzI3OiBVc2Ugc2hhcmVkIGVudW0gY29uc3RhbnRzIGZvciByZXNpbGllbmNlIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKHIub25TdGVwTGltaXRSZWFjaGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25TdGVwTGltaXRSZWFjaGVkLCBTVEVQX0xJTUlUX0FDVElPTlMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5vblN0ZXBMaW1pdFJlYWNoZWQgJyR7ci5vblN0ZXBMaW1pdFJlYWNoZWR9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5vblN0ZXBMaW1pdFJlYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIub25FeGVjdXRpb25GYWlsdXJlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25FeGVjdXRpb25GYWlsdXJlLCBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2Uub25FeGVjdXRpb25GYWlsdXJlICcke3Iub25FeGVjdXRpb25GYWlsdXJlfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIub25FeGVjdXRpb25GYWlsdXJlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIubWF4UmV0cmllcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm1heFJldHJpZXMgaXMgbm90IGEgbnVtYmVyLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5tYXhSZXRyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heENvbnRpbnVhdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIubWF4Q29udGludWF0aW9ucyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm1heENvbnRpbnVhdGlvbnMgaXMgbm90IGEgbnVtYmVyLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5tYXhDb250aW51YXRpb25zO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdhcCA1OiBWYWxpZGF0ZSByZXRyeUJhY2tvZmYgZW51bSBhbmQgcHJlc2VydmVTdGF0ZSBib29sZWFuIChzaGFyZWQgY29uc3RhbnRzIGZyb20gSXNzdWUgIzcyNylcbiAgICAgICAgaWYgKHIucmV0cnlCYWNrb2ZmICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIucmV0cnlCYWNrb2ZmLCBCQUNLT0ZGX1NUUkFURUdJRVMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5yZXRyeUJhY2tvZmYgJyR7ci5yZXRyeUJhY2tvZmZ9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5yZXRyeUJhY2tvZmY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIucHJlc2VydmVTdGF0ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2Ygci5wcmVzZXJ2ZVN0YXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLnByZXNlcnZlU3RhdGUgaXMgbm90IGEgYm9vbGVhbiwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIucHJlc2VydmVTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRhZ3M6IHZhbGlkYXRlIGFzIHN0cmluZyBhcnJheSAoY29tbW9uIGZpZWxkLCBhbGwgZWxlbWVudCB0eXBlcylcbiAgICBpZiAobWV0YWRhdGEudGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudGFncykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogdGFncyBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEudGFncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFkYXRhLnRhZ3MgPSBtZXRhZGF0YS50YWdzLmZpbHRlcigodDogdW5rbm93bikgPT4gdHlwZW9mIHQgPT09ICdzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBBZ2VudE1ldGFkYXRhLCBib2R5Q29udGVudDogc3RyaW5nKTogQWdlbnQge1xuICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KG1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgLy8gRml4ICM5MTI6IFByZWZlciBleHBsaWNpdCBmb3JtYXRfdmVyc2lvbiBtYXJrZXIsIGZhbGwgYmFjayB0byBpbnN0cnVjdGlvbnMtcHJlc2VuY2UgY2hlY2tcbiAgICBkZWxldGUgKG1ldGFkYXRhIGFzIGFueSkuZm9ybWF0X3ZlcnNpb247ICAvLyBTdHJpcCBtYXJrZXIgZnJvbSBydW50aW1lIG1ldGFkYXRhXG4gICAgY29uc3QgbWV0YWRhdGFJbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgaWYgKG1ldGFkYXRhSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAvLyB2MiBmb3JtYXQ6IGluc3RydWN0aW9ucyBmcm9tIFlBTUwsIGJvZHkgaXMgY29udGVudCAocmVmZXJlbmNlIG1hdGVyaWFsKVxuICAgICAgYWdlbnQuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGFJbnN0cnVjdGlvbnM7XG4gICAgICBhZ2VudC5jb250ZW50ID0gYm9keUNvbnRlbnQudHJpbSgpO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdjEgZm9ybWF0OiBib2R5IHRleHQgbWFwcyB0byBpbnN0cnVjdGlvbnNcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IGJvZHlDb250ZW50LnRyaW0oKTtcbiAgICAgIGFnZW50LmNvbnRlbnQgPSAnJztcbiAgICB9XG4gICAgLy8gS2VlcCBleHRlbnNpb25zLmluc3RydWN0aW9ucyBmb3IgYmFja3dhcmQgY29tcGF0XG4gICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICBpbnN0cnVjdGlvbnM6IGFnZW50Lmluc3RydWN0aW9uc1xuICAgIH07XG4gICAgcmV0dXJuIGFnZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQ6IEFnZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBTdGFydCB3aXRoIGJhc2UgbWV0YWRhdGEgZmllbGRzIChhbHdheXMgcHJlc2VudClcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBuYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgdHlwZTogdG9TaW5ndWxhckxhYmVsKEVsZW1lbnRUeXBlLkFHRU5UKSxcbiAgICAgIHVuaXF1ZV9pZDogYWdlbnQuaWQsXG4gICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBhZ2VudC5tZXRhZGF0YS5jcmVhdGVkID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG1vZGlmaWVkOiBhZ2VudC5tZXRhZGF0YS5tb2RpZmllZCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBkZXNjcmlwdGlvbjogYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICBmb3JtYXRfdmVyc2lvbjogJ3YyJywgIC8vIEZpeCAjOTEyOiBFeHBsaWNpdCBmb3JtYXQgbWFya2VyXG4gICAgfTtcblxuICAgIC8vIENhc3QgdG8gY2hlY2sgZm9yIHYyIGZpZWxkc1xuICAgIGNvbnN0IG1ldGFkYXRhVjIgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAvLyBBZGQgdjIgZmllbGRzIGlmIHByZXNlbnQgKGdvYWwgaXMgcmVxdWlyZWQgaW4gdjIsIG90aGVycyBvcHRpb25hbClcbiAgICBpZiAobWV0YWRhdGFWMi5nb2FsKSB7XG4gICAgICBtZXRhZGF0YS5nb2FsID0gbWV0YWRhdGFWMi5nb2FsO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5hY3RpdmF0ZXMpIHtcbiAgICAgIG1ldGFkYXRhLmFjdGl2YXRlcyA9IG1ldGFkYXRhVjIuYWN0aXZhdGVzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi50b29scykge1xuICAgICAgbWV0YWRhdGEudG9vbHMgPSBtZXRhZGF0YVYyLnRvb2xzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5zeXN0ZW1Qcm9tcHQpIHtcbiAgICAgIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9IG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0O1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5hdXRvbm9teSkge1xuICAgICAgbWV0YWRhdGEuYXV0b25vbXkgPSBtZXRhZGF0YVYyLmF1dG9ub215O1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNDQ5OiBTZXJpYWxpemUgZ2F0ZWtlZXBlciBwb2xpY3kgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBtZXRhZGF0YVYyLmdhdGVrZWVwZXI7XG4gICAgfVxuICAgIC8vIElzc3VlICM1MjY6IFNlcmlhbGl6ZSByZXNpbGllbmNlIHBvbGljeSB0byBZQU1MIGZyb250bWF0dGVyXG4gICAgaWYgKG1ldGFkYXRhVjIucmVzaWxpZW5jZSkge1xuICAgICAgbWV0YWRhdGEucmVzaWxpZW5jZSA9IG1ldGFkYXRhVjIucmVzaWxpZW5jZTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzIyOiBPbmx5IHNlcmlhbGl6ZSB2MSBmaWVsZHMgZm9yIGFnZW50cyBXSVRIT1VUIGEgZ29hbCAobGVnYWN5IHYxIGFnZW50cykuXG4gICAgLy8gVjIgYWdlbnRzICh3aXRoIGdvYWwpIHNob3VsZCBub3QgY2FycnkgZGVwcmVjYXRlZCB2MSBiYWdnYWdlIGxpa2VcbiAgICAvLyBkZWNpc2lvbkZyYW1ld29yaywgcmlza1RvbGVyYW5jZSwgbGVhcm5pbmdFbmFibGVkLCBtYXhDb25jdXJyZW50R29hbHMuXG4gICAgLy8gVGhlIEFnZW50IGNvbnN0cnVjdG9yIHN0aWxsIGFwcGxpZXMgdGhlc2UgZGVmYXVsdHMgYXQgcnVudGltZSBmb3IgYmFja3dhcmRcbiAgICAvLyBjb21wYXQgd2hlbiByZWFkaW5nIG9sZCBmaWxlcyDigJQgYnV0IHdlIGRvbid0IHdyaXRlIHRoZW0gaW50byBuZXcgdjIgYWdlbnRzLlxuICAgIGNvbnN0IGlzVjJBZ2VudCA9ICEhbWV0YWRhdGFWMi5nb2FsO1xuICAgIGlmICghaXNWMkFnZW50KSB7XG4gICAgICBpZiAobWV0YWRhdGFWMi5kZWNpc2lvbkZyYW1ld29yaykge1xuICAgICAgICBtZXRhZGF0YS5kZWNpc2lvbkZyYW1ld29yayA9IG1ldGFkYXRhVjIuZGVjaXNpb25GcmFtZXdvcms7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5yaXNrVG9sZXJhbmNlKSB7XG4gICAgICAgIG1ldGFkYXRhLnJpc2tUb2xlcmFuY2UgPSBtZXRhZGF0YVYyLnJpc2tUb2xlcmFuY2U7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5sZWFybmluZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5sZWFybmluZ0VuYWJsZWQgPSBtZXRhZGF0YVYyLmxlYXJuaW5nRW5hYmxlZDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyLm1heENvbmN1cnJlbnRHb2FscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGFkYXRhLm1heENvbmN1cnJlbnRHb2FscyA9IG1ldGFkYXRhVjIubWF4Q29uY3VycmVudEdvYWxzO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBzcGVjaWFsaXphdGlvbnMgaXMgbm90IGEgZGVwcmVjYXRlZCB2MSBmaWVsZCDigJQgYWx3YXlzIHNlcmlhbGl6ZVxuICAgIGlmIChtZXRhZGF0YVYyLnNwZWNpYWxpemF0aW9ucykge1xuICAgICAgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zID0gbWV0YWRhdGFWMi5zcGVjaWFsaXphdGlvbnM7XG4gICAgfVxuICAgIC8vIElzc3VlICM3MjI6IFNlcmlhbGl6ZSB0YWdzIGFuZCB0cmlnZ2VycyB0byBZQU1MIGZyb250bWF0dGVyXG4gICAgaWYgKG1ldGFkYXRhVjIudGFncyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhVjIudGFncykgJiYgbWV0YWRhdGFWMi50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1ldGFkYXRhLnRhZ3MgPSBtZXRhZGF0YVYyLnRhZ3M7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLnRyaWdnZXJzKSB7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IG1ldGFkYXRhVjIudHJpZ2dlcnM7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLnJ1bGVFbmdpbmVDb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0YWRhdGEucnVsZUVuZ2luZUNvbmZpZyA9IG1ldGFkYXRhVjIucnVsZUVuZ2luZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyB2Mi4wIGZvcm1hdDogaW5zdHJ1Y3Rpb25zIGluIFlBTUwgZnJvbnRtYXR0ZXIsIGNvbnRlbnQgYXMgYm9keVxuICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFnZW50Lmluc3RydWN0aW9ucyB8fFxuICAgICAgKGFnZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyBhcyBzdHJpbmcgfCB1bmRlZmluZWQpIHx8XG4gICAgICB0aGlzLmJ1aWxkRGVmYXVsdEluc3RydWN0aW9ucyhhZ2VudCk7XG4gICAgaWYgKGluc3RydWN0aW9ucykge1xuICAgICAgbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICBjb25zdCBib2R5ID0gYWdlbnQuY29udGVudCB8fCB0aGlzLmJ1aWxkRGVmYXVsdEJvZHkoYWdlbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuY3JlYXRlRnJvbnRtYXR0ZXIobWV0YWRhdGEsIGJvZHksIHtcbiAgICAgIG1ldGhvZDogJ21hbnVhbCcsXG4gICAgICBzY2hlbWE6ICdqc29uJywgIC8vIFVzZSBKU09OIHNjaGVtYSB0byBwcmVzZXJ2ZSBib29sZWFucy9udW1iZXJzIGluIHYyIG1ldGFkYXRhXG4gICAgICBjbGVhbk1ldGFkYXRhOiB0cnVlLFxuICAgICAgY2xlYW5pbmdTdHJhdGVneTogJ3JlbW92ZS1ib3RoJywgIC8vIFJlbW92ZSBib3RoIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0SW5zdHJ1Y3Rpb25zKGFnZW50OiBBZ2VudCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZUhlYWRlciA9IGFnZW50Lm1ldGFkYXRhLm5hbWUgPyBgIyAke2FnZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuYCA6ICcnO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgcmV0dXJuIGAke25hbWVIZWFkZXJ9JHtkZXNjcmlwdGlvbn1gLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0Qm9keShhZ2VudDogQWdlbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoYWdlbnQubWV0YWRhdGEubmFtZSA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGxpbmVzLnB1c2goYCMgJHtuYW1lfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgbGluZXMucHVzaChkZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIHRleHQgdGhhdCBzaG91bGQgc2F0aXNmeSBjcmVhdGUtdGltZSBjb250ZW50IHZhbGlkYXRpb24uXG4gICAqIEJlaGF2aW9yYWwgaW5zdHJ1Y3Rpb25zIHJlbWFpbiB0aGUgcHJpbWFyeSBzb3VyY2UsIHdoaWxlIHJlZmVyZW5jZSBjb250ZW50XG4gICAqIGFjdHMgYXMgdGhlIGZhbGxiYWNrIGZvciBjb250ZW50LW9ubHkgYWdlbnQgY3JlYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGdldFByaW1hcnlWYWxpZGF0aW9uVGV4dChjb250ZW50OiBzdHJpbmcsIHJlZmVyZW5jZUNvbnRlbnQ6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycgJiYgY29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVmZXJlbmNlQ29udGVudCA9PT0gJ3N0cmluZycgJiYgcmVmZXJlbmNlQ29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHJlZmVyZW5jZUNvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcyNzogVmFsaWRhdGUgVjIgYWdlbnQgZmllbGRzIGF0IHdyaXRlIHRpbWUuXG4gICAqXG4gICAqIE5vcm1hbGl6ZXMgc25ha2VfY2FzZSDihpIgY2FtZWxDYXNlIChzYW1lIGFzIHBhcnNlTWV0YWRhdGEpIGFuZCB0aGVuIHZhbGlkYXRlc1xuICAgKiBzdHJ1Y3R1cmFsIGNvbnN0cmFpbnRzLiBVbmxpa2UgcGFyc2VNZXRhZGF0YSAod2hpY2ggc2lsZW50bHkgc3RyaXBzIGZvclxuICAgKiBiYWNrd2FyZCBjb21wYXQpLCB0aGlzIHJldHVybnMgZXJyb3JzIHNvIHRoZSBjYWxsZXIgY2FuIHJlamVjdCB0aGUgY3JlYXRlLlxuICAgKlxuICAgKiBNdXRhdGVzIHRoZSBtZXRhZGF0YSBpbiBwbGFjZSAobm9ybWFsaXphdGlvbiksIHJldHVybnMgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUobWV0YWRhdGE6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyAtLS0gdG9vbHMgLS0tXG4gICAgaWYgKG1ldGFkYXRhLnRvb2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEudG9vbHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMpIHx8IG1ldGFkYXRhLnRvb2xzID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCd0b29scyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIGFsbG93ZWQvZGVuaWVkIGFycmF5cycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzLmFsbG93ZWQpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ3Rvb2xzLmFsbG93ZWQgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS50b29scy5kZW5pZWQgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5kZW5pZWQpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ3Rvb2xzLmRlbmllZCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSBzeXN0ZW1Qcm9tcHQgLS0tXG4gICAgaWYgKG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcnMucHVzaCgnc3lzdGVtUHJvbXB0IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gICAgLy8gc25ha2VfY2FzZSB2YXJpYW50IChJc3N1ZSAjNzI1OiBub3JtYWxpemVkIGF0IGRpc3BhdGNoZXIgbGV2ZWwgZXZlbnR1YWxseSlcbiAgICBjb25zdCBhbnlNZXRhID0gbWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGFueU1ldGEuc3lzdGVtX3Byb21wdCAhPT0gdW5kZWZpbmVkICYmIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGFueU1ldGEuc3lzdGVtX3Byb21wdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID0gYW55TWV0YS5zeXN0ZW1fcHJvbXB0IGFzIHN0cmluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdzeXN0ZW1fcHJvbXB0IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQ7XG4gICAgfVxuXG4gICAgLy8gLS0tIGF1dG9ub215IC0tLVxuICAgIGlmIChtZXRhZGF0YS5hdXRvbm9teSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLmF1dG9ub215ICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmF1dG9ub215KSB8fCBtZXRhZGF0YS5hdXRvbm9teSA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgnYXV0b25vbXkgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElzc3VlICM3MzA6IFNoYXJlZCBub3JtYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IGEgPSBtZXRhZGF0YS5hdXRvbm9teSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgbm9ybWFsaXplQXV0b25vbXlLZXlzKGEpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIGFmdGVyIG5vcm1hbGl6YXRpb25cbiAgICAgICAgaWYgKGEucmlza1RvbGVyYW5jZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihhLnJpc2tUb2xlcmFuY2UsIFJJU0tfVE9MRVJBTkNFX0xFVkVMUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgYXV0b25vbXkucmlza1RvbGVyYW5jZSBtdXN0IGJlIG9uZSBvZjogJHtSSVNLX1RPTEVSQU5DRV9MRVZFTFMuam9pbignLCAnKX0gKGdvdCAnJHthLnJpc2tUb2xlcmFuY2V9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215Lm1heEF1dG9ub21vdXNTdGVwcyBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEucmVxdWlyZXNBcHByb3ZhbCAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KGEucmVxdWlyZXNBcHByb3ZhbCkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgnYXV0b25vbXkucmVxdWlyZXNBcHByb3ZhbCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hdXRvQXBwcm92ZSAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KGEuYXV0b0FwcHJvdmUpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ2F1dG9ub215LmF1dG9BcHByb3ZlIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIHJlc2lsaWVuY2UgLS0tXG4gICAgaWYgKG1ldGFkYXRhLnJlc2lsaWVuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5yZXNpbGllbmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnJlc2lsaWVuY2UpIHx8IG1ldGFkYXRhLnJlc2lsaWVuY2UgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ3Jlc2lsaWVuY2UgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElzc3VlICM3MzA6IFNoYXJlZCBub3JtYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHIgPSBtZXRhZGF0YS5yZXNpbGllbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVSZXNpbGllbmNlS2V5cyhyKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBhZnRlciBub3JtYWxpemF0aW9uXG4gICAgICAgIGlmIChyLm9uU3RlcExpbWl0UmVhY2hlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uU3RlcExpbWl0UmVhY2hlZCwgU1RFUF9MSU1JVF9BQ1RJT05TKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLm9uU3RlcExpbWl0UmVhY2hlZCBtdXN0IGJlIG9uZSBvZjogJHtTVEVQX0xJTUlUX0FDVElPTlMuam9pbignLCAnKX0gKGdvdCAnJHtyLm9uU3RlcExpbWl0UmVhY2hlZH0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm9uRXhlY3V0aW9uRmFpbHVyZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhaXNPbmVPZihyLm9uRXhlY3V0aW9uRmFpbHVyZSwgRVhFQ1VUSU9OX0ZBSUxVUkVfQUNUSU9OUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5vbkV4ZWN1dGlvbkZhaWx1cmUgbXVzdCBiZSBvbmUgb2Y6ICR7RVhFQ1VUSU9OX0ZBSUxVUkVfQUNUSU9OUy5qb2luKCcsICcpfSAoZ290ICcke3Iub25FeGVjdXRpb25GYWlsdXJlfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIubWF4UmV0cmllcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiByLm1heFJldHJpZXMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ3Jlc2lsaWVuY2UubWF4UmV0cmllcyBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIubWF4Q29udGludWF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiByLm1heENvbnRpbnVhdGlvbnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ3Jlc2lsaWVuY2UubWF4Q29udGludWF0aW9ucyBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIucmV0cnlCYWNrb2ZmICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIucmV0cnlCYWNrb2ZmLCBCQUNLT0ZGX1NUUkFURUdJRVMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2UucmV0cnlCYWNrb2ZmIG11c3QgYmUgb25lIG9mOiAke0JBQ0tPRkZfU1RSQVRFR0lFUy5qb2luKCcsICcpfSAoZ290ICcke3IucmV0cnlCYWNrb2ZmfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIucHJlc2VydmVTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiByLnByZXNlcnZlU3RhdGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdyZXNpbGllbmNlLnByZXNlcnZlU3RhdGUgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSBhY3RpdmF0ZXMgLS0tXG4gICAgaWYgKG1ldGFkYXRhLmFjdGl2YXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLmFjdGl2YXRlcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hY3RpdmF0ZXMpIHx8IG1ldGFkYXRhLmFjdGl2YXRlcyA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgnYWN0aXZhdGVzIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggc2tpbGxzL3BlcnNvbmFzL21lbW9yaWVzL3RlbXBsYXRlcy9lbnNlbWJsZXMgYXJyYXlzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgZ29hbCBpbnB1dCB0byBWMiBmb3JtYXQuXG4gICAqIExMTXMgbWF5IHBhc3MgZ29hbCBhcyBhIHNpbXBsZSBzdHJpbmcgb3IgYXMgYSBWMiBjb25maWcgb2JqZWN0LlxuICAgKiBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgYSBwcm9wZXIgVjIgc3RydWN0dXJlIGJlZm9yZSB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZ29hbCAtIEVpdGhlciBhIHN0cmluZyBnb2FsIG9yIGEgVjIgZ29hbCBjb25maWcgb2JqZWN0XG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgVjIgZ29hbCBjb25maWcsIG9yIHVuZGVmaW5lZCBpZiBubyBnb2FsIHByb3ZpZGVkXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZUdvYWxJbnB1dChnb2FsOiBzdHJpbmcgfCBQYXJ0aWFsPEFnZW50R29hbENvbmZpZz4gfCB1bmRlZmluZWQpOiBBZ2VudEdvYWxDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmICghZ29hbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIFYyIGZvcm1hdFxuICAgIGlmICh0eXBlb2YgZ29hbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnQ29udmVydGluZyBzdHJpbmcgZ29hbCB0byBWMiBmb3JtYXQnLCB7IGdvYWwgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wbGF0ZTogZ29hbCxcbiAgICAgICAgcGFyYW1ldGVyczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGFuIG9iamVjdCB3aXRoIHRlbXBsYXRlLCBub3JtYWxpemUgcGFyYW1ldGVyc1xuICAgIGlmICh0eXBlb2YgZ29hbCA9PT0gJ29iamVjdCcgJiYgJ3RlbXBsYXRlJyBpbiBnb2FsICYmIHR5cGVvZiBnb2FsLnRlbXBsYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSXNzdWUgIzcyNTogTm9ybWFsaXplIHNuYWtlX2Nhc2UgZ29hbCBzdWItZmllbGRzIGJlZm9yZSBhY2Nlc3NpbmdcbiAgICAgIG5vcm1hbGl6ZUdvYWxLZXlzKGdvYWwgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICAgIGNvbnN0IHZhbGlkUGFyYW1UeXBlcyA9IFsnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRQYXJhbXM6IEFnZW50R29hbFBhcmFtZXRlcltdID0gKGdvYWwucGFyYW1ldGVycyB8fCBbXSkubWFwKChwLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdHlwZW9mIHAubmFtZSA9PT0gJ3N0cmluZycgPyBwLm5hbWUgOiBgcGFyYW1fJHtpbmRleH1gO1xuICAgICAgICBjb25zdCB0eXBlID0gdmFsaWRQYXJhbVR5cGVzLmluY2x1ZGVzKHAudHlwZSBhcyB0eXBlb2YgdmFsaWRQYXJhbVR5cGVzW251bWJlcl0pXG4gICAgICAgICAgPyBwLnR5cGUgYXMgJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJ1xuICAgICAgICAgIDogJ3N0cmluZyc7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gdHlwZW9mIHAucmVxdWlyZWQgPT09ICdib29sZWFuJyA/IHAucmVxdWlyZWQgOiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZWQ6IEFnZW50R29hbFBhcmFtZXRlciA9IHsgbmFtZSwgdHlwZSwgcmVxdWlyZWQgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBwLmRlc2NyaXB0aW9uID09PSAnc3RyaW5nJyAmJiBwLmRlc2NyaXB0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YWxpZGF0ZWQuZGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KHAuZGVzY3JpcHRpb24sIDUwMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gU2FuaXRpemUgc3RyaW5nIGRlZmF1bHRzIHRvIHByZXZlbnQgaW5qZWN0aW9uIHdoZW4gdXNlZCBpbiBnb2FsIHJlbmRlcmluZ1xuICAgICAgICAgIGlmICh0eXBlb2YgcC5kZWZhdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsaWRhdGVkLmRlZmF1bHQgPSBzYW5pdGl6ZUlucHV0KHAuZGVmYXVsdCwgNTAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsaWRhdGVkLmRlZmF1bHQgPSBwLmRlZmF1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcGxhdGU6IGdvYWwudGVtcGxhdGUsXG4gICAgICAgIHBhcmFtZXRlcnM6IHZhbGlkYXRlZFBhcmFtcyxcbiAgICAgICAgc3VjY2Vzc0NyaXRlcmlhOiBnb2FsLnN1Y2Nlc3NDcml0ZXJpYVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBPYmplY3Qgd2l0aG91dCB0ZW1wbGF0ZSAtIGNhbm5vdCBjb252ZXJ0XG4gICAgbG9nZ2VyLndhcm4oJ0dvYWwgb2JqZWN0IG1pc3NpbmcgdGVtcGxhdGUgZmllbGQsIGNhbm5vdCBjb252ZXJ0IHRvIFYyJywgeyBnb2FsIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQWdlbnRGaWxlKGNvbnRlbnQ6IHN0cmluZyk6IFBhcnNlZEFnZW50RmlsZSB7XG4gICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBmcm9udG1hdHRlciBwYXJzaW5nXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGNvbnRlbnQsIHtcbiAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5wYXJzZUFnZW50RmlsZSdcbiAgICB9KTtcblxuICAgIC8vIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGVuc3VyZXMgZnJvbnRtYXR0ZXIgZXhpc3RzLCBvciB0aHJvd3MgZXJyb3JcbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHJlc3VsdC5kYXRhIGFzIEFnZW50TWV0YWRhdGEsXG4gICAgICBjb250ZW50OiByZXN1bHQuY29udGVudC50cmltKClcbiAgICB9O1xuICB9XG5cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlbmFtZSBmb3IgYW4gYWdlbnQgZWxlbWVudC5cbiAgICpcbiAgICogVXNlcyBpbmhlcml0ZWQgbm9ybWFsaXplRmlsZW5hbWUoKSBmcm9tIEJhc2VFbGVtZW50TWFuYWdlciBmb3IgY29uc2lzdGVudFxuICAgKiBmaWxlbmFtZSBmb3JtYXR0aW5nIGFjcm9zcyBhbGwgZWxlbWVudCBtYW5hZ2Vycy5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqICAgXCJDcmVhdGl2ZSBXcml0ZXJcIiAtPiBcImNyZWF0aXZlLXdyaXRlci5tZFwiXG4gICAqICAgXCJDUlVEVi1BZ2VudC1EZWx0YVwiIC0+IFwiY3J1ZHYtYWdlbnQtZGVsdGEubWRcIlxuICAgKiAgIFwiTXVsdGlfR29hbF9BZ2VudFwiIC0+IFwibXVsdGktZ29hbC1hZ2VudC5tZFwiXG4gICAqICAgXCJDYW1lbENhc2VOYW1lXCIgLT4gXCJjYW1lbC1jYXNlLW5hbWUubWRcIlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFVzZSBpbmhlcml0ZWQgbm9ybWFsaXplRmlsZW5hbWUoKSBmb3IgdW5pZmllZCBub3JtYWxpemF0aW9uXG4gICAgcmV0dXJuIHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVsZW1lbnROYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlthLXpBLVowLTlfLV0rJC8udGVzdChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIGZvciBhdHRyaWJ1dGlvblxuICAgKiBSRUZBQ1RPUkVEOiBEZWxlZ2F0ZXMgdG8gTWV0YWRhdGFTZXJ2aWNlIGZvciBjb25zaXN0ZW50IHVzZXIgYXR0cmlidXRpb24gYWNyb3NzIGFsbCBtYW5hZ2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVTdGF0ZUZvclNlcmlhbGl6YXRpb24oc3RhdGU6IEFnZW50U3RhdGUpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGFzdEFjdGl2ZTogc3RhdGUubGFzdEFjdGl2ZSBpbnN0YW5jZW9mIERhdGUgPyBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCkgOiBzdGF0ZS5sYXN0QWN0aXZlLFxuICAgICAgc2Vzc2lvbkNvdW50OiBTdHJpbmcoc3RhdGUuc2Vzc2lvbkNvdW50ID8/IDApLFxuICAgICAgc3RhdGVWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb24gIT09IHVuZGVmaW5lZCA/IFN0cmluZyhzdGF0ZS5zdGF0ZVZlcnNpb24pIDogJzEnLCAgLy8gSW5jbHVkZSB2ZXJzaW9uIGZvciBvcHRpbWlzdGljIGxvY2tpbmdcbiAgICAgIGdvYWxzOiBzdGF0ZS5nb2Fscy5tYXAoZ29hbCA9PiAoe1xuICAgICAgICAuLi5nb2FsLFxuICAgICAgICBjcmVhdGVkQXQ6IGdvYWwuY3JlYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLmNyZWF0ZWRBdCxcbiAgICAgICAgdXBkYXRlZEF0OiBnb2FsLnVwZGF0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLnVwZGF0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC51cGRhdGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0OiBnb2FsLmNvbXBsZXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwuY29tcGxldGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY29tcGxldGVkQXQsXG4gICAgICAgIGltcG9ydGFuY2U6IGdvYWwuaW1wb3J0YW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwuaW1wb3J0YW5jZSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHVyZ2VuY3k6IGdvYWwudXJnZW5jeSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwudXJnZW5jeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGVzdGltYXRlZEVmZm9ydDogZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLmVzdGltYXRlZEVmZm9ydCkgOiB1bmRlZmluZWRcbiAgICAgIH0pKSxcbiAgICAgIGRlY2lzaW9uczogc3RhdGUuZGVjaXNpb25zLm1hcChkZWNpc2lvbiA9PiAoe1xuICAgICAgICAuLi5kZWNpc2lvbixcbiAgICAgICAgdGltZXN0YW1wOiBkZWNpc2lvbi50aW1lc3RhbXAgaW5zdGFuY2VvZiBEYXRlID8gZGVjaXNpb24udGltZXN0YW1wLnRvSVNPU3RyaW5nKCkgOiBkZWNpc2lvbi50aW1lc3RhbXAsXG4gICAgICAgIGNvbmZpZGVuY2U6IGRlY2lzaW9uLmNvbmZpZGVuY2UgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhkZWNpc2lvbi5jb25maWRlbmNlKSA6IHVuZGVmaW5lZFxuICAgICAgfSkpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTG9hZGVkU3RhdGUoc3RhdGU6IEFnZW50U3RhdGUpOiB2b2lkIHtcbiAgICAvLyBGSVggKElzc3VlICMxMjMpOiBEZWZhdWx0IG1pc3NpbmcgYXJyYXlzIHRvIHByZXZlbnQgVHlwZUVycm9yXG4gICAgLy8gSWYgc3RhdGUgZmlsZSBpcyBtaXNzaW5nIGdvYWxzL2RlY2lzaW9ucy9jb250ZXh0LCBkZWZhdWx0IHRvIGVtcHR5IGFycmF5cy9vYmplY3RzXG4gICAgaWYgKCFzdGF0ZS5nb2Fscykge1xuICAgICAgc3RhdGUuZ29hbHMgPSBbXTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgIHN0YXRlLmRlY2lzaW9ucyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmNvbnRleHQpIHtcbiAgICAgIHN0YXRlLmNvbnRleHQgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc2Vzc2lvbkNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXRlLnNlc3Npb25Db3VudCA9IE51bWJlci5wYXJzZUludChTdHJpbmcoc3RhdGUuc2Vzc2lvbkNvdW50KSwgMTApO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHN0YXRlVmVyc2lvbiBmb3Igb3B0aW1pc3RpYyBsb2NraW5nIChJc3N1ZSAjMjQpXG4gICAgaWYgKHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGF0ZS5zdGF0ZVZlcnNpb24gPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHN0YXRlLnN0YXRlVmVyc2lvbiksIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2ZXJzaW9uIDEgaWYgbm90IHByZXNlbnQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gMTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubGFzdEFjdGl2ZSkge1xuICAgICAgc3RhdGUubGFzdEFjdGl2ZSA9IG5ldyBEYXRlKHN0YXRlLmxhc3RBY3RpdmUpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5nb2Fscykge1xuICAgICAgc3RhdGUuZ29hbHMuZm9yRWFjaChnb2FsID0+IHtcbiAgICAgICAgaWYgKGdvYWwuaW1wb3J0YW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ29hbC5pbXBvcnRhbmNlID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhnb2FsLmltcG9ydGFuY2UpLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwudXJnZW5jeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ29hbC51cmdlbmN5ID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhnb2FsLnVyZ2VuY3kpLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuZXN0aW1hdGVkRWZmb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLmVzdGltYXRlZEVmZm9ydCA9IE51bWJlci5wYXJzZUZsb2F0KFN0cmluZyhnb2FsLmVzdGltYXRlZEVmZm9ydCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLmNyZWF0ZWRBdCkge1xuICAgICAgICAgIGdvYWwuY3JlYXRlZEF0ID0gbmV3IERhdGUoZ29hbC5jcmVhdGVkQXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLnVwZGF0ZWRBdCkge1xuICAgICAgICAgIGdvYWwudXBkYXRlZEF0ID0gbmV3IERhdGUoZ29hbC51cGRhdGVkQXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnb2FsLmNvbXBsZXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC5jb21wbGV0ZWRBdCA9IG5ldyBEYXRlKGdvYWwuY29tcGxldGVkQXQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZGVjaXNpb25zKSB7XG4gICAgICBzdGF0ZS5kZWNpc2lvbnMuZm9yRWFjaChkZWNpc2lvbiA9PiB7XG4gICAgICAgIGlmIChkZWNpc2lvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWNpc2lvbi5jb25maWRlbmNlID0gTnVtYmVyLnBhcnNlRmxvYXQoU3RyaW5nKGRlY2lzaW9uLmNvbmZpZGVuY2UpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjaXNpb24udGltZXN0YW1wKSB7XG4gICAgICAgICAgZGVjaXNpb24udGltZXN0YW1wID0gbmV3IERhdGUoZGVjaXNpb24udGltZXN0YW1wKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHN0ZXAgaW4gYWdlbnQgZXhlY3V0aW9uXG4gICAqIFdyYXBzIEFnZW50LnJlY29yZERlY2lzaW9uKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgcmVjb3JkQWdlbnRTdGVwKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHN0ZXBEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICAvKiogT3B0aW9uYWwgZmluZGluZ3Mgb3IgcmVzdWx0cyBmcm9tIHRoaXMgc3RlcCAqL1xuICAgIGZpbmRpbmdzPzogc3RyaW5nO1xuICAgIGNvbmZpZGVuY2U/OiBudW1iZXI7XG4gICAgLyoqIE9wdGlvbmFsIGhpbnQgYWJvdXQgd2hhdCB0aGUgTExNIHBsYW5zIHRvIGRvIG5leHQgKGZvciBwcm9hY3RpdmUgcmlzayBldmFsdWF0aW9uKSAqL1xuICAgIG5leHRBY3Rpb25IaW50Pzogc3RyaW5nO1xuICAgIC8qKiBPcHRpb25hbCByaXNrIHNjb3JlIGZvciB0aGUgY3VycmVudCBzdGVwICgwLTEwMCkgKi9cbiAgICByaXNrU2NvcmU/OiBudW1iZXI7XG4gICAgLyoqIFJ1bnRpbWUgb3ZlcnJpZGUgZm9yIG1heEF1dG9ub21vdXNTdGVwcyAoSXNzdWUgIzQ0NykgKi9cbiAgICBtYXhTdGVwc092ZXJyaWRlPzogbnVtYmVyO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZGVjaXNpb246IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBnb2FsSWQ6IHN0cmluZztcbiAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgZGVjaXNpb246IHN0cmluZztcbiAgICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICAgICAgZnJhbWV3b3JrOiBzdHJpbmc7XG4gICAgICBjb25maWRlbmNlOiBudW1iZXI7XG4gICAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgfTtcbiAgICBzdGF0ZToge1xuICAgICAgZ29hbENvdW50OiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBsYXN0QWN0aXZlOiBzdHJpbmc7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICAgIC8qKiBBdXRvbm9teSBkaXJlY3RpdmUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGNvbnRpbnVlIG9yIHBhdXNlICovXG4gICAgYXV0b25vbXk6IEF1dG9ub215RGlyZWN0aXZlO1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBHZXQgYWdlbnQgc3RhdGUgdG8gZmluZCBhY3RpdmUgZ29hbHNcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgYWN0aXZlR29hbCA9IHN0YXRlLmdvYWxzLmZpbmQoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG5cbiAgICBpZiAoIWFjdGl2ZUdvYWwpIHtcbiAgICAgIGNvbnN0IGdvYWxTdGF0dXNlcyA9IHN0YXRlLmdvYWxzLm1hcChnID0+IGAke2cuaWR9OiAke2cuc3RhdHVzfWApLmpvaW4oJywgJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBObyBhY3RpdmUgZ29hbCBmb3VuZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nLiBgICtcbiAgICAgICAgYEF2YWlsYWJsZSBnb2FsczogJHtnb2FsU3RhdHVzZXMgfHwgJ25vbmUnfS4gYCArXG4gICAgICAgIGBVc2UgZXhlY3V0ZV9hZ2VudCB0byBzdGFydCBhIG5ldyBnb2FsIGZpcnN0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gQ2FsbCBBZ2VudC5yZWNvcmREZWNpc2lvbigpIHRvIHBlcnNpc3QgdGhlIHN0ZXBcbiAgICBjb25zdCBkZWNpc2lvbiA9IGFnZW50LnJlY29yZERlY2lzaW9uKHtcbiAgICAgIGdvYWxJZDogYWN0aXZlR29hbC5pZCxcbiAgICAgIGRlY2lzaW9uOiBwYXJhbXMuc3RlcERlc2NyaXB0aW9uLFxuICAgICAgcmVhc29uaW5nOiBwYXJhbXMuZmluZGluZ3MgPz8gJycsXG4gICAgICBjb25maWRlbmNlOiBwYXJhbXMuY29uZmlkZW5jZSA/PyAwLjgsXG4gICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZVxuICAgIH0pO1xuXG4gICAgLy8gNC4gU2F2ZSBhZ2VudCBzdGF0ZVxuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KHBhcmFtcy5hZ2VudE5hbWUsIDEwMCk7XG4gICAgYXdhaXQgdGhpcy5zYXZlKGFnZW50LCB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpKTtcblxuICAgIC8vIDUuIEdldCB1cGRhdGVkIHN0YXRlIGZvciBzdGVwIGNvdW50IGFuZCBhdXRvbm9teSBldmFsdWF0aW9uXG4gICAgY29uc3QgdXBkYXRlZFN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcblxuICAgIC8vIDYuIENhbGN1bGF0ZSBzdGVwIGNvdW50IGZvciB0aGlzIGdvYWxcbiAgICAvLyBzdGVwQ291bnQgPSBudW1iZXIgb2Ygc3RlcHMgY29tcGxldGVkIChpbmNsdWRpbmcgdGhlIG9uZSBqdXN0IHJlY29yZGVkKVxuICAgIC8vIFRoZSBldmFsdWF0b3IgdXNlcyB0aGlzIHRvIGNoZWNrIGlmIHdlJ3ZlIGhpdCBtYXhBdXRvbm9tb3VzU3RlcHNcbiAgICAvLyBhbmQgdG8gY29tcHV0ZSBzdGVwc1JlbWFpbmluZyBmb3IgdGhlIGF1dG9ub215IGRpcmVjdGl2ZS5cbiAgICBjb25zdCBnb2FsRGVjaXNpb25zID0gdXBkYXRlZFN0YXRlLmRlY2lzaW9ucy5maWx0ZXIoZCA9PiBkLmdvYWxJZCA9PT0gYWN0aXZlR29hbC5pZCk7XG4gICAgY29uc3Qgc3RlcENvdW50ID0gZ29hbERlY2lzaW9ucy5sZW5ndGg7XG5cbiAgICAvLyA3LiBHZXQgYWdlbnQgbWV0YWRhdGEgZm9yIGF1dG9ub215IGNvbmZpZ1xuICAgIGNvbnN0IGFnZW50TWV0YWRhdGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAvLyA4LiBFdmFsdWF0ZSBhdXRvbm9teSAtIHNob3VsZCB3ZSBjb250aW51ZSBvciBwYXVzZT9cbiAgICAvLyBJc3N1ZSAjNDAyOiBQYXNzIERJLWluamVjdGVkIERhbmdlclpvbmVFbmZvcmNlciB2aWEgY29udGV4dFxuICAgIC8vIElzc3VlICM0NDc6IEFwcGx5IHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlIGlmIHByb3ZpZGVkXG4gICAgY29uc3QgYXV0b25vbXlDb25maWcgPSBwYXJhbXMubWF4U3RlcHNPdmVycmlkZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgLi4uYWdlbnRNZXRhZGF0YS5hdXRvbm9teSwgbWF4QXV0b25vbW91c1N0ZXBzOiBwYXJhbXMubWF4U3RlcHNPdmVycmlkZSB9XG4gICAgICA6IGFnZW50TWV0YWRhdGEuYXV0b25vbXk7XG5cbiAgICBjb25zdCBhdXRvbm9teURpcmVjdGl2ZSA9IGV2YWx1YXRlQXV0b25vbXkoe1xuICAgICAgYWdlbnROYW1lOiBwYXJhbXMuYWdlbnROYW1lLFxuICAgICAgYXV0b25vbXlDb25maWcsXG4gICAgICBzdGVwQ291bnQsXG4gICAgICBjdXJyZW50U3RlcERlc2NyaXB0aW9uOiBwYXJhbXMuc3RlcERlc2NyaXB0aW9uLFxuICAgICAgY3VycmVudFN0ZXBPdXRjb21lOiBwYXJhbXMub3V0Y29tZSxcbiAgICAgIG5leHRBY3Rpb25IaW50OiBwYXJhbXMubmV4dEFjdGlvbkhpbnQsXG4gICAgICByaXNrU2NvcmU6IHBhcmFtcy5yaXNrU2NvcmUsXG4gICAgICBkYW5nZXJab25lRW5mb3JjZXI6IEFnZW50TWFuYWdlci5kYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcj8uKCksXG4gICAgICB2ZXJpZmljYXRpb25TdG9yZTogQWdlbnRNYW5hZ2VyLnZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXI/LigpLFxuICAgICAgZ29hbERlc2NyaXB0aW9uOiBhY3RpdmVHb2FsLmRlc2NyaXB0aW9uLFxuICAgICAgZ29hbElkOiBhY3RpdmVHb2FsLmlkLFxuICAgIH0pO1xuXG4gICAgLy8gOS4gUmV0dXJuIGRlY2lzaW9uLCBzdGF0ZSBzdW1tYXJ5LCBhbmQgYXV0b25vbXkgZGlyZWN0aXZlXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgU3RlcCByZWNvcmRlZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nYCxcbiAgICAgIGRlY2lzaW9uOiB7XG4gICAgICAgIGlkOiBkZWNpc2lvbi5pZCxcbiAgICAgICAgZ29hbElkOiBkZWNpc2lvbi5nb2FsSWQsXG4gICAgICAgIHRpbWVzdGFtcDogZGVjaXNpb24udGltZXN0YW1wLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGRlY2lzaW9uOiBkZWNpc2lvbi5kZWNpc2lvbixcbiAgICAgICAgcmVhc29uaW5nOiBkZWNpc2lvbi5yZWFzb25pbmcsXG4gICAgICAgIGZyYW1ld29yazogZGVjaXNpb24uZnJhbWV3b3JrLFxuICAgICAgICBjb25maWRlbmNlOiBkZWNpc2lvbi5jb25maWRlbmNlLFxuICAgICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZVxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGdvYWxDb3VudDogdXBkYXRlZFN0YXRlLmdvYWxzLmxlbmd0aCxcbiAgICAgICAgZGVjaXNpb25Db3VudDogdXBkYXRlZFN0YXRlLmRlY2lzaW9ucy5sZW5ndGgsXG4gICAgICAgIGxhc3RBY3RpdmU6IHVwZGF0ZWRTdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogdXBkYXRlZFN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9LFxuICAgICAgYXV0b25vbXk6IGF1dG9ub215RGlyZWN0aXZlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBhbiBhZ2VudCBnb2FsXG4gICAqIFdyYXBzIEFnZW50LmNvbXBsZXRlR29hbCgpIGZvciB0aGUgTUNQIHRvb2wgaW50ZXJmYWNlXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIGNvbXBsZXRlQWdlbnRHb2FsKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGdvYWxJZD86IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZ29hbDoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBzdGF0dXM6IFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiO1xuICAgICAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gICAgICBjb21wbGV0ZWRBdDogc3RyaW5nO1xuICAgICAgZXN0aW1hdGVkRWZmb3J0PzogbnVtYmVyO1xuICAgICAgYWN0dWFsRWZmb3J0PzogbnVtYmVyO1xuICAgIH07XG4gICAgbWV0cmljczoge1xuICAgICAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgICAgIGdvYWxzQ29tcGxldGVkOiBudW1iZXI7XG4gICAgICBnb2Fsc0luUHJvZ3Jlc3M6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG51bWJlcjtcbiAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZTogbnVtYmVyO1xuICAgIH07XG4gICAgc3RhdGU6IHtcbiAgICAgIGdvYWxDb3VudDogbnVtYmVyO1xuICAgICAgZGVjaXNpb25Db3VudDogbnVtYmVyO1xuICAgICAgbGFzdEFjdGl2ZTogc3RyaW5nO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gRmluZCBnb2FsIHRvIGNvbXBsZXRlXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGxldCBnb2FsOiBBZ2VudEdvYWwgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocGFyYW1zLmdvYWxJZCkge1xuICAgICAgZ29hbCA9IHN0YXRlLmdvYWxzLmZpbmQoZyA9PiBnLmlkID09PSBwYXJhbXMuZ29hbElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmluZCBtb3N0IHJlY2VudCBpbi1wcm9ncmVzcyBnb2FsXG4gICAgICBnb2FsID0gc3RhdGUuZ29hbHNcbiAgICAgICAgLmZpbHRlcihnID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5jcmVhdGVkQXQuZ2V0VGltZSgpIC0gYS5jcmVhdGVkQXQuZ2V0VGltZSgpKVswXTtcbiAgICB9XG5cbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgcGFyYW1zLmdvYWxJZFxuICAgICAgICAgID8gYEdvYWwgJyR7cGFyYW1zLmdvYWxJZH0nIG5vdCBmb3VuZGBcbiAgICAgICAgICA6IGBObyBpbi1wcm9ncmVzcyBnb2FsIGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIFJlY29yZCBmaW5hbCBkZWNpc2lvbiB3aXRoIHN1bW1hcnlcbiAgICBhZ2VudC5yZWNvcmREZWNpc2lvbih7XG4gICAgICBnb2FsSWQ6IGdvYWwuaWQsXG4gICAgICBkZWNpc2lvbjogJ2dvYWxfY29tcGxldGUnLFxuICAgICAgcmVhc29uaW5nOiBwYXJhbXMuc3VtbWFyeSxcbiAgICAgIGNvbmZpZGVuY2U6IDEuMCxcbiAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgfSk7XG5cbiAgICAvLyA0LiBDYWxsIEFnZW50LmNvbXBsZXRlR29hbCgpXG4gICAgYWdlbnQuY29tcGxldGVHb2FsKGdvYWwuaWQsIHBhcmFtcy5vdXRjb21lKTtcblxuICAgIC8vIDUuIEdldCBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAgY29uc3QgbWV0cmljcyA9IGFnZW50LmdldFBlcmZvcm1hbmNlTWV0cmljcygpO1xuXG4gICAgLy8gNi4gU2F2ZSBhZ2VudCBzdGF0ZVxuICAgIGNvbnN0IGNvbXBsZXRlU2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQocGFyYW1zLmFnZW50TmFtZSwgMTAwKTtcbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoY29tcGxldGVTYW5pdGl6ZWROYW1lKSk7XG5cbiAgICAvLyA3LiBSZXR1cm4gZ29hbCwgbWV0cmljcywgYW5kIHN0YXRlXG4gICAgY29uc3QgdXBkYXRlZFN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBjb21wbGV0ZWRHb2FsID0gdXBkYXRlZFN0YXRlLmdvYWxzLmZpbmQoZyA9PiBnLmlkID09PSBnb2FsLmlkKSE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBHb2FsIGNvbXBsZXRlZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nIHdpdGggb3V0Y29tZTogJHtwYXJhbXMub3V0Y29tZX1gLFxuICAgICAgZ29hbDoge1xuICAgICAgICBpZDogY29tcGxldGVkR29hbC5pZCxcbiAgICAgICAgZGVzY3JpcHRpb246IGNvbXBsZXRlZEdvYWwuZGVzY3JpcHRpb24sXG4gICAgICAgIHN0YXR1czogY29tcGxldGVkR29hbC5zdGF0dXMgYXMgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCIsXG4gICAgICAgIGNyZWF0ZWRBdDogY29tcGxldGVkR29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29tcGxldGVkQXQ6IGNvbXBsZXRlZEdvYWwuY29tcGxldGVkQXQhLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGVzdGltYXRlZEVmZm9ydDogY29tcGxldGVkR29hbC5lc3RpbWF0ZWRFZmZvcnQsXG4gICAgICAgIGFjdHVhbEVmZm9ydDogY29tcGxldGVkR29hbC5hY3R1YWxFZmZvcnRcbiAgICAgIH0sXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIHN1Y2Nlc3NSYXRlOiBtZXRyaWNzLnN1Y2Nlc3NSYXRlLFxuICAgICAgICBnb2Fsc0NvbXBsZXRlZDogbWV0cmljcy5nb2Fsc0NvbXBsZXRlZCxcbiAgICAgICAgZ29hbHNJblByb2dyZXNzOiBtZXRyaWNzLmdvYWxzSW5Qcm9ncmVzcyxcbiAgICAgICAgZGVjaXNpb25BY2N1cmFjeTogbWV0cmljcy5kZWNpc2lvbkFjY3VyYWN5LFxuICAgICAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG1ldHJpY3MuYXZlcmFnZUNvbXBsZXRpb25UaW1lXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbENvdW50OiB1cGRhdGVkU3RhdGUuZ29hbHMubGVuZ3RoLFxuICAgICAgICBkZWNpc2lvbkNvdW50OiB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmxlbmd0aCxcbiAgICAgICAgbGFzdEFjdGl2ZTogdXBkYXRlZFN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiB1cGRhdGVkU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2VudCBzdGF0ZVxuICAgKiBXcmFwcyBBZ2VudC5nZXRTdGF0ZSgpIGZvciB0aGUgTUNQIHRvb2wgaW50ZXJmYWNlXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIGdldEFnZW50U3RhdGUocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBzdGF0ZToge1xuICAgICAgZ29hbHM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgcHJpb3JpdHk6IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICAgIGltcG9ydGFuY2U6IG51bWJlcjtcbiAgICAgICAgdXJnZW5jeTogbnVtYmVyO1xuICAgICAgICBlaXNlbmhvd2VyUXVhZHJhbnQ/OiBzdHJpbmc7XG4gICAgICAgIGNyZWF0ZWRBdDogc3RyaW5nO1xuICAgICAgICB1cGRhdGVkQXQ6IHN0cmluZztcbiAgICAgICAgY29tcGxldGVkQXQ/OiBzdHJpbmc7XG4gICAgICAgIGRlcGVuZGVuY2llcz86IHN0cmluZ1tdO1xuICAgICAgICByaXNrTGV2ZWw/OiBzdHJpbmc7XG4gICAgICAgIGVzdGltYXRlZEVmZm9ydD86IG51bWJlcjtcbiAgICAgICAgYWN0dWFsRWZmb3J0PzogbnVtYmVyO1xuICAgICAgICBub3Rlcz86IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgZGVjaXNpb25zOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGdvYWxJZDogc3RyaW5nO1xuICAgICAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAgICAgZGVjaXNpb246IHN0cmluZztcbiAgICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICAgIGZyYW1ld29yazogc3RyaW5nO1xuICAgICAgICBjb25maWRlbmNlOiBudW1iZXI7XG4gICAgICAgIG91dGNvbWU/OiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgY29udGV4dFN1bW1hcnk6IHtcbiAgICAgICAga2V5czogc3RyaW5nW107XG4gICAgICAgIHNpemU6IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBsYXN0QWN0aXZlOiBzdHJpbmc7XG4gICAgICBzZXNzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgbWV0cmljczoge1xuICAgICAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgICAgIGdvYWxzQ29tcGxldGVkOiBudW1iZXI7XG4gICAgICBnb2Fsc0luUHJvZ3Jlc3M6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG51bWJlcjtcbiAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZTogbnVtYmVyO1xuICAgIH07XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEdldCBhZ2VudCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcblxuICAgIC8vIDMuIEdldCBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAgY29uc3QgbWV0cmljcyA9IGFnZW50LmdldFBlcmZvcm1hbmNlTWV0cmljcygpO1xuXG4gICAgLy8gNC4gRmlsdGVyIGRlY2lzaW9ucyBiYXNlZCBvbiBpbmNsdWRlRGVjaXNpb25IaXN0b3J5XG4gICAgY29uc3QgZGVjaXNpb25zID0gcGFyYW1zLmluY2x1ZGVEZWNpc2lvbkhpc3RvcnlcbiAgICAgID8gc3RhdGUuZGVjaXNpb25zXG4gICAgICA6IHN0YXRlLmRlY2lzaW9ucy5zbGljZSgtMTApOyAvLyBMYXN0IDEwIGRlY2lzaW9uc1xuXG4gICAgLy8gNS4gQnVpbGQgY29udGV4dCBzdW1tYXJ5XG4gICAgY29uc3QgY29udGV4dEtleXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5jb250ZXh0KTtcbiAgICBjb25zdCBjb250ZXh0U2l6ZSA9IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbnRleHQpLmxlbmd0aDtcblxuICAgIC8vIDYuIFJldHVybiBzdGF0ZSBhbmQgbWV0cmljc1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWdlbnROYW1lOiBwYXJhbXMuYWdlbnROYW1lLFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbHM6IHN0YXRlLmdvYWxzLm1hcChnID0+ICh7XG4gICAgICAgICAgaWQ6IGcuaWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJpb3JpdHk6IGcucHJpb3JpdHksXG4gICAgICAgICAgc3RhdHVzOiBnLnN0YXR1cyxcbiAgICAgICAgICBpbXBvcnRhbmNlOiBnLmltcG9ydGFuY2UsXG4gICAgICAgICAgdXJnZW5jeTogZy51cmdlbmN5LFxuICAgICAgICAgIGVpc2VuaG93ZXJRdWFkcmFudDogZy5laXNlbmhvd2VyUXVhZHJhbnQsXG4gICAgICAgICAgY3JlYXRlZEF0OiBnLmNyZWF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHVwZGF0ZWRBdDogZy51cGRhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBjb21wbGV0ZWRBdDogZy5jb21wbGV0ZWRBdD8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBkZXBlbmRlbmNpZXM6IGcuZGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHJpc2tMZXZlbDogZy5yaXNrTGV2ZWwsXG4gICAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBnLmVzdGltYXRlZEVmZm9ydCxcbiAgICAgICAgICBhY3R1YWxFZmZvcnQ6IGcuYWN0dWFsRWZmb3J0LFxuICAgICAgICAgIG5vdGVzOiBnLm5vdGVzXG4gICAgICAgIH0pKSxcbiAgICAgICAgZGVjaXNpb25zOiBkZWNpc2lvbnMubWFwKGQgPT4gKHtcbiAgICAgICAgICBpZDogZC5pZCxcbiAgICAgICAgICBnb2FsSWQ6IGQuZ29hbElkLFxuICAgICAgICAgIHRpbWVzdGFtcDogZC50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBkZWNpc2lvbjogZC5kZWNpc2lvbixcbiAgICAgICAgICByZWFzb25pbmc6IGQucmVhc29uaW5nLFxuICAgICAgICAgIGZyYW1ld29yazogZC5mcmFtZXdvcmssXG4gICAgICAgICAgY29uZmlkZW5jZTogZC5jb25maWRlbmNlLFxuICAgICAgICAgIG91dGNvbWU6IGQub3V0Y29tZVxuICAgICAgICB9KSksXG4gICAgICAgIGNvbnRleHQ6IHBhcmFtcy5pbmNsdWRlQ29udGV4dCA/IHN0YXRlLmNvbnRleHQgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRleHRTdW1tYXJ5OiB7XG4gICAgICAgICAga2V5czogY29udGV4dEtleXMsXG4gICAgICAgICAgc2l6ZTogY29udGV4dFNpemVcbiAgICAgICAgfSxcbiAgICAgICAgbGFzdEFjdGl2ZTogc3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzZXNzaW9uQ291bnQ6IHN0YXRlLnNlc3Npb25Db3VudCxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfSxcbiAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgc3VjY2Vzc1JhdGU6IG1ldHJpY3Muc3VjY2Vzc1JhdGUsXG4gICAgICAgIGdvYWxzQ29tcGxldGVkOiBtZXRyaWNzLmdvYWxzQ29tcGxldGVkLFxuICAgICAgICBnb2Fsc0luUHJvZ3Jlc3M6IG1ldHJpY3MuZ29hbHNJblByb2dyZXNzLFxuICAgICAgICBkZWNpc2lvbkFjY3VyYWN5OiBtZXRyaWNzLmRlY2lzaW9uQWNjdXJhY3ksXG4gICAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZTogbWV0cmljcy5hdmVyYWdlQ29tcGxldGlvblRpbWVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBnYXRoZXJlZCBkYXRhIGZvciBhIHNwZWNpZmljIGdvYWwgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBBZ2dyZWdhdGVzIGRlY2lzaW9uIGhpc3RvcnksIGdvYWwgc3RhdGUsIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3NcbiAgICogaW50byBhIHN0cnVjdHVyZWQgR2F0aGVyZWREYXRhIG9iamVjdC4gVGhpcyBpcyBhIHJlYWQtc2lkZSB2aWV3XG4gICAqIG92ZXIgZXhpc3RpbmcgYWdlbnQgc3RhdGUgZGF0YS5cbiAgICpcbiAgICogSXNzdWUgIzY4OiBHYXRoZXJlZERhdGFFbnRyeSBmb3Igc3RhdGUgcmVjb3JkaW5nXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgQ29tcGxldGlvbiAoRXBpYyAjMzgwKVxuICAgKi9cbiAgYXN5bmMgZ2V0R2F0aGVyZWREYXRhKHBhcmFtczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGdvYWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxHYXRoZXJlZERhdGE+IHtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGdhdGhlcmVkID0gZ2V0R2F0aGVyZWREYXRhKHBhcmFtcy5hZ2VudE5hbWUsIHBhcmFtcy5nb2FsSWQsIHN0YXRlKTtcblxuICAgIGlmICghZ2F0aGVyZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEdvYWwgJyR7cGFyYW1zLmdvYWxJZH0nIG5vdCBmb3VuZCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nLiBgICtcbiAgICAgICAgYEF2YWlsYWJsZSBnb2FsczogJHtzdGF0ZS5nb2Fscy5tYXAoZyA9PiBnLmlkKS5qb2luKCcsICcpIHx8ICdub25lJ31gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBnYXRoZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250aW51ZSBhZ2VudCBleGVjdXRpb24gZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgKiBDb21iaW5lcyBleGVjdXRlQWdlbnQgd2l0aCBzdGF0ZSBjb250ZXh0XG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudGljIExvb3AgUmVkZXNpZ25cbiAgICovXG4gIGFzeW5jIGNvbnRpbnVlQWdlbnRFeGVjdXRpb24ocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgcGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHByZXZpb3VzU3RlcFJlc3VsdD86IHN0cmluZztcbiAgfSk6IFByb21pc2U8RXhlY3V0ZUFnZW50UmVzdWx0ICYge1xuICAgIHByZXZpb3VzU3RhdGU6IHtcbiAgICAgIGdvYWxzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgICBwcm9ncmVzcz86IG51bWJlcjtcbiAgICAgIH0+O1xuICAgICAgcmVjZW50RGVjaXNpb25zOiBBcnJheTx7XG4gICAgICAgIGRlY2lzaW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICAgICAgICBvdXRjb21lPzogc3RyaW5nO1xuICAgICAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgc2Vzc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBsYXN0QWN0aXZlOiBzdHJpbmc7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICAgIGNvbnRpbnVhdGlvbjoge1xuICAgICAgaXNSZXN1bWluZzogYm9vbGVhbjtcbiAgICAgIHByZXZpb3VzU3RlcFJlc3VsdD86IHN0cmluZztcbiAgICAgIHN1Z2dlc3RlZE5leHRTdGVwcz86IHN0cmluZ1tdO1xuICAgIH07XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEdldCBjdXJyZW50IHN0YXRlXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGFjdGl2ZUdvYWwgPSBzdGF0ZS5nb2Fscy5maW5kKGdvYWwgPT4gZ29hbC5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpO1xuXG4gICAgaWYgKCFhY3RpdmVHb2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjb250aW51ZV9leGVjdXRpb24gcmVxdWlyZXMgYW4gaW4tcHJvZ3Jlc3MgZ29hbCBmb3IgYWdlbnQgJyR7cGFyYW1zLmFnZW50TmFtZX0nLiBgICtcbiAgICAgICAgYFVzZSBleGVjdXRlX2FnZW50IHRvIHN0YXJ0IGEgbmV3IGdvYWwuIElmIHlvdSBhcmUgcmVwb3J0aW5nIHByb2dyZXNzIGZvciBgICtcbiAgICAgICAgYHRoZSBjdXJyZW50IGdvYWwsIHVzZSBtY3BfYXFsX2NyZWF0ZSByZWNvcmRfZXhlY3V0aW9uX3N0ZXAuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVHb2FsRGVjaXNpb25zID0gc3RhdGUuZGVjaXNpb25zLmZpbHRlcihkZWNpc2lvbiA9PiBkZWNpc2lvbi5nb2FsSWQgPT09IGFjdGl2ZUdvYWwuaWQpO1xuICAgIGlmIChhY3RpdmVHb2FsRGVjaXNpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY29udGludWVfZXhlY3V0aW9uIGlzIG9ubHkgZm9yIHJlc3VtaW5nIGEgcGF1c2VkIGV4ZWN1dGlvbiBhZnRlciBhdCBsZWFzdCBgICtcbiAgICAgICAgYG9uZSByZWNvcmRlZCBzdGVwIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIEFmdGVyIGV4ZWN1dGVfYWdlbnQsIHRoZSBgICtcbiAgICAgICAgYG5leHQgbGlmZWN5Y2xlIGNhbGwgaXMgbWNwX2FxbF9jcmVhdGUgcmVjb3JkX2V4ZWN1dGlvbl9zdGVwLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gQ2hlY2sgaWYgYWdlbnQgaGFzIGJlZW4gZXhlY3V0ZWQgYmVmb3JlXG4gICAgY29uc3QgaXNSZXN1bWluZyA9IHN0YXRlLnNlc3Npb25Db3VudCA+IDAgfHwgc3RhdGUuZGVjaXNpb25zLmxlbmd0aCA+IDA7XG5cbiAgICAvLyA0LiBFeGVjdXRlIGFnZW50IG5vcm1hbGx5ICh0aGlzIGFjdGl2YXRlcyBlbGVtZW50cyBhbmQgZ2V0cyBjb250ZXh0KVxuICAgIGNvbnN0IGV4ZWN1dGlvblBhcmFtcyA9IHBhcmFtcy5wYXJhbWV0ZXJzIHx8IHt9O1xuXG4gICAgY29uc3QgZXhlY3V0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlQWdlbnQoXG4gICAgICBwYXJhbXMuYWdlbnROYW1lLFxuICAgICAgZXhlY3V0aW9uUGFyYW1zLFxuICAgICAgeyBvcGVyYXRpb25OYW1lOiAnY29udGludWVfZXhlY3V0aW9uJyB9XG4gICAgKTtcblxuICAgIC8vIDUuIEJ1aWxkIHByZXZpb3VzIHN0YXRlIHN1bW1hcnlcbiAgICBjb25zdCByZWNlbnREZWNpc2lvbnMgPSBzdGF0ZS5kZWNpc2lvbnMuc2xpY2UoLTUpLm1hcChkID0+ICh7XG4gICAgICBkZWNpc2lvbjogZC5kZWNpc2lvbixcbiAgICAgIHJlYXNvbmluZzogZC5yZWFzb25pbmcsXG4gICAgICBvdXRjb21lOiBkLm91dGNvbWUsXG4gICAgICB0aW1lc3RhbXA6IGQudGltZXN0YW1wLnRvSVNPU3RyaW5nKClcbiAgICB9KSk7XG5cbiAgICBjb25zdCBnb2FsU3VtbWFyeSA9IHN0YXRlLmdvYWxzLm1hcChnID0+ICh7XG4gICAgICBpZDogZy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnLmRlc2NyaXB0aW9uLFxuICAgICAgc3RhdHVzOiBnLnN0YXR1cyxcbiAgICAgIHByb2dyZXNzOiB1bmRlZmluZWQgLy8gQ291bGQgYWRkIHByb2dyZXNzIHRyYWNraW5nIGluIGZ1dHVyZVxuICAgIH0pKTtcblxuICAgIC8vIDYuIEdlbmVyYXRlIHN1Z2dlc3RlZCBuZXh0IHN0ZXBzIGJhc2VkIG9uIHN0YXRlXG4gICAgY29uc3Qgc3VnZ2VzdGVkTmV4dFN0ZXBzID0gdGhpcy5nZW5lcmF0ZU5leHRTdGVwcyhzdGF0ZSk7XG5cbiAgICAvLyA3LiBNZXJnZSBleGVjdXRpb24gcmVzdWx0IHdpdGggY29udGludWF0aW9uIGNvbnRleHRcbiAgICByZXR1cm4ge1xuICAgICAgLy8gSW5jbHVkZSBhbGwgZmllbGRzIGZyb20gZXhlY3V0ZV9hZ2VudCByZXN1bHRcbiAgICAgIC4uLmV4ZWN1dGlvblJlc3VsdCxcblxuICAgICAgLy8gQWRkIHByZXZpb3VzIHN0YXRlIGluZm9ybWF0aW9uXG4gICAgICBwcmV2aW91c1N0YXRlOiB7XG4gICAgICAgIGdvYWxzOiBnb2FsU3VtbWFyeSxcbiAgICAgICAgcmVjZW50RGVjaXNpb25zLFxuICAgICAgICBzZXNzaW9uQ291bnQ6IHN0YXRlLnNlc3Npb25Db3VudCxcbiAgICAgICAgbGFzdEFjdGl2ZTogc3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9LFxuXG4gICAgICAvLyBBZGQgY29udGludWF0aW9uIGNvbnRleHRcbiAgICAgIGNvbnRpbnVhdGlvbjoge1xuICAgICAgICBpc1Jlc3VtaW5nLFxuICAgICAgICBwcmV2aW91c1N0ZXBSZXN1bHQ6IHBhcmFtcy5wcmV2aW91c1N0ZXBSZXN1bHQsXG4gICAgICAgIHN1Z2dlc3RlZE5leHRTdGVwc1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgc3VnZ2VzdGVkIG5leHQgc3RlcHMgYmFzZWQgb24gY3VycmVudCBzdGF0ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU5leHRTdGVwcyhzdGF0ZTogQWdlbnRTdGF0ZSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdWdnZXN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIENoZWNrIGZvciBwZW5kaW5nIGdvYWxzXG4gICAgY29uc3QgcGVuZGluZ0dvYWxzID0gc3RhdGUuZ29hbHMuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdwZW5kaW5nJyk7XG4gICAgaWYgKHBlbmRpbmdHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBTdGFydCB3b3JrIG9uICR7cGVuZGluZ0dvYWxzLmxlbmd0aH0gcGVuZGluZyBnb2FsKHMpYCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGluLXByb2dyZXNzIGdvYWxzXG4gICAgY29uc3QgaW5Qcm9ncmVzc0dvYWxzID0gc3RhdGUuZ29hbHMuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpO1xuICAgIGlmIChpblByb2dyZXNzR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgQ29udGludWUgJHtpblByb2dyZXNzR29hbHMubGVuZ3RofSBpbi1wcm9ncmVzcyBnb2FsKHMpYCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGJsb2NrZWQgZ29hbHMgKGRlcGVuZGVuY2llcylcbiAgICBjb25zdCBibG9ja2VkR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PlxuICAgICAgZy5kZXBlbmRlbmNpZXMgJiYgZy5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCAmJiBnLnN0YXR1cyA9PT0gJ3BlbmRpbmcnXG4gICAgKTtcbiAgICBpZiAoYmxvY2tlZEdvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFJlc29sdmUgZGVwZW5kZW5jaWVzIGZvciAke2Jsb2NrZWRHb2Fscy5sZW5ndGh9IGJsb2NrZWQgZ29hbChzKWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGRlY2lzaW9uIGhpc3RvcnkgZm9yIGZhaWx1cmVzXG4gICAgY29uc3QgcmVjZW50RmFpbHVyZXMgPSBzdGF0ZS5kZWNpc2lvbnNcbiAgICAgIC5zbGljZSgtMTApXG4gICAgICAuZmlsdGVyKGQgPT4gZC5vdXRjb21lID09PSAnZmFpbHVyZScpO1xuICAgIGlmIChyZWNlbnRGYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBSZXZpZXcgYW5kIGFkZHJlc3MgJHtyZWNlbnRGYWlsdXJlcy5sZW5ndGh9IHJlY2VudCBmYWlsdXJlKHMpYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Z2dlc3Rpb25zO1xuICB9XG59XG4iXX0=