cdk-assets 0.0.0

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 (56) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +195 -0
  4. package/bin/cdk-assets +2 -0
  5. package/bin/cdk-assets.d.ts +1 -0
  6. package/bin/cdk-assets.js +70 -0
  7. package/bin/docker-credential-cdk-assets +2 -0
  8. package/bin/docker-credential-cdk-assets.d.ts +13 -0
  9. package/bin/docker-credential-cdk-assets.js +39 -0
  10. package/bin/list.d.ts +3 -0
  11. package/bin/list.js +10 -0
  12. package/bin/logging.d.ts +4 -0
  13. package/bin/logging.js +28 -0
  14. package/bin/publish.d.ts +5 -0
  15. package/bin/publish.js +49 -0
  16. package/lib/asset-manifest.d.ts +162 -0
  17. package/lib/asset-manifest.js +245 -0
  18. package/lib/aws-types.d.ts +1660 -0
  19. package/lib/aws-types.js +138 -0
  20. package/lib/aws.d.ts +70 -0
  21. package/lib/aws.js +125 -0
  22. package/lib/index.d.ts +4 -0
  23. package/lib/index.js +21 -0
  24. package/lib/private/archive.d.ts +3 -0
  25. package/lib/private/archive.js +87 -0
  26. package/lib/private/asset-handler.d.ts +54 -0
  27. package/lib/private/asset-handler.js +3 -0
  28. package/lib/private/docker-credentials.d.ts +35 -0
  29. package/lib/private/docker-credentials.js +89 -0
  30. package/lib/private/docker.d.ts +98 -0
  31. package/lib/private/docker.js +232 -0
  32. package/lib/private/fs-extra.d.ts +3 -0
  33. package/lib/private/fs-extra.js +37 -0
  34. package/lib/private/handlers/client-options.d.ts +3 -0
  35. package/lib/private/handlers/client-options.js +12 -0
  36. package/lib/private/handlers/container-images.d.ts +22 -0
  37. package/lib/private/handlers/container-images.js +224 -0
  38. package/lib/private/handlers/files.d.ts +14 -0
  39. package/lib/private/handlers/files.js +288 -0
  40. package/lib/private/handlers/index.d.ts +3 -0
  41. package/lib/private/handlers/index.js +16 -0
  42. package/lib/private/p-limit.d.ts +10 -0
  43. package/lib/private/p-limit.js +51 -0
  44. package/lib/private/placeholders.d.ts +10 -0
  45. package/lib/private/placeholders.js +34 -0
  46. package/lib/private/shell.d.ts +24 -0
  47. package/lib/private/shell.js +131 -0
  48. package/lib/private/util.d.ts +5 -0
  49. package/lib/private/util.js +16 -0
  50. package/lib/progress.d.ts +114 -0
  51. package/lib/progress.js +104 -0
  52. package/lib/publishing.d.ts +118 -0
  53. package/lib/publishing.js +193 -0
  54. package/package.json +103 -0
  55. package/scripts/manual-test-manifest.json +12 -0
  56. package/scripts/manual-test.sh +22 -0
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ /**
3
+ * This file contains a copy of the input and output types from the SDK v3
4
+ * clients. Instead of exposing the SDK types in the public interface, we
5
+ * expose these, shielding consumers from breaking changes in a possible
6
+ * migration to an SDK v4.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.EncryptionType = exports.ImageTagMutability = exports.FindingSeverity = exports.ScanStatus = exports.TagStatus = exports.StorageClass = exports.ObjectLockLegalHoldStatus = exports.ObjectLockMode = exports.ObjectCannedACL = exports.ObjectStorageClass = exports.ChecksumAlgorithmIn = exports.RequestCharged = exports.OptionalObjectAttributes = exports.RequestPayer = exports.EncodingType = exports.BucketLocationConstraint = exports.ServerSideEncryption = void 0;
10
+ exports.ServerSideEncryption = {
11
+ AES256: 'AES256',
12
+ aws_kms: 'aws:kms',
13
+ aws_kms_dsse: 'aws:kms:dsse',
14
+ };
15
+ exports.BucketLocationConstraint = {
16
+ EU: 'EU',
17
+ af_south_1: 'af-south-1',
18
+ ap_east_1: 'ap-east-1',
19
+ ap_northeast_1: 'ap-northeast-1',
20
+ ap_northeast_2: 'ap-northeast-2',
21
+ ap_northeast_3: 'ap-northeast-3',
22
+ ap_south_1: 'ap-south-1',
23
+ ap_south_2: 'ap-south-2',
24
+ ap_southeast_1: 'ap-southeast-1',
25
+ ap_southeast_2: 'ap-southeast-2',
26
+ ap_southeast_3: 'ap-southeast-3',
27
+ ca_central_1: 'ca-central-1',
28
+ cn_north_1: 'cn-north-1',
29
+ cn_northwest_1: 'cn-northwest-1',
30
+ eu_central_1: 'eu-central-1',
31
+ eu_north_1: 'eu-north-1',
32
+ eu_south_1: 'eu-south-1',
33
+ eu_south_2: 'eu-south-2',
34
+ eu_west_1: 'eu-west-1',
35
+ eu_west_2: 'eu-west-2',
36
+ eu_west_3: 'eu-west-3',
37
+ me_south_1: 'me-south-1',
38
+ sa_east_1: 'sa-east-1',
39
+ us_east_2: 'us-east-2',
40
+ us_gov_east_1: 'us-gov-east-1',
41
+ us_gov_west_1: 'us-gov-west-1',
42
+ us_west_1: 'us-west-1',
43
+ us_west_2: 'us-west-2',
44
+ };
45
+ exports.EncodingType = {
46
+ url: 'url',
47
+ };
48
+ exports.RequestPayer = {
49
+ requester: 'requester',
50
+ };
51
+ exports.OptionalObjectAttributes = {
52
+ RESTORE_STATUS: 'RestoreStatus',
53
+ };
54
+ exports.RequestCharged = {
55
+ requester: 'requester',
56
+ };
57
+ exports.ChecksumAlgorithmIn = {
58
+ CRC32: 'CRC32',
59
+ CRC32C: 'CRC32C',
60
+ SHA1: 'SHA1',
61
+ SHA256: 'SHA256',
62
+ };
63
+ exports.ObjectStorageClass = {
64
+ DEEP_ARCHIVE: 'DEEP_ARCHIVE',
65
+ EXPRESS_ONEZONE: 'EXPRESS_ONEZONE',
66
+ GLACIER: 'GLACIER',
67
+ GLACIER_IR: 'GLACIER_IR',
68
+ INTELLIGENT_TIERING: 'INTELLIGENT_TIERING',
69
+ ONEZONE_IA: 'ONEZONE_IA',
70
+ OUTPOSTS: 'OUTPOSTS',
71
+ REDUCED_REDUNDANCY: 'REDUCED_REDUNDANCY',
72
+ SNOW: 'SNOW',
73
+ STANDARD: 'STANDARD',
74
+ STANDARD_IA: 'STANDARD_IA',
75
+ };
76
+ exports.ObjectCannedACL = {
77
+ authenticated_read: 'authenticated-read',
78
+ aws_exec_read: 'aws-exec-read',
79
+ bucket_owner_full_control: 'bucket-owner-full-control',
80
+ bucket_owner_read: 'bucket-owner-read',
81
+ private: 'private',
82
+ public_read: 'public-read',
83
+ public_read_write: 'public-read-write',
84
+ };
85
+ exports.ObjectLockMode = {
86
+ COMPLIANCE: 'COMPLIANCE',
87
+ GOVERNANCE: 'GOVERNANCE',
88
+ };
89
+ exports.ObjectLockLegalHoldStatus = {
90
+ OFF: 'OFF',
91
+ ON: 'ON',
92
+ };
93
+ exports.StorageClass = {
94
+ DEEP_ARCHIVE: 'DEEP_ARCHIVE',
95
+ EXPRESS_ONEZONE: 'EXPRESS_ONEZONE',
96
+ GLACIER: 'GLACIER',
97
+ GLACIER_IR: 'GLACIER_IR',
98
+ INTELLIGENT_TIERING: 'INTELLIGENT_TIERING',
99
+ ONEZONE_IA: 'ONEZONE_IA',
100
+ OUTPOSTS: 'OUTPOSTS',
101
+ REDUCED_REDUNDANCY: 'REDUCED_REDUNDANCY',
102
+ SNOW: 'SNOW',
103
+ STANDARD: 'STANDARD',
104
+ STANDARD_IA: 'STANDARD_IA',
105
+ };
106
+ exports.TagStatus = {
107
+ ANY: 'ANY',
108
+ TAGGED: 'TAGGED',
109
+ UNTAGGED: 'UNTAGGED',
110
+ };
111
+ exports.ScanStatus = {
112
+ ACTIVE: 'ACTIVE',
113
+ COMPLETE: 'COMPLETE',
114
+ FAILED: 'FAILED',
115
+ FINDINGS_UNAVAILABLE: 'FINDINGS_UNAVAILABLE',
116
+ IN_PROGRESS: 'IN_PROGRESS',
117
+ PENDING: 'PENDING',
118
+ SCAN_ELIGIBILITY_EXPIRED: 'SCAN_ELIGIBILITY_EXPIRED',
119
+ UNSUPPORTED_IMAGE: 'UNSUPPORTED_IMAGE',
120
+ };
121
+ exports.FindingSeverity = {
122
+ CRITICAL: 'CRITICAL',
123
+ HIGH: 'HIGH',
124
+ INFORMATIONAL: 'INFORMATIONAL',
125
+ LOW: 'LOW',
126
+ MEDIUM: 'MEDIUM',
127
+ UNDEFINED: 'UNDEFINED',
128
+ };
129
+ exports.ImageTagMutability = {
130
+ IMMUTABLE: 'IMMUTABLE',
131
+ MUTABLE: 'MUTABLE',
132
+ };
133
+ exports.EncryptionType = {
134
+ AES256: 'AES256',
135
+ KMS: 'KMS',
136
+ KMS_DSSE: 'KMS_DSSE',
137
+ };
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBc0RVLFFBQUEsb0JBQW9CLEdBQUc7SUFDbEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsWUFBWSxFQUFFLGNBQWM7Q0FDcEIsQ0FBQztBQWdHRSxRQUFBLHdCQUF3QixHQUFHO0lBQ3RDLEVBQUUsRUFBRSxJQUFJO0lBQ1IsVUFBVSxFQUFFLFlBQVk7SUFDeEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxZQUFZLEVBQUUsY0FBYztJQUM1QixVQUFVLEVBQUUsWUFBWTtJQUN4QixVQUFVLEVBQUUsWUFBWTtJQUN4QixVQUFVLEVBQUUsWUFBWTtJQUN4QixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsV0FBVztJQUN0QixVQUFVLEVBQUUsWUFBWTtJQUN4QixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsV0FBVztJQUN0QixhQUFhLEVBQUUsZUFBZTtJQUM5QixhQUFhLEVBQUUsZUFBZTtJQUM5QixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsV0FBVztDQUNkLENBQUM7QUFnQkUsUUFBQSxZQUFZLEdBQUc7SUFDMUIsR0FBRyxFQUFFLEtBQUs7Q0FDRixDQUFDO0FBSUUsUUFBQSxZQUFZLEdBQUc7SUFDMUIsU0FBUyxFQUFFLFdBQVc7Q0FDZCxDQUFDO0FBSUUsUUFBQSx3QkFBd0IsR0FBRztJQUN0QyxjQUFjLEVBQUUsZUFBZTtDQUN2QixDQUFDO0FBMEhFLFFBQUEsY0FBYyxHQUFHO0lBQzVCLFNBQVMsRUFBRSxXQUFXO0NBQ2QsQ0FBQztBQUlFLFFBQUEsbUJBQW1CLEdBQUc7SUFDakMsS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsUUFBUTtJQUNoQixJQUFJLEVBQUUsTUFBTTtJQUNaLE1BQU0sRUFBRSxRQUFRO0NBQ1IsQ0FBQztBQU1FLFFBQUEsa0JBQWtCLEdBQUc7SUFDaEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxPQUFPLEVBQUUsU0FBUztJQUNsQixVQUFVLEVBQUUsWUFBWTtJQUN4QixtQkFBbUIsRUFBRSxxQkFBcUI7SUFDMUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLElBQUksRUFBRSxNQUFNO0lBQ1osUUFBUSxFQUFFLFVBQVU7SUFDcEIsV0FBVyxFQUFFLGFBQWE7Q0FDbEIsQ0FBQztBQTBTRSxRQUFBLGVBQWUsR0FBRztJQUM3QixrQkFBa0IsRUFBRSxvQkFBb0I7SUFDeEMsYUFBYSxFQUFFLGVBQWU7SUFDOUIseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxPQUFPLEVBQUUsU0FBUztJQUNsQixXQUFXLEVBQUUsYUFBYTtJQUMxQixpQkFBaUIsRUFBRSxtQkFBbUI7Q0FDOUIsQ0FBQztBQUlFLFFBQUEsY0FBYyxHQUFHO0lBQzVCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFVBQVUsRUFBRSxZQUFZO0NBQ2hCLENBQUM7QUFJRSxRQUFBLHlCQUF5QixHQUFHO0lBQ3ZDLEdBQUcsRUFBRSxLQUFLO0lBQ1YsRUFBRSxFQUFFLElBQUk7Q0FDQSxDQUFDO0FBS0UsUUFBQSxZQUFZLEdBQUc7SUFDMUIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxPQUFPLEVBQUUsU0FBUztJQUNsQixVQUFVLEVBQUUsWUFBWTtJQUN4QixtQkFBbUIsRUFBRSxxQkFBcUI7SUFDMUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLElBQUksRUFBRSxNQUFNO0lBQ1osUUFBUSxFQUFFLFVBQVU7SUFDcEIsV0FBVyxFQUFFLGFBQWE7Q0FDbEIsQ0FBQztBQTZrQkUsUUFBQSxTQUFTLEdBQUc7SUFDdkIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixRQUFRLEVBQUUsVUFBVTtDQUNaLENBQUM7QUFrREUsUUFBQSxVQUFVLEdBQUc7SUFDeEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsb0JBQW9CLEVBQUUsc0JBQXNCO0lBQzVDLFdBQVcsRUFBRSxhQUFhO0lBQzFCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLHdCQUF3QixFQUFFLDBCQUEwQjtJQUNwRCxpQkFBaUIsRUFBRSxtQkFBbUI7Q0FDOUIsQ0FBQztBQUlFLFFBQUEsZUFBZSxHQUFHO0lBQzdCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLElBQUksRUFBRSxNQUFNO0lBQ1osYUFBYSxFQUFFLGVBQWU7SUFDOUIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixTQUFTLEVBQUUsV0FBVztDQUNkLENBQUM7QUEwSkUsUUFBQSxrQkFBa0IsR0FBRztJQUNoQyxTQUFTLEVBQUUsV0FBVztJQUN0QixPQUFPLEVBQUUsU0FBUztDQUNWLENBQUM7QUFnQkUsUUFBQSxjQUFjLEdBQUc7SUFDNUIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsR0FBRyxFQUFFLEtBQUs7SUFDVixRQUFRLEVBQUUsVUFBVTtDQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgZmlsZSBjb250YWlucyBhIGNvcHkgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgdHlwZXMgZnJvbSB0aGUgU0RLIHYzXG4gKiBjbGllbnRzLiBJbnN0ZWFkIG9mIGV4cG9zaW5nIHRoZSBTREsgdHlwZXMgaW4gdGhlIHB1YmxpYyBpbnRlcmZhY2UsIHdlXG4gKiBleHBvc2UgdGhlc2UsIHNoaWVsZGluZyBjb25zdW1lcnMgZnJvbSBicmVha2luZyBjaGFuZ2VzIGluIGEgcG9zc2libGVcbiAqIG1pZ3JhdGlvbiB0byBhbiBTREsgdjQuXG4gKi9cblxuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlTWV0YWRhdGEge1xuICAvKipcbiAgICogVGhlIHN0YXR1cyBjb2RlIG9mIHRoZSBsYXN0IEhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQgZm9yIHRoaXMgb3BlcmF0aW9uLlxuICAgKi9cbiAgaHR0cFN0YXR1c0NvZGU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbGFzdCByZXF1ZXN0IHNlbnQgZm9yIHRoaXMgb3BlcmF0aW9uLiBPZnRlblxuICAgKiByZXF1ZXN0ZWQgYnkgQVdTIHNlcnZpY2UgdGVhbXMgdG8gYWlkIGluIGRlYnVnZ2luZy5cbiAgICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgc2Vjb25kYXJ5IGlkZW50aWZpZXIgZm9yIHRoZSBsYXN0IHJlcXVlc3Qgc2VudC4gVXNlZCBmb3IgZGVidWdnaW5nLlxuICAgKi9cbiAgZXh0ZW5kZWRSZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHRlcnRpYXJ5IGlkZW50aWZpZXIgZm9yIHRoZSBsYXN0IHJlcXVlc3Qgc2VudC4gVXNlZCBmb3IgZGVidWdnaW5nLlxuICAgKi9cbiAgY2ZJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZC5cbiAgICovXG4gIGF0dGVtcHRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRoYXQgd2FzIHNwZW50IHdhaXRpbmcgYmV0d2VlblxuICAgKiByZXRyeSBhdHRlbXB0cy5cbiAgICovXG4gIHRvdGFsUmV0cnlEZWxheT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUJlYXJlciB7XG4gIC8qKlxuICAgKiBNZXRhZGF0YSBwZXJ0YWluaW5nIHRvIHRoaXMgcmVxdWVzdC5cbiAgICovXG4gICRtZXRhZGF0YTogUmVzcG9uc2VNZXRhZGF0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRCdWNrZXRFbmNyeXB0aW9uQ29tbWFuZElucHV0IHtcbiAgLyoqXG4gICAqIDxwPlRoZSBuYW1lIG9mIHRoZSBidWNrZXQgZnJvbSB3aGljaCB0aGUgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGlzXG4gICAqICAgICAgICAgIHJldHJpZXZlZC48L3A+XG4gICAqIDxwPk5vdGU6IFRvIHN1cHBseSB0aGUgTXVsdGktcmVnaW9uIEFjY2VzcyBQb2ludCAoTVJBUCkgdG8gQnVja2V0LCB5b3UgbmVlZCB0byBpbnN0YWxsIHRoZSBcIkBhd3Mtc2RrL3NpZ25hdHVyZS12NC1jcnRcIiBwYWNrYWdlIHRvIHlvdXIgcHJvamVjdCBkZXBlbmRlbmNpZXMuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgZ28gdG8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzLXYzI2tub3duLWlzc3VlczwvcD5cbiAgICovXG4gIEJ1Y2tldDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogPHA+VGhlIGFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci4gSWYgdGhlIGFjY291bnQgSUQgdGhhdCB5b3UgcHJvdmlkZSBkb2VzIG5vdCBtYXRjaCB0aGUgYWN0dWFsIG93bmVyIG9mIHRoZSBidWNrZXQsIHRoZSByZXF1ZXN0IGZhaWxzIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgPGNvZGU+NDAzIEZvcmJpZGRlbjwvY29kZT4gKGFjY2VzcyBkZW5pZWQpLjwvcD5cbiAgICovXG4gIEV4cGVjdGVkQnVja2V0T3duZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBTZXJ2ZXJTaWRlRW5jcnlwdGlvbiA9IHtcbiAgQUVTMjU2OiAnQUVTMjU2JyxcbiAgYXdzX2ttczogJ2F3czprbXMnLFxuICBhd3Nfa21zX2Rzc2U6ICdhd3M6a21zOmRzc2UnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VydmVyU2lkZUVuY3J5cHRpb24gPSAodHlwZW9mIFNlcnZlclNpZGVFbmNyeXB0aW9uKVtrZXlvZiB0eXBlb2YgU2VydmVyU2lkZUVuY3J5cHRpb25dO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0IHtcbiAgLyoqXG4gICAqIDxwPlNlcnZlci1zaWRlIGVuY3J5cHRpb24gYWxnb3JpdGhtIHRvIHVzZSBmb3IgdGhlIGRlZmF1bHQgZW5jcnlwdGlvbi48L3A+XG4gICAqL1xuICBTU0VBbGdvcml0aG06IFNlcnZlclNpZGVFbmNyeXB0aW9uIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogPHA+QW1hem9uIFdlYiBTZXJ2aWNlcyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChLTVMpIGN1c3RvbWVyIEFtYXpvbiBXZWIgU2VydmljZXMgS01TIGtleSBJRCB0byB1c2UgZm9yIHRoZSBkZWZhdWx0XG4gICAqICAgICAgICAgIGVuY3J5cHRpb24uIFRoaXMgcGFyYW1ldGVyIGlzIGFsbG93ZWQgaWYgYW5kIG9ubHkgaWYgPGNvZGU+U1NFQWxnb3JpdGhtPC9jb2RlPiBpcyBzZXQgdG9cbiAgICogICAgICAgICAgPGNvZGU+YXdzOmttczwvY29kZT4gb3IgPGNvZGU+YXdzOmttczpkc3NlPC9jb2RlPi48L3A+XG4gICAqICAgICAgICAgIDxwPllvdSBjYW4gc3BlY2lmeSB0aGUga2V5IElELCBrZXkgYWxpYXMsIG9yIHRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgS01TXG4gICAqICAgICAgICAgIGtleS48L3A+XG4gICAqICAgICAgICAgIDx1bD5cbiAgICogICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICA8cD5LZXkgSUQ6IDxjb2RlPjEyMzRhYmNkLTEyYWItMzRjZC01NmVmLTEyMzQ1Njc4OTBhYjwvY29kZT5cbiAgICogICAgICAgICAgICAgICAgPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPktleSBBUk46IDxjb2RlPmFybjphd3M6a21zOnVzLWVhc3QtMjoxMTExMjIyMjMzMzM6a2V5LzEyMzRhYmNkLTEyYWItMzRjZC01NmVmLTEyMzQ1Njc4OTBhYjwvY29kZT5cbiAgICogICAgICAgICAgICAgICAgPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPktleSBBbGlhczogPGNvZGU+YWxpYXMvYWxpYXMtbmFtZTwvY29kZT5cbiAgICogICAgICAgICAgICAgICAgPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8cD5JZiB5b3UgdXNlIGEga2V5IElELCB5b3UgY2FuIHJ1biBpbnRvIGEgTG9nRGVzdGluYXRpb24gdW5kZWxpdmVyYWJsZSBlcnJvciB3aGVuIGNyZWF0aW5nXG4gICAqICAgICAgICAgIGEgVlBDIGZsb3cgbG9nLiA8L3A+XG4gICAqICAgICAgICAgIDxwPklmIHlvdSBhcmUgdXNpbmcgZW5jcnlwdGlvbiB3aXRoIGNyb3NzLWFjY291bnQgb3IgQW1hem9uIFdlYiBTZXJ2aWNlcyBzZXJ2aWNlIG9wZXJhdGlvbnMgeW91IG11c3QgdXNlXG4gICAqICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIEtNUyBrZXkgQVJOLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9idWNrZXQtZW5jcnlwdGlvbi5odG1sI2J1Y2tldC1lbmNyeXB0aW9uLXVwZGF0ZS1idWNrZXQtcG9saWN5XCI+VXNpbmcgZW5jcnlwdGlvbiBmb3IgY3Jvc3MtYWNjb3VudCBvcGVyYXRpb25zPC9hPi48L3A+XG4gICAqICAgICAgICAgIDxpbXBvcnRhbnQ+XG4gICAqICAgICAgICAgICAgIDxwPkFtYXpvbiBTMyBvbmx5IHN1cHBvcnRzIHN5bW1ldHJpYyBlbmNyeXB0aW9uIEtNUyBrZXlzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va21zL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zeW1tZXRyaWMtYXN5bW1ldHJpYy5odG1sXCI+QXN5bW1ldHJpYyBrZXlzIGluIEFtYXpvbiBXZWIgU2VydmljZXMgS01TPC9hPiBpbiB0aGUgPGk+QW1hem9uIFdlYiBTZXJ2aWNlcyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlXG4gICAqICAgICAgICAgICAgICAgIERldmVsb3BlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8L2ltcG9ydGFudD5cbiAgICovXG4gIEtNU01hc3RlcktleUlEPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlclNpZGVFbmNyeXB0aW9uUnVsZSB7XG4gIC8qKlxuICAgKiA8cD5TcGVjaWZpZXMgdGhlIGRlZmF1bHQgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB0byBhcHBseSB0byBuZXcgb2JqZWN0cyBpbiB0aGUgYnVja2V0LiBJZiBhXG4gICAqICAgICAgICAgIFBVVCBPYmplY3QgcmVxdWVzdCBkb2Vzbid0IHNwZWNpZnkgYW55IHNlcnZlci1zaWRlIGVuY3J5cHRpb24sIHRoaXMgZGVmYXVsdCBlbmNyeXB0aW9uIHdpbGxcbiAgICogICAgICAgICAgYmUgYXBwbGllZC48L3A+XG4gICAqL1xuICBBcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0PzogU2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ7XG4gIC8qKlxuICAgKiA8cD5TcGVjaWZpZXMgd2hldGhlciBBbWF6b24gUzMgc2hvdWxkIHVzZSBhbiBTMyBCdWNrZXQgS2V5IHdpdGggc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB1c2luZyBLTVNcbiAgICogICAgICAgICAgKFNTRS1LTVMpIGZvciBuZXcgb2JqZWN0cyBpbiB0aGUgYnVja2V0LiBFeGlzdGluZyBvYmplY3RzIGFyZSBub3QgYWZmZWN0ZWQuIFNldHRpbmcgdGhlXG4gICAqICAgICAgICAgICAgIDxjb2RlPkJ1Y2tldEtleUVuYWJsZWQ8L2NvZGU+IGVsZW1lbnQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gY2F1c2VzIEFtYXpvbiBTMyB0byB1c2UgYW4gUzNcbiAgICogICAgICAgICAgQnVja2V0IEtleS4gQnkgZGVmYXVsdCwgUzMgQnVja2V0IEtleSBpcyBub3QgZW5hYmxlZC48L3A+XG4gICAqICAgICAgICAgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2J1Y2tldC1rZXkuaHRtbFwiPkFtYXpvbiBTMyBCdWNrZXQgS2V5czwvYT4gaW4gdGhlXG4gICAqICAgICAgICAgICAgIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqL1xuICBCdWNrZXRLZXlFbmFibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogPHA+Q29udGFpbmVyIGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uXG4gICAqICAgICAgICAgIHJ1bGUuPC9wPlxuICAgKi9cbiAgUnVsZXM6IFNlcnZlclNpZGVFbmNyeXB0aW9uUnVsZVtdIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Y2tldEVuY3J5cHRpb25PdXRwdXQge1xuICAvKipcbiAgICogPHA+U3BlY2lmaWVzIHRoZSBkZWZhdWx0IHNlcnZlci1zaWRlLWVuY3J5cHRpb24gY29uZmlndXJhdGlvbi48L3A+XG4gICAqL1xuICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24/OiBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QnVja2V0RW5jcnlwdGlvbkNvbW1hbmRPdXRwdXRcbiAgZXh0ZW5kcyBHZXRCdWNrZXRFbmNyeXB0aW9uT3V0cHV0LFxuICBNZXRhZGF0YUJlYXJlciB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Y2tldExvY2F0aW9uQ29tbWFuZElucHV0IHtcbiAgLyoqXG4gICAqIDxwPlRoZSBuYW1lIG9mIHRoZSBidWNrZXQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbG9jYXRpb24uPC9wPlxuICAgKiAgICAgICAgICA8cD5XaGVuIHlvdSB1c2UgdGhpcyBBUEkgb3BlcmF0aW9uIHdpdGggYW4gYWNjZXNzIHBvaW50LCBwcm92aWRlIHRoZSBhbGlhcyBvZiB0aGUgYWNjZXNzIHBvaW50IGluIHBsYWNlIG9mIHRoZSBidWNrZXQgbmFtZS48L3A+XG4gICAqICAgICAgICAgIDxwPldoZW4geW91IHVzZSB0aGlzIEFQSSBvcGVyYXRpb24gd2l0aCBhbiBPYmplY3QgTGFtYmRhIGFjY2VzcyBwb2ludCwgcHJvdmlkZSB0aGUgYWxpYXMgb2YgdGhlIE9iamVjdCBMYW1iZGEgYWNjZXNzIHBvaW50IGluIHBsYWNlIG9mIHRoZSBidWNrZXQgbmFtZS5cbiAgICogSWYgdGhlIE9iamVjdCBMYW1iZGEgYWNjZXNzIHBvaW50IGFsaWFzIGluIGEgcmVxdWVzdCBpcyBub3QgdmFsaWQsIHRoZSBlcnJvciBjb2RlIDxjb2RlPkludmFsaWRBY2Nlc3NQb2ludEFsaWFzRXJyb3I8L2NvZGU+IGlzIHJldHVybmVkLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8Y29kZT5JbnZhbGlkQWNjZXNzUG9pbnRBbGlhc0Vycm9yPC9jb2RlPiwgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9FcnJvclJlc3BvbnNlcy5odG1sI0Vycm9yQ29kZUxpc3RcIj5MaXN0IG9mXG4gICAqICAgICAgICAgICAgIEVycm9yIENvZGVzPC9hPi48L3A+XG4gICAqIDxwPk5vdGU6IFRvIHN1cHBseSB0aGUgTXVsdGktcmVnaW9uIEFjY2VzcyBQb2ludCAoTVJBUCkgdG8gQnVja2V0LCB5b3UgbmVlZCB0byBpbnN0YWxsIHRoZSBcIkBhd3Mtc2RrL3NpZ25hdHVyZS12NC1jcnRcIiBwYWNrYWdlIHRvIHlvdXIgcHJvamVjdCBkZXBlbmRlbmNpZXMuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgZ28gdG8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzLXYzI2tub3duLWlzc3VlczwvcD5cbiAgICovXG4gIEJ1Y2tldDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogPHA+VGhlIGFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci4gSWYgdGhlIGFjY291bnQgSUQgdGhhdCB5b3UgcHJvdmlkZSBkb2VzIG5vdCBtYXRjaCB0aGUgYWN0dWFsIG93bmVyIG9mIHRoZSBidWNrZXQsIHRoZSByZXF1ZXN0IGZhaWxzIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgPGNvZGU+NDAzIEZvcmJpZGRlbjwvY29kZT4gKGFjY2VzcyBkZW5pZWQpLjwvcD5cbiAgICovXG4gIEV4cGVjdGVkQnVja2V0T3duZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBCdWNrZXRMb2NhdGlvbkNvbnN0cmFpbnQgPSB7XG4gIEVVOiAnRVUnLFxuICBhZl9zb3V0aF8xOiAnYWYtc291dGgtMScsXG4gIGFwX2Vhc3RfMTogJ2FwLWVhc3QtMScsXG4gIGFwX25vcnRoZWFzdF8xOiAnYXAtbm9ydGhlYXN0LTEnLFxuICBhcF9ub3J0aGVhc3RfMjogJ2FwLW5vcnRoZWFzdC0yJyxcbiAgYXBfbm9ydGhlYXN0XzM6ICdhcC1ub3J0aGVhc3QtMycsXG4gIGFwX3NvdXRoXzE6ICdhcC1zb3V0aC0xJyxcbiAgYXBfc291dGhfMjogJ2FwLXNvdXRoLTInLFxuICBhcF9zb3V0aGVhc3RfMTogJ2FwLXNvdXRoZWFzdC0xJyxcbiAgYXBfc291dGhlYXN0XzI6ICdhcC1zb3V0aGVhc3QtMicsXG4gIGFwX3NvdXRoZWFzdF8zOiAnYXAtc291dGhlYXN0LTMnLFxuICBjYV9jZW50cmFsXzE6ICdjYS1jZW50cmFsLTEnLFxuICBjbl9ub3J0aF8xOiAnY24tbm9ydGgtMScsXG4gIGNuX25vcnRod2VzdF8xOiAnY24tbm9ydGh3ZXN0LTEnLFxuICBldV9jZW50cmFsXzE6ICdldS1jZW50cmFsLTEnLFxuICBldV9ub3J0aF8xOiAnZXUtbm9ydGgtMScsXG4gIGV1X3NvdXRoXzE6ICdldS1zb3V0aC0xJyxcbiAgZXVfc291dGhfMjogJ2V1LXNvdXRoLTInLFxuICBldV93ZXN0XzE6ICdldS13ZXN0LTEnLFxuICBldV93ZXN0XzI6ICdldS13ZXN0LTInLFxuICBldV93ZXN0XzM6ICdldS13ZXN0LTMnLFxuICBtZV9zb3V0aF8xOiAnbWUtc291dGgtMScsXG4gIHNhX2Vhc3RfMTogJ3NhLWVhc3QtMScsXG4gIHVzX2Vhc3RfMjogJ3VzLWVhc3QtMicsXG4gIHVzX2dvdl9lYXN0XzE6ICd1cy1nb3YtZWFzdC0xJyxcbiAgdXNfZ292X3dlc3RfMTogJ3VzLWdvdi13ZXN0LTEnLFxuICB1c193ZXN0XzE6ICd1cy13ZXN0LTEnLFxuICB1c193ZXN0XzI6ICd1cy13ZXN0LTInLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQnVja2V0TG9jYXRpb25Db25zdHJhaW50ID1cbiAgKHR5cGVvZiBCdWNrZXRMb2NhdGlvbkNvbnN0cmFpbnQpW2tleW9mIHR5cGVvZiBCdWNrZXRMb2NhdGlvbkNvbnN0cmFpbnRdO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Y2tldExvY2F0aW9uT3V0cHV0IHtcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB0aGUgUmVnaW9uIHdoZXJlIHRoZSBidWNrZXQgcmVzaWRlcy4gRm9yIGEgbGlzdCBvZiBhbGwgdGhlIEFtYXpvbiBTMyBzdXBwb3J0ZWRcbiAgICogICAgICAgICAgbG9jYXRpb24gY29uc3RyYWludHMgYnkgUmVnaW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nZW5lcmFsL2xhdGVzdC9nci9yYW5kZS5odG1sI3MzX3JlZ2lvblwiPlJlZ2lvbnMgYW5kIEVuZHBvaW50czwvYT4uIEJ1Y2tldHMgaW5cbiAgICogICAgICAgICAgUmVnaW9uIDxjb2RlPnVzLWVhc3QtMTwvY29kZT4gaGF2ZSBhIExvY2F0aW9uQ29uc3RyYWludCBvZiA8Y29kZT5udWxsPC9jb2RlPi48L3A+XG4gICAqL1xuICBMb2NhdGlvbkNvbnN0cmFpbnQ/OiBCdWNrZXRMb2NhdGlvbkNvbnN0cmFpbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QnVja2V0TG9jYXRpb25Db21tYW5kT3V0cHV0IGV4dGVuZHMgR2V0QnVja2V0TG9jYXRpb25PdXRwdXQsIE1ldGFkYXRhQmVhcmVyIHt9XG5cbmV4cG9ydCBjb25zdCBFbmNvZGluZ1R5cGUgPSB7XG4gIHVybDogJ3VybCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbmNvZGluZ1R5cGUgPSAodHlwZW9mIEVuY29kaW5nVHlwZSlba2V5b2YgdHlwZW9mIEVuY29kaW5nVHlwZV07XG5cbmV4cG9ydCBjb25zdCBSZXF1ZXN0UGF5ZXIgPSB7XG4gIHJlcXVlc3RlcjogJ3JlcXVlc3RlcicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0UGF5ZXIgPSAodHlwZW9mIFJlcXVlc3RQYXllcilba2V5b2YgdHlwZW9mIFJlcXVlc3RQYXllcl07XG5cbmV4cG9ydCBjb25zdCBPcHRpb25hbE9iamVjdEF0dHJpYnV0ZXMgPSB7XG4gIFJFU1RPUkVfU1RBVFVTOiAnUmVzdG9yZVN0YXR1cycsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBPcHRpb25hbE9iamVjdEF0dHJpYnV0ZXMgPVxuICAodHlwZW9mIE9wdGlvbmFsT2JqZWN0QXR0cmlidXRlcylba2V5b2YgdHlwZW9mIE9wdGlvbmFsT2JqZWN0QXR0cmlidXRlc107XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdE9iamVjdHNWMkNvbW1hbmRJbnB1dCB7XG4gIC8qKlxuICAgKiA8cD5cbiAgICogICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHM8L2I+IC0gV2hlbiB5b3UgdXNlIHRoaXMgb3BlcmF0aW9uIHdpdGggYSBkaXJlY3RvcnkgYnVja2V0LCB5b3UgbXVzdCB1c2UgdmlydHVhbC1ob3N0ZWQtc3R5bGUgcmVxdWVzdHMgaW4gdGhlIGZvcm1hdCA8Y29kZT5cbiAgICogICAgICAgICAgICAgICAgPGk+QnVja2V0X25hbWU8L2k+LnMzZXhwcmVzcy08aT5hel9pZDwvaT4uPGk+cmVnaW9uPC9pPi5hbWF6b25hd3MuY29tPC9jb2RlPi4gUGF0aC1zdHlsZSByZXF1ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4gIERpcmVjdG9yeSBidWNrZXQgbmFtZXMgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGNob3NlbiBBdmFpbGFiaWxpdHkgWm9uZS4gQnVja2V0IG5hbWVzIG11c3QgZm9sbG93IHRoZSBmb3JtYXQgPGNvZGU+XG4gICAqICAgICAgICAgICAgICAgIDxpPmJ1Y2tldF9iYXNlX25hbWU8L2k+LS08aT5hei1pZDwvaT4tLXgtczM8L2NvZGU+IChmb3IgZXhhbXBsZSwgPGNvZGU+XG4gICAqICAgICAgICAgICAgICAgIDxpPkRPQy1FWEFNUExFLUJVQ0tFVDwvaT4tLTxpPnVzdzItYXoxPC9pPi0teC1zMzwvY29kZT4pLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgYnVja2V0IG5hbWluZ1xuICAgKiAgICAgICAgICByZXN0cmljdGlvbnMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvZGlyZWN0b3J5LWJ1Y2tldC1uYW1pbmctcnVsZXMuaHRtbFwiPkRpcmVjdG9yeSBidWNrZXQgbmFtaW5nXG4gICAqICAgICAgICAgICAgIHJ1bGVzPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgIDxiPkFjY2VzcyBwb2ludHM8L2I+IC0gV2hlbiB5b3UgdXNlIHRoaXMgYWN0aW9uIHdpdGggYW4gYWNjZXNzIHBvaW50LCB5b3UgbXVzdCBwcm92aWRlIHRoZSBhbGlhcyBvZiB0aGUgYWNjZXNzIHBvaW50IGluIHBsYWNlIG9mIHRoZSBidWNrZXQgbmFtZSBvciBzcGVjaWZ5IHRoZSBhY2Nlc3MgcG9pbnQgQVJOLiBXaGVuIHVzaW5nIHRoZSBhY2Nlc3MgcG9pbnQgQVJOLCB5b3UgbXVzdCBkaXJlY3QgcmVxdWVzdHMgdG8gdGhlIGFjY2VzcyBwb2ludCBob3N0bmFtZS4gVGhlIGFjY2VzcyBwb2ludCBob3N0bmFtZSB0YWtlcyB0aGUgZm9ybSA8aT5BY2Nlc3NQb2ludE5hbWU8L2k+LTxpPkFjY291bnRJZDwvaT4uczMtYWNjZXNzcG9pbnQuPGk+UmVnaW9uPC9pPi5hbWF6b25hd3MuY29tLiBXaGVuIHVzaW5nIHRoaXMgYWN0aW9uIHdpdGggYW4gYWNjZXNzIHBvaW50IHRocm91Z2ggdGhlIEFtYXpvbiBXZWIgU2VydmljZXMgU0RLcywgeW91IHByb3ZpZGUgdGhlIGFjY2VzcyBwb2ludCBBUk4gaW4gcGxhY2Ugb2YgdGhlIGJ1Y2tldCBuYW1lLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhY2Nlc3MgcG9pbnQgQVJOcywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS91c2luZy1hY2Nlc3MtcG9pbnRzLmh0bWxcIj5Vc2luZyBhY2Nlc3MgcG9pbnRzPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPkFjY2VzcyBwb2ludHMgYW5kIE9iamVjdCBMYW1iZGEgYWNjZXNzIHBvaW50cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICogICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgIDxiPlMzIG9uIE91dHBvc3RzPC9iPiAtIFdoZW4geW91IHVzZSB0aGlzIGFjdGlvbiB3aXRoIEFtYXpvbiBTMyBvbiBPdXRwb3N0cywgeW91IG11c3QgZGlyZWN0IHJlcXVlc3RzIHRvIHRoZSBTMyBvbiBPdXRwb3N0cyBob3N0bmFtZS4gVGhlIFMzIG9uIE91dHBvc3RzIGhvc3RuYW1lIHRha2VzIHRoZSBmb3JtIDxjb2RlPlxuICAgKiAgICAgICAgICAgICAgICA8aT5BY2Nlc3NQb2ludE5hbWU8L2k+LTxpPkFjY291bnRJZDwvaT4uPGk+b3V0cG9zdElEPC9pPi5zMy1vdXRwb3N0cy48aT5SZWdpb248L2k+LmFtYXpvbmF3cy5jb208L2NvZGU+LiBXaGVuIHlvdSB1c2UgdGhpcyBhY3Rpb24gd2l0aCBTMyBvbiBPdXRwb3N0cyB0aHJvdWdoIHRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIFNES3MsIHlvdSBwcm92aWRlIHRoZSBPdXRwb3N0cyBhY2Nlc3MgcG9pbnQgQVJOIGluIHBsYWNlIG9mIHRoZSBidWNrZXQgbmFtZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgUzMgb24gT3V0cG9zdHMgQVJOcywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9TM29uT3V0cG9zdHMuaHRtbFwiPldoYXQgaXMgUzMgb24gT3V0cG9zdHM/PC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogPHA+Tm90ZTogVG8gc3VwcGx5IHRoZSBNdWx0aS1yZWdpb24gQWNjZXNzIFBvaW50IChNUkFQKSB0byBCdWNrZXQsIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIFwiQGF3cy1zZGsvc2lnbmF0dXJlLXY0LWNydFwiIHBhY2thZ2UgdG8geW91ciBwcm9qZWN0IGRlcGVuZGVuY2llcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBnbyB0byBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1zZGstanMtdjMja25vd24taXNzdWVzPC9wPlxuICAgKi9cbiAgQnVja2V0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiA8cD5BIGRlbGltaXRlciBpcyBhIGNoYXJhY3RlciB0aGF0IHlvdSB1c2UgdG8gZ3JvdXAga2V5cy48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8dWw+XG4gICAqICAgICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgICAgICAgICAgIDxiPkRpcmVjdG9yeSBidWNrZXRzPC9iPiAtIEZvciBkaXJlY3RvcnkgYnVja2V0cywgPGNvZGU+LzwvY29kZT4gaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGRlbGltaXRlci48L3A+XG4gICAqICAgICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgICAgICAgICAgIDxiPkRpcmVjdG9yeSBidWNrZXRzIDwvYj4gLSBXaGVuIHlvdSBxdWVyeSA8Y29kZT5MaXN0T2JqZWN0c1YyPC9jb2RlPiB3aXRoIGEgZGVsaW1pdGVyIGR1cmluZyBpbi1wcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2FkcywgdGhlXG4gICAqICAgICAgICAgICAgIDxjb2RlPkNvbW1vblByZWZpeGVzPC9jb2RlPiByZXNwb25zZSBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIHByZWZpeGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW4tcHJvZ3Jlc3MgbXVsdGlwYXJ0IHVwbG9hZHMuXG4gICAqICAgICAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG11bHRpcGFydCB1cGxvYWRzLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L21wdW92ZXJ2aWV3Lmh0bWxcIj5NdWx0aXBhcnQgVXBsb2FkIE92ZXJ2aWV3PC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPC91bD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgRGVsaW1pdGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+RW5jb2RpbmcgdHlwZSB1c2VkIGJ5IEFtYXpvbiBTMyB0byBlbmNvZGUgdGhlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9vYmplY3Qta2V5cy5odG1sXCI+b2JqZWN0IGtleXM8L2E+IGluIHRoZSByZXNwb25zZS5cbiAgICogICAgICAgICAgUmVzcG9uc2VzIGFyZSBlbmNvZGVkIG9ubHkgaW4gVVRGLTguIEFuIG9iamVjdCBrZXkgY2FuIGNvbnRhaW4gYW55IFVuaWNvZGUgY2hhcmFjdGVyLlxuICAgKiAgICAgICAgICBIb3dldmVyLCB0aGUgWE1MIDEuMCBwYXJzZXIgY2FuJ3QgcGFyc2UgY2VydGFpbiBjaGFyYWN0ZXJzLCBzdWNoIGFzIGNoYXJhY3RlcnMgd2l0aCBhblxuICAgKiAgICAgICAgICBBU0NJSSB2YWx1ZSBmcm9tIDAgdG8gMTAuIEZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlbid0IHN1cHBvcnRlZCBpbiBYTUwgMS4wLCB5b3UgY2FuIGFkZCB0aGlzXG4gICAqICAgICAgICAgIHBhcmFtZXRlciB0byByZXF1ZXN0IHRoYXQgQW1hem9uIFMzIGVuY29kZSB0aGUga2V5cyBpbiB0aGUgcmVzcG9uc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0XG4gICAqICAgICAgICAgIGNoYXJhY3RlcnMgdG8gYXZvaWQgaW4gb2JqZWN0IGtleSBuYW1lcywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9vYmplY3Qta2V5cy5odG1sI29iamVjdC1rZXktZ3VpZGVsaW5lc1wiPk9iamVjdCBrZXkgbmFtaW5nXG4gICAqICAgICAgICAgICAgIGd1aWRlbGluZXM8L2E+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPldoZW4gdXNpbmcgdGhlIFVSTCBlbmNvZGluZyB0eXBlLCBub24tQVNDSUkgY2hhcmFjdGVycyB0aGF0IGFyZSB1c2VkIGluIGFuIG9iamVjdCdzXG4gICAqICAgICAgICAgICAgIGtleSBuYW1lIHdpbGwgYmUgcGVyY2VudC1lbmNvZGVkIGFjY29yZGluZyB0byBVVEYtOCBjb2RlIHZhbHVlcy4gRm9yIGV4YW1wbGUsIHRoZSBvYmplY3RcbiAgICogICAgICAgICAgICAgPGNvZGU+dGVzdF9maWxlKDMpLnBuZzwvY29kZT4gd2lsbCBhcHBlYXIgYXNcbiAgICogICAgICAgICAgICAgPGNvZGU+dGVzdF9maWxlJTI4MyUyOS5wbmc8L2NvZGU+LjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgRW5jb2RpbmdUeXBlPzogRW5jb2RpbmdUeXBlO1xuICAvKipcbiAgICogPHA+U2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Yga2V5cyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuIEJ5IGRlZmF1bHQsIHRoZSBhY3Rpb24gcmV0dXJuc1xuICAgKiAgICAgICAgICB1cCB0byAxLDAwMCBrZXkgbmFtZXMuIFRoZSByZXNwb25zZSBtaWdodCBjb250YWluIGZld2VyIGtleXMgYnV0IHdpbGwgbmV2ZXIgY29udGFpblxuICAgKiAgICAgICAgICBtb3JlLjwvcD5cbiAgICovXG4gIE1heEtleXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiA8cD5MaW1pdHMgdGhlIHJlc3BvbnNlIHRvIGtleXMgdGhhdCBiZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICAgICA8Yj5EaXJlY3RvcnkgYnVja2V0czwvYj4gLSBGb3IgZGlyZWN0b3J5IGJ1Y2tldHMsIG9ubHkgcHJlZml4ZXMgdGhhdCBlbmQgaW4gYSBkZWxpbWl0ZXIgKDxjb2RlPi88L2NvZGU+KSBhcmUgc3VwcG9ydGVkLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgUHJlZml4Pzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+XG4gICAqICAgICAgICAgICAgIDxjb2RlPkNvbnRpbnVhdGlvblRva2VuPC9jb2RlPiBpbmRpY2F0ZXMgdG8gQW1hem9uIFMzIHRoYXQgdGhlIGxpc3QgaXMgYmVpbmcgY29udGludWVkIG9uXG4gICAqICAgICAgICAgIHRoaXMgYnVja2V0IHdpdGggYSB0b2tlbi4gPGNvZGU+Q29udGludWF0aW9uVG9rZW48L2NvZGU+IGlzIG9iZnVzY2F0ZWQgYW5kIGlzIG5vdCBhIHJlYWxcbiAgICogICAgICAgICAga2V5LiBZb3UgY2FuIHVzZSB0aGlzIDxjb2RlPkNvbnRpbnVhdGlvblRva2VuPC9jb2RlPiBmb3IgcGFnaW5hdGlvbiBvZiB0aGUgbGlzdCByZXN1bHRzLiAgPC9wPlxuICAgKi9cbiAgQ29udGludWF0aW9uVG9rZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgb3duZXIgZmllbGQgaXMgbm90IHByZXNlbnQgaW4gPGNvZGU+TGlzdE9iamVjdHNWMjwvY29kZT4gYnkgZGVmYXVsdC4gSWYgeW91IHdhbnQgdG9cbiAgICogICAgICAgICAgcmV0dXJuIHRoZSBvd25lciBmaWVsZCB3aXRoIGVhY2gga2V5IGluIHRoZSByZXN1bHQsIHRoZW4gc2V0IHRoZSA8Y29kZT5GZXRjaE93bmVyPC9jb2RlPlxuICAgKiAgICAgICAgICBmaWVsZCB0byA8Y29kZT50cnVlPC9jb2RlPi48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHM8L2I+IC0gRm9yIGRpcmVjdG9yeSBidWNrZXRzLCB0aGUgYnVja2V0IG93bmVyIGlzIHJldHVybmVkIGFzIHRoZSBvYmplY3Qgb3duZXIgZm9yIGFsbCBvYmplY3RzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgRmV0Y2hPd25lcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiA8cD5TdGFydEFmdGVyIGlzIHdoZXJlIHlvdSB3YW50IEFtYXpvbiBTMyB0byBzdGFydCBsaXN0aW5nIGZyb20uIEFtYXpvbiBTMyBzdGFydHMgbGlzdGluZyBhZnRlciB0aGlzXG4gICAqICAgICAgICAgIHNwZWNpZmllZCBrZXkuIFN0YXJ0QWZ0ZXIgY2FuIGJlIGFueSBrZXkgaW4gdGhlIGJ1Y2tldC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBTdGFydEFmdGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+Q29uZmlybXMgdGhhdCB0aGUgcmVxdWVzdGVyIGtub3dzIHRoYXQgc2hlIG9yIGhlIHdpbGwgYmUgY2hhcmdlZCBmb3IgdGhlIGxpc3Qgb2JqZWN0c1xuICAgKiAgICAgICAgICByZXF1ZXN0IGluIFYyIHN0eWxlLiBCdWNrZXQgb3duZXJzIG5lZWQgbm90IHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIgaW4gdGhlaXJcbiAgICogICAgICAgICAgcmVxdWVzdHMuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgUmVxdWVzdFBheWVyPzogUmVxdWVzdFBheWVyO1xuICAvKipcbiAgICogPHA+VGhlIGFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci4gSWYgdGhlIGFjY291bnQgSUQgdGhhdCB5b3UgcHJvdmlkZSBkb2VzIG5vdCBtYXRjaCB0aGUgYWN0dWFsIG93bmVyIG9mIHRoZSBidWNrZXQsIHRoZSByZXF1ZXN0IGZhaWxzIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgPGNvZGU+NDAzIEZvcmJpZGRlbjwvY29kZT4gKGFjY2VzcyBkZW5pZWQpLjwvcD5cbiAgICovXG4gIEV4cGVjdGVkQnVja2V0T3duZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5TcGVjaWZpZXMgdGhlIG9wdGlvbmFsIGZpZWxkcyB0aGF0IHlvdSB3YW50IHJldHVybmVkIGluIHRoZSByZXNwb25zZS4gRmllbGRzIHRoYXQgeW91IGRvXG4gICAqICAgICAgICAgIG5vdCBzcGVjaWZ5IGFyZSBub3QgcmV0dXJuZWQuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgT3B0aW9uYWxPYmplY3RBdHRyaWJ1dGVzPzogT3B0aW9uYWxPYmplY3RBdHRyaWJ1dGVzW107XG59XG5cbmV4cG9ydCBjb25zdCBSZXF1ZXN0Q2hhcmdlZCA9IHtcbiAgcmVxdWVzdGVyOiAncmVxdWVzdGVyJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RDaGFyZ2VkID0gKHR5cGVvZiBSZXF1ZXN0Q2hhcmdlZClba2V5b2YgdHlwZW9mIFJlcXVlc3RDaGFyZ2VkXTtcblxuZXhwb3J0IGNvbnN0IENoZWNrc3VtQWxnb3JpdGhtSW4gPSB7XG4gIENSQzMyOiAnQ1JDMzInLFxuICBDUkMzMkM6ICdDUkMzMkMnLFxuICBTSEExOiAnU0hBMScsXG4gIFNIQTI1NjogJ1NIQTI1NicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBDaGVja3N1bUFsZ29yaXRobUluID0gKHR5cGVvZiBDaGVja3N1bUFsZ29yaXRobUluKVtrZXlvZiB0eXBlb2YgQ2hlY2tzdW1BbGdvcml0aG1Jbl07XG5cbmV4cG9ydCB0eXBlIENoZWNrc3VtQWxnb3JpdGhtT3V0ID0gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgT2JqZWN0U3RvcmFnZUNsYXNzID0ge1xuICBERUVQX0FSQ0hJVkU6ICdERUVQX0FSQ0hJVkUnLFxuICBFWFBSRVNTX09ORVpPTkU6ICdFWFBSRVNTX09ORVpPTkUnLFxuICBHTEFDSUVSOiAnR0xBQ0lFUicsXG4gIEdMQUNJRVJfSVI6ICdHTEFDSUVSX0lSJyxcbiAgSU5URUxMSUdFTlRfVElFUklORzogJ0lOVEVMTElHRU5UX1RJRVJJTkcnLFxuICBPTkVaT05FX0lBOiAnT05FWk9ORV9JQScsXG4gIE9VVFBPU1RTOiAnT1VUUE9TVFMnLFxuICBSRURVQ0VEX1JFRFVOREFOQ1k6ICdSRURVQ0VEX1JFRFVOREFOQ1knLFxuICBTTk9XOiAnU05PVycsXG4gIFNUQU5EQVJEOiAnU1RBTkRBUkQnLFxuICBTVEFOREFSRF9JQTogJ1NUQU5EQVJEX0lBJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIE9iamVjdFN0b3JhZ2VDbGFzcyA9ICh0eXBlb2YgT2JqZWN0U3RvcmFnZUNsYXNzKVtrZXlvZiB0eXBlb2YgT2JqZWN0U3RvcmFnZUNsYXNzXTtcblxuZXhwb3J0IGludGVyZmFjZSBPd25lciB7XG4gIC8qKlxuICAgKiA8cD5Db250YWluZXIgZm9yIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIG93bmVyLiBUaGlzIHZhbHVlIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZVxuICAgKiAgICAgICAgICBmb2xsb3dpbmcgQW1hem9uIFdlYiBTZXJ2aWNlcyBSZWdpb25zOjwvcD5cbiAgICogICAgICAgICAgPHVsPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPlVTIEVhc3QgKE4uIFZpcmdpbmlhKTwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICA8cD5VUyBXZXN0IChOLiBDYWxpZm9ybmlhKTwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICA8cD5VUyBXZXN0IChPcmVnb24pPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPkFzaWEgUGFjaWZpYyAoU2luZ2Fwb3JlKTwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICA8cD5Bc2lhIFBhY2lmaWMgKFN5ZG5leSk8L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+QXNpYSBQYWNpZmljIChUb2t5byk8L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+RXVyb3BlIChJcmVsYW5kKTwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICA8cD5Tb3V0aCBBbWVyaWNhIChTw6NvIFBhdWxvKTwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgPC91bD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIERpc3BsYXlOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiA8cD5Db250YWluZXIgZm9yIHRoZSBJRCBvZiB0aGUgb3duZXIuPC9wPlxuICAgKi9cbiAgSUQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdG9yZVN0YXR1cyB7XG4gIC8qKlxuICAgKiA8cD5TcGVjaWZpZXMgd2hldGhlciB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBiZWluZyByZXN0b3JlZC4gSWYgdGhlIG9iamVjdCByZXN0b3JhdGlvbiBpc1xuICAgKiAgICAgICAgICBpbiBwcm9ncmVzcywgdGhlIGhlYWRlciByZXR1cm5zIHRoZSB2YWx1ZSA8Y29kZT5UUlVFPC9jb2RlPi4gRm9yIGV4YW1wbGU6PC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGNvZGU+eC1hbXotb3B0aW9uYWwtb2JqZWN0LWF0dHJpYnV0ZXM6IElzUmVzdG9yZUluUHJvZ3Jlc3M9XCJ0cnVlXCI8L2NvZGU+XG4gICAqICAgICAgICAgIDwvcD5cbiAgICogICAgICAgICAgPHA+SWYgdGhlIG9iamVjdCByZXN0b3JhdGlvbiBoYXMgY29tcGxldGVkLCB0aGUgaGVhZGVyIHJldHVybnMgdGhlIHZhbHVlXG4gICAqICAgICAgICAgIDxjb2RlPkZBTFNFPC9jb2RlPi4gRm9yIGV4YW1wbGU6PC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGNvZGU+eC1hbXotb3B0aW9uYWwtb2JqZWN0LWF0dHJpYnV0ZXM6IElzUmVzdG9yZUluUHJvZ3Jlc3M9XCJmYWxzZVwiLFxuICAgKiAgICAgICAgICAgICBSZXN0b3JlRXhwaXJ5RGF0ZT1cIjIwMTItMTItMjFUMDA6MDA6MDAuMDAwWlwiPC9jb2RlPlxuICAgKiAgICAgICAgICA8L3A+XG4gICAqICAgICAgICAgIDxwPklmIHRoZSBvYmplY3QgaGFzbid0IGJlZW4gcmVzdG9yZWQsIHRoZXJlIGlzIG5vIGhlYWRlciByZXNwb25zZS48L3A+XG4gICAqL1xuICBJc1Jlc3RvcmVJblByb2dyZXNzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogPHA+SW5kaWNhdGVzIHdoZW4gdGhlIHJlc3RvcmVkIGNvcHkgd2lsbCBleHBpcmUuIFRoaXMgdmFsdWUgaXMgcG9wdWxhdGVkIG9ubHkgaWYgdGhlIG9iamVjdFxuICAgKiAgICAgICAgICBoYXMgYWxyZWFkeSBiZWVuIHJlc3RvcmVkLiBGb3IgZXhhbXBsZTo8L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT54LWFtei1vcHRpb25hbC1vYmplY3QtYXR0cmlidXRlczogSXNSZXN0b3JlSW5Qcm9ncmVzcz1cImZhbHNlXCIsXG4gICAqICAgICAgICAgICAgIFJlc3RvcmVFeHBpcnlEYXRlPVwiMjAxMi0xMi0yMVQwMDowMDowMC4wMDBaXCI8L2NvZGU+XG4gICAqICAgICAgICAgIDwvcD5cbiAgICovXG4gIFJlc3RvcmVFeHBpcnlEYXRlPzogRGF0ZTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gb25lIG9mIDIgdHlwZXMsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGFyZSBwYXNzaW5nIHZhbHVlcyBpbiBvciBvdXRcbiAqXG4gKiBVc2UgYXMgZm9sbG93czpcbiAqXG4gKiBgYGB0c1xuICogaW50ZXJmYWNlIENvbnRhaW5pbmdUeXBlPERpcj4ge1xuICogICAgZmllbGQ6IEluT3V0PERpciwgRmllbGRUeXBlSW4sIEZpZWxkVHlwZU91dD47XG4gKiB9XG4gKiBgYGBcbiAqL1xudHlwZSBJbk91dDxEaXIsIEksIE8+ID0gRGlyIGV4dGVuZHMgJ2luJyA/IEkgOiBEaXIgZXh0ZW5kcyAnb3V0JyA/IE8gOiBuZXZlcjtcblxuZXhwb3J0IGludGVyZmFjZSBfT2JqZWN0PERpcj4ge1xuICAvKipcbiAgICogPHA+VGhlIG5hbWUgdGhhdCB5b3UgYXNzaWduIHRvIGFuIG9iamVjdC4gWW91IHVzZSB0aGUgb2JqZWN0IGtleSB0byByZXRyaWV2ZSB0aGVcbiAgICogICAgICAgICAgb2JqZWN0LjwvcD5cbiAgICovXG4gIEtleT86IHN0cmluZztcblxuICAvKipcbiAgICogPHA+Q3JlYXRpb24gZGF0ZSBvZiB0aGUgb2JqZWN0LjwvcD5cbiAgICovXG4gIExhc3RNb2RpZmllZD86IERhdGU7XG5cbiAgLyoqXG4gICAqIDxwPlRoZSBlbnRpdHkgdGFnIGlzIGEgaGFzaCBvZiB0aGUgb2JqZWN0LiBUaGUgRVRhZyByZWZsZWN0cyBjaGFuZ2VzIG9ubHkgdG8gdGhlIGNvbnRlbnRzXG4gICAqICAgICAgICAgIG9mIGFuIG9iamVjdCwgbm90IGl0cyBtZXRhZGF0YS4gVGhlIEVUYWcgbWF5IG9yIG1heSBub3QgYmUgYW4gTUQ1IGRpZ2VzdCBvZiB0aGUgb2JqZWN0XG4gICAqICAgICAgICAgIGRhdGEuIFdoZXRoZXIgb3Igbm90IGl0IGlzIGRlcGVuZHMgb24gaG93IHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYW5kIGhvdyBpdCBpcyBlbmNyeXB0ZWQgYXNcbiAgICogICAgICAgICAgZGVzY3JpYmVkIGJlbG93OjwvcD5cbiAgICogICAgICAgICAgPHVsPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPk9iamVjdHMgY3JlYXRlZCBieSB0aGUgUFVUIE9iamVjdCwgUE9TVCBPYmplY3QsIG9yIENvcHkgb3BlcmF0aW9uLCBvciB0aHJvdWdoIHRoZVxuICAgKiAgICAgICAgICAgICAgICBBbWF6b24gV2ViIFNlcnZpY2VzIE1hbmFnZW1lbnQgQ29uc29sZSwgYW5kIGFyZSBlbmNyeXB0ZWQgYnkgU1NFLVMzIG9yIHBsYWludGV4dCwgaGF2ZSBFVGFncyB0aGF0XG4gICAqICAgICAgICAgICAgICAgIGFyZSBhbiBNRDUgZGlnZXN0IG9mIHRoZWlyIG9iamVjdCBkYXRhLjwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICA8cD5PYmplY3RzIGNyZWF0ZWQgYnkgdGhlIFBVVCBPYmplY3QsIFBPU1QgT2JqZWN0LCBvciBDb3B5IG9wZXJhdGlvbiwgb3IgdGhyb3VnaCB0aGVcbiAgICogICAgICAgICAgICAgICAgQW1hem9uIFdlYiBTZXJ2aWNlcyBNYW5hZ2VtZW50IENvbnNvbGUsIGFuZCBhcmUgZW5jcnlwdGVkIGJ5IFNTRS1DIG9yIFNTRS1LTVMsIGhhdmUgRVRhZ3MgdGhhdCBhcmVcbiAgICogICAgICAgICAgICAgICAgbm90IGFuIE1ENSBkaWdlc3Qgb2YgdGhlaXIgb2JqZWN0IGRhdGEuPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPklmIGFuIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGVpdGhlciB0aGUgTXVsdGlwYXJ0IFVwbG9hZCBvciBQYXJ0IENvcHkgb3BlcmF0aW9uLCB0aGVcbiAgICogICAgICAgICAgICAgICAgRVRhZyBpcyBub3QgYW4gTUQ1IGRpZ2VzdCwgcmVnYXJkbGVzcyBvZiB0aGUgbWV0aG9kIG9mIGVuY3J5cHRpb24uIElmIGFuIG9iamVjdCBpc1xuICAgKiAgICAgICAgICAgICAgICBsYXJnZXIgdGhhbiAxNiBNQiwgdGhlIEFtYXpvbiBXZWIgU2VydmljZXMgTWFuYWdlbWVudCBDb25zb2xlIHdpbGwgdXBsb2FkIG9yIGNvcHkgdGhhdCBvYmplY3QgYXMgYVxuICAgKiAgICAgICAgICAgICAgICBNdWx0aXBhcnQgVXBsb2FkLCBhbmQgdGhlcmVmb3JlIHRoZSBFVGFnIHdpbGwgbm90IGJlIGFuIE1ENSBkaWdlc3QuPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgICAgIDxiPkRpcmVjdG9yeSBidWNrZXRzPC9iPiAtIE1ENSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgRVRhZz86IHN0cmluZztcblxuICAvKipcbiAgICogPHA+VGhlIGFsZ29yaXRobSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhIGNoZWNrc3VtIG9mIHRoZSBvYmplY3QuPC9wPlxuICAgKi9cbiAgQ2hlY2tzdW1BbGdvcml0aG0/OiBJbk91dDxEaXIsIENoZWNrc3VtQWxnb3JpdGhtSW4sIENoZWNrc3VtQWxnb3JpdGhtT3V0PltdO1xuXG4gIC8qKlxuICAgKiA8cD5TaXplIGluIGJ5dGVzIG9mIHRoZSBvYmplY3Q8L3A+XG4gICAqL1xuICBTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiA8cD5UaGUgY2xhc3Mgb2Ygc3RvcmFnZSB1c2VkIHRvIHN0b3JlIHRoZSBvYmplY3QuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgICAgIDxiPkRpcmVjdG9yeSBidWNrZXRzPC9iPiAtIE9ubHkgdGhlIFMzIEV4cHJlc3MgT25lIFpvbmUgc3RvcmFnZSBjbGFzcyBpcyBzdXBwb3J0ZWQgYnkgZGlyZWN0b3J5IGJ1Y2tldHMgdG8gc3RvcmUgb2JqZWN0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFN0b3JhZ2VDbGFzcz86IE9iamVjdFN0b3JhZ2VDbGFzcztcblxuICAvKipcbiAgICogPHA+VGhlIG93bmVyIG9mIHRoZSBvYmplY3Q8L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHM8L2I+IC0gVGhlIGJ1Y2tldCBvd25lciBpcyByZXR1cm5lZCBhcyB0aGUgb2JqZWN0IG93bmVyLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgT3duZXI/OiBPd25lcjtcblxuICAvKipcbiAgICogPHA+U3BlY2lmaWVzIHRoZSByZXN0b3JhdGlvbiBzdGF0dXMgb2YgYW4gb2JqZWN0LiBPYmplY3RzIGluIGNlcnRhaW4gc3RvcmFnZSBjbGFzc2VzIG11c3RcbiAgICogICAgICAgICAgYmUgcmVzdG9yZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHJldHJpZXZlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2Ugc3RvcmFnZSBjbGFzc2VzXG4gICAqICAgICAgICAgIGFuZCBob3cgdG8gd29yayB3aXRoIGFyY2hpdmVkIG9iamVjdHMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvYXJjaGl2ZWQtb2JqZWN0cy5odG1sXCI+IFdvcmtpbmcgd2l0aCBhcmNoaXZlZFxuICAgKiAgICAgICAgICAgICBvYmplY3RzPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy4gT25seSB0aGUgUzMgRXhwcmVzcyBPbmUgWm9uZSBzdG9yYWdlIGNsYXNzIGlzIHN1cHBvcnRlZCBieSBkaXJlY3RvcnkgYnVja2V0cyB0byBzdG9yZSBvYmplY3RzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgUmVzdG9yZVN0YXR1cz86IFJlc3RvcmVTdGF0dXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uUHJlZml4IHtcbiAgLyoqXG4gICAqIDxwPkNvbnRhaW5lciBmb3IgdGhlIHNwZWNpZmllZCBjb21tb24gcHJlZml4LjwvcD5cbiAgICovXG4gIFByZWZpeD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0T2JqZWN0c1YyT3V0cHV0IHtcbiAgLyoqXG4gICAqIDxwPlNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYWxsIG9mIHRoZSByZXN1bHRzIHdlcmUgcmV0dXJuZWQuIFNldCB0byA8Y29kZT50cnVlPC9jb2RlPlxuICAgKiAgICAgICAgICBpZiBtb3JlIGtleXMgYXJlIGF2YWlsYWJsZSB0byByZXR1cm4uIElmIHRoZSBudW1iZXIgb2YgcmVzdWx0cyBleGNlZWRzIHRoYXQgc3BlY2lmaWVkIGJ5XG4gICAqICAgICAgICAgICAgIDxjb2RlPk1heEtleXM8L2NvZGU+LCBhbGwgb2YgdGhlIHJlc3VsdHMgbWlnaHQgbm90IGJlIHJldHVybmVkLjwvcD5cbiAgICovXG4gIElzVHJ1bmNhdGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIDxwPk1ldGFkYXRhIGFib3V0IGVhY2ggb2JqZWN0IHJldHVybmVkLjwvcD5cbiAgICovXG4gIENvbnRlbnRzPzogX09iamVjdDwnb3V0Jz5bXTtcbiAgLyoqXG4gICAqIDxwPlRoZSBidWNrZXQgbmFtZS48L3A+XG4gICAqL1xuICBOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+S2V5cyB0aGF0IGJlZ2luIHdpdGggdGhlIGluZGljYXRlZCBwcmVmaXguPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgICAgIDxiPkRpcmVjdG9yeSBidWNrZXRzPC9iPiAtIEZvciBkaXJlY3RvcnkgYnVja2V0cywgb25seSBwcmVmaXhlcyB0aGF0IGVuZCBpbiBhIGRlbGltaXRlciAoPGNvZGU+LzwvY29kZT4pIGFyZSBzdXBwb3J0ZWQuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5DYXVzZXMga2V5cyB0aGF0IGNvbnRhaW4gdGhlIHNhbWUgc3RyaW5nIGJldHdlZW4gdGhlIDxjb2RlPnByZWZpeDwvY29kZT4gYW5kIHRoZSBmaXJzdFxuICAgKiAgICAgICAgICBvY2N1cnJlbmNlIG9mIHRoZSBkZWxpbWl0ZXIgdG8gYmUgcm9sbGVkIHVwIGludG8gYSBzaW5nbGUgcmVzdWx0IGVsZW1lbnQgaW4gdGhlXG4gICAqICAgICAgICAgICAgIDxjb2RlPkNvbW1vblByZWZpeGVzPC9jb2RlPiBjb2xsZWN0aW9uLiBUaGVzZSByb2xsZWQtdXAga2V5cyBhcmUgbm90IHJldHVybmVkIGVsc2V3aGVyZVxuICAgKiAgICAgICAgICBpbiB0aGUgcmVzcG9uc2UuIEVhY2ggcm9sbGVkLXVwIHJlc3VsdCBjb3VudHMgYXMgb25seSBvbmUgcmV0dXJuIGFnYWluc3QgdGhlXG4gICAqICAgICAgICAgICAgIDxjb2RlPk1heEtleXM8L2NvZGU+IHZhbHVlLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICAgICA8Yj5EaXJlY3RvcnkgYnVja2V0czwvYj4gLSBGb3IgZGlyZWN0b3J5IGJ1Y2tldHMsIDxjb2RlPi88L2NvZGU+IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBkZWxpbWl0ZXIuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBEZWxpbWl0ZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5TZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBrZXlzIHJldHVybmVkIGluIHRoZSByZXNwb25zZS4gQnkgZGVmYXVsdCwgdGhlIGFjdGlvbiByZXR1cm5zXG4gICAqICAgICAgICAgIHVwIHRvIDEsMDAwIGtleSBuYW1lcy4gVGhlIHJlc3BvbnNlIG1pZ2h0IGNvbnRhaW4gZmV3ZXIga2V5cyBidXQgd2lsbCBuZXZlciBjb250YWluXG4gICAqICAgICAgICAgIG1vcmUuPC9wPlxuICAgKi9cbiAgTWF4S2V5cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIDxwPkFsbCBvZiB0aGUga2V5cyAodXAgdG8gMSwwMDApIHRoYXQgc2hhcmUgdGhlIHNhbWUgcHJlZml4IGFyZSBncm91cGVkIHRvZ2V0aGVyLiBXaGVuIGNvdW50aW5nIHRoZSB0b3RhbCBudW1iZXJzIG9mIHJldHVybnMgYnkgdGhpcyBBUEkgb3BlcmF0aW9uLFxuICAgKiAgICAgICAgICB0aGlzIGdyb3VwIG9mIGtleXMgaXMgY29uc2lkZXJlZCBhcyBvbmUgaXRlbS48L3A+XG4gICAqICAgICAgICAgIDxwPkEgcmVzcG9uc2UgY2FuIGNvbnRhaW4gPGNvZGU+Q29tbW9uUHJlZml4ZXM8L2NvZGU+IG9ubHkgaWYgeW91IHNwZWNpZnkgYVxuICAgKiAgICAgICAgICBkZWxpbWl0ZXIuPC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGNvZGU+Q29tbW9uUHJlZml4ZXM8L2NvZGU+IGNvbnRhaW5zIGFsbCAoaWYgdGhlcmUgYXJlIGFueSkga2V5cyBiZXR3ZWVuXG4gICAqICAgICAgICAgICAgIDxjb2RlPlByZWZpeDwvY29kZT4gYW5kIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhlIHN0cmluZyBzcGVjaWZpZWQgYnkgYVxuICAgKiAgICAgICAgICBkZWxpbWl0ZXIuPC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGNvZGU+Q29tbW9uUHJlZml4ZXM8L2NvZGU+IGxpc3RzIGtleXMgdGhhdCBhY3QgbGlrZSBzdWJkaXJlY3RvcmllcyBpbiB0aGUgZGlyZWN0b3J5XG4gICAqICAgICAgICAgIHNwZWNpZmllZCBieSA8Y29kZT5QcmVmaXg8L2NvZGU+LjwvcD5cbiAgICogICAgICAgICAgPHA+Rm9yIGV4YW1wbGUsIGlmIHRoZSBwcmVmaXggaXMgPGNvZGU+bm90ZXMvPC9jb2RlPiBhbmQgdGhlIGRlbGltaXRlciBpcyBhIHNsYXNoXG4gICAqICAgICAgICAgICAgICg8Y29kZT4vPC9jb2RlPikgYXMgaW4gPGNvZGU+bm90ZXMvc3VtbWVyL2p1bHk8L2NvZGU+LCB0aGUgY29tbW9uIHByZWZpeCBpc1xuICAgKiAgICAgICAgICAgICA8Y29kZT5ub3Rlcy9zdW1tZXIvPC9jb2RlPi4gQWxsIG9mIHRoZSBrZXlzIHRoYXQgcm9sbCB1cCBpbnRvIGEgY29tbW9uIHByZWZpeCBjb3VudCBhcyBhXG4gICAqICAgICAgICAgIHNpbmdsZSByZXR1cm4gd2hlbiBjYWxjdWxhdGluZyB0aGUgbnVtYmVyIG9mIHJldHVybnMuIDwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDx1bD5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHM8L2I+IC0gRm9yIGRpcmVjdG9yeSBidWNrZXRzLCBvbmx5IHByZWZpeGVzIHRoYXQgZW5kIGluIGEgZGVsaW1pdGVyICg8Y29kZT4vPC9jb2RlPikgYXJlIHN1cHBvcnRlZC48L3A+XG4gICAqICAgICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgICAgICAgICAgIDxiPkRpcmVjdG9yeSBidWNrZXRzIDwvYj4gLSBXaGVuIHlvdSBxdWVyeSA8Y29kZT5MaXN0T2JqZWN0c1YyPC9jb2RlPiB3aXRoIGEgZGVsaW1pdGVyIGR1cmluZyBpbi1wcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2FkcywgdGhlXG4gICAqICAgICAgICAgICAgICAgIDxjb2RlPkNvbW1vblByZWZpeGVzPC9jb2RlPiByZXNwb25zZSBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIHByZWZpeGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW4tcHJvZ3Jlc3MgbXVsdGlwYXJ0IHVwbG9hZHMuXG4gICAqICAgICAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG11bHRpcGFydCB1cGxvYWRzLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L21wdW92ZXJ2aWV3Lmh0bWxcIj5NdWx0aXBhcnQgVXBsb2FkIE92ZXJ2aWV3PC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPC91bD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgQ29tbW9uUHJlZml4ZXM/OiBDb21tb25QcmVmaXhbXTtcbiAgLyoqXG4gICAqIDxwPkVuY29kaW5nIHR5cGUgdXNlZCBieSBBbWF6b24gUzMgdG8gZW5jb2RlIG9iamVjdCBrZXkgbmFtZXMgaW4gdGhlIFhNTCByZXNwb25zZS48L3A+XG4gICAqICAgICAgICAgIDxwPklmIHlvdSBzcGVjaWZ5IHRoZSA8Y29kZT5lbmNvZGluZy10eXBlPC9jb2RlPiByZXF1ZXN0IHBhcmFtZXRlciwgQW1hem9uIFMzIGluY2x1ZGVzIHRoaXNcbiAgICogICAgICAgICAgZWxlbWVudCBpbiB0aGUgcmVzcG9uc2UsIGFuZCByZXR1cm5zIGVuY29kZWQga2V5IG5hbWUgdmFsdWVzIGluIHRoZSBmb2xsb3dpbmcgcmVzcG9uc2VcbiAgICogICAgICAgICAgZWxlbWVudHM6PC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGNvZGU+RGVsaW1pdGVyLCBQcmVmaXgsIEtleSw8L2NvZGU+IGFuZCA8Y29kZT5TdGFydEFmdGVyPC9jb2RlPi48L3A+XG4gICAqL1xuICBFbmNvZGluZ1R5cGU/OiBFbmNvZGluZ1R5cGU7XG4gIC8qKlxuICAgKiA8cD5cbiAgICogICAgICAgICAgICAgPGNvZGU+S2V5Q291bnQ8L2NvZGU+IGlzIHRoZSBudW1iZXIgb2Yga2V5cyByZXR1cm5lZCB3aXRoIHRoaXMgcmVxdWVzdC5cbiAgICogICAgICAgICAgICAgPGNvZGU+S2V5Q291bnQ8L2NvZGU+IHdpbGwgYWx3YXlzIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgPGNvZGU+TWF4S2V5czwvY29kZT5cbiAgICogICAgICAgICAgZmllbGQuIEZvciBleGFtcGxlLCBpZiB5b3UgYXNrIGZvciA1MCBrZXlzLCB5b3VyIHJlc3VsdCB3aWxsIGluY2x1ZGUgNTAga2V5cyBvclxuICAgKiAgICAgICAgICBmZXdlci48L3A+XG4gICAqL1xuICBLZXlDb3VudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIDxwPiBJZiA8Y29kZT5Db250aW51YXRpb25Ub2tlbjwvY29kZT4gd2FzIHNlbnQgd2l0aCB0aGUgcmVxdWVzdCwgaXQgaXMgaW5jbHVkZWQgaW4gdGhlXG4gICAqICAgICAgICAgIHJlc3BvbnNlLiBZb3UgY2FuIHVzZSB0aGUgcmV0dXJuZWQgPGNvZGU+Q29udGludWF0aW9uVG9rZW48L2NvZGU+IGZvciBwYWdpbmF0aW9uIG9mIHRoZSBsaXN0IHJlc3BvbnNlLiBZb3UgY2FuIHVzZSB0aGlzIDxjb2RlPkNvbnRpbnVhdGlvblRva2VuPC9jb2RlPiBmb3IgcGFnaW5hdGlvbiBvZiB0aGUgbGlzdCByZXN1bHRzLiA8L3A+XG4gICAqL1xuICBDb250aW51YXRpb25Ub2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT5OZXh0Q29udGludWF0aW9uVG9rZW48L2NvZGU+IGlzIHNlbnQgd2hlbiA8Y29kZT5pc1RydW5jYXRlZDwvY29kZT4gaXMgdHJ1ZSwgd2hpY2hcbiAgICogICAgICAgICAgbWVhbnMgdGhlcmUgYXJlIG1vcmUga2V5cyBpbiB0aGUgYnVja2V0IHRoYXQgY2FuIGJlIGxpc3RlZC4gVGhlIG5leHQgbGlzdCByZXF1ZXN0cyB0byBBbWF6b24gUzNcbiAgICogICAgICAgICAgY2FuIGJlIGNvbnRpbnVlZCB3aXRoIHRoaXMgPGNvZGU+TmV4dENvbnRpbnVhdGlvblRva2VuPC9jb2RlPi5cbiAgICogICAgICAgICAgICAgPGNvZGU+TmV4dENvbnRpbnVhdGlvblRva2VuPC9jb2RlPiBpcyBvYmZ1c2NhdGVkIGFuZCBpcyBub3QgYSByZWFsIGtleTwvcD5cbiAgICovXG4gIE5leHRDb250aW51YXRpb25Ub2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPklmIFN0YXJ0QWZ0ZXIgd2FzIHNlbnQgd2l0aCB0aGUgcmVxdWVzdCwgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFN0YXJ0QWZ0ZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5JZiBwcmVzZW50LCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdGVyIHdhcyBzdWNjZXNzZnVsbHkgY2hhcmdlZCBmb3IgdGhlXG4gICAqICAgICAgICAgIHJlcXVlc3QuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgUmVxdWVzdENoYXJnZWQ/OiBSZXF1ZXN0Q2hhcmdlZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0T2JqZWN0c1YyQ29tbWFuZE91dHB1dCBleHRlbmRzIExpc3RPYmplY3RzVjJPdXRwdXQsIE1ldGFkYXRhQmVhcmVyIHt9XG5cbmV4cG9ydCBjb25zdCBPYmplY3RDYW5uZWRBQ0wgPSB7XG4gIGF1dGhlbnRpY2F0ZWRfcmVhZDogJ2F1dGhlbnRpY2F0ZWQtcmVhZCcsXG4gIGF3c19leGVjX3JlYWQ6ICdhd3MtZXhlYy1yZWFkJyxcbiAgYnVja2V0X293bmVyX2Z1bGxfY29udHJvbDogJ2J1Y2tldC1vd25lci1mdWxsLWNvbnRyb2wnLFxuICBidWNrZXRfb3duZXJfcmVhZDogJ2J1Y2tldC1vd25lci1yZWFkJyxcbiAgcHJpdmF0ZTogJ3ByaXZhdGUnLFxuICBwdWJsaWNfcmVhZDogJ3B1YmxpYy1yZWFkJyxcbiAgcHVibGljX3JlYWRfd3JpdGU6ICdwdWJsaWMtcmVhZC13cml0ZScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBPYmplY3RDYW5uZWRBQ0wgPSAodHlwZW9mIE9iamVjdENhbm5lZEFDTClba2V5b2YgdHlwZW9mIE9iamVjdENhbm5lZEFDTF07XG5cbmV4cG9ydCBjb25zdCBPYmplY3RMb2NrTW9kZSA9IHtcbiAgQ09NUExJQU5DRTogJ0NPTVBMSUFOQ0UnLFxuICBHT1ZFUk5BTkNFOiAnR09WRVJOQU5DRScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBPYmplY3RMb2NrTW9kZSA9ICh0eXBlb2YgT2JqZWN0TG9ja01vZGUpW2tleW9mIHR5cGVvZiBPYmplY3RMb2NrTW9kZV07XG5cbmV4cG9ydCBjb25zdCBPYmplY3RMb2NrTGVnYWxIb2xkU3RhdHVzID0ge1xuICBPRkY6ICdPRkYnLFxuICBPTjogJ09OJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIE9iamVjdExvY2tMZWdhbEhvbGRTdGF0dXMgPVxuICAodHlwZW9mIE9iamVjdExvY2tMZWdhbEhvbGRTdGF0dXMpW2tleW9mIHR5cGVvZiBPYmplY3RMb2NrTGVnYWxIb2xkU3RhdHVzXTtcblxuZXhwb3J0IGNvbnN0IFN0b3JhZ2VDbGFzcyA9IHtcbiAgREVFUF9BUkNISVZFOiAnREVFUF9BUkNISVZFJyxcbiAgRVhQUkVTU19PTkVaT05FOiAnRVhQUkVTU19PTkVaT05FJyxcbiAgR0xBQ0lFUjogJ0dMQUNJRVInLFxuICBHTEFDSUVSX0lSOiAnR0xBQ0lFUl9JUicsXG4gIElOVEVMTElHRU5UX1RJRVJJTkc6ICdJTlRFTExJR0VOVF9USUVSSU5HJyxcbiAgT05FWk9ORV9JQTogJ09ORVpPTkVfSUEnLFxuICBPVVRQT1NUUzogJ09VVFBPU1RTJyxcbiAgUkVEVUNFRF9SRURVTkRBTkNZOiAnUkVEVUNFRF9SRURVTkRBTkNZJyxcbiAgU05PVzogJ1NOT1cnLFxuICBTVEFOREFSRDogJ1NUQU5EQVJEJyxcbiAgU1RBTkRBUkRfSUE6ICdTVEFOREFSRF9JQScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTdG9yYWdlQ2xhc3MgPSAodHlwZW9mIFN0b3JhZ2VDbGFzcylba2V5b2YgdHlwZW9mIFN0b3JhZ2VDbGFzc107XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHkge1xuICAvKipcbiAgICogQSBgRGF0ZWAgd2hlbiB0aGUgaWRlbnRpdHkgb3IgY3JlZGVudGlhbCB3aWxsIG5vIGxvbmdlciBiZSBhY2NlcHRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGlyYXRpb24/OiBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5UHJvdmlkZXI8SWRlbnRpdHlUIGV4dGVuZHMgSWRlbnRpdHk+IHtcbiAgKGlkZW50aXR5UHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPElkZW50aXR5VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQ3JlZGVudGlhbElkZW50aXR5IGV4dGVuZHMgSWRlbnRpdHkge1xuICAvKipcbiAgICogQVdTIGFjY2VzcyBrZXkgSURcbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc0tleUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBV1Mgc2VjcmV0IGFjY2VzcyBrZXlcbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldEFjY2Vzc0tleTogc3RyaW5nO1xuICAvKipcbiAgICogQSBzZWN1cml0eSBvciBzZXNzaW9uIHRva2VuIHRvIHVzZSB3aXRoIHRoZXNlIGNyZWRlbnRpYWxzLiBVc3VhbGx5XG4gICAqIHByZXNlbnQgZm9yIHRlbXBvcmFyeSBjcmVkZW50aWFscy5cbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25Ub2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFXUyBjcmVkZW50aWFsIHNjb3BlIGZvciB0aGlzIHNldCBvZiBjcmVkZW50aWFscy5cbiAgICovXG4gIHJlYWRvbmx5IGNyZWRlbnRpYWxTY29wZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEFXUyBhY2NvdW50SWQuXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIEF3c0NyZWRlbnRpYWxJZGVudGl0eVByb3ZpZGVyID0gSWRlbnRpdHlQcm92aWRlcjxBd3NDcmVkZW50aWFsSWRlbnRpdHk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFB1dE9iamVjdFJlcXVlc3Qge1xuICAvKipcbiAgICogPHA+VGhlIGNhbm5lZCBBQ0wgdG8gYXBwbHkgdG8gdGhlIG9iamVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvYWNsLW92ZXJ2aWV3Lmh0bWwjQ2FubmVkQUNMXCI+Q2FubmVkXG4gICAqICAgICAgICAgIEFDTDwvYT4gaW4gdGhlIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqICAgICAgICAgIDxwPldoZW4gYWRkaW5nIGEgbmV3IG9iamVjdCwgeW91IGNhbiB1c2UgaGVhZGVycyB0byBncmFudCBBQ0wtYmFzZWQgcGVybWlzc2lvbnMgdG9cbiAgICogICAgICAgICAgaW5kaXZpZHVhbCBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnRzIG9yIHRvIHByZWRlZmluZWQgZ3JvdXBzIGRlZmluZWQgYnkgQW1hem9uIFMzLiBUaGVzZSBwZXJtaXNzaW9ucyBhcmVcbiAgICogICAgICAgICAgdGhlbiBhZGRlZCB0byB0aGUgQUNMIG9uIHRoZSBvYmplY3QuIEJ5IGRlZmF1bHQsIGFsbCBvYmplY3RzIGFyZSBwcml2YXRlLiBPbmx5IHRoZSBvd25lclxuICAgKiAgICAgICAgICBoYXMgZnVsbCBhY2Nlc3MgY29udHJvbC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvYWNsLW92ZXJ2aWV3Lmh0bWxcIj5BY2Nlc3MgQ29udHJvbCBMaXN0IChBQ0wpIE92ZXJ2aWV3PC9hPlxuICAgKiAgICAgICAgICBhbmQgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2FjbC11c2luZy1yZXN0LWFwaS5odG1sXCI+TWFuYWdpbmdcbiAgICogICAgICAgICAgICAgQUNMcyBVc2luZyB0aGUgUkVTVCBBUEk8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8cD5JZiB0aGUgYnVja2V0IHRoYXQgeW91J3JlIHVwbG9hZGluZyBvYmplY3RzIHRvIHVzZXMgdGhlIGJ1Y2tldCBvd25lciBlbmZvcmNlZCBzZXR0aW5nXG4gICAqICAgICAgICAgIGZvciBTMyBPYmplY3QgT3duZXJzaGlwLCBBQ0xzIGFyZSBkaXNhYmxlZCBhbmQgbm8gbG9uZ2VyIGFmZmVjdCBwZXJtaXNzaW9ucy4gQnVja2V0cyB0aGF0XG4gICAqICAgICAgICAgIHVzZSB0aGlzIHNldHRpbmcgb25seSBhY2NlcHQgUFVUIHJlcXVlc3RzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBhbiBBQ0wgb3IgUFVUIHJlcXVlc3RzIHRoYXRcbiAgICogICAgICAgICAgc3BlY2lmeSBidWNrZXQgb3duZXIgZnVsbCBjb250cm9sIEFDTHMsIHN1Y2ggYXMgdGhlIDxjb2RlPmJ1Y2tldC1vd25lci1mdWxsLWNvbnRyb2w8L2NvZGU+XG4gICAqICAgICAgICAgIGNhbm5lZCBBQ0wgb3IgYW4gZXF1aXZhbGVudCBmb3JtIG9mIHRoaXMgQUNMIGV4cHJlc3NlZCBpbiB0aGUgWE1MIGZvcm1hdC4gUFVUIHJlcXVlc3RzIHRoYXRcbiAgICogICAgICAgICAgY29udGFpbiBvdGhlciBBQ0xzIChmb3IgZXhhbXBsZSwgY3VzdG9tIGdyYW50cyB0byBjZXJ0YWluIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudHMpIGZhaWwgYW5kIHJldHVybiBhXG4gICAqICAgICAgICAgIDxjb2RlPjQwMDwvY29kZT4gZXJyb3Igd2l0aCB0aGUgZXJyb3IgY29kZSA8Y29kZT5BY2Nlc3NDb250cm9sTGlzdE5vdFN1cHBvcnRlZDwvY29kZT4uXG4gICAqICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2Fib3V0LW9iamVjdC1vd25lcnNoaXAuaHRtbFwiPiBDb250cm9sbGluZyBvd25lcnNoaXAgb2ZcbiAgICogICAgICAgICAgICAgb2JqZWN0cyBhbmQgZGlzYWJsaW5nIEFDTHM8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHVsPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIEFtYXpvbiBTMyBvbiBPdXRwb3N0cy48L3A+XG4gICAqICAgICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDwvdWw+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIEFDTD86IE9iamVjdENhbm5lZEFDTDtcbiAgLyoqXG4gICAqIDxwPk9iamVjdCBkYXRhLjwvcD5cbiAgICovXG4gIEJvZHk/OiBSZWFkYWJsZTtcbiAgLyoqXG4gICAqIDxwPlRoZSBidWNrZXQgbmFtZSB0byB3aGljaCB0aGUgUFVUIGFjdGlvbiB3YXMgaW5pdGlhdGVkLiA8L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Yj5EaXJlY3RvcnkgYnVja2V0czwvYj4gLSBXaGVuIHlvdSB1c2UgdGhpcyBvcGVyYXRpb24gd2l0aCBhIGRpcmVjdG9yeSBidWNrZXQsIHlvdSBtdXN0IHVzZSB2aXJ0dWFsLWhvc3RlZC1zdHlsZSByZXF1ZXN0cyBpbiB0aGUgZm9ybWF0IDxjb2RlPlxuICAgKiAgICAgICAgICAgICAgICA8aT5CdWNrZXRfbmFtZTwvaT4uczNleHByZXNzLTxpPmF6X2lkPC9pPi48aT5yZWdpb248L2k+LmFtYXpvbmF3cy5jb208L2NvZGU+LiBQYXRoLXN0eWxlIHJlcXVlc3RzIGFyZSBub3Qgc3VwcG9ydGVkLiAgRGlyZWN0b3J5IGJ1Y2tldCBuYW1lcyBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgY2hvc2VuIEF2YWlsYWJpbGl0eSBab25lLiBCdWNrZXQgbmFtZXMgbXVzdCBmb2xsb3cgdGhlIGZvcm1hdCA8Y29kZT5cbiAgICogICAgICAgICAgICAgICAgPGk+YnVja2V0X2Jhc2VfbmFtZTwvaT4tLTxpPmF6LWlkPC9pPi0teC1zMzwvY29kZT4gKGZvciBleGFtcGxlLCA8Y29kZT5cbiAgICogICAgICAgICAgICAgICAgPGk+RE9DLUVYQU1QTEUtQlVDS0VUPC9pPi0tPGk+dXN3Mi1hejE8L2k+LS14LXMzPC9jb2RlPikuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBidWNrZXQgbmFtaW5nXG4gICAqICAgICAgICAgIHJlc3RyaWN0aW9ucywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9kaXJlY3RvcnktYnVja2V0LW5hbWluZy1ydWxlcy5odG1sXCI+RGlyZWN0b3J5IGJ1Y2tldCBuYW1pbmdcbiAgICogICAgICAgICAgICAgcnVsZXM8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGI+QWNjZXNzIHBvaW50czwvYj4gLSBXaGVuIHlvdSB1c2UgdGhpcyBhY3Rpb24gd2l0aCBhbiBhY2Nlc3MgcG9pbnQsIHlvdSBtdXN0IHByb3ZpZGUgdGhlIGFsaWFzIG9mIHRoZSBhY2Nlc3MgcG9pbnQgaW4gcGxhY2Ugb2YgdGhlIGJ1Y2tldCBuYW1lIG9yIHNwZWNpZnkgdGhlIGFjY2VzcyBwb2ludCBBUk4uIFdoZW4gdXNpbmcgdGhlIGFjY2VzcyBwb2ludCBBUk4sIHlvdSBtdXN0IGRpcmVjdCByZXF1ZXN0cyB0byB0aGUgYWNjZXNzIHBvaW50IGhvc3RuYW1lLiBUaGUgYWNjZXNzIHBvaW50IGhvc3RuYW1lIHRha2VzIHRoZSBmb3JtIDxpPkFjY2Vzc1BvaW50TmFtZTwvaT4tPGk+QWNjb3VudElkPC9pPi5zMy1hY2Nlc3Nwb2ludC48aT5SZWdpb248L2k+LmFtYXpvbmF3cy5jb20uIFdoZW4gdXNpbmcgdGhpcyBhY3Rpb24gd2l0aCBhbiBhY2Nlc3MgcG9pbnQgdGhyb3VnaCB0aGUgQW1hem9uIFdlYiBTZXJ2aWNlcyBTREtzLCB5b3UgcHJvdmlkZSB0aGUgYWNjZXNzIHBvaW50IEFSTiBpbiBwbGFjZSBvZiB0aGUgYnVja2V0IG5hbWUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGFjY2VzcyBwb2ludCBBUk5zLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL3VzaW5nLWFjY2Vzcy1wb2ludHMuaHRtbFwiPlVzaW5nIGFjY2VzcyBwb2ludHM8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+QWNjZXNzIHBvaW50cyBhbmQgT2JqZWN0IExhbWJkYSBhY2Nlc3MgcG9pbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGI+UzMgb24gT3V0cG9zdHM8L2I+IC0gV2hlbiB5b3UgdXNlIHRoaXMgYWN0aW9uIHdpdGggQW1hem9uIFMzIG9uIE91dHBvc3RzLCB5b3UgbXVzdCBkaXJlY3QgcmVxdWVzdHMgdG8gdGhlIFMzIG9uIE91dHBvc3RzIGhvc3RuYW1lLiBUaGUgUzMgb24gT3V0cG9zdHMgaG9zdG5hbWUgdGFrZXMgdGhlIGZvcm0gPGNvZGU+XG4gICAqICAgICAgICAgICAgICAgIDxpPkFjY2Vzc1BvaW50TmFtZTwvaT4tPGk+QWNjb3VudElkPC9pPi48aT5vdXRwb3N0SUQ8L2k+LnMzLW91dHBvc3RzLjxpPlJlZ2lvbjwvaT4uYW1hem9uYXdzLmNvbTwvY29kZT4uIFdoZW4geW91IHVzZSB0aGlzIGFjdGlvbiB3aXRoIFMzIG9uIE91dHBvc3RzIHRocm91Z2ggdGhlIEFtYXpvbiBXZWIgU2VydmljZXMgU0RLcywgeW91IHByb3ZpZGUgdGhlIE91dHBvc3RzIGFjY2VzcyBwb2ludCBBUk4gaW4gcGxhY2Ugb2YgdGhlIGJ1Y2tldCBuYW1lLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBTMyBvbiBPdXRwb3N0cyBBUk5zLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL1Mzb25PdXRwb3N0cy5odG1sXCI+V2hhdCBpcyBTMyBvbiBPdXRwb3N0cz88L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiA8cD5Ob3RlOiBUbyBzdXBwbHkgdGhlIE11bHRpLXJlZ2lvbiBBY2Nlc3MgUG9pbnQgKE1SQVApIHRvIEJ1Y2tldCwgeW91IG5lZWQgdG8gaW5zdGFsbCB0aGUgXCJAYXdzLXNkay9zaWduYXR1cmUtdjQtY3J0XCIgcGFja2FnZSB0byB5b3VyIHByb2plY3QgZGVwZW5kZW5jaWVzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGdvIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1qcy12MyNrbm93bi1pc3N1ZXM8L3A+XG4gICAqL1xuICBCdWNrZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIDxwPkNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2FjaGluZyBiZWhhdmlvciBhbG9uZyB0aGUgcmVxdWVzdC9yZXBseSBjaGFpbi4gRm9yIG1vcmVcbiAgICogICAgICAgICAgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxNC5odG1sI3NlYzE0LjlcIj5odHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzE0Lmh0bWwjc2VjMTQuOTwvYT4uPC9wPlxuICAgKi9cbiAgQ2FjaGVDb250cm9sPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+U3BlY2lmaWVzIHByZXNlbnRhdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgb2JqZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9XCJodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NiNzZWN0aW9uLTRcIj5odHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjI2NiNzZWN0aW9uLTQ8L2E+LjwvcD5cbiAgICovXG4gIENvbnRlbnREaXNwb3NpdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB3aGF0IGNvbnRlbnQgZW5jb2RpbmdzIGhhdmUgYmVlbiBhcHBsaWVkIHRvIHRoZSBvYmplY3QgYW5kIHRodXMgd2hhdCBkZWNvZGluZ1xuICAgKiAgICAgICAgICBtZWNoYW5pc21zIG11c3QgYmUgYXBwbGllZCB0byBvYnRhaW4gdGhlIG1lZGlhLXR5cGUgcmVmZXJlbmNlZCBieSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgKiAgICAgICAgICBmaWVsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAuaHRtbCNmaWVsZC5jb250ZW50LWVuY29kaW5nXCI+aHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAuaHRtbCNmaWVsZC5jb250ZW50LWVuY29kaW5nPC9hPi48L3A+XG4gICAqL1xuICBDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgbGFuZ3VhZ2UgdGhlIGNvbnRlbnQgaXMgaW4uPC9wPlxuICAgKi9cbiAgQ29udGVudExhbmd1YWdlPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+U2l6ZSBvZiB0aGUgYm9keSBpbiBieXRlcy4gVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZnVsIHdoZW4gdGhlIHNpemUgb2YgdGhlIGJvZHkgY2Fubm90IGJlXG4gICAqICAgICAgICAgIGRldGVybWluZWQgYXV0b21hdGljYWxseS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAuaHRtbCNuYW1lLWNvbnRlbnQtbGVuZ3RoXCI+aHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAuaHRtbCNuYW1lLWNvbnRlbnQtbGVuZ3RoPC9hPi48L3A+XG4gICAqL1xuICBDb250ZW50TGVuZ3RoPzogbnVtYmVyO1xuICAvKipcbiAgICogPHA+VGhlIGJhc2U2NC1lbmNvZGVkIDEyOC1iaXQgTUQ1IGRpZ2VzdCBvZiB0aGUgbWVzc2FnZSAod2l0aG91dCB0aGUgaGVhZGVycykgYWNjb3JkaW5nIHRvXG4gICAqICAgICAgICAgIFJGQyAxODY0LiBUaGlzIGhlYWRlciBjYW4gYmUgdXNlZCBhcyBhIG1lc3NhZ2UgaW50ZWdyaXR5IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHRoZSBkYXRhIGlzXG4gICAqICAgICAgICAgIHRoZSBzYW1lIGRhdGEgdGhhdCB3YXMgb3JpZ2luYWxseSBzZW50LiBBbHRob3VnaCBpdCBpcyBvcHRpb25hbCwgd2UgcmVjb21tZW5kIHVzaW5nIHRoZVxuICAgKiAgICAgICAgICBDb250ZW50LU1ENSBtZWNoYW5pc20gYXMgYW4gZW5kLXRvLWVuZCBpbnRlZ3JpdHkgY2hlY2suIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFJFU1RcbiAgICogICAgICAgICAgcmVxdWVzdCBhdXRoZW50aWNhdGlvbiwgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9SRVNUQXV0aGVudGljYXRpb24uaHRtbFwiPlJFU1QgQXV0aGVudGljYXRpb248L2E+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoZSA8Y29kZT5Db250ZW50LU1ENTwvY29kZT4gaGVhZGVyIGlzIHJlcXVpcmVkIGZvciBhbnkgcmVxdWVzdCB0byB1cGxvYWQgYW5cbiAgICogICAgICAgICAgb2JqZWN0IHdpdGggYSByZXRlbnRpb24gcGVyaW9kIGNvbmZpZ3VyZWQgdXNpbmcgQW1hem9uIFMzIE9iamVjdCBMb2NrLiBGb3IgbW9yZVxuICAgKiAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCBBbWF6b24gUzMgT2JqZWN0IExvY2ssIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvb2JqZWN0LWxvY2stb3ZlcnZpZXcuaHRtbFwiPkFtYXpvbiBTMyBPYmplY3QgTG9ja1xuICAgKiAgICAgICAgICAgICBPdmVydmlldzwvYT4gaW4gdGhlIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi4gPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBDb250ZW50TUQ1Pzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+QSBzdGFuZGFyZCBNSU1FIHR5cGUgZGVzY3JpYmluZyB0aGUgZm9ybWF0IG9mIHRoZSBjb250ZW50cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAuaHRtbCNuYW1lLWNvbnRlbnQtdHlwZVwiPmh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEwLmh0bWwjbmFtZS1jb250ZW50LXR5cGU8L2E+LjwvcD5cbiAgICovXG4gIENvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+SW5kaWNhdGVzIHRoZSBhbGdvcml0aG0gdXNlZCB0byBjcmVhdGUgdGhlIGNoZWNrc3VtIGZvciB0aGUgb2JqZWN0IHdoZW4geW91IHVzZSB0aGUgU0RLLiBUaGlzIGhlYWRlciB3aWxsIG5vdCBwcm92aWRlIGFueVxuICAgKiAgICAgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGlmIHlvdSBkb24ndCB1c2UgdGhlIFNESy4gV2hlbiB5b3Ugc2VuZCB0aGlzIGhlYWRlciwgdGhlcmUgbXVzdCBiZSBhIGNvcnJlc3BvbmRpbmcgPGNvZGU+eC1hbXotY2hlY2tzdW0tPGk+YWxnb3JpdGhtPC9pPlxuICAgKiAgICAgICAgICAgICA8L2NvZGU+IG9yXG4gICAqICAgICA8Y29kZT54LWFtei10cmFpbGVyPC9jb2RlPiBoZWFkZXIgc2VudC4gT3RoZXJ3aXNlLCBBbWF6b24gUzMgZmFpbHMgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgSFRUUCBzdGF0dXMgY29kZSA8Y29kZT40MDAgQmFkIFJlcXVlc3Q8L2NvZGU+LjwvcD5cbiAgICogICAgICAgICAgPHA+Rm9yIHRoZSA8Y29kZT54LWFtei1jaGVja3N1bS08aT5hbGdvcml0aG08L2k+XG4gICAqICAgICAgICAgICAgIDwvY29kZT4gaGVhZGVyLCByZXBsYWNlIDxjb2RlPlxuICAgKiAgICAgICAgICAgICAgICA8aT5hbGdvcml0aG08L2k+XG4gICAqICAgICAgICAgICAgIDwvY29kZT4gd2l0aCB0aGUgc3VwcG9ydGVkIGFsZ29yaXRobSBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDogPC9wPlxuICAgKiAgICAgICAgICA8dWw+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+Q1JDMzI8L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+Q1JDMzJDPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPlNIQTE8L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+U0hBMjU2PC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8cD5Gb3IgbW9yZVxuICAgKiAgICAgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY2hlY2tpbmctb2JqZWN0LWludGVncml0eS5odG1sXCI+Q2hlY2tpbmcgb2JqZWN0IGludGVncml0eTwvYT4gaW5cbiAgICogICAgIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8cD5JZiB0aGUgaW5kaXZpZHVhbCBjaGVja3N1bSB2YWx1ZSB5b3UgcHJvdmlkZSB0aHJvdWdoIDxjb2RlPngtYW16LWNoZWNrc3VtLTxpPmFsZ29yaXRobTwvaT5cbiAgICogICAgICAgICAgICAgPC9jb2RlPiBkb2Vzbid0IG1hdGNoIHRoZSBjaGVja3N1bSBhbGdvcml0aG0geW91IHNldCB0aHJvdWdoIDxjb2RlPngtYW16LXNkay1jaGVja3N1bS1hbGdvcml0aG08L2NvZGU+LCAgQW1hem9uIFMzIGlnbm9yZXMgYW55IHByb3ZpZGVkXG4gICAqICAgICAgICAgICAgIDxjb2RlPkNoZWNrc3VtQWxnb3JpdGhtPC9jb2RlPiBwYXJhbWV0ZXIgYW5kIHVzZXMgdGhlIGNoZWNrc3VtIGFsZ29yaXRobSB0aGF0IG1hdGNoZXMgdGhlIHByb3ZpZGVkIHZhbHVlIGluIDxjb2RlPngtYW16LWNoZWNrc3VtLTxpPmFsZ29yaXRobTwvaT5cbiAgICogICAgICAgICAgICAgPC9jb2RlPi48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5Gb3IgZGlyZWN0b3J5IGJ1Y2tldHMsIHdoZW4geW91IHVzZSBBbWF6b24gV2ViIFNlcnZpY2VzIFNES3MsIDxjb2RlPkNSQzMyPC9jb2RlPiBpcyB0aGUgZGVmYXVsdCBjaGVja3N1bSBhbGdvcml0aG0gdGhhdCdzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgQ2hlY2tzdW1BbGdvcml0aG0/OiBDaGVja3N1bUFsZ29yaXRobUluO1xuICAvKipcbiAgICogPHA+VGhpcyBoZWFkZXIgY2FuIGJlIHVzZWQgYXMgYSBkYXRhIGludGVncml0eSBjaGVjayB0byB2ZXJpZnkgdGhhdCB0aGUgZGF0YSByZWNlaXZlZCBpcyB0aGUgc2FtZSBkYXRhIHRoYXQgd2FzIG9yaWdpbmFsbHkgc2VudC5cbiAgICogICAgIFRoaXMgaGVhZGVyIHNwZWNpZmllcyB0aGUgYmFzZTY0LWVuY29kZWQsIDMyLWJpdCBDUkMzMiBjaGVja3N1bSBvZiB0aGUgb2JqZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4gICAqICAgICA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY2hlY2tpbmctb2JqZWN0LWludGVncml0eS5odG1sXCI+Q2hlY2tpbmcgb2JqZWN0IGludGVncml0eTwvYT4gaW4gdGhlXG4gICAqICAgICA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKi9cbiAgQ2hlY2tzdW1DUkMzMj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoaXMgaGVhZGVyIGNhbiBiZSB1c2VkIGFzIGEgZGF0YSBpbnRlZ3JpdHkgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIGRhdGEgcmVjZWl2ZWQgaXMgdGhlIHNhbWUgZGF0YSB0aGF0IHdhcyBvcmlnaW5hbGx5IHNlbnQuXG4gICAqICAgICBUaGlzIGhlYWRlciBzcGVjaWZpZXMgdGhlIGJhc2U2NC1lbmNvZGVkLCAzMi1iaXQgQ1JDMzJDIGNoZWNrc3VtIG9mIHRoZSBvYmplY3QuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAgICogICAgIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9jaGVja2luZy1vYmplY3QtaW50ZWdyaXR5Lmh0bWxcIj5DaGVja2luZyBvYmplY3QgaW50ZWdyaXR5PC9hPiBpbiB0aGVcbiAgICogICAgIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqL1xuICBDaGVja3N1bUNSQzMyQz86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoaXMgaGVhZGVyIGNhbiBiZSB1c2VkIGFzIGEgZGF0YSBpbnRlZ3JpdHkgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIGRhdGEgcmVjZWl2ZWQgaXMgdGhlIHNhbWUgZGF0YSB0aGF0IHdhcyBvcmlnaW5hbGx5IHNlbnQuXG4gICAqICAgICBUaGlzIGhlYWRlciBzcGVjaWZpZXMgdGhlIGJhc2U2NC1lbmNvZGVkLCAxNjAtYml0IFNIQS0xIGRpZ2VzdCBvZiB0aGUgb2JqZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4gICAqICAgICA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY2hlY2tpbmctb2JqZWN0LWludGVncml0eS5odG1sXCI+Q2hlY2tpbmcgb2JqZWN0IGludGVncml0eTwvYT4gaW4gdGhlXG4gICAqICAgICA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKi9cbiAgQ2hlY2tzdW1TSEExPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhpcyBoZWFkZXIgY2FuIGJlIHVzZWQgYXMgYSBkYXRhIGludGVncml0eSBjaGVjayB0byB2ZXJpZnkgdGhhdCB0aGUgZGF0YSByZWNlaXZlZCBpcyB0aGUgc2FtZSBkYXRhIHRoYXQgd2FzIG9yaWdpbmFsbHkgc2VudC5cbiAgICogICAgIFRoaXMgaGVhZGVyIHNwZWNpZmllcyB0aGUgYmFzZTY0LWVuY29kZWQsIDI1Ni1iaXQgU0hBLTI1NiBkaWdlc3Qgb2YgdGhlIG9iamVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAgICAgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NoZWNraW5nLW9iamVjdC1pbnRlZ3JpdHkuaHRtbFwiPkNoZWNraW5nIG9iamVjdCBpbnRlZ3JpdHk8L2E+IGluIHRoZVxuICAgKiAgICAgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICovXG4gIENoZWNrc3VtU0hBMjU2Pzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIG9iamVjdCBpcyBubyBsb25nZXIgY2FjaGVhYmxlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4gICAqICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzNCNzZWN0aW9uLTUuM1wiPmh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3MjM0I3NlY3Rpb24tNS4zPC9hPi48L3A+XG4gICAqL1xuICBFeHBpcmVzPzogRGF0ZTtcbiAgLyoqXG4gICAqIDxwPlVwbG9hZHMgdGhlIG9iamVjdCBvbmx5IGlmIHRoZSBvYmplY3Qga2V5IG5hbWUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgYnVja2V0IHNwZWNpZmllZC4gT3RoZXJ3aXNlLCBBbWF6b24gUzMgcmV0dXJucyBhIDxjb2RlPjQxMiBQcmVjb25kaXRpb24gRmFpbGVkPC9jb2RlPiBlcnJvci48L3A+XG4gICAqICAgICAgICAgIDxwPklmIGEgY29uZmxpY3Rpbmcgb3BlcmF0aW9uIG9jY3VycyBkdXJpbmcgdGhlIHVwbG9hZCBTMyByZXR1cm5zIGEgPGNvZGU+NDA5IENvbmRpdGlvbmFsUmVxdWVzdENvbmZsaWN0PC9jb2RlPiByZXNwb25zZS4gT24gYSA0MDkgZmFpbHVyZSB5b3Ugc2hvdWxkIHJldHJ5IHRoZSB1cGxvYWQuPC9wPlxuICAgKiAgICAgICAgICA8cD5FeHBlY3RzIHRoZSAnKicgKGFzdGVyaXNrKSBjaGFyYWN0ZXIuPC9wPlxuICAgKiAgICAgICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb25kaXRpb25hbCByZXF1ZXN0cywgc2VlIDxhIGhyZWY9XCJodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMlwiPlJGQyA3MjMyPC9hPiwgb3IgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NvbmRpdGlvbmFsLXJlcXVlc3RzLmh0bWxcIj5Db25kaXRpb25hbCByZXF1ZXN0czwvYT4gaW4gdGhlIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqL1xuICBJZk5vbmVNYXRjaD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPkdpdmVzIHRoZSBncmFudGVlIFJFQUQsIFJFQURfQUNQLCBhbmQgV1JJVEVfQUNQIHBlcm1pc3Npb25zIG9uIHRoZSBvYmplY3QuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHVsPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIEFtYXpvbiBTMyBvbiBPdXRwb3N0cy48L3A+XG4gICAqICAgICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDwvdWw+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIEdyYW50RnVsbENvbnRyb2w/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5BbGxvd3MgZ3JhbnRlZSB0byByZWFkIHRoZSBvYmplY3QgZGF0YSBhbmQgaXRzIG1ldGFkYXRhLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDx1bD5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBBbWF6b24gUzMgb24gT3V0cG9zdHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBHcmFudFJlYWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5BbGxvd3MgZ3JhbnRlZSB0byByZWFkIHRoZSBvYmplY3QgQUNMLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDx1bD5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBBbWF6b24gUzMgb24gT3V0cG9zdHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBHcmFudFJlYWRBQ1A/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5BbGxvd3MgZ3JhbnRlZSB0byB3cml0ZSB0aGUgQUNMIGZvciB0aGUgYXBwbGljYWJsZSBvYmplY3QuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHVsPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIEFtYXpvbiBTMyBvbiBPdXRwb3N0cy48L3A+XG4gICAqICAgICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDwvdWw+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIEdyYW50V3JpdGVBQ1A/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5PYmplY3Qga2V5IGZvciB3aGljaCB0aGUgUFVUIGFjdGlvbiB3YXMgaW5pdGlhdGVkLjwvcD5cbiAgICovXG4gIEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogPHA+QSBtYXAgb2YgbWV0YWRhdGEgdG8gc3RvcmUgd2l0aCB0aGUgb2JqZWN0IGluIFMzLjwvcD5cbiAgICovXG4gIE1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIDxwPlRoZSBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIGFsZ29yaXRobSB0aGF0IHdhcyB1c2VkIHdoZW4geW91IHN0b3JlIHRoaXMgb2JqZWN0IGluIEFtYXpvbiBTMyAoZm9yIGV4YW1wbGUsXG4gICAqICAgICAgICAgICAgIDxjb2RlPkFFUzI1NjwvY29kZT4sIDxjb2RlPmF3czprbXM8L2NvZGU+LCA8Y29kZT5hd3M6a21zOmRzc2U8L2NvZGU+KS48L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Yj5HZW5lcmFsIHB1cnBvc2UgYnVja2V0cyA8L2I+IC0gWW91IGhhdmUgZm91ciBtdXR1YWxseSBleGNsdXNpdmUgb3B0aW9ucyB0byBwcm90ZWN0IGRhdGEgdXNpbmcgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiBpblxuICAgKiAgICAgICAgICAgICAgICBBbWF6b24gUzMsIGRlcGVuZGluZyBvbiBob3cgeW91IGNob29zZSB0byBtYW5hZ2UgdGhlIGVuY3J5cHRpb24ga2V5cy4gU3BlY2lmaWNhbGx5LCB0aGVcbiAgICogICAgICAgICAgICAgICAgZW5jcnlwdGlvbiBrZXkgb3B0aW9ucyBhcmUgQW1hem9uIFMzIG1hbmFnZWQga2V5cyAoU1NFLVMzKSwgQW1hem9uIFdlYiBTZXJ2aWNlcyBLTVMga2V5cyAoU1NFLUtNUyBvclxuICAgKiAgICAgICAgICAgICAgICBEU1NFLUtNUyksIGFuZCBjdXN0b21lci1wcm92aWRlZCBrZXlzIChTU0UtQykuIEFtYXpvbiBTMyBlbmNyeXB0cyBkYXRhIHdpdGggc2VydmVyLXNpZGVcbiAgICogICAgICAgICAgICAgICAgZW5jcnlwdGlvbiBieSB1c2luZyBBbWF6b24gUzMgbWFuYWdlZCBrZXlzIChTU0UtUzMpIGJ5IGRlZmF1bHQuIFlvdSBjYW4gb3B0aW9uYWxseSB0ZWxsIEFtYXpvbiBTMyB0b1xuICAgKiAgICAgICAgICAgICAgICBlbmNyeXB0IGRhdGEgYXQgcmVzdCBieSB1c2luZyBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggb3RoZXIga2V5IG9wdGlvbnMuIEZvciBtb3JlXG4gICAqICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L1VzaW5nU2VydmVyU2lkZUVuY3J5cHRpb24uaHRtbFwiPlVzaW5nIFNlcnZlci1TaWRlXG4gICAqICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb248L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHMgPC9iPiAtIEZvciBkaXJlY3RvcnkgYnVja2V0cywgb25seSB0aGUgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIEFtYXpvbiBTMyBtYW5hZ2VkIGtleXMgKFNTRS1TMykgKDxjb2RlPkFFUzI1NjwvY29kZT4pIHZhbHVlIGlzIHN1cHBvcnRlZC48L3A+XG4gICAqL1xuICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbj86IFNlcnZlclNpZGVFbmNyeXB0aW9uO1xuICAvKipcbiAgICogPHA+QnkgZGVmYXVsdCwgQW1hem9uIFMzIHVzZXMgdGhlIFNUQU5EQVJEIFN0b3JhZ2UgQ2xhc3MgdG8gc3RvcmUgbmV3bHkgY3JlYXRlZCBvYmplY3RzLiBUaGVcbiAgICogICAgICAgICAgU1RBTkRBUkQgc3RvcmFnZSBjbGFzcyBwcm92aWRlcyBoaWdoIGR1cmFiaWxpdHkgYW5kIGhpZ2ggYXZhaWxhYmlsaXR5LiBEZXBlbmRpbmcgb25cbiAgICogICAgICAgICAgcGVyZm9ybWFuY2UgbmVlZHMsIHlvdSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudCBTdG9yYWdlIENsYXNzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9zdG9yYWdlLWNsYXNzLWludHJvLmh0bWxcIj5TdG9yYWdlIENsYXNzZXM8L2E+IGluIHRoZVxuICAgKiAgICAgICAgICAgICA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHVsPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPkZvciBkaXJlY3RvcnkgYnVja2V0cywgb25seSB0aGUgUzMgRXhwcmVzcyBPbmUgWm9uZSBzdG9yYWdlIGNsYXNzIGlzIHN1cHBvcnRlZCB0byBzdG9yZSBuZXdseSBjcmVhdGVkIG9iamVjdHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPkFtYXpvbiBTMyBvbiBPdXRwb3N0cyBvbmx5IHVzZXNcbiAgICogICAgICAgICAgICAgICAgdGhlIE9VVFBPU1RTIFN0b3JhZ2UgQ2xhc3MuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBTdG9yYWdlQ2xhc3M/OiBTdG9yYWdlQ2xhc3M7XG4gIC8qKlxuICAgKiA8cD5JZiB0aGUgYnVja2V0IGlzIGNvbmZpZ3VyZWQgYXMgYSB3ZWJzaXRlLCByZWRpcmVjdHMgcmVxdWVzdHMgZm9yIHRoaXMgb2JqZWN0IHRvIGFub3RoZXJcbiAgICogICAgICAgICAgb2JqZWN0IGluIHRoZSBzYW1lIGJ1Y2tldCBvciB0byBhbiBleHRlcm5hbCBVUkwuIEFtYXpvbiBTMyBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIGluXG4gICAqICAgICAgICAgIHRoZSBvYmplY3QgbWV0YWRhdGEuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3QgbWV0YWRhdGEsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvVXNpbmdNZXRhZGF0YS5odG1sXCI+T2JqZWN0IEtleSBhbmQgTWV0YWRhdGE8L2E+IGluIHRoZSA8aT5BbWF6b24gUzNcbiAgICogICAgICAgICAgICAgICAgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8cD5JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSByZXF1ZXN0IGhlYWRlciBzZXRzIHRoZSByZWRpcmVjdCB0byBhbiBvYmplY3RcbiAgICogICAgICAgICAgKGFub3RoZXJQYWdlLmh0bWwpIGluIHRoZSBzYW1lIGJ1Y2tldDo8L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT54LWFtei13ZWJzaXRlLXJlZGlyZWN0LWxvY2F0aW9uOiAvYW5vdGhlclBhZ2UuaHRtbDwvY29kZT5cbiAgICogICAgICAgICAgPC9wPlxuICAgKiAgICAgICAgICA8cD5JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSByZXF1ZXN0IGhlYWRlciBzZXRzIHRoZSBvYmplY3QgcmVkaXJlY3QgdG8gYW5vdGhlclxuICAgKiAgICAgICAgICB3ZWJzaXRlOjwvcD5cbiAgICogICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgIDxjb2RlPngtYW16LXdlYnNpdGUtcmVkaXJlY3QtbG9jYXRpb246IGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vPC9jb2RlPlxuICAgKiAgICAgICAgICA8L3A+XG4gICAqICAgICAgICAgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdlYnNpdGUgaG9zdGluZyBpbiBBbWF6b24gUzMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvV2Vic2l0ZUhvc3RpbmcuaHRtbFwiPkhvc3RpbmcgV2Vic2l0ZXMgb24gQW1hem9uIFMzPC9hPiBhbmRcbiAgICogICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2hvdy10by1wYWdlLXJlZGlyZWN0Lmh0bWxcIj5Ib3cgdG9cbiAgICogICAgICAgICAgICAgICAgQ29uZmlndXJlIFdlYnNpdGUgUGFnZSBSZWRpcmVjdHM8L2E+IGluIHRoZSA8aT5BbWF6b24gUzNcbiAgICogICAgICAgICAgICAgICAgICAgVXNlciBHdWlkZTwvaT4uIDwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFdlYnNpdGVSZWRpcmVjdExvY2F0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+U3BlY2lmaWVzIHRoZSBhbGdvcml0aG0gdG8gdXNlIHdoZW4gZW5jcnlwdGluZyB0aGUgb2JqZWN0IChmb3IgZXhhbXBsZSxcbiAgICogICAgICAgICAgPGNvZGU+QUVTMjU2PC9jb2RlPikuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgU1NFQ3VzdG9tZXJBbGdvcml0aG0/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5TcGVjaWZpZXMgdGhlIGN1c3RvbWVyLXByb3ZpZGVkIGVuY3J5cHRpb24ga2V5IGZvciBBbWF6b24gUzMgdG8gdXNlIGluIGVuY3J5cHRpbmcgZGF0YS4gVGhpc1xuICAgKiAgICAgICAgICB2YWx1ZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBvYmplY3QgYW5kIHRoZW4gaXQgaXMgZGlzY2FyZGVkOyBBbWF6b24gUzMgZG9lcyBub3Qgc3RvcmUgdGhlXG4gICAqICAgICAgICAgIGVuY3J5cHRpb24ga2V5LiBUaGUga2V5IG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yIHVzZSB3aXRoIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkIGluIHRoZVxuICAgKiAgICAgICAgICAgICA8Y29kZT54LWFtei1zZXJ2ZXItc2lkZS1lbmNyeXB0aW9uLWN1c3RvbWVyLWFsZ29yaXRobTwvY29kZT4gaGVhZGVyLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFNTRUN1c3RvbWVyS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+U3BlY2lmaWVzIHRoZSAxMjgtYml0IE1ENSBkaWdlc3Qgb2YgdGhlIGVuY3J5cHRpb24ga2V5IGFjY29yZGluZyB0byBSRkMgMTMyMS4gQW1hem9uIFMzIHVzZXNcbiAgICogICAgICAgICAgdGhpcyBoZWFkZXIgZm9yIGEgbWVzc2FnZSBpbnRlZ3JpdHkgY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGVuY3J5cHRpb24ga2V5IHdhcyB0cmFuc21pdHRlZFxuICAgKiAgICAgICAgICB3aXRob3V0IGVycm9yLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFNTRUN1c3RvbWVyS2V5TUQ1Pzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+SWYgPGNvZGU+eC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbjwvY29kZT4gaGFzIGEgdmFsaWQgdmFsdWUgb2YgPGNvZGU+YXdzOmttczwvY29kZT5cbiAgICogICAgICAgICAgb3IgPGNvZGU+YXdzOmttczpkc3NlPC9jb2RlPiwgdGhpcyBoZWFkZXIgc3BlY2lmaWVzIHRoZSBJRCAoS2V5IElELCBLZXkgQVJOLCBvciBLZXkgQWxpYXMpIG9mIHRoZSBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChLTVMpXG4gICAqICAgICAgICAgIHN5bW1ldHJpYyBlbmNyeXB0aW9uIGN1c3RvbWVyIG1hbmFnZWQga2V5IHRoYXQgd2FzIHVzZWQgZm9yIHRoZSBvYmplY3QuIElmIHlvdSBzcGVjaWZ5XG4gICAqICAgICAgICAgICAgIDxjb2RlPngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb246YXdzOmttczwvY29kZT4gb3JcbiAgICogICAgICAgICAgICAgPGNvZGU+eC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbjphd3M6a21zOmRzc2U8L2NvZGU+LCBidXQgZG8gbm90IHByb3ZpZGU8Y29kZT5cbiAgICogICAgICAgICAgICAgeC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbi1hd3Mta21zLWtleS1pZDwvY29kZT4sIEFtYXpvbiBTMyB1c2VzIHRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIG1hbmFnZWQga2V5XG4gICAqICAgICAgICAgICAgICg8Y29kZT5hd3MvczM8L2NvZGU+KSB0byBwcm90ZWN0IHRoZSBkYXRhLiBJZiB0aGUgS01TIGtleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc2FtZVxuICAgKiAgICAgICAgICBhY2NvdW50IHRoYXQncyBpc3N1aW5nIHRoZSBjb21tYW5kLCB5b3UgbXVzdCB1c2UgdGhlIGZ1bGwgQVJOIGFuZCBub3QganVzdCB0aGUgSUQuIDwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFNTRUtNU0tleUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+U3BlY2lmaWVzIHRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIEtNUyBFbmNyeXB0aW9uIENvbnRleHQgdG8gdXNlIGZvciBvYmplY3QgZW5jcnlwdGlvbi4gVGhlIHZhbHVlIG9mXG4gICAqICAgICAgICAgIHRoaXMgaGVhZGVyIGlzIGEgYmFzZTY0LWVuY29kZWQgVVRGLTggc3RyaW5nIGhvbGRpbmcgSlNPTiB3aXRoIHRoZSBlbmNyeXB0aW9uIGNvbnRleHRcbiAgICogICAgICAgICAga2V5LXZhbHVlIHBhaXJzLiBUaGlzIHZhbHVlIGlzIHN0b3JlZCBhcyBvYmplY3QgbWV0YWRhdGEgYW5kIGF1dG9tYXRpY2FsbHkgZ2V0cyBwYXNzZWQgb25cbiAgICogICAgICAgICAgdG8gQW1hem9uIFdlYiBTZXJ2aWNlcyBLTVMgZm9yIGZ1dHVyZSA8Y29kZT5HZXRPYmplY3Q8L2NvZGU+IG9yIDxjb2RlPkNvcHlPYmplY3Q8L2NvZGU+IG9wZXJhdGlvbnMgb25cbiAgICogICAgICAgICAgdGhpcyBvYmplY3QuIFRoaXMgdmFsdWUgbXVzdCBiZSBleHBsaWNpdGx5IGFkZGVkIGR1cmluZyA8Y29kZT5Db3B5T2JqZWN0PC9jb2RlPiBvcGVyYXRpb25zLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFNTRUtNU0VuY3J5cHRpb25Db250ZXh0Pzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+U3BlY2lmaWVzIHdoZXRoZXIgQW1hem9uIFMzIHNob3VsZCB1c2UgYW4gUzMgQnVja2V0IEtleSBmb3Igb2JqZWN0IGVuY3J5cHRpb24gd2l0aFxuICAgKiAgICAgICAgICBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHVzaW5nIEtleSBNYW5hZ2VtZW50IFNlcnZpY2UgKEtNUykga2V5cyAoU1NFLUtNUykuIFNldHRpbmcgdGhpcyBoZWFkZXIgdG9cbiAgICogICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gY2F1c2VzIEFtYXpvbiBTMyB0byB1c2UgYW4gUzMgQnVja2V0IEtleSBmb3Igb2JqZWN0IGVuY3J5cHRpb24gd2l0aFxuICAgKiAgICAgICAgICBTU0UtS01TLjwvcD5cbiAgICogICAgICAgICAgPHA+U3BlY2lmeWluZyB0aGlzIGhlYWRlciB3aXRoIGEgUFVUIGFjdGlvbiBkb2VzbuKAmXQgYWZmZWN0IGJ1Y2tldC1sZXZlbCBzZXR0aW5ncyBmb3IgUzNcbiAgICogICAgICAgICAgQnVja2V0IEtleS48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBCdWNrZXRLZXlFbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIDxwPkNvbmZpcm1zIHRoYXQgdGhlIHJlcXVlc3RlciBrbm93cyB0aGF0IHRoZXkgd2lsbCBiZSBjaGFyZ2VkIGZvciB0aGUgcmVxdWVzdC4gQnVja2V0XG4gICAqICAgICAgICAgIG93bmVycyBuZWVkIG5vdCBzcGVjaWZ5IHRoaXMgcGFyYW1ldGVyIGluIHRoZWlyIHJlcXVlc3RzLiBJZiBlaXRoZXIgdGhlIHNvdXJjZSBvclxuICAgKiAgICAgICAgICBkZXN0aW5hdGlvbiBTMyBidWNrZXQgaGFzIFJlcXVlc3RlciBQYXlzIGVuYWJsZWQsIHRoZSByZXF1ZXN0ZXIgd2lsbCBwYXkgZm9yXG4gICAqICAgICAgICAgIGNvcnJlc3BvbmRpbmcgY2hhcmdlcyB0byBjb3B5IHRoZSBvYmplY3QuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBkb3dubG9hZGluZyBvYmplY3RzIGZyb21cbiAgICogICAgICAgICAgUmVxdWVzdGVyIFBheXMgYnVja2V0cywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9PYmplY3RzaW5SZXF1ZXN0ZXJQYXlzQnVja2V0cy5odG1sXCI+RG93bmxvYWRpbmcgT2JqZWN0cyBpblxuICAgKiAgICAgICAgICAgICBSZXF1ZXN0ZXIgUGF5cyBCdWNrZXRzPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFJlcXVlc3RQYXllcj86IFJlcXVlc3RQYXllcjtcbiAgLyoqXG4gICAqIDxwPlRoZSB0YWctc2V0IGZvciB0aGUgb2JqZWN0LiBUaGUgdGFnLXNldCBtdXN0IGJlIGVuY29kZWQgYXMgVVJMIFF1ZXJ5IHBhcmFtZXRlcnMuIChGb3JcbiAgICogICAgICAgICAgZXhhbXBsZSwgXCJLZXkxPVZhbHVlMVwiKTwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFRhZ2dpbmc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgT2JqZWN0IExvY2sgbW9kZSB0aGF0IHlvdSB3YW50IHRvIGFwcGx5IHRvIHRoaXMgb2JqZWN0LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIE9iamVjdExvY2tNb2RlPzogT2JqZWN0TG9ja01vZGU7XG4gIC8qKlxuICAgKiA8cD5UaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHlvdSB3YW50IHRoaXMgb2JqZWN0J3MgT2JqZWN0IExvY2sgdG8gZXhwaXJlLiBNdXN0IGJlIGZvcm1hdHRlZFxuICAgKiAgICAgICAgICBhcyBhIHRpbWVzdGFtcCBwYXJhbWV0ZXIuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgT2JqZWN0TG9ja1JldGFpblVudGlsRGF0ZT86IERhdGU7XG4gIC8qKlxuICAgKiA8cD5TcGVjaWZpZXMgd2hldGhlciBhIGxlZ2FsIGhvbGQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoaXMgb2JqZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgKiAgICAgICAgICBhYm91dCBTMyBPYmplY3QgTG9jaywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9vYmplY3QtbG9jay5odG1sXCI+T2JqZWN0IExvY2s8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgT2JqZWN0TG9ja0xlZ2FsSG9sZFN0YXR1cz86IE9iamVjdExvY2tMZWdhbEhvbGRTdGF0dXM7XG4gIC8qKlxuICAgKiA8cD5UaGUgYWNjb3VudCBJRCBvZiB0aGUgZXhwZWN0ZWQgYnVja2V0IG93bmVyLiBJZiB0aGUgYWNjb3VudCBJRCB0aGF0IHlvdSBwcm92aWRlIGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgb3duZXIgb2YgdGhlIGJ1Y2tldCwgdGhlIHJlcXVlc3QgZmFpbHMgd2l0aCB0aGUgSFRUUCBzdGF0dXMgY29kZSA8Y29kZT40MDMgRm9yYmlkZGVuPC9jb2RlPiAoYWNjZXNzIGRlbmllZCkuPC9wPlxuICAgKi9cbiAgRXhwZWN0ZWRCdWNrZXRPd25lcj86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTm9kZUpzUnVudGltZVN0cmVhbWluZ0Jsb2JQYXlsb2FkSW5wdXRUeXBlcyA9IHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXIgfCBSZWFkYWJsZTtcblxuZXhwb3J0IGludGVyZmFjZSBQdXRPYmplY3RDb21tYW5kSW5wdXQgZXh0ZW5kcyBPbWl0PFB1dE9iamVjdFJlcXVlc3QsICdCb2R5Jz4ge1xuICBCb2R5PzogTm9kZUpzUnVudGltZVN0cmVhbWluZ0Jsb2JQYXlsb2FkSW5wdXRUeXBlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0ZU11bHRpcGFydFVwbG9hZE91dHB1dCB7XG4gIC8qKlxuICAgKiA8cD5UaGUgVVJJIHRoYXQgaWRlbnRpZmllcyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QuPC9wPlxuICAgKi9cbiAgTG9jYXRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgbmFtZSBvZiB0aGUgYnVja2V0IHRoYXQgY29udGFpbnMgdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LiBEb2VzIG5vdCByZXR1cm4gdGhlIGFjY2VzcyBwb2ludFxuICAgKiAgICAgICAgICBBUk4gb3IgYWNjZXNzIHBvaW50IGFsaWFzIGlmIHVzZWQuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+QWNjZXNzIHBvaW50cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIEJ1Y2tldD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBvYmplY3Qga2V5IG9mIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdC48L3A+XG4gICAqL1xuICBLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5JZiB0aGUgb2JqZWN0IGV4cGlyYXRpb24gaXMgY29uZmlndXJlZCwgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGV4cGlyYXRpb24gZGF0ZVxuICAgKiAgICAgICAgICAgICAoPGNvZGU+ZXhwaXJ5LWRhdGU8L2NvZGU+KSBhbmQgcnVsZSBJRCAoPGNvZGU+cnVsZS1pZDwvY29kZT4pLiBUaGUgdmFsdWUgb2ZcbiAgICogICAgICAgICAgICAgPGNvZGU+cnVsZS1pZDwvY29kZT4gaXMgVVJMLWVuY29kZWQuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgRXhwaXJhdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPkVudGl0eSB0YWcgdGhhdCBpZGVudGlmaWVzIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCdzIGRhdGEuIE9iamVjdHMgd2l0aCBkaWZmZXJlbnRcbiAgICogICAgICAgICAgb2JqZWN0IGRhdGEgd2lsbCBoYXZlIGRpZmZlcmVudCBlbnRpdHkgdGFncy4gVGhlIGVudGl0eSB0YWcgaXMgYW4gb3BhcXVlIHN0cmluZy4gVGhlIGVudGl0eVxuICAgKiAgICAgICAgICB0YWcgbWF5IG9yIG1heSBub3QgYmUgYW4gTUQ1IGRpZ2VzdCBvZiB0aGUgb2JqZWN0IGRhdGEuIElmIHRoZSBlbnRpdHkgdGFnIGlzIG5vdCBhbiBNRDVcbiAgICogICAgICAgICAgZGlnZXN0IG9mIHRoZSBvYmplY3QgZGF0YSwgaXQgd2lsbCBjb250YWluIG9uZSBvciBtb3JlIG5vbmhleGFkZWNpbWFsIGNoYXJhY3RlcnMgYW5kL29yXG4gICAqICAgICAgICAgIHdpbGwgY29uc2lzdCBvZiBsZXNzIHRoYW4gMzIgb3IgbW9yZSB0aGFuIDMyIGhleGFkZWNpbWFsIGRpZ2l0cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXRcbiAgICogICAgICAgICAgaG93IHRoZSBlbnRpdHkgdGFnIGlzIGNhbGN1bGF0ZWQsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY2hlY2tpbmctb2JqZWN0LWludGVncml0eS5odG1sXCI+Q2hlY2tpbmcgb2JqZWN0XG4gICAqICAgICAgICAgICAgIGludGVncml0eTwvYT4gaW4gdGhlIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqL1xuICBFVGFnPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIGJhc2U2NC1lbmNvZGVkLCAzMi1iaXQgQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIG9iamVjdC4gVGhpcyB3aWxsIG9ubHkgYmUgcHJlc2VudCBpZiBpdCB3YXMgdXBsb2FkZWRcbiAgICogICAgIHdpdGggdGhlIG9iamVjdC4gV2hlbiB5b3UgdXNlIGFuIEFQSSBvcGVyYXRpb24gb24gYW4gb2JqZWN0IHRoYXQgd2FzIHVwbG9hZGVkIHVzaW5nIG11bHRpcGFydCB1cGxvYWRzLCB0aGlzIHZhbHVlIG1heSBub3QgYmUgYSBkaXJlY3QgY2hlY2tzdW0gdmFsdWUgb2YgdGhlIGZ1bGwgb2JqZWN0LiBJbnN0ZWFkLCBpdCdzIGEgY2FsY3VsYXRpb24gYmFzZWQgb24gdGhlIGNoZWNrc3VtIHZhbHVlcyBvZiBlYWNoIGluZGl2aWR1YWwgcGFydC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGNoZWNrc3VtcyBhcmUgY2FsY3VsYXRlZFxuICAgKiAgICAgd2l0aCBtdWx0aXBhcnQgdXBsb2Fkcywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9jaGVja2luZy1vYmplY3QtaW50ZWdyaXR5Lmh0bWwjbGFyZ2Utb2JqZWN0LWNoZWNrc3Vtc1wiPlxuICAgKiAgICAgQ2hlY2tpbmcgb2JqZWN0IGludGVncml0eTwvYT4gaW4gdGhlIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqL1xuICBDaGVja3N1bUNSQzMyPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIGJhc2U2NC1lbmNvZGVkLCAzMi1iaXQgQ1JDMzJDIGNoZWNrc3VtIG9mIHRoZSBvYmplY3QuIFRoaXMgd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgaXQgd2FzIHVwbG9hZGVkXG4gICAqICAgICB3aXRoIHRoZSBvYmplY3QuIFdoZW4geW91IHVzZSBhbiBBUEkgb3BlcmF0aW9uIG9uIGFuIG9iamVjdCB0aGF0IHdhcyB1cGxvYWRlZCB1c2luZyBtdWx0aXBhcnQgdXBsb2FkcywgdGhpcyB2YWx1ZSBtYXkgbm90IGJlIGEgZGlyZWN0IGNoZWNrc3VtIHZhbHVlIG9mIHRoZSBmdWxsIG9iamVjdC4gSW5zdGVhZCwgaXQncyBhIGNhbGN1bGF0aW9uIGJhc2VkIG9uIHRoZSBjaGVja3N1bSB2YWx1ZXMgb2YgZWFjaCBpbmRpdmlkdWFsIHBhcnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyBjaGVja3N1bXMgYXJlIGNhbGN1bGF0ZWRcbiAgICogICAgIHdpdGggbXVsdGlwYXJ0IHVwbG9hZHMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY2hlY2tpbmctb2JqZWN0LWludGVncml0eS5odG1sI2xhcmdlLW9iamVjdC1jaGVja3N1bXNcIj5cbiAgICogICAgIENoZWNraW5nIG9iamVjdCBpbnRlZ3JpdHk8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKi9cbiAgQ2hlY2tzdW1DUkMzMkM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgYmFzZTY0LWVuY29kZWQsIDE2MC1iaXQgU0hBLTEgZGlnZXN0IG9mIHRoZSBvYmplY3QuIFRoaXMgd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgaXQgd2FzIHVwbG9hZGVkXG4gICAqICAgICB3aXRoIHRoZSBvYmplY3QuIFdoZW4geW91IHVzZSB0aGUgQVBJIG9wZXJhdGlvbiBvbiBhbiBvYmplY3QgdGhhdCB3YXMgdXBsb2FkZWQgdXNpbmcgbXVsdGlwYXJ0IHVwbG9hZHMsIHRoaXMgdmFsdWUgbWF5IG5vdCBiZSBhIGRpcmVjdCBjaGVja3N1bSB2YWx1ZSBvZiB0aGUgZnVsbCBvYmplY3QuIEluc3RlYWQsIGl0J3MgYSBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgY2hlY2tzdW0gdmFsdWVzIG9mIGVhY2ggaW5kaXZpZHVhbCBwYXJ0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgY2hlY2tzdW1zIGFyZSBjYWxjdWxhdGVkXG4gICAqICAgICB3aXRoIG11bHRpcGFydCB1cGxvYWRzLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NoZWNraW5nLW9iamVjdC1pbnRlZ3JpdHkuaHRtbCNsYXJnZS1vYmplY3QtY2hlY2tzdW1zXCI+XG4gICAqICAgICBDaGVja2luZyBvYmplY3QgaW50ZWdyaXR5PC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICovXG4gIENoZWNrc3VtU0hBMT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBiYXNlNjQtZW5jb2RlZCwgMjU2LWJpdCBTSEEtMjU2IGRpZ2VzdCBvZiB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgb25seSBiZSBwcmVzZW50IGlmIGl0IHdhcyB1cGxvYWRlZFxuICAgKiAgICAgd2l0aCB0aGUgb2JqZWN0LiBXaGVuIHlvdSB1c2UgYW4gQVBJIG9wZXJhdGlvbiBvbiBhbiBvYmplY3QgdGhhdCB3YXMgdXBsb2FkZWQgdXNpbmcgbXVsdGlwYXJ0IHVwbG9hZHMsIHRoaXMgdmFsdWUgbWF5IG5vdCBiZSBhIGRpcmVjdCBjaGVja3N1bSB2YWx1ZSBvZiB0aGUgZnVsbCBvYmplY3QuIEluc3RlYWQsIGl0J3MgYSBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgY2hlY2tzdW0gdmFsdWVzIG9mIGVhY2ggaW5kaXZpZHVhbCBwYXJ0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgY2hlY2tzdW1zIGFyZSBjYWxjdWxhdGVkXG4gICAqICAgICB3aXRoIG11bHRpcGFydCB1cGxvYWRzLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NoZWNraW5nLW9iamVjdC1pbnRlZ3JpdHkuaHRtbCNsYXJnZS1vYmplY3QtY2hlY2tzdW1zXCI+XG4gICAqICAgICBDaGVja2luZyBvYmplY3QgaW50ZWdyaXR5PC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICovXG4gIENoZWNrc3VtU0hBMjU2Pzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gYWxnb3JpdGhtIHVzZWQgd2hlbiBzdG9yaW5nIHRoaXMgb2JqZWN0IGluIEFtYXpvbiBTMyAoZm9yIGV4YW1wbGUsXG4gICAqICAgICAgICAgICAgIDxjb2RlPkFFUzI1NjwvY29kZT4sIDxjb2RlPmF3czprbXM8L2NvZGU+KS48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5Gb3IgZGlyZWN0b3J5IGJ1Y2tldHMsIG9ubHkgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIEFtYXpvbiBTMyBtYW5hZ2VkIGtleXMgKFNTRS1TMykgKDxjb2RlPkFFUzI1NjwvY29kZT4pIGlzIHN1cHBvcnRlZC48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFNlcnZlclNpZGVFbmNyeXB0aW9uPzogU2VydmVyU2lkZUVuY3J5cHRpb247XG4gIC8qKlxuICAgKiA8cD5WZXJzaW9uIElEIG9mIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCwgaW4gY2FzZSB0aGUgYnVja2V0IGhhcyB2ZXJzaW9uaW5nIHR1cm5lZFxuICAgKiAgICAgICAgICBvbi48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBWZXJzaW9uSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5JZiBwcmVzZW50LCBpbmRpY2F0ZXMgdGhlIElEIG9mIHRoZSBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChLTVMpIHN5bW1ldHJpYyBlbmNyeXB0aW9uIGN1c3RvbWVyIG1hbmFnZWQga2V5XG4gICAqICAgICAgICAgIHRoYXQgd2FzIHVzZWQgZm9yIHRoZSBvYmplY3QuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgU1NFS01TS2V5SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5JbmRpY2F0ZXMgd2hldGhlciB0aGUgbXVsdGlwYXJ0IHVwbG9hZCB1c2VzIGFuIFMzIEJ1Y2tldCBLZXkgZm9yIHNlcnZlci1zaWRlIGVuY3J5cHRpb25cbiAgICogICAgICAgICAgd2l0aCBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChLTVMpIGtleXMgKFNTRS1LTVMpLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIEJ1Y2tldEtleUVuYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogPHA+SWYgcHJlc2VudCwgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3RlciB3YXMgc3VjY2Vzc2Z1bGx5IGNoYXJnZWQgZm9yIHRoZVxuICAgKiAgICAgICAgICByZXF1ZXN0LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFJlcXVlc3RDaGFyZ2VkPzogUmVxdWVzdENoYXJnZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRDb21tYW5kT3V0cHV0XG4gIGV4dGVuZHMgQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRPdXRwdXQsXG4gIE1ldGFkYXRhQmVhcmVyIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VJZGVudGlmaWVyIHtcbiAgLyoqXG4gICAqIDxwPlRoZSA8Y29kZT5zaGEyNTY8L2NvZGU+IGRpZ2VzdCBvZiB0aGUgaW1hZ2UgbWFuaWZlc3QuPC9wPlxuICAgKi9cbiAgaW1hZ2VEaWdlc3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgdGFnIHVzZWQgZm9yIHRoZSBpbWFnZS48L3A+XG4gICAqL1xuICBpbWFnZVRhZz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmliZUltYWdlc0ZpbHRlciB7XG4gIC8qKlxuICAgKiA8cD5UaGUgdGFnIHN0YXR1cyB3aXRoIHdoaWNoIHRvIGZpbHRlciB5b3VyIDxhPkRlc2NyaWJlSW1hZ2VzPC9hPiByZXN1bHRzLiBZb3VcbiAgICogICAgICAgICAgICAgY2FuIGZpbHRlciByZXN1bHRzIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgPGNvZGU+VEFHR0VEPC9jb2RlPiBvclxuICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+VU5UQUdHRUQ8L2NvZGU+LjwvcD5cbiAgICovXG4gIHRhZ1N0YXR1cz86IFRhZ1N0YXR1cztcbn1cblxuZXhwb3J0IGNvbnN0IFRhZ1N0YXR1cyA9IHtcbiAgQU5ZOiAnQU5ZJyxcbiAgVEFHR0VEOiAnVEFHR0VEJyxcbiAgVU5UQUdHRUQ6ICdVTlRBR0dFRCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYWdTdGF0dXMgPSAodHlwZW9mIFRhZ1N0YXR1cylba2V5b2YgdHlwZW9mIFRhZ1N0YXR1c107XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpYmVJbWFnZXNSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIDxwPlRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeSB0aGF0IGNvbnRhaW5zIHRoZSByZXBvc2l0b3J5IGluXG4gICAqICAgICAgICAgICAgIHdoaWNoIHRvIGRlc2NyaWJlIGltYWdlcy4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgcmVnaXN0cnksIHRoZSBkZWZhdWx0IHJlZ2lzdHJ5IGlzIGFzc3VtZWQuPC9wPlxuICAgKi9cbiAgcmVnaXN0cnlJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSByZXBvc2l0b3J5IHRoYXQgY29udGFpbnMgdGhlIGltYWdlcyB0byBkZXNjcmliZS48L3A+XG4gICAqL1xuICByZXBvc2l0b3J5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogPHA+VGhlIGxpc3Qgb2YgaW1hZ2UgSURzIGZvciB0aGUgcmVxdWVzdGVkIHJlcG9zaXRvcnkuPC9wPlxuICAgKi9cbiAgaW1hZ2VJZHM/OiBJbWFnZUlkZW50aWZpZXJbXTtcbiAgLyoqXG4gICAqIDxwPlRoZSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlIHJldHVybmVkIGZyb20gYSBwcmV2aW91cyBwYWdpbmF0ZWRcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPkRlc2NyaWJlSW1hZ2VzPC9jb2RlPiByZXF1ZXN0IHdoZXJlIDxjb2RlPm1heFJlc3VsdHM8L2NvZGU+IHdhcyB1c2VkIGFuZCB0aGVcbiAgICogICAgICAgICAgICAgcmVzdWx0cyBleGNlZWRlZCB0aGUgdmFsdWUgb2YgdGhhdCBwYXJhbWV0ZXIuIFBhZ2luYXRpb24gY29udGludWVzIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAgICogICAgICAgICAgICAgcHJldmlvdXMgcmVzdWx0cyB0aGF0IHJldHVybmVkIHRoZSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlLiBUaGlzIHZhbHVlIGlzXG4gICAqICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHJlc3VsdHMgdG8gcmV0dXJuLiBUaGlzIG9wdGlvbiBjYW5ub3QgYmVcbiAgICogICAgICAgICAgICAgdXNlZCB3aGVuIHlvdSBzcGVjaWZ5IGltYWdlcyB3aXRoIDxjb2RlPmltYWdlSWRzPC9jb2RlPi48L3A+XG4gICAqL1xuICBuZXh0VG9rZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwb3NpdG9yeSByZXN1bHRzIHJldHVybmVkIGJ5IDxjb2RlPkRlc2NyaWJlSW1hZ2VzPC9jb2RlPiBpblxuICAgKiAgICAgICAgICAgICBwYWdpbmF0ZWQgb3V0cHV0LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHVzZWQsIDxjb2RlPkRlc2NyaWJlSW1hZ2VzPC9jb2RlPiBvbmx5IHJldHVybnNcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPm1heFJlc3VsdHM8L2NvZGU+IHJlc3VsdHMgaW4gYSBzaW5nbGUgcGFnZSBhbG9uZyB3aXRoIGEgPGNvZGU+bmV4dFRva2VuPC9jb2RlPlxuICAgKiAgICAgICAgICAgICByZXNwb25zZSBlbGVtZW50LiBUaGUgcmVtYWluaW5nIHJlc3VsdHMgb2YgdGhlIGluaXRpYWwgcmVxdWVzdCBjYW4gYmUgc2VlbiBieSBzZW5kaW5nXG4gICAqICAgICAgICAgICAgIGFub3RoZXIgPGNvZGU+RGVzY3JpYmVJbWFnZXM8L2NvZGU+IHJlcXVlc3Qgd2l0aCB0aGUgcmV0dXJuZWQgPGNvZGU+bmV4dFRva2VuPC9jb2RlPlxuICAgKiAgICAgICAgICAgICB2YWx1ZS4gVGhpcyB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAxIGFuZCAxMDAwLiBJZiB0aGlzXG4gICAqICAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgdXNlZCwgdGhlbiA8Y29kZT5EZXNjcmliZUltYWdlczwvY29kZT4gcmV0dXJucyB1cCB0b1xuICAgKiAgICAgICAgICAgICAxMDAgcmVzdWx0cyBhbmQgYSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlLCBpZiBhcHBsaWNhYmxlLiBUaGlzXG4gICAqICAgICAgICAgICAgIG9wdGlvbiBjYW5ub3QgYmUgdXNlZCB3aGVuIHlvdSBzcGVjaWZ5IGltYWdlcyB3aXRoIDxjb2RlPmltYWdlSWRzPC9jb2RlPi48L3A+XG4gICAqL1xuICBtYXhSZXN1bHRzPzogbnVtYmVyO1xuICAvKipcbiAgICogPHA+VGhlIGZpbHRlciBrZXkgYW5kIHZhbHVlIHdpdGggd2hpY2ggdG8gZmlsdGVyIHlvdXIgPGNvZGU+RGVzY3JpYmVJbWFnZXM8L2NvZGU+XG4gICAqICAgICAgICAgICAgIHJlc3VsdHMuPC9wPlxuICAgKi9cbiAgZmlsdGVyPzogRGVzY3JpYmVJbWFnZXNGaWx0ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpYmVJbWFnZXNDb21tYW5kSW5wdXQgZXh0ZW5kcyBEZXNjcmliZUltYWdlc1JlcXVlc3Qge31cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmliZUltYWdlc0NvbW1hbmRPdXRwdXQgZXh0ZW5kcyBEZXNjcmliZUltYWdlc1Jlc3BvbnNlLCBNZXRhZGF0YUJlYXJlciB7fVxuXG5leHBvcnQgY29uc3QgU2NhblN0YXR1cyA9IHtcbiAgQUNUSVZFOiAnQUNUSVZFJyxcbiAgQ09NUExFVEU6ICdDT01QTEVURScsXG4gIEZBSUxFRDogJ0ZBSUxFRCcsXG4gIEZJTkRJTkdTX1VOQVZBSUxBQkxFOiAnRklORElOR1NfVU5BVkFJTEFCTEUnLFxuICBJTl9QUk9HUkVTUzogJ0lOX1BST0dSRVNTJyxcbiAgUEVORElORzogJ1BFTkRJTkcnLFxuICBTQ0FOX0VMSUdJQklMSVRZX0VYUElSRUQ6ICdTQ0FOX0VMSUdJQklMSVRZX0VYUElSRUQnLFxuICBVTlNVUFBPUlRFRF9JTUFHRTogJ1VOU1VQUE9SVEVEX0lNQUdFJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjYW5TdGF0dXMgPSAodHlwZW9mIFNjYW5TdGF0dXMpW2tleW9mIHR5cGVvZiBTY2FuU3RhdHVzXTtcblxuZXhwb3J0IGNvbnN0IEZpbmRpbmdTZXZlcml0eSA9IHtcbiAgQ1JJVElDQUw6ICdDUklUSUNBTCcsXG4gIEhJR0g6ICdISUdIJyxcbiAgSU5GT1JNQVRJT05BTDogJ0lORk9STUFUSU9OQUwnLFxuICBMT1c6ICdMT1cnLFxuICBNRURJVU06ICdNRURJVU0nLFxuICBVTkRFRklORUQ6ICdVTkRFRklORUQnLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKi9cbmV4cG9ydCB0eXBlIEZpbmRpbmdTZXZlcml0eSA9ICh0eXBlb2YgRmluZGluZ1NldmVyaXR5KVtrZXlvZiB0eXBlb2YgRmluZGluZ1NldmVyaXR5XTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZVNjYW5TdGF0dXMge1xuICAvKipcbiAgICogPHA+VGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gaW1hZ2Ugc2Nhbi48L3A+XG4gICAqL1xuICBzdGF0dXM/OiBTY2FuU3RhdHVzO1xuICAvKipcbiAgICogPHA+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZSBzY2FuIHN0YXR1cy48L3A+XG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZVNjYW5GaW5kaW5nc1N1bW1hcnkge1xuICAvKipcbiAgICogPHA+VGhlIHRpbWUgb2YgdGhlIGxhc3QgY29tcGxldGVkIGltYWdlIHNjYW4uPC9wPlxuICAgKi9cbiAgaW1hZ2VTY2FuQ29tcGxldGVkQXQ/OiBEYXRlO1xuICAvKipcbiAgICogPHA+VGhlIHRpbWUgd2hlbiB0aGUgdnVsbmVyYWJpbGl0eSBkYXRhIHdhcyBsYXN0IHNjYW5uZWQuPC9wPlxuICAgKi9cbiAgdnVsbmVyYWJpbGl0eVNvdXJjZVVwZGF0ZWRBdD86IERhdGU7XG4gIC8qKlxuICAgKiA8cD5UaGUgaW1hZ2UgdnVsbmVyYWJpbGl0eSBjb3VudHMsIHNvcnRlZCBieSBzZXZlcml0eS48L3A+XG4gICAqL1xuICBmaW5kaW5nU2V2ZXJpdHlDb3VudHM/OiBQYXJ0aWFsPFJlY29yZDxGaW5kaW5nU2V2ZXJpdHksIG51bWJlcj4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlRGV0YWlsIHtcbiAgLyoqXG4gICAqIDxwPlRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeSB0byB3aGljaCB0aGlzIGltYWdlIGJlbG9uZ3MuPC9wPlxuICAgKi9cbiAgcmVnaXN0cnlJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBuYW1lIG9mIHRoZSByZXBvc2l0b3J5IHRvIHdoaWNoIHRoaXMgaW1hZ2UgYmVsb25ncy48L3A+XG4gICAqL1xuICByZXBvc2l0b3J5TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSA8Y29kZT5zaGEyNTY8L2NvZGU+IGRpZ2VzdCBvZiB0aGUgaW1hZ2UgbWFuaWZlc3QuPC9wPlxuICAgKi9cbiAgaW1hZ2VEaWdlc3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgbGlzdCBvZiB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGltYWdlLjwvcD5cbiAgICovXG4gIGltYWdlVGFncz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogPHA+VGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgaW1hZ2UgaW4gdGhlIHJlcG9zaXRvcnkuPC9wPlxuICAgKiAgICAgICAgICA8cD5JZiB0aGUgaW1hZ2UgaXMgYSBtYW5pZmVzdCBsaXN0LCB0aGlzIHdpbGwgYmUgdGhlIG1heCBzaXplIG9mIGFsbCBtYW5pZmVzdHMgaW4gdGhlXG4gICAqICAgICAgICAgICAgIGxpc3QuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+QmVnaW5uaW5nIHdpdGggRG9ja2VyIHZlcnNpb24gMS45LCB0aGUgRG9ja2VyIGNsaWVudCBjb21wcmVzc2VzIGltYWdlIGxheWVyc1xuICAgKiAgICAgICAgICAgICAgICAgYmVmb3JlIHB1c2hpbmcgdGhlbSB0byBhIFYyIERvY2tlciByZWdpc3RyeS4gVGhlIG91dHB1dCBvZiB0aGUgPGNvZGU+ZG9ja2VyXG4gICAqICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzPC9jb2RlPiBjb21tYW5kIHNob3dzIHRoZSB1bmNvbXByZXNzZWQgaW1hZ2Ugc2l6ZSwgc28gaXQgbWF5IHJldHVybiBhXG4gICAqICAgICAgICAgICAgICAgICBsYXJnZXIgaW1hZ2Ugc2l6ZSB0aGFuIHRoZSBpbWFnZSBzaXplcyByZXR1cm5lZCBieSA8YT5EZXNjcmliZUltYWdlczwvYT4uPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBpbWFnZVNpemVJbkJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogPHA+VGhlIGRhdGUgYW5kIHRpbWUsIGV4cHJlc3NlZCBpbiBzdGFuZGFyZCBKYXZhU2NyaXB0IGRhdGUgZm9ybWF0LCBhdCB3aGljaCB0aGUgY3VycmVudFxuICAgKiAgICAgICAgICAgICBpbWFnZSB3YXMgcHVzaGVkIHRvIHRoZSByZXBvc2l0b3J5LiA8L3A+XG4gICAqL1xuICBpbWFnZVB1c2hlZEF0PzogRGF0ZTtcbiAgLyoqXG4gICAqIDxwPlRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzY2FuLjwvcD5cbiAgICovXG4gIGltYWdlU2NhblN0YXR1cz86IEltYWdlU2NhblN0YXR1cztcbiAgLyoqXG4gICAqIDxwPkEgc3VtbWFyeSBvZiB0aGUgbGFzdCBjb21wbGV0ZWQgaW1hZ2Ugc2Nhbi48L3A+XG4gICAqL1xuICBpbWFnZVNjYW5GaW5kaW5nc1N1bW1hcnk/OiBJbWFnZVNjYW5GaW5kaW5nc1N1bW1hcnk7XG4gIC8qKlxuICAgKiA8cD5UaGUgbWVkaWEgdHlwZSBvZiB0aGUgaW1hZ2UgbWFuaWZlc3QuPC9wPlxuICAgKi9cbiAgaW1hZ2VNYW5pZmVzdE1lZGlhVHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBhcnRpZmFjdCBtZWRpYSB0eXBlIG9mIHRoZSBpbWFnZS48L3A+XG4gICAqL1xuICBhcnRpZmFjdE1lZGlhVHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBkYXRlIGFuZCB0aW1lLCBleHByZXNzZWQgaW4gc3RhbmRhcmQgSmF2YVNjcmlwdCBkYXRlIGZvcm1hdCwgd2hlbiBBbWF6b24gRUNSIHJlY29yZGVkXG4gICAqICAgICAgICAgICAgIHRoZSBsYXN0IGltYWdlIHB1bGwuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+QW1hem9uIEVDUiByZWZyZXNoZXMgdGhlIGxhc3QgaW1hZ2UgcHVsbCB0aW1lc3RhbXAgYXQgbGVhc3Qgb25jZSBldmVyeSAyNCBob3Vycy4gRm9yXG4gICAqICAgICAgICAgICAgICAgICBleGFtcGxlLCBpZiB5b3UgcHVsbCBhbiBpbWFnZSBvbmNlIGEgZGF5IHRoZW4gdGhlIDxjb2RlPmxhc3RSZWNvcmRlZFB1bGxUaW1lPC9jb2RlPlxuICAgKiAgICAgICAgICAgICAgICAgdGltZXN0YW1wIHdpbGwgaW5kaWNhdGUgdGhlIGV4YWN0IHRpbWUgdGhhdCB0aGUgaW1hZ2Ugd2FzIGxhc3QgcHVsbGVkLiBIb3dldmVyLCBpZlxuICAgKiAgICAgICAgICAgICAgICAgeW91IHB1bGwgYW4gaW1hZ2Ugb25jZSBhbiBob3VyLCBiZWNhdXNlIEFtYXpvbiBFQ1IgcmVmcmVzaGVzIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmxhc3RSZWNvcmRlZFB1bGxUaW1lPC9jb2RlPiB0aW1lc3RhbXAgYXQgbGVhc3Qgb25jZSBldmVyeSAyNCBob3VycywgdGhlXG4gICAqICAgICAgICAgICAgICAgICByZXN1bHQgbWF5IG5vdCBiZSB0aGUgZXhhY3QgdGltZSB0aGF0IHRoZSBpbWFnZSB3YXMgbGFzdCBwdWxsZWQuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBsYXN0UmVjb3JkZWRQdWxsVGltZT86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpYmVJbWFnZXNSZXNwb25zZSB7XG4gIC8qKlxuICAgKiA8cD5BIGxpc3Qgb2YgPGE+SW1hZ2VEZXRhaWw8L2E+IG9iamVjdHMgdGhhdCBjb250YWluIGRhdGEgYWJvdXQgdGhlXG4gICAqICAgICAgICAgICAgIGltYWdlLjwvcD5cbiAgICovXG4gIGltYWdlRGV0YWlscz86IEltYWdlRGV0YWlsW107XG4gIC8qKlxuICAgKiA8cD5UaGUgPGNvZGU+bmV4dFRva2VuPC9jb2RlPiB2YWx1ZSB0byBpbmNsdWRlIGluIGEgZnV0dXJlIDxjb2RlPkRlc2NyaWJlSW1hZ2VzPC9jb2RlPlxuICAgKiAgICAgICAgICAgICByZXF1ZXN0LiBXaGVuIHRoZSByZXN1bHRzIG9mIGEgPGNvZGU+RGVzY3JpYmVJbWFnZXM8L2NvZGU+IHJlcXVlc3QgZXhjZWVkXG4gICAqICAgICAgICAgICAgICAgICA8Y29kZT5tYXhSZXN1bHRzPC9jb2RlPiwgdGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgbmV4dCBwYWdlIG9mXG4gICAqICAgICAgICAgICAgIHJlc3VsdHMuIFRoaXMgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSByZXN1bHRzIHRvXG4gICAqICAgICAgICAgICAgIHJldHVybi48L3A+XG4gICAqL1xuICBuZXh0VG9rZW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpYmVSZXBvc2l0b3JpZXNSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIDxwPlRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeSB0aGF0IGNvbnRhaW5zIHRoZSByZXBvc2l0b3JpZXMgdG8gYmVcbiAgICogICAgICAgICAgICAgZGVzY3JpYmVkLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSByZWdpc3RyeSwgdGhlIGRlZmF1bHQgcmVnaXN0cnkgaXMgYXNzdW1lZC48L3A+XG4gICAqL1xuICByZWdpc3RyeUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+QSBsaXN0IG9mIHJlcG9zaXRvcmllcyB0byBkZXNjcmliZS4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlbiBhbGxcbiAgICogICAgICAgICAgICAgcmVwb3NpdG9yaWVzIGluIGEgcmVnaXN0cnkgYXJlIGRlc2NyaWJlZC48L3A+XG4gICAqL1xuICByZXBvc2l0b3J5TmFtZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIDxwPlRoZSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlIHJldHVybmVkIGZyb20gYSBwcmV2aW91cyBwYWdpbmF0ZWRcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPkRlc2NyaWJlUmVwb3NpdG9yaWVzPC9jb2RlPiByZXF1ZXN0IHdoZXJlIDxjb2RlPm1heFJlc3VsdHM8L2NvZGU+IHdhcyB1c2VkIGFuZFxuICAgKiAgICAgICAgICAgICB0aGUgcmVzdWx0cyBleGNlZWRlZCB0aGUgdmFsdWUgb2YgdGhhdCBwYXJhbWV0ZXIuIFBhZ2luYXRpb24gY29udGludWVzIGZyb20gdGhlIGVuZCBvZlxuICAgKiAgICAgICAgICAgICB0aGUgcHJldmlvdXMgcmVzdWx0cyB0aGF0IHJldHVybmVkIHRoZSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlLiBUaGlzIHZhbHVlIGlzXG4gICAqICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHJlc3VsdHMgdG8gcmV0dXJuLiBUaGlzIG9wdGlvbiBjYW5ub3QgYmVcbiAgICogICAgICAgICAgICAgdXNlZCB3aGVuIHlvdSBzcGVjaWZ5IHJlcG9zaXRvcmllcyB3aXRoIDxjb2RlPnJlcG9zaXRvcnlOYW1lczwvY29kZT4uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyB0b2tlbiBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBvcGFxdWUgaWRlbnRpZmllciB0aGF0IGlzIG9ubHkgdXNlZCB0b1xuICAgKiAgICAgICAgICAgICAgICAgcmV0cmlldmUgdGhlIG5leHQgaXRlbXMgaW4gYSBsaXN0IGFuZCBub3QgZm9yIG90aGVyIHByb2dyYW1tYXRpYyBwdXJwb3Nlcy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIG5leHRUb2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiByZXBvc2l0b3J5IHJlc3VsdHMgcmV0dXJuZWQgYnkgPGNvZGU+RGVzY3JpYmVSZXBvc2l0b3JpZXM8L2NvZGU+XG4gICAqICAgICAgICAgICAgIGluIHBhZ2luYXRlZCBvdXRwdXQuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCwgPGNvZGU+RGVzY3JpYmVSZXBvc2l0b3JpZXM8L2NvZGU+IG9ubHlcbiAgICogICAgICAgICAgICAgcmV0dXJucyA8Y29kZT5tYXhSZXN1bHRzPC9jb2RlPiByZXN1bHRzIGluIGEgc2luZ2xlIHBhZ2UgYWxvbmcgd2l0aCBhXG4gICAqICAgICAgICAgICAgICAgICA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHJlc3BvbnNlIGVsZW1lbnQuIFRoZSByZW1haW5pbmcgcmVzdWx0cyBvZiB0aGUgaW5pdGlhbFxuICAgKiAgICAgICAgICAgICByZXF1ZXN0IGNhbiBiZSBzZWVuIGJ5IHNlbmRpbmcgYW5vdGhlciA8Y29kZT5EZXNjcmliZVJlcG9zaXRvcmllczwvY29kZT4gcmVxdWVzdCB3aXRoXG4gICAqICAgICAgICAgICAgIHRoZSByZXR1cm5lZCA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlLiBUaGlzIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDFcbiAgICogICAgICAgICAgICAgYW5kIDEwMDAuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLCB0aGVuXG4gICAqICAgICAgICAgICAgICAgICA8Y29kZT5EZXNjcmliZVJlcG9zaXRvcmllczwvY29kZT4gcmV0dXJucyB1cCB0byAxMDAgcmVzdWx0cyBhbmQgYVxuICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+bmV4dFRva2VuPC9jb2RlPiB2YWx1ZSwgaWYgYXBwbGljYWJsZS4gVGhpcyBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2hlbiB5b3VcbiAgICogICAgICAgICAgICAgc3BlY2lmeSByZXBvc2l0b3JpZXMgd2l0aCA8Y29kZT5yZXBvc2l0b3J5TmFtZXM8L2NvZGU+LjwvcD5cbiAgICovXG4gIG1heFJlc3VsdHM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpYmVSZXBvc2l0b3JpZXNDb21tYW5kSW5wdXQgZXh0ZW5kcyBEZXNjcmliZVJlcG9zaXRvcmllc1JlcXVlc3Qge31cblxuZXhwb3J0IGNvbnN0IEltYWdlVGFnTXV0YWJpbGl0eSA9IHtcbiAgSU1NVVRBQkxFOiAnSU1NVVRBQkxFJyxcbiAgTVVUQUJMRTogJ01VVEFCTEUnLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKi9cbmV4cG9ydCB0eXBlIEltYWdlVGFnTXV0YWJpbGl0eSA9ICh0eXBlb2YgSW1hZ2VUYWdNdXRhYmlsaXR5KVtrZXlvZiB0eXBlb2YgSW1hZ2VUYWdNdXRhYmlsaXR5XTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiA8cD5UaGUgc2V0dGluZyB0aGF0IGRldGVybWluZXMgd2hldGhlciBpbWFnZXMgYXJlIHNjYW5uZWQgYWZ0ZXIgYmVpbmcgcHVzaGVkIHRvIGFcbiAgICogICAgICAgICAgICAgcmVwb3NpdG9yeS4gSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBpbWFnZXMgd2lsbCBiZSBzY2FubmVkIGFmdGVyIGJlaW5nIHB1c2hlZC4gSWZcbiAgICogICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgaXQgd2lsbCBkZWZhdWx0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgaW1hZ2VzIHdpbGxcbiAgICogICAgICAgICAgICAgbm90IGJlIHNjYW5uZWQgdW5sZXNzIGEgc2NhbiBpcyBtYW51YWxseSBzdGFydGVkIHdpdGggdGhlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNSL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0SW1hZ2VTY2FuLmh0bWxcIj5BUElfU3RhcnRJbWFnZVNjYW48L2E+IEFQSS48L3A+XG4gICAqL1xuICBzY2FuT25QdXNoPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEVuY3J5cHRpb25UeXBlID0ge1xuICBBRVMyNTY6ICdBRVMyNTYnLFxuICBLTVM6ICdLTVMnLFxuICBLTVNfRFNTRTogJ0tNU19EU1NFJyxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICovXG5leHBvcnQgdHlwZSBFbmNyeXB0aW9uVHlwZSA9ICh0eXBlb2YgRW5jcnlwdGlvblR5cGUpW2tleW9mIHR5cGVvZiBFbmNyeXB0aW9uVHlwZV07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogPHA+VGhlIGVuY3J5cHRpb24gdHlwZSB0byB1c2UuPC9wPlxuICAgKiAgICAgICAgICA8cD5JZiB5b3UgdXNlIHRoZSA8Y29kZT5LTVM8L2NvZGU+IGVuY3J5cHRpb24gdHlwZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXBvc2l0b3J5IHdpbGxcbiAgICogICAgICAgICAgICAgYmUgZW5jcnlwdGVkIHVzaW5nIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIGtleSBzdG9yZWQgaW4gS01TLiBXaGVuIHlvdVxuICAgKiAgICAgICAgICAgICB1c2UgS01TIHRvIGVuY3J5cHQgeW91ciBkYXRhLCB5b3UgY2FuIGVpdGhlciB1c2UgdGhlIGRlZmF1bHQgQW1hem9uIFdlYiBTZXJ2aWNlcyBtYW5hZ2VkIEtNUyBrZXlcbiAgICogICAgICAgICAgICAgZm9yIEFtYXpvbiBFQ1IsIG9yIHNwZWNpZnkgeW91ciBvd24gS01TIGtleSwgd2hpY2ggeW91IGFscmVhZHkgY3JlYXRlZC48L3A+XG4gICAqICAgICAgICAgIDxwPklmIHlvdSB1c2UgdGhlIDxjb2RlPktNU19EU1NFPC9jb2RlPiBlbmNyeXB0aW9uIHR5cGUsIHRoZSBjb250ZW50cyBvZiB0aGUgcmVwb3NpdG9yeVxuICAgKiAgICAgICAgICAgICB3aWxsIGJlIGVuY3J5cHRlZCB3aXRoIHR3byBsYXllcnMgb2YgZW5jcnlwdGlvbiB1c2luZyBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggdGhlXG4gICAqICAgICAgICAgICAgIEtNUyBNYW5hZ2VtZW50IFNlcnZpY2Uga2V5IHN0b3JlZCBpbiBLTVMuIFNpbWlsYXIgdG8gdGhlIDxjb2RlPktNUzwvY29kZT4gZW5jcnlwdGlvbiB0eXBlLCB5b3VcbiAgICogICAgICAgICAgICAgY2FuIGVpdGhlciB1c2UgdGhlIGRlZmF1bHQgQW1hem9uIFdlYiBTZXJ2aWNlcyBtYW5hZ2VkIEtNUyBrZXkgZm9yIEFtYXpvbiBFQ1IsIG9yIHNwZWNpZnkgeW91ciBvd24gS01TXG4gICAqICAgICAgICAgICAgIGtleSwgd2hpY2ggeW91J3ZlIGFscmVhZHkgY3JlYXRlZC4gPC9wPlxuICAgKiAgICAgICAgICA8cD5JZiB5b3UgdXNlIHRoZSA8Y29kZT5BRVMyNTY8L2NvZGU+IGVuY3J5cHRpb24gdHlwZSwgQW1hem9uIEVDUiB1c2VzIHNlcnZlci1zaWRlIGVuY3J5cHRpb25cbiAgICogICAgICAgICAgICAgd2l0aCBBbWF6b24gUzMtbWFuYWdlZCBlbmNyeXB0aW9uIGtleXMgd2hpY2ggZW5jcnlwdHMgdGhlIGltYWdlcyBpbiB0aGUgcmVwb3NpdG9yeSB1c2luZyBhblxuICAgKiAgICAgICAgICAgICBBRVMyNTYgZW5jcnlwdGlvbiBhbGdvcml0aG0uPC9wPlxuICAgKiAgICAgICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNSL2xhdGVzdC91c2VyZ3VpZGUvZW5jcnlwdGlvbi1hdC1yZXN0Lmh0bWxcIj5BbWF6b24gRUNSIGVuY3J5cHRpb24gYXRcbiAgICogICAgICAgICAgICAgcmVzdDwvYT4gaW4gdGhlIDxpPkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBSZWdpc3RyeSBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqL1xuICBlbmNyeXB0aW9uVHlwZTogRW5jcnlwdGlvblR5cGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIDxwPklmIHlvdSB1c2UgdGhlIDxjb2RlPktNUzwvY29kZT4gZW5jcnlwdGlvbiB0eXBlLCBzcGVjaWZ5IHRoZSBLTVMga2V5IHRvIHVzZSBmb3JcbiAgICogICAgICAgICAgICAgZW5jcnlwdGlvbi4gVGhlIGFsaWFzLCBrZXkgSUQsIG9yIGZ1bGwgQVJOIG9mIHRoZSBLTVMga2V5IGNhbiBiZSBzcGVjaWZpZWQuIFRoZSBrZXlcbiAgICogICAgICAgICAgICAgbXVzdCBleGlzdCBpbiB0aGUgc2FtZSBSZWdpb24gYXMgdGhlIHJlcG9zaXRvcnkuIElmIG5vIGtleSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0XG4gICAqICAgICAgICAgICAgIEFtYXpvbiBXZWIgU2VydmljZXMgbWFuYWdlZCBLTVMga2V5IGZvciBBbWF6b24gRUNSIHdpbGwgYmUgdXNlZC48L3A+XG4gICAqL1xuICBrbXNLZXk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3NpdG9yeSB7XG4gIC8qKlxuICAgKiA8cD5UaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgdGhhdCBpZGVudGlmaWVzIHRoZSByZXBvc2l0b3J5LiBUaGUgQVJOIGNvbnRhaW5zIHRoZSA8Y29kZT5hcm46YXdzOmVjcjwvY29kZT4gbmFtZXNwYWNlLCBmb2xsb3dlZCBieSB0aGUgcmVnaW9uIG9mIHRoZVxuICAgKiAgICAgcmVwb3NpdG9yeSwgQW1hem9uIFdlYiBTZXJ2aWNlcyBhY2NvdW50IElEIG9mIHRoZSByZXBvc2l0b3J5IG93bmVyLCByZXBvc2l0b3J5IG5hbWVzcGFjZSwgYW5kIHJlcG9zaXRvcnkgbmFtZS5cbiAgICogICAgIEZvciBleGFtcGxlLCA8Y29kZT5hcm46YXdzOmVjcjpyZWdpb246MDEyMzQ1Njc4OTEwOnJlcG9zaXRvcnktbmFtZXNwYWNlL3JlcG9zaXRvcnktbmFtZTwvY29kZT4uPC9wPlxuICAgKi9cbiAgcmVwb3NpdG9yeUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogPHA+VGhlIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdHJ5IHRoYXQgY29udGFpbnMgdGhlIHJlcG9zaXRvcnkuPC9wPlxuICAgKi9cbiAgcmVnaXN0cnlJZD86IHN0cmluZztcblxuICAvKipcbiAgICogPHA+VGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnkuPC9wPlxuICAgKi9cbiAgcmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIDxwPlRoZSBVUkkgZm9yIHRoZSByZXBvc2l0b3J5LiBZb3UgY2FuIHVzZSB0aGlzIFVSSSBmb3IgY29udGFpbmVyIGltYWdlIDxjb2RlPnB1c2g8L2NvZGU+XG4gICAqICAgICAgICAgICAgIGFuZCA8Y29kZT5wdWxsPC9jb2RlPiBvcGVyYXRpb25zLjwvcD5cbiAgICovXG4gIHJlcG9zaXRvcnlVcmk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIDxwPlRoZSBkYXRlIGFuZCB0aW1lLCBpbiBKYXZhU2NyaXB0IGRhdGUgZm9ybWF0LCB3aGVuIHRoZSByZXBvc2l0b3J5IHdhcyBjcmVhdGVkLjwvcD5cbiAgICovXG4gIGNyZWF0ZWRBdD86IERhdGU7XG5cbiAgLyoqXG4gICAqIDxwPlRoZSB0YWcgbXV0YWJpbGl0eSBzZXR0aW5nIGZvciB0aGUgcmVwb3NpdG9yeS48L3A+XG4gICAqL1xuICBpbWFnZVRhZ011dGFiaWxpdHk/OiBJbWFnZVRhZ011dGFiaWxpdHk7XG5cbiAgLyoqXG4gICAqIDxwPlRoZSBpbWFnZSBzY2FubmluZyBjb25maWd1cmF0aW9uIGZvciBhIHJlcG9zaXRvcnkuPC9wPlxuICAgKi9cbiAgaW1hZ2VTY2FubmluZ0NvbmZpZ3VyYXRpb24/OiBJbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogPHA+VGhlIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIHJlcG9zaXRvcnkuIFRoaXMgZGV0ZXJtaW5lcyBob3cgdGhlIGNvbnRlbnRzIG9mXG4gICAqICAgICAgICAgICAgIHlvdXIgcmVwb3NpdG9yeSBhcmUgZW5jcnlwdGVkIGF0IHJlc3QuPC9wPlxuICAgKi9cbiAgZW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24/OiBFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmliZVJlcG9zaXRvcmllc1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIDxwPkEgbGlzdCBvZiByZXBvc2l0b3J5IG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB2YWxpZCByZXBvc2l0b3JpZXMuPC9wPlxuICAgKi9cbiAgcmVwb3NpdG9yaWVzPzogUmVwb3NpdG9yeVtdO1xuICAvKipcbiAgICogPHA+VGhlIDxjb2RlPm5leHRUb2tlbjwvY29kZT4gdmFsdWUgdG8gaW5jbHVkZSBpbiBhIGZ1dHVyZVxuICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+RGVzY3JpYmVSZXBvc2l0b3JpZXM8L2NvZGU+IHJlcXVlc3QuIFdoZW4gdGhlIHJlc3VsdHMgb2YgYVxuICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+RGVzY3JpYmVSZXBvc2l0b3JpZXM8L2NvZGU+IHJlcXVlc3QgZXhjZWVkIDxjb2RlPm1heFJlc3VsdHM8L2NvZGU+LCB0aGlzIHZhbHVlXG4gICAqICAgICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBuZXh0IHBhZ2Ugb2YgcmVzdWx0cy4gVGhpcyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuXG4gICAqICAgICAgICAgICAgIHRoZXJlIGFyZSBubyBtb3JlIHJlc3VsdHMgdG8gcmV0dXJuLjwvcD5cbiAgICovXG4gIG5leHRUb2tlbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmliZVJlcG9zaXRvcmllc0NvbW1hbmRPdXRwdXRcbiAgZXh0ZW5kcyBEZXNjcmliZVJlcG9zaXRvcmllc1Jlc3BvbnNlLFxuICBNZXRhZGF0YUJlYXJlciB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEF1dGhvcml6YXRpb25Ub2tlblJlcXVlc3Qge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICpcbiAgICogPHA+QSBsaXN0IG9mIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudCBJRHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyaWVzIGZvciB3aGljaCB0byBnZXRcbiAgICogICAgICAgICAgICAgQXV0aG9yaXphdGlvbkRhdGEgb2JqZWN0cy4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgcmVnaXN0cnksIHRoZSBkZWZhdWx0IHJlZ2lzdHJ5IGlzIGFzc3VtZWQuPC9wPlxuICAgKi9cbiAgcmVnaXN0cnlJZHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRBdXRob3JpemF0aW9uVG9rZW5Db21tYW5kSW5wdXQgZXh0ZW5kcyBHZXRBdXRob3JpemF0aW9uVG9rZW5SZXF1ZXN0IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aG9yaXphdGlvbkRhdGEge1xuICAvKipcbiAgICogPHA+QSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcgdGhhdCBjb250YWlucyBhdXRob3JpemF0aW9uIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgQW1hem9uIEVDUlxuICAgKiAgICAgICAgICAgICByZWdpc3RyeS4gV2hlbiB0aGUgc3RyaW5nIGlzIGRlY29kZWQsIGl0IGlzIHByZXNlbnRlZCBpbiB0aGUgZm9ybWF0XG4gICAqICAgICAgICAgICAgICAgICA8Y29kZT51c2VyOnBhc3N3b3JkPC9jb2RlPiBmb3IgcHJpdmF0ZSByZWdpc3RyeSBhdXRoZW50aWNhdGlvbiB1c2luZyA8Y29kZT5kb2NrZXJcbiAgICogICAgICAgICAgICAgICAgIGxvZ2luPC9jb2RlPi48L3A+XG4gICAqL1xuICBhdXRob3JpemF0aW9uVG9rZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgVW5peCB0aW1lIGluIHNlY29uZHMgYW5kIG1pbGxpc2Vjb25kcyB3aGVuIHRoZSBhdXRob3JpemF0aW9uIHRva2VuIGV4cGlyZXMuXG4gICAqICAgICAgICAgICAgIEF1dGhvcml6YXRpb24gdG9rZW5zIGFyZSB2YWxpZCBmb3IgMTIgaG91cnMuPC9wPlxuICAgKi9cbiAgZXhwaXJlc0F0PzogRGF0ZTtcbiAgLyoqXG4gICAqIDxwPlRoZSByZWdpc3RyeSBVUkwgdG8gdXNlIGZvciB0aGlzIGF1dGhvcml6YXRpb24gdG9rZW4gaW4gYSA8Y29kZT5kb2NrZXIgbG9naW48L2NvZGU+XG4gICAqICAgICAgICAgICAgIGNvbW1hbmQuIFRoZSBBbWF6b24gRUNSIHJlZ2lzdHJ5IFVSTCBmb3JtYXQgaXNcbiAgICogICAgICAgICA8Y29kZT5odHRwczovL2F3c19hY2NvdW50X2lkLmRrci5lY3IucmVnaW9uLmFtYXpvbmF3cy5jb208L2NvZGU+LiBGb3IgZXhhbXBsZSxcbiAgICogICAgICAgICA8Y29kZT5odHRwczovLzAxMjM0NTY3ODkxMC5ka3IuZWNyLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tPC9jb2RlPi4uIDwvcD5cbiAgICovXG4gIHByb3h5RW5kcG9pbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXV0aG9yaXphdGlvblRva2VuUmVzcG9uc2Uge1xuICAvKipcbiAgICogPHA+QSBsaXN0IG9mIGF1dGhvcml6YXRpb24gdG9rZW4gZGF0YSBvYmplY3RzIHRoYXQgY29ycmVzcG9uZCB0byB0aGVcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPnJlZ2lzdHJ5SWRzPC9jb2RlPiB2YWx1ZXMgaW4gdGhlIHJlcXVlc3QuPC9wPlxuICAgKi9cbiAgYXV0aG9yaXphdGlvbkRhdGE/OiBBdXRob3JpemF0aW9uRGF0YVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEF1dGhvcml6YXRpb25Ub2tlbkNvbW1hbmRPdXRwdXRcbiAgZXh0ZW5kcyBHZXRBdXRob3JpemF0aW9uVG9rZW5SZXNwb25zZSxcbiAgTWV0YWRhdGFCZWFyZXIge31cblxuZXhwb3J0IGludGVyZmFjZSBHZXRTZWNyZXRWYWx1ZVJlcXVlc3Qge1xuICAvKipcbiAgICogPHA+VGhlIEFSTiBvciBuYW1lIG9mIHRoZSBzZWNyZXQgdG8gcmV0cmlldmUuIFRvIHJldHJpZXZlIGEgc2VjcmV0IGZyb20gYW5vdGhlciBhY2NvdW50LCB5b3UgbXVzdCB1c2UgYW4gQVJOLjwvcD5cbiAgICogICAgICAgICAgPHA+Rm9yIGFuIEFSTiwgd2UgcmVjb21tZW5kIHRoYXQgeW91IHNwZWNpZnkgYSBjb21wbGV0ZSBBUk4gcmF0aGVyXG4gICAqICAgICAgIHRoYW4gYSBwYXJ0aWFsIEFSTi4gU2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjcmV0c21hbmFnZXIvbGF0ZXN0L3VzZXJndWlkZS90cm91Ymxlc2hvb3QuaHRtbCNBUk5fc2VjcmV0bmFtZWh5cGhlblwiPkZpbmRpbmcgYSBzZWNyZXQgZnJvbSBhIHBhcnRpYWwgQVJOPC9hPi48L3A+XG4gICAqL1xuICBTZWNyZXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogPHA+VGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBzZWNyZXQgdG8gcmV0cmlldmUuIElmXG4gICAqICAgICAgIHlvdSBpbmNsdWRlIGJvdGggdGhpcyBwYXJhbWV0ZXIgYW5kIDxjb2RlPlZlcnNpb25TdGFnZTwvY29kZT4sIHRoZSB0d28gcGFyYW1ldGVycyBtdXN0IHJlZmVyXG4gICAqICAgICAgIHRvIHRoZSBzYW1lIHNlY3JldCB2ZXJzaW9uLiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBlaXRoZXIgYSA8Y29kZT5WZXJzaW9uU3RhZ2U8L2NvZGU+IG9yXG4gICAqICAgICAgICAgPGNvZGU+VmVyc2lvbklkPC9jb2RlPiwgdGhlbiBTZWNyZXRzIE1hbmFnZXIgcmV0dXJucyB0aGUgPGNvZGU+QVdTQ1VSUkVOVDwvY29kZT4gdmVyc2lvbi48L3A+XG4gICAqICAgICAgICAgIDxwPlRoaXMgdmFsdWUgaXMgdHlwaWNhbGx5IGEgPGEgaHJlZj1cImh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL1VuaXZlcnNhbGx5X3VuaXF1ZV9pZGVudGlmaWVyXCI+VVVJRC10eXBlPC9hPiB2YWx1ZSB3aXRoXG4gICAqICAgICAgIDMyIGhleGFkZWNpbWFsIGRpZ2l0cy48L3A+XG4gICAqL1xuICBWZXJzaW9uSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgc3RhZ2luZyBsYWJlbCBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgc2VjcmV0IHRvIHJldHJpZXZlLiA8L3A+XG4gICAqICAgICAgICAgIDxwPlNlY3JldHMgTWFuYWdlciB1c2VzIHN0YWdpbmcgbGFiZWxzIHRvIGtlZXAgdHJhY2sgb2YgZGlmZmVyZW50IHZlcnNpb25zIGR1cmluZyB0aGUgcm90YXRpb24gcHJvY2Vzcy5cbiAgICogICAgICAgSWYgeW91IGluY2x1ZGUgYm90aCB0aGlzIHBhcmFtZXRlciBhbmQgPGNvZGU+VmVyc2lvbklkPC9jb2RlPiwgdGhlIHR3byBwYXJhbWV0ZXJzIG11c3QgcmVmZXJcbiAgICogICAgICAgdG8gdGhlIHNhbWUgc2VjcmV0IHZlcnNpb24uIElmIHlvdSBkb24ndCBzcGVjaWZ5IGVpdGhlciBhIDxjb2RlPlZlcnNpb25TdGFnZTwvY29kZT4gb3JcbiAgICogICAgICAgPGNvZGU+VmVyc2lvbklkPC9jb2RlPiwgU2VjcmV0cyBNYW5hZ2VyIHJldHVybnMgdGhlIDxjb2RlPkFXU0NVUlJFTlQ8L2NvZGU+IHZlcnNpb24uPC9wPlxuICAgKi9cbiAgVmVyc2lvblN0YWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFNlY3JldFZhbHVlQ29tbWFuZElucHV0IGV4dGVuZHMgR2V0U2VjcmV0VmFsdWVSZXF1ZXN0IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2VjcmV0VmFsdWVSZXNwb25zZSB7XG4gIC8qKlxuICAgKiA8cD5UaGUgQVJOIG9mIHRoZSBzZWNyZXQuPC9wPlxuICAgKi9cbiAgQVJOPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIGZyaWVuZGx5IG5hbWUgb2YgdGhlIHNlY3JldC48L3A+XG4gICAqL1xuICBOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgdmVyc2lvbiBvZiB0aGUgc2VjcmV0LjwvcD5cbiAgICovXG4gIFZlcnNpb25JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBkZWNyeXB0ZWQgc2VjcmV0IHZhbHVlLCBpZiB0aGUgc2VjcmV0IHZhbHVlIHdhcyBvcmlnaW5hbGx5IHByb3ZpZGVkIGFzXG4gICAqICAgICAgIGJpbmFyeSBkYXRhIGluIHRoZSBmb3JtIG9mIGEgYnl0ZSBhcnJheS4gV2hlbiB5b3UgcmV0cmlldmUgYSA8Y29kZT5TZWNyZXRCaW5hcnk8L2NvZGU+IHVzaW5nIHRoZSBIVFRQIEFQSSwgdGhlIFB5dGhvbiBTREssIG9yIHRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIENMSSwgdGhlIHZhbHVlIGlzIEJhc2U2NC1lbmNvZGVkLiBPdGhlcndpc2UsIGl0IGlzIG5vdCBlbmNvZGVkLjwvcD5cbiAgICogICAgICAgICAgPHA+SWYgdGhlIHNlY3JldCB3YXMgY3JlYXRlZCBieSB1c2luZyB0aGUgU2VjcmV0cyBNYW5hZ2VyIGNvbnNvbGUsIG9yIGlmIHRoZSBzZWNyZXQgdmFsdWUgd2FzXG4gICAqICAgICAgIG9yaWdpbmFsbHkgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIHRoZW4gdGhpcyBmaWVsZCBpcyBvbWl0dGVkLiBUaGUgc2VjcmV0IHZhbHVlIGFwcGVhcnMgaW5cbiAgICogICAgICAgPGNvZGU+U2VjcmV0U3RyaW5nPC9jb2RlPiBpbnN0ZWFkLjwvcD5cbiAgICogICAgICAgICAgPHA+U2Vuc2l0aXZlOiBUaGlzIGZpZWxkIGNvbnRhaW5zIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiwgc28gdGhlIHNlcnZpY2UgZG9lcyBub3QgaW5jbHVkZSBpdCBpbiBDbG91ZFRyYWlsIGxvZyBlbnRyaWVzLiBJZiB5b3UgY3JlYXRlIHlvdXIgb3duIGxvZyBlbnRyaWVzLCB5b3UgbXVzdCBhbHNvIGF2b2lkIGxvZ2dpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmllbGQuPC9wPlxuICAgKi9cbiAgU2VjcmV0QmluYXJ5PzogVWludDhBcnJheTtcbiAgLyoqXG4gICAqIDxwPlRoZSBkZWNyeXB0ZWQgc2VjcmV0IHZhbHVlLCBpZiB0aGUgc2VjcmV0IHZhbHVlIHdhcyBvcmlnaW5hbGx5IHByb3ZpZGVkIGFzIGEgc3RyaW5nIG9yXG4gICAqICAgICAgIHRocm91Z2ggdGhlIFNlY3JldHMgTWFuYWdlciBjb25zb2xlLjwvcD5cbiAgICogICAgICAgICAgPHA+SWYgdGhpcyBzZWNyZXQgd2FzIGNyZWF0ZWQgYnkgdXNpbmcgdGhlIGNvbnNvbGUsIHRoZW4gU2VjcmV0cyBNYW5hZ2VyIHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYXMgYVxuICAgKiAgICAgICBKU09OIHN0cnVjdHVyZSBvZiBrZXkvdmFsdWUgcGFpcnMuIDwvcD5cbiAgICogICAgICAgICAgPHA+U2Vuc2l0aXZlOiBUaGlzIGZpZWxkIGNvbnRhaW5zIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiwgc28gdGhlIHNlcnZpY2UgZG9lcyBub3QgaW5jbHVkZSBpdCBpbiBDbG91ZFRyYWlsIGxvZyBlbnRyaWVzLiBJZiB5b3UgY3JlYXRlIHlvdXIgb3duIGxvZyBlbnRyaWVzLCB5b3UgbXVzdCBhbHNvIGF2b2lkIGxvZ2dpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmllbGQuPC9wPlxuICAgKi9cbiAgU2VjcmV0U3RyaW5nPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+QSBsaXN0IG9mIGFsbCBvZiB0aGUgc3RhZ2luZyBsYWJlbHMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoaXMgdmVyc2lvbiBvZiB0aGVcbiAgICogICAgICAgc2VjcmV0LjwvcD5cbiAgICovXG4gIFZlcnNpb25TdGFnZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIDxwPlRoZSBkYXRlIGFuZCB0aW1lIHRoYXQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzZWNyZXQgd2FzIGNyZWF0ZWQuIElmIHlvdSBkb24ndCBzcGVjaWZ5XG4gICAqICAgICAgIHdoaWNoIHZlcnNpb24gaW4gPGNvZGU+VmVyc2lvbklkPC9jb2RlPiBvciA8Y29kZT5WZXJzaW9uU3RhZ2U8L2NvZGU+LCB0aGVuIFNlY3JldHMgTWFuYWdlciB1c2VzIHRoZVxuICAgKiAgICAgICA8Y29kZT5BV1NDVVJSRU5UPC9jb2RlPiB2ZXJzaW9uLjwvcD5cbiAgICovXG4gIENyZWF0ZWREYXRlPzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRTZWNyZXRWYWx1ZUNvbW1hbmRPdXRwdXQgZXh0ZW5kcyBHZXRTZWNyZXRWYWx1ZVJlc3BvbnNlLCBNZXRhZGF0YUJlYXJlciB7fVxuIl19
package/lib/aws.d.ts ADDED
@@ -0,0 +1,70 @@
1
+ import { AssumeRoleCommandInput } from '@aws-sdk/client-sts';
2
+ import { CompleteMultipartUploadCommandOutput, DescribeImagesCommandInput, DescribeImagesCommandOutput, DescribeRepositoriesCommandInput, DescribeRepositoriesCommandOutput, GetAuthorizationTokenCommandInput, GetAuthorizationTokenCommandOutput, GetBucketEncryptionCommandInput, GetBucketEncryptionCommandOutput, GetBucketLocationCommandInput, GetBucketLocationCommandOutput, GetSecretValueCommandInput, GetSecretValueCommandOutput, ListObjectsV2CommandInput, ListObjectsV2CommandOutput, PutObjectCommandInput } from './aws-types';
3
+ export type AssumeRoleAdditionalOptions = Partial<Omit<AssumeRoleCommandInput, 'ExternalId' | 'RoleArn'>>;
4
+ export interface IS3Client {
5
+ getBucketEncryption(input: GetBucketEncryptionCommandInput): Promise<GetBucketEncryptionCommandOutput>;
6
+ getBucketLocation(input: GetBucketLocationCommandInput): Promise<GetBucketLocationCommandOutput>;
7
+ listObjectsV2(input: ListObjectsV2CommandInput): Promise<ListObjectsV2CommandOutput>;
8
+ upload(input: PutObjectCommandInput): Promise<CompleteMultipartUploadCommandOutput>;
9
+ }
10
+ export interface IECRClient {
11
+ describeImages(input: DescribeImagesCommandInput): Promise<DescribeImagesCommandOutput>;
12
+ describeRepositories(input: DescribeRepositoriesCommandInput): Promise<DescribeRepositoriesCommandOutput>;
13
+ getAuthorizationToken(input?: GetAuthorizationTokenCommandInput): Promise<GetAuthorizationTokenCommandOutput>;
14
+ }
15
+ export interface ISecretsManagerClient {
16
+ getSecretValue(input: GetSecretValueCommandInput): Promise<GetSecretValueCommandOutput>;
17
+ }
18
+ /**
19
+ * AWS SDK operations required by Asset Publishing
20
+ */
21
+ export interface IAws {
22
+ discoverPartition(): Promise<string>;
23
+ discoverDefaultRegion(): Promise<string>;
24
+ discoverCurrentAccount(): Promise<Account>;
25
+ discoverTargetAccount(options: ClientOptions): Promise<Account>;
26
+ s3Client(options: ClientOptions): Promise<IS3Client>;
27
+ ecrClient(options: ClientOptions): Promise<IECRClient>;
28
+ secretsManagerClient(options: ClientOptions): Promise<ISecretsManagerClient>;
29
+ }
30
+ export interface ClientOptions {
31
+ region?: string;
32
+ assumeRoleArn?: string;
33
+ assumeRoleExternalId?: string;
34
+ assumeRoleAdditionalOptions?: AssumeRoleAdditionalOptions;
35
+ quiet?: boolean;
36
+ }
37
+ /**
38
+ * An AWS account
39
+ *
40
+ * An AWS account always exists in only one partition. Usually we don't care about
41
+ * the partition, but when we need to form ARNs we do.
42
+ */
43
+ export interface Account {
44
+ /**
45
+ * The account number
46
+ */
47
+ readonly accountId: string;
48
+ /**
49
+ * The partition ('aws' or 'aws-cn' or otherwise)
50
+ */
51
+ readonly partition: string;
52
+ }
53
+ /**
54
+ * AWS client using the AWS SDK for JS with no special configuration
55
+ */
56
+ export declare class DefaultAwsClient implements IAws {
57
+ private readonly profile?;
58
+ private account?;
59
+ private config;
60
+ constructor(profile?: string | undefined);
61
+ s3Client(options: ClientOptions): Promise<IS3Client>;
62
+ ecrClient(options: ClientOptions): Promise<IECRClient>;
63
+ secretsManagerClient(options: ClientOptions): Promise<ISecretsManagerClient>;
64
+ discoverPartition(): Promise<string>;
65
+ discoverDefaultRegion(): Promise<string>;
66
+ discoverCurrentAccount(): Promise<Account>;
67
+ discoverTargetAccount(options: ClientOptions): Promise<Account>;
68
+ private getAccount;
69
+ private awsOptions;
70
+ }
package/lib/aws.js ADDED
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultAwsClient = void 0;
4
+ const os = require("os");
5
+ const client_ecr_1 = require("@aws-sdk/client-ecr");
6
+ const client_s3_1 = require("@aws-sdk/client-s3");
7
+ const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
8
+ const client_sts_1 = require("@aws-sdk/client-sts");
9
+ const credential_providers_1 = require("@aws-sdk/credential-providers");
10
+ const lib_storage_1 = require("@aws-sdk/lib-storage");
11
+ const config_resolver_1 = require("@smithy/config-resolver");
12
+ const node_config_provider_1 = require("@smithy/node-config-provider");
13
+ const USER_AGENT = 'cdk-assets';
14
+ /**
15
+ * AWS client using the AWS SDK for JS with no special configuration
16
+ */
17
+ class DefaultAwsClient {
18
+ constructor(profile) {
19
+ this.profile = profile;
20
+ const clientConfig = {
21
+ customUserAgent: USER_AGENT,
22
+ };
23
+ this.config = {
24
+ clientConfig,
25
+ credentials: (0, credential_providers_1.fromNodeProviderChain)({
26
+ profile: this.profile,
27
+ clientConfig,
28
+ }),
29
+ };
30
+ }
31
+ async s3Client(options) {
32
+ const client = new client_s3_1.S3Client(await this.awsOptions(options));
33
+ return {
34
+ getBucketEncryption: (input) => client.send(new client_s3_1.GetBucketEncryptionCommand(input)),
35
+ getBucketLocation: (input) => client.send(new client_s3_1.GetBucketLocationCommand(input)),
36
+ listObjectsV2: (input) => client.send(new client_s3_1.ListObjectsV2Command(input)),
37
+ upload: (input) => {
38
+ const upload = new lib_storage_1.Upload({
39
+ client,
40
+ params: input,
41
+ });
42
+ return upload.done();
43
+ },
44
+ };
45
+ }
46
+ async ecrClient(options) {
47
+ const client = new client_ecr_1.ECRClient(await this.awsOptions(options));
48
+ return {
49
+ describeImages: (input) => client.send(new client_ecr_1.DescribeImagesCommand(input)),
50
+ describeRepositories: (input) => client.send(new client_ecr_1.DescribeRepositoriesCommand(input)),
51
+ getAuthorizationToken: (input) => client.send(new client_ecr_1.GetAuthorizationTokenCommand(input ?? {})),
52
+ };
53
+ }
54
+ async secretsManagerClient(options) {
55
+ const client = new client_secrets_manager_1.SecretsManagerClient(await this.awsOptions(options));
56
+ return {
57
+ getSecretValue: (input) => client.send(new client_secrets_manager_1.GetSecretValueCommand(input)),
58
+ };
59
+ }
60
+ async discoverPartition() {
61
+ return (await this.discoverCurrentAccount()).partition;
62
+ }
63
+ async discoverDefaultRegion() {
64
+ return (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS)() || 'us-east-1';
65
+ }
66
+ async discoverCurrentAccount() {
67
+ if (this.account === undefined) {
68
+ this.account = await this.getAccount();
69
+ }
70
+ return this.account;
71
+ }
72
+ async discoverTargetAccount(options) {
73
+ return this.getAccount(await this.awsOptions(options));
74
+ }
75
+ async getAccount(options) {
76
+ this.config.clientConfig = options ?? this.config.clientConfig;
77
+ const stsClient = new client_sts_1.STSClient(await this.awsOptions(options));
78
+ const command = new client_sts_1.GetCallerIdentityCommand();
79
+ const response = await stsClient.send(command);
80
+ if (!response.Account || !response.Arn) {
81
+ throw new Error(`Unrecognized response from STS: '${JSON.stringify(response)}'`);
82
+ }
83
+ return {
84
+ accountId: response.Account,
85
+ partition: response.Arn.split(':')[1],
86
+ };
87
+ }
88
+ async awsOptions(options) {
89
+ const config = this.config;
90
+ config.region = options?.region;
91
+ if (options) {
92
+ config.region = options.region;
93
+ if (options.assumeRoleArn) {
94
+ config.credentials = (0, credential_providers_1.fromTemporaryCredentials)({
95
+ params: {
96
+ RoleArn: options.assumeRoleArn,
97
+ ExternalId: options.assumeRoleExternalId,
98
+ RoleSessionName: `${USER_AGENT}-${safeUsername()}`,
99
+ TransitiveTagKeys: options.assumeRoleAdditionalOptions?.Tags
100
+ ? options.assumeRoleAdditionalOptions.Tags.map((t) => t.Key)
101
+ : undefined,
102
+ ...options.assumeRoleAdditionalOptions,
103
+ },
104
+ clientConfig: this.config.clientConfig,
105
+ });
106
+ }
107
+ }
108
+ return config;
109
+ }
110
+ }
111
+ exports.DefaultAwsClient = DefaultAwsClient;
112
+ /**
113
+ * Return the username with characters invalid for a RoleSessionName removed
114
+ *
115
+ * @see https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html#API_AssumeRole_RequestParameters
116
+ */
117
+ function safeUsername() {
118
+ try {
119
+ return os.userInfo().username.replace(/[^\w+=,.@-]/g, '@');
120
+ }
121
+ catch {
122
+ return 'noname';
123
+ }
124
+ }
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlCQUF5QjtBQUN6QixvREFLNkI7QUFDN0Isa0RBSzRCO0FBQzVCLDRFQUE4RjtBQUM5RixvREFLNkI7QUFDN0Isd0VBQWdHO0FBQ2hHLHNEQUE4QztBQUM5Qyw2REFHaUM7QUFDakMsdUVBQTBEO0FBc0UxRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUEwQmhDOztHQUVHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFJM0IsWUFBNkIsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUMzQyxNQUFNLFlBQVksR0FBb0I7WUFDcEMsZUFBZSxFQUFFLFVBQVU7U0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixZQUFZO1lBQ1osV0FBVyxFQUFFLElBQUEsNENBQXFCLEVBQUM7Z0JBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsWUFBWTthQUNiLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBc0I7UUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxvQkFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVELE9BQU87WUFDTCxtQkFBbUIsRUFBRSxDQUNuQixLQUFzQyxFQUNLLEVBQUUsQ0FDN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHNDQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BELGlCQUFpQixFQUFFLENBQ2pCLEtBQW9DLEVBQ0ssRUFBRSxDQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksb0NBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsYUFBYSxFQUFFLENBQUMsS0FBZ0MsRUFBdUMsRUFBRSxDQUN2RixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksZ0NBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxFQUFFLENBQUMsS0FBNEIsRUFBaUQsRUFBRTtnQkFDdEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxvQkFBTSxDQUFDO29CQUN4QixNQUFNO29CQUNOLE1BQU0sRUFBRSxLQUFLO2lCQUNkLENBQUMsQ0FBQztnQkFDSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQXNCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksc0JBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM3RCxPQUFPO1lBQ0wsY0FBYyxFQUFFLENBQUMsS0FBaUMsRUFBd0MsRUFBRSxDQUMxRixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksa0NBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0Msb0JBQW9CLEVBQUUsQ0FDcEIsS0FBdUMsRUFDSyxFQUFFLENBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSx3Q0FBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxxQkFBcUIsRUFBRSxDQUNyQixLQUF3QyxFQUNLLEVBQUUsQ0FDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHlDQUE0QixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztTQUM3RCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxPQUFzQjtRQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLDZDQUFvQixDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU87WUFDTCxjQUFjLEVBQUUsQ0FBQyxLQUFpQyxFQUF3QyxFQUFFLENBQzFGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSw4Q0FBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUI7UUFDNUIsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDekQsQ0FBQztJQUVNLEtBQUssQ0FBQyxxQkFBcUI7UUFDaEMsT0FBTyxJQUFBLGlDQUFVLEVBQUMsNENBQTBCLEVBQUUsaURBQStCLENBQUMsRUFBRSxJQUFJLFdBQVcsQ0FBQztJQUNsRyxDQUFDO0lBRU0sS0FBSyxDQUFDLHNCQUFzQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCLENBQUMsT0FBc0I7UUFDdkQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQXVCO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUMvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLHNCQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQ0FBd0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsT0FBTztZQUNMLFNBQVMsRUFBRSxRQUFRLENBQUMsT0FBUTtZQUM1QixTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUF1QjtRQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxFQUFFLE1BQU0sQ0FBQztRQUNoQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQy9CLElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMxQixNQUFNLENBQUMsV0FBVyxHQUFHLElBQUEsK0NBQXdCLEVBQUM7b0JBQzVDLE1BQU0sRUFBRTt3QkFDTixPQUFPLEVBQUUsT0FBTyxDQUFDLGFBQWE7d0JBQzlCLFVBQVUsRUFBRSxPQUFPLENBQUMsb0JBQW9CO3dCQUN4QyxlQUFlLEVBQUUsR0FBRyxVQUFVLElBQUksWUFBWSxFQUFFLEVBQUU7d0JBQ2xELGlCQUFpQixFQUFFLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxJQUFJOzRCQUMxRCxDQUFDLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFJLENBQUM7NEJBQzdELENBQUMsQ0FBQyxTQUFTO3dCQUNiLEdBQUcsT0FBTyxDQUFDLDJCQUEyQjtxQkFDdkM7b0JBQ0QsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWTtpQkFDdkMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUF4SEQsNENBd0hDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsWUFBWTtJQUNuQixJQUFJLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQge1xuICBEZXNjcmliZUltYWdlc0NvbW1hbmQsXG4gIERlc2NyaWJlUmVwb3NpdG9yaWVzQ29tbWFuZCxcbiAgRUNSQ2xpZW50LFxuICBHZXRBdXRob3JpemF0aW9uVG9rZW5Db21tYW5kLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNyJztcbmltcG9ydCB7XG4gIEdldEJ1Y2tldEVuY3J5cHRpb25Db21tYW5kLFxuICBHZXRCdWNrZXRMb2NhdGlvbkNvbW1hbmQsXG4gIExpc3RPYmplY3RzVjJDb21tYW5kLFxuICBTM0NsaWVudCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJztcbmltcG9ydCB7XG4gIEFzc3VtZVJvbGVDb21tYW5kSW5wdXQsXG4gIEdldENhbGxlcklkZW50aXR5Q29tbWFuZCxcbiAgU1RTQ2xpZW50LFxuICBTVFNDbGllbnRDb25maWcsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zdHMnO1xuaW1wb3J0IHsgZnJvbU5vZGVQcm92aWRlckNoYWluLCBmcm9tVGVtcG9yYXJ5Q3JlZGVudGlhbHMgfSBmcm9tICdAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVycyc7XG5pbXBvcnQgeyBVcGxvYWQgfSBmcm9tICdAYXdzLXNkay9saWItc3RvcmFnZSc7XG5pbXBvcnQge1xuICBOT0RFX1JFR0lPTl9DT05GSUdfRklMRV9PUFRJT05TLFxuICBOT0RFX1JFR0lPTl9DT05GSUdfT1BUSU9OUyxcbn0gZnJvbSAnQHNtaXRoeS9jb25maWctcmVzb2x2ZXInO1xuaW1wb3J0IHsgbG9hZENvbmZpZyB9IGZyb20gJ0BzbWl0aHkvbm9kZS1jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHtcbiAgQXdzQ3JlZGVudGlhbElkZW50aXR5UHJvdmlkZXIsXG4gIENvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkQ29tbWFuZE91dHB1dCxcbiAgRGVzY3JpYmVJbWFnZXNDb21tYW5kSW5wdXQsXG4gIERlc2NyaWJlSW1hZ2VzQ29tbWFuZE91dHB1dCxcbiAgRGVzY3JpYmVSZXBvc2l0b3JpZXNDb21tYW5kSW5wdXQsXG4gIERlc2NyaWJlUmVwb3NpdG9yaWVzQ29tbWFuZE91dHB1dCxcbiAgR2V0QXV0aG9yaXphdGlvblRva2VuQ29tbWFuZElucHV0LFxuICBHZXRBdXRob3JpemF0aW9uVG9rZW5Db21tYW5kT3V0cHV0LFxuICBHZXRCdWNrZXRFbmNyeXB0aW9uQ29tbWFuZElucHV0LFxuICBHZXRCdWNrZXRFbmNyeXB0aW9uQ29tbWFuZE91dHB1dCxcbiAgR2V0QnVja2V0TG9jYXRpb25Db21tYW5kSW5wdXQsXG4gIEdldEJ1Y2tldExvY2F0aW9uQ29tbWFuZE91dHB1dCxcbiAgR2V0U2VjcmV0VmFsdWVDb21tYW5kSW5wdXQsXG4gIEdldFNlY3JldFZhbHVlQ29tbWFuZE91dHB1dCxcbiAgTGlzdE9iamVjdHNWMkNvbW1hbmRJbnB1dCxcbiAgTGlzdE9iamVjdHNWMkNvbW1hbmRPdXRwdXQsXG4gIFB1dE9iamVjdENvbW1hbmRJbnB1dCxcbn0gZnJvbSAnLi9hd3MtdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBBc3N1bWVSb2xlQWRkaXRpb25hbE9wdGlvbnMgPSBQYXJ0aWFsPFxuICBPbWl0PEFzc3VtZVJvbGVDb21tYW5kSW5wdXQsICdFeHRlcm5hbElkJyB8ICdSb2xlQXJuJz5cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVMzQ2xpZW50IHtcbiAgZ2V0QnVja2V0RW5jcnlwdGlvbihcbiAgICBpbnB1dDogR2V0QnVja2V0RW5jcnlwdGlvbkNvbW1hbmRJbnB1dFxuICApOiBQcm9taXNlPEdldEJ1Y2tldEVuY3J5cHRpb25Db21tYW5kT3V0cHV0PjtcbiAgZ2V0QnVja2V0TG9jYXRpb24oaW5wdXQ6IEdldEJ1Y2tldExvY2F0aW9uQ29tbWFuZElucHV0KTogUHJvbWlzZTxHZXRCdWNrZXRMb2NhdGlvbkNvbW1hbmRPdXRwdXQ+O1xuICBsaXN0T2JqZWN0c1YyKGlucHV0OiBMaXN0T2JqZWN0c1YyQ29tbWFuZElucHV0KTogUHJvbWlzZTxMaXN0T2JqZWN0c1YyQ29tbWFuZE91dHB1dD47XG4gIHVwbG9hZChpbnB1dDogUHV0T2JqZWN0Q29tbWFuZElucHV0KTogUHJvbWlzZTxDb21wbGV0ZU11bHRpcGFydFVwbG9hZENvbW1hbmRPdXRwdXQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFQ1JDbGllbnQge1xuICBkZXNjcmliZUltYWdlcyhpbnB1dDogRGVzY3JpYmVJbWFnZXNDb21tYW5kSW5wdXQpOiBQcm9taXNlPERlc2NyaWJlSW1hZ2VzQ29tbWFuZE91dHB1dD47XG4gIGRlc2NyaWJlUmVwb3NpdG9yaWVzKFxuICAgIGlucHV0OiBEZXNjcmliZVJlcG9zaXRvcmllc0NvbW1hbmRJbnB1dFxuICApOiBQcm9taXNlPERlc2NyaWJlUmVwb3NpdG9yaWVzQ29tbWFuZE91dHB1dD47XG4gIGdldEF1dGhvcml6YXRpb25Ub2tlbihcbiAgICBpbnB1dD86IEdldEF1dGhvcml6YXRpb25Ub2tlbkNvbW1hbmRJbnB1dFxuICApOiBQcm9taXNlPEdldEF1dGhvcml6YXRpb25Ub2tlbkNvbW1hbmRPdXRwdXQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWNyZXRzTWFuYWdlckNsaWVudCB7XG4gIGdldFNlY3JldFZhbHVlKGlucHV0OiBHZXRTZWNyZXRWYWx1ZUNvbW1hbmRJbnB1dCk6IFByb21pc2U8R2V0U2VjcmV0VmFsdWVDb21tYW5kT3V0cHV0Pjtcbn1cblxuLyoqXG4gKiBBV1MgU0RLIG9wZXJhdGlvbnMgcmVxdWlyZWQgYnkgQXNzZXQgUHVibGlzaGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElBd3Mge1xuICBkaXNjb3ZlclBhcnRpdGlvbigpOiBQcm9taXNlPHN0cmluZz47XG4gIGRpc2NvdmVyRGVmYXVsdFJlZ2lvbigpOiBQcm9taXNlPHN0cmluZz47XG4gIGRpc2NvdmVyQ3VycmVudEFjY291bnQoKTogUHJvbWlzZTxBY2NvdW50PjtcblxuICBkaXNjb3ZlclRhcmdldEFjY291bnQob3B0aW9uczogQ2xpZW50T3B0aW9ucyk6IFByb21pc2U8QWNjb3VudD47XG4gIHMzQ2xpZW50KG9wdGlvbnM6IENsaWVudE9wdGlvbnMpOiBQcm9taXNlPElTM0NsaWVudD47XG4gIGVjckNsaWVudChvcHRpb25zOiBDbGllbnRPcHRpb25zKTogUHJvbWlzZTxJRUNSQ2xpZW50PjtcbiAgc2VjcmV0c01hbmFnZXJDbGllbnQob3B0aW9uczogQ2xpZW50T3B0aW9ucyk6IFByb21pc2U8SVNlY3JldHNNYW5hZ2VyQ2xpZW50Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRPcHRpb25zIHtcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBhc3N1bWVSb2xlQXJuPzogc3RyaW5nO1xuICBhc3N1bWVSb2xlRXh0ZXJuYWxJZD86IHN0cmluZztcbiAgYXNzdW1lUm9sZUFkZGl0aW9uYWxPcHRpb25zPzogQXNzdW1lUm9sZUFkZGl0aW9uYWxPcHRpb25zO1xuICBxdWlldD86IGJvb2xlYW47XG59XG5cbmNvbnN0IFVTRVJfQUdFTlQgPSAnY2RrLWFzc2V0cyc7XG5cbmludGVyZmFjZSBDb25maWd1cmF0aW9uIHtcbiAgY2xpZW50Q29uZmlnOiBTVFNDbGllbnRDb25maWc7XG4gIHJlZ2lvbj86IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IEF3c0NyZWRlbnRpYWxJZGVudGl0eVByb3ZpZGVyO1xufVxuXG4vKipcbiAqIEFuIEFXUyBhY2NvdW50XG4gKlxuICogQW4gQVdTIGFjY291bnQgYWx3YXlzIGV4aXN0cyBpbiBvbmx5IG9uZSBwYXJ0aXRpb24uIFVzdWFsbHkgd2UgZG9uJ3QgY2FyZSBhYm91dFxuICogdGhlIHBhcnRpdGlvbiwgYnV0IHdoZW4gd2UgbmVlZCB0byBmb3JtIEFSTnMgd2UgZG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudCB7XG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudCBudW1iZXJcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFydGl0aW9uICgnYXdzJyBvciAnYXdzLWNuJyBvciBvdGhlcndpc2UpXG4gICAqL1xuICByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBBV1MgY2xpZW50IHVzaW5nIHRoZSBBV1MgU0RLIGZvciBKUyB3aXRoIG5vIHNwZWNpYWwgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgY2xhc3MgRGVmYXVsdEF3c0NsaWVudCBpbXBsZW1lbnRzIElBd3Mge1xuICBwcml2YXRlIGFjY291bnQ/OiBBY2NvdW50O1xuICBwcml2YXRlIGNvbmZpZzogQ29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjbGllbnRDb25maWc6IFNUU0NsaWVudENvbmZpZyA9IHtcbiAgICAgIGN1c3RvbVVzZXJBZ2VudDogVVNFUl9BR0VOVCxcbiAgICB9O1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgY2xpZW50Q29uZmlnLFxuICAgICAgY3JlZGVudGlhbHM6IGZyb21Ob2RlUHJvdmlkZXJDaGFpbih7XG4gICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgY2xpZW50Q29uZmlnLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzM0NsaWVudChvcHRpb25zOiBDbGllbnRPcHRpb25zKTogUHJvbWlzZTxJUzNDbGllbnQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUzNDbGllbnQoYXdhaXQgdGhpcy5hd3NPcHRpb25zKG9wdGlvbnMpKTtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0QnVja2V0RW5jcnlwdGlvbjogKFxuICAgICAgICBpbnB1dDogR2V0QnVja2V0RW5jcnlwdGlvbkNvbW1hbmRJbnB1dCxcbiAgICAgICk6IFByb21pc2U8R2V0QnVja2V0RW5jcnlwdGlvbkNvbW1hbmRPdXRwdXQ+ID0+XG4gICAgICAgIGNsaWVudC5zZW5kKG5ldyBHZXRCdWNrZXRFbmNyeXB0aW9uQ29tbWFuZChpbnB1dCkpLFxuICAgICAgZ2V0QnVja2V0TG9jYXRpb246IChcbiAgICAgICAgaW5wdXQ6IEdldEJ1Y2tldExvY2F0aW9uQ29tbWFuZElucHV0LFxuICAgICAgKTogUHJvbWlzZTxHZXRCdWNrZXRMb2NhdGlvbkNvbW1hbmRPdXRwdXQ+ID0+XG4gICAgICAgIGNsaWVudC5zZW5kKG5ldyBHZXRCdWNrZXRMb2NhdGlvbkNvbW1hbmQoaW5wdXQpKSxcbiAgICAgIGxpc3RPYmplY3RzVjI6IChpbnB1dDogTGlzdE9iamVjdHNWMkNvbW1hbmRJbnB1dCk6IFByb21pc2U8TGlzdE9iamVjdHNWMkNvbW1hbmRPdXRwdXQ+ID0+XG4gICAgICAgIGNsaWVudC5zZW5kKG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZChpbnB1dCkpLFxuICAgICAgdXBsb2FkOiAoaW5wdXQ6IFB1dE9iamVjdENvbW1hbmRJbnB1dCk6IFByb21pc2U8Q29tcGxldGVNdWx0aXBhcnRVcGxvYWRDb21tYW5kT3V0cHV0PiA9PiB7XG4gICAgICAgIGNvbnN0IHVwbG9hZCA9IG5ldyBVcGxvYWQoe1xuICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICBwYXJhbXM6IGlucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVwbG9hZC5kb25lKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZWNyQ2xpZW50KG9wdGlvbnM6IENsaWVudE9wdGlvbnMpOiBQcm9taXNlPElFQ1JDbGllbnQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRUNSQ2xpZW50KGF3YWl0IHRoaXMuYXdzT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaWJlSW1hZ2VzOiAoaW5wdXQ6IERlc2NyaWJlSW1hZ2VzQ29tbWFuZElucHV0KTogUHJvbWlzZTxEZXNjcmliZUltYWdlc0NvbW1hbmRPdXRwdXQ+ID0+XG4gICAgICAgIGNsaWVudC5zZW5kKG5ldyBEZXNjcmliZUltYWdlc0NvbW1hbmQoaW5wdXQpKSxcbiAgICAgIGRlc2NyaWJlUmVwb3NpdG9yaWVzOiAoXG4gICAgICAgIGlucHV0OiBEZXNjcmliZVJlcG9zaXRvcmllc0NvbW1hbmRJbnB1dCxcbiAgICAgICk6IFByb21pc2U8RGVzY3JpYmVSZXBvc2l0b3JpZXNDb21tYW5kT3V0cHV0PiA9PlxuICAgICAgICBjbGllbnQuc2VuZChuZXcgRGVzY3JpYmVSZXBvc2l0b3JpZXNDb21tYW5kKGlucHV0KSksXG4gICAgICBnZXRBdXRob3JpemF0aW9uVG9rZW46IChcbiAgICAgICAgaW5wdXQ6IEdldEF1dGhvcml6YXRpb25Ub2tlbkNvbW1hbmRJbnB1dCxcbiAgICAgICk6IFByb21pc2U8R2V0QXV0aG9yaXphdGlvblRva2VuQ29tbWFuZE91dHB1dD4gPT5cbiAgICAgICAgY2xpZW50LnNlbmQobmV3IEdldEF1dGhvcml6YXRpb25Ub2tlbkNvbW1hbmQoaW5wdXQgPz8ge30pKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNlY3JldHNNYW5hZ2VyQ2xpZW50KG9wdGlvbnM6IENsaWVudE9wdGlvbnMpOiBQcm9taXNlPElTZWNyZXRzTWFuYWdlckNsaWVudD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTZWNyZXRzTWFuYWdlckNsaWVudChhd2FpdCB0aGlzLmF3c09wdGlvbnMob3B0aW9ucykpO1xuICAgIHJldHVybiB7XG4gICAgICBnZXRTZWNyZXRWYWx1ZTogKGlucHV0OiBHZXRTZWNyZXRWYWx1ZUNvbW1hbmRJbnB1dCk6IFByb21pc2U8R2V0U2VjcmV0VmFsdWVDb21tYW5kT3V0cHV0PiA9PlxuICAgICAgICBjbGllbnQuc2VuZChuZXcgR2V0U2VjcmV0VmFsdWVDb21tYW5kKGlucHV0KSksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaXNjb3ZlclBhcnRpdGlvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5kaXNjb3ZlckN1cnJlbnRBY2NvdW50KCkpLnBhcnRpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaXNjb3ZlckRlZmF1bHRSZWdpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbG9hZENvbmZpZyhOT0RFX1JFR0lPTl9DT05GSUdfT1BUSU9OUywgTk9ERV9SRUdJT05fQ09ORklHX0ZJTEVfT1BUSU9OUykoKSB8fCAndXMtZWFzdC0xJztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaXNjb3ZlckN1cnJlbnRBY2NvdW50KCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICh0aGlzLmFjY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hY2NvdW50ID0gYXdhaXQgdGhpcy5nZXRBY2NvdW50KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFjY291bnQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGlzY292ZXJUYXJnZXRBY2NvdW50KG9wdGlvbnM6IENsaWVudE9wdGlvbnMpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY2NvdW50KGF3YWl0IHRoaXMuYXdzT3B0aW9ucyhvcHRpb25zKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEFjY291bnQob3B0aW9ucz86IENsaWVudE9wdGlvbnMpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICB0aGlzLmNvbmZpZy5jbGllbnRDb25maWcgPSBvcHRpb25zID8/IHRoaXMuY29uZmlnLmNsaWVudENvbmZpZztcbiAgICBjb25zdCBzdHNDbGllbnQgPSBuZXcgU1RTQ2xpZW50KGF3YWl0IHRoaXMuYXdzT3B0aW9ucyhvcHRpb25zKSk7XG5cbiAgICBjb25zdCBjb21tYW5kID0gbmV3IEdldENhbGxlcklkZW50aXR5Q29tbWFuZCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RzQ2xpZW50LnNlbmQoY29tbWFuZCk7XG4gICAgaWYgKCFyZXNwb25zZS5BY2NvdW50IHx8ICFyZXNwb25zZS5Bcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIHJlc3BvbnNlIGZyb20gU1RTOiAnJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9J2ApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudElkOiByZXNwb25zZS5BY2NvdW50ISxcbiAgICAgIHBhcnRpdGlvbjogcmVzcG9uc2UuQXJuIS5zcGxpdCgnOicpWzFdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF3c09wdGlvbnMob3B0aW9ucz86IENsaWVudE9wdGlvbnMpIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25maWcucmVnaW9uID0gb3B0aW9ucz8ucmVnaW9uO1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBjb25maWcucmVnaW9uID0gb3B0aW9ucy5yZWdpb247XG4gICAgICBpZiAob3B0aW9ucy5hc3N1bWVSb2xlQXJuKSB7XG4gICAgICAgIGNvbmZpZy5jcmVkZW50aWFscyA9IGZyb21UZW1wb3JhcnlDcmVkZW50aWFscyh7XG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBSb2xlQXJuOiBvcHRpb25zLmFzc3VtZVJvbGVBcm4sXG4gICAgICAgICAgICBFeHRlcm5hbElkOiBvcHRpb25zLmFzc3VtZVJvbGVFeHRlcm5hbElkLFxuICAgICAgICAgICAgUm9sZVNlc3Npb25OYW1lOiBgJHtVU0VSX0FHRU5UfS0ke3NhZmVVc2VybmFtZSgpfWAsXG4gICAgICAgICAgICBUcmFuc2l0aXZlVGFnS2V5czogb3B0aW9ucy5hc3N1bWVSb2xlQWRkaXRpb25hbE9wdGlvbnM/LlRhZ3NcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmFzc3VtZVJvbGVBZGRpdGlvbmFsT3B0aW9ucy5UYWdzLm1hcCgodCkgPT4gdC5LZXkhKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMuYXNzdW1lUm9sZUFkZGl0aW9uYWxPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xpZW50Q29uZmlnOiB0aGlzLmNvbmZpZy5jbGllbnRDb25maWcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSB1c2VybmFtZSB3aXRoIGNoYXJhY3RlcnMgaW52YWxpZCBmb3IgYSBSb2xlU2Vzc2lvbk5hbWUgcmVtb3ZlZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL1NUUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3N1bWVSb2xlLmh0bWwjQVBJX0Fzc3VtZVJvbGVfUmVxdWVzdFBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gc2FmZVVzZXJuYW1lKCkge1xuICB0cnkge1xuICAgIHJldHVybiBvcy51c2VySW5mbygpLnVzZXJuYW1lLnJlcGxhY2UoL1teXFx3Kz0sLkAtXS9nLCAnQCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ25vbmFtZSc7XG4gIH1cbn1cbiJdfQ==