@horietakehiro/aws-cdk-utul 0.33.8 → 0.33.10
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.
- package/lib/types/cfn-resource-types/aws-cloudfront-distribution.d.ts +6 -0
- package/lib/types/cfn-resource-types/aws-cloudfront-distribution.js +1 -1
- package/lib/types/cfn-resource-types/aws-ecs-service.d.ts +8 -2
- package/lib/types/cfn-resource-types/aws-ecs-service.js +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-channel.d.ts +25 -0
- package/lib/types/cfn-resource-types/aws-ivs-channel.js +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-ingestconfiguration.d.ts +6 -0
- package/lib/types/cfn-resource-types/aws-ivs-ingestconfiguration.js +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-playbackkeypair.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-playbackkeypair.js +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-publickey.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-publickey.js +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-recordingconfiguration.d.ts +6 -0
- package/lib/types/cfn-resource-types/aws-ivs-recordingconfiguration.js +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-stage.d.ts +8 -0
- package/lib/types/cfn-resource-types/aws-ivs-stage.js +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-storageconfiguration.d.ts +6 -0
- package/lib/types/cfn-resource-types/aws-ivs-storageconfiguration.js +1 -1
- package/lib/types/cfn-resource-types/aws-ivs-streamkey.d.ts +6 -0
- package/lib/types/cfn-resource-types/aws-ivs-streamkey.js +1 -1
- package/lib/types/cfn-resource-types/aws-s3-bucket.d.ts +36 -6
- package/lib/types/cfn-resource-types/aws-s3-bucket.js +1 -1
- package/package.json +1 -1
|
@@ -675,6 +675,7 @@ export interface Origin {
|
|
|
675
675
|
OriginPath?: string;
|
|
676
676
|
OriginShield?: OriginShield;
|
|
677
677
|
S3OriginConfig?: S3OriginConfig;
|
|
678
|
+
VpcOriginConfig?: VpcOriginConfig;
|
|
678
679
|
}
|
|
679
680
|
/**
|
|
680
681
|
* Use this type to specify an origin that is not an Amazon S3 bucket, with one exception. If the Amazon S3 bucket is configured with static website hosting, use this type. If the Amazon S3 bucket is not configured with static website hosting, use the ``S3OriginConfig`` type instead.
|
|
@@ -757,6 +758,11 @@ export interface S3OriginConfig {
|
|
|
757
758
|
*/
|
|
758
759
|
OriginAccessIdentity?: string;
|
|
759
760
|
}
|
|
761
|
+
export interface VpcOriginConfig {
|
|
762
|
+
OriginKeepaliveTimeout?: number;
|
|
763
|
+
OriginReadTimeout?: number;
|
|
764
|
+
VpcOriginId: string;
|
|
765
|
+
}
|
|
760
766
|
/**
|
|
761
767
|
* A complex type that identifies ways in which you want to restrict distribution of your content.
|
|
762
768
|
*/
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgZGlzdHJpYnV0aW9uIHRlbGxzIENsb3VkRnJvbnQgd2hlcmUgeW91IHdhbnQgY29udGVudCB0byBiZSBkZWxpdmVyZWQgZnJvbSwgYW5kIHRoZSBkZXRhaWxzIGFib3V0IGhvdyB0byB0cmFjayBhbmQgbWFuYWdlIGNvbnRlbnQgZGVsaXZlcnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgX0FXU19DTE9VREZST05UX0RJU1RSSUJVVElPTiB7XG5EaXN0cmlidXRpb25Db25maWc6IERpc3RyaWJ1dGlvbkNvbmZpZ1xuRG9tYWluTmFtZT86IHN0cmluZ1xuSWQ/OiBzdHJpbmdcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyB6ZXJvIG9yIG1vcmUgYGBUYWdgYCBlbGVtZW50cy5cbiAqL1xuVGFncz86IFRhZ1tdXG59XG4vKipcbiAqIFRoZSBkaXN0cmlidXRpb24ncyBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkNvbmZpZyB7XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgQ05BTUVzIChhbHRlcm5hdGUgZG9tYWluIG5hbWVzKSwgaWYgYW55LCBmb3IgdGhpcyBkaXN0cmlidXRpb24uXG4gKi9cbkFsaWFzZXM/OiBzdHJpbmdbXVxuQW55Y2FzdElwTGlzdElkPzogc3RyaW5nXG4vKipcbiAqIEFuIGFsaWFzIGZvciB0aGUgQ0YgZGlzdHJpYnV0aW9uJ3MgZG9tYWluIG5hbWUuXG4gKiAgIFRoaXMgcHJvcGVydHkgaXMgbGVnYWN5LiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIFtBbGlhc2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1jbG91ZGZyb250LWRpc3RyaWJ1dGlvbi1kaXN0cmlidXRpb25jb25maWcuaHRtbCNjZm4tY2xvdWRmcm9udC1kaXN0cmlidXRpb24tZGlzdHJpYnV0aW9uY29uZmlnLWFsaWFzZXMpIGluc3RlYWQuXG4gKi9cbkNOQU1Fcz86IHN0cmluZ1tdXG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgemVybyBvciBtb3JlIGBgQ2FjaGVCZWhhdmlvcmBgIGVsZW1lbnRzLlxuICovXG5DYWNoZUJlaGF2aW9ycz86IENhY2hlQmVoYXZpb3JbXVxuLyoqXG4gKiBBIGNvbW1lbnQgdG8gZGVzY3JpYmUgdGhlIGRpc3RyaWJ1dGlvbi4gVGhlIGNvbW1lbnQgY2Fubm90IGJlIGxvbmdlciB0aGFuIDEyOCBjaGFyYWN0ZXJzLlxuICovXG5Db21tZW50Pzogc3RyaW5nXG4vKipcbiAqIFRoZSBpZGVudGlmaWVyIG9mIGEgY29udGludW91cyBkZXBsb3ltZW50IHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgYENyZWF0ZUNvbnRpbnVvdXNEZXBsb3ltZW50UG9saWN5YGAuXG4gKi9cbkNvbnRpbnVvdXNEZXBsb3ltZW50UG9saWN5SWQ/OiBzdHJpbmdcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250cm9scyB0aGUgZm9sbG93aW5nOlxuICogICArICBXaGV0aGVyIENsb3VkRnJvbnQgcmVwbGFjZXMgSFRUUCBzdGF0dXMgY29kZXMgaW4gdGhlIDR4eCBhbmQgNXh4IHJhbmdlIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzIGJlZm9yZSByZXR1cm5pbmcgdGhlIHJlc3BvbnNlIHRvIHRoZSB2aWV3ZXIuXG4gKiAgICsgIEhvdyBsb25nIENsb3VkRnJvbnQgY2FjaGVzIEhUVFAgc3RhdHVzIGNvZGVzIGluIHRoZSA0eHggYW5kIDV4eCByYW5nZS5cbiAqICAgXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY3VzdG9tIGVycm9yIHBhZ2VzLCBzZWUgW0N1c3RvbWl6aW5nIEVycm9yIFJlc3BvbnNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2N1c3RvbS1lcnJvci1wYWdlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbkN1c3RvbUVycm9yUmVzcG9uc2VzPzogQ3VzdG9tRXJyb3JSZXNwb25zZVtdXG5DdXN0b21PcmlnaW4/OiBMZWdhY3lDdXN0b21PcmlnaW5cbkRlZmF1bHRDYWNoZUJlaGF2aW9yOiBEZWZhdWx0Q2FjaGVCZWhhdmlvclxuLyoqXG4gKiBXaGVuIGEgdmlld2VyIHJlcXVlc3RzIHRoZSByb290IFVSTCBmb3IgeW91ciBkaXN0cmlidXRpb24sIHRoZSBkZWZhdWx0IHJvb3Qgb2JqZWN0IGlzIHRoZSBvYmplY3QgdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHJlcXVlc3QgZnJvbSB5b3VyIG9yaWdpbi4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgcm9vdCBVUkwgaXMgYGBodHRwczovL3d3dy5leGFtcGxlLmNvbWBgLCB5b3UgY2FuIHNwZWNpZnkgQ2xvdWRGcm9udCB0byByZXR1cm4gdGhlIGBgaW5kZXguaHRtbGBgIGZpbGUgYXMgdGhlIGRlZmF1bHQgcm9vdCBvYmplY3QuIFlvdSBjYW4gc3BlY2lmeSBhIGRlZmF1bHQgcm9vdCBvYmplY3Qgc28gdGhhdCB2aWV3ZXJzIHNlZSBhIHNwZWNpZmljIGZpbGUgb3Igb2JqZWN0LCBpbnN0ZWFkIG9mIGFub3RoZXIgb2JqZWN0IGluIHlvdXIgZGlzdHJpYnV0aW9uIChmb3IgZXhhbXBsZSwgYGBodHRwczovL3d3dy5leGFtcGxlLmNvbS9wcm9kdWN0LWRlc2NyaXB0aW9uLmh0bWxgYCkuIEEgZGVmYXVsdCByb290IG9iamVjdCBhdm9pZHMgZXhwb3NpbmcgdGhlIGNvbnRlbnRzIG9mIHlvdXIgZGlzdHJpYnV0aW9uLlxuICogIFlvdSBjYW4gc3BlY2lmeSB0aGUgb2JqZWN0IG5hbWUgb3IgYSBwYXRoIHRvIHRoZSBvYmplY3QgbmFtZSAoZm9yIGV4YW1wbGUsIGBgaW5kZXguaHRtbGBgIG9yIGBgZXhhbXBsZUZvbGRlck5hbWUvaW5kZXguaHRtbGBgKS4gWW91ciBzdHJpbmcgY2FuJ3QgYmVnaW4gd2l0aCBhIGZvcndhcmQgc2xhc2ggKGBgL2BgKS4gT25seSBzcGVjaWZ5IHRoZSBvYmplY3QgbmFtZSBvciB0aGUgcGF0aCB0byB0aGUgb2JqZWN0LlxuICogIElmIHlvdSBkb24ndCB3YW50IHRvIHNwZWNpZnkgYSBkZWZhdWx0IHJvb3Qgb2JqZWN0IHdoZW4geW91IGNyZWF0ZSBhIGRpc3RyaWJ1dGlvbiwgaW5jbHVkZSBhbiBlbXB0eSBgYERlZmF1bHRSb290T2JqZWN0YGAgZWxlbWVudC5cbiAqICBUbyBkZWxldGUgdGhlIGRlZmF1bHQgcm9vdCBvYmplY3QgZnJvbSBhbiBleGlzdGluZyBkaXN0cmlidXRpb24sIHVwZGF0ZSB0aGUgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGluY2x1ZGUgYW4gZW1wdHkgYGBEZWZhdWx0Um9vdE9iamVjdGBgIGVsZW1lbnQuXG4gKiAgVG8gcmVwbGFjZSB0aGUgZGVmYXVsdCByb290IG9iamVjdCwgdXBkYXRlIHRoZSBkaXN0cmlidXRpb24gY29uZmlndXJhdGlvbiBhbmQgc3BlY2lmeSB0aGUgbmV3IG9iamVjdC5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVmYXVsdCByb290IG9iamVjdCwgc2VlIFtTcGVjaWZ5IGEgZGVmYXVsdCByb290IG9iamVjdF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0RlZmF1bHRSb290T2JqZWN0Lmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRGVmYXVsdFJvb3RPYmplY3Q/OiBzdHJpbmdcbi8qKlxuICogRnJvbSB0aGlzIGZpZWxkLCB5b3UgY2FuIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzZWxlY3RlZCBkaXN0cmlidXRpb24uXG4gKi9cbkVuYWJsZWQ6IGJvb2xlYW5cbi8qKlxuICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBIVFRQIHZlcnNpb24ocykgdGhhdCB5b3Ugd2FudCB2aWV3ZXJzIHRvIHVzZSB0byBjb21tdW5pY2F0ZSB3aXRoIENGLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbmV3IGRpc3RyaWJ1dGlvbnMgaXMgYGBodHRwMS4xYGAuXG4gKiAgRm9yIHZpZXdlcnMgYW5kIENGIHRvIHVzZSBIVFRQLzIsIHZpZXdlcnMgbXVzdCBzdXBwb3J0IFRMU3YxLjIgb3IgbGF0ZXIsIGFuZCBtdXN0IHN1cHBvcnQgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKS5cbiAqICBGb3Igdmlld2VycyBhbmQgQ0YgdG8gdXNlIEhUVFAvMywgdmlld2VycyBtdXN0IHN1cHBvcnQgVExTdjEuMyBhbmQgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKS4gQ0Ygc3VwcG9ydHMgSFRUUC8zIGNvbm5lY3Rpb24gbWlncmF0aW9uIHRvIGFsbG93IHRoZSB2aWV3ZXIgdG8gc3dpdGNoIG5ldHdvcmtzIHdpdGhvdXQgbG9zaW5nIGNvbm5lY3Rpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbm5lY3Rpb24gbWlncmF0aW9uLCBzZWUgW0Nvbm5lY3Rpb24gTWlncmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkwMDAuaHRtbCNuYW1lLWNvbm5lY3Rpb24tbWlncmF0aW9uKSBhdCBSRkMgOTAwMC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc3VwcG9ydGVkIFRMU3YxLjMgY2lwaGVycywgc2VlIFtTdXBwb3J0ZWQgcHJvdG9jb2xzIGFuZCBjaXBoZXJzIGJldHdlZW4gdmlld2VycyBhbmQgQ2xvdWRGcm9udF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3NlY3VyZS1jb25uZWN0aW9ucy1zdXBwb3J0ZWQtdmlld2VyLXByb3RvY29scy1jaXBoZXJzLmh0bWwpLlxuICovXG5IdHRwVmVyc2lvbj86IHN0cmluZ1xuLyoqXG4gKiBJZiB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHJlc3BvbmQgdG8gSVB2NiBETlMgcmVxdWVzdHMgd2l0aCBhbiBJUHY2IGFkZHJlc3MgZm9yIHlvdXIgZGlzdHJpYnV0aW9uLCBzcGVjaWZ5IGBgdHJ1ZWBgLiBJZiB5b3Ugc3BlY2lmeSBgYGZhbHNlYGAsIENsb3VkRnJvbnQgcmVzcG9uZHMgdG8gSVB2NiBETlMgcmVxdWVzdHMgd2l0aCB0aGUgRE5TIHJlc3BvbnNlIGNvZGUgYGBOT0VSUk9SYGAgYW5kIHdpdGggbm8gSVAgYWRkcmVzc2VzLiBUaGlzIGFsbG93cyB2aWV3ZXJzIHRvIHN1Ym1pdCBhIHNlY29uZCByZXF1ZXN0LCBmb3IgYW4gSVB2NCBhZGRyZXNzIGZvciB5b3VyIGRpc3RyaWJ1dGlvbi5cbiAqICBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIGVuYWJsZSBJUHY2IGlmIHlvdSBoYXZlIHVzZXJzIG9uIElQdjYgbmV0d29ya3Mgd2hvIHdhbnQgdG8gYWNjZXNzIHlvdXIgY29udGVudC4gSG93ZXZlciwgaWYgeW91J3JlIHVzaW5nIHNpZ25lZCBVUkxzIG9yIHNpZ25lZCBjb29raWVzIHRvIHJlc3RyaWN0IGFjY2VzcyB0byB5b3VyIGNvbnRlbnQsIGFuZCBpZiB5b3UncmUgdXNpbmcgYSBjdXN0b20gcG9saWN5IHRoYXQgaW5jbHVkZXMgdGhlIGBgSXBBZGRyZXNzYGAgcGFyYW1ldGVyIHRvIHJlc3RyaWN0IHRoZSBJUCBhZGRyZXNzZXMgdGhhdCBjYW4gYWNjZXNzIHlvdXIgY29udGVudCwgZG9uJ3QgZW5hYmxlIElQdjYuIElmIHlvdSB3YW50IHRvIHJlc3RyaWN0IGFjY2VzcyB0byBzb21lIGNvbnRlbnQgYnkgSVAgYWRkcmVzcyBhbmQgbm90IHJlc3RyaWN0IGFjY2VzcyB0byBvdGhlciBjb250ZW50IChvciByZXN0cmljdCBhY2Nlc3MgYnV0IG5vdCBieSBJUCBhZGRyZXNzKSwgeW91IGNhbiBjcmVhdGUgdHdvIGRpc3RyaWJ1dGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIGEgU2lnbmVkIFVSTCBVc2luZyBhIEN1c3RvbSBQb2xpY3ldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9wcml2YXRlLWNvbnRlbnQtY3JlYXRpbmctc2lnbmVkLXVybC1jdXN0b20tcG9saWN5Lmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3UncmUgdXNpbmcgYW4gUjUzQVdTSW50bG9uZyBhbGlhcyByZXNvdXJjZSByZWNvcmQgc2V0IHRvIHJvdXRlIHRyYWZmaWMgdG8geW91ciBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiwgeW91IG5lZWQgdG8gY3JlYXRlIGEgc2Vjb25kIGFsaWFzIHJlc291cmNlIHJlY29yZCBzZXQgd2hlbiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6XG4gKiAgICsgIFlvdSBlbmFibGUgSVB2NiBmb3IgdGhlIGRpc3RyaWJ1dGlvblxuICogICArICBZb3UncmUgdXNpbmcgYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcyBpbiB0aGUgVVJMcyBmb3IgeW91ciBvYmplY3RzXG4gKiAgIFxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JvdXRpbmcgVHJhZmZpYyB0byBhbiBBbWF6b24gQ2xvdWRGcm9udCBXZWIgRGlzdHJpYnV0aW9uIGJ5IFVzaW5nIFlvdXIgRG9tYWluIE5hbWVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9Sb3V0ZTUzL2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9yb3V0aW5nLXRvLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uLmh0bWwpIGluIHRoZSAqRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3UgY3JlYXRlZCBhIENOQU1FIHJlc291cmNlIHJlY29yZCBzZXQsIGVpdGhlciB3aXRoIFI1M0FXU0ludGxvbmcgb3Igd2l0aCBhbm90aGVyIEROUyBzZXJ2aWNlLCB5b3UgZG9uJ3QgbmVlZCB0byBtYWtlIGFueSBjaGFuZ2VzLiBBIENOQU1FIHJlY29yZCB3aWxsIHJvdXRlIHRyYWZmaWMgdG8geW91ciBkaXN0cmlidXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgSVAgYWRkcmVzcyBmb3JtYXQgb2YgdGhlIHZpZXdlciByZXF1ZXN0LlxuICovXG5JUFY2RW5hYmxlZD86IGJvb2xlYW5cbkxvZ2dpbmc/OiBMb2dnaW5nXG5PcmlnaW5Hcm91cHM/OiBPcmlnaW5Hcm91cHNcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBvcmlnaW5zIGZvciB0aGlzIGRpc3RyaWJ1dGlvbi5cbiAqICBTcGVjaWZ5IGEgdmFsdWUgZm9yIGVpdGhlciB0aGUgYGBPcmlnaW5zYGAgb3IgYGBPcmlnaW5Hcm91cHNgYCBwcm9wZXJ0eS5cbiAqL1xuT3JpZ2lucz86IE9yaWdpbltdXG4vKipcbiAqIFRoZSBwcmljZSBjbGFzcyB0aGF0IGNvcnJlc3BvbmRzIHdpdGggdGhlIG1heGltdW0gcHJpY2UgdGhhdCB5b3Ugd2FudCB0byBwYXkgZm9yIENsb3VkRnJvbnQgc2VydmljZS4gSWYgeW91IHNwZWNpZnkgYGBQcmljZUNsYXNzX0FsbGBgLCBDbG91ZEZyb250IHJlc3BvbmRzIHRvIHJlcXVlc3RzIGZvciB5b3VyIG9iamVjdHMgZnJvbSBhbGwgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAqICBJZiB5b3Ugc3BlY2lmeSBhIHByaWNlIGNsYXNzIG90aGVyIHRoYW4gYGBQcmljZUNsYXNzX0FsbGBgLCBDbG91ZEZyb250IHNlcnZlcyB5b3VyIG9iamVjdHMgZnJvbSB0aGUgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9uIHRoYXQgaGFzIHRoZSBsb3dlc3QgbGF0ZW5jeSBhbW9uZyB0aGUgZWRnZSBsb2NhdGlvbnMgaW4geW91ciBwcmljZSBjbGFzcy4gVmlld2VycyB3aG8gYXJlIGluIG9yIG5lYXIgcmVnaW9ucyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHlvdXIgc3BlY2lmaWVkIHByaWNlIGNsYXNzIG1heSBlbmNvdW50ZXIgc2xvd2VyIHBlcmZvcm1hbmNlLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHByaWNlIGNsYXNzZXMsIHNlZSBbQ2hvb3NpbmcgdGhlIFByaWNlIENsYXNzIGZvciBhIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvUHJpY2VDbGFzcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouIEZvciBpbmZvcm1hdGlvbiBhYm91dCBDbG91ZEZyb250IHByaWNpbmcsIGluY2x1ZGluZyBob3cgcHJpY2UgY2xhc3NlcyAoc3VjaCBhcyBQcmljZSBDbGFzcyAxMDApIG1hcCB0byBDbG91ZEZyb250IHJlZ2lvbnMsIHNlZSBbQW1hem9uIENsb3VkRnJvbnQgUHJpY2luZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nsb3VkZnJvbnQvcHJpY2luZy8pLlxuICovXG5QcmljZUNsYXNzPzogc3RyaW5nXG5SZXN0cmljdGlvbnM/OiBSZXN0cmljdGlvbnNcblMzT3JpZ2luPzogTGVnYWN5UzNPcmlnaW5cbi8qKlxuICogQSBCb29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0YWdpbmcgZGlzdHJpYnV0aW9uLiBXaGVuIHRoaXMgdmFsdWUgaXMgYGB0cnVlYGAsIHRoaXMgaXMgYSBzdGFnaW5nIGRpc3RyaWJ1dGlvbi4gV2hlbiB0aGlzIHZhbHVlIGlzIGBgZmFsc2VgYCwgdGhpcyBpcyBub3QgYSBzdGFnaW5nIGRpc3RyaWJ1dGlvbi5cbiAqL1xuU3RhZ2luZz86IGJvb2xlYW5cblZpZXdlckNlcnRpZmljYXRlPzogVmlld2VyQ2VydGlmaWNhdGVcbi8qKlxuICogQSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IHNwZWNpZmllcyB0aGUgV0FGIHdlYiBBQ0wsIGlmIGFueSwgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBkaXN0cmlidXRpb24uIFRvIHNwZWNpZnkgYSB3ZWIgQUNMIGNyZWF0ZWQgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFdBRiwgdXNlIHRoZSBBQ0wgQVJOLCBmb3IgZXhhbXBsZSBgYGFybjphd3M6d2FmdjI6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpnbG9iYWwvd2ViYWNsL0V4YW1wbGVXZWJBQ0wvYTFiMmMzZDQtNTY3OC05MGFiLWNkZWYtRVhBTVBMRTExMTExYGAuIFRvIHNwZWNpZnkgYSB3ZWIgQUNMIGNyZWF0ZWQgdXNpbmcgV0FGIENsYXNzaWMsIHVzZSB0aGUgQUNMIElELCBmb3IgZXhhbXBsZSBgYGExYjJjM2Q0LTU2NzgtOTBhYi1jZGVmLUVYQU1QTEUxMTExMWBgLlxuICogICBXQUYgaXMgYSB3ZWIgYXBwbGljYXRpb24gZmlyZXdhbGwgdGhhdCBsZXRzIHlvdSBtb25pdG9yIHRoZSBIVFRQIGFuZCBIVFRQUyByZXF1ZXN0cyB0aGF0IGFyZSBmb3J3YXJkZWQgdG8gQ2xvdWRGcm9udCwgYW5kIGxldHMgeW91IGNvbnRyb2wgYWNjZXNzIHRvIHlvdXIgY29udGVudC4gQmFzZWQgb24gY29uZGl0aW9ucyB0aGF0IHlvdSBzcGVjaWZ5LCBzdWNoIGFzIHRoZSBJUCBhZGRyZXNzZXMgdGhhdCByZXF1ZXN0cyBvcmlnaW5hdGUgZnJvbSBvciB0aGUgdmFsdWVzIG9mIHF1ZXJ5IHN0cmluZ3MsIENsb3VkRnJvbnQgcmVzcG9uZHMgdG8gcmVxdWVzdHMgZWl0aGVyIHdpdGggdGhlIHJlcXVlc3RlZCBjb250ZW50IG9yIHdpdGggYW4gSFRUUCA0MDMgc3RhdHVzIGNvZGUgKEZvcmJpZGRlbikuIFlvdSBjYW4gYWxzbyBjb25maWd1cmUgQ2xvdWRGcm9udCB0byByZXR1cm4gYSBjdXN0b20gZXJyb3IgcGFnZSB3aGVuIGEgcmVxdWVzdCBpcyBibG9ja2VkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBXQUYsIHNlZSB0aGUgW0RldmVsb3BlciBHdWlkZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dhZi9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvd2hhdC1pcy1hd3Mtd2FmLmh0bWwpLlxuICovXG5XZWJBQ0xJZD86IHN0cmluZ1xufVxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGRlc2NyaWJlcyBob3cgQ2xvdWRGcm9udCBwcm9jZXNzZXMgcmVxdWVzdHMuXG4gKiAgWW91IG11c3QgY3JlYXRlIGF0IGxlYXN0IGFzIG1hbnkgY2FjaGUgYmVoYXZpb3JzIChpbmNsdWRpbmcgdGhlIGRlZmF1bHQgY2FjaGUgYmVoYXZpb3IpIGFzIHlvdSBoYXZlIG9yaWdpbnMgaWYgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBzZXJ2ZSBvYmplY3RzIGZyb20gYWxsIG9mIHRoZSBvcmlnaW5zLiBFYWNoIGNhY2hlIGJlaGF2aW9yIHNwZWNpZmllcyB0aGUgb25lIG9yaWdpbiBmcm9tIHdoaWNoIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZ2V0IG9iamVjdHMuIElmIHlvdSBoYXZlIHR3byBvcmlnaW5zIGFuZCBvbmx5IHRoZSBkZWZhdWx0IGNhY2hlIGJlaGF2aW9yLCB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvciB3aWxsIGNhdXNlIENsb3VkRnJvbnQgdG8gZ2V0IG9iamVjdHMgZnJvbSBvbmUgb2YgdGhlIG9yaWdpbnMsIGJ1dCB0aGUgb3RoZXIgb3JpZ2luIGlzIG5ldmVyIHVzZWQuXG4gKiAgRm9yIHRoZSBjdXJyZW50IHF1b3RhIChmb3JtZXJseSBrbm93biBhcyBsaW1pdCkgb24gdGhlIG51bWJlciBvZiBjYWNoZSBiZWhhdmlvcnMgdGhhdCB5b3UgY2FuIGFkZCB0byBhIGRpc3RyaWJ1dGlvbiwgc2VlIFtRdW90YXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IGRvbid0IHdhbnQgdG8gc3BlY2lmeSBhbnkgY2FjaGUgYmVoYXZpb3JzLCBpbmNsdWRlIG9ubHkgYW4gZW1wdHkgYGBDYWNoZUJlaGF2aW9yc2BgIGVsZW1lbnQuIERvbid0IHNwZWNpZnkgYW4gZW1wdHkgaW5kaXZpZHVhbCBgYENhY2hlQmVoYXZpb3JgYCBlbGVtZW50LCBiZWNhdXNlIHRoaXMgaXMgaW52YWxpZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ2FjaGVCZWhhdmlvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbG91ZGZyb250L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NhY2hlQmVoYXZpb3JzLmh0bWwpLiBcbiAqICBUbyBkZWxldGUgYWxsIGNhY2hlIGJlaGF2aW9ycyBpbiBhbiBleGlzdGluZyBkaXN0cmlidXRpb24sIHVwZGF0ZSB0aGUgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGluY2x1ZGUgb25seSBhbiBlbXB0eSBgYENhY2hlQmVoYXZpb3JzYGAgZWxlbWVudC5cbiAqICBUbyBhZGQsIGNoYW5nZSwgb3IgcmVtb3ZlIG9uZSBvciBtb3JlIGNhY2hlIGJlaGF2aW9ycywgdXBkYXRlIHRoZSBkaXN0cmlidXRpb24gY29uZmlndXJhdGlvbiBhbmQgc3BlY2lmeSBhbGwgb2YgdGhlIGNhY2hlIGJlaGF2aW9ycyB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgaW4gdGhlIHVwZGF0ZWQgZGlzdHJpYnV0aW9uLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNhY2hlIGJlaGF2aW9ycywgc2VlIFtDYWNoZSBCZWhhdmlvciBTZXR0aW5nc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Rpc3RyaWJ1dGlvbi13ZWItdmFsdWVzLXNwZWNpZnkuaHRtbCNEb3dubG9hZERpc3RWYWx1ZXNDYWNoZUJlaGF2aW9yKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVCZWhhdmlvciB7XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udHJvbHMgd2hpY2ggSFRUUCBtZXRob2RzIENsb3VkRnJvbnQgcHJvY2Vzc2VzIGFuZCBmb3J3YXJkcyB0byB5b3VyIEFtYXpvbiBTMyBidWNrZXQgb3IgeW91ciBjdXN0b20gb3JpZ2luLiBUaGVyZSBhcmUgdGhyZWUgY2hvaWNlczpcbiAqICAgKyAgQ2xvdWRGcm9udCBmb3J3YXJkcyBvbmx5IGBgR0VUYGAgYW5kIGBgSEVBRGBgIHJlcXVlc3RzLlxuICogICArICBDbG91ZEZyb250IGZvcndhcmRzIG9ubHkgYGBHRVRgYCwgYGBIRUFEYGAsIGFuZCBgYE9QVElPTlNgYCByZXF1ZXN0cy5cbiAqICAgKyAgQ2xvdWRGcm9udCBmb3J3YXJkcyBgYEdFVCwgSEVBRCwgT1BUSU9OUywgUFVULCBQQVRDSCwgUE9TVGBgLCBhbmQgYGBERUxFVEVgYCByZXF1ZXN0cy5cbiAqICAgXG4gKiAgSWYgeW91IHBpY2sgdGhlIHRoaXJkIGNob2ljZSwgeW91IG1heSBuZWVkIHRvIHJlc3RyaWN0IGFjY2VzcyB0byB5b3VyIEFtYXpvbiBTMyBidWNrZXQgb3IgdG8geW91ciBjdXN0b20gb3JpZ2luIHNvIHVzZXJzIGNhbid0IHBlcmZvcm0gb3BlcmF0aW9ucyB0aGF0IHlvdSBkb24ndCB3YW50IHRoZW0gdG8uIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgbm90IHdhbnQgdXNlcnMgdG8gaGF2ZSBwZXJtaXNzaW9ucyB0byBkZWxldGUgb2JqZWN0cyBmcm9tIHlvdXIgb3JpZ2luLlxuICovXG5BbGxvd2VkTWV0aG9kcz86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2FjaGUgcG9saWN5IHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhpcyBjYWNoZSBiZWhhdmlvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtY2FjaGUtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgYGBDYWNoZUJlaGF2aW9yYGAgbXVzdCBpbmNsdWRlIGVpdGhlciBhIGBgQ2FjaGVQb2xpY3lJZGBgIG9yIGBgRm9yd2FyZGVkVmFsdWVzYGAuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBgYENhY2hlUG9saWN5SWRgYC5cbiAqL1xuQ2FjaGVQb2xpY3lJZD86IHN0cmluZ1xuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgQ2xvdWRGcm9udCBjYWNoZXMgdGhlIHJlc3BvbnNlIHRvIHJlcXVlc3RzIHVzaW5nIHRoZSBzcGVjaWZpZWQgSFRUUCBtZXRob2RzLiBUaGVyZSBhcmUgdHdvIGNob2ljZXM6XG4gKiAgICsgIENsb3VkRnJvbnQgY2FjaGVzIHJlc3BvbnNlcyB0byBgYEdFVGBgIGFuZCBgYEhFQURgYCByZXF1ZXN0cy5cbiAqICAgKyAgQ2xvdWRGcm9udCBjYWNoZXMgcmVzcG9uc2VzIHRvIGBgR0VUYGAsIGBgSEVBRGBgLCBhbmQgYGBPUFRJT05TYGAgcmVxdWVzdHMuXG4gKiAgIFxuICogIElmIHlvdSBwaWNrIHRoZSBzZWNvbmQgY2hvaWNlIGZvciB5b3VyIEFtYXpvbiBTMyBPcmlnaW4sIHlvdSBtYXkgbmVlZCB0byBmb3J3YXJkIEFjY2Vzcy1Db250cm9sLVJlcXVlc3QtTWV0aG9kLCBBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMsIGFuZCBPcmlnaW4gaGVhZGVycyBmb3IgdGhlIHJlc3BvbnNlcyB0byBiZSBjYWNoZWQgY29ycmVjdGx5LlxuICovXG5DYWNoZWRNZXRob2RzPzogc3RyaW5nW11cbi8qKlxuICogV2hldGhlciB5b3Ugd2FudCBDbG91ZEZyb250IHRvIGF1dG9tYXRpY2FsbHkgY29tcHJlc3MgY2VydGFpbiBmaWxlcyBmb3IgdGhpcyBjYWNoZSBiZWhhdmlvci4gSWYgc28sIHNwZWNpZnkgdHJ1ZTsgaWYgbm90LCBzcGVjaWZ5IGZhbHNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aW5nIENvbXByZXNzZWQgRmlsZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9TZXJ2aW5nQ29tcHJlc3NlZEZpbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ29tcHJlc3M/OiBib29sZWFuXG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB0aGUgYGBEZWZhdWx0VFRMYGAgZmllbGQgaW4gYSBjYWNoZSBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIGRlZmF1bHQgYW1vdW50IG9mIHRpbWUgdGhhdCB5b3Ugd2FudCBvYmplY3RzIHRvIHN0YXkgaW4gQ2xvdWRGcm9udCBjYWNoZXMgYmVmb3JlIENsb3VkRnJvbnQgZm9yd2FyZHMgYW5vdGhlciByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIHZhbHVlIHRoYXQgeW91IHNwZWNpZnkgYXBwbGllcyBvbmx5IHdoZW4geW91ciBvcmlnaW4gZG9lcyBub3QgYWRkIEhUVFAgaGVhZGVycyBzdWNoIGFzIGBgQ2FjaGUtQ29udHJvbCBtYXgtYWdlYGAsIGBgQ2FjaGUtQ29udHJvbCBzLW1heGFnZWBgLCBhbmQgYGBFeHBpcmVzYGAgdG8gb2JqZWN0cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWFuYWdpbmcgSG93IExvbmcgQ29udGVudCBTdGF5cyBpbiBhbiBFZGdlIENhY2hlIChFeHBpcmF0aW9uKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0V4cGlyYXRpb24uaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5EZWZhdWx0VFRMPzogbnVtYmVyXG4vKipcbiAqIFRoZSB2YWx1ZSBvZiBgYElEYGAgZm9yIHRoZSBmaWVsZC1sZXZlbCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHVzZSBmb3IgZW5jcnlwdGluZyBzcGVjaWZpYyBmaWVsZHMgb2YgZGF0YSBmb3IgdGhpcyBjYWNoZSBiZWhhdmlvci5cbiAqL1xuRmllbGRMZXZlbEVuY3J5cHRpb25JZD86IHN0cmluZ1xuRm9yd2FyZGVkVmFsdWVzPzogRm9yd2FyZGVkVmFsdWVzXG4vKipcbiAqIEEgbGlzdCBvZiBDbG91ZEZyb250IGZ1bmN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWNoZSBiZWhhdmlvci4gQ2xvdWRGcm9udCBmdW5jdGlvbnMgbXVzdCBiZSBwdWJsaXNoZWQgdG8gdGhlIGBgTElWRWBgIHN0YWdlIHRvIGFzc29jaWF0ZSB0aGVtIHdpdGggYSBjYWNoZSBiZWhhdmlvci5cbiAqL1xuRnVuY3Rpb25Bc3NvY2lhdGlvbnM/OiBGdW5jdGlvbkFzc29jaWF0aW9uW11cbkdycGNDb25maWc/OiBHcnBjQ29uZmlnXG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgemVybyBvciBtb3JlIExhbWJkYUBFZGdlIGZ1bmN0aW9uIGFzc29jaWF0aW9ucyBmb3IgYSBjYWNoZSBiZWhhdmlvci5cbiAqL1xuTGFtYmRhRnVuY3Rpb25Bc3NvY2lhdGlvbnM/OiBMYW1iZGFGdW5jdGlvbkFzc29jaWF0aW9uW11cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHRoZSBgYE1heFRUTGBgIGZpZWxkIGluIGEgY2FjaGUgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtY2FjaGUtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgeW91IHdhbnQgb2JqZWN0cyB0byBzdGF5IGluIENsb3VkRnJvbnQgY2FjaGVzIGJlZm9yZSBDbG91ZEZyb250IGZvcndhcmRzIGFub3RoZXIgcmVxdWVzdCB0byB5b3VyIG9yaWdpbiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgb2JqZWN0IGhhcyBiZWVuIHVwZGF0ZWQuIFRoZSB2YWx1ZSB0aGF0IHlvdSBzcGVjaWZ5IGFwcGxpZXMgb25seSB3aGVuIHlvdXIgb3JpZ2luIGFkZHMgSFRUUCBoZWFkZXJzIHN1Y2ggYXMgYGBDYWNoZS1Db250cm9sIG1heC1hZ2VgYCwgYGBDYWNoZS1Db250cm9sIHMtbWF4YWdlYGAsIGFuZCBgYEV4cGlyZXNgYCB0byBvYmplY3RzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtNYW5hZ2luZyBIb3cgTG9uZyBDb250ZW50IFN0YXlzIGluIGFuIEVkZ2UgQ2FjaGUgKEV4cGlyYXRpb24pXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvRXhwaXJhdGlvbi5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk1heFRUTD86IG51bWJlclxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdGhlIGBgTWluVFRMYGAgZmllbGQgaW4gYSBjYWNoZSBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCB5b3Ugd2FudCBvYmplY3RzIHRvIHN0YXkgaW4gQ2xvdWRGcm9udCBjYWNoZXMgYmVmb3JlIENsb3VkRnJvbnQgZm9yd2FyZHMgYW5vdGhlciByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gdXBkYXRlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWFuYWdpbmcgSG93IExvbmcgQ29udGVudCBTdGF5cyBpbiBhbiBFZGdlIENhY2hlIChFeHBpcmF0aW9uKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0V4cGlyYXRpb24uaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBtdXN0IHNwZWNpZnkgYGAwYGAgZm9yIGBgTWluVFRMYGAgaWYgeW91IGNvbmZpZ3VyZSBDbG91ZEZyb250IHRvIGZvcndhcmQgYWxsIGhlYWRlcnMgdG8geW91ciBvcmlnaW4gKHVuZGVyIGBgSGVhZGVyc2BgLCBpZiB5b3Ugc3BlY2lmeSBgYDFgYCBmb3IgYGBRdWFudGl0eWBgIGFuZCBgYCpgYCBmb3IgYGBOYW1lYGApLlxuICovXG5NaW5UVEw/OiBudW1iZXJcbi8qKlxuICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGlzIGNhY2hlIGJlaGF2aW9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5PcmlnaW5SZXF1ZXN0UG9saWN5SWQ/OiBzdHJpbmdcbi8qKlxuICogVGhlIHBhdHRlcm4gKGZvciBleGFtcGxlLCBgYGltYWdlcy8qLmpwZ2BgKSB0aGF0IHNwZWNpZmllcyB3aGljaCByZXF1ZXN0cyB0byBhcHBseSB0aGUgYmVoYXZpb3IgdG8uIFdoZW4gQ2xvdWRGcm9udCByZWNlaXZlcyBhIHZpZXdlciByZXF1ZXN0LCB0aGUgcmVxdWVzdGVkIHBhdGggaXMgY29tcGFyZWQgd2l0aCBwYXRoIHBhdHRlcm5zIGluIHRoZSBvcmRlciBpbiB3aGljaCBjYWNoZSBiZWhhdmlvcnMgYXJlIGxpc3RlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLlxuICogICBZb3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSBhIHNsYXNoIChgYC9gYCkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aCBwYXR0ZXJuLiBGb3IgZXhhbXBsZSwgYGAvaW1hZ2VzLyouanBnYGAuIENsb3VkRnJvbnQgYmVoYXZpb3IgaXMgdGhlIHNhbWUgd2l0aCBvciB3aXRob3V0IHRoZSBsZWFkaW5nIGBgL2BgLlxuICogICBUaGUgcGF0aCBwYXR0ZXJuIGZvciB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvciBpcyBgYCpgYCBhbmQgY2Fubm90IGJlIGNoYW5nZWQuIElmIHRoZSByZXF1ZXN0IGZvciBhbiBvYmplY3QgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdGggcGF0dGVybiBmb3IgYW55IGNhY2hlIGJlaGF2aW9ycywgQ2xvdWRGcm9udCBhcHBsaWVzIHRoZSBiZWhhdmlvciBpbiB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvci5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtQYXRoIFBhdHRlcm5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td2ViLXZhbHVlcy1zcGVjaWZ5Lmh0bWwjRG93bmxvYWREaXN0VmFsdWVzUGF0aFBhdHRlcm4pIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuUGF0aFBhdHRlcm46IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHJlYWwtdGltZSBsb2cgY29uZmlndXJhdGlvbiB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoaXMgY2FjaGUgYmVoYXZpb3IuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JlYWwtdGltZSBsb2dzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvcmVhbC10aW1lLWxvZ3MuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5SZWFsdGltZUxvZ0NvbmZpZ0Fybj86IHN0cmluZ1xuLyoqXG4gKiBUaGUgaWRlbnRpZmllciBmb3IgYSByZXNwb25zZSBoZWFkZXJzIHBvbGljeS5cbiAqL1xuUmVzcG9uc2VIZWFkZXJzUG9saWN5SWQ/OiBzdHJpbmdcbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgeW91IHdhbnQgdG8gZGlzdHJpYnV0ZSBtZWRpYSBmaWxlcyBpbiB0aGUgTWljcm9zb2Z0IFNtb290aCBTdHJlYW1pbmcgZm9ybWF0IHVzaW5nIHRoZSBvcmlnaW4gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWNoZSBiZWhhdmlvci4gSWYgc28sIHNwZWNpZnkgYGB0cnVlYGA7IGlmIG5vdCwgc3BlY2lmeSBgYGZhbHNlYGAuIElmIHlvdSBzcGVjaWZ5IGBgdHJ1ZWBgIGZvciBgYFNtb290aFN0cmVhbWluZ2BgLCB5b3UgY2FuIHN0aWxsIGRpc3RyaWJ1dGUgb3RoZXIgY29udGVudCB1c2luZyB0aGlzIGNhY2hlIGJlaGF2aW9yIGlmIHRoZSBjb250ZW50IG1hdGNoZXMgdGhlIHZhbHVlIG9mIGBgUGF0aFBhdHRlcm5gYC5cbiAqL1xuU21vb3RoU3RyZWFtaW5nPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgdmFsdWUgb2YgYGBJRGBgIGZvciB0aGUgb3JpZ2luIHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byByb3V0ZSByZXF1ZXN0cyB0byB3aGVuIHRoZXkgbWF0Y2ggdGhpcyBjYWNoZSBiZWhhdmlvci5cbiAqL1xuVGFyZ2V0T3JpZ2luSWQ6IHN0cmluZ1xuLyoqXG4gKiBBIGxpc3Qgb2Yga2V5IGdyb3VwcyB0aGF0IENsb3VkRnJvbnQgY2FuIHVzZSB0byB2YWxpZGF0ZSBzaWduZWQgVVJMcyBvciBzaWduZWQgY29va2llcy5cbiAqICBXaGVuIGEgY2FjaGUgYmVoYXZpb3IgY29udGFpbnMgdHJ1c3RlZCBrZXkgZ3JvdXBzLCBDbG91ZEZyb250IHJlcXVpcmVzIHNpZ25lZCBVUkxzIG9yIHNpZ25lZCBjb29raWVzIGZvciBhbGwgcmVxdWVzdHMgdGhhdCBtYXRjaCB0aGUgY2FjaGUgYmVoYXZpb3IuIFRoZSBVUkxzIG9yIGNvb2tpZXMgbXVzdCBiZSBzaWduZWQgd2l0aCBhIHByaXZhdGUga2V5IHdob3NlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSBpcyBpbiB0aGUga2V5IGdyb3VwLiBUaGUgc2lnbmVkIFVSTCBvciBjb29raWUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggcHVibGljIGtleSBDbG91ZEZyb250IHNob3VsZCB1c2UgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpbmcgcHJpdmF0ZSBjb250ZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvUHJpdmF0ZUNvbnRlbnQuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5UcnVzdGVkS2V5R3JvdXBzPzogc3RyaW5nW11cbi8qKlxuICogV2UgcmVjb21tZW5kIHVzaW5nIGBgVHJ1c3RlZEtleUdyb3Vwc2BgIGluc3RlYWQgb2YgYGBUcnVzdGVkU2lnbmVyc2BgLlxuICogICBBIGxpc3Qgb2YgQVdTLWFjY291bnQgSURzIHdob3NlIHB1YmxpYyBrZXlzIENsb3VkRnJvbnQgY2FuIHVzZSB0byB2YWxpZGF0ZSBzaWduZWQgVVJMcyBvciBzaWduZWQgY29va2llcy5cbiAqICBXaGVuIGEgY2FjaGUgYmVoYXZpb3IgY29udGFpbnMgdHJ1c3RlZCBzaWduZXJzLCBDbG91ZEZyb250IHJlcXVpcmVzIHNpZ25lZCBVUkxzIG9yIHNpZ25lZCBjb29raWVzIGZvciBhbGwgcmVxdWVzdHMgdGhhdCBtYXRjaCB0aGUgY2FjaGUgYmVoYXZpb3IuIFRoZSBVUkxzIG9yIGNvb2tpZXMgbXVzdCBiZSBzaWduZWQgd2l0aCB0aGUgcHJpdmF0ZSBrZXkgb2YgYSBDbG91ZEZyb250IGtleSBwYWlyIGluIHRoZSB0cnVzdGVkIHNpZ25lcidzIEFXUy1hY2NvdW50LiBUaGUgc2lnbmVkIFVSTCBvciBjb29raWUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggcHVibGljIGtleSBDbG91ZEZyb250IHNob3VsZCB1c2UgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpbmcgcHJpdmF0ZSBjb250ZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvUHJpdmF0ZUNvbnRlbnQuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5UcnVzdGVkU2lnbmVycz86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSBwcm90b2NvbCB0aGF0IHZpZXdlcnMgY2FuIHVzZSB0byBhY2Nlc3MgdGhlIGZpbGVzIGluIHRoZSBvcmlnaW4gc3BlY2lmaWVkIGJ5IGBgVGFyZ2V0T3JpZ2luSWRgYCB3aGVuIGEgcmVxdWVzdCBtYXRjaGVzIHRoZSBwYXRoIHBhdHRlcm4gaW4gYGBQYXRoUGF0dGVybmBgLiBZb3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICogICArICAgYGBhbGxvdy1hbGxgYDogVmlld2VycyBjYW4gdXNlIEhUVFAgb3IgSFRUUFMuXG4gKiAgICsgICBgYHJlZGlyZWN0LXRvLWh0dHBzYGA6IElmIGEgdmlld2VyIHN1Ym1pdHMgYW4gSFRUUCByZXF1ZXN0LCBDbG91ZEZyb250IHJldHVybnMgYW4gSFRUUCBzdGF0dXMgY29kZSBvZiAzMDEgKE1vdmVkIFBlcm1hbmVudGx5KSB0byB0aGUgdmlld2VyIGFsb25nIHdpdGggdGhlIEhUVFBTIFVSTC4gVGhlIHZpZXdlciB0aGVuIHJlc3VibWl0cyB0aGUgcmVxdWVzdCB1c2luZyB0aGUgbmV3IFVSTC5cbiAqICAgKyAgIGBgaHR0cHMtb25seWBgOiBJZiBhIHZpZXdlciBzZW5kcyBhbiBIVFRQIHJlcXVlc3QsIENsb3VkRnJvbnQgcmV0dXJucyBhbiBIVFRQIHN0YXR1cyBjb2RlIG9mIDQwMyAoRm9yYmlkZGVuKS5cbiAqICAgXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcmVxdWlyaW5nIHRoZSBIVFRQUyBwcm90b2NvbCwgc2VlIFtSZXF1aXJpbmcgSFRUUFMgQmV0d2VlbiBWaWV3ZXJzIGFuZCBDbG91ZEZyb250XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctaHR0cHMtdmlld2Vycy10by1jbG91ZGZyb250Lmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgVGhlIG9ubHkgd2F5IHRvIGd1YXJhbnRlZSB0aGF0IHZpZXdlcnMgcmV0cmlldmUgYW4gb2JqZWN0IHRoYXQgd2FzIGZldGNoZWQgZnJvbSB0aGUgb3JpZ2luIHVzaW5nIEhUVFBTIGlzIG5ldmVyIHRvIHVzZSBhbnkgb3RoZXIgcHJvdG9jb2wgdG8gZmV0Y2ggdGhlIG9iamVjdC4gSWYgeW91IGhhdmUgcmVjZW50bHkgY2hhbmdlZCBmcm9tIEhUVFAgdG8gSFRUUFMsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBjbGVhciB5b3VyIG9iamVjdHMnIGNhY2hlIGJlY2F1c2UgY2FjaGVkIG9iamVjdHMgYXJlIHByb3RvY29sIGFnbm9zdGljLiBUaGF0IG1lYW5zIHRoYXQgYW4gZWRnZSBsb2NhdGlvbiB3aWxsIHJldHVybiBhbiBvYmplY3QgZnJvbSB0aGUgY2FjaGUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjdXJyZW50IHJlcXVlc3QgcHJvdG9jb2wgbWF0Y2hlcyB0aGUgcHJvdG9jb2wgdXNlZCBwcmV2aW91c2x5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtNYW5hZ2luZyBDYWNoZSBFeHBpcmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvRXhwaXJhdGlvbi5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cblZpZXdlclByb3RvY29sUG9saWN5OiBzdHJpbmdcbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgY2FjaGUgcG9saWN5IG9yIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBpbnN0ZWFkIG9mIHRoaXMgZmllbGQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1dvcmtpbmcgd2l0aCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3dvcmtpbmctd2l0aC1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSB2YWx1ZXMgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IHdhbnQgdG8gc2VuZCB2YWx1ZXMgdG8gdGhlIG9yaWdpbiBidXQgbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgYGBDYWNoZUJlaGF2aW9yYGAgbXVzdCBpbmNsdWRlIGVpdGhlciBhIGBgQ2FjaGVQb2xpY3lJZGBgIG9yIGBgRm9yd2FyZGVkVmFsdWVzYGAuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBgYENhY2hlUG9saWN5SWRgYC5cbiAqICBBIGNvbXBsZXggdHlwZSB0aGF0IHNwZWNpZmllcyBob3cgQ2xvdWRGcm9udCBoYW5kbGVzIHF1ZXJ5IHN0cmluZ3MsIGNvb2tpZXMsIGFuZCBIVFRQIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZGVkVmFsdWVzIHtcbkNvb2tpZXM/OiBDb29raWVzXG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBhIGNhY2hlIHBvbGljeSBvciBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLlxuICogIElmIHlvdSB3YW50IHRvIGluY2x1ZGUgaGVhZGVycyBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYSBjYWNoZSBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sI2NhY2hlLWtleS1jcmVhdGUtY2FjaGUtcG9saWN5KSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IHdhbnQgdG8gc2VuZCBoZWFkZXJzIHRvIHRoZSBvcmlnaW4gYnV0IG5vdCBpbmNsdWRlIHRoZW0gaW4gdGhlIGNhY2hlIGtleSwgdXNlIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgb3JpZ2luIHJlcXVlc3QgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbCNvcmlnaW4tcmVxdWVzdC1jcmVhdGUtb3JpZ2luLXJlcXVlc3QtcG9saWN5KSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgQSBjb21wbGV4IHR5cGUgdGhhdCBzcGVjaWZpZXMgdGhlIGBgSGVhZGVyc2BgLCBpZiBhbnksIHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBmb3J3YXJkIHRvIHRoZSBvcmlnaW4gZm9yIHRoaXMgY2FjaGUgYmVoYXZpb3IgKHdoaXRlbGlzdGVkIGhlYWRlcnMpLiBGb3IgdGhlIGhlYWRlcnMgdGhhdCB5b3Ugc3BlY2lmeSwgQ2xvdWRGcm9udCBhbHNvIGNhY2hlcyBzZXBhcmF0ZSB2ZXJzaW9ucyBvZiBhIHNwZWNpZmllZCBvYmplY3QgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaGVhZGVyIHZhbHVlcyBpbiB2aWV3ZXIgcmVxdWVzdHMuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ2FjaGluZyBDb250ZW50IEJhc2VkIG9uIFJlcXVlc3QgSGVhZGVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2hlYWRlci1jYWNoaW5nLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuSGVhZGVycz86IHN0cmluZ1tdXG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBhIGNhY2hlIHBvbGljeSBvciBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLlxuICogIElmIHlvdSB3YW50IHRvIGluY2x1ZGUgcXVlcnkgc3RyaW5ncyBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYSBjYWNoZSBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sI2NhY2hlLWtleS1jcmVhdGUtY2FjaGUtcG9saWN5KSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IHdhbnQgdG8gc2VuZCBxdWVyeSBzdHJpbmdzIHRvIHRoZSBvcmlnaW4gYnV0IG5vdCBpbmNsdWRlIHRoZW0gaW4gdGhlIGNhY2hlIGtleSwgdXNlIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgb3JpZ2luIHJlcXVlc3QgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbCNvcmlnaW4tcmVxdWVzdC1jcmVhdGUtb3JpZ2luLXJlcXVlc3QtcG9saWN5KSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSW5kaWNhdGVzIHdoZXRoZXIgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBmb3J3YXJkIHF1ZXJ5IHN0cmluZ3MgdG8gdGhlIG9yaWdpbiB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhY2hlIGJlaGF2aW9yIGFuZCBjYWNoZSBiYXNlZCBvbiB0aGUgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMuIENsb3VkRnJvbnQgYmVoYXZpb3IgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgYGBRdWVyeVN0cmluZ2BgIGFuZCBvbiB0aGUgdmFsdWVzIHRoYXQgeW91IHNwZWNpZnkgZm9yIGBgUXVlcnlTdHJpbmdDYWNoZUtleXNgYCwgaWYgYW55OlxuICogIElmIHlvdSBzcGVjaWZ5IHRydWUgZm9yIGBgUXVlcnlTdHJpbmdgYCBhbmQgeW91IGRvbid0IHNwZWNpZnkgYW55IHZhbHVlcyBmb3IgYGBRdWVyeVN0cmluZ0NhY2hlS2V5c2BgLCBDbG91ZEZyb250IGZvcndhcmRzIGFsbCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0byB0aGUgb3JpZ2luIGFuZCBjYWNoZXMgYmFzZWQgb24gYWxsIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzLiBEZXBlbmRpbmcgb24gaG93IG1hbnkgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgYW5kIHZhbHVlcyB5b3UgaGF2ZSwgdGhpcyBjYW4gYWR2ZXJzZWx5IGFmZmVjdCBwZXJmb3JtYW5jZSBiZWNhdXNlIENsb3VkRnJvbnQgbXVzdCBmb3J3YXJkIG1vcmUgcmVxdWVzdHMgdG8gdGhlIG9yaWdpbi5cbiAqICBJZiB5b3Ugc3BlY2lmeSB0cnVlIGZvciBgYFF1ZXJ5U3RyaW5nYGAgYW5kIHlvdSBzcGVjaWZ5IG9uZSBvciBtb3JlIHZhbHVlcyBmb3IgYGBRdWVyeVN0cmluZ0NhY2hlS2V5c2BgLCBDbG91ZEZyb250IGZvcndhcmRzIGFsbCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0byB0aGUgb3JpZ2luLCBidXQgaXQgb25seSBjYWNoZXMgYmFzZWQgb24gdGhlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRoYXQgeW91IHNwZWNpZnkuXG4gKiAgSWYgeW91IHNwZWNpZnkgZmFsc2UgZm9yIGBgUXVlcnlTdHJpbmdgYCwgQ2xvdWRGcm9udCBkb2Vzbid0IGZvcndhcmQgYW55IHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRvIHRoZSBvcmlnaW4sIGFuZCBkb2Vzbid0IGNhY2hlIGJhc2VkIG9uIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NvbmZpZ3VyaW5nIENsb3VkRnJvbnQgdG8gQ2FjaGUgQmFzZWQgb24gUXVlcnkgU3RyaW5nIFBhcmFtZXRlcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9RdWVyeVN0cmluZ1BhcmFtZXRlcnMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5RdWVyeVN0cmluZzogYm9vbGVhblxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIHF1ZXJ5IHN0cmluZ3MgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHlvdSB3YW50IHRvIHNlbmQgcXVlcnkgc3RyaW5ncyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byB1c2UgZm9yIGNhY2hpbmcgZm9yIHRoaXMgY2FjaGUgYmVoYXZpb3IuXG4gKi9cblF1ZXJ5U3RyaW5nQ2FjaGVLZXlzPzogc3RyaW5nW11cbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgY2FjaGUgcG9saWN5IG9yIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBpbnN0ZWFkIG9mIHRoaXMgZmllbGQuXG4gKiAgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBjb29raWVzIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhIGNhY2hlIHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBzZW5kIGNvb2tpZXMgdG8gdGhlIG9yaWdpbiBidXQgbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBBIGNvbXBsZXggdHlwZSB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZm9yd2FyZCBjb29raWVzIHRvIHRoZSBvcmlnaW4gYW5kLCBpZiBzbywgd2hpY2ggb25lcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZm9yd2FyZGluZyBjb29raWVzIHRvIHRoZSBvcmlnaW4sIHNlZSBbSG93IENsb3VkRnJvbnQgRm9yd2FyZHMsIENhY2hlcywgYW5kIExvZ3MgQ29va2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0Nvb2tpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvb2tpZXMge1xuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIGNvb2tpZXMgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHlvdSB3YW50IHRvIHNlbmQgY29va2llcyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFNwZWNpZmllcyB3aGljaCBjb29raWVzIHRvIGZvcndhcmQgdG8gdGhlIG9yaWdpbiBmb3IgdGhpcyBjYWNoZSBiZWhhdmlvcjogYWxsLCBub25lLCBvciB0aGUgbGlzdCBvZiBjb29raWVzIHNwZWNpZmllZCBpbiB0aGUgYGBXaGl0ZWxpc3RlZE5hbWVzYGAgY29tcGxleCB0eXBlLlxuICogIEFtYXpvbiBTMyBkb2Vzbid0IHByb2Nlc3MgY29va2llcy4gV2hlbiB0aGUgY2FjaGUgYmVoYXZpb3IgaXMgZm9yd2FyZGluZyByZXF1ZXN0cyB0byBhbiBBbWF6b24gUzMgb3JpZ2luLCBzcGVjaWZ5IG5vbmUgZm9yIHRoZSBgYEZvcndhcmRgYCBlbGVtZW50LlxuICovXG5Gb3J3YXJkOiBzdHJpbmdcbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgY2FjaGUgcG9saWN5IG9yIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBpbnN0ZWFkIG9mIHRoaXMgZmllbGQuXG4gKiAgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBjb29raWVzIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhIGNhY2hlIHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBzZW5kIGNvb2tpZXMgdG8gdGhlIG9yaWdpbiBidXQgbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBSZXF1aXJlZCBpZiB5b3Ugc3BlY2lmeSBgYHdoaXRlbGlzdGBgIGZvciB0aGUgdmFsdWUgb2YgYGBGb3J3YXJkYGAuIEEgY29tcGxleCB0eXBlIHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IGRpZmZlcmVudCBjb29raWVzIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZm9yd2FyZCB0byB0aGUgb3JpZ2luIGZvciB0aGlzIGNhY2hlIGJlaGF2aW9yIGFuZCwgaWYgeW91IHdhbnQgdG8gZm9yd2FyZCBzZWxlY3RlZCBjb29raWVzLCB0aGUgbmFtZXMgb2YgdGhvc2UgY29va2llcy5cbiAqICBJZiB5b3Ugc3BlY2lmeSBgYGFsbGBgIG9yIGBgbm9uZWBgIGZvciB0aGUgdmFsdWUgb2YgYGBGb3J3YXJkYGAsIG9taXQgYGBXaGl0ZWxpc3RlZE5hbWVzYGAuIElmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGBgRm9yd2FyZGBgIGZyb20gYGB3aGl0ZWxpc3RgYCB0byBgYGFsbGBgIG9yIGBgbm9uZWBgIGFuZCB5b3UgZG9uJ3QgZGVsZXRlIHRoZSBgYFdoaXRlbGlzdGVkTmFtZXNgYCBlbGVtZW50IGFuZCBpdHMgY2hpbGQgZWxlbWVudHMsIENsb3VkRnJvbnQgZGVsZXRlcyB0aGVtIGF1dG9tYXRpY2FsbHkuXG4gKiAgRm9yIHRoZSBjdXJyZW50IGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY29va2llIG5hbWVzIHRoYXQgeW91IGNhbiB3aGl0ZWxpc3QgZm9yIGVhY2ggY2FjaGUgYmVoYXZpb3IsIHNlZSBbQ2xvdWRGcm9udCBMaW1pdHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nZW5lcmFsL2xhdGVzdC9nci94cmVmYXdzX3NlcnZpY2VfbGltaXRzLmh0bWwjbGltaXRzX2Nsb3VkZnJvbnQpIGluIHRoZSAqR2VuZXJhbCBSZWZlcmVuY2UqLlxuICovXG5XaGl0ZWxpc3RlZE5hbWVzPzogc3RyaW5nW11cbn1cbi8qKlxuICogQSBDbG91ZEZyb250IGZ1bmN0aW9uIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgY2FjaGUgYmVoYXZpb3IgaW4gYSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkFzc29jaWF0aW9uIHtcbi8qKlxuICogVGhlIGV2ZW50IHR5cGUgb2YgdGhlIGZ1bmN0aW9uLCBlaXRoZXIgYGB2aWV3ZXItcmVxdWVzdGBgIG9yIGBgdmlld2VyLXJlc3BvbnNlYGAuIFlvdSBjYW5ub3QgdXNlIG9yaWdpbi1mYWNpbmcgZXZlbnQgdHlwZXMgKGBgb3JpZ2luLXJlcXVlc3RgYCBhbmQgYGBvcmlnaW4tcmVzcG9uc2VgYCkgd2l0aCBhIENsb3VkRnJvbnQgZnVuY3Rpb24uXG4gKi9cbkV2ZW50VHlwZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5GdW5jdGlvbkFSTj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgZ1JQQyBjb25maWd1cmF0aW9uIGZvciB5b3VyIGNhY2hlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdycGNDb25maWcge1xuLyoqXG4gKiBFbmFibGVzIHlvdXIgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcmVjZWl2ZSBnUlBDIHJlcXVlc3RzIGFuZCB0byBwcm94eSB0aGVtIGRpcmVjdGx5IHRvIHlvdXIgb3JpZ2lucy5cbiAqL1xuRW5hYmxlZDogYm9vbGVhblxufVxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRhaW5zIGEgTGFtYmRhQEVkZ2UgZnVuY3Rpb24gYXNzb2NpYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Bc3NvY2lhdGlvbiB7XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgZXZlbnQgdHlwZSB0aGF0IHRyaWdnZXJzIGEgTGFtYmRhQEVkZ2UgZnVuY3Rpb24gaW52b2NhdGlvbi4gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICogICArICAgYGB2aWV3ZXItcmVxdWVzdGBgOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgd2hlbiBDbG91ZEZyb250IHJlY2VpdmVzIGEgcmVxdWVzdCBmcm9tIGEgdmlld2VyIGFuZCBiZWZvcmUgaXQgY2hlY2tzIHRvIHNlZSB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGluIHRoZSBlZGdlIGNhY2hlLlxuICogICArICAgYGBvcmlnaW4tcmVxdWVzdGBgOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgb25seSB3aGVuIENsb3VkRnJvbnQgc2VuZHMgYSByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luLiBXaGVuIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGluIHRoZSBlZGdlIGNhY2hlLCB0aGUgZnVuY3Rpb24gZG9lc24ndCBleGVjdXRlLlxuICogICArICAgYGBvcmlnaW4tcmVzcG9uc2VgYDogVGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGFmdGVyIENsb3VkRnJvbnQgcmVjZWl2ZXMgYSByZXNwb25zZSBmcm9tIHRoZSBvcmlnaW4gYW5kIGJlZm9yZSBpdCBjYWNoZXMgdGhlIG9iamVjdCBpbiB0aGUgcmVzcG9uc2UuIFdoZW4gdGhlIHJlcXVlc3RlZCBvYmplY3QgaXMgaW4gdGhlIGVkZ2UgY2FjaGUsIHRoZSBmdW5jdGlvbiBkb2Vzbid0IGV4ZWN1dGUuXG4gKiAgICsgICBgYHZpZXdlci1yZXNwb25zZWBgOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgYmVmb3JlIENsb3VkRnJvbnQgcmV0dXJucyB0aGUgcmVxdWVzdGVkIG9iamVjdCB0byB0aGUgdmlld2VyLiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBvYmplY3Qgd2FzIGFscmVhZHkgaW4gdGhlIGVkZ2UgY2FjaGUuXG4gKiAgSWYgdGhlIG9yaWdpbiByZXR1cm5zIGFuIEhUVFAgc3RhdHVzIGNvZGUgb3RoZXIgdGhhbiBIVFRQIDIwMCAoT0spLCB0aGUgZnVuY3Rpb24gZG9lc24ndCBleGVjdXRlLlxuICovXG5FdmVudFR5cGU/OiBzdHJpbmdcbi8qKlxuICogQSBmbGFnIHRoYXQgYWxsb3dzIGEgTGFtYmRhQEVkZ2UgZnVuY3Rpb24gdG8gaGF2ZSByZWFkIGFjY2VzcyB0byB0aGUgYm9keSBjb250ZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBY2Nlc3NpbmcgdGhlIFJlcXVlc3QgQm9keSBieSBDaG9vc2luZyB0aGUgSW5jbHVkZSBCb2R5IE9wdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2xhbWJkYS1pbmNsdWRlLWJvZHktYWNjZXNzLmh0bWwpIGluIHRoZSBBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUuXG4gKi9cbkluY2x1ZGVCb2R5PzogYm9vbGVhblxuLyoqXG4gKiBUaGUgQVJOIG9mIHRoZSBMYW1iZGFARWRnZSBmdW5jdGlvbi4gWW91IG11c3Qgc3BlY2lmeSB0aGUgQVJOIG9mIGEgZnVuY3Rpb24gdmVyc2lvbjsgeW91IGNhbid0IHNwZWNpZnkgYW4gYWxpYXMgb3IgJExBVEVTVC5cbiAqL1xuTGFtYmRhRnVuY3Rpb25BUk4/OiBzdHJpbmdcbn1cbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250cm9sczpcbiAqICAgKyAgV2hldGhlciBDbG91ZEZyb250IHJlcGxhY2VzIEhUVFAgc3RhdHVzIGNvZGVzIGluIHRoZSA0eHggYW5kIDV4eCByYW5nZSB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlcyBiZWZvcmUgcmV0dXJuaW5nIHRoZSByZXNwb25zZSB0byB0aGUgdmlld2VyLlxuICogICArICBIb3cgbG9uZyBDbG91ZEZyb250IGNhY2hlcyBIVFRQIHN0YXR1cyBjb2RlcyBpbiB0aGUgNHh4IGFuZCA1eHggcmFuZ2UuXG4gKiAgIFxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGN1c3RvbSBlcnJvciBwYWdlcywgc2VlIFtDdXN0b21pemluZyBFcnJvciBSZXNwb25zZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jdXN0b20tZXJyb3ItcGFnZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUVycm9yUmVzcG9uc2Uge1xuLyoqXG4gKiBUaGUgbWluaW11bSBhbW91bnQgb2YgdGltZSwgaW4gc2Vjb25kcywgdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIGNhY2hlIHRoZSBIVFRQIHN0YXR1cyBjb2RlIHNwZWNpZmllZCBpbiBgYEVycm9yQ29kZWBgLiBXaGVuIHRoaXMgdGltZSBwZXJpb2QgaGFzIGVsYXBzZWQsIENsb3VkRnJvbnQgcXVlcmllcyB5b3VyIG9yaWdpbiB0byBzZWUgd2hldGhlciB0aGUgcHJvYmxlbSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IgaGFzIGJlZW4gcmVzb2x2ZWQgYW5kIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIG5vdyBhdmFpbGFibGUuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3VzdG9taXppbmcgRXJyb3IgUmVzcG9uc2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY3VzdG9tLWVycm9yLXBhZ2VzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRXJyb3JDYWNoaW5nTWluVFRMPzogbnVtYmVyXG4vKipcbiAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGZvciB3aGljaCB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgY3VzdG9tIGVycm9yIHBhZ2UgYW5kL29yIGEgY2FjaGluZyBkdXJhdGlvbi5cbiAqL1xuRXJyb3JDb2RlOiBudW1iZXJcbi8qKlxuICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHJldHVybiB0byB0aGUgdmlld2VyIGFsb25nIHdpdGggdGhlIGN1c3RvbSBlcnJvciBwYWdlLiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIHJlYXNvbnMgdGhhdCB5b3UgbWlnaHQgd2FudCBDbG91ZEZyb250IHRvIHJldHVybiBhIHN0YXR1cyBjb2RlIGRpZmZlcmVudCBmcm9tIHRoZSBzdGF0dXMgY29kZSB0aGF0IHlvdXIgb3JpZ2luIHJldHVybmVkIHRvIENsb3VkRnJvbnQsIGZvciBleGFtcGxlOlxuICogICArICBTb21lIEludGVybmV0IGRldmljZXMgKHNvbWUgZmlyZXdhbGxzIGFuZCBjb3Jwb3JhdGUgcHJveGllcywgZm9yIGV4YW1wbGUpIGludGVyY2VwdCBIVFRQIDR4eCBhbmQgNXh4IGFuZCBwcmV2ZW50IHRoZSByZXNwb25zZSBmcm9tIGJlaW5nIHJldHVybmVkIHRvIHRoZSB2aWV3ZXIuIElmIHlvdSBzdWJzdGl0dXRlIGBgMjAwYGAsIHRoZSByZXNwb25zZSB0eXBpY2FsbHkgd29uJ3QgYmUgaW50ZXJjZXB0ZWQuXG4gKiAgICsgIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IGRpc3Rpbmd1aXNoaW5nIGFtb25nIGRpZmZlcmVudCBjbGllbnQgZXJyb3JzIG9yIHNlcnZlciBlcnJvcnMsIHlvdSBjYW4gc3BlY2lmeSBgYDQwMGBgIG9yIGBgNTAwYGAgYXMgdGhlIGBgUmVzcG9uc2VDb2RlYGAgZm9yIGFsbCA0eHggb3IgNXh4IGVycm9ycy5cbiAqICAgKyAgWW91IG1pZ2h0IHdhbnQgdG8gcmV0dXJuIGEgYGAyMDBgYCBzdGF0dXMgY29kZSAoT0spIGFuZCBzdGF0aWMgd2Vic2l0ZSBzbyB5b3VyIGN1c3RvbWVycyBkb24ndCBrbm93IHRoYXQgeW91ciB3ZWJzaXRlIGlzIGRvd24uXG4gKiAgIFxuICogIElmIHlvdSBzcGVjaWZ5IGEgdmFsdWUgZm9yIGBgUmVzcG9uc2VDb2RlYGAsIHlvdSBtdXN0IGFsc28gc3BlY2lmeSBhIHZhbHVlIGZvciBgYFJlc3BvbnNlUGFnZVBhdGhgYC5cbiAqL1xuUmVzcG9uc2VDb2RlPzogbnVtYmVyXG4vKipcbiAqIFRoZSBwYXRoIHRvIHRoZSBjdXN0b20gZXJyb3IgcGFnZSB0aGF0IHlvdSB3YW50IENsb3VkRnJvbnQgdG8gcmV0dXJuIHRvIGEgdmlld2VyIHdoZW4geW91ciBvcmlnaW4gcmV0dXJucyB0aGUgSFRUUCBzdGF0dXMgY29kZSBzcGVjaWZpZWQgYnkgYGBFcnJvckNvZGVgYCwgZm9yIGV4YW1wbGUsIGBgLzR4eC1lcnJvcnMvNDAzLWZvcmJpZGRlbi5odG1sYGAuIElmIHlvdSB3YW50IHRvIHN0b3JlIHlvdXIgb2JqZWN0cyBhbmQgeW91ciBjdXN0b20gZXJyb3IgcGFnZXMgaW4gZGlmZmVyZW50IGxvY2F0aW9ucywgeW91ciBkaXN0cmlidXRpb24gbXVzdCBpbmNsdWRlIGEgY2FjaGUgYmVoYXZpb3IgZm9yIHdoaWNoIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTpcbiAqICAgKyAgVGhlIHZhbHVlIG9mIGBgUGF0aFBhdHRlcm5gYCBtYXRjaGVzIHRoZSBwYXRoIHRvIHlvdXIgY3VzdG9tIGVycm9yIG1lc3NhZ2VzLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugc2F2ZWQgY3VzdG9tIGVycm9yIHBhZ2VzIGZvciA0eHggZXJyb3JzIGluIGFuIEFtYXpvbiBTMyBidWNrZXQgaW4gYSBkaXJlY3RvcnkgbmFtZWQgYGAvNHh4LWVycm9yc2BgLiBZb3VyIGRpc3RyaWJ1dGlvbiBtdXN0IGluY2x1ZGUgYSBjYWNoZSBiZWhhdmlvciBmb3Igd2hpY2ggdGhlIHBhdGggcGF0dGVybiByb3V0ZXMgcmVxdWVzdHMgZm9yIHlvdXIgY3VzdG9tIGVycm9yIHBhZ2VzIHRvIHRoYXQgbG9jYXRpb24sIGZvciBleGFtcGxlLCBgYC80eHgtZXJyb3JzLypgYC5cbiAqICAgKyAgVGhlIHZhbHVlIG9mIGBgVGFyZ2V0T3JpZ2luSWRgYCBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBgYElEYGAgZWxlbWVudCBmb3IgdGhlIG9yaWdpbiB0aGF0IGNvbnRhaW5zIHlvdXIgY3VzdG9tIGVycm9yIHBhZ2VzLlxuICogICBcbiAqICBJZiB5b3Ugc3BlY2lmeSBhIHZhbHVlIGZvciBgYFJlc3BvbnNlUGFnZVBhdGhgYCwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IGEgdmFsdWUgZm9yIGBgUmVzcG9uc2VDb2RlYGAuXG4gKiAgV2UgcmVjb21tZW5kIHRoYXQgeW91IHN0b3JlIGN1c3RvbSBlcnJvciBwYWdlcyBpbiBhbiBBbWF6b24gUzMgYnVja2V0LiBJZiB5b3Ugc3RvcmUgY3VzdG9tIGVycm9yIHBhZ2VzIG9uIGFuIEhUVFAgc2VydmVyIGFuZCB0aGUgc2VydmVyIHN0YXJ0cyB0byByZXR1cm4gNXh4IGVycm9ycywgQ2xvdWRGcm9udCBjYW4ndCBnZXQgdGhlIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gcmV0dXJuIHRvIHZpZXdlcnMgYmVjYXVzZSB0aGUgb3JpZ2luIHNlcnZlciBpcyB1bmF2YWlsYWJsZS5cbiAqL1xuUmVzcG9uc2VQYWdlUGF0aD86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgdXNlci1kZWZpbmVkIEhUVFAgc2VydmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvcmlnaW4gZm9yIGNvbnRlbnQgdGhhdCBDRiBkaXN0cmlidXRlcy5cbiAqICAgVGhpcyBwcm9wZXJ0eSBpcyBsZWdhY3kuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgW09yaWdpbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtY2xvdWRmcm9udC1kaXN0cmlidXRpb24tb3JpZ2luLmh0bWwpIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVnYWN5Q3VzdG9tT3JpZ2luIHtcbi8qKlxuICogVGhlIGRvbWFpbiBuYW1lIGFzc2lnbmVkIHRvIHlvdXIgQ0YgZGlzdHJpYnV0aW9uLlxuICovXG5ETlNOYW1lOiBzdHJpbmdcbi8qKlxuICogVGhlIEhUVFAgcG9ydCB0aGF0IENGIHVzZXMgdG8gY29ubmVjdCB0byB0aGUgb3JpZ2luLiBTcGVjaWZ5IHRoZSBIVFRQIHBvcnQgdGhhdCB0aGUgb3JpZ2luIGxpc3RlbnMgb24uXG4gKi9cbkhUVFBQb3J0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBIVFRQUyBwb3J0IHRoYXQgQ0YgdXNlcyB0byBjb25uZWN0IHRvIHRoZSBvcmlnaW4uIFNwZWNpZnkgdGhlIEhUVFBTIHBvcnQgdGhhdCB0aGUgb3JpZ2luIGxpc3RlbnMgb24uXG4gKi9cbkhUVFBTUG9ydD86IG51bWJlclxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHByb3RvY29sIChIVFRQIG9yIEhUVFBTKSB0aGF0IENGIHVzZXMgdG8gY29ubmVjdCB0byB0aGUgb3JpZ2luLlxuICovXG5PcmlnaW5Qcm90b2NvbFBvbGljeTogc3RyaW5nXG4vKipcbiAqIFRoZSBtaW5pbXVtIFNTTC9UTFMgcHJvdG9jb2wgdmVyc2lvbiB0aGF0IENGIHVzZXMgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggeW91ciBvcmlnaW4gc2VydmVyIG92ZXIgSFRUUHMuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWluaW11bSBPcmlnaW4gU1NMIFByb3RvY29sXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI0Rvd25sb2FkRGlzdFZhbHVlc09yaWdpblNTTFByb3RvY29scykgaW4gdGhlICpEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5PcmlnaW5TU0xQcm90b2NvbHM6IHN0cmluZ1tdXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBkZWZhdWx0IGNhY2hlIGJlaGF2aW9yIGlmIHlvdSBkb24ndCBzcGVjaWZ5IGEgYGBDYWNoZUJlaGF2aW9yYGAgZWxlbWVudCBvciBpZiBmaWxlcyBkb24ndCBtYXRjaCBhbnkgb2YgdGhlIHZhbHVlcyBvZiBgYFBhdGhQYXR0ZXJuYGAgaW4gYGBDYWNoZUJlaGF2aW9yYGAgZWxlbWVudHMuIFlvdSBtdXN0IGNyZWF0ZSBleGFjdGx5IG9uZSBkZWZhdWx0IGNhY2hlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRDYWNoZUJlaGF2aW9yIHtcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250cm9scyB3aGljaCBIVFRQIG1ldGhvZHMgQ2xvdWRGcm9udCBwcm9jZXNzZXMgYW5kIGZvcndhcmRzIHRvIHlvdXIgQW1hem9uIFMzIGJ1Y2tldCBvciB5b3VyIGN1c3RvbSBvcmlnaW4uIFRoZXJlIGFyZSB0aHJlZSBjaG9pY2VzOlxuICogICArICBDbG91ZEZyb250IGZvcndhcmRzIG9ubHkgYGBHRVRgYCBhbmQgYGBIRUFEYGAgcmVxdWVzdHMuXG4gKiAgICsgIENsb3VkRnJvbnQgZm9yd2FyZHMgb25seSBgYEdFVGBgLCBgYEhFQURgYCwgYW5kIGBgT1BUSU9OU2BgIHJlcXVlc3RzLlxuICogICArICBDbG91ZEZyb250IGZvcndhcmRzIGBgR0VULCBIRUFELCBPUFRJT05TLCBQVVQsIFBBVENILCBQT1NUYGAsIGFuZCBgYERFTEVURWBgIHJlcXVlc3RzLlxuICogICBcbiAqICBJZiB5b3UgcGljayB0aGUgdGhpcmQgY2hvaWNlLCB5b3UgbWF5IG5lZWQgdG8gcmVzdHJpY3QgYWNjZXNzIHRvIHlvdXIgQW1hem9uIFMzIGJ1Y2tldCBvciB0byB5b3VyIGN1c3RvbSBvcmlnaW4gc28gdXNlcnMgY2FuJ3QgcGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgeW91IGRvbid0IHdhbnQgdGhlbSB0by4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBub3Qgd2FudCB1c2VycyB0byBoYXZlIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBvYmplY3RzIGZyb20geW91ciBvcmlnaW4uXG4gKi9cbkFsbG93ZWRNZXRob2RzPzogc3RyaW5nW11cbi8qKlxuICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYWNoZSBwb2xpY3kgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtY2FjaGUtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgYGBEZWZhdWx0Q2FjaGVCZWhhdmlvcmBgIG11c3QgaW5jbHVkZSBlaXRoZXIgYSBgYENhY2hlUG9saWN5SWRgYCBvciBgYEZvcndhcmRlZFZhbHVlc2BgLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgYGBDYWNoZVBvbGljeUlkYGAuXG4gKi9cbkNhY2hlUG9saWN5SWQ/OiBzdHJpbmdcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250cm9scyB3aGV0aGVyIENsb3VkRnJvbnQgY2FjaGVzIHRoZSByZXNwb25zZSB0byByZXF1ZXN0cyB1c2luZyB0aGUgc3BlY2lmaWVkIEhUVFAgbWV0aG9kcy4gVGhlcmUgYXJlIHR3byBjaG9pY2VzOlxuICogICArICBDbG91ZEZyb250IGNhY2hlcyByZXNwb25zZXMgdG8gYGBHRVRgYCBhbmQgYGBIRUFEYGAgcmVxdWVzdHMuXG4gKiAgICsgIENsb3VkRnJvbnQgY2FjaGVzIHJlc3BvbnNlcyB0byBgYEdFVGBgLCBgYEhFQURgYCwgYW5kIGBgT1BUSU9OU2BgIHJlcXVlc3RzLlxuICogICBcbiAqICBJZiB5b3UgcGljayB0aGUgc2Vjb25kIGNob2ljZSBmb3IgeW91ciBBbWF6b24gUzMgT3JpZ2luLCB5b3UgbWF5IG5lZWQgdG8gZm9yd2FyZCBBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCwgQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1IZWFkZXJzLCBhbmQgT3JpZ2luIGhlYWRlcnMgZm9yIHRoZSByZXNwb25zZXMgdG8gYmUgY2FjaGVkIGNvcnJlY3RseS5cbiAqL1xuQ2FjaGVkTWV0aG9kcz86IHN0cmluZ1tdXG4vKipcbiAqIFdoZXRoZXIgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBhdXRvbWF0aWNhbGx5IGNvbXByZXNzIGNlcnRhaW4gZmlsZXMgZm9yIHRoaXMgY2FjaGUgYmVoYXZpb3IuIElmIHNvLCBzcGVjaWZ5IGBgdHJ1ZWBgOyBpZiBub3QsIHNwZWNpZnkgYGBmYWxzZWBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aW5nIENvbXByZXNzZWQgRmlsZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9TZXJ2aW5nQ29tcHJlc3NlZEZpbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ29tcHJlc3M/OiBib29sZWFuXG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB0aGUgYGBEZWZhdWx0VFRMYGAgZmllbGQgaW4gYSBjYWNoZSBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIGRlZmF1bHQgYW1vdW50IG9mIHRpbWUgdGhhdCB5b3Ugd2FudCBvYmplY3RzIHRvIHN0YXkgaW4gQ2xvdWRGcm9udCBjYWNoZXMgYmVmb3JlIENsb3VkRnJvbnQgZm9yd2FyZHMgYW5vdGhlciByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIHZhbHVlIHRoYXQgeW91IHNwZWNpZnkgYXBwbGllcyBvbmx5IHdoZW4geW91ciBvcmlnaW4gZG9lcyBub3QgYWRkIEhUVFAgaGVhZGVycyBzdWNoIGFzIGBgQ2FjaGUtQ29udHJvbCBtYXgtYWdlYGAsIGBgQ2FjaGUtQ29udHJvbCBzLW1heGFnZWBgLCBhbmQgYGBFeHBpcmVzYGAgdG8gb2JqZWN0cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWFuYWdpbmcgSG93IExvbmcgQ29udGVudCBTdGF5cyBpbiBhbiBFZGdlIENhY2hlIChFeHBpcmF0aW9uKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0V4cGlyYXRpb24uaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5EZWZhdWx0VFRMPzogbnVtYmVyXG4vKipcbiAqIFRoZSB2YWx1ZSBvZiBgYElEYGAgZm9yIHRoZSBmaWVsZC1sZXZlbCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHVzZSBmb3IgZW5jcnlwdGluZyBzcGVjaWZpYyBmaWVsZHMgb2YgZGF0YSBmb3IgdGhlIGRlZmF1bHQgY2FjaGUgYmVoYXZpb3IuXG4gKi9cbkZpZWxkTGV2ZWxFbmNyeXB0aW9uSWQ/OiBzdHJpbmdcbkZvcndhcmRlZFZhbHVlcz86IEZvcndhcmRlZFZhbHVlczFcbi8qKlxuICogQSBsaXN0IG9mIENsb3VkRnJvbnQgZnVuY3Rpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhY2hlIGJlaGF2aW9yLiBZb3VyIGZ1bmN0aW9ucyBtdXN0IGJlIHB1Ymxpc2hlZCB0byB0aGUgYGBMSVZFYGAgc3RhZ2UgdG8gYXNzb2NpYXRlIHRoZW0gd2l0aCBhIGNhY2hlIGJlaGF2aW9yLlxuICovXG5GdW5jdGlvbkFzc29jaWF0aW9ucz86IEZ1bmN0aW9uQXNzb2NpYXRpb25bXVxuR3JwY0NvbmZpZz86IEdycGNDb25maWcxXG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgemVybyBvciBtb3JlIExhbWJkYUBFZGdlIGZ1bmN0aW9uIGFzc29jaWF0aW9ucyBmb3IgYSBjYWNoZSBiZWhhdmlvci5cbiAqL1xuTGFtYmRhRnVuY3Rpb25Bc3NvY2lhdGlvbnM/OiBMYW1iZGFGdW5jdGlvbkFzc29jaWF0aW9uW11cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHRoZSBgYE1heFRUTGBgIGZpZWxkIGluIGEgY2FjaGUgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtY2FjaGUtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgeW91IHdhbnQgb2JqZWN0cyB0byBzdGF5IGluIENsb3VkRnJvbnQgY2FjaGVzIGJlZm9yZSBDbG91ZEZyb250IGZvcndhcmRzIGFub3RoZXIgcmVxdWVzdCB0byB5b3VyIG9yaWdpbiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgb2JqZWN0IGhhcyBiZWVuIHVwZGF0ZWQuIFRoZSB2YWx1ZSB0aGF0IHlvdSBzcGVjaWZ5IGFwcGxpZXMgb25seSB3aGVuIHlvdXIgb3JpZ2luIGFkZHMgSFRUUCBoZWFkZXJzIHN1Y2ggYXMgYGBDYWNoZS1Db250cm9sIG1heC1hZ2VgYCwgYGBDYWNoZS1Db250cm9sIHMtbWF4YWdlYGAsIGFuZCBgYEV4cGlyZXNgYCB0byBvYmplY3RzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtNYW5hZ2luZyBIb3cgTG9uZyBDb250ZW50IFN0YXlzIGluIGFuIEVkZ2UgQ2FjaGUgKEV4cGlyYXRpb24pXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvRXhwaXJhdGlvbi5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk1heFRUTD86IG51bWJlclxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdGhlIGBgTWluVFRMYGAgZmllbGQgaW4gYSBjYWNoZSBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCB5b3Ugd2FudCBvYmplY3RzIHRvIHN0YXkgaW4gQ2xvdWRGcm9udCBjYWNoZXMgYmVmb3JlIENsb3VkRnJvbnQgZm9yd2FyZHMgYW5vdGhlciByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gdXBkYXRlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWFuYWdpbmcgSG93IExvbmcgQ29udGVudCBTdGF5cyBpbiBhbiBFZGdlIENhY2hlIChFeHBpcmF0aW9uKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0V4cGlyYXRpb24uaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBtdXN0IHNwZWNpZnkgYGAwYGAgZm9yIGBgTWluVFRMYGAgaWYgeW91IGNvbmZpZ3VyZSBDbG91ZEZyb250IHRvIGZvcndhcmQgYWxsIGhlYWRlcnMgdG8geW91ciBvcmlnaW4gKHVuZGVyIGBgSGVhZGVyc2BgLCBpZiB5b3Ugc3BlY2lmeSBgYDFgYCBmb3IgYGBRdWFudGl0eWBgIGFuZCBgYCpgYCBmb3IgYGBOYW1lYGApLlxuICovXG5NaW5UVEw/OiBudW1iZXJcbi8qKlxuICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgb3JpZ2luIHJlcXVlc3QgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbCNvcmlnaW4tcmVxdWVzdC1jcmVhdGUtb3JpZ2luLXJlcXVlc3QtcG9saWN5KSBvciBbVXNpbmcgdGhlIG1hbmFnZWQgb3JpZ2luIHJlcXVlc3QgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuT3JpZ2luUmVxdWVzdFBvbGljeUlkPzogc3RyaW5nXG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgcmVhbC10aW1lIGxvZyBjb25maWd1cmF0aW9uIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhpcyBjYWNoZSBiZWhhdmlvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUmVhbC10aW1lIGxvZ3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9yZWFsLXRpbWUtbG9ncy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cblJlYWx0aW1lTG9nQ29uZmlnQXJuPzogc3RyaW5nXG4vKipcbiAqIFRoZSBpZGVudGlmaWVyIGZvciBhIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICovXG5SZXNwb25zZUhlYWRlcnNQb2xpY3lJZD86IHN0cmluZ1xuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB5b3Ugd2FudCB0byBkaXN0cmlidXRlIG1lZGlhIGZpbGVzIGluIHRoZSBNaWNyb3NvZnQgU21vb3RoIFN0cmVhbWluZyBmb3JtYXQgdXNpbmcgdGhlIG9yaWdpbiB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhY2hlIGJlaGF2aW9yLiBJZiBzbywgc3BlY2lmeSBgYHRydWVgYDsgaWYgbm90LCBzcGVjaWZ5IGBgZmFsc2VgYC4gSWYgeW91IHNwZWNpZnkgYGB0cnVlYGAgZm9yIGBgU21vb3RoU3RyZWFtaW5nYGAsIHlvdSBjYW4gc3RpbGwgZGlzdHJpYnV0ZSBvdGhlciBjb250ZW50IHVzaW5nIHRoaXMgY2FjaGUgYmVoYXZpb3IgaWYgdGhlIGNvbnRlbnQgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgYGBQYXRoUGF0dGVybmBgLlxuICovXG5TbW9vdGhTdHJlYW1pbmc/OiBib29sZWFuXG4vKipcbiAqIFRoZSB2YWx1ZSBvZiBgYElEYGAgZm9yIHRoZSBvcmlnaW4gdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHJvdXRlIHJlcXVlc3RzIHRvIHdoZW4gdGhleSB1c2UgdGhlIGRlZmF1bHQgY2FjaGUgYmVoYXZpb3IuXG4gKi9cblRhcmdldE9yaWdpbklkOiBzdHJpbmdcbi8qKlxuICogQSBsaXN0IG9mIGtleSBncm91cHMgdGhhdCBDbG91ZEZyb250IGNhbiB1c2UgdG8gdmFsaWRhdGUgc2lnbmVkIFVSTHMgb3Igc2lnbmVkIGNvb2tpZXMuXG4gKiAgV2hlbiBhIGNhY2hlIGJlaGF2aW9yIGNvbnRhaW5zIHRydXN0ZWQga2V5IGdyb3VwcywgQ2xvdWRGcm9udCByZXF1aXJlcyBzaWduZWQgVVJMcyBvciBzaWduZWQgY29va2llcyBmb3IgYWxsIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhlIGNhY2hlIGJlaGF2aW9yLiBUaGUgVVJMcyBvciBjb29raWVzIG11c3QgYmUgc2lnbmVkIHdpdGggYSBwcml2YXRlIGtleSB3aG9zZSBjb3JyZXNwb25kaW5nIHB1YmxpYyBrZXkgaXMgaW4gdGhlIGtleSBncm91cC4gVGhlIHNpZ25lZCBVUkwgb3IgY29va2llIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHB1YmxpYyBrZXkgQ2xvdWRGcm9udCBzaG91bGQgdXNlIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aW5nIHByaXZhdGUgY29udGVudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL1ByaXZhdGVDb250ZW50Lmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuVHJ1c3RlZEtleUdyb3Vwcz86IHN0cmluZ1tdXG4vKipcbiAqIFdlIHJlY29tbWVuZCB1c2luZyBgYFRydXN0ZWRLZXlHcm91cHNgYCBpbnN0ZWFkIG9mIGBgVHJ1c3RlZFNpZ25lcnNgYC5cbiAqICAgQSBsaXN0IG9mIEFXUy1hY2NvdW50IElEcyB3aG9zZSBwdWJsaWMga2V5cyBDbG91ZEZyb250IGNhbiB1c2UgdG8gdmFsaWRhdGUgc2lnbmVkIFVSTHMgb3Igc2lnbmVkIGNvb2tpZXMuXG4gKiAgV2hlbiBhIGNhY2hlIGJlaGF2aW9yIGNvbnRhaW5zIHRydXN0ZWQgc2lnbmVycywgQ2xvdWRGcm9udCByZXF1aXJlcyBzaWduZWQgVVJMcyBvciBzaWduZWQgY29va2llcyBmb3IgYWxsIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhlIGNhY2hlIGJlaGF2aW9yLiBUaGUgVVJMcyBvciBjb29raWVzIG11c3QgYmUgc2lnbmVkIHdpdGggdGhlIHByaXZhdGUga2V5IG9mIGEgQ2xvdWRGcm9udCBrZXkgcGFpciBpbiBhIHRydXN0ZWQgc2lnbmVyJ3MgQVdTLWFjY291bnQuIFRoZSBzaWduZWQgVVJMIG9yIGNvb2tpZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBwdWJsaWMga2V5IENsb3VkRnJvbnQgc2hvdWxkIHVzZSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmluZyBwcml2YXRlIGNvbnRlbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9Qcml2YXRlQ29udGVudC5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cblRydXN0ZWRTaWduZXJzPzogc3RyaW5nW11cbi8qKlxuICogVGhlIHByb3RvY29sIHRoYXQgdmlld2VycyBjYW4gdXNlIHRvIGFjY2VzcyB0aGUgZmlsZXMgaW4gdGhlIG9yaWdpbiBzcGVjaWZpZWQgYnkgYGBUYXJnZXRPcmlnaW5JZGBgIHdoZW4gYSByZXF1ZXN0IG1hdGNoZXMgdGhlIHBhdGggcGF0dGVybiBpbiBgYFBhdGhQYXR0ZXJuYGAuIFlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4gKiAgICsgICBgYGFsbG93LWFsbGBgOiBWaWV3ZXJzIGNhbiB1c2UgSFRUUCBvciBIVFRQUy5cbiAqICAgKyAgIGBgcmVkaXJlY3QtdG8taHR0cHNgYDogSWYgYSB2aWV3ZXIgc3VibWl0cyBhbiBIVFRQIHJlcXVlc3QsIENsb3VkRnJvbnQgcmV0dXJucyBhbiBIVFRQIHN0YXR1cyBjb2RlIG9mIDMwMSAoTW92ZWQgUGVybWFuZW50bHkpIHRvIHRoZSB2aWV3ZXIgYWxvbmcgd2l0aCB0aGUgSFRUUFMgVVJMLiBUaGUgdmlld2VyIHRoZW4gcmVzdWJtaXRzIHRoZSByZXF1ZXN0IHVzaW5nIHRoZSBuZXcgVVJMLlxuICogICArICAgYGBodHRwcy1vbmx5YGA6IElmIGEgdmlld2VyIHNlbmRzIGFuIEhUVFAgcmVxdWVzdCwgQ2xvdWRGcm9udCByZXR1cm5zIGFuIEhUVFAgc3RhdHVzIGNvZGUgb2YgNDAzIChGb3JiaWRkZW4pLlxuICogICBcbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCByZXF1aXJpbmcgdGhlIEhUVFBTIHByb3RvY29sLCBzZWUgW1JlcXVpcmluZyBIVFRQUyBCZXR3ZWVuIFZpZXdlcnMgYW5kIENsb3VkRnJvbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1odHRwcy12aWV3ZXJzLXRvLWNsb3VkZnJvbnQuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBUaGUgb25seSB3YXkgdG8gZ3VhcmFudGVlIHRoYXQgdmlld2VycyByZXRyaWV2ZSBhbiBvYmplY3QgdGhhdCB3YXMgZmV0Y2hlZCBmcm9tIHRoZSBvcmlnaW4gdXNpbmcgSFRUUFMgaXMgbmV2ZXIgdG8gdXNlIGFueSBvdGhlciBwcm90b2NvbCB0byBmZXRjaCB0aGUgb2JqZWN0LiBJZiB5b3UgaGF2ZSByZWNlbnRseSBjaGFuZ2VkIGZyb20gSFRUUCB0byBIVFRQUywgd2UgcmVjb21tZW5kIHRoYXQgeW91IGNsZWFyIHlvdXIgb2JqZWN0cycgY2FjaGUgYmVjYXVzZSBjYWNoZWQgb2JqZWN0cyBhcmUgcHJvdG9jb2wgYWdub3N0aWMuIFRoYXQgbWVhbnMgdGhhdCBhbiBlZGdlIGxvY2F0aW9uIHdpbGwgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjYWNoZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmVxdWVzdCBwcm90b2NvbCBtYXRjaGVzIHRoZSBwcm90b2NvbCB1c2VkIHByZXZpb3VzbHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW01hbmFnaW5nIENhY2hlIEV4cGlyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9FeHBpcmF0aW9uLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuVmlld2VyUHJvdG9jb2xQb2xpY3k6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbV29ya2luZyB3aXRoIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvd29ya2luZy13aXRoLXBvbGljaWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIHZhbHVlcyBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYSBjYWNoZSBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sI2NhY2hlLWtleS1jcmVhdGUtY2FjaGUtcG9saWN5KSBvciBbVXNpbmcgdGhlIG1hbmFnZWQgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLWNhY2hlLXBvbGljaWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBzZW5kIHZhbHVlcyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgQSBgYERlZmF1bHRDYWNoZUJlaGF2aW9yYGAgbXVzdCBpbmNsdWRlIGVpdGhlciBhIGBgQ2FjaGVQb2xpY3lJZGBgIG9yIGBgRm9yd2FyZGVkVmFsdWVzYGAuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBgYENhY2hlUG9saWN5SWRgYC5cbiAqICBBIGNvbXBsZXggdHlwZSB0aGF0IHNwZWNpZmllcyBob3cgQ2xvdWRGcm9udCBoYW5kbGVzIHF1ZXJ5IHN0cmluZ3MsIGNvb2tpZXMsIGFuZCBIVFRQIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZGVkVmFsdWVzMSB7XG5Db29raWVzPzogQ29va2llc1xuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIGhlYWRlcnMgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHlvdSB3YW50IHRvIHNlbmQgaGVhZGVycyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgY29tcGxleCB0eXBlIHRoYXQgc3BlY2lmaWVzIHRoZSBgYEhlYWRlcnNgYCwgaWYgYW55LCB0aGF0IHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZm9yd2FyZCB0byB0aGUgb3JpZ2luIGZvciB0aGlzIGNhY2hlIGJlaGF2aW9yICh3aGl0ZWxpc3RlZCBoZWFkZXJzKS4gRm9yIHRoZSBoZWFkZXJzIHRoYXQgeW91IHNwZWNpZnksIENsb3VkRnJvbnQgYWxzbyBjYWNoZXMgc2VwYXJhdGUgdmVyc2lvbnMgb2YgYSBzcGVjaWZpZWQgb2JqZWN0IHRoYXQgaXMgYmFzZWQgb24gdGhlIGhlYWRlciB2YWx1ZXMgaW4gdmlld2VyIHJlcXVlc3RzLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NhY2hpbmcgQ29udGVudCBCYXNlZCBvbiBSZXF1ZXN0IEhlYWRlcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9oZWFkZXItY2FjaGluZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbkhlYWRlcnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIHF1ZXJ5IHN0cmluZ3MgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHlvdSB3YW50IHRvIHNlbmQgcXVlcnkgc3RyaW5ncyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEluZGljYXRlcyB3aGV0aGVyIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZm9yd2FyZCBxdWVyeSBzdHJpbmdzIHRvIHRoZSBvcmlnaW4gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWNoZSBiZWhhdmlvciBhbmQgY2FjaGUgYmFzZWQgb24gdGhlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzLiBDbG91ZEZyb250IGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIGBgUXVlcnlTdHJpbmdgYCBhbmQgb24gdGhlIHZhbHVlcyB0aGF0IHlvdSBzcGVjaWZ5IGZvciBgYFF1ZXJ5U3RyaW5nQ2FjaGVLZXlzYGAsIGlmIGFueTpcbiAqICBJZiB5b3Ugc3BlY2lmeSB0cnVlIGZvciBgYFF1ZXJ5U3RyaW5nYGAgYW5kIHlvdSBkb24ndCBzcGVjaWZ5IGFueSB2YWx1ZXMgZm9yIGBgUXVlcnlTdHJpbmdDYWNoZUtleXNgYCwgQ2xvdWRGcm9udCBmb3J3YXJkcyBhbGwgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgdG8gdGhlIG9yaWdpbiBhbmQgY2FjaGVzIGJhc2VkIG9uIGFsbCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycy4gRGVwZW5kaW5nIG9uIGhvdyBtYW55IHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGFuZCB2YWx1ZXMgeW91IGhhdmUsIHRoaXMgY2FuIGFkdmVyc2VseSBhZmZlY3QgcGVyZm9ybWFuY2UgYmVjYXVzZSBDbG91ZEZyb250IG11c3QgZm9yd2FyZCBtb3JlIHJlcXVlc3RzIHRvIHRoZSBvcmlnaW4uXG4gKiAgSWYgeW91IHNwZWNpZnkgdHJ1ZSBmb3IgYGBRdWVyeVN0cmluZ2BgIGFuZCB5b3Ugc3BlY2lmeSBvbmUgb3IgbW9yZSB2YWx1ZXMgZm9yIGBgUXVlcnlTdHJpbmdDYWNoZUtleXNgYCwgQ2xvdWRGcm9udCBmb3J3YXJkcyBhbGwgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgdG8gdGhlIG9yaWdpbiwgYnV0IGl0IG9ubHkgY2FjaGVzIGJhc2VkIG9uIHRoZSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0aGF0IHlvdSBzcGVjaWZ5LlxuICogIElmIHlvdSBzcGVjaWZ5IGZhbHNlIGZvciBgYFF1ZXJ5U3RyaW5nYGAsIENsb3VkRnJvbnQgZG9lc24ndCBmb3J3YXJkIGFueSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0byB0aGUgb3JpZ2luLCBhbmQgZG9lc24ndCBjYWNoZSBiYXNlZCBvbiBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDb25maWd1cmluZyBDbG91ZEZyb250IHRvIENhY2hlIEJhc2VkIG9uIFF1ZXJ5IFN0cmluZyBQYXJhbWV0ZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvUXVlcnlTdHJpbmdQYXJhbWV0ZXJzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuUXVlcnlTdHJpbmc6IGJvb2xlYW5cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgY2FjaGUgcG9saWN5IG9yIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBpbnN0ZWFkIG9mIHRoaXMgZmllbGQuXG4gKiAgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBxdWVyeSBzdHJpbmdzIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhIGNhY2hlIHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBzZW5kIHF1ZXJ5IHN0cmluZ3MgdG8gdGhlIG9yaWdpbiBidXQgbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0aGF0IHlvdSB3YW50IENsb3VkRnJvbnQgdG8gdXNlIGZvciBjYWNoaW5nIGZvciB0aGlzIGNhY2hlIGJlaGF2aW9yLlxuICovXG5RdWVyeVN0cmluZ0NhY2hlS2V5cz86IHN0cmluZ1tdXG59XG4vKipcbiAqIFRoZSBnUlBDIGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgY2FjaGUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JwY0NvbmZpZzEge1xuLyoqXG4gKiBFbmFibGVzIHlvdXIgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcmVjZWl2ZSBnUlBDIHJlcXVlc3RzIGFuZCB0byBwcm94eSB0aGVtIGRpcmVjdGx5IHRvIHlvdXIgb3JpZ2lucy5cbiAqL1xuRW5hYmxlZDogYm9vbGVhblxufVxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgYWNjZXNzIGxvZ3MgYXJlIHdyaXR0ZW4gZm9yIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbG9nZ2luZywgc2VlIFtBY2Nlc3MgTG9nc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0FjY2Vzc0xvZ3MuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dpbmcge1xuLyoqXG4gKiBUaGUgQW1hem9uIFMzIGJ1Y2tldCB0byBzdG9yZSB0aGUgYWNjZXNzIGxvZ3MgaW4sIGZvciBleGFtcGxlLCBgYGFtem4tczMtZGVtby1idWNrZXQuczMuYW1hem9uYXdzLmNvbWBgLlxuICovXG5CdWNrZXQ/OiBzdHJpbmdcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBpbmNsdWRlIGNvb2tpZXMgaW4gYWNjZXNzIGxvZ3MsIHNwZWNpZnkgYGB0cnVlYGAgZm9yIGBgSW5jbHVkZUNvb2tpZXNgYC4gSWYgeW91IGNob29zZSB0byBpbmNsdWRlIGNvb2tpZXMgaW4gbG9ncywgQ2xvdWRGcm9udCBsb2dzIGFsbCBjb29raWVzIHJlZ2FyZGxlc3Mgb2YgaG93IHlvdSBjb25maWd1cmUgdGhlIGNhY2hlIGJlaGF2aW9ycyBmb3IgdGhpcyBkaXN0cmlidXRpb24uIElmIHlvdSBkb24ndCB3YW50IHRvIGluY2x1ZGUgY29va2llcyB3aGVuIHlvdSBjcmVhdGUgYSBkaXN0cmlidXRpb24gb3IgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBpbmNsdWRlIGNvb2tpZXMgZm9yIGFuIGV4aXN0aW5nIGRpc3RyaWJ1dGlvbiwgc3BlY2lmeSBgYGZhbHNlYGAgZm9yIGBgSW5jbHVkZUNvb2tpZXNgYC5cbiAqL1xuSW5jbHVkZUNvb2tpZXM/OiBib29sZWFuXG4vKipcbiAqIEFuIG9wdGlvbmFsIHN0cmluZyB0aGF0IHlvdSB3YW50IENsb3VkRnJvbnQgdG8gcHJlZml4IHRvIHRoZSBhY2Nlc3MgbG9nIGBgZmlsZW5hbWVzYGAgZm9yIHRoaXMgZGlzdHJpYnV0aW9uLCBmb3IgZXhhbXBsZSwgYGBteXByZWZpeC9gYC4gSWYgeW91IHdhbnQgdG8gZW5hYmxlIGxvZ2dpbmcsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBzcGVjaWZ5IGEgcHJlZml4LCB5b3Ugc3RpbGwgbXVzdCBpbmNsdWRlIGFuIGVtcHR5IGBgUHJlZml4YGAgZWxlbWVudCBpbiB0aGUgYGBMb2dnaW5nYGAgZWxlbWVudC5cbiAqL1xuUHJlZml4Pzogc3RyaW5nXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgb3JpZ2luIGdyb3VwcyBmb3IgdGhpcyBkaXN0cmlidXRpb24uXG4gKiAgU3BlY2lmeSBhIHZhbHVlIGZvciBlaXRoZXIgdGhlIGBgT3JpZ2luc2BgIG9yIGBgT3JpZ2luR3JvdXBzYGAgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luR3JvdXBzIHtcbi8qKlxuICogVGhlIGl0ZW1zIChvcmlnaW4gZ3JvdXBzKSBpbiBhIGRpc3RyaWJ1dGlvbi5cbiAqL1xuSXRlbXM/OiBPcmlnaW5Hcm91cFtdXG4vKipcbiAqIFRoZSBudW1iZXIgb2Ygb3JpZ2luIGdyb3Vwcy5cbiAqL1xuUXVhbnRpdHk6IG51bWJlclxufVxuLyoqXG4gKiBBbiBvcmlnaW4gZ3JvdXAgaW5jbHVkZXMgdHdvIG9yaWdpbnMgKGEgcHJpbWFyeSBvcmlnaW4gYW5kIGEgc2Vjb25kYXJ5IG9yaWdpbiB0byBmYWlsb3ZlciB0bykgYW5kIGEgZmFpbG92ZXIgY3JpdGVyaWEgdGhhdCB5b3Ugc3BlY2lmeS4gWW91IGNyZWF0ZSBhbiBvcmlnaW4gZ3JvdXAgdG8gc3VwcG9ydCBvcmlnaW4gZmFpbG92ZXIgaW4gQ2xvdWRGcm9udC4gV2hlbiB5b3UgY3JlYXRlIG9yIHVwZGF0ZSBhIGRpc3RyaWJ1dGlvbiwgeW91IGNhbiBzcGVjaWZ5IHRoZSBvcmlnaW4gZ3JvdXAgaW5zdGVhZCBvZiBhIHNpbmdsZSBvcmlnaW4sIGFuZCBDbG91ZEZyb250IHdpbGwgZmFpbG92ZXIgZnJvbSB0aGUgcHJpbWFyeSBvcmlnaW4gdG8gdGhlIHNlY29uZGFyeSBvcmlnaW4gdW5kZXIgdGhlIGZhaWxvdmVyIGNvbmRpdGlvbnMgdGhhdCB5b3UndmUgY2hvc2VuLlxuICogIE9wdGlvbmFsbHksIHlvdSBjYW4gY2hvb3NlIHNlbGVjdGlvbiBjcml0ZXJpYSBmb3IgeW91ciBvcmlnaW4gZ3JvdXAgdG8gc3BlY2lmeSBob3cgeW91ciBvcmlnaW5zIGFyZSBzZWxlY3RlZCB3aGVuIHlvdXIgZGlzdHJpYnV0aW9uIHJvdXRlcyB2aWV3ZXIgcmVxdWVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luR3JvdXAge1xuRmFpbG92ZXJDcml0ZXJpYTogT3JpZ2luR3JvdXBGYWlsb3ZlckNyaXRlcmlhXG4vKipcbiAqIFRoZSBvcmlnaW4gZ3JvdXAncyBJRC5cbiAqL1xuSWQ6IHN0cmluZ1xuTWVtYmVyczogT3JpZ2luR3JvdXBNZW1iZXJzXG4vKipcbiAqIFRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgZm9yIHRoZSBvcmlnaW4gZ3JvdXAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0ZSBhbiBvcmlnaW4gZ3JvdXBdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9oaWdoX2F2YWlsYWJpbGl0eV9vcmlnaW5fZmFpbG92ZXIuaHRtbCNjb25jZXB0X29yaWdpbl9ncm91cHMuY3JlYXRpbmcpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuU2VsZWN0aW9uQ3JpdGVyaWE/OiAoXCJkZWZhdWx0XCIgfCBcIm1lZGlhLXF1YWxpdHktYmFzZWRcIilcbn1cbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmFpbG92ZXIgY3JpdGVyaWEgZm9yIGFuIG9yaWdpbiBncm91cC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5Hcm91cEZhaWxvdmVyQ3JpdGVyaWEge1xuU3RhdHVzQ29kZXM6IFN0YXR1c0NvZGVzXG59XG4vKipcbiAqIFRoZSBzdGF0dXMgY29kZXMgdGhhdCwgd2hlbiByZXR1cm5lZCBmcm9tIHRoZSBwcmltYXJ5IG9yaWdpbiwgd2lsbCB0cmlnZ2VyIENsb3VkRnJvbnQgdG8gZmFpbG92ZXIgdG8gdGhlIHNlY29uZCBvcmlnaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzQ29kZXMge1xuLyoqXG4gKiBUaGUgaXRlbXMgKHN0YXR1cyBjb2RlcykgZm9yIGFuIG9yaWdpbiBncm91cC5cbiAqL1xuSXRlbXM6IG51bWJlcltdXG4vKipcbiAqIFRoZSBudW1iZXIgb2Ygc3RhdHVzIGNvZGVzLlxuICovXG5RdWFudGl0eTogbnVtYmVyXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbnMgaW4gYW4gb3JpZ2luIGdyb3VwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbkdyb3VwTWVtYmVycyB7XG4vKipcbiAqIEl0ZW1zIChvcmlnaW5zKSBpbiBhbiBvcmlnaW4gZ3JvdXAuXG4gKi9cbkl0ZW1zOiBPcmlnaW5Hcm91cE1lbWJlcltdXG4vKipcbiAqIFRoZSBudW1iZXIgb2Ygb3JpZ2lucyBpbiBhbiBvcmlnaW4gZ3JvdXAuXG4gKi9cblF1YW50aXR5OiBudW1iZXJcbn1cbi8qKlxuICogQW4gb3JpZ2luIGluIGFuIG9yaWdpbiBncm91cC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5Hcm91cE1lbWJlciB7XG4vKipcbiAqIFRoZSBJRCBmb3IgYW4gb3JpZ2luIGluIGFuIG9yaWdpbiBncm91cC5cbiAqL1xuT3JpZ2luSWQ6IHN0cmluZ1xufVxuLyoqXG4gKiBBbiBvcmlnaW4uXG4gKiAgQW4gb3JpZ2luIGlzIHRoZSBsb2NhdGlvbiB3aGVyZSBjb250ZW50IGlzIHN0b3JlZCwgYW5kIGZyb20gd2hpY2ggQ2xvdWRGcm9udCBnZXRzIGNvbnRlbnQgdG8gc2VydmUgdG8gdmlld2Vycy4gVG8gc3BlY2lmeSBhbiBvcmlnaW46XG4gKiAgICsgIFVzZSBgYFMzT3JpZ2luQ29uZmlnYGAgdG8gc3BlY2lmeSBhbiBBbWF6b24gUzMgYnVja2V0IHRoYXQgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBzdGF0aWMgd2Vic2l0ZSBob3N0aW5nLlxuICogICArICBVc2UgYGBDdXN0b21PcmlnaW5Db25maWdgYCB0byBzcGVjaWZ5IGFsbCBvdGhlciBraW5kcyBvZiBvcmlnaW5zLCBpbmNsdWRpbmc6XG4gKiAgICsgIEFuIEFtYXpvbiBTMyBidWNrZXQgdGhhdCBpcyBjb25maWd1cmVkIHdpdGggc3RhdGljIHdlYnNpdGUgaG9zdGluZ1xuICogICArICBBbiBFbGFzdGljIExvYWQgQmFsYW5jaW5nIGxvYWQgYmFsYW5jZXJcbiAqICAgKyAgQW4gRU1QbG9uZyBlbmRwb2ludFxuICogICArICBBbiBFTVNsb25nIGNvbnRhaW5lclxuICogICArICBBbnkgb3RoZXIgSFRUUCBzZXJ2ZXIsIHJ1bm5pbmcgb24gYW4gQW1hem9uIEVDMiBpbnN0YW5jZSBvciBhbnkgb3RoZXIga2luZCBvZiBob3N0XG4gKiAgIFxuICogICBcbiAqICBGb3IgdGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2Ygb3JpZ2lucyB0aGF0IHlvdSBjYW4gc3BlY2lmeSBwZXIgZGlzdHJpYnV0aW9uLCBzZWUgW0dlbmVyYWwgUXVvdGFzIG9uIFdlYiBEaXN0cmlidXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnMpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKiAocXVvdGFzIHdlcmUgZm9ybWVybHkgcmVmZXJyZWQgdG8gYXMgbGltaXRzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW4ge1xuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgQ2xvdWRGcm9udCBhdHRlbXB0cyB0byBjb25uZWN0IHRvIHRoZSBvcmlnaW4uIFRoZSBtaW5pbXVtIG51bWJlciBpcyAxLCB0aGUgbWF4aW11bSBpcyAzLCBhbmQgdGhlIGRlZmF1bHQgKGlmIHlvdSBkb24ndCBzcGVjaWZ5IG90aGVyd2lzZSkgaXMgMy5cbiAqICBGb3IgYSBjdXN0b20gb3JpZ2luIChpbmNsdWRpbmcgYW4gQW1hem9uIFMzIGJ1Y2tldCB0aGF0J3MgY29uZmlndXJlZCB3aXRoIHN0YXRpYyB3ZWJzaXRlIGhvc3RpbmcpLCB0aGlzIHZhbHVlIGFsc28gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBDbG91ZEZyb250IGF0dGVtcHRzIHRvIGdldCBhIHJlc3BvbnNlIGZyb20gdGhlIG9yaWdpbiwgaW4gdGhlIGNhc2Ugb2YgYW4gW09yaWdpbiBSZXNwb25zZSBUaW1lb3V0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI0Rvd25sb2FkRGlzdFZhbHVlc09yaWdpblJlc3BvbnNlVGltZW91dCkuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbT3JpZ2luIENvbm5lY3Rpb24gQXR0ZW1wdHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td2ViLXZhbHVlcy1zcGVjaWZ5Lmh0bWwjb3JpZ2luLWNvbm5lY3Rpb24tYXR0ZW1wdHMpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ29ubmVjdGlvbkF0dGVtcHRzPzogbnVtYmVyXG4vKipcbiAqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IENsb3VkRnJvbnQgd2FpdHMgd2hlbiB0cnlpbmcgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgb3JpZ2luLiBUaGUgbWluaW11bSB0aW1lb3V0IGlzIDEgc2Vjb25kLCB0aGUgbWF4aW11bSBpcyAxMCBzZWNvbmRzLCBhbmQgdGhlIGRlZmF1bHQgKGlmIHlvdSBkb24ndCBzcGVjaWZ5IG90aGVyd2lzZSkgaXMgMTAgc2Vjb25kcy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtPcmlnaW4gQ29ubmVjdGlvbiBUaW1lb3V0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI29yaWdpbi1jb25uZWN0aW9uLXRpbWVvdXQpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXJcbkN1c3RvbU9yaWdpbkNvbmZpZz86IEN1c3RvbU9yaWdpbkNvbmZpZ1xuLyoqXG4gKiBUaGUgZG9tYWluIG5hbWUgZm9yIHRoZSBvcmlnaW4uXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbT3JpZ2luIERvbWFpbiBOYW1lXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI0Rvd25sb2FkRGlzdFZhbHVlc0RvbWFpbk5hbWUpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRG9tYWluTmFtZTogc3RyaW5nXG4vKipcbiAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW4uIFRoaXMgdmFsdWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgVXNlIHRoaXMgdmFsdWUgdG8gc3BlY2lmeSB0aGUgYGBUYXJnZXRPcmlnaW5JZGBgIGluIGEgYGBDYWNoZUJlaGF2aW9yYGAgb3IgYGBEZWZhdWx0Q2FjaGVCZWhhdmlvcmBgLlxuICovXG5JZDogc3RyaW5nXG4vKipcbiAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhbiBvcmlnaW4gYWNjZXNzIGNvbnRyb2wgZm9yIHRoaXMgb3JpZ2luLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Jlc3RyaWN0aW5nIGFjY2VzcyB0byBhbiBBbWF6b24gUzMgb3JpZ2luXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvcHJpdmF0ZS1jb250ZW50LXJlc3RyaWN0aW5nLWFjY2Vzcy10by1zMy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk9yaWdpbkFjY2Vzc0NvbnRyb2xJZD86IHN0cmluZ1xuLyoqXG4gKiBBIGxpc3Qgb2YgSFRUUCBoZWFkZXIgbmFtZXMgYW5kIHZhbHVlcyB0aGF0IENsb3VkRnJvbnQgYWRkcyB0byB0aGUgcmVxdWVzdHMgdGhhdCBpdCBzZW5kcyB0byB0aGUgb3JpZ2luLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FkZGluZyBDdXN0b20gSGVhZGVycyB0byBPcmlnaW4gUmVxdWVzdHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9hZGQtb3JpZ2luLWN1c3RvbS1oZWFkZXJzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuT3JpZ2luQ3VzdG9tSGVhZGVycz86IE9yaWdpbkN1c3RvbUhlYWRlcltdXG4vKipcbiAqIEFuIG9wdGlvbmFsIHBhdGggdGhhdCBDbG91ZEZyb250IGFwcGVuZHMgdG8gdGhlIG9yaWdpbiBkb21haW4gbmFtZSB3aGVuIENsb3VkRnJvbnQgcmVxdWVzdHMgY29udGVudCBmcm9tIHRoZSBvcmlnaW4uXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbT3JpZ2luIFBhdGhdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td2ViLXZhbHVlcy1zcGVjaWZ5Lmh0bWwjRG93bmxvYWREaXN0VmFsdWVzT3JpZ2luUGF0aCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5PcmlnaW5QYXRoPzogc3RyaW5nXG5PcmlnaW5TaGllbGQ/OiBPcmlnaW5TaGllbGRcblMzT3JpZ2luQ29uZmlnPzogUzNPcmlnaW5Db25maWdcbn1cbi8qKlxuICogVXNlIHRoaXMgdHlwZSB0byBzcGVjaWZ5IGFuIG9yaWdpbiB0aGF0IGlzIG5vdCBhbiBBbWF6b24gUzMgYnVja2V0LCB3aXRoIG9uZSBleGNlcHRpb24uIElmIHRoZSBBbWF6b24gUzMgYnVja2V0IGlzIGNvbmZpZ3VyZWQgd2l0aCBzdGF0aWMgd2Vic2l0ZSBob3N0aW5nLCB1c2UgdGhpcyB0eXBlLiBJZiB0aGUgQW1hem9uIFMzIGJ1Y2tldCBpcyBub3QgY29uZmlndXJlZCB3aXRoIHN0YXRpYyB3ZWJzaXRlIGhvc3RpbmcsIHVzZSB0aGUgYGBTM09yaWdpbkNvbmZpZ2BgIHR5cGUgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21PcmlnaW5Db25maWcge1xuLyoqXG4gKiBUaGUgSFRUUCBwb3J0IHRoYXQgQ2xvdWRGcm9udCB1c2VzIHRvIGNvbm5lY3QgdG8gdGhlIG9yaWdpbi4gU3BlY2lmeSB0aGUgSFRUUCBwb3J0IHRoYXQgdGhlIG9yaWdpbiBsaXN0ZW5zIG9uLlxuICovXG5IVFRQUG9ydD86IG51bWJlclxuLyoqXG4gKiBUaGUgSFRUUFMgcG9ydCB0aGF0IENsb3VkRnJvbnQgdXNlcyB0byBjb25uZWN0IHRvIHRoZSBvcmlnaW4uIFNwZWNpZnkgdGhlIEhUVFBTIHBvcnQgdGhhdCB0aGUgb3JpZ2luIGxpc3RlbnMgb24uXG4gKi9cbkhUVFBTUG9ydD86IG51bWJlclxuLyoqXG4gKiBTcGVjaWZpZXMgaG93IGxvbmcsIGluIHNlY29uZHMsIENsb3VkRnJvbnQgcGVyc2lzdHMgaXRzIGNvbm5lY3Rpb24gdG8gdGhlIG9yaWdpbi4gVGhlIG1pbmltdW0gdGltZW91dCBpcyAxIHNlY29uZCwgdGhlIG1heGltdW0gaXMgNjAgc2Vjb25kcywgYW5kIHRoZSBkZWZhdWx0IChpZiB5b3UgZG9uJ3Qgc3BlY2lmeSBvdGhlcndpc2UpIGlzIDUgc2Vjb25kcy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtLZWVwLWFsaXZlIHRpbWVvdXQgKGN1c3RvbSBvcmlnaW5zIG9ubHkpXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI0Rvd25sb2FkRGlzdFZhbHVlc09yaWdpbktlZXBhbGl2ZVRpbWVvdXQpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuT3JpZ2luS2VlcGFsaXZlVGltZW91dD86IG51bWJlclxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHByb3RvY29sIChIVFRQIG9yIEhUVFBTKSB0aGF0IENsb3VkRnJvbnQgdXNlcyB0byBjb25uZWN0IHRvIHRoZSBvcmlnaW4uIFZhbGlkIHZhbHVlcyBhcmU6XG4gKiAgICsgICBgYGh0dHAtb25seWBgIOKAkyBDbG91ZEZyb250IGFsd2F5cyB1c2VzIEhUVFAgdG8gY29ubmVjdCB0byB0aGUgb3JpZ2luLlxuICogICArICAgYGBtYXRjaC12aWV3ZXJgYCDigJMgQ2xvdWRGcm9udCBjb25uZWN0cyB0byB0aGUgb3JpZ2luIHVzaW5nIHRoZSBzYW1lIHByb3RvY29sIHRoYXQgdGhlIHZpZXdlciB1c2VkIHRvIGNvbm5lY3QgdG8gQ2xvdWRGcm9udC5cbiAqICAgKyAgIGBgaHR0cHMtb25seWBgIOKAkyBDbG91ZEZyb250IGFsd2F5cyB1c2VzIEhUVFBTIHRvIGNvbm5lY3QgdG8gdGhlIG9yaWdpbi5cbiAqL1xuT3JpZ2luUHJvdG9jb2xQb2xpY3k6IHN0cmluZ1xuLyoqXG4gKiBTcGVjaWZpZXMgaG93IGxvbmcsIGluIHNlY29uZHMsIENsb3VkRnJvbnQgd2FpdHMgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgb3JpZ2luLiBUaGlzIGlzIGFsc28ga25vd24gYXMgdGhlICpvcmlnaW4gcmVzcG9uc2UgdGltZW91dCouIFRoZSBtaW5pbXVtIHRpbWVvdXQgaXMgMSBzZWNvbmQsIHRoZSBtYXhpbXVtIGlzIDYwIHNlY29uZHMsIGFuZCB0aGUgZGVmYXVsdCAoaWYgeW91IGRvbid0IHNwZWNpZnkgb3RoZXJ3aXNlKSBpcyAzMCBzZWNvbmRzLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Jlc3BvbnNlIHRpbWVvdXQgKGN1c3RvbSBvcmlnaW5zIG9ubHkpXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI0Rvd25sb2FkRGlzdFZhbHVlc09yaWdpblJlc3BvbnNlVGltZW91dCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5PcmlnaW5SZWFkVGltZW91dD86IG51bWJlclxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG1pbmltdW0gU1NML1RMUyBwcm90b2NvbCB0aGF0IENsb3VkRnJvbnQgdXNlcyB3aGVuIGNvbm5lY3RpbmcgdG8geW91ciBvcmlnaW4gb3ZlciBIVFRQUy4gVmFsaWQgdmFsdWVzIGluY2x1ZGUgYGBTU0x2M2BgLCBgYFRMU3YxYGAsIGBgVExTdjEuMWBgLCBhbmQgYGBUTFN2MS4yYGAuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWluaW11bSBPcmlnaW4gU1NMIFByb3RvY29sXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI0Rvd25sb2FkRGlzdFZhbHVlc09yaWdpblNTTFByb3RvY29scykgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5PcmlnaW5TU0xQcm90b2NvbHM/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRhaW5zIGBgSGVhZGVyTmFtZWBgIGFuZCBgYEhlYWRlclZhbHVlYGAgZWxlbWVudHMsIGlmIGFueSwgZm9yIHRoaXMgZGlzdHJpYnV0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbkN1c3RvbUhlYWRlciB7XG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgaGVhZGVyIHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBzZW5kIHRvIHlvdXIgb3JpZ2luLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBZGRpbmcgQ3VzdG9tIEhlYWRlcnMgdG8gT3JpZ2luIFJlcXVlc3RzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZm9yd2FyZC1jdXN0b20taGVhZGVycy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbkhlYWRlck5hbWU6IHN0cmluZ1xuLyoqXG4gKiBUaGUgdmFsdWUgZm9yIHRoZSBoZWFkZXIgdGhhdCB5b3Ugc3BlY2lmaWVkIGluIHRoZSBgYEhlYWRlck5hbWVgYCBmaWVsZC5cbiAqL1xuSGVhZGVyVmFsdWU6IHN0cmluZ1xufVxuLyoqXG4gKiBDbG91ZEZyb250IE9yaWdpbiBTaGllbGQuIFVzaW5nIE9yaWdpbiBTaGllbGQgY2FuIGhlbHAgcmVkdWNlIHRoZSBsb2FkIG9uIHlvdXIgb3JpZ2luLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIE9yaWdpbiBTaGllbGRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9vcmlnaW4tc2hpZWxkLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5TaGllbGQge1xuLyoqXG4gKiBBIGZsYWcgdGhhdCBzcGVjaWZpZXMgd2hldGhlciBPcmlnaW4gU2hpZWxkIGlzIGVuYWJsZWQuXG4gKiAgV2hlbiBpdCdzIGVuYWJsZWQsIENsb3VkRnJvbnQgcm91dGVzIGFsbCByZXF1ZXN0cyB0aHJvdWdoIE9yaWdpbiBTaGllbGQsIHdoaWNoIGNhbiBoZWxwIHByb3RlY3QgeW91ciBvcmlnaW4uIFdoZW4gaXQncyBkaXNhYmxlZCwgQ2xvdWRGcm9udCBtaWdodCBzZW5kIHJlcXVlc3RzIGRpcmVjdGx5IHRvIHlvdXIgb3JpZ2luIGZyb20gbXVsdGlwbGUgZWRnZSBsb2NhdGlvbnMgb3IgcmVnaW9uYWwgZWRnZSBjYWNoZXMuXG4gKi9cbkVuYWJsZWQ/OiBib29sZWFuXG4vKipcbiAqIFRoZSBBV1MtUmVnaW9uIGZvciBPcmlnaW4gU2hpZWxkLlxuICogIFNwZWNpZnkgdGhlIEFXUy1SZWdpb24gdGhhdCBoYXMgdGhlIGxvd2VzdCBsYXRlbmN5IHRvIHlvdXIgb3JpZ2luLiBUbyBzcGVjaWZ5IGEgcmVnaW9uLCB1c2UgdGhlIHJlZ2lvbiBjb2RlLCBub3QgdGhlIHJlZ2lvbiBuYW1lLiBGb3IgZXhhbXBsZSwgc3BlY2lmeSB0aGUgVVMgRWFzdCAoT2hpbykgcmVnaW9uIGFzIGBgdXMtZWFzdC0yYGAuXG4gKiAgV2hlbiB5b3UgZW5hYmxlIENsb3VkRnJvbnQgT3JpZ2luIFNoaWVsZCwgeW91IG11c3Qgc3BlY2lmeSB0aGUgQVdTLVJlZ2lvbiBmb3IgT3JpZ2luIFNoaWVsZC4gRm9yIHRoZSBsaXN0IG9mIEFXUy1SZWdpb25zIHRoYXQgeW91IGNhbiBzcGVjaWZ5LCBhbmQgZm9yIGhlbHAgY2hvb3NpbmcgdGhlIGJlc3QgUmVnaW9uIGZvciB5b3VyIG9yaWdpbiwgc2VlIFtDaG9vc2luZyB0aGUgZm9yIE9yaWdpbiBTaGllbGRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9vcmlnaW4tc2hpZWxkLmh0bWwjY2hvb3NlLW9yaWdpbi1zaGllbGQtcmVnaW9uKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk9yaWdpblNoaWVsZFJlZ2lvbj86IHN0cmluZ1xufVxuLyoqXG4gKiBVc2UgdGhpcyB0eXBlIHRvIHNwZWNpZnkgYW4gb3JpZ2luIHRoYXQgaXMgYW4gQW1hem9uIFMzIGJ1Y2tldCB0aGF0IGlzIG5vdCBjb25maWd1cmVkIHdpdGggc3RhdGljIHdlYnNpdGUgaG9zdGluZy4gVG8gc3BlY2lmeSBhbnkgb3RoZXIgdHlwZSBvZiBvcmlnaW4sIGluY2x1ZGluZyBhbiBBbWF6b24gUzMgYnVja2V0IHRoYXQgaXMgY29uZmlndXJlZCB3aXRoIHN0YXRpYyB3ZWJzaXRlIGhvc3RpbmcsIHVzZSB0aGUgYGBDdXN0b21PcmlnaW5Db25maWdgYCB0eXBlIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUzNPcmlnaW5Db25maWcge1xuLyoqXG4gKiBJZiB5b3UncmUgdXNpbmcgb3JpZ2luIGFjY2VzcyBjb250cm9sIChPQUMpIGluc3RlYWQgb2Ygb3JpZ2luIGFjY2VzcyBpZGVudGl0eSwgc3BlY2lmeSBhbiBlbXB0eSBgYE9yaWdpbkFjY2Vzc0lkZW50aXR5YGAgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUmVzdHJpY3RpbmcgYWNjZXNzIHRvIGFuXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvcHJpdmF0ZS1jb250ZW50LXJlc3RyaWN0aW5nLWFjY2Vzcy10by1vcmlnaW4uaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBUaGUgQ2xvdWRGcm9udCBvcmlnaW4gYWNjZXNzIGlkZW50aXR5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBvcmlnaW4uIFVzZSBhbiBvcmlnaW4gYWNjZXNzIGlkZW50aXR5IHRvIGNvbmZpZ3VyZSB0aGUgb3JpZ2luIHNvIHRoYXQgdmlld2VycyBjYW4gKm9ubHkqIGFjY2VzcyBvYmplY3RzIGluIGFuIEFtYXpvbiBTMyBidWNrZXQgdGhyb3VnaCBDbG91ZEZyb250LiBUaGUgZm9ybWF0IG9mIHRoZSB2YWx1ZSBpczpcbiAqICAgYGBvcmlnaW4tYWNjZXNzLWlkZW50aXR5L2Nsb3VkZnJvbnQvSUQtb2Ytb3JpZ2luLWFjY2Vzcy1pZGVudGl0eWBgIFxuICogIFRoZSBgYElELW9mLW9yaWdpbi1hY2Nlc3MtaWRlbnRpdHlgYCBpcyB0aGUgdmFsdWUgdGhhdCBDbG91ZEZyb250IHJldHVybmVkIGluIHRoZSBgYElEYGAgZWxlbWVudCB3aGVuIHlvdSBjcmVhdGVkIHRoZSBvcmlnaW4gYWNjZXNzIGlkZW50aXR5LlxuICogIElmIHlvdSB3YW50IHZpZXdlcnMgdG8gYmUgYWJsZSB0byBhY2Nlc3Mgb2JqZWN0cyB1c2luZyBlaXRoZXIgdGhlIENsb3VkRnJvbnQgVVJMIG9yIHRoZSBBbWF6b24gUzMgVVJMLCBzcGVjaWZ5IGFuIGVtcHR5IGBgT3JpZ2luQWNjZXNzSWRlbnRpdHlgYCBlbGVtZW50LlxuICogIFRvIGRlbGV0ZSB0aGUgb3JpZ2luIGFjY2VzcyBpZGVudGl0eSBmcm9tIGFuIGV4aXN0aW5nIGRpc3RyaWJ1dGlvbiwgdXBkYXRlIHRoZSBkaXN0cmlidXRpb24gY29uZmlndXJhdGlvbiBhbmQgaW5jbHVkZSBhbiBlbXB0eSBgYE9yaWdpbkFjY2Vzc0lkZW50aXR5YGAgZWxlbWVudC5cbiAqICBUbyByZXBsYWNlIHRoZSBvcmlnaW4gYWNjZXNzIGlkZW50aXR5LCB1cGRhdGUgdGhlIGRpc3RyaWJ1dGlvbiBjb25maWd1cmF0aW9uIGFuZCBzcGVjaWZ5IHRoZSBuZXcgb3JpZ2luIGFjY2VzcyBpZGVudGl0eS5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luIGFjY2VzcyBpZGVudGl0eSwgc2VlIFtTZXJ2aW5nIFByaXZhdGUgQ29udGVudCB0aHJvdWdoIENsb3VkRnJvbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9Qcml2YXRlQ29udGVudC5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk9yaWdpbkFjY2Vzc0lkZW50aXR5Pzogc3RyaW5nXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgaWRlbnRpZmllcyB3YXlzIGluIHdoaWNoIHlvdSB3YW50IHRvIHJlc3RyaWN0IGRpc3RyaWJ1dGlvbiBvZiB5b3VyIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdHJpY3Rpb25zIHtcbkdlb1Jlc3RyaWN0aW9uOiBHZW9SZXN0cmljdGlvblxufVxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRyb2xzIHRoZSBjb3VudHJpZXMgaW4gd2hpY2ggeW91ciBjb250ZW50IGlzIGRpc3RyaWJ1dGVkLiBDRiBkZXRlcm1pbmVzIHRoZSBsb2NhdGlvbiBvZiB5b3VyIHVzZXJzIHVzaW5nIGBgTWF4TWluZGBgIEdlb0lQIGRhdGFiYXNlcy4gVG8gZGlzYWJsZSBnZW8gcmVzdHJpY3Rpb24sIHJlbW92ZSB0aGUgW1Jlc3RyaWN0aW9uc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtY2xvdWRmcm9udC1kaXN0cmlidXRpb24tZGlzdHJpYnV0aW9uY29uZmlnLmh0bWwjY2ZuLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uLWRpc3RyaWJ1dGlvbmNvbmZpZy1yZXN0cmljdGlvbnMpIHByb3BlcnR5IGZyb20geW91ciBzdGFjayB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW9SZXN0cmljdGlvbiB7XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgYSBgYExvY2F0aW9uYGAgZWxlbWVudCBmb3IgZWFjaCBjb3VudHJ5IGluIHdoaWNoIHlvdSB3YW50IENsb3VkRnJvbnQgZWl0aGVyIHRvIGRpc3RyaWJ1dGUgeW91ciBjb250ZW50IChgYHdoaXRlbGlzdGBgKSBvciBub3QgZGlzdHJpYnV0ZSB5b3VyIGNvbnRlbnQgKGBgYmxhY2tsaXN0YGApLlxuICogIFRoZSBgYExvY2F0aW9uYGAgZWxlbWVudCBpcyBhIHR3by1sZXR0ZXIsIHVwcGVyY2FzZSBjb3VudHJ5IGNvZGUgZm9yIGEgY291bnRyeSB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgaW4geW91ciBgYGJsYWNrbGlzdGBgIG9yIGBgd2hpdGVsaXN0YGAuIEluY2x1ZGUgb25lIGBgTG9jYXRpb25gYCBlbGVtZW50IGZvciBlYWNoIGNvdW50cnkuXG4gKiAgQ2xvdWRGcm9udCBhbmQgYGBNYXhNaW5kYGAgYm90aCB1c2UgYGBJU08gMzE2NmBgIGNvdW50cnkgY29kZXMuIEZvciB0aGUgY3VycmVudCBsaXN0IG9mIGNvdW50cmllcyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29kZXMsIHNlZSBgYElTTyAzMTY2LTEtYWxwaGEtMmBgIGNvZGUgb24gdGhlICpJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uKiB3ZWJzaXRlLiBZb3UgY2FuIGFsc28gcmVmZXIgdG8gdGhlIGNvdW50cnkgbGlzdCBvbiB0aGUgQ2xvdWRGcm9udCBjb25zb2xlLCB3aGljaCBpbmNsdWRlcyBib3RoIGNvdW50cnkgbmFtZXMgYW5kIGNvZGVzLlxuICovXG5Mb2NhdGlvbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgbWV0aG9kIHRoYXQgeW91IHdhbnQgdG8gdXNlIHRvIHJlc3RyaWN0IGRpc3RyaWJ1dGlvbiBvZiB5b3VyIGNvbnRlbnQgYnkgY291bnRyeTpcbiAqICAgKyAgIGBgbm9uZWBgOiBObyBnZW8gcmVzdHJpY3Rpb24gaXMgZW5hYmxlZCwgbWVhbmluZyBhY2Nlc3MgdG8gY29udGVudCBpcyBub3QgcmVzdHJpY3RlZCBieSBjbGllbnQgZ2VvIGxvY2F0aW9uLlxuICogICArICAgYGBibGFja2xpc3RgYDogVGhlIGBgTG9jYXRpb25gYCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBjb3VudHJpZXMgaW4gd2hpY2ggeW91IGRvbid0IHdhbnQgQ2xvdWRGcm9udCB0byBkaXN0cmlidXRlIHlvdXIgY29udGVudC5cbiAqICAgKyAgIGBgd2hpdGVsaXN0YGA6IFRoZSBgYExvY2F0aW9uYGAgZWxlbWVudHMgc3BlY2lmeSB0aGUgY291bnRyaWVzIGluIHdoaWNoIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZGlzdHJpYnV0ZSB5b3VyIGNvbnRlbnQuXG4gKi9cblJlc3RyaWN0aW9uVHlwZTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBvcmlnaW4gYXMgYW4gUzMgYnVja2V0LlxuICogICBUaGlzIHByb3BlcnR5IGlzIGxlZ2FjeS4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBbT3JpZ2luXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1jbG91ZGZyb250LWRpc3RyaWJ1dGlvbi1vcmlnaW4uaHRtbCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lTM09yaWdpbiB7XG4vKipcbiAqIFRoZSBkb21haW4gbmFtZSBhc3NpZ25lZCB0byB5b3VyIENGIGRpc3RyaWJ1dGlvbi5cbiAqL1xuRE5TTmFtZTogc3RyaW5nXG4vKipcbiAqIFRoZSBDRiBvcmlnaW4gYWNjZXNzIGlkZW50aXR5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBkaXN0cmlidXRpb24uIFVzZSBhbiBvcmlnaW4gYWNjZXNzIGlkZW50aXR5IHRvIGNvbmZpZ3VyZSB0aGUgZGlzdHJpYnV0aW9uIHNvIHRoYXQgZW5kIHVzZXJzIGNhbiBvbmx5IGFjY2VzcyBvYmplY3RzIGluIGFuIFMzIHRocm91Z2ggQ0YuXG4gKiAgIFRoaXMgcHJvcGVydHkgaXMgbGVnYWN5LiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIFtPcmlnaW5BY2Nlc3NDb250cm9sXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtY2xvdWRmcm9udC1vcmlnaW5hY2Nlc3Njb250cm9sLmh0bWwpIGluc3RlYWQuXG4gKi9cbk9yaWdpbkFjY2Vzc0lkZW50aXR5Pzogc3RyaW5nXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgZGlzdHJpYnV0aW9uJ3MgU1NML1RMUyBjb25maWd1cmF0aW9uIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdmlld2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3ZXJDZXJ0aWZpY2F0ZSB7XG4vKipcbiAqIEluIENsb3VkRm9ybWF0aW9uLCB0aGlzIGZpZWxkIG5hbWUgaXMgYGBBY21DZXJ0aWZpY2F0ZUFybmBgLiBOb3RlIHRoZSBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24uXG4gKiAgIElmIHRoZSBkaXN0cmlidXRpb24gdXNlcyBgYEFsaWFzZXNgYCAoYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcyBvciBDTkFNRXMpIGFuZCB0aGUgU1NML1RMUyBjZXJ0aWZpY2F0ZSBpcyBzdG9yZWQgaW4gWyhBQ00pXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYWNtL2xhdGVzdC91c2VyZ3VpZGUvYWNtLW92ZXJ2aWV3Lmh0bWwpLCBwcm92aWRlIHRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgQUNNIGNlcnRpZmljYXRlLiBDbG91ZEZyb250IG9ubHkgc3VwcG9ydHMgQUNNIGNlcnRpZmljYXRlcyBpbiB0aGUgVVMgRWFzdCAoTi4gVmlyZ2luaWEpIFJlZ2lvbiAoYGB1cy1lYXN0LTFgYCkuXG4gKiAgSWYgeW91IHNwZWNpZnkgYW4gQUNNIGNlcnRpZmljYXRlIEFSTiwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHZhbHVlcyBmb3IgYGBNaW5pbXVtUHJvdG9jb2xWZXJzaW9uYGAgYW5kIGBgU1NMU3VwcG9ydE1ldGhvZGBgLiAoSW4gQ2xvdWRGb3JtYXRpb24sIHRoZSBmaWVsZCBuYW1lIGlzIGBgU3NsU3VwcG9ydE1ldGhvZGBgLiBOb3RlIHRoZSBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24uKVxuICovXG5BY21DZXJ0aWZpY2F0ZUFybj86IHN0cmluZ1xuLyoqXG4gKiBJZiB0aGUgZGlzdHJpYnV0aW9uIHVzZXMgdGhlIENsb3VkRnJvbnQgZG9tYWluIG5hbWUgc3VjaCBhcyBgYGQxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0YGAsIHNldCB0aGlzIGZpZWxkIHRvIGBgdHJ1ZWBgLlxuICogIElmIHRoZSBkaXN0cmlidXRpb24gdXNlcyBgYEFsaWFzZXNgYCAoYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcyBvciBDTkFNRXMpLCBvbWl0IHRoaXMgZmllbGQgYW5kIHNwZWNpZnkgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIGZpZWxkczpcbiAqICAgKyAgIGBgQWNtQ2VydGlmaWNhdGVBcm5gYCBvciBgYElhbUNlcnRpZmljYXRlSWRgYCAoc3BlY2lmeSBhIHZhbHVlIGZvciBvbmUsIG5vdCBib3RoKSBcbiAqICAgKyAgIGBgTWluaW11bVByb3RvY29sVmVyc2lvbmBgIFxuICogICArICAgYGBTc2xTdXBwb3J0TWV0aG9kYGBcbiAqL1xuQ2xvdWRGcm9udERlZmF1bHRDZXJ0aWZpY2F0ZT86IGJvb2xlYW5cbi8qKlxuICogSW4gQ2xvdWRGb3JtYXRpb24sIHRoaXMgZmllbGQgbmFtZSBpcyBgYElhbUNlcnRpZmljYXRlSWRgYC4gTm90ZSB0aGUgZGlmZmVyZW50IGNhcGl0YWxpemF0aW9uLlxuICogICBJZiB0aGUgZGlzdHJpYnV0aW9uIHVzZXMgYGBBbGlhc2VzYGAgKGFsdGVybmF0ZSBkb21haW4gbmFtZXMgb3IgQ05BTUVzKSBhbmQgdGhlIFNTTC9UTFMgY2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIFsoSUFNKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX2NyZWRlbnRpYWxzX3NlcnZlci1jZXJ0cy5odG1sKSwgcHJvdmlkZSB0aGUgSUQgb2YgdGhlIElBTSBjZXJ0aWZpY2F0ZS5cbiAqICBJZiB5b3Ugc3BlY2lmeSBhbiBJQU0gY2VydGlmaWNhdGUgSUQsIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB2YWx1ZXMgZm9yIGBgTWluaW11bVByb3RvY29sVmVyc2lvbmBgIGFuZCBgYFNTTFN1cHBvcnRNZXRob2RgYC4gKEluIENsb3VkRm9ybWF0aW9uLCB0aGUgZmllbGQgbmFtZSBpcyBgYFNzbFN1cHBvcnRNZXRob2RgYC4gTm90ZSB0aGUgZGlmZmVyZW50IGNhcGl0YWxpemF0aW9uLilcbiAqL1xuSWFtQ2VydGlmaWNhdGVJZD86IHN0cmluZ1xuLyoqXG4gKiBJZiB0aGUgZGlzdHJpYnV0aW9uIHVzZXMgYGBBbGlhc2VzYGAgKGFsdGVybmF0ZSBkb21haW4gbmFtZXMgb3IgQ05BTUVzKSwgc3BlY2lmeSB0aGUgc2VjdXJpdHkgcG9saWN5IHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byB1c2UgZm9yIEhUVFBTIGNvbm5lY3Rpb25zIHdpdGggdmlld2Vycy4gVGhlIHNlY3VyaXR5IHBvbGljeSBkZXRlcm1pbmVzIHR3byBzZXR0aW5nczpcbiAqICAgKyAgVGhlIG1pbmltdW0gU1NML1RMUyBwcm90b2NvbCB0aGF0IENsb3VkRnJvbnQgY2FuIHVzZSB0byBjb21tdW5pY2F0ZSB3aXRoIHZpZXdlcnMuXG4gKiAgICsgIFRoZSBjaXBoZXJzIHRoYXQgQ2xvdWRGcm9udCBjYW4gdXNlIHRvIGVuY3J5cHQgdGhlIGNvbnRlbnQgdGhhdCBpdCByZXR1cm5zIHRvIHZpZXdlcnMuXG4gKiAgIFxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlY3VyaXR5IFBvbGljeV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Rpc3RyaWJ1dGlvbi13ZWItdmFsdWVzLXNwZWNpZnkuaHRtbCNEb3dubG9hZERpc3RWYWx1ZXMtc2VjdXJpdHktcG9saWN5KSBhbmQgW1N1cHBvcnRlZCBQcm90b2NvbHMgYW5kIENpcGhlcnMgQmV0d2VlbiBWaWV3ZXJzIGFuZCBDbG91ZEZyb250XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvc2VjdXJlLWNvbm5lY3Rpb25zLXN1cHBvcnRlZC12aWV3ZXItcHJvdG9jb2xzLWNpcGhlcnMuaHRtbCNzZWN1cmUtY29ubmVjdGlvbnMtc3VwcG9ydGVkLWNpcGhlcnMpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgT24gdGhlIENsb3VkRnJvbnQgY29uc29sZSwgdGhpcyBzZXR0aW5nIGlzIGNhbGxlZCAqU2VjdXJpdHkgUG9saWN5Ki5cbiAqICAgV2hlbiB5b3UncmUgdXNpbmcgU05JIG9ubHkgKHlvdSBzZXQgYGBTU0xTdXBwb3J0TWV0aG9kYGAgdG8gYGBzbmktb25seWBgKSwgeW91IG11c3Qgc3BlY2lmeSBgYFRMU3YxYGAgb3IgaGlnaGVyLiAoSW4gQ2xvdWRGb3JtYXRpb24sIHRoZSBmaWVsZCBuYW1lIGlzIGBgU3NsU3VwcG9ydE1ldGhvZGBgLiBOb3RlIHRoZSBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24uKVxuICogIElmIHRoZSBkaXN0cmlidXRpb24gdXNlcyB0aGUgQ2xvdWRGcm9udCBkb21haW4gbmFtZSBzdWNoIGFzIGBgZDExMTExMWFiY2RlZjguY2xvdWRmcm9udC5uZXRgYCAoeW91IHNldCBgYENsb3VkRnJvbnREZWZhdWx0Q2VydGlmaWNhdGVgYCB0byBgYHRydWVgYCksIENsb3VkRnJvbnQgYXV0b21hdGljYWxseSBzZXRzIHRoZSBzZWN1cml0eSBwb2xpY3kgdG8gYGBUTFN2MWBgIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIHRoYXQgeW91IHNldCBoZXJlLlxuICovXG5NaW5pbXVtUHJvdG9jb2xWZXJzaW9uPzogc3RyaW5nXG4vKipcbiAqIEluIENsb3VkRm9ybWF0aW9uLCB0aGlzIGZpZWxkIG5hbWUgaXMgYGBTc2xTdXBwb3J0TWV0aG9kYGAuIE5vdGUgdGhlIGRpZmZlcmVudCBjYXBpdGFsaXphdGlvbi5cbiAqICAgSWYgdGhlIGRpc3RyaWJ1dGlvbiB1c2VzIGBgQWxpYXNlc2BgIChhbHRlcm5hdGUgZG9tYWluIG5hbWVzIG9yIENOQU1FcyksIHNwZWNpZnkgd2hpY2ggdmlld2VycyB0aGUgZGlzdHJpYnV0aW9uIGFjY2VwdHMgSFRUUFMgY29ubmVjdGlvbnMgZnJvbS5cbiAqICAgKyAgIGBgc25pLW9ubHlgYCDigJMgVGhlIGRpc3RyaWJ1dGlvbiBhY2NlcHRzIEhUVFBTIGNvbm5lY3Rpb25zIGZyb20gb25seSB2aWV3ZXJzIHRoYXQgc3VwcG9ydCBbc2VydmVyIG5hbWUgaW5kaWNhdGlvbiAoU05JKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NlcnZlcl9OYW1lX0luZGljYXRpb24pLiBUaGlzIGlzIHJlY29tbWVuZGVkLiBNb3N0IGJyb3dzZXJzIGFuZCBjbGllbnRzIHN1cHBvcnQgU05JLlxuICogICArICAgYGB2aXBgYCDigJMgVGhlIGRpc3RyaWJ1dGlvbiBhY2NlcHRzIEhUVFBTIGNvbm5lY3Rpb25zIGZyb20gYWxsIHZpZXdlcnMgaW5jbHVkaW5nIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBTTkkuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLCBhbmQgcmVzdWx0cyBpbiBhZGRpdGlvbmFsIG1vbnRobHkgY2hhcmdlcyBmcm9tIENsb3VkRnJvbnQuXG4gKiAgICsgICBgYHN0YXRpYy1pcGBgIC0gRG8gbm90IHNwZWNpZnkgdGhpcyB2YWx1ZSB1bmxlc3MgeW91ciBkaXN0cmlidXRpb24gaGFzIGJlZW4gZW5hYmxlZCBmb3IgdGhpcyBmZWF0dXJlIGJ5IHRoZSBDbG91ZEZyb250IHRlYW0uIElmIHlvdSBoYXZlIGEgdXNlIGNhc2UgdGhhdCByZXF1aXJlcyBzdGF0aWMgSVAgYWRkcmVzc2VzIGZvciBhIGRpc3RyaWJ1dGlvbiwgY29udGFjdCBDbG91ZEZyb250IHRocm91Z2ggdGhlIFtDZW50ZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zdXBwb3J0L2hvbWUpLlxuICogICBcbiAqICBJZiB0aGUgZGlzdHJpYnV0aW9uIHVzZXMgdGhlIENsb3VkRnJvbnQgZG9tYWluIG5hbWUgc3VjaCBhcyBgYGQxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0YGAsIGRvbid0IHNldCBhIHZhbHVlIGZvciB0aGlzIGZpZWxkLlxuICovXG5Tc2xTdXBwb3J0TWV0aG9kPzogc3RyaW5nXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgYGBUYWdgYCBrZXkgYW5kIGBgVGFnYGAgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFnIHtcbi8qKlxuICogQSBzdHJpbmcgdGhhdCBjb250YWlucyBgYFRhZ2BgIGtleS5cbiAqICBUaGUgc3RyaW5nIGxlbmd0aCBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAxMjggY2hhcmFjdGVycy4gVmFsaWQgY2hhcmFjdGVycyBpbmNsdWRlIGBgYS16YGAsIGBgQS1aYGAsIGBgMC05YGAsIHNwYWNlLCBhbmQgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBgYF8gLSAuIDogLyA9ICsgQGBgLlxuICovXG5LZXk6IHN0cmluZ1xuLyoqXG4gKiBBIHN0cmluZyB0aGF0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGBgVGFnYGAgdmFsdWUuXG4gKiAgVGhlIHN0cmluZyBsZW5ndGggc2hvdWxkIGJlIGJldHdlZW4gMCBhbmQgMjU2IGNoYXJhY3RlcnMuIFZhbGlkIGNoYXJhY3RlcnMgaW5jbHVkZSBgYGEtemBgLCBgYEEtWmBgLCBgYDAtOWBgLCBzcGFjZSwgYW5kIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYGBfIC0gLiA6IC8gPSArIEBgYC5cbiAqL1xuVmFsdWU6IHN0cmluZ1xufVxuIl19
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgZGlzdHJpYnV0aW9uIHRlbGxzIENsb3VkRnJvbnQgd2hlcmUgeW91IHdhbnQgY29udGVudCB0byBiZSBkZWxpdmVyZWQgZnJvbSwgYW5kIHRoZSBkZXRhaWxzIGFib3V0IGhvdyB0byB0cmFjayBhbmQgbWFuYWdlIGNvbnRlbnQgZGVsaXZlcnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgX0FXU19DTE9VREZST05UX0RJU1RSSUJVVElPTiB7XG5EaXN0cmlidXRpb25Db25maWc6IERpc3RyaWJ1dGlvbkNvbmZpZ1xuRG9tYWluTmFtZT86IHN0cmluZ1xuSWQ/OiBzdHJpbmdcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyB6ZXJvIG9yIG1vcmUgYGBUYWdgYCBlbGVtZW50cy5cbiAqL1xuVGFncz86IFRhZ1tdXG59XG4vKipcbiAqIFRoZSBkaXN0cmlidXRpb24ncyBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkNvbmZpZyB7XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgQ05BTUVzIChhbHRlcm5hdGUgZG9tYWluIG5hbWVzKSwgaWYgYW55LCBmb3IgdGhpcyBkaXN0cmlidXRpb24uXG4gKi9cbkFsaWFzZXM/OiBzdHJpbmdbXVxuQW55Y2FzdElwTGlzdElkPzogc3RyaW5nXG4vKipcbiAqIEFuIGFsaWFzIGZvciB0aGUgQ0YgZGlzdHJpYnV0aW9uJ3MgZG9tYWluIG5hbWUuXG4gKiAgIFRoaXMgcHJvcGVydHkgaXMgbGVnYWN5LiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIFtBbGlhc2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1jbG91ZGZyb250LWRpc3RyaWJ1dGlvbi1kaXN0cmlidXRpb25jb25maWcuaHRtbCNjZm4tY2xvdWRmcm9udC1kaXN0cmlidXRpb24tZGlzdHJpYnV0aW9uY29uZmlnLWFsaWFzZXMpIGluc3RlYWQuXG4gKi9cbkNOQU1Fcz86IHN0cmluZ1tdXG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgemVybyBvciBtb3JlIGBgQ2FjaGVCZWhhdmlvcmBgIGVsZW1lbnRzLlxuICovXG5DYWNoZUJlaGF2aW9ycz86IENhY2hlQmVoYXZpb3JbXVxuLyoqXG4gKiBBIGNvbW1lbnQgdG8gZGVzY3JpYmUgdGhlIGRpc3RyaWJ1dGlvbi4gVGhlIGNvbW1lbnQgY2Fubm90IGJlIGxvbmdlciB0aGFuIDEyOCBjaGFyYWN0ZXJzLlxuICovXG5Db21tZW50Pzogc3RyaW5nXG4vKipcbiAqIFRoZSBpZGVudGlmaWVyIG9mIGEgY29udGludW91cyBkZXBsb3ltZW50IHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgYENyZWF0ZUNvbnRpbnVvdXNEZXBsb3ltZW50UG9saWN5YGAuXG4gKi9cbkNvbnRpbnVvdXNEZXBsb3ltZW50UG9saWN5SWQ/OiBzdHJpbmdcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250cm9scyB0aGUgZm9sbG93aW5nOlxuICogICArICBXaGV0aGVyIENsb3VkRnJvbnQgcmVwbGFjZXMgSFRUUCBzdGF0dXMgY29kZXMgaW4gdGhlIDR4eCBhbmQgNXh4IHJhbmdlIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzIGJlZm9yZSByZXR1cm5pbmcgdGhlIHJlc3BvbnNlIHRvIHRoZSB2aWV3ZXIuXG4gKiAgICsgIEhvdyBsb25nIENsb3VkRnJvbnQgY2FjaGVzIEhUVFAgc3RhdHVzIGNvZGVzIGluIHRoZSA0eHggYW5kIDV4eCByYW5nZS5cbiAqICAgXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY3VzdG9tIGVycm9yIHBhZ2VzLCBzZWUgW0N1c3RvbWl6aW5nIEVycm9yIFJlc3BvbnNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2N1c3RvbS1lcnJvci1wYWdlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbkN1c3RvbUVycm9yUmVzcG9uc2VzPzogQ3VzdG9tRXJyb3JSZXNwb25zZVtdXG5DdXN0b21PcmlnaW4/OiBMZWdhY3lDdXN0b21PcmlnaW5cbkRlZmF1bHRDYWNoZUJlaGF2aW9yOiBEZWZhdWx0Q2FjaGVCZWhhdmlvclxuLyoqXG4gKiBXaGVuIGEgdmlld2VyIHJlcXVlc3RzIHRoZSByb290IFVSTCBmb3IgeW91ciBkaXN0cmlidXRpb24sIHRoZSBkZWZhdWx0IHJvb3Qgb2JqZWN0IGlzIHRoZSBvYmplY3QgdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHJlcXVlc3QgZnJvbSB5b3VyIG9yaWdpbi4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgcm9vdCBVUkwgaXMgYGBodHRwczovL3d3dy5leGFtcGxlLmNvbWBgLCB5b3UgY2FuIHNwZWNpZnkgQ2xvdWRGcm9udCB0byByZXR1cm4gdGhlIGBgaW5kZXguaHRtbGBgIGZpbGUgYXMgdGhlIGRlZmF1bHQgcm9vdCBvYmplY3QuIFlvdSBjYW4gc3BlY2lmeSBhIGRlZmF1bHQgcm9vdCBvYmplY3Qgc28gdGhhdCB2aWV3ZXJzIHNlZSBhIHNwZWNpZmljIGZpbGUgb3Igb2JqZWN0LCBpbnN0ZWFkIG9mIGFub3RoZXIgb2JqZWN0IGluIHlvdXIgZGlzdHJpYnV0aW9uIChmb3IgZXhhbXBsZSwgYGBodHRwczovL3d3dy5leGFtcGxlLmNvbS9wcm9kdWN0LWRlc2NyaXB0aW9uLmh0bWxgYCkuIEEgZGVmYXVsdCByb290IG9iamVjdCBhdm9pZHMgZXhwb3NpbmcgdGhlIGNvbnRlbnRzIG9mIHlvdXIgZGlzdHJpYnV0aW9uLlxuICogIFlvdSBjYW4gc3BlY2lmeSB0aGUgb2JqZWN0IG5hbWUgb3IgYSBwYXRoIHRvIHRoZSBvYmplY3QgbmFtZSAoZm9yIGV4YW1wbGUsIGBgaW5kZXguaHRtbGBgIG9yIGBgZXhhbXBsZUZvbGRlck5hbWUvaW5kZXguaHRtbGBgKS4gWW91ciBzdHJpbmcgY2FuJ3QgYmVnaW4gd2l0aCBhIGZvcndhcmQgc2xhc2ggKGBgL2BgKS4gT25seSBzcGVjaWZ5IHRoZSBvYmplY3QgbmFtZSBvciB0aGUgcGF0aCB0byB0aGUgb2JqZWN0LlxuICogIElmIHlvdSBkb24ndCB3YW50IHRvIHNwZWNpZnkgYSBkZWZhdWx0IHJvb3Qgb2JqZWN0IHdoZW4geW91IGNyZWF0ZSBhIGRpc3RyaWJ1dGlvbiwgaW5jbHVkZSBhbiBlbXB0eSBgYERlZmF1bHRSb290T2JqZWN0YGAgZWxlbWVudC5cbiAqICBUbyBkZWxldGUgdGhlIGRlZmF1bHQgcm9vdCBvYmplY3QgZnJvbSBhbiBleGlzdGluZyBkaXN0cmlidXRpb24sIHVwZGF0ZSB0aGUgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGluY2x1ZGUgYW4gZW1wdHkgYGBEZWZhdWx0Um9vdE9iamVjdGBgIGVsZW1lbnQuXG4gKiAgVG8gcmVwbGFjZSB0aGUgZGVmYXVsdCByb290IG9iamVjdCwgdXBkYXRlIHRoZSBkaXN0cmlidXRpb24gY29uZmlndXJhdGlvbiBhbmQgc3BlY2lmeSB0aGUgbmV3IG9iamVjdC5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVmYXVsdCByb290IG9iamVjdCwgc2VlIFtTcGVjaWZ5IGEgZGVmYXVsdCByb290IG9iamVjdF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0RlZmF1bHRSb290T2JqZWN0Lmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRGVmYXVsdFJvb3RPYmplY3Q/OiBzdHJpbmdcbi8qKlxuICogRnJvbSB0aGlzIGZpZWxkLCB5b3UgY2FuIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzZWxlY3RlZCBkaXN0cmlidXRpb24uXG4gKi9cbkVuYWJsZWQ6IGJvb2xlYW5cbi8qKlxuICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBIVFRQIHZlcnNpb24ocykgdGhhdCB5b3Ugd2FudCB2aWV3ZXJzIHRvIHVzZSB0byBjb21tdW5pY2F0ZSB3aXRoIENGLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbmV3IGRpc3RyaWJ1dGlvbnMgaXMgYGBodHRwMS4xYGAuXG4gKiAgRm9yIHZpZXdlcnMgYW5kIENGIHRvIHVzZSBIVFRQLzIsIHZpZXdlcnMgbXVzdCBzdXBwb3J0IFRMU3YxLjIgb3IgbGF0ZXIsIGFuZCBtdXN0IHN1cHBvcnQgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKS5cbiAqICBGb3Igdmlld2VycyBhbmQgQ0YgdG8gdXNlIEhUVFAvMywgdmlld2VycyBtdXN0IHN1cHBvcnQgVExTdjEuMyBhbmQgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKS4gQ0Ygc3VwcG9ydHMgSFRUUC8zIGNvbm5lY3Rpb24gbWlncmF0aW9uIHRvIGFsbG93IHRoZSB2aWV3ZXIgdG8gc3dpdGNoIG5ldHdvcmtzIHdpdGhvdXQgbG9zaW5nIGNvbm5lY3Rpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbm5lY3Rpb24gbWlncmF0aW9uLCBzZWUgW0Nvbm5lY3Rpb24gTWlncmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkwMDAuaHRtbCNuYW1lLWNvbm5lY3Rpb24tbWlncmF0aW9uKSBhdCBSRkMgOTAwMC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc3VwcG9ydGVkIFRMU3YxLjMgY2lwaGVycywgc2VlIFtTdXBwb3J0ZWQgcHJvdG9jb2xzIGFuZCBjaXBoZXJzIGJldHdlZW4gdmlld2VycyBhbmQgQ2xvdWRGcm9udF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3NlY3VyZS1jb25uZWN0aW9ucy1zdXBwb3J0ZWQtdmlld2VyLXByb3RvY29scy1jaXBoZXJzLmh0bWwpLlxuICovXG5IdHRwVmVyc2lvbj86IHN0cmluZ1xuLyoqXG4gKiBJZiB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHJlc3BvbmQgdG8gSVB2NiBETlMgcmVxdWVzdHMgd2l0aCBhbiBJUHY2IGFkZHJlc3MgZm9yIHlvdXIgZGlzdHJpYnV0aW9uLCBzcGVjaWZ5IGBgdHJ1ZWBgLiBJZiB5b3Ugc3BlY2lmeSBgYGZhbHNlYGAsIENsb3VkRnJvbnQgcmVzcG9uZHMgdG8gSVB2NiBETlMgcmVxdWVzdHMgd2l0aCB0aGUgRE5TIHJlc3BvbnNlIGNvZGUgYGBOT0VSUk9SYGAgYW5kIHdpdGggbm8gSVAgYWRkcmVzc2VzLiBUaGlzIGFsbG93cyB2aWV3ZXJzIHRvIHN1Ym1pdCBhIHNlY29uZCByZXF1ZXN0LCBmb3IgYW4gSVB2NCBhZGRyZXNzIGZvciB5b3VyIGRpc3RyaWJ1dGlvbi5cbiAqICBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIGVuYWJsZSBJUHY2IGlmIHlvdSBoYXZlIHVzZXJzIG9uIElQdjYgbmV0d29ya3Mgd2hvIHdhbnQgdG8gYWNjZXNzIHlvdXIgY29udGVudC4gSG93ZXZlciwgaWYgeW91J3JlIHVzaW5nIHNpZ25lZCBVUkxzIG9yIHNpZ25lZCBjb29raWVzIHRvIHJlc3RyaWN0IGFjY2VzcyB0byB5b3VyIGNvbnRlbnQsIGFuZCBpZiB5b3UncmUgdXNpbmcgYSBjdXN0b20gcG9saWN5IHRoYXQgaW5jbHVkZXMgdGhlIGBgSXBBZGRyZXNzYGAgcGFyYW1ldGVyIHRvIHJlc3RyaWN0IHRoZSBJUCBhZGRyZXNzZXMgdGhhdCBjYW4gYWNjZXNzIHlvdXIgY29udGVudCwgZG9uJ3QgZW5hYmxlIElQdjYuIElmIHlvdSB3YW50IHRvIHJlc3RyaWN0IGFjY2VzcyB0byBzb21lIGNvbnRlbnQgYnkgSVAgYWRkcmVzcyBhbmQgbm90IHJlc3RyaWN0IGFjY2VzcyB0byBvdGhlciBjb250ZW50IChvciByZXN0cmljdCBhY2Nlc3MgYnV0IG5vdCBieSBJUCBhZGRyZXNzKSwgeW91IGNhbiBjcmVhdGUgdHdvIGRpc3RyaWJ1dGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIGEgU2lnbmVkIFVSTCBVc2luZyBhIEN1c3RvbSBQb2xpY3ldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9wcml2YXRlLWNvbnRlbnQtY3JlYXRpbmctc2lnbmVkLXVybC1jdXN0b20tcG9saWN5Lmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3UncmUgdXNpbmcgYW4gUjUzQVdTSW50bG9uZyBhbGlhcyByZXNvdXJjZSByZWNvcmQgc2V0IHRvIHJvdXRlIHRyYWZmaWMgdG8geW91ciBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiwgeW91IG5lZWQgdG8gY3JlYXRlIGEgc2Vjb25kIGFsaWFzIHJlc291cmNlIHJlY29yZCBzZXQgd2hlbiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6XG4gKiAgICsgIFlvdSBlbmFibGUgSVB2NiBmb3IgdGhlIGRpc3RyaWJ1dGlvblxuICogICArICBZb3UncmUgdXNpbmcgYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcyBpbiB0aGUgVVJMcyBmb3IgeW91ciBvYmplY3RzXG4gKiAgIFxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JvdXRpbmcgVHJhZmZpYyB0byBhbiBBbWF6b24gQ2xvdWRGcm9udCBXZWIgRGlzdHJpYnV0aW9uIGJ5IFVzaW5nIFlvdXIgRG9tYWluIE5hbWVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9Sb3V0ZTUzL2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9yb3V0aW5nLXRvLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uLmh0bWwpIGluIHRoZSAqRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3UgY3JlYXRlZCBhIENOQU1FIHJlc291cmNlIHJlY29yZCBzZXQsIGVpdGhlciB3aXRoIFI1M0FXU0ludGxvbmcgb3Igd2l0aCBhbm90aGVyIEROUyBzZXJ2aWNlLCB5b3UgZG9uJ3QgbmVlZCB0byBtYWtlIGFueSBjaGFuZ2VzLiBBIENOQU1FIHJlY29yZCB3aWxsIHJvdXRlIHRyYWZmaWMgdG8geW91ciBkaXN0cmlidXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgSVAgYWRkcmVzcyBmb3JtYXQgb2YgdGhlIHZpZXdlciByZXF1ZXN0LlxuICovXG5JUFY2RW5hYmxlZD86IGJvb2xlYW5cbkxvZ2dpbmc/OiBMb2dnaW5nXG5PcmlnaW5Hcm91cHM/OiBPcmlnaW5Hcm91cHNcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBvcmlnaW5zIGZvciB0aGlzIGRpc3RyaWJ1dGlvbi5cbiAqICBTcGVjaWZ5IGEgdmFsdWUgZm9yIGVpdGhlciB0aGUgYGBPcmlnaW5zYGAgb3IgYGBPcmlnaW5Hcm91cHNgYCBwcm9wZXJ0eS5cbiAqL1xuT3JpZ2lucz86IE9yaWdpbltdXG4vKipcbiAqIFRoZSBwcmljZSBjbGFzcyB0aGF0IGNvcnJlc3BvbmRzIHdpdGggdGhlIG1heGltdW0gcHJpY2UgdGhhdCB5b3Ugd2FudCB0byBwYXkgZm9yIENsb3VkRnJvbnQgc2VydmljZS4gSWYgeW91IHNwZWNpZnkgYGBQcmljZUNsYXNzX0FsbGBgLCBDbG91ZEZyb250IHJlc3BvbmRzIHRvIHJlcXVlc3RzIGZvciB5b3VyIG9iamVjdHMgZnJvbSBhbGwgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAqICBJZiB5b3Ugc3BlY2lmeSBhIHByaWNlIGNsYXNzIG90aGVyIHRoYW4gYGBQcmljZUNsYXNzX0FsbGBgLCBDbG91ZEZyb250IHNlcnZlcyB5b3VyIG9iamVjdHMgZnJvbSB0aGUgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9uIHRoYXQgaGFzIHRoZSBsb3dlc3QgbGF0ZW5jeSBhbW9uZyB0aGUgZWRnZSBsb2NhdGlvbnMgaW4geW91ciBwcmljZSBjbGFzcy4gVmlld2VycyB3aG8gYXJlIGluIG9yIG5lYXIgcmVnaW9ucyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHlvdXIgc3BlY2lmaWVkIHByaWNlIGNsYXNzIG1heSBlbmNvdW50ZXIgc2xvd2VyIHBlcmZvcm1hbmNlLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHByaWNlIGNsYXNzZXMsIHNlZSBbQ2hvb3NpbmcgdGhlIFByaWNlIENsYXNzIGZvciBhIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvUHJpY2VDbGFzcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouIEZvciBpbmZvcm1hdGlvbiBhYm91dCBDbG91ZEZyb250IHByaWNpbmcsIGluY2x1ZGluZyBob3cgcHJpY2UgY2xhc3NlcyAoc3VjaCBhcyBQcmljZSBDbGFzcyAxMDApIG1hcCB0byBDbG91ZEZyb250IHJlZ2lvbnMsIHNlZSBbQW1hem9uIENsb3VkRnJvbnQgUHJpY2luZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nsb3VkZnJvbnQvcHJpY2luZy8pLlxuICovXG5QcmljZUNsYXNzPzogc3RyaW5nXG5SZXN0cmljdGlvbnM/OiBSZXN0cmljdGlvbnNcblMzT3JpZ2luPzogTGVnYWN5UzNPcmlnaW5cbi8qKlxuICogQSBCb29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0YWdpbmcgZGlzdHJpYnV0aW9uLiBXaGVuIHRoaXMgdmFsdWUgaXMgYGB0cnVlYGAsIHRoaXMgaXMgYSBzdGFnaW5nIGRpc3RyaWJ1dGlvbi4gV2hlbiB0aGlzIHZhbHVlIGlzIGBgZmFsc2VgYCwgdGhpcyBpcyBub3QgYSBzdGFnaW5nIGRpc3RyaWJ1dGlvbi5cbiAqL1xuU3RhZ2luZz86IGJvb2xlYW5cblZpZXdlckNlcnRpZmljYXRlPzogVmlld2VyQ2VydGlmaWNhdGVcbi8qKlxuICogQSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IHNwZWNpZmllcyB0aGUgV0FGIHdlYiBBQ0wsIGlmIGFueSwgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBkaXN0cmlidXRpb24uIFRvIHNwZWNpZnkgYSB3ZWIgQUNMIGNyZWF0ZWQgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFdBRiwgdXNlIHRoZSBBQ0wgQVJOLCBmb3IgZXhhbXBsZSBgYGFybjphd3M6d2FmdjI6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpnbG9iYWwvd2ViYWNsL0V4YW1wbGVXZWJBQ0wvYTFiMmMzZDQtNTY3OC05MGFiLWNkZWYtRVhBTVBMRTExMTExYGAuIFRvIHNwZWNpZnkgYSB3ZWIgQUNMIGNyZWF0ZWQgdXNpbmcgV0FGIENsYXNzaWMsIHVzZSB0aGUgQUNMIElELCBmb3IgZXhhbXBsZSBgYGExYjJjM2Q0LTU2NzgtOTBhYi1jZGVmLUVYQU1QTEUxMTExMWBgLlxuICogICBXQUYgaXMgYSB3ZWIgYXBwbGljYXRpb24gZmlyZXdhbGwgdGhhdCBsZXRzIHlvdSBtb25pdG9yIHRoZSBIVFRQIGFuZCBIVFRQUyByZXF1ZXN0cyB0aGF0IGFyZSBmb3J3YXJkZWQgdG8gQ2xvdWRGcm9udCwgYW5kIGxldHMgeW91IGNvbnRyb2wgYWNjZXNzIHRvIHlvdXIgY29udGVudC4gQmFzZWQgb24gY29uZGl0aW9ucyB0aGF0IHlvdSBzcGVjaWZ5LCBzdWNoIGFzIHRoZSBJUCBhZGRyZXNzZXMgdGhhdCByZXF1ZXN0cyBvcmlnaW5hdGUgZnJvbSBvciB0aGUgdmFsdWVzIG9mIHF1ZXJ5IHN0cmluZ3MsIENsb3VkRnJvbnQgcmVzcG9uZHMgdG8gcmVxdWVzdHMgZWl0aGVyIHdpdGggdGhlIHJlcXVlc3RlZCBjb250ZW50IG9yIHdpdGggYW4gSFRUUCA0MDMgc3RhdHVzIGNvZGUgKEZvcmJpZGRlbikuIFlvdSBjYW4gYWxzbyBjb25maWd1cmUgQ2xvdWRGcm9udCB0byByZXR1cm4gYSBjdXN0b20gZXJyb3IgcGFnZSB3aGVuIGEgcmVxdWVzdCBpcyBibG9ja2VkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBXQUYsIHNlZSB0aGUgW0RldmVsb3BlciBHdWlkZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dhZi9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvd2hhdC1pcy1hd3Mtd2FmLmh0bWwpLlxuICovXG5XZWJBQ0xJZD86IHN0cmluZ1xufVxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGRlc2NyaWJlcyBob3cgQ2xvdWRGcm9udCBwcm9jZXNzZXMgcmVxdWVzdHMuXG4gKiAgWW91IG11c3QgY3JlYXRlIGF0IGxlYXN0IGFzIG1hbnkgY2FjaGUgYmVoYXZpb3JzIChpbmNsdWRpbmcgdGhlIGRlZmF1bHQgY2FjaGUgYmVoYXZpb3IpIGFzIHlvdSBoYXZlIG9yaWdpbnMgaWYgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBzZXJ2ZSBvYmplY3RzIGZyb20gYWxsIG9mIHRoZSBvcmlnaW5zLiBFYWNoIGNhY2hlIGJlaGF2aW9yIHNwZWNpZmllcyB0aGUgb25lIG9yaWdpbiBmcm9tIHdoaWNoIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZ2V0IG9iamVjdHMuIElmIHlvdSBoYXZlIHR3byBvcmlnaW5zIGFuZCBvbmx5IHRoZSBkZWZhdWx0IGNhY2hlIGJlaGF2aW9yLCB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvciB3aWxsIGNhdXNlIENsb3VkRnJvbnQgdG8gZ2V0IG9iamVjdHMgZnJvbSBvbmUgb2YgdGhlIG9yaWdpbnMsIGJ1dCB0aGUgb3RoZXIgb3JpZ2luIGlzIG5ldmVyIHVzZWQuXG4gKiAgRm9yIHRoZSBjdXJyZW50IHF1b3RhIChmb3JtZXJseSBrbm93biBhcyBsaW1pdCkgb24gdGhlIG51bWJlciBvZiBjYWNoZSBiZWhhdmlvcnMgdGhhdCB5b3UgY2FuIGFkZCB0byBhIGRpc3RyaWJ1dGlvbiwgc2VlIFtRdW90YXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IGRvbid0IHdhbnQgdG8gc3BlY2lmeSBhbnkgY2FjaGUgYmVoYXZpb3JzLCBpbmNsdWRlIG9ubHkgYW4gZW1wdHkgYGBDYWNoZUJlaGF2aW9yc2BgIGVsZW1lbnQuIERvbid0IHNwZWNpZnkgYW4gZW1wdHkgaW5kaXZpZHVhbCBgYENhY2hlQmVoYXZpb3JgYCBlbGVtZW50LCBiZWNhdXNlIHRoaXMgaXMgaW52YWxpZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ2FjaGVCZWhhdmlvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbG91ZGZyb250L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NhY2hlQmVoYXZpb3JzLmh0bWwpLiBcbiAqICBUbyBkZWxldGUgYWxsIGNhY2hlIGJlaGF2aW9ycyBpbiBhbiBleGlzdGluZyBkaXN0cmlidXRpb24sIHVwZGF0ZSB0aGUgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGluY2x1ZGUgb25seSBhbiBlbXB0eSBgYENhY2hlQmVoYXZpb3JzYGAgZWxlbWVudC5cbiAqICBUbyBhZGQsIGNoYW5nZSwgb3IgcmVtb3ZlIG9uZSBvciBtb3JlIGNhY2hlIGJlaGF2aW9ycywgdXBkYXRlIHRoZSBkaXN0cmlidXRpb24gY29uZmlndXJhdGlvbiBhbmQgc3BlY2lmeSBhbGwgb2YgdGhlIGNhY2hlIGJlaGF2aW9ycyB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgaW4gdGhlIHVwZGF0ZWQgZGlzdHJpYnV0aW9uLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNhY2hlIGJlaGF2aW9ycywgc2VlIFtDYWNoZSBCZWhhdmlvciBTZXR0aW5nc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Rpc3RyaWJ1dGlvbi13ZWItdmFsdWVzLXNwZWNpZnkuaHRtbCNEb3dubG9hZERpc3RWYWx1ZXNDYWNoZUJlaGF2aW9yKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVCZWhhdmlvciB7XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udHJvbHMgd2hpY2ggSFRUUCBtZXRob2RzIENsb3VkRnJvbnQgcHJvY2Vzc2VzIGFuZCBmb3J3YXJkcyB0byB5b3VyIEFtYXpvbiBTMyBidWNrZXQgb3IgeW91ciBjdXN0b20gb3JpZ2luLiBUaGVyZSBhcmUgdGhyZWUgY2hvaWNlczpcbiAqICAgKyAgQ2xvdWRGcm9udCBmb3J3YXJkcyBvbmx5IGBgR0VUYGAgYW5kIGBgSEVBRGBgIHJlcXVlc3RzLlxuICogICArICBDbG91ZEZyb250IGZvcndhcmRzIG9ubHkgYGBHRVRgYCwgYGBIRUFEYGAsIGFuZCBgYE9QVElPTlNgYCByZXF1ZXN0cy5cbiAqICAgKyAgQ2xvdWRGcm9udCBmb3J3YXJkcyBgYEdFVCwgSEVBRCwgT1BUSU9OUywgUFVULCBQQVRDSCwgUE9TVGBgLCBhbmQgYGBERUxFVEVgYCByZXF1ZXN0cy5cbiAqICAgXG4gKiAgSWYgeW91IHBpY2sgdGhlIHRoaXJkIGNob2ljZSwgeW91IG1heSBuZWVkIHRvIHJlc3RyaWN0IGFjY2VzcyB0byB5b3VyIEFtYXpvbiBTMyBidWNrZXQgb3IgdG8geW91ciBjdXN0b20gb3JpZ2luIHNvIHVzZXJzIGNhbid0IHBlcmZvcm0gb3BlcmF0aW9ucyB0aGF0IHlvdSBkb24ndCB3YW50IHRoZW0gdG8uIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgbm90IHdhbnQgdXNlcnMgdG8gaGF2ZSBwZXJtaXNzaW9ucyB0byBkZWxldGUgb2JqZWN0cyBmcm9tIHlvdXIgb3JpZ2luLlxuICovXG5BbGxvd2VkTWV0aG9kcz86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2FjaGUgcG9saWN5IHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhpcyBjYWNoZSBiZWhhdmlvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtY2FjaGUtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgYGBDYWNoZUJlaGF2aW9yYGAgbXVzdCBpbmNsdWRlIGVpdGhlciBhIGBgQ2FjaGVQb2xpY3lJZGBgIG9yIGBgRm9yd2FyZGVkVmFsdWVzYGAuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBgYENhY2hlUG9saWN5SWRgYC5cbiAqL1xuQ2FjaGVQb2xpY3lJZD86IHN0cmluZ1xuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgQ2xvdWRGcm9udCBjYWNoZXMgdGhlIHJlc3BvbnNlIHRvIHJlcXVlc3RzIHVzaW5nIHRoZSBzcGVjaWZpZWQgSFRUUCBtZXRob2RzLiBUaGVyZSBhcmUgdHdvIGNob2ljZXM6XG4gKiAgICsgIENsb3VkRnJvbnQgY2FjaGVzIHJlc3BvbnNlcyB0byBgYEdFVGBgIGFuZCBgYEhFQURgYCByZXF1ZXN0cy5cbiAqICAgKyAgQ2xvdWRGcm9udCBjYWNoZXMgcmVzcG9uc2VzIHRvIGBgR0VUYGAsIGBgSEVBRGBgLCBhbmQgYGBPUFRJT05TYGAgcmVxdWVzdHMuXG4gKiAgIFxuICogIElmIHlvdSBwaWNrIHRoZSBzZWNvbmQgY2hvaWNlIGZvciB5b3VyIEFtYXpvbiBTMyBPcmlnaW4sIHlvdSBtYXkgbmVlZCB0byBmb3J3YXJkIEFjY2Vzcy1Db250cm9sLVJlcXVlc3QtTWV0aG9kLCBBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMsIGFuZCBPcmlnaW4gaGVhZGVycyBmb3IgdGhlIHJlc3BvbnNlcyB0byBiZSBjYWNoZWQgY29ycmVjdGx5LlxuICovXG5DYWNoZWRNZXRob2RzPzogc3RyaW5nW11cbi8qKlxuICogV2hldGhlciB5b3Ugd2FudCBDbG91ZEZyb250IHRvIGF1dG9tYXRpY2FsbHkgY29tcHJlc3MgY2VydGFpbiBmaWxlcyBmb3IgdGhpcyBjYWNoZSBiZWhhdmlvci4gSWYgc28sIHNwZWNpZnkgdHJ1ZTsgaWYgbm90LCBzcGVjaWZ5IGZhbHNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aW5nIENvbXByZXNzZWQgRmlsZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9TZXJ2aW5nQ29tcHJlc3NlZEZpbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ29tcHJlc3M/OiBib29sZWFuXG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB0aGUgYGBEZWZhdWx0VFRMYGAgZmllbGQgaW4gYSBjYWNoZSBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIGRlZmF1bHQgYW1vdW50IG9mIHRpbWUgdGhhdCB5b3Ugd2FudCBvYmplY3RzIHRvIHN0YXkgaW4gQ2xvdWRGcm9udCBjYWNoZXMgYmVmb3JlIENsb3VkRnJvbnQgZm9yd2FyZHMgYW5vdGhlciByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIHZhbHVlIHRoYXQgeW91IHNwZWNpZnkgYXBwbGllcyBvbmx5IHdoZW4geW91ciBvcmlnaW4gZG9lcyBub3QgYWRkIEhUVFAgaGVhZGVycyBzdWNoIGFzIGBgQ2FjaGUtQ29udHJvbCBtYXgtYWdlYGAsIGBgQ2FjaGUtQ29udHJvbCBzLW1heGFnZWBgLCBhbmQgYGBFeHBpcmVzYGAgdG8gb2JqZWN0cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWFuYWdpbmcgSG93IExvbmcgQ29udGVudCBTdGF5cyBpbiBhbiBFZGdlIENhY2hlIChFeHBpcmF0aW9uKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0V4cGlyYXRpb24uaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5EZWZhdWx0VFRMPzogbnVtYmVyXG4vKipcbiAqIFRoZSB2YWx1ZSBvZiBgYElEYGAgZm9yIHRoZSBmaWVsZC1sZXZlbCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHVzZSBmb3IgZW5jcnlwdGluZyBzcGVjaWZpYyBmaWVsZHMgb2YgZGF0YSBmb3IgdGhpcyBjYWNoZSBiZWhhdmlvci5cbiAqL1xuRmllbGRMZXZlbEVuY3J5cHRpb25JZD86IHN0cmluZ1xuRm9yd2FyZGVkVmFsdWVzPzogRm9yd2FyZGVkVmFsdWVzXG4vKipcbiAqIEEgbGlzdCBvZiBDbG91ZEZyb250IGZ1bmN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWNoZSBiZWhhdmlvci4gQ2xvdWRGcm9udCBmdW5jdGlvbnMgbXVzdCBiZSBwdWJsaXNoZWQgdG8gdGhlIGBgTElWRWBgIHN0YWdlIHRvIGFzc29jaWF0ZSB0aGVtIHdpdGggYSBjYWNoZSBiZWhhdmlvci5cbiAqL1xuRnVuY3Rpb25Bc3NvY2lhdGlvbnM/OiBGdW5jdGlvbkFzc29jaWF0aW9uW11cbkdycGNDb25maWc/OiBHcnBjQ29uZmlnXG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgemVybyBvciBtb3JlIExhbWJkYUBFZGdlIGZ1bmN0aW9uIGFzc29jaWF0aW9ucyBmb3IgYSBjYWNoZSBiZWhhdmlvci5cbiAqL1xuTGFtYmRhRnVuY3Rpb25Bc3NvY2lhdGlvbnM/OiBMYW1iZGFGdW5jdGlvbkFzc29jaWF0aW9uW11cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHRoZSBgYE1heFRUTGBgIGZpZWxkIGluIGEgY2FjaGUgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtY2FjaGUtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgeW91IHdhbnQgb2JqZWN0cyB0byBzdGF5IGluIENsb3VkRnJvbnQgY2FjaGVzIGJlZm9yZSBDbG91ZEZyb250IGZvcndhcmRzIGFub3RoZXIgcmVxdWVzdCB0byB5b3VyIG9yaWdpbiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgb2JqZWN0IGhhcyBiZWVuIHVwZGF0ZWQuIFRoZSB2YWx1ZSB0aGF0IHlvdSBzcGVjaWZ5IGFwcGxpZXMgb25seSB3aGVuIHlvdXIgb3JpZ2luIGFkZHMgSFRUUCBoZWFkZXJzIHN1Y2ggYXMgYGBDYWNoZS1Db250cm9sIG1heC1hZ2VgYCwgYGBDYWNoZS1Db250cm9sIHMtbWF4YWdlYGAsIGFuZCBgYEV4cGlyZXNgYCB0byBvYmplY3RzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtNYW5hZ2luZyBIb3cgTG9uZyBDb250ZW50IFN0YXlzIGluIGFuIEVkZ2UgQ2FjaGUgKEV4cGlyYXRpb24pXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvRXhwaXJhdGlvbi5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk1heFRUTD86IG51bWJlclxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdGhlIGBgTWluVFRMYGAgZmllbGQgaW4gYSBjYWNoZSBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCB5b3Ugd2FudCBvYmplY3RzIHRvIHN0YXkgaW4gQ2xvdWRGcm9udCBjYWNoZXMgYmVmb3JlIENsb3VkRnJvbnQgZm9yd2FyZHMgYW5vdGhlciByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gdXBkYXRlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWFuYWdpbmcgSG93IExvbmcgQ29udGVudCBTdGF5cyBpbiBhbiBFZGdlIENhY2hlIChFeHBpcmF0aW9uKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0V4cGlyYXRpb24uaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBtdXN0IHNwZWNpZnkgYGAwYGAgZm9yIGBgTWluVFRMYGAgaWYgeW91IGNvbmZpZ3VyZSBDbG91ZEZyb250IHRvIGZvcndhcmQgYWxsIGhlYWRlcnMgdG8geW91ciBvcmlnaW4gKHVuZGVyIGBgSGVhZGVyc2BgLCBpZiB5b3Ugc3BlY2lmeSBgYDFgYCBmb3IgYGBRdWFudGl0eWBgIGFuZCBgYCpgYCBmb3IgYGBOYW1lYGApLlxuICovXG5NaW5UVEw/OiBudW1iZXJcbi8qKlxuICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGlzIGNhY2hlIGJlaGF2aW9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5PcmlnaW5SZXF1ZXN0UG9saWN5SWQ/OiBzdHJpbmdcbi8qKlxuICogVGhlIHBhdHRlcm4gKGZvciBleGFtcGxlLCBgYGltYWdlcy8qLmpwZ2BgKSB0aGF0IHNwZWNpZmllcyB3aGljaCByZXF1ZXN0cyB0byBhcHBseSB0aGUgYmVoYXZpb3IgdG8uIFdoZW4gQ2xvdWRGcm9udCByZWNlaXZlcyBhIHZpZXdlciByZXF1ZXN0LCB0aGUgcmVxdWVzdGVkIHBhdGggaXMgY29tcGFyZWQgd2l0aCBwYXRoIHBhdHRlcm5zIGluIHRoZSBvcmRlciBpbiB3aGljaCBjYWNoZSBiZWhhdmlvcnMgYXJlIGxpc3RlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLlxuICogICBZb3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSBhIHNsYXNoIChgYC9gYCkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aCBwYXR0ZXJuLiBGb3IgZXhhbXBsZSwgYGAvaW1hZ2VzLyouanBnYGAuIENsb3VkRnJvbnQgYmVoYXZpb3IgaXMgdGhlIHNhbWUgd2l0aCBvciB3aXRob3V0IHRoZSBsZWFkaW5nIGBgL2BgLlxuICogICBUaGUgcGF0aCBwYXR0ZXJuIGZvciB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvciBpcyBgYCpgYCBhbmQgY2Fubm90IGJlIGNoYW5nZWQuIElmIHRoZSByZXF1ZXN0IGZvciBhbiBvYmplY3QgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdGggcGF0dGVybiBmb3IgYW55IGNhY2hlIGJlaGF2aW9ycywgQ2xvdWRGcm9udCBhcHBsaWVzIHRoZSBiZWhhdmlvciBpbiB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvci5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtQYXRoIFBhdHRlcm5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td2ViLXZhbHVlcy1zcGVjaWZ5Lmh0bWwjRG93bmxvYWREaXN0VmFsdWVzUGF0aFBhdHRlcm4pIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuUGF0aFBhdHRlcm46IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHJlYWwtdGltZSBsb2cgY29uZmlndXJhdGlvbiB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoaXMgY2FjaGUgYmVoYXZpb3IuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JlYWwtdGltZSBsb2dzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvcmVhbC10aW1lLWxvZ3MuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5SZWFsdGltZUxvZ0NvbmZpZ0Fybj86IHN0cmluZ1xuLyoqXG4gKiBUaGUgaWRlbnRpZmllciBmb3IgYSByZXNwb25zZSBoZWFkZXJzIHBvbGljeS5cbiAqL1xuUmVzcG9uc2VIZWFkZXJzUG9saWN5SWQ/OiBzdHJpbmdcbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgeW91IHdhbnQgdG8gZGlzdHJpYnV0ZSBtZWRpYSBmaWxlcyBpbiB0aGUgTWljcm9zb2Z0IFNtb290aCBTdHJlYW1pbmcgZm9ybWF0IHVzaW5nIHRoZSBvcmlnaW4gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWNoZSBiZWhhdmlvci4gSWYgc28sIHNwZWNpZnkgYGB0cnVlYGA7IGlmIG5vdCwgc3BlY2lmeSBgYGZhbHNlYGAuIElmIHlvdSBzcGVjaWZ5IGBgdHJ1ZWBgIGZvciBgYFNtb290aFN0cmVhbWluZ2BgLCB5b3UgY2FuIHN0aWxsIGRpc3RyaWJ1dGUgb3RoZXIgY29udGVudCB1c2luZyB0aGlzIGNhY2hlIGJlaGF2aW9yIGlmIHRoZSBjb250ZW50IG1hdGNoZXMgdGhlIHZhbHVlIG9mIGBgUGF0aFBhdHRlcm5gYC5cbiAqL1xuU21vb3RoU3RyZWFtaW5nPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgdmFsdWUgb2YgYGBJRGBgIGZvciB0aGUgb3JpZ2luIHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byByb3V0ZSByZXF1ZXN0cyB0byB3aGVuIHRoZXkgbWF0Y2ggdGhpcyBjYWNoZSBiZWhhdmlvci5cbiAqL1xuVGFyZ2V0T3JpZ2luSWQ6IHN0cmluZ1xuLyoqXG4gKiBBIGxpc3Qgb2Yga2V5IGdyb3VwcyB0aGF0IENsb3VkRnJvbnQgY2FuIHVzZSB0byB2YWxpZGF0ZSBzaWduZWQgVVJMcyBvciBzaWduZWQgY29va2llcy5cbiAqICBXaGVuIGEgY2FjaGUgYmVoYXZpb3IgY29udGFpbnMgdHJ1c3RlZCBrZXkgZ3JvdXBzLCBDbG91ZEZyb250IHJlcXVpcmVzIHNpZ25lZCBVUkxzIG9yIHNpZ25lZCBjb29raWVzIGZvciBhbGwgcmVxdWVzdHMgdGhhdCBtYXRjaCB0aGUgY2FjaGUgYmVoYXZpb3IuIFRoZSBVUkxzIG9yIGNvb2tpZXMgbXVzdCBiZSBzaWduZWQgd2l0aCBhIHByaXZhdGUga2V5IHdob3NlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSBpcyBpbiB0aGUga2V5IGdyb3VwLiBUaGUgc2lnbmVkIFVSTCBvciBjb29raWUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggcHVibGljIGtleSBDbG91ZEZyb250IHNob3VsZCB1c2UgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpbmcgcHJpdmF0ZSBjb250ZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvUHJpdmF0ZUNvbnRlbnQuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5UcnVzdGVkS2V5R3JvdXBzPzogc3RyaW5nW11cbi8qKlxuICogV2UgcmVjb21tZW5kIHVzaW5nIGBgVHJ1c3RlZEtleUdyb3Vwc2BgIGluc3RlYWQgb2YgYGBUcnVzdGVkU2lnbmVyc2BgLlxuICogICBBIGxpc3Qgb2YgQVdTLWFjY291bnQgSURzIHdob3NlIHB1YmxpYyBrZXlzIENsb3VkRnJvbnQgY2FuIHVzZSB0byB2YWxpZGF0ZSBzaWduZWQgVVJMcyBvciBzaWduZWQgY29va2llcy5cbiAqICBXaGVuIGEgY2FjaGUgYmVoYXZpb3IgY29udGFpbnMgdHJ1c3RlZCBzaWduZXJzLCBDbG91ZEZyb250IHJlcXVpcmVzIHNpZ25lZCBVUkxzIG9yIHNpZ25lZCBjb29raWVzIGZvciBhbGwgcmVxdWVzdHMgdGhhdCBtYXRjaCB0aGUgY2FjaGUgYmVoYXZpb3IuIFRoZSBVUkxzIG9yIGNvb2tpZXMgbXVzdCBiZSBzaWduZWQgd2l0aCB0aGUgcHJpdmF0ZSBrZXkgb2YgYSBDbG91ZEZyb250IGtleSBwYWlyIGluIHRoZSB0cnVzdGVkIHNpZ25lcidzIEFXUy1hY2NvdW50LiBUaGUgc2lnbmVkIFVSTCBvciBjb29raWUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggcHVibGljIGtleSBDbG91ZEZyb250IHNob3VsZCB1c2UgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpbmcgcHJpdmF0ZSBjb250ZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvUHJpdmF0ZUNvbnRlbnQuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5UcnVzdGVkU2lnbmVycz86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSBwcm90b2NvbCB0aGF0IHZpZXdlcnMgY2FuIHVzZSB0byBhY2Nlc3MgdGhlIGZpbGVzIGluIHRoZSBvcmlnaW4gc3BlY2lmaWVkIGJ5IGBgVGFyZ2V0T3JpZ2luSWRgYCB3aGVuIGEgcmVxdWVzdCBtYXRjaGVzIHRoZSBwYXRoIHBhdHRlcm4gaW4gYGBQYXRoUGF0dGVybmBgLiBZb3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICogICArICAgYGBhbGxvdy1hbGxgYDogVmlld2VycyBjYW4gdXNlIEhUVFAgb3IgSFRUUFMuXG4gKiAgICsgICBgYHJlZGlyZWN0LXRvLWh0dHBzYGA6IElmIGEgdmlld2VyIHN1Ym1pdHMgYW4gSFRUUCByZXF1ZXN0LCBDbG91ZEZyb250IHJldHVybnMgYW4gSFRUUCBzdGF0dXMgY29kZSBvZiAzMDEgKE1vdmVkIFBlcm1hbmVudGx5KSB0byB0aGUgdmlld2VyIGFsb25nIHdpdGggdGhlIEhUVFBTIFVSTC4gVGhlIHZpZXdlciB0aGVuIHJlc3VibWl0cyB0aGUgcmVxdWVzdCB1c2luZyB0aGUgbmV3IFVSTC5cbiAqICAgKyAgIGBgaHR0cHMtb25seWBgOiBJZiBhIHZpZXdlciBzZW5kcyBhbiBIVFRQIHJlcXVlc3QsIENsb3VkRnJvbnQgcmV0dXJucyBhbiBIVFRQIHN0YXR1cyBjb2RlIG9mIDQwMyAoRm9yYmlkZGVuKS5cbiAqICAgXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcmVxdWlyaW5nIHRoZSBIVFRQUyBwcm90b2NvbCwgc2VlIFtSZXF1aXJpbmcgSFRUUFMgQmV0d2VlbiBWaWV3ZXJzIGFuZCBDbG91ZEZyb250XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctaHR0cHMtdmlld2Vycy10by1jbG91ZGZyb250Lmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgVGhlIG9ubHkgd2F5IHRvIGd1YXJhbnRlZSB0aGF0IHZpZXdlcnMgcmV0cmlldmUgYW4gb2JqZWN0IHRoYXQgd2FzIGZldGNoZWQgZnJvbSB0aGUgb3JpZ2luIHVzaW5nIEhUVFBTIGlzIG5ldmVyIHRvIHVzZSBhbnkgb3RoZXIgcHJvdG9jb2wgdG8gZmV0Y2ggdGhlIG9iamVjdC4gSWYgeW91IGhhdmUgcmVjZW50bHkgY2hhbmdlZCBmcm9tIEhUVFAgdG8gSFRUUFMsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBjbGVhciB5b3VyIG9iamVjdHMnIGNhY2hlIGJlY2F1c2UgY2FjaGVkIG9iamVjdHMgYXJlIHByb3RvY29sIGFnbm9zdGljLiBUaGF0IG1lYW5zIHRoYXQgYW4gZWRnZSBsb2NhdGlvbiB3aWxsIHJldHVybiBhbiBvYmplY3QgZnJvbSB0aGUgY2FjaGUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjdXJyZW50IHJlcXVlc3QgcHJvdG9jb2wgbWF0Y2hlcyB0aGUgcHJvdG9jb2wgdXNlZCBwcmV2aW91c2x5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtNYW5hZ2luZyBDYWNoZSBFeHBpcmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvRXhwaXJhdGlvbi5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cblZpZXdlclByb3RvY29sUG9saWN5OiBzdHJpbmdcbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgY2FjaGUgcG9saWN5IG9yIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBpbnN0ZWFkIG9mIHRoaXMgZmllbGQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1dvcmtpbmcgd2l0aCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3dvcmtpbmctd2l0aC1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSB2YWx1ZXMgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IHdhbnQgdG8gc2VuZCB2YWx1ZXMgdG8gdGhlIG9yaWdpbiBidXQgbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgYGBDYWNoZUJlaGF2aW9yYGAgbXVzdCBpbmNsdWRlIGVpdGhlciBhIGBgQ2FjaGVQb2xpY3lJZGBgIG9yIGBgRm9yd2FyZGVkVmFsdWVzYGAuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBgYENhY2hlUG9saWN5SWRgYC5cbiAqICBBIGNvbXBsZXggdHlwZSB0aGF0IHNwZWNpZmllcyBob3cgQ2xvdWRGcm9udCBoYW5kbGVzIHF1ZXJ5IHN0cmluZ3MsIGNvb2tpZXMsIGFuZCBIVFRQIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZGVkVmFsdWVzIHtcbkNvb2tpZXM/OiBDb29raWVzXG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBhIGNhY2hlIHBvbGljeSBvciBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLlxuICogIElmIHlvdSB3YW50IHRvIGluY2x1ZGUgaGVhZGVycyBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYSBjYWNoZSBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sI2NhY2hlLWtleS1jcmVhdGUtY2FjaGUtcG9saWN5KSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IHdhbnQgdG8gc2VuZCBoZWFkZXJzIHRvIHRoZSBvcmlnaW4gYnV0IG5vdCBpbmNsdWRlIHRoZW0gaW4gdGhlIGNhY2hlIGtleSwgdXNlIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgb3JpZ2luIHJlcXVlc3QgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbCNvcmlnaW4tcmVxdWVzdC1jcmVhdGUtb3JpZ2luLXJlcXVlc3QtcG9saWN5KSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgQSBjb21wbGV4IHR5cGUgdGhhdCBzcGVjaWZpZXMgdGhlIGBgSGVhZGVyc2BgLCBpZiBhbnksIHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBmb3J3YXJkIHRvIHRoZSBvcmlnaW4gZm9yIHRoaXMgY2FjaGUgYmVoYXZpb3IgKHdoaXRlbGlzdGVkIGhlYWRlcnMpLiBGb3IgdGhlIGhlYWRlcnMgdGhhdCB5b3Ugc3BlY2lmeSwgQ2xvdWRGcm9udCBhbHNvIGNhY2hlcyBzZXBhcmF0ZSB2ZXJzaW9ucyBvZiBhIHNwZWNpZmllZCBvYmplY3QgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaGVhZGVyIHZhbHVlcyBpbiB2aWV3ZXIgcmVxdWVzdHMuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ2FjaGluZyBDb250ZW50IEJhc2VkIG9uIFJlcXVlc3QgSGVhZGVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2hlYWRlci1jYWNoaW5nLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuSGVhZGVycz86IHN0cmluZ1tdXG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBhIGNhY2hlIHBvbGljeSBvciBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLlxuICogIElmIHlvdSB3YW50IHRvIGluY2x1ZGUgcXVlcnkgc3RyaW5ncyBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYSBjYWNoZSBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sI2NhY2hlLWtleS1jcmVhdGUtY2FjaGUtcG9saWN5KSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgeW91IHdhbnQgdG8gc2VuZCBxdWVyeSBzdHJpbmdzIHRvIHRoZSBvcmlnaW4gYnV0IG5vdCBpbmNsdWRlIHRoZW0gaW4gdGhlIGNhY2hlIGtleSwgdXNlIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgb3JpZ2luIHJlcXVlc3QgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbCNvcmlnaW4tcmVxdWVzdC1jcmVhdGUtb3JpZ2luLXJlcXVlc3QtcG9saWN5KSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgSW5kaWNhdGVzIHdoZXRoZXIgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBmb3J3YXJkIHF1ZXJ5IHN0cmluZ3MgdG8gdGhlIG9yaWdpbiB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhY2hlIGJlaGF2aW9yIGFuZCBjYWNoZSBiYXNlZCBvbiB0aGUgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMuIENsb3VkRnJvbnQgYmVoYXZpb3IgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgYGBRdWVyeVN0cmluZ2BgIGFuZCBvbiB0aGUgdmFsdWVzIHRoYXQgeW91IHNwZWNpZnkgZm9yIGBgUXVlcnlTdHJpbmdDYWNoZUtleXNgYCwgaWYgYW55OlxuICogIElmIHlvdSBzcGVjaWZ5IHRydWUgZm9yIGBgUXVlcnlTdHJpbmdgYCBhbmQgeW91IGRvbid0IHNwZWNpZnkgYW55IHZhbHVlcyBmb3IgYGBRdWVyeVN0cmluZ0NhY2hlS2V5c2BgLCBDbG91ZEZyb250IGZvcndhcmRzIGFsbCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0byB0aGUgb3JpZ2luIGFuZCBjYWNoZXMgYmFzZWQgb24gYWxsIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzLiBEZXBlbmRpbmcgb24gaG93IG1hbnkgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgYW5kIHZhbHVlcyB5b3UgaGF2ZSwgdGhpcyBjYW4gYWR2ZXJzZWx5IGFmZmVjdCBwZXJmb3JtYW5jZSBiZWNhdXNlIENsb3VkRnJvbnQgbXVzdCBmb3J3YXJkIG1vcmUgcmVxdWVzdHMgdG8gdGhlIG9yaWdpbi5cbiAqICBJZiB5b3Ugc3BlY2lmeSB0cnVlIGZvciBgYFF1ZXJ5U3RyaW5nYGAgYW5kIHlvdSBzcGVjaWZ5IG9uZSBvciBtb3JlIHZhbHVlcyBmb3IgYGBRdWVyeVN0cmluZ0NhY2hlS2V5c2BgLCBDbG91ZEZyb250IGZvcndhcmRzIGFsbCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0byB0aGUgb3JpZ2luLCBidXQgaXQgb25seSBjYWNoZXMgYmFzZWQgb24gdGhlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRoYXQgeW91IHNwZWNpZnkuXG4gKiAgSWYgeW91IHNwZWNpZnkgZmFsc2UgZm9yIGBgUXVlcnlTdHJpbmdgYCwgQ2xvdWRGcm9udCBkb2Vzbid0IGZvcndhcmQgYW55IHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRvIHRoZSBvcmlnaW4sIGFuZCBkb2Vzbid0IGNhY2hlIGJhc2VkIG9uIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NvbmZpZ3VyaW5nIENsb3VkRnJvbnQgdG8gQ2FjaGUgQmFzZWQgb24gUXVlcnkgU3RyaW5nIFBhcmFtZXRlcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9RdWVyeVN0cmluZ1BhcmFtZXRlcnMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5RdWVyeVN0cmluZzogYm9vbGVhblxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIHF1ZXJ5IHN0cmluZ3MgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHlvdSB3YW50IHRvIHNlbmQgcXVlcnkgc3RyaW5ncyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byB1c2UgZm9yIGNhY2hpbmcgZm9yIHRoaXMgY2FjaGUgYmVoYXZpb3IuXG4gKi9cblF1ZXJ5U3RyaW5nQ2FjaGVLZXlzPzogc3RyaW5nW11cbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgY2FjaGUgcG9saWN5IG9yIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBpbnN0ZWFkIG9mIHRoaXMgZmllbGQuXG4gKiAgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBjb29raWVzIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhIGNhY2hlIHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBzZW5kIGNvb2tpZXMgdG8gdGhlIG9yaWdpbiBidXQgbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBBIGNvbXBsZXggdHlwZSB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZm9yd2FyZCBjb29raWVzIHRvIHRoZSBvcmlnaW4gYW5kLCBpZiBzbywgd2hpY2ggb25lcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZm9yd2FyZGluZyBjb29raWVzIHRvIHRoZSBvcmlnaW4sIHNlZSBbSG93IENsb3VkRnJvbnQgRm9yd2FyZHMsIENhY2hlcywgYW5kIExvZ3MgQ29va2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0Nvb2tpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvb2tpZXMge1xuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIGNvb2tpZXMgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHlvdSB3YW50IHRvIHNlbmQgY29va2llcyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFNwZWNpZmllcyB3aGljaCBjb29raWVzIHRvIGZvcndhcmQgdG8gdGhlIG9yaWdpbiBmb3IgdGhpcyBjYWNoZSBiZWhhdmlvcjogYWxsLCBub25lLCBvciB0aGUgbGlzdCBvZiBjb29raWVzIHNwZWNpZmllZCBpbiB0aGUgYGBXaGl0ZWxpc3RlZE5hbWVzYGAgY29tcGxleCB0eXBlLlxuICogIEFtYXpvbiBTMyBkb2Vzbid0IHByb2Nlc3MgY29va2llcy4gV2hlbiB0aGUgY2FjaGUgYmVoYXZpb3IgaXMgZm9yd2FyZGluZyByZXF1ZXN0cyB0byBhbiBBbWF6b24gUzMgb3JpZ2luLCBzcGVjaWZ5IG5vbmUgZm9yIHRoZSBgYEZvcndhcmRgYCBlbGVtZW50LlxuICovXG5Gb3J3YXJkOiBzdHJpbmdcbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgY2FjaGUgcG9saWN5IG9yIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBpbnN0ZWFkIG9mIHRoaXMgZmllbGQuXG4gKiAgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBjb29raWVzIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhIGNhY2hlIHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBzZW5kIGNvb2tpZXMgdG8gdGhlIG9yaWdpbiBidXQgbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBSZXF1aXJlZCBpZiB5b3Ugc3BlY2lmeSBgYHdoaXRlbGlzdGBgIGZvciB0aGUgdmFsdWUgb2YgYGBGb3J3YXJkYGAuIEEgY29tcGxleCB0eXBlIHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IGRpZmZlcmVudCBjb29raWVzIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZm9yd2FyZCB0byB0aGUgb3JpZ2luIGZvciB0aGlzIGNhY2hlIGJlaGF2aW9yIGFuZCwgaWYgeW91IHdhbnQgdG8gZm9yd2FyZCBzZWxlY3RlZCBjb29raWVzLCB0aGUgbmFtZXMgb2YgdGhvc2UgY29va2llcy5cbiAqICBJZiB5b3Ugc3BlY2lmeSBgYGFsbGBgIG9yIGBgbm9uZWBgIGZvciB0aGUgdmFsdWUgb2YgYGBGb3J3YXJkYGAsIG9taXQgYGBXaGl0ZWxpc3RlZE5hbWVzYGAuIElmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGBgRm9yd2FyZGBgIGZyb20gYGB3aGl0ZWxpc3RgYCB0byBgYGFsbGBgIG9yIGBgbm9uZWBgIGFuZCB5b3UgZG9uJ3QgZGVsZXRlIHRoZSBgYFdoaXRlbGlzdGVkTmFtZXNgYCBlbGVtZW50IGFuZCBpdHMgY2hpbGQgZWxlbWVudHMsIENsb3VkRnJvbnQgZGVsZXRlcyB0aGVtIGF1dG9tYXRpY2FsbHkuXG4gKiAgRm9yIHRoZSBjdXJyZW50IGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY29va2llIG5hbWVzIHRoYXQgeW91IGNhbiB3aGl0ZWxpc3QgZm9yIGVhY2ggY2FjaGUgYmVoYXZpb3IsIHNlZSBbQ2xvdWRGcm9udCBMaW1pdHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nZW5lcmFsL2xhdGVzdC9nci94cmVmYXdzX3NlcnZpY2VfbGltaXRzLmh0bWwjbGltaXRzX2Nsb3VkZnJvbnQpIGluIHRoZSAqR2VuZXJhbCBSZWZlcmVuY2UqLlxuICovXG5XaGl0ZWxpc3RlZE5hbWVzPzogc3RyaW5nW11cbn1cbi8qKlxuICogQSBDbG91ZEZyb250IGZ1bmN0aW9uIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgY2FjaGUgYmVoYXZpb3IgaW4gYSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkFzc29jaWF0aW9uIHtcbi8qKlxuICogVGhlIGV2ZW50IHR5cGUgb2YgdGhlIGZ1bmN0aW9uLCBlaXRoZXIgYGB2aWV3ZXItcmVxdWVzdGBgIG9yIGBgdmlld2VyLXJlc3BvbnNlYGAuIFlvdSBjYW5ub3QgdXNlIG9yaWdpbi1mYWNpbmcgZXZlbnQgdHlwZXMgKGBgb3JpZ2luLXJlcXVlc3RgYCBhbmQgYGBvcmlnaW4tcmVzcG9uc2VgYCkgd2l0aCBhIENsb3VkRnJvbnQgZnVuY3Rpb24uXG4gKi9cbkV2ZW50VHlwZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5GdW5jdGlvbkFSTj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgZ1JQQyBjb25maWd1cmF0aW9uIGZvciB5b3VyIGNhY2hlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdycGNDb25maWcge1xuLyoqXG4gKiBFbmFibGVzIHlvdXIgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcmVjZWl2ZSBnUlBDIHJlcXVlc3RzIGFuZCB0byBwcm94eSB0aGVtIGRpcmVjdGx5IHRvIHlvdXIgb3JpZ2lucy5cbiAqL1xuRW5hYmxlZDogYm9vbGVhblxufVxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRhaW5zIGEgTGFtYmRhQEVkZ2UgZnVuY3Rpb24gYXNzb2NpYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Bc3NvY2lhdGlvbiB7XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgZXZlbnQgdHlwZSB0aGF0IHRyaWdnZXJzIGEgTGFtYmRhQEVkZ2UgZnVuY3Rpb24gaW52b2NhdGlvbi4gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICogICArICAgYGB2aWV3ZXItcmVxdWVzdGBgOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgd2hlbiBDbG91ZEZyb250IHJlY2VpdmVzIGEgcmVxdWVzdCBmcm9tIGEgdmlld2VyIGFuZCBiZWZvcmUgaXQgY2hlY2tzIHRvIHNlZSB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGluIHRoZSBlZGdlIGNhY2hlLlxuICogICArICAgYGBvcmlnaW4tcmVxdWVzdGBgOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgb25seSB3aGVuIENsb3VkRnJvbnQgc2VuZHMgYSByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luLiBXaGVuIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGluIHRoZSBlZGdlIGNhY2hlLCB0aGUgZnVuY3Rpb24gZG9lc24ndCBleGVjdXRlLlxuICogICArICAgYGBvcmlnaW4tcmVzcG9uc2VgYDogVGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGFmdGVyIENsb3VkRnJvbnQgcmVjZWl2ZXMgYSByZXNwb25zZSBmcm9tIHRoZSBvcmlnaW4gYW5kIGJlZm9yZSBpdCBjYWNoZXMgdGhlIG9iamVjdCBpbiB0aGUgcmVzcG9uc2UuIFdoZW4gdGhlIHJlcXVlc3RlZCBvYmplY3QgaXMgaW4gdGhlIGVkZ2UgY2FjaGUsIHRoZSBmdW5jdGlvbiBkb2Vzbid0IGV4ZWN1dGUuXG4gKiAgICsgICBgYHZpZXdlci1yZXNwb25zZWBgOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgYmVmb3JlIENsb3VkRnJvbnQgcmV0dXJucyB0aGUgcmVxdWVzdGVkIG9iamVjdCB0byB0aGUgdmlld2VyLiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBvYmplY3Qgd2FzIGFscmVhZHkgaW4gdGhlIGVkZ2UgY2FjaGUuXG4gKiAgSWYgdGhlIG9yaWdpbiByZXR1cm5zIGFuIEhUVFAgc3RhdHVzIGNvZGUgb3RoZXIgdGhhbiBIVFRQIDIwMCAoT0spLCB0aGUgZnVuY3Rpb24gZG9lc24ndCBleGVjdXRlLlxuICovXG5FdmVudFR5cGU/OiBzdHJpbmdcbi8qKlxuICogQSBmbGFnIHRoYXQgYWxsb3dzIGEgTGFtYmRhQEVkZ2UgZnVuY3Rpb24gdG8gaGF2ZSByZWFkIGFjY2VzcyB0byB0aGUgYm9keSBjb250ZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBY2Nlc3NpbmcgdGhlIFJlcXVlc3QgQm9keSBieSBDaG9vc2luZyB0aGUgSW5jbHVkZSBCb2R5IE9wdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2xhbWJkYS1pbmNsdWRlLWJvZHktYWNjZXNzLmh0bWwpIGluIHRoZSBBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUuXG4gKi9cbkluY2x1ZGVCb2R5PzogYm9vbGVhblxuLyoqXG4gKiBUaGUgQVJOIG9mIHRoZSBMYW1iZGFARWRnZSBmdW5jdGlvbi4gWW91IG11c3Qgc3BlY2lmeSB0aGUgQVJOIG9mIGEgZnVuY3Rpb24gdmVyc2lvbjsgeW91IGNhbid0IHNwZWNpZnkgYW4gYWxpYXMgb3IgJExBVEVTVC5cbiAqL1xuTGFtYmRhRnVuY3Rpb25BUk4/OiBzdHJpbmdcbn1cbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250cm9sczpcbiAqICAgKyAgV2hldGhlciBDbG91ZEZyb250IHJlcGxhY2VzIEhUVFAgc3RhdHVzIGNvZGVzIGluIHRoZSA0eHggYW5kIDV4eCByYW5nZSB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlcyBiZWZvcmUgcmV0dXJuaW5nIHRoZSByZXNwb25zZSB0byB0aGUgdmlld2VyLlxuICogICArICBIb3cgbG9uZyBDbG91ZEZyb250IGNhY2hlcyBIVFRQIHN0YXR1cyBjb2RlcyBpbiB0aGUgNHh4IGFuZCA1eHggcmFuZ2UuXG4gKiAgIFxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGN1c3RvbSBlcnJvciBwYWdlcywgc2VlIFtDdXN0b21pemluZyBFcnJvciBSZXNwb25zZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jdXN0b20tZXJyb3ItcGFnZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUVycm9yUmVzcG9uc2Uge1xuLyoqXG4gKiBUaGUgbWluaW11bSBhbW91bnQgb2YgdGltZSwgaW4gc2Vjb25kcywgdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIGNhY2hlIHRoZSBIVFRQIHN0YXR1cyBjb2RlIHNwZWNpZmllZCBpbiBgYEVycm9yQ29kZWBgLiBXaGVuIHRoaXMgdGltZSBwZXJpb2QgaGFzIGVsYXBzZWQsIENsb3VkRnJvbnQgcXVlcmllcyB5b3VyIG9yaWdpbiB0byBzZWUgd2hldGhlciB0aGUgcHJvYmxlbSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IgaGFzIGJlZW4gcmVzb2x2ZWQgYW5kIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIG5vdyBhdmFpbGFibGUuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3VzdG9taXppbmcgRXJyb3IgUmVzcG9uc2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY3VzdG9tLWVycm9yLXBhZ2VzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRXJyb3JDYWNoaW5nTWluVFRMPzogbnVtYmVyXG4vKipcbiAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGZvciB3aGljaCB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgY3VzdG9tIGVycm9yIHBhZ2UgYW5kL29yIGEgY2FjaGluZyBkdXJhdGlvbi5cbiAqL1xuRXJyb3JDb2RlOiBudW1iZXJcbi8qKlxuICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHJldHVybiB0byB0aGUgdmlld2VyIGFsb25nIHdpdGggdGhlIGN1c3RvbSBlcnJvciBwYWdlLiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIHJlYXNvbnMgdGhhdCB5b3UgbWlnaHQgd2FudCBDbG91ZEZyb250IHRvIHJldHVybiBhIHN0YXR1cyBjb2RlIGRpZmZlcmVudCBmcm9tIHRoZSBzdGF0dXMgY29kZSB0aGF0IHlvdXIgb3JpZ2luIHJldHVybmVkIHRvIENsb3VkRnJvbnQsIGZvciBleGFtcGxlOlxuICogICArICBTb21lIEludGVybmV0IGRldmljZXMgKHNvbWUgZmlyZXdhbGxzIGFuZCBjb3Jwb3JhdGUgcHJveGllcywgZm9yIGV4YW1wbGUpIGludGVyY2VwdCBIVFRQIDR4eCBhbmQgNXh4IGFuZCBwcmV2ZW50IHRoZSByZXNwb25zZSBmcm9tIGJlaW5nIHJldHVybmVkIHRvIHRoZSB2aWV3ZXIuIElmIHlvdSBzdWJzdGl0dXRlIGBgMjAwYGAsIHRoZSByZXNwb25zZSB0eXBpY2FsbHkgd29uJ3QgYmUgaW50ZXJjZXB0ZWQuXG4gKiAgICsgIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IGRpc3Rpbmd1aXNoaW5nIGFtb25nIGRpZmZlcmVudCBjbGllbnQgZXJyb3JzIG9yIHNlcnZlciBlcnJvcnMsIHlvdSBjYW4gc3BlY2lmeSBgYDQwMGBgIG9yIGBgNTAwYGAgYXMgdGhlIGBgUmVzcG9uc2VDb2RlYGAgZm9yIGFsbCA0eHggb3IgNXh4IGVycm9ycy5cbiAqICAgKyAgWW91IG1pZ2h0IHdhbnQgdG8gcmV0dXJuIGEgYGAyMDBgYCBzdGF0dXMgY29kZSAoT0spIGFuZCBzdGF0aWMgd2Vic2l0ZSBzbyB5b3VyIGN1c3RvbWVycyBkb24ndCBrbm93IHRoYXQgeW91ciB3ZWJzaXRlIGlzIGRvd24uXG4gKiAgIFxuICogIElmIHlvdSBzcGVjaWZ5IGEgdmFsdWUgZm9yIGBgUmVzcG9uc2VDb2RlYGAsIHlvdSBtdXN0IGFsc28gc3BlY2lmeSBhIHZhbHVlIGZvciBgYFJlc3BvbnNlUGFnZVBhdGhgYC5cbiAqL1xuUmVzcG9uc2VDb2RlPzogbnVtYmVyXG4vKipcbiAqIFRoZSBwYXRoIHRvIHRoZSBjdXN0b20gZXJyb3IgcGFnZSB0aGF0IHlvdSB3YW50IENsb3VkRnJvbnQgdG8gcmV0dXJuIHRvIGEgdmlld2VyIHdoZW4geW91ciBvcmlnaW4gcmV0dXJucyB0aGUgSFRUUCBzdGF0dXMgY29kZSBzcGVjaWZpZWQgYnkgYGBFcnJvckNvZGVgYCwgZm9yIGV4YW1wbGUsIGBgLzR4eC1lcnJvcnMvNDAzLWZvcmJpZGRlbi5odG1sYGAuIElmIHlvdSB3YW50IHRvIHN0b3JlIHlvdXIgb2JqZWN0cyBhbmQgeW91ciBjdXN0b20gZXJyb3IgcGFnZXMgaW4gZGlmZmVyZW50IGxvY2F0aW9ucywgeW91ciBkaXN0cmlidXRpb24gbXVzdCBpbmNsdWRlIGEgY2FjaGUgYmVoYXZpb3IgZm9yIHdoaWNoIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTpcbiAqICAgKyAgVGhlIHZhbHVlIG9mIGBgUGF0aFBhdHRlcm5gYCBtYXRjaGVzIHRoZSBwYXRoIHRvIHlvdXIgY3VzdG9tIGVycm9yIG1lc3NhZ2VzLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugc2F2ZWQgY3VzdG9tIGVycm9yIHBhZ2VzIGZvciA0eHggZXJyb3JzIGluIGFuIEFtYXpvbiBTMyBidWNrZXQgaW4gYSBkaXJlY3RvcnkgbmFtZWQgYGAvNHh4LWVycm9yc2BgLiBZb3VyIGRpc3RyaWJ1dGlvbiBtdXN0IGluY2x1ZGUgYSBjYWNoZSBiZWhhdmlvciBmb3Igd2hpY2ggdGhlIHBhdGggcGF0dGVybiByb3V0ZXMgcmVxdWVzdHMgZm9yIHlvdXIgY3VzdG9tIGVycm9yIHBhZ2VzIHRvIHRoYXQgbG9jYXRpb24sIGZvciBleGFtcGxlLCBgYC80eHgtZXJyb3JzLypgYC5cbiAqICAgKyAgVGhlIHZhbHVlIG9mIGBgVGFyZ2V0T3JpZ2luSWRgYCBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBgYElEYGAgZWxlbWVudCBmb3IgdGhlIG9yaWdpbiB0aGF0IGNvbnRhaW5zIHlvdXIgY3VzdG9tIGVycm9yIHBhZ2VzLlxuICogICBcbiAqICBJZiB5b3Ugc3BlY2lmeSBhIHZhbHVlIGZvciBgYFJlc3BvbnNlUGFnZVBhdGhgYCwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IGEgdmFsdWUgZm9yIGBgUmVzcG9uc2VDb2RlYGAuXG4gKiAgV2UgcmVjb21tZW5kIHRoYXQgeW91IHN0b3JlIGN1c3RvbSBlcnJvciBwYWdlcyBpbiBhbiBBbWF6b24gUzMgYnVja2V0LiBJZiB5b3Ugc3RvcmUgY3VzdG9tIGVycm9yIHBhZ2VzIG9uIGFuIEhUVFAgc2VydmVyIGFuZCB0aGUgc2VydmVyIHN0YXJ0cyB0byByZXR1cm4gNXh4IGVycm9ycywgQ2xvdWRGcm9udCBjYW4ndCBnZXQgdGhlIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gcmV0dXJuIHRvIHZpZXdlcnMgYmVjYXVzZSB0aGUgb3JpZ2luIHNlcnZlciBpcyB1bmF2YWlsYWJsZS5cbiAqL1xuUmVzcG9uc2VQYWdlUGF0aD86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgdXNlci1kZWZpbmVkIEhUVFAgc2VydmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvcmlnaW4gZm9yIGNvbnRlbnQgdGhhdCBDRiBkaXN0cmlidXRlcy5cbiAqICAgVGhpcyBwcm9wZXJ0eSBpcyBsZWdhY3kuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgW09yaWdpbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtY2xvdWRmcm9udC1kaXN0cmlidXRpb24tb3JpZ2luLmh0bWwpIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVnYWN5Q3VzdG9tT3JpZ2luIHtcbi8qKlxuICogVGhlIGRvbWFpbiBuYW1lIGFzc2lnbmVkIHRvIHlvdXIgQ0YgZGlzdHJpYnV0aW9uLlxuICovXG5ETlNOYW1lOiBzdHJpbmdcbi8qKlxuICogVGhlIEhUVFAgcG9ydCB0aGF0IENGIHVzZXMgdG8gY29ubmVjdCB0byB0aGUgb3JpZ2luLiBTcGVjaWZ5IHRoZSBIVFRQIHBvcnQgdGhhdCB0aGUgb3JpZ2luIGxpc3RlbnMgb24uXG4gKi9cbkhUVFBQb3J0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBIVFRQUyBwb3J0IHRoYXQgQ0YgdXNlcyB0byBjb25uZWN0IHRvIHRoZSBvcmlnaW4uIFNwZWNpZnkgdGhlIEhUVFBTIHBvcnQgdGhhdCB0aGUgb3JpZ2luIGxpc3RlbnMgb24uXG4gKi9cbkhUVFBTUG9ydD86IG51bWJlclxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHByb3RvY29sIChIVFRQIG9yIEhUVFBTKSB0aGF0IENGIHVzZXMgdG8gY29ubmVjdCB0byB0aGUgb3JpZ2luLlxuICovXG5PcmlnaW5Qcm90b2NvbFBvbGljeTogc3RyaW5nXG4vKipcbiAqIFRoZSBtaW5pbXVtIFNTTC9UTFMgcHJvdG9jb2wgdmVyc2lvbiB0aGF0IENGIHVzZXMgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggeW91ciBvcmlnaW4gc2VydmVyIG92ZXIgSFRUUHMuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWluaW11bSBPcmlnaW4gU1NMIFByb3RvY29sXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI0Rvd25sb2FkRGlzdFZhbHVlc09yaWdpblNTTFByb3RvY29scykgaW4gdGhlICpEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5PcmlnaW5TU0xQcm90b2NvbHM6IHN0cmluZ1tdXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBkZWZhdWx0IGNhY2hlIGJlaGF2aW9yIGlmIHlvdSBkb24ndCBzcGVjaWZ5IGEgYGBDYWNoZUJlaGF2aW9yYGAgZWxlbWVudCBvciBpZiBmaWxlcyBkb24ndCBtYXRjaCBhbnkgb2YgdGhlIHZhbHVlcyBvZiBgYFBhdGhQYXR0ZXJuYGAgaW4gYGBDYWNoZUJlaGF2aW9yYGAgZWxlbWVudHMuIFlvdSBtdXN0IGNyZWF0ZSBleGFjdGx5IG9uZSBkZWZhdWx0IGNhY2hlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRDYWNoZUJlaGF2aW9yIHtcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250cm9scyB3aGljaCBIVFRQIG1ldGhvZHMgQ2xvdWRGcm9udCBwcm9jZXNzZXMgYW5kIGZvcndhcmRzIHRvIHlvdXIgQW1hem9uIFMzIGJ1Y2tldCBvciB5b3VyIGN1c3RvbSBvcmlnaW4uIFRoZXJlIGFyZSB0aHJlZSBjaG9pY2VzOlxuICogICArICBDbG91ZEZyb250IGZvcndhcmRzIG9ubHkgYGBHRVRgYCBhbmQgYGBIRUFEYGAgcmVxdWVzdHMuXG4gKiAgICsgIENsb3VkRnJvbnQgZm9yd2FyZHMgb25seSBgYEdFVGBgLCBgYEhFQURgYCwgYW5kIGBgT1BUSU9OU2BgIHJlcXVlc3RzLlxuICogICArICBDbG91ZEZyb250IGZvcndhcmRzIGBgR0VULCBIRUFELCBPUFRJT05TLCBQVVQsIFBBVENILCBQT1NUYGAsIGFuZCBgYERFTEVURWBgIHJlcXVlc3RzLlxuICogICBcbiAqICBJZiB5b3UgcGljayB0aGUgdGhpcmQgY2hvaWNlLCB5b3UgbWF5IG5lZWQgdG8gcmVzdHJpY3QgYWNjZXNzIHRvIHlvdXIgQW1hem9uIFMzIGJ1Y2tldCBvciB0byB5b3VyIGN1c3RvbSBvcmlnaW4gc28gdXNlcnMgY2FuJ3QgcGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgeW91IGRvbid0IHdhbnQgdGhlbSB0by4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBub3Qgd2FudCB1c2VycyB0byBoYXZlIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBvYmplY3RzIGZyb20geW91ciBvcmlnaW4uXG4gKi9cbkFsbG93ZWRNZXRob2RzPzogc3RyaW5nW11cbi8qKlxuICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYWNoZSBwb2xpY3kgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtY2FjaGUtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgYGBEZWZhdWx0Q2FjaGVCZWhhdmlvcmBgIG11c3QgaW5jbHVkZSBlaXRoZXIgYSBgYENhY2hlUG9saWN5SWRgYCBvciBgYEZvcndhcmRlZFZhbHVlc2BgLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgYGBDYWNoZVBvbGljeUlkYGAuXG4gKi9cbkNhY2hlUG9saWN5SWQ/OiBzdHJpbmdcbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250cm9scyB3aGV0aGVyIENsb3VkRnJvbnQgY2FjaGVzIHRoZSByZXNwb25zZSB0byByZXF1ZXN0cyB1c2luZyB0aGUgc3BlY2lmaWVkIEhUVFAgbWV0aG9kcy4gVGhlcmUgYXJlIHR3byBjaG9pY2VzOlxuICogICArICBDbG91ZEZyb250IGNhY2hlcyByZXNwb25zZXMgdG8gYGBHRVRgYCBhbmQgYGBIRUFEYGAgcmVxdWVzdHMuXG4gKiAgICsgIENsb3VkRnJvbnQgY2FjaGVzIHJlc3BvbnNlcyB0byBgYEdFVGBgLCBgYEhFQURgYCwgYW5kIGBgT1BUSU9OU2BgIHJlcXVlc3RzLlxuICogICBcbiAqICBJZiB5b3UgcGljayB0aGUgc2Vjb25kIGNob2ljZSBmb3IgeW91ciBBbWF6b24gUzMgT3JpZ2luLCB5b3UgbWF5IG5lZWQgdG8gZm9yd2FyZCBBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCwgQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1IZWFkZXJzLCBhbmQgT3JpZ2luIGhlYWRlcnMgZm9yIHRoZSByZXNwb25zZXMgdG8gYmUgY2FjaGVkIGNvcnJlY3RseS5cbiAqL1xuQ2FjaGVkTWV0aG9kcz86IHN0cmluZ1tdXG4vKipcbiAqIFdoZXRoZXIgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBhdXRvbWF0aWNhbGx5IGNvbXByZXNzIGNlcnRhaW4gZmlsZXMgZm9yIHRoaXMgY2FjaGUgYmVoYXZpb3IuIElmIHNvLCBzcGVjaWZ5IGBgdHJ1ZWBgOyBpZiBub3QsIHNwZWNpZnkgYGBmYWxzZWBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aW5nIENvbXByZXNzZWQgRmlsZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9TZXJ2aW5nQ29tcHJlc3NlZEZpbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ29tcHJlc3M/OiBib29sZWFuXG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB0aGUgYGBEZWZhdWx0VFRMYGAgZmllbGQgaW4gYSBjYWNoZSBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIGRlZmF1bHQgYW1vdW50IG9mIHRpbWUgdGhhdCB5b3Ugd2FudCBvYmplY3RzIHRvIHN0YXkgaW4gQ2xvdWRGcm9udCBjYWNoZXMgYmVmb3JlIENsb3VkRnJvbnQgZm9yd2FyZHMgYW5vdGhlciByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIHZhbHVlIHRoYXQgeW91IHNwZWNpZnkgYXBwbGllcyBvbmx5IHdoZW4geW91ciBvcmlnaW4gZG9lcyBub3QgYWRkIEhUVFAgaGVhZGVycyBzdWNoIGFzIGBgQ2FjaGUtQ29udHJvbCBtYXgtYWdlYGAsIGBgQ2FjaGUtQ29udHJvbCBzLW1heGFnZWBgLCBhbmQgYGBFeHBpcmVzYGAgdG8gb2JqZWN0cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWFuYWdpbmcgSG93IExvbmcgQ29udGVudCBTdGF5cyBpbiBhbiBFZGdlIENhY2hlIChFeHBpcmF0aW9uKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0V4cGlyYXRpb24uaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5EZWZhdWx0VFRMPzogbnVtYmVyXG4vKipcbiAqIFRoZSB2YWx1ZSBvZiBgYElEYGAgZm9yIHRoZSBmaWVsZC1sZXZlbCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHVzZSBmb3IgZW5jcnlwdGluZyBzcGVjaWZpYyBmaWVsZHMgb2YgZGF0YSBmb3IgdGhlIGRlZmF1bHQgY2FjaGUgYmVoYXZpb3IuXG4gKi9cbkZpZWxkTGV2ZWxFbmNyeXB0aW9uSWQ/OiBzdHJpbmdcbkZvcndhcmRlZFZhbHVlcz86IEZvcndhcmRlZFZhbHVlczFcbi8qKlxuICogQSBsaXN0IG9mIENsb3VkRnJvbnQgZnVuY3Rpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhY2hlIGJlaGF2aW9yLiBZb3VyIGZ1bmN0aW9ucyBtdXN0IGJlIHB1Ymxpc2hlZCB0byB0aGUgYGBMSVZFYGAgc3RhZ2UgdG8gYXNzb2NpYXRlIHRoZW0gd2l0aCBhIGNhY2hlIGJlaGF2aW9yLlxuICovXG5GdW5jdGlvbkFzc29jaWF0aW9ucz86IEZ1bmN0aW9uQXNzb2NpYXRpb25bXVxuR3JwY0NvbmZpZz86IEdycGNDb25maWcxXG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgemVybyBvciBtb3JlIExhbWJkYUBFZGdlIGZ1bmN0aW9uIGFzc29jaWF0aW9ucyBmb3IgYSBjYWNoZSBiZWhhdmlvci5cbiAqL1xuTGFtYmRhRnVuY3Rpb25Bc3NvY2lhdGlvbnM/OiBMYW1iZGFGdW5jdGlvbkFzc29jaWF0aW9uW11cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHRoZSBgYE1heFRUTGBgIGZpZWxkIGluIGEgY2FjaGUgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIG9yIFtVc2luZyB0aGUgbWFuYWdlZCBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtY2FjaGUtcG9saWNpZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgeW91IHdhbnQgb2JqZWN0cyB0byBzdGF5IGluIENsb3VkRnJvbnQgY2FjaGVzIGJlZm9yZSBDbG91ZEZyb250IGZvcndhcmRzIGFub3RoZXIgcmVxdWVzdCB0byB5b3VyIG9yaWdpbiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgb2JqZWN0IGhhcyBiZWVuIHVwZGF0ZWQuIFRoZSB2YWx1ZSB0aGF0IHlvdSBzcGVjaWZ5IGFwcGxpZXMgb25seSB3aGVuIHlvdXIgb3JpZ2luIGFkZHMgSFRUUCBoZWFkZXJzIHN1Y2ggYXMgYGBDYWNoZS1Db250cm9sIG1heC1hZ2VgYCwgYGBDYWNoZS1Db250cm9sIHMtbWF4YWdlYGAsIGFuZCBgYEV4cGlyZXNgYCB0byBvYmplY3RzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtNYW5hZ2luZyBIb3cgTG9uZyBDb250ZW50IFN0YXlzIGluIGFuIEVkZ2UgQ2FjaGUgKEV4cGlyYXRpb24pXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvRXhwaXJhdGlvbi5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk1heFRUTD86IG51bWJlclxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdGhlIGBgTWluVFRMYGAgZmllbGQgaW4gYSBjYWNoZSBwb2xpY3kgaW5zdGVhZCBvZiB0aGlzIGZpZWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1jYWNoZS1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCB5b3Ugd2FudCBvYmplY3RzIHRvIHN0YXkgaW4gQ2xvdWRGcm9udCBjYWNoZXMgYmVmb3JlIENsb3VkRnJvbnQgZm9yd2FyZHMgYW5vdGhlciByZXF1ZXN0IHRvIHlvdXIgb3JpZ2luIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gdXBkYXRlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbTWFuYWdpbmcgSG93IExvbmcgQ29udGVudCBTdGF5cyBpbiBhbiBFZGdlIENhY2hlIChFeHBpcmF0aW9uKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0V4cGlyYXRpb24uaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBtdXN0IHNwZWNpZnkgYGAwYGAgZm9yIGBgTWluVFRMYGAgaWYgeW91IGNvbmZpZ3VyZSBDbG91ZEZyb250IHRvIGZvcndhcmQgYWxsIGhlYWRlcnMgdG8geW91ciBvcmlnaW4gKHVuZGVyIGBgSGVhZGVyc2BgLCBpZiB5b3Ugc3BlY2lmeSBgYDFgYCBmb3IgYGBRdWFudGl0eWBgIGFuZCBgYCpgYCBmb3IgYGBOYW1lYGApLlxuICovXG5NaW5UVEw/OiBudW1iZXJcbi8qKlxuICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgZGVmYXVsdCBjYWNoZSBiZWhhdmlvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgb3JpZ2luIHJlcXVlc3QgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbCNvcmlnaW4tcmVxdWVzdC1jcmVhdGUtb3JpZ2luLXJlcXVlc3QtcG9saWN5KSBvciBbVXNpbmcgdGhlIG1hbmFnZWQgb3JpZ2luIHJlcXVlc3QgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuT3JpZ2luUmVxdWVzdFBvbGljeUlkPzogc3RyaW5nXG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgcmVhbC10aW1lIGxvZyBjb25maWd1cmF0aW9uIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhpcyBjYWNoZSBiZWhhdmlvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUmVhbC10aW1lIGxvZ3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9yZWFsLXRpbWUtbG9ncy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cblJlYWx0aW1lTG9nQ29uZmlnQXJuPzogc3RyaW5nXG4vKipcbiAqIFRoZSBpZGVudGlmaWVyIGZvciBhIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICovXG5SZXNwb25zZUhlYWRlcnNQb2xpY3lJZD86IHN0cmluZ1xuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB5b3Ugd2FudCB0byBkaXN0cmlidXRlIG1lZGlhIGZpbGVzIGluIHRoZSBNaWNyb3NvZnQgU21vb3RoIFN0cmVhbWluZyBmb3JtYXQgdXNpbmcgdGhlIG9yaWdpbiB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhY2hlIGJlaGF2aW9yLiBJZiBzbywgc3BlY2lmeSBgYHRydWVgYDsgaWYgbm90LCBzcGVjaWZ5IGBgZmFsc2VgYC4gSWYgeW91IHNwZWNpZnkgYGB0cnVlYGAgZm9yIGBgU21vb3RoU3RyZWFtaW5nYGAsIHlvdSBjYW4gc3RpbGwgZGlzdHJpYnV0ZSBvdGhlciBjb250ZW50IHVzaW5nIHRoaXMgY2FjaGUgYmVoYXZpb3IgaWYgdGhlIGNvbnRlbnQgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgYGBQYXRoUGF0dGVybmBgLlxuICovXG5TbW9vdGhTdHJlYW1pbmc/OiBib29sZWFuXG4vKipcbiAqIFRoZSB2YWx1ZSBvZiBgYElEYGAgZm9yIHRoZSBvcmlnaW4gdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHJvdXRlIHJlcXVlc3RzIHRvIHdoZW4gdGhleSB1c2UgdGhlIGRlZmF1bHQgY2FjaGUgYmVoYXZpb3IuXG4gKi9cblRhcmdldE9yaWdpbklkOiBzdHJpbmdcbi8qKlxuICogQSBsaXN0IG9mIGtleSBncm91cHMgdGhhdCBDbG91ZEZyb250IGNhbiB1c2UgdG8gdmFsaWRhdGUgc2lnbmVkIFVSTHMgb3Igc2lnbmVkIGNvb2tpZXMuXG4gKiAgV2hlbiBhIGNhY2hlIGJlaGF2aW9yIGNvbnRhaW5zIHRydXN0ZWQga2V5IGdyb3VwcywgQ2xvdWRGcm9udCByZXF1aXJlcyBzaWduZWQgVVJMcyBvciBzaWduZWQgY29va2llcyBmb3IgYWxsIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhlIGNhY2hlIGJlaGF2aW9yLiBUaGUgVVJMcyBvciBjb29raWVzIG11c3QgYmUgc2lnbmVkIHdpdGggYSBwcml2YXRlIGtleSB3aG9zZSBjb3JyZXNwb25kaW5nIHB1YmxpYyBrZXkgaXMgaW4gdGhlIGtleSBncm91cC4gVGhlIHNpZ25lZCBVUkwgb3IgY29va2llIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHB1YmxpYyBrZXkgQ2xvdWRGcm9udCBzaG91bGQgdXNlIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aW5nIHByaXZhdGUgY29udGVudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL1ByaXZhdGVDb250ZW50Lmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuVHJ1c3RlZEtleUdyb3Vwcz86IHN0cmluZ1tdXG4vKipcbiAqIFdlIHJlY29tbWVuZCB1c2luZyBgYFRydXN0ZWRLZXlHcm91cHNgYCBpbnN0ZWFkIG9mIGBgVHJ1c3RlZFNpZ25lcnNgYC5cbiAqICAgQSBsaXN0IG9mIEFXUy1hY2NvdW50IElEcyB3aG9zZSBwdWJsaWMga2V5cyBDbG91ZEZyb250IGNhbiB1c2UgdG8gdmFsaWRhdGUgc2lnbmVkIFVSTHMgb3Igc2lnbmVkIGNvb2tpZXMuXG4gKiAgV2hlbiBhIGNhY2hlIGJlaGF2aW9yIGNvbnRhaW5zIHRydXN0ZWQgc2lnbmVycywgQ2xvdWRGcm9udCByZXF1aXJlcyBzaWduZWQgVVJMcyBvciBzaWduZWQgY29va2llcyBmb3IgYWxsIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhlIGNhY2hlIGJlaGF2aW9yLiBUaGUgVVJMcyBvciBjb29raWVzIG11c3QgYmUgc2lnbmVkIHdpdGggdGhlIHByaXZhdGUga2V5IG9mIGEgQ2xvdWRGcm9udCBrZXkgcGFpciBpbiBhIHRydXN0ZWQgc2lnbmVyJ3MgQVdTLWFjY291bnQuIFRoZSBzaWduZWQgVVJMIG9yIGNvb2tpZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBwdWJsaWMga2V5IENsb3VkRnJvbnQgc2hvdWxkIHVzZSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmluZyBwcml2YXRlIGNvbnRlbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9Qcml2YXRlQ29udGVudC5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cblRydXN0ZWRTaWduZXJzPzogc3RyaW5nW11cbi8qKlxuICogVGhlIHByb3RvY29sIHRoYXQgdmlld2VycyBjYW4gdXNlIHRvIGFjY2VzcyB0aGUgZmlsZXMgaW4gdGhlIG9yaWdpbiBzcGVjaWZpZWQgYnkgYGBUYXJnZXRPcmlnaW5JZGBgIHdoZW4gYSByZXF1ZXN0IG1hdGNoZXMgdGhlIHBhdGggcGF0dGVybiBpbiBgYFBhdGhQYXR0ZXJuYGAuIFlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4gKiAgICsgICBgYGFsbG93LWFsbGBgOiBWaWV3ZXJzIGNhbiB1c2UgSFRUUCBvciBIVFRQUy5cbiAqICAgKyAgIGBgcmVkaXJlY3QtdG8taHR0cHNgYDogSWYgYSB2aWV3ZXIgc3VibWl0cyBhbiBIVFRQIHJlcXVlc3QsIENsb3VkRnJvbnQgcmV0dXJucyBhbiBIVFRQIHN0YXR1cyBjb2RlIG9mIDMwMSAoTW92ZWQgUGVybWFuZW50bHkpIHRvIHRoZSB2aWV3ZXIgYWxvbmcgd2l0aCB0aGUgSFRUUFMgVVJMLiBUaGUgdmlld2VyIHRoZW4gcmVzdWJtaXRzIHRoZSByZXF1ZXN0IHVzaW5nIHRoZSBuZXcgVVJMLlxuICogICArICAgYGBodHRwcy1vbmx5YGA6IElmIGEgdmlld2VyIHNlbmRzIGFuIEhUVFAgcmVxdWVzdCwgQ2xvdWRGcm9udCByZXR1cm5zIGFuIEhUVFAgc3RhdHVzIGNvZGUgb2YgNDAzIChGb3JiaWRkZW4pLlxuICogICBcbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCByZXF1aXJpbmcgdGhlIEhUVFBTIHByb3RvY29sLCBzZWUgW1JlcXVpcmluZyBIVFRQUyBCZXR3ZWVuIFZpZXdlcnMgYW5kIENsb3VkRnJvbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1odHRwcy12aWV3ZXJzLXRvLWNsb3VkZnJvbnQuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBUaGUgb25seSB3YXkgdG8gZ3VhcmFudGVlIHRoYXQgdmlld2VycyByZXRyaWV2ZSBhbiBvYmplY3QgdGhhdCB3YXMgZmV0Y2hlZCBmcm9tIHRoZSBvcmlnaW4gdXNpbmcgSFRUUFMgaXMgbmV2ZXIgdG8gdXNlIGFueSBvdGhlciBwcm90b2NvbCB0byBmZXRjaCB0aGUgb2JqZWN0LiBJZiB5b3UgaGF2ZSByZWNlbnRseSBjaGFuZ2VkIGZyb20gSFRUUCB0byBIVFRQUywgd2UgcmVjb21tZW5kIHRoYXQgeW91IGNsZWFyIHlvdXIgb2JqZWN0cycgY2FjaGUgYmVjYXVzZSBjYWNoZWQgb2JqZWN0cyBhcmUgcHJvdG9jb2wgYWdub3N0aWMuIFRoYXQgbWVhbnMgdGhhdCBhbiBlZGdlIGxvY2F0aW9uIHdpbGwgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjYWNoZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmVxdWVzdCBwcm90b2NvbCBtYXRjaGVzIHRoZSBwcm90b2NvbCB1c2VkIHByZXZpb3VzbHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW01hbmFnaW5nIENhY2hlIEV4cGlyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9FeHBpcmF0aW9uLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuVmlld2VyUHJvdG9jb2xQb2xpY3k6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbV29ya2luZyB3aXRoIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvd29ya2luZy13aXRoLXBvbGljaWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIHZhbHVlcyBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYSBjYWNoZSBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIGNhY2hlIHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sI2NhY2hlLWtleS1jcmVhdGUtY2FjaGUtcG9saWN5KSBvciBbVXNpbmcgdGhlIG1hbmFnZWQgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLWNhY2hlLXBvbGljaWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBzZW5kIHZhbHVlcyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgb3IgW1VzaW5nIHRoZSBtYW5hZ2VkIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY2llcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgQSBgYERlZmF1bHRDYWNoZUJlaGF2aW9yYGAgbXVzdCBpbmNsdWRlIGVpdGhlciBhIGBgQ2FjaGVQb2xpY3lJZGBgIG9yIGBgRm9yd2FyZGVkVmFsdWVzYGAuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBgYENhY2hlUG9saWN5SWRgYC5cbiAqICBBIGNvbXBsZXggdHlwZSB0aGF0IHNwZWNpZmllcyBob3cgQ2xvdWRGcm9udCBoYW5kbGVzIHF1ZXJ5IHN0cmluZ3MsIGNvb2tpZXMsIGFuZCBIVFRQIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZGVkVmFsdWVzMSB7XG5Db29raWVzPzogQ29va2llc1xuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIGhlYWRlcnMgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHlvdSB3YW50IHRvIHNlbmQgaGVhZGVycyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEEgY29tcGxleCB0eXBlIHRoYXQgc3BlY2lmaWVzIHRoZSBgYEhlYWRlcnNgYCwgaWYgYW55LCB0aGF0IHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZm9yd2FyZCB0byB0aGUgb3JpZ2luIGZvciB0aGlzIGNhY2hlIGJlaGF2aW9yICh3aGl0ZWxpc3RlZCBoZWFkZXJzKS4gRm9yIHRoZSBoZWFkZXJzIHRoYXQgeW91IHNwZWNpZnksIENsb3VkRnJvbnQgYWxzbyBjYWNoZXMgc2VwYXJhdGUgdmVyc2lvbnMgb2YgYSBzcGVjaWZpZWQgb2JqZWN0IHRoYXQgaXMgYmFzZWQgb24gdGhlIGhlYWRlciB2YWx1ZXMgaW4gdmlld2VyIHJlcXVlc3RzLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NhY2hpbmcgQ29udGVudCBCYXNlZCBvbiBSZXF1ZXN0IEhlYWRlcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9oZWFkZXItY2FjaGluZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbkhlYWRlcnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSBjYWNoZSBwb2xpY3kgb3IgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGluc3RlYWQgb2YgdGhpcyBmaWVsZC5cbiAqICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIHF1ZXJ5IHN0cmluZ3MgaW4gdGhlIGNhY2hlIGtleSwgdXNlIGEgY2FjaGUgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBjYWNoZSBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbCNjYWNoZS1rZXktY3JlYXRlLWNhY2hlLXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHlvdSB3YW50IHRvIHNlbmQgcXVlcnkgc3RyaW5ncyB0byB0aGUgb3JpZ2luIGJ1dCBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0aW5nIG9yaWdpbiByZXF1ZXN0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWwjb3JpZ2luLXJlcXVlc3QtY3JlYXRlLW9yaWdpbi1yZXF1ZXN0LXBvbGljeSkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEluZGljYXRlcyB3aGV0aGVyIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZm9yd2FyZCBxdWVyeSBzdHJpbmdzIHRvIHRoZSBvcmlnaW4gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWNoZSBiZWhhdmlvciBhbmQgY2FjaGUgYmFzZWQgb24gdGhlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzLiBDbG91ZEZyb250IGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIGBgUXVlcnlTdHJpbmdgYCBhbmQgb24gdGhlIHZhbHVlcyB0aGF0IHlvdSBzcGVjaWZ5IGZvciBgYFF1ZXJ5U3RyaW5nQ2FjaGVLZXlzYGAsIGlmIGFueTpcbiAqICBJZiB5b3Ugc3BlY2lmeSB0cnVlIGZvciBgYFF1ZXJ5U3RyaW5nYGAgYW5kIHlvdSBkb24ndCBzcGVjaWZ5IGFueSB2YWx1ZXMgZm9yIGBgUXVlcnlTdHJpbmdDYWNoZUtleXNgYCwgQ2xvdWRGcm9udCBmb3J3YXJkcyBhbGwgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgdG8gdGhlIG9yaWdpbiBhbmQgY2FjaGVzIGJhc2VkIG9uIGFsbCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycy4gRGVwZW5kaW5nIG9uIGhvdyBtYW55IHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGFuZCB2YWx1ZXMgeW91IGhhdmUsIHRoaXMgY2FuIGFkdmVyc2VseSBhZmZlY3QgcGVyZm9ybWFuY2UgYmVjYXVzZSBDbG91ZEZyb250IG11c3QgZm9yd2FyZCBtb3JlIHJlcXVlc3RzIHRvIHRoZSBvcmlnaW4uXG4gKiAgSWYgeW91IHNwZWNpZnkgdHJ1ZSBmb3IgYGBRdWVyeVN0cmluZ2BgIGFuZCB5b3Ugc3BlY2lmeSBvbmUgb3IgbW9yZSB2YWx1ZXMgZm9yIGBgUXVlcnlTdHJpbmdDYWNoZUtleXNgYCwgQ2xvdWRGcm9udCBmb3J3YXJkcyBhbGwgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgdG8gdGhlIG9yaWdpbiwgYnV0IGl0IG9ubHkgY2FjaGVzIGJhc2VkIG9uIHRoZSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0aGF0IHlvdSBzcGVjaWZ5LlxuICogIElmIHlvdSBzcGVjaWZ5IGZhbHNlIGZvciBgYFF1ZXJ5U3RyaW5nYGAsIENsb3VkRnJvbnQgZG9lc24ndCBmb3J3YXJkIGFueSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0byB0aGUgb3JpZ2luLCBhbmQgZG9lc24ndCBjYWNoZSBiYXNlZCBvbiBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDb25maWd1cmluZyBDbG91ZEZyb250IHRvIENhY2hlIEJhc2VkIG9uIFF1ZXJ5IFN0cmluZyBQYXJhbWV0ZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvUXVlcnlTdHJpbmdQYXJhbWV0ZXJzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuUXVlcnlTdHJpbmc6IGJvb2xlYW5cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgY2FjaGUgcG9saWN5IG9yIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBpbnN0ZWFkIG9mIHRoaXMgZmllbGQuXG4gKiAgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBxdWVyeSBzdHJpbmdzIGluIHRoZSBjYWNoZSBrZXksIHVzZSBhIGNhY2hlIHBvbGljeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3JlYXRpbmcgY2FjaGUgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWwjY2FjaGUta2V5LWNyZWF0ZS1jYWNoZS1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB5b3Ugd2FudCB0byBzZW5kIHF1ZXJ5IHN0cmluZ3MgdG8gdGhlIG9yaWdpbiBidXQgbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FjaGUga2V5LCB1c2UgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDcmVhdGluZyBvcmlnaW4gcmVxdWVzdCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sI29yaWdpbi1yZXF1ZXN0LWNyZWF0ZS1vcmlnaW4tcmVxdWVzdC1wb2xpY3kpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyB0aGF0IHlvdSB3YW50IENsb3VkRnJvbnQgdG8gdXNlIGZvciBjYWNoaW5nIGZvciB0aGlzIGNhY2hlIGJlaGF2aW9yLlxuICovXG5RdWVyeVN0cmluZ0NhY2hlS2V5cz86IHN0cmluZ1tdXG59XG4vKipcbiAqIFRoZSBnUlBDIGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgY2FjaGUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JwY0NvbmZpZzEge1xuLyoqXG4gKiBFbmFibGVzIHlvdXIgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcmVjZWl2ZSBnUlBDIHJlcXVlc3RzIGFuZCB0byBwcm94eSB0aGVtIGRpcmVjdGx5IHRvIHlvdXIgb3JpZ2lucy5cbiAqL1xuRW5hYmxlZDogYm9vbGVhblxufVxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgYWNjZXNzIGxvZ3MgYXJlIHdyaXR0ZW4gZm9yIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbG9nZ2luZywgc2VlIFtBY2Nlc3MgTG9nc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0FjY2Vzc0xvZ3MuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dpbmcge1xuLyoqXG4gKiBUaGUgQW1hem9uIFMzIGJ1Y2tldCB0byBzdG9yZSB0aGUgYWNjZXNzIGxvZ3MgaW4sIGZvciBleGFtcGxlLCBgYGFtem4tczMtZGVtby1idWNrZXQuczMuYW1hem9uYXdzLmNvbWBgLlxuICovXG5CdWNrZXQ/OiBzdHJpbmdcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgQ2xvdWRGcm9udCB0byBpbmNsdWRlIGNvb2tpZXMgaW4gYWNjZXNzIGxvZ3MsIHNwZWNpZnkgYGB0cnVlYGAgZm9yIGBgSW5jbHVkZUNvb2tpZXNgYC4gSWYgeW91IGNob29zZSB0byBpbmNsdWRlIGNvb2tpZXMgaW4gbG9ncywgQ2xvdWRGcm9udCBsb2dzIGFsbCBjb29raWVzIHJlZ2FyZGxlc3Mgb2YgaG93IHlvdSBjb25maWd1cmUgdGhlIGNhY2hlIGJlaGF2aW9ycyBmb3IgdGhpcyBkaXN0cmlidXRpb24uIElmIHlvdSBkb24ndCB3YW50IHRvIGluY2x1ZGUgY29va2llcyB3aGVuIHlvdSBjcmVhdGUgYSBkaXN0cmlidXRpb24gb3IgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBpbmNsdWRlIGNvb2tpZXMgZm9yIGFuIGV4aXN0aW5nIGRpc3RyaWJ1dGlvbiwgc3BlY2lmeSBgYGZhbHNlYGAgZm9yIGBgSW5jbHVkZUNvb2tpZXNgYC5cbiAqL1xuSW5jbHVkZUNvb2tpZXM/OiBib29sZWFuXG4vKipcbiAqIEFuIG9wdGlvbmFsIHN0cmluZyB0aGF0IHlvdSB3YW50IENsb3VkRnJvbnQgdG8gcHJlZml4IHRvIHRoZSBhY2Nlc3MgbG9nIGBgZmlsZW5hbWVzYGAgZm9yIHRoaXMgZGlzdHJpYnV0aW9uLCBmb3IgZXhhbXBsZSwgYGBteXByZWZpeC9gYC4gSWYgeW91IHdhbnQgdG8gZW5hYmxlIGxvZ2dpbmcsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBzcGVjaWZ5IGEgcHJlZml4LCB5b3Ugc3RpbGwgbXVzdCBpbmNsdWRlIGFuIGVtcHR5IGBgUHJlZml4YGAgZWxlbWVudCBpbiB0aGUgYGBMb2dnaW5nYGAgZWxlbWVudC5cbiAqL1xuUHJlZml4Pzogc3RyaW5nXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgb3JpZ2luIGdyb3VwcyBmb3IgdGhpcyBkaXN0cmlidXRpb24uXG4gKiAgU3BlY2lmeSBhIHZhbHVlIGZvciBlaXRoZXIgdGhlIGBgT3JpZ2luc2BgIG9yIGBgT3JpZ2luR3JvdXBzYGAgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luR3JvdXBzIHtcbi8qKlxuICogVGhlIGl0ZW1zIChvcmlnaW4gZ3JvdXBzKSBpbiBhIGRpc3RyaWJ1dGlvbi5cbiAqL1xuSXRlbXM/OiBPcmlnaW5Hcm91cFtdXG4vKipcbiAqIFRoZSBudW1iZXIgb2Ygb3JpZ2luIGdyb3Vwcy5cbiAqL1xuUXVhbnRpdHk6IG51bWJlclxufVxuLyoqXG4gKiBBbiBvcmlnaW4gZ3JvdXAgaW5jbHVkZXMgdHdvIG9yaWdpbnMgKGEgcHJpbWFyeSBvcmlnaW4gYW5kIGEgc2Vjb25kYXJ5IG9yaWdpbiB0byBmYWlsb3ZlciB0bykgYW5kIGEgZmFpbG92ZXIgY3JpdGVyaWEgdGhhdCB5b3Ugc3BlY2lmeS4gWW91IGNyZWF0ZSBhbiBvcmlnaW4gZ3JvdXAgdG8gc3VwcG9ydCBvcmlnaW4gZmFpbG92ZXIgaW4gQ2xvdWRGcm9udC4gV2hlbiB5b3UgY3JlYXRlIG9yIHVwZGF0ZSBhIGRpc3RyaWJ1dGlvbiwgeW91IGNhbiBzcGVjaWZ5IHRoZSBvcmlnaW4gZ3JvdXAgaW5zdGVhZCBvZiBhIHNpbmdsZSBvcmlnaW4sIGFuZCBDbG91ZEZyb250IHdpbGwgZmFpbG92ZXIgZnJvbSB0aGUgcHJpbWFyeSBvcmlnaW4gdG8gdGhlIHNlY29uZGFyeSBvcmlnaW4gdW5kZXIgdGhlIGZhaWxvdmVyIGNvbmRpdGlvbnMgdGhhdCB5b3UndmUgY2hvc2VuLlxuICogIE9wdGlvbmFsbHksIHlvdSBjYW4gY2hvb3NlIHNlbGVjdGlvbiBjcml0ZXJpYSBmb3IgeW91ciBvcmlnaW4gZ3JvdXAgdG8gc3BlY2lmeSBob3cgeW91ciBvcmlnaW5zIGFyZSBzZWxlY3RlZCB3aGVuIHlvdXIgZGlzdHJpYnV0aW9uIHJvdXRlcyB2aWV3ZXIgcmVxdWVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luR3JvdXAge1xuRmFpbG92ZXJDcml0ZXJpYTogT3JpZ2luR3JvdXBGYWlsb3ZlckNyaXRlcmlhXG4vKipcbiAqIFRoZSBvcmlnaW4gZ3JvdXAncyBJRC5cbiAqL1xuSWQ6IHN0cmluZ1xuTWVtYmVyczogT3JpZ2luR3JvdXBNZW1iZXJzXG4vKipcbiAqIFRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgZm9yIHRoZSBvcmlnaW4gZ3JvdXAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NyZWF0ZSBhbiBvcmlnaW4gZ3JvdXBdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9oaWdoX2F2YWlsYWJpbGl0eV9vcmlnaW5fZmFpbG92ZXIuaHRtbCNjb25jZXB0X29yaWdpbl9ncm91cHMuY3JlYXRpbmcpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuU2VsZWN0aW9uQ3JpdGVyaWE/OiAoXCJkZWZhdWx0XCIgfCBcIm1lZGlhLXF1YWxpdHktYmFzZWRcIilcbn1cbi8qKlxuICogQSBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmFpbG92ZXIgY3JpdGVyaWEgZm9yIGFuIG9yaWdpbiBncm91cC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5Hcm91cEZhaWxvdmVyQ3JpdGVyaWEge1xuU3RhdHVzQ29kZXM6IFN0YXR1c0NvZGVzXG59XG4vKipcbiAqIFRoZSBzdGF0dXMgY29kZXMgdGhhdCwgd2hlbiByZXR1cm5lZCBmcm9tIHRoZSBwcmltYXJ5IG9yaWdpbiwgd2lsbCB0cmlnZ2VyIENsb3VkRnJvbnQgdG8gZmFpbG92ZXIgdG8gdGhlIHNlY29uZCBvcmlnaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzQ29kZXMge1xuLyoqXG4gKiBUaGUgaXRlbXMgKHN0YXR1cyBjb2RlcykgZm9yIGFuIG9yaWdpbiBncm91cC5cbiAqL1xuSXRlbXM6IG51bWJlcltdXG4vKipcbiAqIFRoZSBudW1iZXIgb2Ygc3RhdHVzIGNvZGVzLlxuICovXG5RdWFudGl0eTogbnVtYmVyXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbnMgaW4gYW4gb3JpZ2luIGdyb3VwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbkdyb3VwTWVtYmVycyB7XG4vKipcbiAqIEl0ZW1zIChvcmlnaW5zKSBpbiBhbiBvcmlnaW4gZ3JvdXAuXG4gKi9cbkl0ZW1zOiBPcmlnaW5Hcm91cE1lbWJlcltdXG4vKipcbiAqIFRoZSBudW1iZXIgb2Ygb3JpZ2lucyBpbiBhbiBvcmlnaW4gZ3JvdXAuXG4gKi9cblF1YW50aXR5OiBudW1iZXJcbn1cbi8qKlxuICogQW4gb3JpZ2luIGluIGFuIG9yaWdpbiBncm91cC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5Hcm91cE1lbWJlciB7XG4vKipcbiAqIFRoZSBJRCBmb3IgYW4gb3JpZ2luIGluIGFuIG9yaWdpbiBncm91cC5cbiAqL1xuT3JpZ2luSWQ6IHN0cmluZ1xufVxuLyoqXG4gKiBBbiBvcmlnaW4uXG4gKiAgQW4gb3JpZ2luIGlzIHRoZSBsb2NhdGlvbiB3aGVyZSBjb250ZW50IGlzIHN0b3JlZCwgYW5kIGZyb20gd2hpY2ggQ2xvdWRGcm9udCBnZXRzIGNvbnRlbnQgdG8gc2VydmUgdG8gdmlld2Vycy4gVG8gc3BlY2lmeSBhbiBvcmlnaW46XG4gKiAgICsgIFVzZSBgYFMzT3JpZ2luQ29uZmlnYGAgdG8gc3BlY2lmeSBhbiBBbWF6b24gUzMgYnVja2V0IHRoYXQgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBzdGF0aWMgd2Vic2l0ZSBob3N0aW5nLlxuICogICArICBVc2UgYGBDdXN0b21PcmlnaW5Db25maWdgYCB0byBzcGVjaWZ5IGFsbCBvdGhlciBraW5kcyBvZiBvcmlnaW5zLCBpbmNsdWRpbmc6XG4gKiAgICsgIEFuIEFtYXpvbiBTMyBidWNrZXQgdGhhdCBpcyBjb25maWd1cmVkIHdpdGggc3RhdGljIHdlYnNpdGUgaG9zdGluZ1xuICogICArICBBbiBFbGFzdGljIExvYWQgQmFsYW5jaW5nIGxvYWQgYmFsYW5jZXJcbiAqICAgKyAgQW4gRU1QbG9uZyBlbmRwb2ludFxuICogICArICBBbiBFTVNsb25nIGNvbnRhaW5lclxuICogICArICBBbnkgb3RoZXIgSFRUUCBzZXJ2ZXIsIHJ1bm5pbmcgb24gYW4gQW1hem9uIEVDMiBpbnN0YW5jZSBvciBhbnkgb3RoZXIga2luZCBvZiBob3N0XG4gKiAgIFxuICogICBcbiAqICBGb3IgdGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2Ygb3JpZ2lucyB0aGF0IHlvdSBjYW4gc3BlY2lmeSBwZXIgZGlzdHJpYnV0aW9uLCBzZWUgW0dlbmVyYWwgUXVvdGFzIG9uIFdlYiBEaXN0cmlidXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnMpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKiAocXVvdGFzIHdlcmUgZm9ybWVybHkgcmVmZXJyZWQgdG8gYXMgbGltaXRzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW4ge1xuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgQ2xvdWRGcm9udCBhdHRlbXB0cyB0byBjb25uZWN0IHRvIHRoZSBvcmlnaW4uIFRoZSBtaW5pbXVtIG51bWJlciBpcyAxLCB0aGUgbWF4aW11bSBpcyAzLCBhbmQgdGhlIGRlZmF1bHQgKGlmIHlvdSBkb24ndCBzcGVjaWZ5IG90aGVyd2lzZSkgaXMgMy5cbiAqICBGb3IgYSBjdXN0b20gb3JpZ2luIChpbmNsdWRpbmcgYW4gQW1hem9uIFMzIGJ1Y2tldCB0aGF0J3MgY29uZmlndXJlZCB3aXRoIHN0YXRpYyB3ZWJzaXRlIGhvc3RpbmcpLCB0aGlzIHZhbHVlIGFsc28gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBDbG91ZEZyb250IGF0dGVtcHRzIHRvIGdldCBhIHJlc3BvbnNlIGZyb20gdGhlIG9yaWdpbiwgaW4gdGhlIGNhc2Ugb2YgYW4gW09yaWdpbiBSZXNwb25zZSBUaW1lb3V0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI0Rvd25sb2FkRGlzdFZhbHVlc09yaWdpblJlc3BvbnNlVGltZW91dCkuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbT3JpZ2luIENvbm5lY3Rpb24gQXR0ZW1wdHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td2ViLXZhbHVlcy1zcGVjaWZ5Lmh0bWwjb3JpZ2luLWNvbm5lY3Rpb24tYXR0ZW1wdHMpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ29ubmVjdGlvbkF0dGVtcHRzPzogbnVtYmVyXG4vKipcbiAqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IENsb3VkRnJvbnQgd2FpdHMgd2hlbiB0cnlpbmcgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgb3JpZ2luLiBUaGUgbWluaW11bSB0aW1lb3V0IGlzIDEgc2Vjb25kLCB0aGUgbWF4aW11bSBpcyAxMCBzZWNvbmRzLCBhbmQgdGhlIGRlZmF1bHQgKGlmIHlvdSBkb24ndCBzcGVjaWZ5IG90aGVyd2lzZSkgaXMgMTAgc2Vjb25kcy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtPcmlnaW4gQ29ubmVjdGlvbiBUaW1lb3V0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI29yaWdpbi1jb25uZWN0aW9uLXRpbWVvdXQpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXJcbkN1c3RvbU9yaWdpbkNvbmZpZz86IEN1c3RvbU9yaWdpbkNvbmZpZ1xuLyoqXG4gKiBUaGUgZG9tYWluIG5hbWUgZm9yIHRoZSBvcmlnaW4uXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbT3JpZ2luIERvbWFpbiBOYW1lXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdlYi12YWx1ZXMtc3BlY2lmeS5odG1sI0Rvd25sb2FkRGlzdFZhbHVlc0RvbWFpbk5hbWUpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRG9tYWluTmFtZTogc3RyaW5nXG4vKipcbiAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW4uIFRoaXMgdmFsdWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgVXNlIHRoaXMgdmFsdWUgdG8gc3BlY2lmeSB0aGUgYGBUYXJnZXRPcmlnaW5JZGBgIGluIGEgYGBDYWNoZUJlaGF2aW9yYGAgb3IgYGBEZWZhdWx0Q2FjaGVCZWhhdmlvcmBgLlxuICovXG5JZDogc3RyaW5nXG4vKipcbiAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhbiBvcmlnaW4gYWNjZXNzIGNvbnRyb2wgZm9yIHRoaXMgb3JpZ2luLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Jlc3RyaWN0aW5nIGFjY2VzcyB0byBhbiBBbWF6b24gUzMgb3JpZ2luXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvcHJpdmF0ZS1jb250ZW50LXJlc3RyaWN0aW5nLWFjY2Vzcy10by1zMy5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk9yaWdpbkFjY2Vzc0NvbnRyb2xJZD86IHN0cmluZ1xuLyoqXG4gKiBBIGxpc3Qgb2YgSFRUUCBoZWFkZXIgbmFtZXMgYW5kIHZhbHVlcyB0aGF0IENsb3VkRnJvbnQgYWRkcyB0byB0aGUgcmVxdWVzdHMgdGhhdCBpdCBzZW5kcyB0byB0aGUgb3JpZ2luLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FkZGluZyBDdXN0b20gSGVhZGVycyB0byBPcmlnaW4gUmVxdWVzdHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9hZGQtb3JpZ2luLWN1c3RvbS1oZWFkZXJzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuT3JpZ2luQ3VzdG9tSGVhZGVycz86IE9yaWdpbkN1c3RvbUhlYWRlcltdXG4vKipcbiAqIEFuIG9wdGlvbmFsIHBhdGggdGhhdCBDbG91ZEZyb250IGFwcGVuZHMgdG8gdGhlIG9yaWdpbiBkb21haW4gbmFtZSB3aGVuIENsb3VkRnJvbnQgcmVxdWVzdHMgY29udGVudCBmcm9tIHRoZSBvcmlnaW4uXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbT3JpZ2luIFBhdGhdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td2ViLXZhbHVlcy1zcGVjaWZ5Lmh0bWwjRG93bmxvYWREaXN0VmFsdWVzT3JpZ2luUGF0aCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5PcmlnaW5QYXRoPzogc3RyaW5nXG5PcmlnaW5TaGllbGQ/OiBPcmlnaW5TaGllbGRcblMzT3JpZ2luQ29uZmlnPzogUzNPcmlnaW5Db25maWdcblZwY09yaWdpbkNvbmZpZz86IFZwY09yaWdpbkNvbmZpZ1xufVxuLyoqXG4gKiBVc2UgdGhpcyB0eXBlIHRvIHNwZWNpZnkgYW4gb3JpZ2luIHRoYXQgaXMgbm90IGFuIEFtYXpvbiBTMyBidWNrZXQsIHdpdGggb25lIGV4Y2VwdGlvbi4gSWYgdGhlIEFtYXpvbiBTMyBidWNrZXQgaXMgY29uZmlndXJlZCB3aXRoIHN0YXRpYyB3ZWJzaXRlIGhvc3RpbmcsIHVzZSB0aGlzIHR5cGUuIElmIHRoZSBBbWF6b24gUzMgYnVja2V0IGlzIG5vdCBjb25maWd1cmVkIHdpdGggc3RhdGljIHdlYnNpdGUgaG9zdGluZywgdXNlIHRoZSBgYFMzT3JpZ2luQ29uZmlnYGAgdHlwZSBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbU9yaWdpbkNvbmZpZyB7XG4vKipcbiAqIFRoZSBIVFRQIHBvcnQgdGhhdCBDbG91ZEZyb250IHVzZXMgdG8gY29ubmVjdCB0byB0aGUgb3JpZ2luLiBTcGVjaWZ5IHRoZSBIVFRQIHBvcnQgdGhhdCB0aGUgb3JpZ2luIGxpc3RlbnMgb24uXG4gKi9cbkhUVFBQb3J0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBIVFRQUyBwb3J0IHRoYXQgQ2xvdWRGcm9udCB1c2VzIHRvIGNvbm5lY3QgdG8gdGhlIG9yaWdpbi4gU3BlY2lmeSB0aGUgSFRUUFMgcG9ydCB0aGF0IHRoZSBvcmlnaW4gbGlzdGVucyBvbi5cbiAqL1xuSFRUUFNQb3J0PzogbnVtYmVyXG4vKipcbiAqIFNwZWNpZmllcyBob3cgbG9uZywgaW4gc2Vjb25kcywgQ2xvdWRGcm9udCBwZXJzaXN0cyBpdHMgY29ubmVjdGlvbiB0byB0aGUgb3JpZ2luLiBUaGUgbWluaW11bSB0aW1lb3V0IGlzIDEgc2Vjb25kLCB0aGUgbWF4aW11bSBpcyA2MCBzZWNvbmRzLCBhbmQgdGhlIGRlZmF1bHQgKGlmIHlvdSBkb24ndCBzcGVjaWZ5IG90aGVyd2lzZSkgaXMgNSBzZWNvbmRzLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0tlZXAtYWxpdmUgdGltZW91dCAoY3VzdG9tIG9yaWdpbnMgb25seSldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td2ViLXZhbHVlcy1zcGVjaWZ5Lmh0bWwjRG93bmxvYWREaXN0VmFsdWVzT3JpZ2luS2VlcGFsaXZlVGltZW91dCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5PcmlnaW5LZWVwYWxpdmVUaW1lb3V0PzogbnVtYmVyXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgcHJvdG9jb2wgKEhUVFAgb3IgSFRUUFMpIHRoYXQgQ2xvdWRGcm9udCB1c2VzIHRvIGNvbm5lY3QgdG8gdGhlIG9yaWdpbi4gVmFsaWQgdmFsdWVzIGFyZTpcbiAqICAgKyAgIGBgaHR0cC1vbmx5YGAg4oCTIENsb3VkRnJvbnQgYWx3YXlzIHVzZXMgSFRUUCB0byBjb25uZWN0IHRvIHRoZSBvcmlnaW4uXG4gKiAgICsgICBgYG1hdGNoLXZpZXdlcmBgIOKAkyBDbG91ZEZyb250IGNvbm5lY3RzIHRvIHRoZSBvcmlnaW4gdXNpbmcgdGhlIHNhbWUgcHJvdG9jb2wgdGhhdCB0aGUgdmlld2VyIHVzZWQgdG8gY29ubmVjdCB0byBDbG91ZEZyb250LlxuICogICArICAgYGBodHRwcy1vbmx5YGAg4oCTIENsb3VkRnJvbnQgYWx3YXlzIHVzZXMgSFRUUFMgdG8gY29ubmVjdCB0byB0aGUgb3JpZ2luLlxuICovXG5PcmlnaW5Qcm90b2NvbFBvbGljeTogc3RyaW5nXG4vKipcbiAqIFNwZWNpZmllcyBob3cgbG9uZywgaW4gc2Vjb25kcywgQ2xvdWRGcm9udCB3YWl0cyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBvcmlnaW4uIFRoaXMgaXMgYWxzbyBrbm93biBhcyB0aGUgKm9yaWdpbiByZXNwb25zZSB0aW1lb3V0Ki4gVGhlIG1pbmltdW0gdGltZW91dCBpcyAxIHNlY29uZCwgdGhlIG1heGltdW0gaXMgNjAgc2Vjb25kcywgYW5kIHRoZSBkZWZhdWx0IChpZiB5b3UgZG9uJ3Qgc3BlY2lmeSBvdGhlcndpc2UpIGlzIDMwIHNlY29uZHMuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUmVzcG9uc2UgdGltZW91dCAoY3VzdG9tIG9yaWdpbnMgb25seSldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td2ViLXZhbHVlcy1zcGVjaWZ5Lmh0bWwjRG93bmxvYWREaXN0VmFsdWVzT3JpZ2luUmVzcG9uc2VUaW1lb3V0KSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk9yaWdpblJlYWRUaW1lb3V0PzogbnVtYmVyXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgbWluaW11bSBTU0wvVExTIHByb3RvY29sIHRoYXQgQ2xvdWRGcm9udCB1c2VzIHdoZW4gY29ubmVjdGluZyB0byB5b3VyIG9yaWdpbiBvdmVyIEhUVFBTLiBWYWxpZCB2YWx1ZXMgaW5jbHVkZSBgYFNTTHYzYGAsIGBgVExTdjFgYCwgYGBUTFN2MS4xYGAsIGFuZCBgYFRMU3YxLjJgYC5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtNaW5pbXVtIE9yaWdpbiBTU0wgUHJvdG9jb2xdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td2ViLXZhbHVlcy1zcGVjaWZ5Lmh0bWwjRG93bmxvYWREaXN0VmFsdWVzT3JpZ2luU1NMUHJvdG9jb2xzKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKi9cbk9yaWdpblNTTFByb3RvY29scz86IHN0cmluZ1tdXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgYGBIZWFkZXJOYW1lYGAgYW5kIGBgSGVhZGVyVmFsdWVgYCBlbGVtZW50cywgaWYgYW55LCBmb3IgdGhpcyBkaXN0cmlidXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luQ3VzdG9tSGVhZGVyIHtcbi8qKlxuICogVGhlIG5hbWUgb2YgYSBoZWFkZXIgdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIHNlbmQgdG8geW91ciBvcmlnaW4uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FkZGluZyBDdXN0b20gSGVhZGVycyB0byBPcmlnaW4gUmVxdWVzdHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9mb3J3YXJkLWN1c3RvbS1oZWFkZXJzLmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuSGVhZGVyTmFtZTogc3RyaW5nXG4vKipcbiAqIFRoZSB2YWx1ZSBmb3IgdGhlIGhlYWRlciB0aGF0IHlvdSBzcGVjaWZpZWQgaW4gdGhlIGBgSGVhZGVyTmFtZWBgIGZpZWxkLlxuICovXG5IZWFkZXJWYWx1ZTogc3RyaW5nXG59XG4vKipcbiAqIENsb3VkRnJvbnQgT3JpZ2luIFNoaWVsZC4gVXNpbmcgT3JpZ2luIFNoaWVsZCBjYW4gaGVscCByZWR1Y2UgdGhlIGxvYWQgb24geW91ciBvcmlnaW4uXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNpbmcgT3JpZ2luIFNoaWVsZF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL29yaWdpbi1zaGllbGQuaHRtbCkgaW4gdGhlICpBbWF6b24gQ2xvdWRGcm9udCBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpblNoaWVsZCB7XG4vKipcbiAqIEEgZmxhZyB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIE9yaWdpbiBTaGllbGQgaXMgZW5hYmxlZC5cbiAqICBXaGVuIGl0J3MgZW5hYmxlZCwgQ2xvdWRGcm9udCByb3V0ZXMgYWxsIHJlcXVlc3RzIHRocm91Z2ggT3JpZ2luIFNoaWVsZCwgd2hpY2ggY2FuIGhlbHAgcHJvdGVjdCB5b3VyIG9yaWdpbi4gV2hlbiBpdCdzIGRpc2FibGVkLCBDbG91ZEZyb250IG1pZ2h0IHNlbmQgcmVxdWVzdHMgZGlyZWN0bHkgdG8geW91ciBvcmlnaW4gZnJvbSBtdWx0aXBsZSBlZGdlIGxvY2F0aW9ucyBvciByZWdpb25hbCBlZGdlIGNhY2hlcy5cbiAqL1xuRW5hYmxlZD86IGJvb2xlYW5cbi8qKlxuICogVGhlIEFXUy1SZWdpb24gZm9yIE9yaWdpbiBTaGllbGQuXG4gKiAgU3BlY2lmeSB0aGUgQVdTLVJlZ2lvbiB0aGF0IGhhcyB0aGUgbG93ZXN0IGxhdGVuY3kgdG8geW91ciBvcmlnaW4uIFRvIHNwZWNpZnkgYSByZWdpb24sIHVzZSB0aGUgcmVnaW9uIGNvZGUsIG5vdCB0aGUgcmVnaW9uIG5hbWUuIEZvciBleGFtcGxlLCBzcGVjaWZ5IHRoZSBVUyBFYXN0IChPaGlvKSByZWdpb24gYXMgYGB1cy1lYXN0LTJgYC5cbiAqICBXaGVuIHlvdSBlbmFibGUgQ2xvdWRGcm9udCBPcmlnaW4gU2hpZWxkLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBBV1MtUmVnaW9uIGZvciBPcmlnaW4gU2hpZWxkLiBGb3IgdGhlIGxpc3Qgb2YgQVdTLVJlZ2lvbnMgdGhhdCB5b3UgY2FuIHNwZWNpZnksIGFuZCBmb3IgaGVscCBjaG9vc2luZyB0aGUgYmVzdCBSZWdpb24gZm9yIHlvdXIgb3JpZ2luLCBzZWUgW0Nob29zaW5nIHRoZSBmb3IgT3JpZ2luIFNoaWVsZF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL29yaWdpbi1zaGllbGQuaHRtbCNjaG9vc2Utb3JpZ2luLXNoaWVsZC1yZWdpb24pIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuT3JpZ2luU2hpZWxkUmVnaW9uPzogc3RyaW5nXG59XG4vKipcbiAqIFVzZSB0aGlzIHR5cGUgdG8gc3BlY2lmeSBhbiBvcmlnaW4gdGhhdCBpcyBhbiBBbWF6b24gUzMgYnVja2V0IHRoYXQgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBzdGF0aWMgd2Vic2l0ZSBob3N0aW5nLiBUbyBzcGVjaWZ5IGFueSBvdGhlciB0eXBlIG9mIG9yaWdpbiwgaW5jbHVkaW5nIGFuIEFtYXpvbiBTMyBidWNrZXQgdGhhdCBpcyBjb25maWd1cmVkIHdpdGggc3RhdGljIHdlYnNpdGUgaG9zdGluZywgdXNlIHRoZSBgYEN1c3RvbU9yaWdpbkNvbmZpZ2BgIHR5cGUgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTM09yaWdpbkNvbmZpZyB7XG4vKipcbiAqIElmIHlvdSdyZSB1c2luZyBvcmlnaW4gYWNjZXNzIGNvbnRyb2wgKE9BQykgaW5zdGVhZCBvZiBvcmlnaW4gYWNjZXNzIGlkZW50aXR5LCBzcGVjaWZ5IGFuIGVtcHR5IGBgT3JpZ2luQWNjZXNzSWRlbnRpdHlgYCBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSZXN0cmljdGluZyBhY2Nlc3MgdG8gYW5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9wcml2YXRlLWNvbnRlbnQtcmVzdHJpY3RpbmctYWNjZXNzLXRvLW9yaWdpbi5odG1sKSBpbiB0aGUgKkFtYXpvbiBDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSouXG4gKiAgIFRoZSBDbG91ZEZyb250IG9yaWdpbiBhY2Nlc3MgaWRlbnRpdHkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG9yaWdpbi4gVXNlIGFuIG9yaWdpbiBhY2Nlc3MgaWRlbnRpdHkgdG8gY29uZmlndXJlIHRoZSBvcmlnaW4gc28gdGhhdCB2aWV3ZXJzIGNhbiAqb25seSogYWNjZXNzIG9iamVjdHMgaW4gYW4gQW1hem9uIFMzIGJ1Y2tldCB0aHJvdWdoIENsb3VkRnJvbnQuIFRoZSBmb3JtYXQgb2YgdGhlIHZhbHVlIGlzOlxuICogICBgYG9yaWdpbi1hY2Nlc3MtaWRlbnRpdHkvY2xvdWRmcm9udC9JRC1vZi1vcmlnaW4tYWNjZXNzLWlkZW50aXR5YGAgXG4gKiAgVGhlIGBgSUQtb2Ytb3JpZ2luLWFjY2Vzcy1pZGVudGl0eWBgIGlzIHRoZSB2YWx1ZSB0aGF0IENsb3VkRnJvbnQgcmV0dXJuZWQgaW4gdGhlIGBgSURgYCBlbGVtZW50IHdoZW4geW91IGNyZWF0ZWQgdGhlIG9yaWdpbiBhY2Nlc3MgaWRlbnRpdHkuXG4gKiAgSWYgeW91IHdhbnQgdmlld2VycyB0byBiZSBhYmxlIHRvIGFjY2VzcyBvYmplY3RzIHVzaW5nIGVpdGhlciB0aGUgQ2xvdWRGcm9udCBVUkwgb3IgdGhlIEFtYXpvbiBTMyBVUkwsIHNwZWNpZnkgYW4gZW1wdHkgYGBPcmlnaW5BY2Nlc3NJZGVudGl0eWBgIGVsZW1lbnQuXG4gKiAgVG8gZGVsZXRlIHRoZSBvcmlnaW4gYWNjZXNzIGlkZW50aXR5IGZyb20gYW4gZXhpc3RpbmcgZGlzdHJpYnV0aW9uLCB1cGRhdGUgdGhlIGRpc3RyaWJ1dGlvbiBjb25maWd1cmF0aW9uIGFuZCBpbmNsdWRlIGFuIGVtcHR5IGBgT3JpZ2luQWNjZXNzSWRlbnRpdHlgYCBlbGVtZW50LlxuICogIFRvIHJlcGxhY2UgdGhlIG9yaWdpbiBhY2Nlc3MgaWRlbnRpdHksIHVwZGF0ZSB0aGUgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIHNwZWNpZnkgdGhlIG5ldyBvcmlnaW4gYWNjZXNzIGlkZW50aXR5LlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW4gYWNjZXNzIGlkZW50aXR5LCBzZWUgW1NlcnZpbmcgUHJpdmF0ZSBDb250ZW50IHRocm91Z2ggQ2xvdWRGcm9udF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL1ByaXZhdGVDb250ZW50Lmh0bWwpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuT3JpZ2luQWNjZXNzSWRlbnRpdHk/OiBzdHJpbmdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgVnBjT3JpZ2luQ29uZmlnIHtcbk9yaWdpbktlZXBhbGl2ZVRpbWVvdXQ/OiBudW1iZXJcbk9yaWdpblJlYWRUaW1lb3V0PzogbnVtYmVyXG5WcGNPcmlnaW5JZDogc3RyaW5nXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgaWRlbnRpZmllcyB3YXlzIGluIHdoaWNoIHlvdSB3YW50IHRvIHJlc3RyaWN0IGRpc3RyaWJ1dGlvbiBvZiB5b3VyIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdHJpY3Rpb25zIHtcbkdlb1Jlc3RyaWN0aW9uOiBHZW9SZXN0cmljdGlvblxufVxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRyb2xzIHRoZSBjb3VudHJpZXMgaW4gd2hpY2ggeW91ciBjb250ZW50IGlzIGRpc3RyaWJ1dGVkLiBDRiBkZXRlcm1pbmVzIHRoZSBsb2NhdGlvbiBvZiB5b3VyIHVzZXJzIHVzaW5nIGBgTWF4TWluZGBgIEdlb0lQIGRhdGFiYXNlcy4gVG8gZGlzYWJsZSBnZW8gcmVzdHJpY3Rpb24sIHJlbW92ZSB0aGUgW1Jlc3RyaWN0aW9uc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtY2xvdWRmcm9udC1kaXN0cmlidXRpb24tZGlzdHJpYnV0aW9uY29uZmlnLmh0bWwjY2ZuLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uLWRpc3RyaWJ1dGlvbmNvbmZpZy1yZXN0cmljdGlvbnMpIHByb3BlcnR5IGZyb20geW91ciBzdGFjayB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW9SZXN0cmljdGlvbiB7XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgYSBgYExvY2F0aW9uYGAgZWxlbWVudCBmb3IgZWFjaCBjb3VudHJ5IGluIHdoaWNoIHlvdSB3YW50IENsb3VkRnJvbnQgZWl0aGVyIHRvIGRpc3RyaWJ1dGUgeW91ciBjb250ZW50IChgYHdoaXRlbGlzdGBgKSBvciBub3QgZGlzdHJpYnV0ZSB5b3VyIGNvbnRlbnQgKGBgYmxhY2tsaXN0YGApLlxuICogIFRoZSBgYExvY2F0aW9uYGAgZWxlbWVudCBpcyBhIHR3by1sZXR0ZXIsIHVwcGVyY2FzZSBjb3VudHJ5IGNvZGUgZm9yIGEgY291bnRyeSB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgaW4geW91ciBgYGJsYWNrbGlzdGBgIG9yIGBgd2hpdGVsaXN0YGAuIEluY2x1ZGUgb25lIGBgTG9jYXRpb25gYCBlbGVtZW50IGZvciBlYWNoIGNvdW50cnkuXG4gKiAgQ2xvdWRGcm9udCBhbmQgYGBNYXhNaW5kYGAgYm90aCB1c2UgYGBJU08gMzE2NmBgIGNvdW50cnkgY29kZXMuIEZvciB0aGUgY3VycmVudCBsaXN0IG9mIGNvdW50cmllcyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29kZXMsIHNlZSBgYElTTyAzMTY2LTEtYWxwaGEtMmBgIGNvZGUgb24gdGhlICpJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uKiB3ZWJzaXRlLiBZb3UgY2FuIGFsc28gcmVmZXIgdG8gdGhlIGNvdW50cnkgbGlzdCBvbiB0aGUgQ2xvdWRGcm9udCBjb25zb2xlLCB3aGljaCBpbmNsdWRlcyBib3RoIGNvdW50cnkgbmFtZXMgYW5kIGNvZGVzLlxuICovXG5Mb2NhdGlvbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgbWV0aG9kIHRoYXQgeW91IHdhbnQgdG8gdXNlIHRvIHJlc3RyaWN0IGRpc3RyaWJ1dGlvbiBvZiB5b3VyIGNvbnRlbnQgYnkgY291bnRyeTpcbiAqICAgKyAgIGBgbm9uZWBgOiBObyBnZW8gcmVzdHJpY3Rpb24gaXMgZW5hYmxlZCwgbWVhbmluZyBhY2Nlc3MgdG8gY29udGVudCBpcyBub3QgcmVzdHJpY3RlZCBieSBjbGllbnQgZ2VvIGxvY2F0aW9uLlxuICogICArICAgYGBibGFja2xpc3RgYDogVGhlIGBgTG9jYXRpb25gYCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBjb3VudHJpZXMgaW4gd2hpY2ggeW91IGRvbid0IHdhbnQgQ2xvdWRGcm9udCB0byBkaXN0cmlidXRlIHlvdXIgY29udGVudC5cbiAqICAgKyAgIGBgd2hpdGVsaXN0YGA6IFRoZSBgYExvY2F0aW9uYGAgZWxlbWVudHMgc3BlY2lmeSB0aGUgY291bnRyaWVzIGluIHdoaWNoIHlvdSB3YW50IENsb3VkRnJvbnQgdG8gZGlzdHJpYnV0ZSB5b3VyIGNvbnRlbnQuXG4gKi9cblJlc3RyaWN0aW9uVHlwZTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBvcmlnaW4gYXMgYW4gUzMgYnVja2V0LlxuICogICBUaGlzIHByb3BlcnR5IGlzIGxlZ2FjeS4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBbT3JpZ2luXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1jbG91ZGZyb250LWRpc3RyaWJ1dGlvbi1vcmlnaW4uaHRtbCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lTM09yaWdpbiB7XG4vKipcbiAqIFRoZSBkb21haW4gbmFtZSBhc3NpZ25lZCB0byB5b3VyIENGIGRpc3RyaWJ1dGlvbi5cbiAqL1xuRE5TTmFtZTogc3RyaW5nXG4vKipcbiAqIFRoZSBDRiBvcmlnaW4gYWNjZXNzIGlkZW50aXR5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBkaXN0cmlidXRpb24uIFVzZSBhbiBvcmlnaW4gYWNjZXNzIGlkZW50aXR5IHRvIGNvbmZpZ3VyZSB0aGUgZGlzdHJpYnV0aW9uIHNvIHRoYXQgZW5kIHVzZXJzIGNhbiBvbmx5IGFjY2VzcyBvYmplY3RzIGluIGFuIFMzIHRocm91Z2ggQ0YuXG4gKiAgIFRoaXMgcHJvcGVydHkgaXMgbGVnYWN5LiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIFtPcmlnaW5BY2Nlc3NDb250cm9sXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtY2xvdWRmcm9udC1vcmlnaW5hY2Nlc3Njb250cm9sLmh0bWwpIGluc3RlYWQuXG4gKi9cbk9yaWdpbkFjY2Vzc0lkZW50aXR5Pzogc3RyaW5nXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgZGlzdHJpYnV0aW9uJ3MgU1NML1RMUyBjb25maWd1cmF0aW9uIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdmlld2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3ZXJDZXJ0aWZpY2F0ZSB7XG4vKipcbiAqIEluIENsb3VkRm9ybWF0aW9uLCB0aGlzIGZpZWxkIG5hbWUgaXMgYGBBY21DZXJ0aWZpY2F0ZUFybmBgLiBOb3RlIHRoZSBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24uXG4gKiAgIElmIHRoZSBkaXN0cmlidXRpb24gdXNlcyBgYEFsaWFzZXNgYCAoYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcyBvciBDTkFNRXMpIGFuZCB0aGUgU1NML1RMUyBjZXJ0aWZpY2F0ZSBpcyBzdG9yZWQgaW4gWyhBQ00pXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYWNtL2xhdGVzdC91c2VyZ3VpZGUvYWNtLW92ZXJ2aWV3Lmh0bWwpLCBwcm92aWRlIHRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgQUNNIGNlcnRpZmljYXRlLiBDbG91ZEZyb250IG9ubHkgc3VwcG9ydHMgQUNNIGNlcnRpZmljYXRlcyBpbiB0aGUgVVMgRWFzdCAoTi4gVmlyZ2luaWEpIFJlZ2lvbiAoYGB1cy1lYXN0LTFgYCkuXG4gKiAgSWYgeW91IHNwZWNpZnkgYW4gQUNNIGNlcnRpZmljYXRlIEFSTiwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHZhbHVlcyBmb3IgYGBNaW5pbXVtUHJvdG9jb2xWZXJzaW9uYGAgYW5kIGBgU1NMU3VwcG9ydE1ldGhvZGBgLiAoSW4gQ2xvdWRGb3JtYXRpb24sIHRoZSBmaWVsZCBuYW1lIGlzIGBgU3NsU3VwcG9ydE1ldGhvZGBgLiBOb3RlIHRoZSBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24uKVxuICovXG5BY21DZXJ0aWZpY2F0ZUFybj86IHN0cmluZ1xuLyoqXG4gKiBJZiB0aGUgZGlzdHJpYnV0aW9uIHVzZXMgdGhlIENsb3VkRnJvbnQgZG9tYWluIG5hbWUgc3VjaCBhcyBgYGQxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0YGAsIHNldCB0aGlzIGZpZWxkIHRvIGBgdHJ1ZWBgLlxuICogIElmIHRoZSBkaXN0cmlidXRpb24gdXNlcyBgYEFsaWFzZXNgYCAoYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcyBvciBDTkFNRXMpLCBvbWl0IHRoaXMgZmllbGQgYW5kIHNwZWNpZnkgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIGZpZWxkczpcbiAqICAgKyAgIGBgQWNtQ2VydGlmaWNhdGVBcm5gYCBvciBgYElhbUNlcnRpZmljYXRlSWRgYCAoc3BlY2lmeSBhIHZhbHVlIGZvciBvbmUsIG5vdCBib3RoKSBcbiAqICAgKyAgIGBgTWluaW11bVByb3RvY29sVmVyc2lvbmBgIFxuICogICArICAgYGBTc2xTdXBwb3J0TWV0aG9kYGBcbiAqL1xuQ2xvdWRGcm9udERlZmF1bHRDZXJ0aWZpY2F0ZT86IGJvb2xlYW5cbi8qKlxuICogSW4gQ2xvdWRGb3JtYXRpb24sIHRoaXMgZmllbGQgbmFtZSBpcyBgYElhbUNlcnRpZmljYXRlSWRgYC4gTm90ZSB0aGUgZGlmZmVyZW50IGNhcGl0YWxpemF0aW9uLlxuICogICBJZiB0aGUgZGlzdHJpYnV0aW9uIHVzZXMgYGBBbGlhc2VzYGAgKGFsdGVybmF0ZSBkb21haW4gbmFtZXMgb3IgQ05BTUVzKSBhbmQgdGhlIFNTTC9UTFMgY2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIFsoSUFNKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX2NyZWRlbnRpYWxzX3NlcnZlci1jZXJ0cy5odG1sKSwgcHJvdmlkZSB0aGUgSUQgb2YgdGhlIElBTSBjZXJ0aWZpY2F0ZS5cbiAqICBJZiB5b3Ugc3BlY2lmeSBhbiBJQU0gY2VydGlmaWNhdGUgSUQsIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB2YWx1ZXMgZm9yIGBgTWluaW11bVByb3RvY29sVmVyc2lvbmBgIGFuZCBgYFNTTFN1cHBvcnRNZXRob2RgYC4gKEluIENsb3VkRm9ybWF0aW9uLCB0aGUgZmllbGQgbmFtZSBpcyBgYFNzbFN1cHBvcnRNZXRob2RgYC4gTm90ZSB0aGUgZGlmZmVyZW50IGNhcGl0YWxpemF0aW9uLilcbiAqL1xuSWFtQ2VydGlmaWNhdGVJZD86IHN0cmluZ1xuLyoqXG4gKiBJZiB0aGUgZGlzdHJpYnV0aW9uIHVzZXMgYGBBbGlhc2VzYGAgKGFsdGVybmF0ZSBkb21haW4gbmFtZXMgb3IgQ05BTUVzKSwgc3BlY2lmeSB0aGUgc2VjdXJpdHkgcG9saWN5IHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byB1c2UgZm9yIEhUVFBTIGNvbm5lY3Rpb25zIHdpdGggdmlld2Vycy4gVGhlIHNlY3VyaXR5IHBvbGljeSBkZXRlcm1pbmVzIHR3byBzZXR0aW5nczpcbiAqICAgKyAgVGhlIG1pbmltdW0gU1NML1RMUyBwcm90b2NvbCB0aGF0IENsb3VkRnJvbnQgY2FuIHVzZSB0byBjb21tdW5pY2F0ZSB3aXRoIHZpZXdlcnMuXG4gKiAgICsgIFRoZSBjaXBoZXJzIHRoYXQgQ2xvdWRGcm9udCBjYW4gdXNlIHRvIGVuY3J5cHQgdGhlIGNvbnRlbnQgdGhhdCBpdCByZXR1cm5zIHRvIHZpZXdlcnMuXG4gKiAgIFxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlY3VyaXR5IFBvbGljeV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Rpc3RyaWJ1dGlvbi13ZWItdmFsdWVzLXNwZWNpZnkuaHRtbCNEb3dubG9hZERpc3RWYWx1ZXMtc2VjdXJpdHktcG9saWN5KSBhbmQgW1N1cHBvcnRlZCBQcm90b2NvbHMgYW5kIENpcGhlcnMgQmV0d2VlbiBWaWV3ZXJzIGFuZCBDbG91ZEZyb250XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvc2VjdXJlLWNvbm5lY3Rpb25zLXN1cHBvcnRlZC12aWV3ZXItcHJvdG9jb2xzLWNpcGhlcnMuaHRtbCNzZWN1cmUtY29ubmVjdGlvbnMtc3VwcG9ydGVkLWNpcGhlcnMpIGluIHRoZSAqQW1hem9uIENsb3VkRnJvbnQgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgT24gdGhlIENsb3VkRnJvbnQgY29uc29sZSwgdGhpcyBzZXR0aW5nIGlzIGNhbGxlZCAqU2VjdXJpdHkgUG9saWN5Ki5cbiAqICAgV2hlbiB5b3UncmUgdXNpbmcgU05JIG9ubHkgKHlvdSBzZXQgYGBTU0xTdXBwb3J0TWV0aG9kYGAgdG8gYGBzbmktb25seWBgKSwgeW91IG11c3Qgc3BlY2lmeSBgYFRMU3YxYGAgb3IgaGlnaGVyLiAoSW4gQ2xvdWRGb3JtYXRpb24sIHRoZSBmaWVsZCBuYW1lIGlzIGBgU3NsU3VwcG9ydE1ldGhvZGBgLiBOb3RlIHRoZSBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24uKVxuICogIElmIHRoZSBkaXN0cmlidXRpb24gdXNlcyB0aGUgQ2xvdWRGcm9udCBkb21haW4gbmFtZSBzdWNoIGFzIGBgZDExMTExMWFiY2RlZjguY2xvdWRmcm9udC5uZXRgYCAoeW91IHNldCBgYENsb3VkRnJvbnREZWZhdWx0Q2VydGlmaWNhdGVgYCB0byBgYHRydWVgYCksIENsb3VkRnJvbnQgYXV0b21hdGljYWxseSBzZXRzIHRoZSBzZWN1cml0eSBwb2xpY3kgdG8gYGBUTFN2MWBgIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIHRoYXQgeW91IHNldCBoZXJlLlxuICovXG5NaW5pbXVtUHJvdG9jb2xWZXJzaW9uPzogc3RyaW5nXG4vKipcbiAqIEluIENsb3VkRm9ybWF0aW9uLCB0aGlzIGZpZWxkIG5hbWUgaXMgYGBTc2xTdXBwb3J0TWV0aG9kYGAuIE5vdGUgdGhlIGRpZmZlcmVudCBjYXBpdGFsaXphdGlvbi5cbiAqICAgSWYgdGhlIGRpc3RyaWJ1dGlvbiB1c2VzIGBgQWxpYXNlc2BgIChhbHRlcm5hdGUgZG9tYWluIG5hbWVzIG9yIENOQU1FcyksIHNwZWNpZnkgd2hpY2ggdmlld2VycyB0aGUgZGlzdHJpYnV0aW9uIGFjY2VwdHMgSFRUUFMgY29ubmVjdGlvbnMgZnJvbS5cbiAqICAgKyAgIGBgc25pLW9ubHlgYCDigJMgVGhlIGRpc3RyaWJ1dGlvbiBhY2NlcHRzIEhUVFBTIGNvbm5lY3Rpb25zIGZyb20gb25seSB2aWV3ZXJzIHRoYXQgc3VwcG9ydCBbc2VydmVyIG5hbWUgaW5kaWNhdGlvbiAoU05JKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NlcnZlcl9OYW1lX0luZGljYXRpb24pLiBUaGlzIGlzIHJlY29tbWVuZGVkLiBNb3N0IGJyb3dzZXJzIGFuZCBjbGllbnRzIHN1cHBvcnQgU05JLlxuICogICArICAgYGB2aXBgYCDigJMgVGhlIGRpc3RyaWJ1dGlvbiBhY2NlcHRzIEhUVFBTIGNvbm5lY3Rpb25zIGZyb20gYWxsIHZpZXdlcnMgaW5jbHVkaW5nIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBTTkkuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLCBhbmQgcmVzdWx0cyBpbiBhZGRpdGlvbmFsIG1vbnRobHkgY2hhcmdlcyBmcm9tIENsb3VkRnJvbnQuXG4gKiAgICsgICBgYHN0YXRpYy1pcGBgIC0gRG8gbm90IHNwZWNpZnkgdGhpcyB2YWx1ZSB1bmxlc3MgeW91ciBkaXN0cmlidXRpb24gaGFzIGJlZW4gZW5hYmxlZCBmb3IgdGhpcyBmZWF0dXJlIGJ5IHRoZSBDbG91ZEZyb250IHRlYW0uIElmIHlvdSBoYXZlIGEgdXNlIGNhc2UgdGhhdCByZXF1aXJlcyBzdGF0aWMgSVAgYWRkcmVzc2VzIGZvciBhIGRpc3RyaWJ1dGlvbiwgY29udGFjdCBDbG91ZEZyb250IHRocm91Z2ggdGhlIFtDZW50ZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zdXBwb3J0L2hvbWUpLlxuICogICBcbiAqICBJZiB0aGUgZGlzdHJpYnV0aW9uIHVzZXMgdGhlIENsb3VkRnJvbnQgZG9tYWluIG5hbWUgc3VjaCBhcyBgYGQxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0YGAsIGRvbid0IHNldCBhIHZhbHVlIGZvciB0aGlzIGZpZWxkLlxuICovXG5Tc2xTdXBwb3J0TWV0aG9kPzogc3RyaW5nXG59XG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgY29udGFpbnMgYGBUYWdgYCBrZXkgYW5kIGBgVGFnYGAgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFnIHtcbi8qKlxuICogQSBzdHJpbmcgdGhhdCBjb250YWlucyBgYFRhZ2BgIGtleS5cbiAqICBUaGUgc3RyaW5nIGxlbmd0aCBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAxMjggY2hhcmFjdGVycy4gVmFsaWQgY2hhcmFjdGVycyBpbmNsdWRlIGBgYS16YGAsIGBgQS1aYGAsIGBgMC05YGAsIHNwYWNlLCBhbmQgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBgYF8gLSAuIDogLyA9ICsgQGBgLlxuICovXG5LZXk6IHN0cmluZ1xuLyoqXG4gKiBBIHN0cmluZyB0aGF0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGBgVGFnYGAgdmFsdWUuXG4gKiAgVGhlIHN0cmluZyBsZW5ndGggc2hvdWxkIGJlIGJldHdlZW4gMCBhbmQgMjU2IGNoYXJhY3RlcnMuIFZhbGlkIGNoYXJhY3RlcnMgaW5jbHVkZSBgYGEtemBgLCBgYEEtWmBgLCBgYDAtOWBgLCBzcGFjZSwgYW5kIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYGBfIC0gLiA6IC8gPSArIEBgYC5cbiAqL1xuVmFsdWU6IHN0cmluZ1xufVxuIl19
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The ``AWS::ECS::Service`` resource creates an Amazon Elastic Container Service (Amazon ECS) service that runs and maintains the requested number of tasks and associated load balancers.
|
|
3
|
-
* The stack update fails if you change any properties that require replacement and at least one ECS Service Connect ``ServiceConnectConfiguration`` property
|
|
3
|
+
* The stack update fails if you change any properties that require replacement and at least one ECS Service Connect ``ServiceConnectConfiguration`` property is configured. This is because AWS CloudFormation creates the replacement service first, but each ``ServiceConnectService`` must have a name that is unique in the namespace.
|
|
4
4
|
* Starting April 15, 2023, AWS; will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, ECS, or EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.
|
|
5
5
|
*/
|
|
6
6
|
export interface _AWS_ECS_SERVICE {
|
|
@@ -17,21 +17,25 @@ export interface _AWS_ECS_SERVICE {
|
|
|
17
17
|
ServiceArn?: string;
|
|
18
18
|
/**
|
|
19
19
|
* The placement strategy objects to use for tasks in your service. You can specify a maximum of 5 strategy rules for each service.
|
|
20
|
+
* To remove this property from your service resource, specify an empty ``PlacementStrategy`` array.
|
|
20
21
|
*/
|
|
21
22
|
PlacementStrategies?: PlacementStrategy[];
|
|
22
23
|
/**
|
|
23
24
|
* The details of the service discovery registry to associate with this service. For more information, see [Service discovery](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html).
|
|
24
25
|
* Each service may be associated with one service registry. Multiple service registries for each service isn't supported.
|
|
26
|
+
* To remove this property from your service resource, specify an empty ``ServiceRegistry`` array.
|
|
25
27
|
*/
|
|
26
28
|
ServiceRegistries?: ServiceRegistry[];
|
|
27
29
|
/**
|
|
28
30
|
* The configuration for a volume specified in the task definition as a volume that is configured at launch time. Currently, the only supported volume type is an Amazon EBS volume.
|
|
31
|
+
* To remove this property from your service resource, specify an empty ``ServiceVolumeConfiguration`` array.
|
|
29
32
|
*/
|
|
30
33
|
VolumeConfigurations?: ServiceVolumeConfiguration[];
|
|
31
34
|
/**
|
|
32
35
|
* The capacity provider strategy to use for the service.
|
|
33
36
|
* If a ``capacityProviderStrategy`` is specified, the ``launchType`` parameter must be omitted. If no ``capacityProviderStrategy`` or ``launchType`` is specified, the ``defaultCapacityProviderStrategy`` for the cluster is used.
|
|
34
|
-
* A capacity provider strategy
|
|
37
|
+
* A capacity provider strategy may contain a maximum of 6 capacity providers.
|
|
38
|
+
* To remove this property from your service resource, specify an empty ``CapacityProviderStrategyItem`` array.
|
|
35
39
|
*/
|
|
36
40
|
CapacityProviderStrategy?: CapacityProviderStrategyItem[];
|
|
37
41
|
/**
|
|
@@ -81,6 +85,7 @@ export interface _AWS_ECS_SERVICE {
|
|
|
81
85
|
EnableExecuteCommand?: boolean;
|
|
82
86
|
/**
|
|
83
87
|
* An array of placement constraint objects to use for tasks in your service. You can specify a maximum of 10 constraints for each task. This limit includes constraints in the task definition and those specified at runtime.
|
|
88
|
+
* To remove this property from your service resource, specify an empty ``PlacementConstraint`` array.
|
|
84
89
|
*/
|
|
85
90
|
PlacementConstraints?: PlacementConstraint[];
|
|
86
91
|
/**
|
|
@@ -89,6 +94,7 @@ export interface _AWS_ECS_SERVICE {
|
|
|
89
94
|
Cluster?: string;
|
|
90
95
|
/**
|
|
91
96
|
* A list of load balancer objects to associate with the service. If you specify the ``Role`` property, ``LoadBalancers`` must be specified as well. For information about the number of load balancers that you can specify per service, see [Service Load Balancing](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html) in the *Amazon Elastic Container Service Developer Guide*.
|
|
97
|
+
* To remove this property from your service resource, specify an empty ``LoadBalancer`` array.
|
|
92
98
|
*/
|
|
93
99
|
LoadBalancers?: LoadBalancer[];
|
|
94
100
|
ServiceConnectConfiguration?: ServiceConnectConfiguration;
|