@pipeline-builder/api-core 5.2.10 → 5.2.11

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.
@@ -31,11 +31,12 @@ export const PERMISSION_ID_SHAPE = /^[a-z][a-z0-9_]*:[a-z]+$/;
31
31
  /** All valid permissions (order determines display order in the picker). */
32
32
  export const ALL_PERMISSIONS = [
33
33
  'pipelines:read', 'pipelines:write', 'pipelines:publish', 'pipeline_registry:write',
34
+ 'toolchain:manage',
34
35
  'templates:read', 'templates:write', 'templates:publish',
35
36
  'plugins:read', 'plugins:write', 'plugins:publish',
36
37
  'plugins:install', 'plugin_installs:manage', 'publishers:manage',
37
38
  'plugins:moderate', 'publishers:verify',
38
- 'platform:read', 'orgs:read', 'billing:operate',
39
+ 'platform:read', 'orgs:read', 'toolchain:operate', 'billing:operate',
39
40
  'observability_console:open', 'database_console:open', 'objectstore_console:open',
40
41
  'oncall:manage',
41
42
  'support_cases:write', 'support_content:write',
@@ -107,6 +108,7 @@ export const PERMISSION_CATALOG = [
107
108
  { id: 'pipelines:write', label: 'Manage pipelines', description: 'Create, edit, and delete pipelines', category: 'Pipelines' },
108
109
  { id: 'pipelines:publish', label: 'Publish pipelines', description: 'Make pipelines public (org-wide/catalog visibility)', category: 'Pipelines' },
109
110
  { id: 'pipeline_registry:write', label: 'Register deployments', description: 'Record and remove the deployed stack and step manifest behind a pipeline (the pipeline registry)', category: 'Pipelines' },
111
+ { id: 'toolchain:manage', label: 'Manage the org toolchain default', description: "Choose which managed toolchain release your org's unpinned pipelines (and teams without their own) build with, or follow the platform default", category: 'Pipelines' },
110
112
  { id: 'templates:read', label: 'View templates', description: 'View the golden-path template catalog', category: 'Templates' },
111
113
  { id: 'templates:write', label: 'Manage templates', description: 'Author, edit, and delete pipeline templates', category: 'Templates' },
112
114
  { id: 'templates:publish', label: 'Publish templates', description: 'Share a template beyond your org (public visibility)', category: 'Templates' },
@@ -120,6 +122,7 @@ export const PERMISSION_CATALOG = [
120
122
  { id: 'publishers:verify', label: 'Verify publishers', description: 'Approve Verified applications, publisher tier and profile changes, and ownership transfers (system org only)', category: 'Plugin Ecosystem' },
121
123
  { id: 'platform:read', label: 'View platform operations', description: 'Read the platform settings and the cross-tenant organization list (system org only)', category: 'Platform operations' },
122
124
  { id: 'orgs:read', label: 'View all organizations', description: 'List and open every organization on the deployment \u2014 the roster the operator surfaces work from (system org only)', category: 'Platform operations' },
125
+ { id: 'toolchain:operate', label: 'Operate the platform toolchain', description: 'Run the Toolchain console: canary membership, release notes, deprecate / yank / delete releases, and set the platform default every org without its own follows (system org only)', category: 'Platform operations' },
123
126
  { id: 'billing:operate', label: 'Operate discounts and promotions', description: 'Create, apply and revoke discount tokens and promotion campaigns across tenants (system org only)', category: 'Platform operations' },
124
127
  { id: 'observability_console:open', label: 'Open the observability consoles', description: 'Open Grafana and Kiali — dashboards, traffic and mesh health across every tenant (system org only)', category: 'Platform operations' },
125
128
  { id: 'database_console:open', label: 'Open the database consoles', description: 'Open pgAdmin and mongo-express — a direct read/write shell over every tenant\u2019s rows (system org only)', category: 'Platform operations' },
@@ -288,6 +291,9 @@ export const SYSTEM_ORG_ONLY_PERMISSIONS = [
288
291
  'orgs:manage',
289
292
  'quotas:manage',
290
293
  'plugin_queue:manage',
294
+ // The Toolchain console (plan D9): THE platform default and canary move the
295
+ // build toolchain of every org that follows it, so no tenant may hold it.
296
+ 'toolchain:operate',
291
297
  ];
292
298
  /** Whether `permission` may be held only inside the system org. */
293
299
  export function isSystemOrgOnlyPermission(permission) {
@@ -435,6 +441,9 @@ export const PLATFORM_OPERATOR_PERMISSIONS = [
435
441
  // queue and purge its dead-letter queue.
436
442
  'quotas:manage',
437
443
  'plugin_queue:manage',
444
+ // The Toolchain console (plan D9): canary, promotion, rollback and release
445
+ // lifecycle of the managed build toolchain — running the deployment.
446
+ 'toolchain:operate',
438
447
  // Reads that make the operator views usable: the dashboards the posture panels
439
448
  // live on, the cross-tenant log view, and the customer's plan when a limit is
440
449
  // the thing being debugged.
@@ -989,4 +998,4 @@ export const AUTOMATION_ACCOUNT_BUNDLES = {
989
998
  'reporting-ingest': null,
990
999
  'registry-push': null,
991
1000
  };
992
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBa1B0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBc0I7SUFDbkQsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTTtJQUNwQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO0NBQ3pFLENBQUM7QUFFRixxR0FBcUc7QUFDckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCO0lBQ25GLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN4RCxjQUFjLEVBQUUsZUFBZSxFQUFFLGlCQUFpQjtJQUNsRCxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUI7SUFDaEUsa0JBQWtCLEVBQUUsbUJBQW1CO0lBQ3ZDLGVBQWUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCO0lBQy9DLDRCQUE0QixFQUFFLHVCQUF1QixFQUFFLDBCQUEwQjtJQUNqRixlQUFlO0lBQ2YscUJBQXFCLEVBQUUsdUJBQXVCO0lBQzlDLG9CQUFvQixFQUFFLHNCQUFzQjtJQUM1QyxhQUFhLEVBQUUsZUFBZSxFQUFFLHFCQUFxQjtJQUNyRCxpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLHlCQUF5QjtJQUNqRixpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsb0JBQW9CLEVBQUUscUJBQXFCO0lBQzNDLGFBQWEsRUFBRSxZQUFZO0lBQzNCLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCO0lBQ3BFLGVBQWUsRUFBRSxnQkFBZ0I7SUFDakMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxhQUFhO0lBQ2IsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtJQUNuRCxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0I7SUFDakUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSx5QkFBeUI7Q0FDbEYsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFzQjtJQUNqRCw0RUFBNEU7SUFDNUUsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2Qiw0QkFBNEI7SUFDNUIsMEVBQTBFO0lBQzFFLDRCQUE0QjtJQUM1QiwwRUFBMEU7SUFDMUUsOEVBQThFO0lBQzlFLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2Ysa0VBQWtFO0lBQ2xFLDhCQUE4QjtJQUM5Qiw0QkFBNEI7SUFDNUIsbUJBQW1CO0lBQ25CLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UsOEVBQThFO0lBQzlFLDZFQUE2RTtJQUM3RSxjQUFjO0NBQ2YsQ0FBQztBQWFGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQThCO0lBQzNELEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUscUNBQXFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtJQUM1SCxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLG9DQUFvQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7SUFDOUgsRUFBRSxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxxREFBcUQsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO0lBQ2xKLEVBQUUsRUFBRSxFQUFFLHlCQUF5QixFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsa0dBQWtHLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtJQUN4TSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLHVDQUF1QyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7SUFDOUgsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSw2Q0FBNkMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO0lBQ3ZJLEVBQUUsRUFBRSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsc0RBQXNELEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtJQUNuSixFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtJQUMxRyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSwwQ0FBMEMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO0lBQzlILEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsbURBQW1ELEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtJQUMxSSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLDJHQUEyRyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUMzTSxFQUFFLEVBQUUsRUFBRSx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLDhGQUE4RixFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUM1TSxFQUFFLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsV0FBVyxFQUFFLHVHQUF1RyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUNsTixFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsK0JBQStCLEVBQUUsV0FBVyxFQUFFLG9IQUFvSCxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUNuTyxFQUFFLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLDhHQUE4RyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUNsTixFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLDBCQUEwQixFQUFFLFdBQVcsRUFBRSxxRkFBcUYsRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUU7SUFDL0wsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsd0hBQXdILEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFO0lBQzVOLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxrQ0FBa0MsRUFBRSxXQUFXLEVBQUUsbUdBQW1HLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFO0lBQ3ZOLEVBQUUsRUFBRSxFQUFFLDRCQUE0QixFQUFFLEtBQUssRUFBRSxpQ0FBaUMsRUFBRSxXQUFXLEVBQUUsb0dBQW9HLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFO0lBQ2xPLEVBQUUsRUFBRSxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSw0QkFBNEIsRUFBRSxXQUFXLEVBQUUsNEdBQTRHLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFO0lBQ2hPLEVBQUUsRUFBRSxFQUFFLDBCQUEwQixFQUFFLEtBQUssRUFBRSwrQkFBK0IsRUFBRSxXQUFXLEVBQUUscUhBQXFILEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFO0lBQy9PLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxFQUFFLGtHQUFrRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7SUFDN0wsRUFBRSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxtSkFBbUosRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO0lBQ3pQLEVBQUUsRUFBRSxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsMkZBQTJGLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRTtJQUNuTSxFQUFFLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLDRGQUE0RixFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRTtJQUN6TSxFQUFFLEVBQUUsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLEVBQUUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLHNHQUFzRyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRTtJQUN0TixFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLDZCQUE2QixFQUFFLFdBQVcsRUFBRSxxRUFBcUUsRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUU7SUFDaEwsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsK0dBQStHLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFO0lBQ2pOLEVBQUUsRUFBRSxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSw0QkFBNEIsRUFBRSxXQUFXLEVBQUUsMEVBQTBFLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFO0lBQzVMLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsNENBQTRDLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtJQUN0SSxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLGlEQUFpRCxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUU7SUFDOUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSw4Q0FBOEMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUU7SUFDNUksRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGdDQUFnQyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUMxSCxFQUFFLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLHNDQUFzQyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUM1SSxFQUFFLEVBQUUsRUFBRSx5QkFBeUIsRUFBRSxLQUFLLEVBQUUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLGlGQUFpRixFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUNqTSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7SUFDckgsRUFBRSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxtQ0FBbUMsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFO0lBQ25JLEVBQUUsRUFBRSxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLG1DQUFtQyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7SUFDakksRUFBRSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSw4Q0FBOEMsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFO0lBQy9JLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSw4RkFBOEYsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFO0lBQ3JMLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLHdEQUF3RCxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7SUFDbkosRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLDRCQUE0QixFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7SUFDOUcsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSwrQ0FBK0MsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO0lBQzNJLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUUsV0FBVyxFQUFFLDJEQUEyRCxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7SUFDNUosRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLDRCQUE0QixFQUFFLFdBQVcsRUFBRSxnRkFBZ0YsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO0lBQ25MLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO0lBQ3RILEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlDQUFpQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7SUFDdkgsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLDhCQUE4QixFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUN4SCxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLHVEQUF1RCxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUNySixFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsb0NBQW9DLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFO0lBQzVILEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxtQ0FBbUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO0lBQ3ZILEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsNERBQTRELEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRTtJQUN6SixFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLHFFQUFxRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7SUFDcEssRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLCtCQUErQixFQUFFLFdBQVcsRUFBRSxpRkFBaUYsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFO0lBQy9MLEVBQUUsRUFBRSxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSwrQkFBK0IsRUFBRSxXQUFXLEVBQUUsZ0ZBQWdGLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRTtJQUNqTSxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsOEJBQThCLEVBQUUsV0FBVyxFQUFFLDhFQUE4RSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7SUFDekwsRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSwyQ0FBMkMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO0lBQ2hKLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGlEQUFpRCxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7SUFDMUksRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsZ0RBQWdELEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRTtJQUNqSixFQUFFLEVBQUUsRUFBRSx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsV0FBVyxFQUFFLG9GQUFvRixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7Q0FDck0sQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQWlCLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbEcscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBVTtJQUN4QyxPQUFPLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDekMsQ0FBQztBQVFELHlFQUF5RTtBQUN6RSxTQUFTLGVBQWUsQ0FBQyxLQUFnQztJQUN2RCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDdkQsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUM1RixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLE9BQVEsZUFBcUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUEwQjtJQUNoRSx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUN4RSx3RUFBd0U7SUFDeEUsOEVBQThFO0lBQzlFLCtEQUErRDtJQUMvRCxnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQTBCO0lBQ2hFLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsOEVBQThFO0lBQzlFLHlFQUF5RTtJQUN6RSw4RUFBOEU7SUFDOUUsZUFBZTtJQUNmLFdBQVc7SUFDWCwrRUFBK0U7SUFDL0UsK0VBQStFO0lBQy9FLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UscUVBQXFFO0lBQ3JFLDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLGVBQWU7SUFDZiwwRUFBMEU7SUFDMUUscUVBQXFFO0lBQ3JFLDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLGtFQUFrRTtJQUNsRSxtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQiw0QkFBNEI7SUFDNUIsdUJBQXVCO0lBQ3ZCLDBCQUEwQjtJQUMxQix3RUFBd0U7SUFDeEUsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLHlEQUF5RDtJQUN6RCxFQUFFO0lBQ0YsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSwrRUFBK0U7SUFDL0UsZ0NBQWdDO0lBQ2hDLG9CQUFvQjtJQUNwQiw2RUFBNkU7SUFDN0UsMEVBQTBFO0lBQzFFLDhFQUE4RTtJQUM5RSx1Q0FBdUM7SUFDdkMsZUFBZTtJQUNmLCtFQUErRTtJQUMvRSw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLGlEQUFpRDtJQUNqRCxxQkFBcUI7SUFDckIsdUJBQXVCO0lBQ3ZCLG9CQUFvQjtJQUNwQixzQkFBc0I7SUFDdEIsYUFBYTtJQUNiLGVBQWU7SUFDZixxQkFBcUI7Q0FDdEIsQ0FBQztBQUVGLG1FQUFtRTtBQUNuRSxNQUFNLFVBQVUseUJBQXlCLENBQUMsVUFBa0I7SUFDMUQsT0FBUSwyQkFBaUQsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakYsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQ3JDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFOUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxVQUFzQjtJQUM5RCxPQUFPLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckcsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQ3BDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFckYsZ0ZBQWdGO0FBQ2hGLHdFQUF3RTtBQUN4RSxnRkFBZ0Y7QUFFaEY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUNoQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFckQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFNBQTZCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDakMsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUMxQixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFNBQTRCLEVBQzVCLE1BQXlCO0lBRXpCLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELGdGQUFnRjtBQUNoRiw2QkFBNkI7QUFDN0IsZ0ZBQWdGO0FBRWhGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sa0JBQWtCLEdBQTBCO0lBQ2hELGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLHlCQUF5QjtJQUM5RCxnQkFBZ0IsRUFBRSxpQkFBaUI7SUFDbkMsY0FBYyxFQUFFLGVBQWU7SUFDL0IsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLGNBQWM7SUFDZCxlQUFlLEVBQUUsZ0JBQWdCO0lBQ2pDLGNBQWM7SUFDZCxhQUFhO0NBQ2QsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQTBCLENBQUMsR0FBRywwQkFBMEIsQ0FBQyxDQUFDO0FBRWpGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQTJDO0lBQ3RFLE1BQU0sRUFBRSxrQkFBa0I7SUFDMUIsS0FBSyxFQUFFLGlCQUFpQjtJQUN4QixLQUFLLEVBQUUsaUJBQWlCO0NBQ3pCLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUEwQjtJQUNsRSw2RUFBNkU7SUFDN0UsZ0VBQWdFO0lBQ2hFLGVBQWU7SUFDZixXQUFXO0lBQ1gsZUFBZTtJQUNmLDRCQUE0QjtJQUM1Qiw0RUFBNEU7SUFDNUUseUNBQXlDO0lBQ3pDLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsK0VBQStFO0lBQy9FLDhFQUE4RTtJQUM5RSw0QkFBNEI7SUFDNUIsb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSwwRUFBMEU7SUFDMUUsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSxtRUFBbUU7SUFDbkUsZUFBZTtDQUNoQixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUEwQjtJQUNoRSxvQkFBb0I7SUFDcEIsc0JBQXNCO0lBQ3RCLGFBQWE7SUFDYixpQkFBaUI7SUFDakIsNkVBQTZFO0lBQzdFLHlCQUF5QjtJQUN6QixlQUFlO0lBQ2YsNkVBQTZFO0lBQzdFLHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDdkUsa0NBQWtDO0lBQ2xDLFdBQVc7Q0FDWixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQTBCO0lBQ2xFLGVBQWU7SUFDZixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixpQkFBaUI7SUFDakIsNEVBQTRFO0lBQzVFLHVFQUF1RTtJQUN2RSxlQUFlO0NBQ2hCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBMEI7SUFDOUQsNEJBQTRCO0lBQzVCLHVCQUF1QjtJQUN2QiwwQkFBMEI7SUFDMUIsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSx1RUFBdUU7SUFDdkUsOERBQThEO0lBQzlELFdBQVc7Q0FDWixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQTBCO0lBQ2xFLGVBQWU7SUFDZixnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBMEI7SUFDOUQscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUN4RSw2RUFBNkU7SUFDN0Usd0VBQXdFO0lBQ3hFLFdBQVc7SUFDWCxxRUFBcUU7SUFDckUsb0RBQW9EO0lBQ3BELGVBQWU7SUFDZixnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUEwQjtJQUM3RCxHQUFHLHlCQUF5QjtJQUM1QixvQkFBb0I7Q0FDckIsQ0FBQztBQXdDRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQTRCO0lBQ3JEO1FBQ0UsNEVBQTRFO1FBQzVFLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsdUVBQXVFO1FBQ3ZFLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUseURBQXlEO1FBQ3pELEVBQUU7UUFDRiw2RUFBNkU7UUFDN0UsOEVBQThFO1FBQzlFLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0UsMkRBQTJEO1FBQzNELEVBQUUsRUFBRSxXQUFXO1FBQ2YsSUFBSSxFQUFFLFdBQVc7UUFDakIsV0FBVyxFQUFFLDhFQUE4RTtRQUMzRixXQUFXLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQztLQUN6RTtJQUNEO1FBQ0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FzQkc7UUFDSCxFQUFFLEVBQUUsV0FBVztRQUNmLElBQUksRUFBRSxXQUFXO1FBQ2pCLFdBQVcsRUFBRSxvRkFBb0Y7UUFDakcsV0FBVyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQztLQUNoRjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGlCQUFpQjtRQUNyQixJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLFdBQVcsRUFBRSw4RUFBOEU7UUFDM0YsV0FBVyxFQUFFO1lBQ1gsZ0JBQWdCLEVBQUUsbUJBQW1CO1lBQ3JDLGdCQUFnQixFQUFFLG1CQUFtQjtZQUNyQyxjQUFjLEVBQUUsaUJBQWlCO1lBQ2pDLHdCQUF3QjtTQUN6QjtLQUNGO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsa0JBQWtCO1FBQ3RCLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsV0FBVyxFQUFFLHVGQUF1RjtRQUNwRyxXQUFXLEVBQUU7WUFDWCxZQUFZLEVBQUUsYUFBYTtZQUMzQixpQkFBaUIsRUFBRSxrQkFBa0I7WUFDckMsZUFBZSxFQUFFLGVBQWUsRUFBRSx5QkFBeUI7WUFDM0Qsc0VBQXNFO1lBQ3RFLHlFQUF5RTtZQUN6RSx5RUFBeUU7WUFDekUsMEVBQTBFO1lBQzFFLHVCQUF1QjtZQUN2Qix1QkFBdUI7U0FDeEI7S0FDRjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGdCQUFnQjtRQUNwQixJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLFdBQVcsRUFBRSx5SEFBeUg7UUFDdEksV0FBVyxFQUFFO1lBQ1gsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUseUJBQXlCO1lBQ2pFLDBFQUEwRTtZQUMxRSxzRUFBc0U7WUFDdEUsdUVBQXVFO1lBQ3ZFLDRCQUE0QjtZQUM1QixrQkFBa0I7U0FDbkI7S0FDRjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGlCQUFpQjtRQUNyQixJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLFdBQVcsRUFBRSw2REFBNkQ7UUFDMUUsV0FBVyxFQUFFO1lBQ1gsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWE7U0FDaEQ7S0FDRjtJQUNEO1FBQ0U7Ozs7Ozs7Ozs7Ozs7O1dBY0c7UUFDSCxFQUFFLEVBQUUsaUJBQWlCO1FBQ3JCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsV0FBVyxFQUFFLG1HQUFtRztRQUNoSCxXQUFXLEVBQUU7WUFDWCx1QkFBdUIsRUFBRSxZQUFZO1NBQ3RDO0tBQ0Y7Q0FDRixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQTBCO0lBQ2xFLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLG9CQUFvQjtDQUNyQixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBMEI7SUFDbkUsY0FBYztJQUNkLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2Ysb0JBQW9CO0NBQ3JCLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQTBCO0lBQzFELEdBQUcsa0JBQWtCO0lBQ3JCLGVBQWU7SUFDZixpQkFBaUI7Q0FDbEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQTBCO0lBQ3BFLGdCQUFnQjtJQUNoQixjQUFjO0NBQ2YsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBMEI7SUFDdEUseUJBQXlCO0NBQzFCLENBQUM7QUFFRixnRkFBZ0Y7QUFDaEYsYUFBYTtBQUNiLGdGQUFnRjtBQUVoRjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsbUJBQThDLEVBQzlDLFlBQXNCO0lBRXRCLElBQUksWUFBWTtRQUFFLE9BQU8sQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO0lBRTlDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFjLENBQUM7SUFDcEMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hCLEtBQUssTUFBTSxDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUNwQyxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxXQUF5QixFQUN6QixvQkFBNkI7SUFFN0IsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUcsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsYUFBYSxDQUMzQixPQUE2QyxFQUM3QyxVQUFzQixFQUN0QixZQUFzQjtJQUV0QixJQUFJLFlBQVk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM5QixPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLHlDQUF5QztBQUN6QyxnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHO0lBQzFCLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSw2QkFBNkIsRUFBRTtJQUM1RixrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsOEJBQThCLEVBQUU7SUFDL0YsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUU7SUFDcEUsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLDZCQUE2QixFQUFFO0lBQzVGLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSw2QkFBNkIsRUFBRTtJQUM1RixlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLDJCQUEyQixFQUFFO0lBQ3RGLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUU7SUFDeEYsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUU7SUFDaEYsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUU7SUFDN0UsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLDZCQUE2QixFQUFFO0lBQzVGLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtJQUNsRyxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsaUNBQWlDLEVBQUU7Q0FDaEcsQ0FBQztBQUVYLGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQXFDLENBQUM7QUFHN0Y7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUE0QjtJQUM3RCxtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixlQUFlO0lBQ2YsY0FBYztJQUNkLG1CQUFtQjtDQUNwQixDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQTRCO0lBQzdELHFCQUFxQjtJQUNyQix1QkFBdUI7Q0FDeEIsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMscUJBQXFCLEVBQUUscUJBQXFCO0lBQzVDLG1CQUFtQixFQUFFLHVCQUF1QjtJQUM1QyxrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLGVBQWUsRUFBRSxJQUFJO0NBQ2lDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBPcmdSb2xlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbiBpZGVudGlmaWVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYW5vbmljYWwgZmluZS1ncmFpbmVkIHBlcm1pc3Npb24gaWRlbnRpZmllcnMsIGluIGByZXNvdXJjZTphY3Rpb25gIGZvcm0uXG4gKlxuICogVGhlc2UgYXJlIHRoZSBPUkctU0NPUEVEIGNhcGFiaWxpdGllcyBhIFJvbGUgY2FuIGdyYW50IChSQkFDKS4gQ29hcnNlIGJ5XG4gKiBkZXNpZ24g4oCUIGA6d3JpdGVgIGNvdmVycyBjcmVhdGUvdXBkYXRlL2RlbGV0ZSBmb3IgYSByZXNvdXJjZSDigJQgc28gdGhlIGNhdGFsb2dcbiAqIGFuZCBwZXJtaXNzaW9uLXBpY2tlciBVSSBzdGF5IHNtYWxsOyBzcGxpdCBhIGA6d3JpdGVgIGludG8gYDpjcmVhdGVgL2A6ZGVsZXRlYFxuICogbGF0ZXIgaWYgYSByZXNvdXJjZSBuZWVkcyBpdC5cbiAqXG4gKiBOT1QgbW9kZWxlZCBoZXJlIChpbnRlbnRpb25hbGx5KTogcGxhdGZvcm0tb3BlcmF0b3IgYWN0aW9ucyAob3JnIGRlbGV0ZSwgdGllci9cbiAqIHF1b3RhIG92ZXJyaWRlLCB1c2VyIGFkbWluLCBpbXBlcnNvbmF0aW9uLCBwbGF0Zm9ybSBzZXR0aW5ncykgc3RheSBiZWhpbmQgdGhlXG4gKiBnbG9iYWwgYGlzU3VwZXJBZG1pbmAgZmxhZywgbm90IGEgcGVyLW9yZyBwZXJtaXNzaW9uOyBhbmQgYHJlcXVpcmVTdGVwVXBgXG4gKiAoTUZBKSAvIGByZXF1aXJlRmVhdHVyZWAgKHBsYW4gZW50aXRsZW1lbnRzKSByZW1haW4gb3J0aG9nb25hbCBnYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9XG4gIC8vIFBpcGVsaW5lc1xuICB8ICdwaXBlbGluZXM6cmVhZCdcbiAgfCAncGlwZWxpbmVzOndyaXRlJ1xuICB8ICdwaXBlbGluZXM6cHVibGlzaCdcbiAgLy8gVGhlIHBpcGVsaW5lIFJFR0lTVFJZIChgUE9TVGAvYERFTEVURSAvcGlwZWxpbmVzL3JlZ2lzdHJ5YCk6IHdoaWNoIGRlcGxveWVkXG4gIC8vIHN0YWNrIGJhY2tzIGEgcGlwZWxpbmUsIGFuZCB0aGUgc3RlcCBtYW5pZmVzdCBvZiBwbHVnaW4gZGlnZXN0cyBpdCBydW5zLlxuICAvLyBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczp3cml0ZWAgc28gdGhlIENvZGVCdWlsZCBzeW50aCBjYW4ga2VlcCB0aGF0IHJlY29yZFxuICAvLyBjdXJyZW50IHdpdGggYSBjcmVkZW50aWFsIHRoYXQgY2FuIGRvIG5vdGhpbmcgZWxzZSDigJQgYSBrZXkgaG9sZGluZ1xuICAvLyBgcGlwZWxpbmVzOndyaXRlYCBjb3VsZCByZXdyaXRlIGV2ZXJ5IHBpcGVsaW5lIHRoZSBvcmcgb3ducy4gUGVvcGxlIGdldCBpdFxuICAvLyBiZXNpZGUgYHBpcGVsaW5lczp3cml0ZWAgKHRoZSBNZW1iZXIgYnVuZGxlKTsgdGhlIGBwaXBlbGluZS1yZWdpc3RlcmBcbiAgLy8gc2VydmljZSBhY2NvdW50IGhvbGRzIGl0IGFsb25lLlxuICB8ICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZSdcbiAgLy8gR29sZGVuLXBhdGggcGlwZWxpbmUgdGVtcGxhdGVzLiBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczoqYCBzbyBhIHBsYXRmb3JtXG4gIC8vIHRlYW0gY2FuIGN1cmF0ZSB0aGUgc3RhcnRlciBjYXRhbG9nIFdJVEhPVVQgd3JpdGUgYWNjZXNzIHRvIGV2ZXJ5IHBpcGVsaW5lXG4gIC8vIChhbmQgdmljZSB2ZXJzYSkuIGA6cHVibGlzaGAgbWFwcyB0byB0aGVcbiAgLy8gdGVtcGxhdGUgbGFkZGVyJ3MgYHB1YmxpY2AgcnVuZzsgYG9yZ2AgYW5kIGBwcml2YXRlYCBuZWVkIG9ubHkgYDp3cml0ZWAuXG4gIHwgJ3RlbXBsYXRlczpyZWFkJ1xuICB8ICd0ZW1wbGF0ZXM6d3JpdGUnXG4gIHwgJ3RlbXBsYXRlczpwdWJsaXNoJ1xuICAvLyBQbHVnaW5zXG4gIHwgJ3BsdWdpbnM6cmVhZCdcbiAgfCAncGx1Z2luczp3cml0ZSdcbiAgfCAncGx1Z2luczpwdWJsaXNoJ1xuICAvLyBQbHVnaW4gZWNvc3lzdGVtIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gT3JnLWFzc2lnbmFibGU6XG4gIC8vICAtIGBwbHVnaW5zOmluc3RhbGxgICAgICAgICDigJQgaW5zdGFsbC91cGdyYWRlL3VuaW5zdGFsbCBsaXN0aW5ncyAob3IgUkVRVUVTVFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBpbnN0YWxsIHdoZW4gdGhlIG9yZydzIHBvbGljeSBuZWVkcyBhcHByb3ZhbCkuXG4gIC8vICAtIGBwbHVnaW5faW5zdGFsbHM6bWFuYWdlYCDigJQgdGhlIG9yZydzIGNvbnN1bXB0aW9uIHBvbGljeSArIGRlY2lkaW5nIGluc3RhbGxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgV0lUSElOIHRoZSBvcmcgKG9yZy1sb2NhbCBvbmx5KS5cbiAgLy8gIC0gYHB1Ymxpc2hlcnM6bWFuYWdlYCAgICAgIOKAlCB0aGUgb3JnJ3MgcHVibGlzaGVyIHByb2ZpbGUgKyBzdWJtaXR0aW5nXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb3N5c3RlbSByZXF1ZXN0cyAoZXZlcnkgZGVjaXNpb24gaXMgc3lzdGVtLW9yZykuXG4gIC8vIFN5c3RlbS1vcmctb25seSAoc2VlIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyk6XG4gIC8vICAtIGBwbHVnaW5zOm1vZGVyYXRlYCAgICAgICDigJQgZGVjaWRlIHB1Ymxpc2ggcmVxdWVzdHMsIG1vZGVyYXRlLCB5YW5rLCBhZHZpc29yaWVzLlxuICAvLyAgLSBgcHVibGlzaGVyczp2ZXJpZnlgICAgICAg4oCUIHB1Ymxpc2hlciB0aWVycywgcHJvZmlsZSBjaGFuZ2VzLCB0cmFuc2ZlcnMuXG4gIHwgJ3BsdWdpbnM6aW5zdGFsbCdcbiAgfCAncGx1Z2luX2luc3RhbGxzOm1hbmFnZSdcbiAgfCAncHVibGlzaGVyczptYW5hZ2UnXG4gIHwgJ3BsdWdpbnM6bW9kZXJhdGUnXG4gIHwgJ3B1Ymxpc2hlcnM6dmVyaWZ5J1xuICAvLyBQbGF0Zm9ybSBvcGVyYXRpb25zIChzeXN0ZW0tb3JnIG9ubHkpLiBUaGUgY3Jvc3MtdGVuYW50IG9wZXJhdG9yIHN1cmZhY2VzXG4gIC8vIHRoYXQgdXNlZCB0byByZXF1aXJlIHRoZSBzdXBlcmFkbWluIEZMQUcsIHNvIGEgZGVwbG95bWVudCBjYW4gc3RhZmYgdGhlbVxuICAvLyB3aXRoIGEgUm9sZSBpbnN0ZWFkIG9mIGhhbmRpbmcgb3V0IGltcGxpY2l0LWFsbC4gU3BsaXQgYmVjYXVzZSB0aGUgdHdvIGNhcnJ5XG4gIC8vIGRpZmZlcmVudCByaXNrOiByZWFkaW5nIHdoYXQgYSBkZXBsb3kgY29uZmlndXJlZCBpcyBub3QgdGhlIHNhbWUgYXMgbW92aW5nXG4gIC8vIGFub3RoZXIgb3JnYW5pc2F0aW9uJ3MgbW9uZXkuXG4gIHwgJ3BsYXRmb3JtOnJlYWQnXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgT1JHIExJU1QsIHNwbGl0IG91dCBvZiBgcGxhdGZvcm06cmVhZGAgYmVjYXVzZSB0aGF0IG9uZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBkb2luZyB0d28gam9icyB3aXRoIGRpZmZlcmVudCBibGFzdCByYWRpaTogcmVhZGluZyB3aGF0IGFcbiAgLy8gREVQTE9ZIHdhcyBjb25maWd1cmVkIHRvIGRvIChSTFMgbW9kZSwgS01TIHBvc3R1cmUsIHRoZSByZW5kZXJlZCBhbGVydFxuICAvLyBydWxlcykgYW5kIHJlYWRpbmcgdGhlIHJvc3RlciBvZiBldmVyeSBDVVNUT01FUi4gVGhyZWUgb2YgdGhlIGZvdXIgam9iXG4gIC8vIGJ1bmRsZXMgY2FycmllZCBpdCwgYW5kIG9ubHkgb25lIG9mIHRoZW0gd2FudGVkIHRoZSBkZXBsb3kgaW50ZXJuYWxzIOKAlFxuICAvLyBDb25zb2xlIEFkbWluaXN0cmF0b3IgYW5kIFN1cHBvcnQgQWdlbnQgZ290IHRoZW0gcHVyZWx5IGJlY2F1c2UgdGhleSBuZWVkZWRcbiAgLy8gdG8gZmluZCBhbiBvcmcgYnkgbmFtZS5cbiAgLy9cbiAgLy8gU2FtZSBtaXN0YWtlLCBhbmQgc2FtZSBmaXgsIGFzIGBjb25zb2xlczpkYXRhc3RvcmVgIGJlZm9yZSBpdCB3YXMgc3BsaXQgYnlcbiAgLy8gd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzLlxuICB8ICdvcmdzOnJlYWQnXG4gIHwgJ2JpbGxpbmc6b3BlcmF0ZSdcbiAgLy8gVGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBzcGxpdCBieSBCTEFTVCBSQURJVVMgcmF0aGVyIHRoYW4gYnkgcHJvZHVjdC4gVGhyZWVcbiAgLy8gcGVybWlzc2lvbnMgZm9yIGZpdmUgY29uc29sZXMsIGJlY2F1c2Ugd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzIGRpZmZlcnNcbiAgLy8gYnkgYW4gb3JkZXIgb2YgbWFnbml0dWRlIGF0IGVhY2ggc3RlcDpcbiAgLy9cbiAgLy8gIC0gYG9ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuYCDigJQgR3JhZmFuYSBhbmQgS2lhbGkuIFJlYWQtb25seSB2aWV3czsgdGhlIHdvcnN0XG4gIC8vICAgIG91dGNvbWUgb2YgYSBtaXN0YWtlbiBncmFudCBpcyBzZWVpbmcgdGVsZW1ldHJ5LlxuICAvLyAgLSBgZGF0YWJhc2VfY29uc29sZTpvcGVuYCAgICAg4oCUIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MuIEEgZGF0YWJhc2Ugc2hlbGxcbiAgLy8gICAgb3ZlciBldmVyeSB0ZW5hbnQncyByb3dzOiBpdCBjYW4gcmVhZCBhbmQgcmV3cml0ZSB0ZW5hbnQgZGF0YSwgYnV0IHRoZVxuICAvLyAgICBhdWRpdCBjaGFpbiBsaXZlcyBlbHNld2hlcmUsIHNvIHRoZSBkYW1hZ2UgaXMgcmVjb3JkZWQuXG4gIC8vICAtIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gICAg4oCUIHRoZSBSdXN0RlMgKFMzKSBjb25zb2xlLiBJdCBjYW4gTElTVCBhbmRcbiAgLy8gICAgREVMRVRFIG9iamVjdHMgaW4gdGhlIHJlZ2lzdHJ5LCBMb2tpLCBUaGFub3MsIHBsdWdpbi1idWlsZCBhbmRcbiAgLy8gICAgYXVkaXQtY2hhaW4gYnVja2V0cy4gU3BsaXQgZnJvbSB0aGUgcGFpciBhYm92ZSBiZWNhdXNlIHRoZSB0d28gYXJlIHRoZVxuICAvLyAgICB0d28gSEFMVkVTIG9mIHRoZSBhdWRpdCB0YW1wZXItZXZpZGVuY2UgZGVzaWduOiB0aGUgY2hhaW4ncyBITUFDIGtleVxuICAvLyAgICBsaXZlcyBvdXRzaWRlIHRoZSBEQiwgc28gYSBNb25nbyBzaGVsbCBjYW4gdGFtcGVyIGJ1dCBjYW5ub3QgZm9yZ2UgYVxuICAvLyAgICBjb25zaXN0ZW50IGNoYWluIOKAlCBleGNlcHQgYnkgdHJ1bmNhdGluZyB0aGUgdGFpbCwgd2hpY2ggYSBjaGFpbiBjYW5ub3RcbiAgLy8gICAgc2VlIGZyb20gdGhlIGluc2lkZSwgYW5kIHRoZSBkZWZlbmNlIGFnYWluc3QgVEhBVCBpcyB0aGUgc2lnbmVkXG4gIC8vICAgIGNoYWluLWhlYWQgZXhwb3J0IHRvIG9iamVjdCBzdG9yYWdlLiBPbmUgc2hlbGwgY2FuIHRydW5jYXRlOyB0aGUgb3RoZXJcbiAgLy8gICAgY2FuIGRlbGV0ZSB0aGUgaGVhZHMgdGhhdCB3b3VsZCBleHBvc2UgdGhlIHRydW5jYXRpb24uXG4gIC8vXG4gIC8vIEFsbCB0aHJlZSBhcmUgc3lzdGVtLW9yZy1vbmx5LCBzbyBub25lIGNhbiBiZSBoZWxkIGluc2lkZSBhIHRlbmFudCwgYW5kIG9ubHlcbiAgLy8gdGhlIGZpcnN0IGlzIGluIHRoZSBQbGF0Zm9ybSBPcGVyYXRvciBidW5kbGU6IHN0YWZmaW5nIGFuIG9wZXJhdG9yIG11c3QgbmV2ZXJcbiAgLy8gaGFuZCBvdmVyIGEgZGF0YSBzaGVsbCBhcyBhIHNpZGUgZWZmZWN0LiBHcmFudGluZyBlaXRoZXIgb2YgdGhlIG90aGVyIHR3byBpc1xuICAvLyBhIHNlcGFyYXRlLCBleHBsaWNpdCBhY3QgYnkgYSBzdXBlcmFkbWluIGNvbXBvc2luZyBhIFJvbGUgZm9yIGV4YWN0bHkgdGhhdFxuICAvLyBwdXJwb3NlLlxuICAvL1xuICAvLyBXSEFUIFRIRSBTUExJVCBET0VTIE5PVCBETywgc28gbm9ib2R5IGJ1aWxkcyBvbiBpdDogaXQgaXMgbm90IGEgY29udGFpbm1lbnRcbiAgLy8gYm91bmRhcnkuIFJvbGVzIGxpdmUgaW4gTW9uZ28gKGBjb2xsZWN0aW9uOiAncm9sZXMnYCksIHNvIGFcbiAgLy8gYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgaG9sZGVyIGNhbiB3cml0ZSB0aGF0IGNvbGxlY3Rpb24gYW5kIGdyYW50IHRoZW1zZWx2ZXNcbiAgLy8gYG9iamVjdHN0b3JlX2NvbnNvbGU6b3BlbmAg4oCUIGRhdGFzdG9yZSBjb250YWlucyBvYmplY3RzdG9yZSBieSBlc2NhbGF0aW9uLiBUaGVcbiAgLy8gc3BsaXQgZXhwcmVzc2VzIGludGVudCwga2VlcHMgdGhlIGRlZmF1bHQgZ3JhbnQgc21hbGwgYW5kIGdpdmVzIGVhY2ggY2xhc3NcbiAgLy8gaXRzIG93biByZWZ1c2FsIHNpZ25hbC4gV2hhdCBhY3R1YWxseSBwcm90ZWN0cyB0aGUgYXVkaXQgaGVhZHMgZnJvbSB3aG9ldmVyXG4gIC8vIG9wZW5zIHRoYXQgY29uc29sZSBpcyBTMyBPYmplY3QgTG9jayB3aXRoIGEgcmV0YWluLXVudGlsLWRhdGVcbiAgLy8gKGBwbGF0Zm9ybS9zcmMvc2VydmljZXMvYXVkaXQtaGVhZC1leHBvcnQudHNgKSwgd2hpY2ggaG9sZHMgcmVnYXJkbGVzcyBvZlxuICAvLyBhbnkgcGVybWlzc2lvbiBoZXJlLlxuICB8ICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbidcbiAgfCAnZGF0YWJhc2VfY29uc29sZTpvcGVuJ1xuICB8ICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nXG4gIC8vIE9uLWNhbGwgKHN5c3RlbS1vcmcgb25seSkuIFJlYWRzIHRoZSBwYWdpbmcgUE9TVFVSRSBhbmQgc2VuZHMgYSB0ZXN0IHBhZ2UuXG4gIC8vIE5vdCBhIHNjaGVkdWxlIGVkaXRvciDigJQgdGhlIHByb3ZpZGVyIG93bnMgdGhlIHJvdGEg4oCUIGFuZCBkZWxpYmVyYXRlbHkgbm90IGFcbiAgLy8gc2V0dGluZ3Mgc3VyZmFjZSBlaXRoZXIsIGJlY2F1c2UgZXZlcnkga25vYiBpcyBvcGVyYXRvci1zaWRlIGVudi4gV2hhdCBpdFxuICAvLyBncmFudHMgaXMgdGhlIG9uZSB0aGluZyBhIHByb2R1Y3Qgc3VyZmFjZSBjYW4gZ2l2ZSB0aGF0IGEgc2hlbGwgY2Fubm90OlxuICAvLyBcIndpbGwgd2UgYWN0dWFsbHkgYmUgcGFnZWRcIiwgYW5zd2VyYWJsZSB3aXRob3V0IGNsdXN0ZXIgYWNjZXNzLlxuICB8ICdvbmNhbGw6bWFuYWdlJ1xuICAvLyBUaGUgdmVuZG9yJ3Mgb3RoZXIgb3BlcmF0aW9uYWwgVEFTS1MgKHN5c3RlbSBvcmcgb25seSkuIEVhY2ggZXhpc3RzIHNvIGFcbiAgLy8gc3VwZXJhZG1pbiBjYW4gc3RhZmYgb25lIGpvYiB3aXRoIGEgUm9sZSBpbnN0ZWFkIG9mIHRoZSBzdXBlcmFkbWluIGZsYWcg4oCUXG4gIC8vIGJlZm9yZSB0aGVzZSwgMzQgcm91dGVzIHdlcmUgcmVhY2hhYmxlIG9ubHkgYnkgc29tZW9uZSB3aG8gYWxzbyBoZWxkXG4gIC8vIGltcGVyc29uYXRpb24sIGEgZGF0YWJhc2Ugc2hlbGwgYW5kIHRoZSBhYmlsaXR5IHRvIG1pbnQgYW5vdGhlciBzdXBlcmFkbWluLlxuICAvL1xuICAvLyBTdXBwb3J0IGRlc2ssIHNwbGl0IGluIHR3byBiZWNhdXNlIHRoZSBjb250ZW50IGlzIHJldXNlZCBhY3Jvc3MgZXZlcnlcbiAgLy8gY3VzdG9tZXIgd2hpbGUgYSBjYXNlIGJlbG9uZ3MgdG8gb25lOiBgc3VwcG9ydF9jYXNlczp3cml0ZWAgaXMgdGhlIGRlc2snc1xuICAvLyBvd24gd29yayAodHJpYWdlLCBhc3NpZ25tZW50LCBzZXZlcml0eSwgaW50ZXJuYWwgbm90ZXMsIHJlY29yZGluZyBhblxuICAvLyBpbmNpZGVudCBhZ2FpbnN0IGEgc3VwcG9ydCBjb250cmFjdCksIGBzdXBwb3J0X2NvbnRlbnQ6d3JpdGVgIGlzIGF1dGhvcmluZ1xuICAvLyB0aGUgY2FubmVkIHJlcGxpZXMuIEVhY2ggZ2F0ZXMgaXRzIHRhc2sncyBSRUFEUyBhcyB3ZWxsIGFzIGl0cyB3cml0ZXMsXG4gIC8vIGFnYWluc3QgdGhlIHVzdWFsIGNvbnZlbnRpb24sIGJlY2F1c2UgdGhlc2UgdGFibGVzIGNhcnJ5IG5vIGBvcmdfaWRgIOKAlCB0aGVyZVxuICAvLyBpcyBubyB0ZW5hbmN5IGJvdW5kYXJ5IHVuZGVybmVhdGggdG8gZmFsbCBiYWNrIG9uLlxuICB8ICdzdXBwb3J0X2Nhc2VzOndyaXRlJ1xuICB8ICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnXG4gIC8vIENyb3NzLXRlbmFudCBzdWJzY3JpcHRpb25zLiBSZWFkIGlzIHNwbGl0IGZyb20gd3JpdGUgYmVjYXVzZSBhIHJlYWQtb25seVxuICAvLyBob2xkZXIgaXMgYSByZWFsIGpvYiBoZXJlOiBzb21lb25lIHdobyByZXBvcnRzIG9uIHJldmVudWUgYW5kIHBsYW4gbWl4XG4gIC8vIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBjaGFuZ2UgYSBwbGFuIG9yIGNhbmNlbCBvbmUuXG4gIHwgJ3N1YnNjcmlwdGlvbnM6cmVhZCdcbiAgfCAnc3Vic2NyaXB0aW9uczptYW5hZ2UnXG4gIC8vIFRoZSBvcmcgbGlmZWN5Y2xlIEFDUk9TUyB0ZW5hbnRzOiByZW5hbWUsIGRlbGV0ZSwgY2hhbmdlIHRpZXIsIG1vdmUgdW5kZXIgYVxuICAvLyBuZXcgcGFyZW50LiBEaXN0aW5jdCBmcm9tIGBvcmdfc2V0dGluZ3M6d3JpdGVgLCB3aGljaCBpcyBhbiBvcmcgYWN0aW5nIG9uXG4gIC8vIGl0c2VsZi5cbiAgfCAnb3JnczptYW5hZ2UnXG4gIC8vIENyb3NzLXRlbmFudCBxdW90YSB3cml0ZXMuIFRoZSBtYXRjaGluZyByZWFkcyAoYC9xdW90YXMvYWxsYCwgYC9hdC1yaXNrYClcbiAgLy8gcmlkZSBgcGxhdGZvcm06cmVhZGAgd2l0aCB0aGUgcmVzdCBvZiB0aGUgb3BlcmF0b3IgZGFzaGJvYXJkLCBzbyBzb21lb25lXG4gIC8vIHdhdGNoaW5nIGZvciBleGhhdXN0aW9uIGRvZXMgbm90IG5lZWQgdGhlIGFiaWxpdHkgdG8gcmFpc2UgYSBsaW1pdC5cbiAgfCAncXVvdGFzOm1hbmFnZSdcbiAgLy8gVGhlIHBsdWdpbiBCVUlMRCBxdWV1ZSDigJQgZGVwdGgsIHN0YWxscywgYW5kIHB1cmdpbmcgdGhlIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAvLyBEaXN0aW5jdCBmcm9tIGBwbHVnaW5zOm1vZGVyYXRlYCwgd2hpY2ggaXMgZWNvc3lzdGVtIGdvdmVybmFuY2U6IHRoaXMgaXNcbiAgLy8gaW5mcmFzdHJ1Y3R1cmUsIGFuZCB0aGUgcGVvcGxlIHdobyBydW4gaXQgYXJlIG5vdCB0aGUgcGVvcGxlIHdobyByZXZpZXdcbiAgLy8gc3VibWlzc2lvbnMuXG4gIHwgJ3BsdWdpbl9xdWV1ZTptYW5hZ2UnXG4gIC8vIENvbXBsaWFuY2VcbiAgfCAnY29tcGxpYW5jZTpyZWFkJ1xuICB8ICdjb21wbGlhbmNlOndyaXRlJ1xuICAvLyBNZW1iZXJzICYgYWNjZXNzXG4gIHwgJ21lbWJlcnM6bWFuYWdlJ1xuICB8ICdyb2xlczptYW5hZ2UnXG4gIHwgJ2ludml0YXRpb25zOm1hbmFnZSdcbiAgLy8gT3JnLXNjb3BlZCBzZXJ2aWNlIGFjY291bnRzIChub24taHVtYW4gcHJpbmNpcGFscykgYW5kIHRoZWlyIGFjY2VzcyBrZXlzLlxuICAvLyBTcGxpdCBvdXQgb2YgYG1lbWJlcnM6bWFuYWdlYCBiZWNhdXNlIGEgc2VydmljZSBhY2NvdW50IGlzIGEgQ1JFREVOVElBTFxuICAvLyBob2xkZXIsIG5vdCBhIHBlcnNvbjogZ3JhbnRpbmcgc29tZW9uZSB0aGUgYWJpbGl0eSB0byBtaW50IGxvbmctbGl2ZWRcbiAgLy8gbWFjaGluZSBrZXlzIGlzIGEgZGlmZmVyZW50IGRlY2lzaW9uIGZyb20gbGV0dGluZyB0aGVtIG1hbmFnZSB0aGUgcm9zdGVyLlxuICB8ICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZSdcbiAgLy8gT2JzZXJ2YWJpbGl0eVxuICB8ICdkYXNoYm9hcmRzOnJlYWQnXG4gIHwgJ2Rhc2hib2FyZHM6d3JpdGUnXG4gIHwgJ29ic2VydmFiaWxpdHk6cmVhZCdcbiAgfCAnb2JzZXJ2YWJpbGl0eTp3cml0ZSdcbiAgLy8gYGxvZ3M6ZXhwb3J0YCBpcyBzcGxpdCBPVVQgb2YgYG9ic2VydmFiaWxpdHk6cmVhZGAgZGVsaWJlcmF0ZWx5LiBSZWFkaW5nXG4gIC8vIGxvZ3MgaW4gdGhlIFVJIGlzIHBhZ2VkIGFuZCBlcGhlbWVyYWw7IEVYUE9SVElORyB0aGVtIGlzIGJ1bGsgZWdyZXNzIHRoYXRcbiAgLy8gbGVhdmVzIHRoZSBidWlsZGluZyBhbmQgb3V0bGl2ZXMgYSByZXZva2VkIHNlc3Npb24sIHNvIGFuIG9yZyBhZG1pbiBtdXN0IGJlXG4gIC8vIGFibGUgdG8gZ3JhbnQgbG9nIHZpZXdpbmcgd2l0aG91dCBncmFudGluZyBkb3dubG9hZHMuXG4gIHwgJ2xvZ3M6ZXhwb3J0J1xuICAvLyBUaGUgb3JnJ3Mgb3duIGhhc2gtY2hhaW5lZCBhdWRpdCB0cmFpbC4gT1JHLUFTU0lHTkFCTEUsIHVubGlrZSB0aGUgcGxhdGZvcm1cbiAgLy8gb3BlcmF0aW9ucyBwYWlyOiB0aGUgcm93cyBhbiBvcmcgcmVhZHMgYXJlIGl0cyBvd24gKHRoZSBxdWVyeSBwcmVkaWNhdGUgaXNcbiAgLy8gYG9yZ0lkYCBPUiBgYWZmZWN0ZWRPcmdJZGApLCBzbyBkZWxlZ2F0aW5nIGl0IGlzIGFuIG9yZydzIGRlY2lzaW9uIOKAlCBhXG4gIC8vIGNvbXBsaWFuY2UgcmV2aWV3ZXIgY2FuIGJlIGdpdmVuIHRoZSB0cmFpbCB3aXRob3V0IGJlaW5nIG1hZGUgYW4gYWRtaW4gb2ZcbiAgLy8gZXZlcnl0aGluZyB0aGF0IHByb2R1Y2VkIGl0LiBSZWFkLW9ubHkgYnkgY29uc3RydWN0aW9uOyB0aGVyZSBpcyBubyB3cml0ZS5cbiAgfCAnYXVkaXQ6cmVhZCdcbiAgLy8gSW5zaWdodHNcbiAgfCAncmVwb3J0czpyZWFkJ1xuICB8ICdyZXBvcnRzOnJvbGx1cCdcbiAgLy8gU3Rha2Vob2xkZXIgcmVwb3J0cy4gYHJlcG9ydHM6cmVhZGAgc3RheXMgdGhlIEZSRUUgb24tZGVtYW5kIGRhc2hib2FyZCByZWFkO1xuICAvLyB0aGVzZSB0d28gYXJlIHRoZSBhZGQtb24ncyB3cml0ZSBzdXJmYWNlIOKAlCBgYXV0aG9yYCBzYXZlcy9zY2hlZHVsZXMvZHJhZnRzIGFcbiAgLy8gcmVwb3J0LCBgc2hhcmVgIHB1Ymxpc2hlcyBpdCBiZXlvbmQgdGhlIHBsYXRmb3JtIChQREYsIGVtYWlsLCBzaGFyZSBsaW5rcykuXG4gIC8vIFNwbGl0IGJlY2F1c2UgcHVibGlzaGluZyBleHRlcm5hbGx5IGlzIGEgZGlmZmVyZW50IHJpc2sgZnJvbSBjb21wb3Npbmc6XG4gIC8vIGEgbGVhZCBjYW4gYmUgYWxsb3dlZCB0byBidWlsZCByZXBvcnRzIHdpdGhvdXQgYmVpbmcgYWxsb3dlZCB0byBlbWFpbCB0aGVtIG91dC5cbiAgfCAncmVwb3J0czp3cml0ZSdcbiAgfCAncmVwb3J0czpwdWJsaXNoJ1xuICAvLyBNZXNzYWdpbmdcbiAgfCAnbWVzc2FnZXM6cmVhZCdcbiAgfCAnbWVzc2FnZXM6d3JpdGUnXG4gIC8vIEJpbGxpbmcgJiBxdW90YXNcbiAgfCAnYmlsbGluZzpyZWFkJ1xuICB8ICdiaWxsaW5nOm1hbmFnZSdcbiAgfCAncXVvdGFzOnJlYWQnXG4gIC8vIEltcGVyc29uYXRpb24g4oCUIHZpZXdpbmcgdGhlIHBsYXRmb3JtIGFzIHNvbWVib2R5IGVsc2UuIFRocmVlIGlkcywgYmVjYXVzZVxuICAvLyB0aHJlZSBkaWZmZXJlbnQgcGFydGllcyBhcmUgaW52b2x2ZWQgYW5kIGVhY2ggZGVjaXNpb24gYmVsb25ncyB0byBhXG4gIC8vIGRpZmZlcmVudCBvbmUgb2YgdGhlbSAoZG9jcy9wZXJtaXNzaW9ucy5tZCNpbXBlcnNvbmF0aW9uKTpcbiAgLy8gIC0gYGltcGVyc29uYXRpb246b3BlbmAgICB0aGUgVkVORE9SIG9wZW5pbmcgYSBjcm9zcy10ZW5hbnQgc2Vzc2lvbiwgd2hpY2hcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzeXN0ZW0tb3JnLW9ubHkgYW5kIHN0aWxsIGNvbnNlbnQtZ2F0ZWQ7XG4gIC8vICAtIGB0ZWFtX2FjY2VzczpvcGVuYCAgICAgYSBQQVJFTlQgb3JnJ3MgYWRtaW4gdmlld2luZyBvbmUgb2YgaXRzIG93biB0ZWFtcydcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLCB3aGljaCBuZXZlciBsZWF2ZXMgdGhlIHRlbmFudDtcbiAgLy8gIC0gYGltcGVyc29uYXRpb246YXBwcm92ZWAgdGhlIFRFTkFOVCBhbnN3ZXJpbmcgYSBjb25zZW50IHJlcXVlc3QuXG4gIC8vIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAgYmVsb3cgaXMgYSBmb3VydGggdGhpbmcgYWdhaW46IHRoZSBQT0xJQ1kgdGhhdFxuICAvLyBkZWNpZGVzIHdoZXRoZXIgY29uc2VudCBpcyBuZWVkZWQgYXQgYWxsLlxuICB8ICdpbXBlcnNvbmF0aW9uOm9wZW4nXG4gIHwgJ2ltcGVyc29uYXRpb246YXBwcm92ZSdcbiAgfCAndGVhbV9hY2Nlc3M6b3BlbidcbiAgLy8gUmVnaXN0cnkuIFRocmVlIHJ1bmdzLCBiZWNhdXNlIHRoZSB3cml0ZSBoYWxmIGhhcyB0d28gdmVyeSBkaWZmZXJlbnRcbiAgLy8gYmxhc3QgcmFkaWk6IGB3cml0ZWAgQ09QSUVTIGEgbWFuaWZlc3QgKGFkZGl0aXZlIOKAlCBpdCBjcmVhdGVzIGEgdGFnLFxuICAvLyBub3RoaW5nIHN0b3BzIHJlc29sdmluZyksIGBwdXJnZWAgREVMRVRFUyBvbmUgKGEgdGVuYW50J3MgcGlwZWxpbmUgb3IgYVxuICAvLyBkaWdlc3QtcGlubmVkIHBsdWdpbiBpbWFnZSBjYW4gc3RvcCByZXNvbHZpbmcsIHdpdGggbm8gdW5kbykuXG4gIHwgJ3JlZ2lzdHJ5OnJlYWQnXG4gIHwgJ3JlZ2lzdHJ5OndyaXRlJ1xuICB8ICdyZWdpc3RyeTpwdXJnZSdcbiAgLy8gT3JnYW5pemF0aW9uIHNldHRpbmdzLiBGb3VyIFJFU09VUkNFUywgZWFjaCB3aXRoIHRoZSBgOndyaXRlYCBhY3Rpb24sIHJhdGhlclxuICAvLyB0aGFuIG9uZSBgb3JnYCByZXNvdXJjZSB3aXRoIGZvdXIgbm91bi1zaGFwZWQgYWN0aW9ucyDigJQgdGhlc2UgYXJlIHRoZSBvcmcnc1xuICAvLyBvd24gY29uZmlndXJhdGlvbiBzdGF0ZSwgd2hpY2ggaXMgd2hhdCBgOndyaXRlYCBtZWFucyBoZXJlIChgOm1hbmFnZWAgaXNcbiAgLy8gcmVzZXJ2ZWQgZm9yIGFkbWluaXN0ZXJpbmcgYSBjb2xsZWN0aW9uIG9mIG90aGVyIGVudGl0aWVzOiBtZW1iZXJzLCByb2xlcyxcbiAgLy8gaW52aXRhdGlvbnMsIHNlcnZpY2UgYWNjb3VudHMsIGJpbGxpbmcpLlxuICAvL1xuICAvLyAgLSBgb3JnX3NldHRpbmdzOndyaXRlYCAgICAgIOKAlCBnZW5lcmFsIG9yZyBzZXR0aW5ncyArIEFJIGNvbmZpZy5cbiAgLy8gIC0gYG9yZ19pZHA6d3JpdGVgICAgICAgICAgICDigJQgU1NPIC8gSWRQIGNvbmZpZ3VyYXRpb24gKHNlbnNpdGl2ZTogY29udHJvbHMgbG9naW4pLlxuICAvLyAgLSBgb3JnX2ttczp3cml0ZWAgICAgICAgICAgIOKAlCBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXkgY29uZmlndXJhdGlvblxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbnNpdGl2ZTogY29udHJvbHMgZW5jcnlwdGlvbiBvZiBvcmcgZGF0YSkuXG4gIC8vICAtIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAg4oCUIHRoZSBpbXBlcnNvbmF0aW9uIHBvbGljeSAoc2Vuc2l0aXZlOiBjb250cm9sc1xuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvIG1heSBWSUVXIHRoZSBvcmcncyBkYXRhIGFzIGEgbWVtYmVyKS5cbiAgLy9cbiAgLy8gVGhlIGxhc3QgdGhyZWUgd2VyZSBzcGxpdCBPVVQgb2YgYG9yZ19zZXR0aW5nczp3cml0ZWAgc28gYSBjdXN0b20gcm9sZSBjYW5cbiAgLy8gZ3JhbnQgZ2VuZXJhbCBzZXR0aW5ncyBXSVRIT1VUIHRoZSBzZW5zaXRpdmUgc3VyZmFjZXMg4oCUIGEgXCJzZXR0aW5ncyBtYW5hZ2VyXCJcbiAgLy8gcm9sZSBmb3Igb3JnIG5hbWUgb3IgQUkgcHJvdmlkZXIgbXVzdCBub3QgYWxzbyBiZSBhYmxlIHRvIHN3aXRjaCB0aGUgb3JnIHRvXG4gIC8vIGBvcGVuYC4gQWxsIHJlbWFpbiBvcmctYXNzaWduYWJsZSBhbmQgYXJlIHNlZWRlZCBpbnRvIHRoZSBhZG1pbi9vd25lclxuICAvLyBidW5kbGVzICh2aWEgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlMpIHNvIGV4aXN0aW5nIGFkbWlucyBrZWVwIGZ1bGxcbiAgLy8gYWNjZXNzLlxuICB8ICdvcmdfc2V0dGluZ3M6d3JpdGUnXG4gIHwgJ29yZ19pZHA6d3JpdGUnXG4gIHwgJ29yZ19rbXM6d3JpdGUnXG4gIHwgJ29yZ19pbXBlcnNvbmF0aW9uOndyaXRlJztcblxuLyoqXG4gKiBUaGUgQ0xPU0VEIHNldCBvZiBhY3Rpb25zIGEgcGVybWlzc2lvbiBpZCBtYXkgZW5kIGluIOKAlCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlXG4gKiBgcmVzb3VyY2U6YWN0aW9uYCBzdHJhdGVneSB0aGUgZG9jcyBkZXNjcmliZS5cbiAqXG4gKiBJdCBpcyBjbG9zZWQgZm9yIG9uZSBjb25jcmV0ZSByZWFzb246IGBpc011dGF0aW9uUGVybWlzc2lvbmAgKGZyb250ZW5kXG4gKiBgbGliL2F1dGgtaGVscGVycy50c2ApIGNsYXNzaWZpZXMgcmVhZCB2cyB3cml0ZSBCWSBTVUZGSVgsIGFuZCB0aGF0IGlzIHdoYXRcbiAqIGRpc2FibGVzIGV2ZXJ5IHdyaXRlIGFmZm9yZGFuY2UgZHVyaW5nIGEgcmVhZC1vbmx5IGltcGVyc29uYXRpb24gc2Vzc2lvbi4gQVxuICogbm91bi1zaGFwZWQgYWN0aW9uICh0aGUgZm9ybWVyIGBvcmc6c2V0dGluZ3NgIGFuZCBgY29uc29sZXM6ZGF0YXN0b3JlYCkgY2Fubm90IGJlIGNsYXNzaWZpZWRcbiAqIGJ5IG5hbWUsIHNvIGVhY2ggb25lIGhhZCB0byBiZSBoYW5kLWxpc3RlZCDigJQgYW5kIGEgcGVybWlzc2lvbiBhZGRlZCB3aXRob3V0XG4gKiByZW1lbWJlcmluZyB0aGF0IGxpc3QgcmVuZGVycyBhbiBlbmFibGVkIGNvbnRyb2wgdGhhdCBkZWFkLWVuZHMgb24gYSA0MDMuXG4gKlxuICogUmVhZHMgYXJlIGA6cmVhZGAgYW5kIGA6cm9sbHVwYCAoYSByZWFkLVZJU0lCSUxJVFkgc2NvcGUpLiBFdmVyeXRoaW5nIGVsc2UgaXNcbiAqIGEgd3JpdGUuIFRoZSBmaXZlIGRvbWFpbiB2ZXJicyBhcmUga2VwdCBiZWNhdXNlIGVhY2ggbmFtZXMgYW4gYWN0aW9uIHdpdGggbm9cbiAqIHN5bm9ueW0gaW4gdGhpcyB2b2NhYnVsYXJ5IOKAlCBgOmV4cG9ydGAgaXMgZWdyZXNzIHJhdGhlciB0aGFuIG11dGF0aW9uLFxuICogYDppbnN0YWxsYCBpcyBjb25zdW1wdGlvbiByYXRoZXIgdGhhbiBhdXRob3JpbmcsIGA6bW9kZXJhdGVgIGFuZCBgOnZlcmlmeWAgYXJlXG4gKiBlY29zeXN0ZW0gZGVjaXNpb25zLCBhbmQgYDpvcGVyYXRlYCBtb3ZlcyBhbm90aGVyIHRlbmFudCdzIG1vbmV5LlxuICpcbiAqIGBQRVJNSVNTSU9OX0lEX1NIQVBFYCBhbmQgdGhpcyBsaXN0IGFyZSBhc3NlcnRlZCBvdmVyIHRoZSB3aG9sZSBjYXRhbG9nIGluXG4gKiBhcGktY29yZSdzIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgLCBzbyBhZGRpbmcgYW4gb2ZmLXN0cmF0ZWd5IGlkIGZhaWxzXG4gKiB0aGVyZSByYXRoZXIgdGhhbiBhdCBhIDQwMy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fQUNUSU9OUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdyZWFkJywgJ3JvbGx1cCcsXG4gICd3cml0ZScsICdtYW5hZ2UnLCAncHVibGlzaCcsICdvcGVuJyxcbiAgJ2V4cG9ydCcsICdpbnN0YWxsJywgJ21vZGVyYXRlJywgJ3ZlcmlmeScsICdvcGVyYXRlJywgJ3B1cmdlJywgJ2FwcHJvdmUnLFxuXTtcblxuLyoqIGByZXNvdXJjZTphY3Rpb25gLCB3aGVyZSByZXNvdXJjZSBpcyBgc25ha2VfY2FzZWAgYW5kIGFjdGlvbiBpcyBpbiB7QGxpbmsgUEVSTUlTU0lPTl9BQ1RJT05TfS4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0lEX1NIQVBFID0gL15bYS16XVthLXowLTlfXSo6W2Etel0rJC87XG5cbi8qKiBBbGwgdmFsaWQgcGVybWlzc2lvbnMgKG9yZGVyIGRldGVybWluZXMgZGlzcGxheSBvcmRlciBpbiB0aGUgcGlja2VyKS4gKi9cbmV4cG9ydCBjb25zdCBBTExfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczp3cml0ZScsICdwaXBlbGluZXM6cHVibGlzaCcsICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsXG4gICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6d3JpdGUnLCAndGVtcGxhdGVzOnB1Ymxpc2gnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgJ3BsdWdpbnM6aW5zdGFsbCcsICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJywgJ3B1Ymxpc2hlcnM6bWFuYWdlJyxcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLCAncHVibGlzaGVyczp2ZXJpZnknLFxuICAncGxhdGZvcm06cmVhZCcsICdvcmdzOnJlYWQnLCAnYmlsbGluZzpvcGVyYXRlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJywgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAnb25jYWxsOm1hbmFnZScsXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJywgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLCAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLCAncXVvdGFzOm1hbmFnZScsICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsICdjb21wbGlhbmNlOndyaXRlJyxcbiAgJ21lbWJlcnM6bWFuYWdlJywgJ3JvbGVzOm1hbmFnZScsICdpbnZpdGF0aW9uczptYW5hZ2UnLCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLFxuICAnZGFzaGJvYXJkczpyZWFkJywgJ2Rhc2hib2FyZHM6d3JpdGUnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnLFxuICAnbG9nczpleHBvcnQnLCAnYXVkaXQ6cmVhZCcsXG4gICdyZXBvcnRzOnJlYWQnLCAncmVwb3J0czpyb2xsdXAnLCAncmVwb3J0czp3cml0ZScsICdyZXBvcnRzOnB1Ymxpc2gnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLFxuICAncXVvdGFzOnJlYWQnLFxuICAncmVnaXN0cnk6cmVhZCcsICdyZWdpc3RyeTp3cml0ZScsICdyZWdpc3RyeTpwdXJnZScsXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLCAnaW1wZXJzb25hdGlvbjphcHByb3ZlJywgJ3RlYW1fYWNjZXNzOm9wZW4nLFxuICAnb3JnX3NldHRpbmdzOndyaXRlJywgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFRoZSBDTE9TRUQgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSB7QGxpbmsgUGVybWlzc2lvbn0gYW5kIGRlY2lkZSBhY2Nlc3MuXG4gKlxuICogXCJJcyBwZXJtaXNzaW9uIFggZW5mb3JjZWQgYW55d2hlcmU/XCIgaGFzIHRvIGJlIGFuc3dlcmFibGUgc3RhdGljYWxseSwgd2hpY2hcbiAqIGEgZ3JlcCBjYW4ndCBkbzogZm91ciBkaWZmZXJlbnQgY2FsbCBzaGFwZXMgY29uc3VtZSBhIHBlcm1pc3Npb24gaWRcbiAqIChgcmVxdWlyZVBlcm1pc3Npb24oJ3gnKWAgYXQgYSByb3V0ZSwgYHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgJ3gnKWAgaW5zaWRlIGFcbiAqIGNvbnRyb2xsZXIsIGFuZCBgcmVzb2x2ZVZpc2liaWxpdHkocmVxLCB2LCAneCcpYCAvXG4gKiBgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcyjigKYsICd4JylgIGluIHRoZSB2aXNpYmlsaXR5IGhlbHBlcnMpLCBzbyBhIG5haXZlXG4gKiBncmVwIGZvciBhIHJvdXRlLWxldmVsIGdhdGUgcmVwb3J0cyBgdGVtcGxhdGVzOnB1Ymxpc2hgIGFzIFVORU5GT1JDRUQgd2hlbiBpdFxuICogaXMgaW4gZmFjdCBlbmZvcmNlZCBvbiBldmVyeSB0ZW1wbGF0ZSBwdWJsaXNoLlxuICpcbiAqIFRoZXkgYWxsIGJvdHRvbSBvdXQgaW4gYHVzZXJIYXNQZXJtaXNzaW9uYCwgc28gdGhlIFJVTlRJTUUgcHJpbWl0aXZlIHdhc1xuICogYWxyZWFkeSBvbmUuIFRoaXMgY29uc3RhbnQgbWFrZXMgdGhlIFNUQVRJQyBzdXJmYWNlIG9uZSBhcyB3ZWxsOiBpdCBuYW1lc1xuICogZXZlcnkgZW50cnkgcG9pbnQsIHNvIGBwZXJtaXNzaW9uLWNvdmVyYWdlLnRlc3QudHNgIGNhbiBlbnVtZXJhdGUgdGhlIGNhdGFsb2dcbiAqIGFuZCByZXBvcnQgZWFjaCBwZXJtaXNzaW9uJ3MgZW5mb3JjZW1lbnQgc2l0ZXMgd2l0aG91dCBndWVzc2luZy4gQSBuZXcgZ2F0ZVxuICogdGhhdCB0YWtlcyBhIGBQZXJtaXNzaW9uYCBtdXN0IGJlIGxpc3RlZCBoZXJlLCBvciB0aGUgY292ZXJhZ2UgcmVwb3J0IHN0YXJ0c1xuICogbHlpbmcgYWJvdXQgdGhlIHBlcm1pc3Npb25zIG9ubHkgdGhhdCBnYXRlIGVuZm9yY2VzLlxuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9HQVRFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIC8vIE1pZGRsZXdhcmUgZ2F0ZXMgKHJvdXRlIGxldmVsKSDigJQgYWxsIGFueS1vZiBleGNlcHQgcmVxdWlyZUFsbFBlcm1pc3Npb25zLlxuICAncmVxdWlyZVBlcm1pc3Npb24nLFxuICAncmVxdWlyZUFsbFBlcm1pc3Npb25zJyxcbiAgJ3JlcXVpcmVQZXJtaXNzaW9uT3JTZXJ2aWNlJyxcbiAgLy8gVGhlIHBsdWdpbi1lY29zeXN0ZW0gZ292ZXJuYW5jZSBjaGFpbiAoc3lzdGVtIG9yZyArIHBlcm1pc3Npb24gKyBhYWwyKS5cbiAgJ3JlcXVpcmVTeXN0ZW1PcmdQZXJtaXNzaW9uJyxcbiAgLy8gVGhlIHNpbmdsZSBydW50aW1lIHByaW1pdGl2ZSBldmVyeSBnYXRlIGFib3ZlIGRlbGVnYXRlcyB0bzsgYWxzbyBjYWxsZWRcbiAgLy8gZGlyZWN0bHkgd2hlcmUgYSBjb250cm9sbGVyIGJyYW5jaGVzIG9uIGEgY2FwYWJpbGl0eSByYXRoZXIgdGhhbiByZWplY3RpbmcuXG4gICd1c2VySGFzUGVybWlzc2lvbicsXG4gICdoYXNQZXJtaXNzaW9uJyxcbiAgLy8gVmlzaWJpbGl0eSBoZWxwZXJzIOKAlCB0aGV5IHRha2UgdGhlIGVudGl0eSdzIFBVQkxJU0ggcGVybWlzc2lvbi5cbiAgJ3JlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAnY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAncmVzb2x2ZVZpc2liaWxpdHknLFxuICAvLyBxdW90YSdzIG93biB3cmFwcGVyLiBJdCBkZWxlZ2F0ZXMgdG8gYHJlcXVpcmVQZXJtaXNzaW9uYCwgYnV0IGl0IHRha2VzIHRoZVxuICAvLyBpZCBhcyBhbiBPUFRJT04gKGBhdXRob3JpemVPcmcoeyBwZXJtaXNzaW9uOiAncXVvdGFzOm1hbmFnZScgfSlgKSBiZWNhdXNlIGl0XG4gIC8vIGFsc28gY2Fub25pY2FsaXplcyB0aGUgYDpvcmdJZGAgcGFyYW0sIHdoaWNoIHRoZSByb3V0ZSBjYW5ub3QgZHJvcC4gV2l0aG91dFxuICAvLyB0aGlzIGVudHJ5IHRoZSBjb3ZlcmFnZSBzY2FuIHJlcG9ydGVkIGBxdW90YXM6bWFuYWdlYCBhcyBlbmZvcmNlZCBub3doZXJlLlxuICAnYXV0aG9yaXplT3JnJyxcbl07XG5cbi8qKlxuICogRGlzcGxheSBtZXRhZGF0YSBmb3Igb25lIHBlcm1pc3Npb246IHRoZSBsYWJlbCArIGRlc2NyaXB0aW9uIHRoZVxuICogcGVybWlzc2lvbi1waWNrZXIgVUkgc2hvd3MsIGFuZCB0aGUgY2F0ZWdvcnkgaXQgZ3JvdXBzIHVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25NZXRhIHtcbiAgaWQ6IFBlcm1pc3Npb247XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb24gY2F0YWxvZyB3aXRoIGRpc3BsYXkgbWV0YWRhdGEsIGluIHBpY2tlciBvcmRlci5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgU0lOR0xFIGNhdGFsb2cgZm9yIGJhY2tlbmQgYW5kIGJyb3dzZXIgYWxpa2U6IGl0IGhhcyBub1xuICogcnVudGltZSBkZXBlbmRlbmNpZXMgKHRoZSBvbmx5IGltcG9ydCBpcyBhIHR5cGUpLCBzbyB0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdFxuICogdGhyb3VnaCB0aGUgYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3Blcm1pc3Npb25zYCBzdWJwYXRoIGluc3RlYWQgb2Yga2VlcGluZ1xuICogYSBoYW5kLW1haW50YWluZWQgbWlycm9yLiBFdmVyeSBpZCBpbiB7QGxpbmsgQUxMX1BFUk1JU1NJT05TfSBtdXN0IGFwcGVhciBoZXJlXG4gKiBleGFjdGx5IG9uY2UgKGFzc2VydGVkIGJ5IGBwZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0NBVEFMT0c6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10gPSBbXG4gIHsgaWQ6ICdwaXBlbGluZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGlwZWxpbmVzIGFuZCB0aGVpciBleGVjdXRpb25zJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZXMnLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgeyBpZDogJ3BpcGVsaW5lczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwaXBlbGluZXMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsIGxhYmVsOiAnUmVnaXN0ZXIgZGVwbG95bWVudHMnLCBkZXNjcmlwdGlvbjogJ1JlY29yZCBhbmQgcmVtb3ZlIHRoZSBkZXBsb3llZCBzdGFjayBhbmQgc3RlcCBtYW5pZmVzdCBiZWhpbmQgYSBwaXBlbGluZSAodGhlIHBpcGVsaW5lIHJlZ2lzdHJ5KScsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdWaWV3IHRoZSBnb2xkZW4tcGF0aCB0ZW1wbGF0ZSBjYXRhbG9nJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ0F1dGhvciwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZSB0ZW1wbGF0ZXMnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnU2hhcmUgYSB0ZW1wbGF0ZSBiZXlvbmQgeW91ciBvcmcgKHB1YmxpYyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAncGx1Z2luczpyZWFkJywgbGFiZWw6ICdWaWV3IHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGx1Z2lucyBhbmQgYnVpbGRzJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAncGx1Z2luczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgdXBsb2FkLCBlZGl0LCBhbmQgZGVsZXRlIHBsdWdpbnMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwbHVnaW5zIHB1YmxpYyAob3JnLXdpZGUvY2F0YWxvZyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6aW5zdGFsbCcsIGxhYmVsOiAnSW5zdGFsbCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdJbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIGVjb3N5c3RlbSBwbHVnaW5zIChvciByZXF1ZXN0IGFuIGluc3RhbGwgd2hlbiB5b3VyIG9yZyByZXF1aXJlcyBhcHByb3ZhbCknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgcGx1Z2luIGluc3RhbGxzJywgZGVzY3JpcHRpb246IFwiU2V0IHlvdXIgb3JnJ3MgcGx1Z2luIGNvbnN1bXB0aW9uIHBvbGljeSBhbmQgYXBwcm92ZSBvciBkZW55IGluc3RhbGwgcmVxdWVzdHMgd2l0aGluIHRoZSBvcmdcIiwgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncHVibGlzaGVyczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBwdWJsaXNoZXIgcHJvZmlsZScsIGRlc2NyaXB0aW9uOiBcIk1hbmFnZSB5b3VyIG9yZydzIHB1Ymxpc2hlciBwcm9maWxlIGFuZCBzdWJtaXQgcHVibGlzaCwgdmVyaWZpY2F0aW9uLCB0cmFuc2ZlciwgYW5kIGFkdmlzb3J5IHJlcXVlc3RzXCIsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3BsdWdpbnM6bW9kZXJhdGUnLCBsYWJlbDogJ01vZGVyYXRlIHRoZSBwbHVnaW4gZWNvc3lzdGVtJywgZGVzY3JpcHRpb246ICdEZWNpZGUgcHVibGlzaCByZXF1ZXN0cywgbW9kZXJhdGUgc3VibWlzc2lvbnMgYW5kIHJldmlld3MsIHlhbmsgdmVyc2lvbnMsIGFuZCBwdWJsaXNoIGFkdmlzb3JpZXMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwdWJsaXNoZXJzOnZlcmlmeScsIGxhYmVsOiAnVmVyaWZ5IHB1Ymxpc2hlcnMnLCBkZXNjcmlwdGlvbjogJ0FwcHJvdmUgVmVyaWZpZWQgYXBwbGljYXRpb25zLCBwdWJsaXNoZXIgdGllciBhbmQgcHJvZmlsZSBjaGFuZ2VzLCBhbmQgb3duZXJzaGlwIHRyYW5zZmVycyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3BsYXRmb3JtOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGxhdGZvcm0gb3BlcmF0aW9ucycsIGRlc2NyaXB0aW9uOiAnUmVhZCB0aGUgcGxhdGZvcm0gc2V0dGluZ3MgYW5kIHRoZSBjcm9zcy10ZW5hbnQgb3JnYW5pemF0aW9uIGxpc3QgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvcmdzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgYWxsIG9yZ2FuaXphdGlvbnMnLCBkZXNjcmlwdGlvbjogJ0xpc3QgYW5kIG9wZW4gZXZlcnkgb3JnYW5pemF0aW9uIG9uIHRoZSBkZXBsb3ltZW50IFxcdTIwMTQgdGhlIHJvc3RlciB0aGUgb3BlcmF0b3Igc3VyZmFjZXMgd29yayBmcm9tIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnYmlsbGluZzpvcGVyYXRlJywgbGFiZWw6ICdPcGVyYXRlIGRpc2NvdW50cyBhbmQgcHJvbW90aW9ucycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBhcHBseSBhbmQgcmV2b2tlIGRpc2NvdW50IHRva2VucyBhbmQgcHJvbW90aW9uIGNhbXBhaWducyBhY3Jvc3MgdGVuYW50cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJywgbGFiZWw6ICdPcGVuIHRoZSBvYnNlcnZhYmlsaXR5IGNvbnNvbGVzJywgZGVzY3JpcHRpb246ICdPcGVuIEdyYWZhbmEgYW5kIEtpYWxpIOKAlCBkYXNoYm9hcmRzLCB0cmFmZmljIGFuZCBtZXNoIGhlYWx0aCBhY3Jvc3MgZXZlcnkgdGVuYW50IChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnZGF0YWJhc2VfY29uc29sZTpvcGVuJywgbGFiZWw6ICdPcGVuIHRoZSBkYXRhYmFzZSBjb25zb2xlcycsIGRlc2NyaXB0aW9uOiAnT3BlbiBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzIOKAlCBhIGRpcmVjdCByZWFkL3dyaXRlIHNoZWxsIG92ZXIgZXZlcnkgdGVuYW50XFx1MjAxOXMgcm93cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsIGxhYmVsOiAnT3BlbiB0aGUgb2JqZWN0LXN0b3JlIGNvbnNvbGUnLCBkZXNjcmlwdGlvbjogJ09wZW4gdGhlIFJ1c3RGUyAoUzMpIGNvbnNvbGUg4oCUIGxpc3QgYW5kIGRlbGV0ZSBvYmplY3RzIGluIGV2ZXJ5IGJ1Y2tldCwgaW5jbHVkaW5nIHRoZSBhdWRpdCBjaGFpbiAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29uY2FsbDptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBvbi1jYWxsIHBhZ2luZycsIGRlc2NyaXB0aW9uOiAnUmVhZCB0aGUgcGFnaW5nIHBvc3R1cmUgYW5kIHNlbmQgYSB0ZXN0IHBhZ2UgKHN5c3RlbSBvcmcgb25seTsgdGhlIHJvdGEgbGl2ZXMgd2l0aCB0aGUgcHJvdmlkZXIpJywgY2F0ZWdvcnk6ICdPbi1jYWxsJyB9LFxuICB7IGlkOiAnc3VwcG9ydF9jYXNlczp3cml0ZScsIGxhYmVsOiAnV29yayB0aGUgc3VwcG9ydCBkZXNrJywgZGVzY3JpcHRpb246ICdUcmlhZ2UgdGhlIHN1cHBvcnQgcXVldWUsIGFzc2lnbiBhbmQgcmUtcHJpb3JpdGlzZSBjYXNlcywgd3JpdGUgaW50ZXJuYWwgbm90ZXMsIGFuZCByZWNvcmQgaW5jaWRlbnRzIGFnYWluc3QgYSBzdXBwb3J0IGNvbnRyYWN0IChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdTdXBwb3J0IGRlc2snIH0sXG4gIHsgaWQ6ICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnLCBsYWJlbDogJ0F1dGhvciBjYW5uZWQgcmVwbGllcycsIGRlc2NyaXB0aW9uOiAnV3JpdGUgYW5kIHJldGlyZSB0aGUgcmV1c2FibGUgc3VwcG9ydCByZXBsaWVzIG9mZmVyZWQgdG8gZXZlcnkgY3VzdG9tZXIgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1N1cHBvcnQgZGVzaycgfSxcbiAgeyBpZDogJ3N1YnNjcmlwdGlvbnM6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGwgc3Vic2NyaXB0aW9ucycsIGRlc2NyaXB0aW9uOiAnVmlldyBldmVyeSBvcmdhbml6YXRpb25cXHUyMDE5cyBzdWJzY3JpcHRpb24sIHBsYW4gbWl4IGFuZCBiaWxsaW5nIGV2ZW50cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJywgbGFiZWw6ICdDaGFuZ2UgYW55IHN1YnNjcmlwdGlvbicsIGRlc2NyaXB0aW9uOiAnQ2hhbmdlIGEgcGxhbiwgc2V0IGEgc3VwcG9ydCBmbG9vciwgYW5kIGNhbmNlbCBhbiBvcmdhbml6YXRpb25cXHUyMDE5cyBzdWJzY3JpcHRpb24gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvcmdzOm1hbmFnZScsIGxhYmVsOiAnQWRtaW5pc3RlciBhbnkgb3JnYW5pemF0aW9uJywgZGVzY3JpcHRpb246ICdSZW5hbWUsIHJlLXRpZXIsIG1vdmUgYW5kIGRlbGV0ZSBhbnkgb3JnYW5pemF0aW9uIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAncXVvdGFzOm1hbmFnZScsIGxhYmVsOiAnQ2hhbmdlIGFueSBxdW90YScsIGRlc2NyaXB0aW9uOiAnUmFpc2UsIHJlc2V0IGFuZCBjbGVhciBhbm90aGVyIG9yZ2FuaXphdGlvblxcdTIwMTlzIHF1b3RhcyAoc3lzdGVtIG9yZyBvbmx5OyB2aWV3aW5nIHRoZW0gcmlkZXMgcGxhdGZvcm06cmVhZCknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5fcXVldWU6bWFuYWdlJywgbGFiZWw6ICdSdW4gdGhlIHBsdWdpbiBidWlsZCBxdWV1ZScsIGRlc2NyaXB0aW9uOiAnUmVhZCBidWlsZC1xdWV1ZSBkZXB0aCBhbmQgcHVyZ2UgdGhlIGRlYWQtbGV0dGVyIHF1ZXVlIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnY29tcGxpYW5jZTpyZWFkJywgbGFiZWw6ICdWaWV3IGNvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgY29tcGxpYW5jZSBydWxlcywgcG9saWNpZXMsIGFuZCBzY2FucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2U6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBjb21wbGlhbmNlJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgcnVsZXMsIHBvbGljaWVzLCBhbmQgZXhlbXB0aW9ucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ21lbWJlcnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgbWVtYmVycycsIGRlc2NyaXB0aW9uOiAnQWRkLCByZW1vdmUsIGFuZCBjaGFuZ2Ugcm9sZXMgb2Ygb3JnIG1lbWJlcnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdyb2xlczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSByb2xlcycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBlZGl0LCBhbmQgZGVsZXRlIHJvbGVzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnaW52aXRhdGlvbnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgaW52aXRhdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1NlbmQsIHJlc2VuZCwgYW5kIHJldm9rZSBpbnZpdGF0aW9ucycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugc2VydmljZSBhY2NvdW50cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIG9yZyBzZXJ2aWNlIGFjY291bnRzLCBhc3NpZ24gdGhlaXIgcm9sZXMsIGFuZCBpc3N1ZSBvciByZXZva2UgdGhlaXIga2V5cycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ2Rhc2hib2FyZHM6cmVhZCcsIGxhYmVsOiAnVmlldyBkYXNoYm9hcmRzJywgZGVzY3JpcHRpb246ICdWaWV3IGN1c3RvbSBkYXNoYm9hcmRzJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnZGFzaGJvYXJkczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHk6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBhbGVydCBydWxlcyBhbmQgZGVzdGluYXRpb25zJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eTp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgYWxlcnQgcnVsZXMgYW5kIGRlc3RpbmF0aW9ucycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2xvZ3M6ZXhwb3J0JywgbGFiZWw6ICdEb3dubG9hZCBsb2dzJywgZGVzY3JpcHRpb246IFwiRG93bmxvYWQgeW91ciBvcmdhbml6YXRpb24ncyBsb2cgZW50cmllcyBhcyBhIGZpbGUgKHZpZXdpbmcgbG9ncyBvbmx5IG5lZWRzICdWaWV3IGFsZXJ0aW5nJylcIiwgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnYXVkaXQ6cmVhZCcsIGxhYmVsOiAnVmlldyB0aGUgYXVkaXQgbG9nJywgZGVzY3JpcHRpb246IFwiUmVhZCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIHRhbXBlci1ldmlkZW50IGF1ZGl0IHRyYWlsXCIsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cmVhZCcsIGxhYmVsOiAnVmlldyByZXBvcnRzJywgZGVzY3JpcHRpb246ICdWaWV3IGFuYWx5dGljcyBhbmQgcmVwb3J0cycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOnJvbGx1cCcsIGxhYmVsOiAnUm9sbCB1cCB0ZWFtIHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgZGVzY2VuZGFudCB0ZWFtcyB3aGVuIHZpZXdpbmcgcmVwb3J0cycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOndyaXRlJywgbGFiZWw6ICdBdXRob3Igc3Rha2Vob2xkZXIgcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBzY2hlZHVsZSBhbmQgZHJhZnQgc2NoZWR1bGVkIHJlcG9ydHMgZm9yIG1hbmFnZXJzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCByZXBvcnRzIGV4dGVybmFsbHknLCBkZXNjcmlwdGlvbjogJ1B1Ymxpc2ggYSByZXBvcnQgYW5kIG1pbnQgZXhwaXJpbmcgc2hhcmUgbGlua3MgZm9yIHBlb3BsZSBvdXRzaWRlIHRoZSBwbGF0Zm9ybScsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdtZXNzYWdlczpyZWFkJywgbGFiZWw6ICdWaWV3IG1lc3NhZ2VzJywgZGVzY3JpcHRpb246ICdWaWV3IG1lc3NhZ2VzIGFuZCBhbm5vdW5jZW1lbnRzJywgY2F0ZWdvcnk6ICdNZXNzYWdpbmcnIH0sXG4gIHsgaWQ6ICdtZXNzYWdlczp3cml0ZScsIGxhYmVsOiAnU2VuZCBtZXNzYWdlcycsIGRlc2NyaXB0aW9uOiAnU2VuZCBtZXNzYWdlcyBhbmQgYW5ub3VuY2VtZW50cycsIGNhdGVnb3J5OiAnTWVzc2FnaW5nJyB9LFxuICB7IGlkOiAnYmlsbGluZzpyZWFkJywgbGFiZWw6ICdWaWV3IGJpbGxpbmcnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgc3Vic2NyaXB0aW9ucyBhbmQgdXNhZ2UnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdiaWxsaW5nOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIGJpbGxpbmcnLCBkZXNjcmlwdGlvbjogJ01hbmFnZSBzdWJzY3JpcHRpb25zLCBhZGQtb25zLCBhbmQgdGhlIGJpbGxpbmcgcG9ydGFsJywgY2F0ZWdvcnk6ICdCaWxsaW5nICYgUXVvdGFzJyB9LFxuICB7IGlkOiAncXVvdGFzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcXVvdGFzJywgZGVzY3JpcHRpb246ICdWaWV3IG9yZ2FuaXphdGlvbiBxdW90YXMgYW5kIHVzYWdlJywgY2F0ZWdvcnk6ICdCaWxsaW5nICYgUXVvdGFzJyB9LFxuICB7IGlkOiAncmVnaXN0cnk6cmVhZCcsIGxhYmVsOiAnVmlldyByZWdpc3RyeScsIGRlc2NyaXB0aW9uOiAnVmlldyB0aGUgY29udGFpbmVyIGltYWdlIHJlZ2lzdHJ5JywgY2F0ZWdvcnk6ICdSZWdpc3RyeScgfSxcbiAgeyBpZDogJ3JlZ2lzdHJ5OndyaXRlJywgbGFiZWw6ICdDb3B5IGNvbnRhaW5lciBpbWFnZXMnLCBkZXNjcmlwdGlvbjogJ0NvcHkgYW5kIHByb21vdGUgYSBjb250YWluZXIgaW1hZ2UgaW50byBhbm90aGVyIHJlcG9zaXRvcnknLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAncmVnaXN0cnk6cHVyZ2UnLCBsYWJlbDogJ0RlbGV0ZSBjb250YWluZXIgaW1hZ2VzJywgZGVzY3JpcHRpb246ICdEZWxldGUgaW1hZ2VzIGFuZCByZXBvc2l0b3JpZXMsIGFuZCBydW4gcmVnaXN0cnkgZ2FyYmFnZSBjb2xsZWN0aW9uJywgY2F0ZWdvcnk6ICdSZWdpc3RyeScgfSxcbiAgeyBpZDogJ2ltcGVyc29uYXRpb246b3BlbicsIGxhYmVsOiAnT3BlbiBhbiBpbXBlcnNvbmF0aW9uIHNlc3Npb24nLCBkZXNjcmlwdGlvbjogXCJWaWV3IGEgY3VzdG9tZXIncyBhY2NvdW50IGFzIG9uZSBvZiBpdHMgdXNlcnMsIHdpdGggdGhhdCBvcmdhbml6YXRpb24ncyBjb25zZW50XCIsIGNhdGVnb3J5OiAnSW1wZXJzb25hdGlvbicgfSxcbiAgeyBpZDogJ2ltcGVyc29uYXRpb246YXBwcm92ZScsIGxhYmVsOiAnQW5zd2VyIGltcGVyc29uYXRpb24gcmVxdWVzdHMnLCBkZXNjcmlwdGlvbjogJ0FwcHJvdmUgb3IgZGVueSBhIHJlcXVlc3QgdG8gdmlldyBhIG1lbWJlciBvZiB0aGlzIG9yZ2FuaXphdGlvbiBhcyB0aGF0IG1lbWJlcicsIGNhdGVnb3J5OiAnSW1wZXJzb25hdGlvbicgfSxcbiAgeyBpZDogJ3RlYW1fYWNjZXNzOm9wZW4nLCBsYWJlbDogXCJWaWV3IGEgdGVhbSBtZW1iZXIncyBhY2NvdW50XCIsIGRlc2NyaXB0aW9uOiBcIlZpZXcgYSBtZW1iZXIgb2Ygb25lIG9mIHRoaXMgb3JnYW5pemF0aW9uJ3MgdGVhbXMgYXMgdGhhdCBtZW1iZXIgKHJlYWQtb25seSlcIiwgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICB7IGlkOiAnb3JnX3NldHRpbmdzOndyaXRlJywgbGFiZWw6ICdPcmdhbml6YXRpb24gc2V0dGluZ3MnLCBkZXNjcmlwdGlvbjogJ01hbmFnZSBnZW5lcmFsIG9yZyBzZXR0aW5ncyBhbmQgQUkgY29uZmlnJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG4gIHsgaWQ6ICdvcmdfaWRwOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgU1NPL0lkUCcsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIHNpbmdsZSBzaWduLW9uIGFuZCBpZGVudGl0eSBwcm92aWRlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZ19rbXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBlbmNyeXB0aW9uIGtleXMnLCBkZXNjcmlwdGlvbjogJ0NvbmZpZ3VyZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBlbmNyeXB0aW9uIGtleXMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZ19pbXBlcnNvbmF0aW9uOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgaW1wZXJzb25hdGlvbiBwb2xpY3knLCBkZXNjcmlwdGlvbjogJ0NvbnRyb2wgd2hldGhlciBwbGF0Zm9ybSBvcGVyYXRvcnMgbWF5IHZpZXcgdGhlIG9yZ2FuaXphdGlvbiBhcyBvbmUgb2YgaXRzIG1lbWJlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbl07XG5cbmNvbnN0IFBFUk1JU1NJT05fTEFCRUxTID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oUEVSTUlTU0lPTl9DQVRBTE9HLm1hcCgocCkgPT4gW3AuaWQsIHAubGFiZWxdKSk7XG5cbi8qKiBIdW1hbiBsYWJlbCBmb3IgYSBwZXJtaXNzaW9uIGlkIChmYWxscyBiYWNrIHRvIHRoZSByYXcgaWQgZm9yIGFuIHVua25vd24gb25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNzaW9uTGFiZWwoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBQRVJNSVNTSU9OX0xBQkVMUy5nZXQoaWQpID8/IGlkO1xufVxuXG4vKiogT25lIHBpY2tlciBzZWN0aW9uOiBhIGNhdGVnb3J5IGFuZCB0aGUgcGVybWlzc2lvbnMgaXQgY29udGFpbnMsIGluIGNhdGFsb2cgb3JkZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25DYXRlZ29yeSB7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uTWV0YVtdO1xufVxuXG4vKiogR3JvdXAgYSBwZXJtaXNzaW9uIGxpc3QgaW50byBjYXRlZ29yaWVzLCBwcmVzZXJ2aW5nIGNhdGFsb2cgb3JkZXIuICovXG5mdW5jdGlvbiBncm91cEJ5Q2F0ZWdvcnkocGVybXM6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10pOiBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSB7XG4gIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBieUNhdGVnb3J5ID0gbmV3IE1hcDxzdHJpbmcsIFBlcm1pc3Npb25NZXRhW10+KCk7XG4gIGZvciAoY29uc3QgcCBvZiBwZXJtcykge1xuICAgIGlmICghYnlDYXRlZ29yeS5oYXMocC5jYXRlZ29yeSkpIHsgYnlDYXRlZ29yeS5zZXQocC5jYXRlZ29yeSwgW10pOyBvcmRlci5wdXNoKHAuY2F0ZWdvcnkpOyB9XG4gICAgYnlDYXRlZ29yeS5nZXQocC5jYXRlZ29yeSkhLnB1c2gocCk7XG4gIH1cbiAgcmV0dXJuIG9yZGVyLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGNhdGVnb3J5LCBwZXJtaXNzaW9uczogYnlDYXRlZ29yeS5nZXQoY2F0ZWdvcnkpISB9KSk7XG59XG5cbi8qKiBDaGVjayB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgdmFsaWQgUGVybWlzc2lvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUGVybWlzc2lvbih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUGVybWlzc2lvbiB7XG4gIHJldHVybiAoQUxMX1BFUk1JU1NJT05TIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgdGhhdCBtdXN0IE5FVkVSIGJlIGdyYW50YWJsZSB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBDVVNUT00gUm9sZSDigJRcbiAqIHRoZXkgZ2F0ZSBwbGF0Zm9ybS1vcGVyYXRvciBzdXJmYWNlcyAodGhlIHNoYXJlZCBpbWFnZSByZWdpc3RyeSksIHNvIGFsbG93aW5nXG4gKiBhbiBvcmcgYWRtaW4gdG8gbWludCBhIFJvbGUgY2FycnlpbmcgdGhlbSB3b3VsZCBiZSBhIGxhdGVudCBwcml2aWxlZ2VcbiAqIGVzY2FsYXRpb24uIFRoZXkgYXJlIE5PVCBzZWVkZWQgaW50byBBTlkgYnVpbHQtaW4gUm9sZSBidW5kbGUgKG5laXRoZXJcbiAqIGBtZW1iZXJgIG5vciBgYWRtaW5gKSwgc28gdGhlIG9ubHkgaG9sZGVyIGlzIGEgc3VwZXJhZG1pbiAoaW1wbGljaXQtYWxsKSDigJRcbiAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGltYWdlLXJlZ2lzdHJ5IGdhdGVzIHRoYXQgcmVxdWlyZSB0aGVtIGVmZmVjdGl2ZWx5XG4gKiBzdXBlcmFkbWluLW9ubHkuIFRoaXMgbGlzdCBBTFNPIGJsb2NrcyBjdXN0b20tUm9sZSBhdXRob3JpbmcgZnJvbSByZXF1ZXN0aW5nXG4gKiB0aGVtIChzZWUgcGxhdGZvcm0gYHNhbml0aXplUGVybWlzc2lvbnNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBgcmVnaXN0cnk6cmVhZGAgYW5kIGByZWdpc3RyeTp3cml0ZWAgd2VyZSBib3RoIGhlcmUuIFdoYXQgc3RheXMgaXMgdGhlXG4gIC8vIGRlc3RydWN0aXZlIHJ1bmcgYWxvbmU6IGRlbGV0aW5nIGEgbWFuaWZlc3Qgb3IgYSB3aG9sZSByZXBvc2l0b3J5LCBhbmQgdGhlXG4gIC8vIEdDIHBydW5lLCBlYWNoIG9mIHdoaWNoIGNhbiByZW1vdmUgYW4gaW1hZ2UgYSB0ZW5hbnQncyBwaXBlbGluZSBzdGlsbFxuICAvLyByZXNvbHZlcyDigJQgaW5jbHVkaW5nIHRoZSBkaWdlc3QtcGlubmVkIHBsdWdpbiBpbWFnZXMgdGhlIHN1cHBseSBjaGFpblxuICAvLyB2ZXJpZmllcyBhZ2FpbnN0LiBUaGF0IGlzIHRoZSBvbmUgcmVnaXN0cnkgYWN0aW9uIHdpdGggbm8gdW5kbywgc28gaXQga2VlcHNcbiAgLy8gdGhlIG5hcnJvd2VzdCBwb3NzaWJsZSBhdWRpZW5jZTogdGhlIGZsYWcsIGFuZCBuZXZlciBhIFJvbGUuXG4gICdyZWdpc3RyeTpwdXJnZScsXG5dO1xuXG4vKipcbiAqIFBlcm1pc3Npb25zIHRoYXQgZ292ZXJuIHRoZSBQTFVHSU4gRUNPU1lTVEVNIGFuZCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBMaWtlXG4gKiB7QGxpbmsgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TfSB0aGV5IGFyZSBpbiBubyBtZW1iZXIvYWRtaW4vb3duZXIgYnVuZGxlLFxuICogYW5kIG5vIFJvbGUgYXV0aG9yZWQgaW4gYSBURU5BTlQgbWF5IGNhcnJ5IG9uZTogcGxhdGZvcm0nc1xuICogYHNhbml0aXplUGVybWlzc2lvbnNgIGFkbWl0cyB0aGVtIG9ubHkgd2hlbiB0aGUgYXV0aG9yIGlzIGEgc3VwZXJhZG1pbiBBTkRcbiAqIHRoZSBSb2xlIGlzIGJlaW5nIHdyaXR0ZW4gaW4gdGhlIHN5c3RlbSBvcmcgaXRzZWxmIChgbWF5Q29tcG9zZVN5c3RlbU9yZ1JvbGVgKS5cbiAqXG4gKiBTbyB0aGVyZSBhcmUgdGhyZWUgZ3JhbnQgcGF0aHMsIG5vdCBvbmU6IGEgc3VwZXJhZG1pbiAoaW1wbGljaXQtYWxsKSwgb25lIG9mXG4gKiB0aGUgc2VlZGVkIHN5c3RlbS1vcmcgUm9sZXMsIGFuZCBhIENVU1RPTSBzeXN0ZW0tb3JnIFJvbGUgYSBzdXBlcmFkbWluXG4gKiBjb21wb3NlZC4gVGhlIHRoaXJkIGlzIHdoYXQgbWFrZXMgdGhlIHNwbGl0IGJldHdlZW4gYHBsdWdpbnM6bW9kZXJhdGVgIGFuZFxuICogYHB1Ymxpc2hlcnM6dmVyaWZ5YCB1c2FibGUgd2l0aG91dCB3YWl0aW5nIGZvciBhIG5ldyBzZWVkIGJ1bmRsZSDigJQgd29ydGhcbiAqIGtub3dpbmcgYmVmb3JlIHJlYWRpbmcgZWl0aGVyIHBlcm1pc3Npb24gYXMgXCJ1bnJlYWNoYWJsZSBleGNlcHQgdmlhXG4gKiB7QGxpbmsgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlN9XCIuXG4gKlxuICogYG9uY2FsbDptYW5hZ2VgIGlzIGNhcnJpZWQgYnkgKipQbGF0Zm9ybSBPcGVyYXRvcioqIGFuZCBieSBubyBvdGhlciBuYW1lZFxuICogcm9sZS4gVGhhdCBzcGxpdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuIGFuIG92ZXJzaWdodDogcGFnaW5nIGlzIHRoZVxuICogdmVuZG9yJ3Mgb3duIG9wZXJhdGlvbmFsIGNvbmNlcm4gYW5kIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggZWNvc3lzdGVtXG4gKiBtb2RlcmF0aW9uLCBzbyB3aWRlbmluZyB0aGUgRWNvc3lzdGVtIE1hbmFnZXIgcm9sZSB0byBjYXJyeSBpdCB3b3VsZCBoYW5kIHRoZVxuICogcGFnZXIgdG8gcGVvcGxlIGhpcmVkIHRvIHJldmlldyBwbHVnaW5zLiBJdCBpcyBub3QgYSBwbGFjZWhvbGRlciDigJQgaXQgZ2F0ZXNcbiAqIHR3byBsaXZlIHJvdXRlcyAodGhlIHBhZ2luZyBwb3N0dXJlIHJlYWQgYW5kIHRoZSB0ZXN0IHBhZ2UpLCB1bmxpa2VcbiAqIGByZWdpc3RyeToqYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczptb2RlcmF0ZScsXG4gICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgb3BlcmF0b3Igc3VyZmFjZXMsIHN5c3RlbS1vcmctb25seSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZVxuICAvLyBjb25zb2xlcyBhcmU6IHRoZXkgcmVhZCBhbmQgbW92ZSB0aGluZ3MgYmVsb25naW5nIHRvIG9yZ2FuaXNhdGlvbnMgdGhlXG4gIC8vIGhvbGRlciBpcyBub3QgYSBtZW1iZXIgb2YsIHNvIHRoZXkgbXVzdCBuZXZlciBiZSBncmFudGFibGUgaW5zaWRlIGEgdGVuYW50LlxuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAvLyBSZWFkaW5nIHRoZSBpbWFnZSByZWdpc3RyeTogcmVwb3NpdG9yeSBuYW1lcywgdGFncywgbWFuaWZlc3RzLCBibG9icyBhbmQgdGhlXG4gIC8vIHN0b3JhZ2Ugcm9sbHVwLiBQcm9tb3RlZCBvdXQgb2YgU1VQRVJBRE1JTl9PTkxZIGJlY2F1c2UgdGhlIHJlZ2lzdHJ5IGJyb3dzZXJcbiAgLy8gd2FzIGludmlzaWJsZSB0byBldmVyeSBSb2xlLCBzbyBhIFBsYXRmb3JtIE9wZXJhdG9yIGRlYnVnZ2luZyBhIGZhaWxlZFxuICAvLyBwbHVnaW4gYnVpbGQgY291bGQgc2VlIHRoZSBidWlsZCBxdWV1ZSBhbmQgaXRzIGRlYWQgbGV0dGVycyBidXQgbm90IHRoZVxuICAvLyBpbWFnZXMgdGhlIGJ1aWxkIHByb2R1Y2VkIOKAlCBhbmQgdGhlIG9ubHkgd2F5IHRvIGxvb2sgd2FzIHRoZSBzdXBlcmFkbWluXG4gIC8vIGZsYWcuIEl0IHN0YXlzIHN5c3RlbS1vcmctb25seSAobm8gdGVuYW50IFJvbGUgbWF5IGNhcnJ5IGl0KSBhbmQgaXMgcGFpcmVkXG4gIC8vIHdpdGggYSBwZXItcmVwbyBvcmctb3duZXJzaGlwIGZpbHRlciB0aGF0IHJ1bnMgQUZURVIgaXQsIHNvIHdpZGVuaW5nIHRoZVxuICAvLyBwZXJtaXNzaW9uIGRvZXMgbm90IHdpZGVuIHdoaWNoIHJlcG9zaXRvcmllcyBhIGhvbGRlciBjYW4gcmVhY2g6IGFcbiAgLy8gc3lzdGVtLW9yZyBtZW1iZXIgd2hvIGlzIG5vdCBhIHN1cGVyYWRtaW4gc2VlcyBgc3lzdGVtLypgLCBgbGlicmFyeS8qYCBhbmRcbiAgLy8gYHB1YmxpYy8qYCDigJQgdGhpcyBkZXBsb3ltZW50J3Mgb3duIGJhc2UgYW5kIHBsdWdpbiBpbWFnZXMg4oCUIGFuZCBubyB0ZW5hbnQnc1xuICAvLyBgb3JnLSpgIHJlcG9zaXRvcmllcyBhdCBhbGwgKGBjYW5SZWFkUmVwb2AgaW4gdGhlIGltYWdlLXJlZ2lzdHJ5IHNlcnZpY2UpLlxuICAncmVnaXN0cnk6cmVhZCcsXG4gIC8vIENvcHlpbmcvcHJvbW90aW5nIGFuIGltYWdlLiBTeXN0ZW0tb3JnLW9ubHkgcmF0aGVyIHRoYW4gc3VwZXJhZG1pbi1vbmx5XG4gIC8vIGJlY2F1c2UgaXQgaXMgQURESVRJVkU6IGl0IHdyaXRlcyBhIG5ldyB0YWcgYW5kIG1ha2VzIG5vdGhpbmcgc3RvcFxuICAvLyByZXNvbHZpbmcsIGFuZCBgY2FuV3JpdGVSZXBvYCBjb25maW5lcyBhIG5vbi1zdXBlcmFkbWluIHN5c3RlbS1vcmcgY2FsbGVyXG4gIC8vIHRvIGBzeXN0ZW0vKmAgcmVnYXJkbGVzcy4gRGVsaWJlcmF0ZWx5IGNhcnJpZWQgYnkgTk8gYnVpbHQtaW4gYnVuZGxlIHRvZGF5XG4gIC8vIOKAlCBwcm9tb3RpbmcgYW4gaW1hZ2UgaXMgYSBqb2IsIG5vdCBhIHNpZGUgZWZmZWN0IG9mIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQsXG4gIC8vIHNvIGl0IHdhaXRzIGZvciBhIFJvbGUgb2YgaXRzIG93biByYXRoZXIgdGhhbiByaWRpbmcgYWxvbmcgd2l0aFxuICAvLyBgcGxhdGZvcm06cmVhZGAuXG4gICdyZWdpc3RyeTp3cml0ZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nLFxuICAnZGF0YWJhc2VfY29uc29sZTpvcGVuJyxcbiAgJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsXG4gIC8vIE9wZW5pbmcgYSBjcm9zcy10ZW5hbnQgaW1wZXJzb25hdGlvbiBzZXNzaW9uLiBTeXN0ZW0tb3JnLW9ubHkgZm9yIHRoZVxuICAvLyBvYnZpb3VzIHJlYXNvbiDigJQgaXQgdmlld3MgYW4gb3JnYW5pc2F0aW9uIHRoZSBob2xkZXIgaXMgbm90IGEgbWVtYmVyIG9mIOKAlFxuICAvLyBhbmQgaXQgaXMgdGhlIE9ORSBwZXJtaXNzaW9uIGluIHRoaXMgbGlzdCB0aGF0IGFsc28gaGFzIHRvIGNsZWFyIGEgZ2F0ZSB0aGVcbiAgLy8gcGVybWlzc2lvbiBzeXN0ZW0gZG9lcyBub3Qgb3duOiB0aGUgdGFyZ2V0IG9yZ2FuaXNhdGlvbidzIGNvbnNlbnQgKGl0c1xuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIHBvbGljeSksIHBsdXMgYWFsMiBhbmQgYSBzdHJvbmcgc3RlcC11cC4gVGhlXG4gIC8vIHBlcm1pc3Npb24gc2F5cyB3aG8gbWF5IEFTSzsgdGhlIHRlbmFudCBzdGlsbCBhbnN3ZXJzLlxuICAvL1xuICAvLyBJdCBkb2VzIE5PVCBjb3ZlciBlbWVyZ2VuY3kgYWNjZXNzLiBgUE9TVCAvOnVzZXJJZC9icmVha2dsYXNzYCBieXBhc3Nlc1xuICAvLyB0ZW5hbnQgY29uc2VudCBhbmQgc28gc3RheXMgb24gdGhlIHN1cGVyYWRtaW4gZmxhZyBhbG9uZSwgYXBwcm92ZWQgYnkgYVxuICAvLyBTRUNPTkQgc3VwZXJhZG1pbiAoZm91ci1leWVzKS4gQSBwZXJtaXNzaW9uIHRoYXQgY291bGQgYmUgZGVsZWdhdGVkIG11c3Qgbm90XG4gIC8vIGJlIGFibGUgdG8gd2FsayBwYXN0IGNvbnNlbnQuXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLFxuICAvLyBQYWdpbmcgaXMgdGhlIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBncmFudHMgTk8gdGVuYW50IGFjY2Vzc1xuICAvLyDigJQgYGlzU3lzdGVtT3JnSWRgIGlzIGEgY29udGVudC1vd25lciBjaGVjaywgbm90IGEgcHJpdmlsZWdlIGdhdGUg4oCUIHNvIGFcbiAgLy8gdGVuYW50IHJvbGUgbXVzdCBuZXZlciBiZSBhYmxlIHRvIGNhcnJ5IGl0LCBhbmQgYSB0ZW5hbnQgbXVzdCBuZXZlciBiZSBhYmxlXG4gIC8vIHRvIG1ha2UgdGhpcyBkZXBsb3ltZW50IHNlbmQgYSBwYWdlLlxuICAnb25jYWxsOm1hbmFnZScsXG4gIC8vIFRoZSB2ZW5kb3IncyBvd24gb3BlcmF0aW9uYWwgdGFza3MuIEVhY2ggb25lIHJlcGxhY2VkIGEgYHJlcXVpcmVTeXN0ZW1BZG1pbmBcbiAgLy8gZ2F0ZSwgc28gdGhlIHBvaW50IG9mIGxpc3RpbmcgdGhlbSBoZXJlIGlzIHRoZSBzYW1lIGFzIHRoZSBwb2ludCBvZiBhZGRpbmdcbiAgLy8gdGhlbSBhdCBhbGw6IGEgUm9sZSBjb21wb3NlZCBpbiB0aGUgc3lzdGVtIG9yZyBjYW4gY2FycnkgZXhhY3RseSBvbmUgam9iLFxuICAvLyBhbmQgbm8gUm9sZSBpbiBhbnkgdGVuYW50IGNhbiBjYXJyeSBpdCBhdCBhbGwuXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJyxcbiAgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLFxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbl07XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGUgc3lzdGVtIG9yZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgYW4gb3JnIG1heSBhc3NpZ24gdmlhIGEgQ1VTVE9NIFJvbGUg4oCUIGV2ZXJ5IHBlcm1pc3Npb24gZXhjZXB0IHRoZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9LlxuICogQ3VzdG9tLVJvbGUgY3JlYXRlL3VwZGF0ZSB2YWxpZGF0ZXMgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHNldCBhZ2FpbnN0IHRoaXNcbiAqIChzZWUgcGxhdGZvcm0gcm9sZXMtc2VydmljZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID1cbiAgQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwKSk7XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgZ3JhbnRlZCB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBjdXN0b20gUm9sZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuICFTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlMuaW5jbHVkZXMocGVybWlzc2lvbikgJiYgIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogQ2F0ZWdvcnkg4oaSIHBlcm1pc3Npb25zIGZvciB0aGUgY3VzdG9tLVJvbGUgQVVUSE9SSU5HIHBpY2tlcjogdGhlIGNhdGFsb2cgbWludXNcbiAqIHRoZSBub24tYXNzaWduYWJsZSBwZXJtaXNzaW9ucywgd2l0aCBhbnkgbm93LWVtcHR5IGNhdGVnb3J5IGRyb3BwZWRcbiAqIChzbyBcIlJlZ2lzdHJ5XCIgZGlzYXBwZWFycykuIFRoZSBncm91cGVkIHZpZXcgb2ZcbiAqIHtAbGluayBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OU30uXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9DQVRFR09SSUVTOiByZWFkb25seSBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSA9XG4gIGdyb3VwQnlDYXRlZ29yeShQRVJNSVNTSU9OX0NBVEFMT0cuZmlsdGVyKChwKSA9PiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHAuaWQpKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFscyAocGVyc29uYWwgYWNjZXNzIGtleXMgLyBtYWNoaW5lIHRva2Vucylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXZlcnkgYDpyZWFkYCBwZXJtaXNzaW9uIOKAlCB0aGUgXCJyZWFkLW9ubHlcIiBwcmVzZXQgYSBuZXcgcGVyc29uYWwgYWNjZXNzIGtleVxuICogc3RhcnRzIGZyb20uIERlcml2ZWQgZnJvbSB0aGUgY2F0YWxvZyBzbyBhIG5ldyByZXNvdXJjZSdzIHJlYWQgcGVybWlzc2lvblxuICogam9pbnMgdGhlIHByZXNldCB3aXRob3V0IGEgc2Vjb25kIGVkaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUFEX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IHAuZW5kc1dpdGgoJzpyZWFkJykpO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHN1YnNldDogZXZlcnkgZW50cnkgbXVzdCBiZSBhIGNhdGFsb2cgaWRcbiAqIChhbnl0aGluZyBlbHNlIOKGkiBgbnVsbGAsIHRoZSBjYWxsZXIncyA0MDApLCBkdXBsaWNhdGVzIGNvbGxhcHNlLCBhbmQgdGhlXG4gKiByZXN1bHQgaXMgaW4gY2Fub25pY2FsIGNhdGFsb2cgb3JkZXIgc28gYSBzdG9yZWQgc3Vic2V0IGNvbXBhcmVzIHN0YWJseS5cbiAqIEFuIEVNUFRZIGFycmF5IGlzIHZhbGlkIOKAlCBhIGtleSB0aGF0IGNhbiBhdXRoZW50aWNhdGUgYnV0IGRvIG5vdGhpbmcg4oCUIGFuZFxuICogaXMgZGlzdGluY3QgZnJvbSBcIm5vIHN1YnNldFwiIChgdW5kZWZpbmVkYCksIHdoaWNoIG1lYW5zIGZ1bGwgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGVybWlzc2lvblN1YnNldChyZXF1ZXN0ZWQ6IHJlYWRvbmx5IHVua25vd25bXSk6IFBlcm1pc3Npb25bXSB8IG51bGwge1xuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHJlcXVlc3RlZCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycgfHwgIWlzVmFsaWRQZXJtaXNzaW9uKHApKSByZXR1cm4gbnVsbDtcbiAgICB3YW50ZWQuYWRkKHApO1xuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiB3YW50ZWQuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBUaGUgcGVybWlzc2lvbnMgYSBwZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFsIGFjdHVhbGx5IGNhcnJpZXM6IHRoZVxuICogSU5URVJTRUNUSU9OIG9mIHRoZSBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aCBhbmQgdGhlIGhvbGRlcidzIENVUlJFTlRcbiAqIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucywgaW4gY2F0YWxvZyBvcmRlci4gUmUtZXZhbHVhdGVkIGF0IGV2ZXJ5IGlzc3VlLCBzb1xuICogbG9zaW5nIGEgUm9sZSBzaHJpbmtzIHRoZSBjcmVkZW50aWFsIGFuZCBub3RoaW5nIGNhbiBldmVyIGdyb3cgaXQgcGFzdCB0aGVcbiAqIHN1YnNldCBpdCB3YXMgY3JlYXRlZCB3aXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0UGVybWlzc2lvbnMoXG4gIGVmZmVjdGl2ZTogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHN1YnNldDogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChzdWJzZXQpO1xuICBjb25zdCBoZWxkID0gbmV3IFNldChlZmZlY3RpdmUpO1xuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gYWxsb3dlZC5oYXMocCkgJiYgaGVsZC5oYXMocCkpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGVybWlzc2lvbiBidW5kbGVzIHVzZWQgdG8gU0VFRCB0aGUgYnVpbHQtaW4gUm9sZXMgKFwiQWRtaW5cIiwgXCJNZW1iZXJcIikuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGRlZmluaXRpb24gb2Ygd2hhdCB0aG9zZSBidWlsdC1pbiBSb2xlcyBncmFudCDigJQgaXQgaXMgdXNlZFxuICogd2hlbiBhIFJvbGUgcmVjb3JkIGlzIGNyZWF0ZWQgKGFuZCBieSB0aGUgc3RhcnR1cCBiYWNrZmlsbCkgdG8gcG9wdWxhdGUgdGhhdFxuICogUm9sZSdzIG93biBgcGVybWlzc2lvbnNbXWAuIEl0IGlzIE5PVCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBzb3VyY2U6IGEgdXNlcidzXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZSBPTkxZIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0gKHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9KS4gVGhlIGNvYXJzZSBgcm9sZWAgbGFiZWwgKG93bmVyL2FkbWluL21lbWJlcilcbiAqIHN1cnZpdmVzIG9ubHkgZm9yIGBpc0FkbWluYC9vd25lcnNoaXAvZGlzcGxheSwgbmV2ZXIgdG8gZ3JhbnQgcGVybWlzc2lvbnMuXG4gKlxuICogLSBgbWVtYmVyYCAg4oCUIGRheS10by1kYXkgYnVpbGRlcjogcmVhZCArIHdyaXRlIG9uIHBpcGVsaW5lcy90ZW1wbGF0ZXMvcGx1Z2lucyxcbiAqICAgcmVhZCBlbHNld2hlcmUuIE5vIG1lbWJlci9yb2xlL2JpbGxpbmcgbWFuYWdlbWVudCwgbm8gY29tcGxpYW5jZS9hbGVydFxuICogICBhdXRob3JpbmcsIGFuZCBubyBgOnB1Ymxpc2hgIG9uIGFueSBjYXRhbG9nLlxuICogLSBgYWRtaW5gICAg4oCUIGZ1bGwgb3JnIGFkbWluaXN0cmF0aW9uOiBldmVyeSBPUkctQVNTSUdOQUJMRSBwZXJtaXNzaW9uIChpLmUuXG4gKiAgIEFMTF9QRVJNSVNTSU9OUyBtaW51cyB0aGUge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHRoZVxuICogICB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSwgc28gYHJlZ2lzdHJ5OipgIHN0YXlcbiAqICAgc3VwZXJhZG1pbi1pbXBsaWNpdC1vbmx5IGFuZCBlY29zeXN0ZW0gbW9kZXJhdGlvbiBzdGF5cyB3aXRoIHRoZSBzeXN0ZW1cbiAqICAgb3JnJ3MgRWNvc3lzdGVtIE1hbmFnZXJzIOKAlCBuZWl0aGVyIGlzIGdyYW50ZWQgdG8gb3JnIGFkbWlucykuXG4gKiAtIGBvd25lcmAgICDigJQgc2FtZSBhcyBhZG1pbiAob3duZXJzaGlwIGl0c2VsZiDigJQgdHJhbnNmZXIvZGVsZXRlIOKAlCBpcyBnYXRlZFxuICogICBzZXBhcmF0ZWx5LCBub3QgdmlhIGEgcGVybWlzc2lvbikuXG4gKi9cbmNvbnN0IE1FTUJFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsXG4gICdwbHVnaW5zOmluc3RhbGwnLFxuICAnY29tcGxpYW5jZTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJyxcbiAgJ3F1b3RhczpyZWFkJyxcbl07XG5cbmNvbnN0IEFETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbLi4uT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlNdO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciBlYWNoIGJ1aWx0LWluIFJvbGUsIGtleWVkIGJ5IHRoZSBjb2Fyc2Ugcm9sZSBpdCBncmFudHMuXG4gKiBDb25zdW1lZCBieSB0aGUgUm9sZSBzZWVkZXIgKyB0aGUgc3RhcnR1cCBiYWNrZmlsbCB0byBwb3B1bGF0ZSBhIGJ1aWx0LWluXG4gKiBSb2xlJ3MgYHBlcm1pc3Npb25zW11gLiBOT1QgY29uc3VsdGVkIGF0IHJlcXVlc3QgdGltZSDigJQgc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30uXG4gKi9cbmV4cG9ydCBjb25zdCBST0xFX1BFUk1JU1NJT05TOiBSZWNvcmQ8T3JnUm9sZSwgcmVhZG9ubHkgUGVybWlzc2lvbltdPiA9IHtcbiAgbWVtYmVyOiBNRU1CRVJfUEVSTUlTU0lPTlMsXG4gIGFkbWluOiBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgb3duZXI6IEFETUlOX1BFUk1JU1NJT05TLFxufTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCBzZWVkZWQgT05MWSBpbiB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBJdCBjYXJyaWVzIHRoZVxuICoge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gcGx1cyB0aGUgcmVhZHMgYSBtb2RlcmF0b3IgbmVlZHMgKHRoZVxuICogaW4tYXBwIGNhdGFsb2csIGluLWFwcCBub3RpY2VzLCB0aGUgbW9kZXJhdGlvbi1TTEEgZGFzaGJvYXJkKSBhbmQgbm90aGluZ1xuICogdGVuYW50LWZhY2luZzogbm8gYHJlZ2lzdHJ5OipgLCBubyBgbWVtYmVyczptYW5hZ2VgLiBUaGUgUm9sZSBncmFudHMgdGhlXG4gKiBjb2Fyc2UgYG1lbWJlcmAgbGFiZWwgYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbi8qKlxuICogVGhlIFBMQVRGT1JNIE9QRVJBVE9SIGJ1bmRsZSDigJQgdGhlIHRoaXJkIHJ1bmcgb2YgdGhlIHN5c3RlbSBvcmcncyBsYWRkZXIuXG4gKlxuICogQmVmb3JlIGl0IHRoZSBsYWRkZXIgaGFkIHR3byBydW5ncyBhbmQgYSBnYXA6IEVjb3N5c3RlbSBNYW5hZ2VyIChwbHVnaW5cbiAqIG1vZGVyYXRpb24pIGFuZCBTdXBlciBBZG1pbiAoaW1wbGljaXQtYWxsLCB3aGljaCBhbHNvIGNhcnJpZXMgaW1wZXJzb25hdGlvbixcbiAqIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MpLiBBbnl0aGluZyBpbiBiZXR3ZWVuIOKAlCByZWFkIHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyxcbiAqIHJ1biBhIHByb21vdGlvbiBjYW1wYWlnbiwgY2hlY2sgd2hldGhlciB0aGUgcGFnZXIgaXMgY29uZmlndXJlZCDigJQgaGFkIHRvIGJlXG4gKiBkb25lIGJ5IG1ha2luZyBzb21lYm9keSBhIGZ1bGwgc3VwZXJhZG1pbi5cbiAqXG4gKiBJdCBpcyBhIEJVTkRMRSByYXRoZXIgdGhhbiBhIGdyYW50YWJsZSBsaXN0IGJlY2F1c2UgYFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU2BcbiAqIGNhbiBuZXZlciBiZSBjYXJyaWVkIGJ5IGEgY3VzdG9tIFJvbGUgaW4gYW55IG9yZzogd2l0aG91dCBhIHNlZWRlZCBidW5kbGVcbiAqIHRoZXNlIHBlcm1pc3Npb25zIGhhZCBubyBncmFudCBwYXRoIGF0IGFsbCBhbmQgd2VyZSBzdXBlcmFkbWluLW9ubHkgaW5cbiAqIHByYWN0aWNlLCB3aGljaCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGV5IHdlcmUgYWRkZWQgdG8gYXZvaWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBjYXJyeWluZyBgcGx1Z2luczptb2RlcmF0ZWAgLyBgcHVibGlzaGVyczp2ZXJpZnlgOiBlY29zeXN0ZW1cbiAqIG1vZGVyYXRpb24gaXMgYSBkaWZmZXJlbnQgam9iIHdpdGggaXRzIG93biBSb2xlLCBhbmQgYSByZXZpZXdlciBvZiBwbHVnaW5zXG4gKiBzaG91bGQgbm90IGFjcXVpcmUgdGhlIGFiaWxpdHkgdG8gbW92ZSBhbm90aGVyIHRlbmFudCdzIG1vbmV5IGJ5IGJlaW5nIGhhbmRlZFxuICogdGhlIG9wZXJhdG9yIFJvbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBCT1RIIGhhbHZlcyBvZiB0aGUgb2xkIGBwbGF0Zm9ybTpyZWFkYDogdGhpcyBpcyB0aGUgb25lIGpvYiB0aGF0IGdlbnVpbmVseVxuICAvLyB3YW50cyB0aGUgZGVwbG95J3Mgb3duIGNvbmZpZ3VyYXRpb24gQU5EIHRoZSBjdXN0b21lciByb3N0ZXIuXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgLy8gUlVOTklORyB0aGUgZGVwbG95bWVudDogcmFpc2UgYSBxdW90YSBkdXJpbmcgYW4gaW5jaWRlbnQsIHdhdGNoIHRoZSBidWlsZFxuICAvLyBxdWV1ZSBhbmQgcHVyZ2UgaXRzIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgLy8gUmVhZHMgdGhhdCBtYWtlIHRoZSBvcGVyYXRvciB2aWV3cyB1c2FibGU6IHRoZSBkYXNoYm9hcmRzIHRoZSBwb3N0dXJlIHBhbmVsc1xuICAvLyBsaXZlIG9uLCB0aGUgY3Jvc3MtdGVuYW50IGxvZyB2aWV3LCBhbmQgdGhlIGN1c3RvbWVyJ3MgcGxhbiB3aGVuIGEgbGltaXQgaXNcbiAgLy8gdGhlIHRoaW5nIGJlaW5nIGRlYnVnZ2VkLlxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAvLyBUaGUgcmVnaXN0cnkgYnJvd3NlcjogcmVwb3NpdG9yeSBuYW1lcywgdGFncyBhbmQgbWFuaWZlc3RzIGZvciB0aGUgaW1hZ2VzXG4gIC8vIHRoaXMgZGVwbG95bWVudCdzIGJ1aWxkcyBwcm9kdWNlLiBJdCB3YXMgd2l0aGhlbGQgd2hpbGUgYHJlZ2lzdHJ5OnJlYWRgIHdhc1xuICAvLyBzdXBlcmFkbWluLW9ubHkg4oCUIGEgc2VlZGVkIGJ1bmRsZSBjYXJyeWluZyBhIHN1cGVyYWRtaW4tb25seSBwZXJtaXNzaW9uXG4gIC8vIHdvdWxkIG1ha2UgdGhhdCBsaXN0IGEgbGllLCBzaW5jZSBidW5kbGVzIGJ5cGFzcyBgc2FuaXRpemVQZXJtaXNzaW9uc2AuIFRoZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBwcm9tb3RlZCB0byBzeXN0ZW0tb3JnLW9ubHkgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIHNtdWdnbGVkXG4gIC8vIGluIGhlcmUsIHdoaWNoIGlzIHRoZSBvcmRlciB0aG9zZSB0d28gY2hhbmdlcyBoYXZlIHRvIGhhcHBlbiBpbi5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBBQ0NPVU5UIE1BTkFHRVIg4oCUIHRoZSBjb21tZXJjaWFsIHJlbGF0aW9uc2hpcCB3aXRoIGEgY3VzdG9tZXIsIGFzIG9wcG9zZWQgdG9cbiAqIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQuXG4gKlxuICogU3BsaXQgZnJvbSB7QGxpbmsgUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlN9IHJhdGhlciB0aGFuIHBpbGVkIG9udG8gaXQsXG4gKiBiZWNhdXNlIHRoZSB0d28gam9icyBkaXZlcmdlIGF0IGV4YWN0bHkgdGhlIHBlcm1pc3Npb25zIGFkZGVkIGFsb25nc2lkZSB0aGlzXG4gKiBidW5kbGUuIGBiaWxsaW5nOm9wZXJhdGVgIE1PVkVEIGhlcmUgZnJvbSB0aGUgb3BlcmF0b3IgYnVuZGxlIGZvciB0aGF0IHJlYXNvbjpcbiAqIG1pbnRpbmcgYSBkaXNjb3VudCB0b2tlbiBpcyBhIGNvbW1lcmNpYWwgYWN0LCBub3QgYW4gb3BlcmF0aW9uYWwgb25lLCBhbmQgdGhlXG4gKiBwZXJzb24gd2hvIHJlc3RhcnRzIGEgc3R1Y2sgYnVpbGQgcXVldWUgaGFzIG5vIHJlYXNvbiB0byBob2xkIGl0LlxuICpcbiAqIFRoZSBkZXN0cnVjdGl2ZSBoYWxmIG9mIHRoZSBjYXRhbG9ndWUgbGl2ZXMgaGVyZSDigJQgYG9yZ3M6bWFuYWdlYCBjYW4gREVMRVRFXG4gKiBhbiBvcmdhbmlzYXRpb24gYW5kIGBzdWJzY3JpcHRpb25zOm1hbmFnZWAgY2FuIGNhbmNlbCBpdHMgc3Vic2NyaXB0aW9uIOKAlCBzb1xuICogdGhpcyBpcyBkZWxpYmVyYXRlbHkgdGhlIHNtYWxsZXIsIG1vcmUgcmFyZWx5LWFzc2lnbmVkIG9mIHRoZSB0d28uXG4gKi9cbmV4cG9ydCBjb25zdCBBQ0NPVU5UX01BTkFHRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOm1hbmFnZScsXG4gICdvcmdzOm1hbmFnZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAvLyBBIHF1b3RhIGJ1bXAgaXMgYXMgb2Z0ZW4gYSBjb21tZXJjaWFsIGNvbmNlc3Npb24gYXMgYW4gb3BlcmF0aW9uYWwgb25lLCBzb1xuICAvLyBib3RoIGJ1bmRsZXMgY2FycnkgaXQuXG4gICdxdW90YXM6bWFuYWdlJyxcbiAgLy8gVGhlIGFsbC1vcmdhbml6YXRpb25zIGxpc3QsIHdoaWNoIGlzIHRoZSBzdXJmYWNlIHRoaXMgam9iIHdvcmtzIGZyb20g4oCUIGFuZFxuICAvLyBvbmx5IHRoYXQuIEl0IHVzZWQgdG8gdGFrZSBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIGFsc28gaGFuZGVkIG92ZXIgdGhlXG4gIC8vIGRlcGxveSdzIFJMUyBtb2RlLCBLTVMgcG9zdHVyZSBhbmQgcmVuZGVyZWQgYWxlcnQgcnVsZXM6IGludGVybmFscyBhXG4gIC8vIGNvbW1lcmNpYWwgcm9sZSBoYXMgbm8gdXNlIGZvci5cbiAgJ29yZ3M6cmVhZCcsXG5dO1xuXG4vKipcbiAqIENPTlNPTEUgQURNSU5JU1RSQVRPUiDigJQgdGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBhcyBhIFJvbGUuXG4gKlxuICogV0hZIFRISVMgRVhJU1RTIGV2ZW4gdGhvdWdoIGVhY2ggY29uc29sZSBwZXJtaXNzaW9uIGlzIGdyYW50YWJsZSBieSBoYW5kOiB3aXRoXG4gKiBubyBzZWVkZWQgUm9sZSwgdGhlIG9ubHkgcGF0aCB0byBwZ0FkbWluIHdhcyBhIHN1cGVyYWRtaW4gY29tcG9zaW5nIGEgY3VzdG9tXG4gKiBSb2xlIGZvciBpdCwgYW5kIHRoZSBvYnNlcnZlZCBvdXRjb21lIG9mIGFza2luZyBwZW9wbGUgdG8gZG8gdGhhdCBpcyB0aGF0IHRoZXlcbiAqIHJlYWNoIGZvciB0aGUgc3VwZXJhZG1pbiBGTEFHIGluc3RlYWQg4oCUIHRoZSBleGFjdCBmYWlsdXJlIHRoZXNlIHBlcm1pc3Npb25zXG4gKiB3ZXJlIGFkZGVkIHRvIHJlbW92ZS4gQSBuYW1lZCBSb2xlIGFsc28gbWFrZXMgXCJ3aG8gY2FuIG9wZW4gYSBkYXRhIHNoZWxsP1wiIG9uZVxuICogcXVlcnkgaW5zdGVhZCBvZiBhbiBhdWRpdCBvZiBldmVyeSBjdXN0b20gUm9sZS5cbiAqXG4gKiBJdCBjYXJyaWVzIGFsbCB0aHJlZSBjb25zb2xlcywgd2hpY2ggaXMgdGhlIHdob2xlIGpvYiBmb3IgdGhlIHBlcnNvbiB3aG8gaG9sZHNcbiAqIGl0LiBPTkUgQ09OU0VRVUVOQ0UgV09SVEggS05PV0lORzogYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgYW5kXG4gKiBgb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuYCBhcmUgdGhlIHR3byBoYWx2ZXMgb2YgdGhlIGF1ZGl0IHRhbXBlci1ldmlkZW5jZVxuICogZGVzaWduIOKAlCBhIE1vbmdvIHNoZWxsIGNhbiB0cnVuY2F0ZSBhIGhhc2ggY2hhaW4ncyB0YWlsLCBhbmQgdGhlIG9iamVjdCBzdG9yZVxuICogaG9sZHMgdGhlIHNpZ25lZCBoZWFkcyB0aGF0IHdvdWxkIGV4cG9zZSB0aGUgdHJ1bmNhdGlvbiDigJQgc28gYSBob2xkZXIgb2YgdGhpc1xuICogUm9sZSBjYW4gZG8gYm90aC4gVGhlIHBlcm1pc3Npb25zIHN0YXkgU0VQQVJBVEUgZm9yIGV4YWN0bHkgdGhhdCByZWFzb246IGFcbiAqIGRlcGxveW1lbnQgdGhhdCB3YW50cyB0aGVtIGhlbGQgYnkgZGlmZmVyZW50IHBlb3BsZSBjb21wb3NlcyBhIG5hcnJvd2VyIFJvbGVcbiAqIGJ5IGhhbmQgKGEgc3VwZXJhZG1pbiBtYXkgaW5jbHVkZSBhbnkgc3lzdGVtLW9yZy1vbmx5IHBlcm1pc3Npb24gaW4gYSBSb2xlXG4gKiBhdXRob3JlZCBpbiB0aGUgc3lzdGVtIG9yZykgYW5kIGFzc2lnbnMgdGhpcyBvbmUgdG8gbm9ib2R5LlxuICovXG4vKipcbiAqIFBMQVRGT1JNIE9CU0VSVkVSIOKAlCBsb29rLCBkb24ndCB0b3VjaC4gVGhlIGxhZGRlcidzIG1pc3NpbmcgYm90dG9tIHJ1bmcuXG4gKlxuICogRXZlcnkgb3RoZXIgc3lzdGVtLW9yZyBidW5kbGUgZ3JhbnRzIGEgd3JpdGUuIFRoZSBvbmUgdGhhdCBkb2VzIG5vdCDigJRcbiAqIENvbnNvbGUgQWRtaW5pc3RyYXRvciDigJQgZ3JhbnRzIGEgcmVhZCB0aGF0IElTIGEgZGF0YWJhc2Ugc2hlbGwuIFNvIHNvbWVib2R5XG4gKiB3aG8gc2hvdWxkIHNlZSB0aGUgZGVwbG95bWVudCBhbmQgY2hhbmdlIG5vdGhpbmcgKGEgbmV3IG9wZXJhdG9yIHNoYWRvd2luZywgYW5cbiAqIGF1ZGl0b3IsIGFuIG9uLWNhbGwgZW5naW5lZXIgZHVyaW5nIGEgaGFuZG92ZXIpIGhhZCB0d28gb3B0aW9uczogU3VwZXIgQWRtaW4sXG4gKiBvciBub3RoaW5nLiBUaGUgdXN1YWwgb3V0Y29tZSBvZiBhIGNob2ljZSBsaWtlIHRoYXQgaXMgdGhlIGZsYWcuXG4gKlxuICogU3RyaWN0bHkgcmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjogZXZlcnkgcGVybWlzc2lvbiBoZXJlIGVuZHMgYDpyZWFkYCwgd2hpY2hcbiAqIGBpc011dGF0aW9uUGVybWlzc2lvbmAgY2xhc3NpZmllcyBhcyBhIHJlYWQsIHNvIHRoZSBkYXNoYm9hcmQgZGlzYWJsZXMgZXZlcnlcbiAqIHdyaXRlIGFmZm9yZGFuY2UgZm9yIGEgaG9sZGVyIHJhdGhlciB0aGFuIG9mZmVyaW5nIGNvbnRyb2xzIHRoYXQgNDAzLlxuICpcbiAqIE5PVCBgYXVkaXQ6cmVhZGAuIEl0IHdvdWxkIGJlIHRoZSBvYnZpb3VzIGFkZGl0aW9uIGFuZCBpdCBpcyB0aGUgd3Jvbmcgb25lOlxuICogYGxpc3RBdWRpdEV2ZW50c2AgcGlucyBldmVyeSBub24tc3VwZXJhZG1pbiB0byB0aGVpciBPV04gb3JnLCBzbyBhIHN5c3RlbS1vcmdcbiAqIG9ic2VydmVyIGhvbGRpbmcgaXQgd291bGQgc2VlIHRoZSBzeXN0ZW0gb3JnJ3MgYXVkaXQgdHJhaWwgYW5kIG5vdGhpbmcgZWxzZSDigJRcbiAqIGFuIGFmZm9yZGFuY2UgdGhhdCBsb29rcyBsaWtlIGZsZWV0LXdpZGUgYXVkaXQgYWNjZXNzIGFuZCBpcyBub3QuIFJlYWRpbmdcbiAqIGFub3RoZXIgdGVuYW50J3MgdHJhaWwgaXMgZGVsaWJlcmF0ZWx5IHRoZSBmbGFnJ3MgYWxvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAvLyBBIHJlYWQsIGFuZCB0aGlzIFJvbGUgaXMgcmVhZHMg4oCUIHRoZSByZWdpc3RyeSBicm93c2VyIHdpdGggbmVpdGhlciBvZiB0aGVcbiAgLy8gdHdvIHdyaXRlIHJ1bmdzIChgcmVnaXN0cnk6d3JpdGVgIGNvcGllcywgYHJlZ2lzdHJ5OnB1cmdlYCBkZWxldGVzKS5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuZXhwb3J0IGNvbnN0IENPTlNPTEVfQURNSU5fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsXG4gICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAvLyBUaGUgYWxsLW9yZ2FuaXphdGlvbnMgbGlzdCwgc28gYSBob2xkZXIgY2FuIGZpbmQgdGhlIG9yZyB0aGV5IHdlcmUgYXNrZWRcbiAgLy8gYWJvdXQgd2l0aG91dCBhIHNlY29uZCBSb2xlIOKAlCBhbmQgbm90aGluZyBtb3JlLiBUaGlzIHdhcyBgcGxhdGZvcm06cmVhZGAsXG4gIC8vIHdoaWNoIG1lYW50IG9wZW5pbmcgYSBkYXRhYmFzZSBjb25zb2xlIGFsc28gZ3JhbnRlZCB0aGUgZGVwbG95J3Mgb3duXG4gIC8vIGNvbmZpZ3VyYXRpb24sIGZvciBubyByZWFzb24gYmV5b25kIHRoZSB0d28gc2hhcmluZyBhIGdhdGUuXG4gICdvcmdzOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBSRUdJU1RSWSBPUEVSQVRPUiDigJQgbW92ZXMgY29udGFpbmVyIGltYWdlcyBhcm91bmQsIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gUHJvbW90aW5nIGFuIGltYWdlIOKAlCBjb3B5aW5nIGEgYnVpbHQgdGFnIGZyb20gb25lIHJlcG9zaXRvcnlcbiAqIHRvIHRoZSBvbmUgYSByZWxlYXNlIHJlc29sdmVzIOKAlCBpcyBhIGpvYiBzb21lYm9keSBkb2VzLCBhbmQgdW50aWwgbm93IHRoZSBvbmx5XG4gKiBpZGVudGl0eSB0aGF0IGNvdWxkIGRvIGl0IHdhcyBhIHN1cGVyYWRtaW4uIGByZWdpc3RyeTp3cml0ZWAgaGFzIG5vIG90aGVyXG4gKiBjYXJyaWVyLCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHkgcGVybWlzc2lvbiB3aXRoIG5vIHNlZWRlZCBjYXJyaWVyIGlzXG4gKiBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2UgKHRoZSBgcGxhdGZvcm06cmVhZGAgZmFpbHVyZSwgcGlubmVkIGJ5IHRoZVxuICogXCJhdCBsZWFzdCBvbmUgc2VlZGVkIGNhcnJpZXJcIiBhc3NlcnRpb24gaW4gYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKiBTbyBzcGxpdHRpbmcgYHJlZ2lzdHJ5OnB1cmdlYCBvdXQgb2YgYHJlZ2lzdHJ5OndyaXRlYCBpcyBvbmx5IGhhbGYgdGhlIGNoYW5nZTpcbiAqIHRoZSBhZGRpdGl2ZSBoYWxmIG5lZWRzIGEgUm9sZSBvciB0aGUgc3BsaXQgYnV5cyBub3RoaW5nLlxuICpcbiAqIFdIWSBJVCBJUyBOT1QgUEFSVCBPRiBQTEFURk9STSBPUEVSQVRPUi4gVGhhdCBSb2xlIHJ1bnMgdGhlIGRlcGxveW1lbnQgYW5kXG4gKiBhbHJlYWR5IHJlYWRzIHRoZSByZWdpc3RyeS4gUHJvbW90aW5nIGFuIGltYWdlIGlzIGEgcmVsZWFzZSBkZWNpc2lvbiwgbm90IGFuXG4gKiBvcGVyYXRpb25hbCBzaWRlIGVmZmVjdCwgYW5kIHJvbGxpbmcgaXQgaW50byB0aGUgUm9sZSBldmVyeW9uZSBvbiBjYWxsIGhvbGRzXG4gKiB3b3VsZCBtZWFuIHRoZSBwYWdlciByb3RhdGlvbiBjYW4gcmV0YWcgYSByZWxlYXNlIGF0IDNhbS4gVGhlIHR3byBSb2xlc1xuICogY29tcG9zZSBpbnN0ZWFkIOKAlCBhIG1lbWJlciBtYXkgaG9sZCBhbnkgbnVtYmVyLCBhbmQgcGVybWlzc2lvbnMgYXJlIHRoZSB1bmlvbi5cbiAqXG4gKiBXSFkgSVQgSVMgT05MWSBUV08gUEVSTUlTU0lPTlMuIERlbGliZXJhdGVseSBub3RoaW5nIGVsc2U6IG5vIGBwbGF0Zm9ybTpyZWFkYCxcbiAqIG5vIGNvbnNvbGUsIG5vIGBvcmdzOnJlYWRgLiBgY2FuUmVhZFJlcG9gL2BjYW5Xcml0ZVJlcG9gIGNvbmZpbmUgYVxuICogbm9uLXN1cGVyYWRtaW4gc3lzdGVtLW9yZyBob2xkZXIgdG8gYHN5c3RlbS8qYCwgYGxpYnJhcnkvKmAgYW5kIGBwdWJsaWMvKmAg4oCUXG4gKiB0aGlzIGRlcGxveW1lbnQncyBvd24gYmFzZSBhbmQgcGx1Z2luIGltYWdlcyDigJQgc28gdGhlIFJvbGUgY2Fubm90IHJlYWNoIGFcbiAqIHRlbmFudCdzIHJlcG9zaXRvcmllcyBhdCBhbGwsIGFuZCBhIGhvbGRlciB3aG8gYWxzbyBuZWVkcyB0aGUgb3BlcmF0b3Igdmlld3NcbiAqIGdldHMgdGhlIG9wZXJhdG9yIFJvbGUgdG9vLiBJdCBkb2VzIE5PVCBjYXJyeSBgcmVnaXN0cnk6cHVyZ2VgLCB3aGljaCBpcyBpblxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIGluIG5vIGJ1bmRsZSBieSBkZXNpZ246IGFuIGltYWdlXG4gKiBwcm9tb3RlciBoYXMgbm8gYnVzaW5lc3MgZGVsZXRpbmcgdGhlIGltYWdlIGEgdGVuYW50J3MgcGlwZWxpbmUgcmVzb2x2ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncmVnaXN0cnk6cmVhZCcsXG4gICdyZWdpc3RyeTp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgQUdFTlQg4oCUIHRoZSBzdXBwb3J0IGRlc2ssIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gYHBsYXRmb3JtOnJlYWRgLCBubyBjb25zb2xlIGFuZCBubyBiaWxsaW5nIHdyaXRlOiBhblxuICogYWdlbnQgYW5zd2VycyBjYXNlcyBhbmQgd3JpdGVzIHRoZSBjYW5uZWQgcmVwbGllcy4gYHN1YnNjcmlwdGlvbnM6cmVhZGAgaXNcbiAqIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgcXVlc3Rpb24gb24gYW55IGNhc2UgaXMgd2hhdCB0aGUgY3VzdG9tZXIgaXMgZW50aXRsZWRcbiAqIHRvLCBhbmQgd2l0aG91dCBpdCBhbiBhZ2VudCB3b3VsZCBoYXZlIHRvIGFzayBzb21lb25lIGVsc2UgdG8gbG9vay5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRfQUdFTlRfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1cHBvcnRfY2FzZXM6d3JpdGUnLFxuICAnc3VwcG9ydF9jb250ZW50OndyaXRlJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gIC8vIE5FVywgYW5kIHRoZSBnYXAgdGhlIHNwbGl0IGV4cG9zZWQ6IGFuIGFnZW50IHRyaWFnaW5nIGEgY2FzZSBuZWVkcyB0byBmaW5kXG4gIC8vIHRoZSBjdXN0b21lcidzIG9yZ2FuaXphdGlvbi4gVGhlIG9ubHkgcGVybWlzc2lvbiB0aGF0IGxpc3RlZCBvcmdzIHdhc1xuICAvLyBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIHdvdWxkIGFsc28gaGF2ZSBoYW5kZWQgYSBzdXBwb3J0IGFnZW50IHRoZSBkZXBsb3knc1xuICAvLyBpbnRlcm5hbHMg4oCUIHNvIHRoZXkgaGFkIG5laXRoZXIsIGFuZCBoYWQgdG8gYXNrIHNvbWVvbmUgZWxzZSB0byBsb29rLlxuICAnb3JnczpyZWFkJyxcbiAgLy8gUmVhZGluZyBhbmQgYW5zd2VyaW5nIHRoZSBjYXNlIGl0c2VsZiByaWRlcyB0aGUgb3JkaW5hcnkgbWVzc2FnaW5nXG4gIC8vIHBlcm1pc3Npb25zIOKAlCBhIHN1cHBvcnQgY2FzZSBJUyBhIG1lc3NhZ2UgdGhyZWFkLlxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdtZXNzYWdlczp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgTEVBRCDigJQgdGhlIHN1cHBvcnQgZGVzaywgcGx1cyB0aGUgYXV0aG9yaXR5IHRvIGxvb2suXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gYGltcGVyc29uYXRpb246b3BlbmAgaXMgc3lzdGVtLW9yZy1vbmx5LCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHlcbiAqIHBlcm1pc3Npb24gd2l0aCBubyBzZWVkZWQgY2FycmllciBpcyBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2Ug4oCUIHRoZVxuICogaW52YXJpYW50IGFwaS1jb3JlJ3MgYHRlc3QvcGVybWlzc2lvbnMudGVzdC50c2AgYXNzZXJ0cywgYW5kIHRoZSByZWFzb25cbiAqIGBwbGF0Zm9ybTpyZWFkYCBzaGlwcGVkIHVudXNhYmxlLiBXaXRob3V0IHRoaXMgUm9sZSwgc3BsaXR0aW5nIGltcGVyc29uYXRpb25cbiAqIG91dCBvZiB0aGUgZmxhZyB3b3VsZCBjaGFuZ2Ugbm90aGluZzogdGhlIG9ubHkgd2F5IHRvIGxldCBzb21lYm9keSB2aWV3IGFcbiAqIGN1c3RvbWVyJ3MgYWNjb3VudCB3b3VsZCBzdGlsbCBiZSB0byBtYWtlIHRoZW0gYSBmdWxsIFN1cGVyIEFkbWluLCBoYW5kaW5nXG4gKiBvdmVyIGAvYWRtaW4vdXNlcnMvOmlkL2dyYW50c2AsIHRoZSBzaW5nbGUtcGVyc29uIE1GQSByZXNldCwgdGhlIGRhdGFiYXNlXG4gKiBjb25zb2xlIGFuZCBgcmVnaXN0cnk6cHVyZ2VgIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogV0hZIElUIElTIFRIRSBTVVBQT1JUIERFU0sgQU5EIE5PVCBUSEUgT1BFUkFUT1IuIFRoZSBxdWVzdGlvbiBpbXBlcnNvbmF0aW9uXG4gKiBhbnN3ZXJzIGlzIFwid2hhdCBpcyB0aGlzIGN1c3RvbWVyIGFjdHVhbGx5IHNlZWluZz9cIiwgd2hpY2ggaXMgYSBzdXBwb3J0XG4gKiBxdWVzdGlvbi4gUGxhdGZvcm0gT3BlcmF0b3IgcnVucyB0aGUgZGVwbG95bWVudCBhbmQgaXMgaGVsZCBieSB3aG9ldmVyIGlzIG9uXG4gKiBjYWxsOyBhZGRpbmcgdGhpcyB0byBpdCB3b3VsZCBoYW5kIGV2ZXJ5IHJvdGEgbWVtYmVyIHRoZSBhYmlsaXR5IHRvIGJlY29tZSBhbnlcbiAqIGN1c3RvbWVyJ3MgdXNlciBhdCAzYW0uIFN1cHBvcnQgQWdlbnQncyBidW5kbGUgcGx1cyB0aGUgb25lIHBlcm1pc3Npb24gaXMgdGhlXG4gKiBuYXJyb3dlciwgbW9yZSBob25lc3Qgc2hhcGUg4oCUIGFuZCBhIGxlYWQgd2hvIGFsc28gcnVucyB0aGUgZGVwbG95bWVudCBob2xkc1xuICogYm90aCBSb2xlcy5cbiAqXG4gKiBXSEFUIElUIFNUSUxMIENBTk5PVCBETy4gRW1lcmdlbmN5IGFjY2VzczogYGJyZWFrZ2xhc3NgIGJ5cGFzc2VzIHRlbmFudFxuICogY29uc2VudCBhbmQgc3RheXMgb24gdGhlIGZsYWcsIGFwcHJvdmVkIGJ5IGEgc2Vjb25kIFN1cGVyIEFkbWluLiBBbmQgdGhlXG4gKiB0ZW5hbnQgY2FuIHJlZnVzZSDigJQgYGltcGVyc29uYXRpb246b3BlbmAgaXMgcGVybWlzc2lvbiB0byBBU0suXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JUX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUyxcbiAgJ2ltcGVyc29uYXRpb246b3BlbicsXG5dO1xuXG4vKipcbiAqIFNUQVJUSU5HIFBPSU5UUyBmb3IgYSBjdXN0b20gUm9sZSBpbiBhIHRlbmFudCBvcmcg4oCUIHRlbXBsYXRlcywgbm90IFJvbGVzLlxuICpcbiAqIFRIRSBHQVAgVEhFWSBGSUxMLiBBbiBvcmcgc2VlZHMgZXhhY3RseSBUV08gUm9sZXMg4oCUIE1lbWJlciBhbmQgQWRtaW4g4oCUIGFuZFxuICogQWRtaW4gaXMgZXZlcnkgb3JnLWFzc2lnbmFibGUgcGVybWlzc2lvbi4gU28gcHJvbW90aW5nIGFueW9uZSBwYXN0IFwiYXV0aG9yIGFuZFxuICogcmVhZFwiIGhhbmRzIG92ZXIgdGhlIHdob2xlIHJlbWFpbmRlciBhdCBvbmNlOiBgb3JnX2ttczp3cml0ZWAsXG4gKiBgb3JnX2lkcDp3cml0ZWAsIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAsIGBiaWxsaW5nOm1hbmFnZWAsIGByb2xlczptYW5hZ2VgXG4gKiBhbmQgYGF1ZGl0OnJlYWRgIGFtb25nIHRoZW0uIFRoZSBwcm9kdWN0J3MgYW5zd2VyIGlzIFwiYXV0aG9yIGEgY3VzdG9tIFJvbGVcIixcbiAqIGFuZCB0aGUgc2FmZXR5IGlzIGFscmVhZHkgcmlnaHQgKGBzYW5pdGl6ZVBlcm1pc3Npb25zYCBib3VuZHMgYSBjdXN0b20gUm9sZSBieVxuICogaXRzIGF1dGhvcidzIG93biBjZWlsaW5nKS4gV2hhdCB3YXMgbWlzc2luZyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogVGhlIGV4YWN0IHNpemVzIG9mIHRoYXQgY2xpZmYgYXJlIGFzc2VydGVkIGluIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgXG4gKiByYXRoZXIgdGhhbiB3cml0dGVuIGhlcmUuIFRoaXMgcGFyYWdyYXBoIHVzZWQgdG8gY2FycnkgdGhlbSBpbmxpbmUg4oCUIFwidGhyZWVcbiAqIFJvbGVzOiBNZW1iZXIgKDE1KSwgVGVhbSBMZWFkICgxNykgYW5kIEFkbWluICgzNylcIiDigJQgYW5kIGV2ZXJ5IG9uZSBvZiB0aG9zZVxuICogbnVtYmVycyB3ZW50IHN0YWxlOiBgVGVhbSBMZWFkYCBzdG9wcGVkIGJlaW5nIHNlZWRlZCB3aGVuIGl0IGJlY2FtZSB0aGUgZmlyc3RcbiAqIHRlbXBsYXRlIGJlbG93LCBhbmQgdGhlIHR3byBidW5kbGVzIGhhdmUgZ3Jvd24gc2luY2UuIEEgY291bnQgbm90aGluZyBjaGVja3NcbiAqIGlzIGEgY2xhaW0gdGhhdCBkZWNheXMsIGFuZCB0aGlzIG9uZSB3YXMgdGhlIHN0YXRlZCByYXRpb25hbGUgZm9yIHRoZSBmZWF0dXJlLlxuICpcbiAqIFdIWSBURU1QTEFURVMgQU5EIE5PVCBTRUVERUQgUk9MRVMuIEEgc2VlZGVkIGJ1aWx0LWluIGlzIGBzeXN0ZW06IHRydWVgIGFuZFxuICogdGhlcmVmb3JlIGltbXV0YWJsZSwgc28gc2VlZGluZyB0aGVzZSB3b3VsZCBwdXQgZm91ciB1bmRlbGV0YWJsZSByb3dzIGluIGV2ZXJ5XG4gKiBvcmcgd2hldGhlciBpdCB3YW50cyB0aGVtLiBBIHRlbXBsYXRlIGxlYXZlcyBubyB0cmFjZSB1bnRpbCBzb21lb25lIHVzZXMgaXQsXG4gKiBhbmQgd2hhdCBpdCBwcm9kdWNlcyBpcyBhbiBvcmRpbmFyeSBjdXN0b20gUm9sZSB0aGUgb3JnIGZ1bGx5IG93bnMg4oCUIGVkaXRhYmxlLFxuICogZGVsZXRhYmxlLCBhbmQgYm91bmRlZCBieSB0aGUgYXV0aG9yJ3MgY2VpbGluZyBsaWtlIGFueSBvdGhlci5cbiAqXG4gKiBXSEFUIFRIRVkgREVMSUJFUkFURUxZIEVYQ0xVREUuIGByb2xlczptYW5hZ2VgIGlzIGluIG5vbmUgb2YgdGhlbS4gSXQgaXMgdGhlXG4gKiBvbmUgcGVybWlzc2lvbiB0aGF0IGNvbXBvdW5kcyDigJQgdGhlIGhvbGRlciBjYW4gbWludCBmdXJ0aGVyIFJvbGVzLCB1cCB0byB0aGVpclxuICogb3duIGNlaWxpbmcg4oCUIHNvIGFjcXVpcmluZyBpdCBzaG91bGQgc3RheSBhIGNvbnNjaW91cyBhY3QgcmF0aGVyIHRoYW4gYSBzaWRlXG4gKiBlZmZlY3Qgb2YgcGlja2luZyBhIHByZXNldC4gRXZlcnkgcGVybWlzc2lvbiBoZXJlIGlzIG9yZy1hc3NpZ25hYmxlLCBzbyBhXG4gKiB0ZW1wbGF0ZSBpcyB2YWxpZCBpbiBhbnkgb3JnIGFuZCBgc2FuaXRpemVQZXJtaXNzaW9uc2AgYWNjZXB0cyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlVGVtcGxhdGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBXaGF0IHRoZSBqb2IgaXMg4oCUIHNob3duIG5leHQgdG8gdGhlIHRlbXBsYXRlLCBhbmQgYSBzZW5zaWJsZSBSb2xlIGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUGVybWlzc2lvbltdO1xufVxuXG5leHBvcnQgY29uc3QgUk9MRV9URU1QTEFURVM6IHJlYWRvbmx5IFJvbGVUZW1wbGF0ZVtdID0gW1xuICB7XG4gICAgLy8gV2FzIGEgU0VFREVEIFJvbGUgaW4gZXZlcnkgb3JnIHVudGlsIGl0IGJlY2FtZSBhIHRlbXBsYXRlLiBJdCBpcyB0aGUgb25seVxuICAgIC8vIGJ1aWx0LWluIHRoYXQgd2FzIGEgam9iIGRlc2NyaXB0aW9uIHJhdGhlciB0aGFuIGEgc3RydWN0dXJhbCByZXF1aXJlbWVudDpcbiAgICAvLyBTdXBlciBBZG1pbiBpcyB3aGVyZSBgaXNTdXBlckFkbWluYCBpcyBkZXJpdmVkIGZyb20sIEFkbWluIGFuZCBNZW1iZXIgYXJlXG4gICAgLy8gdGhlIGZsb29yIGFuIG9yZyBpcyB1bnVzYWJsZSB3aXRob3V0LCBhbmQgdGhlIHN5c3RlbS1vcmcgUm9sZXMgY2FycnlcbiAgICAvLyBwZXJtaXNzaW9ucyBubyBjdXN0b20gUm9sZSBtYXkgaG9sZC4gVGVhbSBMZWFkIHdhcyBub25lIG9mIHRob3NlIOKAlCBpdCBpc1xuICAgIC8vIGBtZW1iZXJgIHBsdXMgdHdvIHJlcG9ydCBwZXJtaXNzaW9ucywgYW5kIGFuIG9yZyB0aGF0IGRvZXMgbm90IGRlbGVnYXRlXG4gICAgLy8gcmVwb3J0IGF1dGhvcmluZyBoYWQgYW4gdW5kZWxldGFibGUgcm93IGZvciBpdCBhbnl3YXkuXG4gICAgLy9cbiAgICAvLyBDT05TRVFVRU5DRSwgc3RhdGVkIHJhdGhlciB0aGFuIGRpc2NvdmVyZWQ6IGEgbmV3IG9yZyBubyBsb25nZXIgaGFzIGEgUm9sZVxuICAgIC8vIHRoYXQgZ3JhbnRzIGByZXBvcnRzOndyaXRlYCB0byBhIG5vbi1hZG1pbi4gQW4gYWRtaW4gaG9sZHMgYm90aCBwZXJtaXNzaW9uc1xuICAgIC8vICh0aGV5IGFyZSBpbiB0aGUgYWRtaW4gYnVuZGxlKSBhbmQgaW5zdGFudGlhdGVzIHRoaXMgdGVtcGxhdGUgdG8gZGVsZWdhdGVcbiAgICAvLyB0aGVtIOKAlCB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgZm91ciBiZWxvdy4gT3JncyB0aGF0IGFscmVhZHkgaGF2ZSB0aGUgc2VlZGVkXG4gICAgLy8gUm9sZSBrZWVwIGl0LCBhbmQgdGhlIGJhY2tmaWxsIGtlZXBzIGl0cyBidW5kbGUgY3VycmVudC5cbiAgICBpZDogJ3RlYW0tbGVhZCcsXG4gICAgbmFtZTogJ1RlYW0gTGVhZCcsXG4gICAgZGVzY3JpcHRpb246ICdBdXRob3JzIGFuZCBzaGFyZXMgc3Rha2Vob2xkZXIgcmVwb3J0cyBmb3IgYSB0ZWFtLCB3aXRob3V0IG9yZy1hZG1pbiBhY2Nlc3MuJyxcbiAgICBwZXJtaXNzaW9uczogWy4uLk1FTUJFUl9QRVJNSVNTSU9OUywgJ3JlcG9ydHM6d3JpdGUnLCAncmVwb3J0czpwdWJsaXNoJ10sXG4gIH0sXG4gIHtcbiAgICAvKipcbiAgICAgKiBNRU1CRVIgQUxSRUFEWSBJUyBUSEUgREVWRUxPUEVSIFJPTEUg4oCUIHRoaXMgdGVtcGxhdGUgZXhpc3RzIGZvciB3aGF0IGl0XG4gICAgICogZG9lcyBOT1QgY292ZXIuXG4gICAgICpcbiAgICAgKiBFdmVyeXRoaW5nIGluIGEgZGV2ZWxvcGVyJ3MgbG9vcCBpcyBgcGlwZWxpbmVzOnJlYWRgICsgYHBpcGVsaW5lczp3cml0ZWAsXG4gICAgICogYm90aCBpbiB0aGUgbWVtYmVyIGJ1bmRsZTogY3JlYXRlLCBlZGl0LCB2YWxpZGF0ZSwgcnVuLCBzdG9wLCB0aGUgYnVsa1xuICAgICAqIG9wcywgQUkgZ2VuZXJhdGlvbiAoYC9waXBlbGluZXMvZ2VuZXJhdGVgLCBpbmNsLiBmcm9tLXVybCBhbmQgc3RyZWFtaW5nKSxcbiAgICAgKiB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIHBsdXMgYHRlbXBsYXRlczpyZWFkYCB0byBpbnN0YW50aWF0ZSBhbmRcbiAgICAgKiBgcGx1Z2luczppbnN0YWxsYCB0byBhZGQgYSBwbHVnaW4uIEEgdGVtcGxhdGUgcmVzdGF0aW5nIHRoYXQgd291bGQgYnV5XG4gICAgICogbm90aGluZy5cbiAgICAgKlxuICAgICAqIFdoYXQgYSBkZXZlbG9wZXIgaGl0cyB0aGUgY2xpZmYgb24gaXMgdGhlIFNFTEYtU0VSVklDRSBvcGVyYXRlIHBhaXI6IHRoZXlcbiAgICAgKiBjYW4gcmVhZCB0aGVpciBzZXJ2aWNlJ3MgZGFzaGJvYXJkcyBhbmQgbWV0cmljcyBhbmQgY2Fubm90IGNoYW5nZSBlaXRoZXIsXG4gICAgICogYmVjYXVzZSBib3RoIHdyaXRlcyBzaXQgaW4gdGhlIGFkbWluIGJ1bmRsZS4gU28gdGhlIHBlcnNvbiB3aG8gb3ducyBhXG4gICAgICogcGlwZWxpbmUgZmlsZXMgYSB0aWNrZXQgdG8gZ2V0IGFuIGFsZXJ0IG9uIGl0LlxuICAgICAqXG4gICAgICogREVMSUJFUkFURUxZIE5PVCBIRVJFLiBgbG9nczpleHBvcnRgIOKAlCB2aWV3aW5nIGxvZ3MgcmlkZXNcbiAgICAgKiBgb2JzZXJ2YWJpbGl0eTpyZWFkYCwgYnV0IGRvd25sb2FkaW5nIHRoZW0gaXMgYnVsayBlZ3Jlc3MgYW4gb3JnIG1heVxuICAgICAqIHdpdGhob2xkIGZyb20gbWVtYmVycyAoZG9jcy9wZXJtaXNzaW9ucy5tZCksIGFuZCBhIHRlbXBsYXRlIGFpbWVkIGF0IGV2ZXJ5XG4gICAgICogZW5naW5lZXIgd291bGQgcmV2ZXJzZSB0aGF0LiBgcGlwZWxpbmVzOnB1Ymxpc2hgIOKAlCBzaGFyaW5nIGJleW9uZCB0aGVcbiAgICAgKiBhdXRob3IgaXMgYSByZWxlYXNlIGRlY2lzaW9uLCB3aGljaCBpcyBSZWxlYXNlIE1hbmFnZXIncyBiZWxvdzsgc29tZWJvZHlcbiAgICAgKiB3aG8gZG9lcyBib3RoIGhvbGRzIGJvdGggUm9sZXMuXG4gICAgICovXG4gICAgaWQ6ICdkZXZlbG9wZXInLFxuICAgIG5hbWU6ICdEZXZlbG9wZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGRzIGFuZCBydW5zIHBpcGVsaW5lcywgYW5kIG93bnMgdGhlIGRhc2hib2FyZHMgYW5kIGFsZXJ0cyBmb3Igd2hhdCB0aGV5IGJ1aWxkLicsXG4gICAgcGVybWlzc2lvbnM6IFsuLi5NRU1CRVJfUEVSTUlTU0lPTlMsICdkYXNoYm9hcmRzOndyaXRlJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnXSxcbiAgfSxcbiAge1xuICAgIGlkOiAncmVsZWFzZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUmVsZWFzZSBNYW5hZ2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RlY2lkZXMgd2hhdCBiZWNvbWVzIHNoYXJlZCBiZXlvbmQgaXRzIGF1dGhvciwgYW5kIGFwcHJvdmVzIHBsdWdpbiBpbnN0YWxscy4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLFxuICAgICAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdzZWN1cml0eS1vZmZpY2VyJyxcbiAgICBuYW1lOiAnU2VjdXJpdHkgT2ZmaWNlcicsXG4gICAgZGVzY3JpcHRpb246ICdJZGVudGl0eSwgZW5jcnlwdGlvbiBrZXlzIGFuZCB0aGUgZXZpZGVuY2UgdHJhaWwg4oCUIHRoZSBzdXJmYWNlIGFuIGF1ZGl0b3IgYXNrcyBhYm91dC4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYXVkaXQ6cmVhZCcsICdsb2dzOmV4cG9ydCcsXG4gICAgICAnY29tcGxpYW5jZTpyZWFkJywgJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgICAgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG4gICAgICAvLyBPd25pbmcgdGhlIGltcGVyc29uYXRpb24gUE9MSUNZIChgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgKSB3aXRob3V0XG4gICAgICAvLyBiZWluZyBhYmxlIHRvIGFuc3dlciBhIFJFUVVFU1Qgd2FzIHRoZSBhc3ltbWV0cnkgdGhlIGNvbnNlbnQgZmxvdyBsZWZ0XG4gICAgICAvLyBiZWhpbmQ6IHRoZSBsZXNzZXIgYWN0IGhhZCBhIHBlcm1pc3Npb24gb2YgaXRzIG93biBhbmQgdGhlIGdyZWF0ZXIgb25lXG4gICAgICAvLyBoYWQgbm9uZS4gV2hvZXZlciBkZWNpZGVzIHdoZXRoZXIgY29uc2VudCBpcyByZXF1aXJlZCBzaG91bGQgYmUgYWJsZSB0b1xuICAgICAgLy8gZ2l2ZSBvciB3aXRoaG9sZCBpdC5cbiAgICAgICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ3Blb3BsZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUGVvcGxlIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHJvc3RlciBhbmQgaXRzIG1hY2hpbmUgY3JlZGVudGlhbHMsIGFjcm9zcyB0aGUgYWNjb3VudFxcdTIwMTlzIHRlYW1zIOKAlCB3aXRob3V0IHRoZSBvcmdcXHUyMDE5cyBzZXR0aW5ncyBvciBpdHMgbW9uZXkuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ21lbWJlcnM6bWFuYWdlJywgJ2ludml0YXRpb25zOm1hbmFnZScsICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZScsXG4gICAgICAvLyBUaGUgc2FtZSBqb2IsIG9uZSBsZXZlbCBkb3duOiBlbnRlcmluZyBhIGRlc2NlbmRhbnQgdGVhbSB0byB3b3JrIG9uIGl0c1xuICAgICAgLy8gcm9zdGVyLCBhbmQgdmlld2luZyBvbmUgb2YgaXRzIG1lbWJlcnMgYXMgdGhhdCBtZW1iZXIuIFdpdGhvdXQgaXQgYVxuICAgICAgLy8gcGVvcGxlIG1hbmFnZXIgaW4gYSBwYXJlbnQgb3JnIGNhbiBhZG1pbmlzdGVyIHRoZSBhY2NvdW50J3MgdGVhbXMgb25cbiAgICAgIC8vIHBhcGVyIGFuZCBub3QgcmVhY2ggdGhlbS5cbiAgICAgICd0ZWFtX2FjY2VzczpvcGVuJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdiaWxsaW5nLW1hbmFnZXInLFxuICAgIG5hbWU6ICdCaWxsaW5nIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHN1YnNjcmlwdGlvbiwgc2VhdHMgYW5kIGludm9pY2VzIGZvciB0aGlzIG9yZ2FuaXphdGlvbi4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYmlsbGluZzpyZWFkJywgJ2JpbGxpbmc6bWFuYWdlJywgJ3F1b3RhczpyZWFkJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgLyoqXG4gICAgICogVGhlIGpvYiB0aGUgaW1wZXJzb25hdGlvbiBjb25zZW50IGZsb3cgY3JlYXRlZCBJTlNJREUgdGhlIHRlbmFudDogdGhlXG4gICAgICogbmFtZWQgcGVyc29uIHdobyBhbnN3ZXJzIFwibWF5IGEgc3VwcG9ydCBlbmdpbmVlciB2aWV3IHRoaXMgYWNjb3VudD9cIiBhbmRcbiAgICAgKiBjYW4gYWZ0ZXJ3YXJkcyByZWFkIHdoYXQgaGFwcGVuZWQuXG4gICAgICpcbiAgICAgKiBJdCBleGlzdHMgYXMgYSB0ZW1wbGF0ZSBiZWNhdXNlIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIGlzIGluIHRoZSBhZG1pblxuICAgICAqIGFuZCBvd25lciBidW5kbGVzIOKAlCBzbyBieSBkZWZhdWx0IGV2ZXJ5IGFkbWluIG1heSBjb25zZW50IOKAlCBhbmQgdGhlIHdob2xlXG4gICAgICogcG9pbnQgb2Ygc3BsaXR0aW5nIGl0IG91dCB3YXMgdG8gbGV0IGFuIG9yZyBzYXkgXCJ0aGlzIGRlY2lzaW9uIGlzIG9uZVxuICAgICAqIHBlcnNvbidzXCIuIERvaW5nIHRoYXQgbWVhbnMgYXV0aG9yaW5nIGEgUm9sZSB0aGF0IGhvbGRzIGl0IGFuZCB0YWtpbmcgaXRcbiAgICAgKiBvZmYgdGhlIG90aGVycywgYW5kIGhhbmQtY29tcG9zaW5nIHdhcyB0aGUgb25seSByb3V0ZS5cbiAgICAgKlxuICAgICAqIFR3byBwZXJtaXNzaW9ucyBhbmQgbm8gbW9yZTogYXBwcm92aW5nIGlzIG5vdCBhZG1pbmlzdGVyaW5nLiBgYXVkaXQ6cmVhZGBcbiAgICAgKiBpcyBoZXJlIGJlY2F1c2UgY29uc2VudGluZyB3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hlY2sgd2hhdCB0aGUgc2Vzc2lvblxuICAgICAqIHRoZW4gZGlkIGlzIGNvbnNlbnQgaW4gbmFtZSBvbmx5LlxuICAgICAqL1xuICAgIGlkOiAnYWNjZXNzLWFwcHJvdmVyJyxcbiAgICBuYW1lOiAnQWNjZXNzIEFwcHJvdmVyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Fuc3dlcnMgcmVxdWVzdHMgdG8gdmlldyB0aGlzIG9yZ2FuaXphdGlvblxcdTIwMTlzIGFjY291bnRzLCBhbmQgcmVhZHMgdGhlIHRyYWlsIG9mIHdoYXQgaGFwcGVuZWQuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ2ltcGVyc29uYXRpb246YXBwcm92ZScsICdhdWRpdDpyZWFkJyxcbiAgICBdLFxuICB9LFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCB0aGUgTU9ERVJBVElPTiBqb2IuXG4gKlxuICogSXQgY2FycmllcyBgcGx1Z2luczptb2RlcmF0ZWAgYW5kIE5PVCBgcHVibGlzaGVyczp2ZXJpZnlgLCBiZWNhdXNlIHRoZSB0d28gYXJlXG4gKiBub3QgcGVlcnMuIGBwbHVnaW5zOm1vZGVyYXRlYCBpcyB0aGUgd2lkZSBzdXJmYWNlOiB5YW5rIGEgdmVyc2lvbiAod2hpY2hcbiAqIGJyZWFrcyBwaXBlbGluZXMgYWxyZWFkeSBydW5uaW5nIGl0KSwgcHVibGlzaCBhbiBhZHZpc29yeSAod2hpY2ggYWxhcm1zIGV2ZXJ5XG4gKiBjb25zdW1lciBvZiBhIGxpc3RpbmcpLCByZXdyaXRlIHRoZSBhdXRvLWFwcHJvdmFsIHJ1bGVzICh3aGljaCBkZWNpZGUgd2hhdFxuICogcHVibGlzaGVzIHdpdGggbm8gaHVtYW4gcmV2aWV3IGF0IGFsbCksIHJlc2VydmUgbmFtZXMsIG1vZGVyYXRlIHJldmlld3MsXG4gKiByZS1zaWduLiBgcHVibGlzaGVyczp2ZXJpZnlgIGlzIHRocmVlIHJvdXRlcyDigJQgc3VzcGVuZCwgdW5zdXNwZW5kLCB0aWVyIOKAlCBidXRcbiAqIG9uZSBvZiB0aGVtIEdSQU5UUyBWRVJJRklFRCBTVEFUVVMsIHdoaWNoIGlzIHRoZSBiYWRnZSBjb25zdW1lcnMgcmVhZCBhcyBcInRoaXNcbiAqIGRlcGxveW1lbnQgdm91Y2hlcyBmb3IgdGhlIHB1Ymxpc2hlclwiLlxuICpcbiAqIEJ1bmRsaW5nIHRoZW0sIGFzIHRoaXMgUm9sZSB1c2VkIHRvLCBtZWFudCBldmVyeW9uZSBoaXJlZCB0byB0cmlhZ2UgdGhlIHF1ZXVlXG4gKiBjb3VsZCBhbHNvIG1pbnQgYSBWZXJpZmllZCBwdWJsaXNoZXIuIFRocmVlIG1lY2hhbmlzbXMgYWxyZWFkeSBhc3N1bWUgdGhlXG4gKiBzcGxpdCBjYW4gYmluZCDigJQgYHJlcXVpcmVkRGVjaXNpb25QZXJtaXNzaW9uYCBwZXIgcmVxdWVzdCBraW5kLCB0aGUgcXVldWUnc1xuICogcGVyLXJvdyBgY2FuKHJlcXVpcmVkUGVybWlzc2lvbilgLCBhbmQgdGhlIGFwcHJvdmVyLXNob3J0YWdlIGNvdW50cyB0aGF0XG4gKiBgRWNvc3lzdGVtRWxpZ2liaWxpdHlgIHRyYWNrcyBTRVBBUkFURUxZIGZvciBlYWNoIHBlcm1pc3Npb24g4oCUIGFuZCB3aXRoIG9uZVxuICogY29tYmluZWQgUm9sZSBub25lIG9mIHRoZW0gY291bGQgZXZlciBkaXNjcmltaW5hdGUuXG4gKlxuICoge0BsaW5rIFBVQkxJU0hFUl9WRVJJRklFUl9QRVJNSVNTSU9OU30gaXMgdGhlIG90aGVyIGhhbGYuXG4gKi9cbmV4cG9ydCBjb25zdCBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczpyZWFkJyxcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLFxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUHVibGlzaGVyIFZlcmlmaWVyXCIgUm9sZSDigJQgdGhlIFRSVVNUIGRlY2lzaW9uLlxuICpcbiAqIFRoZSBvdGhlciBoYWxmIG9mIHRoZSBlY29zeXN0ZW0gc3BsaXQgZGVzY3JpYmVkIG9uXG4gKiB7QGxpbmsgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlN9OiB3aG8gbWF5IGF3YXJkIFZlcmlmaWVkLCBzdXNwZW5kIGFcbiAqIHB1Ymxpc2hlciBhbmQgbGlmdCBhIHN1c3BlbnNpb24uIENhcnJpZXMgYHBsdWdpbnM6cmVhZGAgc28gdGhlIGhvbGRlciBjYW4gc2VlXG4gKiB3aGF0IGEgcHVibGlzaGVyIHNoaXBzIGJlZm9yZSB2b3VjaGluZyBmb3IgdGhlbSwgYW5kIHRoZSBzYW1lIHR3byBhbWJpZW50XG4gKiByZWFkcyBhcyBpdHMgc2libGluZy5cbiAqXG4gKiBTVEFGRiBBVCBMRUFTVCBUV08gUEVPUExFLiBBIFZlcmlmaWVkIGFwcGxpY2F0aW9uIGFuZCBhbiB1bnN1c3BlbmQgYXJlIGJvdGhcbiAqIGBuZWVkc1R3b1BlcnNvbmAsIGFuZCBgY29uZmxpY3RPZkludGVyZXN0YCByZWZ1c2VzIHRoZSBzYW1lIHBlcnNvbiB0d2ljZSwgc28gYVxuICogc2luZ2xlIGhvbGRlciBjYW5ub3QgY29tcGxldGUgZWl0aGVyIGRlY2lzaW9uIGFsb25lLiBUaGUgY29uc29sZSdzIGFwcHJvdmVyXG4gKiBzdGFuZGluZyBub3RpY2UgaXMgd2hhdCBzdXJmYWNlcyB0aGF0IHNob3J0YWdlIOKAlCBhbmQgc3BsaXR0aW5nIHRoaXMgUm9sZSBvdXRcbiAqIGlzIHdoYXQgZmluYWxseSBsZXRzIHRoYXQgbm90aWNlIHJlcG9ydCBhIGZpZ3VyZSBpdHMgc2libGluZydzIGRvZXMgbm90LlxuICovXG5leHBvcnQgY29uc3QgUFVCTElTSEVSX1ZFUklGSUVSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbHVnaW5zOnJlYWQnLFxuICAncHVibGlzaGVyczp2ZXJpZnknLFxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiVGVhbSBMZWFkXCIgUm9sZSDigJQgdGhlIHBlcnNvbiB3aG8gcmVwb3J0cyBVUFdBUkQuXG4gKlxuICogRXhpc3RzIGJlY2F1c2UgdGhlIHRhcmdldCB1c2VyIGZvciBzdGFrZWhvbGRlciByZXBvcnRzIGlzIGEgbGVhZCwgbm90IGFuIGFkbWluLFxuICogYW5kIGdyYW50aW5nIGByZXBvcnRzOndyaXRlYCBvbmx5IHRocm91Z2ggdGhlIGFkbWluIGJ1bmRsZSB3b3VsZCBoYXZlIGZvcmNlZFxuICogZXZlcnkgcmVwb3J0aW5nIGxlYWQgdG8gYmUgYW4gb3JnIGFkbWluIChtZW1iZXJzOm1hbmFnZSwgcm9sZXM6bWFuYWdlLFxuICogb3JnX3NldHRpbmdzOndyaXRlLCBiaWxsaW5nKSB0byBzZW5kIHRoZWlyIG1hbmFnZXIgYSB3ZWVrbHkgc3VtbWFyeS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGluY2x1ZGVkOiBgcmVwb3J0czpyb2xsdXBgLiBSb2xsaW5nIGEgcmVwb3J0IHVwIG92ZXIgZGVzY2VuZGFudFxuICogdGVhbXMgaXMgZG93bndhcmQgdmlzaWJpbGl0eSBhY3Jvc3MgdGhlIG9yZyB0cmVlLCB3aGljaCBpcyBhIGdyYW50ZWQgY2FwYWJpbGl0eVxuICogaW4gdGhpcyBtb2RlbCwgbm90IHNvbWV0aGluZyBhIHRlYW0ncyBvd24gbGVhZCBnZXRzIGJ5IGRlZmF1bHQg4oCUIGEgbGVhZCBvZiBhXG4gKiBQQVJFTlQgb3JnIGlzIGdyYW50ZWQgaXQgZXhwbGljaXRseS4gVGhlIFJvbGUgZ3JhbnRzIHRoZSBjb2Fyc2UgYG1lbWJlcmAgbGFiZWxcbiAqIGFuZCBuZXZlciBzZXRzIGBpc1N1cGVyQWRtaW5gLlxuICovXG5leHBvcnQgY29uc3QgVEVBTV9MRUFEX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gIC4uLk1FTUJFUl9QRVJNSVNTSU9OUyxcbiAgJ3JlcG9ydHM6d3JpdGUnLFxuICAncmVwb3J0czpwdWJsaXNoJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlBpcGVsaW5lIEF1dG9tYXRpb25cIiBSb2xlIOKAlCB3aGF0IHRoZSBvcmcnc1xuICogdW5zY29wZWQgc3RvcmVkIGNyZWRlbnRpYWwgKHRoZSBgcGxhdGZvcm0tYXV0b21hdGlvbmAgc2VydmljZSBhY2NvdW50IHRoYXRcbiAqIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zKSBuZWVkcywgYW5kIG5vdGhpbmcgbW9yZS5cbiAqXG4gKiBEZXJpdmVkIGJ5IHRyYWNpbmcgZXZlcnkgY2FsbCBtYWRlIHdpdGggdGhhdCBrZXksIG5vdCBieSBndWVzc2luZzpcbiAqICAtIGBwaXBlbGluZXM6cmVhZGAg4oCUIHRoZSBDb2RlQnVpbGQgc3ludGggKGFuZCBgcGlwZWxpbmUgZGVwbG95IC0tc3RvcmUtdG9rZW5zYClcbiAqICAgIGZldGNoaW5nIHRoZSBwaXBlbGluZSBpdCBidWlsZHMgKGBHRVQgL3BpcGVsaW5lcy86aWRgKTtcbiAqICAtIGBwbHVnaW5zOnJlYWRgICAg4oCUIHBsdWdpbiByZXNvbHV0aW9uIGF0IHN5bnRoL2RlcGxveSBhbmQgaW4gdGhlIHBsdWdpbi1sb29rdXBcbiAqICAgIExhbWJkYSAoYFBPU1QgL3BsdWdpbnMvbG9va3VwYCksIGFuZCB0aGUgcnVuLXRpbWUgdnVsbmVyYWJpbGl0eSBjaGVjayBzdGVwXG4gKiAgICAoYFBPU1QgL3BsdWdpbnMvcnVudGltZS1jaGVja2ApLlxuICpcbiAqIFdoYXQgaXQgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGNhcnJ5LCBhbmQgd2hlcmUgdGhhdCB3b3JrIHdlbnQ6XG4gKiAgLSByZWdpc3RyeSB3cml0ZXMgKGBwaXBlbGluZV9yZWdpc3RyeTp3cml0ZWApIOKAlCB0aGUgc3ludGggcmVnaXN0ZXJzIGl0cyBzdGVwXG4gKiAgICBtYW5pZmVzdCB3aXRoIHRoZSBzZXBhcmF0ZSBgcGlwZWxpbmUtcmVnaXN0ZXJgIGtleSAoUGlwZWxpbmUgUmVnaXN0cmF0aW9uKTtcbiAqICAtIGltYWdlIHB1c2hlcyBhbmQgcHVsbHMg4oCUIENvZGVCdWlsZCBhdXRoZW50aWNhdGVzIHRvIHRoZSBpbWFnZSByZWdpc3RyeSB3aXRoXG4gKiAgICB0aGUgYHJlZ2lzdHJ5LXB1c2hgIHNjb3BlZCBrZXksIG5ldmVyIHRoaXMgb25lO1xuICogIC0gcmVwb3J0aW5nIHdyaXRlcyDigJQgdGhlIGV2ZW50cyBMYW1iZGEgYW5kIHN0ZXAgcmVwb3J0IHVwbG9hZHMgdXNlIHRoZVxuICogICAgYHJlcG9ydGluZzppbmdlc3RgIHNjb3BlZCBrZXkuXG4gKlxuICogSXQgdXNlZCB0byBiZSB0aGUgb3JnIEFETUlOIFJvbGUsIHNvIGEgbGVha2VkIHN5bnRoIGNyZWRlbnRpYWwgY291bGQgcmV3cml0ZVxuICogZXZlcnkgcGlwZWxpbmUsIFJvbGUgYW5kIG1lbWJlciBvZiB0aGUgb3JnLlxuICovXG5leHBvcnQgY29uc3QgUElQRUxJTkVfQVVUT01BVElPTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLFxuICAncGx1Z2luczpyZWFkJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlBpcGVsaW5lIFJlZ2lzdHJhdGlvblwiIFJvbGUsIGhlbGQgYnkgdGhlXG4gKiBgcGlwZWxpbmUtcmVnaXN0ZXJgIHNlcnZpY2UgYWNjb3VudDogYFBPU1RgL2BERUxFVEUgL3BpcGVsaW5lcy9yZWdpc3RyeWAgZm9yXG4gKiBpdHMgb3duIG9yZyBhbmQgbm90aGluZyBlbHNlIOKAlCBub3QgZXZlbiBhIHJlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9SRUdJU1RSQVRJT05fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbl07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZXNvbHV0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFJlc29sdmUgYSB1c2VyJ3MgZWZmZWN0aXZlIG9yZyBwZXJtaXNzaW9ucyBmcm9tIHRoZSBSb2xlcyBhc3NpZ25lZCB0byB0aGVtLlxuICpcbiAqIFNpbmdsZS1zb3VyY2UgbW9kZWw6IGEgdXNlcidzIGFiaWxpdGllcyBhcmUgRVhBQ1RMWSB0aGUgdW5pb24gb2YgdGhlXG4gKiBwZXJtaXNzaW9ucyBjYXJyaWVkIGJ5IHRoZSBSb2xlcyB0aGV5IGhvbGQgKGEgUm9sZSA9IGEgbmFtZWQgcGVybWlzc2lvbiBzZXQ7XG4gKiBidWlsdC1pbiBSb2xlcyBjYXJyeSB0aGVpciBidW5kbGUgZXhwbGljaXRseSwgc2VlZGVkIGZyb21cbiAqIHtAbGluayBST0xFX1BFUk1JU1NJT05TfSkuIFRoZXJlIGlzIG5vIHNlcGFyYXRlIHJvbGUtZGVyaXZlZCBiYXNlbGluZSDigJQgdGhlXG4gKiBjb2Fyc2UgYHJvbGVgIGxhYmVsIGdyYW50cyBub3RoaW5nIG9uIGl0cyBvd24uXG4gKlxuICogMS4gUGxhdGZvcm0gc3VwZXJhZG1pbnMgKGBpc1N1cGVyQWRtaW5gKSBhbHdheXMgZ2V0IEFMTCBwZXJtaXNzaW9ucy5cbiAqIDIuIE90aGVyd2lzZSwgdW5pb24gZXZlcnkgcGVybWlzc2lvbiBncmFudGVkIGJ5IHRoZSB1c2VyJ3MgYXNzaWduZWQgUm9sZXMuXG4gKiAzLiBJbnZhbGlkL3Vua25vd24gcGVybWlzc2lvbiBzdHJpbmdzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSBhc3NpZ25lZFBlcm1pc3Npb25zIC0gRmxhdHRlbmVkIHBlcm1pc3Npb25zIGZyb20gZXZlcnkgUm9sZSB0aGUgdXNlciBob2xkc1xuICogQHBhcmFtIGlzU3VwZXJBZG1pbiAtIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZSBnbG9iYWwgc3VwZXItYWRtaW4gZmxhZ1xuICogQHJldHVybnMgRWZmZWN0aXZlIHBlcm1pc3Npb25zIGluIGNhbm9uaWNhbCBvcmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJQZXJtaXNzaW9ucyhcbiAgYXNzaWduZWRQZXJtaXNzaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IFBlcm1pc3Npb25bXSB7XG4gIGlmIChpc1N1cGVyQWRtaW4pIHJldHVybiBbLi4uQUxMX1BFUk1JU1NJT05TXTtcblxuICBjb25zdCBwZXJtcyA9IG5ldyBTZXQ8UGVybWlzc2lvbj4oKTtcbiAgaWYgKGFzc2lnbmVkUGVybWlzc2lvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHAgb2YgYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgICAgaWYgKGlzVmFsaWRQZXJtaXNzaW9uKHApKSBwZXJtcy5hZGQocCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKHAgPT4gcGVybXMuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBDb25maW5lIGEgcmVzb2x2ZWQgcGVybWlzc2lvbiBsaXN0IHRvIHdoYXQgbWF5IGJlIGhlbGQgaW4gdGhlIHRva2VuJ3MgQUNUSVZFXG4gKiBvcmc6IG91dHNpZGUgdGhlIHN5c3RlbSBvcmcgZXZlcnkge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gZW50cnkgaXNcbiAqIGRyb3BwZWQgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBBcHBsaWVkIGF0IHRva2VuIGlzc3VlIG9uXG4gKiB0b3Agb2Yge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9IOKAlCBpbmNsdWRpbmcgYSBzdXBlcmFkbWluJ3MgaW1wbGljaXQtYWxsIOKAlFxuICogc28gYSB0b2tlbiBtaW50ZWQgaW4gYSB0ZW5hbnQgb3JnIG5ldmVyIENMQUlNUyBgcGx1Z2luczptb2RlcmF0ZWAgL1xuICogYHB1Ymxpc2hlcnM6dmVyaWZ5YCwgZXZlbiBpZiBhIGhhbmQtd3JpdHRlbiBSb2xlIGRvY3VtZW50IHNvbWVob3cgY2FycmllZFxuICogdGhlbSB0aGVyZS4gKFN1cGVyYWRtaW5zIHN0aWxsIHBhc3MgYGhhc1Blcm1pc3Npb25gIHZpYSB0aGUgZmxhZzsgdGhlXG4gKiBlY29zeXN0ZW0gcm91dGUgZ2F0ZSBhZGRpdGlvbmFsbHkgcmVxdWlyZXMgdGhlIHN5c3RlbSBvcmcsIHNvIHRoYXQgYnlwYXNzXG4gKiBuZXZlciByZWFjaGVzIGEgZ292ZXJuYW5jZSByb3V0ZSBmcm9tIGEgdGVuYW50IG9yZyBlaXRoZXIuKVxuICpcbiAqIFRha2VzIGEgYm9vbGVhbiByYXRoZXIgdGhhbiBhbiBvcmcgaWQgc28gdGhpcyBtb2R1bGUgc3RheXMgZGVwZW5kZW5jeS1mcmVlXG4gKiAodGhlIGZyb250ZW5kIGltcG9ydHMgaXQpOyBjYWxsZXJzIGRlY2lkZSB3aXRoIGFwaS1jb3JlIGBpc1N5c3RlbU9yZ0lkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpbmVQZXJtaXNzaW9uc1RvT3JnPFAgZXh0ZW5kcyBzdHJpbmc+KFxuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUFtdLFxuICBhY3RpdmVPcmdJc1N5c3RlbU9yZzogYm9vbGVhbixcbik6IFBbXSB7XG4gIHJldHVybiBhY3RpdmVPcmdJc1N5c3RlbU9yZyA/IFsuLi5wZXJtaXNzaW9uc10gOiBwZXJtaXNzaW9ucy5maWx0ZXIoKHApID0+ICFpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHApKTtcbn1cblxuLyoqIFdoZXRoZXIgYSByZXNvbHZlZCBwZXJtaXNzaW9uIGxpc3QgZ3JhbnRzIGBwZXJtaXNzaW9uYCAoc3VwZXJhZG1pbiDih5IgYWx3YXlzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQZXJtaXNzaW9uKFxuICBncmFudGVkOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhIWdyYW50ZWQgJiYgZ3JhbnRlZC5pbmNsdWRlcyhwZXJtaXNzaW9uKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWx0LWluIFJvbGUgc2VlZCBidW5kbGVzLCBhcyBhIFRBQkxFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRoZSBuYW1lZCBwZXJtaXNzaW9uIGJ1bmRsZXMgYSBidWlsdC1pbiBSb2xlIG1heSBjYXJyeSwgYW5kIHRoZSBSb2xlIE5BTUUgZWFjaFxuICogb25lIGlzIHNlZWRlZCB1bmRlci4gT25lIHRhYmxlLCBiZWNhdXNlIHRoZSB0aHJlZSBmYWN0cyBhYm91dCBhIGpvYiBSb2xlIOKAlFxuICogaXRzIGlkLCBpdHMgcGVybWlzc2lvbnMgYW5kIGl0cyBkaXNwbGF5IG5hbWUg4oCUIHdlcmUgcHJldmlvdXNseSB0aHJlZVxuICogaW5kZXBlbmRlbnQgbGlzdHMgaW4gdGhyZWUgcGxhY2VzLCBhbmQgbm90aGluZyBoZWxkIHRoZW0gdG9nZXRoZXIuXG4gKlxuICogV0hBVCBXRU5UIFdST05HIFdJVEhPVVQgSVQuIFRoZSBwbGF0Zm9ybSByZXNvbHZlZCBhIGJ1bmRsZSB0aHJvdWdoIGFcbiAqIG5pbmUtYnJhbmNoIGBpZmAgY2hhaW4gd2l0aCBhIGZhbGwtdGhyb3VnaCB0byB0aGUgY29hcnNlIGBncmFudHNSb2xlYCBidW5kbGUuXG4gKiBFdmVyeSBqb2IgUm9sZSBncmFudHMgYG1lbWJlcmAsIHNvIGEgYnVuZGxlIGFkZGVkIHRvIHRoZSBpZCBsaXN0IFdJVEhPVVQgaXRzXG4gKiBicmFuY2ggZGlkIG5vdCBmYWlsIOKAlCBpdCBzaWxlbnRseSBzZWVkZWQgdGhlIHBsYWluIE1lbWJlciBidW5kbGUsIGFuZCB0aGVcbiAqIHN0YXJ0dXAgYmFja2ZpbGwgdGhlbiByZS1zeW5jZWQgaXQgdG8gdGhhdCB3cm9uZyB2YWx1ZSBvbiBldmVyeSBib290LiBUaGVcbiAqIFJvbGUgZXhpc3RlZCwgd2FzIGFzc2lnbmFibGUgZnJvbSB0aGUgc3RhZmZpbmcgcGFuZWwsIGFuZCBncmFudGVkIGZpZnRlZW5cbiAqIHRlbmFudCBwZXJtaXNzaW9ucyBpbnN0ZWFkIG9mIGl0cyBqb2IuIE5vdGhpbmcgYW55d2hlcmUgZXhlcmNpc2VkIHRoZVxuICogcmVzb2x2ZXIgcGVyIGJ1bmRsZS5cbiAqXG4gKiBLZXllZCBhY2Nlc3MgcGx1cyBgc2F0aXNmaWVzYCBtYWtlcyBhIG1pc3NpbmcgZW50cnkgYSBDT01QSUxFIGVycm9yLCBhbmQgYW5cbiAqIGV4dHJhIG9uZSB0b28g4oCUIGluIGJvdGggZGlyZWN0aW9ucywgd2l0aCBubyBydW50aW1lIGNoZWNrIHRvIGZvcmdldC5cbiAqXG4gKiBUaGUgTkFNRSBsaXZlcyBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24uIFRoZSBwbGF0Zm9ybSBzZWVkZWQgbmFtZXMgZnJvbSBpdHNcbiAqIG93biBjb25zdGFudHMgd2hpbGUgdGhlIGZyb250ZW5kJ3Mgc3RhZmZpbmcgcm9zdGVyIGhhcmQtY29kZWQgaXRzIG93biBjb3B5LFxuICogZWFjaCBwaW5uZWQgYnkgYSB0ZXN0IGFnYWluc3QgaXRzZWxmIOKAlCBzbyByZW5hbWluZyBhIFJvbGUgcGFzc2VkIGJvdGggc3VpdGVzXG4gKiBhbmQgdGhlIHJvc3RlciBzaWxlbnRseSByZW5kZXJlZCBcIlJvbGUgbm90IGZvdW5kXCIsIHdoaWNoIGlzIHRoZSBncmFudCBwYXRoIGZvclxuICogdGhhdCBSb2xlJ3MgcGVybWlzc2lvbnMgZGlzYXBwZWFyaW5nLiBCb3RoIHNpZGVzIHJlYWQgdGhpcyBub3cuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUVEX0JVTkRMRVMgPSB7XG4gIGVjb3N5c3RlbV9tYW5hZ2VyOiB7IG5hbWU6ICdFY29zeXN0ZW0gTWFuYWdlcicsIHBlcm1pc3Npb25zOiBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OUyB9LFxuICBwdWJsaXNoZXJfdmVyaWZpZXI6IHsgbmFtZTogJ1B1Ymxpc2hlciBWZXJpZmllcicsIHBlcm1pc3Npb25zOiBQVUJMSVNIRVJfVkVSSUZJRVJfUEVSTUlTU0lPTlMgfSxcbiAgdGVhbV9sZWFkOiB7IG5hbWU6ICdUZWFtIExlYWQnLCBwZXJtaXNzaW9uczogVEVBTV9MRUFEX1BFUk1JU1NJT05TIH0sXG4gIHBsYXRmb3JtX29ic2VydmVyOiB7IG5hbWU6ICdQbGF0Zm9ybSBPYnNlcnZlcicsIHBlcm1pc3Npb25zOiBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUyB9LFxuICBwbGF0Zm9ybV9vcGVyYXRvcjogeyBuYW1lOiAnUGxhdGZvcm0gT3BlcmF0b3InLCBwZXJtaXNzaW9uczogUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlMgfSxcbiAgYWNjb3VudF9tYW5hZ2VyOiB7IG5hbWU6ICdBY2NvdW50IE1hbmFnZXInLCBwZXJtaXNzaW9uczogQUNDT1VOVF9NQU5BR0VSX1BFUk1JU1NJT05TIH0sXG4gIGNvbnNvbGVfYWRtaW46IHsgbmFtZTogJ0NvbnNvbGUgQWRtaW5pc3RyYXRvcicsIHBlcm1pc3Npb25zOiBDT05TT0xFX0FETUlOX1BFUk1JU1NJT05TIH0sXG4gIHN1cHBvcnRfYWdlbnQ6IHsgbmFtZTogJ1N1cHBvcnQgQWdlbnQnLCBwZXJtaXNzaW9uczogU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUyB9LFxuICBzdXBwb3J0X2xlYWQ6IHsgbmFtZTogJ1N1cHBvcnQgTGVhZCcsIHBlcm1pc3Npb25zOiBTVVBQT1JUX0xFQURfUEVSTUlTU0lPTlMgfSxcbiAgcmVnaXN0cnlfb3BlcmF0b3I6IHsgbmFtZTogJ1JlZ2lzdHJ5IE9wZXJhdG9yJywgcGVybWlzc2lvbnM6IFJFR0lTVFJZX09QRVJBVE9SX1BFUk1JU1NJT05TIH0sXG4gIHBpcGVsaW5lX2F1dG9tYXRpb246IHsgbmFtZTogJ1BpcGVsaW5lIEF1dG9tYXRpb24nLCBwZXJtaXNzaW9uczogUElQRUxJTkVfQVVUT01BVElPTl9QRVJNSVNTSU9OUyB9LFxuICBwaXBlbGluZV9yZWdpc3RyYXRpb246IHsgbmFtZTogJ1BpcGVsaW5lIFJlZ2lzdHJhdGlvbicsIHBlcm1pc3Npb25zOiBQSVBFTElORV9SRUdJU1RSQVRJT05fUEVSTUlTU0lPTlMgfSxcbn0gYXMgY29uc3Q7XG5cbi8qKiBFdmVyeSBzZWVkLWJ1bmRsZSBpZC4gVGhlIHBsYXRmb3JtJ3MgYFJvbGUuc2VlZEJ1bmRsZWAgZW51bSBpcyB0aGlzIGxpc3QuICovXG5leHBvcnQgY29uc3QgU0VFRF9CVU5ETEVfSURTID0gT2JqZWN0LmtleXMoU0VFRF9CVU5ETEVTKSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgU0VFRF9CVU5ETEVTPjtcbmV4cG9ydCB0eXBlIFNlZWRCdW5kbGVJZCA9IGtleW9mIHR5cGVvZiBTRUVEX0JVTkRMRVM7XG5cbi8qKlxuICogVGhlIFNZU1RFTSBPUkcncyBqb2IgUm9sZXMsIGluIHN0YWZmaW5nIG9yZGVyIOKAlCB0aGUgc3Vic2V0IG9mXG4gKiB7QGxpbmsgU0VFRF9CVU5ETEVTfSBzZWVkZWQgdGhlcmUsIHdoaWNoIGlzIGV2ZXJ5IGJ1bmRsZSBleGNlcHQgYHRlYW1fbGVhZGBcbiAqIChhIHRlbmFudCBqb2IsIGFuZCBhIHRlbXBsYXRlIHJhdGhlciB0aGFuIGEgc2VlZGVkIFJvbGUgc2luY2UgaXQgc3RvcHBlZFxuICogYmVpbmcgc3RydWN0dXJhbCkuXG4gKlxuICogYGVjb3N5c3RlbV9tYW5hZ2VyYCBJUyBvbmUgb2YgdGhlbTsgaXQgaXMgbGlzdGVkIGhlcmUgZXZlbiB0aG91Z2ggaXRzIHJvc3RlclxuICogbGl2ZXMgb24gdGhlIEVjb3N5c3RlbSBjb25zb2xlIHJhdGhlciB0aGFuIHRoZSBzdGFmZmluZyBwYW5lbCwgYmVjYXVzZSB3aGF0XG4gKiB0aGlzIGxpc3QgYW5zd2VycyBpcyBcIndoaWNoIFJvbGVzIGRvZXMgdGhlIHN5c3RlbSBvcmcgc2VlZFwiLCBub3QgXCJ3aGljaCBwYW5lbFxuICogcmVuZGVycyB0aGVtXCIuXG4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX0pPQl9CVU5ETEVTOiByZWFkb25seSBTZWVkQnVuZGxlSWRbXSA9IFtcbiAgJ2Vjb3N5c3RlbV9tYW5hZ2VyJyxcbiAgJ3B1Ymxpc2hlcl92ZXJpZmllcicsXG4gICdwbGF0Zm9ybV9vYnNlcnZlcicsXG4gICdwbGF0Zm9ybV9vcGVyYXRvcicsXG4gICdhY2NvdW50X21hbmFnZXInLFxuICAnY29uc29sZV9hZG1pbicsXG4gICdzdXBwb3J0X2FnZW50JyxcbiAgJ3N1cHBvcnRfbGVhZCcsXG4gICdyZWdpc3RyeV9vcGVyYXRvcicsXG5dO1xuXG4vKipcbiAqIFRoZSBNQUNISU5FIFJvbGVzIGV2ZXJ5IG9yZyBzZWVkcyDigJQgdGhlIHN1YnNldCBvZiB7QGxpbmsgU0VFRF9CVU5ETEVTfSBoZWxkIGJ5XG4gKiB0aGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucy5cbiAqXG4gKiBTZWVkZWQgcmF0aGVyIHRoYW4gb2ZmZXJlZCBhcyBhIHtAbGluayBST0xFX1RFTVBMQVRFU30gZW50cnksIHVubGlrZSB0aGVcbiAqIHRlbmFudCBqb2IgcHJlc2V0cywgYmVjYXVzZSB0aGV5IGFyZSBzdHJ1Y3R1cmFsOiB0aGUgQ0xJIGdyYW50cyBvbmUgdG8gdGhlXG4gKiBhY2NvdW50IGl0IGNyZWF0ZXMgYW5kIHRoZSBzdGFydHVwIGJhY2tmaWxsIG1vdmVzIGV4aXN0aW5nIGFjY291bnRzIG9udG8gaXQsXG4gKiBhbmQgYm90aCBoYXZlIHRvIGZpbmQgaXQgaW4gRVZFUlkgb3JnIGJ5IGEgc3RhYmxlIGlkZW50aXR5LiBBIHRlbXBsYXRlIGxlYXZlc1xuICogbm90aGluZyB0byBmaW5kIHVudGlsIHNvbWVib2R5IGluc3RhbnRpYXRlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BVVRPTUFUSU9OX0JVTkRMRVM6IHJlYWRvbmx5IFNlZWRCdW5kbGVJZFtdID0gW1xuICAncGlwZWxpbmVfYXV0b21hdGlvbicsXG4gICdwaXBlbGluZV9yZWdpc3RyYXRpb24nLFxuXTtcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucywga2V5ZWQgYnlcbiAqIGFjY291bnQgbmFtZSwgYW5kIHRoZSBidWlsdC1pbiBSb2xlIGVhY2ggaG9sZHMg4oCUIGBudWxsYCBmb3IgYW4gYWNjb3VudCB3aG9zZVxuICoga2V5IGNhcnJpZXMgYSBjYXBhYmlsaXR5IFNDT1BFIChhIGBUb2tlblNjb3BlYCkgYW5kIHNvIG5lZWRzIG5vIFJvbGUgYXQgYWxsLlxuICpcbiAqIE9uZSB0YWJsZSBmb3IgdGhlIENMSSAod2hpY2ggUm9sZSB0byBncmFudCBhIE5FVyBhY2NvdW50KSBhbmQgdGhlIHBsYXRmb3JtJ3NcbiAqIHN0YXJ0dXAgYmFja2ZpbGwgKHdoaWNoIFJvbGUgdG8gbW92ZSBhbiBFWElTVElORyBhY2NvdW50IG9udG8sIG9mZiB0aGUgb3JnXG4gKiBhZG1pbiBSb2xlIHRoZXNlIGFjY291bnRzIHdlcmUgb25jZSBnaXZlbikuIEEgcmVuYW1lIGhlcmUgbW92ZXMgYm90aC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9NQVRJT05fQUNDT1VOVF9CVU5ETEVTID0ge1xuICAncGxhdGZvcm0tYXV0b21hdGlvbic6ICdwaXBlbGluZV9hdXRvbWF0aW9uJyxcbiAgJ3BpcGVsaW5lLXJlZ2lzdGVyJzogJ3BpcGVsaW5lX3JlZ2lzdHJhdGlvbicsXG4gICdyZXBvcnRpbmctaW5nZXN0JzogbnVsbCxcbiAgJ3JlZ2lzdHJ5LXB1c2gnOiBudWxsLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgU2VlZEJ1bmRsZUlkIHwgbnVsbD47XG4iXX0=
1001
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBa1F0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBc0I7SUFDbkQsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTTtJQUNwQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO0NBQ3pFLENBQUM7QUFFRixxR0FBcUc7QUFDckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCO0lBQ25GLGtCQUFrQjtJQUNsQixnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUI7SUFDeEQsY0FBYyxFQUFFLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEQsaUJBQWlCLEVBQUUsd0JBQXdCLEVBQUUsbUJBQW1CO0lBQ2hFLGtCQUFrQixFQUFFLG1CQUFtQjtJQUN2QyxlQUFlLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQjtJQUNwRSw0QkFBNEIsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEI7SUFDakYsZUFBZTtJQUNmLHFCQUFxQixFQUFFLHVCQUF1QjtJQUM5QyxvQkFBb0IsRUFBRSxzQkFBc0I7SUFDNUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxxQkFBcUI7SUFDckQsaUJBQWlCLEVBQUUsa0JBQWtCO0lBQ3JDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUI7SUFDakYsaUJBQWlCLEVBQUUs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RSxJQUFJLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSx3QkFBd0IsRUFBRTtJQUM3RSxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsNkJBQTZCLEVBQUU7SUFDNUYsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLCtCQUErQixFQUFFO0lBQ2xHLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBRTtDQUNoRyxDQUFDO0FBRVgsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBcUMsQ0FBQztBQUc3Rjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQTRCO0lBQzdELG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsbUJBQW1CO0NBQ3BCLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBNEI7SUFDN0QscUJBQXFCO0lBQ3JCLHVCQUF1QjtDQUN4QixDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxxQkFBcUIsRUFBRSxxQkFBcUI7SUFDNUMsbUJBQW1CLEVBQUUsdUJBQXVCO0lBQzVDLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsZUFBZSxFQUFFLElBQUk7Q0FDaUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IE9yZ1JvbGUgfSBmcm9tICcuL2NvbW1vbi5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uIGlkZW50aWZpZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENhbm9uaWNhbCBmaW5lLWdyYWluZWQgcGVybWlzc2lvbiBpZGVudGlmaWVycywgaW4gYHJlc291cmNlOmFjdGlvbmAgZm9ybS5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIE9SRy1TQ09QRUQgY2FwYWJpbGl0aWVzIGEgUm9sZSBjYW4gZ3JhbnQgKFJCQUMpLiBDb2Fyc2UgYnlcbiAqIGRlc2lnbiDigJQgYDp3cml0ZWAgY292ZXJzIGNyZWF0ZS91cGRhdGUvZGVsZXRlIGZvciBhIHJlc291cmNlIOKAlCBzbyB0aGUgY2F0YWxvZ1xuICogYW5kIHBlcm1pc3Npb24tcGlja2VyIFVJIHN0YXkgc21hbGw7IHNwbGl0IGEgYDp3cml0ZWAgaW50byBgOmNyZWF0ZWAvYDpkZWxldGVgXG4gKiBsYXRlciBpZiBhIHJlc291cmNlIG5lZWRzIGl0LlxuICpcbiAqIE5PVCBtb2RlbGVkIGhlcmUgKGludGVudGlvbmFsbHkpOiBwbGF0Zm9ybS1vcGVyYXRvciBhY3Rpb25zIChvcmcgZGVsZXRlLCB0aWVyL1xuICogcXVvdGEgb3ZlcnJpZGUsIHVzZXIgYWRtaW4sIGltcGVyc29uYXRpb24sIHBsYXRmb3JtIHNldHRpbmdzKSBzdGF5IGJlaGluZCB0aGVcbiAqIGdsb2JhbCBgaXNTdXBlckFkbWluYCBmbGFnLCBub3QgYSBwZXItb3JnIHBlcm1pc3Npb247IGFuZCBgcmVxdWlyZVN0ZXBVcGBcbiAqIChNRkEpIC8gYHJlcXVpcmVGZWF0dXJlYCAocGxhbiBlbnRpdGxlbWVudHMpIHJlbWFpbiBvcnRob2dvbmFsIGdhdGVzLlxuICovXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uID1cbiAgLy8gUGlwZWxpbmVzXG4gIHwgJ3BpcGVsaW5lczpyZWFkJ1xuICB8ICdwaXBlbGluZXM6d3JpdGUnXG4gIHwgJ3BpcGVsaW5lczpwdWJsaXNoJ1xuICAvLyBUaGUgcGlwZWxpbmUgUkVHSVNUUlkgKGBQT1NUYC9gREVMRVRFIC9waXBlbGluZXMvcmVnaXN0cnlgKTogd2hpY2ggZGVwbG95ZWRcbiAgLy8gc3RhY2sgYmFja3MgYSBwaXBlbGluZSwgYW5kIHRoZSBzdGVwIG1hbmlmZXN0IG9mIHBsdWdpbiBkaWdlc3RzIGl0IHJ1bnMuXG4gIC8vIFNwbGl0IG91dCBvZiBgcGlwZWxpbmVzOndyaXRlYCBzbyB0aGUgQ29kZUJ1aWxkIHN5bnRoIGNhbiBrZWVwIHRoYXQgcmVjb3JkXG4gIC8vIGN1cnJlbnQgd2l0aCBhIGNyZWRlbnRpYWwgdGhhdCBjYW4gZG8gbm90aGluZyBlbHNlIOKAlCBhIGtleSBob2xkaW5nXG4gIC8vIGBwaXBlbGluZXM6d3JpdGVgIGNvdWxkIHJld3JpdGUgZXZlcnkgcGlwZWxpbmUgdGhlIG9yZyBvd25zLiBQZW9wbGUgZ2V0IGl0XG4gIC8vIGJlc2lkZSBgcGlwZWxpbmVzOndyaXRlYCAodGhlIE1lbWJlciBidW5kbGUpOyB0aGUgYHBpcGVsaW5lLXJlZ2lzdGVyYFxuICAvLyBzZXJ2aWNlIGFjY291bnQgaG9sZHMgaXQgYWxvbmUuXG4gIHwgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJ1xuICAvLyBHb2xkZW4tcGF0aCBwaXBlbGluZSB0ZW1wbGF0ZXMuIFNwbGl0IG91dCBvZiBgcGlwZWxpbmVzOipgIHNvIGEgcGxhdGZvcm1cbiAgLy8gdGVhbSBjYW4gY3VyYXRlIHRoZSBzdGFydGVyIGNhdGFsb2cgV0lUSE9VVCB3cml0ZSBhY2Nlc3MgdG8gZXZlcnkgcGlwZWxpbmVcbiAgLy8gKGFuZCB2aWNlIHZlcnNhKS4gYDpwdWJsaXNoYCBtYXBzIHRvIHRoZVxuICAvLyB0ZW1wbGF0ZSBsYWRkZXIncyBgcHVibGljYCBydW5nOyBgb3JnYCBhbmQgYHByaXZhdGVgIG5lZWQgb25seSBgOndyaXRlYC5cbiAgfCAndGVtcGxhdGVzOnJlYWQnXG4gIHwgJ3RlbXBsYXRlczp3cml0ZSdcbiAgfCAndGVtcGxhdGVzOnB1Ymxpc2gnXG4gIC8vIFBsdWdpbnNcbiAgfCAncGx1Z2luczpyZWFkJ1xuICB8ICdwbHVnaW5zOndyaXRlJ1xuICB8ICdwbHVnaW5zOnB1Ymxpc2gnXG4gIC8vIFBsdWdpbiBlY29zeXN0ZW0gKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBPcmctYXNzaWduYWJsZTpcbiAgLy8gIC0gYHBsdWdpbnM6aW5zdGFsbGAgICAgICAgIOKAlCBpbnN0YWxsL3VwZ3JhZGUvdW5pbnN0YWxsIGxpc3RpbmdzIChvciBSRVFVRVNUXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGluc3RhbGwgd2hlbiB0aGUgb3JnJ3MgcG9saWN5IG5lZWRzIGFwcHJvdmFsKS5cbiAgLy8gIC0gYHBsdWdpbl9pbnN0YWxsczptYW5hZ2VgIOKAlCB0aGUgb3JnJ3MgY29uc3VtcHRpb24gcG9saWN5ICsgZGVjaWRpbmcgaW5zdGFsbFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyBXSVRISU4gdGhlIG9yZyAob3JnLWxvY2FsIG9ubHkpLlxuICAvLyAgLSBgcHVibGlzaGVyczptYW5hZ2VgICAgICAg4oCUIHRoZSBvcmcncyBwdWJsaXNoZXIgcHJvZmlsZSArIHN1Ym1pdHRpbmdcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvc3lzdGVtIHJlcXVlc3RzIChldmVyeSBkZWNpc2lvbiBpcyBzeXN0ZW0tb3JnKS5cbiAgLy8gU3lzdGVtLW9yZy1vbmx5IChzZWUgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TKTpcbiAgLy8gIC0gYHBsdWdpbnM6bW9kZXJhdGVgICAgICAgIOKAlCBkZWNpZGUgcHVibGlzaCByZXF1ZXN0cywgbW9kZXJhdGUsIHlhbmssIGFkdmlzb3JpZXMuXG4gIC8vICAtIGBwdWJsaXNoZXJzOnZlcmlmeWAgICAgICDigJQgcHVibGlzaGVyIHRpZXJzLCBwcm9maWxlIGNoYW5nZXMsIHRyYW5zZmVycy5cbiAgfCAncGx1Z2luczppbnN0YWxsJ1xuICB8ICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJ1xuICB8ICdwdWJsaXNoZXJzOm1hbmFnZSdcbiAgfCAncGx1Z2luczptb2RlcmF0ZSdcbiAgfCAncHVibGlzaGVyczp2ZXJpZnknXG4gIC8vIFRoZSBvcmcncyBtYW5hZ2VkLXRvb2xjaGFpbiBERUZBVUxUIChkb2NzL3BsYW5zL2Jvb3RzdHJhcC1pbWFnZS12ZXJzaW9uaW5nLm1kXG4gIC8vIEQxMyk6IHdoaWNoIHRvb2xjaGFpbiByZWxlYXNlIGV2ZXJ5IHVucGlubmVkIHBpcGVsaW5lIGluIHRoZSBvcmcgKGFuZCBpdHNcbiAgLy8gdGVhbXMgdGhhdCBzZXQgbm9uZSkgc3ludGhlc2l6ZXMgd2l0aCBvbiBpdHMgbmV4dCBydW4uIE9yZy1hc3NpZ25hYmxlLCBzb1xuICAvLyBBZG1pbiBhbmQgT3duZXIgaG9sZCBpdDsgTk9UIGluIE1lbWJlciBvciBhbnkgcGlwZWxpbmUtZWRpdG9yIGJ1bmRsZS4gU3BsaXRcbiAgLy8gYnkgYmxhc3QgcmFkaXVzOiBgcGlwZWxpbmVzOndyaXRlYCBtb3ZlcyBPTkUgcGlwZWxpbmUgKGl0cyBvd25cbiAgLy8gYHRvb2xjaGFpbi5yZWxlYXNlYCBwaW4pLCB0aGlzIG1vdmVzIEFMTCBvZiB0aGVtLCBhbmRcbiAgLy8gYHBsdWdpbl9pbnN0YWxsczptYW5hZ2VgIGdvdmVybnMgZnV0dXJlIGluc3RhbGxzLCBub3QgcnVubmluZyBwaXBlbGluZXMuXG4gIC8vIEl0IG5ldmVyIGNvbmZlcnMgYW55dGhpbmcgb24gdGhlIHBsYXRmb3JtIGRlZmF1bHQsIGNhbmFyeSBvciBjYXRhbG9nLlxuICAvLyBFdmVyeSB3cml0ZSBhbHNvIG5lZWRzIGByZXF1aXJlU3RlcFVwYC5cbiAgfCAndG9vbGNoYWluOm1hbmFnZSdcbiAgLy8gVGhlIFRvb2xjaGFpbiBDT05TT0xFIChwbGFuIEQ5OyBuYW1lZCBhZnRlciBgYmlsbGluZzpvcGVyYXRlYCk6IHB1Ymxpc2hcbiAgLy8gbGlmZWN5Y2xlLCBjYW5hcnkgbWVtYmVyc2hpcCBhbmQgVEhFIHBsYXRmb3JtIGRlZmF1bHQg4oCUIGV2ZXJ5IG9yZyB3aXRob3V0XG4gIC8vIGl0cyBvd24gZGVmYXVsdCBtb3ZlcyB3aXRoIGl0LiBTeXN0ZW0tb3JnLW9ubHkgKG90aGVyd2lzZSBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgLy8gZGVyaXZlZCBmcm9tIE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TLCB3b3VsZCBoYW5kIGl0IHRvIGV2ZXJ5IHRlbmFudFxuICAvLyBBZG1pbik7IGNhcnJpZWQgYnkgUGxhdGZvcm0gT3BlcmF0b3IuIEV2ZXJ5IHdyaXRlIGFsc28gbmVlZHMgYHJlcXVpcmVTdGVwVXBgLlxuICB8ICd0b29sY2hhaW46b3BlcmF0ZSdcbiAgLy8gUGxhdGZvcm0gb3BlcmF0aW9ucyAoc3lzdGVtLW9yZyBvbmx5KS4gVGhlIGNyb3NzLXRlbmFudCBvcGVyYXRvciBzdXJmYWNlc1xuICAvLyB0aGF0IHVzZWQgdG8gcmVxdWlyZSB0aGUgc3VwZXJhZG1pbiBGTEFHLCBzbyBhIGRlcGxveW1lbnQgY2FuIHN0YWZmIHRoZW1cbiAgLy8gd2l0aCBhIFJvbGUgaW5zdGVhZCBvZiBoYW5kaW5nIG91dCBpbXBsaWNpdC1hbGwuIFNwbGl0IGJlY2F1c2UgdGhlIHR3byBjYXJyeVxuICAvLyBkaWZmZXJlbnQgcmlzazogcmVhZGluZyB3aGF0IGEgZGVwbG95IGNvbmZpZ3VyZWQgaXMgbm90IHRoZSBzYW1lIGFzIG1vdmluZ1xuICAvLyBhbm90aGVyIG9yZ2FuaXNhdGlvbidzIG1vbmV5LlxuICB8ICdwbGF0Zm9ybTpyZWFkJ1xuICAvLyBUaGUgY3Jvc3MtdGVuYW50IE9SRyBMSVNULCBzcGxpdCBvdXQgb2YgYHBsYXRmb3JtOnJlYWRgIGJlY2F1c2UgdGhhdCBvbmVcbiAgLy8gcGVybWlzc2lvbiB3YXMgZG9pbmcgdHdvIGpvYnMgd2l0aCBkaWZmZXJlbnQgYmxhc3QgcmFkaWk6IHJlYWRpbmcgd2hhdCBhXG4gIC8vIERFUExPWSB3YXMgY29uZmlndXJlZCB0byBkbyAoUkxTIG1vZGUsIEtNUyBwb3N0dXJlLCB0aGUgcmVuZGVyZWQgYWxlcnRcbiAgLy8gcnVsZXMpIGFuZCByZWFkaW5nIHRoZSByb3N0ZXIgb2YgZXZlcnkgQ1VTVE9NRVIuIFRocmVlIG9mIHRoZSBmb3VyIGpvYlxuICAvLyBidW5kbGVzIGNhcnJpZWQgaXQsIGFuZCBvbmx5IG9uZSBvZiB0aGVtIHdhbnRlZCB0aGUgZGVwbG95IGludGVybmFscyDigJRcbiAgLy8gQ29uc29sZSBBZG1pbmlzdHJhdG9yIGFuZCBTdXBwb3J0IEFnZW50IGdvdCB0aGVtIHB1cmVseSBiZWNhdXNlIHRoZXkgbmVlZGVkXG4gIC8vIHRvIGZpbmQgYW4gb3JnIGJ5IG5hbWUuXG4gIC8vXG4gIC8vIFNhbWUgbWlzdGFrZSwgYW5kIHNhbWUgZml4LCBhcyBgY29uc29sZXM6ZGF0YXN0b3JlYCBiZWZvcmUgaXQgd2FzIHNwbGl0IGJ5XG4gIC8vIHdoYXQgYSBtaXN0YWtlbiBncmFudCBjb3N0cy5cbiAgfCAnb3JnczpyZWFkJ1xuICB8ICdiaWxsaW5nOm9wZXJhdGUnXG4gIC8vIFRoZSBvcGVyYXRvciBjb25zb2xlcywgc3BsaXQgYnkgQkxBU1QgUkFESVVTIHJhdGhlciB0aGFuIGJ5IHByb2R1Y3QuIFRocmVlXG4gIC8vIHBlcm1pc3Npb25zIGZvciBmaXZlIGNvbnNvbGVzLCBiZWNhdXNlIHdoYXQgYSBtaXN0YWtlbiBncmFudCBjb3N0cyBkaWZmZXJzXG4gIC8vIGJ5IGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBhdCBlYWNoIHN0ZXA6XG4gIC8vXG4gIC8vICAtIGBvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbmAg4oCUIEdyYWZhbmEgYW5kIEtpYWxpLiBSZWFkLW9ubHkgdmlld3M7IHRoZSB3b3JzdFxuICAvLyAgICBvdXRjb21lIG9mIGEgbWlzdGFrZW4gZ3JhbnQgaXMgc2VlaW5nIHRlbGVtZXRyeS5cbiAgLy8gIC0gYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgICAgIOKAlCBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzLiBBIGRhdGFiYXNlIHNoZWxsXG4gIC8vICAgIG92ZXIgZXZlcnkgdGVuYW50J3Mgcm93czogaXQgY2FuIHJlYWQgYW5kIHJld3JpdGUgdGVuYW50IGRhdGEsIGJ1dCB0aGVcbiAgLy8gICAgYXVkaXQgY2hhaW4gbGl2ZXMgZWxzZXdoZXJlLCBzbyB0aGUgZGFtYWdlIGlzIHJlY29yZGVkLlxuICAvLyAgLSBgb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuYCAgIOKAlCB0aGUgUnVzdEZTIChTMykgY29uc29sZS4gSXQgY2FuIExJU1QgYW5kXG4gIC8vICAgIERFTEVURSBvYmplY3RzIGluIHRoZSByZWdpc3RyeSwgTG9raSwgVGhhbm9zLCBwbHVnaW4tYnVpbGQgYW5kXG4gIC8vICAgIGF1ZGl0LWNoYWluIGJ1Y2tldHMuIFNwbGl0IGZyb20gdGhlIHBhaXIgYWJvdmUgYmVjYXVzZSB0aGUgdHdvIGFyZSB0aGVcbiAgLy8gICAgdHdvIEhBTFZFUyBvZiB0aGUgYXVkaXQgdGFtcGVyLWV2aWRlbmNlIGRlc2lnbjogdGhlIGNoYWluJ3MgSE1BQyBrZXlcbiAgLy8gICAgbGl2ZXMgb3V0c2lkZSB0aGUgREIsIHNvIGEgTW9uZ28gc2hlbGwgY2FuIHRhbXBlciBidXQgY2Fubm90IGZvcmdlIGFcbiAgLy8gICAgY29uc2lzdGVudCBjaGFpbiDigJQgZXhjZXB0IGJ5IHRydW5jYXRpbmcgdGhlIHRhaWwsIHdoaWNoIGEgY2hhaW4gY2Fubm90XG4gIC8vICAgIHNlZSBmcm9tIHRoZSBpbnNpZGUsIGFuZCB0aGUgZGVmZW5jZSBhZ2FpbnN0IFRIQVQgaXMgdGhlIHNpZ25lZFxuICAvLyAgICBjaGFpbi1oZWFkIGV4cG9ydCB0byBvYmplY3Qgc3RvcmFnZS4gT25lIHNoZWxsIGNhbiB0cnVuY2F0ZTsgdGhlIG90aGVyXG4gIC8vICAgIGNhbiBkZWxldGUgdGhlIGhlYWRzIHRoYXQgd291bGQgZXhwb3NlIHRoZSB0cnVuY2F0aW9uLlxuICAvL1xuICAvLyBBbGwgdGhyZWUgYXJlIHN5c3RlbS1vcmctb25seSwgc28gbm9uZSBjYW4gYmUgaGVsZCBpbnNpZGUgYSB0ZW5hbnQsIGFuZCBvbmx5XG4gIC8vIHRoZSBmaXJzdCBpcyBpbiB0aGUgUGxhdGZvcm0gT3BlcmF0b3IgYnVuZGxlOiBzdGFmZmluZyBhbiBvcGVyYXRvciBtdXN0IG5ldmVyXG4gIC8vIGhhbmQgb3ZlciBhIGRhdGEgc2hlbGwgYXMgYSBzaWRlIGVmZmVjdC4gR3JhbnRpbmcgZWl0aGVyIG9mIHRoZSBvdGhlciB0d28gaXNcbiAgLy8gYSBzZXBhcmF0ZSwgZXhwbGljaXQgYWN0IGJ5IGEgc3VwZXJhZG1pbiBjb21wb3NpbmcgYSBSb2xlIGZvciBleGFjdGx5IHRoYXRcbiAgLy8gcHVycG9zZS5cbiAgLy9cbiAgLy8gV0hBVCBUSEUgU1BMSVQgRE9FUyBOT1QgRE8sIHNvIG5vYm9keSBidWlsZHMgb24gaXQ6IGl0IGlzIG5vdCBhIGNvbnRhaW5tZW50XG4gIC8vIGJvdW5kYXJ5LiBSb2xlcyBsaXZlIGluIE1vbmdvIChgY29sbGVjdGlvbjogJ3JvbGVzJ2ApLCBzbyBhXG4gIC8vIGBkYXRhYmFzZV9jb25zb2xlOm9wZW5gIGhvbGRlciBjYW4gd3JpdGUgdGhhdCBjb2xsZWN0aW9uIGFuZCBncmFudCB0aGVtc2VsdmVzXG4gIC8vIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gIOKAlCBkYXRhc3RvcmUgY29udGFpbnMgb2JqZWN0c3RvcmUgYnkgZXNjYWxhdGlvbi4gVGhlXG4gIC8vIHNwbGl0IGV4cHJlc3NlcyBpbnRlbnQsIGtlZXBzIHRoZSBkZWZhdWx0IGdyYW50IHNtYWxsIGFuZCBnaXZlcyBlYWNoIGNsYXNzXG4gIC8vIGl0cyBvd24gcmVmdXNhbCBzaWduYWwuIFdoYXQgYWN0dWFsbHkgcHJvdGVjdHMgdGhlIGF1ZGl0IGhlYWRzIGZyb20gd2hvZXZlclxuICAvLyBvcGVucyB0aGF0IGNvbnNvbGUgaXMgUzMgT2JqZWN0IExvY2sgd2l0aCBhIHJldGFpbi11bnRpbC1kYXRlXG4gIC8vIChgcGxhdGZvcm0vc3JjL3NlcnZpY2VzL2F1ZGl0LWhlYWQtZXhwb3J0LnRzYCksIHdoaWNoIGhvbGRzIHJlZ2FyZGxlc3Mgb2ZcbiAgLy8gYW55IHBlcm1pc3Npb24gaGVyZS5cbiAgfCAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nXG4gIHwgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbidcbiAgfCAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJ1xuICAvLyBPbi1jYWxsIChzeXN0ZW0tb3JnIG9ubHkpLiBSZWFkcyB0aGUgcGFnaW5nIFBPU1RVUkUgYW5kIHNlbmRzIGEgdGVzdCBwYWdlLlxuICAvLyBOb3QgYSBzY2hlZHVsZSBlZGl0b3Ig4oCUIHRoZSBwcm92aWRlciBvd25zIHRoZSByb3RhIOKAlCBhbmQgZGVsaWJlcmF0ZWx5IG5vdCBhXG4gIC8vIHNldHRpbmdzIHN1cmZhY2UgZWl0aGVyLCBiZWNhdXNlIGV2ZXJ5IGtub2IgaXMgb3BlcmF0b3Itc2lkZSBlbnYuIFdoYXQgaXRcbiAgLy8gZ3JhbnRzIGlzIHRoZSBvbmUgdGhpbmcgYSBwcm9kdWN0IHN1cmZhY2UgY2FuIGdpdmUgdGhhdCBhIHNoZWxsIGNhbm5vdDpcbiAgLy8gXCJ3aWxsIHdlIGFjdHVhbGx5IGJlIHBhZ2VkXCIsIGFuc3dlcmFibGUgd2l0aG91dCBjbHVzdGVyIGFjY2Vzcy5cbiAgfCAnb25jYWxsOm1hbmFnZSdcbiAgLy8gVGhlIHZlbmRvcidzIG90aGVyIG9wZXJhdGlvbmFsIFRBU0tTIChzeXN0ZW0gb3JnIG9ubHkpLiBFYWNoIGV4aXN0cyBzbyBhXG4gIC8vIHN1cGVyYWRtaW4gY2FuIHN0YWZmIG9uZSBqb2Igd2l0aCBhIFJvbGUgaW5zdGVhZCBvZiB0aGUgc3VwZXJhZG1pbiBmbGFnIOKAlFxuICAvLyBiZWZvcmUgdGhlc2UsIDM0IHJvdXRlcyB3ZXJlIHJlYWNoYWJsZSBvbmx5IGJ5IHNvbWVvbmUgd2hvIGFsc28gaGVsZFxuICAvLyBpbXBlcnNvbmF0aW9uLCBhIGRhdGFiYXNlIHNoZWxsIGFuZCB0aGUgYWJpbGl0eSB0byBtaW50IGFub3RoZXIgc3VwZXJhZG1pbi5cbiAgLy9cbiAgLy8gU3VwcG9ydCBkZXNrLCBzcGxpdCBpbiB0d28gYmVjYXVzZSB0aGUgY29udGVudCBpcyByZXVzZWQgYWNyb3NzIGV2ZXJ5XG4gIC8vIGN1c3RvbWVyIHdoaWxlIGEgY2FzZSBiZWxvbmdzIHRvIG9uZTogYHN1cHBvcnRfY2FzZXM6d3JpdGVgIGlzIHRoZSBkZXNrJ3NcbiAgLy8gb3duIHdvcmsgKHRyaWFnZSwgYXNzaWdubWVudCwgc2V2ZXJpdHksIGludGVybmFsIG5vdGVzLCByZWNvcmRpbmcgYW5cbiAgLy8gaW5jaWRlbnQgYWdhaW5zdCBhIHN1cHBvcnQgY29udHJhY3QpLCBgc3VwcG9ydF9jb250ZW50OndyaXRlYCBpcyBhdXRob3JpbmdcbiAgLy8gdGhlIGNhbm5lZCByZXBsaWVzLiBFYWNoIGdhdGVzIGl0cyB0YXNrJ3MgUkVBRFMgYXMgd2VsbCBhcyBpdHMgd3JpdGVzLFxuICAvLyBhZ2FpbnN0IHRoZSB1c3VhbCBjb252ZW50aW9uLCBiZWNhdXNlIHRoZXNlIHRhYmxlcyBjYXJyeSBubyBgb3JnX2lkYCDigJQgdGhlcmVcbiAgLy8gaXMgbm8gdGVuYW5jeSBib3VuZGFyeSB1bmRlcm5lYXRoIHRvIGZhbGwgYmFjayBvbi5cbiAgfCAnc3VwcG9ydF9jYXNlczp3cml0ZSdcbiAgfCAnc3VwcG9ydF9jb250ZW50OndyaXRlJ1xuICAvLyBDcm9zcy10ZW5hbnQgc3Vic2NyaXB0aW9ucy4gUmVhZCBpcyBzcGxpdCBmcm9tIHdyaXRlIGJlY2F1c2UgYSByZWFkLW9ubHlcbiAgLy8gaG9sZGVyIGlzIGEgcmVhbCBqb2IgaGVyZTogc29tZW9uZSB3aG8gcmVwb3J0cyBvbiByZXZlbnVlIGFuZCBwbGFuIG1peFxuICAvLyB3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hhbmdlIGEgcGxhbiBvciBjYW5jZWwgb25lLlxuICB8ICdzdWJzY3JpcHRpb25zOnJlYWQnXG4gIHwgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJ1xuICAvLyBUaGUgb3JnIGxpZmVjeWNsZSBBQ1JPU1MgdGVuYW50czogcmVuYW1lLCBkZWxldGUsIGNoYW5nZSB0aWVyLCBtb3ZlIHVuZGVyIGFcbiAgLy8gbmV3IHBhcmVudC4gRGlzdGluY3QgZnJvbSBgb3JnX3NldHRpbmdzOndyaXRlYCwgd2hpY2ggaXMgYW4gb3JnIGFjdGluZyBvblxuICAvLyBpdHNlbGYuXG4gIHwgJ29yZ3M6bWFuYWdlJ1xuICAvLyBDcm9zcy10ZW5hbnQgcXVvdGEgd3JpdGVzLiBUaGUgbWF0Y2hpbmcgcmVhZHMgKGAvcXVvdGFzL2FsbGAsIGAvYXQtcmlza2ApXG4gIC8vIHJpZGUgYHBsYXRmb3JtOnJlYWRgIHdpdGggdGhlIHJlc3Qgb2YgdGhlIG9wZXJhdG9yIGRhc2hib2FyZCwgc28gc29tZW9uZVxuICAvLyB3YXRjaGluZyBmb3IgZXhoYXVzdGlvbiBkb2VzIG5vdCBuZWVkIHRoZSBhYmlsaXR5IHRvIHJhaXNlIGEgbGltaXQuXG4gIHwgJ3F1b3RhczptYW5hZ2UnXG4gIC8vIFRoZSBwbHVnaW4gQlVJTEQgcXVldWUg4oCUIGRlcHRoLCBzdGFsbHMsIGFuZCBwdXJnaW5nIHRoZSBkZWFkLWxldHRlciBxdWV1ZS5cbiAgLy8gRGlzdGluY3QgZnJvbSBgcGx1Z2luczptb2RlcmF0ZWAsIHdoaWNoIGlzIGVjb3N5c3RlbSBnb3Zlcm5hbmNlOiB0aGlzIGlzXG4gIC8vIGluZnJhc3RydWN0dXJlLCBhbmQgdGhlIHBlb3BsZSB3aG8gcnVuIGl0IGFyZSBub3QgdGhlIHBlb3BsZSB3aG8gcmV2aWV3XG4gIC8vIHN1Ym1pc3Npb25zLlxuICB8ICdwbHVnaW5fcXVldWU6bWFuYWdlJ1xuICAvLyBDb21wbGlhbmNlXG4gIHwgJ2NvbXBsaWFuY2U6cmVhZCdcbiAgfCAnY29tcGxpYW5jZTp3cml0ZSdcbiAgLy8gTWVtYmVycyAmIGFjY2Vzc1xuICB8ICdtZW1iZXJzOm1hbmFnZSdcbiAgfCAncm9sZXM6bWFuYWdlJ1xuICB8ICdpbnZpdGF0aW9uczptYW5hZ2UnXG4gIC8vIE9yZy1zY29wZWQgc2VydmljZSBhY2NvdW50cyAobm9uLWh1bWFuIHByaW5jaXBhbHMpIGFuZCB0aGVpciBhY2Nlc3Mga2V5cy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBtZW1iZXJzOm1hbmFnZWAgYmVjYXVzZSBhIHNlcnZpY2UgYWNjb3VudCBpcyBhIENSRURFTlRJQUxcbiAgLy8gaG9sZGVyLCBub3QgYSBwZXJzb246IGdyYW50aW5nIHNvbWVvbmUgdGhlIGFiaWxpdHkgdG8gbWludCBsb25nLWxpdmVkXG4gIC8vIG1hY2hpbmUga2V5cyBpcyBhIGRpZmZlcmVudCBkZWNpc2lvbiBmcm9tIGxldHRpbmcgdGhlbSBtYW5hZ2UgdGhlIHJvc3Rlci5cbiAgfCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnXG4gIC8vIE9ic2VydmFiaWxpdHlcbiAgfCAnZGFzaGJvYXJkczpyZWFkJ1xuICB8ICdkYXNoYm9hcmRzOndyaXRlJ1xuICB8ICdvYnNlcnZhYmlsaXR5OnJlYWQnXG4gIHwgJ29ic2VydmFiaWxpdHk6d3JpdGUnXG4gIC8vIGBsb2dzOmV4cG9ydGAgaXMgc3BsaXQgT1VUIG9mIGBvYnNlcnZhYmlsaXR5OnJlYWRgIGRlbGliZXJhdGVseS4gUmVhZGluZ1xuICAvLyBsb2dzIGluIHRoZSBVSSBpcyBwYWdlZCBhbmQgZXBoZW1lcmFsOyBFWFBPUlRJTkcgdGhlbSBpcyBidWxrIGVncmVzcyB0aGF0XG4gIC8vIGxlYXZlcyB0aGUgYnVpbGRpbmcgYW5kIG91dGxpdmVzIGEgcmV2b2tlZCBzZXNzaW9uLCBzbyBhbiBvcmcgYWRtaW4gbXVzdCBiZVxuICAvLyBhYmxlIHRvIGdyYW50IGxvZyB2aWV3aW5nIHdpdGhvdXQgZ3JhbnRpbmcgZG93bmxvYWRzLlxuICB8ICdsb2dzOmV4cG9ydCdcbiAgLy8gVGhlIG9yZydzIG93biBoYXNoLWNoYWluZWQgYXVkaXQgdHJhaWwuIE9SRy1BU1NJR05BQkxFLCB1bmxpa2UgdGhlIHBsYXRmb3JtXG4gIC8vIG9wZXJhdGlvbnMgcGFpcjogdGhlIHJvd3MgYW4gb3JnIHJlYWRzIGFyZSBpdHMgb3duICh0aGUgcXVlcnkgcHJlZGljYXRlIGlzXG4gIC8vIGBvcmdJZGAgT1IgYGFmZmVjdGVkT3JnSWRgKSwgc28gZGVsZWdhdGluZyBpdCBpcyBhbiBvcmcncyBkZWNpc2lvbiDigJQgYVxuICAvLyBjb21wbGlhbmNlIHJldmlld2VyIGNhbiBiZSBnaXZlbiB0aGUgdHJhaWwgd2l0aG91dCBiZWluZyBtYWRlIGFuIGFkbWluIG9mXG4gIC8vIGV2ZXJ5dGhpbmcgdGhhdCBwcm9kdWNlZCBpdC4gUmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjsgdGhlcmUgaXMgbm8gd3JpdGUuXG4gIHwgJ2F1ZGl0OnJlYWQnXG4gIC8vIEluc2lnaHRzXG4gIHwgJ3JlcG9ydHM6cmVhZCdcbiAgfCAncmVwb3J0czpyb2xsdXAnXG4gIC8vIFN0YWtlaG9sZGVyIHJlcG9ydHMuIGByZXBvcnRzOnJlYWRgIHN0YXlzIHRoZSBGUkVFIG9uLWRlbWFuZCBkYXNoYm9hcmQgcmVhZDtcbiAgLy8gdGhlc2UgdHdvIGFyZSB0aGUgYWRkLW9uJ3Mgd3JpdGUgc3VyZmFjZSDigJQgYGF1dGhvcmAgc2F2ZXMvc2NoZWR1bGVzL2RyYWZ0cyBhXG4gIC8vIHJlcG9ydCwgYHNoYXJlYCBwdWJsaXNoZXMgaXQgYmV5b25kIHRoZSBwbGF0Zm9ybSAoUERGLCBlbWFpbCwgc2hhcmUgbGlua3MpLlxuICAvLyBTcGxpdCBiZWNhdXNlIHB1Ymxpc2hpbmcgZXh0ZXJuYWxseSBpcyBhIGRpZmZlcmVudCByaXNrIGZyb20gY29tcG9zaW5nOlxuICAvLyBhIGxlYWQgY2FuIGJlIGFsbG93ZWQgdG8gYnVpbGQgcmVwb3J0cyB3aXRob3V0IGJlaW5nIGFsbG93ZWQgdG8gZW1haWwgdGhlbSBvdXQuXG4gIHwgJ3JlcG9ydHM6d3JpdGUnXG4gIHwgJ3JlcG9ydHM6cHVibGlzaCdcbiAgLy8gTWVzc2FnaW5nXG4gIHwgJ21lc3NhZ2VzOnJlYWQnXG4gIHwgJ21lc3NhZ2VzOndyaXRlJ1xuICAvLyBCaWxsaW5nICYgcXVvdGFzXG4gIHwgJ2JpbGxpbmc6cmVhZCdcbiAgfCAnYmlsbGluZzptYW5hZ2UnXG4gIHwgJ3F1b3RhczpyZWFkJ1xuICAvLyBJbXBlcnNvbmF0aW9uIOKAlCB2aWV3aW5nIHRoZSBwbGF0Zm9ybSBhcyBzb21lYm9keSBlbHNlLiBUaHJlZSBpZHMsIGJlY2F1c2VcbiAgLy8gdGhyZWUgZGlmZmVyZW50IHBhcnRpZXMgYXJlIGludm9sdmVkIGFuZCBlYWNoIGRlY2lzaW9uIGJlbG9uZ3MgdG8gYVxuICAvLyBkaWZmZXJlbnQgb25lIG9mIHRoZW0gKGRvY3MvcGVybWlzc2lvbnMubWQjaW1wZXJzb25hdGlvbik6XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOm9wZW5gICAgdGhlIFZFTkRPUiBvcGVuaW5nIGEgY3Jvc3MtdGVuYW50IHNlc3Npb24sIHdoaWNoXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3lzdGVtLW9yZy1vbmx5IGFuZCBzdGlsbCBjb25zZW50LWdhdGVkO1xuICAvLyAgLSBgdGVhbV9hY2Nlc3M6b3BlbmAgICAgIGEgUEFSRU5UIG9yZydzIGFkbWluIHZpZXdpbmcgb25lIG9mIGl0cyBvd24gdGVhbXMnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycywgd2hpY2ggbmV2ZXIgbGVhdmVzIHRoZSB0ZW5hbnQ7XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIHRoZSBURU5BTlQgYW5zd2VyaW5nIGEgY29uc2VudCByZXF1ZXN0LlxuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIGJlbG93IGlzIGEgZm91cnRoIHRoaW5nIGFnYWluOiB0aGUgUE9MSUNZIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGNvbnNlbnQgaXMgbmVlZGVkIGF0IGFsbC5cbiAgfCAnaW1wZXJzb25hdGlvbjpvcGVuJ1xuICB8ICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnXG4gIHwgJ3RlYW1fYWNjZXNzOm9wZW4nXG4gIC8vIFJlZ2lzdHJ5LiBUaHJlZSBydW5ncywgYmVjYXVzZSB0aGUgd3JpdGUgaGFsZiBoYXMgdHdvIHZlcnkgZGlmZmVyZW50XG4gIC8vIGJsYXN0IHJhZGlpOiBgd3JpdGVgIENPUElFUyBhIG1hbmlmZXN0IChhZGRpdGl2ZSDigJQgaXQgY3JlYXRlcyBhIHRhZyxcbiAgLy8gbm90aGluZyBzdG9wcyByZXNvbHZpbmcpLCBgcHVyZ2VgIERFTEVURVMgb25lIChhIHRlbmFudCdzIHBpcGVsaW5lIG9yIGFcbiAgLy8gZGlnZXN0LXBpbm5lZCBwbHVnaW4gaW1hZ2UgY2FuIHN0b3AgcmVzb2x2aW5nLCB3aXRoIG5vIHVuZG8pLlxuICB8ICdyZWdpc3RyeTpyZWFkJ1xuICB8ICdyZWdpc3RyeTp3cml0ZSdcbiAgfCAncmVnaXN0cnk6cHVyZ2UnXG4gIC8vIE9yZ2FuaXphdGlvbiBzZXR0aW5ncy4gRm91ciBSRVNPVVJDRVMsIGVhY2ggd2l0aCB0aGUgYDp3cml0ZWAgYWN0aW9uLCByYXRoZXJcbiAgLy8gdGhhbiBvbmUgYG9yZ2AgcmVzb3VyY2Ugd2l0aCBmb3VyIG5vdW4tc2hhcGVkIGFjdGlvbnMg4oCUIHRoZXNlIGFyZSB0aGUgb3JnJ3NcbiAgLy8gb3duIGNvbmZpZ3VyYXRpb24gc3RhdGUsIHdoaWNoIGlzIHdoYXQgYDp3cml0ZWAgbWVhbnMgaGVyZSAoYDptYW5hZ2VgIGlzXG4gIC8vIHJlc2VydmVkIGZvciBhZG1pbmlzdGVyaW5nIGEgY29sbGVjdGlvbiBvZiBvdGhlciBlbnRpdGllczogbWVtYmVycywgcm9sZXMsXG4gIC8vIGludml0YXRpb25zLCBzZXJ2aWNlIGFjY291bnRzLCBiaWxsaW5nKS5cbiAgLy9cbiAgLy8gIC0gYG9yZ19zZXR0aW5nczp3cml0ZWAgICAgICDigJQgZ2VuZXJhbCBvcmcgc2V0dGluZ3MgKyBBSSBjb25maWcuXG4gIC8vICAtIGBvcmdfaWRwOndyaXRlYCAgICAgICAgICAg4oCUIFNTTyAvIElkUCBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6IGNvbnRyb2xzIGxvZ2luKS5cbiAgLy8gIC0gYG9yZ19rbXM6d3JpdGVgICAgICAgICAgICDigJQgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5IGNvbmZpZ3VyYXRpb25cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZW5zaXRpdmU6IGNvbnRyb2xzIGVuY3J5cHRpb24gb2Ygb3JnIGRhdGEpLlxuICAvLyAgLSBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIOKAlCB0aGUgaW1wZXJzb25hdGlvbiBwb2xpY3kgKHNlbnNpdGl2ZTogY29udHJvbHNcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdobyBtYXkgVklFVyB0aGUgb3JnJ3MgZGF0YSBhcyBhIG1lbWJlcikuXG4gIC8vXG4gIC8vIFRoZSBsYXN0IHRocmVlIHdlcmUgc3BsaXQgT1VUIG9mIGBvcmdfc2V0dGluZ3M6d3JpdGVgIHNvIGEgY3VzdG9tIHJvbGUgY2FuXG4gIC8vIGdyYW50IGdlbmVyYWwgc2V0dGluZ3MgV0lUSE9VVCB0aGUgc2Vuc2l0aXZlIHN1cmZhY2VzIOKAlCBhIFwic2V0dGluZ3MgbWFuYWdlclwiXG4gIC8vIHJvbGUgZm9yIG9yZyBuYW1lIG9yIEFJIHByb3ZpZGVyIG11c3Qgbm90IGFsc28gYmUgYWJsZSB0byBzd2l0Y2ggdGhlIG9yZyB0b1xuICAvLyBgb3BlbmAuIEFsbCByZW1haW4gb3JnLWFzc2lnbmFibGUgYW5kIGFyZSBzZWVkZWQgaW50byB0aGUgYWRtaW4vb3duZXJcbiAgLy8gYnVuZGxlcyAodmlhIE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TKSBzbyBleGlzdGluZyBhZG1pbnMga2VlcCBmdWxsXG4gIC8vIGFjY2Vzcy5cbiAgfCAnb3JnX3NldHRpbmdzOndyaXRlJ1xuICB8ICdvcmdfaWRwOndyaXRlJ1xuICB8ICdvcmdfa21zOndyaXRlJ1xuICB8ICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZSc7XG5cbi8qKlxuICogVGhlIENMT1NFRCBzZXQgb2YgYWN0aW9ucyBhIHBlcm1pc3Npb24gaWQgbWF5IGVuZCBpbiDigJQgdGhlIHNlY29uZCBoYWxmIG9mIHRoZVxuICogYHJlc291cmNlOmFjdGlvbmAgc3RyYXRlZ3kgdGhlIGRvY3MgZGVzY3JpYmUuXG4gKlxuICogSXQgaXMgY2xvc2VkIGZvciBvbmUgY29uY3JldGUgcmVhc29uOiBgaXNNdXRhdGlvblBlcm1pc3Npb25gIChmcm9udGVuZFxuICogYGxpYi9hdXRoLWhlbHBlcnMudHNgKSBjbGFzc2lmaWVzIHJlYWQgdnMgd3JpdGUgQlkgU1VGRklYLCBhbmQgdGhhdCBpcyB3aGF0XG4gKiBkaXNhYmxlcyBldmVyeSB3cml0ZSBhZmZvcmRhbmNlIGR1cmluZyBhIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uIHNlc3Npb24uIEFcbiAqIG5vdW4tc2hhcGVkIGFjdGlvbiAodGhlIGZvcm1lciBgb3JnOnNldHRpbmdzYCBhbmQgYGNvbnNvbGVzOmRhdGFzdG9yZWApIGNhbm5vdCBiZSBjbGFzc2lmaWVkXG4gKiBieSBuYW1lLCBzbyBlYWNoIG9uZSBoYWQgdG8gYmUgaGFuZC1saXN0ZWQg4oCUIGFuZCBhIHBlcm1pc3Npb24gYWRkZWQgd2l0aG91dFxuICogcmVtZW1iZXJpbmcgdGhhdCBsaXN0IHJlbmRlcnMgYW4gZW5hYmxlZCBjb250cm9sIHRoYXQgZGVhZC1lbmRzIG9uIGEgNDAzLlxuICpcbiAqIFJlYWRzIGFyZSBgOnJlYWRgIGFuZCBgOnJvbGx1cGAgKGEgcmVhZC1WSVNJQklMSVRZIHNjb3BlKS4gRXZlcnl0aGluZyBlbHNlIGlzXG4gKiBhIHdyaXRlLiBUaGUgZml2ZSBkb21haW4gdmVyYnMgYXJlIGtlcHQgYmVjYXVzZSBlYWNoIG5hbWVzIGFuIGFjdGlvbiB3aXRoIG5vXG4gKiBzeW5vbnltIGluIHRoaXMgdm9jYWJ1bGFyeSDigJQgYDpleHBvcnRgIGlzIGVncmVzcyByYXRoZXIgdGhhbiBtdXRhdGlvbixcbiAqIGA6aW5zdGFsbGAgaXMgY29uc3VtcHRpb24gcmF0aGVyIHRoYW4gYXV0aG9yaW5nLCBgOm1vZGVyYXRlYCBhbmQgYDp2ZXJpZnlgIGFyZVxuICogZWNvc3lzdGVtIGRlY2lzaW9ucywgYW5kIGA6b3BlcmF0ZWAgbW92ZXMgYW5vdGhlciB0ZW5hbnQncyBtb25leS5cbiAqXG4gKiBgUEVSTUlTU0lPTl9JRF9TSEFQRWAgYW5kIHRoaXMgbGlzdCBhcmUgYXNzZXJ0ZWQgb3ZlciB0aGUgd2hvbGUgY2F0YWxvZyBpblxuICogYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCwgc28gYWRkaW5nIGFuIG9mZi1zdHJhdGVneSBpZCBmYWlsc1xuICogdGhlcmUgcmF0aGVyIHRoYW4gYXQgYSA0MDMuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0FDVElPTlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAncmVhZCcsICdyb2xsdXAnLFxuICAnd3JpdGUnLCAnbWFuYWdlJywgJ3B1Ymxpc2gnLCAnb3BlbicsXG4gICdleHBvcnQnLCAnaW5zdGFsbCcsICdtb2RlcmF0ZScsICd2ZXJpZnknLCAnb3BlcmF0ZScsICdwdXJnZScsICdhcHByb3ZlJyxcbl07XG5cbi8qKiBgcmVzb3VyY2U6YWN0aW9uYCwgd2hlcmUgcmVzb3VyY2UgaXMgYHNuYWtlX2Nhc2VgIGFuZCBhY3Rpb24gaXMgaW4ge0BsaW5rIFBFUk1JU1NJT05fQUNUSU9OU30uICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9JRF9TSEFQRSA9IC9eW2Etel1bYS16MC05X10qOlthLXpdKyQvO1xuXG4vKiogQWxsIHZhbGlkIHBlcm1pc3Npb25zIChvcmRlciBkZXRlcm1pbmVzIGRpc3BsYXkgb3JkZXIgaW4gdGhlIHBpY2tlcikuICovXG5leHBvcnQgY29uc3QgQUxMX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsICdwaXBlbGluZXM6d3JpdGUnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLCAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLFxuICAndG9vbGNoYWluOm1hbmFnZScsXG4gICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6d3JpdGUnLCAndGVtcGxhdGVzOnB1Ymxpc2gnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgJ3BsdWdpbnM6aW5zdGFsbCcsICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJywgJ3B1Ymxpc2hlcnM6bWFuYWdlJyxcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLCAncHVibGlzaGVyczp2ZXJpZnknLFxuICAncGxhdGZvcm06cmVhZCcsICdvcmdzOnJlYWQnLCAndG9vbGNoYWluOm9wZXJhdGUnLCAnYmlsbGluZzpvcGVyYXRlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJywgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAnb25jYWxsOm1hbmFnZScsXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJywgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLCAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLCAncXVvdGFzOm1hbmFnZScsICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsICdjb21wbGlhbmNlOndyaXRlJyxcbiAgJ21lbWJlcnM6bWFuYWdlJywgJ3JvbGVzOm1hbmFnZScsICdpbnZpdGF0aW9uczptYW5hZ2UnLCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLFxuICAnZGFzaGJvYXJkczpyZWFkJywgJ2Rhc2hib2FyZHM6d3JpdGUnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnLFxuICAnbG9nczpleHBvcnQnLCAnYXVkaXQ6cmVhZCcsXG4gICdyZXBvcnRzOnJlYWQnLCAncmVwb3J0czpyb2xsdXAnLCAncmVwb3J0czp3cml0ZScsICdyZXBvcnRzOnB1Ymxpc2gnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLFxuICAncXVvdGFzOnJlYWQnLFxuICAncmVnaXN0cnk6cmVhZCcsICdyZWdpc3RyeTp3cml0ZScsICdyZWdpc3RyeTpwdXJnZScsXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLCAnaW1wZXJzb25hdGlvbjphcHByb3ZlJywgJ3RlYW1fYWNjZXNzOm9wZW4nLFxuICAnb3JnX3NldHRpbmdzOndyaXRlJywgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFRoZSBDTE9TRUQgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSB7QGxpbmsgUGVybWlzc2lvbn0gYW5kIGRlY2lkZSBhY2Nlc3MuXG4gKlxuICogXCJJcyBwZXJtaXNzaW9uIFggZW5mb3JjZWQgYW55d2hlcmU/XCIgaGFzIHRvIGJlIGFuc3dlcmFibGUgc3RhdGljYWxseSwgd2hpY2hcbiAqIGEgZ3JlcCBjYW4ndCBkbzogZm91ciBkaWZmZXJlbnQgY2FsbCBzaGFwZXMgY29uc3VtZSBhIHBlcm1pc3Npb24gaWRcbiAqIChgcmVxdWlyZVBlcm1pc3Npb24oJ3gnKWAgYXQgYSByb3V0ZSwgYHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgJ3gnKWAgaW5zaWRlIGFcbiAqIGNvbnRyb2xsZXIsIGFuZCBgcmVzb2x2ZVZpc2liaWxpdHkocmVxLCB2LCAneCcpYCAvXG4gKiBgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcyjigKYsICd4JylgIGluIHRoZSB2aXNpYmlsaXR5IGhlbHBlcnMpLCBzbyBhIG5haXZlXG4gKiBncmVwIGZvciBhIHJvdXRlLWxldmVsIGdhdGUgcmVwb3J0cyBgdGVtcGxhdGVzOnB1Ymxpc2hgIGFzIFVORU5GT1JDRUQgd2hlbiBpdFxuICogaXMgaW4gZmFjdCBlbmZvcmNlZCBvbiBldmVyeSB0ZW1wbGF0ZSBwdWJsaXNoLlxuICpcbiAqIFRoZXkgYWxsIGJvdHRvbSBvdXQgaW4gYHVzZXJIYXNQZXJtaXNzaW9uYCwgc28gdGhlIFJVTlRJTUUgcHJpbWl0aXZlIHdhc1xuICogYWxyZWFkeSBvbmUuIFRoaXMgY29uc3RhbnQgbWFrZXMgdGhlIFNUQVRJQyBzdXJmYWNlIG9uZSBhcyB3ZWxsOiBpdCBuYW1lc1xuICogZXZlcnkgZW50cnkgcG9pbnQsIHNvIGBwZXJtaXNzaW9uLWNvdmVyYWdlLnRlc3QudHNgIGNhbiBlbnVtZXJhdGUgdGhlIGNhdGFsb2dcbiAqIGFuZCByZXBvcnQgZWFjaCBwZXJtaXNzaW9uJ3MgZW5mb3JjZW1lbnQgc2l0ZXMgd2l0aG91dCBndWVzc2luZy4gQSBuZXcgZ2F0ZVxuICogdGhhdCB0YWtlcyBhIGBQZXJtaXNzaW9uYCBtdXN0IGJlIGxpc3RlZCBoZXJlLCBvciB0aGUgY292ZXJhZ2UgcmVwb3J0IHN0YXJ0c1xuICogbHlpbmcgYWJvdXQgdGhlIHBlcm1pc3Npb25zIG9ubHkgdGhhdCBnYXRlIGVuZm9yY2VzLlxuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9HQVRFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIC8vIE1pZGRsZXdhcmUgZ2F0ZXMgKHJvdXRlIGxldmVsKSDigJQgYWxsIGFueS1vZiBleGNlcHQgcmVxdWlyZUFsbFBlcm1pc3Npb25zLlxuICAncmVxdWlyZVBlcm1pc3Npb24nLFxuICAncmVxdWlyZUFsbFBlcm1pc3Npb25zJyxcbiAgJ3JlcXVpcmVQZXJtaXNzaW9uT3JTZXJ2aWNlJyxcbiAgLy8gVGhlIHBsdWdpbi1lY29zeXN0ZW0gZ292ZXJuYW5jZSBjaGFpbiAoc3lzdGVtIG9yZyArIHBlcm1pc3Npb24gKyBhYWwyKS5cbiAgJ3JlcXVpcmVTeXN0ZW1PcmdQZXJtaXNzaW9uJyxcbiAgLy8gVGhlIHNpbmdsZSBydW50aW1lIHByaW1pdGl2ZSBldmVyeSBnYXRlIGFib3ZlIGRlbGVnYXRlcyB0bzsgYWxzbyBjYWxsZWRcbiAgLy8gZGlyZWN0bHkgd2hlcmUgYSBjb250cm9sbGVyIGJyYW5jaGVzIG9uIGEgY2FwYWJpbGl0eSByYXRoZXIgdGhhbiByZWplY3RpbmcuXG4gICd1c2VySGFzUGVybWlzc2lvbicsXG4gICdoYXNQZXJtaXNzaW9uJyxcbiAgLy8gVmlzaWJpbGl0eSBoZWxwZXJzIOKAlCB0aGV5IHRha2UgdGhlIGVudGl0eSdzIFBVQkxJU0ggcGVybWlzc2lvbi5cbiAgJ3JlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAnY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAncmVzb2x2ZVZpc2liaWxpdHknLFxuICAvLyBxdW90YSdzIG93biB3cmFwcGVyLiBJdCBkZWxlZ2F0ZXMgdG8gYHJlcXVpcmVQZXJtaXNzaW9uYCwgYnV0IGl0IHRha2VzIHRoZVxuICAvLyBpZCBhcyBhbiBPUFRJT04gKGBhdXRob3JpemVPcmcoeyBwZXJtaXNzaW9uOiAncXVvdGFzOm1hbmFnZScgfSlgKSBiZWNhdXNlIGl0XG4gIC8vIGFsc28gY2Fub25pY2FsaXplcyB0aGUgYDpvcmdJZGAgcGFyYW0sIHdoaWNoIHRoZSByb3V0ZSBjYW5ub3QgZHJvcC4gV2l0aG91dFxuICAvLyB0aGlzIGVudHJ5IHRoZSBjb3ZlcmFnZSBzY2FuIHJlcG9ydGVkIGBxdW90YXM6bWFuYWdlYCBhcyBlbmZvcmNlZCBub3doZXJlLlxuICAnYXV0aG9yaXplT3JnJyxcbl07XG5cbi8qKlxuICogRGlzcGxheSBtZXRhZGF0YSBmb3Igb25lIHBlcm1pc3Npb246IHRoZSBsYWJlbCArIGRlc2NyaXB0aW9uIHRoZVxuICogcGVybWlzc2lvbi1waWNrZXIgVUkgc2hvd3MsIGFuZCB0aGUgY2F0ZWdvcnkgaXQgZ3JvdXBzIHVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25NZXRhIHtcbiAgaWQ6IFBlcm1pc3Npb247XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb24gY2F0YWxvZyB3aXRoIGRpc3BsYXkgbWV0YWRhdGEsIGluIHBpY2tlciBvcmRlci5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgU0lOR0xFIGNhdGFsb2cgZm9yIGJhY2tlbmQgYW5kIGJyb3dzZXIgYWxpa2U6IGl0IGhhcyBub1xuICogcnVudGltZSBkZXBlbmRlbmNpZXMgKHRoZSBvbmx5IGltcG9ydCBpcyBhIHR5cGUpLCBzbyB0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdFxuICogdGhyb3VnaCB0aGUgYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3Blcm1pc3Npb25zYCBzdWJwYXRoIGluc3RlYWQgb2Yga2VlcGluZ1xuICogYSBoYW5kLW1haW50YWluZWQgbWlycm9yLiBFdmVyeSBpZCBpbiB7QGxpbmsgQUxMX1BFUk1JU1NJT05TfSBtdXN0IGFwcGVhciBoZXJlXG4gKiBleGFjdGx5IG9uY2UgKGFzc2VydGVkIGJ5IGBwZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0NBVEFMT0c6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10gPSBbXG4gIHsgaWQ6ICdwaXBlbGluZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGlwZWxpbmVzIGFuZCB0aGVpciBleGVjdXRpb25zJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZXMnLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgeyBpZDogJ3BpcGVsaW5lczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwaXBlbGluZXMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsIGxhYmVsOiAnUmVnaXN0ZXIgZGVwbG95bWVudHMnLCBkZXNjcmlwdGlvbjogJ1JlY29yZCBhbmQgcmVtb3ZlIHRoZSBkZXBsb3llZCBzdGFjayBhbmQgc3RlcCBtYW5pZmVzdCBiZWhpbmQgYSBwaXBlbGluZSAodGhlIHBpcGVsaW5lIHJlZ2lzdHJ5KScsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAndG9vbGNoYWluOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHRoZSBvcmcgdG9vbGNoYWluIGRlZmF1bHQnLCBkZXNjcmlwdGlvbjogXCJDaG9vc2Ugd2hpY2ggbWFuYWdlZCB0b29sY2hhaW4gcmVsZWFzZSB5b3VyIG9yZydzIHVucGlubmVkIHBpcGVsaW5lcyAoYW5kIHRlYW1zIHdpdGhvdXQgdGhlaXIgb3duKSBidWlsZCB3aXRoLCBvciBmb2xsb3cgdGhlIHBsYXRmb3JtIGRlZmF1bHRcIiwgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6cmVhZCcsIGxhYmVsOiAnVmlldyB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgdGhlIGdvbGRlbi1wYXRoIHRlbXBsYXRlIGNhdGFsb2cnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnQXV0aG9yLCBlZGl0LCBhbmQgZGVsZXRlIHBpcGVsaW5lIHRlbXBsYXRlcycsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdTaGFyZSBhIHRlbXBsYXRlIGJleW9uZCB5b3VyIG9yZyAocHVibGljIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnVmlldyBwbHVnaW5zIGFuZCBidWlsZHMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCB1cGxvYWQsIGVkaXQsIGFuZCBkZWxldGUgcGx1Z2lucycsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdNYWtlIHBsdWdpbnMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAncGx1Z2luczppbnN0YWxsJywgbGFiZWw6ICdJbnN0YWxsIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ0luc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgZWNvc3lzdGVtIHBsdWdpbnMgKG9yIHJlcXVlc3QgYW4gaW5zdGFsbCB3aGVuIHlvdXIgb3JnIHJlcXVpcmVzIGFwcHJvdmFsKScsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3BsdWdpbl9pbnN0YWxsczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBwbHVnaW4gaW5zdGFsbHMnLCBkZXNjcmlwdGlvbjogXCJTZXQgeW91ciBvcmcncyBwbHVnaW4gY29uc3VtcHRpb24gcG9saWN5IGFuZCBhcHByb3ZlIG9yIGRlbnkgaW5zdGFsbCByZXF1ZXN0cyB3aXRoaW4gdGhlIG9yZ1wiLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwdWJsaXNoZXJzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHB1Ymxpc2hlciBwcm9maWxlJywgZGVzY3JpcHRpb246IFwiTWFuYWdlIHlvdXIgb3JnJ3MgcHVibGlzaGVyIHByb2ZpbGUgYW5kIHN1Ym1pdCBwdWJsaXNoLCB2ZXJpZmljYXRpb24sIHRyYW5zZmVyLCBhbmQgYWR2aXNvcnkgcmVxdWVzdHNcIiwgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncGx1Z2luczptb2RlcmF0ZScsIGxhYmVsOiAnTW9kZXJhdGUgdGhlIHBsdWdpbiBlY29zeXN0ZW0nLCBkZXNjcmlwdGlvbjogJ0RlY2lkZSBwdWJsaXNoIHJlcXVlc3RzLCBtb2RlcmF0ZSBzdWJtaXNzaW9ucyBhbmQgcmV2aWV3cywgeWFuayB2ZXJzaW9ucywgYW5kIHB1Ymxpc2ggYWR2aXNvcmllcyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3B1Ymxpc2hlcnM6dmVyaWZ5JywgbGFiZWw6ICdWZXJpZnkgcHVibGlzaGVycycsIGRlc2NyaXB0aW9uOiAnQXBwcm92ZSBWZXJpZmllZCBhcHBsaWNhdGlvbnMsIHB1Ymxpc2hlciB0aWVyIGFuZCBwcm9maWxlIGNoYW5nZXMsIGFuZCBvd25lcnNoaXAgdHJhbnNmZXJzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncGxhdGZvcm06cmVhZCcsIGxhYmVsOiAnVmlldyBwbGF0Zm9ybSBvcGVyYXRpb25zJywgZGVzY3JpcHRpb246ICdSZWFkIHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyBhbmQgdGhlIGNyb3NzLXRlbmFudCBvcmdhbml6YXRpb24gbGlzdCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29yZ3M6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGwgb3JnYW5pemF0aW9ucycsIGRlc2NyaXB0aW9uOiAnTGlzdCBhbmQgb3BlbiBldmVyeSBvcmdhbml6YXRpb24gb24gdGhlIGRlcGxveW1lbnQgXFx1MjAxNCB0aGUgcm9zdGVyIHRoZSBvcGVyYXRvciBzdXJmYWNlcyB3b3JrIGZyb20gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICd0b29sY2hhaW46b3BlcmF0ZScsIGxhYmVsOiAnT3BlcmF0ZSB0aGUgcGxhdGZvcm0gdG9vbGNoYWluJywgZGVzY3JpcHRpb246ICdSdW4gdGhlIFRvb2xjaGFpbiBjb25zb2xlOiBjYW5hcnkgbWVtYmVyc2hpcCwgcmVsZWFzZSBub3RlcywgZGVwcmVjYXRlIC8geWFuayAvIGRlbGV0ZSByZWxlYXNlcywgYW5kIHNldCB0aGUgcGxhdGZvcm0gZGVmYXVsdCBldmVyeSBvcmcgd2l0aG91dCBpdHMgb3duIGZvbGxvd3MgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdiaWxsaW5nOm9wZXJhdGUnLCBsYWJlbDogJ09wZXJhdGUgZGlzY291bnRzIGFuZCBwcm9tb3Rpb25zJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGFwcGx5IGFuZCByZXZva2UgZGlzY291bnQgdG9rZW5zIGFuZCBwcm9tb3Rpb24gY2FtcGFpZ25zIGFjcm9zcyB0ZW5hbnRzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nLCBsYWJlbDogJ09wZW4gdGhlIG9ic2VydmFiaWxpdHkgY29uc29sZXMnLCBkZXNjcmlwdGlvbjogJ09wZW4gR3JhZmFuYSBhbmQgS2lhbGkg4oCUIGRhc2hib2FyZHMsIHRyYWZmaWMgYW5kIG1lc2ggaGVhbHRoIGFjcm9zcyBldmVyeSB0ZW5hbnQgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdkYXRhYmFzZV9jb25zb2xlOm9wZW4nLCBsYWJlbDogJ09wZW4gdGhlIGRhdGFiYXNlIGNvbnNvbGVzJywgZGVzY3JpcHRpb246ICdPcGVuIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3Mg4oCUIGEgZGlyZWN0IHJlYWQvd3JpdGUgc2hlbGwgb3ZlciBldmVyeSB0ZW5hbnRcXHUyMDE5cyByb3dzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJywgbGFiZWw6ICdPcGVuIHRoZSBvYmplY3Qtc3RvcmUgY29uc29sZScsIGRlc2NyaXB0aW9uOiAnT3BlbiB0aGUgUnVzdEZTIChTMykgY29uc29sZSDigJQgbGlzdCBhbmQgZGVsZXRlIG9iamVjdHMgaW4gZXZlcnkgYnVja2V0LCBpbmNsdWRpbmcgdGhlIGF1ZGl0IGNoYWluIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb25jYWxsOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIG9uLWNhbGwgcGFnaW5nJywgZGVzY3JpcHRpb246ICdSZWFkIHRoZSBwYWdpbmcgcG9zdHVyZSBhbmQgc2VuZCBhIHRlc3QgcGFnZSAoc3lzdGVtIG9yZyBvbmx5OyB0aGUgcm90YSBsaXZlcyB3aXRoIHRoZSBwcm92aWRlciknLCBjYXRlZ29yeTogJ09uLWNhbGwnIH0sXG4gIHsgaWQ6ICdzdXBwb3J0X2Nhc2VzOndyaXRlJywgbGFiZWw6ICdXb3JrIHRoZSBzdXBwb3J0IGRlc2snLCBkZXNjcmlwdGlvbjogJ1RyaWFnZSB0aGUgc3VwcG9ydCBxdWV1ZSwgYXNzaWduIGFuZCByZS1wcmlvcml0aXNlIGNhc2VzLCB3cml0ZSBpbnRlcm5hbCBub3RlcywgYW5kIHJlY29yZCBpbmNpZGVudHMgYWdhaW5zdCBhIHN1cHBvcnQgY29udHJhY3QgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1N1cHBvcnQgZGVzaycgfSxcbiAgeyBpZDogJ3N1cHBvcnRfY29udGVudDp3cml0ZScsIGxhYmVsOiAnQXV0aG9yIGNhbm5lZCByZXBsaWVzJywgZGVzY3JpcHRpb246ICdXcml0ZSBhbmQgcmV0aXJlIHRoZSByZXVzYWJsZSBzdXBwb3J0IHJlcGxpZXMgb2ZmZXJlZCB0byBldmVyeSBjdXN0b21lciAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnU3VwcG9ydCBkZXNrJyB9LFxuICB7IGlkOiAnc3Vic2NyaXB0aW9uczpyZWFkJywgbGFiZWw6ICdWaWV3IGFsbCBzdWJzY3JpcHRpb25zJywgZGVzY3JpcHRpb246ICdWaWV3IGV2ZXJ5IG9yZ2FuaXphdGlvblxcdTIwMTlzIHN1YnNjcmlwdGlvbiwgcGxhbiBtaXggYW5kIGJpbGxpbmcgZXZlbnRzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLCBsYWJlbDogJ0NoYW5nZSBhbnkgc3Vic2NyaXB0aW9uJywgZGVzY3JpcHRpb246ICdDaGFuZ2UgYSBwbGFuLCBzZXQgYSBzdXBwb3J0IGZsb29yLCBhbmQgY2FuY2VsIGFuIG9yZ2FuaXphdGlvblxcdTIwMTlzIHN1YnNjcmlwdGlvbiAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29yZ3M6bWFuYWdlJywgbGFiZWw6ICdBZG1pbmlzdGVyIGFueSBvcmdhbml6YXRpb24nLCBkZXNjcmlwdGlvbjogJ1JlbmFtZSwgcmUtdGllciwgbW92ZSBhbmQgZGVsZXRlIGFueSBvcmdhbml6YXRpb24gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdxdW90YXM6bWFuYWdlJywgbGFiZWw6ICdDaGFuZ2UgYW55IHF1b3RhJywgZGVzY3JpcHRpb246ICdSYWlzZSwgcmVzZXQgYW5kIGNsZWFyIGFub3RoZXIgb3JnYW5pemF0aW9uXFx1MjAxOXMgcXVvdGFzIChzeXN0ZW0gb3JnIG9ubHk7IHZpZXdpbmcgdGhlbSByaWRlcyBwbGF0Zm9ybTpyZWFkKScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ3BsdWdpbl9xdWV1ZTptYW5hZ2UnLCBsYWJlbDogJ1J1biB0aGUgcGx1Z2luIGJ1aWxkIHF1ZXVlJywgZGVzY3JpcHRpb246ICdSZWFkIGJ1aWxkLXF1ZXVlIGRlcHRoIGFuZCBwdXJnZSB0aGUgZGVhZC1sZXR0ZXIgcXVldWUgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdjb21wbGlhbmNlOnJlYWQnLCBsYWJlbDogJ1ZpZXcgY29tcGxpYW5jZScsIGRlc2NyaXB0aW9uOiAnVmlldyBjb21wbGlhbmNlIHJ1bGVzLCBwb2xpY2llcywgYW5kIHNjYW5zJywgY2F0ZWdvcnk6ICdDb21wbGlhbmNlJyB9LFxuICB7IGlkOiAnY29tcGxpYW5jZTp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGNvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBydWxlcywgcG9saWNpZXMsIGFuZCBleGVtcHRpb25zJywgY2F0ZWdvcnk6ICdDb21wbGlhbmNlJyB9LFxuICB7IGlkOiAnbWVtYmVyczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBtZW1iZXJzJywgZGVzY3JpcHRpb246ICdBZGQsIHJlbW92ZSwgYW5kIGNoYW5nZSByb2xlcyBvZiBvcmcgbWVtYmVycycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ3JvbGVzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHJvbGVzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGVkaXQsIGFuZCBkZWxldGUgcm9sZXMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdpbnZpdGF0aW9uczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBpbnZpdGF0aW9ucycsIGRlc2NyaXB0aW9uOiAnU2VuZCwgcmVzZW5kLCBhbmQgcmV2b2tlIGludml0YXRpb25zJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBzZXJ2aWNlIGFjY291bnRzJywgZGVzY3JpcHRpb246ICdDcmVhdGUgb3JnIHNlcnZpY2UgYWNjb3VudHMsIGFzc2lnbiB0aGVpciByb2xlcywgYW5kIGlzc3VlIG9yIHJldm9rZSB0aGVpciBrZXlzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnZGFzaGJvYXJkczpyZWFkJywgbGFiZWw6ICdWaWV3IGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgY3VzdG9tIGRhc2hib2FyZHMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdkYXNoYm9hcmRzOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgZGFzaGJvYXJkcycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IGN1c3RvbSBkYXNoYm9hcmRzJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eTpyZWFkJywgbGFiZWw6ICdWaWV3IGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdWaWV3IGFsZXJ0IHJ1bGVzIGFuZCBkZXN0aW5hdGlvbnMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdvYnNlcnZhYmlsaXR5OndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgYWxlcnRpbmcnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBhbGVydCBydWxlcyBhbmQgZGVzdGluYXRpb25zJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnbG9nczpleHBvcnQnLCBsYWJlbDogJ0Rvd25sb2FkIGxvZ3MnLCBkZXNjcmlwdGlvbjogXCJEb3dubG9hZCB5b3VyIG9yZ2FuaXphdGlvbidzIGxvZyBlbnRyaWVzIGFzIGEgZmlsZSAodmlld2luZyBsb2dzIG9ubHkgbmVlZHMgJ1ZpZXcgYWxlcnRpbmcnKVwiLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdhdWRpdDpyZWFkJywgbGFiZWw6ICdWaWV3IHRoZSBhdWRpdCBsb2cnLCBkZXNjcmlwdGlvbjogXCJSZWFkIHRoZSBvcmdhbml6YXRpb24ncyBvd24gdGFtcGVyLWV2aWRlbnQgYXVkaXQgdHJhaWxcIiwgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAncmVwb3J0czpyZWFkJywgbGFiZWw6ICdWaWV3IHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgYW5hbHl0aWNzIGFuZCByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cm9sbHVwJywgbGFiZWw6ICdSb2xsIHVwIHRlYW0gcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSBkZXNjZW5kYW50IHRlYW1zIHdoZW4gdmlld2luZyByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6d3JpdGUnLCBsYWJlbDogJ0F1dGhvciBzdGFrZWhvbGRlciByZXBvcnRzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIHNjaGVkdWxlIGFuZCBkcmFmdCBzY2hlZHVsZWQgcmVwb3J0cyBmb3IgbWFuYWdlcnMnLCBjYXRlZ29yeTogJ0luc2lnaHRzJyB9LFxuICB7IGlkOiAncmVwb3J0czpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHJlcG9ydHMgZXh0ZXJuYWxseScsIGRlc2NyaXB0aW9uOiAnUHVibGlzaCBhIHJlcG9ydCBhbmQgbWludCBleHBpcmluZyBzaGFyZSBsaW5rcyBmb3IgcGVvcGxlIG91dHNpZGUgdGhlIHBsYXRmb3JtJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ21lc3NhZ2VzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgeyBpZDogJ21lc3NhZ2VzOndyaXRlJywgbGFiZWw6ICdTZW5kIG1lc3NhZ2VzJywgZGVzY3JpcHRpb246ICdTZW5kIG1lc3NhZ2VzIGFuZCBhbm5vdW5jZW1lbnRzJywgY2F0ZWdvcnk6ICdNZXNzYWdpbmcnIH0sXG4gIHsgaWQ6ICdiaWxsaW5nOnJlYWQnLCBsYWJlbDogJ1ZpZXcgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBzdWJzY3JpcHRpb25zIGFuZCB1c2FnZScsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ2JpbGxpbmc6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnTWFuYWdlIHN1YnNjcmlwdGlvbnMsIGFkZC1vbnMsIGFuZCB0aGUgYmlsbGluZyBwb3J0YWwnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdxdW90YXM6cmVhZCcsIGxhYmVsOiAnVmlldyBxdW90YXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgb3JnYW5pemF0aW9uIHF1b3RhcyBhbmQgdXNhZ2UnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdyZWdpc3RyeTpyZWFkJywgbGFiZWw6ICdWaWV3IHJlZ2lzdHJ5JywgZGVzY3JpcHRpb246ICdWaWV3IHRoZSBjb250YWluZXIgaW1hZ2UgcmVnaXN0cnknLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAncmVnaXN0cnk6d3JpdGUnLCBsYWJlbDogJ0NvcHkgY29udGFpbmVyIGltYWdlcycsIGRlc2NyaXB0aW9uOiAnQ29weSBhbmQgcHJvbW90ZSBhIGNvbnRhaW5lciBpbWFnZSBpbnRvIGFub3RoZXIgcmVwb3NpdG9yeScsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gIHsgaWQ6ICdyZWdpc3RyeTpwdXJnZScsIGxhYmVsOiAnRGVsZXRlIGNvbnRhaW5lciBpbWFnZXMnLCBkZXNjcmlwdGlvbjogJ0RlbGV0ZSBpbWFnZXMgYW5kIHJlcG9zaXRvcmllcywgYW5kIHJ1biByZWdpc3RyeSBnYXJiYWdlIGNvbGxlY3Rpb24nLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAnaW1wZXJzb25hdGlvbjpvcGVuJywgbGFiZWw6ICdPcGVuIGFuIGltcGVyc29uYXRpb24gc2Vzc2lvbicsIGRlc2NyaXB0aW9uOiBcIlZpZXcgYSBjdXN0b21lcidzIGFjY291bnQgYXMgb25lIG9mIGl0cyB1c2Vycywgd2l0aCB0aGF0IG9yZ2FuaXphdGlvbidzIGNvbnNlbnRcIiwgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICB7IGlkOiAnaW1wZXJzb25hdGlvbjphcHByb3ZlJywgbGFiZWw6ICdBbnN3ZXIgaW1wZXJzb25hdGlvbiByZXF1ZXN0cycsIGRlc2NyaXB0aW9uOiAnQXBwcm92ZSBvciBkZW55IGEgcmVxdWVzdCB0byB2aWV3IGEgbWVtYmVyIG9mIHRoaXMgb3JnYW5pemF0aW9uIGFzIHRoYXQgbWVtYmVyJywgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICB7IGlkOiAndGVhbV9hY2Nlc3M6b3BlbicsIGxhYmVsOiBcIlZpZXcgYSB0ZWFtIG1lbWJlcidzIGFjY291bnRcIiwgZGVzY3JpcHRpb246IFwiVmlldyBhIG1lbWJlciBvZiBvbmUgb2YgdGhpcyBvcmdhbml6YXRpb24ncyB0ZWFtcyBhcyB0aGF0IG1lbWJlciAocmVhZC1vbmx5KVwiLCBjYXRlZ29yeTogJ0ltcGVyc29uYXRpb24nIH0sXG4gIHsgaWQ6ICdvcmdfc2V0dGluZ3M6d3JpdGUnLCBsYWJlbDogJ09yZ2FuaXphdGlvbiBzZXR0aW5ncycsIGRlc2NyaXB0aW9uOiAnTWFuYWdlIGdlbmVyYWwgb3JnIHNldHRpbmdzIGFuZCBBSSBjb25maWcnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZ19pZHA6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBTU08vSWRQJywgZGVzY3JpcHRpb246ICdDb25maWd1cmUgc2luZ2xlIHNpZ24tb24gYW5kIGlkZW50aXR5IHByb3ZpZGVycycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICB7IGlkOiAnb3JnX2ttczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGVuY3J5cHRpb24ga2V5cycsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIGN1c3RvbWVyLW1hbmFnZWQgS01TIGVuY3J5cHRpb24ga2V5cycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICB7IGlkOiAnb3JnX2ltcGVyc29uYXRpb246d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBpbXBlcnNvbmF0aW9uIHBvbGljeScsIGRlc2NyaXB0aW9uOiAnQ29udHJvbCB3aGV0aGVyIHBsYXRmb3JtIG9wZXJhdG9ycyBtYXkgdmlldyB0aGUgb3JnYW5pemF0aW9uIGFzIG9uZSBvZiBpdHMgbWVtYmVycycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuXTtcblxuY29uc3QgUEVSTUlTU0lPTl9MQUJFTFMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihQRVJNSVNTSU9OX0NBVEFMT0cubWFwKChwKSA9PiBbcC5pZCwgcC5sYWJlbF0pKTtcblxuLyoqIEh1bWFuIGxhYmVsIGZvciBhIHBlcm1pc3Npb24gaWQgKGZhbGxzIGJhY2sgdG8gdGhlIHJhdyBpZCBmb3IgYW4gdW5rbm93biBvbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcm1pc3Npb25MYWJlbChpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBFUk1JU1NJT05fTEFCRUxTLmdldChpZCkgPz8gaWQ7XG59XG5cbi8qKiBPbmUgcGlja2VyIHNlY3Rpb246IGEgY2F0ZWdvcnkgYW5kIHRoZSBwZXJtaXNzaW9ucyBpdCBjb250YWlucywgaW4gY2F0YWxvZyBvcmRlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvbkNhdGVnb3J5IHtcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25NZXRhW107XG59XG5cbi8qKiBHcm91cCBhIHBlcm1pc3Npb24gbGlzdCBpbnRvIGNhdGVnb3JpZXMsIHByZXNlcnZpbmcgY2F0YWxvZyBvcmRlci4gKi9cbmZ1bmN0aW9uIGdyb3VwQnlDYXRlZ29yeShwZXJtczogcmVhZG9ubHkgUGVybWlzc2lvbk1ldGFbXSk6IFBlcm1pc3Npb25DYXRlZ29yeVtdIHtcbiAgY29uc3Qgb3JkZXI6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGJ5Q2F0ZWdvcnkgPSBuZXcgTWFwPHN0cmluZywgUGVybWlzc2lvbk1ldGFbXT4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHBlcm1zKSB7XG4gICAgaWYgKCFieUNhdGVnb3J5LmhhcyhwLmNhdGVnb3J5KSkgeyBieUNhdGVnb3J5LnNldChwLmNhdGVnb3J5LCBbXSk7IG9yZGVyLnB1c2gocC5jYXRlZ29yeSk7IH1cbiAgICBieUNhdGVnb3J5LmdldChwLmNhdGVnb3J5KSEucHVzaChwKTtcbiAgfVxuICByZXR1cm4gb3JkZXIubWFwKChjYXRlZ29yeSkgPT4gKHsgY2F0ZWdvcnksIHBlcm1pc3Npb25zOiBieUNhdGVnb3J5LmdldChjYXRlZ29yeSkhIH0pKTtcbn1cblxuLyoqIENoZWNrIHdoZXRoZXIgYSBzdHJpbmcgaXMgYSB2YWxpZCBQZXJtaXNzaW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQZXJtaXNzaW9uKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBQZXJtaXNzaW9uIHtcbiAgcmV0dXJuIChBTExfUEVSTUlTU0lPTlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBQZXJtaXNzaW9ucyB0aGF0IG11c3QgTkVWRVIgYmUgZ3JhbnRhYmxlIHRocm91Z2ggYSB1c2VyLWF1dGhvcmVkIENVU1RPTSBSb2xlIOKAlFxuICogdGhleSBnYXRlIHBsYXRmb3JtLW9wZXJhdG9yIHN1cmZhY2VzICh0aGUgc2hhcmVkIGltYWdlIHJlZ2lzdHJ5KSwgc28gYWxsb3dpbmdcbiAqIGFuIG9yZyBhZG1pbiB0byBtaW50IGEgUm9sZSBjYXJyeWluZyB0aGVtIHdvdWxkIGJlIGEgbGF0ZW50IHByaXZpbGVnZVxuICogZXNjYWxhdGlvbi4gVGhleSBhcmUgTk9UIHNlZWRlZCBpbnRvIEFOWSBidWlsdC1pbiBSb2xlIGJ1bmRsZSAobmVpdGhlclxuICogYG1lbWJlcmAgbm9yIGBhZG1pbmApLCBzbyB0aGUgb25seSBob2xkZXIgaXMgYSBzdXBlcmFkbWluIChpbXBsaWNpdC1hbGwpIOKAlFxuICogd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgaW1hZ2UtcmVnaXN0cnkgZ2F0ZXMgdGhhdCByZXF1aXJlIHRoZW0gZWZmZWN0aXZlbHlcbiAqIHN1cGVyYWRtaW4tb25seS4gVGhpcyBsaXN0IEFMU08gYmxvY2tzIGN1c3RvbS1Sb2xlIGF1dGhvcmluZyBmcm9tIHJlcXVlc3RpbmdcbiAqIHRoZW0gKHNlZSBwbGF0Zm9ybSBgc2FuaXRpemVQZXJtaXNzaW9uc2ApLlxuICovXG5leHBvcnQgY29uc3QgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gIC8vIGByZWdpc3RyeTpyZWFkYCBhbmQgYHJlZ2lzdHJ5OndyaXRlYCB3ZXJlIGJvdGggaGVyZS4gV2hhdCBzdGF5cyBpcyB0aGVcbiAgLy8gZGVzdHJ1Y3RpdmUgcnVuZyBhbG9uZTogZGVsZXRpbmcgYSBtYW5pZmVzdCBvciBhIHdob2xlIHJlcG9zaXRvcnksIGFuZCB0aGVcbiAgLy8gR0MgcHJ1bmUsIGVhY2ggb2Ygd2hpY2ggY2FuIHJlbW92ZSBhbiBpbWFnZSBhIHRlbmFudCdzIHBpcGVsaW5lIHN0aWxsXG4gIC8vIHJlc29sdmVzIOKAlCBpbmNsdWRpbmcgdGhlIGRpZ2VzdC1waW5uZWQgcGx1Z2luIGltYWdlcyB0aGUgc3VwcGx5IGNoYWluXG4gIC8vIHZlcmlmaWVzIGFnYWluc3QuIFRoYXQgaXMgdGhlIG9uZSByZWdpc3RyeSBhY3Rpb24gd2l0aCBubyB1bmRvLCBzbyBpdCBrZWVwc1xuICAvLyB0aGUgbmFycm93ZXN0IHBvc3NpYmxlIGF1ZGllbmNlOiB0aGUgZmxhZywgYW5kIG5ldmVyIGEgUm9sZS5cbiAgJ3JlZ2lzdHJ5OnB1cmdlJyxcbl07XG5cbi8qKlxuICogUGVybWlzc2lvbnMgdGhhdCBnb3Zlcm4gdGhlIFBMVUdJTiBFQ09TWVNURU0gYW5kIG1heSBiZSBoZWxkIG9ubHkgaW5zaWRlIHRoZVxuICogc3lzdGVtIG9yZyAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIExpa2VcbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IHRoZXkgYXJlIGluIG5vIG1lbWJlci9hZG1pbi9vd25lciBidW5kbGUsXG4gKiBhbmQgbm8gUm9sZSBhdXRob3JlZCBpbiBhIFRFTkFOVCBtYXkgY2Fycnkgb25lOiBwbGF0Zm9ybSdzXG4gKiBgc2FuaXRpemVQZXJtaXNzaW9uc2AgYWRtaXRzIHRoZW0gb25seSB3aGVuIHRoZSBhdXRob3IgaXMgYSBzdXBlcmFkbWluIEFORFxuICogdGhlIFJvbGUgaXMgYmVpbmcgd3JpdHRlbiBpbiB0aGUgc3lzdGVtIG9yZyBpdHNlbGYgKGBtYXlDb21wb3NlU3lzdGVtT3JnUm9sZWApLlxuICpcbiAqIFNvIHRoZXJlIGFyZSB0aHJlZSBncmFudCBwYXRocywgbm90IG9uZTogYSBzdXBlcmFkbWluIChpbXBsaWNpdC1hbGwpLCBvbmUgb2ZcbiAqIHRoZSBzZWVkZWQgc3lzdGVtLW9yZyBSb2xlcywgYW5kIGEgQ1VTVE9NIHN5c3RlbS1vcmcgUm9sZSBhIHN1cGVyYWRtaW5cbiAqIGNvbXBvc2VkLiBUaGUgdGhpcmQgaXMgd2hhdCBtYWtlcyB0aGUgc3BsaXQgYmV0d2VlbiBgcGx1Z2luczptb2RlcmF0ZWAgYW5kXG4gKiBgcHVibGlzaGVyczp2ZXJpZnlgIHVzYWJsZSB3aXRob3V0IHdhaXRpbmcgZm9yIGEgbmV3IHNlZWQgYnVuZGxlIOKAlCB3b3J0aFxuICoga25vd2luZyBiZWZvcmUgcmVhZGluZyBlaXRoZXIgcGVybWlzc2lvbiBhcyBcInVucmVhY2hhYmxlIGV4Y2VwdCB2aWFcbiAqIHtAbGluayBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OU31cIi5cbiAqXG4gKiBgb25jYWxsOm1hbmFnZWAgaXMgY2FycmllZCBieSAqKlBsYXRmb3JtIE9wZXJhdG9yKiogYW5kIGJ5IG5vIG90aGVyIG5hbWVkXG4gKiByb2xlLiBUaGF0IHNwbGl0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gYW4gb3ZlcnNpZ2h0OiBwYWdpbmcgaXMgdGhlXG4gKiB2ZW5kb3IncyBvd24gb3BlcmF0aW9uYWwgY29uY2VybiBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBlY29zeXN0ZW1cbiAqIG1vZGVyYXRpb24sIHNvIHdpZGVuaW5nIHRoZSBFY29zeXN0ZW0gTWFuYWdlciByb2xlIHRvIGNhcnJ5IGl0IHdvdWxkIGhhbmQgdGhlXG4gKiBwYWdlciB0byBwZW9wbGUgaGlyZWQgdG8gcmV2aWV3IHBsdWdpbnMuIEl0IGlzIG5vdCBhIHBsYWNlaG9sZGVyIOKAlCBpdCBnYXRlc1xuICogdHdvIGxpdmUgcm91dGVzICh0aGUgcGFnaW5nIHBvc3R1cmUgcmVhZCBhbmQgdGhlIHRlc3QgcGFnZSksIHVubGlrZVxuICogYHJlZ2lzdHJ5OipgLlxuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbHVnaW5zOm1vZGVyYXRlJyxcbiAgJ3B1Ymxpc2hlcnM6dmVyaWZ5JyxcbiAgLy8gVGhlIGNyb3NzLXRlbmFudCBvcGVyYXRvciBzdXJmYWNlcywgc3lzdGVtLW9yZy1vbmx5IGZvciB0aGUgc2FtZSByZWFzb24gdGhlXG4gIC8vIGNvbnNvbGVzIGFyZTogdGhleSByZWFkIGFuZCBtb3ZlIHRoaW5ncyBiZWxvbmdpbmcgdG8gb3JnYW5pc2F0aW9ucyB0aGVcbiAgLy8gaG9sZGVyIGlzIG5vdCBhIG1lbWJlciBvZiwgc28gdGhleSBtdXN0IG5ldmVyIGJlIGdyYW50YWJsZSBpbnNpZGUgYSB0ZW5hbnQuXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gIC8vIFJlYWRpbmcgdGhlIGltYWdlIHJlZ2lzdHJ5OiByZXBvc2l0b3J5IG5hbWVzLCB0YWdzLCBtYW5pZmVzdHMsIGJsb2JzIGFuZCB0aGVcbiAgLy8gc3RvcmFnZSByb2xsdXAuIFByb21vdGVkIG91dCBvZiBTVVBFUkFETUlOX09OTFkgYmVjYXVzZSB0aGUgcmVnaXN0cnkgYnJvd3NlclxuICAvLyB3YXMgaW52aXNpYmxlIHRvIGV2ZXJ5IFJvbGUsIHNvIGEgUGxhdGZvcm0gT3BlcmF0b3IgZGVidWdnaW5nIGEgZmFpbGVkXG4gIC8vIHBsdWdpbiBidWlsZCBjb3VsZCBzZWUgdGhlIGJ1aWxkIHF1ZXVlIGFuZCBpdHMgZGVhZCBsZXR0ZXJzIGJ1dCBub3QgdGhlXG4gIC8vIGltYWdlcyB0aGUgYnVpbGQgcHJvZHVjZWQg4oCUIGFuZCB0aGUgb25seSB3YXkgdG8gbG9vayB3YXMgdGhlIHN1cGVyYWRtaW5cbiAgLy8gZmxhZy4gSXQgc3RheXMgc3lzdGVtLW9yZy1vbmx5IChubyB0ZW5hbnQgUm9sZSBtYXkgY2FycnkgaXQpIGFuZCBpcyBwYWlyZWRcbiAgLy8gd2l0aCBhIHBlci1yZXBvIG9yZy1vd25lcnNoaXAgZmlsdGVyIHRoYXQgcnVucyBBRlRFUiBpdCwgc28gd2lkZW5pbmcgdGhlXG4gIC8vIHBlcm1pc3Npb24gZG9lcyBub3Qgd2lkZW4gd2hpY2ggcmVwb3NpdG9yaWVzIGEgaG9sZGVyIGNhbiByZWFjaDogYVxuICAvLyBzeXN0ZW0tb3JnIG1lbWJlciB3aG8gaXMgbm90IGEgc3VwZXJhZG1pbiBzZWVzIGBzeXN0ZW0vKmAsIGBsaWJyYXJ5LypgIGFuZFxuICAvLyBgcHVibGljLypgIOKAlCB0aGlzIGRlcGxveW1lbnQncyBvd24gYmFzZSBhbmQgcGx1Z2luIGltYWdlcyDigJQgYW5kIG5vIHRlbmFudCdzXG4gIC8vIGBvcmctKmAgcmVwb3NpdG9yaWVzIGF0IGFsbCAoYGNhblJlYWRSZXBvYCBpbiB0aGUgaW1hZ2UtcmVnaXN0cnkgc2VydmljZSkuXG4gICdyZWdpc3RyeTpyZWFkJyxcbiAgLy8gQ29weWluZy9wcm9tb3RpbmcgYW4gaW1hZ2UuIFN5c3RlbS1vcmctb25seSByYXRoZXIgdGhhbiBzdXBlcmFkbWluLW9ubHlcbiAgLy8gYmVjYXVzZSBpdCBpcyBBRERJVElWRTogaXQgd3JpdGVzIGEgbmV3IHRhZyBhbmQgbWFrZXMgbm90aGluZyBzdG9wXG4gIC8vIHJlc29sdmluZywgYW5kIGBjYW5Xcml0ZVJlcG9gIGNvbmZpbmVzIGEgbm9uLXN1cGVyYWRtaW4gc3lzdGVtLW9yZyBjYWxsZXJcbiAgLy8gdG8gYHN5c3RlbS8qYCByZWdhcmRsZXNzLiBEZWxpYmVyYXRlbHkgY2FycmllZCBieSBOTyBidWlsdC1pbiBidW5kbGUgdG9kYXlcbiAgLy8g4oCUIHByb21vdGluZyBhbiBpbWFnZSBpcyBhIGpvYiwgbm90IGEgc2lkZSBlZmZlY3Qgb2YgcnVubmluZyB0aGUgZGVwbG95bWVudCxcbiAgLy8gc28gaXQgd2FpdHMgZm9yIGEgUm9sZSBvZiBpdHMgb3duIHJhdGhlciB0aGFuIHJpZGluZyBhbG9uZyB3aXRoXG4gIC8vIGBwbGF0Zm9ybTpyZWFkYC5cbiAgJ3JlZ2lzdHJ5OndyaXRlJyxcbiAgJ2JpbGxpbmc6b3BlcmF0ZScsXG4gICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsXG4gICdkYXRhYmFzZV9jb25zb2xlOm9wZW4nLFxuICAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJyxcbiAgLy8gT3BlbmluZyBhIGNyb3NzLXRlbmFudCBpbXBlcnNvbmF0aW9uIHNlc3Npb24uIFN5c3RlbS1vcmctb25seSBmb3IgdGhlXG4gIC8vIG9idmlvdXMgcmVhc29uIOKAlCBpdCB2aWV3cyBhbiBvcmdhbmlzYXRpb24gdGhlIGhvbGRlciBpcyBub3QgYSBtZW1iZXIgb2Yg4oCUXG4gIC8vIGFuZCBpdCBpcyB0aGUgT05FIHBlcm1pc3Npb24gaW4gdGhpcyBsaXN0IHRoYXQgYWxzbyBoYXMgdG8gY2xlYXIgYSBnYXRlIHRoZVxuICAvLyBwZXJtaXNzaW9uIHN5c3RlbSBkb2VzIG5vdCBvd246IHRoZSB0YXJnZXQgb3JnYW5pc2F0aW9uJ3MgY29uc2VudCAoaXRzXG4gIC8vIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAgcG9saWN5KSwgcGx1cyBhYWwyIGFuZCBhIHN0cm9uZyBzdGVwLXVwLiBUaGVcbiAgLy8gcGVybWlzc2lvbiBzYXlzIHdobyBtYXkgQVNLOyB0aGUgdGVuYW50IHN0aWxsIGFuc3dlcnMuXG4gIC8vXG4gIC8vIEl0IGRvZXMgTk9UIGNvdmVyIGVtZXJnZW5jeSBhY2Nlc3MuIGBQT1NUIC86dXNlcklkL2JyZWFrZ2xhc3NgIGJ5cGFzc2VzXG4gIC8vIHRlbmFudCBjb25zZW50IGFuZCBzbyBzdGF5cyBvbiB0aGUgc3VwZXJhZG1pbiBmbGFnIGFsb25lLCBhcHByb3ZlZCBieSBhXG4gIC8vIFNFQ09ORCBzdXBlcmFkbWluIChmb3VyLWV5ZXMpLiBBIHBlcm1pc3Npb24gdGhhdCBjb3VsZCBiZSBkZWxlZ2F0ZWQgbXVzdCBub3RcbiAgLy8gYmUgYWJsZSB0byB3YWxrIHBhc3QgY29uc2VudC5cbiAgJ2ltcGVyc29uYXRpb246b3BlbicsXG4gIC8vIFBhZ2luZyBpcyB0aGUgdmVuZG9yJ3Mgb3duIG9wZXJhdGlvbmFsIGNvbmNlcm4gYW5kIGdyYW50cyBOTyB0ZW5hbnQgYWNjZXNzXG4gIC8vIOKAlCBgaXNTeXN0ZW1PcmdJZGAgaXMgYSBjb250ZW50LW93bmVyIGNoZWNrLCBub3QgYSBwcml2aWxlZ2UgZ2F0ZSDigJQgc28gYVxuICAvLyB0ZW5hbnQgcm9sZSBtdXN0IG5ldmVyIGJlIGFibGUgdG8gY2FycnkgaXQsIGFuZCBhIHRlbmFudCBtdXN0IG5ldmVyIGJlIGFibGVcbiAgLy8gdG8gbWFrZSB0aGlzIGRlcGxveW1lbnQgc2VuZCBhIHBhZ2UuXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgLy8gVGhlIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCB0YXNrcy4gRWFjaCBvbmUgcmVwbGFjZWQgYSBgcmVxdWlyZVN5c3RlbUFkbWluYFxuICAvLyBnYXRlLCBzbyB0aGUgcG9pbnQgb2YgbGlzdGluZyB0aGVtIGhlcmUgaXMgdGhlIHNhbWUgYXMgdGhlIHBvaW50IG9mIGFkZGluZ1xuICAvLyB0aGVtIGF0IGFsbDogYSBSb2xlIGNvbXBvc2VkIGluIHRoZSBzeXN0ZW0gb3JnIGNhbiBjYXJyeSBleGFjdGx5IG9uZSBqb2IsXG4gIC8vIGFuZCBubyBSb2xlIGluIGFueSB0ZW5hbnQgY2FuIGNhcnJ5IGl0IGF0IGFsbC5cbiAgJ3N1cHBvcnRfY2FzZXM6d3JpdGUnLFxuICAnc3VwcG9ydF9jb250ZW50OndyaXRlJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOm1hbmFnZScsXG4gICdvcmdzOm1hbmFnZScsXG4gICdxdW90YXM6bWFuYWdlJyxcbiAgJ3BsdWdpbl9xdWV1ZTptYW5hZ2UnLFxuICAvLyBUaGUgVG9vbGNoYWluIGNvbnNvbGUgKHBsYW4gRDkpOiBUSEUgcGxhdGZvcm0gZGVmYXVsdCBhbmQgY2FuYXJ5IG1vdmUgdGhlXG4gIC8vIGJ1aWxkIHRvb2xjaGFpbiBvZiBldmVyeSBvcmcgdGhhdCBmb2xsb3dzIGl0LCBzbyBubyB0ZW5hbnQgbWF5IGhvbGQgaXQuXG4gICd0b29sY2hhaW46b3BlcmF0ZScsXG5dO1xuXG4vKiogV2hldGhlciBgcGVybWlzc2lvbmAgbWF5IGJlIGhlbGQgb25seSBpbnNpZGUgdGhlIHN5c3RlbSBvcmcuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTeXN0ZW1PcmdPbmx5UGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb25zIGFuIG9yZyBtYXkgYXNzaWduIHZpYSBhIENVU1RPTSBSb2xlIOKAlCBldmVyeSBwZXJtaXNzaW9uIGV4Y2VwdCB0aGVcbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IGFuZCB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfS5cbiAqIEN1c3RvbS1Sb2xlIGNyZWF0ZS91cGRhdGUgdmFsaWRhdGVzIHRoZSByZXF1ZXN0ZWQgcGVybWlzc2lvbiBzZXQgYWdhaW5zdCB0aGlzXG4gKiAoc2VlIHBsYXRmb3JtIHJvbGVzLXNlcnZpY2UpLlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IGlzT3JnQXNzaWduYWJsZVBlcm1pc3Npb24ocCkpO1xuXG4vKiogV2hldGhlciBgcGVybWlzc2lvbmAgbWF5IGJlIGdyYW50ZWQgdGhyb3VnaCBhIHVzZXItYXV0aG9yZWQgY3VzdG9tIFJvbGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiAhU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TLmluY2x1ZGVzKHBlcm1pc3Npb24pICYmICFpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb24pO1xufVxuXG4vKipcbiAqIENhdGVnb3J5IOKGkiBwZXJtaXNzaW9ucyBmb3IgdGhlIGN1c3RvbS1Sb2xlIEFVVEhPUklORyBwaWNrZXI6IHRoZSBjYXRhbG9nIG1pbnVzXG4gKiB0aGUgbm9uLWFzc2lnbmFibGUgcGVybWlzc2lvbnMsIHdpdGggYW55IG5vdy1lbXB0eSBjYXRlZ29yeSBkcm9wcGVkXG4gKiAoc28gXCJSZWdpc3RyeVwiIGRpc2FwcGVhcnMpLiBUaGUgZ3JvdXBlZCB2aWV3IG9mXG4gKiB7QGxpbmsgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlN9LlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FTU0lHTkFCTEVfQ0FURUdPUklFUzogcmVhZG9ubHkgUGVybWlzc2lvbkNhdGVnb3J5W10gPVxuICBncm91cEJ5Q2F0ZWdvcnkoUEVSTUlTU0lPTl9DQVRBTE9HLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwLmlkKSkpO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbi1zY29wZWQgY3JlZGVudGlhbHMgKHBlcnNvbmFsIGFjY2VzcyBrZXlzIC8gbWFjaGluZSB0b2tlbnMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEV2ZXJ5IGA6cmVhZGAgcGVybWlzc2lvbiDigJQgdGhlIFwicmVhZC1vbmx5XCIgcHJlc2V0IGEgbmV3IHBlcnNvbmFsIGFjY2VzcyBrZXlcbiAqIHN0YXJ0cyBmcm9tLiBEZXJpdmVkIGZyb20gdGhlIGNhdGFsb2cgc28gYSBuZXcgcmVzb3VyY2UncyByZWFkIHBlcm1pc3Npb25cbiAqIGpvaW5zIHRoZSBwcmVzZXQgd2l0aG91dCBhIHNlY29uZCBlZGl0LlxuICovXG5leHBvcnQgY29uc3QgUkVBRF9PTkxZX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPVxuICBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiBwLmVuZHNXaXRoKCc6cmVhZCcpKTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSByZXF1ZXN0ZWQgcGVybWlzc2lvbiBzdWJzZXQ6IGV2ZXJ5IGVudHJ5IG11c3QgYmUgYSBjYXRhbG9nIGlkXG4gKiAoYW55dGhpbmcgZWxzZSDihpIgYG51bGxgLCB0aGUgY2FsbGVyJ3MgNDAwKSwgZHVwbGljYXRlcyBjb2xsYXBzZSwgYW5kIHRoZVxuICogcmVzdWx0IGlzIGluIGNhbm9uaWNhbCBjYXRhbG9nIG9yZGVyIHNvIGEgc3RvcmVkIHN1YnNldCBjb21wYXJlcyBzdGFibHkuXG4gKiBBbiBFTVBUWSBhcnJheSBpcyB2YWxpZCDigJQgYSBrZXkgdGhhdCBjYW4gYXV0aGVudGljYXRlIGJ1dCBkbyBub3RoaW5nIOKAlCBhbmRcbiAqIGlzIGRpc3RpbmN0IGZyb20gXCJubyBzdWJzZXRcIiAoYHVuZGVmaW5lZGApLCB3aGljaCBtZWFucyBmdWxsIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBlcm1pc3Npb25TdWJzZXQocmVxdWVzdGVkOiByZWFkb25seSB1bmtub3duW10pOiBQZXJtaXNzaW9uW10gfCBudWxsIHtcbiAgY29uc3Qgd2FudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcCBvZiByZXF1ZXN0ZWQpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnIHx8ICFpc1ZhbGlkUGVybWlzc2lvbihwKSkgcmV0dXJuIG51bGw7XG4gICAgd2FudGVkLmFkZChwKTtcbiAgfVxuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gd2FudGVkLmhhcyhwKSk7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb25zIGEgcGVybWlzc2lvbi1zY29wZWQgY3JlZGVudGlhbCBhY3R1YWxseSBjYXJyaWVzOiB0aGVcbiAqIElOVEVSU0VDVElPTiBvZiB0aGUgc3Vic2V0IGl0IHdhcyBjcmVhdGVkIHdpdGggYW5kIHRoZSBob2xkZXIncyBDVVJSRU5UXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMsIGluIGNhdGFsb2cgb3JkZXIuIFJlLWV2YWx1YXRlZCBhdCBldmVyeSBpc3N1ZSwgc29cbiAqIGxvc2luZyBhIFJvbGUgc2hyaW5rcyB0aGUgY3JlZGVudGlhbCBhbmQgbm90aGluZyBjYW4gZXZlciBncm93IGl0IHBhc3QgdGhlXG4gKiBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdFBlcm1pc3Npb25zKFxuICBlZmZlY3RpdmU6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzdWJzZXQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUGVybWlzc2lvbltdIHtcbiAgY29uc3QgYWxsb3dlZCA9IG5ldyBTZXQoc3Vic2V0KTtcbiAgY29uc3QgaGVsZCA9IG5ldyBTZXQoZWZmZWN0aXZlKTtcbiAgcmV0dXJuIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IGFsbG93ZWQuaGFzKHApICYmIGhlbGQuaGFzKHApKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWx0LWluIFJvbGUgc2VlZCBidW5kbGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFBlcm1pc3Npb24gYnVuZGxlcyB1c2VkIHRvIFNFRUQgdGhlIGJ1aWx0LWluIFJvbGVzIChcIkFkbWluXCIsIFwiTWVtYmVyXCIpLlxuICpcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBkZWZpbml0aW9uIG9mIHdoYXQgdGhvc2UgYnVpbHQtaW4gUm9sZXMgZ3JhbnQg4oCUIGl0IGlzIHVzZWRcbiAqIHdoZW4gYSBSb2xlIHJlY29yZCBpcyBjcmVhdGVkIChhbmQgYnkgdGhlIHN0YXJ0dXAgYmFja2ZpbGwpIHRvIHBvcHVsYXRlIHRoYXRcbiAqIFJvbGUncyBvd24gYHBlcm1pc3Npb25zW11gLiBJdCBpcyBOT1QgYSBydW50aW1lIHBlcm1pc3Npb24gc291cmNlOiBhIHVzZXInc1xuICogZWZmZWN0aXZlIHBlcm1pc3Npb25zIGNvbWUgT05MWSBmcm9tIHRoZSBSb2xlcyBhc3NpZ25lZCB0byB0aGVtIChzZWVcbiAqIHtAbGluayByZXNvbHZlVXNlclBlcm1pc3Npb25zfSkuIFRoZSBjb2Fyc2UgYHJvbGVgIGxhYmVsIChvd25lci9hZG1pbi9tZW1iZXIpXG4gKiBzdXJ2aXZlcyBvbmx5IGZvciBgaXNBZG1pbmAvb3duZXJzaGlwL2Rpc3BsYXksIG5ldmVyIHRvIGdyYW50IHBlcm1pc3Npb25zLlxuICpcbiAqIC0gYG1lbWJlcmAgIOKAlCBkYXktdG8tZGF5IGJ1aWxkZXI6IHJlYWQgKyB3cml0ZSBvbiBwaXBlbGluZXMvdGVtcGxhdGVzL3BsdWdpbnMsXG4gKiAgIHJlYWQgZWxzZXdoZXJlLiBObyBtZW1iZXIvcm9sZS9iaWxsaW5nIG1hbmFnZW1lbnQsIG5vIGNvbXBsaWFuY2UvYWxlcnRcbiAqICAgYXV0aG9yaW5nLCBhbmQgbm8gYDpwdWJsaXNoYCBvbiBhbnkgY2F0YWxvZy5cbiAqIC0gYGFkbWluYCAgIOKAlCBmdWxsIG9yZyBhZG1pbmlzdHJhdGlvbjogZXZlcnkgT1JHLUFTU0lHTkFCTEUgcGVybWlzc2lvbiAoaS5lLlxuICogICBBTExfUEVSTUlTU0lPTlMgbWludXMgdGhlIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IGFuZCB0aGVcbiAqICAge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30sIHNvIGByZWdpc3RyeToqYCBzdGF5XG4gKiAgIHN1cGVyYWRtaW4taW1wbGljaXQtb25seSBhbmQgZWNvc3lzdGVtIG1vZGVyYXRpb24gc3RheXMgd2l0aCB0aGUgc3lzdGVtXG4gKiAgIG9yZydzIEVjb3N5c3RlbSBNYW5hZ2VycyDigJQgbmVpdGhlciBpcyBncmFudGVkIHRvIG9yZyBhZG1pbnMpLlxuICogLSBgb3duZXJgICAg4oCUIHNhbWUgYXMgYWRtaW4gKG93bmVyc2hpcCBpdHNlbGYg4oCUIHRyYW5zZmVyL2RlbGV0ZSDigJQgaXMgZ2F0ZWRcbiAqICAgc2VwYXJhdGVseSwgbm90IHZpYSBhIHBlcm1pc3Npb24pLlxuICovXG5jb25zdCBNRU1CRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczp3cml0ZScsICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsXG4gICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6d3JpdGUnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLFxuICAncGx1Z2luczppbnN0YWxsJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ3JlcG9ydHM6cmVhZCcsXG4gICdtZXNzYWdlczpyZWFkJywgJ21lc3NhZ2VzOndyaXRlJyxcbiAgJ2JpbGxpbmc6cmVhZCcsXG4gICdxdW90YXM6cmVhZCcsXG5dO1xuXG5jb25zdCBBRE1JTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gWy4uLk9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgZWFjaCBidWlsdC1pbiBSb2xlLCBrZXllZCBieSB0aGUgY29hcnNlIHJvbGUgaXQgZ3JhbnRzLlxuICogQ29uc3VtZWQgYnkgdGhlIFJvbGUgc2VlZGVyICsgdGhlIHN0YXJ0dXAgYmFja2ZpbGwgdG8gcG9wdWxhdGUgYSBidWlsdC1pblxuICogUm9sZSdzIGBwZXJtaXNzaW9uc1tdYC4gTk9UIGNvbnN1bHRlZCBhdCByZXF1ZXN0IHRpbWUg4oCUIHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9LlxuICovXG5leHBvcnQgY29uc3QgUk9MRV9QRVJNSVNTSU9OUzogUmVjb3JkPE9yZ1JvbGUsIHJlYWRvbmx5IFBlcm1pc3Npb25bXT4gPSB7XG4gIG1lbWJlcjogTUVNQkVSX1BFUk1JU1NJT05TLFxuICBhZG1pbjogQURNSU5fUEVSTUlTU0lPTlMsXG4gIG93bmVyOiBBRE1JTl9QRVJNSVNTSU9OUyxcbn07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIkVjb3N5c3RlbSBNYW5hZ2VyXCIgUm9sZSDigJQgc2VlZGVkIE9OTFkgaW4gdGhlXG4gKiBzeXN0ZW0gb3JnIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gSXQgY2FycmllcyB0aGVcbiAqIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9IHBsdXMgdGhlIHJlYWRzIGEgbW9kZXJhdG9yIG5lZWRzICh0aGVcbiAqIGluLWFwcCBjYXRhbG9nLCBpbi1hcHAgbm90aWNlcywgdGhlIG1vZGVyYXRpb24tU0xBIGRhc2hib2FyZCkgYW5kIG5vdGhpbmdcbiAqIHRlbmFudC1mYWNpbmc6IG5vIGByZWdpc3RyeToqYCwgbm8gYG1lbWJlcnM6bWFuYWdlYC4gVGhlIFJvbGUgZ3JhbnRzIHRoZVxuICogY29hcnNlIGBtZW1iZXJgIGxhYmVsIGFuZCBuZXZlciBzZXRzIGBpc1N1cGVyQWRtaW5gLlxuICovXG4vKipcbiAqIFRoZSBQTEFURk9STSBPUEVSQVRPUiBidW5kbGUg4oCUIHRoZSB0aGlyZCBydW5nIG9mIHRoZSBzeXN0ZW0gb3JnJ3MgbGFkZGVyLlxuICpcbiAqIEJlZm9yZSBpdCB0aGUgbGFkZGVyIGhhZCB0d28gcnVuZ3MgYW5kIGEgZ2FwOiBFY29zeXN0ZW0gTWFuYWdlciAocGx1Z2luXG4gKiBtb2RlcmF0aW9uKSBhbmQgU3VwZXIgQWRtaW4gKGltcGxpY2l0LWFsbCwgd2hpY2ggYWxzbyBjYXJyaWVzIGltcGVyc29uYXRpb24sXG4gKiBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzKS4gQW55dGhpbmcgaW4gYmV0d2VlbiDigJQgcmVhZCB0aGUgcGxhdGZvcm0gc2V0dGluZ3MsXG4gKiBydW4gYSBwcm9tb3Rpb24gY2FtcGFpZ24sIGNoZWNrIHdoZXRoZXIgdGhlIHBhZ2VyIGlzIGNvbmZpZ3VyZWQg4oCUIGhhZCB0byBiZVxuICogZG9uZSBieSBtYWtpbmcgc29tZWJvZHkgYSBmdWxsIHN1cGVyYWRtaW4uXG4gKlxuICogSXQgaXMgYSBCVU5ETEUgcmF0aGVyIHRoYW4gYSBncmFudGFibGUgbGlzdCBiZWNhdXNlIGBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlNgXG4gKiBjYW4gbmV2ZXIgYmUgY2FycmllZCBieSBhIGN1c3RvbSBSb2xlIGluIGFueSBvcmc6IHdpdGhvdXQgYSBzZWVkZWQgYnVuZGxlXG4gKiB0aGVzZSBwZXJtaXNzaW9ucyBoYWQgbm8gZ3JhbnQgcGF0aCBhdCBhbGwgYW5kIHdlcmUgc3VwZXJhZG1pbi1vbmx5IGluXG4gKiBwcmFjdGljZSwgd2hpY2ggaXMgZXhhY3RseSB0aGUgdGhpbmcgdGhleSB3ZXJlIGFkZGVkIHRvIGF2b2lkLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgY2FycnlpbmcgYHBsdWdpbnM6bW9kZXJhdGVgIC8gYHB1Ymxpc2hlcnM6dmVyaWZ5YDogZWNvc3lzdGVtXG4gKiBtb2RlcmF0aW9uIGlzIGEgZGlmZmVyZW50IGpvYiB3aXRoIGl0cyBvd24gUm9sZSwgYW5kIGEgcmV2aWV3ZXIgb2YgcGx1Z2luc1xuICogc2hvdWxkIG5vdCBhY3F1aXJlIHRoZSBhYmlsaXR5IHRvIG1vdmUgYW5vdGhlciB0ZW5hbnQncyBtb25leSBieSBiZWluZyBoYW5kZWRcbiAqIHRoZSBvcGVyYXRvciBSb2xlLlxuICovXG5leHBvcnQgY29uc3QgUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLy8gQk9USCBoYWx2ZXMgb2YgdGhlIG9sZCBgcGxhdGZvcm06cmVhZGA6IHRoaXMgaXMgdGhlIG9uZSBqb2IgdGhhdCBnZW51aW5lbHlcbiAgLy8gd2FudHMgdGhlIGRlcGxveSdzIG93biBjb25maWd1cmF0aW9uIEFORCB0aGUgY3VzdG9tZXIgcm9zdGVyLlxuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAnb25jYWxsOm1hbmFnZScsXG4gICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsXG4gIC8vIFJVTk5JTkcgdGhlIGRlcGxveW1lbnQ6IHJhaXNlIGEgcXVvdGEgZHVyaW5nIGFuIGluY2lkZW50LCB3YXRjaCB0aGUgYnVpbGRcbiAgLy8gcXVldWUgYW5kIHB1cmdlIGl0cyBkZWFkLWxldHRlciBxdWV1ZS5cbiAgJ3F1b3RhczptYW5hZ2UnLFxuICAncGx1Z2luX3F1ZXVlOm1hbmFnZScsXG4gIC8vIFRoZSBUb29sY2hhaW4gY29uc29sZSAocGxhbiBEOSk6IGNhbmFyeSwgcHJvbW90aW9uLCByb2xsYmFjayBhbmQgcmVsZWFzZVxuICAvLyBsaWZlY3ljbGUgb2YgdGhlIG1hbmFnZWQgYnVpbGQgdG9vbGNoYWluIOKAlCBydW5uaW5nIHRoZSBkZXBsb3ltZW50LlxuICAndG9vbGNoYWluOm9wZXJhdGUnLFxuICAvLyBSZWFkcyB0aGF0IG1ha2UgdGhlIG9wZXJhdG9yIHZpZXdzIHVzYWJsZTogdGhlIGRhc2hib2FyZHMgdGhlIHBvc3R1cmUgcGFuZWxzXG4gIC8vIGxpdmUgb24sIHRoZSBjcm9zcy10ZW5hbnQgbG9nIHZpZXcsIGFuZCB0aGUgY3VzdG9tZXIncyBwbGFuIHdoZW4gYSBsaW1pdCBpc1xuICAvLyB0aGUgdGhpbmcgYmVpbmcgZGVidWdnZWQuXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAnZGFzaGJvYXJkczpyZWFkJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gIC8vIFRoZSByZWdpc3RyeSBicm93c2VyOiByZXBvc2l0b3J5IG5hbWVzLCB0YWdzIGFuZCBtYW5pZmVzdHMgZm9yIHRoZSBpbWFnZXNcbiAgLy8gdGhpcyBkZXBsb3ltZW50J3MgYnVpbGRzIHByb2R1Y2UuIEl0IHdhcyB3aXRoaGVsZCB3aGlsZSBgcmVnaXN0cnk6cmVhZGAgd2FzXG4gIC8vIHN1cGVyYWRtaW4tb25seSDigJQgYSBzZWVkZWQgYnVuZGxlIGNhcnJ5aW5nIGEgc3VwZXJhZG1pbi1vbmx5IHBlcm1pc3Npb25cbiAgLy8gd291bGQgbWFrZSB0aGF0IGxpc3QgYSBsaWUsIHNpbmNlIGJ1bmRsZXMgYnlwYXNzIGBzYW5pdGl6ZVBlcm1pc3Npb25zYC4gVGhlXG4gIC8vIHBlcm1pc3Npb24gd2FzIHByb21vdGVkIHRvIHN5c3RlbS1vcmctb25seSBkZWxpYmVyYXRlbHkgcmF0aGVyIHRoYW4gc211Z2dsZWRcbiAgLy8gaW4gaGVyZSwgd2hpY2ggaXMgdGhlIG9yZGVyIHRob3NlIHR3byBjaGFuZ2VzIGhhdmUgdG8gaGFwcGVuIGluLlxuICAncmVnaXN0cnk6cmVhZCcsXG5dO1xuXG4vKipcbiAqIEFDQ09VTlQgTUFOQUdFUiDigJQgdGhlIGNvbW1lcmNpYWwgcmVsYXRpb25zaGlwIHdpdGggYSBjdXN0b21lciwgYXMgb3Bwb3NlZCB0b1xuICogcnVubmluZyB0aGUgZGVwbG95bWVudC5cbiAqXG4gKiBTcGxpdCBmcm9tIHtAbGluayBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OU30gcmF0aGVyIHRoYW4gcGlsZWQgb250byBpdCxcbiAqIGJlY2F1c2UgdGhlIHR3byBqb2JzIGRpdmVyZ2UgYXQgZXhhY3RseSB0aGUgcGVybWlzc2lvbnMgYWRkZWQgYWxvbmdzaWRlIHRoaXNcbiAqIGJ1bmRsZS4gYGJpbGxpbmc6b3BlcmF0ZWAgTU9WRUQgaGVyZSBmcm9tIHRoZSBvcGVyYXRvciBidW5kbGUgZm9yIHRoYXQgcmVhc29uOlxuICogbWludGluZyBhIGRpc2NvdW50IHRva2VuIGlzIGEgY29tbWVyY2lhbCBhY3QsIG5vdCBhbiBvcGVyYXRpb25hbCBvbmUsIGFuZCB0aGVcbiAqIHBlcnNvbiB3aG8gcmVzdGFydHMgYSBzdHVjayBidWlsZCBxdWV1ZSBoYXMgbm8gcmVhc29uIHRvIGhvbGQgaXQuXG4gKlxuICogVGhlIGRlc3RydWN0aXZlIGhhbGYgb2YgdGhlIGNhdGFsb2d1ZSBsaXZlcyBoZXJlIOKAlCBgb3JnczptYW5hZ2VgIGNhbiBERUxFVEVcbiAqIGFuIG9yZ2FuaXNhdGlvbiBhbmQgYHN1YnNjcmlwdGlvbnM6bWFuYWdlYCBjYW4gY2FuY2VsIGl0cyBzdWJzY3JpcHRpb24g4oCUIHNvXG4gKiB0aGlzIGlzIGRlbGliZXJhdGVseSB0aGUgc21hbGxlciwgbW9yZSByYXJlbHktYXNzaWduZWQgb2YgdGhlIHR3by5cbiAqL1xuZXhwb3J0IGNvbnN0IEFDQ09VTlRfTUFOQUdFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJyxcbiAgJ29yZ3M6bWFuYWdlJyxcbiAgJ2JpbGxpbmc6b3BlcmF0ZScsXG4gIC8vIEEgcXVvdGEgYnVtcCBpcyBhcyBvZnRlbiBhIGNvbW1lcmNpYWwgY29uY2Vzc2lvbiBhcyBhbiBvcGVyYXRpb25hbCBvbmUsIHNvXG4gIC8vIGJvdGggYnVuZGxlcyBjYXJyeSBpdC5cbiAgJ3F1b3RhczptYW5hZ2UnLFxuICAvLyBUaGUgYWxsLW9yZ2FuaXphdGlvbnMgbGlzdCwgd2hpY2ggaXMgdGhlIHN1cmZhY2UgdGhpcyBqb2Igd29ya3MgZnJvbSDigJQgYW5kXG4gIC8vIG9ubHkgdGhhdC4gSXQgdXNlZCB0byB0YWtlIGBwbGF0Zm9ybTpyZWFkYCwgd2hpY2ggYWxzbyBoYW5kZWQgb3ZlciB0aGVcbiAgLy8gZGVwbG95J3MgUkxTIG1vZGUsIEtNUyBwb3N0dXJlIGFuZCByZW5kZXJlZCBhbGVydCBydWxlczogaW50ZXJuYWxzIGFcbiAgLy8gY29tbWVyY2lhbCByb2xlIGhhcyBubyB1c2UgZm9yLlxuICAnb3JnczpyZWFkJyxcbl07XG5cbi8qKlxuICogQ09OU09MRSBBRE1JTklTVFJBVE9SIOKAlCB0aGUgb3BlcmF0b3IgY29uc29sZXMsIGFzIGEgUm9sZS5cbiAqXG4gKiBXSFkgVEhJUyBFWElTVFMgZXZlbiB0aG91Z2ggZWFjaCBjb25zb2xlIHBlcm1pc3Npb24gaXMgZ3JhbnRhYmxlIGJ5IGhhbmQ6IHdpdGhcbiAqIG5vIHNlZWRlZCBSb2xlLCB0aGUgb25seSBwYXRoIHRvIHBnQWRtaW4gd2FzIGEgc3VwZXJhZG1pbiBjb21wb3NpbmcgYSBjdXN0b21cbiAqIFJvbGUgZm9yIGl0LCBhbmQgdGhlIG9ic2VydmVkIG91dGNvbWUgb2YgYXNraW5nIHBlb3BsZSB0byBkbyB0aGF0IGlzIHRoYXQgdGhleVxuICogcmVhY2ggZm9yIHRoZSBzdXBlcmFkbWluIEZMQUcgaW5zdGVhZCDigJQgdGhlIGV4YWN0IGZhaWx1cmUgdGhlc2UgcGVybWlzc2lvbnNcbiAqIHdlcmUgYWRkZWQgdG8gcmVtb3ZlLiBBIG5hbWVkIFJvbGUgYWxzbyBtYWtlcyBcIndobyBjYW4gb3BlbiBhIGRhdGEgc2hlbGw/XCIgb25lXG4gKiBxdWVyeSBpbnN0ZWFkIG9mIGFuIGF1ZGl0IG9mIGV2ZXJ5IGN1c3RvbSBSb2xlLlxuICpcbiAqIEl0IGNhcnJpZXMgYWxsIHRocmVlIGNvbnNvbGVzLCB3aGljaCBpcyB0aGUgd2hvbGUgam9iIGZvciB0aGUgcGVyc29uIHdobyBob2xkc1xuICogaXQuIE9ORSBDT05TRVFVRU5DRSBXT1JUSCBLTk9XSU5HOiBgZGF0YWJhc2VfY29uc29sZTpvcGVuYCBhbmRcbiAqIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gIGFyZSB0aGUgdHdvIGhhbHZlcyBvZiB0aGUgYXVkaXQgdGFtcGVyLWV2aWRlbmNlXG4gKiBkZXNpZ24g4oCUIGEgTW9uZ28gc2hlbGwgY2FuIHRydW5jYXRlIGEgaGFzaCBjaGFpbidzIHRhaWwsIGFuZCB0aGUgb2JqZWN0IHN0b3JlXG4gKiBob2xkcyB0aGUgc2lnbmVkIGhlYWRzIHRoYXQgd291bGQgZXhwb3NlIHRoZSB0cnVuY2F0aW9uIOKAlCBzbyBhIGhvbGRlciBvZiB0aGlzXG4gKiBSb2xlIGNhbiBkbyBib3RoLiBUaGUgcGVybWlzc2lvbnMgc3RheSBTRVBBUkFURSBmb3IgZXhhY3RseSB0aGF0IHJlYXNvbjogYVxuICogZGVwbG95bWVudCB0aGF0IHdhbnRzIHRoZW0gaGVsZCBieSBkaWZmZXJlbnQgcGVvcGxlIGNvbXBvc2VzIGEgbmFycm93ZXIgUm9sZVxuICogYnkgaGFuZCAoYSBzdXBlcmFkbWluIG1heSBpbmNsdWRlIGFueSBzeXN0ZW0tb3JnLW9ubHkgcGVybWlzc2lvbiBpbiBhIFJvbGVcbiAqIGF1dGhvcmVkIGluIHRoZSBzeXN0ZW0gb3JnKSBhbmQgYXNzaWducyB0aGlzIG9uZSB0byBub2JvZHkuXG4gKi9cbi8qKlxuICogUExBVEZPUk0gT0JTRVJWRVIg4oCUIGxvb2ssIGRvbid0IHRvdWNoLiBUaGUgbGFkZGVyJ3MgbWlzc2luZyBib3R0b20gcnVuZy5cbiAqXG4gKiBFdmVyeSBvdGhlciBzeXN0ZW0tb3JnIGJ1bmRsZSBncmFudHMgYSB3cml0ZS4gVGhlIG9uZSB0aGF0IGRvZXMgbm90IOKAlFxuICogQ29uc29sZSBBZG1pbmlzdHJhdG9yIOKAlCBncmFudHMgYSByZWFkIHRoYXQgSVMgYSBkYXRhYmFzZSBzaGVsbC4gU28gc29tZWJvZHlcbiAqIHdobyBzaG91bGQgc2VlIHRoZSBkZXBsb3ltZW50IGFuZCBjaGFuZ2Ugbm90aGluZyAoYSBuZXcgb3BlcmF0b3Igc2hhZG93aW5nLCBhblxuICogYXVkaXRvciwgYW4gb24tY2FsbCBlbmdpbmVlciBkdXJpbmcgYSBoYW5kb3ZlcikgaGFkIHR3byBvcHRpb25zOiBTdXBlciBBZG1pbixcbiAqIG9yIG5vdGhpbmcuIFRoZSB1c3VhbCBvdXRjb21lIG9mIGEgY2hvaWNlIGxpa2UgdGhhdCBpcyB0aGUgZmxhZy5cbiAqXG4gKiBTdHJpY3RseSByZWFkLW9ubHkgYnkgY29uc3RydWN0aW9uOiBldmVyeSBwZXJtaXNzaW9uIGhlcmUgZW5kcyBgOnJlYWRgLCB3aGljaFxuICogYGlzTXV0YXRpb25QZXJtaXNzaW9uYCBjbGFzc2lmaWVzIGFzIGEgcmVhZCwgc28gdGhlIGRhc2hib2FyZCBkaXNhYmxlcyBldmVyeVxuICogd3JpdGUgYWZmb3JkYW5jZSBmb3IgYSBob2xkZXIgcmF0aGVyIHRoYW4gb2ZmZXJpbmcgY29udHJvbHMgdGhhdCA0MDMuXG4gKlxuICogTk9UIGBhdWRpdDpyZWFkYC4gSXQgd291bGQgYmUgdGhlIG9idmlvdXMgYWRkaXRpb24gYW5kIGl0IGlzIHRoZSB3cm9uZyBvbmU6XG4gKiBgbGlzdEF1ZGl0RXZlbnRzYCBwaW5zIGV2ZXJ5IG5vbi1zdXBlcmFkbWluIHRvIHRoZWlyIE9XTiBvcmcsIHNvIGEgc3lzdGVtLW9yZ1xuICogb2JzZXJ2ZXIgaG9sZGluZyBpdCB3b3VsZCBzZWUgdGhlIHN5c3RlbSBvcmcncyBhdWRpdCB0cmFpbCBhbmQgbm90aGluZyBlbHNlIOKAlFxuICogYW4gYWZmb3JkYW5jZSB0aGF0IGxvb2tzIGxpa2UgZmxlZXQtd2lkZSBhdWRpdCBhY2Nlc3MgYW5kIGlzIG5vdC4gUmVhZGluZ1xuICogYW5vdGhlciB0ZW5hbnQncyB0cmFpbCBpcyBkZWxpYmVyYXRlbHkgdGhlIGZsYWcncyBhbG9uZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMQVRGT1JNX09CU0VSVkVSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gIC8vIEEgcmVhZCwgYW5kIHRoaXMgUm9sZSBpcyByZWFkcyDigJQgdGhlIHJlZ2lzdHJ5IGJyb3dzZXIgd2l0aCBuZWl0aGVyIG9mIHRoZVxuICAvLyB0d28gd3JpdGUgcnVuZ3MgKGByZWdpc3RyeTp3cml0ZWAgY29waWVzLCBgcmVnaXN0cnk6cHVyZ2VgIGRlbGV0ZXMpLlxuICAncmVnaXN0cnk6cmVhZCcsXG5dO1xuXG5leHBvcnQgY29uc3QgQ09OU09MRV9BRE1JTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nLFxuICAnZGF0YWJhc2VfY29uc29sZTpvcGVuJyxcbiAgJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsXG4gIC8vIFRoZSBhbGwtb3JnYW5pemF0aW9ucyBsaXN0LCBzbyBhIGhvbGRlciBjYW4gZmluZCB0aGUgb3JnIHRoZXkgd2VyZSBhc2tlZFxuICAvLyBhYm91dCB3aXRob3V0IGEgc2Vjb25kIFJvbGUg4oCUIGFuZCBub3RoaW5nIG1vcmUuIFRoaXMgd2FzIGBwbGF0Zm9ybTpyZWFkYCxcbiAgLy8gd2hpY2ggbWVhbnQgb3BlbmluZyBhIGRhdGFiYXNlIGNvbnNvbGUgYWxzbyBncmFudGVkIHRoZSBkZXBsb3kncyBvd25cbiAgLy8gY29uZmlndXJhdGlvbiwgZm9yIG5vIHJlYXNvbiBiZXlvbmQgdGhlIHR3byBzaGFyaW5nIGEgZ2F0ZS5cbiAgJ29yZ3M6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFJFR0lTVFJZIE9QRVJBVE9SIOKAlCBtb3ZlcyBjb250YWluZXIgaW1hZ2VzIGFyb3VuZCwgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBUSEUgR0FQIElUIEZJTExTLiBQcm9tb3RpbmcgYW4gaW1hZ2Ug4oCUIGNvcHlpbmcgYSBidWlsdCB0YWcgZnJvbSBvbmUgcmVwb3NpdG9yeVxuICogdG8gdGhlIG9uZSBhIHJlbGVhc2UgcmVzb2x2ZXMg4oCUIGlzIGEgam9iIHNvbWVib2R5IGRvZXMsIGFuZCB1bnRpbCBub3cgdGhlIG9ubHlcbiAqIGlkZW50aXR5IHRoYXQgY291bGQgZG8gaXQgd2FzIGEgc3VwZXJhZG1pbi4gYHJlZ2lzdHJ5OndyaXRlYCBoYXMgbm8gb3RoZXJcbiAqIGNhcnJpZXIsIGFuZCBhIHN5c3RlbS1vcmctb25seSBwZXJtaXNzaW9uIHdpdGggbm8gc2VlZGVkIGNhcnJpZXIgaXNcbiAqIHN1cGVyYWRtaW4tb25seSBpbiBwcmFjdGljZSAodGhlIGBwbGF0Zm9ybTpyZWFkYCBmYWlsdXJlLCBwaW5uZWQgYnkgdGhlXG4gKiBcImF0IGxlYXN0IG9uZSBzZWVkZWQgY2FycmllclwiIGFzc2VydGlvbiBpbiBhcGktY29yZSdzIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgKS5cbiAqIFNvIHNwbGl0dGluZyBgcmVnaXN0cnk6cHVyZ2VgIG91dCBvZiBgcmVnaXN0cnk6d3JpdGVgIGlzIG9ubHkgaGFsZiB0aGUgY2hhbmdlOlxuICogdGhlIGFkZGl0aXZlIGhhbGYgbmVlZHMgYSBSb2xlIG9yIHRoZSBzcGxpdCBidXlzIG5vdGhpbmcuXG4gKlxuICogV0hZIElUIElTIE5PVCBQQVJUIE9GIFBMQVRGT1JNIE9QRVJBVE9SLiBUaGF0IFJvbGUgcnVucyB0aGUgZGVwbG95bWVudCBhbmRcbiAqIGFscmVhZHkgcmVhZHMgdGhlIHJlZ2lzdHJ5LiBQcm9tb3RpbmcgYW4gaW1hZ2UgaXMgYSByZWxlYXNlIGRlY2lzaW9uLCBub3QgYW5cbiAqIG9wZXJhdGlvbmFsIHNpZGUgZWZmZWN0LCBhbmQgcm9sbGluZyBpdCBpbnRvIHRoZSBSb2xlIGV2ZXJ5b25lIG9uIGNhbGwgaG9sZHNcbiAqIHdvdWxkIG1lYW4gdGhlIHBhZ2VyIHJvdGF0aW9uIGNhbiByZXRhZyBhIHJlbGVhc2UgYXQgM2FtLiBUaGUgdHdvIFJvbGVzXG4gKiBjb21wb3NlIGluc3RlYWQg4oCUIGEgbWVtYmVyIG1heSBob2xkIGFueSBudW1iZXIsIGFuZCBwZXJtaXNzaW9ucyBhcmUgdGhlIHVuaW9uLlxuICpcbiAqIFdIWSBJVCBJUyBPTkxZIFRXTyBQRVJNSVNTSU9OUy4gRGVsaWJlcmF0ZWx5IG5vdGhpbmcgZWxzZTogbm8gYHBsYXRmb3JtOnJlYWRgLFxuICogbm8gY29uc29sZSwgbm8gYG9yZ3M6cmVhZGAuIGBjYW5SZWFkUmVwb2AvYGNhbldyaXRlUmVwb2AgY29uZmluZSBhXG4gKiBub24tc3VwZXJhZG1pbiBzeXN0ZW0tb3JnIGhvbGRlciB0byBgc3lzdGVtLypgLCBgbGlicmFyeS8qYCBhbmQgYHB1YmxpYy8qYCDigJRcbiAqIHRoaXMgZGVwbG95bWVudCdzIG93biBiYXNlIGFuZCBwbHVnaW4gaW1hZ2VzIOKAlCBzbyB0aGUgUm9sZSBjYW5ub3QgcmVhY2ggYVxuICogdGVuYW50J3MgcmVwb3NpdG9yaWVzIGF0IGFsbCwgYW5kIGEgaG9sZGVyIHdobyBhbHNvIG5lZWRzIHRoZSBvcGVyYXRvciB2aWV3c1xuICogZ2V0cyB0aGUgb3BlcmF0b3IgUm9sZSB0b28uIEl0IGRvZXMgTk9UIGNhcnJ5IGByZWdpc3RyeTpwdXJnZWAsIHdoaWNoIGlzIGluXG4gKiB7QGxpbmsgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TfSBhbmQgaW4gbm8gYnVuZGxlIGJ5IGRlc2lnbjogYW4gaW1hZ2VcbiAqIHByb21vdGVyIGhhcyBubyBidXNpbmVzcyBkZWxldGluZyB0aGUgaW1hZ2UgYSB0ZW5hbnQncyBwaXBlbGluZSByZXNvbHZlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lTVFJZX09QRVJBVE9SX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdyZWdpc3RyeTpyZWFkJyxcbiAgJ3JlZ2lzdHJ5OndyaXRlJyxcbl07XG5cbi8qKlxuICogU1VQUE9SVCBBR0VOVCDigJQgdGhlIHN1cHBvcnQgZGVzaywgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgY2FycmllcyBubyBgcGxhdGZvcm06cmVhZGAsIG5vIGNvbnNvbGUgYW5kIG5vIGJpbGxpbmcgd3JpdGU6IGFuXG4gKiBhZ2VudCBhbnN3ZXJzIGNhc2VzIGFuZCB3cml0ZXMgdGhlIGNhbm5lZCByZXBsaWVzLiBgc3Vic2NyaXB0aW9uczpyZWFkYCBpc1xuICogaGVyZSBiZWNhdXNlIHRoZSBmaXJzdCBxdWVzdGlvbiBvbiBhbnkgY2FzZSBpcyB3aGF0IHRoZSBjdXN0b21lciBpcyBlbnRpdGxlZFxuICogdG8sIGFuZCB3aXRob3V0IGl0IGFuIGFnZW50IHdvdWxkIGhhdmUgdG8gYXNrIHNvbWVvbmUgZWxzZSB0byBsb29rLlxuICovXG5leHBvcnQgY29uc3QgU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAnc3VwcG9ydF9jYXNlczp3cml0ZScsXG4gICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgLy8gTkVXLCBhbmQgdGhlIGdhcCB0aGUgc3BsaXQgZXhwb3NlZDogYW4gYWdlbnQgdHJpYWdpbmcgYSBjYXNlIG5lZWRzIHRvIGZpbmRcbiAgLy8gdGhlIGN1c3RvbWVyJ3Mgb3JnYW5pemF0aW9uLiBUaGUgb25seSBwZXJtaXNzaW9uIHRoYXQgbGlzdGVkIG9yZ3Mgd2FzXG4gIC8vIGBwbGF0Zm9ybTpyZWFkYCwgd2hpY2ggd291bGQgYWxzbyBoYXZlIGhhbmRlZCBhIHN1cHBvcnQgYWdlbnQgdGhlIGRlcGxveSdzXG4gIC8vIGludGVybmFscyDigJQgc28gdGhleSBoYWQgbmVpdGhlciwgYW5kIGhhZCB0byBhc2sgc29tZW9uZSBlbHNlIHRvIGxvb2suXG4gICdvcmdzOnJlYWQnLFxuICAvLyBSZWFkaW5nIGFuZCBhbnN3ZXJpbmcgdGhlIGNhc2UgaXRzZWxmIHJpZGVzIHRoZSBvcmRpbmFyeSBtZXNzYWdpbmdcbiAgLy8gcGVybWlzc2lvbnMg4oCUIGEgc3VwcG9ydCBjYXNlIElTIGEgbWVzc2FnZSB0aHJlYWQuXG4gICdtZXNzYWdlczpyZWFkJyxcbiAgJ21lc3NhZ2VzOndyaXRlJyxcbl07XG5cbi8qKlxuICogU1VQUE9SVCBMRUFEIOKAlCB0aGUgc3VwcG9ydCBkZXNrLCBwbHVzIHRoZSBhdXRob3JpdHkgdG8gbG9vay5cbiAqXG4gKiBUSEUgR0FQIElUIEZJTExTLiBgaW1wZXJzb25hdGlvbjpvcGVuYCBpcyBzeXN0ZW0tb3JnLW9ubHksIGFuZCBhIHN5c3RlbS1vcmctb25seVxuICogcGVybWlzc2lvbiB3aXRoIG5vIHNlZWRlZCBjYXJyaWVyIGlzIHN1cGVyYWRtaW4tb25seSBpbiBwcmFjdGljZSDigJQgdGhlXG4gKiBpbnZhcmlhbnQgYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCBhc3NlcnRzLCBhbmQgdGhlIHJlYXNvblxuICogYHBsYXRmb3JtOnJlYWRgIHNoaXBwZWQgdW51c2FibGUuIFdpdGhvdXQgdGhpcyBSb2xlLCBzcGxpdHRpbmcgaW1wZXJzb25hdGlvblxuICogb3V0IG9mIHRoZSBmbGFnIHdvdWxkIGNoYW5nZSBub3RoaW5nOiB0aGUgb25seSB3YXkgdG8gbGV0IHNvbWVib2R5IHZpZXcgYVxuICogY3VzdG9tZXIncyBhY2NvdW50IHdvdWxkIHN0aWxsIGJlIHRvIG1ha2UgdGhlbSBhIGZ1bGwgU3VwZXIgQWRtaW4sIGhhbmRpbmdcbiAqIG92ZXIgYC9hZG1pbi91c2Vycy86aWQvZ3JhbnRzYCwgdGhlIHNpbmdsZS1wZXJzb24gTUZBIHJlc2V0LCB0aGUgZGF0YWJhc2VcbiAqIGNvbnNvbGUgYW5kIGByZWdpc3RyeTpwdXJnZWAgYXQgdGhlIHNhbWUgdGltZS5cbiAqXG4gKiBXSFkgSVQgSVMgVEhFIFNVUFBPUlQgREVTSyBBTkQgTk9UIFRIRSBPUEVSQVRPUi4gVGhlIHF1ZXN0aW9uIGltcGVyc29uYXRpb25cbiAqIGFuc3dlcnMgaXMgXCJ3aGF0IGlzIHRoaXMgY3VzdG9tZXIgYWN0dWFsbHkgc2VlaW5nP1wiLCB3aGljaCBpcyBhIHN1cHBvcnRcbiAqIHF1ZXN0aW9uLiBQbGF0Zm9ybSBPcGVyYXRvciBydW5zIHRoZSBkZXBsb3ltZW50IGFuZCBpcyBoZWxkIGJ5IHdob2V2ZXIgaXMgb25cbiAqIGNhbGw7IGFkZGluZyB0aGlzIHRvIGl0IHdvdWxkIGhhbmQgZXZlcnkgcm90YSBtZW1iZXIgdGhlIGFiaWxpdHkgdG8gYmVjb21lIGFueVxuICogY3VzdG9tZXIncyB1c2VyIGF0IDNhbS4gU3VwcG9ydCBBZ2VudCdzIGJ1bmRsZSBwbHVzIHRoZSBvbmUgcGVybWlzc2lvbiBpcyB0aGVcbiAqIG5hcnJvd2VyLCBtb3JlIGhvbmVzdCBzaGFwZSDigJQgYW5kIGEgbGVhZCB3aG8gYWxzbyBydW5zIHRoZSBkZXBsb3ltZW50IGhvbGRzXG4gKiBib3RoIFJvbGVzLlxuICpcbiAqIFdIQVQgSVQgU1RJTEwgQ0FOTk9UIERPLiBFbWVyZ2VuY3kgYWNjZXNzOiBgYnJlYWtnbGFzc2AgYnlwYXNzZXMgdGVuYW50XG4gKiBjb25zZW50IGFuZCBzdGF5cyBvbiB0aGUgZmxhZywgYXBwcm92ZWQgYnkgYSBzZWNvbmQgU3VwZXIgQWRtaW4uIEFuZCB0aGVcbiAqIHRlbmFudCBjYW4gcmVmdXNlIOKAlCBgaW1wZXJzb25hdGlvbjpvcGVuYCBpcyBwZXJtaXNzaW9uIHRvIEFTSy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRfTEVBRF9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAuLi5TVVBQT1JUX0FHRU5UX1BFUk1JU1NJT05TLFxuICAnaW1wZXJzb25hdGlvbjpvcGVuJyxcbl07XG5cbi8qKlxuICogU1RBUlRJTkcgUE9JTlRTIGZvciBhIGN1c3RvbSBSb2xlIGluIGEgdGVuYW50IG9yZyDigJQgdGVtcGxhdGVzLCBub3QgUm9sZXMuXG4gKlxuICogVEhFIEdBUCBUSEVZIEZJTEwuIEFuIG9yZyBzZWVkcyBleGFjdGx5IFRXTyBSb2xlcyDigJQgTWVtYmVyIGFuZCBBZG1pbiDigJQgYW5kXG4gKiBBZG1pbiBpcyBldmVyeSBvcmctYXNzaWduYWJsZSBwZXJtaXNzaW9uLiBTbyBwcm9tb3RpbmcgYW55b25lIHBhc3QgXCJhdXRob3IgYW5kXG4gKiByZWFkXCIgaGFuZHMgb3ZlciB0aGUgd2hvbGUgcmVtYWluZGVyIGF0IG9uY2U6IGBvcmdfa21zOndyaXRlYCxcbiAqIGBvcmdfaWRwOndyaXRlYCwgYG9yZ19pbXBlcnNvbmF0aW9uOndyaXRlYCwgYGJpbGxpbmc6bWFuYWdlYCwgYHJvbGVzOm1hbmFnZWBcbiAqIGFuZCBgYXVkaXQ6cmVhZGAgYW1vbmcgdGhlbS4gVGhlIHByb2R1Y3QncyBhbnN3ZXIgaXMgXCJhdXRob3IgYSBjdXN0b20gUm9sZVwiLFxuICogYW5kIHRoZSBzYWZldHkgaXMgYWxyZWFkeSByaWdodCAoYHNhbml0aXplUGVybWlzc2lvbnNgIGJvdW5kcyBhIGN1c3RvbSBSb2xlIGJ5XG4gKiBpdHMgYXV0aG9yJ3Mgb3duIGNlaWxpbmcpLiBXaGF0IHdhcyBtaXNzaW5nIGlzIHRoZSBzdGFydGluZyBwb2ludC5cbiAqXG4gKiBUaGUgZXhhY3Qgc2l6ZXMgb2YgdGhhdCBjbGlmZiBhcmUgYXNzZXJ0ZWQgaW4gYHRlc3QvcGVybWlzc2lvbnMudGVzdC50c2BcbiAqIHJhdGhlciB0aGFuIHdyaXR0ZW4gaGVyZS4gVGhpcyBwYXJhZ3JhcGggdXNlZCB0byBjYXJyeSB0aGVtIGlubGluZSDigJQgXCJ0aHJlZVxuICogUm9sZXM6IE1lbWJlciAoMTUpLCBUZWFtIExlYWQgKDE3KSBhbmQgQWRtaW4gKDM3KVwiIOKAlCBhbmQgZXZlcnkgb25lIG9mIHRob3NlXG4gKiBudW1iZXJzIHdlbnQgc3RhbGU6IGBUZWFtIExlYWRgIHN0b3BwZWQgYmVpbmcgc2VlZGVkIHdoZW4gaXQgYmVjYW1lIHRoZSBmaXJzdFxuICogdGVtcGxhdGUgYmVsb3csIGFuZCB0aGUgdHdvIGJ1bmRsZXMgaGF2ZSBncm93biBzaW5jZS4gQSBjb3VudCBub3RoaW5nIGNoZWNrc1xuICogaXMgYSBjbGFpbSB0aGF0IGRlY2F5cywgYW5kIHRoaXMgb25lIHdhcyB0aGUgc3RhdGVkIHJhdGlvbmFsZSBmb3IgdGhlIGZlYXR1cmUuXG4gKlxuICogV0hZIFRFTVBMQVRFUyBBTkQgTk9UIFNFRURFRCBST0xFUy4gQSBzZWVkZWQgYnVpbHQtaW4gaXMgYHN5c3RlbTogdHJ1ZWAgYW5kXG4gKiB0aGVyZWZvcmUgaW1tdXRhYmxlLCBzbyBzZWVkaW5nIHRoZXNlIHdvdWxkIHB1dCBmb3VyIHVuZGVsZXRhYmxlIHJvd3MgaW4gZXZlcnlcbiAqIG9yZyB3aGV0aGVyIGl0IHdhbnRzIHRoZW0uIEEgdGVtcGxhdGUgbGVhdmVzIG5vIHRyYWNlIHVudGlsIHNvbWVvbmUgdXNlcyBpdCxcbiAqIGFuZCB3aGF0IGl0IHByb2R1Y2VzIGlzIGFuIG9yZGluYXJ5IGN1c3RvbSBSb2xlIHRoZSBvcmcgZnVsbHkgb3ducyDigJQgZWRpdGFibGUsXG4gKiBkZWxldGFibGUsIGFuZCBib3VuZGVkIGJ5IHRoZSBhdXRob3IncyBjZWlsaW5nIGxpa2UgYW55IG90aGVyLlxuICpcbiAqIFdIQVQgVEhFWSBERUxJQkVSQVRFTFkgRVhDTFVERS4gYHJvbGVzOm1hbmFnZWAgaXMgaW4gbm9uZSBvZiB0aGVtLiBJdCBpcyB0aGVcbiAqIG9uZSBwZXJtaXNzaW9uIHRoYXQgY29tcG91bmRzIOKAlCB0aGUgaG9sZGVyIGNhbiBtaW50IGZ1cnRoZXIgUm9sZXMsIHVwIHRvIHRoZWlyXG4gKiBvd24gY2VpbGluZyDigJQgc28gYWNxdWlyaW5nIGl0IHNob3VsZCBzdGF5IGEgY29uc2Npb3VzIGFjdCByYXRoZXIgdGhhbiBhIHNpZGVcbiAqIGVmZmVjdCBvZiBwaWNraW5nIGEgcHJlc2V0LiBFdmVyeSBwZXJtaXNzaW9uIGhlcmUgaXMgb3JnLWFzc2lnbmFibGUsIHNvIGFcbiAqIHRlbXBsYXRlIGlzIHZhbGlkIGluIGFueSBvcmcgYW5kIGBzYW5pdGl6ZVBlcm1pc3Npb25zYCBhY2NlcHRzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGVUZW1wbGF0ZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFdoYXQgdGhlIGpvYiBpcyDigJQgc2hvd24gbmV4dCB0byB0aGUgdGVtcGxhdGUsIGFuZCBhIHNlbnNpYmxlIFJvbGUgZGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiByZWFkb25seSBQZXJtaXNzaW9uW107XG59XG5cbmV4cG9ydCBjb25zdCBST0xFX1RFTVBMQVRFUzogcmVhZG9ubHkgUm9sZVRlbXBsYXRlW10gPSBbXG4gIHtcbiAgICAvLyBXYXMgYSBTRUVERUQgUm9sZSBpbiBldmVyeSBvcmcgdW50aWwgaXQgYmVjYW1lIGEgdGVtcGxhdGUuIEl0IGlzIHRoZSBvbmx5XG4gICAgLy8gYnVpbHQtaW4gdGhhdCB3YXMgYSBqb2IgZGVzY3JpcHRpb24gcmF0aGVyIHRoYW4gYSBzdHJ1Y3R1cmFsIHJlcXVpcmVtZW50OlxuICAgIC8vIFN1cGVyIEFkbWluIGlzIHdoZXJlIGBpc1N1cGVyQWRtaW5gIGlzIGRlcml2ZWQgZnJvbSwgQWRtaW4gYW5kIE1lbWJlciBhcmVcbiAgICAvLyB0aGUgZmxvb3IgYW4gb3JnIGlzIHVudXNhYmxlIHdpdGhvdXQsIGFuZCB0aGUgc3lzdGVtLW9yZyBSb2xlcyBjYXJyeVxuICAgIC8vIHBlcm1pc3Npb25zIG5vIGN1c3RvbSBSb2xlIG1heSBob2xkLiBUZWFtIExlYWQgd2FzIG5vbmUgb2YgdGhvc2Ug4oCUIGl0IGlzXG4gICAgLy8gYG1lbWJlcmAgcGx1cyB0d28gcmVwb3J0IHBlcm1pc3Npb25zLCBhbmQgYW4gb3JnIHRoYXQgZG9lcyBub3QgZGVsZWdhdGVcbiAgICAvLyByZXBvcnQgYXV0aG9yaW5nIGhhZCBhbiB1bmRlbGV0YWJsZSByb3cgZm9yIGl0IGFueXdheS5cbiAgICAvL1xuICAgIC8vIENPTlNFUVVFTkNFLCBzdGF0ZWQgcmF0aGVyIHRoYW4gZGlzY292ZXJlZDogYSBuZXcgb3JnIG5vIGxvbmdlciBoYXMgYSBSb2xlXG4gICAgLy8gdGhhdCBncmFudHMgYHJlcG9ydHM6d3JpdGVgIHRvIGEgbm9uLWFkbWluLiBBbiBhZG1pbiBob2xkcyBib3RoIHBlcm1pc3Npb25zXG4gICAgLy8gKHRoZXkgYXJlIGluIHRoZSBhZG1pbiBidW5kbGUpIGFuZCBpbnN0YW50aWF0ZXMgdGhpcyB0ZW1wbGF0ZSB0byBkZWxlZ2F0ZVxuICAgIC8vIHRoZW0g4oCUIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSBmb3VyIGJlbG93LiBPcmdzIHRoYXQgYWxyZWFkeSBoYXZlIHRoZSBzZWVkZWRcbiAgICAvLyBSb2xlIGtlZXAgaXQsIGFuZCB0aGUgYmFja2ZpbGwga2VlcHMgaXRzIGJ1bmRsZSBjdXJyZW50LlxuICAgIGlkOiAndGVhbS1sZWFkJyxcbiAgICBuYW1lOiAnVGVhbSBMZWFkJyxcbiAgICBkZXNjcmlwdGlvbjogJ0F1dGhvcnMgYW5kIHNoYXJlcyBzdGFrZWhvbGRlciByZXBvcnRzIGZvciBhIHRlYW0sIHdpdGhvdXQgb3JnLWFkbWluIGFjY2Vzcy4nLFxuICAgIHBlcm1pc3Npb25zOiBbLi4uTUVNQkVSX1BFUk1JU1NJT05TLCAncmVwb3J0czp3cml0ZScsICdyZXBvcnRzOnB1Ymxpc2gnXSxcbiAgfSxcbiAge1xuICAgIC8qKlxuICAgICAqIE1FTUJFUiBBTFJFQURZIElTIFRIRSBERVZFTE9QRVIgUk9MRSDigJQgdGhpcyB0ZW1wbGF0ZSBleGlzdHMgZm9yIHdoYXQgaXRcbiAgICAgKiBkb2VzIE5PVCBjb3Zlci5cbiAgICAgKlxuICAgICAqIEV2ZXJ5dGhpbmcgaW4gYSBkZXZlbG9wZXIncyBsb29wIGlzIGBwaXBlbGluZXM6cmVhZGAgKyBgcGlwZWxpbmVzOndyaXRlYCxcbiAgICAgKiBib3RoIGluIHRoZSBtZW1iZXIgYnVuZGxlOiBjcmVhdGUsIGVkaXQsIHZhbGlkYXRlLCBydW4sIHN0b3AsIHRoZSBidWxrXG4gICAgICogb3BzLCBBSSBnZW5lcmF0aW9uIChgL3BpcGVsaW5lcy9nZW5lcmF0ZWAsIGluY2wuIGZyb20tdXJsIGFuZCBzdHJlYW1pbmcpLFxuICAgICAqIHRoZSBwaXBlbGluZSByZWdpc3RyeSwgcGx1cyBgdGVtcGxhdGVzOnJlYWRgIHRvIGluc3RhbnRpYXRlIGFuZFxuICAgICAqIGBwbHVnaW5zOmluc3RhbGxgIHRvIGFkZCBhIHBsdWdpbi4gQSB0ZW1wbGF0ZSByZXN0YXRpbmcgdGhhdCB3b3VsZCBidXlcbiAgICAgKiBub3RoaW5nLlxuICAgICAqXG4gICAgICogV2hhdCBhIGRldmVsb3BlciBoaXRzIHRoZSBjbGlmZiBvbiBpcyB0aGUgU0VMRi1TRVJWSUNFIG9wZXJhdGUgcGFpcjogdGhleVxuICAgICAqIGNhbiByZWFkIHRoZWlyIHNlcnZpY2UncyBkYXNoYm9hcmRzIGFuZCBtZXRyaWNzIGFuZCBjYW5ub3QgY2hhbmdlIGVpdGhlcixcbiAgICAgKiBiZWNhdXNlIGJvdGggd3JpdGVzIHNpdCBpbiB0aGUgYWRtaW4gYnVuZGxlLiBTbyB0aGUgcGVyc29uIHdobyBvd25zIGFcbiAgICAgKiBwaXBlbGluZSBmaWxlcyBhIHRpY2tldCB0byBnZXQgYW4gYWxlcnQgb24gaXQuXG4gICAgICpcbiAgICAgKiBERUxJQkVSQVRFTFkgTk9UIEhFUkUuIGBsb2dzOmV4cG9ydGAg4oCUIHZpZXdpbmcgbG9ncyByaWRlc1xuICAgICAqIGBvYnNlcnZhYmlsaXR5OnJlYWRgLCBidXQgZG93bmxvYWRpbmcgdGhlbSBpcyBidWxrIGVncmVzcyBhbiBvcmcgbWF5XG4gICAgICogd2l0aGhvbGQgZnJvbSBtZW1iZXJzIChkb2NzL3Blcm1pc3Npb25zLm1kKSwgYW5kIGEgdGVtcGxhdGUgYWltZWQgYXQgZXZlcnlcbiAgICAgKiBlbmdpbmVlciB3b3VsZCByZXZlcnNlIHRoYXQuIGBwaXBlbGluZXM6cHVibGlzaGAg4oCUIHNoYXJpbmcgYmV5b25kIHRoZVxuICAgICAqIGF1dGhvciBpcyBhIHJlbGVhc2UgZGVjaXNpb24sIHdoaWNoIGlzIFJlbGVhc2UgTWFuYWdlcidzIGJlbG93OyBzb21lYm9keVxuICAgICAqIHdobyBkb2VzIGJvdGggaG9sZHMgYm90aCBSb2xlcy5cbiAgICAgKi9cbiAgICBpZDogJ2RldmVsb3BlcicsXG4gICAgbmFtZTogJ0RldmVsb3BlcicsXG4gICAgZGVzY3JpcHRpb246ICdCdWlsZHMgYW5kIHJ1bnMgcGlwZWxpbmVzLCBhbmQgb3ducyB0aGUgZGFzaGJvYXJkcyBhbmQgYWxlcnRzIGZvciB3aGF0IHRoZXkgYnVpbGQuJyxcbiAgICBwZXJtaXNzaW9uczogWy4uLk1FTUJFUl9QRVJNSVNTSU9OUywgJ2Rhc2hib2FyZHM6d3JpdGUnLCAnb2JzZXJ2YWJpbGl0eTp3cml0ZSddLFxuICB9LFxuICB7XG4gICAgaWQ6ICdyZWxlYXNlLW1hbmFnZXInLFxuICAgIG5hbWU6ICdSZWxlYXNlIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVjaWRlcyB3aGF0IGJlY29tZXMgc2hhcmVkIGJleW9uZCBpdHMgYXV0aG9yLCBhbmQgYXBwcm92ZXMgcGx1Z2luIGluc3RhbGxzLicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdwaXBlbGluZXM6cmVhZCcsICdwaXBlbGluZXM6cHVibGlzaCcsXG4gICAgICAndGVtcGxhdGVzOnJlYWQnLCAndGVtcGxhdGVzOnB1Ymxpc2gnLFxuICAgICAgJ3BsdWdpbnM6cmVhZCcsICdwbHVnaW5zOnB1Ymxpc2gnLFxuICAgICAgJ3BsdWdpbl9pbnN0YWxsczptYW5hZ2UnLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ3NlY3VyaXR5LW9mZmljZXInLFxuICAgIG5hbWU6ICdTZWN1cml0eSBPZmZpY2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lkZW50aXR5LCBlbmNyeXB0aW9uIGtleXMgYW5kIHRoZSBldmlkZW5jZSB0cmFpbCDigJQgdGhlIHN1cmZhY2UgYW4gYXVkaXRvciBhc2tzIGFib3V0LicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdhdWRpdDpyZWFkJywgJ2xvZ3M6ZXhwb3J0JyxcbiAgICAgICdjb21wbGlhbmNlOnJlYWQnLCAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgICAnb3JnX2lkcDp3cml0ZScsICdvcmdfa21zOndyaXRlJywgJ29yZ19pbXBlcnNvbmF0aW9uOndyaXRlJyxcbiAgICAgIC8vIE93bmluZyB0aGUgaW1wZXJzb25hdGlvbiBQT0xJQ1kgKGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWApIHdpdGhvdXRcbiAgICAgIC8vIGJlaW5nIGFibGUgdG8gYW5zd2VyIGEgUkVRVUVTVCB3YXMgdGhlIGFzeW1tZXRyeSB0aGUgY29uc2VudCBmbG93IGxlZnRcbiAgICAgIC8vIGJlaGluZDogdGhlIGxlc3NlciBhY3QgaGFkIGEgcGVybWlzc2lvbiBvZiBpdHMgb3duIGFuZCB0aGUgZ3JlYXRlciBvbmVcbiAgICAgIC8vIGhhZCBub25lLiBXaG9ldmVyIGRlY2lkZXMgd2hldGhlciBjb25zZW50IGlzIHJlcXVpcmVkIHNob3VsZCBiZSBhYmxlIHRvXG4gICAgICAvLyBnaXZlIG9yIHdpdGhob2xkIGl0LlxuICAgICAgJ2ltcGVyc29uYXRpb246YXBwcm92ZScsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiAncGVvcGxlLW1hbmFnZXInLFxuICAgIG5hbWU6ICdQZW9wbGUgTWFuYWdlcicsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgcm9zdGVyIGFuZCBpdHMgbWFjaGluZSBjcmVkZW50aWFscywgYWNyb3NzIHRoZSBhY2NvdW50XFx1MjAxOXMgdGVhbXMg4oCUIHdpdGhvdXQgdGhlIG9yZ1xcdTIwMTlzIHNldHRpbmdzIG9yIGl0cyBtb25leS4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnbWVtYmVyczptYW5hZ2UnLCAnaW52aXRhdGlvbnM6bWFuYWdlJywgJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJyxcbiAgICAgIC8vIFRoZSBzYW1lIGpvYiwgb25lIGxldmVsIGRvd246IGVudGVyaW5nIGEgZGVzY2VuZGFudCB0ZWFtIHRvIHdvcmsgb24gaXRzXG4gICAgICAvLyByb3N0ZXIsIGFuZCB2aWV3aW5nIG9uZSBvZiBpdHMgbWVtYmVycyBhcyB0aGF0IG1lbWJlci4gV2l0aG91dCBpdCBhXG4gICAgICAvLyBwZW9wbGUgbWFuYWdlciBpbiBhIHBhcmVudCBvcmcgY2FuIGFkbWluaXN0ZXIgdGhlIGFjY291bnQncyB0ZWFtcyBvblxuICAgICAgLy8gcGFwZXIgYW5kIG5vdCByZWFjaCB0aGVtLlxuICAgICAgJ3RlYW1fYWNjZXNzOm9wZW4nLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ2JpbGxpbmctbWFuYWdlcicsXG4gICAgbmFtZTogJ0JpbGxpbmcgTWFuYWdlcicsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgc3Vic2NyaXB0aW9uLCBzZWF0cyBhbmQgaW52b2ljZXMgZm9yIHRoaXMgb3JnYW5pemF0aW9uLicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLCAncXVvdGFzOnJlYWQnLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICAvKipcbiAgICAgKiBUaGUgam9iIHRoZSBpbXBlcnNvbmF0aW9uIGNvbnNlbnQgZmxvdyBjcmVhdGVkIElOU0lERSB0aGUgdGVuYW50OiB0aGVcbiAgICAgKiBuYW1lZCBwZXJzb24gd2hvIGFuc3dlcnMgXCJtYXkgYSBzdXBwb3J0IGVuZ2luZWVyIHZpZXcgdGhpcyBhY2NvdW50P1wiIGFuZFxuICAgICAqIGNhbiBhZnRlcndhcmRzIHJlYWQgd2hhdCBoYXBwZW5lZC5cbiAgICAgKlxuICAgICAqIEl0IGV4aXN0cyBhcyBhIHRlbXBsYXRlIGJlY2F1c2UgYGltcGVyc29uYXRpb246YXBwcm92ZWAgaXMgaW4gdGhlIGFkbWluXG4gICAgICogYW5kIG93bmVyIGJ1bmRsZXMg4oCUIHNvIGJ5IGRlZmF1bHQgZXZlcnkgYWRtaW4gbWF5IGNvbnNlbnQg4oCUIGFuZCB0aGUgd2hvbGVcbiAgICAgKiBwb2ludCBvZiBzcGxpdHRpbmcgaXQgb3V0IHdhcyB0byBsZXQgYW4gb3JnIHNheSBcInRoaXMgZGVjaXNpb24gaXMgb25lXG4gICAgICogcGVyc29uJ3NcIi4gRG9pbmcgdGhhdCBtZWFucyBhdXRob3JpbmcgYSBSb2xlIHRoYXQgaG9sZHMgaXQgYW5kIHRha2luZyBpdFxuICAgICAqIG9mZiB0aGUgb3RoZXJzLCBhbmQgaGFuZC1jb21wb3Npbmcgd2FzIHRoZSBvbmx5IHJvdXRlLlxuICAgICAqXG4gICAgICogVHdvIHBlcm1pc3Npb25zIGFuZCBubyBtb3JlOiBhcHByb3ZpbmcgaXMgbm90IGFkbWluaXN0ZXJpbmcuIGBhdWRpdDpyZWFkYFxuICAgICAqIGlzIGhlcmUgYmVjYXVzZSBjb25zZW50aW5nIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBjaGVjayB3aGF0IHRoZSBzZXNzaW9uXG4gICAgICogdGhlbiBkaWQgaXMgY29uc2VudCBpbiBuYW1lIG9ubHkuXG4gICAgICovXG4gICAgaWQ6ICdhY2Nlc3MtYXBwcm92ZXInLFxuICAgIG5hbWU6ICdBY2Nlc3MgQXBwcm92ZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnQW5zd2VycyByZXF1ZXN0cyB0byB2aWV3IHRoaXMgb3JnYW5pemF0aW9uXFx1MjAxOXMgYWNjb3VudHMsIGFuZCByZWFkcyB0aGUgdHJhaWwgb2Ygd2hhdCBoYXBwZW5lZC4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnaW1wZXJzb25hdGlvbjphcHByb3ZlJywgJ2F1ZGl0OnJlYWQnLFxuICAgIF0sXG4gIH0sXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJFY29zeXN0ZW0gTWFuYWdlclwiIFJvbGUg4oCUIHRoZSBNT0RFUkFUSU9OIGpvYi5cbiAqXG4gKiBJdCBjYXJyaWVzIGBwbHVnaW5zOm1vZGVyYXRlYCBhbmQgTk9UIGBwdWJsaXNoZXJzOnZlcmlmeWAsIGJlY2F1c2UgdGhlIHR3byBhcmVcbiAqIG5vdCBwZWVycy4gYHBsdWdpbnM6bW9kZXJhdGVgIGlzIHRoZSB3aWRlIHN1cmZhY2U6IHlhbmsgYSB2ZXJzaW9uICh3aGljaFxuICogYnJlYWtzIHBpcGVsaW5lcyBhbHJlYWR5IHJ1bm5pbmcgaXQpLCBwdWJsaXNoIGFuIGFkdmlzb3J5ICh3aGljaCBhbGFybXMgZXZlcnlcbiAqIGNvbnN1bWVyIG9mIGEgbGlzdGluZyksIHJld3JpdGUgdGhlIGF1dG8tYXBwcm92YWwgcnVsZXMgKHdoaWNoIGRlY2lkZSB3aGF0XG4gKiBwdWJsaXNoZXMgd2l0aCBubyBodW1hbiByZXZpZXcgYXQgYWxsKSwgcmVzZXJ2ZSBuYW1lcywgbW9kZXJhdGUgcmV2aWV3cyxcbiAqIHJlLXNpZ24uIGBwdWJsaXNoZXJzOnZlcmlmeWAgaXMgdGhyZWUgcm91dGVzIOKAlCBzdXNwZW5kLCB1bnN1c3BlbmQsIHRpZXIg4oCUIGJ1dFxuICogb25lIG9mIHRoZW0gR1JBTlRTIFZFUklGSUVEIFNUQVRVUywgd2hpY2ggaXMgdGhlIGJhZGdlIGNvbnN1bWVycyByZWFkIGFzIFwidGhpc1xuICogZGVwbG95bWVudCB2b3VjaGVzIGZvciB0aGUgcHVibGlzaGVyXCIuXG4gKlxuICogQnVuZGxpbmcgdGhlbSwgYXMgdGhpcyBSb2xlIHVzZWQgdG8sIG1lYW50IGV2ZXJ5b25lIGhpcmVkIHRvIHRyaWFnZSB0aGUgcXVldWVcbiAqIGNvdWxkIGFsc28gbWludCBhIFZlcmlmaWVkIHB1Ymxpc2hlci4gVGhyZWUgbWVjaGFuaXNtcyBhbHJlYWR5IGFzc3VtZSB0aGVcbiAqIHNwbGl0IGNhbiBiaW5kIOKAlCBgcmVxdWlyZWREZWNpc2lvblBlcm1pc3Npb25gIHBlciByZXF1ZXN0IGtpbmQsIHRoZSBxdWV1ZSdzXG4gKiBwZXItcm93IGBjYW4ocmVxdWlyZWRQZXJtaXNzaW9uKWAsIGFuZCB0aGUgYXBwcm92ZXItc2hvcnRhZ2UgY291bnRzIHRoYXRcbiAqIGBFY29zeXN0ZW1FbGlnaWJpbGl0eWAgdHJhY2tzIFNFUEFSQVRFTFkgZm9yIGVhY2ggcGVybWlzc2lvbiDigJQgYW5kIHdpdGggb25lXG4gKiBjb21iaW5lZCBSb2xlIG5vbmUgb2YgdGhlbSBjb3VsZCBldmVyIGRpc2NyaW1pbmF0ZS5cbiAqXG4gKiB7QGxpbmsgUFVCTElTSEVSX1ZFUklGSUVSX1BFUk1JU1NJT05TfSBpcyB0aGUgb3RoZXIgaGFsZi5cbiAqL1xuZXhwb3J0IGNvbnN0IEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbHVnaW5zOnJlYWQnLFxuICAncGx1Z2luczptb2RlcmF0ZScsXG4gICdtZXNzYWdlczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJQdWJsaXNoZXIgVmVyaWZpZXJcIiBSb2xlIOKAlCB0aGUgVFJVU1QgZGVjaXNpb24uXG4gKlxuICogVGhlIG90aGVyIGhhbGYgb2YgdGhlIGVjb3N5c3RlbSBzcGxpdCBkZXNjcmliZWQgb25cbiAqIHtAbGluayBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OU306IHdobyBtYXkgYXdhcmQgVmVyaWZpZWQsIHN1c3BlbmQgYVxuICogcHVibGlzaGVyIGFuZCBsaWZ0IGEgc3VzcGVuc2lvbi4gQ2FycmllcyBgcGx1Z2luczpyZWFkYCBzbyB0aGUgaG9sZGVyIGNhbiBzZWVcbiAqIHdoYXQgYSBwdWJsaXNoZXIgc2hpcHMgYmVmb3JlIHZvdWNoaW5nIGZvciB0aGVtLCBhbmQgdGhlIHNhbWUgdHdvIGFtYmllbnRcbiAqIHJlYWRzIGFzIGl0cyBzaWJsaW5nLlxuICpcbiAqIFNUQUZGIEFUIExFQVNUIFRXTyBQRU9QTEUuIEEgVmVyaWZpZWQgYXBwbGljYXRpb24gYW5kIGFuIHVuc3VzcGVuZCBhcmUgYm90aFxuICogYG5lZWRzVHdvUGVyc29uYCwgYW5kIGBjb25mbGljdE9mSW50ZXJlc3RgIHJlZnVzZXMgdGhlIHNhbWUgcGVyc29uIHR3aWNlLCBzbyBhXG4gKiBzaW5nbGUgaG9sZGVyIGNhbm5vdCBjb21wbGV0ZSBlaXRoZXIgZGVjaXNpb24gYWxvbmUuIFRoZSBjb25zb2xlJ3MgYXBwcm92ZXJcbiAqIHN0YW5kaW5nIG5vdGljZSBpcyB3aGF0IHN1cmZhY2VzIHRoYXQgc2hvcnRhZ2Ug4oCUIGFuZCBzcGxpdHRpbmcgdGhpcyBSb2xlIG91dFxuICogaXMgd2hhdCBmaW5hbGx5IGxldHMgdGhhdCBub3RpY2UgcmVwb3J0IGEgZmlndXJlIGl0cyBzaWJsaW5nJ3MgZG9lcyBub3QuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUJMSVNIRVJfVkVSSUZJRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsdWdpbnM6cmVhZCcsXG4gICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gICdtZXNzYWdlczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJUZWFtIExlYWRcIiBSb2xlIOKAlCB0aGUgcGVyc29uIHdobyByZXBvcnRzIFVQV0FSRC5cbiAqXG4gKiBFeGlzdHMgYmVjYXVzZSB0aGUgdGFyZ2V0IHVzZXIgZm9yIHN0YWtlaG9sZGVyIHJlcG9ydHMgaXMgYSBsZWFkLCBub3QgYW4gYWRtaW4sXG4gKiBhbmQgZ3JhbnRpbmcgYHJlcG9ydHM6d3JpdGVgIG9ubHkgdGhyb3VnaCB0aGUgYWRtaW4gYnVuZGxlIHdvdWxkIGhhdmUgZm9yY2VkXG4gKiBldmVyeSByZXBvcnRpbmcgbGVhZCB0byBiZSBhbiBvcmcgYWRtaW4gKG1lbWJlcnM6bWFuYWdlLCByb2xlczptYW5hZ2UsXG4gKiBvcmdfc2V0dGluZ3M6d3JpdGUsIGJpbGxpbmcpIHRvIHNlbmQgdGhlaXIgbWFuYWdlciBhIHdlZWtseSBzdW1tYXJ5LlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgaW5jbHVkZWQ6IGByZXBvcnRzOnJvbGx1cGAuIFJvbGxpbmcgYSByZXBvcnQgdXAgb3ZlciBkZXNjZW5kYW50XG4gKiB0ZWFtcyBpcyBkb3dud2FyZCB2aXNpYmlsaXR5IGFjcm9zcyB0aGUgb3JnIHRyZWUsIHdoaWNoIGlzIGEgZ3JhbnRlZCBjYXBhYmlsaXR5XG4gKiBpbiB0aGlzIG1vZGVsLCBub3Qgc29tZXRoaW5nIGEgdGVhbSdzIG93biBsZWFkIGdldHMgYnkgZGVmYXVsdCDigJQgYSBsZWFkIG9mIGFcbiAqIFBBUkVOVCBvcmcgaXMgZ3JhbnRlZCBpdCBleHBsaWNpdGx5LiBUaGUgUm9sZSBncmFudHMgdGhlIGNvYXJzZSBgbWVtYmVyYCBsYWJlbFxuICogYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbmV4cG9ydCBjb25zdCBURUFNX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uTUVNQkVSX1BFUk1JU1NJT05TLFxuICAncmVwb3J0czp3cml0ZScsXG4gICdyZXBvcnRzOnB1Ymxpc2gnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUGlwZWxpbmUgQXV0b21hdGlvblwiIFJvbGUg4oCUIHdoYXQgdGhlIG9yZydzXG4gKiB1bnNjb3BlZCBzdG9yZWQgY3JlZGVudGlhbCAodGhlIGBwbGF0Zm9ybS1hdXRvbWF0aW9uYCBzZXJ2aWNlIGFjY291bnQgdGhhdFxuICogYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5gIHByb3Zpc2lvbnMpIG5lZWRzLCBhbmQgbm90aGluZyBtb3JlLlxuICpcbiAqIERlcml2ZWQgYnkgdHJhY2luZyBldmVyeSBjYWxsIG1hZGUgd2l0aCB0aGF0IGtleSwgbm90IGJ5IGd1ZXNzaW5nOlxuICogIC0gYHBpcGVsaW5lczpyZWFkYCDigJQgdGhlIENvZGVCdWlsZCBzeW50aCAoYW5kIGBwaXBlbGluZSBkZXBsb3kgLS1zdG9yZS10b2tlbnNgKVxuICogICAgZmV0Y2hpbmcgdGhlIHBpcGVsaW5lIGl0IGJ1aWxkcyAoYEdFVCAvcGlwZWxpbmVzLzppZGApO1xuICogIC0gYHBsdWdpbnM6cmVhZGAgICDigJQgcGx1Z2luIHJlc29sdXRpb24gYXQgc3ludGgvZGVwbG95IGFuZCBpbiB0aGUgcGx1Z2luLWxvb2t1cFxuICogICAgTGFtYmRhIChgUE9TVCAvcGx1Z2lucy9sb29rdXBgKSwgYW5kIHRoZSBydW4tdGltZSB2dWxuZXJhYmlsaXR5IGNoZWNrIHN0ZXBcbiAqICAgIChgUE9TVCAvcGx1Z2lucy9ydW50aW1lLWNoZWNrYCkuXG4gKlxuICogV2hhdCBpdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgY2FycnksIGFuZCB3aGVyZSB0aGF0IHdvcmsgd2VudDpcbiAqICAtIHJlZ2lzdHJ5IHdyaXRlcyAoYHBpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlYCkg4oCUIHRoZSBzeW50aCByZWdpc3RlcnMgaXRzIHN0ZXBcbiAqICAgIG1hbmlmZXN0IHdpdGggdGhlIHNlcGFyYXRlIGBwaXBlbGluZS1yZWdpc3RlcmAga2V5IChQaXBlbGluZSBSZWdpc3RyYXRpb24pO1xuICogIC0gaW1hZ2UgcHVzaGVzIGFuZCBwdWxscyDigJQgQ29kZUJ1aWxkIGF1dGhlbnRpY2F0ZXMgdG8gdGhlIGltYWdlIHJlZ2lzdHJ5IHdpdGhcbiAqICAgIHRoZSBgcmVnaXN0cnktcHVzaGAgc2NvcGVkIGtleSwgbmV2ZXIgdGhpcyBvbmU7XG4gKiAgLSByZXBvcnRpbmcgd3JpdGVzIOKAlCB0aGUgZXZlbnRzIExhbWJkYSBhbmQgc3RlcCByZXBvcnQgdXBsb2FkcyB1c2UgdGhlXG4gKiAgICBgcmVwb3J0aW5nOmluZ2VzdGAgc2NvcGVkIGtleS5cbiAqXG4gKiBJdCB1c2VkIHRvIGJlIHRoZSBvcmcgQURNSU4gUm9sZSwgc28gYSBsZWFrZWQgc3ludGggY3JlZGVudGlhbCBjb3VsZCByZXdyaXRlXG4gKiBldmVyeSBwaXBlbGluZSwgUm9sZSBhbmQgbWVtYmVyIG9mIHRoZSBvcmcuXG4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9BVVRPTUFUSU9OX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsXG4gICdwbHVnaW5zOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUGlwZWxpbmUgUmVnaXN0cmF0aW9uXCIgUm9sZSwgaGVsZCBieSB0aGVcbiAqIGBwaXBlbGluZS1yZWdpc3RlcmAgc2VydmljZSBhY2NvdW50OiBgUE9TVGAvYERFTEVURSAvcGlwZWxpbmVzL3JlZ2lzdHJ5YCBmb3JcbiAqIGl0cyBvd24gb3JnIGFuZCBub3RoaW5nIGVsc2Ug4oCUIG5vdCBldmVuIGEgcmVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLFxuXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlc29sdXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmVzb2x2ZSBhIHVzZXIncyBlZmZlY3RpdmUgb3JnIHBlcm1pc3Npb25zIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0uXG4gKlxuICogU2luZ2xlLXNvdXJjZSBtb2RlbDogYSB1c2VyJ3MgYWJpbGl0aWVzIGFyZSBFWEFDVExZIHRoZSB1bmlvbiBvZiB0aGVcbiAqIHBlcm1pc3Npb25zIGNhcnJpZWQgYnkgdGhlIFJvbGVzIHRoZXkgaG9sZCAoYSBSb2xlID0gYSBuYW1lZCBwZXJtaXNzaW9uIHNldDtcbiAqIGJ1aWx0LWluIFJvbGVzIGNhcnJ5IHRoZWlyIGJ1bmRsZSBleHBsaWNpdGx5LCBzZWVkZWQgZnJvbVxuICoge0BsaW5rIFJPTEVfUEVSTUlTU0lPTlN9KS4gVGhlcmUgaXMgbm8gc2VwYXJhdGUgcm9sZS1kZXJpdmVkIGJhc2VsaW5lIOKAlCB0aGVcbiAqIGNvYXJzZSBgcm9sZWAgbGFiZWwgZ3JhbnRzIG5vdGhpbmcgb24gaXRzIG93bi5cbiAqXG4gKiAxLiBQbGF0Zm9ybSBzdXBlcmFkbWlucyAoYGlzU3VwZXJBZG1pbmApIGFsd2F5cyBnZXQgQUxMIHBlcm1pc3Npb25zLlxuICogMi4gT3RoZXJ3aXNlLCB1bmlvbiBldmVyeSBwZXJtaXNzaW9uIGdyYW50ZWQgYnkgdGhlIHVzZXIncyBhc3NpZ25lZCBSb2xlcy5cbiAqIDMuIEludmFsaWQvdW5rbm93biBwZXJtaXNzaW9uIHN0cmluZ3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIGFzc2lnbmVkUGVybWlzc2lvbnMgLSBGbGF0dGVuZWQgcGVybWlzc2lvbnMgZnJvbSBldmVyeSBSb2xlIHRoZSB1c2VyIGhvbGRzXG4gKiBAcGFyYW0gaXNTdXBlckFkbWluIC0gV2hldGhlciB0aGUgdXNlciBoYXMgdGhlIGdsb2JhbCBzdXBlci1hZG1pbiBmbGFnXG4gKiBAcmV0dXJucyBFZmZlY3RpdmUgcGVybWlzc2lvbnMgaW4gY2Fub25pY2FsIG9yZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlclBlcm1pc3Npb25zKFxuICBhc3NpZ25lZFBlcm1pc3Npb25zPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsLFxuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuLFxuKTogUGVybWlzc2lvbltdIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIFsuLi5BTExfUEVSTUlTU0lPTlNdO1xuXG4gIGNvbnN0IHBlcm1zID0gbmV3IFNldDxQZXJtaXNzaW9uPigpO1xuICBpZiAoYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3QgcCBvZiBhc3NpZ25lZFBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAoaXNWYWxpZFBlcm1pc3Npb24ocCkpIHBlcm1zLmFkZChwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIocCA9PiBwZXJtcy5oYXMocCkpO1xufVxuXG4vKipcbiAqIENvbmZpbmUgYSByZXNvbHZlZCBwZXJtaXNzaW9uIGxpc3QgdG8gd2hhdCBtYXkgYmUgaGVsZCBpbiB0aGUgdG9rZW4ncyBBQ1RJVkVcbiAqIG9yZzogb3V0c2lkZSB0aGUgc3lzdGVtIG9yZyBldmVyeSB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSBlbnRyeSBpc1xuICogZHJvcHBlZCAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIEFwcGxpZWQgYXQgdG9rZW4gaXNzdWUgb25cbiAqIHRvcCBvZiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30g4oCUIGluY2x1ZGluZyBhIHN1cGVyYWRtaW4ncyBpbXBsaWNpdC1hbGwg4oCUXG4gKiBzbyBhIHRva2VuIG1pbnRlZCBpbiBhIHRlbmFudCBvcmcgbmV2ZXIgQ0xBSU1TIGBwbHVnaW5zOm1vZGVyYXRlYCAvXG4gKiBgcHVibGlzaGVyczp2ZXJpZnlgLCBldmVuIGlmIGEgaGFuZC13cml0dGVuIFJvbGUgZG9jdW1lbnQgc29tZWhvdyBjYXJyaWVkXG4gKiB0aGVtIHRoZXJlLiAoU3VwZXJhZG1pbnMgc3RpbGwgcGFzcyBgaGFzUGVybWlzc2lvbmAgdmlhIHRoZSBmbGFnOyB0aGVcbiAqIGVjb3N5c3RlbSByb3V0ZSBnYXRlIGFkZGl0aW9uYWxseSByZXF1aXJlcyB0aGUgc3lzdGVtIG9yZywgc28gdGhhdCBieXBhc3NcbiAqIG5ldmVyIHJlYWNoZXMgYSBnb3Zlcm5hbmNlIHJvdXRlIGZyb20gYSB0ZW5hbnQgb3JnIGVpdGhlci4pXG4gKlxuICogVGFrZXMgYSBib29sZWFuIHJhdGhlciB0aGFuIGFuIG9yZyBpZCBzbyB0aGlzIG1vZHVsZSBzdGF5cyBkZXBlbmRlbmN5LWZyZWVcbiAqICh0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdCk7IGNhbGxlcnMgZGVjaWRlIHdpdGggYXBpLWNvcmUgYGlzU3lzdGVtT3JnSWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmluZVBlcm1pc3Npb25zVG9Pcmc8UCBleHRlbmRzIHN0cmluZz4oXG4gIHBlcm1pc3Npb25zOiByZWFkb25seSBQW10sXG4gIGFjdGl2ZU9yZ0lzU3lzdGVtT3JnOiBib29sZWFuLFxuKTogUFtdIHtcbiAgcmV0dXJuIGFjdGl2ZU9yZ0lzU3lzdGVtT3JnID8gWy4uLnBlcm1pc3Npb25zXSA6IHBlcm1pc3Npb25zLmZpbHRlcigocCkgPT4gIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocCkpO1xufVxuXG4vKiogV2hldGhlciBhIHJlc29sdmVkIHBlcm1pc3Npb24gbGlzdCBncmFudHMgYHBlcm1pc3Npb25gIChzdXBlcmFkbWluIOKHkiBhbHdheXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Blcm1pc3Npb24oXG4gIGdyYW50ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgcGVybWlzc2lvbjogUGVybWlzc2lvbixcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBpZiAoaXNTdXBlckFkbWluKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEhZ3JhbnRlZCAmJiBncmFudGVkLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXMsIGFzIGEgVEFCTEVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVGhlIG5hbWVkIHBlcm1pc3Npb24gYnVuZGxlcyBhIGJ1aWx0LWluIFJvbGUgbWF5IGNhcnJ5LCBhbmQgdGhlIFJvbGUgTkFNRSBlYWNoXG4gKiBvbmUgaXMgc2VlZGVkIHVuZGVyLiBPbmUgdGFibGUsIGJlY2F1c2UgdGhlIHRocmVlIGZhY3RzIGFib3V0IGEgam9iIFJvbGUg4oCUXG4gKiBpdHMgaWQsIGl0cyBwZXJtaXNzaW9ucyBhbmQgaXRzIGRpc3BsYXkgbmFtZSDigJQgd2VyZSBwcmV2aW91c2x5IHRocmVlXG4gKiBpbmRlcGVuZGVudCBsaXN0cyBpbiB0aHJlZSBwbGFjZXMsIGFuZCBub3RoaW5nIGhlbGQgdGhlbSB0b2dldGhlci5cbiAqXG4gKiBXSEFUIFdFTlQgV1JPTkcgV0lUSE9VVCBJVC4gVGhlIHBsYXRmb3JtIHJlc29sdmVkIGEgYnVuZGxlIHRocm91Z2ggYVxuICogbmluZS1icmFuY2ggYGlmYCBjaGFpbiB3aXRoIGEgZmFsbC10aHJvdWdoIHRvIHRoZSBjb2Fyc2UgYGdyYW50c1JvbGVgIGJ1bmRsZS5cbiAqIEV2ZXJ5IGpvYiBSb2xlIGdyYW50cyBgbWVtYmVyYCwgc28gYSBidW5kbGUgYWRkZWQgdG8gdGhlIGlkIGxpc3QgV0lUSE9VVCBpdHNcbiAqIGJyYW5jaCBkaWQgbm90IGZhaWwg4oCUIGl0IHNpbGVudGx5IHNlZWRlZCB0aGUgcGxhaW4gTWVtYmVyIGJ1bmRsZSwgYW5kIHRoZVxuICogc3RhcnR1cCBiYWNrZmlsbCB0aGVuIHJlLXN5bmNlZCBpdCB0byB0aGF0IHdyb25nIHZhbHVlIG9uIGV2ZXJ5IGJvb3QuIFRoZVxuICogUm9sZSBleGlzdGVkLCB3YXMgYXNzaWduYWJsZSBmcm9tIHRoZSBzdGFmZmluZyBwYW5lbCwgYW5kIGdyYW50ZWQgZmlmdGVlblxuICogdGVuYW50IHBlcm1pc3Npb25zIGluc3RlYWQgb2YgaXRzIGpvYi4gTm90aGluZyBhbnl3aGVyZSBleGVyY2lzZWQgdGhlXG4gKiByZXNvbHZlciBwZXIgYnVuZGxlLlxuICpcbiAqIEtleWVkIGFjY2VzcyBwbHVzIGBzYXRpc2ZpZXNgIG1ha2VzIGEgbWlzc2luZyBlbnRyeSBhIENPTVBJTEUgZXJyb3IsIGFuZCBhblxuICogZXh0cmEgb25lIHRvbyDigJQgaW4gYm90aCBkaXJlY3Rpb25zLCB3aXRoIG5vIHJ1bnRpbWUgY2hlY2sgdG8gZm9yZ2V0LlxuICpcbiAqIFRoZSBOQU1FIGxpdmVzIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbi4gVGhlIHBsYXRmb3JtIHNlZWRlZCBuYW1lcyBmcm9tIGl0c1xuICogb3duIGNvbnN0YW50cyB3aGlsZSB0aGUgZnJvbnRlbmQncyBzdGFmZmluZyByb3N0ZXIgaGFyZC1jb2RlZCBpdHMgb3duIGNvcHksXG4gKiBlYWNoIHBpbm5lZCBieSBhIHRlc3QgYWdhaW5zdCBpdHNlbGYg4oCUIHNvIHJlbmFtaW5nIGEgUm9sZSBwYXNzZWQgYm90aCBzdWl0ZXNcbiAqIGFuZCB0aGUgcm9zdGVyIHNpbGVudGx5IHJlbmRlcmVkIFwiUm9sZSBub3QgZm91bmRcIiwgd2hpY2ggaXMgdGhlIGdyYW50IHBhdGggZm9yXG4gKiB0aGF0IFJvbGUncyBwZXJtaXNzaW9ucyBkaXNhcHBlYXJpbmcuIEJvdGggc2lkZXMgcmVhZCB0aGlzIG5vdy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFRURfQlVORExFUyA9IHtcbiAgZWNvc3lzdGVtX21hbmFnZXI6IHsgbmFtZTogJ0Vjb3N5c3RlbSBNYW5hZ2VyJywgcGVybWlzc2lvbnM6IEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TIH0sXG4gIHB1Ymxpc2hlcl92ZXJpZmllcjogeyBuYW1lOiAnUHVibGlzaGVyIFZlcmlmaWVyJywgcGVybWlzc2lvbnM6IFBVQkxJU0hFUl9WRVJJRklFUl9QRVJNSVNTSU9OUyB9LFxuICB0ZWFtX2xlYWQ6IHsgbmFtZTogJ1RlYW0gTGVhZCcsIHBlcm1pc3Npb25zOiBURUFNX0xFQURfUEVSTUlTU0lPTlMgfSxcbiAgcGxhdGZvcm1fb2JzZXJ2ZXI6IHsgbmFtZTogJ1BsYXRmb3JtIE9ic2VydmVyJywgcGVybWlzc2lvbnM6IFBMQVRGT1JNX09CU0VSVkVSX1BFUk1JU1NJT05TIH0sXG4gIHBsYXRmb3JtX29wZXJhdG9yOiB7IG5hbWU6ICdQbGF0Zm9ybSBPcGVyYXRvcicsIHBlcm1pc3Npb25zOiBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUyB9LFxuICBhY2NvdW50X21hbmFnZXI6IHsgbmFtZTogJ0FjY291bnQgTWFuYWdlcicsIHBlcm1pc3Npb25zOiBBQ0NPVU5UX01BTkFHRVJfUEVSTUlTU0lPTlMgfSxcbiAgY29uc29sZV9hZG1pbjogeyBuYW1lOiAnQ29uc29sZSBBZG1pbmlzdHJhdG9yJywgcGVybWlzc2lvbnM6IENPTlNPTEVfQURNSU5fUEVSTUlTU0lPTlMgfSxcbiAgc3VwcG9ydF9hZ2VudDogeyBuYW1lOiAnU3VwcG9ydCBBZ2VudCcsIHBlcm1pc3Npb25zOiBTVVBQT1JUX0FHRU5UX1BFUk1JU1NJT05TIH0sXG4gIHN1cHBvcnRfbGVhZDogeyBuYW1lOiAnU3VwcG9ydCBMZWFkJywgcGVybWlzc2lvbnM6IFNVUFBPUlRfTEVBRF9QRVJNSVNTSU9OUyB9LFxuICByZWdpc3RyeV9vcGVyYXRvcjogeyBuYW1lOiAnUmVnaXN0cnkgT3BlcmF0b3InLCBwZXJtaXNzaW9uczogUkVHSVNUUllfT1BFUkFUT1JfUEVSTUlTU0lPTlMgfSxcbiAgcGlwZWxpbmVfYXV0b21hdGlvbjogeyBuYW1lOiAnUGlwZWxpbmUgQXV0b21hdGlvbicsIHBlcm1pc3Npb25zOiBQSVBFTElORV9BVVRPTUFUSU9OX1BFUk1JU1NJT05TIH0sXG4gIHBpcGVsaW5lX3JlZ2lzdHJhdGlvbjogeyBuYW1lOiAnUGlwZWxpbmUgUmVnaXN0cmF0aW9uJywgcGVybWlzc2lvbnM6IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9QRVJNSVNTSU9OUyB9LFxufSBhcyBjb25zdDtcblxuLyoqIEV2ZXJ5IHNlZWQtYnVuZGxlIGlkLiBUaGUgcGxhdGZvcm0ncyBgUm9sZS5zZWVkQnVuZGxlYCBlbnVtIGlzIHRoaXMgbGlzdC4gKi9cbmV4cG9ydCBjb25zdCBTRUVEX0JVTkRMRV9JRFMgPSBPYmplY3Qua2V5cyhTRUVEX0JVTkRMRVMpIGFzIEFycmF5PGtleW9mIHR5cGVvZiBTRUVEX0JVTkRMRVM+O1xuZXhwb3J0IHR5cGUgU2VlZEJ1bmRsZUlkID0ga2V5b2YgdHlwZW9mIFNFRURfQlVORExFUztcblxuLyoqXG4gKiBUaGUgU1lTVEVNIE9SRydzIGpvYiBSb2xlcywgaW4gc3RhZmZpbmcgb3JkZXIg4oCUIHRoZSBzdWJzZXQgb2ZcbiAqIHtAbGluayBTRUVEX0JVTkRMRVN9IHNlZWRlZCB0aGVyZSwgd2hpY2ggaXMgZXZlcnkgYnVuZGxlIGV4Y2VwdCBgdGVhbV9sZWFkYFxuICogKGEgdGVuYW50IGpvYiwgYW5kIGEgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYSBzZWVkZWQgUm9sZSBzaW5jZSBpdCBzdG9wcGVkXG4gKiBiZWluZyBzdHJ1Y3R1cmFsKS5cbiAqXG4gKiBgZWNvc3lzdGVtX21hbmFnZXJgIElTIG9uZSBvZiB0aGVtOyBpdCBpcyBsaXN0ZWQgaGVyZSBldmVuIHRob3VnaCBpdHMgcm9zdGVyXG4gKiBsaXZlcyBvbiB0aGUgRWNvc3lzdGVtIGNvbnNvbGUgcmF0aGVyIHRoYW4gdGhlIHN0YWZmaW5nIHBhbmVsLCBiZWNhdXNlIHdoYXRcbiAqIHRoaXMgbGlzdCBhbnN3ZXJzIGlzIFwid2hpY2ggUm9sZXMgZG9lcyB0aGUgc3lzdGVtIG9yZyBzZWVkXCIsIG5vdCBcIndoaWNoIHBhbmVsXG4gKiByZW5kZXJzIHRoZW1cIi5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfSk9CX0JVTkRMRVM6IHJlYWRvbmx5IFNlZWRCdW5kbGVJZFtdID0gW1xuICAnZWNvc3lzdGVtX21hbmFnZXInLFxuICAncHVibGlzaGVyX3ZlcmlmaWVyJyxcbiAgJ3BsYXRmb3JtX29ic2VydmVyJyxcbiAgJ3BsYXRmb3JtX29wZXJhdG9yJyxcbiAgJ2FjY291bnRfbWFuYWdlcicsXG4gICdjb25zb2xlX2FkbWluJyxcbiAgJ3N1cHBvcnRfYWdlbnQnLFxuICAnc3VwcG9ydF9sZWFkJyxcbiAgJ3JlZ2lzdHJ5X29wZXJhdG9yJyxcbl07XG5cbi8qKlxuICogVGhlIE1BQ0hJTkUgUm9sZXMgZXZlcnkgb3JnIHNlZWRzIOKAlCB0aGUgc3Vic2V0IG9mIHtAbGluayBTRUVEX0JVTkRMRVN9IGhlbGQgYnlcbiAqIHRoZSBzZXJ2aWNlIGFjY291bnRzIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zLlxuICpcbiAqIFNlZWRlZCByYXRoZXIgdGhhbiBvZmZlcmVkIGFzIGEge0BsaW5rIFJPTEVfVEVNUExBVEVTfSBlbnRyeSwgdW5saWtlIHRoZVxuICogdGVuYW50IGpvYiBwcmVzZXRzLCBiZWNhdXNlIHRoZXkgYXJlIHN0cnVjdHVyYWw6IHRoZSBDTEkgZ3JhbnRzIG9uZSB0byB0aGVcbiAqIGFjY291bnQgaXQgY3JlYXRlcyBhbmQgdGhlIHN0YXJ0dXAgYmFja2ZpbGwgbW92ZXMgZXhpc3RpbmcgYWNjb3VudHMgb250byBpdCxcbiAqIGFuZCBib3RoIGhhdmUgdG8gZmluZCBpdCBpbiBFVkVSWSBvcmcgYnkgYSBzdGFibGUgaWRlbnRpdHkuIEEgdGVtcGxhdGUgbGVhdmVzXG4gKiBub3RoaW5nIHRvIGZpbmQgdW50aWwgc29tZWJvZHkgaW5zdGFudGlhdGVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FVVE9NQVRJT05fQlVORExFUzogcmVhZG9ubHkgU2VlZEJ1bmRsZUlkW10gPSBbXG4gICdwaXBlbGluZV9hdXRvbWF0aW9uJyxcbiAgJ3BpcGVsaW5lX3JlZ2lzdHJhdGlvbicsXG5dO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlIGFjY291bnRzIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zLCBrZXllZCBieVxuICogYWNjb3VudCBuYW1lLCBhbmQgdGhlIGJ1aWx0LWluIFJvbGUgZWFjaCBob2xkcyDigJQgYG51bGxgIGZvciBhbiBhY2NvdW50IHdob3NlXG4gKiBrZXkgY2FycmllcyBhIGNhcGFiaWxpdHkgU0NPUEUgKGEgYFRva2VuU2NvcGVgKSBhbmQgc28gbmVlZHMgbm8gUm9sZSBhdCBhbGwuXG4gKlxuICogT25lIHRhYmxlIGZvciB0aGUgQ0xJICh3aGljaCBSb2xlIHRvIGdyYW50IGEgTkVXIGFjY291bnQpIGFuZCB0aGUgcGxhdGZvcm0nc1xuICogc3RhcnR1cCBiYWNrZmlsbCAod2hpY2ggUm9sZSB0byBtb3ZlIGFuIEVYSVNUSU5HIGFjY291bnQgb250bywgb2ZmIHRoZSBvcmdcbiAqIGFkbWluIFJvbGUgdGhlc2UgYWNjb3VudHMgd2VyZSBvbmNlIGdpdmVuKS4gQSByZW5hbWUgaGVyZSBtb3ZlcyBib3RoLlxuICovXG5leHBvcnQgY29uc3QgQVVUT01BVElPTl9BQ0NPVU5UX0JVTkRMRVMgPSB7XG4gICdwbGF0Zm9ybS1hdXRvbWF0aW9uJzogJ3BpcGVsaW5lX2F1dG9tYXRpb24nLFxuICAncGlwZWxpbmUtcmVnaXN0ZXInOiAncGlwZWxpbmVfcmVnaXN0cmF0aW9uJyxcbiAgJ3JlcG9ydGluZy1pbmdlc3QnOiBudWxsLFxuICAncmVnaXN0cnktcHVzaCc6IG51bGwsXG59IGFzIGNvbnN0IHNhdGlzZmllcyBSZWNvcmQ8c3RyaW5nLCBTZWVkQnVuZGxlSWQgfCBudWxsPjtcbiJdfQ==