@decaf-ts/integrations 0.3.12 → 0.4.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/README.md +11 -3
  2. package/dist/integrations.cjs +445 -7
  3. package/dist/integrations.js +479 -8
  4. package/jest.config.cjs +1 -1
  5. package/lib/cjs/feature-flags/constants.cjs +16 -0
  6. package/lib/cjs/feature-flags/decorators.cjs +65 -0
  7. package/lib/cjs/feature-flags/environment.cjs +26 -0
  8. package/lib/cjs/feature-flags/index.cjs +31 -0
  9. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +81 -0
  10. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +78 -0
  11. package/lib/cjs/feature-flags/readers/FeatureFlagReader.cjs +25 -0
  12. package/lib/cjs/feature-flags/readers/index.cjs +19 -0
  13. package/lib/cjs/feature-flags/services/FeatureFlag.service.cjs +259 -0
  14. package/lib/cjs/feature-flags/types.cjs +4 -0
  15. package/lib/cjs/feature-flags/utils.cjs +141 -0
  16. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +9 -9
  17. package/lib/cjs/graph/shared/nodes/flow-control.cjs +4 -3
  18. package/lib/cjs/graph/shared/types.cjs +2 -2
  19. package/lib/cjs/index.cjs +6 -5
  20. package/lib/cjs/kibana/builders/KibanaIndexBuilder.cjs +329 -0
  21. package/lib/cjs/kibana/builders/KibanaIndexBuilderCollection.cjs +37 -0
  22. package/lib/cjs/kibana/builders/index.cjs +20 -0
  23. package/lib/cjs/kibana/helpers.cjs +20 -16
  24. package/lib/cjs/kibana/index.cjs +3 -2
  25. package/lib/cjs/kibana/types.cjs +11 -2
  26. package/lib/cjs/loader/ObjectLoader.cjs +154 -0
  27. package/lib/cjs/loader/families.cjs +78 -0
  28. package/lib/cjs/loader/index.cjs +28 -0
  29. package/lib/cjs/loader/types.cjs +4 -0
  30. package/lib/cjs/nest/decorators.cjs +17 -0
  31. package/lib/cjs/nest/index.cjs +3 -3
  32. package/lib/cjs/nest/keycloakAuthHandler.cjs +74 -35
  33. package/lib/cjs/nest/keycloakModule.cjs +7 -10
  34. package/lib/cjs/nest/types.cjs +2 -2
  35. package/lib/cjs/nest/utils.cjs +58 -50
  36. package/lib/cjs/plugins/contract.cjs +76 -0
  37. package/lib/cjs/plugins/index.cjs +35 -0
  38. package/lib/cjs/plugins/kibana/host.cjs +24 -0
  39. package/lib/cjs/plugins/kibana/index.cjs +38 -0
  40. package/lib/cjs/plugins/kibana/installer.cjs +180 -0
  41. package/lib/cjs/plugins/kibana/manifest.cjs +33 -0
  42. package/lib/cjs/plugins/kibana/templates.cjs +503 -0
  43. package/lib/cjs/plugins/kibana/types.cjs +33 -0
  44. package/lib/cjs/plugins/superset/host.cjs +26 -0
  45. package/lib/cjs/plugins/superset/index.cjs +40 -0
  46. package/lib/cjs/plugins/superset/installer.cjs +232 -0
  47. package/lib/cjs/plugins/superset/manifest.cjs +35 -0
  48. package/lib/cjs/plugins/superset/templates.cjs +844 -0
  49. package/lib/cjs/plugins/superset/types.cjs +39 -0
  50. package/lib/esm/feature-flags/constants.js +12 -0
  51. package/lib/esm/feature-flags/decorators.js +49 -0
  52. package/lib/esm/feature-flags/environment.js +18 -0
  53. package/lib/esm/feature-flags/index.js +14 -0
  54. package/lib/esm/feature-flags/models/FeatureFlag.model.js +72 -0
  55. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +69 -0
  56. package/lib/esm/feature-flags/readers/FeatureFlagReader.js +19 -0
  57. package/lib/esm/feature-flags/readers/index.js +2 -0
  58. package/lib/esm/feature-flags/services/FeatureFlag.service.js +250 -0
  59. package/lib/esm/feature-flags/types.js +2 -0
  60. package/lib/esm/feature-flags/utils.js +126 -0
  61. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +8 -8
  62. package/lib/esm/graph/shared/nodes/flow-control.js +3 -2
  63. package/lib/esm/graph/shared/types.js +1 -1
  64. package/lib/esm/index.js +5 -4
  65. package/lib/esm/kibana/builders/KibanaIndexBuilder.js +319 -0
  66. package/lib/esm/kibana/builders/KibanaIndexBuilderCollection.js +32 -0
  67. package/lib/esm/kibana/builders/index.js +3 -0
  68. package/lib/esm/kibana/helpers.js +19 -15
  69. package/lib/esm/kibana/index.js +2 -1
  70. package/lib/esm/kibana/types.js +13 -2
  71. package/lib/esm/loader/ObjectLoader.js +115 -0
  72. package/lib/esm/loader/families.js +66 -0
  73. package/lib/esm/loader/index.js +11 -0
  74. package/lib/esm/loader/types.js +2 -0
  75. package/lib/esm/nest/decorators.js +12 -0
  76. package/lib/esm/nest/index.js +2 -2
  77. package/lib/esm/nest/keycloakAuthHandler.js +67 -35
  78. package/lib/esm/nest/keycloakModule.js +7 -10
  79. package/lib/esm/nest/types.js +1 -1
  80. package/lib/esm/nest/utils.js +55 -46
  81. package/lib/esm/plugins/contract.js +68 -0
  82. package/lib/esm/plugins/index.js +18 -0
  83. package/lib/esm/plugins/kibana/host.js +19 -0
  84. package/lib/esm/plugins/kibana/index.js +14 -0
  85. package/lib/esm/plugins/kibana/installer.js +140 -0
  86. package/lib/esm/plugins/kibana/manifest.js +32 -0
  87. package/lib/esm/plugins/kibana/templates.js +499 -0
  88. package/lib/esm/plugins/kibana/types.js +10 -0
  89. package/lib/esm/plugins/superset/host.js +21 -0
  90. package/lib/esm/plugins/superset/index.js +16 -0
  91. package/lib/esm/plugins/superset/installer.js +192 -0
  92. package/lib/esm/plugins/superset/manifest.js +30 -0
  93. package/lib/esm/plugins/superset/templates.js +840 -0
  94. package/lib/esm/plugins/superset/types.js +11 -0
  95. package/lib/types/feature-flags/constants.d.cts +11 -0
  96. package/lib/types/feature-flags/constants.d.mts +11 -0
  97. package/lib/types/feature-flags/decorators.d.cts +11 -0
  98. package/lib/types/feature-flags/decorators.d.mts +11 -0
  99. package/lib/types/feature-flags/environment.d.cts +11 -0
  100. package/lib/types/feature-flags/environment.d.mts +11 -0
  101. package/lib/types/feature-flags/index.d.cts +13 -0
  102. package/lib/types/feature-flags/index.d.mts +13 -0
  103. package/lib/types/feature-flags/models/FeatureFlag.model.d.cts +16 -0
  104. package/lib/types/feature-flags/models/FeatureFlag.model.d.mts +16 -0
  105. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.cts +15 -0
  106. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.mts +15 -0
  107. package/lib/types/feature-flags/readers/FeatureFlagReader.d.cts +10 -0
  108. package/lib/types/feature-flags/readers/FeatureFlagReader.d.mts +10 -0
  109. package/lib/types/feature-flags/readers/index.d.cts +1 -0
  110. package/lib/types/feature-flags/readers/index.d.mts +1 -0
  111. package/lib/types/feature-flags/services/FeatureFlag.service.d.cts +43 -0
  112. package/lib/types/feature-flags/services/FeatureFlag.service.d.mts +43 -0
  113. package/lib/types/feature-flags/types.d.cts +39 -0
  114. package/lib/types/feature-flags/types.d.mts +39 -0
  115. package/lib/types/feature-flags/utils.d.cts +13 -0
  116. package/lib/types/feature-flags/utils.d.mts +13 -0
  117. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.cts +2 -2
  118. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.mts +2 -2
  119. package/lib/types/graph/shared/types.d.cts +3 -3
  120. package/lib/types/graph/shared/types.d.mts +3 -3
  121. package/lib/types/index.d.cts +3 -2
  122. package/lib/types/index.d.mts +3 -2
  123. package/lib/types/kibana/builders/KibanaIndexBuilder.d.cts +67 -0
  124. package/lib/types/kibana/builders/KibanaIndexBuilder.d.mts +67 -0
  125. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.cts +17 -0
  126. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.mts +17 -0
  127. package/lib/types/kibana/builders/index.d.cts +2 -0
  128. package/lib/types/kibana/builders/index.d.mts +2 -0
  129. package/lib/types/kibana/index.d.cts +1 -0
  130. package/lib/types/kibana/index.d.mts +1 -0
  131. package/lib/types/kibana/types.d.cts +11 -0
  132. package/lib/types/kibana/types.d.mts +11 -0
  133. package/lib/types/loader/ObjectLoader.d.cts +27 -0
  134. package/lib/types/loader/ObjectLoader.d.mts +27 -0
  135. package/lib/types/loader/families.d.cts +34 -0
  136. package/lib/types/loader/families.d.mts +34 -0
  137. package/lib/types/loader/index.d.cts +10 -0
  138. package/lib/types/loader/index.d.mts +10 -0
  139. package/lib/types/loader/types.d.cts +24 -0
  140. package/lib/types/loader/types.d.mts +24 -0
  141. package/lib/types/nest/decorators.d.cts +8 -0
  142. package/lib/types/nest/decorators.d.mts +8 -0
  143. package/lib/types/nest/index.d.cts +1 -1
  144. package/lib/types/nest/index.d.mts +1 -1
  145. package/lib/types/nest/keycloakAuthHandler.d.cts +19 -42
  146. package/lib/types/nest/keycloakAuthHandler.d.mts +19 -42
  147. package/lib/types/nest/keycloakModule.d.cts +3 -5
  148. package/lib/types/nest/keycloakModule.d.mts +3 -5
  149. package/lib/types/nest/types.d.cts +2 -0
  150. package/lib/types/nest/types.d.mts +2 -0
  151. package/lib/types/nest/utils.d.cts +3 -4
  152. package/lib/types/nest/utils.d.mts +3 -4
  153. package/lib/types/plugins/contract.d.cts +180 -0
  154. package/lib/types/plugins/contract.d.mts +180 -0
  155. package/lib/types/plugins/index.d.cts +17 -0
  156. package/lib/types/plugins/index.d.mts +17 -0
  157. package/lib/types/plugins/kibana/host.d.cts +18 -0
  158. package/lib/types/plugins/kibana/host.d.mts +18 -0
  159. package/lib/types/plugins/kibana/index.d.cts +13 -0
  160. package/lib/types/plugins/kibana/index.d.mts +13 -0
  161. package/lib/types/plugins/kibana/installer.d.cts +45 -0
  162. package/lib/types/plugins/kibana/installer.d.mts +45 -0
  163. package/lib/types/plugins/kibana/manifest.d.cts +31 -0
  164. package/lib/types/plugins/kibana/manifest.d.mts +31 -0
  165. package/lib/types/plugins/kibana/templates.d.cts +12 -0
  166. package/lib/types/plugins/kibana/templates.d.mts +12 -0
  167. package/lib/types/plugins/kibana/types.d.cts +9 -0
  168. package/lib/types/plugins/kibana/types.d.mts +9 -0
  169. package/lib/types/plugins/superset/host.d.cts +20 -0
  170. package/lib/types/plugins/superset/host.d.mts +20 -0
  171. package/lib/types/plugins/superset/index.d.cts +15 -0
  172. package/lib/types/plugins/superset/index.d.mts +15 -0
  173. package/lib/types/plugins/superset/installer.d.cts +70 -0
  174. package/lib/types/plugins/superset/installer.d.mts +70 -0
  175. package/lib/types/plugins/superset/manifest.d.cts +28 -0
  176. package/lib/types/plugins/superset/manifest.d.mts +28 -0
  177. package/lib/types/plugins/superset/templates.d.cts +12 -0
  178. package/lib/types/plugins/superset/templates.d.mts +12 -0
  179. package/lib/types/plugins/superset/types.d.cts +10 -0
  180. package/lib/types/plugins/superset/types.d.mts +10 -0
  181. package/package.json +62 -3
  182. package/plugins/kibana/.gitignore +16 -0
  183. package/plugins/kibana/Dockerfile +19 -0
  184. package/plugins/kibana/docker-compose.yml +50 -0
  185. package/plugins/kibana/host/index.html +101 -0
  186. package/plugins/kibana/setup-dashboards.sh +84 -0
  187. package/plugins/superset/.gitignore +17 -0
  188. package/plugins/superset/Dockerfile +79 -0
  189. package/plugins/superset/docker-compose.yml +62 -0
  190. package/plugins/superset/host/index.html +168 -0
  191. package/plugins/superset/setup-dashboards.sh +106 -0
  192. package/plugins/superset/superset_config.py +49 -0
  193. package/lib/cjs/nest/authService.cjs +0 -91
  194. package/lib/esm/nest/authService.js +0 -86
  195. package/lib/types/nest/authService.d.cts +0 -63
  196. package/lib/types/nest/authService.d.mts +0 -63
@@ -0,0 +1,503 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.kibanaPluginFiles = kibanaPluginFiles;
4
+ /**
5
+ * @module integrations/plugins/kibana/templates
6
+ * @summary Version-parameterized source templates for the Kibana embed plugin.
7
+ * @description Holds the generated plugin source as string templates. These
8
+ * are materialized onto disk by the installer. The source is the reference
9
+ * multi-tenant embed plugin preserved in DECAF-40 §8. There is never space
10
+ * switching; the plugin is org-agnostic and the current Kibana space comes
11
+ * from the request/session/proxy context.
12
+ */
13
+ const manifest_js_1 = require("./manifest.cjs");
14
+ const TS_CONFIG = `{
15
+ "extends": "../../tsconfig.json",
16
+ "include": ["public/**/*", "server/**/*"]
17
+ }
18
+ `;
19
+ const PUBLIC_TYPES = `import type {
20
+ AppMountParameters,
21
+ CoreSetup,
22
+ CoreStart,
23
+ Plugin
24
+ } from '@kbn/core/public';
25
+
26
+ import type { DashboardStart } from '@kbn/dashboard-plugin/public';
27
+ import type { EmbeddableStart } from '@kbn/embeddable-plugin/public';
28
+ import type { DataPublicPluginStart } from '@kbn/data-plugin/public';
29
+
30
+ export interface OrgDashboardEmbedSetupDeps {}
31
+
32
+ export interface OrgDashboardEmbedStartDeps {
33
+ dashboard: DashboardStart;
34
+ embeddable: EmbeddableStart;
35
+ data: DataPublicPluginStart;
36
+ }
37
+
38
+ export type OrgDashboardEmbedPlugin = Plugin<
39
+ void,
40
+ void,
41
+ OrgDashboardEmbedSetupDeps,
42
+ OrgDashboardEmbedStartDeps
43
+ >;
44
+
45
+ export interface MountAppArgs {
46
+ coreStart: CoreStart;
47
+ depsStart: OrgDashboardEmbedStartDeps;
48
+ params: AppMountParameters;
49
+ }
50
+ `;
51
+ const PUBLIC_INDEX = `import type { OrgDashboardEmbedPlugin } from './types';
52
+ import { OrgDashboardEmbedPluginImpl } from './plugin';
53
+
54
+ export function plugin(): OrgDashboardEmbedPlugin {
55
+ return new OrgDashboardEmbedPluginImpl();
56
+ }
57
+ `;
58
+ const PUBLIC_PLUGIN = `import React from 'react';
59
+ import ReactDOM from 'react-dom';
60
+
61
+ import type { CoreSetup, CoreStart } from '@kbn/core/public';
62
+ import type {
63
+ OrgDashboardEmbedPlugin,
64
+ OrgDashboardEmbedSetupDeps,
65
+ OrgDashboardEmbedStartDeps
66
+ } from './types';
67
+
68
+ export class OrgDashboardEmbedPluginImpl implements OrgDashboardEmbedPlugin {
69
+ public setup(
70
+ core: CoreSetup<OrgDashboardEmbedStartDeps>,
71
+ deps: OrgDashboardEmbedSetupDeps
72
+ ) {
73
+ core.application.register({
74
+ id: '${manifest_js_1.KIBANA_APP_ID}',
75
+ title: 'Dashboard Embed',
76
+ chromeless: true,
77
+ visibleIn: [],
78
+ async mount(params) {
79
+ const [coreStart, depsStart] = await core.getStartServices();
80
+ const { OrgDashboardEmbedApp } = await import('./application');
81
+
82
+ ReactDOM.render(
83
+ <OrgDashboardEmbedApp
84
+ coreStart={coreStart}
85
+ depsStart={depsStart}
86
+ params={params}
87
+ />,
88
+ params.element
89
+ );
90
+
91
+ return () => ReactDOM.unmountComponentAtNode(params.element);
92
+ }
93
+ });
94
+ }
95
+
96
+ public start(core: CoreStart, deps: OrgDashboardEmbedStartDeps) {}
97
+
98
+ public stop() {}
99
+ }
100
+ `;
101
+ const PUBLIC_APPLICATION = `import React, { useCallback, useEffect, useRef, useState } from 'react';
102
+ import type { MountAppArgs } from './types';
103
+
104
+ type DashboardQuery = {
105
+ language: 'kuery' | 'lucene';
106
+ query: string;
107
+ };
108
+
109
+ type DashboardTimeRange = {
110
+ from: string;
111
+ to: string;
112
+ };
113
+
114
+ type SwitchDashboardMessage = {
115
+ type: 'ORG_DASHBOARD_EMBED_SWITCH_DASHBOARD';
116
+ dashboardId: string;
117
+ timeRange?: DashboardTimeRange;
118
+ query?: DashboardQuery;
119
+ filters?: unknown[];
120
+ };
121
+
122
+ type ParentReadyMessage = {
123
+ type: 'ORG_DASHBOARD_EMBED_READY';
124
+ dashboardId: string | null;
125
+ };
126
+
127
+ type ParentRenderedMessage = {
128
+ type: 'ORG_DASHBOARD_EMBED_RENDERED';
129
+ dashboardId: string;
130
+ };
131
+
132
+ type ParentErrorMessage = {
133
+ type: 'ORG_DASHBOARD_EMBED_ERROR';
134
+ dashboardId: string | null;
135
+ message: string;
136
+ };
137
+
138
+ type ParentMessage =
139
+ | ParentReadyMessage
140
+ | ParentRenderedMessage
141
+ | ParentErrorMessage;
142
+
143
+ const DEFAULT_ALLOWED_PARENT_ORIGINS: string[] = [
144
+ window.location.origin
145
+ ];
146
+
147
+ function getInitialDashboardId(): string | null {
148
+ const params = new URLSearchParams(window.location.search);
149
+ return params.get('dashboardId');
150
+ }
151
+
152
+ function getAllowedParentOrigins(): string[] {
153
+ const params = new URLSearchParams(window.location.search);
154
+ const raw = params.get('parentOrigin');
155
+
156
+ if (!raw) {
157
+ return DEFAULT_ALLOWED_PARENT_ORIGINS;
158
+ }
159
+
160
+ try {
161
+ const decoded = decodeURIComponent(raw);
162
+ const origins = decoded
163
+ .split(',')
164
+ .map((origin) => origin.trim())
165
+ .filter(Boolean);
166
+
167
+ return origins.length > 0 ? origins : DEFAULT_ALLOWED_PARENT_ORIGINS;
168
+ } catch {
169
+ return DEFAULT_ALLOWED_PARENT_ORIGINS;
170
+ }
171
+ }
172
+
173
+ function isSwitchDashboardMessage(data: unknown): data is SwitchDashboardMessage {
174
+ if (!data || typeof data !== 'object') {
175
+ return false;
176
+ }
177
+
178
+ const message = data as Partial<SwitchDashboardMessage>;
179
+
180
+ return (
181
+ message.type === 'ORG_DASHBOARD_EMBED_SWITCH_DASHBOARD' &&
182
+ typeof message.dashboardId === 'string' &&
183
+ message.dashboardId.length > 0
184
+ );
185
+ }
186
+
187
+ function postToParent(message: ParentMessage, targetOrigin: string) {
188
+ window.parent.postMessage(message, targetOrigin);
189
+ }
190
+
191
+ export function OrgDashboardEmbedApp({
192
+ coreStart,
193
+ depsStart
194
+ }: MountAppArgs) {
195
+ const rootRef = useRef<HTMLDivElement | null>(null);
196
+ const mountedDashboardRef = useRef<any>(null);
197
+ const allowedParentOriginsRef = useRef<string[]>(getAllowedParentOrigins());
198
+ const lastParentOriginRef = useRef<string>(window.location.origin);
199
+
200
+ const [dashboardId, setDashboardId] = useState<string | null>(
201
+ getInitialDashboardId()
202
+ );
203
+
204
+ const [loading, setLoading] = useState(false);
205
+
206
+ useEffect(() => {
207
+ coreStart.chrome.setIsVisible(false);
208
+ }, [coreStart]);
209
+
210
+ const destroyCurrentDashboard = useCallback(() => {
211
+ if (mountedDashboardRef.current?.destroy) {
212
+ mountedDashboardRef.current.destroy();
213
+ }
214
+
215
+ mountedDashboardRef.current = null;
216
+
217
+ if (rootRef.current) {
218
+ rootRef.current.innerHTML = '';
219
+ }
220
+ }, []);
221
+
222
+ const applySharedDashboardState = useCallback(
223
+ (message: SwitchDashboardMessage) => {
224
+ if (message.timeRange) {
225
+ depsStart.data.query.timefilter.timefilter.setTime(message.timeRange);
226
+ }
227
+
228
+ if (message.query) {
229
+ depsStart.data.query.queryString.setQuery(message.query);
230
+ }
231
+
232
+ if (message.filters) {
233
+ depsStart.data.query.filterManager.setFilters(message.filters as any);
234
+ }
235
+ },
236
+ [depsStart.data]
237
+ );
238
+
239
+ useEffect(() => {
240
+ const onMessage = (event: MessageEvent) => {
241
+ if (!allowedParentOriginsRef.current.includes(event.origin)) {
242
+ return;
243
+ }
244
+
245
+ if (!isSwitchDashboardMessage(event.data)) {
246
+ return;
247
+ }
248
+
249
+ lastParentOriginRef.current = event.origin;
250
+
251
+ applySharedDashboardState(event.data);
252
+ setDashboardId(event.data.dashboardId);
253
+ };
254
+
255
+ window.addEventListener('message', onMessage);
256
+
257
+ postToParent(
258
+ {
259
+ type: 'ORG_DASHBOARD_EMBED_READY',
260
+ dashboardId
261
+ },
262
+ lastParentOriginRef.current
263
+ );
264
+
265
+ return () => window.removeEventListener('message', onMessage);
266
+ }, [applySharedDashboardState, dashboardId]);
267
+
268
+ useEffect(() => {
269
+ if (!dashboardId || !rootRef.current) {
270
+ return;
271
+ }
272
+
273
+ let cancelled = false;
274
+
275
+ async function renderDashboard() {
276
+ setLoading(true);
277
+
278
+ try {
279
+ destroyCurrentDashboard();
280
+
281
+ const factory =
282
+ depsStart.embeddable.getEmbeddableFactory?.('dashboard') ||
283
+ depsStart.embeddable.getEmbeddableFactory?.('dashboard_container');
284
+
285
+ if (!factory) {
286
+ throw new Error('Kibana dashboard embeddable factory was not found.');
287
+ }
288
+
289
+ const embeddable = await factory.create({
290
+ id: dashboardId,
291
+ savedObjectId: dashboardId,
292
+ viewMode: 'view',
293
+ hidePanelTitles: false,
294
+ useMargins: true,
295
+ syncColors: true,
296
+ syncCursor: true,
297
+ syncTooltips: true,
298
+ timeRange: depsStart.data.query.timefilter.timefilter.getTime(),
299
+ query: depsStart.data.query.queryString.getQuery(),
300
+ filters: depsStart.data.query.filterManager.getFilters()
301
+ } as any);
302
+
303
+ if (cancelled) {
304
+ embeddable.destroy?.();
305
+ return;
306
+ }
307
+
308
+ embeddable.render(rootRef.current!);
309
+ mountedDashboardRef.current = embeddable;
310
+
311
+ postToParent(
312
+ {
313
+ type: 'ORG_DASHBOARD_EMBED_RENDERED',
314
+ dashboardId
315
+ },
316
+ lastParentOriginRef.current
317
+ );
318
+ } catch (error) {
319
+ const message =
320
+ error instanceof Error ? error.message : 'Unknown dashboard error';
321
+
322
+ if (rootRef.current) {
323
+ rootRef.current.innerHTML = \`
324
+ <div style="
325
+ padding: 24px;
326
+ font-family: sans-serif;
327
+ color: #bd271e;
328
+ ">
329
+ Failed to render dashboard: \${message}
330
+ </div>
331
+ \`;
332
+ }
333
+
334
+ postToParent(
335
+ {
336
+ type: 'ORG_DASHBOARD_EMBED_ERROR',
337
+ dashboardId,
338
+ message
339
+ },
340
+ lastParentOriginRef.current
341
+ );
342
+ } finally {
343
+ if (!cancelled) {
344
+ setLoading(false);
345
+ }
346
+ }
347
+ }
348
+
349
+ renderDashboard();
350
+
351
+ return () => {
352
+ cancelled = true;
353
+ };
354
+ }, [dashboardId, depsStart, destroyCurrentDashboard]);
355
+
356
+ useEffect(() => {
357
+ return () => {
358
+ destroyCurrentDashboard();
359
+ };
360
+ }, [destroyCurrentDashboard]);
361
+
362
+ return (
363
+ <div
364
+ style={{
365
+ position: 'fixed',
366
+ inset: 0,
367
+ width: '100vw',
368
+ height: '100vh',
369
+ overflow: 'hidden',
370
+ background: '#fff'
371
+ }}
372
+ >
373
+ {loading && (
374
+ <div
375
+ style={{
376
+ position: 'absolute',
377
+ inset: 0,
378
+ zIndex: 10,
379
+ display: 'flex',
380
+ alignItems: 'center',
381
+ justifyContent: 'center',
382
+ fontFamily: 'sans-serif',
383
+ background: '#fff'
384
+ }}
385
+ >
386
+ Loading dashboard…
387
+ </div>
388
+ )}
389
+
390
+ <div
391
+ ref={rootRef}
392
+ style={{
393
+ position: 'absolute',
394
+ inset: 0,
395
+ width: '100%',
396
+ height: '100%'
397
+ }}
398
+ />
399
+ </div>
400
+ );
401
+ }
402
+ `;
403
+ const SERVER_INDEX = `import type { PluginInitializerContext } from '@kbn/core/server';
404
+ import { OrgDashboardEmbedServerPlugin } from './plugin';
405
+
406
+ export function plugin(initializerContext: PluginInitializerContext) {
407
+ return new OrgDashboardEmbedServerPlugin(initializerContext);
408
+ }
409
+ `;
410
+ const SERVER_PLUGIN = `import type {
411
+ CoreSetup,
412
+ CoreStart,
413
+ Plugin,
414
+ PluginInitializerContext
415
+ } from '@kbn/core/server';
416
+
417
+ export class OrgDashboardEmbedServerPlugin implements Plugin {
418
+ constructor(private readonly initializerContext: PluginInitializerContext) {}
419
+
420
+ public setup(core: CoreSetup) {
421
+ const router = core.http.createRouter();
422
+
423
+ router.get(
424
+ {
425
+ path: '/api/${manifest_js_1.KIBANA_APP_ID}/health',
426
+ validate: false
427
+ },
428
+ async (context, request, response) => {
429
+ return response.ok({
430
+ body: {
431
+ ok: true,
432
+ plugin: '${manifest_js_1.KIBANA_APP_ID}'
433
+ }
434
+ });
435
+ }
436
+ );
437
+ }
438
+
439
+ public start(core: CoreStart) {}
440
+
441
+ public stop() {}
442
+ }
443
+ `;
444
+ const README = `# ${manifest_js_1.KIBANA_PLUGIN_ID}
445
+
446
+ Multi-tenant, org-agnostic Kibana dashboard embed plugin.
447
+
448
+ There is never space switching. Each org already lands in its own Kibana space
449
+ through the backend proxy/session URL, and the plugin only switches dashboards
450
+ within the current space.
451
+
452
+ ## Build
453
+
454
+ Kibana plugins must match the exact Kibana version and must be built within the
455
+ Kibana repo (see kbn-plugin-generator). Place this directory under
456
+ \`kibana-extra/\` (or \`plugins/\`) and run the Kibana plugin build, e.g.:
457
+
458
+ \`\`\`
459
+ yarn build
460
+ \`\`\`
461
+
462
+ ## Embed URL
463
+
464
+ \`\`\`
465
+ /kibana/app/${manifest_js_1.KIBANA_APP_ID}?dashboardId=<id>&parentOrigin=<origin>
466
+ \`\`\`
467
+
468
+ ## Message protocol
469
+
470
+ - Parent -> plugin: \`ORG_DASHBOARD_EMBED_SWITCH_DASHBOARD\`
471
+ - Plugin -> parent: \`ORG_DASHBOARD_EMBED_READY\` / \`ORG_DASHBOARD_EMBED_RENDERED\` / \`ORG_DASHBOARD_EMBED_ERROR\`
472
+
473
+ Version: ${manifest_js_1.KIBANA_PLUGIN_VERSION}
474
+ `;
475
+ /**
476
+ * Returns the full set of generated plugin files for a target Kibana version.
477
+ *
478
+ * @param targetVersion - Kibana version baked into `kibana.json`.
479
+ */
480
+ function kibanaPluginFiles(targetVersion) {
481
+ const manifest = JSON.stringify({
482
+ id: manifest_js_1.KIBANA_PLUGIN_ID,
483
+ version: manifest_js_1.KIBANA_PLUGIN_VERSION,
484
+ kibanaVersion: targetVersion,
485
+ server: true,
486
+ ui: true,
487
+ requiredPlugins: ["dashboard", "embeddable", "data"],
488
+ optionalPlugins: [],
489
+ }, null, 2);
490
+ return [
491
+ { path: "kibana.json", content: `${manifest}\n` },
492
+ { path: "tsconfig.json", content: `${TS_CONFIG}\n` },
493
+ { path: "README.md", content: README },
494
+ { path: "public/types.ts", content: PUBLIC_TYPES },
495
+ { path: "public/index.ts", content: PUBLIC_INDEX },
496
+ { path: "public/plugin.tsx", content: PUBLIC_PLUGIN },
497
+ { path: "public/application.tsx", content: PUBLIC_APPLICATION },
498
+ { path: "server/index.ts", content: SERVER_INDEX },
499
+ { path: "server/plugin.ts", content: SERVER_PLUGIN },
500
+ ];
501
+ }
502
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMva2liYW5hL3RlbXBsYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsc0JBQW1CO0FBU3BGLE1BQU0sU0FBUyxHQUFHOzs7O0NBSWpCLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQStCcEIsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHOzs7Ozs7Q0FNcEIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7O2FBZ0JULGFBQWE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMEJ6QixDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTZTMUIsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHOzs7Ozs7Q0FNcEIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7c0JBZUEsYUFBYTs7Ozs7Ozt1QkFPWixhQUFhOzs7Ozs7Ozs7OztDQVduQyxDQUFDO0FBRUYsTUFBTSxNQUFNLEdBQUcsS0FBSyxnQkFBZ0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQXFCdEIsYUFBYTs7Ozs7Ozs7V0FRaEIscUJBQXFCO0NBQy9CLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLGFBQXFCO0lBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQzdCO1FBQ0UsRUFBRSxFQUFFLGdCQUFnQjtRQUNwQixPQUFPLEVBQUUscUJBQXFCO1FBQzlCLGFBQWEsRUFBRSxhQUFhO1FBQzVCLE1BQU0sRUFBRSxJQUFJO1FBQ1osRUFBRSxFQUFFLElBQUk7UUFDUixlQUFlLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQztRQUNwRCxlQUFlLEVBQUUsRUFBRTtLQUNwQixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztJQUVGLE9BQU87UUFDTCxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEdBQUcsUUFBUSxJQUFJLEVBQUU7UUFDakQsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxHQUFHLFNBQVMsSUFBSSxFQUFFO1FBQ3BELEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFO1FBQ3RDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUU7UUFDbEQsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRTtRQUNsRCxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFO1FBQ3JELEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRTtRQUMvRCxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFO1FBQ2xELEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUU7S0FDckQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL3BsdWdpbnMva2liYW5hL3RlbXBsYXRlc1xuICogQHN1bW1hcnkgVmVyc2lvbi1wYXJhbWV0ZXJpemVkIHNvdXJjZSB0ZW1wbGF0ZXMgZm9yIHRoZSBLaWJhbmEgZW1iZWQgcGx1Z2luLlxuICogQGRlc2NyaXB0aW9uIEhvbGRzIHRoZSBnZW5lcmF0ZWQgcGx1Z2luIHNvdXJjZSBhcyBzdHJpbmcgdGVtcGxhdGVzLiBUaGVzZVxuICogYXJlIG1hdGVyaWFsaXplZCBvbnRvIGRpc2sgYnkgdGhlIGluc3RhbGxlci4gVGhlIHNvdXJjZSBpcyB0aGUgcmVmZXJlbmNlXG4gKiBtdWx0aS10ZW5hbnQgZW1iZWQgcGx1Z2luIHByZXNlcnZlZCBpbiBERUNBRi00MCDCpzguIFRoZXJlIGlzIG5ldmVyIHNwYWNlXG4gKiBzd2l0Y2hpbmc7IHRoZSBwbHVnaW4gaXMgb3JnLWFnbm9zdGljIGFuZCB0aGUgY3VycmVudCBLaWJhbmEgc3BhY2UgY29tZXNcbiAqIGZyb20gdGhlIHJlcXVlc3Qvc2Vzc2lvbi9wcm94eSBjb250ZXh0LlxuICovXG5pbXBvcnQgeyBLSUJBTkFfQVBQX0lELCBLSUJBTkFfUExVR0lOX0lELCBLSUJBTkFfUExVR0lOX1ZFUlNJT04gfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtpYmFuYVBsdWdpbkZpbGUge1xuICAvKiogUmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIHBsdWdpbiBkaXJlY3RvcnkuICovXG4gIHBhdGg6IHN0cmluZztcbiAgLyoqIEZpbGUgY29udGVudHMuICovXG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuY29uc3QgVFNfQ09ORklHID0gYHtcbiAgXCJleHRlbmRzXCI6IFwiLi4vLi4vdHNjb25maWcuanNvblwiLFxuICBcImluY2x1ZGVcIjogW1wicHVibGljLyoqLypcIiwgXCJzZXJ2ZXIvKiovKlwiXVxufVxuYDtcblxuY29uc3QgUFVCTElDX1RZUEVTID0gYGltcG9ydCB0eXBlIHtcbiAgQXBwTW91bnRQYXJhbWV0ZXJzLFxuICBDb3JlU2V0dXAsXG4gIENvcmVTdGFydCxcbiAgUGx1Z2luXG59IGZyb20gJ0BrYm4vY29yZS9wdWJsaWMnO1xuXG5pbXBvcnQgdHlwZSB7IERhc2hib2FyZFN0YXJ0IH0gZnJvbSAnQGtibi9kYXNoYm9hcmQtcGx1Z2luL3B1YmxpYyc7XG5pbXBvcnQgdHlwZSB7IEVtYmVkZGFibGVTdGFydCB9IGZyb20gJ0BrYm4vZW1iZWRkYWJsZS1wbHVnaW4vcHVibGljJztcbmltcG9ydCB0eXBlIHsgRGF0YVB1YmxpY1BsdWdpblN0YXJ0IH0gZnJvbSAnQGtibi9kYXRhLXBsdWdpbi9wdWJsaWMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ0Rhc2hib2FyZEVtYmVkU2V0dXBEZXBzIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnRGFzaGJvYXJkRW1iZWRTdGFydERlcHMge1xuICBkYXNoYm9hcmQ6IERhc2hib2FyZFN0YXJ0O1xuICBlbWJlZGRhYmxlOiBFbWJlZGRhYmxlU3RhcnQ7XG4gIGRhdGE6IERhdGFQdWJsaWNQbHVnaW5TdGFydDtcbn1cblxuZXhwb3J0IHR5cGUgT3JnRGFzaGJvYXJkRW1iZWRQbHVnaW4gPSBQbHVnaW48XG4gIHZvaWQsXG4gIHZvaWQsXG4gIE9yZ0Rhc2hib2FyZEVtYmVkU2V0dXBEZXBzLFxuICBPcmdEYXNoYm9hcmRFbWJlZFN0YXJ0RGVwc1xuPjtcblxuZXhwb3J0IGludGVyZmFjZSBNb3VudEFwcEFyZ3Mge1xuICBjb3JlU3RhcnQ6IENvcmVTdGFydDtcbiAgZGVwc1N0YXJ0OiBPcmdEYXNoYm9hcmRFbWJlZFN0YXJ0RGVwcztcbiAgcGFyYW1zOiBBcHBNb3VudFBhcmFtZXRlcnM7XG59XG5gO1xuXG5jb25zdCBQVUJMSUNfSU5ERVggPSBgaW1wb3J0IHR5cGUgeyBPcmdEYXNoYm9hcmRFbWJlZFBsdWdpbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgT3JnRGFzaGJvYXJkRW1iZWRQbHVnaW5JbXBsIH0gZnJvbSAnLi9wbHVnaW4nO1xuXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luKCk6IE9yZ0Rhc2hib2FyZEVtYmVkUGx1Z2luIHtcbiAgcmV0dXJuIG5ldyBPcmdEYXNoYm9hcmRFbWJlZFBsdWdpbkltcGwoKTtcbn1cbmA7XG5cbmNvbnN0IFBVQkxJQ19QTFVHSU4gPSBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cCwgQ29yZVN0YXJ0IH0gZnJvbSAnQGtibi9jb3JlL3B1YmxpYyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9yZ0Rhc2hib2FyZEVtYmVkUGx1Z2luLFxuICBPcmdEYXNoYm9hcmRFbWJlZFNldHVwRGVwcyxcbiAgT3JnRGFzaGJvYXJkRW1iZWRTdGFydERlcHNcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBPcmdEYXNoYm9hcmRFbWJlZFBsdWdpbkltcGwgaW1wbGVtZW50cyBPcmdEYXNoYm9hcmRFbWJlZFBsdWdpbiB7XG4gIHB1YmxpYyBzZXR1cChcbiAgICBjb3JlOiBDb3JlU2V0dXA8T3JnRGFzaGJvYXJkRW1iZWRTdGFydERlcHM+LFxuICAgIGRlcHM6IE9yZ0Rhc2hib2FyZEVtYmVkU2V0dXBEZXBzXG4gICkge1xuICAgIGNvcmUuYXBwbGljYXRpb24ucmVnaXN0ZXIoe1xuICAgICAgaWQ6ICcke0tJQkFOQV9BUFBfSUR9JyxcbiAgICAgIHRpdGxlOiAnRGFzaGJvYXJkIEVtYmVkJyxcbiAgICAgIGNocm9tZWxlc3M6IHRydWUsXG4gICAgICB2aXNpYmxlSW46IFtdLFxuICAgICAgYXN5bmMgbW91bnQocGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IFtjb3JlU3RhcnQsIGRlcHNTdGFydF0gPSBhd2FpdCBjb3JlLmdldFN0YXJ0U2VydmljZXMoKTtcbiAgICAgICAgY29uc3QgeyBPcmdEYXNoYm9hcmRFbWJlZEFwcCB9ID0gYXdhaXQgaW1wb3J0KCcuL2FwcGxpY2F0aW9uJyk7XG5cbiAgICAgICAgUmVhY3RET00ucmVuZGVyKFxuICAgICAgICAgIDxPcmdEYXNoYm9hcmRFbWJlZEFwcFxuICAgICAgICAgICAgY29yZVN0YXJ0PXtjb3JlU3RhcnR9XG4gICAgICAgICAgICBkZXBzU3RhcnQ9e2RlcHNTdGFydH1cbiAgICAgICAgICAgIHBhcmFtcz17cGFyYW1zfVxuICAgICAgICAgIC8+LFxuICAgICAgICAgIHBhcmFtcy5lbGVtZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUocGFyYW1zLmVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0KGNvcmU6IENvcmVTdGFydCwgZGVwczogT3JnRGFzaGJvYXJkRW1iZWRTdGFydERlcHMpIHt9XG5cbiAgcHVibGljIHN0b3AoKSB7fVxufVxuYDtcblxuY29uc3QgUFVCTElDX0FQUExJQ0FUSU9OID0gYGltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBNb3VudEFwcEFyZ3MgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBEYXNoYm9hcmRRdWVyeSA9IHtcbiAgbGFuZ3VhZ2U6ICdrdWVyeScgfCAnbHVjZW5lJztcbiAgcXVlcnk6IHN0cmluZztcbn07XG5cbnR5cGUgRGFzaGJvYXJkVGltZVJhbmdlID0ge1xuICBmcm9tOiBzdHJpbmc7XG4gIHRvOiBzdHJpbmc7XG59O1xuXG50eXBlIFN3aXRjaERhc2hib2FyZE1lc3NhZ2UgPSB7XG4gIHR5cGU6ICdPUkdfREFTSEJPQVJEX0VNQkVEX1NXSVRDSF9EQVNIQk9BUkQnO1xuICBkYXNoYm9hcmRJZDogc3RyaW5nO1xuICB0aW1lUmFuZ2U/OiBEYXNoYm9hcmRUaW1lUmFuZ2U7XG4gIHF1ZXJ5PzogRGFzaGJvYXJkUXVlcnk7XG4gIGZpbHRlcnM/OiB1bmtub3duW107XG59O1xuXG50eXBlIFBhcmVudFJlYWR5TWVzc2FnZSA9IHtcbiAgdHlwZTogJ09SR19EQVNIQk9BUkRfRU1CRURfUkVBRFknO1xuICBkYXNoYm9hcmRJZDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgUGFyZW50UmVuZGVyZWRNZXNzYWdlID0ge1xuICB0eXBlOiAnT1JHX0RBU0hCT0FSRF9FTUJFRF9SRU5ERVJFRCc7XG4gIGRhc2hib2FyZElkOiBzdHJpbmc7XG59O1xuXG50eXBlIFBhcmVudEVycm9yTWVzc2FnZSA9IHtcbiAgdHlwZTogJ09SR19EQVNIQk9BUkRfRU1CRURfRVJST1InO1xuICBkYXNoYm9hcmRJZDogc3RyaW5nIHwgbnVsbDtcbiAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxudHlwZSBQYXJlbnRNZXNzYWdlID1cbiAgfCBQYXJlbnRSZWFkeU1lc3NhZ2VcbiAgfCBQYXJlbnRSZW5kZXJlZE1lc3NhZ2VcbiAgfCBQYXJlbnRFcnJvck1lc3NhZ2U7XG5cbmNvbnN0IERFRkFVTFRfQUxMT1dFRF9QQVJFTlRfT1JJR0lOUzogc3RyaW5nW10gPSBbXG4gIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5cbl07XG5cbmZ1bmN0aW9uIGdldEluaXRpYWxEYXNoYm9hcmRJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgcmV0dXJuIHBhcmFtcy5nZXQoJ2Rhc2hib2FyZElkJyk7XG59XG5cbmZ1bmN0aW9uIGdldEFsbG93ZWRQYXJlbnRPcmlnaW5zKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgY29uc3QgcmF3ID0gcGFyYW1zLmdldCgncGFyZW50T3JpZ2luJyk7XG5cbiAgaWYgKCFyYXcpIHtcbiAgICByZXR1cm4gREVGQVVMVF9BTExPV0VEX1BBUkVOVF9PUklHSU5TO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KHJhdyk7XG4gICAgY29uc3Qgb3JpZ2lucyA9IGRlY29kZWRcbiAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAubWFwKChvcmlnaW4pID0+IG9yaWdpbi50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgcmV0dXJuIG9yaWdpbnMubGVuZ3RoID4gMCA/IG9yaWdpbnMgOiBERUZBVUxUX0FMTE9XRURfUEFSRU5UX09SSUdJTlM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBERUZBVUxUX0FMTE9XRURfUEFSRU5UX09SSUdJTlM7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTd2l0Y2hEYXNoYm9hcmRNZXNzYWdlKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFN3aXRjaERhc2hib2FyZE1lc3NhZ2Uge1xuICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGRhdGEgYXMgUGFydGlhbDxTd2l0Y2hEYXNoYm9hcmRNZXNzYWdlPjtcblxuICByZXR1cm4gKFxuICAgIG1lc3NhZ2UudHlwZSA9PT0gJ09SR19EQVNIQk9BUkRfRU1CRURfU1dJVENIX0RBU0hCT0FSRCcgJiZcbiAgICB0eXBlb2YgbWVzc2FnZS5kYXNoYm9hcmRJZCA9PT0gJ3N0cmluZycgJiZcbiAgICBtZXNzYWdlLmRhc2hib2FyZElkLmxlbmd0aCA+IDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gcG9zdFRvUGFyZW50KG1lc3NhZ2U6IFBhcmVudE1lc3NhZ2UsIHRhcmdldE9yaWdpbjogc3RyaW5nKSB7XG4gIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UobWVzc2FnZSwgdGFyZ2V0T3JpZ2luKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE9yZ0Rhc2hib2FyZEVtYmVkQXBwKHtcbiAgY29yZVN0YXJ0LFxuICBkZXBzU3RhcnRcbn06IE1vdW50QXBwQXJncykge1xuICBjb25zdCByb290UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IG1vdW50ZWREYXNoYm9hcmRSZWYgPSB1c2VSZWY8YW55PihudWxsKTtcbiAgY29uc3QgYWxsb3dlZFBhcmVudE9yaWdpbnNSZWYgPSB1c2VSZWY8c3RyaW5nW10+KGdldEFsbG93ZWRQYXJlbnRPcmlnaW5zKCkpO1xuICBjb25zdCBsYXN0UGFyZW50T3JpZ2luUmVmID0gdXNlUmVmPHN0cmluZz4od2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG5cbiAgY29uc3QgW2Rhc2hib2FyZElkLCBzZXREYXNoYm9hcmRJZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihcbiAgICBnZXRJbml0aWFsRGFzaGJvYXJkSWQoKVxuICApO1xuXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvcmVTdGFydC5jaHJvbWUuc2V0SXNWaXNpYmxlKGZhbHNlKTtcbiAgfSwgW2NvcmVTdGFydF0pO1xuXG4gIGNvbnN0IGRlc3Ryb3lDdXJyZW50RGFzaGJvYXJkID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChtb3VudGVkRGFzaGJvYXJkUmVmLmN1cnJlbnQ/LmRlc3Ryb3kpIHtcbiAgICAgIG1vdW50ZWREYXNoYm9hcmRSZWYuY3VycmVudC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgbW91bnRlZERhc2hib2FyZFJlZi5jdXJyZW50ID0gbnVsbDtcblxuICAgIGlmIChyb290UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJvb3RSZWYuY3VycmVudC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBhcHBseVNoYXJlZERhc2hib2FyZFN0YXRlID0gdXNlQ2FsbGJhY2soXG4gICAgKG1lc3NhZ2U6IFN3aXRjaERhc2hib2FyZE1lc3NhZ2UpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLnRpbWVSYW5nZSkge1xuICAgICAgICBkZXBzU3RhcnQuZGF0YS5xdWVyeS50aW1lZmlsdGVyLnRpbWVmaWx0ZXIuc2V0VGltZShtZXNzYWdlLnRpbWVSYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLnF1ZXJ5KSB7XG4gICAgICAgIGRlcHNTdGFydC5kYXRhLnF1ZXJ5LnF1ZXJ5U3RyaW5nLnNldFF1ZXJ5KG1lc3NhZ2UucXVlcnkpO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5maWx0ZXJzKSB7XG4gICAgICAgIGRlcHNTdGFydC5kYXRhLnF1ZXJ5LmZpbHRlck1hbmFnZXIuc2V0RmlsdGVycyhtZXNzYWdlLmZpbHRlcnMgYXMgYW55KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkZXBzU3RhcnQuZGF0YV1cbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uTWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWFsbG93ZWRQYXJlbnRPcmlnaW5zUmVmLmN1cnJlbnQuaW5jbHVkZXMoZXZlbnQub3JpZ2luKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNTd2l0Y2hEYXNoYm9hcmRNZXNzYWdlKGV2ZW50LmRhdGEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGFzdFBhcmVudE9yaWdpblJlZi5jdXJyZW50ID0gZXZlbnQub3JpZ2luO1xuXG4gICAgICBhcHBseVNoYXJlZERhc2hib2FyZFN0YXRlKGV2ZW50LmRhdGEpO1xuICAgICAgc2V0RGFzaGJvYXJkSWQoZXZlbnQuZGF0YS5kYXNoYm9hcmRJZCk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgb25NZXNzYWdlKTtcblxuICAgIHBvc3RUb1BhcmVudChcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ09SR19EQVNIQk9BUkRfRU1CRURfUkVBRFknLFxuICAgICAgICBkYXNoYm9hcmRJZFxuICAgICAgfSxcbiAgICAgIGxhc3RQYXJlbnRPcmlnaW5SZWYuY3VycmVudFxuICAgICk7XG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICB9LCBbYXBwbHlTaGFyZWREYXNoYm9hcmRTdGF0ZSwgZGFzaGJvYXJkSWRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZGFzaGJvYXJkSWQgfHwgIXJvb3RSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlbmRlckRhc2hib2FyZCgpIHtcbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGRlc3Ryb3lDdXJyZW50RGFzaGJvYXJkKCk7XG5cbiAgICAgICAgY29uc3QgZmFjdG9yeSA9XG4gICAgICAgICAgZGVwc1N0YXJ0LmVtYmVkZGFibGUuZ2V0RW1iZWRkYWJsZUZhY3Rvcnk/LignZGFzaGJvYXJkJykgfHxcbiAgICAgICAgICBkZXBzU3RhcnQuZW1iZWRkYWJsZS5nZXRFbWJlZGRhYmxlRmFjdG9yeT8uKCdkYXNoYm9hcmRfY29udGFpbmVyJyk7XG5cbiAgICAgICAgaWYgKCFmYWN0b3J5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdLaWJhbmEgZGFzaGJvYXJkIGVtYmVkZGFibGUgZmFjdG9yeSB3YXMgbm90IGZvdW5kLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW1iZWRkYWJsZSA9IGF3YWl0IGZhY3RvcnkuY3JlYXRlKHtcbiAgICAgICAgICBpZDogZGFzaGJvYXJkSWQsXG4gICAgICAgICAgc2F2ZWRPYmplY3RJZDogZGFzaGJvYXJkSWQsXG4gICAgICAgICAgdmlld01vZGU6ICd2aWV3JyxcbiAgICAgICAgICBoaWRlUGFuZWxUaXRsZXM6IGZhbHNlLFxuICAgICAgICAgIHVzZU1hcmdpbnM6IHRydWUsXG4gICAgICAgICAgc3luY0NvbG9yczogdHJ1ZSxcbiAgICAgICAgICBzeW5jQ3Vyc29yOiB0cnVlLFxuICAgICAgICAgIHN5bmNUb29sdGlwczogdHJ1ZSxcbiAgICAgICAgICB0aW1lUmFuZ2U6IGRlcHNTdGFydC5kYXRhLnF1ZXJ5LnRpbWVmaWx0ZXIudGltZWZpbHRlci5nZXRUaW1lKCksXG4gICAgICAgICAgcXVlcnk6IGRlcHNTdGFydC5kYXRhLnF1ZXJ5LnF1ZXJ5U3RyaW5nLmdldFF1ZXJ5KCksXG4gICAgICAgICAgZmlsdGVyczogZGVwc1N0YXJ0LmRhdGEucXVlcnkuZmlsdGVyTWFuYWdlci5nZXRGaWx0ZXJzKClcbiAgICAgICAgfSBhcyBhbnkpO1xuXG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICBlbWJlZGRhYmxlLmRlc3Ryb3k/LigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVtYmVkZGFibGUucmVuZGVyKHJvb3RSZWYuY3VycmVudCEpO1xuICAgICAgICBtb3VudGVkRGFzaGJvYXJkUmVmLmN1cnJlbnQgPSBlbWJlZGRhYmxlO1xuXG4gICAgICAgIHBvc3RUb1BhcmVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnT1JHX0RBU0hCT0FSRF9FTUJFRF9SRU5ERVJFRCcsXG4gICAgICAgICAgICBkYXNoYm9hcmRJZFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGFzdFBhcmVudE9yaWdpblJlZi5jdXJyZW50XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGRhc2hib2FyZCBlcnJvcic7XG5cbiAgICAgICAgaWYgKHJvb3RSZWYuY3VycmVudCkge1xuICAgICAgICAgIHJvb3RSZWYuY3VycmVudC5pbm5lckhUTUwgPSBcXGBcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJcbiAgICAgICAgICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgICAgICAgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XG4gICAgICAgICAgICAgIGNvbG9yOiAjYmQyNzFlO1xuICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgIEZhaWxlZCB0byByZW5kZXIgZGFzaGJvYXJkOiBcXCR7bWVzc2FnZX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIFxcYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc3RUb1BhcmVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnT1JHX0RBU0hCT0FSRF9FTUJFRF9FUlJPUicsXG4gICAgICAgICAgICBkYXNoYm9hcmRJZCxcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxhc3RQYXJlbnRPcmlnaW5SZWYuY3VycmVudFxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKCFjYW5jZWxsZWQpIHtcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckRhc2hib2FyZCgpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgfTtcbiAgfSwgW2Rhc2hib2FyZElkLCBkZXBzU3RhcnQsIGRlc3Ryb3lDdXJyZW50RGFzaGJvYXJkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZGVzdHJveUN1cnJlbnREYXNoYm9hcmQoKTtcbiAgICB9O1xuICB9LCBbZGVzdHJveUN1cnJlbnREYXNoYm9hcmRdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICBpbnNldDogMCxcbiAgICAgICAgd2lkdGg6ICcxMDB2dycsXG4gICAgICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICBiYWNrZ3JvdW5kOiAnI2ZmZidcbiAgICAgIH19XG4gICAgPlxuICAgICAge2xvYWRpbmcgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgaW5zZXQ6IDAsXG4gICAgICAgICAgICB6SW5kZXg6IDEwLFxuICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICBmb250RmFtaWx5OiAnc2Fucy1zZXJpZicsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAnI2ZmZidcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgTG9hZGluZyBkYXNoYm9hcmTigKZcbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17cm9vdFJlZn1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuYDtcblxuY29uc3QgU0VSVkVSX0lOREVYID0gYGltcG9ydCB0eXBlIHsgUGx1Z2luSW5pdGlhbGl6ZXJDb250ZXh0IH0gZnJvbSAnQGtibi9jb3JlL3NlcnZlcic7XG5pbXBvcnQgeyBPcmdEYXNoYm9hcmRFbWJlZFNlcnZlclBsdWdpbiB9IGZyb20gJy4vcGx1Z2luJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpbihpbml0aWFsaXplckNvbnRleHQ6IFBsdWdpbkluaXRpYWxpemVyQ29udGV4dCkge1xuICByZXR1cm4gbmV3IE9yZ0Rhc2hib2FyZEVtYmVkU2VydmVyUGx1Z2luKGluaXRpYWxpemVyQ29udGV4dCk7XG59XG5gO1xuXG5jb25zdCBTRVJWRVJfUExVR0lOID0gYGltcG9ydCB0eXBlIHtcbiAgQ29yZVNldHVwLFxuICBDb3JlU3RhcnQsXG4gIFBsdWdpbixcbiAgUGx1Z2luSW5pdGlhbGl6ZXJDb250ZXh0XG59IGZyb20gJ0BrYm4vY29yZS9zZXJ2ZXInO1xuXG5leHBvcnQgY2xhc3MgT3JnRGFzaGJvYXJkRW1iZWRTZXJ2ZXJQbHVnaW4gaW1wbGVtZW50cyBQbHVnaW4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGluaXRpYWxpemVyQ29udGV4dDogUGx1Z2luSW5pdGlhbGl6ZXJDb250ZXh0KSB7fVxuXG4gIHB1YmxpYyBzZXR1cChjb3JlOiBDb3JlU2V0dXApIHtcbiAgICBjb25zdCByb3V0ZXIgPSBjb3JlLmh0dHAuY3JlYXRlUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KFxuICAgICAge1xuICAgICAgICBwYXRoOiAnL2FwaS8ke0tJQkFOQV9BUFBfSUR9L2hlYWx0aCcsXG4gICAgICAgIHZhbGlkYXRlOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIGFzeW5jIChjb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2Uub2soe1xuICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgcGx1Z2luOiAnJHtLSUJBTkFfQVBQX0lEfSdcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc3RhcnQoY29yZTogQ29yZVN0YXJ0KSB7fVxuXG4gIHB1YmxpYyBzdG9wKCkge31cbn1cbmA7XG5cbmNvbnN0IFJFQURNRSA9IGAjICR7S0lCQU5BX1BMVUdJTl9JRH1cblxuTXVsdGktdGVuYW50LCBvcmctYWdub3N0aWMgS2liYW5hIGRhc2hib2FyZCBlbWJlZCBwbHVnaW4uXG5cblRoZXJlIGlzIG5ldmVyIHNwYWNlIHN3aXRjaGluZy4gRWFjaCBvcmcgYWxyZWFkeSBsYW5kcyBpbiBpdHMgb3duIEtpYmFuYSBzcGFjZVxudGhyb3VnaCB0aGUgYmFja2VuZCBwcm94eS9zZXNzaW9uIFVSTCwgYW5kIHRoZSBwbHVnaW4gb25seSBzd2l0Y2hlcyBkYXNoYm9hcmRzXG53aXRoaW4gdGhlIGN1cnJlbnQgc3BhY2UuXG5cbiMjIEJ1aWxkXG5cbktpYmFuYSBwbHVnaW5zIG11c3QgbWF0Y2ggdGhlIGV4YWN0IEtpYmFuYSB2ZXJzaW9uIGFuZCBtdXN0IGJlIGJ1aWx0IHdpdGhpbiB0aGVcbktpYmFuYSByZXBvIChzZWUga2JuLXBsdWdpbi1nZW5lcmF0b3IpLiBQbGFjZSB0aGlzIGRpcmVjdG9yeSB1bmRlclxuXFxga2liYW5hLWV4dHJhL1xcYCAob3IgXFxgcGx1Z2lucy9cXGApIGFuZCBydW4gdGhlIEtpYmFuYSBwbHVnaW4gYnVpbGQsIGUuZy46XG5cblxcYFxcYFxcYFxueWFybiBidWlsZFxuXFxgXFxgXFxgXG5cbiMjIEVtYmVkIFVSTFxuXG5cXGBcXGBcXGBcbi9raWJhbmEvYXBwLyR7S0lCQU5BX0FQUF9JRH0/ZGFzaGJvYXJkSWQ9PGlkPiZwYXJlbnRPcmlnaW49PG9yaWdpbj5cblxcYFxcYFxcYFxuXG4jIyBNZXNzYWdlIHByb3RvY29sXG5cbi0gUGFyZW50IC0+IHBsdWdpbjogXFxgT1JHX0RBU0hCT0FSRF9FTUJFRF9TV0lUQ0hfREFTSEJPQVJEXFxgXG4tIFBsdWdpbiAtPiBwYXJlbnQ6IFxcYE9SR19EQVNIQk9BUkRfRU1CRURfUkVBRFlcXGAgLyBcXGBPUkdfREFTSEJPQVJEX0VNQkVEX1JFTkRFUkVEXFxgIC8gXFxgT1JHX0RBU0hCT0FSRF9FTUJFRF9FUlJPUlxcYFxuXG5WZXJzaW9uOiAke0tJQkFOQV9QTFVHSU5fVkVSU0lPTn1cbmA7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgZ2VuZXJhdGVkIHBsdWdpbiBmaWxlcyBmb3IgYSB0YXJnZXQgS2liYW5hIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIHRhcmdldFZlcnNpb24gLSBLaWJhbmEgdmVyc2lvbiBiYWtlZCBpbnRvIGBraWJhbmEuanNvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBraWJhbmFQbHVnaW5GaWxlcyh0YXJnZXRWZXJzaW9uOiBzdHJpbmcpOiBLaWJhbmFQbHVnaW5GaWxlW10ge1xuICBjb25zdCBtYW5pZmVzdCA9IEpTT04uc3RyaW5naWZ5KFxuICAgIHtcbiAgICAgIGlkOiBLSUJBTkFfUExVR0lOX0lELFxuICAgICAgdmVyc2lvbjogS0lCQU5BX1BMVUdJTl9WRVJTSU9OLFxuICAgICAga2liYW5hVmVyc2lvbjogdGFyZ2V0VmVyc2lvbixcbiAgICAgIHNlcnZlcjogdHJ1ZSxcbiAgICAgIHVpOiB0cnVlLFxuICAgICAgcmVxdWlyZWRQbHVnaW5zOiBbXCJkYXNoYm9hcmRcIiwgXCJlbWJlZGRhYmxlXCIsIFwiZGF0YVwiXSxcbiAgICAgIG9wdGlvbmFsUGx1Z2luczogW10sXG4gICAgfSxcbiAgICBudWxsLFxuICAgIDJcbiAgKTtcblxuICByZXR1cm4gW1xuICAgIHsgcGF0aDogXCJraWJhbmEuanNvblwiLCBjb250ZW50OiBgJHttYW5pZmVzdH1cXG5gIH0sXG4gICAgeyBwYXRoOiBcInRzY29uZmlnLmpzb25cIiwgY29udGVudDogYCR7VFNfQ09ORklHfVxcbmAgfSxcbiAgICB7IHBhdGg6IFwiUkVBRE1FLm1kXCIsIGNvbnRlbnQ6IFJFQURNRSB9LFxuICAgIHsgcGF0aDogXCJwdWJsaWMvdHlwZXMudHNcIiwgY29udGVudDogUFVCTElDX1RZUEVTIH0sXG4gICAgeyBwYXRoOiBcInB1YmxpYy9pbmRleC50c1wiLCBjb250ZW50OiBQVUJMSUNfSU5ERVggfSxcbiAgICB7IHBhdGg6IFwicHVibGljL3BsdWdpbi50c3hcIiwgY29udGVudDogUFVCTElDX1BMVUdJTiB9LFxuICAgIHsgcGF0aDogXCJwdWJsaWMvYXBwbGljYXRpb24udHN4XCIsIGNvbnRlbnQ6IFBVQkxJQ19BUFBMSUNBVElPTiB9LFxuICAgIHsgcGF0aDogXCJzZXJ2ZXIvaW5kZXgudHNcIiwgY29udGVudDogU0VSVkVSX0lOREVYIH0sXG4gICAgeyBwYXRoOiBcInNlcnZlci9wbHVnaW4udHNcIiwgY29udGVudDogU0VSVkVSX1BMVUdJTiB9LFxuICBdO1xufVxuIl19
503
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGVtcGxhdGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNGRBLDhDQXFCQztBQWpmRDs7Ozs7Ozs7R0FRRztBQUNILCtDQUF1RjtBQUN2RixNQUFNLFNBQVMsR0FBRzs7OztDQUlqQixDQUFDO0FBQ0YsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0ErQnBCLENBQUM7QUFDRixNQUFNLFlBQVksR0FBRzs7Ozs7O0NBTXBCLENBQUM7QUFDRixNQUFNLGFBQWEsR0FBRzs7Ozs7Ozs7Ozs7Ozs7OzthQWdCVCwyQkFBYTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EwQnpCLENBQUM7QUFDRixNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBNlMxQixDQUFDO0FBQ0YsTUFBTSxZQUFZLEdBQUc7Ozs7OztDQU1wQixDQUFDO0FBQ0YsTUFBTSxhQUFhLEdBQUc7Ozs7Ozs7Ozs7Ozs7OztzQkFlQSwyQkFBYTs7Ozs7Ozt1QkFPWiwyQkFBYTs7Ozs7Ozs7Ozs7Q0FXbkMsQ0FBQztBQUNGLE1BQU0sTUFBTSxHQUFHLEtBQUssOEJBQWdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FxQnRCLDJCQUFhOzs7Ozs7OztXQVFoQixtQ0FBcUI7Q0FDL0IsQ0FBQztBQUNGOzs7O0dBSUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxhQUFhO0lBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUIsRUFBRSxFQUFFLDhCQUFnQjtRQUNwQixPQUFPLEVBQUUsbUNBQXFCO1FBQzlCLGFBQWEsRUFBRSxhQUFhO1FBQzVCLE1BQU0sRUFBRSxJQUFJO1FBQ1osRUFBRSxFQUFFLElBQUk7UUFDUixlQUFlLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQztRQUNwRCxlQUFlLEVBQUUsRUFBRTtLQUN0QixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNaLE9BQU87UUFDSCxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEdBQUcsUUFBUSxJQUFJLEVBQUU7UUFDakQsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxHQUFHLFNBQVMsSUFBSSxFQUFFO1FBQ3BELEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFO1FBQ3RDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUU7UUFDbEQsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRTtRQUNsRCxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFO1FBQ3JELEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRTtRQUMvRCxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFO1FBQ2xELEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUU7S0FDdkQsQ0FBQztBQUNOLENBQUM7QUFDRCxzMm9CQUFzMm9CIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9wbHVnaW5zL2tpYmFuYS90ZW1wbGF0ZXNcbiAqIEBzdW1tYXJ5IFZlcnNpb24tcGFyYW1ldGVyaXplZCBzb3VyY2UgdGVtcGxhdGVzIGZvciB0aGUgS2liYW5hIGVtYmVkIHBsdWdpbi5cbiAqIEBkZXNjcmlwdGlvbiBIb2xkcyB0aGUgZ2VuZXJhdGVkIHBsdWdpbiBzb3VyY2UgYXMgc3RyaW5nIHRlbXBsYXRlcy4gVGhlc2VcbiAqIGFyZSBtYXRlcmlhbGl6ZWQgb250byBkaXNrIGJ5IHRoZSBpbnN0YWxsZXIuIFRoZSBzb3VyY2UgaXMgdGhlIHJlZmVyZW5jZVxuICogbXVsdGktdGVuYW50IGVtYmVkIHBsdWdpbiBwcmVzZXJ2ZWQgaW4gREVDQUYtNDAgwqc4LiBUaGVyZSBpcyBuZXZlciBzcGFjZVxuICogc3dpdGNoaW5nOyB0aGUgcGx1Z2luIGlzIG9yZy1hZ25vc3RpYyBhbmQgdGhlIGN1cnJlbnQgS2liYW5hIHNwYWNlIGNvbWVzXG4gKiBmcm9tIHRoZSByZXF1ZXN0L3Nlc3Npb24vcHJveHkgY29udGV4dC5cbiAqL1xuaW1wb3J0IHsgS0lCQU5BX0FQUF9JRCwgS0lCQU5BX1BMVUdJTl9JRCwgS0lCQU5BX1BMVUdJTl9WRVJTSU9OIH0gZnJvbSBcIi4vbWFuaWZlc3QuanNcIjtcbmNvbnN0IFRTX0NPTkZJRyA9IGB7XG4gIFwiZXh0ZW5kc1wiOiBcIi4uLy4uL3RzY29uZmlnLmpzb25cIixcbiAgXCJpbmNsdWRlXCI6IFtcInB1YmxpYy8qKi8qXCIsIFwic2VydmVyLyoqLypcIl1cbn1cbmA7XG5jb25zdCBQVUJMSUNfVFlQRVMgPSBgaW1wb3J0IHR5cGUge1xuICBBcHBNb3VudFBhcmFtZXRlcnMsXG4gIENvcmVTZXR1cCxcbiAgQ29yZVN0YXJ0LFxuICBQbHVnaW5cbn0gZnJvbSAnQGtibi9jb3JlL3B1YmxpYyc7XG5cbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkU3RhcnQgfSBmcm9tICdAa2JuL2Rhc2hib2FyZC1wbHVnaW4vcHVibGljJztcbmltcG9ydCB0eXBlIHsgRW1iZWRkYWJsZVN0YXJ0IH0gZnJvbSAnQGtibi9lbWJlZGRhYmxlLXBsdWdpbi9wdWJsaWMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhUHVibGljUGx1Z2luU3RhcnQgfSBmcm9tICdAa2JuL2RhdGEtcGx1Z2luL3B1YmxpYyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnRGFzaGJvYXJkRW1iZWRTZXR1cERlcHMge31cblxuZXhwb3J0IGludGVyZmFjZSBPcmdEYXNoYm9hcmRFbWJlZFN0YXJ0RGVwcyB7XG4gIGRhc2hib2FyZDogRGFzaGJvYXJkU3RhcnQ7XG4gIGVtYmVkZGFibGU6IEVtYmVkZGFibGVTdGFydDtcbiAgZGF0YTogRGF0YVB1YmxpY1BsdWdpblN0YXJ0O1xufVxuXG5leHBvcnQgdHlwZSBPcmdEYXNoYm9hcmRFbWJlZFBsdWdpbiA9IFBsdWdpbjxcbiAgdm9pZCxcbiAgdm9pZCxcbiAgT3JnRGFzaGJvYXJkRW1iZWRTZXR1cERlcHMsXG4gIE9yZ0Rhc2hib2FyZEVtYmVkU3RhcnREZXBzXG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vdW50QXBwQXJncyB7XG4gIGNvcmVTdGFydDogQ29yZVN0YXJ0O1xuICBkZXBzU3RhcnQ6IE9yZ0Rhc2hib2FyZEVtYmVkU3RhcnREZXBzO1xuICBwYXJhbXM6IEFwcE1vdW50UGFyYW1ldGVycztcbn1cbmA7XG5jb25zdCBQVUJMSUNfSU5ERVggPSBgaW1wb3J0IHR5cGUgeyBPcmdEYXNoYm9hcmRFbWJlZFBsdWdpbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgT3JnRGFzaGJvYXJkRW1iZWRQbHVnaW5JbXBsIH0gZnJvbSAnLi9wbHVnaW4nO1xuXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luKCk6IE9yZ0Rhc2hib2FyZEVtYmVkUGx1Z2luIHtcbiAgcmV0dXJuIG5ldyBPcmdEYXNoYm9hcmRFbWJlZFBsdWdpbkltcGwoKTtcbn1cbmA7XG5jb25zdCBQVUJMSUNfUExVR0lOID0gYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcblxuaW1wb3J0IHR5cGUgeyBDb3JlU2V0dXAsIENvcmVTdGFydCB9IGZyb20gJ0BrYm4vY29yZS9wdWJsaWMnO1xuaW1wb3J0IHR5cGUge1xuICBPcmdEYXNoYm9hcmRFbWJlZFBsdWdpbixcbiAgT3JnRGFzaGJvYXJkRW1iZWRTZXR1cERlcHMsXG4gIE9yZ0Rhc2hib2FyZEVtYmVkU3RhcnREZXBzXG59IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgT3JnRGFzaGJvYXJkRW1iZWRQbHVnaW5JbXBsIGltcGxlbWVudHMgT3JnRGFzaGJvYXJkRW1iZWRQbHVnaW4ge1xuICBwdWJsaWMgc2V0dXAoXG4gICAgY29yZTogQ29yZVNldHVwPE9yZ0Rhc2hib2FyZEVtYmVkU3RhcnREZXBzPixcbiAgICBkZXBzOiBPcmdEYXNoYm9hcmRFbWJlZFNldHVwRGVwc1xuICApIHtcbiAgICBjb3JlLmFwcGxpY2F0aW9uLnJlZ2lzdGVyKHtcbiAgICAgIGlkOiAnJHtLSUJBTkFfQVBQX0lEfScsXG4gICAgICB0aXRsZTogJ0Rhc2hib2FyZCBFbWJlZCcsXG4gICAgICBjaHJvbWVsZXNzOiB0cnVlLFxuICAgICAgdmlzaWJsZUluOiBbXSxcbiAgICAgIGFzeW5jIG1vdW50KHBhcmFtcykge1xuICAgICAgICBjb25zdCBbY29yZVN0YXJ0LCBkZXBzU3RhcnRdID0gYXdhaXQgY29yZS5nZXRTdGFydFNlcnZpY2VzKCk7XG4gICAgICAgIGNvbnN0IHsgT3JnRGFzaGJvYXJkRW1iZWRBcHAgfSA9IGF3YWl0IGltcG9ydCgnLi9hcHBsaWNhdGlvbicpO1xuXG4gICAgICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgICAgICA8T3JnRGFzaGJvYXJkRW1iZWRBcHBcbiAgICAgICAgICAgIGNvcmVTdGFydD17Y29yZVN0YXJ0fVxuICAgICAgICAgICAgZGVwc1N0YXJ0PXtkZXBzU3RhcnR9XG4gICAgICAgICAgICBwYXJhbXM9e3BhcmFtc31cbiAgICAgICAgICAvPixcbiAgICAgICAgICBwYXJhbXMuZWxlbWVudFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKHBhcmFtcy5lbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydChjb3JlOiBDb3JlU3RhcnQsIGRlcHM6IE9yZ0Rhc2hib2FyZEVtYmVkU3RhcnREZXBzKSB7fVxuXG4gIHB1YmxpYyBzdG9wKCkge31cbn1cbmA7XG5jb25zdCBQVUJMSUNfQVBQTElDQVRJT04gPSBgaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IE1vdW50QXBwQXJncyB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIERhc2hib2FyZFF1ZXJ5ID0ge1xuICBsYW5ndWFnZTogJ2t1ZXJ5JyB8ICdsdWNlbmUnO1xuICBxdWVyeTogc3RyaW5nO1xufTtcblxudHlwZSBEYXNoYm9hcmRUaW1lUmFuZ2UgPSB7XG4gIGZyb206IHN0cmluZztcbiAgdG86IHN0cmluZztcbn07XG5cbnR5cGUgU3dpdGNoRGFzaGJvYXJkTWVzc2FnZSA9IHtcbiAgdHlwZTogJ09SR19EQVNIQk9BUkRfRU1CRURfU1dJVENIX0RBU0hCT0FSRCc7XG4gIGRhc2hib2FyZElkOiBzdHJpbmc7XG4gIHRpbWVSYW5nZT86IERhc2hib2FyZFRpbWVSYW5nZTtcbiAgcXVlcnk/OiBEYXNoYm9hcmRRdWVyeTtcbiAgZmlsdGVycz86IHVua25vd25bXTtcbn07XG5cbnR5cGUgUGFyZW50UmVhZHlNZXNzYWdlID0ge1xuICB0eXBlOiAnT1JHX0RBU0hCT0FSRF9FTUJFRF9SRUFEWSc7XG4gIGRhc2hib2FyZElkOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBQYXJlbnRSZW5kZXJlZE1lc3NhZ2UgPSB7XG4gIHR5cGU6ICdPUkdfREFTSEJPQVJEX0VNQkVEX1JFTkRFUkVEJztcbiAgZGFzaGJvYXJkSWQ6IHN0cmluZztcbn07XG5cbnR5cGUgUGFyZW50RXJyb3JNZXNzYWdlID0ge1xuICB0eXBlOiAnT1JHX0RBU0hCT0FSRF9FTUJFRF9FUlJPUic7XG4gIGRhc2hib2FyZElkOiBzdHJpbmcgfCBudWxsO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG50eXBlIFBhcmVudE1lc3NhZ2UgPVxuICB8IFBhcmVudFJlYWR5TWVzc2FnZVxuICB8IFBhcmVudFJlbmRlcmVkTWVzc2FnZVxuICB8IFBhcmVudEVycm9yTWVzc2FnZTtcblxuY29uc3QgREVGQVVMVF9BTExPV0VEX1BBUkVOVF9PUklHSU5TOiBzdHJpbmdbXSA9IFtcbiAgd2luZG93LmxvY2F0aW9uLm9yaWdpblxuXTtcblxuZnVuY3Rpb24gZ2V0SW5pdGlhbERhc2hib2FyZElkKCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICByZXR1cm4gcGFyYW1zLmdldCgnZGFzaGJvYXJkSWQnKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsb3dlZFBhcmVudE9yaWdpbnMoKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICBjb25zdCByYXcgPSBwYXJhbXMuZ2V0KCdwYXJlbnRPcmlnaW4nKTtcblxuICBpZiAoIXJhdykge1xuICAgIHJldHVybiBERUZBVUxUX0FMTE9XRURfUEFSRU5UX09SSUdJTlM7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVVUklDb21wb25lbnQocmF3KTtcbiAgICBjb25zdCBvcmlnaW5zID0gZGVjb2RlZFxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoKG9yaWdpbikgPT4gb3JpZ2luLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICByZXR1cm4gb3JpZ2lucy5sZW5ndGggPiAwID8gb3JpZ2lucyA6IERFRkFVTFRfQUxMT1dFRF9QQVJFTlRfT1JJR0lOUztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIERFRkFVTFRfQUxMT1dFRF9QQVJFTlRfT1JJR0lOUztcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N3aXRjaERhc2hib2FyZE1lc3NhZ2UoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgU3dpdGNoRGFzaGJvYXJkTWVzc2FnZSB7XG4gIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gZGF0YSBhcyBQYXJ0aWFsPFN3aXRjaERhc2hib2FyZE1lc3NhZ2U+O1xuXG4gIHJldHVybiAoXG4gICAgbWVzc2FnZS50eXBlID09PSAnT1JHX0RBU0hCT0FSRF9FTUJFRF9TV0lUQ0hfREFTSEJPQVJEJyAmJlxuICAgIHR5cGVvZiBtZXNzYWdlLmRhc2hib2FyZElkID09PSAnc3RyaW5nJyAmJlxuICAgIG1lc3NhZ2UuZGFzaGJvYXJkSWQubGVuZ3RoID4gMFxuICApO1xufVxuXG5mdW5jdGlvbiBwb3N0VG9QYXJlbnQobWVzc2FnZTogUGFyZW50TWVzc2FnZSwgdGFyZ2V0T3JpZ2luOiBzdHJpbmcpIHtcbiAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShtZXNzYWdlLCB0YXJnZXRPcmlnaW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gT3JnRGFzaGJvYXJkRW1iZWRBcHAoe1xuICBjb3JlU3RhcnQsXG4gIGRlcHNTdGFydFxufTogTW91bnRBcHBBcmdzKSB7XG4gIGNvbnN0IHJvb3RSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgbW91bnRlZERhc2hib2FyZFJlZiA9IHVzZVJlZjxhbnk+KG51bGwpO1xuICBjb25zdCBhbGxvd2VkUGFyZW50T3JpZ2luc1JlZiA9IHVzZVJlZjxzdHJpbmdbXT4oZ2V0QWxsb3dlZFBhcmVudE9yaWdpbnMoKSk7XG4gIGNvbnN0IGxhc3RQYXJlbnRPcmlnaW5SZWYgPSB1c2VSZWY8c3RyaW5nPih3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcblxuICBjb25zdCBbZGFzaGJvYXJkSWQsIHNldERhc2hib2FyZElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KFxuICAgIGdldEluaXRpYWxEYXNoYm9hcmRJZCgpXG4gICk7XG5cbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29yZVN0YXJ0LmNocm9tZS5zZXRJc1Zpc2libGUoZmFsc2UpO1xuICB9LCBbY29yZVN0YXJ0XSk7XG5cbiAgY29uc3QgZGVzdHJveUN1cnJlbnREYXNoYm9hcmQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKG1vdW50ZWREYXNoYm9hcmRSZWYuY3VycmVudD8uZGVzdHJveSkge1xuICAgICAgbW91bnRlZERhc2hib2FyZFJlZi5jdXJyZW50LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBtb3VudGVkRGFzaGJvYXJkUmVmLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgaWYgKHJvb3RSZWYuY3VycmVudCkge1xuICAgICAgcm9vdFJlZi5jdXJyZW50LmlubmVySFRNTCA9ICcnO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IGFwcGx5U2hhcmVkRGFzaGJvYXJkU3RhdGUgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZTogU3dpdGNoRGFzaGJvYXJkTWVzc2FnZSkgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2UudGltZVJhbmdlKSB7XG4gICAgICAgIGRlcHNTdGFydC5kYXRhLnF1ZXJ5LnRpbWVmaWx0ZXIudGltZWZpbHRlci5zZXRUaW1lKG1lc3NhZ2UudGltZVJhbmdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UucXVlcnkpIHtcbiAgICAgICAgZGVwc1N0YXJ0LmRhdGEucXVlcnkucXVlcnlTdHJpbmcuc2V0UXVlcnkobWVzc2FnZS5xdWVyeSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmZpbHRlcnMpIHtcbiAgICAgICAgZGVwc1N0YXJ0LmRhdGEucXVlcnkuZmlsdGVyTWFuYWdlci5zZXRGaWx0ZXJzKG1lc3NhZ2UuZmlsdGVycyBhcyBhbnkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2RlcHNTdGFydC5kYXRhXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25NZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgIGlmICghYWxsb3dlZFBhcmVudE9yaWdpbnNSZWYuY3VycmVudC5pbmNsdWRlcyhldmVudC5vcmlnaW4pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1N3aXRjaERhc2hib2FyZE1lc3NhZ2UoZXZlbnQuZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsYXN0UGFyZW50T3JpZ2luUmVmLmN1cnJlbnQgPSBldmVudC5vcmlnaW47XG5cbiAgICAgIGFwcGx5U2hhcmVkRGFzaGJvYXJkU3RhdGUoZXZlbnQuZGF0YSk7XG4gICAgICBzZXREYXNoYm9hcmRJZChldmVudC5kYXRhLmRhc2hib2FyZElkKTtcbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuXG4gICAgcG9zdFRvUGFyZW50KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnT1JHX0RBU0hCT0FSRF9FTUJFRF9SRUFEWScsXG4gICAgICAgIGRhc2hib2FyZElkXG4gICAgICB9LFxuICAgICAgbGFzdFBhcmVudE9yaWdpblJlZi5jdXJyZW50XG4gICAgKTtcblxuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSk7XG4gIH0sIFthcHBseVNoYXJlZERhc2hib2FyZFN0YXRlLCBkYXNoYm9hcmRJZF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFkYXNoYm9hcmRJZCB8fCAhcm9vdFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVuZGVyRGFzaGJvYXJkKCkge1xuICAgICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZGVzdHJveUN1cnJlbnREYXNoYm9hcmQoKTtcblxuICAgICAgICBjb25zdCBmYWN0b3J5ID1cbiAgICAgICAgICBkZXBzU3RhcnQuZW1iZWRkYWJsZS5nZXRFbWJlZGRhYmxlRmFjdG9yeT8uKCdkYXNoYm9hcmQnKSB8fFxuICAgICAgICAgIGRlcHNTdGFydC5lbWJlZGRhYmxlLmdldEVtYmVkZGFibGVGYWN0b3J5Py4oJ2Rhc2hib2FyZF9jb250YWluZXInKTtcblxuICAgICAgICBpZiAoIWZhY3RvcnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tpYmFuYSBkYXNoYm9hcmQgZW1iZWRkYWJsZSBmYWN0b3J5IHdhcyBub3QgZm91bmQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbWJlZGRhYmxlID0gYXdhaXQgZmFjdG9yeS5jcmVhdGUoe1xuICAgICAgICAgIGlkOiBkYXNoYm9hcmRJZCxcbiAgICAgICAgICBzYXZlZE9iamVjdElkOiBkYXNoYm9hcmRJZCxcbiAgICAgICAgICB2aWV3TW9kZTogJ3ZpZXcnLFxuICAgICAgICAgIGhpZGVQYW5lbFRpdGxlczogZmFsc2UsXG4gICAgICAgICAgdXNlTWFyZ2luczogdHJ1ZSxcbiAgICAgICAgICBzeW5jQ29sb3JzOiB0cnVlLFxuICAgICAgICAgIHN5bmNDdXJzb3I6IHRydWUsXG4gICAgICAgICAgc3luY1Rvb2x0aXBzOiB0cnVlLFxuICAgICAgICAgIHRpbWVSYW5nZTogZGVwc1N0YXJ0LmRhdGEucXVlcnkudGltZWZpbHRlci50aW1lZmlsdGVyLmdldFRpbWUoKSxcbiAgICAgICAgICBxdWVyeTogZGVwc1N0YXJ0LmRhdGEucXVlcnkucXVlcnlTdHJpbmcuZ2V0UXVlcnkoKSxcbiAgICAgICAgICBmaWx0ZXJzOiBkZXBzU3RhcnQuZGF0YS5xdWVyeS5maWx0ZXJNYW5hZ2VyLmdldEZpbHRlcnMoKVxuICAgICAgICB9IGFzIGFueSk7XG5cbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGVtYmVkZGFibGUuZGVzdHJveT8uKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZW1iZWRkYWJsZS5yZW5kZXIocm9vdFJlZi5jdXJyZW50ISk7XG4gICAgICAgIG1vdW50ZWREYXNoYm9hcmRSZWYuY3VycmVudCA9IGVtYmVkZGFibGU7XG5cbiAgICAgICAgcG9zdFRvUGFyZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdPUkdfREFTSEJPQVJEX0VNQkVEX1JFTkRFUkVEJyxcbiAgICAgICAgICAgIGRhc2hib2FyZElkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsYXN0UGFyZW50T3JpZ2luUmVmLmN1cnJlbnRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZGFzaGJvYXJkIGVycm9yJztcblxuICAgICAgICBpZiAocm9vdFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgcm9vdFJlZi5jdXJyZW50LmlubmVySFRNTCA9IFxcYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIlxuICAgICAgICAgICAgICBwYWRkaW5nOiAyNHB4O1xuICAgICAgICAgICAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbiAgICAgICAgICAgICAgY29sb3I6ICNiZDI3MWU7XG4gICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgRmFpbGVkIHRvIHJlbmRlciBkYXNoYm9hcmQ6IFxcJHttZXNzYWdlfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXFxgO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9zdFRvUGFyZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdPUkdfREFTSEJPQVJEX0VNQkVEX0VSUk9SJyxcbiAgICAgICAgICAgIGRhc2hib2FyZElkLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGFzdFBhcmVudE9yaWdpblJlZi5jdXJyZW50XG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoIWNhbmNlbGxlZCkge1xuICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRGFzaGJvYXJkKCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbZGFzaGJvYXJkSWQsIGRlcHNTdGFydCwgZGVzdHJveUN1cnJlbnREYXNoYm9hcmRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZXN0cm95Q3VycmVudERhc2hib2FyZCgpO1xuICAgIH07XG4gIH0sIFtkZXN0cm95Q3VycmVudERhc2hib2FyZF0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIGluc2V0OiAwLFxuICAgICAgICB3aWR0aDogJzEwMHZ3JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgIGJhY2tncm91bmQ6ICcjZmZmJ1xuICAgICAgfX1cbiAgICA+XG4gICAgICB7bG9hZGluZyAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICAgIHpJbmRleDogMTAsXG4gICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6ICdzYW5zLXNlcmlmJyxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ICcjZmZmJ1xuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICBMb2FkaW5nIGRhc2hib2FyZOKAplxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIDxkaXZcbiAgICAgICAgcmVmPXtyb290UmVmfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIGluc2V0OiAwLFxuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5gO1xuY29uc3QgU0VSVkVSX0lOREVYID0gYGltcG9ydCB0eXBlIHsgUGx1Z2luSW5pdGlhbGl6ZXJDb250ZXh0IH0gZnJvbSAnQGtibi9jb3JlL3NlcnZlcic7XG5pbXBvcnQgeyBPcmdEYXNoYm9hcmRFbWJlZFNlcnZlclBsdWdpbiB9IGZyb20gJy4vcGx1Z2luJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpbihpbml0aWFsaXplckNvbnRleHQ6IFBsdWdpbkluaXRpYWxpemVyQ29udGV4dCkge1xuICByZXR1cm4gbmV3IE9yZ0Rhc2hib2FyZEVtYmVkU2VydmVyUGx1Z2luKGluaXRpYWxpemVyQ29udGV4dCk7XG59XG5gO1xuY29uc3QgU0VSVkVSX1BMVUdJTiA9IGBpbXBvcnQgdHlwZSB7XG4gIENvcmVTZXR1cCxcbiAgQ29yZVN0YXJ0LFxuICBQbHVnaW4sXG4gIFBsdWdpbkluaXRpYWxpemVyQ29udGV4dFxufSBmcm9tICdAa2JuL2NvcmUvc2VydmVyJztcblxuZXhwb3J0IGNsYXNzIE9yZ0Rhc2hib2FyZEVtYmVkU2VydmVyUGx1Z2luIGltcGxlbWVudHMgUGx1Z2luIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpbml0aWFsaXplckNvbnRleHQ6IFBsdWdpbkluaXRpYWxpemVyQ29udGV4dCkge31cblxuICBwdWJsaWMgc2V0dXAoY29yZTogQ29yZVNldHVwKSB7XG4gICAgY29uc3Qgcm91dGVyID0gY29yZS5odHRwLmNyZWF0ZVJvdXRlcigpO1xuXG4gICAgcm91dGVyLmdldChcbiAgICAgIHtcbiAgICAgICAgcGF0aDogJy9hcGkvJHtLSUJBTkFfQVBQX0lEfS9oZWFsdGgnLFxuICAgICAgICB2YWxpZGF0ZTogZmFsc2VcbiAgICAgIH0sXG4gICAgICBhc3luYyAoY29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLm9rKHtcbiAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICAgIHBsdWdpbjogJyR7S0lCQU5BX0FQUF9JRH0nXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0KGNvcmU6IENvcmVTdGFydCkge31cblxuICBwdWJsaWMgc3RvcCgpIHt9XG59XG5gO1xuY29uc3QgUkVBRE1FID0gYCMgJHtLSUJBTkFfUExVR0lOX0lEfVxuXG5NdWx0aS10ZW5hbnQsIG9yZy1hZ25vc3RpYyBLaWJhbmEgZGFzaGJvYXJkIGVtYmVkIHBsdWdpbi5cblxuVGhlcmUgaXMgbmV2ZXIgc3BhY2Ugc3dpdGNoaW5nLiBFYWNoIG9yZyBhbHJlYWR5IGxhbmRzIGluIGl0cyBvd24gS2liYW5hIHNwYWNlXG50aHJvdWdoIHRoZSBiYWNrZW5kIHByb3h5L3Nlc3Npb24gVVJMLCBhbmQgdGhlIHBsdWdpbiBvbmx5IHN3aXRjaGVzIGRhc2hib2FyZHNcbndpdGhpbiB0aGUgY3VycmVudCBzcGFjZS5cblxuIyMgQnVpbGRcblxuS2liYW5hIHBsdWdpbnMgbXVzdCBtYXRjaCB0aGUgZXhhY3QgS2liYW5hIHZlcnNpb24gYW5kIG11c3QgYmUgYnVpbHQgd2l0aGluIHRoZVxuS2liYW5hIHJlcG8gKHNlZSBrYm4tcGx1Z2luLWdlbmVyYXRvcikuIFBsYWNlIHRoaXMgZGlyZWN0b3J5IHVuZGVyXG5cXGBraWJhbmEtZXh0cmEvXFxgIChvciBcXGBwbHVnaW5zL1xcYCkgYW5kIHJ1biB0aGUgS2liYW5hIHBsdWdpbiBidWlsZCwgZS5nLjpcblxuXFxgXFxgXFxgXG55YXJuIGJ1aWxkXG5cXGBcXGBcXGBcblxuIyMgRW1iZWQgVVJMXG5cblxcYFxcYFxcYFxuL2tpYmFuYS9hcHAvJHtLSUJBTkFfQVBQX0lEfT9kYXNoYm9hcmRJZD08aWQ+JnBhcmVudE9yaWdpbj08b3JpZ2luPlxuXFxgXFxgXFxgXG5cbiMjIE1lc3NhZ2UgcHJvdG9jb2xcblxuLSBQYXJlbnQgLT4gcGx1Z2luOiBcXGBPUkdfREFTSEJPQVJEX0VNQkVEX1NXSVRDSF9EQVNIQk9BUkRcXGBcbi0gUGx1Z2luIC0+IHBhcmVudDogXFxgT1JHX0RBU0hCT0FSRF9FTUJFRF9SRUFEWVxcYCAvIFxcYE9SR19EQVNIQk9BUkRfRU1CRURfUkVOREVSRURcXGAgLyBcXGBPUkdfREFTSEJPQVJEX0VNQkVEX0VSUk9SXFxgXG5cblZlcnNpb246ICR7S0lCQU5BX1BMVUdJTl9WRVJTSU9OfVxuYDtcbi8qKlxuICogUmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgZ2VuZXJhdGVkIHBsdWdpbiBmaWxlcyBmb3IgYSB0YXJnZXQgS2liYW5hIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIHRhcmdldFZlcnNpb24gLSBLaWJhbmEgdmVyc2lvbiBiYWtlZCBpbnRvIGBraWJhbmEuanNvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBraWJhbmFQbHVnaW5GaWxlcyh0YXJnZXRWZXJzaW9uKSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGlkOiBLSUJBTkFfUExVR0lOX0lELFxuICAgICAgICB2ZXJzaW9uOiBLSUJBTkFfUExVR0lOX1ZFUlNJT04sXG4gICAgICAgIGtpYmFuYVZlcnNpb246IHRhcmdldFZlcnNpb24sXG4gICAgICAgIHNlcnZlcjogdHJ1ZSxcbiAgICAgICAgdWk6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkUGx1Z2luczogW1wiZGFzaGJvYXJkXCIsIFwiZW1iZWRkYWJsZVwiLCBcImRhdGFcIl0sXG4gICAgICAgIG9wdGlvbmFsUGx1Z2luczogW10sXG4gICAgfSwgbnVsbCwgMik7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgeyBwYXRoOiBcImtpYmFuYS5qc29uXCIsIGNvbnRlbnQ6IGAke21hbmlmZXN0fVxcbmAgfSxcbiAgICAgICAgeyBwYXRoOiBcInRzY29uZmlnLmpzb25cIiwgY29udGVudDogYCR7VFNfQ09ORklHfVxcbmAgfSxcbiAgICAgICAgeyBwYXRoOiBcIlJFQURNRS5tZFwiLCBjb250ZW50OiBSRUFETUUgfSxcbiAgICAgICAgeyBwYXRoOiBcInB1YmxpYy90eXBlcy50c1wiLCBjb250ZW50OiBQVUJMSUNfVFlQRVMgfSxcbiAgICAgICAgeyBwYXRoOiBcInB1YmxpYy9pbmRleC50c1wiLCBjb250ZW50OiBQVUJMSUNfSU5ERVggfSxcbiAgICAgICAgeyBwYXRoOiBcInB1YmxpYy9wbHVnaW4udHN4XCIsIGNvbnRlbnQ6IFBVQkxJQ19QTFVHSU4gfSxcbiAgICAgICAgeyBwYXRoOiBcInB1YmxpYy9hcHBsaWNhdGlvbi50c3hcIiwgY29udGVudDogUFVCTElDX0FQUExJQ0FUSU9OIH0sXG4gICAgICAgIHsgcGF0aDogXCJzZXJ2ZXIvaW5kZXgudHNcIiwgY29udGVudDogU0VSVkVSX0lOREVYIH0sXG4gICAgICAgIHsgcGF0aDogXCJzZXJ2ZXIvcGx1Z2luLnRzXCIsIGNvbnRlbnQ6IFNFUlZFUl9QTFVHSU4gfSxcbiAgICBdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZEdWdGNHeGhkR1Z6TG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhNaU9sc2lMaTR2TGk0dkxpNHZMaTR2YzNKakwzQnNkV2RwYm5NdmEybGlZVzVoTDNSbGJYQnNZWFJsY3k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkJRVHM3T3pzN096czdSMEZSUnp0QlFVTklMRTlCUVU4c1JVRkJSU3hoUVVGaExFVkJRVVVzWjBKQlFXZENMRVZCUVVVc2NVSkJRWEZDTEVWQlFVVXNjMEpCUVcxQ08wRkJVM0JHTEUxQlFVMHNVMEZCVXl4SFFVRkhPenM3TzBOQlNXcENMRU5CUVVNN1FVRkZSaXhOUVVGTkxGbEJRVmtzUjBGQlJ6czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenREUVN0Q2NFSXNRMEZCUXp0QlFVVkdMRTFCUVUwc1dVRkJXU3hIUVVGSE96czdPenM3UTBGTmNFSXNRMEZCUXp0QlFVVkdMRTFCUVUwc1lVRkJZU3hIUVVGSE96czdPenM3T3pzN096czdPenM3TzJGQlowSlVMR0ZCUVdFN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3TzBOQk1FSjZRaXhEUVVGRE8wRkJSVVlzVFVGQlRTeHJRa0ZCYTBJc1IwRkJSenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3p0RFFUWlRNVUlzUTBGQlF6dEJRVVZHTEUxQlFVMHNXVUZCV1N4SFFVRkhPenM3T3pzN1EwRk5jRUlzUTBGQlF6dEJRVVZHTEUxQlFVMHNZVUZCWVN4SFFVRkhPenM3T3pzN096czdPenM3T3pzN2MwSkJaVUVzWVVGQllUczdPenM3T3p0MVFrRlBXaXhoUVVGaE96czdPenM3T3pzN096dERRVmR1UXl4RFFVRkRPMEZCUlVZc1RVRkJUU3hOUVVGTkxFZEJRVWNzUzBGQlN5eG5Ra0ZCWjBJN096czdPenM3T3pzN096czdPenM3T3pzN096dGpRWEZDZEVJc1lVRkJZVHM3T3pzN096czdWMEZSYUVJc2NVSkJRWEZDTzBOQlF5OUNMRU5CUVVNN1FVRkZSanM3T3p0SFFVbEhPMEZCUTBnc1RVRkJUU3hWUVVGVkxHbENRVUZwUWl4RFFVRkRMR0ZCUVhGQ08wbEJRM0pFTEUxQlFVMHNVVUZCVVN4SFFVRkhMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRemRDTzFGQlEwVXNSVUZCUlN4RlFVRkZMR2RDUVVGblFqdFJRVU53UWl4UFFVRlBMRVZCUVVVc2NVSkJRWEZDTzFGQlF6bENMR0ZCUVdFc1JVRkJSU3hoUVVGaE8xRkJRelZDTEUxQlFVMHNSVUZCUlN4SlFVRkpPMUZCUTFvc1JVRkJSU3hGUVVGRkxFbEJRVWs3VVVGRFVpeGxRVUZsTEVWQlFVVXNRMEZCUXl4WFFVRlhMRVZCUVVVc1dVRkJXU3hGUVVGRkxFMUJRVTBzUTBGQlF6dFJRVU53UkN4bFFVRmxMRVZCUVVVc1JVRkJSVHRMUVVOd1FpeEZRVU5FTEVsQlFVa3NSVUZEU2l4RFFVRkRMRU5CUTBZc1EwRkJRenRKUVVWR0xFOUJRVTg3VVVGRFRDeEZRVUZGTEVsQlFVa3NSVUZCUlN4aFFVRmhMRVZCUVVVc1QwRkJUeXhGUVVGRkxFZEJRVWNzVVVGQlVTeEpRVUZKTEVWQlFVVTdVVUZEYWtRc1JVRkJSU3hKUVVGSkxFVkJRVVVzWlVGQlpTeEZRVUZGTEU5QlFVOHNSVUZCUlN4SFFVRkhMRk5CUVZNc1NVRkJTU3hGUVVGRk8xRkJRM0JFTEVWQlFVVXNTVUZCU1N4RlFVRkZMRmRCUVZjc1JVRkJSU3hQUVVGUExFVkJRVVVzVFVGQlRTeEZRVUZGTzFGQlEzUkRMRVZCUVVVc1NVRkJTU3hGUVVGRkxHbENRVUZwUWl4RlFVRkZMRTlCUVU4c1JVRkJSU3haUVVGWkxFVkJRVVU3VVVGRGJFUXNSVUZCUlN4SlFVRkpMRVZCUVVVc2FVSkJRV2xDTEVWQlFVVXNUMEZCVHl4RlFVRkZMRmxCUVZrc1JVRkJSVHRSUVVOc1JDeEZRVUZGTEVsQlFVa3NSVUZCUlN4dFFrRkJiVUlzUlVGQlJTeFBRVUZQTEVWQlFVVXNZVUZCWVN4RlFVRkZPMUZCUTNKRUxFVkJRVVVzU1VGQlNTeEZRVUZGTEhkQ1FVRjNRaXhGUVVGRkxFOUJRVThzUlVGQlJTeHJRa0ZCYTBJc1JVRkJSVHRSUVVNdlJDeEZRVUZGTEVsQlFVa3NSVUZCUlN4cFFrRkJhVUlzUlVGQlJTeFBRVUZQTEVWQlFVVXNXVUZCV1N4RlFVRkZPMUZCUTJ4RUxFVkJRVVVzU1VGQlNTeEZRVUZGTEd0Q1FVRnJRaXhGUVVGRkxFOUJRVThzUlVGQlJTeGhRVUZoTEVWQlFVVTdTMEZEY2tRc1EwRkJRenRCUVVOS0xFTkJRVU1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpcGNiaUFxSUVCdGIyUjFiR1VnYVc1MFpXZHlZWFJwYjI1ekwzQnNkV2RwYm5NdmEybGlZVzVoTDNSbGJYQnNZWFJsYzF4dUlDb2dRSE4xYlcxaGNua2dWbVZ5YzJsdmJpMXdZWEpoYldWMFpYSnBlbVZrSUhOdmRYSmpaU0IwWlcxd2JHRjBaWE1nWm05eUlIUm9aU0JMYVdKaGJtRWdaVzFpWldRZ2NHeDFaMmx1TGx4dUlDb2dRR1JsYzJOeWFYQjBhVzl1SUVodmJHUnpJSFJvWlNCblpXNWxjbUYwWldRZ2NHeDFaMmx1SUhOdmRYSmpaU0JoY3lCemRISnBibWNnZEdWdGNHeGhkR1Z6TGlCVWFHVnpaVnh1SUNvZ1lYSmxJRzFoZEdWeWFXRnNhWHBsWkNCdmJuUnZJR1JwYzJzZ1lua2dkR2hsSUdsdWMzUmhiR3hsY2k0Z1ZHaGxJSE52ZFhKalpTQnBjeUIwYUdVZ2NtVm1aWEpsYm1ObFhHNGdLaUJ0ZFd4MGFTMTBaVzVoYm5RZ1pXMWlaV1FnY0d4MVoybHVJSEJ5WlhObGNuWmxaQ0JwYmlCRVJVTkJSaTAwTUNEQ3B6Z3VJRlJvWlhKbElHbHpJRzVsZG1WeUlITndZV05sWEc0Z0tpQnpkMmwwWTJocGJtYzdJSFJvWlNCd2JIVm5hVzRnYVhNZ2IzSm5MV0ZuYm05emRHbGpJR0Z1WkNCMGFHVWdZM1Z5Y21WdWRDQkxhV0poYm1FZ2MzQmhZMlVnWTI5dFpYTmNiaUFxSUdaeWIyMGdkR2hsSUhKbGNYVmxjM1F2YzJWemMybHZiaTl3Y205NGVTQmpiMjUwWlhoMExseHVJQ292WEc1cGJYQnZjblFnZXlCTFNVSkJUa0ZmUVZCUVgwbEVMQ0JMU1VKQlRrRmZVRXhWUjBsT1gwbEVMQ0JMU1VKQlRrRmZVRXhWUjBsT1gxWkZVbE5KVDA0Z2ZTQm1jbTl0SUZ3aUxpOXRZVzVwWm1WemRGd2lPMXh1WEc1bGVIQnZjblFnYVc1MFpYSm1ZV05sSUV0cFltRnVZVkJzZFdkcGJrWnBiR1VnZTF4dUlDQXZLaW9nVW1Wc1lYUnBkbVVnY0dGMGFDQjNhWFJvYVc0Z2RHaGxJSEJzZFdkcGJpQmthWEpsWTNSdmNua3VJQ292WEc0Z0lIQmhkR2c2SUhOMGNtbHVaenRjYmlBZ0x5b3FJRVpwYkdVZ1kyOXVkR1Z1ZEhNdUlDb3ZYRzRnSUdOdmJuUmxiblE2SUhOMGNtbHVaenRjYm4xY2JseHVZMjl1YzNRZ1ZGTmZRMDlPUmtsSElEMGdZSHRjYmlBZ1hDSmxlSFJsYm1SelhDSTZJRndpTGk0dkxpNHZkSE5qYjI1bWFXY3Vhbk52Ymx3aUxGeHVJQ0JjSW1sdVkyeDFaR1ZjSWpvZ1cxd2ljSFZpYkdsakx5b3FMeXBjSWl3Z1hDSnpaWEoyWlhJdktpb3ZLbHdpWFZ4dWZWeHVZRHRjYmx4dVkyOXVjM1FnVUZWQ1RFbERYMVJaVUVWVElEMGdZR2x0Y0c5eWRDQjBlWEJsSUh0Y2JpQWdRWEJ3VFc5MWJuUlFZWEpoYldWMFpYSnpMRnh1SUNCRGIzSmxVMlYwZFhBc1hHNGdJRU52Y21WVGRHRnlkQ3hjYmlBZ1VHeDFaMmx1WEc1OUlHWnliMjBnSjBCclltNHZZMjl5WlM5d2RXSnNhV01uTzF4dVhHNXBiWEJ2Y25RZ2RIbHdaU0I3SUVSaGMyaGliMkZ5WkZOMFlYSjBJSDBnWm5KdmJTQW5RR3RpYmk5a1lYTm9ZbTloY21RdGNHeDFaMmx1TDNCMVlteHBZeWM3WEc1cGJYQnZjblFnZEhsd1pTQjdJRVZ0WW1Wa1pHRmliR1ZUZEdGeWRDQjlJR1p5YjIwZ0owQnJZbTR2WlcxaVpXUmtZV0pzWlMxd2JIVm5hVzR2Y0hWaWJHbGpKenRjYm1sdGNHOXlkQ0IwZVhCbElIc2dSR0YwWVZCMVlteHBZMUJzZFdkcGJsTjBZWEowSUgwZ1puSnZiU0FuUUd0aWJpOWtZWFJoTFhCc2RXZHBiaTl3ZFdKc2FXTW5PMXh1WEc1bGVIQnZjblFnYVc1MFpYSm1ZV05sSUU5eVowUmhjMmhpYjJGeVpFVnRZbVZrVTJWMGRYQkVaWEJ6SUh0OVhHNWNibVY0Y0c5eWRDQnBiblJsY21aaFkyVWdUM0puUkdGemFHSnZZWEprUlcxaVpXUlRkR0Z5ZEVSbGNITWdlMXh1SUNCa1lYTm9ZbTloY21RNklFUmhjMmhpYjJGeVpGTjBZWEowTzF4dUlDQmxiV0psWkdSaFlteGxPaUJGYldKbFpHUmhZbXhsVTNSaGNuUTdYRzRnSUdSaGRHRTZJRVJoZEdGUWRXSnNhV05RYkhWbmFXNVRkR0Z5ZER0Y2JuMWNibHh1Wlhod2IzSjBJSFI1Y0dVZ1QzSm5SR0Z6YUdKdllYSmtSVzFpWldSUWJIVm5hVzRnUFNCUWJIVm5hVzQ4WEc0Z0lIWnZhV1FzWEc0Z0lIWnZhV1FzWEc0Z0lFOXlaMFJoYzJoaWIyRnlaRVZ0WW1Wa1UyVjBkWEJFWlhCekxGeHVJQ0JQY21kRVlYTm9ZbTloY21SRmJXSmxaRk4wWVhKMFJHVndjMXh1UGp0Y2JseHVaWGh3YjNKMElHbHVkR1Z5Wm1GalpTQk5iM1Z1ZEVGd2NFRnlaM01nZTF4dUlDQmpiM0psVTNSaGNuUTZJRU52Y21WVGRHRnlkRHRjYmlBZ1pHVndjMU4wWVhKME9pQlBjbWRFWVhOb1ltOWhjbVJGYldKbFpGTjBZWEowUkdWd2N6dGNiaUFnY0dGeVlXMXpPaUJCY0hCTmIzVnVkRkJoY21GdFpYUmxjbk03WEc1OVhHNWdPMXh1WEc1amIyNXpkQ0JRVlVKTVNVTmZTVTVFUlZnZ1BTQmdhVzF3YjNKMElIUjVjR1VnZXlCUGNtZEVZWE5vWW05aGNtUkZiV0psWkZCc2RXZHBiaUI5SUdaeWIyMGdKeTR2ZEhsd1pYTW5PMXh1YVcxd2IzSjBJSHNnVDNKblJHRnphR0p2WVhKa1JXMWlaV1JRYkhWbmFXNUpiWEJzSUgwZ1puSnZiU0FuTGk5d2JIVm5hVzRuTzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2NHeDFaMmx1S0NrNklFOXlaMFJoYzJoaWIyRnlaRVZ0WW1Wa1VHeDFaMmx1SUh0Y2JpQWdjbVYwZFhKdUlHNWxkeUJQY21kRVlYTm9ZbTloY21SRmJXSmxaRkJzZFdkcGJrbHRjR3dvS1R0Y2JuMWNibUE3WEc1Y2JtTnZibk4wSUZCVlFreEpRMTlRVEZWSFNVNGdQU0JnYVcxd2IzSjBJRkpsWVdOMElHWnliMjBnSjNKbFlXTjBKenRjYm1sdGNHOXlkQ0JTWldGamRFUlBUU0JtY205dElDZHlaV0ZqZEMxa2IyMG5PMXh1WEc1cGJYQnZjblFnZEhsd1pTQjdJRU52Y21WVFpYUjFjQ3dnUTI5eVpWTjBZWEowSUgwZ1puSnZiU0FuUUd0aWJpOWpiM0psTDNCMVlteHBZeWM3WEc1cGJYQnZjblFnZEhsd1pTQjdYRzRnSUU5eVowUmhjMmhpYjJGeVpFVnRZbVZrVUd4MVoybHVMRnh1SUNCUGNtZEVZWE5vWW05aGNtUkZiV0psWkZObGRIVndSR1Z3Y3l4Y2JpQWdUM0puUkdGemFHSnZZWEprUlcxaVpXUlRkR0Z5ZEVSbGNITmNibjBnWm5KdmJTQW5MaTkwZVhCbGN5YzdYRzVjYm1WNGNHOXlkQ0JqYkdGemN5QlBjbWRFWVhOb1ltOWhjbVJGYldKbFpGQnNkV2RwYmtsdGNHd2dhVzF3YkdWdFpXNTBjeUJQY21kRVlYTm9ZbTloY21SRmJXSmxaRkJzZFdkcGJpQjdYRzRnSUhCMVlteHBZeUJ6WlhSMWNDaGNiaUFnSUNCamIzSmxPaUJEYjNKbFUyVjBkWEE4VDNKblJHRnphR0p2WVhKa1JXMWlaV1JUZEdGeWRFUmxjSE0rTEZ4dUlDQWdJR1JsY0hNNklFOXlaMFJoYzJoaWIyRnlaRVZ0WW1Wa1UyVjBkWEJFWlhCelhHNGdJQ2tnZTF4dUlDQWdJR052Y21VdVlYQndiR2xqWVhScGIyNHVjbVZuYVhOMFpYSW9lMXh1SUNBZ0lDQWdhV1E2SUNja2UwdEpRa0ZPUVY5QlVGQmZTVVI5Snl4Y2JpQWdJQ0FnSUhScGRHeGxPaUFuUkdGemFHSnZZWEprSUVWdFltVmtKeXhjYmlBZ0lDQWdJR05vY205dFpXeGxjM002SUhSeWRXVXNYRzRnSUNBZ0lDQjJhWE5wWW14bFNXNDZJRnRkTEZ4dUlDQWdJQ0FnWVhONWJtTWdiVzkxYm5Rb2NHRnlZVzF6S1NCN1hHNGdJQ0FnSUNBZ0lHTnZibk4wSUZ0amIzSmxVM1JoY25Rc0lHUmxjSE5UZEdGeWRGMGdQU0JoZDJGcGRDQmpiM0psTG1kbGRGTjBZWEowVTJWeWRtbGpaWE1vS1R0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnZXlCUGNtZEVZWE5vWW05aGNtUkZiV0psWkVGd2NDQjlJRDBnWVhkaGFYUWdhVzF3YjNKMEtDY3VMMkZ3Y0d4cFkyRjBhVzl1SnlrN1hHNWNiaUFnSUNBZ0lDQWdVbVZoWTNSRVQwMHVjbVZ1WkdWeUtGeHVJQ0FnSUNBZ0lDQWdJRHhQY21kRVlYTm9ZbTloY21SRmJXSmxaRUZ3Y0Z4dUlDQWdJQ0FnSUNBZ0lDQWdZMjl5WlZOMFlYSjBQWHRqYjNKbFUzUmhjblI5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6VTNSaGNuUTllMlJsY0hOVGRHRnlkSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lIQmhjbUZ0Y3oxN2NHRnlZVzF6ZlZ4dUlDQWdJQ0FnSUNBZ0lDOCtMRnh1SUNBZ0lDQWdJQ0FnSUhCaGNtRnRjeTVsYkdWdFpXNTBYRzRnSUNBZ0lDQWdJQ2s3WEc1Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUNncElEMCtJRkpsWVdOMFJFOU5MblZ1Ylc5MWJuUkRiMjF3YjI1bGJuUkJkRTV2WkdVb2NHRnlZVzF6TG1Wc1pXMWxiblFwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDBwTzF4dUlDQjlYRzVjYmlBZ2NIVmliR2xqSUhOMFlYSjBLR052Y21VNklFTnZjbVZUZEdGeWRDd2daR1Z3Y3pvZ1QzSm5SR0Z6YUdKdllYSmtSVzFpWldSVGRHRnlkRVJsY0hNcElIdDlYRzVjYmlBZ2NIVmliR2xqSUhOMGIzQW9LU0I3ZlZ4dWZWeHVZRHRjYmx4dVkyOXVjM1FnVUZWQ1RFbERYMEZRVUV4SlEwRlVTVTlPSUQwZ1lHbHRjRzl5ZENCU1pXRmpkQ3dnZXlCMWMyVkRZV3hzWW1GamF5d2dkWE5sUldabVpXTjBMQ0IxYzJWU1pXWXNJSFZ6WlZOMFlYUmxJSDBnWm5KdmJTQW5jbVZoWTNRbk8xeHVhVzF3YjNKMElIUjVjR1VnZXlCTmIzVnVkRUZ3Y0VGeVozTWdmU0JtY205dElDY3VMM1I1Y0dWekp6dGNibHh1ZEhsd1pTQkVZWE5vWW05aGNtUlJkV1Z5ZVNBOUlIdGNiaUFnYkdGdVozVmhaMlU2SUNkcmRXVnllU2NnZkNBbmJIVmpaVzVsSnp0Y2JpQWdjWFZsY25rNklITjBjbWx1Wnp0Y2JuMDdYRzVjYm5SNWNHVWdSR0Z6YUdKdllYSmtWR2x0WlZKaGJtZGxJRDBnZTF4dUlDQm1jbTl0T2lCemRISnBibWM3WEc0Z0lIUnZPaUJ6ZEhKcGJtYzdYRzU5TzF4dVhHNTBlWEJsSUZOM2FYUmphRVJoYzJoaWIyRnlaRTFsYzNOaFoyVWdQU0I3WEc0Z0lIUjVjR1U2SUNkUFVrZGZSRUZUU0VKUFFWSkVYMFZOUWtWRVgxTlhTVlJEU0Y5RVFWTklRazlCVWtRbk8xeHVJQ0JrWVhOb1ltOWhjbVJKWkRvZ2MzUnlhVzVuTzF4dUlDQjBhVzFsVW1GdVoyVS9PaUJFWVhOb1ltOWhjbVJVYVcxbFVtRnVaMlU3WEc0Z0lIRjFaWEo1UHpvZ1JHRnphR0p2WVhKa1VYVmxjbms3WEc0Z0lHWnBiSFJsY25NL09pQjFibXR1YjNkdVcxMDdYRzU5TzF4dVhHNTBlWEJsSUZCaGNtVnVkRkpsWVdSNVRXVnpjMkZuWlNBOUlIdGNiaUFnZEhsd1pUb2dKMDlTUjE5RVFWTklRazlCVWtSZlJVMUNSVVJmVWtWQlJGa25PMXh1SUNCa1lYTm9ZbTloY21SSlpEb2djM1J5YVc1bklId2diblZzYkR0Y2JuMDdYRzVjYm5SNWNHVWdVR0Z5Wlc1MFVtVnVaR1Z5WldSTlpYTnpZV2RsSUQwZ2UxeHVJQ0IwZVhCbE9pQW5UMUpIWDBSQlUwaENUMEZTUkY5RlRVSkZSRjlTUlU1RVJWSkZSQ2M3WEc0Z0lHUmhjMmhpYjJGeVpFbGtPaUJ6ZEhKcGJtYzdYRzU5TzF4dVhHNTBlWEJsSUZCaGNtVnVkRVZ5Y205eVRXVnpjMkZuWlNBOUlIdGNiaUFnZEhsd1pUb2dKMDlTUjE5RVFWTklRazlCVWtSZlJVMUNSVVJmUlZKU1QxSW5PMXh1SUNCa1lYTm9ZbTloY21SSlpEb2djM1J5YVc1bklId2diblZzYkR0Y2JpQWdiV1Z6YzJGblpUb2djM1J5YVc1bk8xeHVmVHRjYmx4dWRIbHdaU0JRWVhKbGJuUk5aWE56WVdkbElEMWNiaUFnZkNCUVlYSmxiblJTWldGa2VVMWxjM05oWjJWY2JpQWdmQ0JRWVhKbGJuUlNaVzVrWlhKbFpFMWxjM05oWjJWY2JpQWdmQ0JRWVhKbGJuUkZjbkp2Y2sxbGMzTmhaMlU3WEc1Y2JtTnZibk4wSUVSRlJrRlZURlJmUVV4TVQxZEZSRjlRUVZKRlRsUmZUMUpKUjBsT1V6b2djM1J5YVc1blcxMGdQU0JiWEc0Z0lIZHBibVJ2ZHk1c2IyTmhkR2x2Ymk1dmNtbG5hVzVjYmwwN1hHNWNibVoxYm1OMGFXOXVJR2RsZEVsdWFYUnBZV3hFWVhOb1ltOWhjbVJKWkNncE9pQnpkSEpwYm1jZ2ZDQnVkV3hzSUh0Y2JpQWdZMjl1YzNRZ2NHRnlZVzF6SUQwZ2JtVjNJRlZTVEZObFlYSmphRkJoY21GdGN5aDNhVzVrYjNjdWJHOWpZWFJwYjI0dWMyVmhjbU5vS1R0Y2JpQWdjbVYwZFhKdUlIQmhjbUZ0Y3k1blpYUW9KMlJoYzJoaWIyRnlaRWxrSnlrN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdkbGRFRnNiRzkzWldSUVlYSmxiblJQY21sbmFXNXpLQ2s2SUhOMGNtbHVaMXRkSUh0Y2JpQWdZMjl1YzNRZ2NHRnlZVzF6SUQwZ2JtVjNJRlZTVEZObFlYSmphRkJoY21GdGN5aDNhVzVrYjNjdWJHOWpZWFJwYjI0dWMyVmhjbU5vS1R0Y2JpQWdZMjl1YzNRZ2NtRjNJRDBnY0dGeVlXMXpMbWRsZENnbmNHRnlaVzUwVDNKcFoybHVKeWs3WEc1Y2JpQWdhV1lnS0NGeVlYY3BJSHRjYmlBZ0lDQnlaWFIxY200Z1JFVkdRVlZNVkY5QlRFeFBWMFZFWDFCQlVrVk9WRjlQVWtsSFNVNVRPMXh1SUNCOVhHNWNiaUFnZEhKNUlIdGNiaUFnSUNCamIyNXpkQ0JrWldOdlpHVmtJRDBnWkdWamIyUmxWVkpKUTI5dGNHOXVaVzUwS0hKaGR5azdYRzRnSUNBZ1kyOXVjM1FnYjNKcFoybHVjeUE5SUdSbFkyOWtaV1JjYmlBZ0lDQWdJQzV6Y0d4cGRDZ25MQ2NwWEc0Z0lDQWdJQ0F1YldGd0tDaHZjbWxuYVc0cElEMCtJRzl5YVdkcGJpNTBjbWx0S0NrcFhHNGdJQ0FnSUNBdVptbHNkR1Z5S0VKdmIyeGxZVzRwTzF4dVhHNGdJQ0FnY21WMGRYSnVJRzl5YVdkcGJuTXViR1Z1WjNSb0lENGdNQ0EvSUc5eWFXZHBibk1nT2lCRVJVWkJWVXhVWDBGTVRFOVhSVVJmVUVGU1JVNVVYMDlTU1VkSlRsTTdYRzRnSUgwZ1kyRjBZMmdnZTF4dUlDQWdJSEpsZEhWeWJpQkVSVVpCVlV4VVgwRk1URTlYUlVSZlVFRlNSVTVVWDA5U1NVZEpUbE03WEc0Z0lIMWNibjFjYmx4dVpuVnVZM1JwYjI0Z2FYTlRkMmwwWTJoRVlYTm9ZbTloY21STlpYTnpZV2RsS0dSaGRHRTZJSFZ1YTI1dmQyNHBPaUJrWVhSaElHbHpJRk4zYVhSamFFUmhjMmhpYjJGeVpFMWxjM05oWjJVZ2UxeHVJQ0JwWmlBb0lXUmhkR0VnZkh3Z2RIbHdaVzltSUdSaGRHRWdJVDA5SUNkdlltcGxZM1FuS1NCN1hHNGdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0I5WEc1Y2JpQWdZMjl1YzNRZ2JXVnpjMkZuWlNBOUlHUmhkR0VnWVhNZ1VHRnlkR2xoYkR4VGQybDBZMmhFWVhOb1ltOWhjbVJOWlhOellXZGxQanRjYmx4dUlDQnlaWFIxY200Z0tGeHVJQ0FnSUcxbGMzTmhaMlV1ZEhsd1pTQTlQVDBnSjA5U1IxOUVRVk5JUWs5QlVrUmZSVTFDUlVSZlUxZEpWRU5JWDBSQlUwaENUMEZTUkNjZ0ppWmNiaUFnSUNCMGVYQmxiMllnYldWemMyRm5aUzVrWVhOb1ltOWhjbVJKWkNBOVBUMGdKM04wY21sdVp5Y2dKaVpjYmlBZ0lDQnRaWE56WVdkbExtUmhjMmhpYjJGeVpFbGtMbXhsYm1kMGFDQStJREJjYmlBZ0tUdGNibjFjYmx4dVpuVnVZM1JwYjI0Z2NHOXpkRlJ2VUdGeVpXNTBLRzFsYzNOaFoyVTZJRkJoY21WdWRFMWxjM05oWjJVc0lIUmhjbWRsZEU5eWFXZHBiam9nYzNSeWFXNW5LU0I3WEc0Z0lIZHBibVJ2ZHk1d1lYSmxiblF1Y0c5emRFMWxjM05oWjJVb2JXVnpjMkZuWlN3Z2RHRnlaMlYwVDNKcFoybHVLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlFOXlaMFJoYzJoaWIyRnlaRVZ0WW1Wa1FYQndLSHRjYmlBZ1kyOXlaVk4wWVhKMExGeHVJQ0JrWlhCelUzUmhjblJjYm4wNklFMXZkVzUwUVhCd1FYSm5jeWtnZTF4dUlDQmpiMjV6ZENCeWIyOTBVbVZtSUQwZ2RYTmxVbVZtUEVoVVRVeEVhWFpGYkdWdFpXNTBJSHdnYm5Wc2JENG9iblZzYkNrN1hHNGdJR052Ym5OMElHMXZkVzUwWldSRVlYTm9ZbTloY21SU1pXWWdQU0IxYzJWU1pXWThZVzU1UGlodWRXeHNLVHRjYmlBZ1kyOXVjM1FnWVd4c2IzZGxaRkJoY21WdWRFOXlhV2RwYm5OU1pXWWdQU0IxYzJWU1pXWThjM1J5YVc1blcxMCtLR2RsZEVGc2JHOTNaV1JRWVhKbGJuUlBjbWxuYVc1ektDa3BPMXh1SUNCamIyNXpkQ0JzWVhOMFVHRnlaVzUwVDNKcFoybHVVbVZtSUQwZ2RYTmxVbVZtUEhOMGNtbHVaejRvZDJsdVpHOTNMbXh2WTJGMGFXOXVMbTl5YVdkcGJpazdYRzVjYmlBZ1kyOXVjM1FnVzJSaGMyaGliMkZ5WkVsa0xDQnpaWFJFWVhOb1ltOWhjbVJKWkYwZ1BTQjFjMlZUZEdGMFpUeHpkSEpwYm1jZ2ZDQnVkV3hzUGloY2JpQWdJQ0JuWlhSSmJtbDBhV0ZzUkdGemFHSnZZWEprU1dRb0tWeHVJQ0FwTzF4dVhHNGdJR052Ym5OMElGdHNiMkZrYVc1bkxDQnpaWFJNYjJGa2FXNW5YU0E5SUhWelpWTjBZWFJsS0daaGJITmxLVHRjYmx4dUlDQjFjMlZGWm1abFkzUW9LQ2tnUFQ0Z2UxeHVJQ0FnSUdOdmNtVlRkR0Z5ZEM1amFISnZiV1V1YzJWMFNYTldhWE5wWW14bEtHWmhiSE5sS1R0Y2JpQWdmU3dnVzJOdmNtVlRkR0Z5ZEYwcE8xeHVYRzRnSUdOdmJuTjBJR1JsYzNSeWIzbERkWEp5Wlc1MFJHRnphR0p2WVhKa0lEMGdkWE5sUTJGc2JHSmhZMnNvS0NrZ1BUNGdlMXh1SUNBZ0lHbG1JQ2h0YjNWdWRHVmtSR0Z6YUdKdllYSmtVbVZtTG1OMWNuSmxiblEvTG1SbGMzUnliM2twSUh0Y2JpQWdJQ0FnSUcxdmRXNTBaV1JFWVhOb1ltOWhjbVJTWldZdVkzVnljbVZ1ZEM1a1pYTjBjbTk1S0NrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYlc5MWJuUmxaRVJoYzJoaWIyRnlaRkpsWmk1amRYSnlaVzUwSUQwZ2JuVnNiRHRjYmx4dUlDQWdJR2xtSUNoeWIyOTBVbVZtTG1OMWNuSmxiblFwSUh0Y2JpQWdJQ0FnSUhKdmIzUlNaV1l1WTNWeWNtVnVkQzVwYm01bGNraFVUVXdnUFNBbkp6dGNiaUFnSUNCOVhHNGdJSDBzSUZ0ZEtUdGNibHh1SUNCamIyNXpkQ0JoY0hCc2VWTm9ZWEpsWkVSaGMyaGliMkZ5WkZOMFlYUmxJRDBnZFhObFEyRnNiR0poWTJzb1hHNGdJQ0FnS0cxbGMzTmhaMlU2SUZOM2FYUmphRVJoYzJoaWIyRnlaRTFsYzNOaFoyVXBJRDArSUh0Y2JpQWdJQ0FnSUdsbUlDaHRaWE56WVdkbExuUnBiV1ZTWVc1blpTa2dlMXh1SUNBZ0lDQWdJQ0JrWlhCelUzUmhjblF1WkdGMFlTNXhkV1Z5ZVM1MGFXMWxabWxzZEdWeUxuUnBiV1ZtYVd4MFpYSXVjMlYwVkdsdFpTaHRaWE56WVdkbExuUnBiV1ZTWVc1blpTazdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR2xtSUNodFpYTnpZV2RsTG5GMVpYSjVLU0I3WEc0Z0lDQWdJQ0FnSUdSbGNITlRkR0Z5ZEM1a1lYUmhMbkYxWlhKNUxuRjFaWEo1VTNSeWFXNW5Mbk5sZEZGMVpYSjVLRzFsYzNOaFoyVXVjWFZsY25rcE8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnBaaUFvYldWemMyRm5aUzVtYVd4MFpYSnpLU0I3WEc0Z0lDQWdJQ0FnSUdSbGNITlRkR0Z5ZEM1a1lYUmhMbkYxWlhKNUxtWnBiSFJsY2sxaGJtRm5aWEl1YzJWMFJtbHNkR1Z5Y3lodFpYTnpZV2RsTG1acGJIUmxjbk1nWVhNZ1lXNTVLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlMRnh1SUNBZ0lGdGtaWEJ6VTNSaGNuUXVaR0YwWVYxY2JpQWdLVHRjYmx4dUlDQjFjMlZGWm1abFkzUW9LQ2tnUFQ0Z2UxeHVJQ0FnSUdOdmJuTjBJRzl1VFdWemMyRm5aU0E5SUNobGRtVnVkRG9nVFdWemMyRm5aVVYyWlc1MEtTQTlQaUI3WEc0Z0lDQWdJQ0JwWmlBb0lXRnNiRzkzWldSUVlYSmxiblJQY21sbmFXNXpVbVZtTG1OMWNuSmxiblF1YVc1amJIVmtaWE1vWlhabGJuUXViM0pwWjJsdUtTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR2xtSUNnaGFYTlRkMmwwWTJoRVlYTm9ZbTloY21STlpYTnpZV2RsS0dWMlpXNTBMbVJoZEdFcEtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdiR0Z6ZEZCaGNtVnVkRTl5YVdkcGJsSmxaaTVqZFhKeVpXNTBJRDBnWlhabGJuUXViM0pwWjJsdU8xeHVYRzRnSUNBZ0lDQmhjSEJzZVZOb1lYSmxaRVJoYzJoaWIyRnlaRk4wWVhSbEtHVjJaVzUwTG1SaGRHRXBPMXh1SUNBZ0lDQWdjMlYwUkdGemFHSnZZWEprU1dRb1pYWmxiblF1WkdGMFlTNWtZWE5vWW05aGNtUkpaQ2s3WEc0Z0lDQWdmVHRjYmx4dUlDQWdJSGRwYm1SdmR5NWhaR1JGZG1WdWRFeHBjM1JsYm1WeUtDZHRaWE56WVdkbEp5d2diMjVOWlhOellXZGxLVHRjYmx4dUlDQWdJSEJ2YzNSVWIxQmhjbVZ1ZENoY2JpQWdJQ0FnSUh0Y2JpQWdJQ0FnSUNBZ2RIbHdaVG9nSjA5U1IxOUVRVk5JUWs5QlVrUmZSVTFDUlVSZlVrVkJSRmtuTEZ4dUlDQWdJQ0FnSUNCa1lYTm9ZbTloY21SSlpGeHVJQ0FnSUNBZ2ZTeGNiaUFnSUNBZ0lHeGhjM1JRWVhKbGJuUlBjbWxuYVc1U1pXWXVZM1Z5Y21WdWRGeHVJQ0FnSUNrN1hHNWNiaUFnSUNCeVpYUjFjbTRnS0NrZ1BUNGdkMmx1Wkc5M0xuSmxiVzkyWlVWMlpXNTBUR2x6ZEdWdVpYSW9KMjFsYzNOaFoyVW5MQ0J2YmsxbGMzTmhaMlVwTzF4dUlDQjlMQ0JiWVhCd2JIbFRhR0Z5WldSRVlYTm9ZbTloY21SVGRHRjBaU3dnWkdGemFHSnZZWEprU1dSZEtUdGNibHh1SUNCMWMyVkZabVpsWTNRb0tDa2dQVDRnZTF4dUlDQWdJR2xtSUNnaFpHRnphR0p2WVhKa1NXUWdmSHdnSVhKdmIzUlNaV1l1WTNWeWNtVnVkQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHeGxkQ0JqWVc1alpXeHNaV1FnUFNCbVlXeHpaVHRjYmx4dUlDQWdJR0Z6ZVc1aklHWjFibU4wYVc5dUlISmxibVJsY2tSaGMyaGliMkZ5WkNncElIdGNiaUFnSUNBZ0lITmxkRXh2WVdScGJtY29kSEoxWlNrN1hHNWNiaUFnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUdSbGMzUnliM2xEZFhKeVpXNTBSR0Z6YUdKdllYSmtLQ2s3WEc1Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnWm1GamRHOXllU0E5WEc0Z0lDQWdJQ0FnSUNBZ1pHVndjMU4wWVhKMExtVnRZbVZrWkdGaWJHVXVaMlYwUlcxaVpXUmtZV0pzWlVaaFkzUnZjbmsvTGlnblpHRnphR0p2WVhKa0p5a2dmSHhjYmlBZ0lDQWdJQ0FnSUNCa1pYQnpVM1JoY25RdVpXMWlaV1JrWVdKc1pTNW5aWFJGYldKbFpHUmhZbXhsUm1GamRHOXllVDh1S0Nka1lYTm9ZbTloY21SZlkyOXVkR0ZwYm1WeUp5azdYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tDRm1ZV04wYjNKNUtTQjdYRzRnSUNBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RMYVdKaGJtRWdaR0Z6YUdKdllYSmtJR1Z0WW1Wa1pHRmliR1VnWm1GamRHOXllU0IzWVhNZ2JtOTBJR1p2ZFc1a0xpY3BPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnWlcxaVpXUmtZV0pzWlNBOUlHRjNZV2wwSUdaaFkzUnZjbmt1WTNKbFlYUmxLSHRjYmlBZ0lDQWdJQ0FnSUNCcFpEb2daR0Z6YUdKdllYSmtTV1FzWEc0Z0lDQWdJQ0FnSUNBZ2MyRjJaV1JQWW1wbFkzUkpaRG9nWkdGemFHSnZZWEprU1dRc1hHNGdJQ0FnSUNBZ0lDQWdkbWxsZDAxdlpHVTZJQ2QyYVdWM0p5eGNiaUFnSUNBZ0lDQWdJQ0JvYVdSbFVHRnVaV3hVYVhSc1pYTTZJR1poYkhObExGeHVJQ0FnSUNBZ0lDQWdJSFZ6WlUxaGNtZHBibk02SUhSeWRXVXNYRzRnSUNBZ0lDQWdJQ0FnYzNsdVkwTnZiRzl5Y3pvZ2RISjFaU3hjYmlBZ0lDQWdJQ0FnSUNCemVXNWpRM1Z5YzI5eU9pQjBjblZsTEZ4dUlDQWdJQ0FnSUNBZ0lITjVibU5VYjI5c2RHbHdjem9nZEhKMVpTeGNiaUFnSUNBZ0lDQWdJQ0IwYVcxbFVtRnVaMlU2SUdSbGNITlRkR0Z5ZEM1a1lYUmhMbkYxWlhKNUxuUnBiV1ZtYVd4MFpYSXVkR2x0WldacGJIUmxjaTVuWlhSVWFXMWxLQ2tzWEc0Z0lDQWdJQ0FnSUNBZ2NYVmxjbms2SUdSbGNITlRkR0Z5ZEM1a1lYUmhMbkYxWlhKNUxuRjFaWEo1VTNSeWFXNW5MbWRsZEZGMVpYSjVLQ2tzWEc0Z0lDQWdJQ0FnSUNBZ1ptbHNkR1Z5Y3pvZ1pHVndjMU4wWVhKMExtUmhkR0V1Y1hWbGNua3VabWxzZEdWeVRXRnVZV2RsY2k1blpYUkdhV3gwWlhKektDbGNiaUFnSUNBZ0lDQWdmU0JoY3lCaGJua3BPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaGpZVzVqWld4c1pXUXBJSHRjYmlBZ0lDQWdJQ0FnSUNCbGJXSmxaR1JoWW14bExtUmxjM1J5YjNrL0xpZ3BPMXh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lHVnRZbVZrWkdGaWJHVXVjbVZ1WkdWeUtISnZiM1JTWldZdVkzVnljbVZ1ZENFcE8xeHVJQ0FnSUNBZ0lDQnRiM1Z1ZEdWa1JHRnphR0p2WVhKa1VtVm1MbU4xY25KbGJuUWdQU0JsYldKbFpHUmhZbXhsTzF4dVhHNGdJQ0FnSUNBZ0lIQnZjM1JVYjFCaGNtVnVkQ2hjYmlBZ0lDQWdJQ0FnSUNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwZVhCbE9pQW5UMUpIWDBSQlUwaENUMEZTUkY5RlRVSkZSRjlTUlU1RVJWSkZSQ2NzWEc0Z0lDQWdJQ0FnSUNBZ0lDQmtZWE5vWW05aGNtUkpaRnh1SUNBZ0lDQWdJQ0FnSUgwc1hHNGdJQ0FnSUNBZ0lDQWdiR0Z6ZEZCaGNtVnVkRTl5YVdkcGJsSmxaaTVqZFhKeVpXNTBYRzRnSUNBZ0lDQWdJQ2s3WEc0Z0lDQWdJQ0I5SUdOaGRHTm9JQ2hsY25KdmNpa2dlMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQnRaWE56WVdkbElEMWNiaUFnSUNBZ0lDQWdJQ0JsY25KdmNpQnBibk4wWVc1alpXOW1JRVZ5Y205eUlEOGdaWEp5YjNJdWJXVnpjMkZuWlNBNklDZFZibXR1YjNkdUlHUmhjMmhpYjJGeVpDQmxjbkp2Y2ljN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0hKdmIzUlNaV1l1WTNWeWNtVnVkQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lISnZiM1JTWldZdVkzVnljbVZ1ZEM1cGJtNWxja2hVVFV3Z1BTQmNYR0JjYmlBZ0lDQWdJQ0FnSUNBZ0lEeGthWFlnYzNSNWJHVTlYQ0pjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdjR0ZrWkdsdVp6b2dNalJ3ZUR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05dWRDMW1ZVzFwYkhrNklITmhibk10YzJWeWFXWTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5T2lBalltUXlOekZsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdYQ0krWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJRVpoYVd4bFpDQjBieUJ5Wlc1a1pYSWdaR0Z6YUdKdllYSmtPaUJjWENSN2JXVnpjMkZuWlgxY2JpQWdJQ0FnSUNBZ0lDQWdJRHd2WkdsMlBseHVJQ0FnSUNBZ0lDQWdJRnhjWUR0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEJ2YzNSVWIxQmhjbVZ1ZENoY2JpQWdJQ0FnSUNBZ0lDQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGVYQmxPaUFuVDFKSFgwUkJVMGhDVDBGU1JGOUZUVUpGUkY5RlVsSlBVaWNzWEc0Z0lDQWdJQ0FnSUNBZ0lDQmtZWE5vWW05aGNtUkpaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHMWxjM05oWjJWY2JpQWdJQ0FnSUNBZ0lDQjlMRnh1SUNBZ0lDQWdJQ0FnSUd4aGMzUlFZWEpsYm5SUGNtbG5hVzVTWldZdVkzVnljbVZ1ZEZ4dUlDQWdJQ0FnSUNBcE8xeHVJQ0FnSUNBZ2ZTQm1hVzVoYkd4NUlIdGNiaUFnSUNBZ0lDQWdhV1lnS0NGallXNWpaV3hzWldRcElIdGNiaUFnSUNBZ0lDQWdJQ0J6WlhSTWIyRmthVzVuS0daaGJITmxLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJSEpsYm1SbGNrUmhjMmhpYjJGeVpDZ3BPMXh1WEc0Z0lDQWdjbVYwZFhKdUlDZ3BJRDArSUh0Y2JpQWdJQ0FnSUdOaGJtTmxiR3hsWkNBOUlIUnlkV1U3WEc0Z0lDQWdmVHRjYmlBZ2ZTd2dXMlJoYzJoaWIyRnlaRWxrTENCa1pYQnpVM1JoY25Rc0lHUmxjM1J5YjNsRGRYSnlaVzUwUkdGemFHSnZZWEprWFNrN1hHNWNiaUFnZFhObFJXWm1aV04wS0NncElEMCtJSHRjYmlBZ0lDQnlaWFIxY200Z0tDa2dQVDRnZTF4dUlDQWdJQ0FnWkdWemRISnZlVU4xY25KbGJuUkVZWE5vWW05aGNtUW9LVHRjYmlBZ0lDQjlPMXh1SUNCOUxDQmJaR1Z6ZEhKdmVVTjFjbkpsYm5SRVlYTm9ZbTloY21SZEtUdGNibHh1SUNCeVpYUjFjbTRnS0Z4dUlDQWdJRHhrYVhaY2JpQWdJQ0FnSUhOMGVXeGxQWHQ3WEc0Z0lDQWdJQ0FnSUhCdmMybDBhVzl1T2lBblptbDRaV1FuTEZ4dUlDQWdJQ0FnSUNCcGJuTmxkRG9nTUN4Y2JpQWdJQ0FnSUNBZ2QybGtkR2c2SUNjeE1EQjJkeWNzWEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nSnpFd01IWm9KeXhjYmlBZ0lDQWdJQ0FnYjNabGNtWnNiM2M2SUNkb2FXUmtaVzRuTEZ4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a09pQW5JMlptWmlkY2JpQWdJQ0FnSUgxOVhHNGdJQ0FnUGx4dUlDQWdJQ0FnZTJ4dllXUnBibWNnSmlZZ0tGeHVJQ0FnSUNBZ0lDQThaR2wyWEc0Z0lDQWdJQ0FnSUNBZ2MzUjViR1U5ZTN0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEJ2YzJsMGFXOXVPaUFuWVdKemIyeDFkR1VuTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdhVzV6WlhRNklEQXNYRzRnSUNBZ0lDQWdJQ0FnSUNCNlNXNWtaWGc2SURFd0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnWkdsemNHeGhlVG9nSjJac1pYZ25MRnh1SUNBZ0lDQWdJQ0FnSUNBZ1lXeHBaMjVKZEdWdGN6b2dKMk5sYm5SbGNpY3NYRzRnSUNBZ0lDQWdJQ0FnSUNCcWRYTjBhV1o1UTI5dWRHVnVkRG9nSjJObGJuUmxjaWNzWEc0Z0lDQWdJQ0FnSUNBZ0lDQm1iMjUwUm1GdGFXeDVPaUFuYzJGdWN5MXpaWEpwWmljc1hHNGdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrT2lBbkkyWm1aaWRjYmlBZ0lDQWdJQ0FnSUNCOWZWeHVJQ0FnSUNBZ0lDQStYRzRnSUNBZ0lDQWdJQ0FnVEc5aFpHbHVaeUJrWVhOb1ltOWhjbVRpZ0taY2JpQWdJQ0FnSUNBZ1BDOWthWFkrWEc0Z0lDQWdJQ0FwZlZ4dVhHNGdJQ0FnSUNBOFpHbDJYRzRnSUNBZ0lDQWdJSEpsWmoxN2NtOXZkRkpsWm4xY2JpQWdJQ0FnSUNBZ2MzUjViR1U5ZTN0Y2JpQWdJQ0FnSUNBZ0lDQndiM05wZEdsdmJqb2dKMkZpYzI5c2RYUmxKeXhjYmlBZ0lDQWdJQ0FnSUNCcGJuTmxkRG9nTUN4Y2JpQWdJQ0FnSUNBZ0lDQjNhV1IwYURvZ0p6RXdNQ1VuTEZ4dUlDQWdJQ0FnSUNBZ0lHaGxhV2RvZERvZ0p6RXdNQ1VuWEc0Z0lDQWdJQ0FnSUgxOVhHNGdJQ0FnSUNBdlBseHVJQ0FnSUR3dlpHbDJQbHh1SUNBcE8xeHVmVnh1WUR0Y2JseHVZMjl1YzNRZ1UwVlNWa1ZTWDBsT1JFVllJRDBnWUdsdGNHOXlkQ0IwZVhCbElIc2dVR3gxWjJsdVNXNXBkR2xoYkdsNlpYSkRiMjUwWlhoMElIMGdabkp2YlNBblFHdGliaTlqYjNKbEwzTmxjblpsY2ljN1hHNXBiWEJ2Y25RZ2V5QlBjbWRFWVhOb1ltOWhjbVJGYldKbFpGTmxjblpsY2xCc2RXZHBiaUI5SUdaeWIyMGdKeTR2Y0d4MVoybHVKenRjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUhCc2RXZHBiaWhwYm1sMGFXRnNhWHBsY2tOdmJuUmxlSFE2SUZCc2RXZHBia2x1YVhScFlXeHBlbVZ5UTI5dWRHVjRkQ2tnZTF4dUlDQnlaWFIxY200Z2JtVjNJRTl5WjBSaGMyaGliMkZ5WkVWdFltVmtVMlZ5ZG1WeVVHeDFaMmx1S0dsdWFYUnBZV3hwZW1WeVEyOXVkR1Y0ZENrN1hHNTlYRzVnTzF4dVhHNWpiMjV6ZENCVFJWSldSVkpmVUV4VlIwbE9JRDBnWUdsdGNHOXlkQ0IwZVhCbElIdGNiaUFnUTI5eVpWTmxkSFZ3TEZ4dUlDQkRiM0psVTNSaGNuUXNYRzRnSUZCc2RXZHBiaXhjYmlBZ1VHeDFaMmx1U1c1cGRHbGhiR2w2WlhKRGIyNTBaWGgwWEc1OUlHWnliMjBnSjBCclltNHZZMjl5WlM5elpYSjJaWEluTzF4dVhHNWxlSEJ2Y25RZ1kyeGhjM01nVDNKblJHRnphR0p2WVhKa1JXMWlaV1JUWlhKMlpYSlFiSFZuYVc0Z2FXMXdiR1Z0Wlc1MGN5QlFiSFZuYVc0Z2UxeHVJQ0JqYjI1emRISjFZM1J2Y2lod2NtbDJZWFJsSUhKbFlXUnZibXg1SUdsdWFYUnBZV3hwZW1WeVEyOXVkR1Y0ZERvZ1VHeDFaMmx1U1c1cGRHbGhiR2w2WlhKRGIyNTBaWGgwS1NCN2ZWeHVYRzRnSUhCMVlteHBZeUJ6WlhSMWNDaGpiM0psT2lCRGIzSmxVMlYwZFhBcElIdGNiaUFnSUNCamIyNXpkQ0J5YjNWMFpYSWdQU0JqYjNKbExtaDBkSEF1WTNKbFlYUmxVbTkxZEdWeUtDazdYRzVjYmlBZ0lDQnliM1YwWlhJdVoyVjBLRnh1SUNBZ0lDQWdlMXh1SUNBZ0lDQWdJQ0J3WVhSb09pQW5MMkZ3YVM4a2UwdEpRa0ZPUVY5QlVGQmZTVVI5TDJobFlXeDBhQ2NzWEc0Z0lDQWdJQ0FnSUhaaGJHbGtZWFJsT2lCbVlXeHpaVnh1SUNBZ0lDQWdmU3hjYmlBZ0lDQWdJR0Z6ZVc1aklDaGpiMjUwWlhoMExDQnlaWEYxWlhOMExDQnlaWE53YjI1elpTa2dQVDRnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnY21WemNHOXVjMlV1YjJzb2UxeHVJQ0FnSUNBZ0lDQWdJR0p2WkhrNklIdGNiaUFnSUNBZ0lDQWdJQ0FnSUc5ck9pQjBjblZsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjR3gxWjJsdU9pQW5KSHRMU1VKQlRrRmZRVkJRWDBsRWZTZGNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNrN1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ2MzUmhjblFvWTI5eVpUb2dRMjl5WlZOMFlYSjBLU0I3ZlZ4dVhHNGdJSEIxWW14cFl5QnpkRzl3S0NrZ2UzMWNibjFjYm1BN1hHNWNibU52Ym5OMElGSkZRVVJOUlNBOUlHQWpJQ1I3UzBsQ1FVNUJYMUJNVlVkSlRsOUpSSDFjYmx4dVRYVnNkR2t0ZEdWdVlXNTBMQ0J2Y21jdFlXZHViM04wYVdNZ1MybGlZVzVoSUdSaGMyaGliMkZ5WkNCbGJXSmxaQ0J3YkhWbmFXNHVYRzVjYmxSb1pYSmxJR2x6SUc1bGRtVnlJSE53WVdObElITjNhWFJqYUdsdVp5NGdSV0ZqYUNCdmNtY2dZV3h5WldGa2VTQnNZVzVrY3lCcGJpQnBkSE1nYjNkdUlFdHBZbUZ1WVNCemNHRmpaVnh1ZEdoeWIzVm5hQ0IwYUdVZ1ltRmphMlZ1WkNCd2NtOTRlUzl6WlhOemFXOXVJRlZTVEN3Z1lXNWtJSFJvWlNCd2JIVm5hVzRnYjI1c2VTQnpkMmwwWTJobGN5QmtZWE5vWW05aGNtUnpYRzUzYVhSb2FXNGdkR2hsSUdOMWNuSmxiblFnYzNCaFkyVXVYRzVjYmlNaklFSjFhV3hrWEc1Y2JrdHBZbUZ1WVNCd2JIVm5hVzV6SUcxMWMzUWdiV0YwWTJnZ2RHaGxJR1Y0WVdOMElFdHBZbUZ1WVNCMlpYSnphVzl1SUdGdVpDQnRkWE4wSUdKbElHSjFhV3gwSUhkcGRHaHBiaUIwYUdWY2JrdHBZbUZ1WVNCeVpYQnZJQ2h6WldVZ2EySnVMWEJzZFdkcGJpMW5aVzVsY21GMGIzSXBMaUJRYkdGalpTQjBhR2x6SUdScGNtVmpkRzl5ZVNCMWJtUmxjbHh1WEZ4Z2EybGlZVzVoTFdWNGRISmhMMXhjWUNBb2IzSWdYRnhnY0d4MVoybHVjeTljWEdBcElHRnVaQ0J5ZFc0Z2RHaGxJRXRwWW1GdVlTQndiSFZuYVc0Z1luVnBiR1FzSUdVdVp5NDZYRzVjYmx4Y1lGeGNZRnhjWUZ4dWVXRnliaUJpZFdsc1pGeHVYRnhnWEZ4Z1hGeGdYRzVjYmlNaklFVnRZbVZrSUZWU1RGeHVYRzVjWEdCY1hHQmNYR0JjYmk5cmFXSmhibUV2WVhCd0x5UjdTMGxDUVU1QlgwRlFVRjlKUkgwL1pHRnphR0p2WVhKa1NXUTlQR2xrUGlad1lYSmxiblJQY21sbmFXNDlQRzl5YVdkcGJqNWNibHhjWUZ4Y1lGeGNZRnh1WEc0akl5Qk5aWE56WVdkbElIQnliM1J2WTI5c1hHNWNiaTBnVUdGeVpXNTBJQzArSUhCc2RXZHBiam9nWEZ4Z1QxSkhYMFJCVTBoQ1QwRlNSRjlGVFVKRlJGOVRWMGxVUTBoZlJFRlRTRUpQUVZKRVhGeGdYRzR0SUZCc2RXZHBiaUF0UGlCd1lYSmxiblE2SUZ4Y1lFOVNSMTlFUVZOSVFrOUJVa1JmUlUxQ1JVUmZVa1ZCUkZsY1hHQWdMeUJjWEdCUFVrZGZSRUZUU0VKUFFWSkVYMFZOUWtWRVgxSkZUa1JGVWtWRVhGeGdJQzhnWEZ4Z1QxSkhYMFJCVTBoQ1QwRlNSRjlGVFVKRlJGOUZVbEpQVWx4Y1lGeHVYRzVXWlhKemFXOXVPaUFrZTB0SlFrRk9RVjlRVEZWSFNVNWZWa1ZTVTBsUFRuMWNibUE3WEc1Y2JpOHFLbHh1SUNvZ1VtVjBkWEp1Y3lCMGFHVWdablZzYkNCelpYUWdiMllnWjJWdVpYSmhkR1ZrSUhCc2RXZHBiaUJtYVd4bGN5Qm1iM0lnWVNCMFlYSm5aWFFnUzJsaVlXNWhJSFpsY25OcGIyNHVYRzRnS2x4dUlDb2dRSEJoY21GdElIUmhjbWRsZEZabGNuTnBiMjRnTFNCTGFXSmhibUVnZG1WeWMybHZiaUJpWVd0bFpDQnBiblJ2SUdCcmFXSmhibUV1YW5OdmJtQXVYRzRnS2k5Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCcmFXSmhibUZRYkhWbmFXNUdhV3hsY3loMFlYSm5aWFJXWlhKemFXOXVPaUJ6ZEhKcGJtY3BPaUJMYVdKaGJtRlFiSFZuYVc1R2FXeGxXMTBnZTF4dUlDQmpiMjV6ZENCdFlXNXBabVZ6ZENBOUlFcFRUMDR1YzNSeWFXNW5hV1o1S0Z4dUlDQWdJSHRjYmlBZ0lDQWdJR2xrT2lCTFNVSkJUa0ZmVUV4VlIwbE9YMGxFTEZ4dUlDQWdJQ0FnZG1WeWMybHZiam9nUzBsQ1FVNUJYMUJNVlVkSlRsOVdSVkpUU1U5T0xGeHVJQ0FnSUNBZ2EybGlZVzVoVm1WeWMybHZiam9nZEdGeVoyVjBWbVZ5YzJsdmJpeGNiaUFnSUNBZ0lITmxjblpsY2pvZ2RISjFaU3hjYmlBZ0lDQWdJSFZwT2lCMGNuVmxMRnh1SUNBZ0lDQWdjbVZ4ZFdseVpXUlFiSFZuYVc1ek9pQmJYQ0prWVhOb1ltOWhjbVJjSWl3Z1hDSmxiV0psWkdSaFlteGxYQ0lzSUZ3aVpHRjBZVndpWFN4Y2JpQWdJQ0FnSUc5d2RHbHZibUZzVUd4MVoybHVjem9nVzEwc1hHNGdJQ0FnZlN4Y2JpQWdJQ0J1ZFd4c0xGeHVJQ0FnSURKY2JpQWdLVHRjYmx4dUlDQnlaWFIxY200Z1cxeHVJQ0FnSUhzZ2NHRjBhRG9nWENKcmFXSmhibUV1YW5OdmJsd2lMQ0JqYjI1MFpXNTBPaUJnSkh0dFlXNXBabVZ6ZEgxY1hHNWdJSDBzWEc0Z0lDQWdleUJ3WVhSb09pQmNJblJ6WTI5dVptbG5MbXB6YjI1Y0lpd2dZMjl1ZEdWdWREb2dZQ1I3VkZOZlEwOU9Sa2xIZlZ4Y2JtQWdmU3hjYmlBZ0lDQjdJSEJoZEdnNklGd2lVa1ZCUkUxRkxtMWtYQ0lzSUdOdmJuUmxiblE2SUZKRlFVUk5SU0I5TEZ4dUlDQWdJSHNnY0dGMGFEb2dYQ0p3ZFdKc2FXTXZkSGx3WlhNdWRITmNJaXdnWTI5dWRHVnVkRG9nVUZWQ1RFbERYMVJaVUVWVElIMHNYRzRnSUNBZ2V5QndZWFJvT2lCY0luQjFZbXhwWXk5cGJtUmxlQzUwYzF3aUxDQmpiMjUwWlc1ME9pQlFWVUpNU1VOZlNVNUVSVmdnZlN4Y2JpQWdJQ0I3SUhCaGRHZzZJRndpY0hWaWJHbGpMM0JzZFdkcGJpNTBjM2hjSWl3Z1kyOXVkR1Z1ZERvZ1VGVkNURWxEWDFCTVZVZEpUaUI5TEZ4dUlDQWdJSHNnY0dGMGFEb2dYQ0p3ZFdKc2FXTXZZWEJ3YkdsallYUnBiMjR1ZEhONFhDSXNJR052Ym5SbGJuUTZJRkJWUWt4SlExOUJVRkJNU1VOQlZFbFBUaUI5TEZ4dUlDQWdJSHNnY0dGMGFEb2dYQ0p6WlhKMlpYSXZhVzVrWlhndWRITmNJaXdnWTI5dWRHVnVkRG9nVTBWU1ZrVlNYMGxPUkVWWUlIMHNYRzRnSUNBZ2V5QndZWFJvT2lCY0luTmxjblpsY2k5d2JIVm5hVzR1ZEhOY0lpd2dZMjl1ZEdWdWREb2dVMFZTVmtWU1gxQk1WVWRKVGlCOUxGeHVJQ0JkTzF4dWZWeHVJbDE5Il19