@cdklabs/cdk-appmod-catalog-blueprints 1.16.1 → 1.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/.jsii +963 -146
  2. package/lib/document-processing/adapter/queued-s3-adapter.js +39 -5
  3. package/lib/document-processing/agentic-document-processing.js +6 -4
  4. package/lib/document-processing/base-document-processing.js +16 -4
  5. package/lib/document-processing/bedrock-document-processing.d.ts +1 -0
  6. package/lib/document-processing/bedrock-document-processing.js +117 -70
  7. package/lib/document-processing/default-document-processing-config.js +3 -5
  8. package/lib/document-processing/index.d.ts +2 -0
  9. package/lib/document-processing/index.js +3 -1
  10. package/lib/document-processing/localstack-agentic-document-processing.d.ts +20 -0
  11. package/lib/document-processing/localstack-agentic-document-processing.js +99 -0
  12. package/lib/document-processing/localstack-bedrock-document-processing.d.ts +16 -0
  13. package/lib/document-processing/localstack-bedrock-document-processing.js +69 -0
  14. package/lib/document-processing/resources/cleanup/handler.py +16 -1
  15. package/lib/document-processing/resources/default-localstack-invoke/index.py +184 -0
  16. package/lib/document-processing/resources/default-localstack-invoke/provider_runtime.py +251 -0
  17. package/lib/document-processing/resources/default-localstack-invoke/requirements.txt +5 -0
  18. package/lib/document-processing/resources/default-sqs-consumer/index.py +17 -2
  19. package/lib/document-processing/resources/pdf-chunking/handler.py +16 -1
  20. package/lib/document-processing/tests/base-document-processing-nag.test.js +3 -1
  21. package/lib/document-processing/tests/base-document-processing-schema.test.js +6 -1
  22. package/lib/document-processing/tests/base-document-processing.test.js +12 -1
  23. package/lib/document-processing/tests/localstack-agentic-document-processing.test.d.ts +1 -0
  24. package/lib/document-processing/tests/localstack-agentic-document-processing.test.js +111 -0
  25. package/lib/document-processing/tests/localstack-document-processing.test.d.ts +1 -0
  26. package/lib/document-processing/tests/localstack-document-processing.test.js +149 -0
  27. package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +3 -1
  28. package/lib/document-processing/tests/queued-s3-adapter.test.js +3 -1
  29. package/lib/framework/agents/base-agent.js +31 -4
  30. package/lib/framework/agents/batch-agent.d.ts +1 -0
  31. package/lib/framework/agents/batch-agent.js +42 -7
  32. package/lib/framework/agents/default-agent-config.js +3 -5
  33. package/lib/framework/agents/index.d.ts +1 -0
  34. package/lib/framework/agents/index.js +2 -1
  35. package/lib/framework/agents/interactive-agent.js +115 -23
  36. package/lib/framework/agents/knowledge-base/base-knowledge-base.js +30 -4
  37. package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +81 -5
  38. package/lib/framework/agents/localstack-batch-agent.d.ts +15 -0
  39. package/lib/framework/agents/localstack-batch-agent.js +64 -0
  40. package/lib/framework/agents/resources/default-ollama-agent/batch.py +396 -0
  41. package/lib/framework/agents/resources/default-ollama-agent/models.py +7 -0
  42. package/lib/framework/agents/resources/default-ollama-agent/requirements.txt +9 -0
  43. package/lib/framework/agents/resources/default-ollama-agent/runtime_support.py +237 -0
  44. package/lib/framework/agents/resources/default-ollama-agent/utils.py +77 -0
  45. package/lib/framework/agents/tests/agent-knowledge-base-nag.test.js +35 -2
  46. package/lib/framework/bedrock/bedrock.d.ts +9 -0
  47. package/lib/framework/bedrock/bedrock.js +20 -12
  48. package/lib/framework/custom-resource/default-runtimes.js +20 -22
  49. package/lib/framework/foundation/access-log.js +50 -7
  50. package/lib/framework/foundation/eventbridge-broker.js +5 -4
  51. package/lib/framework/foundation/network.js +4 -4
  52. package/lib/framework/index.d.ts +1 -0
  53. package/lib/framework/index.js +2 -1
  54. package/lib/framework/localstack/index.d.ts +1 -0
  55. package/lib/framework/localstack/index.js +18 -0
  56. package/lib/framework/localstack/localstack-config.d.ts +79 -0
  57. package/lib/framework/localstack/localstack-config.js +47 -0
  58. package/lib/framework/tests/base-agent-knowledge-base.test.js +35 -2
  59. package/lib/framework/tests/batch-agent.test.js +35 -2
  60. package/lib/framework/tests/framework-nag.test.js +35 -2
  61. package/lib/framework/tests/interactive-agent-nag.test.js +35 -2
  62. package/lib/framework/tests/interactive-agent.test.js +35 -2
  63. package/lib/framework/tests/localstack-batch-agent.test.d.ts +1 -0
  64. package/lib/framework/tests/localstack-batch-agent.test.js +100 -0
  65. package/lib/utilities/data-loader.js +50 -5
  66. package/lib/utilities/lambda-iam-utils.js +38 -7
  67. package/lib/utilities/lambda_layers/data-masking/layer-construct.js +40 -3
  68. package/lib/utilities/observability/bedrock-observability.js +38 -2
  69. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +3 -4
  70. package/lib/utilities/observability/cloudwatch-transaction-search.js +36 -5
  71. package/lib/utilities/observability/default-observability-config.js +6 -8
  72. package/lib/utilities/observability/lambda-observability-property-injector.js +4 -4
  73. package/lib/utilities/observability/log-group-data-protection-utils.js +2 -4
  74. package/lib/utilities/observability/observability.js +47 -6
  75. package/lib/utilities/observability/powertools-config.js +2 -4
  76. package/lib/utilities/observability/state-machine-observability-property-injector.js +4 -4
  77. package/lib/webapp/frontend-construct.js +46 -5
  78. package/lib/webapp/tests/frontend-construct-nag.test.js +36 -3
  79. package/lib/webapp/tests/frontend-construct.test.js +36 -3
  80. package/package.json +60 -61
  81. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,251 @@
1
+ import json
2
+ import logging
3
+ import os
4
+ import re
5
+ from typing import Any, Dict, Optional
6
+ from urllib import error as urllib_error
7
+ from urllib import request as urllib_request
8
+
9
+ import boto3
10
+
11
+ MODEL_PROVIDER_BEDROCK = 'bedrock'
12
+ MODEL_PROVIDER_OLLAMA = 'ollama'
13
+ DEFAULT_MODEL_PROVIDER = MODEL_PROVIDER_BEDROCK
14
+ DEFAULT_OLLAMA_BASE_URL = 'http://host.docker.internal:11434'
15
+ OLLAMA_CHAT_PATH = '/api/chat'
16
+
17
+ JSON_CODE_BLOCK_PATTERN = re.compile(r'```(?:json)?\s*({.*?})\s*```', re.DOTALL)
18
+ JSON_OBJECT_PATTERN = re.compile(r'({[^{}]*(?:{[^{}]*}[^{}]*)*})', re.DOTALL)
19
+ MAX_OLLAMA_DOCUMENT_CONTEXT_CHARS = 12000
20
+ MAX_DEBUG_PAYLOAD_CHARS = int(os.getenv('DEBUG_OLLAMA_MAX_CHARS', '4000'))
21
+
22
+
23
+ def _resolve_endpoint_url(*service_env_keys: str) -> Optional[str]:
24
+ for key in service_env_keys:
25
+ endpoint = os.getenv(key)
26
+ if endpoint:
27
+ return endpoint
28
+ return None
29
+
30
+
31
+ def create_boto3_client(service_name: str, *service_env_keys: str):
32
+ endpoint_url = _resolve_endpoint_url(*service_env_keys, 'AWS_ENDPOINT_URL')
33
+ if endpoint_url:
34
+ return boto3.client(service_name, endpoint_url=endpoint_url)
35
+ return boto3.client(service_name)
36
+
37
+
38
+ def _is_truthy_env(var_name: str) -> bool:
39
+ return os.getenv(var_name, '').strip().lower() in {'1', 'true', 'yes', 'on'}
40
+
41
+
42
+ def _debug_ollama_enabled() -> bool:
43
+ return _is_truthy_env('DEBUG_OLLAMA_PAYLOAD')
44
+
45
+
46
+ def _truncate_for_debug(text: str, max_chars: int = MAX_DEBUG_PAYLOAD_CHARS) -> str:
47
+ if len(text) <= max_chars:
48
+ return text
49
+ return f'{text[:max_chars]}...[truncated]'
50
+
51
+
52
+ def resolve_model_provider() -> str:
53
+ provider = os.getenv('MODEL_PROVIDER', DEFAULT_MODEL_PROVIDER).strip().lower()
54
+ if provider in {MODEL_PROVIDER_BEDROCK, MODEL_PROVIDER_OLLAMA}:
55
+ return provider
56
+ return DEFAULT_MODEL_PROVIDER
57
+
58
+
59
+ def _resolve_ollama_model_id(model_id: str) -> str:
60
+ explicit_model = os.getenv('OLLAMA_MODEL_ID')
61
+ if explicit_model:
62
+ return explicit_model
63
+ if model_id.startswith('ollama.'):
64
+ return model_id.split('ollama.', 1)[1]
65
+ if model_id.startswith('ollama/'):
66
+ return model_id.split('ollama/', 1)[1]
67
+ return model_id
68
+
69
+
70
+ def _extract_json_object(response_text: str) -> Optional[Dict[str, Any]]:
71
+ text = response_text.strip()
72
+ if not text:
73
+ return None
74
+
75
+ try:
76
+ parsed = json.loads(text)
77
+ if isinstance(parsed, dict):
78
+ return parsed
79
+ except json.JSONDecodeError:
80
+ pass
81
+
82
+ candidates: list[tuple[Dict[str, Any], int]] = []
83
+
84
+ for json_code_block in JSON_CODE_BLOCK_PATTERN.finditer(response_text):
85
+ try:
86
+ parsed = json.loads(json_code_block.group(1))
87
+ if isinstance(parsed, dict):
88
+ candidates.append((parsed, json_code_block.end()))
89
+ except json.JSONDecodeError:
90
+ pass
91
+
92
+ for raw_json in JSON_OBJECT_PATTERN.finditer(response_text):
93
+ try:
94
+ parsed = json.loads(raw_json.group(1))
95
+ if isinstance(parsed, dict):
96
+ candidates.append((parsed, raw_json.end()))
97
+ except json.JSONDecodeError:
98
+ pass
99
+
100
+ if candidates:
101
+ return max(candidates, key=lambda candidate: candidate[1])[0]
102
+
103
+ return None
104
+
105
+
106
+ def normalize_model_response(response_text: str, invoke_type: str) -> Dict[str, Any]:
107
+ parsed = _extract_json_object(response_text)
108
+ if parsed is None:
109
+ if invoke_type == 'classification':
110
+ return {'documentClassification': 'UNKNOWN'}
111
+ return {'raw_response': response_text}
112
+
113
+ if invoke_type == 'classification' and 'documentClassification' not in parsed:
114
+ classification = parsed.get('classification') or parsed.get('document_type') or parsed.get('type')
115
+ parsed['documentClassification'] = classification or 'UNKNOWN'
116
+
117
+ return parsed
118
+
119
+
120
+ def _build_ollama_prompt(content: list[Dict[str, Any]]) -> str:
121
+ prompt_parts = []
122
+ for item in content:
123
+ item_type = item.get('type')
124
+ if item_type == 'text':
125
+ prompt_parts.append(item.get('text', ''))
126
+ continue
127
+
128
+ if item_type in {'document', 'image'}:
129
+ source = item.get('source', {})
130
+ media_type = source.get('media_type', 'application/octet-stream')
131
+ prompt_parts.append(
132
+ f"[Attached {item_type} with media type '{media_type}' omitted in direct Ollama mode.]",
133
+ )
134
+
135
+ return '\n\n'.join(part for part in prompt_parts if part)
136
+
137
+
138
+ def extract_pdf_text_for_ollama(local_path: str) -> str:
139
+ """Extract text from a PDF file for direct Ollama prompt mode."""
140
+ try:
141
+ from PyPDF2 import PdfReader
142
+ except ImportError:
143
+ return ''
144
+
145
+ text_parts: list[str] = []
146
+ try:
147
+ reader = PdfReader(local_path)
148
+ for page in reader.pages:
149
+ page_text = page.extract_text() or ''
150
+ if page_text:
151
+ text_parts.append(page_text.strip())
152
+ if sum(len(part) for part in text_parts) >= MAX_OLLAMA_DOCUMENT_CONTEXT_CHARS:
153
+ break
154
+ except Exception:
155
+ return ''
156
+
157
+ joined = '\n\n'.join(part for part in text_parts if part)
158
+ if len(joined) > MAX_OLLAMA_DOCUMENT_CONTEXT_CHARS:
159
+ return f'{joined[:MAX_OLLAMA_DOCUMENT_CONTEXT_CHARS]}\n\n[Document text truncated]'
160
+ return joined
161
+
162
+
163
+ def _invoke_bedrock_model(content: list[Dict[str, Any]], max_tokens: int, model_id: str, bedrock_client) -> str:
164
+ response = bedrock_client.invoke_model(
165
+ modelId=model_id,
166
+ body=json.dumps({
167
+ 'anthropic_version': 'bedrock-2023-05-31',
168
+ 'max_tokens': max_tokens,
169
+ 'messages': [{'role': 'user', 'content': content}],
170
+ }),
171
+ )
172
+ response_payload = response['body'].read()
173
+ parsed_response = json.loads(response_payload)
174
+ return parsed_response['content'][0]['text']
175
+
176
+
177
+ def _invoke_ollama_model(content: list[Dict[str, Any]], max_tokens: int, model_id: str, logger: logging.Logger) -> str:
178
+ ollama_base_url = os.getenv('OLLAMA_BASE_URL', DEFAULT_OLLAMA_BASE_URL).rstrip('/')
179
+ ollama_model_id = _resolve_ollama_model_id(model_id)
180
+ ollama_prompt = _build_ollama_prompt(content)
181
+ ollama_num_ctx = os.getenv('OLLAMA_NUM_CTX')
182
+
183
+ options: Dict[str, Any] = {
184
+ 'num_predict': max_tokens,
185
+ }
186
+ if ollama_num_ctx:
187
+ try:
188
+ options['num_ctx'] = int(ollama_num_ctx)
189
+ except ValueError:
190
+ logger.warning('Ignoring invalid OLLAMA_NUM_CTX value: %s', ollama_num_ctx)
191
+
192
+ request_payload: Dict[str, Any] = {
193
+ 'model': ollama_model_id,
194
+ 'messages': [{'role': 'user', 'content': ollama_prompt}],
195
+ 'stream': False,
196
+ 'options': options,
197
+ }
198
+ request_body = json.dumps(request_payload).encode('utf-8')
199
+
200
+ if _debug_ollama_enabled():
201
+ logger.info(
202
+ 'Ollama request debug: model=%s base_url=%s prompt_len=%s request=%s',
203
+ ollama_model_id,
204
+ ollama_base_url,
205
+ len(ollama_prompt),
206
+ _truncate_for_debug(json.dumps(request_payload)),
207
+ )
208
+
209
+ request = urllib_request.Request(
210
+ f'{ollama_base_url}{OLLAMA_CHAT_PATH}',
211
+ data=request_body,
212
+ headers={'Content-Type': 'application/json'},
213
+ method='POST',
214
+ )
215
+
216
+ try:
217
+ with urllib_request.urlopen(request, timeout=120) as response:
218
+ raw_payload = response.read().decode('utf-8')
219
+ except urllib_error.HTTPError as error:
220
+ error_payload = error.read().decode('utf-8', errors='replace')
221
+ raise RuntimeError(f'Ollama HTTP error {error.code}: {error_payload}') from error
222
+ except urllib_error.URLError as error:
223
+ raise RuntimeError(f'Failed to connect to Ollama endpoint: {error}') from error
224
+
225
+ if _debug_ollama_enabled():
226
+ logger.info(
227
+ 'Ollama raw response debug: %s',
228
+ _truncate_for_debug(raw_payload),
229
+ )
230
+
231
+ payload = json.loads(raw_payload)
232
+ message = payload.get('message', {})
233
+ if isinstance(message, dict) and isinstance(message.get('content'), str):
234
+ return message['content']
235
+
236
+ if isinstance(payload.get('response'), str):
237
+ return payload['response']
238
+
239
+ raise RuntimeError(f'Unexpected Ollama response format: {payload}')
240
+
241
+
242
+ def invoke_model(
243
+ content: list[Dict[str, Any]],
244
+ max_tokens: int,
245
+ model_id: str,
246
+ bedrock_client,
247
+ logger: logging.Logger,
248
+ ) -> str:
249
+ if resolve_model_provider() == MODEL_PROVIDER_OLLAMA:
250
+ return _invoke_ollama_model(content, max_tokens, model_id, logger)
251
+ return _invoke_bedrock_model(content, max_tokens, model_id, bedrock_client)
@@ -0,0 +1,5 @@
1
+ boto3>=1.26.0
2
+ aws-lambda-powertools
3
+ urllib3>=1.26.0,<2.0.0
4
+ aws-xray-sdk
5
+ PyPDF2>=3.0.0
@@ -7,7 +7,22 @@ import re
7
7
  from aws_lambda_powertools import Metrics, Tracer
8
8
  from aws_lambda_powertools.metrics import MetricUnit
9
9
 
10
- sfn_client = boto3.client('stepfunctions')
10
+ def _resolve_endpoint_url(*service_env_keys):
11
+ for key in service_env_keys:
12
+ endpoint = os.getenv(key)
13
+ if endpoint:
14
+ return endpoint
15
+ return None
16
+
17
+
18
+ def _create_boto3_client(service_name, *service_env_keys):
19
+ endpoint_url = _resolve_endpoint_url(*service_env_keys, 'AWS_ENDPOINT_URL')
20
+ if endpoint_url:
21
+ return boto3.client(service_name, endpoint_url=endpoint_url)
22
+ return boto3.client(service_name)
23
+
24
+
25
+ sfn_client = _create_boto3_client('stepfunctions', 'AWS_ENDPOINT_URL_STEPFUNCTIONS')
11
26
  metrics = Metrics()
12
27
  tracer = Tracer()
13
28
 
@@ -113,4 +128,4 @@ def handler(event, context):
113
128
  'statusCode': 200,
114
129
  'processedCount': len(results),
115
130
  'results': results
116
- }
131
+ }
@@ -68,8 +68,23 @@ structured_logger = get_logger(__name__)
68
68
  logger = logging.getLogger()
69
69
  logger.setLevel(os.environ.get('LOG_LEVEL', 'INFO'))
70
70
 
71
+ def _resolve_endpoint_url(*service_env_keys: str) -> Optional[str]:
72
+ for key in service_env_keys:
73
+ endpoint = os.getenv(key)
74
+ if endpoint:
75
+ return endpoint
76
+ return None
77
+
78
+
79
+ def _create_boto3_client(service_name: str, *service_env_keys: str):
80
+ endpoint_url = _resolve_endpoint_url(*service_env_keys, 'AWS_ENDPOINT_URL')
81
+ if endpoint_url:
82
+ return boto3.client(service_name, endpoint_url=endpoint_url)
83
+ return boto3.client(service_name)
84
+
85
+
71
86
  # Initialize AWS clients
72
- s3_client = boto3.client('s3')
87
+ s3_client = _create_boto3_client('s3', 'AWS_ENDPOINT_URL_S3')
73
88
 
74
89
  # Get Powertools metrics instance
75
90
  metrics = get_metrics()
@@ -13,6 +13,8 @@ const adapter_1 = require("../adapter");
13
13
  const base_document_processing_1 = require("../base-document-processing");
14
14
  // Concrete test implementation of BaseDocumentProcessing for CDK Nag testing
15
15
  class TestDocumentProcessing extends base_document_processing_1.BaseDocumentProcessing {
16
+ classificationFn;
17
+ processingFn;
16
18
  constructor(scope, id, props) {
17
19
  super(scope, id, props);
18
20
  this.classificationFn = new aws_lambda_1.Function(this, 'ClassificationFn', {
@@ -165,4 +167,4 @@ test('No unsuppressed errors', () => {
165
167
  }
166
168
  expect(errors).toHaveLength(0);
167
169
  });
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQTZDO0FBQzdDLHVEQUE0RDtBQUM1RCx1REFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLGlGQUFtRTtBQUNuRSxxQ0FBOEQ7QUFDOUQsK0NBQTRDO0FBQzVDLHNGQUFrRjtBQUNsRiwyREFBMkQ7QUFDM0Qsd0NBQTZDO0FBQzdDLDBFQUFpRztBQUVqRyw2RUFBNkU7QUFDN0UsTUFBTSxzQkFBdUIsU0FBUSxpREFBc0I7SUFJekQsWUFBWSxLQUFVLEVBQUUsRUFBVSxFQUFFLEtBQVU7UUFDNUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDN0QsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMscUVBQXFFLENBQUM7U0FDN0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNyRCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxpREFBaUQsQ0FBQztTQUN6RSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sSUFBSSxzQ0FBWSxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNsRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQyxVQUFVLEVBQUUsd0JBQXdCO1NBQ3JDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxjQUFjO1FBQ3RCLE9BQU8sSUFBSSxzQ0FBWSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUM5QyxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDakMsVUFBVSxFQUFFLG9CQUFvQjtTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsY0FBYztRQUN0QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFUyxpQkFBaUI7UUFDekIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVTLHdCQUF3QjtRQUNoQyxPQUFPLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0Y7QUFFRCx1QkFBdUI7QUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBQSwwQkFBYSxHQUFFLENBQUM7QUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUU7SUFDeEMsR0FBRyxFQUFFO1FBQ0gsT0FBTyxFQUFFLGNBQWM7UUFDdkIsTUFBTSxFQUFFLFdBQVc7S0FDcEI7Q0FDRixDQUFDLENBQUM7QUFFSCwyQkFBMkI7QUFDM0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztBQUVwRCw2Q0FBNkM7QUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsS0FBSyxFQUFFLDhCQUE4QixFQUFFO0lBQy9ELHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxNQUFNO0lBQ3hDLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxZQUFZO0lBQzlDLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUMsQ0FBQztBQUVILDRCQUE0QjtBQUM1QixNQUFNLE1BQU0sR0FBRyxJQUFJLHNDQUFpQixDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUU7SUFDeEQsSUFBSSxFQUFFLGFBQWE7SUFDbkIsV0FBVyxFQUFFLGFBQWE7Q0FDM0IsQ0FBQyxDQUFDO0FBRUgsb0NBQW9DO0FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUkseUJBQWUsQ0FBQztJQUNsQyxNQUFNO0NBQ1AsQ0FBQyxDQUFDO0FBRUgsOENBQThDO0FBQzlDLE1BQU0sU0FBUyxHQUFHLElBQUksc0JBQXNCLENBQUMsS0FBSyxFQUFFLHdCQUF3QixFQUFFO0lBQzVFLGNBQWMsRUFBRSxPQUFPO0lBQ3ZCLGlCQUFpQixFQUFFLE1BQU07SUFDekIsbUJBQW1CLEVBQUUsSUFBSTtDQUMxQixDQUFDLENBQUM7QUFFSCwyQkFBMkI7QUFDM0IsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7QUFFL0IscUVBQXFFO0FBQ3JFLHlCQUFlLENBQUMsNkJBQTZCLENBQzNDLEtBQUssRUFDTCw0RUFBNEUsRUFDNUU7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLHFHQUFxRztRQUM3RyxTQUFTLEVBQUUsQ0FBQyx1RkFBdUYsQ0FBQztLQUNyRztDQUNGLENBQ0YsQ0FBQztBQUVGLDJEQUEyRDtBQUMzRCx5QkFBZSxDQUFDLHVCQUF1QixDQUNyQyxLQUFLLEVBQ0w7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLHVGQUF1RjtRQUMvRixTQUFTLEVBQUUsQ0FBQyx3REFBd0QsQ0FBQztLQUN0RTtDQUNGLEVBQ0QsSUFBSSxDQUNMLENBQUM7QUFFRixvRUFBb0U7QUFDcEUseUJBQWUsQ0FBQyx1QkFBdUIsQ0FDckMsS0FBSyxFQUNMO0lBQ0U7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLE1BQU0sRUFBRSw4RkFBOEY7S0FDdkc7Q0FDRixFQUNELElBQUksQ0FDTCxDQUFDO0FBRUYsdUVBQXVFO0FBQ3ZFLHlCQUFlLENBQUMsNkJBQTZCLENBQzNDLEtBQUssRUFDTCxrRUFBa0UsRUFDbEU7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLG9HQUFvRztLQUM3RztDQUNGLENBQ0YsQ0FBQztBQUVGLGlEQUFpRDtBQUNqRCx5QkFBZSxDQUFDLHVCQUF1QixDQUNyQyxLQUFLLEVBQ0w7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLGdHQUFnRztLQUN6RztDQUNGLEVBQ0QsSUFBSSxDQUNMLENBQUM7QUFFRix1Q0FBdUM7QUFDdkMseUJBQWUsQ0FBQyx1QkFBdUIsQ0FDckMsS0FBSyxFQUNMO0lBQ0U7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLE1BQU0sRUFBRSxvRUFBb0U7UUFDNUUsU0FBUyxFQUFFLENBQUMsdUZBQXVGLENBQUM7S0FDckc7Q0FDRixFQUNELElBQUksQ0FDTCxDQUFDO0FBRUYscURBQXFEO0FBQ3JELHlCQUFlLENBQUMsdUJBQXVCLENBQ3JDLEtBQUssRUFDTDtJQUNFO1FBQ0UsRUFBRSxFQUFFLGlCQUFpQjtRQUNyQixNQUFNLEVBQUUsbUVBQW1FO0tBQzVFO0NBQ0YsRUFDRCxJQUFJLENBQ0wsQ0FBQztBQUVGLG9EQUFvRDtBQUNwRCx5QkFBZSxDQUFDLHVCQUF1QixDQUNyQyxLQUFLLEVBQ0w7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLDRFQUE0RTtLQUNyRjtDQUNGLEVBQ0QsSUFBSSxDQUNMLENBQUM7QUFFRix1QkFBdUI7QUFDdkIscUJBQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksNEJBQWtCLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRS9ELHNFQUFzRTtBQUN0RSxNQUFNLFFBQVEsR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLGtCQUFLLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBQzFHLE1BQU0sTUFBTSxHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsa0JBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7QUFFdEcsaUNBQWlDO0FBQ2pDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDcEMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDLENBQUM7QUFFSCwrQkFBK0I7QUFDL0IsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrLCBBc3BlY3RzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMsIE1hdGNoIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IExhbWJkYUludm9rZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzJztcbmltcG9ydCB7IEF3c1NvbHV0aW9uc0NoZWNrcywgTmFnU3VwcHJlc3Npb25zIH0gZnJvbSAnY2RrLW5hZyc7XG5pbXBvcnQgeyBBY2Nlc3NMb2cgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgRXZlbnRicmlkZ2VCcm9rZXIgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvZm91bmRhdGlvbi9ldmVudGJyaWRnZS1icm9rZXInO1xuaW1wb3J0IHsgY3JlYXRlVGVzdEFwcCB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy90ZXN0LXV0aWxzJztcbmltcG9ydCB7IFF1ZXVlZFMzQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXInO1xuaW1wb3J0IHsgQmFzZURvY3VtZW50UHJvY2Vzc2luZywgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfSBmcm9tICcuLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG4vLyBDb25jcmV0ZSB0ZXN0IGltcGxlbWVudGF0aW9uIG9mIEJhc2VEb2N1bWVudFByb2Nlc3NpbmcgZm9yIENESyBOYWcgdGVzdGluZ1xuY2xhc3MgVGVzdERvY3VtZW50UHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGFueSwgaWQ6IHN0cmluZywgcHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrQ2xhc3NpZmljYXRpb24nLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jbGFzc2lmaWNhdGlvbkZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja1Byb2Nlc3NpbmcnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5wcm9jZXNzaW5nRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJvY2Vzc2luZ1dvcmtmbG93KCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU3RhdGVNYWNoaW5lKCkge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCd0ZXN0LXN0YXRlLW1hY2hpbmUnKTtcbiAgfVxufVxuXG4vLyBDcmVhdGUgYXBwIGFuZCBzdGFja1xuY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICBlbnY6IHtcbiAgICBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJyxcbiAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICB9LFxufSk7XG5cbi8vIENyZWF0ZSBhY2Nlc3MgbG9nIGJ1Y2tldFxuY29uc3QgYWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycpO1xuXG4vLyBDcmVhdGUgUzMgYnVja2V0IHdpdGggcHJvcGVyIGNvbmZpZ3VyYXRpb25cbmNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQoc3RhY2ssICdCYXNlRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0Jywge1xuICBzZXJ2ZXJBY2Nlc3NMb2dzQnVja2V0OiBhY2Nlc3NMb2cuYnVja2V0LFxuICBzZXJ2ZXJBY2Nlc3NMb2dzUHJlZml4OiBhY2Nlc3NMb2cuYnVja2V0UHJlZml4LFxuICBlbmZvcmNlU1NMOiB0cnVlLFxufSk7XG5cbi8vIENyZWF0ZSBFdmVudEJyaWRnZSBicm9rZXJcbmNvbnN0IGJyb2tlciA9IG5ldyBFdmVudGJyaWRnZUJyb2tlcihzdGFjaywgJ1Rlc3RCcm9rZXInLCB7XG4gIG5hbWU6ICd0ZXN0LWJyb2tlcicsXG4gIGV2ZW50U291cmNlOiAndGVzdC1zb3VyY2UnLFxufSk7XG5cbi8vIENyZWF0ZSBhZGFwdGVyIHdpdGggY3VzdG9tIGJ1Y2tldFxuY29uc3QgYWRhcHRlciA9IG5ldyBRdWV1ZWRTM0FkYXB0ZXIoe1xuICBidWNrZXQsXG59KTtcblxuLy8gQ3JlYXRlIHRoZSBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdFxuY29uc3QgY29uc3RydWN0ID0gbmV3IFRlc3REb2N1bWVudFByb2Nlc3Npbmcoc3RhY2ssICdCYXNlRG9jdW1lbnRQcm9jZXNzaW5nJywge1xuICBpbmdyZXNzQWRhcHRlcjogYWRhcHRlcixcbiAgZXZlbnRicmlkZ2VCcm9rZXI6IGJyb2tlcixcbiAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogdHJ1ZSxcbn0pO1xuXG4vLyBDcmVhdGUgdGhlIHN0YXRlIG1hY2hpbmVcbmNvbnN0cnVjdC5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuLy8gU3VwcHJlc3MgQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgQVdTIG1hbmFnZWQgcG9saWN5XG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnNCeVBhdGgoXG4gIHN0YWNrLFxuICAnL1Rlc3RTdGFjay9CdWNrZXROb3RpZmljYXRpb25zSGFuZGxlcjA1MGEwNTg3Yjc1NDQ1NDdiZjMyNWYwOTRhM2RiODM0L1JvbGUnLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICByZWFzb246ICdDREstbWFuYWdlZCBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciByZXF1aXJlcyBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUgZm9yIFMzIGV2ZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1BvbGljeTo6YXJuOjxBV1M6OlBhcnRpdGlvbj46aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnXSxcbiAgICB9LFxuICBdLFxuKTtcblxuLy8gU3VwcHJlc3MgUzMgYnVja2V0IHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgcm9sZXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBmdW5jdGlvbnMgcmVxdWlyZSB3aWxkY2FyZCBhY2Nlc3MgdG8gUzMgYnVja2V0IG9iamVjdHMgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjo8QmFzZURvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldEU4RTBGNkY1LkFybj4vKiddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTUVMgY29uc3VtZXIgTGFtYmRhIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBsb2cgc3RyZWFtc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnTGFtYmRhIGxvZyBzdHJlYW0gQVJOIGlzIG9ubHkga25vd24gYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTdGF0ZU1hY2hpbmVSb2xlIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgaW52b2NhdGlvblxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zQnlQYXRoKFxuICBzdGFjayxcbiAgJy9UZXN0U3RhY2svQmFzZURvY3VtZW50UHJvY2Vzc2luZy9TdGF0ZU1hY2hpbmVSb2xlL0RlZmF1bHRQb2xpY3knLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdTdGVwIEZ1bmN0aW9ucyByZXF1aXJlcyB3aWxkY2FyZCBwZXJtaXNzaW9ucyB0byBpbnZva2UgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHZlcnNpb24tc3BlY2lmaWMgQVJOcycsXG4gICAgfSxcbiAgXSxcbik7XG5cbi8vIFN1cHByZXNzIExhbWJkYSBsb2cgZ3JvdXAgd2lsZGNhcmQgcGVybWlzc2lvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIG5hbWVzIGFyZSBnZW5lcmF0ZWQgYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgYmFzaWMgZXhlY3V0aW9uIHJvbGVcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgIHJlYXNvbjogJ1Rlc3QgTGFtYmRhIGZ1bmN0aW9ucyB1c2UgQVdTIG1hbmFnZWQgcG9saWNpZXMgZm9yIGJhc2ljIGV4ZWN1dGlvbicsXG4gICAgICBhcHBsaWVzVG86IFsnUG9saWN5Ojphcm46PEFXUzo6UGFydGl0aW9uPjppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgcnVudGltZSB2ZXJzaW9uIGZvciB0ZXN0IGZ1bmN0aW9uc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUwxJyxcbiAgICAgIHJlYXNvbjogJ1Rlc3QgTGFtYmRhIGZ1bmN0aW9ucyB1c2UgTm9kZS5qcyAyMCB3aGljaCBpcyBhIHN1cHBvcnRlZCBydW50aW1lJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgS01TIGtleSByb3RhdGlvbiBmb3IgdGVzdCBlbmNyeXB0aW9uIGtleVxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUtNUzUnLFxuICAgICAgcmVhc29uOiAnS01TIGtleSByb3RhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gQmFzZURvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3QnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBBcHBseSBDREsgTmFnIGNoZWNrc1xuQXNwZWN0cy5vZihhcHApLmFkZChuZXcgQXdzU29sdXRpb25zQ2hlY2tzKHsgdmVyYm9zZTogdHJ1ZSB9KSk7XG5cbi8vIFN5bnRoZXNpemUgdGhlIHN0YWNrIGFuZCBjaGVjayBmb3IgdW5zdXBwcmVzc2VkIHdhcm5pbmdzIGFuZCBlcnJvcnNcbmNvbnN0IHdhcm5pbmdzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbmNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgd2FybmluZ3NcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCB3YXJuaW5ncycsICgpID0+IHtcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBXYXJuaW5nczonLCBKU09OLnN0cmluZ2lmeSh3YXJuaW5ncywgbnVsbCwgMikpO1xuICB9XG4gIGV4cGVjdCh3YXJuaW5ncykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG5cbi8vIFRlc3Q6IE5vIHVuc3VwcHJlc3NlZCBlcnJvcnNcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCBlcnJvcnMnLCAoKSA9PiB7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKCdDREsgTmFnIEVycm9yczonLCBKU09OLnN0cmluZ2lmeShlcnJvcnMsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG59KTtcbiJdfQ==
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQTZDO0FBQzdDLHVEQUE0RDtBQUM1RCx1REFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLGlGQUFtRTtBQUNuRSxxQ0FBOEQ7QUFDOUQsK0NBQTRDO0FBQzVDLHNGQUFrRjtBQUNsRiwyREFBMkQ7QUFDM0Qsd0NBQTZDO0FBQzdDLDBFQUFpRztBQUVqRyw2RUFBNkU7QUFDN0UsTUFBTSxzQkFBdUIsU0FBUSxpREFBc0I7SUFDakQsZ0JBQWdCLENBQVc7SUFDM0IsWUFBWSxDQUFXO0lBRS9CLFlBQVksS0FBVSxFQUFFLEVBQVUsRUFBRSxLQUFVO1FBQzVDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLHFFQUFxRSxDQUFDO1NBQzdGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDckQsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMsaURBQWlELENBQUM7U0FDekUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGtCQUFrQjtRQUMxQixPQUFPLElB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QyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxrQkFBSyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUMxRyxNQUFNLE1BQU0sR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLGtCQUFLLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBRXRHLGlDQUFpQztBQUNqQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ3BDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyxDQUFDO0FBRUgsK0JBQStCO0FBQy9CLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgQXNwZWN0cyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBNYXRjaCB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHsgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBMYW1iZGFJbnZva2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrcyc7XG5pbXBvcnQgeyBBd3NTb2x1dGlvbnNDaGVja3MsIE5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ2Nkay1uYWcnO1xuaW1wb3J0IHsgQWNjZXNzTG9nIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IEV2ZW50YnJpZGdlQnJva2VyIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2ZvdW5kYXRpb24vZXZlbnRicmlkZ2UtYnJva2VyJztcbmltcG9ydCB7IGNyZWF0ZVRlc3RBcHAgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBRdWV1ZWRTM0FkYXB0ZXIgfSBmcm9tICcuLi9hZGFwdGVyJztcbmltcG9ydCB7IEJhc2VEb2N1bWVudFByb2Nlc3NpbmcsIERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIH0gZnJvbSAnLi4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcblxuLy8gQ29uY3JldGUgdGVzdCBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIGZvciBDREsgTmFnIHRlc3RpbmdcbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmcgZXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIHtcbiAgcHJpdmF0ZSBjbGFzc2lmaWNhdGlvbkZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBwcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBhbnksIGlkOiBzdHJpbmcsIHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuY2xhc3NpZmljYXRpb25GbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnQ2xhc3NpZmljYXRpb25GbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IGRvY3VtZW50Q2xhc3NpZmljYXRpb246IFwiVEVTVFwiIH0pOycpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jZXNzaW5nRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ1Byb2Nlc3NpbmdGbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IHJlc3VsdDoge30gfSk7JyksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lJyk7XG4gIH1cbn1cblxuLy8gQ3JlYXRlIGFwcCBhbmQgc3RhY2tcbmNvbnN0IGFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbmNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycsIHtcbiAgZW52OiB7XG4gICAgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsXG4gICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgfSxcbn0pO1xuXG4vLyBDcmVhdGUgYWNjZXNzIGxvZyBidWNrZXRcbmNvbnN0IGFjY2Vzc0xvZyA9IG5ldyBBY2Nlc3NMb2coc3RhY2ssICdBY2Nlc3NMb2cnKTtcblxuLy8gQ3JlYXRlIFMzIGJ1Y2tldCB3aXRoIHByb3BlciBjb25maWd1cmF0aW9uXG5jb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHN0YWNrLCAnQmFzZURvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldCcsIHtcbiAgc2VydmVyQWNjZXNzTG9nc0J1Y2tldDogYWNjZXNzTG9nLmJ1Y2tldCxcbiAgc2VydmVyQWNjZXNzTG9nc1ByZWZpeDogYWNjZXNzTG9nLmJ1Y2tldFByZWZpeCxcbiAgZW5mb3JjZVNTTDogdHJ1ZSxcbn0pO1xuXG4vLyBDcmVhdGUgRXZlbnRCcmlkZ2UgYnJva2VyXG5jb25zdCBicm9rZXIgPSBuZXcgRXZlbnRicmlkZ2VCcm9rZXIoc3RhY2ssICdUZXN0QnJva2VyJywge1xuICBuYW1lOiAndGVzdC1icm9rZXInLFxuICBldmVudFNvdXJjZTogJ3Rlc3Qtc291cmNlJyxcbn0pO1xuXG4vLyBDcmVhdGUgYWRhcHRlciB3aXRoIGN1c3RvbSBidWNrZXRcbmNvbnN0IGFkYXB0ZXIgPSBuZXcgUXVldWVkUzNBZGFwdGVyKHtcbiAgYnVja2V0LFxufSk7XG5cbi8vIENyZWF0ZSB0aGUgQmFzZURvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3RcbmNvbnN0IGNvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnQmFzZURvY3VtZW50UHJvY2Vzc2luZycsIHtcbiAgaW5ncmVzc0FkYXB0ZXI6IGFkYXB0ZXIsXG4gIGV2ZW50YnJpZGdlQnJva2VyOiBicm9rZXIsXG4gIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRydWUsXG59KTtcblxuLy8gQ3JlYXRlIHRoZSBzdGF0ZSBtYWNoaW5lXG5jb25zdHJ1Y3QuY3JlYXRlU3RhdGVNYWNoaW5lKCk7XG5cbi8vIFN1cHByZXNzIENESy1tYW5hZ2VkIEJ1Y2tldE5vdGlmaWNhdGlvbnNIYW5kbGVyIEFXUyBtYW5hZ2VkIHBvbGljeVxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zQnlQYXRoKFxuICBzdGFjayxcbiAgJy9UZXN0U3RhY2svQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIwNTBhMDU4N2I3NTQ0NTQ3YmYzMjVmMDk0YTNkYjgzNC9Sb2xlJyxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLFxuICAgICAgcmVhc29uOiAnQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgcmVxdWlyZXMgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGZvciBTMyBldmVudCBwcm9jZXNzaW5nJyxcbiAgICAgIGFwcGxpZXNUbzogWydQb2xpY3k6OmFybjo8QVdTOjpQYXJ0aXRpb24+OmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJ10sXG4gICAgfSxcbiAgXSxcbik7XG5cbi8vIFN1cHByZXNzIFMzIGJ1Y2tldCB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIHJvbGVzXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgZnVuY3Rpb25zIHJlcXVpcmUgd2lsZGNhcmQgYWNjZXNzIHRvIFMzIGJ1Y2tldCBvYmplY3RzIGZvciBkb2N1bWVudCBwcm9jZXNzaW5nJyxcbiAgICAgIGFwcGxpZXNUbzogWydSZXNvdXJjZTo6PEJhc2VEb2N1bWVudFByb2Nlc3NpbmdCdWNrZXRFOEUwRjZGNS5Bcm4+LyonXSxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU1FTIGNvbnN1bWVyIExhbWJkYSB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgbG9nIHN0cmVhbXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIEFSTiBpcyBvbmx5IGtub3duIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU3RhdGVNYWNoaW5lUm9sZSB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIGludm9jYXRpb25cbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgc3RhY2ssXG4gICcvVGVzdFN0YWNrL0Jhc2VEb2N1bWVudFByb2Nlc3NpbmcvU3RhdGVNYWNoaW5lUm9sZS9EZWZhdWx0UG9saWN5JyxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnU3RlcCBGdW5jdGlvbnMgcmVxdWlyZXMgd2lsZGNhcmQgcGVybWlzc2lvbnMgdG8gaW52b2tlIExhbWJkYSBmdW5jdGlvbnMgd2l0aCB2ZXJzaW9uLXNwZWNpZmljIEFSTnMnLFxuICAgIH0sXG4gIF0sXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgbG9nIGdyb3VwIHdpbGRjYXJkIHBlcm1pc3Npb25zXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgbG9nIHN0cmVhbSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgTGFtYmRhIGJhc2ljIGV4ZWN1dGlvbiByb2xlXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICByZWFzb246ICdUZXN0IExhbWJkYSBmdW5jdGlvbnMgdXNlIEFXUyBtYW5hZ2VkIHBvbGljaWVzIGZvciBiYXNpYyBleGVjdXRpb24nLFxuICAgICAgYXBwbGllc1RvOiBbJ1BvbGljeTo6YXJuOjxBV1M6OlBhcnRpdGlvbj46aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnXSxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgTGFtYmRhIHJ1bnRpbWUgdmVyc2lvbiBmb3IgdGVzdCBmdW5jdGlvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1MMScsXG4gICAgICByZWFzb246ICdUZXN0IExhbWJkYSBmdW5jdGlvbnMgdXNlIE5vZGUuanMgMjAgd2hpY2ggaXMgYSBzdXBwb3J0ZWQgcnVudGltZScsXG4gICAgfSxcbiAgXSxcbiAgdHJ1ZSxcbik7XG5cbi8vIFN1cHByZXNzIEtNUyBrZXkgcm90YXRpb24gZm9yIHRlc3QgZW5jcnlwdGlvbiBrZXlcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1LTVM1JyxcbiAgICAgIHJlYXNvbjogJ0tNUyBrZXkgcm90YXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIEJhc2VEb2N1bWVudFByb2Nlc3NpbmcgY29uc3RydWN0JyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gQXBwbHkgQ0RLIE5hZyBjaGVja3NcbkFzcGVjdHMub2YoYXBwKS5hZGQobmV3IEF3c1NvbHV0aW9uc0NoZWNrcyh7IHZlcmJvc2U6IHRydWUgfSkpO1xuXG4vLyBTeW50aGVzaXplIHRoZSBzdGFjayBhbmQgY2hlY2sgZm9yIHVuc3VwcHJlc3NlZCB3YXJuaW5ncyBhbmQgZXJyb3JzXG5jb25zdCB3YXJuaW5ncyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZFdhcm5pbmcoJyonLCBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdBd3NTb2x1dGlvbnMtLionKSk7XG5jb25zdCBlcnJvcnMgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spLmZpbmRFcnJvcignKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcblxuLy8gVGVzdDogTm8gdW5zdXBwcmVzc2VkIHdhcm5pbmdzXG50ZXN0KCdObyB1bnN1cHByZXNzZWQgd2FybmluZ3MnLCAoKSA9PiB7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coJ0NESyBOYWcgV2FybmluZ3M6JywgSlNPTi5zdHJpbmdpZnkod2FybmluZ3MsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3Qod2FybmluZ3MpLnRvSGF2ZUxlbmd0aCgwKTtcbn0pO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgZXJyb3JzXG50ZXN0KCdObyB1bnN1cHByZXNzZWQgZXJyb3JzJywgKCkgPT4ge1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBFcnJvcnM6JywgSlNPTi5zdHJpbmdpZnkoZXJyb3JzLCBudWxsLCAyKSk7XG4gIH1cbiAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG4iXX0=
@@ -12,6 +12,8 @@ const base_document_processing_1 = require("../base-document-processing");
12
12
  * This simulates existing implementations that don't use any preprocessing
13
13
  */
14
14
  class TestDocumentProcessingWithoutPreprocessing extends base_document_processing_1.BaseDocumentProcessing {
15
+ classificationFn;
16
+ processingFn;
15
17
  constructor(scope, id, props) {
16
18
  super(scope, id, props);
17
19
  this.classificationFn = new aws_lambda_1.Function(this, 'ClassificationFn', {
@@ -61,6 +63,9 @@ class TestDocumentProcessingWithoutPreprocessing extends base_document_processin
61
63
  * (e.g., chunking metadata) without the base class knowing about them
62
64
  */
63
65
  class TestDocumentProcessingWithCustomMetadata extends base_document_processing_1.BaseDocumentProcessing {
66
+ preprocessingFn;
67
+ classificationFn;
68
+ processingFn;
64
69
  constructor(scope, id, props) {
65
70
  super(scope, id, props);
66
71
  this.preprocessingFn = new aws_lambda_1.Function(this, 'PreprocessingFn', {
@@ -334,4 +339,4 @@ describe('BaseDocumentProcessing - DynamoDB Schema Extension Mechanism', () => {
334
339
  });
335
340
  });
336
341
  });
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLXNjaGVtYS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLXNjaGVtYS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXlDO0FBQ3pDLHVEQUFrRDtBQUNsRCx1REFBaUU7QUFDakUscUVBQXlEO0FBQ3pELGlGQUF5RjtBQUN6RiwyREFBMkQ7QUFDM0QsMEVBQWlHO0FBRWpHOzs7R0FHRztBQUNILE1BQU0sMENBQTJDLFNBQVEsaURBQXNCO0lBSTdFLFlBQVksS0FBVSxFQUFFLEVBQVUsRUFBRSxLQUFVO1FBQzVDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLHFFQUFxRSxDQUFDO1NBQzdGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDckQsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMsaURBQWlELENBQUM7U0FDekUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGlCQUFpQjtRQUN6Qix5Q0FBeUM7UUFDekMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELGdFQUFnRTtJQUV0RCxrQkFBa0I7UUFDMUIsT0FBTyxJQUFJLHNDQUFZLENB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LENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FDdEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQzFELENBQUM7WUFFRixNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV6QyxvREFBb0Q7WUFDcEQsTUFBTSxVQUFVLEdBQUksa0JBQTBCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDbkYsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQ3BELElBQUksQ0FBQyxNQUFNLElBQUksQ0FDYixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxNQUFNLEtBQUsscUJBQXFCLENBQ3RDLENBQ0YsQ0FBQztZQUVGLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBKc29uUGF0aCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zJztcbmltcG9ydCB7IER5bmFtb0F0dHJpYnV0ZVZhbHVlLCBMYW1iZGFJbnZva2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrcyc7XG5pbXBvcnQgeyBjcmVhdGVUZXN0QXBwIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IHsgQmFzZURvY3VtZW50UHJvY2Vzc2luZywgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfSBmcm9tICcuLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG4vKipcbiAqIFRlc3QgaW1wbGVtZW50YXRpb24gV0lUSE9VVCBwcmVwcm9jZXNzaW5nIChiYWNrd2FyZCBjb21wYXRpYmxlKVxuICogVGhpcyBzaW11bGF0ZXMgZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QgdXNlIGFueSBwcmVwcm9jZXNzaW5nXG4gKi9cbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRob3V0UHJlcHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGFueSwgaWQ6IHN0cmluZywgcHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gTm8gcHJlcHJvY2Vzc2luZyAtIGJhY2t3YXJkIGNvbXBhdGlibGVcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gTm8gb3ZlcnJpZGUgb2YgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCkgLSB1c2VzIGRlZmF1bHQgKGVtcHR5KVxuXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrQ2xhc3NpZmljYXRpb24nLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jbGFzc2lmaWNhdGlvbkZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja1Byb2Nlc3NpbmcnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5wcm9jZXNzaW5nRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJvY2Vzc2luZ1dvcmtmbG93KCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU3RhdGVNYWNoaW5lKCkge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCd0ZXN0LXN0YXRlLW1hY2hpbmUtbm8tcHJlcHJvY2Vzc2luZycpO1xuICB9XG59XG5cbi8qKlxuICogVGVzdCBpbXBsZW1lbnRhdGlvbiBXSVRIIHByZXByb2Nlc3NpbmcgYW5kIGN1c3RvbSBtZXRhZGF0YVxuICogVGhpcyBzaW11bGF0ZXMgaW1wbGVtZW50YXRpb25zIHRoYXQgYWRkIHRoZWlyIG93biBwcmVwcm9jZXNzaW5nLXNwZWNpZmljIGZpZWxkc1xuICogKGUuZy4sIGNodW5raW5nIG1ldGFkYXRhKSB3aXRob3V0IHRoZSBiYXNlIGNsYXNzIGtub3dpbmcgYWJvdXQgdGhlbVxuICovXG5jbGFzcyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nV2l0aEN1c3RvbU1ldGFkYXRhIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB7XG4gIHByaXZhdGUgcHJlcHJvY2Vzc2luZ0ZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBjbGFzc2lmaWNhdGlvbkZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBwcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBhbnksIGlkOiBzdHJpbmcsIHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMucHJlcHJvY2Vzc2luZ0ZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdQcmVwcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICBjdXN0b21GaWVsZDE6ICd2YWx1ZTEnLFxuICAgICAgICAgIGN1c3RvbUZpZWxkMjogeyBuZXN0ZWQ6ICdkYXRhJyB9LFxuICAgICAgICAgIGN1c3RvbUZpZWxkMzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIGApLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcmVwcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJlcHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICAvLyBPdmVycmlkZSB0byBhZGQgY3VzdG9tIG1ldGFkYXRhIGZpZWxkc1xuICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtb0F0dHJpYnV0ZVZhbHVlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEN1c3RvbUZpZWxkMTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwcm9jZXNzaW5nUmVzdWx0LmN1c3RvbUZpZWxkMScpKSxcbiAgICAgIEN1c3RvbUZpZWxkMjogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdC5jdXN0b21GaWVsZDInKSkpLFxuICAgICAgQ3VzdG9tRmllbGQzOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5ib29sZWFuRnJvbUpzb25QYXRoKEpzb25QYXRoLnN0cmluZ0F0KCckLnByZXByb2Nlc3NpbmdSZXN1bHQuY3VzdG9tRmllbGQzJykpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLXdpdGgtY3VzdG9tLW1ldGFkYXRhJyk7XG4gIH1cbn1cblxuZGVzY3JpYmUoJ0Jhc2VEb2N1bWVudFByb2Nlc3NpbmcgLSBEeW5hbW9EQiBTY2hlbWEgRXh0ZW5zaW9uIE1lY2hhbmlzbScsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZzogU3RhY2s7XG4gIGxldCBzdGFja1dpdGhDdXN0b21NZXRhZGF0YTogU3RhY2s7XG4gIGxldCB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nOiBUZW1wbGF0ZTtcbiAgbGV0IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhOiBUZW1wbGF0ZTtcblxuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIC8vIFVzZSBjcmVhdGVUZXN0QXBwKCkgdG8gc2tpcCBidW5kbGluZyBhbmQgc3BlZWQgdXAgdGVzdHNcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG5cbiAgICAvLyBTdGFjayB3aXRob3V0IHByZXByb2Nlc3NpbmcgKGJhY2t3YXJkIGNvbXBhdGlibGUpXG4gICAgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZyA9IG5ldyBTdGFjayhhcHAsICdXaXRob3V0UHJlcHJvY2Vzc2luZ1N0YWNrJyk7XG4gICAgY29uc3QgY29uc3RydWN0V2l0aG91dFByZXByb2Nlc3NpbmcgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZ1dpdGhvdXRQcmVwcm9jZXNzaW5nKFxuICAgICAgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZyxcbiAgICAgICdUZXN0V2l0aG91dFByZXByb2Nlc3NpbmcnLFxuICAgICAge30sXG4gICAgKTtcbiAgICBjb25zdHJ1Y3RXaXRob3V0UHJlcHJvY2Vzc2luZy5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuICAgIC8vIFN0YWNrIHdpdGggY3VzdG9tIG1ldGFkYXRhXG4gICAgc3RhY2tXaXRoQ3VzdG9tTWV0YWRhdGEgPSBuZXcgU3RhY2soYXBwLCAnV2l0aEN1c3RvbU1ldGFkYXRhU3RhY2snKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RXaXRoQ3VzdG9tTWV0YWRhdGEgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZ1dpdGhDdXN0b21NZXRhZGF0YShcbiAgICAgIHN0YWNrV2l0aEN1c3RvbU1ldGFkYXRhLFxuICAgICAgJ1Rlc3RXaXRoQ3VzdG9tTWV0YWRhdGEnLFxuICAgICAge30sXG4gICAgKTtcbiAgICBjb25zdHJ1Y3RXaXRoQ3VzdG9tTWV0YWRhdGEuY3JlYXRlU3RhdGVNYWNoaW5lKCk7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZXNcbiAgICB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrV2l0aG91dFByZXByb2Nlc3NpbmcpO1xuICAgIHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrV2l0aEN1c3RvbU1ldGFkYXRhKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0JhY2t3YXJkIENvbXBhdGliaWxpdHkgLSBEb2N1bWVudHMgd2l0aG91dCBwcmVwcm9jZXNzaW5nJywgKCkgPT4ge1xuICAgIHRlc3QoJ0luaXRNZXRhZGF0YSBvbmx5IGluY2x1ZGVzIGJhc2UgZmllbGRzIHdoZW4gbm8gcHJlcHJvY2Vzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZXMgPSB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nLmZpbmRSZXNvdXJjZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJyk7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVLZXkgPSBPYmplY3Qua2V5cyhzdGF0ZU1hY2hpbmVzKVswXTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25TdHJpbmcgPSBzdGF0ZU1hY2hpbmVzW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgZGVmaW5pdGlvblxuICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IEpTT04ucGFyc2UoZGVmaW5pdGlvblN0cmluZ1snRm46OkpvaW4nXVsxXS5qb2luKCcnKSk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIEluaXRNZXRhZGF0YUVudHJ5IHN0YXRlIGJ5IG5hbWVcbiAgICAgIGNvbnN0IGluaXRNZXRhZGF0YVN0YXRlID0gZGVmaW5pdGlvbi5TdGF0ZXMuSW5pdE1ldGFkYXRhRW50cnk7XG5cbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5UeXBlKS50b0JlKCdUYXNrJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBiYXNlIGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Eb2N1bWVudElkKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Db250ZW50VHlwZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ29udGVudCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uV29ya2Zsb3dTdGF0dXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLlN0YXRlTWFjaGluZUV4ZWNJZCkudG9CZURlZmluZWQoKTtcblxuICAgICAgLy8gVmVyaWZ5IE5PIGN1c3RvbSBmaWVsZHMgYXJlIHByZXNlbnQgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkN1c3RvbUZpZWxkMSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5DdXN0b21GaWVsZDIpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ3VzdG9tRmllbGQzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3b3JrZmxvdyBzdGFydHMgd2l0aCBJbml0TWV0YWRhdGEgd2hlbiBubyBwcmVwcm9jZXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lcyA9IHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICAvLyBTaG91bGQgc3RhcnQgd2l0aCBJbml0TWV0YWRhdGEgd2hlbiBubyBwcmVwcm9jZXNzaW5nXG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGFydEF0KS50b01hdGNoKC9Jbml0TWV0YWRhdGEvKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0R5bmFtb0RCIHRhYmxlIHNjaGVtYSByZW1haW5zIHVuY2hhbmdlZCcsICgpID0+IHtcbiAgICAgIC8vIFZlcmlmeSB0YWJsZSBpcyBjcmVhdGVkIHdpdGggc2FtZSBzY2hlbWEgYXMgYmVmb3JlXG4gICAgICB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIEtleVNjaGVtYTogW3tcbiAgICAgICAgICBBdHRyaWJ1dGVOYW1lOiAnRG9jdW1lbnRJZCcsXG4gICAgICAgICAgS2V5VHlwZTogJ0hBU0gnLFxuICAgICAgICB9XSxcbiAgICAgICAgQmlsbGluZ01vZGU6ICdQQVlfUEVSX1JFUVVFU1QnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTY2hlbWEgRXh0ZW5zaW9uIE1lY2hhbmlzbSAtIEdlbmVyaWMgcHJlcHJvY2Vzc2luZyBtZXRhZGF0YScsICgpID0+IHtcbiAgICB0ZXN0KCdwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKSBob29rIGFsbG93cyBzdWJjbGFzc2VzIHRvIGV4dGVuZCBzY2hlbWEnLCAoKSA9PiB7XG4gICAgICAvLyBUaGUga2V5IGRlc2lnbiBwcmluY2lwbGU6IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHByZXByb2Nlc3NpbmdNZXRhZGF0YSgpXG4gICAgICAvLyB0byBhZGQgdGhlaXIgb3duIGZpZWxkcyB0byBJbml0TWV0YWRhdGEgd2l0aG91dCBiYXNlIGNsYXNzIGtub3dpbmcgdGhlIGRldGFpbHNcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBjb25zdHJ1Y3Qgd2l0aCBjdXN0b20gbWV0YWRhdGEgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICBleHBlY3Qoc3RhY2tXaXRoQ3VzdG9tTWV0YWRhdGEpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgYSBzdGF0ZSBtYWNoaW5lXG4gICAgICB0ZW1wbGF0ZVdpdGhDdXN0b21NZXRhZGF0YS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgdGhlIHNhbWUgRHluYW1vREIgdGFibGUgc3RydWN0dXJlIGFzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uXG4gICAgICB0ZW1wbGF0ZVdpdGhDdXN0b21NZXRhZGF0YS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dvcmtmbG93IGluY2x1ZGVzIHByZXByb2Nlc3Npbmcgc3RlcCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lcyA9IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmZpbmRSZXNvdXJjZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJyk7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVLZXkgPSBPYmplY3Qua2V5cyhzdGF0ZU1hY2hpbmVzKVswXTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25TdHJpbmcgPSBzdGF0ZU1hY2hpbmVzW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gVmVyaWZ5IEluaXRNZXRhZGF0YSBzdGVwIGV4aXN0cyAoY29yZSBmdW5jdGlvbmFsaXR5KVxuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5KS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBXaGVuIHByZXByb2Nlc3NpbmcgaXMgcHJvdmlkZWQsIGl0IHNob3VsZCBiZSBpbiB0aGUgd29ya2Zsb3dcbiAgICAgIC8vIFRoZSBleGFjdCBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgIGV4cGVjdChkZWZpbml0aW9uLlN0YXRlcykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhkZWZpbml0aW9uLlN0YXRlcykubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdJbml0TWV0YWRhdGEgY2FuIGFjY2VwdCBhZGRpdGlvbmFsIGZpZWxkcyB2aWEgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICBjb25zdCBpbml0TWV0YWRhdGFTdGF0ZSA9IGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5O1xuXG4gICAgICAvLyBWZXJpZnkgYmFzZSBmaWVsZHMgYXJlIGFsd2F5cyBwcmVzZW50XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkRvY3VtZW50SWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkNvbnRlbnRUeXBlKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Db250ZW50KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Xb3JrZmxvd1N0YXR1cykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uU3RhdGVNYWNoaW5lRXhlY0lkKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBUaGUgbWVjaGFuaXNtIGFsbG93cyBhZGRpbmcgY3VzdG9tIGZpZWxkcyAoaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHN1YmNsYXNzKVxuICAgICAgLy8gRHluYW1vREIncyBzY2hlbWFsZXNzIG5hdHVyZSBtZWFucyBhbnkgZmllbGRzIGNhbiBiZSBhZGRlZCBhdCBydW50aW1lXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTY2hlbWEgQ29tcGF0aWJpbGl0eScsICgpID0+IHtcbiAgICB0ZXN0KCdib3RoIGltcGxlbWVudGF0aW9ucyB1c2UgdGhlIHNhbWUgRHluYW1vREIgdGFibGUgc3RydWN0dXJlJywgKCkgPT4ge1xuICAgICAgLy8gQm90aCBzaG91bGQgY3JlYXRlIHRhYmxlcyB3aXRoIHNhbWUgcGFydGl0aW9uIGtleVxuICAgICAgdGVtcGxhdGVXaXRob3V0UHJlcHJvY2Vzc2luZy5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdib3RoIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgZW5jcnlwdGVkIHRhYmxlcycsICgpID0+IHtcbiAgICAgIHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2JvdGggaW1wbGVtZW50YXRpb25zIHVzZSBQQVlfUEVSX1JFUVVFU1QgYmlsbGluZycsICgpID0+IHtcbiAgICAgIHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgQmlsbGluZ01vZGU6ICdQQVlfUEVSX1JFUVVFU1QnLFxuICAgICAgfSk7XG5cbiAgICAgIHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIEJpbGxpbmdNb2RlOiAnUEFZX1BFUl9SRVFVRVNUJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVzaWduIFByaW5jaXBsZTogQmFzZSBjbGFzcyBoYXMgbm8ga25vd2xlZGdlIG9mIHByZXByb2Nlc3Npbmcgc3BlY2lmaWNzJywgKCkgPT4ge1xuICAgIHRlc3QoJ2Jhc2UgY2xhc3MgcHJvdmlkZXMgZ2VuZXJpYyBleHRlbnNpb24gbWVjaGFuaXNtIHZpYSBwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKScsICgpID0+IHtcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgZGVzaWduIHByaW5jaXBsZTpcbiAgICAgIC8vIC0gQmFzZSBjbGFzcyBkb2Vzbid0IGtub3cgYWJvdXQgY2h1bmtpbmcsIHZhbGlkYXRpb24sIG9yIGFueSBzcGVjaWZpYyBwcmVwcm9jZXNzaW5nXG4gICAgICAvLyAtIEJhc2UgY2xhc3Mgb25seSBwcm92aWRlcyBhIGhvb2sgKHByZXByb2Nlc3NpbmdNZXRhZGF0YSkgZm9yIHN1YmNsYXNzZXMgdG8gZXh0ZW5kXG4gICAgICAvLyAtIFN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciB0aGVpciBvd24gbWV0YWRhdGEgZmllbGRzXG5cbiAgICAgIC8vIFZlcmlmeSB0aGF0IHdpdGhvdXQgb3ZlcnJpZGluZyBwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKSwgd29ya2Zsb3cgd29ya3MgY29ycmVjdGx5XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRob3V0UHJlcHJvY2Vzc2luZy5maW5kUmVzb3VyY2VzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScpO1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lS2V5ID0gT2JqZWN0LmtleXMoc3RhdGVNYWNoaW5lcylbMF07XG4gICAgICBjb25zdCBkZWZpbml0aW9uU3RyaW5nID0gc3RhdGVNYWNoaW5lc1tzdGF0ZU1hY2hpbmVLZXldLlByb3BlcnRpZXMuRGVmaW5pdGlvblN0cmluZztcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICBjb25zdCBpbml0TWV0YWRhdGFTdGF0ZSA9IGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5O1xuXG4gICAgICAvLyBCYXNlIGZpZWxkcyBhcmUgYWx3YXlzIHByZXNlbnRcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uRG9jdW1lbnRJZCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ29udGVudFR5cGUpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkNvbnRlbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLldvcmtmbG93U3RhdHVzKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5TdGF0ZU1hY2hpbmVFeGVjSWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzdWJjbGFzc2VzIGNhbiBleHRlbmQgdmlhIHByZXByb2Nlc3NpbmdNZXRhZGF0YSgpIHdpdGhvdXQgYnJlYWtpbmcgYmFzZSBmdW5jdGlvbmFsaXR5JywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbnN0cnVjdCB3aXRoIGN1c3RvbSBtZXRhZGF0YSBzdGlsbCBoYXMgYWxsIGJhc2UgZnVuY3Rpb25hbGl0eVxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIDEpO1xuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIDEpO1xuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OlMzOjpCdWNrZXQnLCAxKTtcblxuICAgICAgLy8gVmVyaWZ5IHN0YXRlIG1hY2hpbmUgaGFzIHRoZSBzYW1lIGJhc2Ugc3RydWN0dXJlXG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gQ29yZSBzdGF0ZXMgc2hvdWxkIGV4aXN0XG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGF0ZXMuSW5pdE1ldGFkYXRhRW50cnkpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGF0ZXMuTW9ja0NsYXNzaWZpY2F0aW9uKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhdGVzLk1vY2tQcm9jZXNzaW5nKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRHluYW1vREIgc2NoZW1hbGVzcyBuYXR1cmUgc3VwcG9ydHMgcnVudGltZSBmaWVsZCBhZGRpdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdEeW5hbW9EQiB0YWJsZSBzdXBwb3J0cyBhbnkgYWRkaXRpb25hbCBmaWVsZHMgYXQgcnVudGltZScsICgpID0+IHtcbiAgICAgIC8vIER5bmFtb0RCIGlzIHNjaGVtYWxlc3MsIHNvIGFueSBmaWVsZHMgY2FuIGJlIGFkZGVkIGF0IHJ1bnRpbWVcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgdGFibGUgaXMgY3JlYXRlZCBjb3JyZWN0bHkgYW5kIGNhbiBhY2NlcHQgYW55IGF0dHJpYnV0ZXNcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgICBCaWxsaW5nTW9kZTogJ1BBWV9QRVJfUkVRVUVTVCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gTm8gYXR0cmlidXRlIGRlZmluaXRpb25zIG5lZWRlZCBmb3Igbm9uLWtleSBhdHRyaWJ1dGVzIGluIER5bmFtb0RCXG4gICAgICAvLyBGaWVsZHMgbGlrZSBBZ2dyZWdhdGVkUmVzdWx0IGNhbiBiZSBhZGRlZCB2aWEgRHluYW1vVXBkYXRlSXRlbSBkdXJpbmcgcHJvY2Vzc2luZ1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc3RhdGUgbWFjaGluZSBoYXMgcGVybWlzc2lvbnMgdG8gdXBkYXRlIER5bmFtb0RCIGl0ZW1zJywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoZSBzdGF0ZSBtYWNoaW5lIHJvbGUgaGFzIFVwZGF0ZUl0ZW0gcGVybWlzc2lvbnNcbiAgICAgIC8vIFRoaXMgYWxsb3dzIGFkZGluZyBmaWVsZHMgbGlrZSBBZ2dyZWdhdGVkUmVzdWx0IGR1cmluZyBwcm9jZXNzaW5nXG4gICAgICBjb25zdCBwb2xpY2llcyA9IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmZpbmRSZXNvdXJjZXMoJ0FXUzo6SUFNOjpQb2xpY3knKTtcblxuICAgICAgLy8gRmluZCB0aGUgc3RhdGUgbWFjaGluZSByb2xlIHBvbGljeVxuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lUG9saWN5ID0gT2JqZWN0LnZhbHVlcyhwb2xpY2llcykuZmluZCgocG9saWN5OiBhbnkpID0+XG4gICAgICAgIHBvbGljeS5Qcm9wZXJ0aWVzLlBvbGljeU5hbWUuaW5jbHVkZXMoJ1N0YXRlTWFjaGluZVJvbGUnKSxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZU1hY2hpbmVQb2xpY3kpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQgaGFzIER5bmFtb0RCIFVwZGF0ZUl0ZW0gcGVybWlzc2lvbnNcbiAgICAgIGNvbnN0IHN0YXRlbWVudHMgPSAoc3RhdGVNYWNoaW5lUG9saWN5IGFzIGFueSkuUHJvcGVydGllcy5Qb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQ7XG4gICAgICBjb25zdCBkeW5hbW9TdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzLmZpbmQoKHN0bXQ6IGFueSkgPT5cbiAgICAgICAgc3RtdC5BY3Rpb24gJiYgKFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KHN0bXQuQWN0aW9uKSAmJiBzdG10LkFjdGlvbi5pbmNsdWRlcygnZHluYW1vZGI6VXBkYXRlSXRlbScpKSB8fFxuICAgICAgICAgIHN0bXQuQWN0aW9uID09PSAnZHluYW1vZGI6VXBkYXRlSXRlbSdcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChkeW5hbW9TdGF0ZW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZHluYW1vU3RhdGVtZW50LkVmZmVjdCkudG9CZSgnQWxsb3cnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
342
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLXNjaGVtYS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLXNjaGVtYS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXlDO0FBQ3pDLHVEQUFrRDtBQUNsRCx1REFBaUU7QUFDakUscUVBQXlEO0FBQ3pELGlGQUF5RjtBQUN6RiwyREFBMkQ7QUFDM0QsMEVBQWlHO0FBRWpHOzs7R0FHRztBQUNILE1BQU0sMENBQTJDLFNBQVEsaURBQXNCO0lBQ3JFLGdCQUFnQixDQUFXO0lBQzNCLFlBQVksQ0FBVztJQUUvQixZQUFZLEtBQVUsRUFBRSxFQUFVLEVBQUUsS0FBVTtRQUM1QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUM3RCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxxRUFBcUUsQ0FBQztTQUM3RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ3JELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLGlEQUFpRCxDQUFDO1NBQ3pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxpQkFBaUI7UUFDekIseUNBQXlDO1FBQ3pDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxnRUFBZ0U7SUFF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QUFDO1lBRTlFLHFDQUFxQztZQUNyQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FDdEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQzFELENBQUM7WUFFRixNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV6QyxvREFBb0Q7WUFDcEQsTUFBTSxVQUFVLEdBQUksa0JBQTBCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDbkYsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQ3BELElBQUksQ0FBQyxNQUFNLElBQUksQ0FDYixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxNQUFNLEtBQUsscUJBQXFCLENBQ3RDLENBQ0YsQ0FBQztZQUVGLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBKc29uUGF0aCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zJztcbmltcG9ydCB7IER5bmFtb0F0dHJpYnV0ZVZhbHVlLCBMYW1iZGFJbnZva2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrcyc7XG5pbXBvcnQgeyBjcmVhdGVUZXN0QXBwIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IHsgQmFzZURvY3VtZW50UHJvY2Vzc2luZywgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfSBmcm9tICcuLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG4vKipcbiAqIFRlc3QgaW1wbGVtZW50YXRpb24gV0lUSE9VVCBwcmVwcm9jZXNzaW5nIChiYWNrd2FyZCBjb21wYXRpYmxlKVxuICogVGhpcyBzaW11bGF0ZXMgZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QgdXNlIGFueSBwcmVwcm9jZXNzaW5nXG4gKi9cbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRob3V0UHJlcHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGFueSwgaWQ6IHN0cmluZywgcHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gTm8gcHJlcHJvY2Vzc2luZyAtIGJhY2t3YXJkIGNvbXBhdGlibGVcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gTm8gb3ZlcnJpZGUgb2YgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCkgLSB1c2VzIGRlZmF1bHQgKGVtcHR5KVxuXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrQ2xhc3NpZmljYXRpb24nLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jbGFzc2lmaWNhdGlvbkZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja1Byb2Nlc3NpbmcnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5wcm9jZXNzaW5nRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJvY2Vzc2luZ1dvcmtmbG93KCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU3RhdGVNYWNoaW5lKCkge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCd0ZXN0LXN0YXRlLW1hY2hpbmUtbm8tcHJlcHJvY2Vzc2luZycpO1xuICB9XG59XG5cbi8qKlxuICogVGVzdCBpbXBsZW1lbnRhdGlvbiBXSVRIIHByZXByb2Nlc3NpbmcgYW5kIGN1c3RvbSBtZXRhZGF0YVxuICogVGhpcyBzaW11bGF0ZXMgaW1wbGVtZW50YXRpb25zIHRoYXQgYWRkIHRoZWlyIG93biBwcmVwcm9jZXNzaW5nLXNwZWNpZmljIGZpZWxkc1xuICogKGUuZy4sIGNodW5raW5nIG1ldGFkYXRhKSB3aXRob3V0IHRoZSBiYXNlIGNsYXNzIGtub3dpbmcgYWJvdXQgdGhlbVxuICovXG5jbGFzcyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nV2l0aEN1c3RvbU1ldGFkYXRhIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB7XG4gIHByaXZhdGUgcHJlcHJvY2Vzc2luZ0ZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBjbGFzc2lmaWNhdGlvbkZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBwcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBhbnksIGlkOiBzdHJpbmcsIHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMucHJlcHJvY2Vzc2luZ0ZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdQcmVwcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICBjdXN0b21GaWVsZDE6ICd2YWx1ZTEnLFxuICAgICAgICAgIGN1c3RvbUZpZWxkMjogeyBuZXN0ZWQ6ICdkYXRhJyB9LFxuICAgICAgICAgIGN1c3RvbUZpZWxkMzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIGApLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcmVwcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJlcHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICAvLyBPdmVycmlkZSB0byBhZGQgY3VzdG9tIG1ldGFkYXRhIGZpZWxkc1xuICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtb0F0dHJpYnV0ZVZhbHVlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEN1c3RvbUZpZWxkMTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwcm9jZXNzaW5nUmVzdWx0LmN1c3RvbUZpZWxkMScpKSxcbiAgICAgIEN1c3RvbUZpZWxkMjogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdC5jdXN0b21GaWVsZDInKSkpLFxuICAgICAgQ3VzdG9tRmllbGQzOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5ib29sZWFuRnJvbUpzb25QYXRoKEpzb25QYXRoLnN0cmluZ0F0KCckLnByZXByb2Nlc3NpbmdSZXN1bHQuY3VzdG9tRmllbGQzJykpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLXdpdGgtY3VzdG9tLW1ldGFkYXRhJyk7XG4gIH1cbn1cblxuZGVzY3JpYmUoJ0Jhc2VEb2N1bWVudFByb2Nlc3NpbmcgLSBEeW5hbW9EQiBTY2hlbWEgRXh0ZW5zaW9uIE1lY2hhbmlzbScsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZzogU3RhY2s7XG4gIGxldCBzdGFja1dpdGhDdXN0b21NZXRhZGF0YTogU3RhY2s7XG4gIGxldCB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nOiBUZW1wbGF0ZTtcbiAgbGV0IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhOiBUZW1wbGF0ZTtcblxuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIC8vIFVzZSBjcmVhdGVUZXN0QXBwKCkgdG8gc2tpcCBidW5kbGluZyBhbmQgc3BlZWQgdXAgdGVzdHNcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG5cbiAgICAvLyBTdGFjayB3aXRob3V0IHByZXByb2Nlc3NpbmcgKGJhY2t3YXJkIGNvbXBhdGlibGUpXG4gICAgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZyA9IG5ldyBTdGFjayhhcHAsICdXaXRob3V0UHJlcHJvY2Vzc2luZ1N0YWNrJyk7XG4gICAgY29uc3QgY29uc3RydWN0V2l0aG91dFByZXByb2Nlc3NpbmcgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZ1dpdGhvdXRQcmVwcm9jZXNzaW5nKFxuICAgICAgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZyxcbiAgICAgICdUZXN0V2l0aG91dFByZXByb2Nlc3NpbmcnLFxuICAgICAge30sXG4gICAgKTtcbiAgICBjb25zdHJ1Y3RXaXRob3V0UHJlcHJvY2Vzc2luZy5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuICAgIC8vIFN0YWNrIHdpdGggY3VzdG9tIG1ldGFkYXRhXG4gICAgc3RhY2tXaXRoQ3VzdG9tTWV0YWRhdGEgPSBuZXcgU3RhY2soYXBwLCAnV2l0aEN1c3RvbU1ldGFkYXRhU3RhY2snKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RXaXRoQ3VzdG9tTWV0YWRhdGEgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZ1dpdGhDdXN0b21NZXRhZGF0YShcbiAgICAgIHN0YWNrV2l0aEN1c3RvbU1ldGFkYXRhLFxuICAgICAgJ1Rlc3RXaXRoQ3VzdG9tTWV0YWRhdGEnLFxuICAgICAge30sXG4gICAgKTtcbiAgICBjb25zdHJ1Y3RXaXRoQ3VzdG9tTWV0YWRhdGEuY3JlYXRlU3RhdGVNYWNoaW5lKCk7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZXNcbiAgICB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrV2l0aG91dFByZXByb2Nlc3NpbmcpO1xuICAgIHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrV2l0aEN1c3RvbU1ldGFkYXRhKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0JhY2t3YXJkIENvbXBhdGliaWxpdHkgLSBEb2N1bWVudHMgd2l0aG91dCBwcmVwcm9jZXNzaW5nJywgKCkgPT4ge1xuICAgIHRlc3QoJ0luaXRNZXRhZGF0YSBvbmx5IGluY2x1ZGVzIGJhc2UgZmllbGRzIHdoZW4gbm8gcHJlcHJvY2Vzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZXMgPSB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nLmZpbmRSZXNvdXJjZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJyk7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVLZXkgPSBPYmplY3Qua2V5cyhzdGF0ZU1hY2hpbmVzKVswXTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25TdHJpbmcgPSBzdGF0ZU1hY2hpbmVzW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgZGVmaW5pdGlvblxuICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IEpTT04ucGFyc2UoZGVmaW5pdGlvblN0cmluZ1snRm46OkpvaW4nXVsxXS5qb2luKCcnKSk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIEluaXRNZXRhZGF0YUVudHJ5IHN0YXRlIGJ5IG5hbWVcbiAgICAgIGNvbnN0IGluaXRNZXRhZGF0YVN0YXRlID0gZGVmaW5pdGlvbi5TdGF0ZXMuSW5pdE1ldGFkYXRhRW50cnk7XG5cbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5UeXBlKS50b0JlKCdUYXNrJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBiYXNlIGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Eb2N1bWVudElkKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Db250ZW50VHlwZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ29udGVudCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uV29ya2Zsb3dTdGF0dXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLlN0YXRlTWFjaGluZUV4ZWNJZCkudG9CZURlZmluZWQoKTtcblxuICAgICAgLy8gVmVyaWZ5IE5PIGN1c3RvbSBmaWVsZHMgYXJlIHByZXNlbnQgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkN1c3RvbUZpZWxkMSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5DdXN0b21GaWVsZDIpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ3VzdG9tRmllbGQzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3b3JrZmxvdyBzdGFydHMgd2l0aCBJbml0TWV0YWRhdGEgd2hlbiBubyBwcmVwcm9jZXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lcyA9IHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICAvLyBTaG91bGQgc3RhcnQgd2l0aCBJbml0TWV0YWRhdGEgd2hlbiBubyBwcmVwcm9jZXNzaW5nXG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGFydEF0KS50b01hdGNoKC9Jbml0TWV0YWRhdGEvKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0R5bmFtb0RCIHRhYmxlIHNjaGVtYSByZW1haW5zIHVuY2hhbmdlZCcsICgpID0+IHtcbiAgICAgIC8vIFZlcmlmeSB0YWJsZSBpcyBjcmVhdGVkIHdpdGggc2FtZSBzY2hlbWEgYXMgYmVmb3JlXG4gICAgICB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIEtleVNjaGVtYTogW3tcbiAgICAgICAgICBBdHRyaWJ1dGVOYW1lOiAnRG9jdW1lbnRJZCcsXG4gICAgICAgICAgS2V5VHlwZTogJ0hBU0gnLFxuICAgICAgICB9XSxcbiAgICAgICAgQmlsbGluZ01vZGU6ICdQQVlfUEVSX1JFUVVFU1QnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTY2hlbWEgRXh0ZW5zaW9uIE1lY2hhbmlzbSAtIEdlbmVyaWMgcHJlcHJvY2Vzc2luZyBtZXRhZGF0YScsICgpID0+IHtcbiAgICB0ZXN0KCdwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKSBob29rIGFsbG93cyBzdWJjbGFzc2VzIHRvIGV4dGVuZCBzY2hlbWEnLCAoKSA9PiB7XG4gICAgICAvLyBUaGUga2V5IGRlc2lnbiBwcmluY2lwbGU6IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHByZXByb2Nlc3NpbmdNZXRhZGF0YSgpXG4gICAgICAvLyB0byBhZGQgdGhlaXIgb3duIGZpZWxkcyB0byBJbml0TWV0YWRhdGEgd2l0aG91dCBiYXNlIGNsYXNzIGtub3dpbmcgdGhlIGRldGFpbHNcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBjb25zdHJ1Y3Qgd2l0aCBjdXN0b20gbWV0YWRhdGEgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICBleHBlY3Qoc3RhY2tXaXRoQ3VzdG9tTWV0YWRhdGEpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgYSBzdGF0ZSBtYWNoaW5lXG4gICAgICB0ZW1wbGF0ZVdpdGhDdXN0b21NZXRhZGF0YS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgdGhlIHNhbWUgRHluYW1vREIgdGFibGUgc3RydWN0dXJlIGFzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uXG4gICAgICB0ZW1wbGF0ZVdpdGhDdXN0b21NZXRhZGF0YS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dvcmtmbG93IGluY2x1ZGVzIHByZXByb2Nlc3Npbmcgc3RlcCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lcyA9IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmZpbmRSZXNvdXJjZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJyk7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVLZXkgPSBPYmplY3Qua2V5cyhzdGF0ZU1hY2hpbmVzKVswXTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25TdHJpbmcgPSBzdGF0ZU1hY2hpbmVzW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gVmVyaWZ5IEluaXRNZXRhZGF0YSBzdGVwIGV4aXN0cyAoY29yZSBmdW5jdGlvbmFsaXR5KVxuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5KS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBXaGVuIHByZXByb2Nlc3NpbmcgaXMgcHJvdmlkZWQsIGl0IHNob3VsZCBiZSBpbiB0aGUgd29ya2Zsb3dcbiAgICAgIC8vIFRoZSBleGFjdCBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgIGV4cGVjdChkZWZpbml0aW9uLlN0YXRlcykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhkZWZpbml0aW9uLlN0YXRlcykubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdJbml0TWV0YWRhdGEgY2FuIGFjY2VwdCBhZGRpdGlvbmFsIGZpZWxkcyB2aWEgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICBjb25zdCBpbml0TWV0YWRhdGFTdGF0ZSA9IGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5O1xuXG4gICAgICAvLyBWZXJpZnkgYmFzZSBmaWVsZHMgYXJlIGFsd2F5cyBwcmVzZW50XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkRvY3VtZW50SWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkNvbnRlbnRUeXBlKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Db250ZW50KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Xb3JrZmxvd1N0YXR1cykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uU3RhdGVNYWNoaW5lRXhlY0lkKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBUaGUgbWVjaGFuaXNtIGFsbG93cyBhZGRpbmcgY3VzdG9tIGZpZWxkcyAoaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHN1YmNsYXNzKVxuICAgICAgLy8gRHluYW1vREIncyBzY2hlbWFsZXNzIG5hdHVyZSBtZWFucyBhbnkgZmllbGRzIGNhbiBiZSBhZGRlZCBhdCBydW50aW1lXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTY2hlbWEgQ29tcGF0aWJpbGl0eScsICgpID0+IHtcbiAgICB0ZXN0KCdib3RoIGltcGxlbWVudGF0aW9ucyB1c2UgdGhlIHNhbWUgRHluYW1vREIgdGFibGUgc3RydWN0dXJlJywgKCkgPT4ge1xuICAgICAgLy8gQm90aCBzaG91bGQgY3JlYXRlIHRhYmxlcyB3aXRoIHNhbWUgcGFydGl0aW9uIGtleVxuICAgICAgdGVtcGxhdGVXaXRob3V0UHJlcHJvY2Vzc2luZy5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdib3RoIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgZW5jcnlwdGVkIHRhYmxlcycsICgpID0+IHtcbiAgICAgIHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2JvdGggaW1wbGVtZW50YXRpb25zIHVzZSBQQVlfUEVSX1JFUVVFU1QgYmlsbGluZycsICgpID0+IHtcbiAgICAgIHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgQmlsbGluZ01vZGU6ICdQQVlfUEVSX1JFUVVFU1QnLFxuICAgICAgfSk7XG5cbiAgICAgIHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIEJpbGxpbmdNb2RlOiAnUEFZX1BFUl9SRVFVRVNUJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVzaWduIFByaW5jaXBsZTogQmFzZSBjbGFzcyBoYXMgbm8ga25vd2xlZGdlIG9mIHByZXByb2Nlc3Npbmcgc3BlY2lmaWNzJywgKCkgPT4ge1xuICAgIHRlc3QoJ2Jhc2UgY2xhc3MgcHJvdmlkZXMgZ2VuZXJpYyBleHRlbnNpb24gbWVjaGFuaXNtIHZpYSBwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKScsICgpID0+IHtcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgZGVzaWduIHByaW5jaXBsZTpcbiAgICAgIC8vIC0gQmFzZSBjbGFzcyBkb2Vzbid0IGtub3cgYWJvdXQgY2h1bmtpbmcsIHZhbGlkYXRpb24sIG9yIGFueSBzcGVjaWZpYyBwcmVwcm9jZXNzaW5nXG4gICAgICAvLyAtIEJhc2UgY2xhc3Mgb25seSBwcm92aWRlcyBhIGhvb2sgKHByZXByb2Nlc3NpbmdNZXRhZGF0YSkgZm9yIHN1YmNsYXNzZXMgdG8gZXh0ZW5kXG4gICAgICAvLyAtIFN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciB0aGVpciBvd24gbWV0YWRhdGEgZmllbGRzXG5cbiAgICAgIC8vIFZlcmlmeSB0aGF0IHdpdGhvdXQgb3ZlcnJpZGluZyBwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKSwgd29ya2Zsb3cgd29ya3MgY29ycmVjdGx5XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRob3V0UHJlcHJvY2Vzc2luZy5maW5kUmVzb3VyY2VzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScpO1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lS2V5ID0gT2JqZWN0LmtleXMoc3RhdGVNYWNoaW5lcylbMF07XG4gICAgICBjb25zdCBkZWZpbml0aW9uU3RyaW5nID0gc3RhdGVNYWNoaW5lc1tzdGF0ZU1hY2hpbmVLZXldLlByb3BlcnRpZXMuRGVmaW5pdGlvblN0cmluZztcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICBjb25zdCBpbml0TWV0YWRhdGFTdGF0ZSA9IGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5O1xuXG4gICAgICAvLyBCYXNlIGZpZWxkcyBhcmUgYWx3YXlzIHByZXNlbnRcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uRG9jdW1lbnRJZCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ29udGVudFR5cGUpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkNvbnRlbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLldvcmtmbG93U3RhdHVzKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5TdGF0ZU1hY2hpbmVFeGVjSWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzdWJjbGFzc2VzIGNhbiBleHRlbmQgdmlhIHByZXByb2Nlc3NpbmdNZXRhZGF0YSgpIHdpdGhvdXQgYnJlYWtpbmcgYmFzZSBmdW5jdGlvbmFsaXR5JywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbnN0cnVjdCB3aXRoIGN1c3RvbSBtZXRhZGF0YSBzdGlsbCBoYXMgYWxsIGJhc2UgZnVuY3Rpb25hbGl0eVxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIDEpO1xuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIDEpO1xuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OlMzOjpCdWNrZXQnLCAxKTtcblxuICAgICAgLy8gVmVyaWZ5IHN0YXRlIG1hY2hpbmUgaGFzIHRoZSBzYW1lIGJhc2Ugc3RydWN0dXJlXG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gQ29yZSBzdGF0ZXMgc2hvdWxkIGV4aXN0XG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGF0ZXMuSW5pdE1ldGFkYXRhRW50cnkpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGF0ZXMuTW9ja0NsYXNzaWZpY2F0aW9uKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhdGVzLk1vY2tQcm9jZXNzaW5nKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRHluYW1vREIgc2NoZW1hbGVzcyBuYXR1cmUgc3VwcG9ydHMgcnVudGltZSBmaWVsZCBhZGRpdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdEeW5hbW9EQiB0YWJsZSBzdXBwb3J0cyBhbnkgYWRkaXRpb25hbCBmaWVsZHMgYXQgcnVudGltZScsICgpID0+IHtcbiAgICAgIC8vIER5bmFtb0RCIGlzIHNjaGVtYWxlc3MsIHNvIGFueSBmaWVsZHMgY2FuIGJlIGFkZGVkIGF0IHJ1bnRpbWVcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgdGFibGUgaXMgY3JlYXRlZCBjb3JyZWN0bHkgYW5kIGNhbiBhY2NlcHQgYW55IGF0dHJpYnV0ZXNcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgICBCaWxsaW5nTW9kZTogJ1BBWV9QRVJfUkVRVUVTVCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gTm8gYXR0cmlidXRlIGRlZmluaXRpb25zIG5lZWRlZCBmb3Igbm9uLWtleSBhdHRyaWJ1dGVzIGluIER5bmFtb0RCXG4gICAgICAvLyBGaWVsZHMgbGlrZSBBZ2dyZWdhdGVkUmVzdWx0IGNhbiBiZSBhZGRlZCB2aWEgRHluYW1vVXBkYXRlSXRlbSBkdXJpbmcgcHJvY2Vzc2luZ1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc3RhdGUgbWFjaGluZSBoYXMgcGVybWlzc2lvbnMgdG8gdXBkYXRlIER5bmFtb0RCIGl0ZW1zJywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoZSBzdGF0ZSBtYWNoaW5lIHJvbGUgaGFzIFVwZGF0ZUl0ZW0gcGVybWlzc2lvbnNcbiAgICAgIC8vIFRoaXMgYWxsb3dzIGFkZGluZyBmaWVsZHMgbGlrZSBBZ2dyZWdhdGVkUmVzdWx0IGR1cmluZyBwcm9jZXNzaW5nXG4gICAgICBjb25zdCBwb2xpY2llcyA9IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmZpbmRSZXNvdXJjZXMoJ0FXUzo6SUFNOjpQb2xpY3knKTtcblxuICAgICAgLy8gRmluZCB0aGUgc3RhdGUgbWFjaGluZSByb2xlIHBvbGljeVxuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lUG9saWN5ID0gT2JqZWN0LnZhbHVlcyhwb2xpY2llcykuZmluZCgocG9saWN5OiBhbnkpID0+XG4gICAgICAgIHBvbGljeS5Qcm9wZXJ0aWVzLlBvbGljeU5hbWUuaW5jbHVkZXMoJ1N0YXRlTWFjaGluZVJvbGUnKSxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZU1hY2hpbmVQb2xpY3kpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQgaGFzIER5bmFtb0RCIFVwZGF0ZUl0ZW0gcGVybWlzc2lvbnNcbiAgICAgIGNvbnN0IHN0YXRlbWVudHMgPSAoc3RhdGVNYWNoaW5lUG9saWN5IGFzIGFueSkuUHJvcGVydGllcy5Qb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQ7XG4gICAgICBjb25zdCBkeW5hbW9TdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzLmZpbmQoKHN0bXQ6IGFueSkgPT5cbiAgICAgICAgc3RtdC5BY3Rpb24gJiYgKFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KHN0bXQuQWN0aW9uKSAmJiBzdG10LkFjdGlvbi5pbmNsdWRlcygnZHluYW1vZGI6VXBkYXRlSXRlbScpKSB8fFxuICAgICAgICAgIHN0bXQuQWN0aW9uID09PSAnZHluYW1vZGI6VXBkYXRlSXRlbSdcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChkeW5hbW9TdGF0ZW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZHluYW1vU3RhdGVtZW50LkVmZmVjdCkudG9CZSgnQWxsb3cnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==