@dollhousemcp/mcp-server 2.0.35 → 2.0.36

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 (31) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  3. package/dist/elements/base/BaseElementManager.js +6 -2
  4. package/dist/elements/memories/Memory.d.ts.map +1 -1
  5. package/dist/elements/memories/Memory.js +9 -2
  6. package/dist/elements/memories/MemoryManager.d.ts +13 -0
  7. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  8. package/dist/elements/memories/MemoryManager.js +57 -44
  9. package/dist/elements/memories/constants.js +2 -2
  10. package/dist/generated/version.d.ts +2 -2
  11. package/dist/generated/version.js +3 -3
  12. package/dist/handlers/GitHubAuthHandler.d.ts +12 -0
  13. package/dist/handlers/GitHubAuthHandler.d.ts.map +1 -1
  14. package/dist/handlers/GitHubAuthHandler.js +303 -60
  15. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +62 -0
  16. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  17. package/dist/handlers/mcp-aql/MCPAQLHandler.js +209 -34
  18. package/dist/security/contentValidator.d.ts +32 -1
  19. package/dist/security/contentValidator.d.ts.map +1 -1
  20. package/dist/security/contentValidator.js +74 -31
  21. package/dist/security/secureYamlParser.d.ts.map +1 -1
  22. package/dist/security/secureYamlParser.js +5 -2
  23. package/dist/security/tokenManager.d.ts +1 -1
  24. package/dist/security/tokenManager.d.ts.map +1 -1
  25. package/dist/security/tokenManager.js +10 -7
  26. package/dist/storage/MemoryMetadataExtractor.d.ts +4 -1
  27. package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
  28. package/dist/storage/MemoryMetadataExtractor.js +7 -3
  29. package/oauth-helper.mjs +233 -92
  30. package/package.json +1 -1
  31. package/server.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.36] - 2026-07-03
4
+
5
+ - Fix silent memory data loss: `addEntry` reported success while entries were never persisted when a memory's serialized YAML exceeded 64KB. Saves now persist correctly and surface errors instead of failing silently. (#2329, #2330, #2332)
6
+ - Fix GitHub OAuth helper token handoff so the helper stores tokens through TokenManager instead of plaintext fallback files, with hardened result/state handling, slow_down backoff, and sanitized diagnostics. (#2325)
7
+
3
8
  ## [2.0.35] - 2026-06-23
4
9
 
5
10
  - Harden converter and CLI output path handling to keep generated files inside their intended output directories.
@@ -1 +1 @@
1
- {"version":3,"file":"BaseElementManager.d.ts","sourceRoot":"","sources":["../../../src/elements/base/BaseElementManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BaseElementManager.d.ts","sourceRoot":"","sources":["../../../src/elements/base/BaseElementManager.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,7 @@ import { ElementEventDispatcher } from '../../events/ElementEventDispatcher.js';
30
30
  import { ElementTransactionScope } from './ElementTransactionScope.js';
31
31
  import { ElementStorageLayer } from '../../storage/ElementStorageLayer.js';
32
32
  import { getGatekeeperAuthoringErrors } from '../../handlers/mcp-aql/policies/ElementPolicies.js';
33
+ import { MEMORY_CONSTANTS } from '../memories/constants.js';
33
34
  import { getValidatedScanCooldown, getValidatedElementCacheTTL, getValidatedPathCacheTTL } from '../../config/performance-constants.js';
34
35
  const DEFAULT_ELEMENT_CACHE_TTL_MS = getValidatedElementCacheTTL();
35
36
  const DEFAULT_PATH_CACHE_TTL_MS = getValidatedPathCacheTTL();
@@ -448,7 +449,10 @@ export class BaseElementManager {
448
449
  }
449
450
  }
450
451
  else if (this.elementType === ElementType.MEMORY) {
451
- const rawYaml = SecureYamlParser.parseRawYaml(content, SECURITY_LIMITS.MAX_YAML_LENGTH);
452
+ // Issue #2329: memories are whole pure-YAML documents capped at MAX_YAML_SIZE
453
+ // (256KB) on save and load — MAX_YAML_LENGTH (64KB) is a frontmatter limit
454
+ // and rejected every save of a memory that grew past it.
455
+ const rawYaml = SecureYamlParser.parseRawYaml(content, MEMORY_CONSTANTS.MAX_YAML_SIZE);
452
456
  validateGatekeeperMetadata(rawYaml, 'YAML root');
453
457
  if (rawYaml.metadata && typeof rawYaml.metadata === 'object' && !Array.isArray(rawYaml.metadata)) {
454
458
  validateGatekeeperMetadata(rawYaml.metadata, 'metadata');
@@ -1052,4 +1056,4 @@ export class BaseElementManager {
1052
1056
  return result.errors.map(e => ({ field: 'general', message: e }));
1053
1057
  }
1054
1058
  }
1055
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDbEcsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFD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S0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2VFbGVtZW50TWFuYWdlciAtIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBlbGVtZW50IG1hbmFnZXJzXG4gKlxuICogUHJvdmlkZXMgY29tbW9uIENSVUQgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMgdXNpbmcgdGhlXG4gKiBUZW1wbGF0ZSBNZXRob2QgUGF0dGVybjpcbiAqIC0gRGVmaW5lcyB0aGUgc2tlbGV0b24gb2Ygb3BlcmF0aW9ucyBpbiBiYXNlIGNsYXNzXG4gKiAtIExldHMgc3ViY2xhc3NlcyBvdmVycmlkZSBzcGVjaWZpYyBzdGVwcyB3aXRob3V0IGNoYW5naW5nIHN0cnVjdHVyZVxuICpcbiAqIFN1YmNsYXNzZXM6IFNraWxsTWFuYWdlciwgVGVtcGxhdGVNYW5hZ2VyLCBBZ2VudE1hbmFnZXIsIE1lbW9yeU1hbmFnZXJcbiAqXG4gKiBTRUNVUklUWTpcbiAqIDEuIENSSVRJQ0FMOiBVc2VzIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIHJlYWQvd3JpdGUgb3BlcmF0aW9uc1xuICogMi4gSElHSDogUGF0aCB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb24gdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0YWNrc1xuICogMy4gTUVESVVNOiBTZWN1cml0eSBldmVudCBsb2dnaW5nIGZvciBhdWRpdCB0cmFpbFxuICogNC4gTUVESVVNOiBJbnB1dCB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb24gdGhyb3VnaG91dFxuICovXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnQsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZXJyb3JzLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4uLy4uL2NhY2hlL0xSVUNhY2hlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBQYXRoVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50RXZlbnREaXNwYXRjaGVyLCBFbGVtZW50RXZlbnRQYXlsb2FkIH0gZnJvbSAnLi4vLi4vZXZlbnRzL0VsZW1lbnRFdmVudERpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUgfSBmcm9tICcuL0VsZW1lbnRUcmFuc2FjdGlvblNjb3BlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB0eXBlIEVsZW1lbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL0VsZW1lbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRWxlbWVudFN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvRWxlbWVudFN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7IElTdG9yYWdlTGF5ZXIgfSBmcm9tICcuLi8uLi9zdG9yYWdlL0lTdG9yYWdlTGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50SW5kZXhFbnRyeSB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0R2F0ZWtlZXBlckF1dGhvcmluZ0Vycm9ycyB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcbmltcG9ydCB7XG4gIGdldFZhbGlkYXRlZFNjYW5Db29sZG93bixcbiAgZ2V0VmFsaWRhdGVkRWxlbWVudENhY2hlVFRMLFxuICBnZXRWYWxpZGF0ZWRQYXRoQ2FjaGVUVExcbn0gZnJvbSAnLi4vLi4vY29uZmlnL3BlcmZvcm1hbmNlLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IENhY2hlTWVtb3J5QnVkZ2V0IH0gZnJvbSAnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnO1xuaW1wb3J0IHR5cGUgeyBCYWNrdXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcyc7XG5cbmNvbnN0IERFRkFVTFRfRUxFTUVOVF9DQUNIRV9UVExfTVMgPSBnZXRWYWxpZGF0ZWRFbGVtZW50Q2FjaGVUVEwoKTtcbmNvbnN0IERFRkFVTFRfUEFUSF9DQUNIRV9UVExfTVMgPSBnZXRWYWxpZGF0ZWRQYXRoQ2FjaGVUVEwoKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlRWxlbWVudE1hbmFnZXJPcHRpb25zIHtcbiAgZWxlbWVudERpck92ZXJyaWRlPzogc3RyaW5nO1xuICBldmVudERpc3BhdGNoZXI/OiBFbGVtZW50RXZlbnREaXNwYXRjaGVyO1xuICBlbGVtZW50Q2FjaGVUVEw/OiBudW1iZXI7XG4gIHBhdGhDYWNoZVRUTD86IG51bWJlcjtcbiAgZW5hYmxlRmlsZVdhdGNoZXI/OiBib29sZWFuO1xuICBhdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZT86IGJvb2xlYW47XG4gIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlO1xuICBtZW1vcnlCdWRnZXQ/OiBDYWNoZU1lbW9yeUJ1ZGdldDtcbiAgYmFja3VwU2VydmljZT86IEJhY2t1cFNlcnZpY2U7XG59XG5cbi8qKlxuICogUmVjb3JkIG9mIGFuIGVsZW1lbnQgdGhhdCBmYWlsZWQgdG8gbG9hZCAoSXNzdWUgIzcwOCkuXG4gKiBTdG9yZWQgc28gY2FsbGVycyBjYW4gZGlzdGluZ3Vpc2ggXCJmaWxlIG5vdCBmb3VuZFwiIGZyb20gXCJmaWxlIGludmFsaWRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZhbGlkRWxlbWVudFJlY29yZCB7XG4gIC8qKiBSZWxhdGl2ZSBmaWxlIHBhdGggd2l0aGluIHRoZSBlbGVtZW50IGRpcmVjdG9yeS4gKi9cbiAgZmlsZVBhdGg6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHJlYXNvbiB0aGUgZWxlbWVudCB3YXMgcmVqZWN0ZWQuICovXG4gIHJlYXNvbjogc3RyaW5nO1xuICAvKiogSVNPIHRpbWVzdGFtcCBvZiBsYXN0IGZhaWxlZCBsb2FkIGF0dGVtcHQuICovXG4gIGZhaWxlZEF0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBpbXBsZW1lbnRpbmcgY29tbW9uIGVsZW1lbnQgbWFuYWdlbWVudCBvcGVyYXRpb25zXG4gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgbG9naWMgdmlhIGFic3RyYWN0IG1ldGhvZHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFbGVtZW50TWFuYWdlcjxUIGV4dGVuZHMgSUVsZW1lbnQ+IGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPFQ+IHtcbiAgcHJvdGVjdGVkIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByb3RlY3RlZCBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcjtcbiAgcHJvdGVjdGVkIGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByb3RlY3RlZCBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZTtcbiAgcHJvdGVjdGVkIGVsZW1lbnREaXI6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgKiBPYnRhaW5lZCBmcm9tIFZhbGlkYXRpb25SZWdpc3RyeSBkdXJpbmcgY29uc3RydWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdG9yOiBFbGVtZW50VmFsaWRhdG9yO1xuXG4gIC8vIFByaW1hcnkgY2FjaGU6IElEIOKGkiBFbGVtZW50ICh3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzKVxuICBwcm90ZWN0ZWQgZWxlbWVudHM6IExSVUNhY2hlPFQ+O1xuXG4gIC8vIFJldmVyc2UgaW5kZXg6IEFic29sdXRlIEZpbGVQYXRoIOKGkiBFbGVtZW50IElEICh3aXRoIHNpemUgbGltaXRzKVxuICBwcml2YXRlIGZpbGVQYXRoVG9JZDogTFJVQ2FjaGU8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50R2VuZXJhdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIGNhY2hlR2VuZXJhdGlvbkNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHdhdGNoZXJDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudERpc3BhdGNoZXI6IEVsZW1lbnRFdmVudERpc3BhdGNoZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeUJ1ZGdldD86IENhY2hlTWVtb3J5QnVkZ2V0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmFja3VwU2VydmljZT86IEJhY2t1cFNlcnZpY2U7XG5cbiAgLyoqIE1hcCBwbHVyYWwgRWxlbWVudFR5cGUgZW51bSB2YWx1ZXMgdG8gc2luZ3VsYXIgQ29udGVudFZhbGlkYXRvciBjb250ZXh0LlxuICAgKiAgUGFydGlhbCBiZWNhdXNlIG5vdCBhbGwgZWxlbWVudCB0eXBlcyBoYXZlIGEgY29udGVudCBjb250ZXh0IChlLmcuLCBlbnNlbWJsZXMpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFTEVNRU5UX1RZUEVfVE9fQ09OVEVYVDogUGFydGlhbDxSZWNvcmQ8RWxlbWVudFR5cGUsICdwZXJzb25hJyB8ICdza2lsbCcgfCAndGVtcGxhdGUnIHwgJ2FnZW50JyB8ICdtZW1vcnknPj4gPSB7XG4gICAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAncGVyc29uYScsXG4gICAgW0VsZW1lbnRUeXBlLlNLSUxMXTogJ3NraWxsJyxcbiAgICBbRWxlbWVudFR5cGUuVEVNUExBVEVdOiAndGVtcGxhdGUnLFxuICAgIFtFbGVtZW50VHlwZS5BR0VOVF06ICdhZ2VudCcsXG4gICAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICdtZW1vcnknLFxuICB9O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdG9yYWdlTGF5ZXI6IElTdG9yYWdlTGF5ZXI7XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IEVsZW1lbnRzIHRoYXQgZXhpc3Qgb24gZGlzayBidXQgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIEtleWVkIGJ5IHJlbGF0aXZlIGZpbGUgcGF0aCBmb3IgZGVkdXBsaWNhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW52YWxpZEVsZW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIEludmFsaWRFbGVtZW50UmVjb3JkPigpO1xuXG4gIC8qKlxuICAgKiBUcmFja3MgZmlsZSBwYXRocyB3aG9zZSBsb2FkIGZhaWx1cmUgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYXQgZXJyb3IgbGV2ZWwuXG4gICAqIFJlcGVhdGVkIGZhaWx1cmVzIHdpdGggdGhlIHNhbWUgcmVhc29uIGFyZSBkZW1vdGVkIHRvIGRlYnVnIHRvIGF2b2lkIGxvZyBmbG9vZGluZy5cbiAgICogQ2xlYXJlZCB3aGVuIHRoZSBmaWxlIGNoYW5nZXMgb24gZGlzayBvciBsb2FkcyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cHByZXNzZWRMb2FkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtb3N0IHJlY2VudCBsb2FkKCkgZmFpbHVyZSBmb3IgdGhpcyBwYXRoIHdhcyBzdXBwcmVzc2VkXG4gICAqIGJlY2F1c2UgaXQgd2FzIGEgcmVwZWF0IG9mIGFuIGFscmVhZHktbG9nZ2VkIGVycm9yLlxuICAgKiBTdWJjbGFzc2VzIGNhbiB1c2UgdGhpcyB0byBhdm9pZCBkdXBsaWNhdGUgc2VjdXJpdHkgZXZlbnQgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gUmVsYXRpdmUgZmlsZSBwYXRoIHdpdGhpbiB0aGUgZWxlbWVudCBkaXJlY3RvcnlcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZXJyb3IgZm9yIHRoaXMgcGF0aCBpcyBjdXJyZW50bHkgc3VwcHJlc3NlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzTG9hZEVycm9yU3VwcHJlc3NlZChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5oYXMoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFmdGVyTG9hZD8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBiZWZvcmVTYXZlPyhlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIGFmdGVyU2F2ZT8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBmaW5kQnlJZGVudGlmaWVyPyhpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICBwcm90ZWN0ZWQgY2FuRGVsZXRlPyhlbGVtZW50OiBUKTogUHJvbWlzZTx7IGFsbG93ZWQ6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9PjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFja3VwIGJlZm9yZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmaWxlLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBuby1vcCAoZS5nLiBNZW1vcnlNYW5hZ2VyIGhhcyBpdHMgb3duIGJhY2t1cCBzeXN0ZW0pLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUJhY2t1cEJlZm9yZVNhdmUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYmFja3VwU2VydmljZSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuYmFja3VwU2VydmljZS5iYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFja3VwIGJlZm9yZSBkZWxldGluZyBhIGZpbGUgKG1vdmVzIGZpbGUgdG8gYmFja3VwIGRpcikuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3JpZ2luYWwgZmlsZSB3YXMgbW92ZWQgKGNhbGxlciBzaG91bGQgc2tpcCBkZWxldGVGaWxlKS5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gbm8tb3AgKGUuZy4gTWVtb3J5TWFuYWdlciBoYXMgaXRzIG93biBiYWNrdXAgc3lzdGVtKS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVEZWxldGUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuYmFja3VwU2VydmljZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYmFja3VwU2VydmljZS5iYWNrdXBCZWZvcmVEZWxldGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlKTtcbiAgICByZXR1cm4gISFyZXN1bHQubW92ZWRPcmlnaW5hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGV2ZW50IGRpc3BhdGNoZXIgZm9yIHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIGVtaXQgY3VzdG9tIGV2ZW50cy5cbiAgICpcbiAgICogQmFzZUVsZW1lbnRNYW5hZ2VyIGhhbmRsZXMgc3RhbmRhcmQgbGlmZWN5Y2xlIGV2ZW50cyAobG9hZCwgc2F2ZSwgZGVsZXRlKSBhdXRvbWF0aWNhbGx5LlxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyBnZXR0ZXIgb25seSB3aGVuIHRoZXkgbmVlZCB0byBlbWl0IGFkZGl0aW9uYWwgZG9tYWluLXNwZWNpZmljXG4gICAqIGV2ZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQgQ1JVRCBsaWZlY3ljbGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFBlcnNvbmFNYW5hZ2VyIGVtaXRzIGFjdGl2YXRpb24vZGVhY3RpdmF0aW9uIGV2ZW50c1xuICAgKiB0aGlzLmRpc3BhdGNoZXIuZW1pdCgnZWxlbWVudDphY3RpdmF0ZScsIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsuLi59KSk7XG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBFbGVtZW50RXZlbnREaXNwYXRjaGVyIGluc3RhbmNlIHVzZWQgYnkgdGhpcyBtYW5hZ2VyXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRpc3BhdGNoZXIoKTogRWxlbWVudEV2ZW50RGlzcGF0Y2hlciB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnREaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8gQ2FjaGUgY29uZmlndXJhdGlvbiBjb25zdGFudHNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0VMRU1FTlRfQ0FDSEVfU0laRSA9IDEwMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9QQVRIX0NBQ0hFX1NJWkUgPSAxMDAwO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciAtIGluaXRpYWxpemVzIGNvbW1vbiBkZXBlbmRlbmNpZXNcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gVGhlIHR5cGUgb2YgZWxlbWVudCB0aGlzIG1hbmFnZXIgaGFuZGxlc1xuICAgKiBAcGFyYW0gcG9ydGZvbGlvTWFuYWdlciAtIFBvcnRmb2xpbyBtYW5hZ2VyIGZvciBkaXJlY3RvcnkgcmVzb2x1dGlvblxuICAgKiBAcGFyYW0gZmlsZUxvY2tNYW5hZ2VyIC0gRmlsZSBsb2NrIG1hbmFnZXIgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBmaWxlV2F0Y2hTZXJ2aWNlXG4gICAqIEBwYXJhbSBmaWxlT3BlcmF0aW9uc1NlcnZpY2UgLSBTZXJ2aWNlIGZvciBmaWxlIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHZhbGlkYXRpb25SZWdpc3RyeSAtIFJlZ2lzdHJ5IGZvciBvYnRhaW5pbmcgdHlwZS1zcGVjaWZpYyB2YWxpZGF0b3JzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBvcHRpb25zOiBCYXNlRWxlbWVudE1hbmFnZXJPcHRpb25zID0ge30sXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnlcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IHBvcnRmb2xpb01hbmFnZXI7XG4gICAgdGhpcy5maWxlTG9ja01hbmFnZXIgPSBmaWxlTG9ja01hbmFnZXI7XG4gICAgdGhpcy5maWxlT3BlcmF0aW9ucyA9IGZpbGVPcGVyYXRpb25zU2VydmljZTtcbiAgICB0aGlzLmZpbGVXYXRjaFNlcnZpY2UgPSBvcHRpb25zLmZpbGVXYXRjaFNlcnZpY2U7XG4gICAgdGhpcy5iYWNrdXBTZXJ2aWNlID0gb3B0aW9ucy5iYWNrdXBTZXJ2aWNlO1xuXG4gICAgLy8gR2V0IHRoZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIHRoaXMgZWxlbWVudCB0eXBlXG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdG9yKGVsZW1lbnRUeXBlKTtcblxuICAgIGNvbnN0IGVsZW1lbnRDYWNoZVRUTCA9IG9wdGlvbnMuZWxlbWVudENhY2hlVFRMID8/IERFRkFVTFRfRUxFTUVOVF9DQUNIRV9UVExfTVM7XG4gICAgY29uc3QgcGF0aENhY2hlVFRMID0gb3B0aW9ucy5wYXRoQ2FjaGVUVEwgPz8gREVGQVVMVF9QQVRIX0NBQ0hFX1RUTF9NUztcbiAgICB0aGlzLm1lbW9yeUJ1ZGdldCA9IG9wdGlvbnMubWVtb3J5QnVkZ2V0O1xuXG4gICAgY29uc3Qgb25TZXRDYWxsYmFjayA9IHRoaXMubWVtb3J5QnVkZ2V0XG4gICAgICA/ICgpID0+IHRoaXMubWVtb3J5QnVkZ2V0IS5lbmZvcmNlKClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBMUlUgY2FjaGVzIHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICB0aGlzLmVsZW1lbnRzID0gbmV3IExSVUNhY2hlPFQ+KHtcbiAgICAgIG5hbWU6IGBlbGVtZW50czoke2VsZW1lbnRUeXBlfWAsXG4gICAgICBtYXhTaXplOiBCYXNlRWxlbWVudE1hbmFnZXIuTUFYX0VMRU1FTlRfQ0FDSEVfU0laRSxcbiAgICAgIG1heE1lbW9yeU1COiA1MCwgLy8gTWF4IDUwTUIgZm9yIGVsZW1lbnQgY2FjaGVcbiAgICAgIHR0bE1zOiBlbGVtZW50Q2FjaGVUVEwsXG4gICAgICBvblNldDogb25TZXRDYWxsYmFjayxcbiAgICB9KTtcblxuICAgIHRoaXMuZmlsZVBhdGhUb0lkID0gbmV3IExSVUNhY2hlPHN0cmluZz4oe1xuICAgICAgbmFtZTogYHBhdGhJbmRleDoke2VsZW1lbnRUeXBlfWAsXG4gICAgICBtYXhTaXplOiBCYXNlRWxlbWVudE1hbmFnZXIuTUFYX1BBVEhfQ0FDSEVfU0laRSxcbiAgICAgIG1heE1lbW9yeU1COiAxMCwgLy8gTWF4IDEwTUIgZm9yIHBhdGggbWFwcGluZ3NcbiAgICAgIHR0bE1zOiBwYXRoQ2FjaGVUVEwsXG4gICAgICBvblNldDogb25TZXRDYWxsYmFjayxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyIGNhY2hlcyB3aXRoIGdsb2JhbCBtZW1vcnkgYnVkZ2V0XG4gICAgaWYgKHRoaXMubWVtb3J5QnVkZ2V0KSB7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC5yZWdpc3Rlcih0aGlzLmVsZW1lbnRzKTtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnJlZ2lzdGVyKHRoaXMuZmlsZVBhdGhUb0lkKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5lbGVtZW50RGlyT3ZlcnJpZGUpIHtcbiAgICAgIHRoaXMuZWxlbWVudERpciA9IG9wdGlvbnMuZWxlbWVudERpck92ZXJyaWRlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mICh0aGlzLnBvcnRmb2xpb01hbmFnZXIgYXMgYW55KS5nZXRFbGVtZW50RGlyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmVsZW1lbnREaXIgPSAodGhpcy5wb3J0Zm9saW9NYW5hZ2VyIGFzIGFueSkuZ2V0RWxlbWVudERpcihlbGVtZW50VHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuYWJsZSB0byByZXNvbHZlIGVsZW1lbnQgZGlyZWN0b3J5IGZvciAke2VsZW1lbnRUeXBlfS4gYCArXG4gICAgICAgICdQcm92aWRlIGFuIGVsZW1lbnREaXJPdmVycmlkZSB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBtYW5hZ2VyLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBvcHRpb25zLmV2ZW50RGlzcGF0Y2hlciA/PyBFbGVtZW50RXZlbnREaXNwYXRjaGVyLmdldFNoYXJlZERpc3BhdGNoZXIoKTtcbiAgICB0aGlzLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlID1cbiAgICAgIG9wdGlvbnMuYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2UgPz8gcHJvY2Vzcy5lbnYuQVVUT19SRUxPQURfT05fRVhURVJOQUxfQ0hBTkdFID09PSAndHJ1ZSc7XG5cbiAgICBjb25zdCBlbmFibGVXYXRjaGVyID0gb3B0aW9ucy5lbmFibGVGaWxlV2F0Y2hlciA/PyBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU5BQkxFX0ZJTEVfV0FUQ0hFUiA9PT0gJ3RydWUnO1xuICAgIGlmIChlbmFibGVXYXRjaGVyICYmIHRoaXMuZmlsZVdhdGNoU2VydmljZSkge1xuICAgICAgdGhpcy53YXRjaGVyQ2xlYW51cCA9IHRoaXMuZmlsZVdhdGNoU2VydmljZS53YXRjaERpcmVjdG9yeShcbiAgICAgICAgdGhpcy5lbGVtZW50RGlyLFxuICAgICAgICAocmVsYXRpdmVQYXRoKSA9PiB0aGlzLmhhbmRsZUV4dGVybmFsQ2hhbmdlKHJlbGF0aXZlUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIgPSB0aGlzLmNyZWF0ZVN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyB0aGUgc3RvcmFnZSBsYXllci5cbiAgICogRGVmYXVsdCByZXR1cm5zIEVsZW1lbnRTdG9yYWdlTGF5ZXIgZm9yIC5tZCBlbGVtZW50cy5cbiAgICogU3ViY2xhc3NlcyAoZS5nLiBNZW1vcnlNYW5hZ2VyKSBjYW4gb3ZlcnJpZGUgdG8gcmV0dXJuIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSk6IElTdG9yYWdlTGF5ZXIge1xuICAgIHJldHVybiBuZXcgRWxlbWVudFN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHtcbiAgICAgIGVsZW1lbnREaXI6IHRoaXMuZWxlbWVudERpcixcbiAgICAgIGZpbGVFeHRlbnNpb246IHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpLFxuICAgICAgc2NhbkNvb2xkb3duTXM6IGdldFZhbGlkYXRlZFNjYW5Db29sZG93bigpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmd1bGFyIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGlzIGVsZW1lbnQgdHlwZSAoZS5nLiwgXCJza2lsbFwiLCBcInBlcnNvbmFcIikuXG4gICAqIFVzZWQgaW4gZmlsZW5hbWUgZ2VuZXJhdGlvbiAoe25hbWV9LXtsYWJlbH0ubWQpIGFuZCBkaXNwbGF5IHN0cmluZ3MuXG4gICAqIE11c3QgcmV0dXJuIHRoZSBzaW5ndWxhciBmb3JtIOKAlCBub3QgdGhlIHBsdXJhbCBFbGVtZW50VHlwZSB2YWx1ZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY2FwaXRhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgZWxlbWVudCBsYWJlbC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRFbGVtZW50TGFiZWwoKTtcbiAgICByZXR1cm4gbGFiZWwuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBsYWJlbC5zbGljZSgxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGVsZW1lbnQgZnJvbSBmaWxlXG4gICAqIFRFTVBMQVRFIE1FVEhPRDogRGVmaW5lcyB0aGUgYWxnb3JpdGhtLCBzdWJjbGFzc2VzIGN1c3RvbWl6ZSBzdGVwc1xuICAgKlxuICAgKiBTRUNVUklUWSBGSVhFUyAoaW5oZXJpdGVkIGZyb20gb3JpZ2luYWwgbWFuYWdlcnMpOlxuICAgKiAtIHRoaXMuZmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKCkgcHJldmVudHMgcmFjZSBjb25kaXRpb25zXG4gICAqIC0gUGF0aCB2YWxpZGF0aW9uIHByZXZlbnRzIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAqIC0gU2VjdXJpdHkgZXZlbnQgbG9nZ2luZyBmb3IgYXVkaXQgdHJhaWxcbiAgICovXG4gIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OmxvYWQ6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRWxlbWVudEZpbGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlLCB7XG4gICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5sb2FkYFxuICAgICAgfSk7XG4gICAgICAvLyBJc3N1ZSAjODEwOiBQYXNzIGVsZW1lbnQgdHlwZSBhcyBjb250ZW50Q29udGV4dCBzbyBTZWN1cmVZYW1sUGFyc2VyIGV4ZW1wdHNcbiAgICAgIC8vIGxlZ2l0aW1hdGUgcGF0dGVybnMgKGUuZy4sIDxzY3JpcHQ+IHNlY3Rpb24gdGFncyBpbiB0ZW1wbGF0ZXMpXG4gICAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXTtcbiAgICAgIGlmICghY29udGVudENvbnRleHQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBObyBjb250ZW50Q29udGV4dCBtYXBwaW5nIGZvciBlbGVtZW50VHlwZSAnJHt0aGlzLmVsZW1lbnRUeXBlfScg4oCUIHBhcnNpbmcgd2l0aG91dCBjb250ZXh0IGV4ZW1wdGlvbnMuIEF2YWlsYWJsZTogJHtPYmplY3Qua2V5cyhCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFQpLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoY29udGVudCwgdW5kZWZpbmVkLCB7IGNvbnRlbnRDb250ZXh0IH0pO1xuXG4gICAgICAvLyBJc3N1ZSAjNjk1OiBGaWxsIGluIG1pc3NpbmcgbWV0YWRhdGEgZmllbGRzIHdpdGggc2Vuc2libGUgZGVmYXVsdHNcbiAgICAgIC8vIGJlZm9yZSBwYXJzZU1ldGFkYXRhKCkgc28gb2xkZXIgZWxlbWVudHMgd2l0aCBzcGFyc2UgZnJvbnRtYXR0ZXJcbiAgICAgIC8vIGRvbid0IGdldCByZWplY3RlZC5cbiAgICAgIHRoaXMubWlncmF0ZU1ldGFkYXRhRGVmYXVsdHMocGFyc2VkLmRhdGEsIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZC5kYXRhKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgaWYgKHRoaXMuYWZ0ZXJMb2FkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJMb2FkKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIElzc3VlICM3MDg6IENsZWFyIGFueSBwcmV2aW91cyBpbnZhbGlkIHJlY29yZCBvbiBzdWNjZXNzZnVsIGxvYWRcbiAgICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGxvYWRlZDogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG5cbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6bG9hZDpzdWNjZXNzJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSXNzdWUgIzcwODogUmVjb3JkIHRoZSBmYWlsdXJlIHNvIGNhbGxlcnMgY2FuIGRpc3Rpbmd1aXNoXG4gICAgICAvLyBcImZpbGUgbm90IGZvdW5kXCIgZnJvbSBcImZpbGUgZXhpc3RzIGJ1dCBmYWlsZWQgdmFsaWRhdGlvblwiLlxuICAgICAgLy8gT25seSB0cmFjayBwYXJzZS92YWxpZGF0aW9uIGVycm9ycyDigJQgRU5PRU5UIG1lYW5zIHRoZSBmaWxlIGlzIGdlbnVpbmVseVxuICAgICAgLy8gbWlzc2luZywgbm90IGludmFsaWQsIHNvIHdlIG11c3Qgbm90IHBvbGx1dGUgdGhlIGludmFsaWQgbWFwIHdpdGggaXQuXG4gICAgICBjb25zdCBpc0ZpbGVOb3RGb3VuZCA9IChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnO1xuICAgICAgbGV0IGlzUmVwZWF0RXJyb3IgPSBmYWxzZTtcblxuICAgICAgaWYgKCFpc0ZpbGVOb3RGb3VuZCkge1xuICAgICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbnZhbGlkRWxlbWVudHMuZ2V0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGlzUmVwZWF0RXJyb3IgPSBleGlzdGluZz8ucmVhc29uID09PSByZWFzb247XG5cbiAgICAgICAgdGhpcy5pbnZhbGlkRWxlbWVudHMuc2V0KHJlbGF0aXZlUGF0aCwge1xuICAgICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgcmVhc29uLFxuICAgICAgICAgIGZhaWxlZEF0OiBpc1JlcGVhdEVycm9yID8gZXhpc3RpbmchLmZhaWxlZEF0IDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVwZWF0RXJyb3IpIHtcbiAgICAgICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmFkZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFN1cHByZXNzZWQgcmVwZWF0ZWQgbG9hZCBlcnJvciBmb3IgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSAke3JlbGF0aXZlUGF0aH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAgICdlbGVtZW50OmxvYWQ6ZXJyb3InLFxuICAgICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZXJyb3IgfSlcbiAgICAgICAgKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IGZyb20gJHthYnNvbHV0ZVBhdGh9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjk1OiBQcmUtZmlsbCBtaXNzaW5nIG1ldGFkYXRhIGZpZWxkcyB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gICAqIGJlZm9yZSBwYXJzZU1ldGFkYXRhKCkgcnVucy4gVGhpcyBpbXBsZW1lbnRzIHRoZSBcInRvbGVyYW50IHJlYWRlclwiIHBhdHRlcm5cbiAgICog4oCUIHN0cmljdCBvbiBvdXRwdXQsIGxlbmllbnQgb24gaW5wdXQgZm9yIG9sZGVyL3NwYXJzZSBmcm9udG1hdHRlci5cbiAgICpcbiAgICogTXV0YXRlcyBgZGF0YWAgaW4gcGxhY2UuIExvZ3MgYSB3YXJuaW5nIGZvciBlYWNoIGRlZmF1bHRlZCBmaWVsZCBzb1xuICAgKiBvcGVyYXRvcnMga25vdyB3aGljaCBmaWxlcyBuZWVkIHVwZGF0aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBtaWdyYXRlTWV0YWRhdGFEZWZhdWx0cyhkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1pZ3JhdGVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gSW5mZXIgdHlwZSBmcm9tIHRoaXMgbWFuYWdlcidzIGVsZW1lbnQgdHlwZVxuICAgIGlmICghZGF0YS50eXBlKSB7XG4gICAgICAvLyBFbGVtZW50VHlwZSBpcyBwbHVyYWwgKCdwZXJzb25hcycsICdza2lsbHMnLCBldGMuKVxuICAgICAgLy8gU29tZSBtYW5hZ2VycyBleHBlY3Qgc2luZ3VsYXIgKCdwZXJzb25hJywgJ2FnZW50JyksIHNvbWUgcGx1cmFsLlxuICAgICAgLy8gU2V0IHRoZSBwbHVyYWwgZm9ybSDigJQgcGFyc2VNZXRhZGF0YSgpIGhhbmRsZXMgbm9ybWFsaXphdGlvbi5cbiAgICAgIGRhdGEudHlwZSA9IHRoaXMuZWxlbWVudFR5cGU7XG4gICAgICBtaWdyYXRlZC5wdXNoKCd0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8gSW5mZXIgbmFtZSBmcm9tIGZpbGVuYW1lIChzdHJpcCBleHRlbnNpb24sIHVuLXNsdWdpZnkpXG4gICAgaWYgKCFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCkpO1xuICAgICAgZGF0YS5uYW1lID0gYmFzZW5hbWU7XG4gICAgICBtaWdyYXRlZC5wdXNoKCduYW1lJyk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB2ZXJzaW9uXG4gICAgaWYgKCFkYXRhLnZlcnNpb24pIHtcbiAgICAgIGRhdGEudmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgICBtaWdyYXRlZC5wdXNoKCd2ZXJzaW9uJyk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBhdXRob3JcbiAgICBpZiAoIWRhdGEuYXV0aG9yKSB7XG4gICAgICBkYXRhLmF1dGhvciA9ICd1bmtub3duJztcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ2F1dGhvcicpO1xuICAgIH1cblxuICAgIGlmIChtaWdyYXRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtUb2xlcmFudFJlYWRlcl0gJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IFwiJHtmaWxlUGF0aH1cIjogYCArXG4gICAgICAgIGBkZWZhdWx0ZWQgbWlzc2luZyBmaWVsZHM6ICR7bWlncmF0ZWQuam9pbignLCAnKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBSZXR1cm5zIGVsZW1lbnRzIHRoYXQgZXhpc3Qgb24gZGlzayBidXQgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIENhbGxlcnMgY2FuIHVzZSB0aGlzIHRvIHJlcG9ydCBpbnZhbGlkIGVsZW1lbnRzIGluc3RlYWQgb2Ygc2lsZW50bHkgaGlkaW5nIHRoZW0uXG4gICAqL1xuICBnZXRJbnZhbGlkRWxlbWVudHMoKTogSW52YWxpZEVsZW1lbnRSZWNvcmRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmludmFsaWRFbGVtZW50cy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogQ2hlY2sgaWYgYSBzcGVjaWZpYyBmaWxlIGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBVc2VkIGJ5IGdldF9lbGVtZW50IHRvIGRpc3Rpbmd1aXNoIFwibm90IGZvdW5kXCIgZnJvbSBcImludmFsaWRcIi5cbiAgICovXG4gIGdldEludmFsaWRFbGVtZW50KG5hbWU6IHN0cmluZyk6IEludmFsaWRFbGVtZW50UmVjb3JkIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBieSBleGFjdCBwYXRoIG1hdGNoIGFuZCBieSBuYW1lLWJhc2VkIG1hdGNoXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIHJlY29yZF0gb2YgdGhpcy5pbnZhbGlkRWxlbWVudHMpIHtcbiAgICAgIGlmIChmaWxlUGF0aCA9PT0gbmFtZSkgcmV0dXJuIHJlY29yZDtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCkpO1xuICAgICAgaWYgKGJhc2VuYW1lID09PSBuYW1lIHx8IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoYmFzZW5hbWUpID09PSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpKSB7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhbiBlbGVtZW50IHRvIGZpbGVcbiAgICogVEVNUExBVEUgTUVUSE9EOiBDb21tb24gc2F2ZSBsb2dpYyB3aXRoIGhvb2tzIGZvciBjdXN0b21pemF0aW9uXG4gICAqXG4gICAqIFNFQ1VSSVRZIEZJWEVTOlxuICAgKiAtIHRoaXMuZmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZSgpIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiAtIFBhdGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRhY2tzXG4gICAqIC0gU2VjdXJpdHkgZXZlbnQgbG9nZ2luZ1xuICAgKi9cbiAgYXN5bmMgc2F2ZShlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyByZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUodGhpcy5nZXRFbGVtZW50TGFiZWwoKSwgY29ycmVsYXRpb25JZCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9FRElURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnNhdmVgLFxuICAgICAgZGV0YWlsczogYFNhdmluZyAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9OiAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gdiR7ZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy5nZXRFbGVtZW50TGFiZWwoKSxcbiAgICAgICAgYXV0aG9yOiBlbGVtZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgdmVyc2lvbjogZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OnNhdmU6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgKTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZENvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQocmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpzYXZlOnN1Y2Nlc3MnLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRSb2xsYmFjayhhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6c2F2ZTplcnJvcicsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCwgZXJyb3IgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0cmFuc2FjdGlvbi5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuYmVmb3JlU2F2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmJlZm9yZVNhdmUoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkocGF0aC5kaXJuYW1lKGFic29sdXRlUGF0aCkpO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aCk7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgIC8vIEZpeCAjOTA4OiBWYWxpZGF0ZSBzZXJpYWxpemVkIGNvbnRlbnQgYmVmb3JlIHdyaXRpbmcgKHN5bW1ldHJpYyB3aXRoIHJlYWQgcGF0aCkuXG4gICAgICAvLyBSZWFkIHBhdGggdmFsaWRhdGVzIHZpYSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkg4oaSIENvbnRlbnRWYWxpZGF0b3I7IHdyaXRlIHBhdGhcbiAgICAgIC8vIG11c3QgYXBwbHkgdGhlIHNhbWUgY2hlY2tzIHRvIHByZXZlbnQgc2F2aW5nIGNvbnRlbnQgdGhhdCB3b3VsZCBmYWlsIHRvIGxvYWQuXG4gICAgICB0aGlzLnZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKGFic29sdXRlUGF0aCwgY29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgaWYgKHRoaXMuYWZ0ZXJTYXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJTYXZlKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IHNhdmVkOiAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBzZXJpYWxpemVkIGVsZW1lbnQgY29udGVudCBiZWZvcmUgd3JpdGluZyB0byBkaXNrLlxuICAgKiBGaXggIzkwODogTWlycm9ycyB0aGUgcmVhZC1wYXRoIHZhbGlkYXRpb24gZnJvbSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKClcbiAgICogdG8gZW5zdXJlIHdyaXRlIOKGkiByZWFkIHN5bW1ldHJ5LiBDb250ZW50IHRoYXQgZmFpbHMgdGhpcyBjaGVjayB3b3VsZCBhbHNvXG4gICAqIGZhaWwgdG8gbG9hZCwgc28gcmVqZWN0aW5nIGl0IG9uIHdyaXRlIHByZXZlbnRzIHBlcm1hbmVudGx5IGJyb2tlbiBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTZXJpYWxpemVkQ29udGVudChjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YSA9IChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLCBzb3VyY2VMYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBnZXRHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzKHJlY29yZCk7XG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5IGluIHNlcmlhbGl6ZWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSAke3NvdXJjZUxhYmVsfTogJHtbLi4ubmV3IFNldChlcnJvcnMpXS5qb2luKCc7ICcpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0cmFjdCBmcm9udG1hdHRlciBpZiBwcmVzZW50IChTb25hckNsb3VkIFM2NTk0OiB1c2UgUmVnRXhwLmV4ZWMpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXJSZWdleCA9IC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vO1xuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBmcm9udG1hdHRlclJlZ2V4LmV4ZWMoY29udGVudCk7XG5cbiAgICBpZiAoZnJvbnRtYXR0ZXJNYXRjaCkge1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgICAgY29uc3QgYm9keUNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZyhmcm9udG1hdHRlck1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgIC8vIFlBTUwgYm9tYiBkZXRlY3Rpb24gKG1pcnJvcnMgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIHN0ZXAgNCkuXG4gICAgICAvLyBPbmx5IHJ1biB3aGVuIFlBTUwgaXMgdW5kZXIgTUFYX1lBTUxfTEVOR1RIICg2NEtCKSDigJQgdGhlIHNhbWUgbGltaXRcbiAgICAgIC8vIHVzZWQgYnkgdGhlIHJlYWQgcGF0aCBpbiBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkuIHZhbGlkYXRlWWFtbENvbnRlbnQoKVxuICAgICAgLy8gaW5jbHVkZXMgaXRzIG93biBzaXplIGNoZWNrIGludGVybmFsbHksIGFuZCB3ZSBpbnRlbnRpb25hbGx5IHNraXAgc2l6ZVxuICAgICAgLy8gZW5mb3JjZW1lbnQgb24gdGhlIHdyaXRlIHBhdGggYmVjYXVzZSB0aGUgc2VyaWFsaXplciBtYXkgcHJvZHVjZSBsYXJnZVxuICAgICAgLy8gZnJvbnRtYXR0ZXIgZm9yIGVsZW1lbnRzIHdpdGggbG9uZyBpbnN0cnVjdGlvbnMuIFRoZSByZWFkIHBhdGggd2lsbFxuICAgICAgLy8gcmVqZWN0IG92ZXJzaXplZCBZQU1MIG9uIHRoZSBuZXh0IGxvYWQgaWYgbmVlZGVkLlxuICAgICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA8PSBTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIKSB7XG4gICAgICAgIGlmICghQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZVlhbWxDb250ZW50KHlhbWxDb250ZW50KSkge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnRgLFxuICAgICAgICAgICAgZGV0YWlsczogYE1hbGljaW91cyBZQU1MIHBhdHRlcm4gZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBvdXRwdXQgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgeWFtbExlbmd0aDogeWFtbENvbnRlbnQubGVuZ3RoIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihcbiAgICAgICAgICAgIGBTZXJpYWxpemVkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gY29udGFpbnMgbWFsaWNpb3VzIFlBTUwgcGF0dGVybnMg4oCUIHdyaXRlIGJsb2NrZWQuIGAgK1xuICAgICAgICAgICAgYFJldmlldyB0aGUgZWxlbWVudCdzIG1ldGFkYXRhIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHN1c3BpY2lvdXMgYW5jaG9yL2FsaWFzIHBhdHRlcm5zLmAsXG4gICAgICAgICAgICAnY3JpdGljYWwnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmcm9udG1hdHRlckRhdGEgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlUmF3WWFtbCh5YW1sQ29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCk7XG4gICAgICB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YShmcm9udG1hdHRlckRhdGEsICdmcm9udG1hdHRlcicpO1xuXG4gICAgICAvLyBCb2R5IGNvbnRlbnQgdmFsaWRhdGlvbiB3aXRoIGVsZW1lbnQgdHlwZSBjb250ZXh0XG4gICAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXTtcbiAgICAgIGNvbnN0IGJvZHlWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGJvZHlDb250ZW50LCB7XG4gICAgICAgIGNvbnRlbnRDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICBpZiAoIWJvZHlWYWxpZGF0aW9uLmlzVmFsaWQgJiYgYm9keVZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENyaXRpY2FsIHNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZCBpbiBzZXJpYWxpemVkIGJvZHkgY29udGVudDogJHtib2R5VmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICBjb25zdCByYXdZYW1sID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwoY29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCk7XG4gICAgICB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YShyYXdZYW1sLCAnWUFNTCByb290Jyk7XG4gICAgICBpZiAocmF3WWFtbC5tZXRhZGF0YSAmJiB0eXBlb2YgcmF3WWFtbC5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocmF3WWFtbC5tZXRhZGF0YSkpIHtcbiAgICAgICAgdmFsaWRhdGVHYXRla2VlcGVyTWV0YWRhdGEocmF3WWFtbC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgJ21ldGFkYXRhJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGF2YWlsYWJsZSBlbGVtZW50c1xuICAgKiBTRUNVUklUWTogVXNlcyBQb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cygpIHdoaWNoIGZpbHRlcnMgdGVzdCBlbGVtZW50c1xuICAgKi9cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFRbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcblxuICAgICAgLy8gU2NhbiBmb3IgY2hhbmdlcyDigJQgcG9wdWxhdGVzIGluZGV4IGZvciBsaXN0U3VtbWFyaWVzKCkvZmluZEJ5TmFtZSgpXG4gICAgICAvLyBOb24tZmF0YWw6IHNjYW4gZmFpbHVyZSBtdXN0IG5ldmVyIHByZXZlbnQgbGlzdCgpIGZyb20gcmV0dXJuaW5nIHJlc3VsdHNcbiAgICAgIC8vIEV2aWN0IHN0YWxlIGNhY2hlIGVudHJpZXMgc28gdGhlIGNhY2hlIGNoZWNrIGJlbG93IG5ldmVyIHJldHVybnMgb3V0ZGF0ZWQgZGF0YVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlmZiA9IGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLnNjYW4oKTtcbiAgICAgICAgZm9yIChjb25zdCByZWxQYXRoIG9mIFsuLi5kaWZmLm1vZGlmaWVkLCAuLi5kaWZmLnJlbW92ZWRdKSB7XG4gICAgICAgICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIHJlbFBhdGgpO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzUGF0aCk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nSWQpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgICAgICAgdGhpcy5maWxlUGF0aFRvSWQuZGVsZXRlKGFic1BhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7IC8qIGluZGV4IHVuYXZhaWxhYmxlLCBsaXN0KCkgY29udGludWVzIHdpdGhvdXQgY2FjaGUgb3B0aW1pemF0aW9uICovIH1cblxuICAgICAgLy8gVXNlIFBvcnRmb2xpb01hbmFnZXIgZm9yIGF1dGhvcml0YXRpdmUgZmlsZSBsaXN0ICsgc2VjdXJpdHkgZmlsdGVyaW5nXG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHModGhpcy5lbGVtZW50VHlwZSk7XG5cbiAgICAgIC8vIExvYWQgYWxsIGVsZW1lbnRzIGluIHBhcmFsbGVsLCBjaGVja2luZyBjYWNoZSBiZWZvcmUgZGlza1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0IChhdm9pZHMgZGlzayByZWFkIGlmIGVsZW1lbnQgaXMgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZSk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICAgICAgICAgIC8vIENhY2hlIG1pc3Mg4oCUIHJlYWQgZnJvbSBkaXNrIChwb3B1bGF0ZXMgY2FjaGUgZm9yIG5leHQgdGltZSlcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWQoZmlsZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBsb2FkKCkgaGFuZGxlcyBlcnJvciBsb2dnaW5nIHdpdGggZGVkdXBsaWNhdGlvblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gRmlsdGVyIG91dCBmYWlsZWQgbG9hZHMgYW5kIHJldHVyblxuICAgICAgcmV0dXJuIGVsZW1lbnRzLmZpbHRlcigoZSk6IGUgaXMgQXdhaXRlZDxUPiA9PiBlICE9PSBudWxsKSBhcyBUW107XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGAke2xhYmVsfXMgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IHlldCwgcmV0dXJuaW5nIGVtcHR5IGFycmF5YCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxpc3QgJHt0aGlzLmVsZW1lbnRUeXBlfXM6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGxpZ2h0d2VpZ2h0IG1ldGFkYXRhIHN1bW1hcmllcyB3aXRob3V0IGxvYWRpbmcgZnVsbCBlbGVtZW50cy5cbiAgICogVXNlZnVsIHdoZW4gb25seSBuYW1lcy9kZXNjcmlwdGlvbnMvdGFncyBhcmUgbmVlZGVkLlxuICAgKi9cbiAgYXN5bmMgbGlzdFN1bW1hcmllcygpOiBQcm9taXNlPEVsZW1lbnRJbmRleEVudHJ5W10+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VMYXllci5saXN0U3VtbWFyaWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBlbGVtZW50IGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZChwcmVkaWNhdGU6IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgbXVsdGlwbGUgZWxlbWVudHMgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kTWFueShwcmVkaWNhdGU6IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogUHJvbWlzZTxUW10+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBlbGVtZW50cy5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgbmFtZSBvciBJRCB3aXRob3V0IGxvYWRpbmcgYWxsIGVsZW1lbnRzXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGZvciBhY3RpdmF0aW9uIGZsb3dcbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYW4gb3B0aW1pemVkIGxvb2t1cCB0aGF0IHRyaWVzIGNhY2hlIGZpcnN0LCB0aGVuXG4gICAqIGF0dGVtcHRzIGRpcmVjdCBmaWxlIGFjY2VzcyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIGZ1bGwgbGlzdCgpIHNjYW4uXG4gICAqIFRoaXMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBsaXN0KCkgZm9yIGxhcmdlIHBvcnRmb2xpb3MuXG4gICAqXG4gICAqIFBFUkZPUk1BTkNFIElNUFJPVkVNRU5UUzpcbiAgICogMS4gQ2FjaGUgbG9va3VwIC0gTygxKSBpZiBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGxvYWRlZFxuICAgKiAyLiBEaXJlY3QgZmlsZSBhY2Nlc3MgLSBPKDEpIGZvciBuYW1lLWJhc2VkIGxvb2t1cHNcbiAgICogMy4gRnVsbCBzY2FuIGZhbGxiYWNrIC0gTyhuKSBvbmx5IGlmIGFib3ZlIG1ldGhvZHMgZmFpbFxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIEVsZW1lbnQgbmFtZSBvciBJRCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIEVsZW1lbnQgaWYgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIGFzeW5jIGZpbmRCeU5hbWUoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gRmlyc3QsIHRyeSBmaW5kaW5nIGluIGNhY2hlIGJ5IGl0ZXJhdGluZyBjYWNoZWQgZWxlbWVudHNcbiAgICAvLyBUaGlzIGlzIGZhc3QgKE8oY2FjaGUgc2l6ZSkpIGFuZCB3b3JrcyBmb3IgcmVjZW50bHkgYWNjZXNzZWQgZWxlbWVudHNcbiAgICBjb25zdCBjYWNoZWRFbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kSW5DYWNoZShpZGVudGlmaWVyKTtcbiAgICBpZiAoY2FjaGVkRWxlbWVudCkge1xuICAgICAgcmV0dXJuIGNhY2hlZEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gU2Vjb25kLCB0cnkgc3RvcmFnZSBsYXllciBpbmRleCAoTygxKSBuYW1lIGxvb2t1cClcbiAgICBjb25zdCBpbmRleGVkUGF0aCA9IHRoaXMuc3RvcmFnZUxheWVyLmdldFBhdGhCeU5hbWUoaWRlbnRpZmllcik7XG4gICAgaWYgKGluZGV4ZWRQYXRoKSB7XG4gICAgICB0cnkgeyByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGluZGV4ZWRQYXRoKTsgfSBjYXRjaCB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9XG4gICAgfVxuXG4gICAgLy8gVGhpcmQsIHRyeSBkaXJlY3QgZmlsZSBhY2Nlc3MgdXNpbmcgc3RhbmRhcmQgbmFtaW5nIGNvbnZlbnRpb25cbiAgICAvLyBFbGVtZW50IGZpbGVzIGFyZSB0eXBpY2FsbHkgbmFtZWQ6IGxvd2VyY2FzZS1uYW1lLXdpdGgtaHlwaGVucy57ZXh0fVxuICAgIC8vIFRoaXMgaXMgTygxKSBmaWxlIHN5c3RlbSBsb29rdXBcbiAgICBjb25zdCBkaXJlY3RMb2FkQXR0ZW1wdCA9IGF3YWl0IHRoaXMudHJ5RGlyZWN0TG9hZChpZGVudGlmaWVyKTtcbiAgICBpZiAoZGlyZWN0TG9hZEF0dGVtcHQpIHtcbiAgICAgIHJldHVybiBkaXJlY3RMb2FkQXR0ZW1wdDtcbiAgICB9XG5cbiAgICAvLyBJZiBzdG9yYWdlIGxheWVyIGhhcyBjb21wbGV0ZWQgYXQgbGVhc3Qgb25lIHNjYW4sIHRoZSBpbmRleCBpc1xuICAgIC8vIGF1dGhvcml0YXRpdmUg4oCUIGEgbWlzcyBtZWFucyB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4gU2tpcCB0aGVcbiAgICAvLyBleHBlbnNpdmUgbGlzdCgpIGZhbGxiYWNrIHRvIGF2b2lkIE8obikgcmVzY2FucyBvbiBldmVyeSBjYWNoZSBtaXNzLlxuICAgIGlmICh0aGlzLnN0b3JhZ2VMYXllci5oYXNDb21wbGV0ZWRTY2FuKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IEZ1bGwgbGlzdCgpIHNjYW4gKE8obikgLSBsb2FkcyBhbGwgZWxlbWVudHMpXG4gICAgLy8gT25seSB1c2VkIG9uIGZpcnN0IGFjY2VzcyBiZWZvcmUgYW55IHNjYW4gaGFzIGNvbXBsZXRlZC5cbiAgICAvLyBUaGlzIGVuc3VyZXMgd2UgZmluZCBlbGVtZW50cyBldmVuIHdpdGggbm9uLXN0YW5kYXJkIGZpbGUgbmFtaW5nLlxuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGlkZW50aWZpZXIpO1xuICAgIHJldHVybiBlbGVtZW50cy5maW5kKGUgPT5cbiAgICAgIHRoaXMubm9ybWFsaXplRmlsZW5hbWUoZS5tZXRhZGF0YS5uYW1lKSA9PT0gbm9ybWFsaXplZElkZW50aWZpZXIgfHxcbiAgICAgIGUubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIGUuaWQgPT09IGlkZW50aWZpZXJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogU2VhcmNoIGNhY2hlIGZvciBlbGVtZW50IGJ5IG5hbWUgb3IgSURcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZEluQ2FjaGUoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gTFJVQ2FjaGUgZG9lc24ndCBwcm92aWRlIGl0ZXJhdGlvbiwgYnV0IHdlIGNhbiBjaGVjayBpZiB3ZSBoYXZlXG4gICAgLy8gYSBjYWNoZWQgcGF0aCBmb3IgdGhpcyBpZGVudGlmaWVyIGJ5IHRyeWluZyBjb21tb24gbmFtaW5nIHBhdHRlcm5zLlxuICAgIC8vIElNUE9SVEFOVDogZmlsZVBhdGhUb0lkIHN0b3JlcyBhYnNvbHV0ZSBwYXRocyAoc2V0IGJ5IGNhY2hlRWxlbWVudCB2aWFcbiAgICAvLyByZXNvbHZlQWJzb2x1dGVQYXRoKSwgc28gd2UgbXVzdCByZXNvbHZlIHRvIGFic29sdXRlIGJlZm9yZSBsb29rdXAuXG4gICAgY29uc3QgcG9zc2libGVGaWxlbmFtZXMgPSBbXG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgYCR7aWRlbnRpZmllcn0ke3RoaXMuZ2V0RmlsZUV4dGVuc2lvbigpfWAsXG4gICAgICAvLyBVc2UgdW5pZmllZCBub3JtYWxpemVGaWxlbmFtZSBmb3IgY29uc2lzdGVudCBjYWNoZSBsb29rdXBzXG4gICAgICB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShpZGVudGlmaWVyKVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHBvc3NpYmxlRmlsZW5hbWVzKSB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZW5hbWUpO1xuICAgICAgY29uc3QgY2FjaGVkSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcbiAgICAgIGlmIChjYWNoZWRJZCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50cy5nZXQoY2FjaGVkSWQpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IFRyeSBsb2FkaW5nIGVsZW1lbnQgZGlyZWN0bHkgYnkgY29uc3RydWN0aW5nIGV4cGVjdGVkIGZpbGVuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHRyeURpcmVjdExvYWQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gVHJ5IGxvYWRpbmcgdXNpbmcgY29tbW9uIG5hbWluZyBwYXR0ZXJuc1xuICAgIC8vIFVzZSB1bmlmaWVkIG5vcm1hbGl6ZUZpbGVuYW1lIGZvciBjb25zaXN0ZW50IGZpbGVuYW1lIGNvbnN0cnVjdGlvblxuICAgIGNvbnN0IHBvc3NpYmxlUGF0aHMgPSBbXG4gICAgICAvLyBQcmltYXJ5OiBVc2UgdW5pZmllZCBub3JtYWxpemF0aW9uIChoYW5kbGVzIENhbWVsQ2FzZSwgc3BhY2VzLCB1bmRlcnNjb3JlcywgZXRjLilcbiAgICAgIHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKGlkZW50aWZpZXIpLFxuICAgICAgLy8gRmFsbGJhY2s6IElkZW50aWZpZXIgYXMtaXMgd2l0aCBleHRlbnNpb25cbiAgICAgIGAke2lkZW50aWZpZXJ9JHt0aGlzLmdldEZpbGVFeHRlbnNpb24oKX1gLFxuICAgICAgLy8gRmFsbGJhY2s6IElkZW50aWZpZXIgYWxyZWFkeSBpbmNsdWRlcyBleHRlbnNpb25cbiAgICAgIGlkZW50aWZpZXJcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5sb2FkKGZpbGVQYXRoKTtcbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBsb2FkZWQgZWxlbWVudCBtYXRjaGVzIHRoZSBpZGVudGlmaWVyXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBib3RoIHNpZGVzIHNvIFwiQ29kZSBSZXZpZXdcIiAoc3BhY2VzKSBtYXRjaGVzIFwiY29kZS1yZXZpZXdcIiAoaHlwaGVucylcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1ldGFOYW1lID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShlbGVtZW50Lm1ldGFkYXRhLm5hbWUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoaWRlbnRpZmllcik7XG4gICAgICAgIGlmIChub3JtYWxpemVkTWV0YU5hbWUgPT09IG5vcm1hbGl6ZWRJZGVudGlmaWVyIHx8XG4gICAgICAgICAgICBlbGVtZW50Lm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaWRlbnRpZmllci50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgICAgICBlbGVtZW50LmlkID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgZmFpbGVkIHRvIGxvYWQgLSB0cnkgbmV4dCBwYXRoXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gZWxlbWVudFxuICAgKiBEZWxlZ2F0ZXMgdG8gZWxlbWVudCdzIG93biB2YWxpZGF0ZSBtZXRob2RcbiAgICpcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBib3RoICd2YWxpZCcgYW5kICdpc1ZhbGlkJyBwcm9wZXJ0aWVzLlxuICAgKiAgICAgICAgICAnaXNWYWxpZCcgaXMgZGVwcmVjYXRlZCAtIHVzZSAndmFsaWQnIGZvciBuZXcgY29kZS5cbiAgICovXG4gIHZhbGlkYXRlKGVsZW1lbnQ6IFQpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0ID0gZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVsZW1lbnRcbiAgICogU0VDVVJJVFk6IFBhdGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IGRlbGV0aW9uIG91dHNpZGUgZGlyZWN0b3J5XG4gICAqIENBQ0hFIEZJWDogVXNlcyBmaWxlcGF0aC1iYXNlZCBjYWNoZSByZW1vdmFsIHRvIHByZXZlbnQgc3RhbGUgZW50cmllc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5kZWxldGVgLFxuICAgICAgZGV0YWlsczogYEF0dGVtcHRpbmcgdG8gZGVsZXRlICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX06ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUodGhpcy5nZXRFbGVtZW50TGFiZWwoKSwgY29ycmVsYXRpb25JZCk7XG5cbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0KFxuICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRDb21taXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy51bmNhY2hlQnlQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgICB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlEZWxldGVkKHJlbGF0aXZlUGF0aCk7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OmRlbGV0ZTpzdWNjZXNzJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkUm9sbGJhY2soYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OmRlbGV0ZTplcnJvcicsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZXJyb3IgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0cmFuc2FjdGlvbi5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2FuRGVsZXRlKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRGb3JWYWxpZGF0aW9uID0gYXdhaXQgdGhpcy5sb2FkRWxlbWVudFNuYXBzaG90KGFic29sdXRlUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBhd2FpdCB0aGlzLmNhbkRlbGV0ZShlbGVtZW50Rm9yVmFsaWRhdGlvbik7XG4gICAgICAgIGlmICghZGVjaXNpb24uYWxsb3dlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkZWNpc2lvbi5yZWFzb24gPz8gYERlbGV0aW9uIG5vdCBwZXJtaXR0ZWQgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtb3ZlZFRvQmFja3VwID0gYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBCZWZvcmVEZWxldGUoYWJzb2x1dGVQYXRoKTtcbiAgICAgIGlmICghbW92ZWRUb0JhY2t1cCkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlLCB7XG4gICAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmRlbGV0ZWBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGRlbGV0ZWQ6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gZWxlbWVudCBleGlzdHNcbiAgICovXG4gIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoYWJzb2x1dGVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBmaWxlIHBhdGhcbiAgICovXG4gIHZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG5cbiAgICAgIGlmICghc2FuaXRpemVkIHx8IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNhbml0aXplZC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShzYW5pdGl6ZWQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBhbGxvd2VkRXh0ZW5zaW9ucyA9IFsnLm1kJywgJy5tYXJrZG93bicsICcudHh0JywgJy55bWwnLCAnLnlhbWwnXTtcblxuICAgICAgcmV0dXJuIGV4dCA9PT0gJycgfHwgYWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IHR5cGVcbiAgICovXG4gIGdldEVsZW1lbnRUeXBlKCk6IEVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIGZpbGUgcGF0aCB0byBpdHMgYWJzb2x1dGUgZm9ybSBmb3IgY2FjaGUgY29uc2lzdGVuY3lcbiAgICogRW5zdXJlcyBjb25zaXN0ZW50IHBhdGggaGFuZGxpbmcgYWNyb3NzIHJlbGF0aXZlL2Fic29sdXRlIHBhdGhzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUFic29sdXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKVxuICAgICAgPyBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aClcbiAgICAgIDogcGF0aC5ub3JtYWxpemUocGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgZmlsZVBhdGgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHsgcmVsYXRpdmVQYXRoOiBzdHJpbmc7IGFic29sdXRlUGF0aDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgIGlmICghc2FuaXRpemVkUGF0aCB8fCBzYW5pdGl6ZWRQYXRoLnRyaW0oKS5sZW5ndGggPT09IDAgfHwgc2FuaXRpemVkUGF0aCA9PT0gJy4nIHx8IHNhbml0aXplZFBhdGggPT09IHBhdGguc2VwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRoOiBlbXB0eSBwYXRoIGlzIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBYnNvbHV0ZSAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGhzIGFyZSBub3QgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aCAocmVtb3ZlIHJlZHVuZGFudCBzZXBhcmF0b3JzLCByZXNvbHZlIC4gYW5kIC4uKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWxhdGl2ZSA9IHBhdGgubm9ybWFsaXplKHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gQnVpbGQgYWJzb2x1dGUgcGF0aFxuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIG5vcm1hbGl6ZWRSZWxhdGl2ZSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgV0lUSE9VVCByZXNvbHZpbmcgc3ltbGlua3MgLSBqdXN0IGNoZWNrIHNlY3VyaXR5IGNvbnN0cmFpbnRzXG4gICAgICBhd2FpdCBQYXRoVmFsaWRhdG9yLnZhbGlkYXRlRWxlbWVudFBhdGhPbmx5KGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50RGlyKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBpbnB1dCBhcyByZWxhdGl2ZVBhdGggKGl0J3MgYWxyZWFkeSByZWxhdGl2ZSkgYW5kIGNvbXB1dGVkIGFic29sdXRlUGF0aFxuICAgICAgcmV0dXJuIHsgcmVsYXRpdmVQYXRoOiBub3JtYWxpemVkUmVsYXRpdmUsIGFic29sdXRlUGF0aCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdJbnZhbGlkIHBhdGgnO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aDogJHtyZWFzb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlbGVtZW50SWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQodGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCkpO1xuICAgIGlmICghZWxlbWVudElkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5nZXQoZWxlbWVudElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgY2FjaGUgbG9va3VwIGJ5IGFic29sdXRlIHBhdGguXG4gICAqIEFsbG93cyBzdWJjbGFzc2VzIHdpdGggY3VzdG9tIGxvYWQoKSBvdmVycmlkZXMgKGUuZy4gTWVtb3J5TWFuYWdlcilcbiAgICogdG8gY2hlY2sgdGhlIExSVSBjYWNoZSBiZWZvcmUgcmUtcmVhZGluZyBmcm9tIGRpc2suXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q2FjaGVkQnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEVsZW1lbnRTbmFwc2hvdChhYnNvbHV0ZVBhdGg6IHN0cmluZywgcmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRWxlbWVudEZpbGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlLCB7XG4gICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZEVsZW1lbnRTbmFwc2hvdGBcbiAgICB9KTtcbiAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIocmF3LCB1bmRlZmluZWQsIHtcbiAgICAgIGNvbnRlbnRDb250ZXh0OiBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV0sXG4gICAgfSk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnBhcnNlTWV0YWRhdGEocGFyc2VkLmRhdGEpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcbiAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgZXZlbnQgcGF5bG9hZCBmb3IgZWxlbWVudCBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKlxuICAgKiBUaGlzIGhlbHBlciBpcyBhdmFpbGFibGUgdG8gc3ViY2xhc3NlcyB0byBlbnN1cmUgY29uc2lzdGVudCBldmVudCBwYXlsb2FkXG4gICAqIHN0cnVjdHVyZSB3aGVuIGVtaXR0aW5nIGN1c3RvbSBldmVudHMgdmlhIHRoZSBkaXNwYXRjaGVyIGdldHRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIEV2ZW50IHBhcmFtZXRlcnMgaW5jbHVkaW5nIGNvcnJlbGF0aW9uIElELCBlbGVtZW50LCBmaWxlIHBhdGgsIGFuZCBvcHRpb25hbCBlcnJvclxuICAgKiBAcmV0dXJucyBGdWxseS1mb3JtZWQgRWxlbWVudEV2ZW50UGF5bG9hZCByZWFkeSBmb3IgZW1pc3Npb25cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVFdmVudFBheWxvYWQocGFyYW1zOiB7XG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAgIGZpbGVQYXRoPzogc3RyaW5nO1xuICAgIGVsZW1lbnQ/OiBUO1xuICAgIGVycm9yPzogdW5rbm93bjtcbiAgfSk6IEVsZW1lbnRFdmVudFBheWxvYWQge1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHBhcmFtcy5lbGVtZW50Py5pZDtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gZWxlbWVudElkICE9PSB1bmRlZmluZWQgPyB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5nZXQoZWxlbWVudElkKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgY29ycmVsYXRpb25JZDogcGFyYW1zLmNvcnJlbGF0aW9uSWQsXG4gICAgICBlbGVtZW50VHlwZTogdGhpcy5lbGVtZW50VHlwZSxcbiAgICAgIGVsZW1lbnRJZCxcbiAgICAgIGZpbGVQYXRoOiBwYXJhbXMuZmlsZVBhdGgsXG4gICAgICBtZXRhZGF0YTogRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5zbmFwc2hvdE1ldGFkYXRhKHBhcmFtcy5lbGVtZW50KSxcbiAgICAgIGdlbmVyYXRpb24sXG4gICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXh0ZXJuYWxDaGFuZ2UocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuY2FjaGVCeVBhdGgocmVsYXRpdmVQYXRoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5pbnZhbGlkYXRlKCk7XG4gICAgLy8gQ2xlYXIgZXJyb3Igc3VwcHJlc3Npb24gc28gYSBjaGFuZ2VkIGZpbGUgZ2V0cyBmcmVzaCBsb2dnaW5nXG4gICAgdGhpcy5pbnZhbGlkRWxlbWVudHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgJ2VsZW1lbnQ6ZXh0ZXJuYWwtY2hhbmdlJyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSkge1xuICAgICAgdm9pZCB0aGlzLmxvYWQocmVsYXRpdmVQYXRoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1dG8gcmVsb2FkIGFmdGVyIGV4dGVybmFsIGNoYW5nZSBmYWlsZWQnLCB7XG4gICAgICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZWxlbWVudFR5cGUsXG4gICAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZWxlbWVudCB0byBib3RoIGNhY2hlcyAoYmlkaXJlY3Rpb25hbCBtYXBwaW5nKVxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2FjaGVcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gRmlsZSBwYXRoIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSlcbiAgICovXG4gIHByb3RlY3RlZCBjYWNoZUVsZW1lbnQoZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG5cbiAgICAvLyBDbGVhciBhbnkgc3RhbGUgY2FjaGUgZW50cmllcyBmb3IgdGhpcyBmaWxlcGF0aCBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgb25lLlxuICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZ2VuZXJhdGVJZCgpIGluIEJhc2VFbGVtZW50LnRzIGluY2x1ZGVzIGEgRGF0ZS5ub3coKVxuICAgIC8vIHRpbWVzdGFtcCwgY2F1c2luZyBlYWNoIGxvYWQgZnJvbSBkaXNrIHRvIGdlbmVyYXRlIGEgZGlmZmVyZW50IElELiBXaXRob3V0IHRoaXNcbiAgICAvLyBjbGVhbnVwLCBvbGQgSURzIHJlbWFpbiBpbiB0aGUgY2FjaGUgYXMgc3RhbGUgZGF0YSwgbGVhZGluZyB0byBpbmNvbnNpc3RlbnRcbiAgICAvLyByZXN1bHRzIGluIG1ldGhvZHMgbGlrZSBmaW5kUGVyc29uYSgpIG9yIGxpc3QoKS5cbiAgICBjb25zdCBleGlzdGluZ0lkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic29sdXRlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nSWQgJiYgZXhpc3RpbmdJZCAhPT0gZWxlbWVudC5pZCkge1xuICAgICAgLy8gQ2xlYXIgc3RhbGUgY2FjaGUgZW50cnkgd2hlbiBlbGVtZW50IElEIGhhcyBjaGFuZ2VkXG4gICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRzLnNldChlbGVtZW50LmlkLCBlbGVtZW50KTtcbiAgICB0aGlzLmZpbGVQYXRoVG9JZC5zZXQoYWJzb2x1dGVQYXRoLCBlbGVtZW50LmlkKTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmNhY2hlR2VuZXJhdGlvbkNvdW50ZXI7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuc2V0KGVsZW1lbnQuaWQsIGdlbmVyYXRpb24pO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKVxuICAgICAgPyBwYXRoLnJlbGF0aXZlKHRoaXMuZWxlbWVudERpciwgZmlsZVBhdGgpXG4gICAgICA6IGZpbGVQYXRoO1xuXG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnZmlsZW5hbWUnLCB7XG4gICAgICAgIHZhbHVlOiBwYXRoLmJhc2VuYW1lKHJlbGF0aXZlUGF0aCksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ2ZpbGVQYXRoJywge1xuICAgICAgICB2YWx1ZTogcmVsYXRpdmVQYXRoLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gYXR0YWNoIGZpbGVuYW1lIG1ldGFkYXRhIHRvIGVsZW1lbnQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIGEgZnJlc2ggZGlzayBzY2FuIGFuZCBldmljdCBhbnkgbW9kaWZpZWQvcmVtb3ZlZCBlbnRyaWVzIGZyb20gdGhlXG4gICAqIGluLW1lbW9yeSBMUlUgY2FjaGUuIENhbGwgYmVmb3JlIGZpbmRCeU5hbWUoKSB3aGVuIGZyZXNobmVzcyBpcyBjcml0aWNhbFxuICAgKiAoZS5nLiBvbiBlbnNlbWJsZSBhY3RpdmF0aW9uKSB0byBwaWNrIHVwIGV4dGVybmFsIGZpbGUgY2hhbmdlcyB0aGF0XG4gICAqIG9jY3VycmVkIHNpbmNlIHRoZSBsYXN0IHNjYW4sIGV2ZW4gaWYgdGhlIHNjYW4gY29vbGRvd24gaXMgc3RpbGwgYWN0aXZlLlxuICAgKlxuICAgKiBVbmxpa2UgbGlzdCgpLCB0aGlzIGRvZXMgbm90IGxvYWQgYWxsIGVsZW1lbnRzIOKAlCBpdCBvbmx5IGV2aWN0cyBzdGFsZSBvbmVzLlxuICAgKiBGaXhlcyAjMTg5NSAoZW5zZW1ibGUgYWN0aXZhdGlvbiBzZXJ2aW5nIHN0YWxlIGNhY2hlZCBlbGVtZW50IGxpc3QpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNjYW5BbmRFdmljdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5pbnZhbGlkYXRlKCk7IC8vIGJ5cGFzcyBjb29sZG93biBzbyB0aGUgbmV4dCBzY2FuIGhpdHMgZGlza1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIuc2NhbigpO1xuICAgICAgZm9yIChjb25zdCByZWxQYXRoIG9mIFsuLi5kaWZmLm1vZGlmaWVkLCAuLi5kaWZmLnJlbW92ZWRdKSB7XG4gICAgICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCByZWxQYXRoKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNQYXRoKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nSWQpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgICAgICB0aGlzLmZpbGVQYXRoVG9JZC5kZWxldGUoYWJzUGF0aCk7XG4gICAgICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7IC8qIG5vbi1mYXRhbCDigJQgY2FjaGUgbWF5IGJlIHNsaWdodGx5IHN0YWxlLCBidXQgYWN0aXZhdGlvbiBwcm9jZWVkcyAqLyB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gYm90aCBjYWNoZXMgYnkgZmlsZSBwYXRoXG4gICAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIGRlbGV0aW9uIHRvIGF2b2lkIHN0YWxlIGNhY2hlIGVudHJpZXNcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gRmlsZSBwYXRoIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSlcbiAgICovXG4gIHByb3RlY3RlZCB1bmNhY2hlQnlQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuXG4gICAgaWYgKGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShlbGVtZW50SWQpO1xuICAgICAgdGhpcy5maWxlUGF0aFRvSWQuZGVsZXRlKGFic29sdXRlUGF0aCk7XG4gICAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5kZWxldGUoZWxlbWVudElkKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVW5jYWNoZWQgZWxlbWVudCAke2VsZW1lbnRJZH0gZnJvbSAke2Fic29sdXRlUGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNhY2hlZCBlbGVtZW50c1xuICAgKi9cbiAgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuY2xlYXIoKTtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmNsZWFyKCk7XG4gICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIHN0YXRpc3RpY3MgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjYWNoZSBzaXplIG1ldHJpY3NcbiAgICovXG4gIHByb3RlY3RlZCBnZXRDYWNoZVN0YXRzKCk6IHsgZWxlbWVudENvdW50OiBudW1iZXI7IHBhdGhNYXBwaW5nczogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGVsZW1lbnRzU3RhdHMgPSB0aGlzLmVsZW1lbnRzLmdldFN0YXRzKCk7XG4gICAgY29uc3QgcGF0aFN0YXRzID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0U3RhdHMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50Q291bnQ6IGVsZW1lbnRzU3RhdHMuc2l6ZSxcbiAgICAgIHBhdGhNYXBwaW5nczogcGF0aFN0YXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSBpbnRlcm5hbCBMUlUgY2FjaGUgaW5zdGFuY2VzIGZvciBtZXRyaWNzIGNvbGxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0TWV0cmljc0NhY2hlcygpOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgaW5zdGFuY2U6IExSVUNhY2hlPHVua25vd24+IH0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBuYW1lOiBgZWxlbWVudHM6JHt0aGlzLmVsZW1lbnRUeXBlfWAsIGluc3RhbmNlOiB0aGlzLmVsZW1lbnRzIGFzIExSVUNhY2hlPHVua25vd24+IH0sXG4gICAgICB7IG5hbWU6IGBwYXRoSW5kZXg6JHt0aGlzLmVsZW1lbnRUeXBlfWAsIGluc3RhbmNlOiB0aGlzLmZpbGVQYXRoVG9JZCBhcyBMUlVDYWNoZTx1bmtub3duPiB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSBvZiByZXNvdXJjZXMgYW5kIGNsZWFudXBcbiAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gYWRkIHRoZWlyIG93biBjbGVhbnVwIGxvZ2ljXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZW1vcnlCdWRnZXQpIHtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnVucmVnaXN0ZXIodGhpcy5lbGVtZW50cyk7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC51bnJlZ2lzdGVyKHRoaXMuZmlsZVBhdGhUb0lkKTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLmNsZWFyKCk7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5jbGVhcigpO1xuICAgIHRoaXMud2F0Y2hlckNsZWFudXA/LigpO1xuICAgIHRoaXMud2F0Y2hlckNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyLmRlYnVnKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX1NYW5hZ2VyIGRpc3Bvc2VkIGFuZCBjYWNoZXMgY2xlYXJlZGApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRklMRU5BTUUgTk9STUFMSVpBVElPTiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIG5hbWUgdG8ga2ViYWItY2FzZSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBmb3JtYXR0aW5nLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyB1bmlmaWVkIGZpbGVuYW1lIG5vcm1hbGl6YXRpb24gYWNyb3NzIGFsbCBlbGVtZW50IG1hbmFnZXJzLFxuICAgKiBlbnN1cmluZyBjb25zaXN0ZW50IG5hbWluZyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmb3JtYXQgKENhbWVsQ2FzZSwgc3BhY2VzLFxuICAgKiB1bmRlcnNjb3JlcywgbWl4ZWQgY2FzZSwgZXRjLikuXG4gICAqXG4gICAqIFRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkIChpbiBvcmRlcik6XG4gICAqIDEuIEluc2VydCBoeXBoZW5zIGJldHdlZW4gY2FtZWxDYXNlIGJvdW5kYXJpZXMgKE15TmFtZSAtPiBNeS1OYW1lKVxuICAgKiAyLiBSZXBsYWNlIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zXG4gICAqIDMuIENvbnZlcnQgdG8gbG93ZXJjYXNlXG4gICAqIDQuIFN0cmlwIGludmFsaWQgY2hhcmFjdGVycyAoa2VlcCBvbmx5IGEteiwgMC05LCAtKVxuICAgKiA1LiBDb2xsYXBzZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBoeXBoZW5zXG4gICAqIDYuIFRyaW0gbGVhZGluZy90cmFpbGluZyBoeXBoZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ1JVRFYtQWdlbnQtRGVsdGFcIikgLy8gXCJjcnVkdi1hZ2VudC1kZWx0YVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ3JlYXRpdmUgV3JpdGVyXCIpICAgLy8gXCJjcmVhdGl2ZS13cml0ZXJcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNhbWVsQ2FzZU5hbWVcIikgICAgIC8vIFwiY2FtZWwtY2FzZS1uYW1lXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJteV9za2lsbF9uYW1lXCIpICAgICAvLyBcIm15LXNraWxsLW5hbWVcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIlNwZWNpYWxAQ2hhcnMhXCIpICAgIC8vIFwic3BlY2lhbC1jaGFyc1wiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiLS1sZWFkaW5nLWFuZC10cmFpbGluZy0tXCIpIC8vIFwibGVhZGluZy1hbmQtdHJhaWxpbmdcIlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBlbGVtZW50IG5hbWUgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQga2ViYWItY2FzZSBmaWxlbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqL1xuICBwcm90ZWN0ZWQgbm9ybWFsaXplRmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ3VubmFtZWQnO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lXG4gICAgICAvLyBTdGVwIDE6IEluc2VydCBoeXBoZW5zIGJldHdlZW4gY2FtZWxDYXNlIGJvdW5kYXJpZXMgKGxvd2VyY2FzZSBmb2xsb3dlZCBieSB1cHBlcmNhc2UpXG4gICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJylcbiAgICAgIC8vIFN0ZXAgMjogUmVwbGFjZSBzcGFjZXMgYW5kIHVuZGVyc2NvcmVzIHdpdGggaHlwaGVuc1xuICAgICAgLnJlcGxhY2UoL1tcXHNfXSsvZywgJy0nKVxuICAgICAgLy8gU3RlcCAzOiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC8vIFN0ZXAgNDogU3RyaXAgaW52YWxpZCBjaGFyYWN0ZXJzIChrZWVwIG9ubHkgYWxwaGFudW1lcmljIGFuZCBoeXBoZW5zKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKVxuICAgICAgLy8gU3RlcCA1OiBDb2xsYXBzZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBoeXBoZW5zXG4gICAgICAucmVwbGFjZSgvLSsvZywgJy0nKVxuICAgICAgLy8gU3RlcCA2OiBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGh5cGhlbnNcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSBmb3IgYW4gZWxlbWVudC5cbiAgICpcbiAgICogTm9ybWFsaXplcyB0aGUgZWxlbWVudCBuYW1lIChoYW5kbGluZyBDYW1lbENhc2UsIHNwYWNlcywgdW5kZXJzY29yZXMsIGV0Yy4pXG4gICAqIGFuZCBhcHBlbmRzIHRoZSBmaWxlIGV4dGVuc2lvbi4gVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHBlcnNvbmFzLywgc2tpbGxzLywgZXRjLilcbiAgICogYWxyZWFkeSBwcm92aWRlcyB0eXBlIGNvbnRleHQsIHNvIHRoZSB0eXBlIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgZmlsZW5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGVsZW1lbnQgbmFtZSB0byBjb252ZXJ0IHRvIGEgZmlsZW5hbWVcbiAgICogQHJldHVybnMgVGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSAoZS5nLiwgXCJjb2RlLXJldmlldy5tZFwiKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJDb2RlIFJldmlld1wiKSAgICAgICAgIC8vIOKGkiBcImNvZGUtcmV2aWV3Lm1kXCJcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiRGVidWcgRGV0ZWN0aXZlXCIpICAgICAvLyDihpIgXCJkZWJ1Zy1kZXRlY3RpdmUubWRcIlxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJCdWdSZXBvcnRcIikgICAgICAgICAgIC8vIOKGkiBcImJ1Zy1yZXBvcnQubWRcIiAoQ2FtZWxDYXNlIHNwbGl0KVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJmaXgtcGVyc29uYS1oZWxwZXJcIikgIC8vIOKGkiBcImZpeC1wZXJzb25hLWhlbHBlci5tZFwiIChubyBtYW5nbGluZylcbiAgICovXG4gIHByb3RlY3RlZCBnZXRFbGVtZW50RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSkgfHwgJ3VubmFtZWQnO1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpO1xuICAgIHJldHVybiBgJHtub3JtYWxpemVkTmFtZX0ke2V4dGVuc2lvbn1gO1xuICB9XG5cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBQlNUUkFDVCBNRVRIT0RTIC0gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgbWV0YWRhdGEgZnJvbSBmcm9udG1hdHRlclxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIHZhbGlkYXRpb24gbG9naWNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgbWV0YWRhdGEgZnJvbSBZQU1MIGZyb250bWF0dGVyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBhbmQgdHlwZWQgbWV0YWRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8VFsnbWV0YWRhdGEnXT47XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBFbGVtZW50VmFsaWRhdG9yIHZpYSBWYWxpZGF0aW9uUmVnaXN0cnkgaW5zdGVhZC5cbiAgICogV2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGE6IGFueSwgX3N0cmljdD86IGJvb2xlYW4pOiBQcm9taXNlPGltcG9ydCgnLi4vLi4vdXRpbHMvdmFsaWRhdGlvbi9GaWVsZFZhbGlkYXRvci5qcycpLlZhbGlkYXRpb25FcnJvcltdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgcmV0dXJuIHJlc3VsdC5lcnJvcnMubWFwKGUgPT4gKHsgZmllbGQ6ICdnZW5lcmFsJywgbWVzc2FnZTogZSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVsZW1lbnQgaW5zdGFuY2UgZnJvbSBtZXRhZGF0YSBhbmQgY29udGVudFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIGNvbnN0cnVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBWYWxpZGF0ZWQgbWV0YWRhdGFcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBFbGVtZW50IGNvbnRlbnQgKGluc3RydWN0aW9ucywgdGVtcGxhdGUsIGV0Yy4pXG4gICAqIEByZXR1cm5zIE5ldyBlbGVtZW50IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogVFsnbWV0YWRhdGEnXSwgY29udGVudDogc3RyaW5nKTogVDtcblxuICAvKipcbiAgICogU2VyaWFsaXplIGFuIGVsZW1lbnQgdG8gZmlsZSBjb250ZW50XG4gICAqIFN1YmNsYXNzZXMgY2FuIGN1c3RvbWl6ZSBzZXJpYWxpemF0aW9uIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIEZpbGUgY29udGVudCAodXN1YWxseSBtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudDogVCk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICogTW9zdCBlbGVtZW50cyB1c2UgLm1kLCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGVcbiAgICovXG4gIGFic3RyYWN0IGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZWxlbWVudCBmcm9tIGV4dGVybmFsIGZvcm1hdFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBmb3JtYXQtc3BlY2lmaWMgaW1wb3J0IGxvZ2ljXG4gICAqL1xuICBhYnN0cmFjdCBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBlbGVtZW50IHRvIGV4dGVybmFsIGZvcm1hdFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBmb3JtYXQtc3BlY2lmaWMgZXhwb3J0IGxvZ2ljXG4gICAqL1xuICBhYnN0cmFjdCBleHBvcnRFbGVtZW50KGVsZW1lbnQ6IFQsIGZvcm1hdD86ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz47XG59XG4iXX0=
1059
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBC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UUFBUSxDQUFDLENBQUM7UUFDL0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZUVsZW1lbnRNYW5hZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGVsZW1lbnQgbWFuYWdlcnNcbiAqXG4gKiBQcm92aWRlcyBjb21tb24gQ1JVRCBvcGVyYXRpb25zIGZvciBhbGwgZWxlbWVudCB0eXBlcyB1c2luZyB0aGVcbiAqIFRlbXBsYXRlIE1ldGhvZCBQYXR0ZXJuOlxuICogLSBEZWZpbmVzIHRoZSBza2VsZXRvbiBvZiBvcGVyYXRpb25zIGluIGJhc2UgY2xhc3NcbiAqIC0gTGV0cyBzdWJjbGFzc2VzIG92ZXJyaWRlIHNwZWNpZmljIHN0ZXBzIHdpdGhvdXQgY2hhbmdpbmcgc3RydWN0dXJlXG4gKlxuICogU3ViY2xhc3NlczogU2tpbGxNYW5hZ2VyLCBUZW1wbGF0ZU1hbmFnZXIsIEFnZW50TWFuYWdlciwgTWVtb3J5TWFuYWdlclxuICpcbiAqIFNFQ1VSSVRZOlxuICogMS4gQ1JJVElDQUw6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZC93cml0ZSBvcGVyYXRpb25zXG4gKiAyLiBISUdIOiBQYXRoIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRhY2tzXG4gKiAzLiBNRURJVU06IFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gKiA0LiBNRURJVU06IElucHV0IHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0aHJvdWdob3V0XG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IElFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9lcnJvcnMuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFBhdGhWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEVsZW1lbnRFdmVudERpc3BhdGNoZXIsIEVsZW1lbnRFdmVudFBheWxvYWQgfSBmcm9tICcuLi8uLi9ldmVudHMvRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSB9IGZyb20gJy4vRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUuanMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVXYXRjaFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IHR5cGUgRWxlbWVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vRWxlbWVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50U3RvcmFnZUxheWVyIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9FbGVtZW50U3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvSVN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRJbmRleEVudHJ5IH0gZnJvbSAnLi4vLi4vc3RvcmFnZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgTUVNT1JZX0NPTlNUQU5UUyB9IGZyb20gJy4uL21lbW9yaWVzL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24sXG4gIGdldFZhbGlkYXRlZEVsZW1lbnRDYWNoZVRUTCxcbiAgZ2V0VmFsaWRhdGVkUGF0aENhY2hlVFRMXG59IGZyb20gJy4uLy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDYWNoZU1lbW9yeUJ1ZGdldCB9IGZyb20gJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJztcbmltcG9ydCB0eXBlIHsgQmFja3VwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnO1xuXG5jb25zdCBERUZBVUxUX0VMRU1FTlRfQ0FDSEVfVFRMX01TID0gZ2V0VmFsaWRhdGVkRWxlbWVudENhY2hlVFRMKCk7XG5jb25zdCBERUZBVUxUX1BBVEhfQ0FDSEVfVFRMX01TID0gZ2V0VmFsaWRhdGVkUGF0aENhY2hlVFRMKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUVsZW1lbnRNYW5hZ2VyT3B0aW9ucyB7XG4gIGVsZW1lbnREaXJPdmVycmlkZT86IHN0cmluZztcbiAgZXZlbnREaXNwYXRjaGVyPzogRWxlbWVudEV2ZW50RGlzcGF0Y2hlcjtcbiAgZWxlbWVudENhY2hlVFRMPzogbnVtYmVyO1xuICBwYXRoQ2FjaGVUVEw/OiBudW1iZXI7XG4gIGVuYWJsZUZpbGVXYXRjaGVyPzogYm9vbGVhbjtcbiAgYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2U/OiBib29sZWFuO1xuICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZTtcbiAgbWVtb3J5QnVkZ2V0PzogQ2FjaGVNZW1vcnlCdWRnZXQ7XG4gIGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlO1xufVxuXG4vKipcbiAqIFJlY29yZCBvZiBhbiBlbGVtZW50IHRoYXQgZmFpbGVkIHRvIGxvYWQgKElzc3VlICM3MDgpLlxuICogU3RvcmVkIHNvIGNhbGxlcnMgY2FuIGRpc3Rpbmd1aXNoIFwiZmlsZSBub3QgZm91bmRcIiBmcm9tIFwiZmlsZSBpbnZhbGlkXCIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZEVsZW1lbnRSZWNvcmQge1xuICAvKiogUmVsYXRpdmUgZmlsZSBwYXRoIHdpdGhpbiB0aGUgZWxlbWVudCBkaXJlY3RvcnkuICovXG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSByZWFzb24gdGhlIGVsZW1lbnQgd2FzIHJlamVjdGVkLiAqL1xuICByZWFzb246IHN0cmluZztcbiAgLyoqIElTTyB0aW1lc3RhbXAgb2YgbGFzdCBmYWlsZWQgbG9hZCBhdHRlbXB0LiAqL1xuICBmYWlsZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgaW1wbGVtZW50aW5nIGNvbW1vbiBlbGVtZW50IG1hbmFnZW1lbnQgb3BlcmF0aW9uc1xuICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIGxvZ2ljIHZpYSBhYnN0cmFjdCBtZXRob2RzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRWxlbWVudE1hbmFnZXI8VCBleHRlbmRzIElFbGVtZW50PiBpbXBsZW1lbnRzIElFbGVtZW50TWFuYWdlcjxUPiB7XG4gIHByb3RlY3RlZCBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcm90ZWN0ZWQgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXI7XG4gIHByb3RlY3RlZCBmaWxlT3BlcmF0aW9uczogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2U7XG4gIHByb3RlY3RlZCBlbGVtZW50RGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICogT2J0YWluZWQgZnJvbSBWYWxpZGF0aW9uUmVnaXN0cnkgZHVyaW5nIGNvbnN0cnVjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRvcjogRWxlbWVudFZhbGlkYXRvcjtcblxuICAvLyBQcmltYXJ5IGNhY2hlOiBJRCDihpIgRWxlbWVudCAod2l0aCBzaXplIGxpbWl0cyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcylcbiAgcHJvdGVjdGVkIGVsZW1lbnRzOiBMUlVDYWNoZTxUPjtcblxuICAvLyBSZXZlcnNlIGluZGV4OiBBYnNvbHV0ZSBGaWxlUGF0aCDihpIgRWxlbWVudCBJRCAod2l0aCBzaXplIGxpbWl0cylcbiAgcHJpdmF0ZSBmaWxlUGF0aFRvSWQ6IExSVUNhY2hlPHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudEdlbmVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBjYWNoZUdlbmVyYXRpb25Db3VudGVyID0gMDtcbiAgcHJpdmF0ZSB3YXRjaGVyQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnREaXNwYXRjaGVyOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlCdWRnZXQ/OiBDYWNoZU1lbW9yeUJ1ZGdldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlO1xuXG4gIC8qKiBNYXAgcGx1cmFsIEVsZW1lbnRUeXBlIGVudW0gdmFsdWVzIHRvIHNpbmd1bGFyIENvbnRlbnRWYWxpZGF0b3IgY29udGV4dC5cbiAgICogIFBhcnRpYWwgYmVjYXVzZSBub3QgYWxsIGVsZW1lbnQgdHlwZXMgaGF2ZSBhIGNvbnRlbnQgY29udGV4dCAoZS5nLiwgZW5zZW1ibGVzKS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFQ6IFBhcnRpYWw8UmVjb3JkPEVsZW1lbnRUeXBlLCAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jz4+ID0ge1xuICAgIFtFbGVtZW50VHlwZS5QRVJTT05BXTogJ3BlcnNvbmEnLFxuICAgIFtFbGVtZW50VHlwZS5TS0lMTF06ICdza2lsbCcsXG4gICAgW0VsZW1lbnRUeXBlLlRFTVBMQVRFXTogJ3RlbXBsYXRlJyxcbiAgICBbRWxlbWVudFR5cGUuQUdFTlRdOiAnYWdlbnQnLFxuICAgIFtFbGVtZW50VHlwZS5NRU1PUlldOiAnbWVtb3J5JyxcbiAgfTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmFnZUxheWVyOiBJU3RvcmFnZUxheWVyO1xuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBFbGVtZW50cyB0aGF0IGV4aXN0IG9uIGRpc2sgYnV0IGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBLZXllZCBieSByZWxhdGl2ZSBmaWxlIHBhdGggZm9yIGRlZHVwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGludmFsaWRFbGVtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBJbnZhbGlkRWxlbWVudFJlY29yZD4oKTtcblxuICAvKipcbiAgICogVHJhY2tzIGZpbGUgcGF0aHMgd2hvc2UgbG9hZCBmYWlsdXJlIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGF0IGVycm9yIGxldmVsLlxuICAgKiBSZXBlYXRlZCBmYWlsdXJlcyB3aXRoIHRoZSBzYW1lIHJlYXNvbiBhcmUgZGVtb3RlZCB0byBkZWJ1ZyB0byBhdm9pZCBsb2cgZmxvb2RpbmcuXG4gICAqIENsZWFyZWQgd2hlbiB0aGUgZmlsZSBjaGFuZ2VzIG9uIGRpc2sgb3IgbG9hZHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdXBwcmVzc2VkTG9hZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbW9zdCByZWNlbnQgbG9hZCgpIGZhaWx1cmUgZm9yIHRoaXMgcGF0aCB3YXMgc3VwcHJlc3NlZFxuICAgKiBiZWNhdXNlIGl0IHdhcyBhIHJlcGVhdCBvZiBhbiBhbHJlYWR5LWxvZ2dlZCBlcnJvci5cbiAgICogU3ViY2xhc3NlcyBjYW4gdXNlIHRoaXMgdG8gYXZvaWQgZHVwbGljYXRlIHNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIFJlbGF0aXZlIGZpbGUgcGF0aCB3aXRoaW4gdGhlIGVsZW1lbnQgZGlyZWN0b3J5XG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGVycm9yIGZvciB0aGlzIHBhdGggaXMgY3VycmVudGx5IHN1cHByZXNzZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0xvYWRFcnJvclN1cHByZXNzZWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuaGFzKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZnRlckxvYWQ/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYmVmb3JlU2F2ZT8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBhZnRlclNhdmU/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgZmluZEJ5SWRlbnRpZmllcj8oaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgcHJvdGVjdGVkIGNhbkRlbGV0ZT8oZWxlbWVudDogVCk6IFByb21pc2U8eyBhbGxvd2VkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmlsZS5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gbm8tb3AgKGUuZy4gTWVtb3J5TWFuYWdlciBoYXMgaXRzIG93biBiYWNrdXAgc3lzdGVtKS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgZGVsZXRpbmcgYSBmaWxlIChtb3ZlcyBmaWxlIHRvIGJhY2t1cCBkaXIpLlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9yaWdpbmFsIGZpbGUgd2FzIG1vdmVkIChjYWxsZXIgc2hvdWxkIHNraXAgZGVsZXRlRmlsZSkuXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIG5vLW9wIChlLmcuIE1lbW9yeU1hbmFnZXIgaGFzIGl0cyBvd24gYmFja3VwIHN5c3RlbSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuICEhcmVzdWx0Lm1vdmVkT3JpZ2luYWw7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBkaXNwYXRjaGVyIGZvciBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBlbWl0IGN1c3RvbSBldmVudHMuXG4gICAqXG4gICAqIEJhc2VFbGVtZW50TWFuYWdlciBoYW5kbGVzIHN0YW5kYXJkIGxpZmVjeWNsZSBldmVudHMgKGxvYWQsIHNhdmUsIGRlbGV0ZSkgYXV0b21hdGljYWxseS5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgdXNlIHRoaXMgZ2V0dGVyIG9ubHkgd2hlbiB0aGV5IG5lZWQgdG8gZW1pdCBhZGRpdGlvbmFsIGRvbWFpbi1zcGVjaWZpY1xuICAgKiBldmVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIENSVUQgbGlmZWN5Y2xlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBQZXJzb25hTWFuYWdlciBlbWl0cyBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBldmVudHNcbiAgICogdGhpcy5kaXNwYXRjaGVyLmVtaXQoJ2VsZW1lbnQ6YWN0aXZhdGUnLCB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7Li4ufSkpO1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgRWxlbWVudEV2ZW50RGlzcGF0Y2hlciBpbnN0YW5jZSB1c2VkIGJ5IHRoaXMgbWFuYWdlclxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkaXNwYXRjaGVyKCk6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmV2ZW50RGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8vIENhY2hlIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUgPSAxMDAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUEFUSF9DQUNIRV9TSVpFID0gMTAwMDtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgLSBpbml0aWFsaXplcyBjb21tb24gZGVwZW5kZW5jaWVzXG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgdGhpcyBtYW5hZ2VyIGhhbmRsZXNcbiAgICogQHBhcmFtIHBvcnRmb2xpb01hbmFnZXIgLSBQb3J0Zm9saW8gbWFuYWdlciBmb3IgZGlyZWN0b3J5IHJlc29sdXRpb25cbiAgICogQHBhcmFtIGZpbGVMb2NrTWFuYWdlciAtIEZpbGUgbG9jayBtYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgZmlsZVdhdGNoU2VydmljZVxuICAgKiBAcGFyYW0gZmlsZU9wZXJhdGlvbnNTZXJ2aWNlIC0gU2VydmljZSBmb3IgZmlsZSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uUmVnaXN0cnkgLSBSZWdpc3RyeSBmb3Igb2J0YWluaW5nIHR5cGUtc3BlY2lmaWMgdmFsaWRhdG9yc1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgb3B0aW9uczogQmFzZUVsZW1lbnRNYW5hZ2VyT3B0aW9ucyA9IHt9LFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5XG4gICkge1xuICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBwb3J0Zm9saW9NYW5hZ2VyO1xuICAgIHRoaXMuZmlsZUxvY2tNYW5hZ2VyID0gZmlsZUxvY2tNYW5hZ2VyO1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gICAgdGhpcy5maWxlV2F0Y2hTZXJ2aWNlID0gb3B0aW9ucy5maWxlV2F0Y2hTZXJ2aWNlO1xuICAgIHRoaXMuYmFja3VwU2VydmljZSA9IG9wdGlvbnMuYmFja3VwU2VydmljZTtcblxuICAgIC8vIEdldCB0aGUgc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRvcihlbGVtZW50VHlwZSk7XG5cbiAgICBjb25zdCBlbGVtZW50Q2FjaGVUVEwgPSBvcHRpb25zLmVsZW1lbnRDYWNoZVRUTCA/PyBERUZBVUxUX0VMRU1FTlRfQ0FDSEVfVFRMX01TO1xuICAgIGNvbnN0IHBhdGhDYWNoZVRUTCA9IG9wdGlvbnMucGF0aENhY2hlVFRMID8/IERFRkFVTFRfUEFUSF9DQUNIRV9UVExfTVM7XG4gICAgdGhpcy5tZW1vcnlCdWRnZXQgPSBvcHRpb25zLm1lbW9yeUJ1ZGdldDtcblxuICAgIGNvbnN0IG9uU2V0Q2FsbGJhY2sgPSB0aGlzLm1lbW9yeUJ1ZGdldFxuICAgICAgPyAoKSA9PiB0aGlzLm1lbW9yeUJ1ZGdldCEuZW5mb3JjZSgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEluaXRpYWxpemUgTFJVIGNhY2hlcyB3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgdGhpcy5lbGVtZW50cyA9IG5ldyBMUlVDYWNoZTxUPih7XG4gICAgICBuYW1lOiBgZWxlbWVudHM6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogNTAsIC8vIE1heCA1ME1CIGZvciBlbGVtZW50IGNhY2hlXG4gICAgICB0dGxNczogZWxlbWVudENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbGVQYXRoVG9JZCA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICAgIG5hbWU6IGBwYXRoSW5kZXg6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9QQVRIX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogMTAsIC8vIE1heCAxME1CIGZvciBwYXRoIG1hcHBpbmdzXG4gICAgICB0dGxNczogcGF0aENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjYWNoZXMgd2l0aCBnbG9iYWwgbWVtb3J5IGJ1ZGdldFxuICAgIGlmICh0aGlzLm1lbW9yeUJ1ZGdldCkge1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQucmVnaXN0ZXIodGhpcy5lbGVtZW50cyk7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC5yZWdpc3Rlcih0aGlzLmZpbGVQYXRoVG9JZCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZWxlbWVudERpck92ZXJyaWRlKSB7XG4gICAgICB0aGlzLmVsZW1lbnREaXIgPSBvcHRpb25zLmVsZW1lbnREaXJPdmVycmlkZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAodGhpcy5wb3J0Zm9saW9NYW5hZ2VyIGFzIGFueSkuZ2V0RWxlbWVudERpciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5lbGVtZW50RGlyID0gKHRoaXMucG9ydGZvbGlvTWFuYWdlciBhcyBhbnkpLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gcmVzb2x2ZSBlbGVtZW50IGRpcmVjdG9yeSBmb3IgJHtlbGVtZW50VHlwZX0uIGAgK1xuICAgICAgICAnUHJvdmlkZSBhbiBlbGVtZW50RGlyT3ZlcnJpZGUgd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgbWFuYWdlci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gb3B0aW9ucy5ldmVudERpc3BhdGNoZXIgPz8gRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5nZXRTaGFyZWREaXNwYXRjaGVyKCk7XG4gICAgdGhpcy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSA9XG4gICAgICBvcHRpb25zLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlID8/IHByb2Nlc3MuZW52LkFVVE9fUkVMT0FEX09OX0VYVEVSTkFMX0NIQU5HRSA9PT0gJ3RydWUnO1xuXG4gICAgY29uc3QgZW5hYmxlV2F0Y2hlciA9IG9wdGlvbnMuZW5hYmxlRmlsZVdhdGNoZXIgPz8gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VOQUJMRV9GSUxFX1dBVENIRVIgPT09ICd0cnVlJztcbiAgICBpZiAoZW5hYmxlV2F0Y2hlciAmJiB0aGlzLmZpbGVXYXRjaFNlcnZpY2UpIHtcbiAgICAgIHRoaXMud2F0Y2hlckNsZWFudXAgPSB0aGlzLmZpbGVXYXRjaFNlcnZpY2Uud2F0Y2hEaXJlY3RvcnkoXG4gICAgICAgIHRoaXMuZWxlbWVudERpcixcbiAgICAgICAgKHJlbGF0aXZlUGF0aCkgPT4gdGhpcy5oYW5kbGVFeHRlcm5hbENoYW5nZShyZWxhdGl2ZVBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZUxheWVyID0gdGhpcy5jcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIHN0b3JhZ2UgbGF5ZXIuXG4gICAqIERlZmF1bHQgcmV0dXJucyBFbGVtZW50U3RvcmFnZUxheWVyIGZvciAubWQgZWxlbWVudHMuXG4gICAqIFN1YmNsYXNzZXMgKGUuZy4gTWVtb3J5TWFuYWdlcikgY2FuIG92ZXJyaWRlIHRvIHJldHVybiBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpOiBJU3RvcmFnZUxheWVyIHtcbiAgICByZXR1cm4gbmV3IEVsZW1lbnRTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB7XG4gICAgICBlbGVtZW50RGlyOiB0aGlzLmVsZW1lbnREaXIsXG4gICAgICBmaWxlRXh0ZW5zaW9uOiB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSxcbiAgICAgIHNjYW5Db29sZG93bk1zOiBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24oKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5ndWxhciBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBlbGVtZW50IHR5cGUgKGUuZy4sIFwic2tpbGxcIiwgXCJwZXJzb25hXCIpLlxuICAgKiBVc2VkIGluIGZpbGVuYW1lIGdlbmVyYXRpb24gKHtuYW1lfS17bGFiZWx9Lm1kKSBhbmQgZGlzcGxheSBzdHJpbmdzLlxuICAgKiBNdXN0IHJldHVybiB0aGUgc2luZ3VsYXIgZm9ybSDigJQgbm90IHRoZSBwbHVyYWwgRWxlbWVudFR5cGUgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyBhIGNhcGl0YWxpemVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQgbGFiZWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0RWxlbWVudExhYmVsKCk7XG4gICAgcmV0dXJuIGxhYmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbGFiZWwuc2xpY2UoMSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBlbGVtZW50IGZyb20gZmlsZVxuICAgKiBURU1QTEFURSBNRVRIT0Q6IERlZmluZXMgdGhlIGFsZ29yaXRobSwgc3ViY2xhc3NlcyBjdXN0b21pemUgc3RlcHNcbiAgICpcbiAgICogU0VDVVJJVFkgRklYRVMgKGluaGVyaXRlZCBmcm9tIG9yaWdpbmFsIG1hbmFnZXJzKTpcbiAgICogLSB0aGlzLmZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZSgpIHByZXZlbnRzIHJhY2UgY29uZGl0aW9uc1xuICAgKiAtIFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gICAqL1xuICBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpsb2FkOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEVsZW1lbnRGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZGBcbiAgICAgIH0pO1xuICAgICAgLy8gSXNzdWUgIzgxMDogUGFzcyBlbGVtZW50IHR5cGUgYXMgY29udGVudENvbnRleHQgc28gU2VjdXJlWWFtbFBhcnNlciBleGVtcHRzXG4gICAgICAvLyBsZWdpdGltYXRlIHBhdHRlcm5zIChlLmcuLCA8c2NyaXB0PiBzZWN0aW9uIHRhZ3MgaW4gdGVtcGxhdGVzKVxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBpZiAoIWNvbnRlbnRDb250ZXh0KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gTm8gY29udGVudENvbnRleHQgbWFwcGluZyBmb3IgZWxlbWVudFR5cGUgJyR7dGhpcy5lbGVtZW50VHlwZX0nIOKAlCBwYXJzaW5nIHdpdGhvdXQgY29udGV4dCBleGVtcHRpb25zLiBBdmFpbGFibGU6ICR7T2JqZWN0LmtleXMoQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUKS5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGNvbnRlbnQsIHVuZGVmaW5lZCwgeyBjb250ZW50Q29udGV4dCB9KTtcblxuICAgICAgLy8gSXNzdWUgIzY5NTogRmlsbCBpbiBtaXNzaW5nIG1ldGFkYXRhIGZpZWxkcyB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gICAgICAvLyBiZWZvcmUgcGFyc2VNZXRhZGF0YSgpIHNvIG9sZGVyIGVsZW1lbnRzIHdpdGggc3BhcnNlIGZyb250bWF0dGVyXG4gICAgICAvLyBkb24ndCBnZXQgcmVqZWN0ZWQuXG4gICAgICB0aGlzLm1pZ3JhdGVNZXRhZGF0YURlZmF1bHRzKHBhcnNlZC5kYXRhLCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG5cbiAgICAgIGlmICh0aGlzLmFmdGVyTG9hZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyTG9hZChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBJc3N1ZSAjNzA4OiBDbGVhciBhbnkgcHJldmlvdXMgaW52YWxpZCByZWNvcmQgb24gc3VjY2Vzc2Z1bCBsb2FkXG4gICAgICB0aGlzLmludmFsaWRFbGVtZW50cy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBsb2FkZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OmxvYWQ6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElzc3VlICM3MDg6IFJlY29yZCB0aGUgZmFpbHVyZSBzbyBjYWxsZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgLy8gXCJmaWxlIG5vdCBmb3VuZFwiIGZyb20gXCJmaWxlIGV4aXN0cyBidXQgZmFpbGVkIHZhbGlkYXRpb25cIi5cbiAgICAgIC8vIE9ubHkgdHJhY2sgcGFyc2UvdmFsaWRhdGlvbiBlcnJvcnMg4oCUIEVOT0VOVCBtZWFucyB0aGUgZmlsZSBpcyBnZW51aW5lbHlcbiAgICAgIC8vIG1pc3NpbmcsIG5vdCBpbnZhbGlkLCBzbyB3ZSBtdXN0IG5vdCBwb2xsdXRlIHRoZSBpbnZhbGlkIG1hcCB3aXRoIGl0LlxuICAgICAgY29uc3QgaXNGaWxlTm90Rm91bmQgPSAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJztcbiAgICAgIGxldCBpc1JlcGVhdEVycm9yID0gZmFsc2U7XG5cbiAgICAgIGlmICghaXNGaWxlTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaW52YWxpZEVsZW1lbnRzLmdldChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICBpc1JlcGVhdEVycm9yID0gZXhpc3Rpbmc/LnJlYXNvbiA9PT0gcmVhc29uO1xuXG4gICAgICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLnNldChyZWxhdGl2ZVBhdGgsIHtcbiAgICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBmYWlsZWRBdDogaXNSZXBlYXRFcnJvciA/IGV4aXN0aW5nIS5mYWlsZWRBdCA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlcGVhdEVycm9yKSB7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5hZGQocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBTdXBwcmVzc2VkIHJlcGVhdGVkIGxvYWQgZXJyb3IgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gJHtyZWxhdGl2ZVBhdGh9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgICAnZWxlbWVudDpsb2FkOmVycm9yJyxcbiAgICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVycm9yIH0pXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBmcm9tICR7YWJzb2x1dGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY5NTogUHJlLWZpbGwgbWlzc2luZyBtZXRhZGF0YSBmaWVsZHMgd2l0aCBzZW5zaWJsZSBkZWZhdWx0c1xuICAgKiBiZWZvcmUgcGFyc2VNZXRhZGF0YSgpIHJ1bnMuIFRoaXMgaW1wbGVtZW50cyB0aGUgXCJ0b2xlcmFudCByZWFkZXJcIiBwYXR0ZXJuXG4gICAqIOKAlCBzdHJpY3Qgb24gb3V0cHV0LCBsZW5pZW50IG9uIGlucHV0IGZvciBvbGRlci9zcGFyc2UgZnJvbnRtYXR0ZXIuXG4gICAqXG4gICAqIE11dGF0ZXMgYGRhdGFgIGluIHBsYWNlLiBMb2dzIGEgd2FybmluZyBmb3IgZWFjaCBkZWZhdWx0ZWQgZmllbGQgc29cbiAgICogb3BlcmF0b3JzIGtub3cgd2hpY2ggZmlsZXMgbmVlZCB1cGRhdGluZy5cbiAgICovXG4gIHByaXZhdGUgbWlncmF0ZU1ldGFkYXRhRGVmYXVsdHMoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtaWdyYXRlZDogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEluZmVyIHR5cGUgZnJvbSB0aGlzIG1hbmFnZXIncyBlbGVtZW50IHR5cGVcbiAgICBpZiAoIWRhdGEudHlwZSkge1xuICAgICAgLy8gRWxlbWVudFR5cGUgaXMgcGx1cmFsICgncGVyc29uYXMnLCAnc2tpbGxzJywgZXRjLilcbiAgICAgIC8vIFNvbWUgbWFuYWdlcnMgZXhwZWN0IHNpbmd1bGFyICgncGVyc29uYScsICdhZ2VudCcpLCBzb21lIHBsdXJhbC5cbiAgICAgIC8vIFNldCB0aGUgcGx1cmFsIGZvcm0g4oCUIHBhcnNlTWV0YWRhdGEoKSBoYW5kbGVzIG5vcm1hbGl6YXRpb24uXG4gICAgICBkYXRhLnR5cGUgPSB0aGlzLmVsZW1lbnRUeXBlO1xuICAgICAgbWlncmF0ZWQucHVzaCgndHlwZScpO1xuICAgIH1cblxuICAgIC8vIEluZmVyIG5hbWUgZnJvbSBmaWxlbmFtZSAoc3RyaXAgZXh0ZW5zaW9uLCB1bi1zbHVnaWZ5KVxuICAgIGlmICghZGF0YS5uYW1lKSB7XG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpKTtcbiAgICAgIGRhdGEubmFtZSA9IGJhc2VuYW1lO1xuICAgICAgbWlncmF0ZWQucHVzaCgnbmFtZScpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdmVyc2lvblxuICAgIGlmICghZGF0YS52ZXJzaW9uKSB7XG4gICAgICBkYXRhLnZlcnNpb24gPSAnMS4wLjAnO1xuICAgICAgbWlncmF0ZWQucHVzaCgndmVyc2lvbicpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgYXV0aG9yXG4gICAgaWYgKCFkYXRhLmF1dGhvcikge1xuICAgICAgZGF0YS5hdXRob3IgPSAndW5rbm93bic7XG4gICAgICBtaWdyYXRlZC5wdXNoKCdhdXRob3InKTtcbiAgICB9XG5cbiAgICBpZiAobWlncmF0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBbVG9sZXJhbnRSZWFkZXJdICR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBcIiR7ZmlsZVBhdGh9XCI6IGAgK1xuICAgICAgICBgZGVmYXVsdGVkIG1pc3NpbmcgZmllbGRzOiAke21pZ3JhdGVkLmpvaW4oJywgJyl9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogUmV0dXJucyBlbGVtZW50cyB0aGF0IGV4aXN0IG9uIGRpc2sgYnV0IGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBDYWxsZXJzIGNhbiB1c2UgdGhpcyB0byByZXBvcnQgaW52YWxpZCBlbGVtZW50cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGhpZGluZyB0aGVtLlxuICAgKi9cbiAgZ2V0SW52YWxpZEVsZW1lbnRzKCk6IEludmFsaWRFbGVtZW50UmVjb3JkW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5pbnZhbGlkRWxlbWVudHMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IENoZWNrIGlmIGEgc3BlY2lmaWMgZmlsZSBmYWlsZWQgdmFsaWRhdGlvbiBkdXJpbmcgbG9hZC5cbiAgICogVXNlZCBieSBnZXRfZWxlbWVudCB0byBkaXN0aW5ndWlzaCBcIm5vdCBmb3VuZFwiIGZyb20gXCJpbnZhbGlkXCIuXG4gICAqL1xuICBnZXRJbnZhbGlkRWxlbWVudChuYW1lOiBzdHJpbmcpOiBJbnZhbGlkRWxlbWVudFJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgYnkgZXhhY3QgcGF0aCBtYXRjaCBhbmQgYnkgbmFtZS1iYXNlZCBtYXRjaFxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCByZWNvcmRdIG9mIHRoaXMuaW52YWxpZEVsZW1lbnRzKSB7XG4gICAgICBpZiAoZmlsZVBhdGggPT09IG5hbWUpIHJldHVybiByZWNvcmQ7XG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpKTtcbiAgICAgIGlmIChiYXNlbmFtZSA9PT0gbmFtZSB8fCB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGJhc2VuYW1lKSA9PT0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKSkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYW4gZWxlbWVudCB0byBmaWxlXG4gICAqIFRFTVBMQVRFIE1FVEhPRDogQ29tbW9uIHNhdmUgbG9naWMgd2l0aCBob29rcyBmb3IgY3VzdG9taXphdGlvblxuICAgKlxuICAgKiBTRUNVUklUWSBGSVhFUzpcbiAgICogLSB0aGlzLmZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogLSBQYXRoIHZhbGlkYXRpb24gdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmdcbiAgICovXG4gIGFzeW5jIHNhdmUoZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEVsZW1lbnRUcmFuc2FjdGlvblNjb3BlKHRoaXMuZ2V0RWxlbWVudExhYmVsKCksIGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfRURJVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zYXZlYCxcbiAgICAgIGRldGFpbHM6IGBTYXZpbmcgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfTogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9IHYke2VsZW1lbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZ2V0RWxlbWVudExhYmVsKCksXG4gICAgICAgIGF1dGhvcjogZWxlbWVudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIHZlcnNpb246IGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpzYXZlOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRDb21taXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkKHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6c2F2ZTpzdWNjZXNzJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkUm9sbGJhY2soYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OnNhdmU6ZXJyb3InLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQsIGVycm9yIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmJlZm9yZVNhdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iZWZvcmVTYXZlKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGgpO1xuXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAvLyBGaXggIzkwODogVmFsaWRhdGUgc2VyaWFsaXplZCBjb250ZW50IGJlZm9yZSB3cml0aW5nIChzeW1tZXRyaWMgd2l0aCByZWFkIHBhdGgpLlxuICAgICAgLy8gUmVhZCBwYXRoIHZhbGlkYXRlcyB2aWEgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIOKGkiBDb250ZW50VmFsaWRhdG9yOyB3cml0ZSBwYXRoXG4gICAgICAvLyBtdXN0IGFwcGx5IHRoZSBzYW1lIGNoZWNrcyB0byBwcmV2ZW50IHNhdmluZyBjb250ZW50IHRoYXQgd291bGQgZmFpbCB0byBsb2FkLlxuICAgICAgdGhpcy52YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShhYnNvbHV0ZVBhdGgsIGNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIGlmICh0aGlzLmFmdGVyU2F2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyU2F2ZShlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBzYXZlZDogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc2VyaWFsaXplZCBlbGVtZW50IGNvbnRlbnQgYmVmb3JlIHdyaXRpbmcgdG8gZGlzay5cbiAgICogRml4ICM5MDg6IE1pcnJvcnMgdGhlIHJlYWQtcGF0aCB2YWxpZGF0aW9uIGZyb20gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpXG4gICAqIHRvIGVuc3VyZSB3cml0ZSDihpIgcmVhZCBzeW1tZXRyeS4gQ29udGVudCB0aGF0IGZhaWxzIHRoaXMgY2hlY2sgd291bGQgYWxzb1xuICAgKiBmYWlsIHRvIGxvYWQsIHNvIHJlamVjdGluZyBpdCBvbiB3cml0ZSBwcmV2ZW50cyBwZXJtYW5lbnRseSBicm9rZW4gZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnQoY29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRhdGVHYXRla2VlcGVyTWV0YWRhdGEgPSAocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCwgc291cmNlTGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZXJyb3JzID0gZ2V0R2F0ZWtlZXBlckF1dGhvcmluZ0Vycm9ycyhyZWNvcmQpO1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeSBpbiBzZXJpYWxpemVkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gJHtzb3VyY2VMYWJlbH06ICR7Wy4uLm5ldyBTZXQoZXJyb3JzKV0uam9pbignOyAnKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXIgaWYgcHJlc2VudCAoU29uYXJDbG91ZCBTNjU5NDogdXNlIFJlZ0V4cC5leGVjKVxuICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLztcbiAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gZnJvbnRtYXR0ZXJSZWdleC5leGVjKGNvbnRlbnQpO1xuXG4gICAgaWYgKGZyb250bWF0dGVyTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gZnJvbnRtYXR0ZXJNYXRjaFsxXTtcbiAgICAgIGNvbnN0IGJvZHlDb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoZnJvbnRtYXR0ZXJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAvLyBZQU1MIGJvbWIgZGV0ZWN0aW9uIChtaXJyb3JzIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSBzdGVwIDQpLlxuICAgICAgLy8gT25seSBydW4gd2hlbiBZQU1MIGlzIHVuZGVyIE1BWF9ZQU1MX0xFTkdUSCAoNjRLQikg4oCUIHRoZSBzYW1lIGxpbWl0XG4gICAgICAvLyB1c2VkIGJ5IHRoZSByZWFkIHBhdGggaW4gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpLiB2YWxpZGF0ZVlhbWxDb250ZW50KClcbiAgICAgIC8vIGluY2x1ZGVzIGl0cyBvd24gc2l6ZSBjaGVjayBpbnRlcm5hbGx5LCBhbmQgd2UgaW50ZW50aW9uYWxseSBza2lwIHNpemVcbiAgICAgIC8vIGVuZm9yY2VtZW50IG9uIHRoZSB3cml0ZSBwYXRoIGJlY2F1c2UgdGhlIHNlcmlhbGl6ZXIgbWF5IHByb2R1Y2UgbGFyZ2VcbiAgICAgIC8vIGZyb250bWF0dGVyIGZvciBlbGVtZW50cyB3aXRoIGxvbmcgaW5zdHJ1Y3Rpb25zLiBUaGUgcmVhZCBwYXRoIHdpbGxcbiAgICAgIC8vIHJlamVjdCBvdmVyc2l6ZWQgWUFNTCBvbiB0aGUgbmV4dCBsb2FkIGlmIG5lZWRlZC5cbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPD0gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS52YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50YCxcbiAgICAgICAgICAgIGRldGFpbHM6IGBNYWxpY2lvdXMgWUFNTCBwYXR0ZXJuIGRldGVjdGVkIGluIHNlcmlhbGl6ZWQgb3V0cHV0IGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IHlhbWxMZW5ndGg6IHlhbWxDb250ZW50Lmxlbmd0aCB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgICBgU2VyaWFsaXplZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IGNvbnRhaW5zIG1hbGljaW91cyBZQU1MIHBhdHRlcm5zIOKAlCB3cml0ZSBibG9ja2VkLiBgICtcbiAgICAgICAgICAgIGBSZXZpZXcgdGhlIGVsZW1lbnQncyBtZXRhZGF0YSBhbmQgaW5zdHJ1Y3Rpb25zIGZvciBzdXNwaWNpb3VzIGFuY2hvci9hbGlhcyBwYXR0ZXJucy5gLFxuICAgICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbnRtYXR0ZXJEYXRhID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwoeWFtbENvbnRlbnQsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfWUFNTF9MRU5HVEgpO1xuICAgICAgdmFsaWRhdGVHYXRla2VlcGVyTWV0YWRhdGEoZnJvbnRtYXR0ZXJEYXRhLCAnZnJvbnRtYXR0ZXInKTtcblxuICAgICAgLy8gQm9keSBjb250ZW50IHZhbGlkYXRpb24gd2l0aCBlbGVtZW50IHR5cGUgY29udGV4dFxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBjb25zdCBib2R5VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShib2R5Q29udGVudCwge1xuICAgICAgICBjb250ZW50Q29udGV4dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFib2R5VmFsaWRhdGlvbi5pc1ZhbGlkICYmIGJvZHlWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICAgIGBDcml0aWNhbCBzZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBib2R5IGNvbnRlbnQ6ICR7Ym9keVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gLFxuICAgICAgICAgICdjcml0aWNhbCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudFR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgLy8gSXNzdWUgIzIzMjk6IG1lbW9yaWVzIGFyZSB3aG9sZSBwdXJlLVlBTUwgZG9jdW1lbnRzIGNhcHBlZCBhdCBNQVhfWUFNTF9TSVpFXG4gICAgICAvLyAoMjU2S0IpIG9uIHNhdmUgYW5kIGxvYWQg4oCUIE1BWF9ZQU1MX0xFTkdUSCAoNjRLQikgaXMgYSBmcm9udG1hdHRlciBsaW1pdFxuICAgICAgLy8gYW5kIHJlamVjdGVkIGV2ZXJ5IHNhdmUgb2YgYSBtZW1vcnkgdGhhdCBncmV3IHBhc3QgaXQuXG4gICAgICBjb25zdCByYXdZYW1sID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwoY29udGVudCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfWUFNTF9TSVpFKTtcbiAgICAgIHZhbGlkYXRlR2F0ZWtlZXBlck1ldGFkYXRhKHJhd1lhbWwsICdZQU1MIHJvb3QnKTtcbiAgICAgIGlmIChyYXdZYW1sLm1ldGFkYXRhICYmIHR5cGVvZiByYXdZYW1sLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyYXdZYW1sLm1ldGFkYXRhKSkge1xuICAgICAgICB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YShyYXdZYW1sLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCAnbWV0YWRhdGEnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgYXZhaWxhYmxlIGVsZW1lbnRzXG4gICAqIFNFQ1VSSVRZOiBVc2VzIFBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKCkgd2hpY2ggZmlsdGVycyB0ZXN0IGVsZW1lbnRzXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8VFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuXG4gICAgICAvLyBTY2FuIGZvciBjaGFuZ2VzIOKAlCBwb3B1bGF0ZXMgaW5kZXggZm9yIGxpc3RTdW1tYXJpZXMoKS9maW5kQnlOYW1lKClcbiAgICAgIC8vIE5vbi1mYXRhbDogc2NhbiBmYWlsdXJlIG11c3QgbmV2ZXIgcHJldmVudCBsaXN0KCkgZnJvbSByZXR1cm5pbmcgcmVzdWx0c1xuICAgICAgLy8gRXZpY3Qgc3RhbGUgY2FjaGUgZW50cmllcyBzbyB0aGUgY2FjaGUgY2hlY2sgYmVsb3cgbmV2ZXIgcmV0dXJucyBvdXRkYXRlZCBkYXRhXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIuc2NhbigpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgWy4uLmRpZmYubW9kaWZpZWQsIC4uLmRpZmYucmVtb3ZlZF0pIHtcbiAgICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgcmVsUGF0aCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNQYXRoKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgICB0aGlzLmZpbGVQYXRoVG9JZC5kZWxldGUoYWJzUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHsgLyogaW5kZXggdW5hdmFpbGFibGUsIGxpc3QoKSBjb250aW51ZXMgd2l0aG91dCBjYWNoZSBvcHRpbWl6YXRpb24gKi8gfVxuXG4gICAgICAvLyBVc2UgUG9ydGZvbGlvTWFuYWdlciBmb3IgYXV0aG9yaXRhdGl2ZSBmaWxlIGxpc3QgKyBzZWN1cml0eSBmaWx0ZXJpbmdcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cyh0aGlzLmVsZW1lbnRUeXBlKTtcblxuICAgICAgLy8gTG9hZCBhbGwgZWxlbWVudHMgaW4gcGFyYWxsZWwsIGNoZWNraW5nIGNhY2hlIGJlZm9yZSBkaXNrXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgKGF2b2lkcyBkaXNrIHJlYWQgaWYgZWxlbWVudCBpcyBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgICAgICAgICAgLy8gQ2FjaGUgbWlzcyDigJQgcmVhZCBmcm9tIGRpc2sgKHBvcHVsYXRlcyBjYWNoZSBmb3IgbmV4dCB0aW1lKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGxvYWQoKSBoYW5kbGVzIGVycm9yIGxvZ2dpbmcgd2l0aCBkZWR1cGxpY2F0aW9uXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBGaWx0ZXIgb3V0IGZhaWxlZCBsb2FkcyBhbmQgcmV0dXJuXG4gICAgICByZXR1cm4gZWxlbWVudHMuZmlsdGVyKChlKTogZSBpcyBBd2FpdGVkPFQ+ID0+IGUgIT09IG51bGwpIGFzIFRbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYCR7bGFiZWx9cyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXlgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbGlzdCAke3RoaXMuZWxlbWVudFR5cGV9czpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgbGlnaHR3ZWlnaHQgbWV0YWRhdGEgc3VtbWFyaWVzIHdpdGhvdXQgbG9hZGluZyBmdWxsIGVsZW1lbnRzLlxuICAgKiBVc2VmdWwgd2hlbiBvbmx5IG5hbWVzL2Rlc2NyaXB0aW9ucy90YWdzIGFyZSBuZWVkZWQuXG4gICAqL1xuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuZWxlbWVudERpcik7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZUxheWVyLmxpc3RTdW1tYXJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kKHByZWRpY2F0ZTogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBlbGVtZW50cy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtdWx0aXBsZSBlbGVtZW50cyBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBuYW1lIG9yIElEIHdpdGhvdXQgbG9hZGluZyBhbGwgZWxlbWVudHNcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gZm9yIGFjdGl2YXRpb24gZmxvd1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhbiBvcHRpbWl6ZWQgbG9va3VwIHRoYXQgdHJpZXMgY2FjaGUgZmlyc3QsIHRoZW5cbiAgICogYXR0ZW1wdHMgZGlyZWN0IGZpbGUgYWNjZXNzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gZnVsbCBsaXN0KCkgc2Nhbi5cbiAgICogVGhpcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIGxpc3QoKSBmb3IgbGFyZ2UgcG9ydGZvbGlvcy5cbiAgICpcbiAgICogUEVSRk9STUFOQ0UgSU1QUk9WRU1FTlRTOlxuICAgKiAxLiBDYWNoZSBsb29rdXAgLSBPKDEpIGlmIGVsZW1lbnQgd2FzIHByZXZpb3VzbHkgbG9hZGVkXG4gICAqIDIuIERpcmVjdCBmaWxlIGFjY2VzcyAtIE8oMSkgZm9yIG5hbWUtYmFzZWQgbG9va3Vwc1xuICAgKiAzLiBGdWxsIHNjYW4gZmFsbGJhY2sgLSBPKG4pIG9ubHkgaWYgYWJvdmUgbWV0aG9kcyBmYWlsXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gRWxlbWVudCBuYW1lIG9yIElEIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgRWxlbWVudCBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmFtZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBGaXJzdCwgdHJ5IGZpbmRpbmcgaW4gY2FjaGUgYnkgaXRlcmF0aW5nIGNhY2hlZCBlbGVtZW50c1xuICAgIC8vIFRoaXMgaXMgZmFzdCAoTyhjYWNoZSBzaXplKSkgYW5kIHdvcmtzIGZvciByZWNlbnRseSBhY2Nlc3NlZCBlbGVtZW50c1xuICAgIGNvbnN0IGNhY2hlZEVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRJbkNhY2hlKGlkZW50aWZpZXIpO1xuICAgIGlmIChjYWNoZWRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gY2FjaGVkRWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBTZWNvbmQsIHRyeSBzdG9yYWdlIGxheWVyIGluZGV4IChPKDEpIG5hbWUgbG9va3VwKVxuICAgIGNvbnN0IGluZGV4ZWRQYXRoID0gdGhpcy5zdG9yYWdlTGF5ZXIuZ2V0UGF0aEJ5TmFtZShpZGVudGlmaWVyKTtcbiAgICBpZiAoaW5kZXhlZFBhdGgpIHtcbiAgICAgIHRyeSB7IHJldHVybiBhd2FpdCB0aGlzLmxvYWQoaW5kZXhlZFBhdGgpOyB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH1cbiAgICB9XG5cbiAgICAvLyBUaGlyZCwgdHJ5IGRpcmVjdCBmaWxlIGFjY2VzcyB1c2luZyBzdGFuZGFyZCBuYW1pbmcgY29udmVudGlvblxuICAgIC8vIEVsZW1lbnQgZmlsZXMgYXJlIHR5cGljYWxseSBuYW1lZDogbG93ZXJjYXNlLW5hbWUtd2l0aC1oeXBoZW5zLntleHR9XG4gICAgLy8gVGhpcyBpcyBPKDEpIGZpbGUgc3lzdGVtIGxvb2t1cFxuICAgIGNvbnN0IGRpcmVjdExvYWRBdHRlbXB0ID0gYXdhaXQgdGhpcy50cnlEaXJlY3RMb2FkKGlkZW50aWZpZXIpO1xuICAgIGlmIChkaXJlY3RMb2FkQXR0ZW1wdCkge1xuICAgICAgcmV0dXJuIGRpcmVjdExvYWRBdHRlbXB0O1xuICAgIH1cblxuICAgIC8vIElmIHN0b3JhZ2UgbGF5ZXIgaGFzIGNvbXBsZXRlZCBhdCBsZWFzdCBvbmUgc2NhbiwgdGhlIGluZGV4IGlzXG4gICAgLy8gYXV0aG9yaXRhdGl2ZSDigJQgYSBtaXNzIG1lYW5zIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LiBTa2lwIHRoZVxuICAgIC8vIGV4cGVuc2l2ZSBsaXN0KCkgZmFsbGJhY2sgdG8gYXZvaWQgTyhuKSByZXNjYW5zIG9uIGV2ZXJ5IGNhY2hlIG1pc3MuXG4gICAgaWYgKHRoaXMuc3RvcmFnZUxheWVyLmhhc0NvbXBsZXRlZFNjYW4oKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogRnVsbCBsaXN0KCkgc2NhbiAoTyhuKSAtIGxvYWRzIGFsbCBlbGVtZW50cylcbiAgICAvLyBPbmx5IHVzZWQgb24gZmlyc3QgYWNjZXNzIGJlZm9yZSBhbnkgc2NhbiBoYXMgY29tcGxldGVkLlxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBmaW5kIGVsZW1lbnRzIGV2ZW4gd2l0aCBub24tc3RhbmRhcmQgZmlsZSBuYW1pbmcuXG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoaWRlbnRpZmllcik7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoZSA9PlxuICAgICAgdGhpcy5ub3JtYWxpemVGaWxlbmFtZShlLm1ldGFkYXRhLm5hbWUpID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgZS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGlkZW50aWZpZXIudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgZS5pZCA9PT0gaWRlbnRpZmllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBTZWFyY2ggY2FjaGUgZm9yIGVsZW1lbnQgYnkgbmFtZSBvciBJRFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kSW5DYWNoZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBMUlVDYWNoZSBkb2Vzbid0IHByb3ZpZGUgaXRlcmF0aW9uLCBidXQgd2UgY2FuIGNoZWNrIGlmIHdlIGhhdmVcbiAgICAvLyBhIGNhY2hlZCBwYXRoIGZvciB0aGlzIGlkZW50aWZpZXIgYnkgdHJ5aW5nIGNvbW1vbiBuYW1pbmcgcGF0dGVybnMuXG4gICAgLy8gSU1QT1JUQU5UOiBmaWxlUGF0aFRvSWQgc3RvcmVzIGFic29sdXRlIHBhdGhzIChzZXQgYnkgY2FjaGVFbGVtZW50IHZpYVxuICAgIC8vIHJlc29sdmVBYnNvbHV0ZVBhdGgpLCBzbyB3ZSBtdXN0IHJlc29sdmUgdG8gYWJzb2x1dGUgYmVmb3JlIGxvb2t1cC5cbiAgICBjb25zdCBwb3NzaWJsZUZpbGVuYW1lcyA9IFtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBgJHtpZGVudGlmaWVyfSR7dGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCl9YCxcbiAgICAgIC8vIFVzZSB1bmlmaWVkIG5vcm1hbGl6ZUZpbGVuYW1lIGZvciBjb25zaXN0ZW50IGNhY2hlIGxvb2t1cHNcbiAgICAgIHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKGlkZW50aWZpZXIpXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcG9zc2libGVGaWxlbmFtZXMpIHtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlbmFtZSk7XG4gICAgICBjb25zdCBjYWNoZWRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuICAgICAgaWYgKGNhY2hlZElkKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzLmdldChjYWNoZWRJZCk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogVHJ5IGxvYWRpbmcgZWxlbWVudCBkaXJlY3RseSBieSBjb25zdHJ1Y3RpbmcgZXhwZWN0ZWQgZmlsZW5hbWVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdHJ5RGlyZWN0TG9hZChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBUcnkgbG9hZGluZyB1c2luZyBjb21tb24gbmFtaW5nIHBhdHRlcm5zXG4gICAgLy8gVXNlIHVuaWZpZWQgbm9ybWFsaXplRmlsZW5hbWUgZm9yIGNvbnNpc3RlbnQgZmlsZW5hbWUgY29uc3RydWN0aW9uXG4gICAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICAgIC8vIFByaW1hcnk6IFVzZSB1bmlmaWVkIG5vcm1hbGl6YXRpb24gKGhhbmRsZXMgQ2FtZWxDYXNlLCBzcGFjZXMsIHVuZGVyc2NvcmVzLCBldGMuKVxuICAgICAgdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoaWRlbnRpZmllciksXG4gICAgICAvLyBGYWxsYmFjazogSWRlbnRpZmllciBhcy1pcyB3aXRoIGV4dGVuc2lvblxuICAgICAgYCR7aWRlbnRpZmllcn0ke3RoaXMuZ2V0RmlsZUV4dGVuc2lvbigpfWAsXG4gICAgICAvLyBGYWxsYmFjazogSWRlbnRpZmllciBhbHJlYWR5IGluY2x1ZGVzIGV4dGVuc2lvblxuICAgICAgaWRlbnRpZmllclxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHBvc3NpYmxlUGF0aHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmxvYWQoZmlsZVBhdGgpO1xuICAgICAgICAvLyBWZXJpZnkgdGhlIGxvYWRlZCBlbGVtZW50IG1hdGNoZXMgdGhlIGlkZW50aWZpZXJcbiAgICAgICAgLy8gTm9ybWFsaXplIGJvdGggc2lkZXMgc28gXCJDb2RlIFJldmlld1wiIChzcGFjZXMpIG1hdGNoZXMgXCJjb2RlLXJldmlld1wiIChoeXBoZW5zKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkTWV0YU5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGVsZW1lbnQubWV0YWRhdGEubmFtZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXRhTmFtZSA9PT0gbm9ybWFsaXplZElkZW50aWZpZXIgfHxcbiAgICAgICAgICAgIGVsZW1lbnQubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCBvciBmYWlsZWQgdG8gbG9hZCAtIHRyeSBuZXh0IHBhdGhcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBlbGVtZW50XG4gICAqIERlbGVnYXRlcyB0byBlbGVtZW50J3Mgb3duIHZhbGlkYXRlIG1ldGhvZFxuICAgKlxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIGJvdGggJ3ZhbGlkJyBhbmQgJ2lzVmFsaWQnIHByb3BlcnRpZXMuXG4gICAqICAgICAgICAgICdpc1ZhbGlkJyBpcyBkZXByZWNhdGVkIC0gdXNlICd2YWxpZCcgZm9yIG5ldyBjb2RlLlxuICAgKi9cbiAgdmFsaWRhdGUoZWxlbWVudDogVCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZWxlbWVudFxuICAgKiBTRUNVUklUWTogUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0c2lkZSBkaXJlY3RvcnlcbiAgICogQ0FDSEUgRklYOiBVc2VzIGZpbGVwYXRoLWJhc2VkIGNhY2hlIHJlbW92YWwgdG8gcHJldmVudCBzdGFsZSBlbnRyaWVzXG4gICAqL1xuICBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmRlbGV0ZWAsXG4gICAgICBkZXRhaWxzOiBgQXR0ZW1wdGluZyB0byBkZWxldGUgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSh0aGlzLmdldEVsZW1lbnRMYWJlbCgpLCBjb3JyZWxhdGlvbklkKTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpkZWxldGU6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZENvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLnVuY2FjaGVCeVBhdGgocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOnN1Y2Nlc3MnLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRSb2xsYmFjayhhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOmVycm9yJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlcnJvciB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jYW5EZWxldGUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudEZvclZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLmxvYWRFbGVtZW50U25hcHNob3QoYWJzb2x1dGVQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGF3YWl0IHRoaXMuY2FuRGVsZXRlKGVsZW1lbnRGb3JWYWxpZGF0aW9uKTtcbiAgICAgICAgaWYgKCFkZWNpc2lvbi5hbGxvd2VkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRlY2lzaW9uLnJlYXNvbiA/PyBgRGVsZXRpb24gbm90IHBlcm1pdHRlZCBmb3IgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vdmVkVG9CYWNrdXAgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEJlZm9yZURlbGV0ZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgaWYgKCFtb3ZlZFRvQmFja3VwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZGVsZXRlYFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gZGVsZXRlZDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhhYnNvbHV0ZVBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGZpbGUgcGF0aFxuICAgKi9cbiAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgICAgaWYgKCFzYW5pdGl6ZWQgfHwgcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2FuaXRpemVkLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKHNhbml0aXplZCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWycubWQnLCAnLm1hcmtkb3duJywgJy50eHQnLCAnLnltbCcsICcueWFtbCddO1xuXG4gICAgICByZXR1cm4gZXh0ID09PSAnJyB8fCBhbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhleHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgZ2V0RWxlbWVudFR5cGUoKTogRWxlbWVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgZmlsZSBwYXRoIHRvIGl0cyBhYnNvbHV0ZSBmb3JtIGZvciBjYWNoZSBjb25zaXN0ZW5jeVxuICAgKiBFbnN1cmVzIGNvbnNpc3RlbnQgcGF0aCBoYW5kbGluZyBhY3Jvc3MgcmVsYXRpdmUvYWJzb2x1dGUgcGF0aHNcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICA/IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKVxuICAgICAgOiBwYXRoLm5vcm1hbGl6ZShwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBmaWxlUGF0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8eyByZWxhdGl2ZVBhdGg6IHN0cmluZzsgYWJzb2x1dGVQYXRoOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuXG4gICAgaWYgKCFzYW5pdGl6ZWRQYXRoIHx8IHNhbml0aXplZFBhdGgudHJpbSgpLmxlbmd0aCA9PT0gMCB8fCBzYW5pdGl6ZWRQYXRoID09PSAnLicgfHwgc2FuaXRpemVkUGF0aCA9PT0gcGF0aC5zZXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGg6IGVtcHR5IHBhdGggaXMgbm90IGFsbG93ZWRgKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFic29sdXRlICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIChyZW1vdmUgcmVkdW5kYW50IHNlcGFyYXRvcnMsIHJlc29sdmUgLiBhbmQgLi4pXG4gICAgY29uc3Qgbm9ybWFsaXplZFJlbGF0aXZlID0gcGF0aC5ub3JtYWxpemUoc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBCdWlsZCBhYnNvbHV0ZSBwYXRoXG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgbm9ybWFsaXplZFJlbGF0aXZlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBXSVRIT1VUIHJlc29sdmluZyBzeW1saW5rcyAtIGp1c3QgY2hlY2sgc2VjdXJpdHkgY29uc3RyYWludHNcbiAgICAgIGF3YWl0IFBhdGhWYWxpZGF0b3IudmFsaWRhdGVFbGVtZW50UGF0aE9ubHkoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnREaXIpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIGlucHV0IGFzIHJlbGF0aXZlUGF0aCAoaXQncyBhbHJlYWR5IHJlbGF0aXZlKSBhbmQgY29tcHV0ZWQgYWJzb2x1dGVQYXRoXG4gICAgICByZXR1cm4geyByZWxhdGl2ZVBhdGg6IG5vcm1hbGl6ZWRSZWxhdGl2ZSwgYWJzb2x1dGVQYXRoIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGF0aCc7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRoOiAke3JlYXNvbn1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldCh0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKSk7XG4gICAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmdldChlbGVtZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RlY3RlZCBjYWNoZSBsb29rdXAgYnkgYWJzb2x1dGUgcGF0aC5cbiAgICogQWxsb3dzIHN1YmNsYXNzZXMgd2l0aCBjdXN0b20gbG9hZCgpIG92ZXJyaWRlcyAoZS5nLiBNZW1vcnlNYW5hZ2VyKVxuICAgKiB0byBjaGVjayB0aGUgTFJVIGNhY2hlIGJlZm9yZSByZS1yZWFkaW5nIGZyb20gZGlzay5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRDYWNoZWRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRWxlbWVudFNuYXBzaG90KGFic29sdXRlUGF0aDogc3RyaW5nLCByZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRFbGVtZW50RmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5sb2FkRWxlbWVudFNuYXBzaG90YFxuICAgIH0pO1xuICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihyYXcsIHVuZGVmaW5lZCwge1xuICAgICAgY29udGVudENvbnRleHQ6IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXSxcbiAgICB9KTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChtZXRhZGF0YSwgcGFyc2VkLmNvbnRlbnQpO1xuICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBldmVudCBwYXlsb2FkIGZvciBlbGVtZW50IGxpZmVjeWNsZSBldmVudHMuXG4gICAqXG4gICAqIFRoaXMgaGVscGVyIGlzIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzIHRvIGVuc3VyZSBjb25zaXN0ZW50IGV2ZW50IHBheWxvYWRcbiAgICogc3RydWN0dXJlIHdoZW4gZW1pdHRpbmcgY3VzdG9tIGV2ZW50cyB2aWEgdGhlIGRpc3BhdGNoZXIgZ2V0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gRXZlbnQgcGFyYW1ldGVycyBpbmNsdWRpbmcgY29ycmVsYXRpb24gSUQsIGVsZW1lbnQsIGZpbGUgcGF0aCwgYW5kIG9wdGlvbmFsIGVycm9yXG4gICAqIEByZXR1cm5zIEZ1bGx5LWZvcm1lZCBFbGVtZW50RXZlbnRQYXlsb2FkIHJlYWR5IGZvciBlbWlzc2lvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUV2ZW50UGF5bG9hZChwYXJhbXM6IHtcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgZmlsZVBhdGg/OiBzdHJpbmc7XG4gICAgZWxlbWVudD86IFQ7XG4gICAgZXJyb3I/OiB1bmtub3duO1xuICB9KTogRWxlbWVudEV2ZW50UGF5bG9hZCB7XG4gICAgY29uc3QgZWxlbWVudElkID0gcGFyYW1zLmVsZW1lbnQ/LmlkO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSBlbGVtZW50SWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmdldChlbGVtZW50SWQpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBjb3JyZWxhdGlvbklkOiBwYXJhbXMuY29ycmVsYXRpb25JZCxcbiAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmVsZW1lbnRUeXBlLFxuICAgICAgZWxlbWVudElkLFxuICAgICAgZmlsZVBhdGg6IHBhcmFtcy5maWxlUGF0aCxcbiAgICAgIG1ldGFkYXRhOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyLnNuYXBzaG90TWV0YWRhdGEocGFyYW1zLmVsZW1lbnQpLFxuICAgICAgZ2VuZXJhdGlvbixcbiAgICAgIGVycm9yOiBwYXJhbXMuZXJyb3JcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbENoYW5nZShyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudW5jYWNoZUJ5UGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmludmFsaWRhdGUoKTtcbiAgICAvLyBDbGVhciBlcnJvciBzdXBwcmVzc2lvbiBzbyBhIGNoYW5nZWQgZmlsZSBnZXRzIGZyZXNoIGxvZ2dpbmdcbiAgICB0aGlzLmludmFsaWRFbGVtZW50cy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAnZWxlbWVudDpleHRlcm5hbC1jaGFuZ2UnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlKSB7XG4gICAgICB2b2lkIHRoaXMubG9hZChyZWxhdGl2ZVBhdGgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIud2FybignQXV0byByZWxvYWQgYWZ0ZXIgZXh0ZXJuYWwgY2hhbmdlIGZhaWxlZCcsIHtcbiAgICAgICAgICBlbGVtZW50VHlwZTogdGhpcy5lbGVtZW50VHlwZSxcbiAgICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQWRkcyBhbiBlbGVtZW50IHRvIGJvdGggY2FjaGVzIChiaWRpcmVjdGlvbmFsIG1hcHBpbmcpXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjYWNoZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBGaWxlIHBhdGggKHJlbGF0aXZlIG9yIGFic29sdXRlKVxuICAgKi9cbiAgcHJvdGVjdGVkIGNhY2hlRWxlbWVudChlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcblxuICAgIC8vIENsZWFyIGFueSBzdGFsZSBjYWNoZSBlbnRyaWVzIGZvciB0aGlzIGZpbGVwYXRoIGJlZm9yZSBhZGRpbmcgdGhlIG5ldyBvbmUuXG4gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBnZW5lcmF0ZUlkKCkgaW4gQmFzZUVsZW1lbnQudHMgaW5jbHVkZXMgYSBEYXRlLm5vdygpXG4gICAgLy8gdGltZXN0YW1wLCBjYXVzaW5nIGVhY2ggbG9hZCBmcm9tIGRpc2sgdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbnQgSUQuIFdpdGhvdXQgdGhpc1xuICAgIC8vIGNsZWFudXAsIG9sZCBJRHMgcmVtYWluIGluIHRoZSBjYWNoZSBhcyBzdGFsZSBkYXRhLCBsZWFkaW5nIHRvIGluY29uc2lzdGVudFxuICAgIC8vIHJlc3VsdHMgaW4gbWV0aG9kcyBsaWtlIGZpbmRQZXJzb25hKCkgb3IgbGlzdCgpLlxuICAgIGNvbnN0IGV4aXN0aW5nSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcbiAgICBpZiAoZXhpc3RpbmdJZCAmJiBleGlzdGluZ0lkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAvLyBDbGVhciBzdGFsZSBjYWNoZSBlbnRyeSB3aGVuIGVsZW1lbnQgSUQgaGFzIGNoYW5nZWRcbiAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudHMuc2V0KGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLnNldChhYnNvbHV0ZVBhdGgsIGVsZW1lbnQuaWQpO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuY2FjaGVHZW5lcmF0aW9uQ291bnRlcjtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5zZXQoZWxlbWVudC5pZCwgZ2VuZXJhdGlvbik7XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICA/IHBhdGgucmVsYXRpdmUodGhpcy5lbGVtZW50RGlyLCBmaWxlUGF0aClcbiAgICAgIDogZmlsZVBhdGg7XG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdmaWxlbmFtZScsIHtcbiAgICAgICAgdmFsdWU6IHBhdGguYmFzZW5hbWUocmVsYXRpdmVQYXRoKSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnZmlsZVBhdGgnLCB7XG4gICAgICAgIHZhbHVlOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBhdHRhY2ggZmlsZW5hbWUgbWV0YWRhdGEgdG8gZWxlbWVudCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgYSBmcmVzaCBkaXNrIHNjYW4gYW5kIGV2aWN0IGFueSBtb2RpZmllZC9yZW1vdmVkIGVudHJpZXMgZnJvbSB0aGVcbiAgICogaW4tbWVtb3J5IExSVSBjYWNoZS4gQ2FsbCBiZWZvcmUgZmluZEJ5TmFtZSgpIHdoZW4gZnJlc2huZXNzIGlzIGNyaXRpY2FsXG4gICAqIChlLmcuIG9uIGVuc2VtYmxlIGFjdGl2YXRpb24pIHRvIHBpY2sgdXAgZXh0ZXJuYWwgZmlsZSBjaGFuZ2VzIHRoYXRcbiAgICogb2NjdXJyZWQgc2luY2UgdGhlIGxhc3Qgc2NhbiwgZXZlbiBpZiB0aGUgc2NhbiBjb29sZG93biBpcyBzdGlsbCBhY3RpdmUuXG4gICAqXG4gICAqIFVubGlrZSBsaXN0KCksIHRoaXMgZG9lcyBub3QgbG9hZCBhbGwgZWxlbWVudHMg4oCUIGl0IG9ubHkgZXZpY3RzIHN0YWxlIG9uZXMuXG4gICAqIEZpeGVzICMxODk1IChlbnNlbWJsZSBhY3RpdmF0aW9uIHNlcnZpbmcgc3RhbGUgY2FjaGVkIGVsZW1lbnQgbGlzdCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2NhbkFuZEV2aWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmludmFsaWRhdGUoKTsgLy8gYnlwYXNzIGNvb2xkb3duIHNvIHRoZSBuZXh0IHNjYW4gaGl0cyBkaXNrXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRpZmYgPSBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5zY2FuKCk7XG4gICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgWy4uLmRpZmYubW9kaWZpZWQsIC4uLmRpZmYucmVtb3ZlZF0pIHtcbiAgICAgICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIHJlbFBhdGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic1BhdGgpO1xuICAgICAgICBpZiAoZXhpc3RpbmdJZCkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgICAgIHRoaXMuZmlsZVBhdGhUb0lkLmRlbGV0ZShhYnNQYXRoKTtcbiAgICAgICAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsIOKAlCBjYWNoZSBtYXkgYmUgc2xpZ2h0bHkgc3RhbGUsIGJ1dCBhY3RpdmF0aW9uIHByb2NlZWRzICovIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSBib3RoIGNhY2hlcyBieSBmaWxlIHBhdGhcbiAgICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBmb3IgZGVsZXRpb24gdG8gYXZvaWQgc3RhbGUgY2FjaGUgZW50cmllc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBGaWxlIHBhdGggKHJlbGF0aXZlIG9yIGFic29sdXRlKVxuICAgKi9cbiAgcHJvdGVjdGVkIHVuY2FjaGVCeVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgZWxlbWVudElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic29sdXRlUGF0aCk7XG5cbiAgICBpZiAoZWxlbWVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGVsZW1lbnRJZCk7XG4gICAgICB0aGlzLmZpbGVQYXRoVG9JZC5kZWxldGUoYWJzb2x1dGVQYXRoKTtcbiAgICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmRlbGV0ZShlbGVtZW50SWQpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBVbmNhY2hlZCBlbGVtZW50ICR7ZWxlbWVudElkfSBmcm9tICR7YWJzb2x1dGVQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY2FjaGVkIGVsZW1lbnRzXG4gICAqL1xuICBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudHMuY2xlYXIoKTtcbiAgICB0aGlzLmZpbGVQYXRoVG9JZC5jbGVhcigpO1xuICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmNsZWFyKCk7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuY2xlYXIoKTtcbiAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgc3RhdGlzdGljcyBmb3IgZGVidWdnaW5nXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNhY2hlIHNpemUgbWV0cmljc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldENhY2hlU3RhdHMoKTogeyBlbGVtZW50Q291bnQ6IG51bWJlcjsgcGF0aE1hcHBpbmdzOiBudW1iZXIgfSB7XG4gICAgY29uc3QgZWxlbWVudHNTdGF0cyA9IHRoaXMuZWxlbWVudHMuZ2V0U3RhdHMoKTtcbiAgICBjb25zdCBwYXRoU3RhdHMgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXRTdGF0cygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRDb3VudDogZWxlbWVudHNTdGF0cy5zaXplLFxuICAgICAgcGF0aE1hcHBpbmdzOiBwYXRoU3RhdHMuc2l6ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXhwb3NlIGludGVybmFsIExSVSBjYWNoZSBpbnN0YW5jZXMgZm9yIG1ldHJpY3MgY29sbGVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRNZXRyaWNzQ2FjaGVzKCk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBpbnN0YW5jZTogTFJVQ2FjaGU8dW5rbm93bj4gfT4ge1xuICAgIHJldHVybiBbXG4gICAgICB7IG5hbWU6IGBlbGVtZW50czoke3RoaXMuZWxlbWVudFR5cGV9YCwgaW5zdGFuY2U6IHRoaXMuZWxlbWVudHMgYXMgTFJVQ2FjaGU8dW5rbm93bj4gfSxcbiAgICAgIHsgbmFtZTogYHBhdGhJbmRleDoke3RoaXMuZWxlbWVudFR5cGV9YCwgaW5zdGFuY2U6IHRoaXMuZmlsZVBhdGhUb0lkIGFzIExSVUNhY2hlPHVua25vd24+IH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHJlc291cmNlcyBhbmQgY2xlYW51cFxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBhZGQgdGhlaXIgb3duIGNsZWFudXAgbG9naWNcbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1lbW9yeUJ1ZGdldCkge1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQudW5yZWdpc3Rlcih0aGlzLmVsZW1lbnRzKTtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnVucmVnaXN0ZXIodGhpcy5maWxlUGF0aFRvSWQpO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuY2xlYXIoKTtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmNsZWFyKCk7XG4gICAgdGhpcy53YXRjaGVyQ2xlYW51cD8uKCk7XG4gICAgdGhpcy53YXRjaGVyQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICBsb2dnZXIuZGVidWcoYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfU1hbmFnZXIgZGlzcG9zZWQgYW5kIGNhY2hlcyBjbGVhcmVkYCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGSUxFTkFNRSBOT1JNQUxJWkFUSU9OIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGEgbmFtZSB0byBrZWJhYi1jYXNlIGZvciBjb25zaXN0ZW50IGZpbGVuYW1lIGZvcm1hdHRpbmcuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIHVuaWZpZWQgZmlsZW5hbWUgbm9ybWFsaXphdGlvbiBhY3Jvc3MgYWxsIGVsZW1lbnQgbWFuYWdlcnMsXG4gICAqIGVuc3VyaW5nIGNvbnNpc3RlbnQgbmFtaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IGZvcm1hdCAoQ2FtZWxDYXNlLCBzcGFjZXMsXG4gICAqIHVuZGVyc2NvcmVzLCBtaXhlZCBjYXNlLCBldGMuKS5cbiAgICpcbiAgICogVHJhbnNmb3JtYXRpb25zIGFwcGxpZWQgKGluIG9yZGVyKTpcbiAgICogMS4gSW5zZXJ0IGh5cGhlbnMgYmV0d2VlbiBjYW1lbENhc2UgYm91bmRhcmllcyAoTXlOYW1lIC0+IE15LU5hbWUpXG4gICAqIDIuIFJlcGxhY2Ugc3BhY2VzIGFuZCB1bmRlcnNjb3JlcyB3aXRoIGh5cGhlbnNcbiAgICogMy4gQ29udmVydCB0byBsb3dlcmNhc2VcbiAgICogNC4gU3RyaXAgaW52YWxpZCBjaGFyYWN0ZXJzIChrZWVwIG9ubHkgYS16LCAwLTksIC0pXG4gICAqIDUuIENvbGxhcHNlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGh5cGhlbnNcbiAgICogNi4gVHJpbSBsZWFkaW5nL3RyYWlsaW5nIGh5cGhlbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJDUlVEVi1BZ2VudC1EZWx0YVwiKSAvLyBcImNydWR2LWFnZW50LWRlbHRhXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJDcmVhdGl2ZSBXcml0ZXJcIikgICAvLyBcImNyZWF0aXZlLXdyaXRlclwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ2FtZWxDYXNlTmFtZVwiKSAgICAgLy8gXCJjYW1lbC1jYXNlLW5hbWVcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIm15X3NraWxsX25hbWVcIikgICAgIC8vIFwibXktc2tpbGwtbmFtZVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiU3BlY2lhbEBDaGFycyFcIikgICAgLy8gXCJzcGVjaWFsLWNoYXJzXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCItLWxlYWRpbmctYW5kLXRyYWlsaW5nLS1cIikgLy8gXCJsZWFkaW5nLWFuZC10cmFpbGluZ1wiXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGVsZW1lbnQgbmFtZSB0byBub3JtYWxpemVcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBrZWJhYi1jYXNlIGZpbGVuYW1lICh3aXRob3V0IGV4dGVuc2lvbilcbiAgICovXG4gIHByb3RlY3RlZCBub3JtYWxpemVGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAndW5uYW1lZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC8vIFN0ZXAgMTogSW5zZXJ0IGh5cGhlbnMgYmV0d2VlbiBjYW1lbENhc2UgYm91bmRhcmllcyAobG93ZXJjYXNlIGZvbGxvd2VkIGJ5IHVwcGVyY2FzZSlcbiAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKVxuICAgICAgLy8gU3RlcCAyOiBSZXBsYWNlIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zXG4gICAgICAucmVwbGFjZSgvW1xcc19dKy9nLCAnLScpXG4gICAgICAvLyBTdGVwIDM6IENvbnZlcnQgdG8gbG93ZXJjYXNlXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLy8gU3RlcCA0OiBTdHJpcCBpbnZhbGlkIGNoYXJhY3RlcnMgKGtlZXAgb25seSBhbHBoYW51bWVyaWMgYW5kIGh5cGhlbnMpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpXG4gICAgICAvLyBTdGVwIDU6IENvbGxhcHNlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGh5cGhlbnNcbiAgICAgIC5yZXBsYWNlKC8tKy9nLCAnLScpXG4gICAgICAvLyBTdGVwIDY6IFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgaHlwaGVuc1xuICAgICAgLnJlcGxhY2UoL14tK3wtKyQvZywgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3RhbmRhcmRpemVkIGZpbGVuYW1lIGZvciBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBOb3JtYWxpemVzIHRoZSBlbGVtZW50IG5hbWUgKGhhbmRsaW5nIENhbWVsQ2FzZSwgc3BhY2VzLCB1bmRlcnNjb3JlcywgZXRjLilcbiAgICogYW5kIGFwcGVuZHMgdGhlIGZpbGUgZXh0ZW5zaW9uLiBUaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSAocGVyc29uYXMvLCBza2lsbHMvLCBldGMuKVxuICAgKiBhbHJlYWR5IHByb3ZpZGVzIHR5cGUgY29udGV4dCwgc28gdGhlIHR5cGUgaXMgTk9UIGluY2x1ZGVkIGluIHRoZSBmaWxlbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgZWxlbWVudCBuYW1lIHRvIGNvbnZlcnQgdG8gYSBmaWxlbmFtZVxuICAgKiBAcmV0dXJucyBUaGUgc3RhbmRhcmRpemVkIGZpbGVuYW1lIChlLmcuLCBcImNvZGUtcmV2aWV3Lm1kXCIpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcIkNvZGUgUmV2aWV3XCIpICAgICAgICAgLy8g4oaSIFwiY29kZS1yZXZpZXcubWRcIlxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJEZWJ1ZyBEZXRlY3RpdmVcIikgICAgIC8vIOKGkiBcImRlYnVnLWRldGVjdGl2ZS5tZFwiXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcIkJ1Z1JlcG9ydFwiKSAgICAgICAgICAgLy8g4oaSIFwiYnVnLXJlcG9ydC5tZFwiIChDYW1lbENhc2Ugc3BsaXQpXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcImZpeC1wZXJzb25hLWhlbHBlclwiKSAgLy8g4oaSIFwiZml4LXBlcnNvbmEtaGVscGVyLm1kXCIgKG5vIG1hbmdsaW5nKVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEVsZW1lbnRGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKSB8fCAndW5uYW1lZCc7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCk7XG4gICAgcmV0dXJuIGAke25vcm1hbGl6ZWROYW1lfSR7ZXh0ZW5zaW9ufWA7XG4gIH1cblxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFCU1RSQUNUIE1FVEhPRFMgLSBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBtZXRhZGF0YSBmcm9tIGZyb250bWF0dGVyXG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpY1xuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFJhdyBtZXRhZGF0YSBmcm9tIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIGFuZCB0eXBlZCBtZXRhZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxUWydtZXRhZGF0YSddPjtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIEVsZW1lbnRWYWxpZGF0b3IgdmlhIFZhbGlkYXRpb25SZWdpc3RyeSBpbnN0ZWFkLlxuICAgKiBXaWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YTogYW55LCBfc3RyaWN0PzogYm9vbGVhbik6IFByb21pc2U8aW1wb3J0KCcuLi8uLi91dGlscy92YWxpZGF0aW9uL0ZpZWxkVmFsaWRhdG9yLmpzJykuVmFsaWRhdGlvbkVycm9yW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZU1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICByZXR1cm4gcmVzdWx0LmVycm9ycy5tYXAoZSA9PiAoeyBmaWVsZDogJ2dlbmVyYWwnLCBtZXNzYWdlOiBlIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZWxlbWVudCBpbnN0YW5jZSBmcm9tIG1ldGFkYXRhIGFuZCBjb250ZW50XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgY29uc3RydWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIFZhbGlkYXRlZCBtZXRhZGF0YVxuICAgKiBAcGFyYW0gY29udGVudCAtIEVsZW1lbnQgY29udGVudCAoaW5zdHJ1Y3Rpb25zLCB0ZW1wbGF0ZSwgZXRjLilcbiAgICogQHJldHVybnMgTmV3IGVsZW1lbnQgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBUWydtZXRhZGF0YSddLCBjb250ZW50OiBzdHJpbmcpOiBUO1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYW4gZWxlbWVudCB0byBmaWxlIGNvbnRlbnRcbiAgICogU3ViY2xhc3NlcyBjYW4gY3VzdG9taXplIHNlcmlhbGl6YXRpb24gZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXJpYWxpemVcbiAgICogQHJldHVybnMgRmlsZSBjb250ZW50ICh1c3VhbGx5IG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2VyaWFsaXplRWxlbWVudChlbGVtZW50OiBUKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgKiBNb3N0IGVsZW1lbnRzIHVzZSAubWQsIGJ1dCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZVxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBlbGVtZW50IGZyb20gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGZvcm1hdC1zcGVjaWZpYyBpbXBvcnQgbG9naWNcbiAgICovXG4gIGFic3RyYWN0IGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxUPjtcblxuICAvKipcbiAgICogRXhwb3J0IGFuIGVsZW1lbnQgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGZvcm1hdC1zcGVjaWZpYyBleHBvcnQgbG9naWNcbiAgICovXG4gIGFic3RyYWN0IGV4cG9ydEVsZW1lbnQoZWxlbWVudDogVCwgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPjtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"Memory.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/Memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Memory.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/Memory.ts"],"names":[],"mappings":"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"}