@xbstracts/medusa-coupons 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.medusa/server/src/admin/index.js +3207 -0
  2. package/.medusa/server/src/admin/index.mjs +3253 -0
  3. package/.medusa/server/src/api/admin/coupon-products/[product_id]/entitlements/route.js +9 -0
  4. package/.medusa/server/src/api/admin/coupon-products/[product_id]/mirror-promotion/route.js +132 -0
  5. package/.medusa/server/src/api/admin/coupon-products/[product_id]/preview/route.js +28 -0
  6. package/.medusa/server/src/api/admin/coupon-products/[product_id]/route.js +18 -0
  7. package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
  8. package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/route.js +14 -0
  9. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/route.js +53 -0
  10. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +26 -0
  11. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/route.js +27 -0
  12. package/.medusa/server/src/api/admin/coupon-products/configs/route.js +36 -0
  13. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/cancel/route.js +15 -0
  14. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/redeem/route.js +15 -0
  15. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/route.js +16 -0
  16. package/.medusa/server/src/api/admin/coupon-products/entitlements/route.js +22 -0
  17. package/.medusa/server/src/api/admin/coupon-products/options/route.js +9 -0
  18. package/.medusa/server/src/api/admin/coupon-products/products/route.js +16 -0
  19. package/.medusa/server/src/api/admin/coupon-products/route.js +13 -0
  20. package/.medusa/server/src/api/admin/coupon-products/uploads/route.js +7 -0
  21. package/.medusa/server/src/api/coupon-product-routes.js +546 -0
  22. package/.medusa/server/src/api/entitlement-utils.js +90 -0
  23. package/.medusa/server/src/api/media-upload.js +57 -0
  24. package/.medusa/server/src/api/middlewares.js +92 -0
  25. package/.medusa/server/src/api/product-utils.js +304 -0
  26. package/.medusa/server/src/api/promotion-code-resolver.js +225 -0
  27. package/.medusa/server/src/api/seller-utils.js +101 -0
  28. package/.medusa/server/src/api/utils.js +25 -0
  29. package/.medusa/server/src/api/validators.js +199 -0
  30. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/entitlements/route.js +9 -0
  31. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/route.js +18 -0
  32. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
  33. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/route.js +14 -0
  34. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/route.js +60 -0
  35. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +41 -0
  36. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/route.js +45 -0
  37. package/.medusa/server/src/api/vendor/coupon-products/configs/route.js +51 -0
  38. package/.medusa/server/src/api/vendor/coupon-products/entitlements/[id]/route.js +25 -0
  39. package/.medusa/server/src/api/vendor/coupon-products/entitlements/route.js +45 -0
  40. package/.medusa/server/src/api/vendor/coupon-products/options/route.js +9 -0
  41. package/.medusa/server/src/api/vendor/coupon-products/products/route.js +19 -0
  42. package/.medusa/server/src/api/vendor/coupon-products/route.js +13 -0
  43. package/.medusa/server/src/api/vendor/coupon-products/uploads/route.js +7 -0
  44. package/.medusa/server/src/jobs/retry-coupon-media-deletes.js +14 -0
  45. package/.medusa/server/src/links/coupon-issuance-order-line-item.js +17 -0
  46. package/.medusa/server/src/links/coupon-issuance-order.js +15 -0
  47. package/.medusa/server/src/links/coupon-product-config-product.js +17 -0
  48. package/.medusa/server/src/links/coupon-product-variant-config-variant.js +17 -0
  49. package/.medusa/server/src/links/coupon-promotion-mirror-promotion.js +17 -0
  50. package/.medusa/server/src/links/customer-coupon-entitlement-customer.js +15 -0
  51. package/.medusa/server/src/modules/coupon/constants.js +46 -0
  52. package/.medusa/server/src/modules/coupon/index.js +16 -0
  53. package/.medusa/server/src/modules/coupon/loaders/reconcile-coupon-products.js +65 -0
  54. package/.medusa/server/src/modules/coupon/migrations/Migration20260709000000.js +40 -0
  55. package/.medusa/server/src/modules/coupon/migrations/Migration20260710000000.js +22 -0
  56. package/.medusa/server/src/modules/coupon/migrations/Migration20260711000000.js +25 -0
  57. package/.medusa/server/src/modules/coupon/migrations/Migration20260712000000.js +78 -0
  58. package/.medusa/server/src/modules/coupon/migrations/Migration20260719000000.js +19 -0
  59. package/.medusa/server/src/modules/coupon/migrations/Migration20260722000000.js +17 -0
  60. package/.medusa/server/src/modules/coupon/migrations/Migration20260723000000.js +18 -0
  61. package/.medusa/server/src/modules/coupon/models/coupon-entitlement-promotion.js +31 -0
  62. package/.medusa/server/src/modules/coupon/models/coupon-entitlement-seller.js +28 -0
  63. package/.medusa/server/src/modules/coupon/models/coupon-issuance.js +35 -0
  64. package/.medusa/server/src/modules/coupon/models/coupon-media-asset.js +41 -0
  65. package/.medusa/server/src/modules/coupon/models/coupon-product-config.js +45 -0
  66. package/.medusa/server/src/modules/coupon/models/coupon-product-variant-config.js +36 -0
  67. package/.medusa/server/src/modules/coupon/models/coupon-promotion-mirror.js +27 -0
  68. package/.medusa/server/src/modules/coupon/models/customer-coupon-entitlement.js +56 -0
  69. package/.medusa/server/src/modules/coupon/models/index.js +23 -0
  70. package/.medusa/server/src/modules/coupon/payment-order-utils.js +76 -0
  71. package/.medusa/server/src/modules/coupon/product-metadata.js +24 -0
  72. package/.medusa/server/src/modules/coupon/purchase-conditions.js +138 -0
  73. package/.medusa/server/src/modules/coupon/service.js +628 -0
  74. package/.medusa/server/src/modules/coupon/types.js +3 -0
  75. package/.medusa/server/src/modules/coupon/utils.js +302 -0
  76. package/.medusa/server/src/subscribers/issue-coupons-from-order.js +88 -0
  77. package/.medusa/server/src/vendor/index.mjs +3237 -0
  78. package/.medusa/server/src/workflows/hooks/validate-coupon-add-to-cart.js +13 -0
  79. package/.medusa/server/src/workflows/hooks/validate-coupon-complete-cart.js +8 -0
  80. package/.medusa/server/src/workflows/index.js +21 -0
  81. package/.medusa/server/src/workflows/steps.js +27 -0
  82. package/.medusa/server/src/workflows/validate-coupon-purchase.js +85 -0
  83. package/README.md +84 -0
  84. package/package.json +102 -0
@@ -0,0 +1,3207 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/admin/index.ts
21
+ var admin_exports = {};
22
+ __export(admin_exports, {
23
+ default: () => admin_default
24
+ });
25
+ module.exports = __toCommonJS(admin_exports);
26
+
27
+ // src/admin/i18n/en.json
28
+ var en_default = {
29
+ coupons: {
30
+ menu: "Coupons",
31
+ productsMenu: "Coupon Products"
32
+ }
33
+ };
34
+
35
+ // src/admin/i18n/index.ts
36
+ var i18n_default = {
37
+ en: {
38
+ translation: en_default
39
+ }
40
+ };
41
+
42
+ // src/admin/routes/coupons/page.tsx
43
+ var import_icons3 = require("@medusajs/icons");
44
+
45
+ // src/dashboard/coupons/coupon-manager.tsx
46
+ var import_react2 = require("react");
47
+ var import_icons2 = require("@medusajs/icons");
48
+ var import_ui3 = require("@medusajs/ui");
49
+
50
+ // src/dashboard/coupons/coupon-products-page.tsx
51
+ var import_react = require("react");
52
+ var import_icons = require("@medusajs/icons");
53
+ var import_ui2 = require("@medusajs/ui");
54
+
55
+ // src/dashboard/coupons/empty-state.tsx
56
+ var import_ui = require("@medusajs/ui");
57
+ var import_jsx_runtime = require("react/jsx-runtime");
58
+ function CouponEmptyState({
59
+ description,
60
+ title
61
+ }) {
62
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex w-full flex-1 flex-col overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex min-h-[250px] w-full flex-1 flex-col items-center justify-center px-6 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex size-full flex-col items-center justify-center gap-2 text-center", children: [
63
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.Text, { weight: "plus", children: title }),
64
+ description ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.Text, { children: description }) : null
65
+ ] }) }) });
66
+ }
67
+
68
+ // src/dashboard/coupons/coupon-products-page.tsx
69
+ var import_jsx_runtime2 = require("react/jsx-runtime");
70
+ var NONE = "__none__";
71
+ var allSteps = ["details", "organize", "campaign", "prices"];
72
+ var conditionAttributes = [
73
+ { value: "customer.groups.id", label: "Customer Group" },
74
+ { value: "region.id", label: "Region" },
75
+ { value: "shipping_address.country_code", label: "Country" },
76
+ { value: "sales_channel_id", label: "Sales Channel" },
77
+ { value: "currency_code", label: "Currency Code" }
78
+ ];
79
+ var conditionOperators = [
80
+ { value: "in", label: "In" },
81
+ { value: "eq", label: "Equals" },
82
+ { value: "ne", label: "Not In" }
83
+ ];
84
+ var typeChoices = [
85
+ {
86
+ value: "amount_off_products",
87
+ label: "Amount off products",
88
+ description: "Discount specific products or a collection of products"
89
+ },
90
+ {
91
+ value: "amount_off_order",
92
+ label: "Amount off order",
93
+ description: "Discount the total order amount"
94
+ },
95
+ {
96
+ value: "percentage_off_product",
97
+ label: "Percentage off product",
98
+ description: "Discount a percentage off selected products"
99
+ },
100
+ {
101
+ value: "percentage_off_order",
102
+ label: "Percentage off order",
103
+ description: "Discount a percentage off the total order amount"
104
+ },
105
+ {
106
+ value: "buy_x_get_y",
107
+ label: "Buy X Get Y",
108
+ description: "Issue a Buy X Get Y coupon entitlement"
109
+ },
110
+ {
111
+ value: "free_shipping",
112
+ label: "Free shipping",
113
+ description: "Apply a 100% discount to shipping fees"
114
+ }
115
+ ];
116
+ var statusChoices = [
117
+ {
118
+ value: "draft",
119
+ label: "Draft",
120
+ description: "Customers will not be able to use the code yet"
121
+ },
122
+ {
123
+ value: "active",
124
+ label: "Active",
125
+ description: "Customers will be able to use the code"
126
+ },
127
+ {
128
+ value: "inactive",
129
+ label: "Inactive",
130
+ description: "Keep the promotion unavailable until reactivated"
131
+ }
132
+ ];
133
+ function backendUrl() {
134
+ return typeof __BACKEND_URL__ === "string" ? __BACKEND_URL__.replace(/\/$/, "") : "";
135
+ }
136
+ function apiErrorMessage(payload, fallback) {
137
+ return [payload?.message, payload?.error?.message, payload?.error].find(
138
+ (candidate) => typeof candidate === "string" && candidate.trim()
139
+ ) || fallback || "Request failed";
140
+ }
141
+ async function apiFetch(path, options = {}) {
142
+ const response = await fetch(`${backendUrl()}${path}`, {
143
+ ...options,
144
+ credentials: "include",
145
+ headers: {
146
+ ...options.body ? { "Content-Type": "application/json" } : {},
147
+ ...options.headers
148
+ }
149
+ });
150
+ if (!response.ok) {
151
+ const payload = await response.json().catch(() => null);
152
+ throw new Error(apiErrorMessage(payload, response.statusText));
153
+ }
154
+ return response.json();
155
+ }
156
+ function optionLabel(option) {
157
+ return option.name || option.title || option.value || option.handle || option.id;
158
+ }
159
+ function numberOrNull(value) {
160
+ const parsed = Number(value);
161
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
162
+ }
163
+ function nonNegativeNumberOrNull(value) {
164
+ if (!value.trim()) return null;
165
+ const parsed = Number(value);
166
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
167
+ }
168
+ function toDateTimeLocal(value) {
169
+ if (!value) return "";
170
+ const date = new Date(value);
171
+ if (Number.isNaN(date.getTime())) return "";
172
+ const localDate = new Date(date.getTime() - date.getTimezoneOffset() * 6e4);
173
+ return localDate.toISOString().slice(0, 16);
174
+ }
175
+ function currencyDecimalDigits(code) {
176
+ try {
177
+ return new Intl.NumberFormat("en", {
178
+ style: "currency",
179
+ currency: code.toUpperCase()
180
+ }).resolvedOptions().maximumFractionDigits;
181
+ } catch {
182
+ return 2;
183
+ }
184
+ }
185
+ function currencySymbol(code) {
186
+ if (!code) return "";
187
+ try {
188
+ return new Intl.NumberFormat("en", {
189
+ style: "currency",
190
+ currency: code.toUpperCase(),
191
+ currencyDisplay: "narrowSymbol"
192
+ }).formatToParts(0).find((part) => part.type === "currency")?.value || code.toUpperCase();
193
+ } catch {
194
+ return code.toUpperCase();
195
+ }
196
+ }
197
+ function couponTypeFromConfig(config3) {
198
+ if (config3.benefit_type === "percentage") {
199
+ return config3.promotion_template?.application_method?.target_type === "order" ? "percentage_off_order" : "percentage_off_product";
200
+ }
201
+ if (config3.benefit_type === "buy_get") return "buy_x_get_y";
202
+ if (config3.benefit_type === "free_shipping") return "free_shipping";
203
+ return config3.promotion_template?.application_method?.target_type === "order" ? "amount_off_order" : "amount_off_products";
204
+ }
205
+ function benefitTypeFromCouponType(type) {
206
+ if (type === "percentage_off_product" || type === "percentage_off_order") return "percentage";
207
+ if (type === "buy_x_get_y") return "buy_get";
208
+ if (type === "free_shipping") return "free_shipping";
209
+ return "fixed_amount";
210
+ }
211
+ function couponTypeLabel(config3) {
212
+ return typeChoices.find(
213
+ (choice) => choice.value === couponTypeFromConfig(config3)
214
+ )?.label;
215
+ }
216
+ function couponStatusColor(status) {
217
+ if (status === "active") return "green";
218
+ if (status === "inactive") return "orange";
219
+ return "grey";
220
+ }
221
+ function productStatusFromCouponStatus(status) {
222
+ return status === "active" ? "published" : "draft";
223
+ }
224
+ function campaignLabel(config3) {
225
+ const name = config3.campaign_snapshot?.name;
226
+ return typeof name === "string" && name ? name : config3.campaign_id || "None";
227
+ }
228
+ function defaultCurrency(options) {
229
+ return options.currencies?.find((currency) => currency.is_default)?.code || options.currencies?.[0]?.code || "";
230
+ }
231
+ function conditionKey(prefix = "condition") {
232
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
233
+ }
234
+ function isAmountCouponType(type) {
235
+ return type === "amount_off_products" || type === "amount_off_order";
236
+ }
237
+ function effectiveCouponCurrencies(conditions, currencies) {
238
+ const condition = conditions.find(
239
+ (item) => item.attribute === "currency_code"
240
+ );
241
+ if (!condition || !condition.operator) return [];
242
+ const selected = new Set(condition.values);
243
+ const supported = currencies.map((currency) => currency.code);
244
+ return condition.operator === "ne" ? supported.filter((code) => !selected.has(code)) : supported.filter((code) => selected.has(code));
245
+ }
246
+ function reconcileCouponAmounts(current, currencyCodes) {
247
+ const byCurrency = Object.fromEntries(
248
+ current.map((row) => [row.currency_code, row])
249
+ );
250
+ return currencyCodes.map((currencyCode) => ({
251
+ key: byCurrency[currencyCode]?.key || conditionKey("coupon-value"),
252
+ currency_code: currencyCode,
253
+ amount: byCurrency[currencyCode]?.amount || ""
254
+ }));
255
+ }
256
+ function defaultPurchaseConditions(options) {
257
+ const currencyCode = defaultCurrency(options);
258
+ return currencyCode ? [
259
+ {
260
+ key: conditionKey("currency"),
261
+ attribute: "currency_code",
262
+ operator: "eq",
263
+ values: [currencyCode]
264
+ }
265
+ ] : [];
266
+ }
267
+ function emptyProduct(options) {
268
+ return {
269
+ title: "",
270
+ subtitle: "",
271
+ handle: "",
272
+ description: "",
273
+ media: [],
274
+ sku: "",
275
+ price_amounts: Object.fromEntries(
276
+ (options.currencies || []).map((currency) => [currency.code, ""])
277
+ ),
278
+ status: "draft",
279
+ discountable: false,
280
+ seller_id: "",
281
+ type_id: "",
282
+ collection_id: "",
283
+ category_id: "",
284
+ tag_id: ""
285
+ };
286
+ }
287
+ function emptyCoupon(options) {
288
+ const currencyCode = defaultCurrency(options);
289
+ const purchaseConditions = defaultPurchaseConditions(options);
290
+ return {
291
+ enabled: true,
292
+ type: "amount_off_products",
293
+ purchase_conditions: purchaseConditions,
294
+ amounts: currencyCode ? [
295
+ {
296
+ key: "coupon-value-default",
297
+ currency_code: currencyCode,
298
+ amount: ""
299
+ }
300
+ ] : [],
301
+ percentage: "",
302
+ allocation: "each",
303
+ code_strategy: "unique_code",
304
+ code_prefix: "COUPON",
305
+ shared_code: "",
306
+ expiration_type: "duration",
307
+ expiration_days: "30",
308
+ expiration_date: "",
309
+ expiration_cap_by_campaign: true,
310
+ expiration_cap_at: "",
311
+ max_issuance_per_order_item: "1",
312
+ promotion_mirror_mode: "none",
313
+ promotion_status: "draft"
314
+ };
315
+ }
316
+ var emptyCampaign = {
317
+ mode: "none",
318
+ campaign_id: "",
319
+ name: "",
320
+ campaign_identifier: "",
321
+ starts_at: "",
322
+ ends_at: ""
323
+ };
324
+ function formsFromRow(row, options) {
325
+ const product = row.product;
326
+ const config3 = row.coupon_product_config;
327
+ const variant = product.variants?.[0];
328
+ const prices = Object.fromEntries(
329
+ (variant?.prices || []).filter((price) => price.currency_code).map((price) => [
330
+ String(price.currency_code).toLowerCase(),
331
+ price.amount == null ? "" : String(price.amount)
332
+ ])
333
+ );
334
+ const media = Array.from(
335
+ new Map(
336
+ [
337
+ ...product.thumbnail ? [
338
+ {
339
+ url: product.thumbnail,
340
+ asset_id: product.thumbnail_asset_id || void 0
341
+ }
342
+ ] : [],
343
+ ...(product.images || []).filter((image) => image.url).map((image) => ({
344
+ url: String(image.url),
345
+ asset_id: image.asset_id || void 0
346
+ }))
347
+ ].map((item) => [item.url, item])
348
+ ).values()
349
+ );
350
+ const configuredAmounts = Array.isArray(config3.amounts) && config3.amounts.length ? config3.amounts : config3.amount != null && config3.currency_code ? [{ amount: config3.amount, currency_code: config3.currency_code }] : [];
351
+ const configuredConditions = (config3.purchase_conditions || []).map(
352
+ (condition, index) => ({
353
+ key: `condition-${index}`,
354
+ attribute: condition.attribute,
355
+ operator: condition.operator,
356
+ values: condition.values.map(
357
+ (value) => condition.attribute === "currency_code" || condition.attribute === "shipping_address.country_code" ? value.toLowerCase() : value
358
+ )
359
+ })
360
+ );
361
+ if (!configuredConditions.some(
362
+ (condition) => condition.attribute === "currency_code"
363
+ ) && config3.benefit_type === "fixed_amount" && configuredAmounts.length) {
364
+ configuredConditions.push({
365
+ key: "condition-legacy-currency",
366
+ attribute: "currency_code",
367
+ operator: configuredAmounts.length === 1 ? "eq" : "in",
368
+ values: configuredAmounts.map(
369
+ (amount) => amount.currency_code.toLowerCase()
370
+ )
371
+ });
372
+ }
373
+ if (!configuredConditions.some(
374
+ (condition) => condition.attribute === "sales_channel_id"
375
+ ) && product.sales_channels?.length) {
376
+ configuredConditions.push({
377
+ key: "condition-legacy-sales-channel",
378
+ attribute: "sales_channel_id",
379
+ operator: product.sales_channels.length === 1 ? "eq" : "in",
380
+ values: product.sales_channels.map((channel) => channel.id)
381
+ });
382
+ }
383
+ const expirationPolicy = config3.expiration_policy;
384
+ const configuredAmountRows = configuredAmounts.map((row2, index) => ({
385
+ key: `coupon-value-${index}`,
386
+ amount: String(row2.amount),
387
+ currency_code: row2.currency_code.toLowerCase()
388
+ }));
389
+ const amountRows = config3.benefit_type === "fixed_amount" ? reconcileCouponAmounts(
390
+ configuredAmountRows,
391
+ effectiveCouponCurrencies(configuredConditions, options.currencies || [])
392
+ ) : configuredAmountRows;
393
+ return {
394
+ product: {
395
+ ...emptyProduct(options),
396
+ title: product.title || "",
397
+ subtitle: product.subtitle || "",
398
+ handle: product.handle || "",
399
+ description: product.description || "",
400
+ media,
401
+ sku: variant?.sku || "",
402
+ price_amounts: {
403
+ ...emptyProduct(options).price_amounts,
404
+ ...prices
405
+ },
406
+ status: product.status || "draft",
407
+ discountable: Boolean(product.discountable),
408
+ type_id: product.type_id || "",
409
+ collection_id: product.collection_id || "",
410
+ category_id: product.categories?.[0]?.id || "",
411
+ tag_id: product.tags?.[0]?.id || ""
412
+ },
413
+ coupon: {
414
+ ...emptyCoupon(options),
415
+ enabled: config3.enabled,
416
+ type: couponTypeFromConfig(config3),
417
+ purchase_conditions: configuredConditions,
418
+ amounts: config3.benefit_type === "fixed_amount" ? amountRows : amountRows.length ? amountRows : emptyCoupon(options).amounts,
419
+ percentage: config3.percentage == null ? "" : String(config3.percentage),
420
+ allocation: config3.promotion_template?.application_method?.allocation === "once" ? "once" : "each",
421
+ code_strategy: config3.code_strategy,
422
+ code_prefix: config3.code_prefix || "",
423
+ shared_code: config3.shared_code || "",
424
+ expiration_type: config3.expiration_policy?.type || "duration",
425
+ expiration_days: config3.expiration_policy?.type === "duration" ? String(config3.expiration_policy.duration_days) : "30",
426
+ expiration_date: config3.expiration_policy?.type === "fixed" ? toDateTimeLocal(config3.expiration_policy.expires_at) : "",
427
+ expiration_cap_by_campaign: expirationPolicy.type === "none" || expirationPolicy.cap_by_campaign !== false,
428
+ expiration_cap_at: expirationPolicy.type === "none" ? "" : toDateTimeLocal(expirationPolicy.cap_at),
429
+ max_issuance_per_order_item: String(
430
+ config3.max_issuance_per_order_item || 1
431
+ ),
432
+ promotion_mirror_mode: config3.promotion_mirror_mode || "none",
433
+ promotion_status: config3.promotion_status || "draft"
434
+ },
435
+ campaign: {
436
+ ...emptyCampaign,
437
+ mode: config3.campaign_id ? "existing" : "none",
438
+ campaign_id: config3.campaign_id || ""
439
+ }
440
+ };
441
+ }
442
+ var modalContentStyle = {
443
+ display: "flex",
444
+ flexDirection: "column",
445
+ overflow: "hidden"
446
+ };
447
+ var modalWizardStyle = {
448
+ display: "flex",
449
+ flex: "1 1 auto",
450
+ flexDirection: "column",
451
+ minHeight: 0,
452
+ overflow: "hidden"
453
+ };
454
+ var visuallyHiddenStyle = {
455
+ clip: "rect(0 0 0 0)",
456
+ clipPath: "inset(50%)",
457
+ height: 1,
458
+ overflow: "hidden",
459
+ position: "absolute",
460
+ whiteSpace: "nowrap",
461
+ width: 1
462
+ };
463
+ var modalBodyStyle = {
464
+ flex: "1 1 auto",
465
+ minHeight: 0,
466
+ padding: 0
467
+ };
468
+ var modalScrollStyle = {
469
+ height: "100%",
470
+ overflowY: "auto",
471
+ padding: "64px 24px 112px",
472
+ width: "100%"
473
+ };
474
+ var modalFormStyle = {
475
+ margin: "0 auto",
476
+ maxWidth: 720,
477
+ width: "min(720px, 100%)"
478
+ };
479
+ var stackStyle = {
480
+ display: "flex",
481
+ flexDirection: "column",
482
+ gap: 24
483
+ };
484
+ var twoColumnGridStyle = {
485
+ display: "grid",
486
+ gap: 16,
487
+ gridTemplateColumns: "repeat(auto-fit, minmax(260px, 1fr))"
488
+ };
489
+ var threeColumnGridStyle = {
490
+ display: "grid",
491
+ gap: 16,
492
+ gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))"
493
+ };
494
+ var panelStyle = {
495
+ border: "1px solid var(--border-base)",
496
+ borderRadius: 8,
497
+ padding: 16
498
+ };
499
+ function Field({
500
+ children,
501
+ label,
502
+ optional,
503
+ tooltip
504
+ }) {
505
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-1", style: { minWidth: 0 }, children: [
506
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-x-1", children: [
507
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Label, { children: label }),
508
+ tooltip && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Tooltip, { content: tooltip, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
509
+ "button",
510
+ {
511
+ type: "button",
512
+ "aria-label": `${label} information`,
513
+ className: "text-ui-fg-muted",
514
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.InformationCircle, {})
515
+ }
516
+ ) }),
517
+ optional && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "(Optional)" })
518
+ ] }),
519
+ children
520
+ ] });
521
+ }
522
+ function Section({
523
+ children,
524
+ description,
525
+ title
526
+ }) {
527
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("section", { className: "flex flex-col gap-y-4", children: [
528
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
529
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Heading, { level: "h2", children: title }),
530
+ description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: description })
531
+ ] }),
532
+ children
533
+ ] });
534
+ }
535
+ function OptionSelect({
536
+ onChange,
537
+ options,
538
+ value
539
+ }) {
540
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
541
+ import_ui2.Select,
542
+ {
543
+ value: value || NONE,
544
+ onValueChange: (next) => onChange(next === NONE ? "" : next),
545
+ children: [
546
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
547
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
548
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: NONE, children: "None" }),
549
+ options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: option.id, children: optionLabel(option) }, option.id))
550
+ ] })
551
+ ]
552
+ }
553
+ );
554
+ }
555
+ function CurrencyAmountField({
556
+ currencies,
557
+ currencyCode,
558
+ onChange,
559
+ value
560
+ }) {
561
+ const currency = currencies.find((item) => item.code === currencyCode);
562
+ const code = currencyCode.toUpperCase();
563
+ const decimals = currencyDecimalDigits(code || "USD");
564
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
565
+ import_ui2.CurrencyInput,
566
+ {
567
+ code: code || "USD",
568
+ symbol: currency?.symbol_native || currency?.symbol || currencySymbol(code || "USD"),
569
+ min: 0,
570
+ decimalScale: decimals,
571
+ decimalsLimit: decimals,
572
+ value,
573
+ disabled: !currencyCode,
574
+ onValueChange: (nextValue) => onChange(nextValue || "")
575
+ }
576
+ );
577
+ }
578
+ function PercentageInput({
579
+ onChange,
580
+ value
581
+ }) {
582
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex w-full items-stretch", style: { width: "100%" }, children: [
583
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
584
+ "div",
585
+ {
586
+ className: "bg-ui-bg-field text-ui-fg-muted flex items-center border",
587
+ style: {
588
+ borderColor: "var(--border-base)",
589
+ borderRadius: "6px 0 0 6px",
590
+ borderRight: 0,
591
+ padding: "0 12px"
592
+ },
593
+ children: "%"
594
+ }
595
+ ),
596
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
597
+ "div",
598
+ {
599
+ className: "min-w-0 flex-1",
600
+ style: { flex: "1 1 0%", minWidth: 0 },
601
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
602
+ import_ui2.Input,
603
+ {
604
+ className: "w-full",
605
+ type: "number",
606
+ min: 1,
607
+ max: 100,
608
+ value,
609
+ style: {
610
+ borderRadius: "0 6px 6px 0",
611
+ width: "100%"
612
+ },
613
+ onChange: (event) => onChange(event.target.value)
614
+ }
615
+ )
616
+ }
617
+ )
618
+ ] });
619
+ }
620
+ function HandleInput({
621
+ onChange,
622
+ value
623
+ }) {
624
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "relative", children: [
625
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "text-ui-fg-muted pointer-events-none absolute inset-y-0 left-0 z-10 flex min-w-8 items-center justify-center border-r px-2.5", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "txt-compact-small font-medium", children: "/" }) }),
626
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
627
+ import_ui2.Input,
628
+ {
629
+ value,
630
+ placeholder: "winter-jacket",
631
+ style: { paddingLeft: 34 },
632
+ onChange: (event) => onChange(event.target.value)
633
+ }
634
+ )
635
+ ] });
636
+ }
637
+ function MediaUpload({
638
+ isUploading,
639
+ media,
640
+ onRemove,
641
+ onUpload
642
+ }) {
643
+ const inputRef = (0, import_react.useRef)(null);
644
+ const accept = "image/jpeg,image/png,image/gif,image/webp,image/heic,image/svg+xml";
645
+ const handleFiles = (files) => {
646
+ if (!files?.length) return;
647
+ onUpload(Array.from(files));
648
+ };
649
+ const handleDrop = (event) => {
650
+ event.preventDefault();
651
+ handleFiles(event.dataTransfer.files);
652
+ };
653
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-3", children: [
654
+ media.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
655
+ "div",
656
+ {
657
+ className: "grid gap-3",
658
+ style: {
659
+ gridTemplateColumns: "repeat(auto-fill, minmax(120px, 1fr))"
660
+ },
661
+ children: media.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
662
+ "div",
663
+ {
664
+ className: "relative overflow-hidden rounded-md border",
665
+ children: [
666
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
667
+ "img",
668
+ {
669
+ src: item.url,
670
+ alt: "",
671
+ className: "h-32 w-full object-cover",
672
+ style: { height: 128 }
673
+ }
674
+ ),
675
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "absolute inset-x-0 bottom-0 flex items-center justify-between bg-black/60 px-2 py-1", children: [
676
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "xsmall", style: { color: "white" }, children: index === 0 ? "Thumbnail" : `Image ${index + 1}` }),
677
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
678
+ "button",
679
+ {
680
+ type: "button",
681
+ "aria-label": "Remove image",
682
+ style: { color: "white" },
683
+ onClick: () => onRemove(item),
684
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.XMarkMini, {})
685
+ }
686
+ )
687
+ ] })
688
+ ]
689
+ },
690
+ item.asset_id || item.url
691
+ ))
692
+ }
693
+ ),
694
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
695
+ "input",
696
+ {
697
+ ref: inputRef,
698
+ type: "file",
699
+ hidden: true,
700
+ multiple: true,
701
+ accept,
702
+ onChange: (event) => {
703
+ handleFiles(event.target.files);
704
+ event.target.value = "";
705
+ }
706
+ }
707
+ ),
708
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
709
+ "button",
710
+ {
711
+ type: "button",
712
+ disabled: isUploading,
713
+ className: "text-ui-fg-muted flex w-full flex-col items-center justify-center gap-y-2 rounded-md border border-dashed p-8",
714
+ style: { minHeight: 148 },
715
+ onClick: () => inputRef.current?.click(),
716
+ onDragOver: (event) => event.preventDefault(),
717
+ onDrop: handleDrop,
718
+ children: [
719
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-ui-fg-base flex items-center gap-x-2", children: [
720
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.ArrowUpTray, {}),
721
+ isUploading ? "Uploading images..." : "Upload images"
722
+ ] }),
723
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "Drag and drop images here or click to upload." })
724
+ ]
725
+ }
726
+ )
727
+ ] });
728
+ }
729
+ function conditionValueOptions(attribute, options) {
730
+ if (attribute === "currency_code") {
731
+ return (options.currencies || []).map((currency) => ({
732
+ value: currency.code,
733
+ label: `${currency.name} (${currency.code.toUpperCase()})`
734
+ }));
735
+ }
736
+ if (attribute === "shipping_address.country_code") {
737
+ return (options.countries || []).map((country) => ({
738
+ value: String(country.iso_2 || country.id).toLowerCase(),
739
+ label: country.display_name || country.name || country.id
740
+ }));
741
+ }
742
+ const records = attribute === "customer.groups.id" ? options.customer_groups : attribute === "region.id" ? options.regions : attribute === "sales_channel_id" ? options.sales_channels : [];
743
+ return (records || []).map((record) => ({
744
+ value: record.id,
745
+ label: optionLabel(record)
746
+ }));
747
+ }
748
+ function MultiConditionValues({
749
+ attribute,
750
+ onChange,
751
+ options,
752
+ value
753
+ }) {
754
+ const [open, setOpen] = (0, import_react.useState)(false);
755
+ const [draft, setDraft] = (0, import_react.useState)(value);
756
+ const [search, setSearch] = (0, import_react.useState)("");
757
+ const labels = Object.fromEntries(options.map((option) => [option.value, option.label]));
758
+ const filtered = options.filter(
759
+ (option) => option.label.toLowerCase().includes(search.trim().toLowerCase())
760
+ );
761
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
762
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
763
+ import_ui2.Button,
764
+ {
765
+ type: "button",
766
+ variant: "secondary",
767
+ className: "w-full justify-start",
768
+ onClick: () => {
769
+ setDraft(value);
770
+ setSearch("");
771
+ setOpen(true);
772
+ },
773
+ children: value.length ? value.length === 1 ? labels[value[0]] || value[0] : `${value.length} values selected` : "Select values"
774
+ }
775
+ ),
776
+ value.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "mt-2 flex flex-wrap gap-1", children: value.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
777
+ "span",
778
+ {
779
+ className: "bg-ui-bg-component text-ui-fg-subtle flex items-center gap-x-1 rounded-md border px-2 py-1 text-xs",
780
+ children: [
781
+ labels[item] || item,
782
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
783
+ "button",
784
+ {
785
+ type: "button",
786
+ "aria-label": `Remove ${labels[item] || item}`,
787
+ onClick: () => onChange(value.filter((entry) => entry !== item)),
788
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.XMarkMini, {})
789
+ }
790
+ )
791
+ ]
792
+ },
793
+ item
794
+ )) }),
795
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Drawer, { open, onOpenChange: setOpen, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Drawer.Content, { children: [
796
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Drawer.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Drawer.Title, { children: [
797
+ "Select ",
798
+ conditionAttributes.find((item) => item.value === attribute)?.label
799
+ ] }) }),
800
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Drawer.Body, { className: "flex flex-col gap-y-3 overflow-y-auto", children: [
801
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
802
+ import_ui2.Input,
803
+ {
804
+ value: search,
805
+ placeholder: "Search values",
806
+ onChange: (event) => setSearch(event.target.value)
807
+ }
808
+ ),
809
+ filtered.length ? filtered.map((option) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
810
+ "label",
811
+ {
812
+ className: "flex cursor-pointer items-center gap-x-3 rounded-md border p-3",
813
+ children: [
814
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
815
+ import_ui2.Checkbox,
816
+ {
817
+ checked: draft.includes(option.value),
818
+ onCheckedChange: (checked) => setDraft(
819
+ (current) => checked ? Array.from(/* @__PURE__ */ new Set([...current, option.value])) : current.filter((value2) => value2 !== option.value)
820
+ )
821
+ }
822
+ ),
823
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { children: option.label })
824
+ ]
825
+ },
826
+ option.value
827
+ )) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { className: "text-ui-fg-muted", children: "No matching values." })
828
+ ] }),
829
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Drawer.Footer, { children: [
830
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Button, { type: "button", variant: "secondary", onClick: () => setOpen(false), children: "Cancel" }),
831
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
832
+ import_ui2.Button,
833
+ {
834
+ type: "button",
835
+ disabled: !draft.length,
836
+ onClick: () => {
837
+ onChange(draft);
838
+ setOpen(false);
839
+ },
840
+ children: "Apply"
841
+ }
842
+ )
843
+ ] })
844
+ ] }) })
845
+ ] });
846
+ }
847
+ function PurchaseConditionsField({
848
+ fixedAmount,
849
+ onChange,
850
+ options,
851
+ value
852
+ }) {
853
+ const selectedAttributes = new Set(
854
+ value.map((condition) => condition.attribute).filter(Boolean)
855
+ );
856
+ const replace = (key, update) => onChange(
857
+ value.map(
858
+ (condition) => condition.key === key ? { ...condition, ...update } : condition
859
+ )
860
+ );
861
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
862
+ Section,
863
+ {
864
+ title: "Who can purchase this coupon?",
865
+ description: "Coupon products can be purchased by all customers when no conditions are configured. Conditions are combined with AND.",
866
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-3", children: [
867
+ value.map((condition, index) => {
868
+ const values = conditionValueOptions(condition.attribute, options);
869
+ const currencyRequired = fixedAmount && condition.attribute === "currency_code";
870
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
871
+ index > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "text-ui-fg-muted flex h-8 items-center text-xs font-medium", children: "AND" }),
872
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: panelStyle, className: "relative flex flex-col gap-y-3", children: [
873
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-start gap-x-2", children: [
874
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
875
+ import_ui2.Select,
876
+ {
877
+ value: condition.attribute || void 0,
878
+ disabled: currencyRequired,
879
+ onValueChange: (attribute) => replace(condition.key, {
880
+ attribute,
881
+ operator: "",
882
+ values: []
883
+ }),
884
+ children: [
885
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, { placeholder: "Select attribute" }) }),
886
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Content, { children: conditionAttributes.filter(
887
+ (attribute) => attribute.value === condition.attribute || !selectedAttributes.has(attribute.value)
888
+ ).map((attribute) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: attribute.value, children: attribute.label }, attribute.value)) })
889
+ ]
890
+ }
891
+ ) }),
892
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
893
+ import_ui2.Button,
894
+ {
895
+ type: "button",
896
+ size: "small",
897
+ variant: "transparent",
898
+ disabled: currencyRequired,
899
+ "aria-label": "Remove condition",
900
+ onClick: () => onChange(value.filter((item) => item.key !== condition.key)),
901
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.XMarkMini, {})
902
+ }
903
+ )
904
+ ] }),
905
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
906
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
907
+ import_ui2.Select,
908
+ {
909
+ value: condition.operator || void 0,
910
+ disabled: !condition.attribute,
911
+ onValueChange: (operator) => replace(condition.key, {
912
+ operator,
913
+ values: operator === "eq" ? condition.values.slice(0, 1) : condition.values
914
+ }),
915
+ children: [
916
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, { placeholder: "Select operator" }) }),
917
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Content, { children: conditionOperators.map((operator) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: operator.value, children: operator.label }, operator.value)) })
918
+ ]
919
+ }
920
+ ),
921
+ condition.attribute && condition.operator === "eq" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
922
+ import_ui2.Select,
923
+ {
924
+ value: condition.values[0] || void 0,
925
+ onValueChange: (selected) => replace(condition.key, { values: [selected] }),
926
+ children: [
927
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, { placeholder: "Select value" }) }),
928
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Content, { children: values.map((option) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: option.value, children: option.label }, option.value)) })
929
+ ]
930
+ }
931
+ ) : condition.attribute && condition.operator ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
932
+ MultiConditionValues,
933
+ {
934
+ attribute: condition.attribute,
935
+ options: values,
936
+ value: condition.values,
937
+ onChange: (values2) => replace(condition.key, { values: values2 })
938
+ }
939
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Button, { type: "button", variant: "secondary", disabled: true, className: "w-full", children: "Select values" })
940
+ ] })
941
+ ] })
942
+ ] }, condition.key);
943
+ }),
944
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-x-2", children: [
945
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
946
+ import_ui2.Button,
947
+ {
948
+ type: "button",
949
+ variant: "secondary",
950
+ disabled: selectedAttributes.size >= conditionAttributes.length,
951
+ onClick: () => onChange([
952
+ ...value,
953
+ { key: conditionKey(), attribute: "", operator: "", values: [] }
954
+ ]),
955
+ children: [
956
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.Plus, {}),
957
+ " Add condition"
958
+ ]
959
+ }
960
+ ),
961
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
962
+ import_ui2.Button,
963
+ {
964
+ type: "button",
965
+ variant: "transparent",
966
+ onClick: () => onChange(fixedAmount ? defaultPurchaseConditions(options) : []),
967
+ children: "Clear all"
968
+ }
969
+ )
970
+ ] })
971
+ ] })
972
+ }
973
+ );
974
+ }
975
+ function ProductPricesTable({
976
+ currencies,
977
+ couponValue,
978
+ onChange,
979
+ prices
980
+ }) {
981
+ const [visibleCurrencies, setVisibleCurrencies] = (0, import_react.useState)(
982
+ () => currencies.map((currency) => currency.code)
983
+ );
984
+ (0, import_react.useEffect)(() => {
985
+ setVisibleCurrencies((current) => {
986
+ const available = new Set(currencies.map((currency) => currency.code));
987
+ const retained = current.filter((code) => available.has(code));
988
+ const added = currencies.map((currency) => currency.code).filter((code) => !current.includes(code));
989
+ return [...retained, ...added];
990
+ });
991
+ }, [currencies]);
992
+ const shownCurrencies = currencies.filter(
993
+ (currency) => visibleCurrencies.includes(currency.code)
994
+ );
995
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex size-full flex-col divide-y overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-ui-bg-subtle flex size-full flex-col", children: [
996
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-ui-bg-base flex items-center justify-between border-b p-4", children: [
997
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center gap-x-2", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.DropdownMenu, { children: [
998
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Button, { type: "button", size: "small", variant: "secondary", children: [
999
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.Adjustments, {}),
1000
+ "View"
1001
+ ] }) }),
1002
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.DropdownMenu.Content, { align: "start", children: currencies.map((currency) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1003
+ import_ui2.DropdownMenu.CheckboxItem,
1004
+ {
1005
+ checked: visibleCurrencies.includes(currency.code),
1006
+ onCheckedChange: (checked) => setVisibleCurrencies(
1007
+ (current) => checked ? Array.from(/* @__PURE__ */ new Set([...current, currency.code])) : current.filter((code) => code !== currency.code)
1008
+ ),
1009
+ children: [
1010
+ "Price ",
1011
+ currency.code.toUpperCase()
1012
+ ]
1013
+ },
1014
+ currency.code
1015
+ )) })
1016
+ ] }) }),
1017
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center gap-x-2" })
1018
+ ] }),
1019
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "size-full overflow-auto", children: [
1020
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1021
+ import_ui2.Table,
1022
+ {
1023
+ style: {
1024
+ borderCollapse: "collapse",
1025
+ tableLayout: "fixed",
1026
+ width: "max-content"
1027
+ },
1028
+ children: [
1029
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Header, { style: { borderTop: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Table.Row, { style: { height: 40 }, children: [
1030
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1031
+ import_ui2.Table.HeaderCell,
1032
+ {
1033
+ style: {
1034
+ background: "var(--bg-base)",
1035
+ borderBottom: "1px solid var(--border-base)",
1036
+ borderRight: "1px solid var(--border-base)",
1037
+ height: 40,
1038
+ left: 0,
1039
+ maxWidth: 200,
1040
+ minWidth: 200,
1041
+ padding: "0 16px",
1042
+ position: "sticky",
1043
+ width: 200,
1044
+ zIndex: 1
1045
+ },
1046
+ children: "Coupon Value"
1047
+ }
1048
+ ),
1049
+ shownCurrencies.map((currency) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1050
+ import_ui2.Table.HeaderCell,
1051
+ {
1052
+ style: {
1053
+ background: "var(--bg-base)",
1054
+ borderBottom: "1px solid var(--border-base)",
1055
+ borderRight: "1px solid var(--border-base)",
1056
+ height: 40,
1057
+ maxWidth: 200,
1058
+ minWidth: 200,
1059
+ padding: "0 16px",
1060
+ width: 200
1061
+ },
1062
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex w-full items-center justify-between gap-3", children: [
1063
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "truncate", title: `Price ${currency.code.toUpperCase()}`, children: [
1064
+ "Price ",
1065
+ currency.code.toUpperCase()
1066
+ ] }),
1067
+ currency.is_tax_inclusive ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.TaxInclusive, { className: "text-ui-fg-muted shrink-0" }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.TaxExclusive, { className: "text-ui-fg-muted shrink-0" })
1068
+ ] })
1069
+ },
1070
+ currency.code
1071
+ ))
1072
+ ] }) }),
1073
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Body, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Table.Row, { className: "bg-ui-bg-subtle", style: { height: 40 }, children: [
1074
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1075
+ import_ui2.Table.Cell,
1076
+ {
1077
+ style: {
1078
+ background: "var(--bg-subtle)",
1079
+ borderBottom: "1px solid var(--border-base)",
1080
+ borderRight: "1px solid var(--border-base)",
1081
+ height: 40,
1082
+ left: 0,
1083
+ maxWidth: 200,
1084
+ minWidth: 200,
1085
+ padding: "0 16px",
1086
+ position: "sticky",
1087
+ width: 200,
1088
+ zIndex: 1
1089
+ },
1090
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "block truncate", children: couponValue })
1091
+ }
1092
+ ),
1093
+ shownCurrencies.map((currency) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1094
+ import_ui2.Table.Cell,
1095
+ {
1096
+ style: {
1097
+ background: "var(--bg-base)",
1098
+ borderBottom: "1px solid var(--border-base)",
1099
+ borderRight: "1px solid var(--border-base)",
1100
+ height: 40,
1101
+ maxWidth: 200,
1102
+ minWidth: 200,
1103
+ padding: 0,
1104
+ width: 200
1105
+ },
1106
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1107
+ TablePriceInput,
1108
+ {
1109
+ currency,
1110
+ value: prices[currency.code] || "",
1111
+ onChange: (value) => onChange(currency.code, value)
1112
+ }
1113
+ )
1114
+ },
1115
+ currency.code
1116
+ ))
1117
+ ] }) })
1118
+ ]
1119
+ }
1120
+ ),
1121
+ !currencies.length && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "p-4", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { className: "text-ui-fg-muted", children: "Add a supported currency to the store before setting prices." }) })
1122
+ ] })
1123
+ ] }) });
1124
+ }
1125
+ function formatCouponValue(coupon, currencies) {
1126
+ if (coupon.type === "amount_off_products" || coupon.type === "amount_off_order") {
1127
+ const defaultCode = currencies.find((currency) => currency.is_default)?.code || currencies[0]?.code;
1128
+ const primary = coupon.amounts.find((row) => row.currency_code === defaultCode) || coupon.amounts[0];
1129
+ const amount = numberOrNull(primary?.amount);
1130
+ if (amount == null) return "\u2014";
1131
+ const additional = Math.max(0, coupon.amounts.length - 1);
1132
+ const formatted = `${amount}${primary.currency_code.toUpperCase()}`;
1133
+ return additional ? `${formatted} +${additional}` : formatted;
1134
+ }
1135
+ if (coupon.type === "percentage_off_product" || coupon.type === "percentage_off_order") {
1136
+ const percentage = numberOrNull(coupon.percentage);
1137
+ if (percentage == null) return "\u2014";
1138
+ return coupon.type === "percentage_off_order" ? `${percentage}% off order` : `${percentage}% off products`;
1139
+ }
1140
+ return coupon.type === "free_shipping" ? "Free shipping" : "Buy X Get Y";
1141
+ }
1142
+ function TablePriceInput({
1143
+ currency,
1144
+ onChange,
1145
+ value
1146
+ }) {
1147
+ const symbol = currency.symbol_native || currency.symbol || currencySymbol(currency.code || "USD");
1148
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1149
+ "label",
1150
+ {
1151
+ className: "bg-ui-bg-base hover:bg-ui-bg-subtle focus-within:shadow-borders-interactive-with-active text-ui-fg-base",
1152
+ style: {
1153
+ alignItems: "center",
1154
+ borderRadius: 0,
1155
+ display: "flex",
1156
+ height: 40,
1157
+ margin: 0,
1158
+ overflow: "hidden",
1159
+ width: 200
1160
+ },
1161
+ children: [
1162
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1163
+ "span",
1164
+ {
1165
+ className: "text-ui-fg-muted",
1166
+ "aria-hidden": "true",
1167
+ style: { flex: "0 0 40px", paddingLeft: 16 },
1168
+ children: symbol
1169
+ }
1170
+ ),
1171
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1172
+ "input",
1173
+ {
1174
+ "aria-label": `Price ${currency.code.toUpperCase()}`,
1175
+ inputMode: "decimal",
1176
+ value,
1177
+ onChange: (event) => onChange(event.target.value),
1178
+ style: {
1179
+ appearance: "none",
1180
+ background: "transparent",
1181
+ border: 0,
1182
+ borderRadius: 0,
1183
+ flex: "1 1 auto",
1184
+ height: "100%",
1185
+ margin: 0,
1186
+ minWidth: 0,
1187
+ outline: "none",
1188
+ padding: "0 16px 0 0",
1189
+ textAlign: "right"
1190
+ },
1191
+ type: "text"
1192
+ }
1193
+ )
1194
+ ]
1195
+ }
1196
+ );
1197
+ }
1198
+ function CouponProductModal({
1199
+ allowPromotionMirror,
1200
+ apiBase,
1201
+ onOpenChange,
1202
+ onSaved,
1203
+ open,
1204
+ options,
1205
+ row
1206
+ }) {
1207
+ const [activeStep, setActiveStep] = (0, import_react.useState)("details");
1208
+ const [product, setProduct] = (0, import_react.useState)(
1209
+ () => emptyProduct(options)
1210
+ );
1211
+ const [coupon, setCoupon] = (0, import_react.useState)(
1212
+ () => emptyCoupon(options)
1213
+ );
1214
+ const [campaign, setCampaign] = (0, import_react.useState)(emptyCampaign);
1215
+ const [saving, setSaving] = (0, import_react.useState)(false);
1216
+ const [uploading, setUploading] = (0, import_react.useState)(false);
1217
+ const [furthestStepIndex, setFurthestStepIndex] = (0, import_react.useState)(0);
1218
+ const visibleSteps = (0, import_react.useMemo)(
1219
+ () => allowPromotionMirror ? allSteps : allSteps.filter((step) => step !== "campaign"),
1220
+ [allowPromotionMirror]
1221
+ );
1222
+ const currentStepIndex = visibleSteps.indexOf(activeStep);
1223
+ const currencies = options.currencies || [];
1224
+ const supportedCurrencyCodes = (0, import_react.useMemo)(
1225
+ () => new Set(currencies.map((currency) => currency.code)),
1226
+ [currencies]
1227
+ );
1228
+ const isAmountType = coupon.type === "amount_off_products" || coupon.type === "amount_off_order";
1229
+ const isPercentageType = coupon.type === "percentage_off_product" || coupon.type === "percentage_off_order";
1230
+ const isItemScopedDiscount = coupon.type === "amount_off_products" || coupon.type === "percentage_off_product";
1231
+ const effectiveCurrencies = (0, import_react.useMemo)(
1232
+ () => effectiveCouponCurrencies(coupon.purchase_conditions, currencies),
1233
+ [coupon.purchase_conditions, currencies]
1234
+ );
1235
+ const productPrices = currencies.flatMap((currency) => {
1236
+ const value = product.price_amounts[currency.code] || "";
1237
+ const amount = nonNegativeNumberOrNull(value);
1238
+ return amount == null ? [] : [{ currency_code: currency.code, amount }];
1239
+ });
1240
+ (0, import_react.useEffect)(() => {
1241
+ if (!open) return;
1242
+ const forms = row ? formsFromRow(row, options) : {
1243
+ product: emptyProduct(options),
1244
+ coupon: emptyCoupon(options),
1245
+ campaign: emptyCampaign
1246
+ };
1247
+ setProduct(forms.product);
1248
+ setCoupon(forms.coupon);
1249
+ setCampaign(forms.campaign);
1250
+ setActiveStep("details");
1251
+ setFurthestStepIndex(0);
1252
+ }, [open, row, options]);
1253
+ const updatePurchaseConditions = (purchaseConditions) => {
1254
+ setCoupon((current) => ({
1255
+ ...current,
1256
+ purchase_conditions: purchaseConditions,
1257
+ amounts: isAmountCouponType(current.type) ? reconcileCouponAmounts(
1258
+ current.amounts,
1259
+ effectiveCouponCurrencies(purchaseConditions, currencies)
1260
+ ) : current.amounts
1261
+ }));
1262
+ };
1263
+ const updateCouponType = (type) => {
1264
+ setCoupon((current) => {
1265
+ let purchaseConditions = current.purchase_conditions;
1266
+ if (isAmountCouponType(type) && !purchaseConditions.some(
1267
+ (condition) => condition.attribute === "currency_code"
1268
+ )) {
1269
+ purchaseConditions = [
1270
+ ...purchaseConditions,
1271
+ ...defaultPurchaseConditions(options)
1272
+ ];
1273
+ }
1274
+ return {
1275
+ ...current,
1276
+ type,
1277
+ purchase_conditions: purchaseConditions,
1278
+ amounts: isAmountCouponType(type) ? reconcileCouponAmounts(
1279
+ current.amounts,
1280
+ effectiveCouponCurrencies(purchaseConditions, currencies)
1281
+ ) : current.amounts,
1282
+ promotion_mirror_mode: type === "buy_x_get_y" ? "none" : current.promotion_mirror_mode
1283
+ };
1284
+ });
1285
+ };
1286
+ const uploadMedia = async (files) => {
1287
+ if (!files.length) return;
1288
+ const formData = new FormData();
1289
+ files.forEach((file) => formData.append("files", file));
1290
+ if (apiBase === "/admin" && product.seller_id) {
1291
+ formData.append("seller_id", product.seller_id);
1292
+ }
1293
+ setUploading(true);
1294
+ try {
1295
+ const response = await fetch(
1296
+ `${backendUrl()}${apiBase}/coupon-products/uploads`,
1297
+ {
1298
+ method: "POST",
1299
+ body: formData,
1300
+ credentials: "include"
1301
+ }
1302
+ );
1303
+ if (!response.ok) {
1304
+ const payload2 = await response.json().catch(() => null);
1305
+ throw new Error(apiErrorMessage(payload2, response.statusText));
1306
+ }
1307
+ const payload = await response.json();
1308
+ const uploaded = (payload.files || []).filter(
1309
+ (file) => Boolean(file.asset_id && file.url)
1310
+ ).map((file) => ({ asset_id: file.asset_id, url: file.url }));
1311
+ if (!uploaded.length)
1312
+ throw new Error("The upload did not return an image URL");
1313
+ setProduct((current) => ({
1314
+ ...current,
1315
+ media: Array.from(
1316
+ new Map(
1317
+ [...current.media, ...uploaded].map((item) => [item.url, item])
1318
+ ).values()
1319
+ )
1320
+ }));
1321
+ } catch (error) {
1322
+ import_ui2.toast.error(
1323
+ error instanceof Error ? error.message : "Image upload failed"
1324
+ );
1325
+ } finally {
1326
+ setUploading(false);
1327
+ }
1328
+ };
1329
+ const detailsComplete = (0, import_react.useMemo)(() => {
1330
+ if (!product.title.trim()) return false;
1331
+ if (!currencies.length) return false;
1332
+ const attributes = /* @__PURE__ */ new Set();
1333
+ for (const condition of coupon.purchase_conditions) {
1334
+ if (!condition.attribute || !condition.operator || !condition.values.length || condition.operator === "eq" && condition.values.length !== 1 || attributes.has(condition.attribute)) {
1335
+ return false;
1336
+ }
1337
+ attributes.add(condition.attribute);
1338
+ }
1339
+ if (isAmountType) {
1340
+ if (!attributes.has("currency_code")) return false;
1341
+ if (!coupon.amounts.length) return false;
1342
+ if (coupon.amounts.length !== effectiveCurrencies.length) return false;
1343
+ const seen = /* @__PURE__ */ new Set();
1344
+ for (const row2 of coupon.amounts) {
1345
+ if (!supportedCurrencyCodes.has(row2.currency_code)) return false;
1346
+ if (seen.has(row2.currency_code)) return false;
1347
+ if (numberOrNull(row2.amount) == null) return false;
1348
+ seen.add(row2.currency_code);
1349
+ }
1350
+ }
1351
+ if (isPercentageType) {
1352
+ const value = numberOrNull(coupon.percentage);
1353
+ if (value == null || value > 100) return false;
1354
+ }
1355
+ if (coupon.code_strategy === "shared_code" && !coupon.shared_code.trim()) {
1356
+ return false;
1357
+ }
1358
+ if (coupon.expiration_type === "duration") {
1359
+ const days = Number(coupon.expiration_days);
1360
+ if (!Number.isInteger(days) || days < 1) return false;
1361
+ } else if (coupon.expiration_type === "fixed") {
1362
+ const expiration = new Date(coupon.expiration_date);
1363
+ if (!coupon.expiration_date || Number.isNaN(expiration.getTime())) {
1364
+ return false;
1365
+ }
1366
+ }
1367
+ if (coupon.expiration_type !== "none" && coupon.expiration_cap_at) {
1368
+ const cap = new Date(coupon.expiration_cap_at);
1369
+ if (Number.isNaN(cap.getTime())) return false;
1370
+ }
1371
+ const maxIssuance = Number(coupon.max_issuance_per_order_item);
1372
+ return Number.isInteger(maxIssuance) && maxIssuance > 0;
1373
+ }, [
1374
+ coupon,
1375
+ currencies.length,
1376
+ effectiveCurrencies.length,
1377
+ isAmountType,
1378
+ isPercentageType,
1379
+ product.title,
1380
+ supportedCurrencyCodes
1381
+ ]);
1382
+ const campaignComplete = (0, import_react.useMemo)(() => {
1383
+ if (!allowPromotionMirror || campaign.mode === "none") return true;
1384
+ if (campaign.mode === "existing") return Boolean(campaign.campaign_id);
1385
+ if (!campaign.name.trim() || !campaign.campaign_identifier.trim()) {
1386
+ return false;
1387
+ }
1388
+ return [campaign.starts_at, campaign.ends_at].every((value) => {
1389
+ if (!value) return true;
1390
+ return !Number.isNaN(new Date(value).getTime());
1391
+ });
1392
+ }, [allowPromotionMirror, campaign]);
1393
+ const pricesComplete = (0, import_react.useMemo)(() => {
1394
+ if (!currencies.length || !productPrices.length) return false;
1395
+ return currencies.every((currency) => {
1396
+ const value = product.price_amounts[currency.code] || "";
1397
+ return !value.trim() || nonNegativeNumberOrNull(value) != null;
1398
+ });
1399
+ }, [currencies, product.price_amounts, productPrices.length]);
1400
+ const stepValidity = (0, import_react.useMemo)(
1401
+ () => ({
1402
+ details: detailsComplete,
1403
+ organize: true,
1404
+ campaign: campaignComplete,
1405
+ prices: pricesComplete
1406
+ }),
1407
+ [campaignComplete, detailsComplete, pricesComplete]
1408
+ );
1409
+ const activeStepComplete = stepValidity[activeStep];
1410
+ (0, import_react.useEffect)(() => {
1411
+ if (!open || !activeStepComplete) return;
1412
+ setFurthestStepIndex(
1413
+ (current) => Math.max(
1414
+ current,
1415
+ Math.min(currentStepIndex + 1, visibleSteps.length - 1)
1416
+ )
1417
+ );
1418
+ }, [activeStepComplete, currentStepIndex, open, visibleSteps.length]);
1419
+ const isStepDisabled = (index) => index > furthestStepIndex || visibleSteps.slice(0, index).some((previous) => !stepValidity[previous]);
1420
+ const validate = () => {
1421
+ if (!product.title.trim()) throw new Error("Product title is required");
1422
+ if (!currencies.length) {
1423
+ throw new Error("Add a supported currency to the store before continuing");
1424
+ }
1425
+ const invalidPrice = currencies.some((currency) => {
1426
+ const value = product.price_amounts[currency.code] || "";
1427
+ return value.trim() && nonNegativeNumberOrNull(value) == null;
1428
+ });
1429
+ if (invalidPrice) {
1430
+ throw new Error("Product prices must be 0 or more");
1431
+ }
1432
+ if (!productPrices.length) {
1433
+ throw new Error("Add at least one product price");
1434
+ }
1435
+ if (isAmountType) {
1436
+ if (!coupon.amounts.length) {
1437
+ throw new Error("Add at least one coupon value");
1438
+ }
1439
+ const seen = /* @__PURE__ */ new Set();
1440
+ const currencyCondition = coupon.purchase_conditions.find(
1441
+ (condition) => condition.attribute === "currency_code"
1442
+ );
1443
+ if (!currencyCondition) {
1444
+ throw new Error("Add a Currency Code purchase condition");
1445
+ }
1446
+ if (coupon.amounts.length !== effectiveCurrencies.length) {
1447
+ throw new Error(
1448
+ "Coupon values must match every effective currency condition value"
1449
+ );
1450
+ }
1451
+ for (const row2 of coupon.amounts) {
1452
+ if (!supportedCurrencyCodes.has(row2.currency_code)) {
1453
+ throw new Error("Select an available coupon currency");
1454
+ }
1455
+ if (seen.has(row2.currency_code)) {
1456
+ throw new Error("Coupon value currencies cannot be duplicated");
1457
+ }
1458
+ if (numberOrNull(row2.amount) == null) {
1459
+ throw new Error("Coupon values must be greater than 0");
1460
+ }
1461
+ seen.add(row2.currency_code);
1462
+ }
1463
+ }
1464
+ const seenAttributes = /* @__PURE__ */ new Set();
1465
+ for (const condition of coupon.purchase_conditions) {
1466
+ if (!condition.attribute || !condition.operator) {
1467
+ throw new Error("Complete every purchase condition");
1468
+ }
1469
+ if (!condition.values.length) {
1470
+ throw new Error("Select at least one value for every purchase condition");
1471
+ }
1472
+ if (condition.operator === "eq" && condition.values.length !== 1) {
1473
+ throw new Error("Equals conditions require exactly one value");
1474
+ }
1475
+ if (seenAttributes.has(condition.attribute)) {
1476
+ throw new Error("Purchase condition attributes cannot be duplicated");
1477
+ }
1478
+ seenAttributes.add(condition.attribute);
1479
+ }
1480
+ if (isPercentageType) {
1481
+ const value = numberOrNull(coupon.percentage);
1482
+ if (value == null || value > 100) {
1483
+ throw new Error("Coupon value must be between 1 and 100 percent");
1484
+ }
1485
+ }
1486
+ if (coupon.code_strategy === "shared_code" && !coupon.shared_code.trim()) {
1487
+ throw new Error("A shared coupon code is required");
1488
+ }
1489
+ if (coupon.expiration_type === "fixed") {
1490
+ const expiration = new Date(coupon.expiration_date);
1491
+ if (!coupon.expiration_date || Number.isNaN(expiration.getTime())) {
1492
+ throw new Error("A valid fixed expiration date is required");
1493
+ }
1494
+ }
1495
+ if (coupon.expiration_type !== "none" && coupon.expiration_cap_at) {
1496
+ const cap = new Date(coupon.expiration_cap_at);
1497
+ if (Number.isNaN(cap.getTime())) {
1498
+ throw new Error("A valid expiration cap date is required");
1499
+ }
1500
+ }
1501
+ if (campaign.mode === "existing" && !campaign.campaign_id) {
1502
+ throw new Error("Select an existing campaign");
1503
+ }
1504
+ if (campaign.mode === "new" && (!campaign.name.trim() || !campaign.campaign_identifier.trim())) {
1505
+ throw new Error("Campaign name and identifier are required");
1506
+ }
1507
+ };
1508
+ const save = async () => {
1509
+ setSaving(true);
1510
+ try {
1511
+ validate();
1512
+ const benefitType = benefitTypeFromCouponType(coupon.type);
1513
+ const targetType = coupon.type === "amount_off_order" || coupon.type === "percentage_off_order" ? "order" : "items";
1514
+ const payload = {
1515
+ product: {
1516
+ title: product.title.trim(),
1517
+ subtitle: product.subtitle.trim() || null,
1518
+ handle: product.handle.trim() || null,
1519
+ description: product.description.trim() || null,
1520
+ status: productStatusFromCouponStatus(coupon.promotion_status),
1521
+ thumbnail: product.media[0]?.url || null,
1522
+ thumbnail_asset_id: product.media[0]?.asset_id || null,
1523
+ images: product.media.slice(1).map((media) => ({
1524
+ url: media.url,
1525
+ ...media.asset_id ? { asset_id: media.asset_id } : {}
1526
+ })),
1527
+ discountable: product.discountable,
1528
+ type_id: product.type_id || null,
1529
+ collection_id: product.collection_id || null,
1530
+ categories: product.category_id ? [{ id: product.category_id }] : [],
1531
+ tags: product.tag_id ? [{ id: product.tag_id }] : [],
1532
+ variants: [
1533
+ {
1534
+ title: "Default",
1535
+ sku: product.sku.trim() || null,
1536
+ manage_inventory: false,
1537
+ allow_backorder: true,
1538
+ prices: productPrices
1539
+ }
1540
+ ]
1541
+ },
1542
+ coupon: {
1543
+ enabled: coupon.enabled,
1544
+ benefit_type: benefitType,
1545
+ purchase_conditions: coupon.purchase_conditions.map((condition) => ({
1546
+ attribute: condition.attribute,
1547
+ operator: condition.operator,
1548
+ values: condition.values
1549
+ })),
1550
+ amounts: isAmountType ? coupon.amounts.map((row2) => ({
1551
+ amount: numberOrNull(row2.amount),
1552
+ currency_code: row2.currency_code
1553
+ })) : null,
1554
+ amount: null,
1555
+ percentage: isPercentageType ? numberOrNull(coupon.percentage) : null,
1556
+ currency_code: null,
1557
+ code_strategy: coupon.code_strategy,
1558
+ code_prefix: coupon.code_strategy === "unique_code" ? coupon.code_prefix.trim() || "COUPON" : null,
1559
+ shared_code: coupon.code_strategy === "shared_code" ? coupon.shared_code.trim() : null,
1560
+ expiration_policy: coupon.expiration_type === "none" ? { type: "none" } : coupon.expiration_type === "fixed" ? {
1561
+ type: "fixed",
1562
+ expires_at: new Date(coupon.expiration_date).toISOString(),
1563
+ cap_by_campaign: coupon.expiration_cap_by_campaign,
1564
+ cap_at: coupon.expiration_cap_at ? new Date(coupon.expiration_cap_at).toISOString() : null
1565
+ } : {
1566
+ type: "duration",
1567
+ duration_days: Number(coupon.expiration_days) || 30,
1568
+ cap_by_campaign: coupon.expiration_cap_by_campaign,
1569
+ cap_at: coupon.expiration_cap_at ? new Date(coupon.expiration_cap_at).toISOString() : null
1570
+ },
1571
+ max_issuance_per_order_item: Number(coupon.max_issuance_per_order_item) || 1,
1572
+ promotion_template: benefitType === "fixed_amount" || benefitType === "percentage" ? {
1573
+ application_method: {
1574
+ target_type: targetType,
1575
+ allocation: targetType === "order" ? "across" : coupon.allocation
1576
+ }
1577
+ } : null,
1578
+ promotion_status: coupon.promotion_status,
1579
+ ...allowPromotionMirror ? {
1580
+ promotion_mirror_mode: benefitType === "buy_get" || benefitType === "fixed_amount" && coupon.amounts.length > 1 ? "none" : coupon.promotion_mirror_mode
1581
+ } : {}
1582
+ },
1583
+ campaign: allowPromotionMirror ? campaign.mode === "existing" ? { mode: "existing", campaign_id: campaign.campaign_id } : campaign.mode === "new" ? {
1584
+ mode: "new",
1585
+ campaign: {
1586
+ name: campaign.name,
1587
+ campaign_identifier: campaign.campaign_identifier,
1588
+ starts_at: campaign.starts_at ? new Date(campaign.starts_at).toISOString() : null,
1589
+ ends_at: campaign.ends_at ? new Date(campaign.ends_at).toISOString() : null
1590
+ }
1591
+ } : { mode: "none" } : void 0,
1592
+ seller_id: product.seller_id || null,
1593
+ variant_overrides: []
1594
+ };
1595
+ await apiFetch(
1596
+ row ? `${apiBase}/coupon-products/${row.product.id}` : `${apiBase}/coupon-products`,
1597
+ {
1598
+ method: row ? "PATCH" : "POST",
1599
+ body: JSON.stringify(payload)
1600
+ }
1601
+ );
1602
+ import_ui2.toast.success(row ? "Coupon product updated" : "Coupon product created");
1603
+ onOpenChange(false);
1604
+ await onSaved();
1605
+ } catch (error) {
1606
+ import_ui2.toast.error(
1607
+ error instanceof Error ? error.message : "Failed to save coupon product"
1608
+ );
1609
+ } finally {
1610
+ setSaving(false);
1611
+ }
1612
+ };
1613
+ const stepStatus = (step) => {
1614
+ const index = visibleSteps.indexOf(step);
1615
+ if (index < currentStepIndex && stepValidity[step]) {
1616
+ return "completed";
1617
+ }
1618
+ if (index === currentStepIndex) return "in-progress";
1619
+ return "not-started";
1620
+ };
1621
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.FocusModal, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.FocusModal.Content, { style: modalContentStyle, children: [
1622
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.FocusModal.Title, { style: visuallyHiddenStyle, children: row ? "Edit Coupon Product" : "Create Coupon Product" }),
1623
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1624
+ import_ui2.ProgressTabs,
1625
+ {
1626
+ value: activeStep,
1627
+ onValueChange: (value) => {
1628
+ const step = value;
1629
+ const index = visibleSteps.indexOf(step);
1630
+ if (!isStepDisabled(index)) setActiveStep(step);
1631
+ },
1632
+ style: modalWizardStyle,
1633
+ children: [
1634
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.FocusModal.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "-my-2 w-full border-l", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.ProgressTabs.List, { className: "justify-start-start flex w-full items-center", children: visibleSteps.map((step, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1635
+ import_ui2.ProgressTabs.Trigger,
1636
+ {
1637
+ value: step,
1638
+ status: stepStatus(step),
1639
+ disabled: isStepDisabled(index),
1640
+ className: "max-w-[200px] truncate",
1641
+ children: step[0].toUpperCase() + step.slice(1)
1642
+ },
1643
+ step
1644
+ )) }) }) }),
1645
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.FocusModal.Body, { className: "overflow-hidden p-0", style: modalBodyStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1646
+ "div",
1647
+ {
1648
+ style: activeStep === "prices" ? { height: "100%", overflow: "hidden", width: "100%" } : modalScrollStyle,
1649
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1650
+ "div",
1651
+ {
1652
+ style: activeStep === "prices" ? { height: "100%", width: "100%" } : modalFormStyle,
1653
+ children: [
1654
+ activeStep === "details" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.ProgressTabs.Content, { value: "details", style: stackStyle, children: [
1655
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Heading, { level: "h1", children: row ? "Edit Coupon Product" : "Create Coupon Product" }),
1656
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Divider, {}),
1657
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Section, { title: "General", children: [
1658
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: threeColumnGridStyle, children: [
1659
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Title", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1660
+ import_ui2.Input,
1661
+ {
1662
+ value: product.title,
1663
+ placeholder: "Winter jacket",
1664
+ onChange: (event) => setProduct((current) => ({
1665
+ ...current,
1666
+ title: event.target.value
1667
+ }))
1668
+ }
1669
+ ) }),
1670
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Subtitle", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1671
+ import_ui2.Input,
1672
+ {
1673
+ value: product.subtitle,
1674
+ placeholder: "Warm and cozy",
1675
+ onChange: (event) => setProduct((current) => ({
1676
+ ...current,
1677
+ subtitle: event.target.value
1678
+ }))
1679
+ }
1680
+ ) }),
1681
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1682
+ Field,
1683
+ {
1684
+ label: "Handle",
1685
+ optional: true,
1686
+ tooltip: "The URL-friendly identifier for this product. If left empty, Medusa generates it from the title.",
1687
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1688
+ HandleInput,
1689
+ {
1690
+ value: product.handle,
1691
+ onChange: (handle) => setProduct((current) => ({ ...current, handle }))
1692
+ }
1693
+ )
1694
+ }
1695
+ )
1696
+ ] }),
1697
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Description", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1698
+ import_ui2.Textarea,
1699
+ {
1700
+ value: product.description,
1701
+ placeholder: "A warm and cozy jacket",
1702
+ onChange: (event) => setProduct((current) => ({
1703
+ ...current,
1704
+ description: event.target.value
1705
+ }))
1706
+ }
1707
+ ) }),
1708
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Media", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1709
+ MediaUpload,
1710
+ {
1711
+ isUploading: uploading,
1712
+ media: product.media,
1713
+ onUpload: (files) => void uploadMedia(files),
1714
+ onRemove: (media) => setProduct((current) => ({
1715
+ ...current,
1716
+ media: current.media.filter(
1717
+ (item) => media.asset_id && item.asset_id !== media.asset_id || !media.asset_id && item.url !== media.url
1718
+ )
1719
+ }))
1720
+ }
1721
+ ) }),
1722
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "SKU", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1723
+ import_ui2.Input,
1724
+ {
1725
+ value: product.sku,
1726
+ placeholder: "COUPON-001",
1727
+ onChange: (event) => setProduct((current) => ({
1728
+ ...current,
1729
+ sku: event.target.value
1730
+ }))
1731
+ }
1732
+ ) })
1733
+ ] }),
1734
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Divider, {}),
1735
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1736
+ PurchaseConditionsField,
1737
+ {
1738
+ fixedAmount: isAmountType,
1739
+ options,
1740
+ value: coupon.purchase_conditions,
1741
+ onChange: updatePurchaseConditions
1742
+ }
1743
+ )
1744
+ ] }),
1745
+ activeStep === "organize" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.ProgressTabs.Content, { value: "organize", style: stackStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Section, { title: "Organize", children: [
1746
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: panelStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between gap-x-4", children: [
1747
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1748
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { weight: "plus", children: "Discountable" }),
1749
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "Allow promotions to discount this product's sale price." })
1750
+ ] }),
1751
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1752
+ import_ui2.Switch,
1753
+ {
1754
+ checked: product.discountable,
1755
+ onCheckedChange: (discountable) => setProduct((current) => ({
1756
+ ...current,
1757
+ discountable: Boolean(discountable)
1758
+ }))
1759
+ }
1760
+ )
1761
+ ] }) }),
1762
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
1763
+ allowPromotionMirror && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Seller", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1764
+ OptionSelect,
1765
+ {
1766
+ value: product.seller_id,
1767
+ options: options.sellers || [],
1768
+ onChange: (seller_id) => setProduct((current) => ({ ...current, seller_id }))
1769
+ }
1770
+ ) }),
1771
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Type", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1772
+ OptionSelect,
1773
+ {
1774
+ value: product.type_id,
1775
+ options: options.product_types || [],
1776
+ onChange: (type_id) => setProduct((current) => ({ ...current, type_id }))
1777
+ }
1778
+ ) }),
1779
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Collection", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1780
+ OptionSelect,
1781
+ {
1782
+ value: product.collection_id,
1783
+ options: options.product_collections || [],
1784
+ onChange: (collection_id) => setProduct((current) => ({
1785
+ ...current,
1786
+ collection_id
1787
+ }))
1788
+ }
1789
+ ) }),
1790
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Category", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1791
+ OptionSelect,
1792
+ {
1793
+ value: product.category_id,
1794
+ options: options.product_categories || [],
1795
+ onChange: (category_id) => setProduct((current) => ({ ...current, category_id }))
1796
+ }
1797
+ ) }),
1798
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Tag", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1799
+ OptionSelect,
1800
+ {
1801
+ value: product.tag_id,
1802
+ options: options.product_tags || [],
1803
+ onChange: (tag_id) => setProduct((current) => ({ ...current, tag_id }))
1804
+ }
1805
+ ) })
1806
+ ] })
1807
+ ] }) }),
1808
+ activeStep === "details" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { ...stackStyle, marginTop: 24 }, children: [
1809
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Divider, {}),
1810
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1811
+ Section,
1812
+ {
1813
+ title: "Coupon",
1814
+ description: "Configure the coupon issued when this product is purchased.",
1815
+ children: [
1816
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: panelStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between gap-x-4", children: [
1817
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1818
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { weight: "plus", children: "Coupon issuance" }),
1819
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "Issue coupons when customers purchase this product." })
1820
+ ] }),
1821
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1822
+ import_ui2.Switch,
1823
+ {
1824
+ checked: coupon.enabled,
1825
+ onCheckedChange: (enabled) => setCoupon((current) => ({
1826
+ ...current,
1827
+ enabled: Boolean(enabled)
1828
+ }))
1829
+ }
1830
+ )
1831
+ ] }) }),
1832
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Type", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1833
+ import_ui2.RadioGroup,
1834
+ {
1835
+ value: coupon.type,
1836
+ onValueChange: (type) => updateCouponType(type),
1837
+ className: "flex flex-col gap-y-3",
1838
+ children: typeChoices.map((choice) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1839
+ import_ui2.RadioGroup.ChoiceBox,
1840
+ {
1841
+ value: choice.value,
1842
+ label: choice.label,
1843
+ description: choice.description
1844
+ },
1845
+ choice.value
1846
+ ))
1847
+ }
1848
+ ) }),
1849
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Status", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1850
+ import_ui2.RadioGroup,
1851
+ {
1852
+ value: coupon.promotion_status,
1853
+ onValueChange: (promotion_status) => setCoupon((current) => ({
1854
+ ...current,
1855
+ promotion_status
1856
+ })),
1857
+ style: twoColumnGridStyle,
1858
+ children: statusChoices.map((choice) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1859
+ import_ui2.RadioGroup.ChoiceBox,
1860
+ {
1861
+ value: choice.value,
1862
+ label: choice.label,
1863
+ description: choice.description
1864
+ },
1865
+ choice.value
1866
+ ))
1867
+ }
1868
+ ) }),
1869
+ (isAmountType || isPercentageType) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: isAmountType ? "Coupon Values" : "Value", children: isAmountType ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-2", children: [
1870
+ coupon.amounts.map((row2, rowIndex) => {
1871
+ const currency = currencies.find(
1872
+ (item) => item.code === row2.currency_code
1873
+ );
1874
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1875
+ "div",
1876
+ {
1877
+ className: "shadow-elevation-card-rest bg-ui-bg-component rounded-md px-4 py-3",
1878
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-2", children: [
1879
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between", children: [
1880
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Label, { children: [
1881
+ row2.currency_code.toUpperCase(),
1882
+ " Coupon Value"
1883
+ ] }),
1884
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: currency?.name || row2.currency_code.toUpperCase() })
1885
+ ] }),
1886
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1887
+ CurrencyAmountField,
1888
+ {
1889
+ currencies,
1890
+ currencyCode: row2.currency_code,
1891
+ value: row2.amount,
1892
+ onChange: (amount) => setCoupon((current) => ({
1893
+ ...current,
1894
+ amounts: current.amounts.map(
1895
+ (item, index) => index === rowIndex ? { ...item, amount } : item
1896
+ )
1897
+ }))
1898
+ }
1899
+ ) })
1900
+ ] })
1901
+ },
1902
+ row2.key
1903
+ );
1904
+ }),
1905
+ !coupon.amounts.length && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { className: "text-ui-fg-muted", children: "Select at least one effective Currency Code condition value." })
1906
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Coupon Value", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1907
+ PercentageInput,
1908
+ {
1909
+ value: coupon.percentage,
1910
+ onChange: (percentage) => setCoupon((current) => ({
1911
+ ...current,
1912
+ percentage
1913
+ }))
1914
+ }
1915
+ ) }) }),
1916
+ isItemScopedDiscount && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Allocation", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1917
+ import_ui2.RadioGroup,
1918
+ {
1919
+ value: coupon.allocation,
1920
+ onValueChange: (allocation) => setCoupon((current) => ({
1921
+ ...current,
1922
+ allocation
1923
+ })),
1924
+ style: twoColumnGridStyle,
1925
+ children: [
1926
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1927
+ import_ui2.RadioGroup.ChoiceBox,
1928
+ {
1929
+ value: "each",
1930
+ label: "Each",
1931
+ description: "Applies value on each item"
1932
+ }
1933
+ ),
1934
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1935
+ import_ui2.RadioGroup.ChoiceBox,
1936
+ {
1937
+ value: "once",
1938
+ label: "Once",
1939
+ description: "Limit discount to max quantity"
1940
+ }
1941
+ )
1942
+ ]
1943
+ }
1944
+ ) }),
1945
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1946
+ Section,
1947
+ {
1948
+ title: "Expiration",
1949
+ description: "Control when issued coupons expire.",
1950
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
1951
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Expiration policy", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1952
+ import_ui2.Select,
1953
+ {
1954
+ value: coupon.expiration_type,
1955
+ onValueChange: (expiration_type) => setCoupon((current) => ({
1956
+ ...current,
1957
+ expiration_type
1958
+ })),
1959
+ children: [
1960
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
1961
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
1962
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "none", children: "None" }),
1963
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "duration", children: "Duration after issue" }),
1964
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "fixed", children: "Fixed date" })
1965
+ ] })
1966
+ ]
1967
+ }
1968
+ ) }),
1969
+ coupon.expiration_type === "duration" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Expiration days", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1970
+ import_ui2.Input,
1971
+ {
1972
+ type: "number",
1973
+ min: 1,
1974
+ value: coupon.expiration_days,
1975
+ onChange: (event) => setCoupon((current) => ({
1976
+ ...current,
1977
+ expiration_days: event.target.value
1978
+ }))
1979
+ }
1980
+ ) }) : coupon.expiration_type === "fixed" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Expires at", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1981
+ import_ui2.Input,
1982
+ {
1983
+ type: "datetime-local",
1984
+ value: coupon.expiration_date,
1985
+ onChange: (event) => setCoupon((current) => ({
1986
+ ...current,
1987
+ expiration_date: event.target.value
1988
+ }))
1989
+ }
1990
+ ) }) : null,
1991
+ coupon.expiration_type !== "none" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
1992
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Cap expiration", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1993
+ "div",
1994
+ {
1995
+ className: "flex items-center justify-between gap-x-4",
1996
+ style: { ...panelStyle, padding: "8px 12px" },
1997
+ children: [
1998
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "Campaign end or cap date" }),
1999
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2000
+ import_ui2.Switch,
2001
+ {
2002
+ checked: coupon.expiration_cap_by_campaign,
2003
+ onCheckedChange: (expiration_cap_by_campaign) => setCoupon((current) => ({
2004
+ ...current,
2005
+ expiration_cap_by_campaign: Boolean(
2006
+ expiration_cap_by_campaign
2007
+ )
2008
+ }))
2009
+ }
2010
+ )
2011
+ ]
2012
+ }
2013
+ ) }),
2014
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Expiration cap date", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2015
+ import_ui2.Input,
2016
+ {
2017
+ type: "datetime-local",
2018
+ disabled: !coupon.expiration_cap_by_campaign,
2019
+ value: coupon.expiration_cap_at,
2020
+ onChange: (event) => setCoupon((current) => ({
2021
+ ...current,
2022
+ expiration_cap_at: event.target.value
2023
+ }))
2024
+ }
2025
+ ) })
2026
+ ] })
2027
+ ] })
2028
+ }
2029
+ ),
2030
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2031
+ Section,
2032
+ {
2033
+ title: "Code",
2034
+ description: "Choose whether every issued coupon is unique or shares one code.",
2035
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
2036
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Code strategy", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
2037
+ import_ui2.Select,
2038
+ {
2039
+ value: coupon.code_strategy,
2040
+ onValueChange: (code_strategy) => setCoupon((current) => ({
2041
+ ...current,
2042
+ code_strategy
2043
+ })),
2044
+ children: [
2045
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
2046
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
2047
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "unique_code", children: "Unique code" }),
2048
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "shared_code", children: "Shared code" })
2049
+ ] })
2050
+ ]
2051
+ }
2052
+ ) }),
2053
+ coupon.code_strategy === "unique_code" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Code prefix", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2054
+ import_ui2.Input,
2055
+ {
2056
+ value: coupon.code_prefix,
2057
+ placeholder: "COUPON",
2058
+ onChange: (event) => setCoupon((current) => ({
2059
+ ...current,
2060
+ code_prefix: event.target.value
2061
+ }))
2062
+ }
2063
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Shared code", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2064
+ import_ui2.Input,
2065
+ {
2066
+ value: coupon.shared_code,
2067
+ placeholder: "SUMMER15",
2068
+ onChange: (event) => setCoupon((current) => ({
2069
+ ...current,
2070
+ shared_code: event.target.value
2071
+ }))
2072
+ }
2073
+ ) })
2074
+ ] })
2075
+ }
2076
+ ),
2077
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Issuance", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
2078
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Max issuance per item", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2079
+ import_ui2.Input,
2080
+ {
2081
+ type: "number",
2082
+ min: 1,
2083
+ value: coupon.max_issuance_per_order_item,
2084
+ onChange: (event) => setCoupon((current) => ({
2085
+ ...current,
2086
+ max_issuance_per_order_item: event.target.value
2087
+ }))
2088
+ }
2089
+ ) }),
2090
+ allowPromotionMirror && !(isAmountType && coupon.amounts.length > 1) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Promotion mirror", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
2091
+ import_ui2.Select,
2092
+ {
2093
+ value: coupon.promotion_mirror_mode,
2094
+ disabled: coupon.type === "buy_x_get_y",
2095
+ onValueChange: (promotion_mirror_mode) => setCoupon((current) => ({
2096
+ ...current,
2097
+ promotion_mirror_mode
2098
+ })),
2099
+ children: [
2100
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
2101
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
2102
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "none", children: "None" }),
2103
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "manual", children: "Manual" }),
2104
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "auto", children: "Auto" })
2105
+ ] })
2106
+ ]
2107
+ }
2108
+ ) })
2109
+ ] }) })
2110
+ ]
2111
+ }
2112
+ )
2113
+ ] }),
2114
+ allowPromotionMirror && activeStep === "campaign" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.ProgressTabs.Content, { value: "campaign", style: stackStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Campaign", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
2115
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Campaign mode", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
2116
+ import_ui2.Select,
2117
+ {
2118
+ value: campaign.mode,
2119
+ onValueChange: (mode) => setCampaign((current) => ({
2120
+ ...current,
2121
+ mode
2122
+ })),
2123
+ children: [
2124
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
2125
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
2126
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "none", children: "No campaign" }),
2127
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "existing", children: "Existing campaign" }),
2128
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "new", children: "New campaign" })
2129
+ ] })
2130
+ ]
2131
+ }
2132
+ ) }),
2133
+ campaign.mode === "existing" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Existing campaign", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2134
+ OptionSelect,
2135
+ {
2136
+ value: campaign.campaign_id,
2137
+ options: options.campaigns || [],
2138
+ onChange: (campaign_id) => setCampaign((current) => ({
2139
+ ...current,
2140
+ campaign_id
2141
+ }))
2142
+ }
2143
+ ) }),
2144
+ campaign.mode === "new" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
2145
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Name", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2146
+ import_ui2.Input,
2147
+ {
2148
+ value: campaign.name,
2149
+ onChange: (event) => setCampaign((current) => ({
2150
+ ...current,
2151
+ name: event.target.value
2152
+ }))
2153
+ }
2154
+ ) }),
2155
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Identifier", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2156
+ import_ui2.Input,
2157
+ {
2158
+ value: campaign.campaign_identifier,
2159
+ onChange: (event) => setCampaign((current) => ({
2160
+ ...current,
2161
+ campaign_identifier: event.target.value
2162
+ }))
2163
+ }
2164
+ ) }),
2165
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Starts at", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2166
+ import_ui2.Input,
2167
+ {
2168
+ type: "datetime-local",
2169
+ value: campaign.starts_at,
2170
+ onChange: (event) => setCampaign((current) => ({
2171
+ ...current,
2172
+ starts_at: event.target.value
2173
+ }))
2174
+ }
2175
+ ) }),
2176
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Ends at", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2177
+ import_ui2.Input,
2178
+ {
2179
+ type: "datetime-local",
2180
+ value: campaign.ends_at,
2181
+ onChange: (event) => setCampaign((current) => ({
2182
+ ...current,
2183
+ ends_at: event.target.value
2184
+ }))
2185
+ }
2186
+ ) })
2187
+ ] })
2188
+ ] }) }) }),
2189
+ activeStep === "prices" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.ProgressTabs.Content, { value: "prices", style: { height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2190
+ ProductPricesTable,
2191
+ {
2192
+ currencies,
2193
+ couponValue: formatCouponValue(coupon, currencies),
2194
+ prices: product.price_amounts,
2195
+ onChange: (currencyCode, value) => setProduct((current) => ({
2196
+ ...current,
2197
+ price_amounts: {
2198
+ ...current.price_amounts,
2199
+ [currencyCode]: value
2200
+ }
2201
+ }))
2202
+ }
2203
+ ) })
2204
+ ]
2205
+ }
2206
+ )
2207
+ }
2208
+ ) }),
2209
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.FocusModal.Footer, { style: { flexShrink: 0 }, children: [
2210
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Button, { variant: "secondary", onClick: () => onOpenChange(false), children: "Cancel" }),
2211
+ currentStepIndex > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2212
+ import_ui2.Button,
2213
+ {
2214
+ variant: "secondary",
2215
+ onClick: () => setActiveStep(visibleSteps[currentStepIndex - 1]),
2216
+ children: "Back"
2217
+ }
2218
+ ),
2219
+ currentStepIndex < visibleSteps.length - 1 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2220
+ import_ui2.Button,
2221
+ {
2222
+ disabled: !activeStepComplete,
2223
+ onClick: () => {
2224
+ const nextIndex = currentStepIndex + 1;
2225
+ setFurthestStepIndex(
2226
+ (current) => Math.max(current, nextIndex)
2227
+ );
2228
+ setActiveStep(visibleSteps[nextIndex]);
2229
+ },
2230
+ children: "Continue"
2231
+ }
2232
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2233
+ import_ui2.Button,
2234
+ {
2235
+ disabled: !activeStepComplete,
2236
+ isLoading: saving,
2237
+ onClick: () => void save(),
2238
+ children: "Save"
2239
+ }
2240
+ )
2241
+ ] })
2242
+ ]
2243
+ }
2244
+ )
2245
+ ] }) });
2246
+ }
2247
+ function CouponProductsPage({
2248
+ allowPromotionMirror = false,
2249
+ apiBase,
2250
+ title
2251
+ }) {
2252
+ const [products, setProducts] = (0, import_react.useState)([]);
2253
+ const [options, setOptions] = (0, import_react.useState)({});
2254
+ const [loading, setLoading] = (0, import_react.useState)(true);
2255
+ const [loadError, setLoadError] = (0, import_react.useState)(null);
2256
+ const [modalOpen, setModalOpen] = (0, import_react.useState)(false);
2257
+ const [editingRow, setEditingRow] = (0, import_react.useState)(null);
2258
+ const prompt = (0, import_ui2.usePrompt)();
2259
+ const couponBase = `${apiBase}/coupon-products`;
2260
+ const load = (0, import_react.useCallback)(async () => {
2261
+ setLoading(true);
2262
+ setLoadError(null);
2263
+ try {
2264
+ const [productsPayload, optionsPayload] = await Promise.all([
2265
+ apiFetch(couponBase),
2266
+ apiFetch(`${couponBase}/options`)
2267
+ ]);
2268
+ setProducts(productsPayload.coupon_products || []);
2269
+ setOptions(optionsPayload || {});
2270
+ } catch (error) {
2271
+ const message = error instanceof Error ? error.message : "Failed to load coupon products";
2272
+ setLoadError(message);
2273
+ import_ui2.toast.error(message);
2274
+ } finally {
2275
+ setLoading(false);
2276
+ }
2277
+ }, [couponBase]);
2278
+ (0, import_react.useEffect)(() => {
2279
+ void load();
2280
+ }, [load]);
2281
+ const remove = async (row) => {
2282
+ const confirmed = await prompt({
2283
+ title: "Remove coupon product?",
2284
+ description: `This removes coupon issuance from ${row.product.title || row.product.id}. The underlying Medusa product will remain available.`,
2285
+ confirmText: "Remove product",
2286
+ cancelText: "Cancel",
2287
+ variant: "danger"
2288
+ });
2289
+ if (!confirmed) return;
2290
+ try {
2291
+ await apiFetch(`${couponBase}/${row.product.id}`, { method: "DELETE" });
2292
+ import_ui2.toast.success("Coupon configuration removed");
2293
+ await load();
2294
+ } catch (error) {
2295
+ import_ui2.toast.error(error instanceof Error ? error.message : "Delete failed");
2296
+ }
2297
+ };
2298
+ const mirror = async (row) => {
2299
+ try {
2300
+ await apiFetch(
2301
+ `/admin/coupon-products/${row.product.id}/mirror-promotion`,
2302
+ {
2303
+ method: "POST",
2304
+ body: JSON.stringify({})
2305
+ }
2306
+ );
2307
+ import_ui2.toast.success("Promotion mirror created");
2308
+ } catch (error) {
2309
+ import_ui2.toast.error(error instanceof Error ? error.message : "Mirror failed");
2310
+ }
2311
+ };
2312
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Container, { className: "divide-y p-0", children: [
2313
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between px-6 py-4", children: [
2314
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Heading, { level: "h1", children: title }),
2315
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-x-2", children: [
2316
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Button, { size: "small", variant: "secondary", onClick: () => void load(), children: [
2317
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.ArrowPath, {}),
2318
+ " Refresh"
2319
+ ] }),
2320
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
2321
+ import_ui2.Button,
2322
+ {
2323
+ size: "small",
2324
+ onClick: () => {
2325
+ setEditingRow(null);
2326
+ setModalOpen(true);
2327
+ },
2328
+ children: [
2329
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.Plus, {}),
2330
+ " Create"
2331
+ ]
2332
+ }
2333
+ )
2334
+ ] })
2335
+ ] }),
2336
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(CouponEmptyState, { title: "Loading coupon products" }) : loadError ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(CouponEmptyState, { title: loadError }) : products.length ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Table, { children: [
2337
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Table.Row, { children: [
2338
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Product" }),
2339
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Status" }),
2340
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Type" }),
2341
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Code" }),
2342
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Campaign" }),
2343
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Issued" }),
2344
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, {})
2345
+ ] }) }),
2346
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2347
+ import_ui2.Table.Body,
2348
+ {
2349
+ style: { borderBottom: "none" },
2350
+ children: products.map((row) => {
2351
+ const config3 = row.coupon_product_config;
2352
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
2353
+ import_ui2.Table.Row,
2354
+ {
2355
+ style: { borderBottom: "none", background: "none" },
2356
+ children: [
2357
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col", children: [
2358
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { weight: "plus", children: row.product.title || row.product.id }),
2359
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: row.product.handle || row.product.id })
2360
+ ] }) }),
2361
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2362
+ import_ui2.StatusBadge,
2363
+ {
2364
+ color: couponStatusColor(config3.promotion_status),
2365
+ children: config3.promotion_status || "draft"
2366
+ }
2367
+ ) }),
2368
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: couponTypeLabel(config3) }),
2369
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: config3.code_strategy === "shared_code" ? config3.shared_code || "Shared" : `${config3.code_prefix || "COUPON"}-*` }),
2370
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: campaignLabel(config3) }),
2371
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: row.entitlements_count || 0 }),
2372
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex justify-end gap-x-2", children: [
2373
+ allowPromotionMirror && !(config3.benefit_type === "fixed_amount" && (config3.amounts?.length || 0) > 1) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2374
+ import_ui2.Button,
2375
+ {
2376
+ size: "small",
2377
+ variant: "secondary",
2378
+ onClick: () => void mirror(row),
2379
+ children: "Mirror"
2380
+ }
2381
+ ),
2382
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2383
+ import_ui2.Button,
2384
+ {
2385
+ size: "small",
2386
+ variant: "secondary",
2387
+ onClick: () => {
2388
+ setEditingRow(row);
2389
+ setModalOpen(true);
2390
+ },
2391
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.PencilSquare, {})
2392
+ }
2393
+ ),
2394
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2395
+ import_ui2.Button,
2396
+ {
2397
+ size: "small",
2398
+ variant: "danger",
2399
+ onClick: () => void remove(row),
2400
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.Trash, {})
2401
+ }
2402
+ )
2403
+ ] }) })
2404
+ ]
2405
+ },
2406
+ row.id
2407
+ );
2408
+ })
2409
+ }
2410
+ )
2411
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2412
+ CouponEmptyState,
2413
+ {
2414
+ title: "No coupon products found",
2415
+ description: "Create a new coupon product to get started."
2416
+ }
2417
+ ),
2418
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2419
+ CouponProductModal,
2420
+ {
2421
+ open: modalOpen,
2422
+ row: editingRow,
2423
+ apiBase,
2424
+ options,
2425
+ allowPromotionMirror,
2426
+ onOpenChange: setModalOpen,
2427
+ onSaved: load
2428
+ }
2429
+ )
2430
+ ] });
2431
+ }
2432
+
2433
+ // src/dashboard/coupons/coupon-manager.tsx
2434
+ var import_jsx_runtime3 = require("react/jsx-runtime");
2435
+ function backendUrl2() {
2436
+ return typeof __BACKEND_URL__ === "string" ? __BACKEND_URL__.replace(/\/$/, "") : "";
2437
+ }
2438
+ function apiErrorMessage2(payload, fallback) {
2439
+ const candidates = [
2440
+ payload?.message,
2441
+ payload?.error?.message,
2442
+ payload?.error,
2443
+ payload?.errors?.[0]?.message
2444
+ ];
2445
+ const message = candidates.find(
2446
+ (candidate) => typeof candidate === "string" && candidate.trim()
2447
+ );
2448
+ return message || fallback || "Request failed";
2449
+ }
2450
+ async function apiFetch2(path, options = {}) {
2451
+ const response = await fetch(`${backendUrl2()}${path}`, {
2452
+ ...options,
2453
+ credentials: "include",
2454
+ headers: {
2455
+ ...options.body ? { "Content-Type": "application/json" } : {},
2456
+ ...options.headers
2457
+ }
2458
+ });
2459
+ if (!response.ok) {
2460
+ const payload = await response.json().catch(() => null);
2461
+ throw new Error(apiErrorMessage2(payload, response.statusText));
2462
+ }
2463
+ return response.json();
2464
+ }
2465
+ function formatDate(value) {
2466
+ if (!value) return "-";
2467
+ const date = new Date(value);
2468
+ if (Number.isNaN(date.getTime())) return "-";
2469
+ return date.toLocaleDateString();
2470
+ }
2471
+ function formatDateTime(value) {
2472
+ if (!value) return "-";
2473
+ const date = new Date(value);
2474
+ if (Number.isNaN(date.getTime())) return "-";
2475
+ return date.toLocaleString();
2476
+ }
2477
+ function formatFullDate(value) {
2478
+ if (!value) return "-";
2479
+ const date = new Date(value);
2480
+ if (Number.isNaN(date.getTime())) return "-";
2481
+ return date.toLocaleString(void 0, {
2482
+ day: "numeric",
2483
+ hour: "numeric",
2484
+ minute: "2-digit",
2485
+ month: "short",
2486
+ year: "numeric"
2487
+ });
2488
+ }
2489
+ function formatRelativeDate(value) {
2490
+ if (!value) return "-";
2491
+ const date = new Date(value);
2492
+ if (Number.isNaN(date.getTime())) return "-";
2493
+ const diffSeconds = Math.round((date.getTime() - Date.now()) / 1e3);
2494
+ const absSeconds = Math.abs(diffSeconds);
2495
+ const units = [
2496
+ ["year", 60 * 60 * 24 * 365],
2497
+ ["month", 60 * 60 * 24 * 30],
2498
+ ["week", 60 * 60 * 24 * 7],
2499
+ ["day", 60 * 60 * 24],
2500
+ ["hour", 60 * 60],
2501
+ ["minute", 60]
2502
+ ];
2503
+ const [unit, seconds] = units.find(([, secondsPerUnit]) => absSeconds >= secondsPerUnit) || [];
2504
+ if (!unit || !seconds) {
2505
+ return "just now";
2506
+ }
2507
+ return new Intl.RelativeTimeFormat(void 0, { numeric: "auto" }).format(
2508
+ Math.round(diffSeconds / seconds),
2509
+ unit
2510
+ );
2511
+ }
2512
+ function formatSnapshotAmount(amount, currency) {
2513
+ if (amount == null) return "-";
2514
+ const code = currency ? currency.toUpperCase() : "";
2515
+ return [code, amount.toLocaleString(void 0, { maximumFractionDigits: 2 })].filter(Boolean).join(" ");
2516
+ }
2517
+ function entitlementStatusColor(status) {
2518
+ if (status === "issued") return "green";
2519
+ if (status === "redeemed") return "blue";
2520
+ if (status === "expired" || status === "canceled") return "grey";
2521
+ return "orange";
2522
+ }
2523
+ function snapshotString(snapshot, key) {
2524
+ const value = snapshot?.[key];
2525
+ if (typeof value === "string" && value.trim()) return value;
2526
+ if (typeof value === "number") return String(value);
2527
+ return "";
2528
+ }
2529
+ function snapshotNumber(snapshot, key) {
2530
+ const value = snapshot?.[key];
2531
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
2532
+ }
2533
+ function jsonBlock(value) {
2534
+ if (value == null) return "{}";
2535
+ return JSON.stringify(value, null, 2);
2536
+ }
2537
+ function couponCode(entitlement) {
2538
+ return entitlement.code || entitlement.shared_code || "-";
2539
+ }
2540
+ function entitlementSource(entitlement) {
2541
+ if (entitlement.origin === "external") return "External";
2542
+ return "Purchase";
2543
+ }
2544
+ function entitlementSellerScope(entitlement) {
2545
+ const count = entitlement.seller_targets?.length || 0;
2546
+ if (entitlement.origin !== "external") {
2547
+ if (!count) return "Product seller";
2548
+ return `Product seller + ${count} linked`;
2549
+ }
2550
+ if (!count) return "Admin only";
2551
+ return count === 1 ? "1 linked seller" : `${count} linked sellers`;
2552
+ }
2553
+ function orderDisplayId(order) {
2554
+ if (!order) return "-";
2555
+ return order.display_id == null ? order.id : `#${order.display_id}`;
2556
+ }
2557
+ function dashboardBasePath(apiBase) {
2558
+ return apiBase === "/vendor" ? "/seller" : "/dashboard";
2559
+ }
2560
+ function couponDetailPath(apiBase, entitlementId) {
2561
+ return `${dashboardBasePath(apiBase)}/coupons/${encodeURIComponent(
2562
+ entitlementId
2563
+ )}`;
2564
+ }
2565
+ function orderDetailPath(apiBase, orderId) {
2566
+ return `${dashboardBasePath(apiBase)}/orders/${encodeURIComponent(orderId)}`;
2567
+ }
2568
+ function currentCouponDetailId(apiBase) {
2569
+ if (typeof window === "undefined") {
2570
+ return "";
2571
+ }
2572
+ const prefix = `${dashboardBasePath(apiBase)}/coupons/`;
2573
+ const path = window.location.pathname;
2574
+ const index = path.indexOf(prefix);
2575
+ if (index === -1) {
2576
+ return "";
2577
+ }
2578
+ const id = path.slice(index + prefix.length).split("/")[0];
2579
+ if (!id || id === "products") {
2580
+ return "";
2581
+ }
2582
+ try {
2583
+ return decodeURIComponent(id);
2584
+ } catch {
2585
+ return id;
2586
+ }
2587
+ }
2588
+ function benefitSnapshotLabel(snapshot) {
2589
+ const type = snapshotString(snapshot, "benefit_type");
2590
+ if (type === "fixed_amount") {
2591
+ const amounts = Array.isArray(snapshot?.amounts) ? snapshot.amounts : [];
2592
+ if (amounts.length) {
2593
+ return amounts.map((row) => {
2594
+ const amount2 = snapshotNumber(row, "amount");
2595
+ const currency2 = snapshotString(row, "currency_code").toUpperCase();
2596
+ return `${amount2 ?? 0} ${currency2}`.trim();
2597
+ }).join(", ");
2598
+ }
2599
+ const amount = snapshotNumber(snapshot, "amount");
2600
+ const currency = snapshotString(snapshot, "currency_code").toUpperCase();
2601
+ return `${amount ?? 0} ${currency}`.trim();
2602
+ }
2603
+ if (type === "percentage") {
2604
+ const template = snapshot?.promotion_template;
2605
+ const method = template?.application_method;
2606
+ const scope = snapshotString(method, "target_type") === "order" ? "order" : "products";
2607
+ return `${snapshotNumber(snapshot, "percentage") ?? 0}% off ${scope}`;
2608
+ }
2609
+ if (type === "free_shipping") {
2610
+ return "Free shipping";
2611
+ }
2612
+ if (type === "buy_get") {
2613
+ return "Buy X Get Y";
2614
+ }
2615
+ return "Unknown";
2616
+ }
2617
+ function expirationPolicyLabel(snapshot) {
2618
+ const policy = snapshot?.expiration_policy;
2619
+ const type = snapshotString(policy, "type");
2620
+ if (type === "none") return "No expiration";
2621
+ if (type === "duration") {
2622
+ const days = snapshotNumber(policy, "duration_days") ?? 0;
2623
+ return `${days} days after issuance`;
2624
+ }
2625
+ if (type === "fixed") {
2626
+ return `Fixed date ${formatDateTime(snapshotString(policy, "expires_at"))}`;
2627
+ }
2628
+ return "-";
2629
+ }
2630
+ function campaignSnapshotLabel(snapshot) {
2631
+ const campaignSnapshot = snapshot?.campaign_snapshot;
2632
+ return snapshotString(campaignSnapshot, "name") || snapshotString(campaignSnapshot, "campaign_identifier") || snapshotString(snapshot, "campaign_id") || "None";
2633
+ }
2634
+ function promotionSnapshotLabel(snapshot) {
2635
+ const template = snapshot?.promotion_template;
2636
+ const method = template?.application_method;
2637
+ const target = snapshotString(method, "target_type");
2638
+ const allocation = snapshotString(method, "allocation");
2639
+ return [target, allocation].filter(Boolean).join(" / ") || "None";
2640
+ }
2641
+ var entitlementFilters = [
2642
+ { label: "All", value: "all" },
2643
+ { label: "Issued", value: "issued" },
2644
+ { label: "Redeemed", value: "redeemed" },
2645
+ { label: "Expired", value: "expired" },
2646
+ { label: "Canceled", value: "canceled" }
2647
+ ];
2648
+ function SnapshotBlock({ title, value }) {
2649
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("details", { className: "rounded-lg border p-3", children: [
2650
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("summary", { className: "cursor-pointer text-ui-fg-base txt-small-plus", children: title }),
2651
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2652
+ "pre",
2653
+ {
2654
+ className: "mt-3 rounded-md bg-ui-bg-subtle p-3 text-ui-fg-subtle txt-compact-xsmall",
2655
+ style: {
2656
+ maxHeight: 220,
2657
+ overflow: "auto",
2658
+ whiteSpace: "pre-wrap",
2659
+ wordBreak: "break-word"
2660
+ },
2661
+ children: jsonBlock(value)
2662
+ }
2663
+ )
2664
+ ] });
2665
+ }
2666
+ function TwoColumnLayout({
2667
+ firstCol,
2668
+ secondCol
2669
+ }) {
2670
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-col gap-x-4 gap-y-3 xl:flex-row xl:items-start", children: [
2671
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex w-full flex-col gap-y-3", children: firstCol }),
2672
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex w-full max-w-[100%] flex-col gap-y-3 xl:mt-0 xl:max-w-[440px]", children: secondCol })
2673
+ ] });
2674
+ }
2675
+ function SectionRow({
2676
+ title,
2677
+ value
2678
+ }) {
2679
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "text-ui-fg-subtle grid grid-cols-2 items-center gap-x-4 px-6 py-4", children: [
2680
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Text, { size: "small", weight: "plus", leading: "compact", children: title }),
2681
+ typeof value === "string" || value == null ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2682
+ import_ui3.Text,
2683
+ {
2684
+ size: "small",
2685
+ leading: "compact",
2686
+ className: "text-pretty whitespace-pre-line",
2687
+ children: value || "-"
2688
+ }
2689
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "min-w-0", children: value })
2690
+ ] });
2691
+ }
2692
+ function WidgetHeader({ title }) {
2693
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Heading, { level: "h2", children: title }) });
2694
+ }
2695
+ function SidebarLink({
2696
+ href,
2697
+ label,
2698
+ description,
2699
+ icon
2700
+ }) {
2701
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href, className: "group outline-none", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex flex-col gap-2 px-2 pb-2", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "shadow-elevation-card-rest bg-ui-bg-component transition-fg hover:bg-ui-bg-component-hover active:bg-ui-bg-component-pressed group-focus-visible:shadow-borders-interactive-with-active rounded-md px-4 py-2", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center gap-4", children: [
2702
+ icon && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { children: icon }),
2703
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-1 flex-col", children: [
2704
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Text, { size: "small", leading: "compact", weight: "plus", children: label }),
2705
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2706
+ import_ui3.Text,
2707
+ {
2708
+ size: "small",
2709
+ leading: "compact",
2710
+ className: "text-ui-fg-subtle",
2711
+ children: description
2712
+ }
2713
+ )
2714
+ ] }),
2715
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_icons2.TriangleRightMini, { className: "text-ui-fg-muted" }) })
2716
+ ] }) }) }) });
2717
+ }
2718
+ function SummaryWidget({
2719
+ label,
2720
+ value,
2721
+ tone = "green"
2722
+ }) {
2723
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Container, { className: "px-6 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "text-ui-fg-subtle flex items-center gap-x-3", children: [
2724
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2725
+ "div",
2726
+ {
2727
+ className: `h-8 w-1 rounded-full ${tone === "green" ? "bg-ui-tag-green-icon" : "bg-ui-tag-neutral-icon"}`
2728
+ }
2729
+ ),
2730
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "min-w-0", children: [
2731
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Text, { weight: "plus", size: "small", className: "text-ui-fg-subtle", children: label }),
2732
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2733
+ import_ui3.Text,
2734
+ {
2735
+ weight: "plus",
2736
+ size: "xlarge",
2737
+ className: "tabular-nums text-ui-fg-base break-words",
2738
+ children: value
2739
+ }
2740
+ )
2741
+ ] })
2742
+ ] }) });
2743
+ }
2744
+ function CouponGeneralSection({ detail }) {
2745
+ const entitlement = detail.customer_coupon_entitlement;
2746
+ const issuance = detail.coupon_issuance || null;
2747
+ const benefitSnapshot = entitlement.benefit_snapshot || null;
2748
+ const sourceSnapshot = entitlement.source_snapshot || null;
2749
+ const code = couponCode(entitlement);
2750
+ const external = entitlement.origin === "external";
2751
+ const productLabel = snapshotString(sourceSnapshot, "title") || snapshotString(sourceSnapshot, "source") || entitlement.product_id || "External";
2752
+ const variantLabel = snapshotString(sourceSnapshot, "variant_id") || entitlement.variant_id || "-";
2753
+ const issuedDate = entitlement.created_at || issuance?.created_at || null;
2754
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "divide-y p-0", children: [
2755
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center justify-between px-6 py-4", children: [
2756
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "min-w-0", children: [
2757
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center gap-x-1", children: [
2758
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Heading, { className: "break-all", children: [
2759
+ "#",
2760
+ code
2761
+ ] }),
2762
+ code !== "-" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Copy, { content: code, className: "text-ui-fg-muted" })
2763
+ ] }),
2764
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Text, { size: "small", className: "text-ui-fg-subtle", children: formatFullDate(issuedDate) })
2765
+ ] }),
2766
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.StatusBadge, { color: entitlementStatusColor(entitlement.status), children: entitlement.status })
2767
+ ] }),
2768
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Date issued", value: formatRelativeDate(issuedDate) }),
2769
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2770
+ SectionRow,
2771
+ {
2772
+ title: "Customer",
2773
+ value: entitlement.email || entitlement.customer_id || "-"
2774
+ }
2775
+ ),
2776
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Origin", value: entitlementSource(entitlement) }),
2777
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2778
+ SectionRow,
2779
+ {
2780
+ title: external ? "Source" : "Coupon product",
2781
+ value: productLabel
2782
+ }
2783
+ ),
2784
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Seller scope", value: entitlementSellerScope(entitlement) }),
2785
+ !external && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Variant", value: variantLabel }),
2786
+ !external && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2787
+ SectionRow,
2788
+ {
2789
+ title: "Quantity",
2790
+ value: String(
2791
+ snapshotNumber(sourceSnapshot, "quantity") ?? issuance?.quantity ?? 1
2792
+ )
2793
+ }
2794
+ ),
2795
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2796
+ SectionRow,
2797
+ {
2798
+ title: "Benefit",
2799
+ value: benefitSnapshotLabel(benefitSnapshot)
2800
+ }
2801
+ ),
2802
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2803
+ SectionRow,
2804
+ {
2805
+ title: "Expiration policy",
2806
+ value: expirationPolicyLabel(benefitSnapshot)
2807
+ }
2808
+ ),
2809
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Expiration Date", value: formatDate(entitlement.expires_at) }),
2810
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Redeemed Date", value: formatDate(entitlement.redeemed_at) })
2811
+ ] });
2812
+ }
2813
+ function RelatedOrderSection({
2814
+ apiBase,
2815
+ detail
2816
+ }) {
2817
+ const entitlement = detail.customer_coupon_entitlement;
2818
+ const order = detail.order || null;
2819
+ const orderId = order?.id || entitlement.order_id;
2820
+ if (!orderId) {
2821
+ return null;
2822
+ }
2823
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "p-0", children: [
2824
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(WidgetHeader, { title: "Related Order" }),
2825
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2826
+ SidebarLink,
2827
+ {
2828
+ href: orderDetailPath(apiBase, orderId),
2829
+ label: order ? orderDisplayId(order) : orderId,
2830
+ description: order?.created_at ? `Order placed ${formatRelativeDate(order.created_at)}` : "Purchased coupon order",
2831
+ icon: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_icons2.ShoppingCart, {})
2832
+ }
2833
+ )
2834
+ ] });
2835
+ }
2836
+ function CouponSnapshotsSection({
2837
+ detail
2838
+ }) {
2839
+ const entitlement = detail.customer_coupon_entitlement;
2840
+ const issuance = detail.coupon_issuance || null;
2841
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "p-0", children: [
2842
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(WidgetHeader, { title: "JSON" }),
2843
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-col gap-y-3 px-6 pb-6", children: [
2844
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2845
+ SnapshotBlock,
2846
+ {
2847
+ title: "Benefit snapshot",
2848
+ value: entitlement.benefit_snapshot
2849
+ }
2850
+ ),
2851
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2852
+ SnapshotBlock,
2853
+ {
2854
+ title: "Source snapshot",
2855
+ value: entitlement.source_snapshot
2856
+ }
2857
+ ),
2858
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2859
+ SnapshotBlock,
2860
+ {
2861
+ title: "Issuance config snapshot",
2862
+ value: issuance?.config_snapshot
2863
+ }
2864
+ ),
2865
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SnapshotBlock, { title: "Seller targets", value: entitlement.seller_targets }),
2866
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SnapshotBlock, { title: "Metadata", value: entitlement.metadata })
2867
+ ] })
2868
+ ] });
2869
+ }
2870
+ function CouponSummarySections({
2871
+ detail
2872
+ }) {
2873
+ const entitlement = detail.customer_coupon_entitlement;
2874
+ const issuance = detail.coupon_issuance || null;
2875
+ const benefitSnapshot = entitlement.benefit_snapshot || null;
2876
+ const sourceSnapshot = entitlement.source_snapshot || null;
2877
+ const order = detail.order || null;
2878
+ const lineTotal = snapshotNumber(sourceSnapshot, "total");
2879
+ const external = entitlement.origin === "external";
2880
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
2881
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2882
+ SummaryWidget,
2883
+ {
2884
+ label: "Benefit",
2885
+ value: benefitSnapshotLabel(benefitSnapshot)
2886
+ }
2887
+ ),
2888
+ !external && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2889
+ SummaryWidget,
2890
+ {
2891
+ label: "Line Total",
2892
+ value: formatSnapshotAmount(lineTotal, order?.currency_code),
2893
+ tone: "neutral"
2894
+ }
2895
+ ),
2896
+ !external && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "divide-y p-0", children: [
2897
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(WidgetHeader, { title: "Campaign" }),
2898
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Campaign", value: campaignSnapshotLabel(benefitSnapshot) }),
2899
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Promotion", value: promotionSnapshotLabel(benefitSnapshot) }),
2900
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2901
+ SectionRow,
2902
+ {
2903
+ title: "Promotion status",
2904
+ value: snapshotString(benefitSnapshot, "promotion_status") || "-"
2905
+ }
2906
+ )
2907
+ ] }),
2908
+ !external && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "divide-y p-0", children: [
2909
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(WidgetHeader, { title: "Issuance" }),
2910
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Status", value: issuance?.status || "-" }),
2911
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2912
+ SectionRow,
2913
+ {
2914
+ title: "Issued / failed",
2915
+ value: issuance ? `${issuance.issued_count ?? 0} / ${issuance.failed_count ?? 0}` : "-"
2916
+ }
2917
+ ),
2918
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Config", value: entitlement.config_id || "-" }),
2919
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2920
+ SectionRow,
2921
+ {
2922
+ title: "Variant config",
2923
+ value: entitlement.variant_config_id || "-"
2924
+ }
2925
+ )
2926
+ ] })
2927
+ ] });
2928
+ }
2929
+ function CouponDetailPageView({ apiBase }) {
2930
+ const id = currentCouponDetailId(apiBase);
2931
+ const [detail, setDetail] = (0, import_react2.useState)(null);
2932
+ const [loading, setLoading] = (0, import_react2.useState)(true);
2933
+ const [loadError, setLoadError] = (0, import_react2.useState)(null);
2934
+ (0, import_react2.useEffect)(() => {
2935
+ let active = true;
2936
+ async function load() {
2937
+ if (!id) {
2938
+ setLoadError("Missing coupon id");
2939
+ setLoading(false);
2940
+ return;
2941
+ }
2942
+ setLoading(true);
2943
+ setLoadError(null);
2944
+ try {
2945
+ const payload = await apiFetch2(
2946
+ `${apiBase}/coupon-products/entitlements/${encodeURIComponent(id)}`
2947
+ );
2948
+ if (active) {
2949
+ setDetail(payload);
2950
+ }
2951
+ } catch (error) {
2952
+ const message = error instanceof Error ? error.message : "Failed to load coupon details";
2953
+ if (active) {
2954
+ setLoadError(message);
2955
+ import_ui3.toast.error(message);
2956
+ }
2957
+ } finally {
2958
+ if (active) {
2959
+ setLoading(false);
2960
+ }
2961
+ }
2962
+ }
2963
+ void load();
2964
+ return () => {
2965
+ active = false;
2966
+ };
2967
+ }, [apiBase, id]);
2968
+ if (loading) {
2969
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: "Loading coupon" });
2970
+ }
2971
+ if (loadError) {
2972
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: loadError });
2973
+ }
2974
+ if (!detail) {
2975
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: "Coupon not found" });
2976
+ }
2977
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
2978
+ TwoColumnLayout,
2979
+ {
2980
+ firstCol: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
2981
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponGeneralSection, { detail }),
2982
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(RelatedOrderSection, { apiBase, detail }),
2983
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponSnapshotsSection, { detail })
2984
+ ] }),
2985
+ secondCol: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponSummarySections, { detail })
2986
+ }
2987
+ );
2988
+ }
2989
+ function EntitlementsTable({
2990
+ entitlements,
2991
+ loading,
2992
+ error,
2993
+ onOpen
2994
+ }) {
2995
+ if (loading) {
2996
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: "Loading coupons" });
2997
+ }
2998
+ if (error) {
2999
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: error });
3000
+ }
3001
+ if (!entitlements.length) {
3002
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
3003
+ CouponEmptyState,
3004
+ {
3005
+ title: "No coupons found",
3006
+ description: "Purchased coupons will appear here after they are issued."
3007
+ }
3008
+ );
3009
+ }
3010
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Table, { children: [
3011
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Table.Row, { children: [
3012
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Status" }),
3013
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Code" }),
3014
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Date issued" }),
3015
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Order" }),
3016
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Customer" }),
3017
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Origin" }),
3018
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Seller scope" }),
3019
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Source" }),
3020
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Expires" })
3021
+ ] }) }),
3022
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Body, { children: entitlements.map((item) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
3023
+ import_ui3.Table.Row,
3024
+ {
3025
+ className: "cursor-pointer hover:bg-ui-bg-subtle",
3026
+ onClick: () => onOpen(item),
3027
+ children: [
3028
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.StatusBadge, { color: entitlementStatusColor(item.status), children: item.status }) }),
3029
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: item.code || item.shared_code || "-" }),
3030
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { title: formatFullDate(item.created_at), children: formatRelativeDate(item.created_at) }),
3031
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: item.order_id || "-" }),
3032
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: item.email || item.customer_id || "-" }),
3033
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: entitlementSource(item) }),
3034
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: entitlementSellerScope(item) }),
3035
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: snapshotString(item.source_snapshot, "title") || snapshotString(item.source_snapshot, "source") || item.product_id || "External" }),
3036
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: formatDate(item.expires_at) })
3037
+ ]
3038
+ },
3039
+ item.id
3040
+ )) })
3041
+ ] });
3042
+ }
3043
+ function CouponsPageView({
3044
+ apiBase,
3045
+ title
3046
+ }) {
3047
+ const [entitlements, setEntitlements] = (0, import_react2.useState)([]);
3048
+ const [loading, setLoading] = (0, import_react2.useState)(true);
3049
+ const [loadError, setLoadError] = (0, import_react2.useState)(null);
3050
+ const [filter, setFilter] = (0, import_react2.useState)("all");
3051
+ const load = (0, import_react2.useCallback)(async () => {
3052
+ setLoading(true);
3053
+ setLoadError(null);
3054
+ try {
3055
+ const payload = await apiFetch2(`${apiBase}/coupon-products/entitlements`);
3056
+ setEntitlements(payload.customer_coupon_entitlements || []);
3057
+ } catch (error) {
3058
+ const message = error instanceof Error ? error.message : "Failed to load coupons";
3059
+ setLoadError(message);
3060
+ import_ui3.toast.error(message);
3061
+ } finally {
3062
+ setLoading(false);
3063
+ }
3064
+ }, [apiBase]);
3065
+ (0, import_react2.useEffect)(() => {
3066
+ void load();
3067
+ }, [load]);
3068
+ const openDetail = (0, import_react2.useCallback)(
3069
+ (entitlement) => {
3070
+ window.location.assign(couponDetailPath(apiBase, entitlement.id));
3071
+ },
3072
+ [apiBase]
3073
+ );
3074
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "divide-y p-0", children: [
3075
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center justify-between px-6 py-4", children: [
3076
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Heading, { level: "h1", children: title }),
3077
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Button, { size: "small", variant: "secondary", onClick: () => void load(), children: [
3078
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_icons2.ArrowPath, {}),
3079
+ "Refresh"
3080
+ ] })
3081
+ ] }),
3082
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
3083
+ import_ui3.Tabs,
3084
+ {
3085
+ value: filter,
3086
+ onValueChange: (value) => setFilter(value),
3087
+ children: [
3088
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "px-6 py-2 border-b", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Tabs.List, { children: entitlementFilters.map((item) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Tabs.Trigger, { value: item.value, children: item.label }, item.value)) }) }),
3089
+ entitlementFilters.map((item) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Tabs.Content, { value: item.value, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
3090
+ EntitlementsTable,
3091
+ {
3092
+ loading,
3093
+ error: loadError,
3094
+ onOpen: openDetail,
3095
+ entitlements: item.value === "all" ? entitlements : entitlements.filter(
3096
+ (entitlement) => entitlement.status === item.value
3097
+ )
3098
+ }
3099
+ ) }, item.value))
3100
+ ]
3101
+ }
3102
+ )
3103
+ ] });
3104
+ }
3105
+ function CouponProductsPageView({
3106
+ apiBase,
3107
+ title,
3108
+ allowPromotionMirror = false
3109
+ }) {
3110
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
3111
+ CouponProductsPage,
3112
+ {
3113
+ apiBase,
3114
+ title,
3115
+ allowPromotionMirror
3116
+ }
3117
+ );
3118
+ }
3119
+
3120
+ // src/admin/routes/coupons/page.tsx
3121
+ var import_jsx_runtime4 = require("react/jsx-runtime");
3122
+ var config = {
3123
+ label: "Coupons",
3124
+ icon: import_icons3.ReceiptPercent
3125
+ };
3126
+ function CouponsPage() {
3127
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CouponsPageView, { apiBase: "/admin", title: "Coupons" });
3128
+ }
3129
+
3130
+ // src/admin/routes/coupons/[id]/page.tsx
3131
+ var import_jsx_runtime5 = require("react/jsx-runtime");
3132
+ function CouponDetailPage() {
3133
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CouponDetailPageView, { apiBase: "/admin" });
3134
+ }
3135
+
3136
+ // src/admin/routes/coupons/products/page.tsx
3137
+ var import_icons4 = require("@medusajs/icons");
3138
+ var import_jsx_runtime6 = require("react/jsx-runtime");
3139
+ var config2 = {
3140
+ label: "Coupon Products",
3141
+ icon: import_icons4.ReceiptPercent
3142
+ };
3143
+ function CouponProductsPage2() {
3144
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3145
+ CouponProductsPageView,
3146
+ {
3147
+ apiBase: "/admin",
3148
+ title: "Coupon Products",
3149
+ allowPromotionMirror: true
3150
+ }
3151
+ );
3152
+ }
3153
+
3154
+ // src/admin/index.ts
3155
+ var routeModule = {
3156
+ routes: [
3157
+ {
3158
+ Component: CouponsPage,
3159
+ path: "/coupons"
3160
+ },
3161
+ {
3162
+ Component: CouponProductsPage2,
3163
+ path: "/coupons/products"
3164
+ },
3165
+ {
3166
+ Component: CouponDetailPage,
3167
+ path: "/coupons/:id"
3168
+ }
3169
+ ]
3170
+ };
3171
+ var menuItemModule = {
3172
+ menuItems: [
3173
+ {
3174
+ label: config.label,
3175
+ icon: config.icon,
3176
+ path: "/coupons",
3177
+ rank: config.rank,
3178
+ nested: config.nested,
3179
+ translationNs: config.translationNs
3180
+ },
3181
+ {
3182
+ label: config2.label,
3183
+ icon: config2.icon,
3184
+ path: "/coupons/products",
3185
+ rank: 11,
3186
+ nested: "/coupons",
3187
+ translationNs: config2.translationNs
3188
+ }
3189
+ ]
3190
+ };
3191
+ var admin_default = {
3192
+ widgetModule: {
3193
+ widgets: []
3194
+ },
3195
+ routeModule,
3196
+ menuItemModule,
3197
+ formModule: {
3198
+ customFields: {}
3199
+ },
3200
+ displayModule: {
3201
+ displays: {}
3202
+ },
3203
+ i18nModule: i18n_default
3204
+ };
3205
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2FkbWluL2luZGV4LnRzIiwgIi4uLy4uLy4uLy4uL3NyYy9hZG1pbi9pMThuL2VuLmpzb24iLCAiLi4vLi4vLi4vLi4vc3JjL2FkbWluL2kxOG4vaW5kZXgudHMiLCAiLi4vLi4vLi4vLi4vc3JjL2FkbWluL3JvdXRlcy9jb3Vwb25zL3BhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9kYXNoYm9hcmQvY291cG9ucy9jb3Vwb24tbWFuYWdlci50c3giLCAiLi4vLi4vLi4vLi4vc3JjL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1wcm9kdWN0cy1wYWdlLnRzeCIsICIuLi8uLi8uLi8uLi9zcmMvZGFzaGJvYXJkL2NvdXBvbnMvZW1wdHktc3RhdGUudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9hZG1pbi9yb3V0ZXMvY291cG9ucy9baWRdL3BhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9hZG1pbi9yb3V0ZXMvY291cG9ucy9wcm9kdWN0cy9wYWdlLnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IGkxOG5SZXNvdXJjZXMgZnJvbSBcIi4vaTE4blwiXG5pbXBvcnQgQ291cG9uc1BhZ2UsIHsgY29uZmlnIGFzIGNvdXBvbnNDb25maWcgfSBmcm9tIFwiLi9yb3V0ZXMvY291cG9ucy9wYWdlXCJcbmltcG9ydCBDb3Vwb25EZXRhaWxQYWdlIGZyb20gXCIuL3JvdXRlcy9jb3Vwb25zL1tpZF0vcGFnZVwiXG5pbXBvcnQgQ291cG9uUHJvZHVjdHNQYWdlLCB7XG4gIGNvbmZpZyBhcyBjb3Vwb25Qcm9kdWN0c0NvbmZpZyxcbn0gZnJvbSBcIi4vcm91dGVzL2NvdXBvbnMvcHJvZHVjdHMvcGFnZVwiXG5cbmNvbnN0IHJvdXRlTW9kdWxlID0ge1xuICByb3V0ZXM6IFtcbiAgICB7XG4gICAgICBDb21wb25lbnQ6IENvdXBvbnNQYWdlLFxuICAgICAgcGF0aDogXCIvY291cG9uc1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgQ29tcG9uZW50OiBDb3Vwb25Qcm9kdWN0c1BhZ2UsXG4gICAgICBwYXRoOiBcIi9jb3Vwb25zL3Byb2R1Y3RzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBDb21wb25lbnQ6IENvdXBvbkRldGFpbFBhZ2UsXG4gICAgICBwYXRoOiBcIi9jb3Vwb25zLzppZFwiLFxuICAgIH0sXG4gIF0sXG59XG5cbmNvbnN0IG1lbnVJdGVtTW9kdWxlID0ge1xuICBtZW51SXRlbXM6IFtcbiAgICB7XG4gICAgICBsYWJlbDogY291cG9uc0NvbmZpZy5sYWJlbCxcbiAgICAgIGljb246IGNvdXBvbnNDb25maWcuaWNvbixcbiAgICAgIHBhdGg6IFwiL2NvdXBvbnNcIixcbiAgICAgIHJhbms6IGNvdXBvbnNDb25maWcucmFuayxcbiAgICAgIG5lc3RlZDogY291cG9uc0NvbmZpZy5uZXN0ZWQsXG4gICAgICB0cmFuc2xhdGlvbk5zOiBjb3Vwb25zQ29uZmlnLnRyYW5zbGF0aW9uTnMsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogY291cG9uUHJvZHVjdHNDb25maWcubGFiZWwsXG4gICAgICBpY29uOiBjb3Vwb25Qcm9kdWN0c0NvbmZpZy5pY29uLFxuICAgICAgcGF0aDogXCIvY291cG9ucy9wcm9kdWN0c1wiLFxuICAgICAgcmFuazogMTEsXG4gICAgICBuZXN0ZWQ6IFwiL2NvdXBvbnNcIixcbiAgICAgIHRyYW5zbGF0aW9uTnM6IGNvdXBvblByb2R1Y3RzQ29uZmlnLnRyYW5zbGF0aW9uTnMsXG4gICAgfSxcbiAgXSxcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICB3aWRnZXRNb2R1bGU6IHtcbiAgICB3aWRnZXRzOiBbXSxcbiAgfSxcbiAgcm91dGVNb2R1bGUsXG4gIG1lbnVJdGVtTW9kdWxlLFxuICBmb3JtTW9kdWxlOiB7XG4gICAgY3VzdG9tRmllbGRzOiB7fSxcbiAgfSxcbiAgZGlzcGxheU1vZHVsZToge1xuICAgIGRpc3BsYXlzOiB7fSxcbiAgfSxcbiAgaTE4bk1vZHVsZTogaTE4blJlc291cmNlcyxcbn1cbiIsICJ7XG4gIFwiY291cG9uc1wiOiB7XG4gICAgXCJtZW51XCI6IFwiQ291cG9uc1wiLFxuICAgIFwicHJvZHVjdHNNZW51XCI6IFwiQ291cG9uIFByb2R1Y3RzXCJcbiAgfVxufVxuIiwgImltcG9ydCBlbiBmcm9tIFwiLi9lbi5qc29uXCJcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbjoge1xuICAgIHRyYW5zbGF0aW9uOiBlbixcbiAgfSxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFJvdXRlQ29uZmlnIH0gZnJvbSBcIkBtZXJjdXJqcy9kYXNoYm9hcmQtc2RrXCJcbmltcG9ydCB7IFJlY2VpcHRQZXJjZW50IH0gZnJvbSBcIkBtZWR1c2Fqcy9pY29uc1wiXG5pbXBvcnQgeyBDb3Vwb25zUGFnZVZpZXcgfSBmcm9tIFwiLi4vLi4vLi4vZGFzaGJvYXJkL2NvdXBvbnMvY291cG9uLW1hbmFnZXJcIlxuXG5leHBvcnQgY29uc3QgY29uZmlnOiBSb3V0ZUNvbmZpZyA9IHtcbiAgbGFiZWw6IFwiQ291cG9uc1wiLFxuICBpY29uOiBSZWNlaXB0UGVyY2VudCxcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ291cG9uc1BhZ2UoKSB7XG4gIHJldHVybiA8Q291cG9uc1BhZ2VWaWV3IGFwaUJhc2U9XCIvYWRtaW5cIiB0aXRsZT1cIkNvdXBvbnNcIiAvPlxufVxuIiwgImltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVN0YXRlLFxuICB0eXBlIENoYW5nZUV2ZW50LFxuICB0eXBlIENTU1Byb3BlcnRpZXMsXG4gIHR5cGUgUmVhY3ROb2RlLFxufSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtcbiAgQXJyb3dQYXRoLFxuICBQZW5jaWxTcXVhcmUsXG4gIFBsdXMsXG4gIFNob3BwaW5nQ2FydCxcbiAgVHJhc2gsXG4gIFRyaWFuZ2xlUmlnaHRNaW5pLFxufSBmcm9tIFwiQG1lZHVzYWpzL2ljb25zXCJcbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgQ29udGFpbmVyLFxuICBDb3B5LFxuICBDdXJyZW5jeUlucHV0LFxuICBGb2N1c01vZGFsLFxuICBIZWFkaW5nLFxuICBJbnB1dCxcbiAgTGFiZWwsXG4gIFByb2dyZXNzVGFicyxcbiAgU2VsZWN0LFxuICBTdGF0dXNCYWRnZSxcbiAgU3dpdGNoLFxuICBUYWJsZSxcbiAgVGFicyxcbiAgVGV4dCxcbiAgVGV4dGFyZWEsXG4gIHRvYXN0LFxuICB1c2VQcm9tcHQsXG59IGZyb20gXCJAbWVkdXNhanMvdWlcIlxuaW1wb3J0IHsgQ291cG9uUHJvZHVjdHNQYWdlIH0gZnJvbSBcIi4vY291cG9uLXByb2R1Y3RzLXBhZ2VcIlxuaW1wb3J0IHsgQ291cG9uRW1wdHlTdGF0ZSB9IGZyb20gXCIuL2VtcHR5LXN0YXRlXCJcblxuZGVjbGFyZSBjb25zdCBfX0JBQ0tFTkRfVVJMX186IHN0cmluZ1xuXG50eXBlIEFwaUJhc2UgPSBcIi9hZG1pblwiIHwgXCIvdmVuZG9yXCJcbnR5cGUgQmVuZWZpdFR5cGUgPSBcImZpeGVkX2Ftb3VudFwiIHwgXCJwZXJjZW50YWdlXCIgfCBcImZyZWVfc2hpcHBpbmdcIiB8IFwiYnV5X2dldFwiXG50eXBlIENvZGVTdHJhdGVneSA9IFwidW5pcXVlX2NvZGVcIiB8IFwic2hhcmVkX2NvZGVcIlxudHlwZSBNaXJyb3JNb2RlID0gXCJub25lXCIgfCBcIm1hbnVhbFwiIHwgXCJhdXRvXCJcbnR5cGUgUHJvbW90aW9uU3RhdHVzID0gXCJkcmFmdFwiIHwgXCJhY3RpdmVcIiB8IFwiaW5hY3RpdmVcIlxudHlwZSBDYW1wYWlnbk1vZGUgPSBcIm5vbmVcIiB8IFwiZXhpc3RpbmdcIiB8IFwibmV3XCJcbnR5cGUgRXhwaXJhdGlvblBvbGljeVR5cGUgPSBcImR1cmF0aW9uXCIgfCBcImZpeGVkXCJcbnR5cGUgV2l6YXJkU3RlcCA9IFwiZGV0YWlsc1wiIHwgXCJvcmdhbml6ZVwiIHwgXCJ2YXJpYW50c1wiIHwgXCJjb3Vwb25cIiB8IFwiY2FtcGFpZ25cIlxuXG50eXBlIENvdXBvblByb2R1Y3RDb25maWcgPSB7XG4gIGlkOiBzdHJpbmdcbiAgZW5hYmxlZDogYm9vbGVhblxuICBwcm9kdWN0X2lkOiBzdHJpbmdcbiAgYmVuZWZpdF90eXBlOiBCZW5lZml0VHlwZVxuICBhbW91bnQ6IG51bWJlciB8IG51bGxcbiAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbFxuICBjdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIGNvZGVfc3RyYXRlZ3k6IENvZGVTdHJhdGVneVxuICBjb2RlX3ByZWZpeDogc3RyaW5nIHwgbnVsbFxuICBzaGFyZWRfY29kZTogc3RyaW5nIHwgbnVsbFxuICBleHBpcmF0aW9uX3BvbGljeTpcbiAgICB8IHtcbiAgICAgICAgdHlwZTogXCJkdXJhdGlvblwiXG4gICAgICAgIGR1cmF0aW9uX2RheXM6IG51bWJlclxuICAgICAgICBjYXBfYnlfY2FtcGFpZ24/OiBib29sZWFuXG4gICAgICAgIGNhcF9hdD86IHN0cmluZyB8IG51bGxcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogXCJmaXhlZFwiXG4gICAgICAgIGV4cGlyZXNfYXQ6IHN0cmluZ1xuICAgICAgICBjYXBfYnlfY2FtcGFpZ24/OiBib29sZWFuXG4gICAgICAgIGNhcF9hdD86IHN0cmluZyB8IG51bGxcbiAgICAgIH1cbiAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBudW1iZXJcbiAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBNaXJyb3JNb2RlXG4gIHByb21vdGlvbl9zdGF0dXM/OiBQcm9tb3Rpb25TdGF0dXMgfCBudWxsXG4gIGNhbXBhaWduX21vZGU/OiBDYW1wYWlnbk1vZGUgfCBudWxsXG4gIGNhbXBhaWduX2lkPzogc3RyaW5nIHwgbnVsbFxuICBjYW1wYWlnbl9zbmFwc2hvdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICBjb25maWdfdmVyc2lvbjogbnVtYmVyXG59XG5cbnR5cGUgQ291cG9uVmFyaWFudENvbmZpZyA9IFBhcnRpYWw8Q291cG9uUHJvZHVjdENvbmZpZz4gJiB7XG4gIGlkOiBzdHJpbmdcbiAgcHJvZHVjdF9jb25maWdfaWQ6IHN0cmluZ1xuICB2YXJpYW50X2lkOiBzdHJpbmdcbn1cblxudHlwZSBQcm9kdWN0VmFyaWFudCA9IHtcbiAgaWQ6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nIHwgbnVsbFxuICBza3U/OiBzdHJpbmcgfCBudWxsXG4gIHByaWNlcz86IHsgY3VycmVuY3lfY29kZT86IHN0cmluZzsgYW1vdW50PzogbnVtYmVyIH1bXVxufVxuXG50eXBlIFByb2R1Y3RSZWNvcmQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZyB8IG51bGxcbiAgc3VidGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIGhhbmRsZTogc3RyaW5nIHwgbnVsbFxuICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGxcbiAgc3RhdHVzOiBzdHJpbmcgfCBudWxsXG4gIHRodW1ibmFpbDogc3RyaW5nIHwgbnVsbFxuICBkaXNjb3VudGFibGU/OiBib29sZWFuXG4gIHR5cGVfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIGNvbGxlY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsXG4gIHNoaXBwaW5nX3Byb2ZpbGVfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIHZhcmlhbnRzPzogUHJvZHVjdFZhcmlhbnRbXVxuICBjYXRlZ29yaWVzPzogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9W11cbiAgdGFncz86IHsgaWQ6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfCBudWxsIH1bXVxuICBzYWxlc19jaGFubmVscz86IHsgaWQ6IHN0cmluZzsgbmFtZT86IHN0cmluZyB8IG51bGwgfVtdXG59XG5cbnR5cGUgQ291cG9uUHJvZHVjdFJvdyA9IHtcbiAgaWQ6IHN0cmluZ1xuICBwcm9kdWN0OiBQcm9kdWN0UmVjb3JkXG4gIGNvdXBvbl9wcm9kdWN0X2NvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZ1xuICBjb3Vwb25fcHJvZHVjdF92YXJpYW50X2NvbmZpZ3M6IENvdXBvblZhcmlhbnRDb25maWdbXVxuICBlbnRpdGxlbWVudHNfY291bnQ6IG51bWJlclxufVxuXG50eXBlIENvdXBvbkVudGl0bGVtZW50ID0ge1xuICBpZDogc3RyaW5nXG4gIG9yaWdpbj86IFwicHVyY2hhc2VcIiB8IFwiZXh0ZXJuYWxcIlxuICBjdXN0b21lcl9pZDogc3RyaW5nIHwgbnVsbFxuICBlbWFpbDogc3RyaW5nIHwgbnVsbFxuICBjb2RlOiBzdHJpbmcgfCBudWxsXG4gIHNoYXJlZF9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIHN0YXR1czogc3RyaW5nXG4gIHByb2R1Y3RfaWQ6IHN0cmluZyB8IG51bGxcbiAgdmFyaWFudF9pZDogc3RyaW5nIHwgbnVsbFxuICBvcmRlcl9pZDogc3RyaW5nIHwgbnVsbFxuICBsaW5lX2l0ZW1faWQ6IHN0cmluZyB8IG51bGxcbiAgaXNzdWFuY2VfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIGNvbmZpZ19pZD86IHN0cmluZyB8IG51bGxcbiAgdmFyaWFudF9jb25maWdfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIGV4cGlyZXNfYXQ6IHN0cmluZyB8IG51bGxcbiAgcmVkZWVtZWRfYXQ6IHN0cmluZyB8IG51bGxcbiAgY3JlYXRlZF9hdD86IHN0cmluZ1xuICBiZW5lZml0X3NuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIHNvdXJjZV9zbmFwc2hvdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICBleHRlcm5hbF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIHNlbGxlcl90YXJnZXRzPzogQXJyYXk8e1xuICAgIHNlbGxlcl9pZDogc3RyaW5nXG4gICAgc2VsbGVyX21lbWJlcl9pZD86IHN0cmluZyB8IG51bGxcbiAgfT5cbn1cblxudHlwZSBDb3Vwb25Jc3N1YW5jZVJlY29yZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICBzdGF0dXM/OiBzdHJpbmcgfCBudWxsXG4gIHF1YW50aXR5PzogbnVtYmVyIHwgbnVsbFxuICBjb25maWdfc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgaXNzdWVkX2NvdW50PzogbnVtYmVyIHwgbnVsbFxuICBmYWlsZWRfY291bnQ/OiBudW1iZXIgfCBudWxsXG4gIGNyZWF0ZWRfYXQ/OiBzdHJpbmdcbiAgdXBkYXRlZF9hdD86IHN0cmluZ1xufVxuXG50eXBlIENvdXBvbk9yZGVyU3VtbWFyeSA9IHtcbiAgaWQ6IHN0cmluZ1xuICBkaXNwbGF5X2lkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsXG4gIGN1c3RvbWVyX2lkOiBzdHJpbmcgfCBudWxsXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGxcbiAgdG90YWw6IG51bWJlciB8IG51bGxcbiAgY3JlYXRlZF9hdDogc3RyaW5nIHwgbnVsbFxufVxuXG50eXBlIENvdXBvbkVudGl0bGVtZW50RGV0YWlsID0ge1xuICBjdXN0b21lcl9jb3Vwb25fZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50XG4gIGNvdXBvbl9pc3N1YW5jZT86IENvdXBvbklzc3VhbmNlUmVjb3JkIHwgbnVsbFxuICBvcmRlcj86IENvdXBvbk9yZGVyU3VtbWFyeSB8IG51bGxcbn1cblxudHlwZSBPcHRpb25SZWNvcmQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZyB8IG51bGxcbiAgdGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIHZhbHVlPzogc3RyaW5nIHwgbnVsbFxuICBoYW5kbGU/OiBzdHJpbmcgfCBudWxsXG4gIGNhbXBhaWduX2lkZW50aWZpZXI/OiBzdHJpbmcgfCBudWxsXG59XG5cbnR5cGUgQ3VycmVuY3lPcHRpb24gPSB7XG4gIGNvZGU6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgc3ltYm9sOiBzdHJpbmdcbiAgc3ltYm9sX25hdGl2ZTogc3RyaW5nXG4gIGlzX2RlZmF1bHQ6IGJvb2xlYW5cbn1cblxudHlwZSBPcHRpb25zUGF5bG9hZCA9IHtcbiAgY3VycmVuY2llcz86IEN1cnJlbmN5T3B0aW9uW11cbiAgcHJvZHVjdF90eXBlcz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfY29sbGVjdGlvbnM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X2NhdGVnb3JpZXM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X3RhZ3M/OiBPcHRpb25SZWNvcmRbXVxuICBzYWxlc19jaGFubmVscz86IE9wdGlvblJlY29yZFtdXG4gIHNoaXBwaW5nX3Byb2ZpbGVzPzogT3B0aW9uUmVjb3JkW11cbiAgY2FtcGFpZ25zPzogT3B0aW9uUmVjb3JkW11cbiAgc2VsbGVycz86IE9wdGlvblJlY29yZFtdXG59XG5cbnR5cGUgUHJvZHVjdEZvcm1TdGF0ZSA9IHtcbiAgaWQ6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIHN1YnRpdGxlOiBzdHJpbmdcbiAgaGFuZGxlOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICB0aHVtYm5haWw6IHN0cmluZ1xuICBzdGF0dXM6IHN0cmluZ1xuICBkaXNjb3VudGFibGU6IGJvb2xlYW5cbiAgc2VsbGVyX2lkOiBzdHJpbmdcbiAgdHlwZV9pZDogc3RyaW5nXG4gIGNvbGxlY3Rpb25faWQ6IHN0cmluZ1xuICBjYXRlZ29yeV9pZDogc3RyaW5nXG4gIHRhZ19pZDogc3RyaW5nXG4gIHNhbGVzX2NoYW5uZWxfaWQ6IHN0cmluZ1xuICB2YXJpYW50czogVmFyaWFudEZvcm1TdGF0ZVtdXG59XG5cbnR5cGUgVmFyaWFudEZvcm1TdGF0ZSA9IHtcbiAgaWQ/OiBzdHJpbmdcbiAgb3ZlcnJpZGVfY29uZmlnX2lkPzogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbiAgc2t1OiBzdHJpbmdcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nXG4gIGFtb3VudDogc3RyaW5nXG4gIG92ZXJyaWRlX2VuYWJsZWQ6IGJvb2xlYW5cbiAgb3ZlcnJpZGVfYmVuZWZpdF90eXBlOiBCZW5lZml0VHlwZVxuICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlOiBzdHJpbmdcbiAgb3ZlcnJpZGVfYW1vdW50OiBzdHJpbmdcbiAgb3ZlcnJpZGVfcGVyY2VudGFnZTogc3RyaW5nXG59XG5cbnR5cGUgQ291cG9uRm9ybVN0YXRlID0ge1xuICBlbmFibGVkOiBib29sZWFuXG4gIGJlbmVmaXRfdHlwZTogQmVuZWZpdFR5cGVcbiAgYW1vdW50OiBzdHJpbmdcbiAgcGVyY2VudGFnZTogc3RyaW5nXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZ1xuICBjb2RlX3N0cmF0ZWd5OiBDb2RlU3RyYXRlZ3lcbiAgY29kZV9wcmVmaXg6IHN0cmluZ1xuICBzaGFyZWRfY29kZTogc3RyaW5nXG4gIGV4cGlyYXRpb25fdHlwZTogRXhwaXJhdGlvblBvbGljeVR5cGVcbiAgZXhwaXJhdGlvbl9kYXlzOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl9kYXRlOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IGJvb2xlYW5cbiAgZXhwaXJhdGlvbl9jYXBfYXQ6IHN0cmluZ1xuICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IHN0cmluZ1xuICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IE1pcnJvck1vZGVcbiAgcHJvbW90aW9uX3N0YXR1czogUHJvbW90aW9uU3RhdHVzXG59XG5cbnR5cGUgQ2FtcGFpZ25Gb3JtU3RhdGUgPSB7XG4gIG1vZGU6IENhbXBhaWduTW9kZVxuICBjYW1wYWlnbl9pZDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBjYW1wYWlnbl9pZGVudGlmaWVyOiBzdHJpbmdcbiAgc3RhcnRzX2F0OiBzdHJpbmdcbiAgZW5kc19hdDogc3RyaW5nXG59XG5cbmNvbnN0IE5PTkUgPSBcIl9fbm9uZV9fXCJcbmNvbnN0IHN0ZXBzOiBXaXphcmRTdGVwW10gPSBbXG4gIFwiZGV0YWlsc1wiLFxuICBcIm9yZ2FuaXplXCIsXG4gIFwidmFyaWFudHNcIixcbiAgXCJjb3Vwb25cIixcbiAgXCJjYW1wYWlnblwiLFxuXVxuXG5jb25zdCBlbXB0eVZhcmlhbnQ6IFZhcmlhbnRGb3JtU3RhdGUgPSB7XG4gIHRpdGxlOiBcIkRlZmF1bHQgdmFyaWFudFwiLFxuICBza3U6IFwiXCIsXG4gIGN1cnJlbmN5X2NvZGU6IFwiXCIsXG4gIGFtb3VudDogXCJcIixcbiAgb3ZlcnJpZGVfZW5hYmxlZDogZmFsc2UsXG4gIG92ZXJyaWRlX2JlbmVmaXRfdHlwZTogXCJmaXhlZF9hbW91bnRcIixcbiAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZTogXCJcIixcbiAgb3ZlcnJpZGVfYW1vdW50OiBcIlwiLFxuICBvdmVycmlkZV9wZXJjZW50YWdlOiBcIlwiLFxufVxuXG5jb25zdCBlbXB0eVByb2R1Y3Q6IFByb2R1Y3RGb3JtU3RhdGUgPSB7XG4gIGlkOiBcIlwiLFxuICB0aXRsZTogXCJcIixcbiAgc3VidGl0bGU6IFwiXCIsXG4gIGhhbmRsZTogXCJcIixcbiAgZGVzY3JpcHRpb246IFwiXCIsXG4gIHRodW1ibmFpbDogXCJcIixcbiAgc3RhdHVzOiBcImRyYWZ0XCIsXG4gIGRpc2NvdW50YWJsZTogZmFsc2UsXG4gIHNlbGxlcl9pZDogXCJcIixcbiAgdHlwZV9pZDogXCJcIixcbiAgY29sbGVjdGlvbl9pZDogXCJcIixcbiAgY2F0ZWdvcnlfaWQ6IFwiXCIsXG4gIHRhZ19pZDogXCJcIixcbiAgc2FsZXNfY2hhbm5lbF9pZDogXCJcIixcbiAgdmFyaWFudHM6IFtlbXB0eVZhcmlhbnRdLFxufVxuXG5jb25zdCBlbXB0eUNvdXBvbjogQ291cG9uRm9ybVN0YXRlID0ge1xuICBlbmFibGVkOiB0cnVlLFxuICBiZW5lZml0X3R5cGU6IFwiZml4ZWRfYW1vdW50XCIsXG4gIGFtb3VudDogXCJcIixcbiAgcGVyY2VudGFnZTogXCJcIixcbiAgY3VycmVuY3lfY29kZTogXCJcIixcbiAgY29kZV9zdHJhdGVneTogXCJ1bmlxdWVfY29kZVwiLFxuICBjb2RlX3ByZWZpeDogXCJDT1VQT05cIixcbiAgc2hhcmVkX2NvZGU6IFwiXCIsXG4gIGV4cGlyYXRpb25fdHlwZTogXCJkdXJhdGlvblwiLFxuICBleHBpcmF0aW9uX2RheXM6IFwiMzBcIixcbiAgZXhwaXJhdGlvbl9kYXRlOiBcIlwiLFxuICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogdHJ1ZSxcbiAgZXhwaXJhdGlvbl9jYXBfYXQ6IFwiXCIsXG4gIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogXCIxXCIsXG4gIHByb21vdGlvbl9taXJyb3JfbW9kZTogXCJub25lXCIsXG4gIHByb21vdGlvbl9zdGF0dXM6IFwiZHJhZnRcIixcbn1cblxuY29uc3QgZW1wdHlDYW1wYWlnbjogQ2FtcGFpZ25Gb3JtU3RhdGUgPSB7XG4gIG1vZGU6IFwibm9uZVwiLFxuICBjYW1wYWlnbl9pZDogXCJcIixcbiAgbmFtZTogXCJcIixcbiAgY2FtcGFpZ25faWRlbnRpZmllcjogXCJcIixcbiAgc3RhcnRzX2F0OiBcIlwiLFxuICBlbmRzX2F0OiBcIlwiLFxufVxuXG5jb25zdCBtb2RhbENvbnRlbnRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIGhlaWdodDogXCIxMDAlXCIsXG4gIG92ZXJmbG93OiBcImhpZGRlblwiLFxufVxuXG5jb25zdCBtb2RhbFN0YXRpY1Jvd1N0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBmbGV4U2hyaW5rOiAwLFxufVxuXG5jb25zdCBtb2RhbFdpemFyZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleDogXCIxIDEgYXV0b1wiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBtaW5IZWlnaHQ6IDAsXG59XG5cbmNvbnN0IG1vZGFsQm9keVN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBmbGV4OiBcIjEgMSBhdXRvXCIsXG4gIG1pbkhlaWdodDogMCxcbiAgb3ZlcmZsb3dZOiBcImF1dG9cIixcbiAgcGFkZGluZzogXCIzMnB4IDI0cHhcIixcbn1cblxuY29uc3QgbW9kYWxGb3JtU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIG1hcmdpbjogXCIwIGF1dG9cIixcbiAgbWF4V2lkdGg6IDkyMCxcbiAgd2lkdGg6IFwibWluKDkyMHB4LCAxMDAlKVwiLFxufVxuXG5jb25zdCBzdGFja1N0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgZ2FwOiAxNixcbn1cblxuY29uc3QgdHdvQ29sdW1uR3JpZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImdyaWRcIixcbiAgZ2FwOiAxNixcbiAgZ3JpZFRlbXBsYXRlQ29sdW1uczogXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNjBweCwgMWZyKSlcIixcbn1cblxuY29uc3QgdGhyZWVDb2x1bW5HcmlkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICBnYXA6IDE2LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIyMHB4LCAxZnIpKVwiLFxufVxuXG5jb25zdCBmb3VyQ29sdW1uR3JpZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImdyaWRcIixcbiAgZ2FwOiAxNixcbiAgZ3JpZFRlbXBsYXRlQ29sdW1uczogXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heCgxNjBweCwgMWZyKSlcIixcbn1cblxuY29uc3QgcGFuZWxTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgYm9yZGVyOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgYm9yZGVyUmFkaXVzOiA4LFxuICBwYWRkaW5nOiAxNixcbn1cblxuY29uc3Qgcm93QmV0d2VlblN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZ2FwOiAxNixcbiAganVzdGlmeUNvbnRlbnQ6IFwic3BhY2UtYmV0d2VlblwiLFxufVxuXG5mdW5jdGlvbiBiYWNrZW5kVXJsKCkge1xuICByZXR1cm4gdHlwZW9mIF9fQkFDS0VORF9VUkxfXyA9PT0gXCJzdHJpbmdcIlxuICAgID8gX19CQUNLRU5EX1VSTF9fLnJlcGxhY2UoL1xcLyQvLCBcIlwiKVxuICAgIDogXCJcIlxufVxuXG5mdW5jdGlvbiBhcGlFcnJvck1lc3NhZ2UocGF5bG9hZDogYW55LCBmYWxsYmFjazogc3RyaW5nKSB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXG4gICAgcGF5bG9hZD8ubWVzc2FnZSxcbiAgICBwYXlsb2FkPy5lcnJvcj8ubWVzc2FnZSxcbiAgICBwYXlsb2FkPy5lcnJvcixcbiAgICBwYXlsb2FkPy5lcnJvcnM/LlswXT8ubWVzc2FnZSxcbiAgXVxuICBjb25zdCBtZXNzYWdlID0gY2FuZGlkYXRlcy5maW5kKFxuICAgIChjYW5kaWRhdGUpID0+IHR5cGVvZiBjYW5kaWRhdGUgPT09IFwic3RyaW5nXCIgJiYgY2FuZGlkYXRlLnRyaW0oKSxcbiAgKVxuXG4gIHJldHVybiBtZXNzYWdlIHx8IGZhbGxiYWNrIHx8IFwiUmVxdWVzdCBmYWlsZWRcIlxufVxuXG5hc3luYyBmdW5jdGlvbiBhcGlGZXRjaDxUPihcbiAgcGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9LFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFja2VuZFVybCgpfSR7cGF0aH1gLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgaGVhZGVyczoge1xuICAgICAgLi4uKG9wdGlvbnMuYm9keSA/IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSA6IHt9KSxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9LFxuICB9KVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGFwaUVycm9yTWVzc2FnZShwYXlsb2FkLCByZXNwb25zZS5zdGF0dXNUZXh0KSlcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKClcbn1cblxuZnVuY3Rpb24gbnVtYmVyT3JOdWxsKHZhbHVlOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKVxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgcGFyc2VkID4gMCA/IHBhcnNlZCA6IG51bGxcbn1cblxuZnVuY3Rpb24gb3B0aW9uTGFiZWwob3B0aW9uOiBPcHRpb25SZWNvcmQpIHtcbiAgcmV0dXJuIChcbiAgICBvcHRpb24ubmFtZSB8fCBvcHRpb24udGl0bGUgfHwgb3B0aW9uLnZhbHVlIHx8IG9wdGlvbi5oYW5kbGUgfHwgb3B0aW9uLmlkXG4gIClcbn1cblxuZnVuY3Rpb24gYmVuZWZpdExhYmVsKFxuICBjb25maWc6IFBpY2s8XG4gICAgQ291cG9uUHJvZHVjdENvbmZpZyxcbiAgICBcImJlbmVmaXRfdHlwZVwiIHwgXCJhbW91bnRcIiB8IFwicGVyY2VudGFnZVwiIHwgXCJjdXJyZW5jeV9jb2RlXCJcbiAgPixcbikge1xuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIikge1xuICAgIHJldHVybiBgJHtjb25maWcuYW1vdW50IHx8IDB9ICR7KGNvbmZpZy5jdXJyZW5jeV9jb2RlIHx8IFwiXCIpLnRvVXBwZXJDYXNlKCl9YFxuICB9XG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIikge1xuICAgIHJldHVybiBgJHtjb25maWcucGVyY2VudGFnZSB8fCAwfSVgXG4gIH1cbiAgaWYgKGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZnJlZV9zaGlwcGluZ1wiKSB7XG4gICAgcmV0dXJuIFwiRnJlZSBzaGlwcGluZ1wiXG4gIH1cbiAgcmV0dXJuIFwiQnV5IGdldFwiXG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGUodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIi1cIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCItXCJcbiAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKClcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWUodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIi1cIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCItXCJcbiAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBmb3JtYXRGdWxsRGF0ZSh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiLVwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIi1cIlxuICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHtcbiAgICBkYXk6IFwibnVtZXJpY1wiLFxuICAgIGhvdXI6IFwibnVtZXJpY1wiLFxuICAgIG1pbnV0ZTogXCIyLWRpZ2l0XCIsXG4gICAgbW9udGg6IFwic2hvcnRcIixcbiAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgfSlcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVsYXRpdmVEYXRlKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCItXCJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIFwiLVwiXG5cbiAgY29uc3QgZGlmZlNlY29uZHMgPSBNYXRoLnJvdW5kKChkYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMClcbiAgY29uc3QgYWJzU2Vjb25kcyA9IE1hdGguYWJzKGRpZmZTZWNvbmRzKVxuICBjb25zdCB1bml0czogQXJyYXk8W0ludGwuUmVsYXRpdmVUaW1lRm9ybWF0VW5pdCwgbnVtYmVyXT4gPSBbXG4gICAgW1wieWVhclwiLCA2MCAqIDYwICogMjQgKiAzNjVdLFxuICAgIFtcIm1vbnRoXCIsIDYwICogNjAgKiAyNCAqIDMwXSxcbiAgICBbXCJ3ZWVrXCIsIDYwICogNjAgKiAyNCAqIDddLFxuICAgIFtcImRheVwiLCA2MCAqIDYwICogMjRdLFxuICAgIFtcImhvdXJcIiwgNjAgKiA2MF0sXG4gICAgW1wibWludXRlXCIsIDYwXSxcbiAgXVxuICBjb25zdCBbdW5pdCwgc2Vjb25kc10gPVxuICAgIHVuaXRzLmZpbmQoKFssIHNlY29uZHNQZXJVbml0XSkgPT4gYWJzU2Vjb25kcyA+PSBzZWNvbmRzUGVyVW5pdCkgfHwgW11cblxuICBpZiAoIXVuaXQgfHwgIXNlY29uZHMpIHtcbiAgICByZXR1cm4gXCJqdXN0IG5vd1wiXG4gIH1cblxuICByZXR1cm4gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KHVuZGVmaW5lZCwgeyBudW1lcmljOiBcImF1dG9cIiB9KS5mb3JtYXQoXG4gICAgTWF0aC5yb3VuZChkaWZmU2Vjb25kcyAvIHNlY29uZHMpLFxuICAgIHVuaXQsXG4gIClcbn1cblxuZnVuY3Rpb24gZm9ybWF0U25hcHNob3RBbW91bnQoYW1vdW50OiBudW1iZXIgfCBudWxsLCBjdXJyZW5jeT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKGFtb3VudCA9PSBudWxsKSByZXR1cm4gXCItXCJcbiAgY29uc3QgY29kZSA9IGN1cnJlbmN5ID8gY3VycmVuY3kudG9VcHBlckNhc2UoKSA6IFwiXCJcbiAgcmV0dXJuIFtjb2RlLCBhbW91bnQudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KV1cbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oXCIgXCIpXG59XG5cbmZ1bmN0aW9uIHRvRGF0ZVRpbWVMb2NhbCh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIFwiXCJcbiAgY29uc3QgbG9jYWxEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MF8wMDApXG4gIHJldHVybiBsb2NhbERhdGUudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxNilcbn1cblxuZnVuY3Rpb24gZW50aXRsZW1lbnRTdGF0dXNDb2xvcihzdGF0dXM6IHN0cmluZykge1xuICBpZiAoc3RhdHVzID09PSBcImlzc3VlZFwiKSByZXR1cm4gXCJncmVlblwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwicmVkZWVtZWRcIikgcmV0dXJuIFwiYmx1ZVwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwiZXhwaXJlZFwiIHx8IHN0YXR1cyA9PT0gXCJjYW5jZWxlZFwiKSByZXR1cm4gXCJncmV5XCIgYXMgY29uc3RcbiAgcmV0dXJuIFwib3JhbmdlXCIgYXMgY29uc3Rcbn1cblxuZnVuY3Rpb24gcHJvZHVjdFN0YXR1c0NvbG9yKHN0YXR1cz86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKHN0YXR1cyA9PT0gXCJwdWJsaXNoZWRcIikgcmV0dXJuIFwiZ3JlZW5cIiBhcyBjb25zdFxuICBpZiAoc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHJldHVybiBcInJlZFwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwicHJvcG9zZWRcIikgcmV0dXJuIFwib3JhbmdlXCIgYXMgY29uc3RcbiAgcmV0dXJuIFwiZ3JleVwiIGFzIGNvbnN0XG59XG5cbmZ1bmN0aW9uIHNuYXBzaG90U3RyaW5nKFxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbikge1xuICBjb25zdCB2YWx1ZSA9IHNuYXBzaG90Py5ba2V5XVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSkgcmV0dXJuIHZhbHVlXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiBTdHJpbmcodmFsdWUpXG4gIHJldHVybiBcIlwiXG59XG5cbmZ1bmN0aW9uIHNuYXBzaG90TnVtYmVyKFxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbikge1xuICBjb25zdCB2YWx1ZSA9IHNuYXBzaG90Py5ba2V5XVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IG51bGxcbn1cblxuZnVuY3Rpb24ganNvbkJsb2NrKHZhbHVlOiB1bmtub3duKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gXCJ7fVwiXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMilcbn1cblxuZnVuY3Rpb24gY291cG9uQ29kZShlbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnQpIHtcbiAgcmV0dXJuIGVudGl0bGVtZW50LmNvZGUgfHwgZW50aXRsZW1lbnQuc2hhcmVkX2NvZGUgfHwgXCItXCJcbn1cblxuZnVuY3Rpb24gZW50aXRsZW1lbnRTb3VyY2UoZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50KSB7XG4gIGlmIChlbnRpdGxlbWVudC5vcmlnaW4gPT09IFwiZXh0ZXJuYWxcIikgcmV0dXJuIFwiRXh0ZXJuYWxcIlxuICByZXR1cm4gXCJQdXJjaGFzZVwiXG59XG5cbmZ1bmN0aW9uIGVudGl0bGVtZW50U2VsbGVyU2NvcGUoZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50KSB7XG4gIGNvbnN0IGNvdW50ID0gZW50aXRsZW1lbnQuc2VsbGVyX3RhcmdldHM/Lmxlbmd0aCB8fCAwXG4gIGlmIChlbnRpdGxlbWVudC5vcmlnaW4gIT09IFwiZXh0ZXJuYWxcIikge1xuICAgIGlmICghY291bnQpIHJldHVybiBcIlByb2R1Y3Qgc2VsbGVyXCJcbiAgICByZXR1cm4gYFByb2R1Y3Qgc2VsbGVyICsgJHtjb3VudH0gbGlua2VkYFxuICB9XG4gIGlmICghY291bnQpIHJldHVybiBcIkFkbWluIG9ubHlcIlxuICByZXR1cm4gY291bnQgPT09IDEgPyBcIjEgbGlua2VkIHNlbGxlclwiIDogYCR7Y291bnR9IGxpbmtlZCBzZWxsZXJzYFxufVxuXG5mdW5jdGlvbiBvcmRlckRpc3BsYXlJZChvcmRlcjogQ291cG9uT3JkZXJTdW1tYXJ5IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICBpZiAoIW9yZGVyKSByZXR1cm4gXCItXCJcbiAgcmV0dXJuIG9yZGVyLmRpc3BsYXlfaWQgPT0gbnVsbCA/IG9yZGVyLmlkIDogYCMke29yZGVyLmRpc3BsYXlfaWR9YFxufVxuXG5mdW5jdGlvbiBkYXNoYm9hcmRCYXNlUGF0aChhcGlCYXNlOiBBcGlCYXNlKSB7XG4gIHJldHVybiBhcGlCYXNlID09PSBcIi92ZW5kb3JcIiA/IFwiL3NlbGxlclwiIDogXCIvZGFzaGJvYXJkXCJcbn1cblxuZnVuY3Rpb24gY291cG9uRGV0YWlsUGF0aChhcGlCYXNlOiBBcGlCYXNlLCBlbnRpdGxlbWVudElkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGAke2Rhc2hib2FyZEJhc2VQYXRoKGFwaUJhc2UpfS9jb3Vwb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgIGVudGl0bGVtZW50SWQsXG4gICl9YFxufVxuXG5mdW5jdGlvbiBvcmRlckRldGFpbFBhdGgoYXBpQmFzZTogQXBpQmFzZSwgb3JkZXJJZDogc3RyaW5nKSB7XG4gIHJldHVybiBgJHtkYXNoYm9hcmRCYXNlUGF0aChhcGlCYXNlKX0vb3JkZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZGVySWQpfWBcbn1cblxuZnVuY3Rpb24gY3VycmVudENvdXBvbkRldGFpbElkKGFwaUJhc2U6IEFwaUJhc2UpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gYCR7ZGFzaGJvYXJkQmFzZVBhdGgoYXBpQmFzZSl9L2NvdXBvbnMvYFxuICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lXG4gIGNvbnN0IGluZGV4ID0gcGF0aC5pbmRleE9mKHByZWZpeClcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBpZCA9IHBhdGguc2xpY2UoaW5kZXggKyBwcmVmaXgubGVuZ3RoKS5zcGxpdChcIi9cIilbMF1cbiAgaWYgKCFpZCB8fCBpZCA9PT0gXCJwcm9kdWN0c1wiKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpZClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGlkXG4gIH1cbn1cblxuZnVuY3Rpb24gYmVuZWZpdFNuYXBzaG90TGFiZWwoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgdHlwZSA9IHNuYXBzaG90U3RyaW5nKHNuYXBzaG90LCBcImJlbmVmaXRfdHlwZVwiKVxuICBpZiAodHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIikge1xuICAgIGNvbnN0IGFtb3VudHMgPSBBcnJheS5pc0FycmF5KHNuYXBzaG90Py5hbW91bnRzKVxuICAgICAgPyAoc25hcHNob3QuYW1vdW50cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pXG4gICAgICA6IFtdXG4gICAgaWYgKGFtb3VudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYW1vdW50c1xuICAgICAgICAubWFwKChyb3cpID0+IHtcbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBzbmFwc2hvdE51bWJlcihyb3csIFwiYW1vdW50XCIpXG4gICAgICAgICAgY29uc3QgY3VycmVuY3kgPSBzbmFwc2hvdFN0cmluZyhyb3csIFwiY3VycmVuY3lfY29kZVwiKS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgcmV0dXJuIGAke2Ftb3VudCA/PyAwfSAke2N1cnJlbmN5fWAudHJpbSgpXG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiLCBcIilcbiAgICB9XG5cbiAgICBjb25zdCBhbW91bnQgPSBzbmFwc2hvdE51bWJlcihzbmFwc2hvdCwgXCJhbW91bnRcIilcbiAgICBjb25zdCBjdXJyZW5jeSA9IHNuYXBzaG90U3RyaW5nKHNuYXBzaG90LCBcImN1cnJlbmN5X2NvZGVcIikudG9VcHBlckNhc2UoKVxuICAgIHJldHVybiBgJHthbW91bnQgPz8gMH0gJHtjdXJyZW5jeX1gLnRyaW0oKVxuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwicGVyY2VudGFnZVwiKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBzbmFwc2hvdD8ucHJvbW90aW9uX3RlbXBsYXRlIGFzXG4gICAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICB8IG51bGxcbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgY29uc3QgbWV0aG9kID0gdGVtcGxhdGU/LmFwcGxpY2F0aW9uX21ldGhvZCBhc1xuICAgICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZFxuICAgIGNvbnN0IHNjb3BlID0gc25hcHNob3RTdHJpbmcobWV0aG9kLCBcInRhcmdldF90eXBlXCIpID09PSBcIm9yZGVyXCJcbiAgICAgID8gXCJvcmRlclwiXG4gICAgICA6IFwicHJvZHVjdHNcIlxuICAgIHJldHVybiBgJHtzbmFwc2hvdE51bWJlcihzbmFwc2hvdCwgXCJwZXJjZW50YWdlXCIpID8/IDB9JSBvZmYgJHtzY29wZX1gXG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJmcmVlX3NoaXBwaW5nXCIpIHtcbiAgICByZXR1cm4gXCJGcmVlIHNoaXBwaW5nXCJcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImJ1eV9nZXRcIikge1xuICAgIHJldHVybiBcIkJ1eSBYIEdldCBZXCJcbiAgfVxuXG4gIHJldHVybiBcIlVua25vd25cIlxufVxuXG5mdW5jdGlvbiBleHBpcmF0aW9uUG9saWN5TGFiZWwoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgcG9saWN5ID0gc25hcHNob3Q/LmV4cGlyYXRpb25fcG9saWN5IGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkXG4gIGNvbnN0IHR5cGUgPSBzbmFwc2hvdFN0cmluZyhwb2xpY3ksIFwidHlwZVwiKVxuXG4gIGlmICh0eXBlID09PSBcIm5vbmVcIikgcmV0dXJuIFwiTm8gZXhwaXJhdGlvblwiXG4gIGlmICh0eXBlID09PSBcImR1cmF0aW9uXCIpIHtcbiAgICBjb25zdCBkYXlzID0gc25hcHNob3ROdW1iZXIocG9saWN5LCBcImR1cmF0aW9uX2RheXNcIikgPz8gMFxuICAgIHJldHVybiBgJHtkYXlzfSBkYXlzIGFmdGVyIGlzc3VhbmNlYFxuICB9XG4gIGlmICh0eXBlID09PSBcImZpeGVkXCIpIHtcbiAgICByZXR1cm4gYEZpeGVkIGRhdGUgJHtmb3JtYXREYXRlVGltZShzbmFwc2hvdFN0cmluZyhwb2xpY3ksIFwiZXhwaXJlc19hdFwiKSl9YFxuICB9XG5cbiAgcmV0dXJuIFwiLVwiXG59XG5cbmZ1bmN0aW9uIGNhbXBhaWduU25hcHNob3RMYWJlbChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBjYW1wYWlnblNuYXBzaG90ID0gc25hcHNob3Q/LmNhbXBhaWduX3NuYXBzaG90IGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkXG4gIHJldHVybiAoXG4gICAgc25hcHNob3RTdHJpbmcoY2FtcGFpZ25TbmFwc2hvdCwgXCJuYW1lXCIpIHx8XG4gICAgc25hcHNob3RTdHJpbmcoY2FtcGFpZ25TbmFwc2hvdCwgXCJjYW1wYWlnbl9pZGVudGlmaWVyXCIpIHx8XG4gICAgc25hcHNob3RTdHJpbmcoc25hcHNob3QsIFwiY2FtcGFpZ25faWRcIikgfHxcbiAgICBcIk5vbmVcIlxuICApXG59XG5cbmZ1bmN0aW9uIHByb21vdGlvblNuYXBzaG90TGFiZWwoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgdGVtcGxhdGUgPSBzbmFwc2hvdD8ucHJvbW90aW9uX3RlbXBsYXRlIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkXG4gIGNvbnN0IG1ldGhvZCA9IHRlbXBsYXRlPy5hcHBsaWNhdGlvbl9tZXRob2QgYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWRcbiAgY29uc3QgdGFyZ2V0ID0gc25hcHNob3RTdHJpbmcobWV0aG9kLCBcInRhcmdldF90eXBlXCIpXG4gIGNvbnN0IGFsbG9jYXRpb24gPSBzbmFwc2hvdFN0cmluZyhtZXRob2QsIFwiYWxsb2NhdGlvblwiKVxuXG4gIHJldHVybiBbdGFyZ2V0LCBhbGxvY2F0aW9uXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiAvIFwiKSB8fCBcIk5vbmVcIlxufVxuXG5mdW5jdGlvbiBjYW1wYWlnbkxhYmVsKGNvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZykge1xuICBjb25zdCBuYW1lID0gY29uZmlnLmNhbXBhaWduX3NuYXBzaG90Py5uYW1lXG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWVcbiAgfVxuXG4gIHJldHVybiBjb25maWcuY2FtcGFpZ25faWQgfHwgXCJOb25lXCJcbn1cblxuZnVuY3Rpb24gZm9ybUZyb21Sb3cocm93OiBDb3Vwb25Qcm9kdWN0Um93LCBkZWZhdWx0Q3VycmVuY3lDb2RlOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJvZHVjdCA9IHJvdy5wcm9kdWN0IHx8ICh7fSBhcyBQcm9kdWN0UmVjb3JkKVxuICBjb25zdCBjb25maWcgPSByb3cuY291cG9uX3Byb2R1Y3RfY29uZmlnXG4gIGNvbnN0IHZhcmlhbnRDb25maWdCeVZhcmlhbnRJZCA9IG5ldyBNYXAoXG4gICAgKHJvdy5jb3Vwb25fcHJvZHVjdF92YXJpYW50X2NvbmZpZ3MgfHwgW10pLm1hcCgodmFyaWFudENvbmZpZykgPT4gW1xuICAgICAgdmFyaWFudENvbmZpZy52YXJpYW50X2lkLFxuICAgICAgdmFyaWFudENvbmZpZyxcbiAgICBdKSxcbiAgKVxuICBjb25zdCBkdXJhdGlvbkRheXMgPVxuICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSA9PT0gXCJkdXJhdGlvblwiXG4gICAgICA/IGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeS5kdXJhdGlvbl9kYXlzXG4gICAgICA6IDMwXG5cbiAgcmV0dXJuIHtcbiAgICBwcm9kdWN0OiB7XG4gICAgICAuLi5lbXB0eVByb2R1Y3QsXG4gICAgICBpZDogcHJvZHVjdC5pZCB8fCBcIlwiLFxuICAgICAgdGl0bGU6IHByb2R1Y3QudGl0bGUgfHwgXCJcIixcbiAgICAgIHN1YnRpdGxlOiBwcm9kdWN0LnN1YnRpdGxlIHx8IFwiXCIsXG4gICAgICBoYW5kbGU6IHByb2R1Y3QuaGFuZGxlIHx8IFwiXCIsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdC5kZXNjcmlwdGlvbiB8fCBcIlwiLFxuICAgICAgdGh1bWJuYWlsOiBwcm9kdWN0LnRodW1ibmFpbCB8fCBcIlwiLFxuICAgICAgc3RhdHVzOiBwcm9kdWN0LnN0YXR1cyB8fCBcImRyYWZ0XCIsXG4gICAgICBkaXNjb3VudGFibGU6IEJvb2xlYW4ocHJvZHVjdC5kaXNjb3VudGFibGUpLFxuICAgICAgdHlwZV9pZDogcHJvZHVjdC50eXBlX2lkIHx8IFwiXCIsXG4gICAgICBjb2xsZWN0aW9uX2lkOiBwcm9kdWN0LmNvbGxlY3Rpb25faWQgfHwgXCJcIixcbiAgICAgIGNhdGVnb3J5X2lkOiBwcm9kdWN0LmNhdGVnb3JpZXM/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIHRhZ19pZDogcHJvZHVjdC50YWdzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgICBzYWxlc19jaGFubmVsX2lkOiBwcm9kdWN0LnNhbGVzX2NoYW5uZWxzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgICB2YXJpYW50czogKHByb2R1Y3QudmFyaWFudHM/Lmxlbmd0aCA/IHByb2R1Y3QudmFyaWFudHMgOiBbXSkubWFwKFxuICAgICAgICAodmFyaWFudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG92ZXJyaWRlID0gdmFyaWFudENvbmZpZ0J5VmFyaWFudElkLmdldCh2YXJpYW50LmlkKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5lbXB0eVZhcmlhbnQsXG4gICAgICAgICAgICBpZDogdmFyaWFudC5pZCxcbiAgICAgICAgICAgIG92ZXJyaWRlX2NvbmZpZ19pZDogb3ZlcnJpZGU/LmlkLFxuICAgICAgICAgICAgdGl0bGU6IHZhcmlhbnQudGl0bGUgfHwgXCJcIixcbiAgICAgICAgICAgIHNrdTogdmFyaWFudC5za3UgfHwgXCJcIixcbiAgICAgICAgICAgIGN1cnJlbmN5X2NvZGU6XG4gICAgICAgICAgICAgIHZhcmlhbnQucHJpY2VzPy5bMF0/LmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgb3ZlcnJpZGU/LmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgY29uZmlnLmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdEN1cnJlbmN5Q29kZSxcbiAgICAgICAgICAgIGFtb3VudDpcbiAgICAgICAgICAgICAgdmFyaWFudC5wcmljZXM/LlswXT8uYW1vdW50ID09IG51bGxcbiAgICAgICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgICAgICA6IFN0cmluZyh2YXJpYW50LnByaWNlcz8uWzBdPy5hbW91bnQpLFxuICAgICAgICAgICAgb3ZlcnJpZGVfZW5hYmxlZDogb3ZlcnJpZGUgPyBvdmVycmlkZS5lbmFibGVkICE9PSBmYWxzZSA6IGZhbHNlLFxuICAgICAgICAgICAgb3ZlcnJpZGVfYmVuZWZpdF90eXBlOlxuICAgICAgICAgICAgICBvdmVycmlkZT8uYmVuZWZpdF90eXBlIHx8IGNvbmZpZy5iZW5lZml0X3R5cGUgfHwgXCJmaXhlZF9hbW91bnRcIixcbiAgICAgICAgICAgIG92ZXJyaWRlX2N1cnJlbmN5X2NvZGU6XG4gICAgICAgICAgICAgIG92ZXJyaWRlPy5jdXJyZW5jeV9jb2RlIHx8XG4gICAgICAgICAgICAgIGNvbmZpZy5jdXJyZW5jeV9jb2RlIHx8XG4gICAgICAgICAgICAgIGRlZmF1bHRDdXJyZW5jeUNvZGUsXG4gICAgICAgICAgICBvdmVycmlkZV9hbW91bnQ6XG4gICAgICAgICAgICAgIG92ZXJyaWRlPy5hbW91bnQgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcob3ZlcnJpZGUuYW1vdW50KSxcbiAgICAgICAgICAgIG92ZXJyaWRlX3BlcmNlbnRhZ2U6XG4gICAgICAgICAgICAgIG92ZXJyaWRlPy5wZXJjZW50YWdlID09IG51bGwgPyBcIlwiIDogU3RyaW5nKG92ZXJyaWRlLnBlcmNlbnRhZ2UpLFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICBjb3Vwb246IHtcbiAgICAgIC4uLmVtcHR5Q291cG9uLFxuICAgICAgZW5hYmxlZDogY29uZmlnLmVuYWJsZWQsXG4gICAgICBiZW5lZml0X3R5cGU6IGNvbmZpZy5iZW5lZml0X3R5cGUsXG4gICAgICBhbW91bnQ6IGNvbmZpZy5hbW91bnQgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcoY29uZmlnLmFtb3VudCksXG4gICAgICBwZXJjZW50YWdlOiBjb25maWcucGVyY2VudGFnZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhjb25maWcucGVyY2VudGFnZSksXG4gICAgICBjdXJyZW5jeV9jb2RlOiBjb25maWcuY3VycmVuY3lfY29kZSB8fCBkZWZhdWx0Q3VycmVuY3lDb2RlLFxuICAgICAgY29kZV9zdHJhdGVneTogY29uZmlnLmNvZGVfc3RyYXRlZ3ksXG4gICAgICBjb2RlX3ByZWZpeDogY29uZmlnLmNvZGVfcHJlZml4IHx8IFwiXCIsXG4gICAgICBzaGFyZWRfY29kZTogY29uZmlnLnNoYXJlZF9jb2RlIHx8IFwiXCIsXG4gICAgICBleHBpcmF0aW9uX3R5cGU6IGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSB8fCBcImR1cmF0aW9uXCIsXG4gICAgICBleHBpcmF0aW9uX2RheXM6IFN0cmluZyhkdXJhdGlvbkRheXMpLFxuICAgICAgZXhwaXJhdGlvbl9kYXRlOlxuICAgICAgICBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LnR5cGUgPT09IFwiZml4ZWRcIlxuICAgICAgICAgID8gdG9EYXRlVGltZUxvY2FsKGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeS5leHBpcmVzX2F0KVxuICAgICAgICAgIDogXCJcIixcbiAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOlxuICAgICAgICBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LmNhcF9ieV9jYW1wYWlnbiAhPT0gZmFsc2UsXG4gICAgICBleHBpcmF0aW9uX2NhcF9hdDogY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py5jYXBfYXRcbiAgICAgICAgPyB0b0RhdGVUaW1lTG9jYWwoY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmNhcF9hdClcbiAgICAgICAgOiBcIlwiLFxuICAgICAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBTdHJpbmcoXG4gICAgICAgIGNvbmZpZy5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW0gfHwgMSxcbiAgICAgICksXG4gICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IGNvbmZpZy5wcm9tb3Rpb25fbWlycm9yX21vZGUgfHwgXCJub25lXCIsXG4gICAgICBwcm9tb3Rpb25fc3RhdHVzOiBjb25maWcucHJvbW90aW9uX3N0YXR1cyB8fCBcImRyYWZ0XCIsXG4gICAgfSxcbiAgICBjYW1wYWlnbjoge1xuICAgICAgLi4uZW1wdHlDYW1wYWlnbixcbiAgICAgIG1vZGU6IGNvbmZpZy5jYW1wYWlnbl9pZCA/IFwiZXhpc3RpbmdcIiA6IFwibm9uZVwiLFxuICAgICAgY2FtcGFpZ25faWQ6IGNvbmZpZy5jYW1wYWlnbl9pZCB8fCBcIlwiLFxuICAgIH0sXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDb3Vwb25QYXlsb2FkKFxuICBjb3Vwb246IENvdXBvbkZvcm1TdGF0ZSxcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3I6IGJvb2xlYW4sXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiBjb3Vwb24uZW5hYmxlZCxcbiAgICBiZW5lZml0X3R5cGU6IGNvdXBvbi5iZW5lZml0X3R5cGUsXG4gICAgYW1vdW50OlxuICAgICAgY291cG9uLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICA/IG51bWJlck9yTnVsbChjb3Vwb24uYW1vdW50KVxuICAgICAgICA6IG51bGwsXG4gICAgcGVyY2VudGFnZTpcbiAgICAgIGNvdXBvbi5iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiXG4gICAgICAgID8gbnVtYmVyT3JOdWxsKGNvdXBvbi5wZXJjZW50YWdlKVxuICAgICAgICA6IG51bGwsXG4gICAgY3VycmVuY3lfY29kZTpcbiAgICAgIGNvdXBvbi5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgPyBjb3Vwb24uY3VycmVuY3lfY29kZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICA6IG51bGwsXG4gICAgY29kZV9zdHJhdGVneTogY291cG9uLmNvZGVfc3RyYXRlZ3ksXG4gICAgY29kZV9wcmVmaXg6XG4gICAgICBjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJ1bmlxdWVfY29kZVwiXG4gICAgICAgID8gY291cG9uLmNvZGVfcHJlZml4LnRyaW0oKSB8fCBcIkNPVVBPTlwiXG4gICAgICAgIDogbnVsbCxcbiAgICBzaGFyZWRfY29kZTpcbiAgICAgIGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCIgPyBjb3Vwb24uc2hhcmVkX2NvZGUudHJpbSgpIDogbnVsbCxcbiAgICBleHBpcmF0aW9uX3BvbGljeTpcbiAgICAgIGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZml4ZWRcIlxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIiBhcyBjb25zdCxcbiAgICAgICAgICAgIGV4cGlyZXNfYXQ6IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2RhdGUpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBjYXBfYnlfY2FtcGFpZ246IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgIGNhcF9hdDogY291cG9uLmV4cGlyYXRpb25fY2FwX2F0XG4gICAgICAgICAgICAgID8gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdHlwZTogXCJkdXJhdGlvblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZHVyYXRpb25fZGF5czogTnVtYmVyKGNvdXBvbi5leHBpcmF0aW9uX2RheXMpIHx8IDMwLFxuICAgICAgICAgICAgY2FwX2J5X2NhbXBhaWduOiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ24sXG4gICAgICAgICAgICBjYXBfYXQ6IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdFxuICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06XG4gICAgICBOdW1iZXIoY291cG9uLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSkgfHwgMSxcbiAgICAuLi4oYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgICAgID8ge1xuICAgICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogY291cG9uLnByb21vdGlvbl9taXJyb3JfbW9kZSxcbiAgICAgICAgICBwcm9tb3Rpb25fc3RhdHVzOiBjb3Vwb24ucHJvbW90aW9uX3N0YXR1cyxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDYW1wYWlnblBheWxvYWQoXG4gIGNhbXBhaWduOiBDYW1wYWlnbkZvcm1TdGF0ZSxcbiAgYWxsb3dDYW1wYWlnbjogYm9vbGVhbixcbikge1xuICBpZiAoIWFsbG93Q2FtcGFpZ24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbiAgaWYgKGNhbXBhaWduLm1vZGUgPT09IFwiZXhpc3RpbmdcIikge1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlOiBcImV4aXN0aW5nXCIsXG4gICAgICBjYW1wYWlnbl9pZDogY2FtcGFpZ24uY2FtcGFpZ25faWQgfHwgbnVsbCxcbiAgICB9XG4gIH1cbiAgaWYgKGNhbXBhaWduLm1vZGUgPT09IFwibmV3XCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZTogXCJuZXdcIixcbiAgICAgIGNhbXBhaWduOiB7XG4gICAgICAgIG5hbWU6IGNhbXBhaWduLm5hbWUsXG4gICAgICAgIGNhbXBhaWduX2lkZW50aWZpZXI6IGNhbXBhaWduLmNhbXBhaWduX2lkZW50aWZpZXIsXG4gICAgICAgIHN0YXJ0c19hdDogY2FtcGFpZ24uc3RhcnRzX2F0XG4gICAgICAgICAgPyBuZXcgRGF0ZShjYW1wYWlnbi5zdGFydHNfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGVuZHNfYXQ6IGNhbXBhaWduLmVuZHNfYXRcbiAgICAgICAgICA/IG5ldyBEYXRlKGNhbXBhaWduLmVuZHNfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgICB9LFxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtb2RlOiBcIm5vbmVcIiB9XG59XG5cbmZ1bmN0aW9uIHN0ZXBTdGF0dXMoc3RlcDogV2l6YXJkU3RlcCwgYWN0aXZlOiBXaXphcmRTdGVwKSB7XG4gIGNvbnN0IHN0ZXBJbmRleCA9IHN0ZXBzLmluZGV4T2Yoc3RlcClcbiAgY29uc3QgYWN0aXZlSW5kZXggPSBzdGVwcy5pbmRleE9mKGFjdGl2ZSlcbiAgaWYgKHN0ZXBJbmRleCA8IGFjdGl2ZUluZGV4KSByZXR1cm4gXCJjb21wbGV0ZWRcIlxuICBpZiAoc3RlcEluZGV4ID09PSBhY3RpdmVJbmRleCkgcmV0dXJuIFwiaW4tcHJvZ3Jlc3NcIlxuICByZXR1cm4gXCJub3Qtc3RhcnRlZFwiXG59XG5cbmZ1bmN0aW9uIEZpZWxkKHsgbGFiZWwsIGNoaWxkcmVuIH06IHsgbGFiZWw6IHN0cmluZzsgY2hpbGRyZW46IFJlYWN0Tm9kZSB9KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTFcIiBzdHlsZT17eyBtaW5XaWR0aDogMCB9fT5cbiAgICAgIDxMYWJlbD57bGFiZWx9PC9MYWJlbD5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBjdXJyZW5jeURlY2ltYWxEaWdpdHMoY29kZTogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChcImVuXCIsIHtcbiAgICAgIHN0eWxlOiBcImN1cnJlbmN5XCIsXG4gICAgICBjdXJyZW5jeTogY29kZS50b1VwcGVyQ2FzZSgpLFxuICAgIH0pLnJlc29sdmVkT3B0aW9ucygpLm1heGltdW1GcmFjdGlvbkRpZ2l0c1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gMlxuICB9XG59XG5cbmZ1bmN0aW9uIGN1cnJlbmN5U3ltYm9sKGNvZGU6IHN0cmluZykge1xuICBpZiAoIWNvZGUpIHJldHVybiBcIlwiXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgbmV3IEludGwuTnVtYmVyRm9ybWF0KFwiZW5cIiwge1xuICAgICAgICBzdHlsZTogXCJjdXJyZW5jeVwiLFxuICAgICAgICBjdXJyZW5jeTogY29kZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICBjdXJyZW5jeURpc3BsYXk6IFwibmFycm93U3ltYm9sXCIsXG4gICAgICB9KVxuICAgICAgICAuZm9ybWF0VG9QYXJ0cygwKVxuICAgICAgICAuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSBcImN1cnJlbmN5XCIpPy52YWx1ZSB8fCBjb2RlLnRvVXBwZXJDYXNlKClcbiAgICApXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjb2RlLnRvVXBwZXJDYXNlKClcbiAgfVxufVxuXG5mdW5jdGlvbiBDdXJyZW5jeVNlbGVjdCh7XG4gIGN1cnJlbmNpZXMsXG4gIGRpc2FibGVkLFxuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5T3B0aW9uW11cbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFxuICAgICAgdmFsdWU9e3ZhbHVlIHx8IHVuZGVmaW5lZH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCB8fCAhY3VycmVuY2llcy5sZW5ndGh9XG4gICAgICBvblZhbHVlQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICA+XG4gICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgIDxTZWxlY3QuVmFsdWVcbiAgICAgICAgICBwbGFjZWhvbGRlcj17XG4gICAgICAgICAgICBjdXJyZW5jaWVzLmxlbmd0aCA/IFwiU2VsZWN0IGN1cnJlbmN5XCIgOiBcIk5vIGN1cnJlbmNpZXMgYXZhaWxhYmxlXCJcbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICB7Y3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiAoXG4gICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17Y3VycmVuY3kuY29kZX0gdmFsdWU9e2N1cnJlbmN5LmNvZGV9PlxuICAgICAgICAgICAge2N1cnJlbmN5Lm5hbWV9ICh7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfSlcbiAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICApKX1cbiAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgPC9TZWxlY3Q+XG4gIClcbn1cblxuZnVuY3Rpb24gQ3VycmVuY3lBbW91bnRJbnB1dCh7XG4gIGN1cnJlbmNpZXMsXG4gIGN1cnJlbmN5Q29kZSxcbiAgZGlzYWJsZWQsXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXVxuICBjdXJyZW5jeUNvZGU6IHN0cmluZ1xuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgY29uc3QgY3VycmVuY3kgPSBjdXJyZW5jaWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0gY3VycmVuY3lDb2RlKVxuICBjb25zdCBjb2RlID0gY3VycmVuY3lDb2RlLnRvVXBwZXJDYXNlKClcbiAgY29uc3QgZGVjaW1hbHMgPSBjdXJyZW5jeURlY2ltYWxEaWdpdHMoY29kZSB8fCBcIlVTRFwiKVxuXG4gIHJldHVybiAoXG4gICAgPEN1cnJlbmN5SW5wdXRcbiAgICAgIGNvZGU9e2NvZGUgfHwgXCJVU0RcIn1cbiAgICAgIHN5bWJvbD17XG4gICAgICAgIGN1cnJlbmN5Py5zeW1ib2xfbmF0aXZlIHx8XG4gICAgICAgIGN1cnJlbmN5Py5zeW1ib2wgfHxcbiAgICAgICAgY3VycmVuY3lTeW1ib2woY29kZSB8fCBcIlVTRFwiKVxuICAgICAgfVxuICAgICAgbWluPXswfVxuICAgICAgZGVjaW1hbFNjYWxlPXtkZWNpbWFsc31cbiAgICAgIGRlY2ltYWxzTGltaXQ9e2RlY2ltYWxzfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8ICFjdXJyZW5jeUNvZGV9XG4gICAgICBvblZhbHVlQ2hhbmdlPXsobmV4dFZhbHVlKSA9PiBvbkNoYW5nZShuZXh0VmFsdWUgfHwgXCJcIil9XG4gICAgLz5cbiAgKVxufVxuXG5jb25zdCBlbnRpdGxlbWVudEZpbHRlcnMgPSBbXG4gIHsgbGFiZWw6IFwiQWxsXCIsIHZhbHVlOiBcImFsbFwiIH0sXG4gIHsgbGFiZWw6IFwiSXNzdWVkXCIsIHZhbHVlOiBcImlzc3VlZFwiIH0sXG4gIHsgbGFiZWw6IFwiUmVkZWVtZWRcIiwgdmFsdWU6IFwicmVkZWVtZWRcIiB9LFxuICB7IGxhYmVsOiBcIkV4cGlyZWRcIiwgdmFsdWU6IFwiZXhwaXJlZFwiIH0sXG4gIHsgbGFiZWw6IFwiQ2FuY2VsZWRcIiwgdmFsdWU6IFwiY2FuY2VsZWRcIiB9LFxuXSBhcyBjb25zdFxuXG50eXBlIEVudGl0bGVtZW50RmlsdGVyID0gKHR5cGVvZiBlbnRpdGxlbWVudEZpbHRlcnMpW251bWJlcl1bXCJ2YWx1ZVwiXVxuXG5mdW5jdGlvbiBTbmFwc2hvdEJsb2NrKHsgdGl0bGUsIHZhbHVlIH06IHsgdGl0bGU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSkge1xuICByZXR1cm4gKFxuICAgIDxkZXRhaWxzIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIHAtM1wiPlxuICAgICAgPHN1bW1hcnkgY2xhc3NOYW1lPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC11aS1mZy1iYXNlIHR4dC1zbWFsbC1wbHVzXCI+XG4gICAgICAgIHt0aXRsZX1cbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDxwcmVcbiAgICAgICAgY2xhc3NOYW1lPVwibXQtMyByb3VuZGVkLW1kIGJnLXVpLWJnLXN1YnRsZSBwLTMgdGV4dC11aS1mZy1zdWJ0bGUgdHh0LWNvbXBhY3QteHNtYWxsXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBtYXhIZWlnaHQ6IDIyMCxcbiAgICAgICAgICBvdmVyZmxvdzogXCJhdXRvXCIsXG4gICAgICAgICAgd2hpdGVTcGFjZTogXCJwcmUtd3JhcFwiLFxuICAgICAgICAgIHdvcmRCcmVhazogXCJicmVhay13b3JkXCIsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHtqc29uQmxvY2sodmFsdWUpfVxuICAgICAgPC9wcmU+XG4gICAgPC9kZXRhaWxzPlxuICApXG59XG5cbmZ1bmN0aW9uIFR3b0NvbHVtbkxheW91dCh7XG4gIGZpcnN0Q29sLFxuICBzZWNvbmRDb2wsXG59OiB7XG4gIGZpcnN0Q29sOiBSZWFjdE5vZGVcbiAgc2Vjb25kQ29sOiBSZWFjdE5vZGVcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXgtNCBnYXAteS0zIHhsOmZsZXgtcm93IHhsOml0ZW1zLXN0YXJ0XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGZsZXgtY29sIGdhcC15LTNcIj57Zmlyc3RDb2x9PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIG1heC13LVsxMDAlXSBmbGV4LWNvbCBnYXAteS0zIHhsOm10LTAgeGw6bWF4LXctWzQ0MHB4XVwiPlxuICAgICAgICB7c2Vjb25kQ29sfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VjdGlvblJvdyh7XG4gIHRpdGxlLFxuICB2YWx1ZSxcbn06IHtcbiAgdGl0bGU6IHN0cmluZ1xuICB2YWx1ZTogUmVhY3ROb2RlXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLXN1YnRsZSBncmlkIGdyaWQtY29scy0yIGl0ZW1zLWNlbnRlciBnYXAteC00IHB4LTYgcHktNFwiPlxuICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgd2VpZ2h0PVwicGx1c1wiIGxlYWRpbmc9XCJjb21wYWN0XCI+XG4gICAgICAgIHt0aXRsZX1cbiAgICAgIDwvVGV4dD5cbiAgICAgIHt0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgPT0gbnVsbCA/IChcbiAgICAgICAgPFRleHRcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIGxlYWRpbmc9XCJjb21wYWN0XCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXByZXR0eSB3aGl0ZXNwYWNlLXByZS1saW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt2YWx1ZSB8fCBcIi1cIn1cbiAgICAgICAgPC9UZXh0PlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+e3ZhbHVlfTwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBXaWRnZXRIZWFkZXIoeyB0aXRsZSB9OiB7IHRpdGxlOiBzdHJpbmcgfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTYgcHktNFwiPlxuICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMlwiPnt0aXRsZX08L0hlYWRpbmc+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gU2lkZWJhckxpbmsoe1xuICBocmVmLFxuICBsYWJlbCxcbiAgZGVzY3JpcHRpb24sXG4gIGljb24sXG59OiB7XG4gIGhyZWY6IHN0cmluZ1xuICBsYWJlbDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgaWNvbj86IFJlYWN0Tm9kZVxufSkge1xuICByZXR1cm4gKFxuICAgIDxhIGhyZWY9e2hyZWZ9IGNsYXNzTmFtZT1cImdyb3VwIG91dGxpbmUtbm9uZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIHB4LTIgcGItMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNoYWRvdy1lbGV2YXRpb24tY2FyZC1yZXN0IGJnLXVpLWJnLWNvbXBvbmVudCB0cmFuc2l0aW9uLWZnIGhvdmVyOmJnLXVpLWJnLWNvbXBvbmVudC1ob3ZlciBhY3RpdmU6YmctdWktYmctY29tcG9uZW50LXByZXNzZWQgZ3JvdXAtZm9jdXMtdmlzaWJsZTpzaGFkb3ctYm9yZGVycy1pbnRlcmFjdGl2ZS13aXRoLWFjdGl2ZSByb3VuZGVkLW1kIHB4LTQgcHktMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgIHtpY29uICYmIDxkaXY+e2ljb259PC9kaXY+fVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBsZWFkaW5nPVwiY29tcGFjdFwiIHdlaWdodD1cInBsdXNcIj5cbiAgICAgICAgICAgICAgICB7bGFiZWx9XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgPFRleHRcbiAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgIGxlYWRpbmc9XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLXN1YnRsZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8VHJpYW5nbGVSaWdodE1pbmkgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2E+XG4gIClcbn1cblxuZnVuY3Rpb24gU3VtbWFyeVdpZGdldCh7XG4gIGxhYmVsLFxuICB2YWx1ZSxcbiAgdG9uZSA9IFwiZ3JlZW5cIixcbn06IHtcbiAgbGFiZWw6IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG4gIHRvbmU/OiBcImdyZWVuXCIgfCBcIm5ldXRyYWxcIlxufSkge1xuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwicHgtNiBweS00XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdWktZmctc3VidGxlIGZsZXggaXRlbXMtY2VudGVyIGdhcC14LTNcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17YGgtOCB3LTEgcm91bmRlZC1mdWxsICR7XG4gICAgICAgICAgICB0b25lID09PSBcImdyZWVuXCJcbiAgICAgICAgICAgICAgPyBcImJnLXVpLXRhZy1ncmVlbi1pY29uXCJcbiAgICAgICAgICAgICAgOiBcImJnLXVpLXRhZy1uZXV0cmFsLWljb25cIlxuICAgICAgICAgIH1gfVxuICAgICAgICAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTBcIj5cbiAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCIgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1zdWJ0bGVcIj5cbiAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHRcbiAgICAgICAgICAgIHdlaWdodD1cInBsdXNcIlxuICAgICAgICAgICAgc2l6ZT1cInhsYXJnZVwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0YWJ1bGFyLW51bXMgdGV4dC11aS1mZy1iYXNlIGJyZWFrLXdvcmRzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dmFsdWV9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvQ29udGFpbmVyPlxuICApXG59XG5cbmZ1bmN0aW9uIENvdXBvbkdlbmVyYWxTZWN0aW9uKHsgZGV0YWlsIH06IHsgZGV0YWlsOiBDb3Vwb25FbnRpdGxlbWVudERldGFpbCB9KSB7XG4gIGNvbnN0IGVudGl0bGVtZW50ID0gZGV0YWlsLmN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudFxuICBjb25zdCBpc3N1YW5jZSA9IGRldGFpbC5jb3Vwb25faXNzdWFuY2UgfHwgbnVsbFxuICBjb25zdCBiZW5lZml0U25hcHNob3QgPSBlbnRpdGxlbWVudC5iZW5lZml0X3NuYXBzaG90IHx8IG51bGxcbiAgY29uc3Qgc291cmNlU25hcHNob3QgPSBlbnRpdGxlbWVudC5zb3VyY2Vfc25hcHNob3QgfHwgbnVsbFxuICBjb25zdCBjb2RlID0gY291cG9uQ29kZShlbnRpdGxlbWVudClcbiAgY29uc3QgZXh0ZXJuYWwgPSBlbnRpdGxlbWVudC5vcmlnaW4gPT09IFwiZXh0ZXJuYWxcIlxuICBjb25zdCBwcm9kdWN0TGFiZWwgPVxuICAgIHNuYXBzaG90U3RyaW5nKHNvdXJjZVNuYXBzaG90LCBcInRpdGxlXCIpIHx8XG4gICAgc25hcHNob3RTdHJpbmcoc291cmNlU25hcHNob3QsIFwic291cmNlXCIpIHx8XG4gICAgZW50aXRsZW1lbnQucHJvZHVjdF9pZCB8fFxuICAgIFwiRXh0ZXJuYWxcIlxuICBjb25zdCB2YXJpYW50TGFiZWwgPVxuICAgIHNuYXBzaG90U3RyaW5nKHNvdXJjZVNuYXBzaG90LCBcInZhcmlhbnRfaWRcIikgfHwgZW50aXRsZW1lbnQudmFyaWFudF9pZCB8fCBcIi1cIlxuICBjb25zdCBpc3N1ZWREYXRlID0gZW50aXRsZW1lbnQuY3JlYXRlZF9hdCB8fCBpc3N1YW5jZT8uY3JlYXRlZF9hdCB8fCBudWxsXG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMVwiPlxuICAgICAgICAgICAgPEhlYWRpbmcgY2xhc3NOYW1lPVwiYnJlYWstYWxsXCI+I3tjb2RlfTwvSGVhZGluZz5cbiAgICAgICAgICAgIHtjb2RlICE9PSBcIi1cIiAmJiAoXG4gICAgICAgICAgICAgIDxDb3B5IGNvbnRlbnQ9e2NvZGV9IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIiAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLXN1YnRsZVwiPlxuICAgICAgICAgICAge2Zvcm1hdEZ1bGxEYXRlKGlzc3VlZERhdGUpfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxTdGF0dXNCYWRnZSBjb2xvcj17ZW50aXRsZW1lbnRTdGF0dXNDb2xvcihlbnRpdGxlbWVudC5zdGF0dXMpfT5cbiAgICAgICAgICB7ZW50aXRsZW1lbnQuc3RhdHVzfVxuICAgICAgICA8L1N0YXR1c0JhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIkRhdGUgaXNzdWVkXCIgdmFsdWU9e2Zvcm1hdFJlbGF0aXZlRGF0ZShpc3N1ZWREYXRlKX0gLz5cbiAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgIHRpdGxlPVwiQ3VzdG9tZXJcIlxuICAgICAgICB2YWx1ZT17ZW50aXRsZW1lbnQuZW1haWwgfHwgZW50aXRsZW1lbnQuY3VzdG9tZXJfaWQgfHwgXCItXCJ9XG4gICAgICAvPlxuICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJPcmlnaW5cIiB2YWx1ZT17ZW50aXRsZW1lbnRTb3VyY2UoZW50aXRsZW1lbnQpfSAvPlxuICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgdGl0bGU9e2V4dGVybmFsID8gXCJTb3VyY2VcIiA6IFwiQ291cG9uIHByb2R1Y3RcIn1cbiAgICAgICAgdmFsdWU9e3Byb2R1Y3RMYWJlbH1cbiAgICAgIC8+XG4gICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIlNlbGxlciBzY29wZVwiIHZhbHVlPXtlbnRpdGxlbWVudFNlbGxlclNjb3BlKGVudGl0bGVtZW50KX0gLz5cbiAgICAgIHshZXh0ZXJuYWwgJiYgPFNlY3Rpb25Sb3cgdGl0bGU9XCJWYXJpYW50XCIgdmFsdWU9e3ZhcmlhbnRMYWJlbH0gLz59XG4gICAgICB7IWV4dGVybmFsICYmIChcbiAgICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgICB0aXRsZT1cIlF1YW50aXR5XCJcbiAgICAgICAgICB2YWx1ZT17U3RyaW5nKFxuICAgICAgICAgICAgc25hcHNob3ROdW1iZXIoc291cmNlU25hcHNob3QsIFwicXVhbnRpdHlcIikgPz8gaXNzdWFuY2U/LnF1YW50aXR5ID8/IDEsXG4gICAgICAgICAgKX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICA8U2VjdGlvblJvd1xuICAgICAgICB0aXRsZT1cIkJlbmVmaXRcIlxuICAgICAgICB2YWx1ZT17YmVuZWZpdFNuYXBzaG90TGFiZWwoYmVuZWZpdFNuYXBzaG90KX1cbiAgICAgIC8+XG4gICAgICA8U2VjdGlvblJvd1xuICAgICAgICB0aXRsZT1cIkV4cGlyYXRpb24gcG9saWN5XCJcbiAgICAgICAgdmFsdWU9e2V4cGlyYXRpb25Qb2xpY3lMYWJlbChiZW5lZml0U25hcHNob3QpfVxuICAgICAgLz5cbiAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiRXhwaXJhdGlvbiBEYXRlXCIgdmFsdWU9e2Zvcm1hdERhdGUoZW50aXRsZW1lbnQuZXhwaXJlc19hdCl9IC8+XG4gICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIlJlZGVlbWVkIERhdGVcIiB2YWx1ZT17Zm9ybWF0RGF0ZShlbnRpdGxlbWVudC5yZWRlZW1lZF9hdCl9IC8+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gUmVsYXRlZE9yZGVyU2VjdGlvbih7XG4gIGFwaUJhc2UsXG4gIGRldGFpbCxcbn06IHtcbiAgYXBpQmFzZTogQXBpQmFzZVxuICBkZXRhaWw6IENvdXBvbkVudGl0bGVtZW50RGV0YWlsXG59KSB7XG4gIGNvbnN0IGVudGl0bGVtZW50ID0gZGV0YWlsLmN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudFxuICBjb25zdCBvcmRlciA9IGRldGFpbC5vcmRlciB8fCBudWxsXG4gIGNvbnN0IG9yZGVySWQgPSBvcmRlcj8uaWQgfHwgZW50aXRsZW1lbnQub3JkZXJfaWRcbiAgaWYgKCFvcmRlcklkKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJwLTBcIj5cbiAgICAgIDxXaWRnZXRIZWFkZXIgdGl0bGU9XCJSZWxhdGVkIE9yZGVyXCIgLz5cbiAgICAgIDxTaWRlYmFyTGlua1xuICAgICAgICBocmVmPXtvcmRlckRldGFpbFBhdGgoYXBpQmFzZSwgb3JkZXJJZCl9XG4gICAgICAgIGxhYmVsPXtvcmRlciA/IG9yZGVyRGlzcGxheUlkKG9yZGVyKSA6IG9yZGVySWR9XG4gICAgICAgIGRlc2NyaXB0aW9uPXtcbiAgICAgICAgICBvcmRlcj8uY3JlYXRlZF9hdFxuICAgICAgICAgICAgPyBgT3JkZXIgcGxhY2VkICR7Zm9ybWF0UmVsYXRpdmVEYXRlKG9yZGVyLmNyZWF0ZWRfYXQpfWBcbiAgICAgICAgICAgIDogXCJQdXJjaGFzZWQgY291cG9uIG9yZGVyXCJcbiAgICAgICAgfVxuICAgICAgICBpY29uPXs8U2hvcHBpbmdDYXJ0IC8+fVxuICAgICAgLz5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBDb3Vwb25TbmFwc2hvdHNTZWN0aW9uKHtcbiAgZGV0YWlsLFxufToge1xuICBkZXRhaWw6IENvdXBvbkVudGl0bGVtZW50RGV0YWlsXG59KSB7XG4gIGNvbnN0IGVudGl0bGVtZW50ID0gZGV0YWlsLmN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudFxuICBjb25zdCBpc3N1YW5jZSA9IGRldGFpbC5jb3Vwb25faXNzdWFuY2UgfHwgbnVsbFxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJwLTBcIj5cbiAgICAgIDxXaWRnZXRIZWFkZXIgdGl0bGU9XCJKU09OXCIgLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0zIHB4LTYgcGItNlwiPlxuICAgICAgICA8U25hcHNob3RCbG9ja1xuICAgICAgICAgIHRpdGxlPVwiQmVuZWZpdCBzbmFwc2hvdFwiXG4gICAgICAgICAgdmFsdWU9e2VudGl0bGVtZW50LmJlbmVmaXRfc25hcHNob3R9XG4gICAgICAgIC8+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrXG4gICAgICAgICAgdGl0bGU9XCJTb3VyY2Ugc25hcHNob3RcIlxuICAgICAgICAgIHZhbHVlPXtlbnRpdGxlbWVudC5zb3VyY2Vfc25hcHNob3R9XG4gICAgICAgIC8+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrXG4gICAgICAgICAgdGl0bGU9XCJJc3N1YW5jZSBjb25maWcgc25hcHNob3RcIlxuICAgICAgICAgIHZhbHVlPXtpc3N1YW5jZT8uY29uZmlnX3NuYXBzaG90fVxuICAgICAgICAvPlxuICAgICAgICA8U25hcHNob3RCbG9jayB0aXRsZT1cIlNlbGxlciB0YXJnZXRzXCIgdmFsdWU9e2VudGl0bGVtZW50LnNlbGxlcl90YXJnZXRzfSAvPlxuICAgICAgICA8U25hcHNob3RCbG9jayB0aXRsZT1cIk1ldGFkYXRhXCIgdmFsdWU9e2VudGl0bGVtZW50Lm1ldGFkYXRhfSAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gQ291cG9uU3VtbWFyeVNlY3Rpb25zKHtcbiAgZGV0YWlsLFxufToge1xuICBkZXRhaWw6IENvdXBvbkVudGl0bGVtZW50RGV0YWlsXG59KSB7XG4gIGNvbnN0IGVudGl0bGVtZW50ID0gZGV0YWlsLmN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudFxuICBjb25zdCBpc3N1YW5jZSA9IGRldGFpbC5jb3Vwb25faXNzdWFuY2UgfHwgbnVsbFxuICBjb25zdCBiZW5lZml0U25hcHNob3QgPSBlbnRpdGxlbWVudC5iZW5lZml0X3NuYXBzaG90IHx8IG51bGxcbiAgY29uc3Qgc291cmNlU25hcHNob3QgPSBlbnRpdGxlbWVudC5zb3VyY2Vfc25hcHNob3QgfHwgbnVsbFxuICBjb25zdCBvcmRlciA9IGRldGFpbC5vcmRlciB8fCBudWxsXG4gIGNvbnN0IGxpbmVUb3RhbCA9IHNuYXBzaG90TnVtYmVyKHNvdXJjZVNuYXBzaG90LCBcInRvdGFsXCIpXG4gIGNvbnN0IGV4dGVybmFsID0gZW50aXRsZW1lbnQub3JpZ2luID09PSBcImV4dGVybmFsXCJcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8U3VtbWFyeVdpZGdldFxuICAgICAgICBsYWJlbD1cIkJlbmVmaXRcIlxuICAgICAgICB2YWx1ZT17YmVuZWZpdFNuYXBzaG90TGFiZWwoYmVuZWZpdFNuYXBzaG90KX1cbiAgICAgIC8+XG4gICAgICB7IWV4dGVybmFsICYmIChcbiAgICAgICAgPFN1bW1hcnlXaWRnZXRcbiAgICAgICAgICBsYWJlbD1cIkxpbmUgVG90YWxcIlxuICAgICAgICAgIHZhbHVlPXtmb3JtYXRTbmFwc2hvdEFtb3VudChsaW5lVG90YWwsIG9yZGVyPy5jdXJyZW5jeV9jb2RlKX1cbiAgICAgICAgICB0b25lPVwibmV1dHJhbFwiXG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgeyFleHRlcm5hbCAmJiAoXG4gICAgICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwiZGl2aWRlLXkgcC0wXCI+XG4gICAgICAgICAgPFdpZGdldEhlYWRlciB0aXRsZT1cIkNhbXBhaWduXCIgLz5cbiAgICAgICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIkNhbXBhaWduXCIgdmFsdWU9e2NhbXBhaWduU25hcHNob3RMYWJlbChiZW5lZml0U25hcHNob3QpfSAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiUHJvbW90aW9uXCIgdmFsdWU9e3Byb21vdGlvblNuYXBzaG90TGFiZWwoYmVuZWZpdFNuYXBzaG90KX0gLz5cbiAgICAgICAgICA8U2VjdGlvblJvd1xuICAgICAgICAgICAgdGl0bGU9XCJQcm9tb3Rpb24gc3RhdHVzXCJcbiAgICAgICAgICAgIHZhbHVlPXtzbmFwc2hvdFN0cmluZyhiZW5lZml0U25hcHNob3QsIFwicHJvbW90aW9uX3N0YXR1c1wiKSB8fCBcIi1cIn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0NvbnRhaW5lcj5cbiAgICAgICl9XG4gICAgICB7IWV4dGVybmFsICYmIChcbiAgICAgICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgICAgICA8V2lkZ2V0SGVhZGVyIHRpdGxlPVwiSXNzdWFuY2VcIiAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiU3RhdHVzXCIgdmFsdWU9e2lzc3VhbmNlPy5zdGF0dXMgfHwgXCItXCJ9IC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgICAgIHRpdGxlPVwiSXNzdWVkIC8gZmFpbGVkXCJcbiAgICAgICAgICAgIHZhbHVlPXtcbiAgICAgICAgICAgICAgaXNzdWFuY2VcbiAgICAgICAgICAgICAgICA/IGAke2lzc3VhbmNlLmlzc3VlZF9jb3VudCA/PyAwfSAvICR7aXNzdWFuY2UuZmFpbGVkX2NvdW50ID8/IDB9YFxuICAgICAgICAgICAgICAgIDogXCItXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiQ29uZmlnXCIgdmFsdWU9e2VudGl0bGVtZW50LmNvbmZpZ19pZCB8fCBcIi1cIn0gLz5cbiAgICAgICAgICA8U2VjdGlvblJvd1xuICAgICAgICAgICAgdGl0bGU9XCJWYXJpYW50IGNvbmZpZ1wiXG4gICAgICAgICAgICB2YWx1ZT17ZW50aXRsZW1lbnQudmFyaWFudF9jb25maWdfaWQgfHwgXCItXCJ9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Db250YWluZXI+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb3Vwb25EZXRhaWxQYWdlVmlldyh7IGFwaUJhc2UgfTogeyBhcGlCYXNlOiBBcGlCYXNlIH0pIHtcbiAgY29uc3QgaWQgPSBjdXJyZW50Q291cG9uRGV0YWlsSWQoYXBpQmFzZSlcbiAgY29uc3QgW2RldGFpbCwgc2V0RGV0YWlsXSA9IHVzZVN0YXRlPENvdXBvbkVudGl0bGVtZW50RGV0YWlsIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgYWN0aXZlID0gdHJ1ZVxuICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWQoKSB7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIHNldExvYWRFcnJvcihcIk1pc3NpbmcgY291cG9uIGlkXCIpXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICBzZXRMb2FkRXJyb3IobnVsbClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGFwaUZldGNoPENvdXBvbkVudGl0bGVtZW50RGV0YWlsPihcbiAgICAgICAgICBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHMvZW50aXRsZW1lbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLFxuICAgICAgICApXG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICBzZXREZXRhaWwocGF5bG9hZClcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICA6IFwiRmFpbGVkIHRvIGxvYWQgY291cG9uIGRldGFpbHNcIlxuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgc2V0TG9hZEVycm9yKG1lc3NhZ2UpXG4gICAgICAgICAgdG9hc3QuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2b2lkIGxvYWQoKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlXG4gICAgfVxuICB9LCBbYXBpQmFzZSwgaWRdKVxuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgcmV0dXJuIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPVwiTG9hZGluZyBjb3Vwb25cIiAvPlxuICB9XG5cbiAgaWYgKGxvYWRFcnJvcikge1xuICAgIHJldHVybiA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT17bG9hZEVycm9yfSAvPlxuICB9XG5cbiAgaWYgKCFkZXRhaWwpIHtcbiAgICByZXR1cm4gPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9XCJDb3Vwb24gbm90IGZvdW5kXCIgLz5cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFR3b0NvbHVtbkxheW91dFxuICAgICAgZmlyc3RDb2w9e1xuICAgICAgICA8PlxuICAgICAgICAgIDxDb3Vwb25HZW5lcmFsU2VjdGlvbiBkZXRhaWw9e2RldGFpbH0gLz5cbiAgICAgICAgICA8UmVsYXRlZE9yZGVyU2VjdGlvbiBhcGlCYXNlPXthcGlCYXNlfSBkZXRhaWw9e2RldGFpbH0gLz5cbiAgICAgICAgICA8Q291cG9uU25hcHNob3RzU2VjdGlvbiBkZXRhaWw9e2RldGFpbH0gLz5cbiAgICAgICAgPC8+XG4gICAgICB9XG4gICAgICBzZWNvbmRDb2w9ezxDb3Vwb25TdW1tYXJ5U2VjdGlvbnMgZGV0YWlsPXtkZXRhaWx9IC8+fVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRW50aXRsZW1lbnRzVGFibGUoe1xuICBlbnRpdGxlbWVudHMsXG4gIGxvYWRpbmcsXG4gIGVycm9yLFxuICBvbk9wZW4sXG59OiB7XG4gIGVudGl0bGVtZW50czogQ291cG9uRW50aXRsZW1lbnRbXVxuICBsb2FkaW5nOiBib29sZWFuXG4gIGVycm9yOiBzdHJpbmcgfCBudWxsXG4gIG9uT3BlbjogKGVudGl0bGVtZW50OiBDb3Vwb25FbnRpdGxlbWVudCkgPT4gdm9pZFxufSkge1xuICBpZiAobG9hZGluZykge1xuICAgIHJldHVybiA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT1cIkxvYWRpbmcgY291cG9uc1wiIC8+XG4gIH1cbiAgaWYgKGVycm9yKSB7XG4gICAgcmV0dXJuIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPXtlcnJvcn0gLz5cbiAgfVxuICBpZiAoIWVudGl0bGVtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPENvdXBvbkVtcHR5U3RhdGVcbiAgICAgICAgdGl0bGU9XCJObyBjb3Vwb25zIGZvdW5kXCJcbiAgICAgICAgZGVzY3JpcHRpb249XCJQdXJjaGFzZWQgY291cG9ucyB3aWxsIGFwcGVhciBoZXJlIGFmdGVyIHRoZXkgYXJlIGlzc3VlZC5cIlxuICAgICAgLz5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxUYWJsZT5cbiAgICAgIDxUYWJsZS5IZWFkZXI+XG4gICAgICAgIDxUYWJsZS5Sb3c+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+U3RhdHVzPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkNvZGU8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+RGF0ZSBpc3N1ZWQ8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+T3JkZXI8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q3VzdG9tZXI8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+T3JpZ2luPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlNlbGxlciBzY29wZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Tb3VyY2U8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+RXhwaXJlczwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICA8L1RhYmxlLkhlYWRlcj5cbiAgICAgIDxUYWJsZS5Cb2R5PlxuICAgICAgICB7ZW50aXRsZW1lbnRzLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgIDxUYWJsZS5Sb3dcbiAgICAgICAgICAgIGtleT17aXRlbS5pZH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImN1cnNvci1wb2ludGVyIGhvdmVyOmJnLXVpLWJnLXN1YnRsZVwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbk9wZW4oaXRlbSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgIDxTdGF0dXNCYWRnZSBjb2xvcj17ZW50aXRsZW1lbnRTdGF0dXNDb2xvcihpdGVtLnN0YXR1cyl9PlxuICAgICAgICAgICAgICAgIHtpdGVtLnN0YXR1c31cbiAgICAgICAgICAgICAgPC9TdGF0dXNCYWRnZT5cbiAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntpdGVtLmNvZGUgfHwgaXRlbS5zaGFyZWRfY29kZSB8fCBcIi1cIn08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbCB0aXRsZT17Zm9ybWF0RnVsbERhdGUoaXRlbS5jcmVhdGVkX2F0KX0+XG4gICAgICAgICAgICAgIHtmb3JtYXRSZWxhdGl2ZURhdGUoaXRlbS5jcmVhdGVkX2F0KX1cbiAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntpdGVtLm9yZGVyX2lkIHx8IFwiLVwifTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntpdGVtLmVtYWlsIHx8IGl0ZW0uY3VzdG9tZXJfaWQgfHwgXCItXCJ9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2VudGl0bGVtZW50U291cmNlKGl0ZW0pfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntlbnRpdGxlbWVudFNlbGxlclNjb3BlKGl0ZW0pfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICB7c25hcHNob3RTdHJpbmcoaXRlbS5zb3VyY2Vfc25hcHNob3QsIFwidGl0bGVcIikgfHxcbiAgICAgICAgICAgICAgICBzbmFwc2hvdFN0cmluZyhpdGVtLnNvdXJjZV9zbmFwc2hvdCwgXCJzb3VyY2VcIikgfHxcbiAgICAgICAgICAgICAgICBpdGVtLnByb2R1Y3RfaWQgfHxcbiAgICAgICAgICAgICAgICBcIkV4dGVybmFsXCJ9XG4gICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD57Zm9ybWF0RGF0ZShpdGVtLmV4cGlyZXNfYXQpfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgKSl9XG4gICAgICA8L1RhYmxlLkJvZHk+XG4gICAgPC9UYWJsZT5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQ291cG9uc1BhZ2VWaWV3KHtcbiAgYXBpQmFzZSxcbiAgdGl0bGUsXG59OiB7XG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgdGl0bGU6IHN0cmluZ1xufSkge1xuICBjb25zdCBbZW50aXRsZW1lbnRzLCBzZXRFbnRpdGxlbWVudHNdID0gdXNlU3RhdGU8Q291cG9uRW50aXRsZW1lbnRbXT4oW10pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbZmlsdGVyLCBzZXRGaWx0ZXJdID0gdXNlU3RhdGU8RW50aXRsZW1lbnRGaWx0ZXI+KFwiYWxsXCIpXG5cbiAgY29uc3QgbG9hZCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0TG9hZEVycm9yKG51bGwpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBhcGlGZXRjaDx7XG4gICAgICAgIGN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudHM6IENvdXBvbkVudGl0bGVtZW50W11cbiAgICAgIH0+KGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0cy9lbnRpdGxlbWVudHNgKVxuICAgICAgc2V0RW50aXRsZW1lbnRzKHBheWxvYWQuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50cyB8fCBbXSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJGYWlsZWQgdG8gbG9hZCBjb3Vwb25zXCJcbiAgICAgIHNldExvYWRFcnJvcihtZXNzYWdlKVxuICAgICAgdG9hc3QuZXJyb3IobWVzc2FnZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFthcGlCYXNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZvaWQgbG9hZCgpXG4gIH0sIFtsb2FkXSlcblxuICBjb25zdCBvcGVuRGV0YWlsID0gdXNlQ2FsbGJhY2soXG4gICAgKGVudGl0bGVtZW50OiBDb3Vwb25FbnRpdGxlbWVudCkgPT4ge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihjb3Vwb25EZXRhaWxQYXRoKGFwaUJhc2UsIGVudGl0bGVtZW50LmlkKSlcbiAgICB9LFxuICAgIFthcGlCYXNlXSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTYgcHktNFwiPlxuICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgxXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICAgICAgPEJ1dHRvbiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gdm9pZCBsb2FkKCl9PlxuICAgICAgICAgIDxBcnJvd1BhdGggLz5cbiAgICAgICAgICBSZWZyZXNoXG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8VGFic1xuICAgICAgICB2YWx1ZT17ZmlsdGVyfVxuICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+IHNldEZpbHRlcih2YWx1ZSBhcyBFbnRpdGxlbWVudEZpbHRlcil9XG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtNiBweS0yIGJvcmRlci1iXCI+XG4gICAgICAgICAgPFRhYnMuTGlzdD5cbiAgICAgICAgICAgIHtlbnRpdGxlbWVudEZpbHRlcnMubWFwKChpdGVtKSA9PiAoXG4gICAgICAgICAgICAgIDxUYWJzLlRyaWdnZXIga2V5PXtpdGVtLnZhbHVlfSB2YWx1ZT17aXRlbS52YWx1ZX0+XG4gICAgICAgICAgICAgICAge2l0ZW0ubGFiZWx9XG4gICAgICAgICAgICAgIDwvVGFicy5UcmlnZ2VyPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9UYWJzLkxpc3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7ZW50aXRsZW1lbnRGaWx0ZXJzLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgIDxUYWJzLkNvbnRlbnQga2V5PXtpdGVtLnZhbHVlfSB2YWx1ZT17aXRlbS52YWx1ZX0+XG4gICAgICAgICAgICA8RW50aXRsZW1lbnRzVGFibGVcbiAgICAgICAgICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgICAgICAgICAgZXJyb3I9e2xvYWRFcnJvcn1cbiAgICAgICAgICAgICAgb25PcGVuPXtvcGVuRGV0YWlsfVxuICAgICAgICAgICAgICBlbnRpdGxlbWVudHM9e1xuICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPT09IFwiYWxsXCJcbiAgICAgICAgICAgICAgICAgID8gZW50aXRsZW1lbnRzXG4gICAgICAgICAgICAgICAgICA6IGVudGl0bGVtZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgKGVudGl0bGVtZW50KSA9PiBlbnRpdGxlbWVudC5zdGF0dXMgPT09IGl0ZW0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1RhYnMuQ29udGVudD5cbiAgICAgICAgKSl9XG4gICAgICA8L1RhYnM+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvdXBvblByb2R1Y3RzUGFnZVZpZXcoe1xuICBhcGlCYXNlLFxuICB0aXRsZSxcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgPSBmYWxzZSxcbn06IHtcbiAgYXBpQmFzZTogQXBpQmFzZVxuICB0aXRsZTogc3RyaW5nXG4gIGFsbG93UHJvbW90aW9uTWlycm9yPzogYm9vbGVhblxufSkge1xuICByZXR1cm4gKFxuICAgIDxDb3Vwb25Qcm9kdWN0c1BhZ2VcbiAgICAgIGFwaUJhc2U9e2FwaUJhc2V9XG4gICAgICB0aXRsZT17dGl0bGV9XG4gICAgICBhbGxvd1Byb21vdGlvbk1pcnJvcj17YWxsb3dQcm9tb3Rpb25NaXJyb3J9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBMZWdhY3lDb3Vwb25Qcm9kdWN0c1BhZ2VWaWV3KHtcbiAgYXBpQmFzZSxcbiAgdGl0bGUsXG4gIGFsbG93UHJvbW90aW9uTWlycm9yID0gZmFsc2UsXG59OiB7XG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgdGl0bGU6IHN0cmluZ1xuICBhbGxvd1Byb21vdGlvbk1pcnJvcj86IGJvb2xlYW5cbn0pIHtcbiAgY29uc3QgW3Byb2R1Y3RzLCBzZXRQcm9kdWN0c10gPSB1c2VTdGF0ZTxDb3Vwb25Qcm9kdWN0Um93W10+KFtdKVxuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxPcHRpb25zUGF5bG9hZD4oe30pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbW9kYWxPcGVuLCBzZXRNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2FjdGl2ZVN0ZXAsIHNldEFjdGl2ZVN0ZXBdID0gdXNlU3RhdGU8V2l6YXJkU3RlcD4oXCJkZXRhaWxzXCIpXG4gIGNvbnN0IFtwcm9kdWN0Rm9ybSwgc2V0UHJvZHVjdEZvcm1dID0gdXNlU3RhdGU8UHJvZHVjdEZvcm1TdGF0ZT4oZW1wdHlQcm9kdWN0KVxuICBjb25zdCBbY291cG9uRm9ybSwgc2V0Q291cG9uRm9ybV0gPSB1c2VTdGF0ZTxDb3Vwb25Gb3JtU3RhdGU+KGVtcHR5Q291cG9uKVxuICBjb25zdCBbY2FtcGFpZ25Gb3JtLCBzZXRDYW1wYWlnbkZvcm1dID1cbiAgICB1c2VTdGF0ZTxDYW1wYWlnbkZvcm1TdGF0ZT4oZW1wdHlDYW1wYWlnbilcbiAgY29uc3QgcHJvbXB0ID0gdXNlUHJvbXB0KClcblxuICBjb25zdCBjb3Vwb25CYXNlID0gYCR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzYFxuXG4gIGNvbnN0IGxvYWQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0TG9hZGluZyh0cnVlKVxuICAgIHNldExvYWRFcnJvcihudWxsKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbcHJvZHVjdHNQYXlsb2FkLCBvcHRpb25zUGF5bG9hZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGFwaUZldGNoPHsgY291cG9uX3Byb2R1Y3RzOiBDb3Vwb25Qcm9kdWN0Um93W10gfT4oY291cG9uQmFzZSksXG4gICAgICAgIGFwaUZldGNoPE9wdGlvbnNQYXlsb2FkPihgJHtjb3Vwb25CYXNlfS9vcHRpb25zYCksXG4gICAgICBdKVxuICAgICAgc2V0UHJvZHVjdHMocHJvZHVjdHNQYXlsb2FkLmNvdXBvbl9wcm9kdWN0cyB8fCBbXSlcbiAgICAgIHNldE9wdGlvbnMob3B0aW9uc1BheWxvYWQgfHwge30pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBcIkZhaWxlZCB0byBsb2FkIGNvdXBvbiBwcm9kdWN0c1wiXG4gICAgICBzZXRMb2FkRXJyb3IobWVzc2FnZSlcbiAgICAgIHRvYXN0LmVycm9yKG1lc3NhZ2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9LCBbY291cG9uQmFzZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB2b2lkIGxvYWQoKVxuICB9LCBbbG9hZF0pXG5cbiAgY29uc3Qgb3B0aW9uRGVmYXVsdHMgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBzYWxlc19jaGFubmVsX2lkOiBvcHRpb25zLnNhbGVzX2NoYW5uZWxzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgICBjdXJyZW5jeV9jb2RlOlxuICAgICAgICBvcHRpb25zLmN1cnJlbmNpZXM/LmZpbmQoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5pc19kZWZhdWx0KT8uY29kZSB8fFxuICAgICAgICBvcHRpb25zLmN1cnJlbmNpZXM/LlswXT8uY29kZSB8fFxuICAgICAgICBcIlwiLFxuICAgIH0pLFxuICAgIFtvcHRpb25zXSxcbiAgKVxuXG4gIGNvbnN0IGN1cnJlbmNpZXMgPSBvcHRpb25zLmN1cnJlbmNpZXMgfHwgW11cbiAgY29uc3Qgc3VwcG9ydGVkQ3VycmVuY3lDb2RlcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gbmV3IFNldChjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpKSxcbiAgICBbY3VycmVuY2llc10sXG4gIClcblxuICBjb25zdCB1cGRhdGVQcm9kdWN0ID1cbiAgICAoZmllbGQ6IGtleW9mIFByb2R1Y3RGb3JtU3RhdGUpID0+XG4gICAgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICBbZmllbGRdOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICB9KSlcbiAgICB9XG5cbiAgY29uc3QgdXBkYXRlQ291cG9uID1cbiAgICAoZmllbGQ6IGtleW9mIENvdXBvbkZvcm1TdGF0ZSkgPT5cbiAgICAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBbZmllbGRdOiBldmVudC50YXJnZXQudmFsdWUgfSkpXG4gICAgfVxuXG4gIGNvbnN0IHVwZGF0ZUNhbXBhaWduID1cbiAgICAoZmllbGQ6IGtleW9mIENhbXBhaWduRm9ybVN0YXRlKSA9PlxuICAgIChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIHNldENhbXBhaWduRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgW2ZpZWxkXTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgfSkpXG4gICAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5DcmVhdGUoKSB7XG4gICAgY29uc3QgY3VycmVuY3lDb2RlID0gb3B0aW9uRGVmYXVsdHMuY3VycmVuY3lfY29kZVxuICAgIHNldFByb2R1Y3RGb3JtKHtcbiAgICAgIC4uLmVtcHR5UHJvZHVjdCxcbiAgICAgIC4uLm9wdGlvbkRlZmF1bHRzLFxuICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIC4uLmVtcHR5VmFyaWFudCxcbiAgICAgICAgICBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgICAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuICAgIHNldENvdXBvbkZvcm0oeyAuLi5lbXB0eUNvdXBvbiwgY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlIH0pXG4gICAgc2V0Q2FtcGFpZ25Gb3JtKGVtcHR5Q2FtcGFpZ24pXG4gICAgc2V0QWN0aXZlU3RlcChcImRldGFpbHNcIilcbiAgICBzZXRNb2RhbE9wZW4odHJ1ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5FZGl0KHJvdzogQ291cG9uUHJvZHVjdFJvdykge1xuICAgIGNvbnN0IGZvcm1zID0gZm9ybUZyb21Sb3cocm93LCBvcHRpb25EZWZhdWx0cy5jdXJyZW5jeV9jb2RlKVxuICAgIHNldFByb2R1Y3RGb3JtKHtcbiAgICAgIC4uLmZvcm1zLnByb2R1Y3QsXG4gICAgICB2YXJpYW50czogZm9ybXMucHJvZHVjdC52YXJpYW50cy5sZW5ndGhcbiAgICAgICAgPyBmb3Jtcy5wcm9kdWN0LnZhcmlhbnRzXG4gICAgICAgIDogW3sgLi4uZW1wdHlWYXJpYW50IH1dLFxuICAgIH0pXG4gICAgc2V0Q291cG9uRm9ybShmb3Jtcy5jb3Vwb24pXG4gICAgc2V0Q2FtcGFpZ25Gb3JtKGZvcm1zLmNhbXBhaWduKVxuICAgIHNldEFjdGl2ZVN0ZXAoXCJkZXRhaWxzXCIpXG4gICAgc2V0TW9kYWxPcGVuKHRydWUpXG4gIH1cblxuICBmdW5jdGlvbiBzZXRWYXJpYW50KGluZGV4OiBudW1iZXIsIHBhdGNoOiBQYXJ0aWFsPFZhcmlhbnRGb3JtU3RhdGU+KSB7XG4gICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgdmFyaWFudHM6IGN1cnJlbnQudmFyaWFudHMubWFwKCh2YXJpYW50LCB2YXJpYW50SW5kZXgpID0+XG4gICAgICAgIHZhcmlhbnRJbmRleCA9PT0gaW5kZXggPyB7IC4uLnZhcmlhbnQsIC4uLnBhdGNoIH0gOiB2YXJpYW50LFxuICAgICAgKSxcbiAgICB9KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFZhcmlhbnQoKSB7XG4gICAgY29uc3QgY3VycmVuY3lDb2RlID1cbiAgICAgIGNvdXBvbkZvcm0uY3VycmVuY3lfY29kZSB8fCBvcHRpb25EZWZhdWx0cy5jdXJyZW5jeV9jb2RlXG4gICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgLi4uY3VycmVudC52YXJpYW50cyxcbiAgICAgICAge1xuICAgICAgICAgIC4uLmVtcHR5VmFyaWFudCxcbiAgICAgICAgICBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgICAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZVZhcmlhbnQoaW5kZXg6IG51bWJlcikge1xuICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHZhcmlhbnRzOiBjdXJyZW50LnZhcmlhbnRzLmZpbHRlcihcbiAgICAgICAgKF8sIHZhcmlhbnRJbmRleCkgPT4gdmFyaWFudEluZGV4ICE9PSBpbmRleCxcbiAgICAgICksXG4gICAgfSkpXG4gIH1cblxuICBmdW5jdGlvbiBwcm9kdWN0UGF5bG9hZChpbmNsdWRlVmFyaWFudHM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwcm9kdWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIHRpdGxlOiBwcm9kdWN0Rm9ybS50aXRsZSxcbiAgICAgIHN1YnRpdGxlOiBwcm9kdWN0Rm9ybS5zdWJ0aXRsZSB8fCBudWxsLFxuICAgICAgaGFuZGxlOiBwcm9kdWN0Rm9ybS5oYW5kbGUgfHwgbnVsbCxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9kdWN0Rm9ybS5kZXNjcmlwdGlvbiB8fCBudWxsLFxuICAgICAgc3RhdHVzOiBwcm9kdWN0Rm9ybS5zdGF0dXMsXG4gICAgICB0aHVtYm5haWw6IHByb2R1Y3RGb3JtLnRodW1ibmFpbCB8fCBudWxsLFxuICAgICAgZGlzY291bnRhYmxlOiBwcm9kdWN0Rm9ybS5kaXNjb3VudGFibGUsXG4gICAgICB0eXBlX2lkOiBwcm9kdWN0Rm9ybS50eXBlX2lkIHx8IG51bGwsXG4gICAgICBjb2xsZWN0aW9uX2lkOiBwcm9kdWN0Rm9ybS5jb2xsZWN0aW9uX2lkIHx8IG51bGwsXG4gICAgICBjYXRlZ29yaWVzOiBwcm9kdWN0Rm9ybS5jYXRlZ29yeV9pZFxuICAgICAgICA/IFt7IGlkOiBwcm9kdWN0Rm9ybS5jYXRlZ29yeV9pZCB9XVxuICAgICAgICA6IFtdLFxuICAgICAgdGFnczogcHJvZHVjdEZvcm0udGFnX2lkID8gW3sgaWQ6IHByb2R1Y3RGb3JtLnRhZ19pZCB9XSA6IFtdLFxuICAgICAgc2FsZXNfY2hhbm5lbHM6IHByb2R1Y3RGb3JtLnNhbGVzX2NoYW5uZWxfaWRcbiAgICAgICAgPyBbeyBpZDogcHJvZHVjdEZvcm0uc2FsZXNfY2hhbm5lbF9pZCB9XVxuICAgICAgICA6IFtdLFxuICAgIH1cblxuICAgIGlmIChpbmNsdWRlVmFyaWFudHMpIHtcbiAgICAgIHByb2R1Y3QudmFyaWFudHMgPSBwcm9kdWN0Rm9ybS52YXJpYW50cy5tYXAoKHZhcmlhbnQpID0+ICh7XG4gICAgICAgIHRpdGxlOiB2YXJpYW50LnRpdGxlLFxuICAgICAgICBza3U6IHZhcmlhbnQuc2t1IHx8IG51bGwsXG4gICAgICAgIG1hbmFnZV9pbnZlbnRvcnk6IGZhbHNlLFxuICAgICAgICBhbGxvd19iYWNrb3JkZXI6IHRydWUsXG4gICAgICAgIHByaWNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IHZhcmlhbnQuY3VycmVuY3lfY29kZS50cmltKCkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIGFtb3VudDogTnVtYmVyKHZhcmlhbnQuYW1vdW50KSB8fCAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KSlcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvZHVjdFxuICB9XG5cbiAgZnVuY3Rpb24gdmFyaWFudE92ZXJyaWRlcygpIHtcbiAgICByZXR1cm4gcHJvZHVjdEZvcm0udmFyaWFudHNcbiAgICAgIC5tYXAoKHZhcmlhbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmICghdmFyaWFudC5vdmVycmlkZV9lbmFibGVkKSByZXR1cm4gbnVsbFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhcmlhbnRfaW5kZXg6IGluZGV4LFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYmVuZWZpdF90eXBlOiB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSxcbiAgICAgICAgICBhbW91bnQ6XG4gICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICAgICAgICA/IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX2Ftb3VudClcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHBlcmNlbnRhZ2U6XG4gICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCJcbiAgICAgICAgICAgICAgPyBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9wZXJjZW50YWdlKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgY3VycmVuY3lfY29kZTpcbiAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgID8gdmFyaWFudC5vdmVycmlkZV9jdXJyZW5jeV9jb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgICAgICAgICAgY291cG9uRm9ybS5jdXJyZW5jeV9jb2RlXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRm9ybSgpIHtcbiAgICBpZiAoIXByb2R1Y3RGb3JtLnRpdGxlLnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvZHVjdCB0aXRsZSBpcyByZXF1aXJlZFwiKVxuICAgIH1cbiAgICBpZiAoIXByb2R1Y3RGb3JtLmlkICYmICFwcm9kdWN0Rm9ybS52YXJpYW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSBwcm9kdWN0IHZhcmlhbnQgaXMgcmVxdWlyZWRcIilcbiAgICB9XG4gICAgaWYgKCFjdXJyZW5jaWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGEgc3VwcG9ydGVkIGN1cnJlbmN5IHRvIHRoZSBzdG9yZSBiZWZvcmUgY29udGludWluZ1wiKVxuICAgIH1cbiAgICBpZiAoIXByb2R1Y3RGb3JtLmlkKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhcmlhbnQgb2YgcHJvZHVjdEZvcm0udmFyaWFudHMpIHtcbiAgICAgICAgaWYgKCFzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLmhhcyh2YXJpYW50LmN1cnJlbmN5X2NvZGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWxlY3QgYW4gYXZhaWxhYmxlIGN1cnJlbmN5IGZvciAke3ZhcmlhbnQudGl0bGV9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgICAgbnVtYmVyT3JOdWxsKGNvdXBvbkZvcm0uYW1vdW50KSA9PSBudWxsXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHBvc2l0aXZlIGNvdXBvbiBhbW91bnQgaXMgcmVxdWlyZWRcIilcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY291cG9uRm9ybS5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiZcbiAgICAgICFzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLmhhcyhjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3QgYW4gYXZhaWxhYmxlIGNvdXBvbiBjdXJyZW5jeVwiKVxuICAgIH1cbiAgICBpZiAoY291cG9uRm9ybS5iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiKSB7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gbnVtYmVyT3JOdWxsKGNvdXBvbkZvcm0ucGVyY2VudGFnZSlcbiAgICAgIGlmIChwZXJjZW50YWdlID09IG51bGwgfHwgcGVyY2VudGFnZSA+IDEwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3Vwb24gcGVyY2VudGFnZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvdXBvbkZvcm0uY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiICYmXG4gICAgICAhY291cG9uRm9ybS5zaGFyZWRfY29kZS50cmltKClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgc2hhcmVkIGNvdXBvbiBjb2RlIGlzIHJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmIChjb3Vwb25Gb3JtLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiKSB7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gbmV3IERhdGUoY291cG9uRm9ybS5leHBpcmF0aW9uX2RhdGUpXG4gICAgICBpZiAoIWNvdXBvbkZvcm0uZXhwaXJhdGlvbl9kYXRlIHx8IE51bWJlci5pc05hTihleHBpcmF0aW9uLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB2YWxpZCBmaXhlZCBleHBpcmF0aW9uIGRhdGUgaXMgcmVxdWlyZWRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYXQpIHtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb25DYXAgPSBuZXcgRGF0ZShjb3Vwb25Gb3JtLmV4cGlyYXRpb25fY2FwX2F0KVxuICAgICAgaWYgKE51bWJlci5pc05hTihleHBpcmF0aW9uQ2FwLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB2YWxpZCBleHBpcmF0aW9uIGNhcCBkYXRlIGlzIHJlcXVpcmVkXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFudCBvZiBwcm9kdWN0Rm9ybS52YXJpYW50cykge1xuICAgICAgaWYgKCF2YXJpYW50Lm92ZXJyaWRlX2VuYWJsZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgICAgIG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX2Ftb3VudCkgPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQSBwb3NpdGl2ZSBjb3Vwb24gYW1vdW50IGlzIHJlcXVpcmVkIGZvciAke3ZhcmlhbnQudGl0bGV9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgICAgICAhc3VwcG9ydGVkQ3VycmVuY3lDb2Rlcy5oYXModmFyaWFudC5vdmVycmlkZV9jdXJyZW5jeV9jb2RlKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2VsZWN0IGFuIGF2YWlsYWJsZSBjb3Vwb24gY3VycmVuY3kgZm9yICR7dmFyaWFudC50aXRsZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAodmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9wZXJjZW50YWdlKVxuICAgICAgICBpZiAocGVyY2VudGFnZSA9PSBudWxsIHx8IHBlcmNlbnRhZ2UgPiAxMDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ291cG9uIHBlcmNlbnRhZ2UgZm9yICR7dmFyaWFudC50aXRsZX0gbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMGAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGFsbG93UHJvbW90aW9uTWlycm9yICYmXG4gICAgICBjYW1wYWlnbkZvcm0ubW9kZSA9PT0gXCJleGlzdGluZ1wiICYmXG4gICAgICAhY2FtcGFpZ25Gb3JtLmNhbXBhaWduX2lkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3QgYW4gZXhpc3RpbmcgY2FtcGFpZ25cIilcbiAgICB9XG4gICAgaWYgKFxuICAgICAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgJiZcbiAgICAgIGNhbXBhaWduRm9ybS5tb2RlID09PSBcIm5ld1wiICYmXG4gICAgICAoIWNhbXBhaWduRm9ybS5uYW1lLnRyaW0oKSB8fCAhY2FtcGFpZ25Gb3JtLmNhbXBhaWduX2lkZW50aWZpZXIudHJpbSgpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FtcGFpZ24gbmFtZSBhbmQgaWRlbnRpZmllciBhcmUgcmVxdWlyZWRcIilcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzeW5jVmFyaWFudE92ZXJyaWRlcyhwcm9kdWN0SWQ6IHN0cmluZykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcHJvZHVjdEZvcm0udmFyaWFudHMubWFwKGFzeW5jICh2YXJpYW50KSA9PiB7XG4gICAgICAgIGlmICghdmFyaWFudC5pZCkgcmV0dXJuXG5cbiAgICAgICAgaWYgKCF2YXJpYW50Lm92ZXJyaWRlX2VuYWJsZWQpIHtcbiAgICAgICAgICBpZiAodmFyaWFudC5vdmVycmlkZV9jb25maWdfaWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGFwaUZldGNoKGAke2NvdXBvbkJhc2V9LyR7cHJvZHVjdElkfS92YXJpYW50c2AsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHZhcmlhbnRfaWQ6IHZhcmlhbnQuaWQsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBhcGlGZXRjaChgJHtjb3Vwb25CYXNlfS8ke3Byb2R1Y3RJZH0vdmFyaWFudHNgLCB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB2YXJpYW50X2lkOiB2YXJpYW50LmlkLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGJlbmVmaXRfdHlwZTogdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUsXG4gICAgICAgICAgICBhbW91bnQ6XG4gICAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgICAgPyBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9hbW91bnQpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgcGVyY2VudGFnZTpcbiAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiXG4gICAgICAgICAgICAgICAgPyBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9wZXJjZW50YWdlKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbmN5X2NvZGU6XG4gICAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgICAgPyB2YXJpYW50Lm92ZXJyaWRlX2N1cnJlbmN5X2NvZGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgICAgICAgIGNvdXBvbkZvcm0uY3VycmVuY3lfY29kZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVQcm9kdWN0KCkge1xuICAgIHNldFNhdmluZyh0cnVlKVxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUZvcm0oKVxuICAgICAgY29uc3QgaXNFZGl0ID0gQm9vbGVhbihwcm9kdWN0Rm9ybS5pZClcbiAgICAgIGNvbnN0IHBhdGggPSBpc0VkaXQgPyBgJHtjb3Vwb25CYXNlfS8ke3Byb2R1Y3RGb3JtLmlkfWAgOiBjb3Vwb25CYXNlXG4gICAgICBjb25zdCBtZXRob2QgPSBpc0VkaXQgPyBcIlBBVENIXCIgOiBcIlBPU1RcIlxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcHJvZHVjdDogcHJvZHVjdFBheWxvYWQoIWlzRWRpdCksXG4gICAgICAgIGNvdXBvbjogYnVpbGRDb3Vwb25QYXlsb2FkKGNvdXBvbkZvcm0sIGFsbG93UHJvbW90aW9uTWlycm9yKSxcbiAgICAgICAgY2FtcGFpZ246IGJ1aWxkQ2FtcGFpZ25QYXlsb2FkKGNhbXBhaWduRm9ybSwgYWxsb3dQcm9tb3Rpb25NaXJyb3IpLFxuICAgICAgICBzZWxsZXJfaWQ6IHByb2R1Y3RGb3JtLnNlbGxlcl9pZCB8fCBudWxsLFxuICAgICAgICB2YXJpYW50X292ZXJyaWRlczogaXNFZGl0ID8gW10gOiB2YXJpYW50T3ZlcnJpZGVzKCksXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGFwaUZldGNoKHBhdGgsIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgIH0pXG4gICAgICBpZiAoaXNFZGl0KSB7XG4gICAgICAgIGF3YWl0IHN5bmNWYXJpYW50T3ZlcnJpZGVzKHByb2R1Y3RGb3JtLmlkKVxuICAgICAgfVxuICAgICAgdG9hc3Quc3VjY2VzcyhcbiAgICAgICAgaXNFZGl0ID8gXCJDb3Vwb24gcHJvZHVjdCB1cGRhdGVkXCIgOiBcIkNvdXBvbiBwcm9kdWN0IGNyZWF0ZWRcIixcbiAgICAgIClcbiAgICAgIHNldE1vZGFsT3BlbihmYWxzZSlcbiAgICAgIGF3YWl0IGxvYWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgIDogXCJGYWlsZWQgdG8gc2F2ZSBjb3Vwb24gcHJvZHVjdFwiLFxuICAgICAgKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTYXZpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlUHJvZHVjdChyb3c6IENvdXBvblByb2R1Y3RSb3cpIHtcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBwcm9tcHQoe1xuICAgICAgdGl0bGU6IFwiUmVtb3ZlIGNvdXBvbiBwcm9kdWN0P1wiLFxuICAgICAgZGVzY3JpcHRpb246IGBUaGlzIHJlbW92ZXMgY291cG9uIGlzc3VhbmNlIGZyb20gJHtcbiAgICAgICAgcm93LnByb2R1Y3QudGl0bGUgfHwgcm93LnByb2R1Y3QuaWRcbiAgICAgIH0uIFRoZSB1bmRlcmx5aW5nIE1lZHVzYSBwcm9kdWN0IHdpbGwgcmVtYWluIGF2YWlsYWJsZS5gLFxuICAgICAgY29uZmlybVRleHQ6IFwiUmVtb3ZlIHByb2R1Y3RcIixcbiAgICAgIGNhbmNlbFRleHQ6IFwiQ2FuY2VsXCIsXG4gICAgICB2YXJpYW50OiBcImRhbmdlclwiLFxuICAgIH0pXG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUZldGNoKGAke2NvdXBvbkJhc2V9LyR7cm93LnByb2R1Y3QuaWR9YCwgeyBtZXRob2Q6IFwiREVMRVRFXCIgfSlcbiAgICAgIHRvYXN0LnN1Y2Nlc3MoXCJDb3Vwb24gY29uZmlndXJhdGlvbiByZW1vdmVkXCIpXG4gICAgICBhd2FpdCBsb2FkKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFwiRmFpbGVkIHRvIHJlbW92ZSBjb3Vwb24gcHJvZHVjdFwiLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG1pcnJvclByb21vdGlvbihyb3c6IENvdXBvblByb2R1Y3RSb3cpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXBpRmV0Y2goXG4gICAgICAgIGAvYWRtaW4vY291cG9uLXByb2R1Y3RzLyR7cm93LnByb2R1Y3QuaWR9L21pcnJvci1wcm9tb3Rpb25gLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7fSksXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICB0b2FzdC5zdWNjZXNzKFwiUHJvbW90aW9uIG1pcnJvciBjcmVhdGVkXCIpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJNaXJyb3IgZmFpbGVkXCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY3VycmVudFN0ZXBJbmRleCA9IHN0ZXBzLmluZGV4T2YoYWN0aXZlU3RlcClcbiAgY29uc3QgY2FuR29CYWNrID0gY3VycmVudFN0ZXBJbmRleCA+IDBcbiAgY29uc3QgY2FuR29OZXh0ID0gY3VycmVudFN0ZXBJbmRleCA8IHN0ZXBzLmxlbmd0aCAtIDFcbiAgY29uc3Qgc2hvd0NhbXBhaWduU3RlcCA9IGFsbG93UHJvbW90aW9uTWlycm9yXG4gIGNvbnN0IHZpc2libGVTdGVwcyA9IHNob3dDYW1wYWlnblN0ZXBcbiAgICA/IHN0ZXBzXG4gICAgOiBzdGVwcy5maWx0ZXIoKHN0ZXApID0+IHN0ZXAgIT09IFwiY2FtcGFpZ25cIilcblxuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwiZGl2aWRlLXkgcC0wXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC02IHB5LTRcIj5cbiAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMVwiPnt0aXRsZX08L0hlYWRpbmc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMlwiPlxuICAgICAgICAgIDxCdXR0b24gc2l6ZT1cInNtYWxsXCIgdmFyaWFudD1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpID0+IHZvaWQgbG9hZCgpfT5cbiAgICAgICAgICAgIDxBcnJvd1BhdGggLz5cbiAgICAgICAgICAgIFJlZnJlc2hcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8QnV0dG9uIHNpemU9XCJzbWFsbFwiIG9uQ2xpY2s9e29wZW5DcmVhdGV9PlxuICAgICAgICAgICAgPFBsdXMgLz5cbiAgICAgICAgICAgIENyZWF0ZVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPVwiTG9hZGluZyBjb3Vwb24gcHJvZHVjdHNcIiAvPlxuICAgICAgKSA6IGxvYWRFcnJvciA/IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9e2xvYWRFcnJvcn0gLz5cbiAgICAgICkgOiBwcm9kdWN0cy5sZW5ndGggPyAoXG4gICAgICAgIDxUYWJsZT5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyPlxuICAgICAgICAgICAgPFRhYmxlLlJvdz5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+UHJvZHVjdDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+U3RhdHVzPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5CZW5lZml0PC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Db2RlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5DYW1wYWlnbjwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+SXNzdWVkPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbCAvPlxuICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgPC9UYWJsZS5IZWFkZXI+XG4gICAgICAgICAgPFRhYmxlLkJvZHk+XG4gICAgICAgICAgICB7cHJvZHVjdHMubWFwKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gcm93LmNvdXBvbl9wcm9kdWN0X2NvbmZpZ1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxUYWJsZS5Sb3cga2V5PXtyb3cuaWR9PlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtyb3cucHJvZHVjdC50aXRsZSB8fCByb3cucHJvZHVjdC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3Jvdy5wcm9kdWN0LmhhbmRsZSB8fCByb3cucHJvZHVjdC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxTdGF0dXNCYWRnZSBjb2xvcj17cHJvZHVjdFN0YXR1c0NvbG9yKHJvdy5wcm9kdWN0LnN0YXR1cyl9PlxuICAgICAgICAgICAgICAgICAgICAgIHtyb3cucHJvZHVjdC5zdGF0dXMgfHwgXCJkcmFmdFwifVxuICAgICAgICAgICAgICAgICAgICA8L1N0YXR1c0JhZGdlPlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2JlbmVmaXRMYWJlbChjb25maWcpfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICB7Y29uZmlnLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgID8gY29uZmlnLnNoYXJlZF9jb2RlIHx8IFwiLVwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBjb25maWcuY29kZV9wcmVmaXggfHwgXCJDT1VQT05cIn1cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPntjYW1wYWlnbkxhYmVsKGNvbmZpZyl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e3Jvdy5lbnRpdGxlbWVudHNfY291bnQgfHwgMH08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBtaXJyb3JQcm9tb3Rpb24ocm93KX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgTWlycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9wZW5FZGl0KHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBlbmNpbFNxdWFyZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgZGVsZXRlUHJvZHVjdChyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUcmFzaCAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9UYWJsZS5Cb2R5PlxuICAgICAgICA8L1RhYmxlPlxuICAgICAgKSA6IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGVcbiAgICAgICAgICB0aXRsZT1cIk5vIGNvdXBvbiBwcm9kdWN0cyBmb3VuZFwiXG4gICAgICAgICAgZGVzY3JpcHRpb249XCJDcmVhdGUgYSBuZXcgY291cG9uIHByb2R1Y3QgdG8gZ2V0IHN0YXJ0ZWQuXCJcbiAgICAgICAgLz5cbiAgICAgICl9XG5cbiAgICAgIDxGb2N1c01vZGFsIG9wZW49e21vZGFsT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXRNb2RhbE9wZW59PlxuICAgICAgICA8Rm9jdXNNb2RhbC5Db250ZW50IHN0eWxlPXttb2RhbENvbnRlbnRTdHlsZX0+XG4gICAgICAgICAgPEZvY3VzTW9kYWwuSGVhZGVyIHN0eWxlPXttb2RhbFN0YXRpY1Jvd1N0eWxlfT5cbiAgICAgICAgICAgIDxGb2N1c01vZGFsLlRpdGxlPlxuICAgICAgICAgICAgICB7cHJvZHVjdEZvcm0uaWQgPyBcIkVkaXQgQ291cG9uIFByb2R1Y3RcIiA6IFwiQ3JlYXRlIENvdXBvbiBQcm9kdWN0XCJ9XG4gICAgICAgICAgICA8L0ZvY3VzTW9kYWwuVGl0bGU+XG4gICAgICAgICAgPC9Gb2N1c01vZGFsLkhlYWRlcj5cbiAgICAgICAgICA8UHJvZ3Jlc3NUYWJzXG4gICAgICAgICAgICB2YWx1ZT17YWN0aXZlU3RlcH1cbiAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT4gc2V0QWN0aXZlU3RlcCh2YWx1ZSBhcyBXaXphcmRTdGVwKX1cbiAgICAgICAgICAgIHN0eWxlPXttb2RhbFdpemFyZFN0eWxlfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuTGlzdCBjbGFzc05hbWU9XCJib3JkZXItYlwiIHN0eWxlPXttb2RhbFN0YXRpY1Jvd1N0eWxlfT5cbiAgICAgICAgICAgICAge3Zpc2libGVTdGVwcy5tYXAoKHN0ZXApID0+IChcbiAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLlRyaWdnZXJcbiAgICAgICAgICAgICAgICAgIGtleT17c3RlcH1cbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtzdGVwfVxuICAgICAgICAgICAgICAgICAgc3RhdHVzPXtzdGVwU3RhdHVzKHN0ZXAsIGFjdGl2ZVN0ZXApfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtzdGVwID09PSBcImRldGFpbHNcIlxuICAgICAgICAgICAgICAgICAgICA/IFwiRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIDogc3RlcCA9PT0gXCJvcmdhbml6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIk9yZ2FuaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IHN0ZXAgPT09IFwidmFyaWFudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIlZhcmlhbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogc3RlcCA9PT0gXCJjb3Vwb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiQ291cG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIkNhbXBhaWduXCJ9XG4gICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5MaXN0PlxuICAgICAgICAgICAgPEZvY3VzTW9kYWwuQm9keSBzdHlsZT17bW9kYWxCb2R5U3R5bGV9PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXttb2RhbEZvcm1TdHlsZX0+XG4gICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwiZGV0YWlsc1wiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3RocmVlQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQcm9kdWN0KFwidGl0bGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5zdWJ0aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQcm9kdWN0KFwic3VidGl0bGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiSGFuZGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uaGFuZGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVByb2R1Y3QoXCJoYW5kbGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlUHJvZHVjdChcImRlc2NyaXB0aW9uXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk1lZGlhIFVSTFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnRodW1ibmFpbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQcm9kdWN0KFwidGh1bWJuYWlsXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuXG4gICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwib3JnYW5pemVcIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uc3RhdHVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZHJhZnRcIj5EcmFmdDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInB1Ymxpc2hlZFwiPlB1Ymxpc2hlZDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInByb3Bvc2VkXCI+UHJvcG9zZWQ8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJyZWplY3RlZFwiPlJlamVjdGVkPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIHthcGlCYXNlID09PSBcIi9hZG1pblwiICYmICFwcm9kdWN0Rm9ybS5pZCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU2VsbGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5zZWxsZXJfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMuc2VsbGVycyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxsZXJfaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0udHlwZV9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF90eXBlcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvbGxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uY29sbGVjdGlvbl9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF9jb2xsZWN0aW9ucyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbl9pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLmNhdGVnb3J5X2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X2NhdGVnb3JpZXMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVGFnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnRhZ19pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF90YWdzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdfaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTYWxlcyBjaGFubmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnNhbGVzX2NoYW5uZWxfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnNhbGVzX2NoYW5uZWxzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWxlc19jaGFubmVsX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cGFuZWxTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3Jvd0JldHdlZW5TdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5EaXNjb3VudGFibGU8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdW50cyBjYW4gYXBwbHkgdG8gdGhpcyBwcm9kdWN0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17cHJvZHVjdEZvcm0uZGlzY291bnRhYmxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudGFibGU6IEJvb2xlYW4oY2hlY2tlZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cblxuICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cInZhcmlhbnRzXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMlwiPlZhcmlhbnRzPC9IZWFkaW5nPlxuICAgICAgICAgICAgICAgICAgICB7IXByb2R1Y3RGb3JtLmlkICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXthZGRWYXJpYW50fVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQbHVzIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICBBZGQgdmFyaWFudFxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktNFwiPlxuICAgICAgICAgICAgICAgICAgICB7cHJvZHVjdEZvcm0udmFyaWFudHMubWFwKCh2YXJpYW50LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtgJHt2YXJpYW50LmlkIHx8IGluZGV4fWB9IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e2ZvdXJDb2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUaXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQudGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Qm9vbGVhbihwcm9kdWN0Rm9ybS5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7IHRpdGxlOiBldmVudC50YXJnZXQudmFsdWUgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTS1VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50LnNrdX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKHByb2R1Y3RGb3JtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHsgc2t1OiBldmVudC50YXJnZXQudmFsdWUgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDdXJyZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50LmN1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Qm9vbGVhbihwcm9kdWN0Rm9ybS5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGN1cnJlbmN5X2NvZGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeV9jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlByaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5QW1vdW50SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU9e3ZhcmlhbnQuY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50LmFtb3VudH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKHByb2R1Y3RGb3JtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoYW1vdW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogMTYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogMTYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3Jvd0JldHdlZW5TdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPkNvdXBvbiBiZW5lZml0IG92ZXJyaWRlPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3ZhcmlhbnQub3ZlcnJpZGVfZW5hYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9lbmFibGVkOiBCb29sZWFuKGNoZWNrZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFyaWFudC5vdmVycmlkZV9lbmFibGVkICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyAuLi5mb3VyQ29sdW1uR3JpZFN0eWxlLCBtYXJnaW5Ub3A6IDEyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQmVuZWZpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVfYmVuZWZpdF90eXBlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFzIEJlbmVmaXRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmaXhlZF9hbW91bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWQgYW1vdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwicGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJjZW50YWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZnJlZV9zaGlwcGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIHNoaXBwaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkN1cnJlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQub3ZlcnJpZGVfY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhvdmVycmlkZV9jdXJyZW5jeV9jb2RlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQW1vdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeUFtb3VudElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU9e3ZhcmlhbnQub3ZlcnJpZGVfY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5vdmVycmlkZV9hbW91bnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgIT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsob3ZlcnJpZGVfYW1vdW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9hbW91bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQZXJjZW50YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50Lm92ZXJyaWRlX3BlcmNlbnRhZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgIT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBlcmNlbnRhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9wZXJjZW50YWdlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHshcHJvZHVjdEZvcm0uaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Rm9ybS52YXJpYW50cy5sZW5ndGggPiAxICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IG1hcmdpblRvcDogMTYgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHJlbW92ZVZhcmlhbnQoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgdmFyaWFudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG5cbiAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJjb3Vwb25cIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPkNvdXBvbiBpc3N1YW5jZTwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgSXNzdWUgY291cG9ucyB3aGVuIGN1c3RvbWVycyBwdXJjaGFzZSB0aGlzIHByb2R1Y3RcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtjb3Vwb25Gb3JtLmVuYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogQm9vbGVhbihjaGVja2VkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkJlbmVmaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5iZW5lZml0X3R5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5lZml0X3R5cGU6IHZhbHVlIGFzIEJlbmVmaXRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZpeGVkX2Ftb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIGFtb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJwZXJjZW50YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyY2VudGFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmcmVlX3NoaXBwaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBzaGlwcGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQcm9tb3Rpb24gc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLnByb21vdGlvbl9zdGF0dXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9zdGF0dXM6IHZhbHVlIGFzIFByb21vdGlvblN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZHJhZnRcIj5EcmFmdDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiYWN0aXZlXCI+QWN0aXZlPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJpbmFjdGl2ZVwiPkluYWN0aXZlPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkFtb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeUFtb3VudElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlPXtjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uRm9ybS5iZW5lZml0X3R5cGUgIT09IFwiZml4ZWRfYW1vdW50XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5hbW91bnR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGFtb3VudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYW1vdW50IH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlBlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2NvdXBvbkZvcm0uYmVuZWZpdF90eXBlICE9PSBcInBlcmNlbnRhZ2VcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLnBlcmNlbnRhZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwicGVyY2VudGFnZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDdXJyZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uRm9ybS5iZW5lZml0X3R5cGUgIT09IFwiZml4ZWRfYW1vdW50XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGN1cnJlbmN5X2NvZGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeV9jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIHBvbGljeVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmV4cGlyYXRpb25fdHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fdHlwZTogdmFsdWUgYXMgRXhwaXJhdGlvblBvbGljeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZHVyYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiBhZnRlciBpc3N1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmaXhlZFwiPkZpeGVkIGRhdGU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAge2NvdXBvbkZvcm0uZXhwaXJhdGlvbl90eXBlID09PSBcImR1cmF0aW9uXCIgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJhdGlvbiBkYXlzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj17MX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uZXhwaXJhdGlvbl9kYXlzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwiZXhwaXJhdGlvbl9kYXlzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyZXMgYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5leHBpcmF0aW9uX2RhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJleHBpcmF0aW9uX2RhdGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhcCBleHBpcmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtcGFpZ24gZW5kIG9yIGNhcCBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2NvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ259XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogQm9vbGVhbihjaGVja2VkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJhdGlvbiBjYXAgZGF0ZSAob3B0aW9uYWwpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjb3Vwb25Gb3JtLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwiZXhwaXJhdGlvbl9jYXBfYXRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ29kZSBzdHJhdGVneVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmNvZGVfc3RyYXRlZ3l9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX3N0cmF0ZWd5OiB2YWx1ZSBhcyBDb2RlU3RyYXRlZ3ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwidW5pcXVlX2NvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWUgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJzaGFyZWRfY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZCBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2RlIHByZWZpeFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2NvdXBvbkZvcm0uY29kZV9zdHJhdGVneSAhPT0gXCJ1bmlxdWVfY29kZVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uY29kZV9wcmVmaXh9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwiY29kZV9wcmVmaXhcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU2hhcmVkIGNvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb25Gb3JtLmNvZGVfc3RyYXRlZ3kgIT09IFwic2hhcmVkX2NvZGVcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLnNoYXJlZF9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNvdXBvbihcInNoYXJlZF9jb2RlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk1heCBpc3N1YW5jZSBwZXIgaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW19XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwibWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiUHJvbW90aW9uIG1pcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5wcm9tb3Rpb25fbWlycm9yX21vZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogdmFsdWUgYXMgTWlycm9yTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibm9uZVwiPk5vbmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm1hbnVhbFwiPk1hbnVhbDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiYXV0b1wiPkF1dG88L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG5cbiAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwiY2FtcGFpZ25cIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2FtcGFpZ25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduRm9ybS5tb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IHZhbHVlIGFzIENhbXBhaWduTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibm9uZVwiPk5vIGNhbXBhaWduPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJleGlzdGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpc3RpbmcgY2FtcGFpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5ld1wiPk5ldyBjYW1wYWlnbjwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIHtjYW1wYWlnbkZvcm0ubW9kZSA9PT0gXCJleGlzdGluZ1wiICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4aXN0aW5nIGNhbXBhaWduXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLmNhbXBhaWduX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMuY2FtcGFpZ25zIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICB7Y2FtcGFpZ25Gb3JtLm1vZGUgPT09IFwibmV3XCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduRm9ybS5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNhbXBhaWduKFwibmFtZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJJZGVudGlmaWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLmNhbXBhaWduX2lkZW50aWZpZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ2FtcGFpZ24oXCJjYW1wYWlnbl9pZGVudGlmaWVyXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlN0YXJ0cyBhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0uc3RhcnRzX2F0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNhbXBhaWduKFwic3RhcnRzX2F0XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkVuZHMgYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLmVuZHNfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ2FtcGFpZ24oXCJlbmRzX2F0XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0ZvY3VzTW9kYWwuQm9keT5cbiAgICAgICAgICA8L1Byb2dyZXNzVGFicz5cbiAgICAgICAgICA8Rm9jdXNNb2RhbC5Gb290ZXIgc3R5bGU9e21vZGFsU3RhdGljUm93U3R5bGV9PlxuICAgICAgICAgICAgPEJ1dHRvbiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gc2V0TW9kYWxPcGVuKGZhbHNlKX0+XG4gICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICB7Y2FuR29CYWNrICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICBzZXRBY3RpdmVTdGVwKHZpc2libGVTdGVwc1tjdXJyZW50U3RlcEluZGV4IC0gMV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQmFja1xuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7Y2FuR29OZXh0ICYmXG4gICAgICAgICAgICBhY3RpdmVTdGVwICE9PSB2aXNpYmxlU3RlcHNbdmlzaWJsZVN0ZXBzLmxlbmd0aCAtIDFdID8gKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZVN0ZXAodmlzaWJsZVN0ZXBzW2N1cnJlbnRTdGVwSW5kZXggKyAxXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDb250aW51ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxCdXR0b24gaXNMb2FkaW5nPXtzYXZpbmd9IG9uQ2xpY2s9eygpID0+IHZvaWQgc2F2ZVByb2R1Y3QoKX0+XG4gICAgICAgICAgICAgICAgU2F2ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9Gb2N1c01vZGFsLkZvb3Rlcj5cbiAgICAgICAgPC9Gb2N1c01vZGFsLkNvbnRlbnQ+XG4gICAgICA8L0ZvY3VzTW9kYWw+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gT3B0aW9uU2VsZWN0KHtcbiAgdmFsdWUsXG4gIG9wdGlvbnMsXG4gIG9uQ2hhbmdlLFxufToge1xuICB2YWx1ZTogc3RyaW5nXG4gIG9wdGlvbnM6IE9wdGlvblJlY29yZFtdXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxufSkge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RcbiAgICAgIHZhbHVlPXt2YWx1ZSB8fCBOT05FfVxuICAgICAgb25WYWx1ZUNoYW5nZT17KG5leHQpID0+IG9uQ2hhbmdlKG5leHQgPT09IE5PTkUgPyBcIlwiIDogbmV4dCl9XG4gICAgPlxuICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9e05PTkV9Pk5vbmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICB7b3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e29wdGlvbi5pZH0gdmFsdWU9e29wdGlvbi5pZH0+XG4gICAgICAgICAgICB7b3B0aW9uTGFiZWwob3B0aW9uKX1cbiAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICApKX1cbiAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgPC9TZWxlY3Q+XG4gIClcbn1cbiIsICJpbXBvcnQge1xuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxuICB0eXBlIENoYW5nZUV2ZW50LFxuICB0eXBlIENTU1Byb3BlcnRpZXMsXG4gIHR5cGUgRHJhZ0V2ZW50LFxuICB0eXBlIFJlYWN0Tm9kZSxcbn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7XG4gIEFkanVzdG1lbnRzLFxuICBBcnJvd1BhdGgsXG4gIEFycm93VXBUcmF5LFxuICBJbmZvcm1hdGlvbkNpcmNsZSxcbiAgUGVuY2lsU3F1YXJlLFxuICBQbHVzLFxuICBUYXhFeGNsdXNpdmUsXG4gIFRheEluY2x1c2l2ZSxcbiAgVHJhc2gsXG4gIFhNYXJrTWluaSxcbn0gZnJvbSBcIkBtZWR1c2Fqcy9pY29uc1wiXG5pbXBvcnQge1xuICBCdXR0b24sXG4gIENoZWNrYm94LFxuICBDb250YWluZXIsXG4gIEN1cnJlbmN5SW5wdXQsXG4gIERpdmlkZXIsXG4gIERyb3Bkb3duTWVudSxcbiAgRHJhd2VyLFxuICBGb2N1c01vZGFsLFxuICBIZWFkaW5nLFxuICBJbnB1dCxcbiAgTGFiZWwsXG4gIFByb2dyZXNzVGFicyxcbiAgUmFkaW9Hcm91cCxcbiAgU2VsZWN0LFxuICBTdGF0dXNCYWRnZSxcbiAgU3dpdGNoLFxuICBUYWJsZSxcbiAgVGV4dCxcbiAgVGV4dGFyZWEsXG4gIFRvb2x0aXAsXG4gIHRvYXN0LFxuICB1c2VQcm9tcHQsXG59IGZyb20gXCJAbWVkdXNhanMvdWlcIlxuaW1wb3J0IHsgQ291cG9uRW1wdHlTdGF0ZSB9IGZyb20gXCIuL2VtcHR5LXN0YXRlXCJcblxuZGVjbGFyZSBjb25zdCBfX0JBQ0tFTkRfVVJMX186IHN0cmluZ1xuXG50eXBlIEFwaUJhc2UgPSBcIi9hZG1pblwiIHwgXCIvdmVuZG9yXCJcbnR5cGUgQmVuZWZpdFR5cGUgPSBcImZpeGVkX2Ftb3VudFwiIHwgXCJwZXJjZW50YWdlXCIgfCBcImZyZWVfc2hpcHBpbmdcIiB8IFwiYnV5X2dldFwiXG50eXBlIENvdXBvblR5cGUgPVxuICB8IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiXG4gIHwgXCJhbW91bnRfb2ZmX29yZGVyXCJcbiAgfCBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIlxuICB8IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICB8IFwiYnV5X3hfZ2V0X3lcIlxuICB8IFwiZnJlZV9zaGlwcGluZ1wiXG50eXBlIENvZGVTdHJhdGVneSA9IFwidW5pcXVlX2NvZGVcIiB8IFwic2hhcmVkX2NvZGVcIlxudHlwZSBNaXJyb3JNb2RlID0gXCJub25lXCIgfCBcIm1hbnVhbFwiIHwgXCJhdXRvXCJcbnR5cGUgUHJvbW90aW9uU3RhdHVzID0gXCJkcmFmdFwiIHwgXCJhY3RpdmVcIiB8IFwiaW5hY3RpdmVcIlxudHlwZSBDYW1wYWlnbk1vZGUgPSBcIm5vbmVcIiB8IFwiZXhpc3RpbmdcIiB8IFwibmV3XCJcbnR5cGUgRXhwaXJhdGlvblBvbGljeVR5cGUgPSBcIm5vbmVcIiB8IFwiZHVyYXRpb25cIiB8IFwiZml4ZWRcIlxudHlwZSBDb3Vwb25BbGxvY2F0aW9uID0gXCJlYWNoXCIgfCBcIm9uY2VcIlxudHlwZSBXaXphcmRTdGVwID0gXCJkZXRhaWxzXCIgfCBcIm9yZ2FuaXplXCIgfCBcImNhbXBhaWduXCIgfCBcInByaWNlc1wiXG50eXBlIFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlID1cbiAgfCBcImN1c3RvbWVyLmdyb3Vwcy5pZFwiXG4gIHwgXCJyZWdpb24uaWRcIlxuICB8IFwic2hpcHBpbmdfYWRkcmVzcy5jb3VudHJ5X2NvZGVcIlxuICB8IFwic2FsZXNfY2hhbm5lbF9pZFwiXG4gIHwgXCJjdXJyZW5jeV9jb2RlXCJcbnR5cGUgUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvciA9IFwiaW5cIiB8IFwiZXFcIiB8IFwibmVcIlxuXG50eXBlIFB1cmNoYXNlQ29uZGl0aW9uRm9ybSA9IHtcbiAga2V5OiBzdHJpbmdcbiAgYXR0cmlidXRlOiBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZSB8IFwiXCJcbiAgb3BlcmF0b3I6IFB1cmNoYXNlQ29uZGl0aW9uT3BlcmF0b3IgfCBcIlwiXG4gIHZhbHVlczogc3RyaW5nW11cbn1cblxudHlwZSBPcHRpb25SZWNvcmQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZyB8IG51bGxcbiAgdGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIHZhbHVlPzogc3RyaW5nIHwgbnVsbFxuICBoYW5kbGU/OiBzdHJpbmcgfCBudWxsXG4gIGNhbXBhaWduX2lkZW50aWZpZXI/OiBzdHJpbmcgfCBudWxsXG4gIGRpc3BsYXlfbmFtZT86IHN0cmluZyB8IG51bGxcbiAgaXNvXzI/OiBzdHJpbmcgfCBudWxsXG59XG5cbnR5cGUgQ3VycmVuY3lPcHRpb24gPSB7XG4gIGNvZGU6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgc3ltYm9sOiBzdHJpbmdcbiAgc3ltYm9sX25hdGl2ZTogc3RyaW5nXG4gIGlzX2RlZmF1bHQ6IGJvb2xlYW5cbiAgaXNfdGF4X2luY2x1c2l2ZT86IGJvb2xlYW5cbn1cblxudHlwZSBPcHRpb25zUGF5bG9hZCA9IHtcbiAgY3VycmVuY2llcz86IEN1cnJlbmN5T3B0aW9uW11cbiAgcHJvZHVjdF90eXBlcz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfY29sbGVjdGlvbnM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X2NhdGVnb3JpZXM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X3RhZ3M/OiBPcHRpb25SZWNvcmRbXVxuICBzYWxlc19jaGFubmVscz86IE9wdGlvblJlY29yZFtdXG4gIHNoaXBwaW5nX3Byb2ZpbGVzPzogT3B0aW9uUmVjb3JkW11cbiAgY2FtcGFpZ25zPzogT3B0aW9uUmVjb3JkW11cbiAgc2VsbGVycz86IE9wdGlvblJlY29yZFtdXG4gIGN1c3RvbWVyX2dyb3Vwcz86IE9wdGlvblJlY29yZFtdXG4gIHJlZ2lvbnM/OiBPcHRpb25SZWNvcmRbXVxuICBjb3VudHJpZXM/OiBPcHRpb25SZWNvcmRbXVxufVxuXG50eXBlIENvdXBvblByb2R1Y3RDb25maWcgPSB7XG4gIGlkOiBzdHJpbmdcbiAgZW5hYmxlZDogYm9vbGVhblxuICBwcm9kdWN0X2lkOiBzdHJpbmdcbiAgYmVuZWZpdF90eXBlOiBCZW5lZml0VHlwZVxuICBwdXJjaGFzZV9jb25kaXRpb25zPzogQXJyYXk8e1xuICAgIGF0dHJpYnV0ZTogUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGVcbiAgICBvcGVyYXRvcjogUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvclxuICAgIHZhbHVlczogc3RyaW5nW11cbiAgfT4gfCBudWxsXG4gIGFtb3VudHM/OiB7IGN1cnJlbmN5X2NvZGU6IHN0cmluZzsgYW1vdW50OiBudW1iZXIgfVtdIHwgbnVsbFxuICBhbW91bnQ6IG51bWJlciB8IG51bGxcbiAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbFxuICBjdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIGNvZGVfc3RyYXRlZ3k6IENvZGVTdHJhdGVneVxuICBjb2RlX3ByZWZpeDogc3RyaW5nIHwgbnVsbFxuICBzaGFyZWRfY29kZTogc3RyaW5nIHwgbnVsbFxuICBleHBpcmF0aW9uX3BvbGljeTpcbiAgfCB7IHR5cGU6IFwibm9uZVwiIH1cbiAgfCB7XG4gICAgdHlwZTogXCJkdXJhdGlvblwiXG4gICAgZHVyYXRpb25fZGF5czogbnVtYmVyXG4gICAgY2FwX2J5X2NhbXBhaWduPzogYm9vbGVhblxuICAgIGNhcF9hdD86IHN0cmluZyB8IG51bGxcbiAgfVxuICB8IHtcbiAgICB0eXBlOiBcImZpeGVkXCJcbiAgICBleHBpcmVzX2F0OiBzdHJpbmdcbiAgICBjYXBfYnlfY2FtcGFpZ24/OiBib29sZWFuXG4gICAgY2FwX2F0Pzogc3RyaW5nIHwgbnVsbFxuICB9XG4gIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogbnVtYmVyXG4gIHByb21vdGlvbl9taXJyb3JfbW9kZTogTWlycm9yTW9kZVxuICBwcm9tb3Rpb25fc3RhdHVzPzogUHJvbW90aW9uU3RhdHVzIHwgbnVsbFxuICBwcm9tb3Rpb25fdGVtcGxhdGU/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbFxuICBjYW1wYWlnbl9pZD86IHN0cmluZyB8IG51bGxcbiAgY2FtcGFpZ25fc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbn1cblxudHlwZSBQcm9kdWN0UmVjb3JkID0ge1xuICBpZDogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmcgfCBudWxsXG4gIHN1YnRpdGxlPzogc3RyaW5nIHwgbnVsbFxuICBoYW5kbGU6IHN0cmluZyB8IG51bGxcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsXG4gIHN0YXR1czogc3RyaW5nIHwgbnVsbFxuICB0aHVtYm5haWw6IHN0cmluZyB8IG51bGxcbiAgdGh1bWJuYWlsX2Fzc2V0X2lkPzogc3RyaW5nIHwgbnVsbFxuICBpbWFnZXM/OiB7IGlkPzogc3RyaW5nOyB1cmw/OiBzdHJpbmcgfCBudWxsOyBhc3NldF9pZD86IHN0cmluZyB8IG51bGwgfVtdXG4gIGRpc2NvdW50YWJsZT86IGJvb2xlYW5cbiAgdHlwZV9pZD86IHN0cmluZyB8IG51bGxcbiAgY29sbGVjdGlvbl9pZD86IHN0cmluZyB8IG51bGxcbiAgc2hpcHBpbmdfcHJvZmlsZV9pZD86IHN0cmluZyB8IG51bGxcbiAgdmFyaWFudHM/OiB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHNrdT86IHN0cmluZyB8IG51bGxcbiAgICBwcmljZXM/OiB7IGN1cnJlbmN5X2NvZGU/OiBzdHJpbmc7IGFtb3VudD86IG51bWJlciB9W11cbiAgfVtdXG4gIGNhdGVnb3JpZXM/OiB7IGlkOiBzdHJpbmcgfVtdXG4gIHRhZ3M/OiB7IGlkOiBzdHJpbmcgfVtdXG4gIHNhbGVzX2NoYW5uZWxzPzogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9W11cbn1cblxudHlwZSBQcm9kdWN0TWVkaWEgPSB7XG4gIHVybDogc3RyaW5nXG4gIGFzc2V0X2lkPzogc3RyaW5nXG59XG5cbnR5cGUgQ291cG9uUHJvZHVjdFJvdyA9IHtcbiAgaWQ6IHN0cmluZ1xuICBwcm9kdWN0OiBQcm9kdWN0UmVjb3JkXG4gIGNvdXBvbl9wcm9kdWN0X2NvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZ1xuICBlbnRpdGxlbWVudHNfY291bnQ6IG51bWJlclxufVxuXG50eXBlIFByb2R1Y3RGb3JtU3RhdGUgPSB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgc3VidGl0bGU6IHN0cmluZ1xuICBoYW5kbGU6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIG1lZGlhOiBQcm9kdWN0TWVkaWFbXVxuICBza3U6IHN0cmluZ1xuICBwcmljZV9hbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHN0YXR1czogc3RyaW5nXG4gIGRpc2NvdW50YWJsZTogYm9vbGVhblxuICBzZWxsZXJfaWQ6IHN0cmluZ1xuICB0eXBlX2lkOiBzdHJpbmdcbiAgY29sbGVjdGlvbl9pZDogc3RyaW5nXG4gIGNhdGVnb3J5X2lkOiBzdHJpbmdcbiAgdGFnX2lkOiBzdHJpbmdcbn1cblxudHlwZSBDb3Vwb25Gb3JtU3RhdGUgPSB7XG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgdHlwZTogQ291cG9uVHlwZVxuICBwdXJjaGFzZV9jb25kaXRpb25zOiBQdXJjaGFzZUNvbmRpdGlvbkZvcm1bXVxuICBhbW91bnRzOiBDb3Vwb25BbW91bnRGb3JtUm93W11cbiAgcGVyY2VudGFnZTogc3RyaW5nXG4gIGFsbG9jYXRpb246IENvdXBvbkFsbG9jYXRpb25cbiAgY29kZV9zdHJhdGVneTogQ29kZVN0cmF0ZWd5XG4gIGNvZGVfcHJlZml4OiBzdHJpbmdcbiAgc2hhcmVkX2NvZGU6IHN0cmluZ1xuICBleHBpcmF0aW9uX3R5cGU6IEV4cGlyYXRpb25Qb2xpY3lUeXBlXG4gIGV4cGlyYXRpb25fZGF5czogc3RyaW5nXG4gIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nXG4gIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOiBib29sZWFuXG4gIGV4cGlyYXRpb25fY2FwX2F0OiBzdHJpbmdcbiAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBzdHJpbmdcbiAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBNaXJyb3JNb2RlXG4gIHByb21vdGlvbl9zdGF0dXM6IFByb21vdGlvblN0YXR1c1xufVxuXG50eXBlIENvdXBvbkFtb3VudEZvcm1Sb3cgPSB7XG4gIGtleTogc3RyaW5nXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZ1xuICBhbW91bnQ6IHN0cmluZ1xufVxuXG50eXBlIENhbXBhaWduRm9ybVN0YXRlID0ge1xuICBtb2RlOiBDYW1wYWlnbk1vZGVcbiAgY2FtcGFpZ25faWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgY2FtcGFpZ25faWRlbnRpZmllcjogc3RyaW5nXG4gIHN0YXJ0c19hdDogc3RyaW5nXG4gIGVuZHNfYXQ6IHN0cmluZ1xufVxuXG5jb25zdCBOT05FID0gXCJfX25vbmVfX1wiXG5jb25zdCBhbGxTdGVwczogV2l6YXJkU3RlcFtdID0gW1wiZGV0YWlsc1wiLCBcIm9yZ2FuaXplXCIsIFwiY2FtcGFpZ25cIiwgXCJwcmljZXNcIl1cblxuY29uc3QgY29uZGl0aW9uQXR0cmlidXRlczogQXJyYXk8e1xuICB2YWx1ZTogUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGVcbiAgbGFiZWw6IHN0cmluZ1xufT4gPSBbXG4gIHsgdmFsdWU6IFwiY3VzdG9tZXIuZ3JvdXBzLmlkXCIsIGxhYmVsOiBcIkN1c3RvbWVyIEdyb3VwXCIgfSxcbiAgeyB2YWx1ZTogXCJyZWdpb24uaWRcIiwgbGFiZWw6IFwiUmVnaW9uXCIgfSxcbiAgeyB2YWx1ZTogXCJzaGlwcGluZ19hZGRyZXNzLmNvdW50cnlfY29kZVwiLCBsYWJlbDogXCJDb3VudHJ5XCIgfSxcbiAgeyB2YWx1ZTogXCJzYWxlc19jaGFubmVsX2lkXCIsIGxhYmVsOiBcIlNhbGVzIENoYW5uZWxcIiB9LFxuICB7IHZhbHVlOiBcImN1cnJlbmN5X2NvZGVcIiwgbGFiZWw6IFwiQ3VycmVuY3kgQ29kZVwiIH0sXG5dXG5cbmNvbnN0IGNvbmRpdGlvbk9wZXJhdG9yczogQXJyYXk8e1xuICB2YWx1ZTogUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvclxuICBsYWJlbDogc3RyaW5nXG59PiA9IFtcbiAgeyB2YWx1ZTogXCJpblwiLCBsYWJlbDogXCJJblwiIH0sXG4gIHsgdmFsdWU6IFwiZXFcIiwgbGFiZWw6IFwiRXF1YWxzXCIgfSxcbiAgeyB2YWx1ZTogXCJuZVwiLCBsYWJlbDogXCJOb3QgSW5cIiB9LFxuXVxuXG5leHBvcnQgY29uc3QgdHlwZUNob2ljZXM6IHtcbiAgdmFsdWU6IENvdXBvblR5cGVcbiAgbGFiZWw6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG59W10gPSBbXG4gICAge1xuICAgICAgdmFsdWU6IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiLFxuICAgICAgbGFiZWw6IFwiQW1vdW50IG9mZiBwcm9kdWN0c1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRGlzY291bnQgc3BlY2lmaWMgcHJvZHVjdHMgb3IgYSBjb2xsZWN0aW9uIG9mIHByb2R1Y3RzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJhbW91bnRfb2ZmX29yZGVyXCIsXG4gICAgICBsYWJlbDogXCJBbW91bnQgb2ZmIG9yZGVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEaXNjb3VudCB0aGUgdG90YWwgb3JkZXIgYW1vdW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJwZXJjZW50YWdlX29mZl9wcm9kdWN0XCIsXG4gICAgICBsYWJlbDogXCJQZXJjZW50YWdlIG9mZiBwcm9kdWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEaXNjb3VudCBhIHBlcmNlbnRhZ2Ugb2ZmIHNlbGVjdGVkIHByb2R1Y3RzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJwZXJjZW50YWdlX29mZl9vcmRlclwiLFxuICAgICAgbGFiZWw6IFwiUGVyY2VudGFnZSBvZmYgb3JkZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRpc2NvdW50IGEgcGVyY2VudGFnZSBvZmYgdGhlIHRvdGFsIG9yZGVyIGFtb3VudFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwiYnV5X3hfZ2V0X3lcIixcbiAgICAgIGxhYmVsOiBcIkJ1eSBYIEdldCBZXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJJc3N1ZSBhIEJ1eSBYIEdldCBZIGNvdXBvbiBlbnRpdGxlbWVudFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwiZnJlZV9zaGlwcGluZ1wiLFxuICAgICAgbGFiZWw6IFwiRnJlZSBzaGlwcGluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQXBwbHkgYSAxMDAlIGRpc2NvdW50IHRvIHNoaXBwaW5nIGZlZXNcIixcbiAgICB9LFxuICBdXG5cbmNvbnN0IHN0YXR1c0Nob2ljZXM6IHtcbiAgdmFsdWU6IFByb21vdGlvblN0YXR1c1xuICBsYWJlbDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbn1bXSA9IFtcbiAgICB7XG4gICAgICB2YWx1ZTogXCJkcmFmdFwiLFxuICAgICAgbGFiZWw6IFwiRHJhZnRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkN1c3RvbWVycyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSB0aGUgY29kZSB5ZXRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcImFjdGl2ZVwiLFxuICAgICAgbGFiZWw6IFwiQWN0aXZlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDdXN0b21lcnMgd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgY29kZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwiaW5hY3RpdmVcIixcbiAgICAgIGxhYmVsOiBcIkluYWN0aXZlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJLZWVwIHRoZSBwcm9tb3Rpb24gdW5hdmFpbGFibGUgdW50aWwgcmVhY3RpdmF0ZWRcIixcbiAgICB9LFxuICBdXG5cbmZ1bmN0aW9uIGJhY2tlbmRVcmwoKSB7XG4gIHJldHVybiB0eXBlb2YgX19CQUNLRU5EX1VSTF9fID09PSBcInN0cmluZ1wiXG4gICAgPyBfX0JBQ0tFTkRfVVJMX18ucmVwbGFjZSgvXFwvJC8sIFwiXCIpXG4gICAgOiBcIlwiXG59XG5cbmZ1bmN0aW9uIGFwaUVycm9yTWVzc2FnZShwYXlsb2FkOiBhbnksIGZhbGxiYWNrOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICBbcGF5bG9hZD8ubWVzc2FnZSwgcGF5bG9hZD8uZXJyb3I/Lm1lc3NhZ2UsIHBheWxvYWQ/LmVycm9yXS5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT4gdHlwZW9mIGNhbmRpZGF0ZSA9PT0gXCJzdHJpbmdcIiAmJiBjYW5kaWRhdGUudHJpbSgpLFxuICAgICkgfHxcbiAgICBmYWxsYmFjayB8fFxuICAgIFwiUmVxdWVzdCBmYWlsZWRcIlxuICApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwaUZldGNoPFQ+KFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge30sXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYWNrZW5kVXJsKCl9JHtwYXRofWAsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICAuLi4ob3B0aW9ucy5ib2R5ID8geyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IDoge30pLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH0sXG4gIH0pXG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXBpRXJyb3JNZXNzYWdlKHBheWxvYWQsIHJlc3BvbnNlLnN0YXR1c1RleHQpKVxuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKVxufVxuXG5mdW5jdGlvbiBvcHRpb25MYWJlbChvcHRpb246IE9wdGlvblJlY29yZCkge1xuICByZXR1cm4gKFxuICAgIG9wdGlvbi5uYW1lIHx8IG9wdGlvbi50aXRsZSB8fCBvcHRpb24udmFsdWUgfHwgb3B0aW9uLmhhbmRsZSB8fCBvcHRpb24uaWRcbiAgKVxufVxuXG5mdW5jdGlvbiBudW1iZXJPck51bGwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPiAwID8gcGFyc2VkIDogbnVsbFxufVxuXG5mdW5jdGlvbiBub25OZWdhdGl2ZU51bWJlck9yTnVsbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUudHJpbSgpKSByZXR1cm4gbnVsbFxuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPj0gMCA/IHBhcnNlZCA6IG51bGxcbn1cblxuZnVuY3Rpb24gdG9EYXRlVGltZUxvY2FsKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCJcIlxuICBjb25zdCBsb2NhbERhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwXzAwMClcbiAgcmV0dXJuIGxvY2FsRGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDE2KVxufVxuXG5mdW5jdGlvbiBjdXJyZW5jeURlY2ltYWxEaWdpdHMoY29kZTogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChcImVuXCIsIHtcbiAgICAgIHN0eWxlOiBcImN1cnJlbmN5XCIsXG4gICAgICBjdXJyZW5jeTogY29kZS50b1VwcGVyQ2FzZSgpLFxuICAgIH0pLnJlc29sdmVkT3B0aW9ucygpLm1heGltdW1GcmFjdGlvbkRpZ2l0c1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gMlxuICB9XG59XG5cbmZ1bmN0aW9uIGN1cnJlbmN5U3ltYm9sKGNvZGU6IHN0cmluZykge1xuICBpZiAoIWNvZGUpIHJldHVybiBcIlwiXG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5ldyBJbnRsLk51bWJlckZvcm1hdChcImVuXCIsIHtcbiAgICAgICAgc3R5bGU6IFwiY3VycmVuY3lcIixcbiAgICAgICAgY3VycmVuY3k6IGNvZGUudG9VcHBlckNhc2UoKSxcbiAgICAgICAgY3VycmVuY3lEaXNwbGF5OiBcIm5hcnJvd1N5bWJvbFwiLFxuICAgICAgfSlcbiAgICAgICAgLmZvcm1hdFRvUGFydHMoMClcbiAgICAgICAgLmZpbmQoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gXCJjdXJyZW5jeVwiKT8udmFsdWUgfHwgY29kZS50b1VwcGVyQ2FzZSgpXG4gICAgKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gY29kZS50b1VwcGVyQ2FzZSgpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvdXBvblR5cGVGcm9tQ29uZmlnKGNvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZyk6IENvdXBvblR5cGUge1xuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCIpIHtcbiAgICByZXR1cm4gY29uZmlnLnByb21vdGlvbl90ZW1wbGF0ZT8uYXBwbGljYXRpb25fbWV0aG9kPy50YXJnZXRfdHlwZSA9PT0gXCJvcmRlclwiXG4gICAgICA/IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICAgICAgOiBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIlxuICB9XG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcImJ1eV9nZXRcIikgcmV0dXJuIFwiYnV5X3hfZ2V0X3lcIlxuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmcmVlX3NoaXBwaW5nXCIpIHJldHVybiBcImZyZWVfc2hpcHBpbmdcIlxuXG4gIHJldHVybiBjb25maWcucHJvbW90aW9uX3RlbXBsYXRlPy5hcHBsaWNhdGlvbl9tZXRob2Q/LnRhcmdldF90eXBlID09PSBcIm9yZGVyXCJcbiAgICA/IFwiYW1vdW50X29mZl9vcmRlclwiXG4gICAgOiBcImFtb3VudF9vZmZfcHJvZHVjdHNcIlxufVxuXG5mdW5jdGlvbiBiZW5lZml0VHlwZUZyb21Db3Vwb25UeXBlKHR5cGU6IENvdXBvblR5cGUpOiBCZW5lZml0VHlwZSB7XG4gIGlmIChcbiAgICB0eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIiB8fFxuICAgIHR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICApIHJldHVybiBcInBlcmNlbnRhZ2VcIlxuICBpZiAodHlwZSA9PT0gXCJidXlfeF9nZXRfeVwiKSByZXR1cm4gXCJidXlfZ2V0XCJcbiAgaWYgKHR5cGUgPT09IFwiZnJlZV9zaGlwcGluZ1wiKSByZXR1cm4gXCJmcmVlX3NoaXBwaW5nXCJcbiAgcmV0dXJuIFwiZml4ZWRfYW1vdW50XCJcbn1cblxuZnVuY3Rpb24gY291cG9uVHlwZUxhYmVsKGNvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZykge1xuICByZXR1cm4gdHlwZUNob2ljZXMuZmluZChcbiAgICAoY2hvaWNlKSA9PiBjaG9pY2UudmFsdWUgPT09IGNvdXBvblR5cGVGcm9tQ29uZmlnKGNvbmZpZyksXG4gICk/LmxhYmVsXG59XG5cbmZ1bmN0aW9uIGNvdXBvblN0YXR1c0NvbG9yKHN0YXR1cz86IFByb21vdGlvblN0YXR1cyB8IG51bGwpIHtcbiAgaWYgKHN0YXR1cyA9PT0gXCJhY3RpdmVcIikgcmV0dXJuIFwiZ3JlZW5cIiBhcyBjb25zdFxuICBpZiAoc3RhdHVzID09PSBcImluYWN0aXZlXCIpIHJldHVybiBcIm9yYW5nZVwiIGFzIGNvbnN0XG4gIHJldHVybiBcImdyZXlcIiBhcyBjb25zdFxufVxuXG5mdW5jdGlvbiBwcm9kdWN0U3RhdHVzRnJvbUNvdXBvblN0YXR1cyhzdGF0dXM6IFByb21vdGlvblN0YXR1cykge1xuICByZXR1cm4gc3RhdHVzID09PSBcImFjdGl2ZVwiID8gXCJwdWJsaXNoZWRcIiA6IFwiZHJhZnRcIlxufVxuXG5mdW5jdGlvbiBjYW1wYWlnbkxhYmVsKGNvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZykge1xuICBjb25zdCBuYW1lID0gY29uZmlnLmNhbXBhaWduX3NuYXBzaG90Py5uYW1lXG4gIHJldHVybiB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBuYW1lID8gbmFtZSA6IGNvbmZpZy5jYW1wYWlnbl9pZCB8fCBcIk5vbmVcIlxufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q3VycmVuY3kob3B0aW9uczogT3B0aW9uc1BheWxvYWQpIHtcbiAgcmV0dXJuIChcbiAgICBvcHRpb25zLmN1cnJlbmNpZXM/LmZpbmQoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5pc19kZWZhdWx0KT8uY29kZSB8fFxuICAgIG9wdGlvbnMuY3VycmVuY2llcz8uWzBdPy5jb2RlIHx8XG4gICAgXCJcIlxuICApXG59XG5cbmZ1bmN0aW9uIGNvbmRpdGlvbktleShwcmVmaXggPSBcImNvbmRpdGlvblwiKSB7XG4gIHJldHVybiBgJHtwcmVmaXh9LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KX1gXG59XG5cbmZ1bmN0aW9uIGlzQW1vdW50Q291cG9uVHlwZSh0eXBlOiBDb3Vwb25UeXBlKSB7XG4gIHJldHVybiB0eXBlID09PSBcImFtb3VudF9vZmZfcHJvZHVjdHNcIiB8fCB0eXBlID09PSBcImFtb3VudF9vZmZfb3JkZXJcIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZWZmZWN0aXZlQ291cG9uQ3VycmVuY2llcyhcbiAgY29uZGl0aW9uczogUHVyY2hhc2VDb25kaXRpb25Gb3JtW10sXG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5T3B0aW9uW10sXG4pIHtcbiAgY29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9ucy5maW5kKFxuICAgIChpdGVtKSA9PiBpdGVtLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIsXG4gIClcbiAgaWYgKCFjb25kaXRpb24gfHwgIWNvbmRpdGlvbi5vcGVyYXRvcikgcmV0dXJuIFtdXG4gIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldChjb25kaXRpb24udmFsdWVzKVxuICBjb25zdCBzdXBwb3J0ZWQgPSBjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpXG5cbiAgcmV0dXJuIGNvbmRpdGlvbi5vcGVyYXRvciA9PT0gXCJuZVwiXG4gICAgPyBzdXBwb3J0ZWQuZmlsdGVyKChjb2RlKSA9PiAhc2VsZWN0ZWQuaGFzKGNvZGUpKVxuICAgIDogc3VwcG9ydGVkLmZpbHRlcigoY29kZSkgPT4gc2VsZWN0ZWQuaGFzKGNvZGUpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjb25jaWxlQ291cG9uQW1vdW50cyhcbiAgY3VycmVudDogQ291cG9uQW1vdW50Rm9ybVJvd1tdLFxuICBjdXJyZW5jeUNvZGVzOiBzdHJpbmdbXSxcbikge1xuICBjb25zdCBieUN1cnJlbmN5ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIGN1cnJlbnQubWFwKChyb3cpID0+IFtyb3cuY3VycmVuY3lfY29kZSwgcm93XSksXG4gIClcbiAgcmV0dXJuIGN1cnJlbmN5Q29kZXMubWFwKChjdXJyZW5jeUNvZGUpID0+ICh7XG4gICAga2V5OiBieUN1cnJlbmN5W2N1cnJlbmN5Q29kZV0/LmtleSB8fCBjb25kaXRpb25LZXkoXCJjb3Vwb24tdmFsdWVcIiksXG4gICAgY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlLFxuICAgIGFtb3VudDogYnlDdXJyZW5jeVtjdXJyZW5jeUNvZGVdPy5hbW91bnQgfHwgXCJcIixcbiAgfSkpXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQdXJjaGFzZUNvbmRpdGlvbnMob3B0aW9uczogT3B0aW9uc1BheWxvYWQpIHtcbiAgY29uc3QgY3VycmVuY3lDb2RlID0gZGVmYXVsdEN1cnJlbmN5KG9wdGlvbnMpXG4gIHJldHVybiBjdXJyZW5jeUNvZGVcbiAgICA/IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiBjb25kaXRpb25LZXkoXCJjdXJyZW5jeVwiKSxcbiAgICAgICAgYXR0cmlidXRlOiBcImN1cnJlbmN5X2NvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgb3BlcmF0b3I6IFwiZXFcIiBhcyBjb25zdCxcbiAgICAgICAgdmFsdWVzOiBbY3VycmVuY3lDb2RlXSxcbiAgICAgIH0sXG4gICAgXVxuICAgIDogW11cbn1cblxuZnVuY3Rpb24gZW1wdHlQcm9kdWN0KG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkKTogUHJvZHVjdEZvcm1TdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IFwiXCIsXG4gICAgc3VidGl0bGU6IFwiXCIsXG4gICAgaGFuZGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgIG1lZGlhOiBbXSxcbiAgICBza3U6IFwiXCIsXG4gICAgcHJpY2VfYW1vdW50czogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgKG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXSkubWFwKChjdXJyZW5jeSkgPT4gW2N1cnJlbmN5LmNvZGUsIFwiXCJdKSxcbiAgICApLFxuICAgIHN0YXR1czogXCJkcmFmdFwiLFxuICAgIGRpc2NvdW50YWJsZTogZmFsc2UsXG4gICAgc2VsbGVyX2lkOiBcIlwiLFxuICAgIHR5cGVfaWQ6IFwiXCIsXG4gICAgY29sbGVjdGlvbl9pZDogXCJcIixcbiAgICBjYXRlZ29yeV9pZDogXCJcIixcbiAgICB0YWdfaWQ6IFwiXCIsXG4gIH1cbn1cblxuZnVuY3Rpb24gZW1wdHlDb3Vwb24ob3B0aW9uczogT3B0aW9uc1BheWxvYWQpOiBDb3Vwb25Gb3JtU3RhdGUge1xuICBjb25zdCBjdXJyZW5jeUNvZGUgPSBkZWZhdWx0Q3VycmVuY3kob3B0aW9ucylcbiAgY29uc3QgcHVyY2hhc2VDb25kaXRpb25zID0gZGVmYXVsdFB1cmNoYXNlQ29uZGl0aW9ucyhvcHRpb25zKVxuICByZXR1cm4ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgdHlwZTogXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIsXG4gICAgcHVyY2hhc2VfY29uZGl0aW9uczogcHVyY2hhc2VDb25kaXRpb25zLFxuICAgIGFtb3VudHM6IGN1cnJlbmN5Q29kZVxuICAgICAgPyBbXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6IFwiY291cG9uLXZhbHVlLWRlZmF1bHRcIixcbiAgICAgICAgICBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgICAgYW1vdW50OiBcIlwiLFxuICAgICAgICB9LFxuICAgICAgXVxuICAgICAgOiBbXSxcbiAgICBwZXJjZW50YWdlOiBcIlwiLFxuICAgIGFsbG9jYXRpb246IFwiZWFjaFwiLFxuICAgIGNvZGVfc3RyYXRlZ3k6IFwidW5pcXVlX2NvZGVcIixcbiAgICBjb2RlX3ByZWZpeDogXCJDT1VQT05cIixcbiAgICBzaGFyZWRfY29kZTogXCJcIixcbiAgICBleHBpcmF0aW9uX3R5cGU6IFwiZHVyYXRpb25cIixcbiAgICBleHBpcmF0aW9uX2RheXM6IFwiMzBcIixcbiAgICBleHBpcmF0aW9uX2RhdGU6IFwiXCIsXG4gICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IHRydWUsXG4gICAgZXhwaXJhdGlvbl9jYXBfYXQ6IFwiXCIsXG4gICAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBcIjFcIixcbiAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IFwibm9uZVwiLFxuICAgIHByb21vdGlvbl9zdGF0dXM6IFwiZHJhZnRcIixcbiAgfVxufVxuXG5jb25zdCBlbXB0eUNhbXBhaWduOiBDYW1wYWlnbkZvcm1TdGF0ZSA9IHtcbiAgbW9kZTogXCJub25lXCIsXG4gIGNhbXBhaWduX2lkOiBcIlwiLFxuICBuYW1lOiBcIlwiLFxuICBjYW1wYWlnbl9pZGVudGlmaWVyOiBcIlwiLFxuICBzdGFydHNfYXQ6IFwiXCIsXG4gIGVuZHNfYXQ6IFwiXCIsXG59XG5cbmZ1bmN0aW9uIGZvcm1zRnJvbVJvdyhcbiAgcm93OiBDb3Vwb25Qcm9kdWN0Um93LFxuICBvcHRpb25zOiBPcHRpb25zUGF5bG9hZCxcbik6IHtcbiAgcHJvZHVjdDogUHJvZHVjdEZvcm1TdGF0ZVxuICBjb3Vwb246IENvdXBvbkZvcm1TdGF0ZVxuICBjYW1wYWlnbjogQ2FtcGFpZ25Gb3JtU3RhdGVcbn0ge1xuICBjb25zdCBwcm9kdWN0ID0gcm93LnByb2R1Y3RcbiAgY29uc3QgY29uZmlnID0gcm93LmNvdXBvbl9wcm9kdWN0X2NvbmZpZ1xuICBjb25zdCB2YXJpYW50ID0gcHJvZHVjdC52YXJpYW50cz8uWzBdXG4gIGNvbnN0IHByaWNlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAodmFyaWFudD8ucHJpY2VzIHx8IFtdKVxuICAgICAgLmZpbHRlcigocHJpY2UpID0+IHByaWNlLmN1cnJlbmN5X2NvZGUpXG4gICAgICAubWFwKChwcmljZSkgPT4gW1xuICAgICAgICBTdHJpbmcocHJpY2UuY3VycmVuY3lfY29kZSkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgcHJpY2UuYW1vdW50ID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHByaWNlLmFtb3VudCksXG4gICAgICBdKSxcbiAgKVxuICBjb25zdCBtZWRpYSA9IEFycmF5LmZyb20oXG4gICAgbmV3IE1hcChcbiAgICAgIFtcbiAgICAgICAgLi4uKHByb2R1Y3QudGh1bWJuYWlsXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1cmw6IHByb2R1Y3QudGh1bWJuYWlsLFxuICAgICAgICAgICAgICAgIGFzc2V0X2lkOiBwcm9kdWN0LnRodW1ibmFpbF9hc3NldF9pZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihwcm9kdWN0LmltYWdlcyB8fCBbXSlcbiAgICAgICAgICAuZmlsdGVyKChpbWFnZSkgPT4gaW1hZ2UudXJsKVxuICAgICAgICAgIC5tYXAoKGltYWdlKSA9PiAoe1xuICAgICAgICAgICAgdXJsOiBTdHJpbmcoaW1hZ2UudXJsKSxcbiAgICAgICAgICAgIGFzc2V0X2lkOiBpbWFnZS5hc3NldF9pZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgfSkpLFxuICAgICAgXS5tYXAoKGl0ZW0pID0+IFtpdGVtLnVybCwgaXRlbV0pLFxuICAgICkudmFsdWVzKCksXG4gIClcbiAgY29uc3QgY29uZmlndXJlZEFtb3VudHMgPVxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLmFtb3VudHMpICYmIGNvbmZpZy5hbW91bnRzLmxlbmd0aFxuICAgICAgPyBjb25maWcuYW1vdW50c1xuICAgICAgOiBjb25maWcuYW1vdW50ICE9IG51bGwgJiYgY29uZmlnLmN1cnJlbmN5X2NvZGVcbiAgICAgICAgPyBbeyBhbW91bnQ6IGNvbmZpZy5hbW91bnQsIGN1cnJlbmN5X2NvZGU6IGNvbmZpZy5jdXJyZW5jeV9jb2RlIH1dXG4gICAgICAgIDogW11cbiAgY29uc3QgY29uZmlndXJlZENvbmRpdGlvbnMgPSAoY29uZmlnLnB1cmNoYXNlX2NvbmRpdGlvbnMgfHwgW10pLm1hcChcbiAgICAoY29uZGl0aW9uLCBpbmRleCkgPT4gKHtcbiAgICAgIGtleTogYGNvbmRpdGlvbi0ke2luZGV4fWAsXG4gICAgICBhdHRyaWJ1dGU6IGNvbmRpdGlvbi5hdHRyaWJ1dGUsXG4gICAgICBvcGVyYXRvcjogY29uZGl0aW9uLm9wZXJhdG9yLFxuICAgICAgdmFsdWVzOiBjb25kaXRpb24udmFsdWVzLm1hcCgodmFsdWUpID0+XG4gICAgICAgIGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiIHx8XG4gICAgICAgICAgY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJzaGlwcGluZ19hZGRyZXNzLmNvdW50cnlfY29kZVwiXG4gICAgICAgICAgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgOiB2YWx1ZSxcbiAgICAgICksXG4gICAgfSksXG4gIClcbiAgaWYgKFxuICAgICFjb25maWd1cmVkQ29uZGl0aW9ucy5zb21lKFxuICAgICAgKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIsXG4gICAgKSAmJlxuICAgIGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiZcbiAgICBjb25maWd1cmVkQW1vdW50cy5sZW5ndGhcbiAgKSB7XG4gICAgY29uZmlndXJlZENvbmRpdGlvbnMucHVzaCh7XG4gICAgICBrZXk6IFwiY29uZGl0aW9uLWxlZ2FjeS1jdXJyZW5jeVwiLFxuICAgICAgYXR0cmlidXRlOiBcImN1cnJlbmN5X2NvZGVcIixcbiAgICAgIG9wZXJhdG9yOiBjb25maWd1cmVkQW1vdW50cy5sZW5ndGggPT09IDEgPyBcImVxXCIgOiBcImluXCIsXG4gICAgICB2YWx1ZXM6IGNvbmZpZ3VyZWRBbW91bnRzLm1hcCgoYW1vdW50KSA9PlxuICAgICAgICBhbW91bnQuY3VycmVuY3lfY29kZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgKSxcbiAgICB9KVxuICB9XG4gIGlmIChcbiAgICAhY29uZmlndXJlZENvbmRpdGlvbnMuc29tZShcbiAgICAgIChjb25kaXRpb24pID0+IGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwic2FsZXNfY2hhbm5lbF9pZFwiLFxuICAgICkgJiZcbiAgICBwcm9kdWN0LnNhbGVzX2NoYW5uZWxzPy5sZW5ndGhcbiAgKSB7XG4gICAgY29uZmlndXJlZENvbmRpdGlvbnMucHVzaCh7XG4gICAgICBrZXk6IFwiY29uZGl0aW9uLWxlZ2FjeS1zYWxlcy1jaGFubmVsXCIsXG4gICAgICBhdHRyaWJ1dGU6IFwic2FsZXNfY2hhbm5lbF9pZFwiLFxuICAgICAgb3BlcmF0b3I6IHByb2R1Y3Quc2FsZXNfY2hhbm5lbHMubGVuZ3RoID09PSAxID8gXCJlcVwiIDogXCJpblwiLFxuICAgICAgdmFsdWVzOiBwcm9kdWN0LnNhbGVzX2NoYW5uZWxzLm1hcCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5pZCksXG4gICAgfSlcbiAgfVxuICBjb25zdCBleHBpcmF0aW9uUG9saWN5ID0gY29uZmlnLmV4cGlyYXRpb25fcG9saWN5XG4gIGNvbnN0IGNvbmZpZ3VyZWRBbW91bnRSb3dzID0gY29uZmlndXJlZEFtb3VudHMubWFwKChyb3csIGluZGV4KSA9PiAoe1xuICAgIGtleTogYGNvdXBvbi12YWx1ZS0ke2luZGV4fWAsXG4gICAgYW1vdW50OiBTdHJpbmcocm93LmFtb3VudCksXG4gICAgY3VycmVuY3lfY29kZTogcm93LmN1cnJlbmN5X2NvZGUudG9Mb3dlckNhc2UoKSxcbiAgfSkpXG4gIGNvbnN0IGFtb3VudFJvd3MgPVxuICAgIGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgID8gcmVjb25jaWxlQ291cG9uQW1vdW50cyhcbiAgICAgICAgY29uZmlndXJlZEFtb3VudFJvd3MsXG4gICAgICAgIGVmZmVjdGl2ZUNvdXBvbkN1cnJlbmNpZXMoY29uZmlndXJlZENvbmRpdGlvbnMsIG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXSksXG4gICAgICApXG4gICAgICA6IGNvbmZpZ3VyZWRBbW91bnRSb3dzXG5cbiAgcmV0dXJuIHtcbiAgICBwcm9kdWN0OiB7XG4gICAgICAuLi5lbXB0eVByb2R1Y3Qob3B0aW9ucyksXG4gICAgICB0aXRsZTogcHJvZHVjdC50aXRsZSB8fCBcIlwiLFxuICAgICAgc3VidGl0bGU6IHByb2R1Y3Quc3VidGl0bGUgfHwgXCJcIixcbiAgICAgIGhhbmRsZTogcHJvZHVjdC5oYW5kbGUgfHwgXCJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9kdWN0LmRlc2NyaXB0aW9uIHx8IFwiXCIsXG4gICAgICBtZWRpYSxcbiAgICAgIHNrdTogdmFyaWFudD8uc2t1IHx8IFwiXCIsXG4gICAgICBwcmljZV9hbW91bnRzOiB7XG4gICAgICAgIC4uLmVtcHR5UHJvZHVjdChvcHRpb25zKS5wcmljZV9hbW91bnRzLFxuICAgICAgICAuLi5wcmljZXMsXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiBwcm9kdWN0LnN0YXR1cyB8fCBcImRyYWZ0XCIsXG4gICAgICBkaXNjb3VudGFibGU6IEJvb2xlYW4ocHJvZHVjdC5kaXNjb3VudGFibGUpLFxuICAgICAgdHlwZV9pZDogcHJvZHVjdC50eXBlX2lkIHx8IFwiXCIsXG4gICAgICBjb2xsZWN0aW9uX2lkOiBwcm9kdWN0LmNvbGxlY3Rpb25faWQgfHwgXCJcIixcbiAgICAgIGNhdGVnb3J5X2lkOiBwcm9kdWN0LmNhdGVnb3JpZXM/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIHRhZ19pZDogcHJvZHVjdC50YWdzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgfSxcbiAgICBjb3Vwb246IHtcbiAgICAgIC4uLmVtcHR5Q291cG9uKG9wdGlvbnMpLFxuICAgICAgZW5hYmxlZDogY29uZmlnLmVuYWJsZWQsXG4gICAgICB0eXBlOiBjb3Vwb25UeXBlRnJvbUNvbmZpZyhjb25maWcpLFxuICAgICAgcHVyY2hhc2VfY29uZGl0aW9uczogY29uZmlndXJlZENvbmRpdGlvbnMsXG4gICAgICBhbW91bnRzOlxuICAgICAgICBjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgPyBhbW91bnRSb3dzXG4gICAgICAgICAgOiBhbW91bnRSb3dzLmxlbmd0aFxuICAgICAgICAgICAgPyBhbW91bnRSb3dzXG4gICAgICAgICAgICA6IGVtcHR5Q291cG9uKG9wdGlvbnMpLmFtb3VudHMsXG4gICAgICBwZXJjZW50YWdlOiBjb25maWcucGVyY2VudGFnZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhjb25maWcucGVyY2VudGFnZSksXG4gICAgICBhbGxvY2F0aW9uOlxuICAgICAgICBjb25maWcucHJvbW90aW9uX3RlbXBsYXRlPy5hcHBsaWNhdGlvbl9tZXRob2Q/LmFsbG9jYXRpb24gPT09IFwib25jZVwiXG4gICAgICAgICAgPyAoXCJvbmNlXCIgYXMgY29uc3QpXG4gICAgICAgICAgOiAoXCJlYWNoXCIgYXMgY29uc3QpLFxuICAgICAgY29kZV9zdHJhdGVneTogY29uZmlnLmNvZGVfc3RyYXRlZ3ksXG4gICAgICBjb2RlX3ByZWZpeDogY29uZmlnLmNvZGVfcHJlZml4IHx8IFwiXCIsXG4gICAgICBzaGFyZWRfY29kZTogY29uZmlnLnNoYXJlZF9jb2RlIHx8IFwiXCIsXG4gICAgICBleHBpcmF0aW9uX3R5cGU6IGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSB8fCBcImR1cmF0aW9uXCIsXG4gICAgICBleHBpcmF0aW9uX2RheXM6XG4gICAgICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSA9PT0gXCJkdXJhdGlvblwiXG4gICAgICAgICAgPyBTdHJpbmcoY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmR1cmF0aW9uX2RheXMpXG4gICAgICAgICAgOiBcIjMwXCIsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6XG4gICAgICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSA9PT0gXCJmaXhlZFwiXG4gICAgICAgICAgPyB0b0RhdGVUaW1lTG9jYWwoY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmV4cGlyZXNfYXQpXG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246XG4gICAgICAgIGV4cGlyYXRpb25Qb2xpY3kudHlwZSA9PT0gXCJub25lXCIgfHxcbiAgICAgICAgZXhwaXJhdGlvblBvbGljeS5jYXBfYnlfY2FtcGFpZ24gIT09IGZhbHNlLFxuICAgICAgZXhwaXJhdGlvbl9jYXBfYXQ6XG4gICAgICAgIGV4cGlyYXRpb25Qb2xpY3kudHlwZSA9PT0gXCJub25lXCJcbiAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICA6IHRvRGF0ZVRpbWVMb2NhbChleHBpcmF0aW9uUG9saWN5LmNhcF9hdCksXG4gICAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IFN0cmluZyhcbiAgICAgICAgY29uZmlnLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSB8fCAxLFxuICAgICAgKSxcbiAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogY29uZmlnLnByb21vdGlvbl9taXJyb3JfbW9kZSB8fCBcIm5vbmVcIixcbiAgICAgIHByb21vdGlvbl9zdGF0dXM6IGNvbmZpZy5wcm9tb3Rpb25fc3RhdHVzIHx8IFwiZHJhZnRcIixcbiAgICB9LFxuICAgIGNhbXBhaWduOiB7XG4gICAgICAuLi5lbXB0eUNhbXBhaWduLFxuICAgICAgbW9kZTogY29uZmlnLmNhbXBhaWduX2lkID8gKFwiZXhpc3RpbmdcIiBhcyBjb25zdCkgOiAoXCJub25lXCIgYXMgY29uc3QpLFxuICAgICAgY2FtcGFpZ25faWQ6IGNvbmZpZy5jYW1wYWlnbl9pZCB8fCBcIlwiLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgbW9kYWxDb250ZW50U3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbn1cblxuY29uc3QgbW9kYWxXaXphcmRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXg6IFwiMSAxIGF1dG9cIixcbiAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgbWluSGVpZ2h0OiAwLFxuICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbn1cblxuY29uc3QgdmlzdWFsbHlIaWRkZW5TdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgY2xpcDogXCJyZWN0KDAgMCAwIDApXCIsXG4gIGNsaXBQYXRoOiBcImluc2V0KDUwJSlcIixcbiAgaGVpZ2h0OiAxLFxuICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgd2hpdGVTcGFjZTogXCJub3dyYXBcIixcbiAgd2lkdGg6IDEsXG59XG5cbmNvbnN0IG1vZGFsQm9keVN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBmbGV4OiBcIjEgMSBhdXRvXCIsXG4gIG1pbkhlaWdodDogMCxcbiAgcGFkZGluZzogMCxcbn1cblxuY29uc3QgbW9kYWxTY3JvbGxTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgb3ZlcmZsb3dZOiBcImF1dG9cIixcbiAgcGFkZGluZzogXCI2NHB4IDI0cHggMTEycHhcIixcbiAgd2lkdGg6IFwiMTAwJVwiLFxufVxuXG5jb25zdCBtb2RhbEZvcm1TdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgbWFyZ2luOiBcIjAgYXV0b1wiLFxuICBtYXhXaWR0aDogNzIwLFxuICB3aWR0aDogXCJtaW4oNzIwcHgsIDEwMCUpXCIsXG59XG5cbmNvbnN0IHN0YWNrU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBnYXA6IDI0LFxufVxuXG5jb25zdCB0d29Db2x1bW5HcmlkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICBnYXA6IDE2LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDI2MHB4LCAxZnIpKVwiLFxufVxuXG5jb25zdCB0aHJlZUNvbHVtbkdyaWRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJncmlkXCIsXG4gIGdhcDogMTYsXG4gIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMTgwcHgsIDFmcikpXCIsXG59XG5cbmNvbnN0IHBhbmVsU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGJvcmRlcjogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gIGJvcmRlclJhZGl1czogOCxcbiAgcGFkZGluZzogMTYsXG59XG5cbmZ1bmN0aW9uIEZpZWxkKHtcbiAgY2hpbGRyZW4sXG4gIGxhYmVsLFxuICBvcHRpb25hbCxcbiAgdG9vbHRpcCxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZVxuICBsYWJlbDogc3RyaW5nXG4gIG9wdGlvbmFsPzogYm9vbGVhblxuICB0b29sdGlwPzogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTFcIiBzdHlsZT17eyBtaW5XaWR0aDogMCB9fT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMVwiPlxuICAgICAgICA8TGFiZWw+e2xhYmVsfTwvTGFiZWw+XG4gICAgICAgIHt0b29sdGlwICYmIChcbiAgICAgICAgICA8VG9vbHRpcCBjb250ZW50PXt0b29sdGlwfT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2Ake2xhYmVsfSBpbmZvcm1hdGlvbmB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8SW5mb3JtYXRpb25DaXJjbGUgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgKX1cbiAgICAgICAge29wdGlvbmFsICYmIChcbiAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAoT3B0aW9uYWwpXG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VjdGlvbih7XG4gIGNoaWxkcmVuLFxuICBkZXNjcmlwdGlvbixcbiAgdGl0bGUsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktNFwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMlwiPnt0aXRsZX08L0hlYWRpbmc+XG4gICAgICAgIHtkZXNjcmlwdGlvbiAmJiAoXG4gICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAge2Rlc2NyaXB0aW9ufVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvc2VjdGlvbj5cbiAgKVxufVxuXG5mdW5jdGlvbiBPcHRpb25TZWxlY3Qoe1xuICBvbkNoYW5nZSxcbiAgb3B0aW9ucyxcbiAgdmFsdWUsXG59OiB7XG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICBvcHRpb25zOiBPcHRpb25SZWNvcmRbXVxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFxuICAgICAgdmFsdWU9e3ZhbHVlIHx8IE5PTkV9XG4gICAgICBvblZhbHVlQ2hhbmdlPXsobmV4dCkgPT4gb25DaGFuZ2UobmV4dCA9PT0gTk9ORSA/IFwiXCIgOiBuZXh0KX1cbiAgICA+XG4gICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT17Tk9ORX0+Tm9uZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgIHtvcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17b3B0aW9uLmlkfSB2YWx1ZT17b3B0aW9uLmlkfT5cbiAgICAgICAgICAgIHtvcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICkpfVxuICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICA8L1NlbGVjdD5cbiAgKVxufVxuXG5mdW5jdGlvbiBDdXJyZW5jeVNlbGVjdCh7XG4gIGN1cnJlbmNpZXMsXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXVxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RcbiAgICAgIHZhbHVlPXt2YWx1ZSB8fCB1bmRlZmluZWR9XG4gICAgICBkaXNhYmxlZD17IWN1cnJlbmNpZXMubGVuZ3RofVxuICAgICAgb25WYWx1ZUNoYW5nZT17b25DaGFuZ2V9XG4gICAgPlxuICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICA8U2VsZWN0LlZhbHVlXG4gICAgICAgICAgcGxhY2Vob2xkZXI9e1xuICAgICAgICAgICAgY3VycmVuY2llcy5sZW5ndGggPyBcIlNlbGVjdCBjdXJyZW5jeVwiIDogXCJObyBjdXJyZW5jaWVzIGF2YWlsYWJsZVwiXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAge2N1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gKFxuICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e2N1cnJlbmN5LmNvZGV9IHZhbHVlPXtjdXJyZW5jeS5jb2RlfT5cbiAgICAgICAgICAgIHtjdXJyZW5jeS5uYW1lfSAoe2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX0pXG4gICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgKSl9XG4gICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgIDwvU2VsZWN0PlxuICApXG59XG5cbmZ1bmN0aW9uIEN1cnJlbmN5QW1vdW50RmllbGQoe1xuICBjdXJyZW5jaWVzLFxuICBjdXJyZW5jeUNvZGUsXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXVxuICBjdXJyZW5jeUNvZGU6IHN0cmluZ1xuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBjdXJyZW5jeUNvZGUpXG4gIGNvbnN0IGNvZGUgPSBjdXJyZW5jeUNvZGUudG9VcHBlckNhc2UoKVxuICBjb25zdCBkZWNpbWFscyA9IGN1cnJlbmN5RGVjaW1hbERpZ2l0cyhjb2RlIHx8IFwiVVNEXCIpXG4gIHJldHVybiAoXG4gICAgPEN1cnJlbmN5SW5wdXRcbiAgICAgIGNvZGU9e2NvZGUgfHwgXCJVU0RcIn1cbiAgICAgIHN5bWJvbD17XG4gICAgICAgIGN1cnJlbmN5Py5zeW1ib2xfbmF0aXZlIHx8XG4gICAgICAgIGN1cnJlbmN5Py5zeW1ib2wgfHxcbiAgICAgICAgY3VycmVuY3lTeW1ib2woY29kZSB8fCBcIlVTRFwiKVxuICAgICAgfVxuICAgICAgbWluPXswfVxuICAgICAgZGVjaW1hbFNjYWxlPXtkZWNpbWFsc31cbiAgICAgIGRlY2ltYWxzTGltaXQ9e2RlY2ltYWxzfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgZGlzYWJsZWQ9eyFjdXJyZW5jeUNvZGV9XG4gICAgICBvblZhbHVlQ2hhbmdlPXsobmV4dFZhbHVlKSA9PiBvbkNoYW5nZShuZXh0VmFsdWUgfHwgXCJcIil9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBQZXJjZW50YWdlSW5wdXQoe1xuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1zdHJldGNoXCIgc3R5bGU9e3sgd2lkdGg6IFwiMTAwJVwiIH19PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJiZy11aS1iZy1maWVsZCB0ZXh0LXVpLWZnLW11dGVkIGZsZXggaXRlbXMtY2VudGVyIGJvcmRlclwiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IFwidmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjZweCAwIDAgNnB4XCIsXG4gICAgICAgICAgYm9yZGVyUmlnaHQ6IDAsXG4gICAgICAgICAgcGFkZGluZzogXCIwIDEycHhcIixcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgJVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cIm1pbi13LTAgZmxleC0xXCJcbiAgICAgICAgc3R5bGU9e3sgZmxleDogXCIxIDEgMCVcIiwgbWluV2lkdGg6IDAgfX1cbiAgICAgID5cbiAgICAgICAgPElucHV0XG4gICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsXCJcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICBtaW49ezF9XG4gICAgICAgICAgbWF4PXsxMDB9XG4gICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMCA2cHggNnB4IDBcIixcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IG9uQ2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSl9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBIYW5kbGVJbnB1dCh7XG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWQgcG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIHotMTAgZmxleCBtaW4tdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXItciBweC0yLjVcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidHh0LWNvbXBhY3Qtc21hbGwgZm9udC1tZWRpdW1cIj4vPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8SW5wdXRcbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBwbGFjZWhvbGRlcj1cIndpbnRlci1qYWNrZXRcIlxuICAgICAgICBzdHlsZT17eyBwYWRkaW5nTGVmdDogMzQgfX1cbiAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gb25DaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gTWVkaWFVcGxvYWQoe1xuICBpc1VwbG9hZGluZyxcbiAgbWVkaWEsXG4gIG9uUmVtb3ZlLFxuICBvblVwbG9hZCxcbn06IHtcbiAgaXNVcGxvYWRpbmc6IGJvb2xlYW5cbiAgbWVkaWE6IFByb2R1Y3RNZWRpYVtdXG4gIG9uUmVtb3ZlOiAobWVkaWE6IFByb2R1Y3RNZWRpYSkgPT4gdm9pZFxuICBvblVwbG9hZDogKGZpbGVzOiBGaWxlW10pID0+IHZvaWRcbn0pIHtcbiAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWY8SFRNTElucHV0RWxlbWVudD4obnVsbClcbiAgY29uc3QgYWNjZXB0ID1cbiAgICBcImltYWdlL2pwZWcsaW1hZ2UvcG5nLGltYWdlL2dpZixpbWFnZS93ZWJwLGltYWdlL2hlaWMsaW1hZ2Uvc3ZnK3htbFwiXG5cbiAgY29uc3QgaGFuZGxlRmlsZXMgPSAoZmlsZXM6IEZpbGVMaXN0IHwgbnVsbCkgPT4ge1xuICAgIGlmICghZmlsZXM/Lmxlbmd0aCkgcmV0dXJuXG4gICAgb25VcGxvYWQoQXJyYXkuZnJvbShmaWxlcykpXG4gIH1cblxuICBjb25zdCBoYW5kbGVEcm9wID0gKGV2ZW50OiBEcmFnRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGhhbmRsZUZpbGVzKGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcylcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTNcIj5cbiAgICAgIHttZWRpYS5sZW5ndGggPiAwICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImdyaWQgZ2FwLTNcIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMjBweCwgMWZyKSlcIixcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge21lZGlhLm1hcCgoaXRlbSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAga2V5PXtpdGVtLmFzc2V0X2lkIHx8IGl0ZW0udXJsfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZCBib3JkZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgc3JjPXtpdGVtLnVybH1cbiAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtMzIgdy1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgaGVpZ2h0OiAxMjggfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC14LTAgYm90dG9tLTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJnLWJsYWNrLzYwIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJ4c21hbGxcIiBzdHlsZT17eyBjb2xvcjogXCJ3aGl0ZVwiIH19PlxuICAgICAgICAgICAgICAgICAge2luZGV4ID09PSAwID8gXCJUaHVtYm5haWxcIiA6IGBJbWFnZSAke2luZGV4ICsgMX1gfVxuICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IFwid2hpdGVcIiB9fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25SZW1vdmUoaXRlbSl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPFhNYXJrTWluaSAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8aW5wdXRcbiAgICAgICAgcmVmPXtpbnB1dFJlZn1cbiAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICBoaWRkZW5cbiAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgYWNjZXB0PXthY2NlcHR9XG4gICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICBoYW5kbGVGaWxlcyhldmVudC50YXJnZXQuZmlsZXMpXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gXCJcIlxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGRpc2FibGVkPXtpc1VwbG9hZGluZ31cbiAgICAgICAgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZCBmbGV4IHctZnVsbCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLXktMiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItZGFzaGVkIHAtOFwiXG4gICAgICAgIHN0eWxlPXt7IG1pbkhlaWdodDogMTQ4IH19XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IGlucHV0UmVmLmN1cnJlbnQ/LmNsaWNrKCl9XG4gICAgICAgIG9uRHJhZ092ZXI9eyhldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKX1cbiAgICAgICAgb25Ecm9wPXtoYW5kbGVEcm9wfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLWJhc2UgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMlwiPlxuICAgICAgICAgIDxBcnJvd1VwVHJheSAvPlxuICAgICAgICAgIHtpc1VwbG9hZGluZyA/IFwiVXBsb2FkaW5nIGltYWdlcy4uLlwiIDogXCJVcGxvYWQgaW1hZ2VzXCJ9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgIERyYWcgYW5kIGRyb3AgaW1hZ2VzIGhlcmUgb3IgY2xpY2sgdG8gdXBsb2FkLlxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG50eXBlIENvbmRpdGlvblZhbHVlT3B0aW9uID0geyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1cblxuZnVuY3Rpb24gY29uZGl0aW9uVmFsdWVPcHRpb25zKFxuICBhdHRyaWJ1dGU6IFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlIHwgXCJcIixcbiAgb3B0aW9uczogT3B0aW9uc1BheWxvYWQsXG4pOiBDb25kaXRpb25WYWx1ZU9wdGlvbltdIHtcbiAgaWYgKGF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIpIHtcbiAgICByZXR1cm4gKG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXSkubWFwKChjdXJyZW5jeSkgPT4gKHtcbiAgICAgIHZhbHVlOiBjdXJyZW5jeS5jb2RlLFxuICAgICAgbGFiZWw6IGAke2N1cnJlbmN5Lm5hbWV9ICgke2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX0pYCxcbiAgICB9KSlcbiAgfVxuICBpZiAoYXR0cmlidXRlID09PSBcInNoaXBwaW5nX2FkZHJlc3MuY291bnRyeV9jb2RlXCIpIHtcbiAgICByZXR1cm4gKG9wdGlvbnMuY291bnRyaWVzIHx8IFtdKS5tYXAoKGNvdW50cnkpID0+ICh7XG4gICAgICB2YWx1ZTogU3RyaW5nKGNvdW50cnkuaXNvXzIgfHwgY291bnRyeS5pZCkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGxhYmVsOiBjb3VudHJ5LmRpc3BsYXlfbmFtZSB8fCBjb3VudHJ5Lm5hbWUgfHwgY291bnRyeS5pZCxcbiAgICB9KSlcbiAgfVxuXG4gIGNvbnN0IHJlY29yZHMgPVxuICAgIGF0dHJpYnV0ZSA9PT0gXCJjdXN0b21lci5ncm91cHMuaWRcIlxuICAgICAgPyBvcHRpb25zLmN1c3RvbWVyX2dyb3Vwc1xuICAgICAgOiBhdHRyaWJ1dGUgPT09IFwicmVnaW9uLmlkXCJcbiAgICAgICAgPyBvcHRpb25zLnJlZ2lvbnNcbiAgICAgICAgOiBhdHRyaWJ1dGUgPT09IFwic2FsZXNfY2hhbm5lbF9pZFwiXG4gICAgICAgICAgPyBvcHRpb25zLnNhbGVzX2NoYW5uZWxzXG4gICAgICAgICAgOiBbXVxuICByZXR1cm4gKHJlY29yZHMgfHwgW10pLm1hcCgocmVjb3JkKSA9PiAoe1xuICAgIHZhbHVlOiByZWNvcmQuaWQsXG4gICAgbGFiZWw6IG9wdGlvbkxhYmVsKHJlY29yZCksXG4gIH0pKVxufVxuXG5mdW5jdGlvbiBNdWx0aUNvbmRpdGlvblZhbHVlcyh7XG4gIGF0dHJpYnV0ZSxcbiAgb25DaGFuZ2UsXG4gIG9wdGlvbnMsXG4gIHZhbHVlLFxufToge1xuICBhdHRyaWJ1dGU6IFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZ1tdKSA9PiB2b2lkXG4gIG9wdGlvbnM6IENvbmRpdGlvblZhbHVlT3B0aW9uW11cbiAgdmFsdWU6IHN0cmluZ1tdXG59KSB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZHJhZnQsIHNldERyYWZ0XSA9IHVzZVN0YXRlKHZhbHVlKVxuICBjb25zdCBbc2VhcmNoLCBzZXRTZWFyY2hdID0gdXNlU3RhdGUoXCJcIilcbiAgY29uc3QgbGFiZWxzID0gT2JqZWN0LmZyb21FbnRyaWVzKG9wdGlvbnMubWFwKChvcHRpb24pID0+IFtvcHRpb24udmFsdWUsIG9wdGlvbi5sYWJlbF0pKVxuICBjb25zdCBmaWx0ZXJlZCA9IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwganVzdGlmeS1zdGFydFwiXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICBzZXREcmFmdCh2YWx1ZSlcbiAgICAgICAgICBzZXRTZWFyY2goXCJcIilcbiAgICAgICAgICBzZXRPcGVuKHRydWUpXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHt2YWx1ZS5sZW5ndGhcbiAgICAgICAgICA/IHZhbHVlLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBsYWJlbHNbdmFsdWVbMF1dIHx8IHZhbHVlWzBdXG4gICAgICAgICAgICA6IGAke3ZhbHVlLmxlbmd0aH0gdmFsdWVzIHNlbGVjdGVkYFxuICAgICAgICAgIDogXCJTZWxlY3QgdmFsdWVzXCJ9XG4gICAgICA8L0J1dHRvbj5cbiAgICAgIHt2YWx1ZS5sZW5ndGggPiAwICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZsZXggZmxleC13cmFwIGdhcC0xXCI+XG4gICAgICAgICAge3ZhbHVlLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAga2V5PXtpdGVtfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZy11aS1iZy1jb21wb25lbnQgdGV4dC11aS1mZy1zdWJ0bGUgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMSByb3VuZGVkLW1kIGJvcmRlciBweC0yIHB5LTEgdGV4dC14c1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtsYWJlbHNbaXRlbV0gfHwgaXRlbX1cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2BSZW1vdmUgJHtsYWJlbHNbaXRlbV0gfHwgaXRlbX1gfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uQ2hhbmdlKHZhbHVlLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSBpdGVtKSl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8WE1hcmtNaW5pIC8+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8RHJhd2VyIG9wZW49e29wZW59IG9uT3BlbkNoYW5nZT17c2V0T3Blbn0+XG4gICAgICAgIDxEcmF3ZXIuQ29udGVudD5cbiAgICAgICAgICA8RHJhd2VyLkhlYWRlcj5cbiAgICAgICAgICAgIDxEcmF3ZXIuVGl0bGU+XG4gICAgICAgICAgICAgIFNlbGVjdCB7Y29uZGl0aW9uQXR0cmlidXRlcy5maW5kKChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSBhdHRyaWJ1dGUpPy5sYWJlbH1cbiAgICAgICAgICAgIDwvRHJhd2VyLlRpdGxlPlxuICAgICAgICAgIDwvRHJhd2VyLkhlYWRlcj5cbiAgICAgICAgICA8RHJhd2VyLkJvZHkgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0zIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgIHZhbHVlPXtzZWFyY2h9XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHZhbHVlc1wiXG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHNldFNlYXJjaChldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtmaWx0ZXJlZC5sZW5ndGggPyAoXG4gICAgICAgICAgICAgIGZpbHRlcmVkLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICBrZXk9e29wdGlvbi52YWx1ZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIGdhcC14LTMgcm91bmRlZC1tZCBib3JkZXIgcC0zXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17ZHJhZnQuaW5jbHVkZXMob3B0aW9uLnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXREcmFmdCgoY3VycmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmN1cnJlbnQsIG9wdGlvbi52YWx1ZV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnQuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IG9wdGlvbi52YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPFRleHQ+e29wdGlvbi5sYWJlbH08L1RleHQ+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxUZXh0IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5ObyBtYXRjaGluZyB2YWx1ZXMuPC9UZXh0PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0RyYXdlci5Cb2R5PlxuICAgICAgICAgIDxEcmF3ZXIuRm9vdGVyPlxuICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpID0+IHNldE9wZW4oZmFsc2UpfT5cbiAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGRpc2FibGVkPXshZHJhZnQubGVuZ3RofVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgb25DaGFuZ2UoZHJhZnQpXG4gICAgICAgICAgICAgICAgc2V0T3BlbihmYWxzZSlcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQXBwbHlcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDwvRHJhd2VyLkZvb3Rlcj5cbiAgICAgICAgPC9EcmF3ZXIuQ29udGVudD5cbiAgICAgIDwvRHJhd2VyPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIFB1cmNoYXNlQ29uZGl0aW9uc0ZpZWxkKHtcbiAgZml4ZWRBbW91bnQsXG4gIG9uQ2hhbmdlLFxuICBvcHRpb25zLFxuICB2YWx1ZSxcbn06IHtcbiAgZml4ZWRBbW91bnQ6IGJvb2xlYW5cbiAgb25DaGFuZ2U6IChjb25kaXRpb25zOiBQdXJjaGFzZUNvbmRpdGlvbkZvcm1bXSkgPT4gdm9pZFxuICBvcHRpb25zOiBPcHRpb25zUGF5bG9hZFxuICB2YWx1ZTogUHVyY2hhc2VDb25kaXRpb25Gb3JtW11cbn0pIHtcbiAgY29uc3Qgc2VsZWN0ZWRBdHRyaWJ1dGVzID0gbmV3IFNldChcbiAgICB2YWx1ZS5tYXAoKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLmF0dHJpYnV0ZSkuZmlsdGVyKEJvb2xlYW4pLFxuICApXG5cbiAgY29uc3QgcmVwbGFjZSA9IChrZXk6IHN0cmluZywgdXBkYXRlOiBQYXJ0aWFsPFB1cmNoYXNlQ29uZGl0aW9uRm9ybT4pID0+XG4gICAgb25DaGFuZ2UoXG4gICAgICB2YWx1ZS5tYXAoKGNvbmRpdGlvbikgPT5cbiAgICAgICAgY29uZGl0aW9uLmtleSA9PT0ga2V5ID8geyAuLi5jb25kaXRpb24sIC4uLnVwZGF0ZSB9IDogY29uZGl0aW9uLFxuICAgICAgKSxcbiAgICApXG5cbiAgcmV0dXJuIChcbiAgICA8U2VjdGlvblxuICAgICAgdGl0bGU9XCJXaG8gY2FuIHB1cmNoYXNlIHRoaXMgY291cG9uP1wiXG4gICAgICBkZXNjcmlwdGlvbj1cIkNvdXBvbiBwcm9kdWN0cyBjYW4gYmUgcHVyY2hhc2VkIGJ5IGFsbCBjdXN0b21lcnMgd2hlbiBubyBjb25kaXRpb25zIGFyZSBjb25maWd1cmVkLiBDb25kaXRpb25zIGFyZSBjb21iaW5lZCB3aXRoIEFORC5cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0zXCI+XG4gICAgICAgIHt2YWx1ZS5tYXAoKGNvbmRpdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBjb25kaXRpb25WYWx1ZU9wdGlvbnMoY29uZGl0aW9uLmF0dHJpYnV0ZSwgb3B0aW9ucylcbiAgICAgICAgICBjb25zdCBjdXJyZW5jeVJlcXVpcmVkID1cbiAgICAgICAgICAgIGZpeGVkQW1vdW50ICYmIGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYga2V5PXtjb25kaXRpb24ua2V5fT5cbiAgICAgICAgICAgICAge2luZGV4ID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkIGZsZXggaC04IGl0ZW1zLWNlbnRlciB0ZXh0LXhzIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICBBTkRcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cGFuZWxTdHlsZX0gY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleCBmbGV4LWNvbCBnYXAteS0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGdhcC14LTJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29uZGl0aW9uLmF0dHJpYnV0ZSB8fCB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2N1cnJlbmN5UmVxdWlyZWR9XG4gICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KGF0dHJpYnV0ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoY29uZGl0aW9uLmtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU6IGF0dHJpYnV0ZSBhcyBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgcGxhY2Vob2xkZXI9XCJTZWxlY3QgYXR0cmlidXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb25kaXRpb25BdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJpYnV0ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9PT0gY29uZGl0aW9uLmF0dHJpYnV0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChhdHRyaWJ1dGUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXthdHRyaWJ1dGUudmFsdWV9IHZhbHVlPXthdHRyaWJ1dGUudmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2F0dHJpYnV0ZS5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2N1cnJlbmN5UmVxdWlyZWR9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgY29uZGl0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZSh2YWx1ZS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ua2V5ICE9PSBjb25kaXRpb24ua2V5KSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8WE1hcmtNaW5pIC8+XG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29uZGl0aW9uLm9wZXJhdG9yIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjb25kaXRpb24uYXR0cmlidXRlfVxuICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsob3BlcmF0b3IpID0+XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZShjb25kaXRpb24ua2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogb3BlcmF0b3IgYXMgUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPT09IFwiZXFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29uZGl0aW9uLnZhbHVlcy5zbGljZSgwLCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uZGl0aW9uLnZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIHBsYWNlaG9sZGVyPVwiU2VsZWN0IG9wZXJhdG9yXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIHtjb25kaXRpb25PcGVyYXRvcnMubWFwKChvcGVyYXRvcikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17b3BlcmF0b3IudmFsdWV9IHZhbHVlPXtvcGVyYXRvci52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtvcGVyYXRvci5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIHtjb25kaXRpb24uYXR0cmlidXRlICYmIGNvbmRpdGlvbi5vcGVyYXRvciA9PT0gXCJlcVwiID8gKFxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbmRpdGlvbi52YWx1ZXNbMF0gfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhzZWxlY3RlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoY29uZGl0aW9uLmtleSwgeyB2YWx1ZXM6IFtzZWxlY3RlZF0gfSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHZhbHVlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZXMubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17b3B0aW9uLnZhbHVlfSB2YWx1ZT17b3B0aW9uLnZhbHVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICApIDogY29uZGl0aW9uLmF0dHJpYnV0ZSAmJiBjb25kaXRpb24ub3BlcmF0b3IgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxNdWx0aUNvbmRpdGlvblZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZT17Y29uZGl0aW9uLmF0dHJpYnV0ZX1cbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXt2YWx1ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbmRpdGlvbi52YWx1ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZXMpID0+IHJlcGxhY2UoY29uZGl0aW9uLmtleSwgeyB2YWx1ZXMgfSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgZGlzYWJsZWQgY2xhc3NOYW1lPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKVxuICAgICAgICB9KX1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIGRpc2FibGVkPXtzZWxlY3RlZEF0dHJpYnV0ZXMuc2l6ZSA+PSBjb25kaXRpb25BdHRyaWJ1dGVzLmxlbmd0aH1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgIG9uQ2hhbmdlKFtcbiAgICAgICAgICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgICAgICAgICB7IGtleTogY29uZGl0aW9uS2V5KCksIGF0dHJpYnV0ZTogXCJcIiwgb3BlcmF0b3I6IFwiXCIsIHZhbHVlczogW10gfSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8UGx1cyAvPiBBZGQgY29uZGl0aW9uXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB2YXJpYW50PVwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgb25DaGFuZ2UoZml4ZWRBbW91bnQgPyBkZWZhdWx0UHVyY2hhc2VDb25kaXRpb25zKG9wdGlvbnMpIDogW10pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgQ2xlYXIgYWxsXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9TZWN0aW9uPlxuICApXG59XG5cbmZ1bmN0aW9uIFByb2R1Y3RQcmljZXNUYWJsZSh7XG4gIGN1cnJlbmNpZXMsXG4gIGNvdXBvblZhbHVlLFxuICBvbkNoYW5nZSxcbiAgcHJpY2VzLFxufToge1xuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdXG4gIGNvdXBvblZhbHVlOiBzdHJpbmdcbiAgb25DaGFuZ2U6IChjdXJyZW5jeUNvZGU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICBwcmljZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn0pIHtcbiAgY29uc3QgW3Zpc2libGVDdXJyZW5jaWVzLCBzZXRWaXNpYmxlQ3VycmVuY2llc10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oKCkgPT5cbiAgICBjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpLFxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRWaXNpYmxlQ3VycmVuY2llcygoY3VycmVudCkgPT4ge1xuICAgICAgY29uc3QgYXZhaWxhYmxlID0gbmV3IFNldChjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpKVxuICAgICAgY29uc3QgcmV0YWluZWQgPSBjdXJyZW50LmZpbHRlcigoY29kZSkgPT4gYXZhaWxhYmxlLmhhcyhjb2RlKSlcbiAgICAgIGNvbnN0IGFkZGVkID0gY3VycmVuY2llc1xuICAgICAgICAubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSlcbiAgICAgICAgLmZpbHRlcigoY29kZSkgPT4gIWN1cnJlbnQuaW5jbHVkZXMoY29kZSkpXG4gICAgICByZXR1cm4gWy4uLnJldGFpbmVkLCAuLi5hZGRlZF1cbiAgICB9KVxuICB9LCBbY3VycmVuY2llc10pXG5cbiAgY29uc3Qgc2hvd25DdXJyZW5jaWVzID0gY3VycmVuY2llcy5maWx0ZXIoKGN1cnJlbmN5KSA9PlxuICAgIHZpc2libGVDdXJyZW5jaWVzLmluY2x1ZGVzKGN1cnJlbmN5LmNvZGUpLFxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggc2l6ZS1mdWxsIGZsZXgtY29sIGRpdmlkZS15IG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy11aS1iZy1zdWJ0bGUgZmxleCBzaXplLWZ1bGwgZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy11aS1iZy1iYXNlIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIj5cbiAgICAgICAgICAgIDxEcm9wZG93bk1lbnU+XG4gICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgIDxBZGp1c3RtZW50cyAvPlxuICAgICAgICAgICAgICAgICAgVmlld1xuICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5UcmlnZ2VyPlxuICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LkNvbnRlbnQgYWxpZ249XCJzdGFydFwiPlxuICAgICAgICAgICAgICAgIHtjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IChcbiAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuQ2hlY2tib3hJdGVtXG4gICAgICAgICAgICAgICAgICAgIGtleT17Y3VycmVuY3kuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17dmlzaWJsZUN1cnJlbmNpZXMuaW5jbHVkZXMoY3VycmVuY3kuY29kZSl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZUN1cnJlbmNpZXMoKGN1cnJlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5jdXJyZW50LCBjdXJyZW5jeS5jb2RlXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudC5maWx0ZXIoKGNvZGUpID0+IGNvZGUgIT09IGN1cnJlbmN5LmNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBQcmljZSB7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuQ2hlY2tib3hJdGVtPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Db250ZW50PlxuICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaXplLWZ1bGwgb3ZlcmZsb3ctYXV0b1wiPlxuICAgICAgICAgIDxUYWJsZVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgYm9yZGVyQ29sbGFwc2U6IFwiY29sbGFwc2VcIixcbiAgICAgICAgICAgICAgdGFibGVMYXlvdXQ6IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgd2lkdGg6IFwibWF4LWNvbnRlbnRcIlxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGFibGUuSGVhZGVyIHN0eWxlPXt7IGJvcmRlclRvcDogXCJub25lXCIgfX0+XG4gICAgICAgICAgICAgIDxUYWJsZS5Sb3cgc3R5bGU9e3sgaGVpZ2h0OiA0MCB9fT5cbiAgICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbFxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1iZy1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNDAsXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMCAxNnB4XCIsXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcInN0aWNreVwiLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIENvdXBvbiBWYWx1ZVxuICAgICAgICAgICAgICAgIDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgICB7c2hvd25DdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IChcbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsXG4gICAgICAgICAgICAgICAgICAgIGtleT17Y3VycmVuY3kuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWJnLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIwIDE2cHhcIixcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0cnVuY2F0ZVwiIHRpdGxlPXtgUHJpY2UgJHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9YH0+XG4gICAgICAgICAgICAgICAgICAgICAgICBQcmljZSB7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7Y3VycmVuY3kuaXNfdGF4X2luY2x1c2l2ZSA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYXhJbmNsdXNpdmUgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZCBzaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYXhFeGNsdXNpdmUgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZCBzaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgICAgPC9UYWJsZS5IZWFkZXI+XG4gICAgICAgICAgICA8VGFibGUuQm9keT5cbiAgICAgICAgICAgICAgPFRhYmxlLlJvdyBjbGFzc05hbWU9XCJiZy11aS1iZy1zdWJ0bGVcIiBzdHlsZT17eyBoZWlnaHQ6IDQwIH19PlxuICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWJnLXN1YnRsZSlcIixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjAgMTZweFwiLFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIixcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgekluZGV4OiAxLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJibG9jayB0cnVuY2F0ZVwiPntjb3Vwb25WYWx1ZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgIHtzaG93bkN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGxcbiAgICAgICAgICAgICAgICAgICAga2V5PXtjdXJyZW5jeS5jb2RlfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tYmctYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxUYWJsZVByaWNlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeT17Y3VycmVuY3l9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ByaWNlc1tjdXJyZW5jeS5jb2RlXSB8fCBcIlwifVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IG9uQ2hhbmdlKGN1cnJlbmN5LmNvZGUsIHZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgICA8L1RhYmxlLkJvZHk+XG4gICAgICAgICAgPC9UYWJsZT5cblxuICAgICAgICAgIHshY3VycmVuY2llcy5sZW5ndGggJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTRcIj5cbiAgICAgICAgICAgICAgPFRleHQgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgIEFkZCBhIHN1cHBvcnRlZCBjdXJyZW5jeSB0byB0aGUgc3RvcmUgYmVmb3JlIHNldHRpbmcgcHJpY2VzLlxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDb3Vwb25WYWx1ZShcbiAgY291cG9uOiBQaWNrPENvdXBvbkZvcm1TdGF0ZSwgXCJhbW91bnRzXCIgfCBcInBlcmNlbnRhZ2VcIiB8IFwidHlwZVwiPixcbiAgY3VycmVuY2llczogUGljazxDdXJyZW5jeU9wdGlvbiwgXCJjb2RlXCIgfCBcImlzX2RlZmF1bHRcIj5bXSxcbikge1xuICBpZiAoXG4gICAgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiIHx8XG4gICAgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9vcmRlclwiXG4gICkge1xuICAgIGNvbnN0IGRlZmF1bHRDb2RlID1cbiAgICAgIGN1cnJlbmNpZXMuZmluZCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmlzX2RlZmF1bHQpPy5jb2RlIHx8XG4gICAgICBjdXJyZW5jaWVzWzBdPy5jb2RlXG4gICAgY29uc3QgcHJpbWFyeSA9XG4gICAgICBjb3Vwb24uYW1vdW50cy5maW5kKChyb3cpID0+IHJvdy5jdXJyZW5jeV9jb2RlID09PSBkZWZhdWx0Q29kZSkgfHxcbiAgICAgIGNvdXBvbi5hbW91bnRzWzBdXG4gICAgY29uc3QgYW1vdW50ID0gbnVtYmVyT3JOdWxsKHByaW1hcnk/LmFtb3VudClcbiAgICBpZiAoYW1vdW50ID09IG51bGwpIHJldHVybiBcIlx1MjAxNFwiXG4gICAgY29uc3QgYWRkaXRpb25hbCA9IE1hdGgubWF4KDAsIGNvdXBvbi5hbW91bnRzLmxlbmd0aCAtIDEpXG4gICAgY29uc3QgZm9ybWF0dGVkID0gYCR7YW1vdW50fSR7cHJpbWFyeS5jdXJyZW5jeV9jb2RlLnRvVXBwZXJDYXNlKCl9YFxuICAgIHJldHVybiBhZGRpdGlvbmFsID8gYCR7Zm9ybWF0dGVkfSArJHthZGRpdGlvbmFsfWAgOiBmb3JtYXR0ZWRcbiAgfVxuXG4gIGlmIChcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9wcm9kdWN0XCIgfHxcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICkge1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBudW1iZXJPck51bGwoY291cG9uLnBlcmNlbnRhZ2UpXG4gICAgaWYgKHBlcmNlbnRhZ2UgPT0gbnVsbCkgcmV0dXJuIFwiXHUyMDE0XCJcbiAgICByZXR1cm4gY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICAgICAgPyBgJHtwZXJjZW50YWdlfSUgb2ZmIG9yZGVyYFxuICAgICAgOiBgJHtwZXJjZW50YWdlfSUgb2ZmIHByb2R1Y3RzYFxuICB9XG5cbiAgcmV0dXJuIGNvdXBvbi50eXBlID09PSBcImZyZWVfc2hpcHBpbmdcIiA/IFwiRnJlZSBzaGlwcGluZ1wiIDogXCJCdXkgWCBHZXQgWVwiXG59XG5cbmZ1bmN0aW9uIFRhYmxlUHJpY2VJbnB1dCh7XG4gIGN1cnJlbmN5LFxuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIGN1cnJlbmN5OiBDdXJyZW5jeU9wdGlvblxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICBjb25zdCBzeW1ib2wgPVxuICAgIGN1cnJlbmN5LnN5bWJvbF9uYXRpdmUgfHxcbiAgICBjdXJyZW5jeS5zeW1ib2wgfHxcbiAgICBjdXJyZW5jeVN5bWJvbChjdXJyZW5jeS5jb2RlIHx8IFwiVVNEXCIpXG5cbiAgcmV0dXJuIChcbiAgICA8bGFiZWxcbiAgICAgIGNsYXNzTmFtZT1cImJnLXVpLWJnLWJhc2UgaG92ZXI6YmctdWktYmctc3VidGxlIGZvY3VzLXdpdGhpbjpzaGFkb3ctYm9yZGVycy1pbnRlcmFjdGl2ZS13aXRoLWFjdGl2ZSB0ZXh0LXVpLWZnLWJhc2VcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgIHN0eWxlPXt7IGZsZXg6IFwiMCAwIDQwcHhcIiwgcGFkZGluZ0xlZnQ6IDE2IH19XG4gICAgICA+XG4gICAgICAgIHtzeW1ib2x9XG4gICAgICA8L3NwYW4+XG4gICAgICA8aW5wdXRcbiAgICAgICAgYXJpYS1sYWJlbD17YFByaWNlICR7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfWB9XG4gICAgICAgIGlucHV0TW9kZT1cImRlY2ltYWxcIlxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IG9uQ2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSl9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYXBwZWFyYW5jZTogXCJub25lXCIsXG4gICAgICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgICAgZmxleDogXCIxIDEgYXV0b1wiLFxuICAgICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIG1pbldpZHRoOiAwLFxuICAgICAgICAgIG91dGxpbmU6IFwibm9uZVwiLFxuICAgICAgICAgIHBhZGRpbmc6IFwiMCAxNnB4IDAgMFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogXCJyaWdodFwiLFxuICAgICAgICB9fVxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAvPlxuICAgIDwvbGFiZWw+XG4gIClcbn1cblxuZnVuY3Rpb24gQ291cG9uUHJvZHVjdE1vZGFsKHtcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3IsXG4gIGFwaUJhc2UsXG4gIG9uT3BlbkNoYW5nZSxcbiAgb25TYXZlZCxcbiAgb3BlbixcbiAgb3B0aW9ucyxcbiAgcm93LFxufToge1xuICBhbGxvd1Byb21vdGlvbk1pcnJvcjogYm9vbGVhblxuICBhcGlCYXNlOiBBcGlCYXNlXG4gIG9uT3BlbkNoYW5nZTogKG9wZW46IGJvb2xlYW4pID0+IHZvaWRcbiAgb25TYXZlZDogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICBvcGVuOiBib29sZWFuXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkXG4gIHJvdzogQ291cG9uUHJvZHVjdFJvdyB8IG51bGxcbn0pIHtcbiAgY29uc3QgW2FjdGl2ZVN0ZXAsIHNldEFjdGl2ZVN0ZXBdID0gdXNlU3RhdGU8V2l6YXJkU3RlcD4oXCJkZXRhaWxzXCIpXG4gIGNvbnN0IFtwcm9kdWN0LCBzZXRQcm9kdWN0XSA9IHVzZVN0YXRlPFByb2R1Y3RGb3JtU3RhdGU+KCgpID0+XG4gICAgZW1wdHlQcm9kdWN0KG9wdGlvbnMpLFxuICApXG4gIGNvbnN0IFtjb3Vwb24sIHNldENvdXBvbl0gPSB1c2VTdGF0ZTxDb3Vwb25Gb3JtU3RhdGU+KCgpID0+XG4gICAgZW1wdHlDb3Vwb24ob3B0aW9ucyksXG4gIClcbiAgY29uc3QgW2NhbXBhaWduLCBzZXRDYW1wYWlnbl0gPSB1c2VTdGF0ZTxDYW1wYWlnbkZvcm1TdGF0ZT4oZW1wdHlDYW1wYWlnbilcbiAgY29uc3QgW3NhdmluZywgc2V0U2F2aW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbdXBsb2FkaW5nLCBzZXRVcGxvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtmdXJ0aGVzdFN0ZXBJbmRleCwgc2V0RnVydGhlc3RTdGVwSW5kZXhdID0gdXNlU3RhdGUoMClcblxuICBjb25zdCB2aXNpYmxlU3RlcHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgICAgICA/IGFsbFN0ZXBzXG4gICAgICAgIDogYWxsU3RlcHMuZmlsdGVyKChzdGVwKSA9PiBzdGVwICE9PSBcImNhbXBhaWduXCIpLFxuICAgIFthbGxvd1Byb21vdGlvbk1pcnJvcl0sXG4gIClcbiAgY29uc3QgY3VycmVudFN0ZXBJbmRleCA9IHZpc2libGVTdGVwcy5pbmRleE9mKGFjdGl2ZVN0ZXApXG4gIGNvbnN0IGN1cnJlbmNpZXMgPSBvcHRpb25zLmN1cnJlbmNpZXMgfHwgW11cbiAgY29uc3Qgc3VwcG9ydGVkQ3VycmVuY3lDb2RlcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gbmV3IFNldChjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpKSxcbiAgICBbY3VycmVuY2llc10sXG4gIClcbiAgY29uc3QgaXNBbW91bnRUeXBlID1cbiAgICBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIgfHwgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9vcmRlclwiXG4gIGNvbnN0IGlzUGVyY2VudGFnZVR5cGUgPVxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIiB8fFxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCJcbiAgY29uc3QgaXNJdGVtU2NvcGVkRGlzY291bnQgPVxuICAgIGNvdXBvbi50eXBlID09PSBcImFtb3VudF9vZmZfcHJvZHVjdHNcIiB8fFxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIlxuICBjb25zdCBlZmZlY3RpdmVDdXJyZW5jaWVzID0gdXNlTWVtbyhcbiAgICAoKSA9PiBlZmZlY3RpdmVDb3Vwb25DdXJyZW5jaWVzKGNvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zLCBjdXJyZW5jaWVzKSxcbiAgICBbY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMsIGN1cnJlbmNpZXNdLFxuICApXG4gIGNvbnN0IHByb2R1Y3RQcmljZXMgPSBjdXJyZW5jaWVzLmZsYXRNYXAoKGN1cnJlbmN5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBwcm9kdWN0LnByaWNlX2Ftb3VudHNbY3VycmVuY3kuY29kZV0gfHwgXCJcIlxuICAgIGNvbnN0IGFtb3VudCA9IG5vbk5lZ2F0aXZlTnVtYmVyT3JOdWxsKHZhbHVlKVxuICAgIHJldHVybiBhbW91bnQgPT0gbnVsbCA/IFtdIDogW3sgY3VycmVuY3lfY29kZTogY3VycmVuY3kuY29kZSwgYW1vdW50IH1dXG4gIH0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4pIHJldHVyblxuICAgIGNvbnN0IGZvcm1zID0gcm93XG4gICAgICA/IGZvcm1zRnJvbVJvdyhyb3csIG9wdGlvbnMpXG4gICAgICA6IHtcbiAgICAgICAgcHJvZHVjdDogZW1wdHlQcm9kdWN0KG9wdGlvbnMpLFxuICAgICAgICBjb3Vwb246IGVtcHR5Q291cG9uKG9wdGlvbnMpLFxuICAgICAgICBjYW1wYWlnbjogZW1wdHlDYW1wYWlnbixcbiAgICAgIH1cbiAgICBzZXRQcm9kdWN0KGZvcm1zLnByb2R1Y3QpXG4gICAgc2V0Q291cG9uKGZvcm1zLmNvdXBvbilcbiAgICBzZXRDYW1wYWlnbihmb3Jtcy5jYW1wYWlnbilcbiAgICBzZXRBY3RpdmVTdGVwKFwiZGV0YWlsc1wiKVxuICAgIHNldEZ1cnRoZXN0U3RlcEluZGV4KDApXG4gIH0sIFtvcGVuLCByb3csIG9wdGlvbnNdKVxuXG4gIGNvbnN0IHVwZGF0ZVB1cmNoYXNlQ29uZGl0aW9ucyA9IChcbiAgICBwdXJjaGFzZUNvbmRpdGlvbnM6IFB1cmNoYXNlQ29uZGl0aW9uRm9ybVtdLFxuICApID0+IHtcbiAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgcHVyY2hhc2VfY29uZGl0aW9uczogcHVyY2hhc2VDb25kaXRpb25zLFxuICAgICAgYW1vdW50czogaXNBbW91bnRDb3Vwb25UeXBlKGN1cnJlbnQudHlwZSlcbiAgICAgICAgPyByZWNvbmNpbGVDb3Vwb25BbW91bnRzKFxuICAgICAgICAgIGN1cnJlbnQuYW1vdW50cyxcbiAgICAgICAgICBlZmZlY3RpdmVDb3Vwb25DdXJyZW5jaWVzKHB1cmNoYXNlQ29uZGl0aW9ucywgY3VycmVuY2llcyksXG4gICAgICAgIClcbiAgICAgICAgOiBjdXJyZW50LmFtb3VudHMsXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCB1cGRhdGVDb3Vwb25UeXBlID0gKHR5cGU6IENvdXBvblR5cGUpID0+IHtcbiAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+IHtcbiAgICAgIGxldCBwdXJjaGFzZUNvbmRpdGlvbnMgPSBjdXJyZW50LnB1cmNoYXNlX2NvbmRpdGlvbnNcbiAgICAgIGlmIChcbiAgICAgICAgaXNBbW91bnRDb3Vwb25UeXBlKHR5cGUpICYmXG4gICAgICAgICFwdXJjaGFzZUNvbmRpdGlvbnMuc29tZShcbiAgICAgICAgICAoY29uZGl0aW9uKSA9PiBjb25kaXRpb24uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIixcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHB1cmNoYXNlQ29uZGl0aW9ucyA9IFtcbiAgICAgICAgICAuLi5wdXJjaGFzZUNvbmRpdGlvbnMsXG4gICAgICAgICAgLi4uZGVmYXVsdFB1cmNoYXNlQ29uZGl0aW9ucyhvcHRpb25zKSxcbiAgICAgICAgXVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgcHVyY2hhc2VfY29uZGl0aW9uczogcHVyY2hhc2VDb25kaXRpb25zLFxuICAgICAgICBhbW91bnRzOiBpc0Ftb3VudENvdXBvblR5cGUodHlwZSlcbiAgICAgICAgICA/IHJlY29uY2lsZUNvdXBvbkFtb3VudHMoXG4gICAgICAgICAgICBjdXJyZW50LmFtb3VudHMsXG4gICAgICAgICAgICBlZmZlY3RpdmVDb3Vwb25DdXJyZW5jaWVzKHB1cmNoYXNlQ29uZGl0aW9ucywgY3VycmVuY2llcyksXG4gICAgICAgICAgKVxuICAgICAgICAgIDogY3VycmVudC5hbW91bnRzLFxuICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6XG4gICAgICAgICAgdHlwZSA9PT0gXCJidXlfeF9nZXRfeVwiID8gXCJub25lXCIgOiBjdXJyZW50LnByb21vdGlvbl9taXJyb3JfbW9kZSxcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY29uc3QgdXBsb2FkTWVkaWEgPSBhc3luYyAoZmlsZXM6IEZpbGVbXSkgPT4ge1xuICAgIGlmICghZmlsZXMubGVuZ3RoKSByZXR1cm5cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4gZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZmlsZSkpXG4gICAgaWYgKGFwaUJhc2UgPT09IFwiL2FkbWluXCIgJiYgcHJvZHVjdC5zZWxsZXJfaWQpIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcInNlbGxlcl9pZFwiLCBwcm9kdWN0LnNlbGxlcl9pZClcbiAgICB9XG4gICAgc2V0VXBsb2FkaW5nKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGAke2JhY2tlbmRVcmwoKX0ke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0cy91cGxvYWRzYCxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihhcGlFcnJvck1lc3NhZ2UocGF5bG9hZCwgcmVzcG9uc2Uuc3RhdHVzVGV4dCkpXG4gICAgICB9XG4gICAgICBjb25zdCBwYXlsb2FkID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgICBmaWxlcz86IHsgYXNzZXRfaWQ/OiBzdHJpbmc7IHVybD86IHN0cmluZyB9W11cbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwbG9hZGVkID0gKHBheWxvYWQuZmlsZXMgfHwgW10pXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGZpbGUpOiBmaWxlIGlzIHsgYXNzZXRfaWQ6IHN0cmluZzsgdXJsOiBzdHJpbmcgfSA9PlxuICAgICAgICAgICAgQm9vbGVhbihmaWxlLmFzc2V0X2lkICYmIGZpbGUudXJsKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChmaWxlKSA9PiAoeyBhc3NldF9pZDogZmlsZS5hc3NldF9pZCwgdXJsOiBmaWxlLnVybCB9KSlcbiAgICAgIGlmICghdXBsb2FkZWQubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgdXBsb2FkIGRpZCBub3QgcmV0dXJuIGFuIGltYWdlIFVSTFwiKVxuICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgbWVkaWE6IEFycmF5LmZyb20oXG4gICAgICAgICAgbmV3IE1hcChcbiAgICAgICAgICAgIFsuLi5jdXJyZW50Lm1lZGlhLCAuLi51cGxvYWRlZF0ubWFwKChpdGVtKSA9PiBbaXRlbS51cmwsIGl0ZW1dKSxcbiAgICAgICAgICApLnZhbHVlcygpLFxuICAgICAgICApLFxuICAgICAgfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiSW1hZ2UgdXBsb2FkIGZhaWxlZFwiLFxuICAgICAgKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRVcGxvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGV0YWlsc0NvbXBsZXRlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFwcm9kdWN0LnRpdGxlLnRyaW0oKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKCFjdXJyZW5jaWVzLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucykge1xuICAgICAgaWYgKFxuICAgICAgICAhY29uZGl0aW9uLmF0dHJpYnV0ZSB8fFxuICAgICAgICAhY29uZGl0aW9uLm9wZXJhdG9yIHx8XG4gICAgICAgICFjb25kaXRpb24udmFsdWVzLmxlbmd0aCB8fFxuICAgICAgICAoY29uZGl0aW9uLm9wZXJhdG9yID09PSBcImVxXCIgJiYgY29uZGl0aW9uLnZhbHVlcy5sZW5ndGggIT09IDEpIHx8XG4gICAgICAgIGF0dHJpYnV0ZXMuaGFzKGNvbmRpdGlvbi5hdHRyaWJ1dGUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBhdHRyaWJ1dGVzLmFkZChjb25kaXRpb24uYXR0cmlidXRlKVxuICAgIH1cblxuICAgIGlmIChpc0Ftb3VudFR5cGUpIHtcbiAgICAgIGlmICghYXR0cmlidXRlcy5oYXMoXCJjdXJyZW5jeV9jb2RlXCIpKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmICghY291cG9uLmFtb3VudHMubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChjb3Vwb24uYW1vdW50cy5sZW5ndGggIT09IGVmZmVjdGl2ZUN1cnJlbmNpZXMubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgICAgZm9yIChjb25zdCByb3cgb2YgY291cG9uLmFtb3VudHMpIHtcbiAgICAgICAgaWYgKCFzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLmhhcyhyb3cuY3VycmVuY3lfY29kZSkpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoc2Vlbi5oYXMocm93LmN1cnJlbmN5X2NvZGUpKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG51bWJlck9yTnVsbChyb3cuYW1vdW50KSA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgICAgICAgc2Vlbi5hZGQocm93LmN1cnJlbmN5X2NvZGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyY2VudGFnZVR5cGUpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbnVtYmVyT3JOdWxsKGNvdXBvbi5wZXJjZW50YWdlKVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPiAxMDApIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiICYmICFjb3Vwb24uc2hhcmVkX2NvZGUudHJpbSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJkdXJhdGlvblwiKSB7XG4gICAgICBjb25zdCBkYXlzID0gTnVtYmVyKGNvdXBvbi5leHBpcmF0aW9uX2RheXMpXG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF5cykgfHwgZGF5cyA8IDEpIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAoY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiKSB7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fZGF0ZSlcbiAgICAgIGlmICghY291cG9uLmV4cGlyYXRpb25fZGF0ZSB8fCBOdW1iZXIuaXNOYU4oZXhwaXJhdGlvbi5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlICE9PSBcIm5vbmVcIiAmJiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpIHtcbiAgICAgIGNvbnN0IGNhcCA9IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdClcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oY2FwLmdldFRpbWUoKSkpIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IG1heElzc3VhbmNlID0gTnVtYmVyKGNvdXBvbi5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW0pXG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobWF4SXNzdWFuY2UpICYmIG1heElzc3VhbmNlID4gMFxuICB9LCBbXG4gICAgY291cG9uLFxuICAgIGN1cnJlbmNpZXMubGVuZ3RoLFxuICAgIGVmZmVjdGl2ZUN1cnJlbmNpZXMubGVuZ3RoLFxuICAgIGlzQW1vdW50VHlwZSxcbiAgICBpc1BlcmNlbnRhZ2VUeXBlLFxuICAgIHByb2R1Y3QudGl0bGUsXG4gICAgc3VwcG9ydGVkQ3VycmVuY3lDb2RlcyxcbiAgXSlcblxuICBjb25zdCBjYW1wYWlnbkNvbXBsZXRlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFhbGxvd1Byb21vdGlvbk1pcnJvciB8fCBjYW1wYWlnbi5tb2RlID09PSBcIm5vbmVcIikgcmV0dXJuIHRydWVcbiAgICBpZiAoY2FtcGFpZ24ubW9kZSA9PT0gXCJleGlzdGluZ1wiKSByZXR1cm4gQm9vbGVhbihjYW1wYWlnbi5jYW1wYWlnbl9pZClcbiAgICBpZiAoIWNhbXBhaWduLm5hbWUudHJpbSgpIHx8ICFjYW1wYWlnbi5jYW1wYWlnbl9pZGVudGlmaWVyLnRyaW0oKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIFtjYW1wYWlnbi5zdGFydHNfYXQsIGNhbXBhaWduLmVuZHNfYXRdLmV2ZXJ5KCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHRydWVcbiAgICAgIHJldHVybiAhTnVtYmVyLmlzTmFOKG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCkpXG4gICAgfSlcbiAgfSwgW2FsbG93UHJvbW90aW9uTWlycm9yLCBjYW1wYWlnbl0pXG5cbiAgY29uc3QgcHJpY2VzQ29tcGxldGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWN1cnJlbmNpZXMubGVuZ3RoIHx8ICFwcm9kdWN0UHJpY2VzLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGN1cnJlbmNpZXMuZXZlcnkoKGN1cnJlbmN5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb2R1Y3QucHJpY2VfYW1vdW50c1tjdXJyZW5jeS5jb2RlXSB8fCBcIlwiXG4gICAgICByZXR1cm4gIXZhbHVlLnRyaW0oKSB8fCBub25OZWdhdGl2ZU51bWJlck9yTnVsbCh2YWx1ZSkgIT0gbnVsbFxuICAgIH0pXG4gIH0sIFtjdXJyZW5jaWVzLCBwcm9kdWN0LnByaWNlX2Ftb3VudHMsIHByb2R1Y3RQcmljZXMubGVuZ3RoXSlcblxuICBjb25zdCBzdGVwVmFsaWRpdHkgPSB1c2VNZW1vPFJlY29yZDxXaXphcmRTdGVwLCBib29sZWFuPj4oXG4gICAgKCkgPT4gKHtcbiAgICAgIGRldGFpbHM6IGRldGFpbHNDb21wbGV0ZSxcbiAgICAgIG9yZ2FuaXplOiB0cnVlLFxuICAgICAgY2FtcGFpZ246IGNhbXBhaWduQ29tcGxldGUsXG4gICAgICBwcmljZXM6IHByaWNlc0NvbXBsZXRlLFxuICAgIH0pLFxuICAgIFtjYW1wYWlnbkNvbXBsZXRlLCBkZXRhaWxzQ29tcGxldGUsIHByaWNlc0NvbXBsZXRlXSxcbiAgKVxuXG4gIGNvbnN0IGFjdGl2ZVN0ZXBDb21wbGV0ZSA9IHN0ZXBWYWxpZGl0eVthY3RpdmVTdGVwXVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuIHx8ICFhY3RpdmVTdGVwQ29tcGxldGUpIHJldHVyblxuICAgIHNldEZ1cnRoZXN0U3RlcEluZGV4KChjdXJyZW50KSA9PlxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIE1hdGgubWluKGN1cnJlbnRTdGVwSW5kZXggKyAxLCB2aXNpYmxlU3RlcHMubGVuZ3RoIC0gMSksXG4gICAgICApLFxuICAgIClcbiAgfSwgW2FjdGl2ZVN0ZXBDb21wbGV0ZSwgY3VycmVudFN0ZXBJbmRleCwgb3BlbiwgdmlzaWJsZVN0ZXBzLmxlbmd0aF0pXG5cbiAgY29uc3QgaXNTdGVwRGlzYWJsZWQgPSAoaW5kZXg6IG51bWJlcikgPT5cbiAgICBpbmRleCA+IGZ1cnRoZXN0U3RlcEluZGV4IHx8XG4gICAgdmlzaWJsZVN0ZXBzLnNsaWNlKDAsIGluZGV4KS5zb21lKChwcmV2aW91cykgPT4gIXN0ZXBWYWxpZGl0eVtwcmV2aW91c10pXG5cbiAgY29uc3QgdmFsaWRhdGUgPSAoKSA9PiB7XG4gICAgaWYgKCFwcm9kdWN0LnRpdGxlLnRyaW0oKSkgdGhyb3cgbmV3IEVycm9yKFwiUHJvZHVjdCB0aXRsZSBpcyByZXF1aXJlZFwiKVxuICAgIGlmICghY3VycmVuY2llcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkZCBhIHN1cHBvcnRlZCBjdXJyZW5jeSB0byB0aGUgc3RvcmUgYmVmb3JlIGNvbnRpbnVpbmdcIilcbiAgICB9XG4gICAgY29uc3QgaW52YWxpZFByaWNlID0gY3VycmVuY2llcy5zb21lKChjdXJyZW5jeSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBwcm9kdWN0LnByaWNlX2Ftb3VudHNbY3VycmVuY3kuY29kZV0gfHwgXCJcIlxuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKSAmJiBub25OZWdhdGl2ZU51bWJlck9yTnVsbCh2YWx1ZSkgPT0gbnVsbFxuICAgIH0pXG4gICAgaWYgKGludmFsaWRQcmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvZHVjdCBwcmljZXMgbXVzdCBiZSAwIG9yIG1vcmVcIilcbiAgICB9XG4gICAgaWYgKCFwcm9kdWN0UHJpY2VzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGF0IGxlYXN0IG9uZSBwcm9kdWN0IHByaWNlXCIpXG4gICAgfVxuICAgIGlmIChpc0Ftb3VudFR5cGUpIHtcbiAgICAgIGlmICghY291cG9uLmFtb3VudHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkZCBhdCBsZWFzdCBvbmUgY291cG9uIHZhbHVlXCIpXG4gICAgICB9XG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICAgIGNvbnN0IGN1cnJlbmN5Q29uZGl0aW9uID0gY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMuZmluZChcbiAgICAgICAgKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIsXG4gICAgICApXG4gICAgICBpZiAoIWN1cnJlbmN5Q29uZGl0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkZCBhIEN1cnJlbmN5IENvZGUgcHVyY2hhc2UgY29uZGl0aW9uXCIpXG4gICAgICB9XG4gICAgICBpZiAoY291cG9uLmFtb3VudHMubGVuZ3RoICE9PSBlZmZlY3RpdmVDdXJyZW5jaWVzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDb3Vwb24gdmFsdWVzIG11c3QgbWF0Y2ggZXZlcnkgZWZmZWN0aXZlIGN1cnJlbmN5IGNvbmRpdGlvbiB2YWx1ZVwiLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBjb3Vwb24uYW1vdW50cykge1xuICAgICAgICBpZiAoIXN1cHBvcnRlZEN1cnJlbmN5Q29kZXMuaGFzKHJvdy5jdXJyZW5jeV9jb2RlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhbiBhdmFpbGFibGUgY291cG9uIGN1cnJlbmN5XCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZW4uaGFzKHJvdy5jdXJyZW5jeV9jb2RlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdXBvbiB2YWx1ZSBjdXJyZW5jaWVzIGNhbm5vdCBiZSBkdXBsaWNhdGVkXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bWJlck9yTnVsbChyb3cuYW1vdW50KSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291cG9uIHZhbHVlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpXG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5hZGQocm93LmN1cnJlbmN5X2NvZGUpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlZW5BdHRyaWJ1dGVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucykge1xuICAgICAgaWYgKCFjb25kaXRpb24uYXR0cmlidXRlIHx8ICFjb25kaXRpb24ub3BlcmF0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tcGxldGUgZXZlcnkgcHVyY2hhc2UgY29uZGl0aW9uXCIpXG4gICAgICB9XG4gICAgICBpZiAoIWNvbmRpdGlvbi52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhdCBsZWFzdCBvbmUgdmFsdWUgZm9yIGV2ZXJ5IHB1cmNoYXNlIGNvbmRpdGlvblwiKVxuICAgICAgfVxuICAgICAgaWYgKGNvbmRpdGlvbi5vcGVyYXRvciA9PT0gXCJlcVwiICYmIGNvbmRpdGlvbi52YWx1ZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVxdWFscyBjb25kaXRpb25zIHJlcXVpcmUgZXhhY3RseSBvbmUgdmFsdWVcIilcbiAgICAgIH1cbiAgICAgIGlmIChzZWVuQXR0cmlidXRlcy5oYXMoY29uZGl0aW9uLmF0dHJpYnV0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHVyY2hhc2UgY29uZGl0aW9uIGF0dHJpYnV0ZXMgY2Fubm90IGJlIGR1cGxpY2F0ZWRcIilcbiAgICAgIH1cbiAgICAgIHNlZW5BdHRyaWJ1dGVzLmFkZChjb25kaXRpb24uYXR0cmlidXRlKVxuICAgIH1cbiAgICBpZiAoaXNQZXJjZW50YWdlVHlwZSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBudW1iZXJPck51bGwoY291cG9uLnBlcmNlbnRhZ2UpXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA+IDEwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3Vwb24gdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMCBwZXJjZW50XCIpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiICYmICFjb3Vwb24uc2hhcmVkX2NvZGUudHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHNoYXJlZCBjb3Vwb24gY29kZSBpcyByZXF1aXJlZFwiKVxuICAgIH1cbiAgICBpZiAoY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiKSB7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fZGF0ZSlcbiAgICAgIGlmICghY291cG9uLmV4cGlyYXRpb25fZGF0ZSB8fCBOdW1iZXIuaXNOYU4oZXhwaXJhdGlvbi5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgdmFsaWQgZml4ZWQgZXhwaXJhdGlvbiBkYXRlIGlzIHJlcXVpcmVkXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlICE9PSBcIm5vbmVcIiAmJiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpIHtcbiAgICAgIGNvbnN0IGNhcCA9IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdClcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oY2FwLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB2YWxpZCBleHBpcmF0aW9uIGNhcCBkYXRlIGlzIHJlcXVpcmVkXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjYW1wYWlnbi5tb2RlID09PSBcImV4aXN0aW5nXCIgJiYgIWNhbXBhaWduLmNhbXBhaWduX2lkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3QgYW4gZXhpc3RpbmcgY2FtcGFpZ25cIilcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2FtcGFpZ24ubW9kZSA9PT0gXCJuZXdcIiAmJlxuICAgICAgKCFjYW1wYWlnbi5uYW1lLnRyaW0oKSB8fCAhY2FtcGFpZ24uY2FtcGFpZ25faWRlbnRpZmllci50cmltKCkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW1wYWlnbiBuYW1lIGFuZCBpZGVudGlmaWVyIGFyZSByZXF1aXJlZFwiKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNhdmUgPSBhc3luYyAoKSA9PiB7XG4gICAgc2V0U2F2aW5nKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlKClcbiAgICAgIGNvbnN0IGJlbmVmaXRUeXBlID0gYmVuZWZpdFR5cGVGcm9tQ291cG9uVHlwZShjb3Vwb24udHlwZSlcbiAgICAgIGNvbnN0IHRhcmdldFR5cGUgPVxuICAgICAgICBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX29yZGVyXCIgfHxcbiAgICAgICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICAgICAgICAgID8gXCJvcmRlclwiXG4gICAgICAgICAgOiBcIml0ZW1zXCJcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHByb2R1Y3Q6IHtcbiAgICAgICAgICB0aXRsZTogcHJvZHVjdC50aXRsZS50cmltKCksXG4gICAgICAgICAgc3VidGl0bGU6IHByb2R1Y3Quc3VidGl0bGUudHJpbSgpIHx8IG51bGwsXG4gICAgICAgICAgaGFuZGxlOiBwcm9kdWN0LmhhbmRsZS50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdC5kZXNjcmlwdGlvbi50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICBzdGF0dXM6IHByb2R1Y3RTdGF0dXNGcm9tQ291cG9uU3RhdHVzKGNvdXBvbi5wcm9tb3Rpb25fc3RhdHVzKSxcbiAgICAgICAgICB0aHVtYm5haWw6IHByb2R1Y3QubWVkaWFbMF0/LnVybCB8fCBudWxsLFxuICAgICAgICAgIHRodW1ibmFpbF9hc3NldF9pZDogcHJvZHVjdC5tZWRpYVswXT8uYXNzZXRfaWQgfHwgbnVsbCxcbiAgICAgICAgICBpbWFnZXM6IHByb2R1Y3QubWVkaWEuc2xpY2UoMSkubWFwKChtZWRpYSkgPT4gKHtcbiAgICAgICAgICAgIHVybDogbWVkaWEudXJsLFxuICAgICAgICAgICAgLi4uKG1lZGlhLmFzc2V0X2lkID8geyBhc3NldF9pZDogbWVkaWEuYXNzZXRfaWQgfSA6IHt9KSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgZGlzY291bnRhYmxlOiBwcm9kdWN0LmRpc2NvdW50YWJsZSxcbiAgICAgICAgICB0eXBlX2lkOiBwcm9kdWN0LnR5cGVfaWQgfHwgbnVsbCxcbiAgICAgICAgICBjb2xsZWN0aW9uX2lkOiBwcm9kdWN0LmNvbGxlY3Rpb25faWQgfHwgbnVsbCxcbiAgICAgICAgICBjYXRlZ29yaWVzOiBwcm9kdWN0LmNhdGVnb3J5X2lkID8gW3sgaWQ6IHByb2R1Y3QuY2F0ZWdvcnlfaWQgfV0gOiBbXSxcbiAgICAgICAgICB0YWdzOiBwcm9kdWN0LnRhZ19pZCA/IFt7IGlkOiBwcm9kdWN0LnRhZ19pZCB9XSA6IFtdLFxuICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRpdGxlOiBcIkRlZmF1bHRcIixcbiAgICAgICAgICAgICAgc2t1OiBwcm9kdWN0LnNrdS50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgbWFuYWdlX2ludmVudG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgIGFsbG93X2JhY2tvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgcHJpY2VzOiBwcm9kdWN0UHJpY2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjb3Vwb246IHtcbiAgICAgICAgICBlbmFibGVkOiBjb3Vwb24uZW5hYmxlZCxcbiAgICAgICAgICBiZW5lZml0X3R5cGU6IGJlbmVmaXRUeXBlLFxuICAgICAgICAgIHB1cmNoYXNlX2NvbmRpdGlvbnM6IGNvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zLm1hcCgoY29uZGl0aW9uKSA9PiAoe1xuICAgICAgICAgICAgYXR0cmlidXRlOiBjb25kaXRpb24uYXR0cmlidXRlLFxuICAgICAgICAgICAgb3BlcmF0b3I6IGNvbmRpdGlvbi5vcGVyYXRvcixcbiAgICAgICAgICAgIHZhbHVlczogY29uZGl0aW9uLnZhbHVlcyxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgYW1vdW50czogaXNBbW91bnRUeXBlXG4gICAgICAgICAgICA/IGNvdXBvbi5hbW91bnRzLm1hcCgocm93KSA9PiAoe1xuICAgICAgICAgICAgICBhbW91bnQ6IG51bWJlck9yTnVsbChyb3cuYW1vdW50KSxcbiAgICAgICAgICAgICAgY3VycmVuY3lfY29kZTogcm93LmN1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBhbW91bnQ6IG51bGwsXG4gICAgICAgICAgcGVyY2VudGFnZTogaXNQZXJjZW50YWdlVHlwZSA/IG51bWJlck9yTnVsbChjb3Vwb24ucGVyY2VudGFnZSkgOiBudWxsLFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IG51bGwsXG4gICAgICAgICAgY29kZV9zdHJhdGVneTogY291cG9uLmNvZGVfc3RyYXRlZ3ksXG4gICAgICAgICAgY29kZV9wcmVmaXg6XG4gICAgICAgICAgICBjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJ1bmlxdWVfY29kZVwiXG4gICAgICAgICAgICAgID8gY291cG9uLmNvZGVfcHJlZml4LnRyaW0oKSB8fCBcIkNPVVBPTlwiXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzaGFyZWRfY29kZTpcbiAgICAgICAgICAgIGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCJcbiAgICAgICAgICAgICAgPyBjb3Vwb24uc2hhcmVkX2NvZGUudHJpbSgpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBleHBpcmF0aW9uX3BvbGljeTpcbiAgICAgICAgICAgIGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwibm9uZVwiXG4gICAgICAgICAgICAgID8geyB0eXBlOiBcIm5vbmVcIiB9XG4gICAgICAgICAgICAgIDogY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImZpeGVkXCIsXG4gICAgICAgICAgICAgICAgICBleHBpcmVzX2F0OiBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9kYXRlKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgY2FwX2J5X2NhbXBhaWduOiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ24sXG4gICAgICAgICAgICAgICAgICBjYXBfYXQ6IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdFxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgZHVyYXRpb25fZGF5czogTnVtYmVyKGNvdXBvbi5leHBpcmF0aW9uX2RheXMpIHx8IDMwLFxuICAgICAgICAgICAgICAgICAgY2FwX2J5X2NhbXBhaWduOiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ24sXG4gICAgICAgICAgICAgICAgICBjYXBfYXQ6IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdFxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06XG4gICAgICAgICAgICBOdW1iZXIoY291cG9uLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSkgfHwgMSxcbiAgICAgICAgICBwcm9tb3Rpb25fdGVtcGxhdGU6XG4gICAgICAgICAgICBiZW5lZml0VHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiB8fCBiZW5lZml0VHlwZSA9PT0gXCJwZXJjZW50YWdlXCJcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25fbWV0aG9kOiB7XG4gICAgICAgICAgICAgICAgICB0YXJnZXRfdHlwZTogdGFyZ2V0VHlwZSxcbiAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb246XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPT09IFwib3JkZXJcIiA/IFwiYWNyb3NzXCIgOiBjb3Vwb24uYWxsb2NhdGlvbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBwcm9tb3Rpb25fc3RhdHVzOiBjb3Vwb24ucHJvbW90aW9uX3N0YXR1cyxcbiAgICAgICAgICAuLi4oYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6XG4gICAgICAgICAgICAgICAgYmVuZWZpdFR5cGUgPT09IFwiYnV5X2dldFwiIHx8XG4gICAgICAgICAgICAgICAgICAoYmVuZWZpdFR5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiYgY291cG9uLmFtb3VudHMubGVuZ3RoID4gMSlcbiAgICAgICAgICAgICAgICAgID8gXCJub25lXCJcbiAgICAgICAgICAgICAgICAgIDogY291cG9uLnByb21vdGlvbl9taXJyb3JfbW9kZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9LFxuICAgICAgICBjYW1wYWlnbjogYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgICAgICAgICA/IGNhbXBhaWduLm1vZGUgPT09IFwiZXhpc3RpbmdcIlxuICAgICAgICAgICAgPyB7IG1vZGU6IFwiZXhpc3RpbmdcIiwgY2FtcGFpZ25faWQ6IGNhbXBhaWduLmNhbXBhaWduX2lkIH1cbiAgICAgICAgICAgIDogY2FtcGFpZ24ubW9kZSA9PT0gXCJuZXdcIlxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBtb2RlOiBcIm5ld1wiLFxuICAgICAgICAgICAgICAgIGNhbXBhaWduOiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBjYW1wYWlnbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgY2FtcGFpZ25faWRlbnRpZmllcjogY2FtcGFpZ24uY2FtcGFpZ25faWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICAgIHN0YXJ0c19hdDogY2FtcGFpZ24uc3RhcnRzX2F0XG4gICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoY2FtcGFpZ24uc3RhcnRzX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgIGVuZHNfYXQ6IGNhbXBhaWduLmVuZHNfYXRcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShjYW1wYWlnbi5lbmRzX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogeyBtb2RlOiBcIm5vbmVcIiB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHNlbGxlcl9pZDogcHJvZHVjdC5zZWxsZXJfaWQgfHwgbnVsbCxcbiAgICAgICAgdmFyaWFudF9vdmVycmlkZXM6IFtdLFxuICAgICAgfVxuXG4gICAgICBhd2FpdCBhcGlGZXRjaChcbiAgICAgICAgcm93XG4gICAgICAgICAgPyBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHMvJHtyb3cucHJvZHVjdC5pZH1gXG4gICAgICAgICAgOiBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHNgLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiByb3cgPyBcIlBBVENIXCIgOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHRvYXN0LnN1Y2Nlc3Mocm93ID8gXCJDb3Vwb24gcHJvZHVjdCB1cGRhdGVkXCIgOiBcIkNvdXBvbiBwcm9kdWN0IGNyZWF0ZWRcIilcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSlcbiAgICAgIGF3YWl0IG9uU2F2ZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgIDogXCJGYWlsZWQgdG8gc2F2ZSBjb3Vwb24gcHJvZHVjdFwiLFxuICAgICAgKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTYXZpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RlcFN0YXR1cyA9IChzdGVwOiBXaXphcmRTdGVwKSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSB2aXNpYmxlU3RlcHMuaW5kZXhPZihzdGVwKVxuICAgIGlmIChpbmRleCA8IGN1cnJlbnRTdGVwSW5kZXggJiYgc3RlcFZhbGlkaXR5W3N0ZXBdKSB7XG4gICAgICByZXR1cm4gXCJjb21wbGV0ZWRcIiBhcyBjb25zdFxuICAgIH1cbiAgICBpZiAoaW5kZXggPT09IGN1cnJlbnRTdGVwSW5kZXgpIHJldHVybiBcImluLXByb2dyZXNzXCIgYXMgY29uc3RcbiAgICByZXR1cm4gXCJub3Qtc3RhcnRlZFwiIGFzIGNvbnN0XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxGb2N1c01vZGFsIG9wZW49e29wZW59IG9uT3BlbkNoYW5nZT17b25PcGVuQ2hhbmdlfT5cbiAgICAgIDxGb2N1c01vZGFsLkNvbnRlbnQgc3R5bGU9e21vZGFsQ29udGVudFN0eWxlfT5cbiAgICAgICAgPEZvY3VzTW9kYWwuVGl0bGUgc3R5bGU9e3Zpc3VhbGx5SGlkZGVuU3R5bGV9PlxuICAgICAgICAgIHtyb3cgPyBcIkVkaXQgQ291cG9uIFByb2R1Y3RcIiA6IFwiQ3JlYXRlIENvdXBvbiBQcm9kdWN0XCJ9XG4gICAgICAgIDwvRm9jdXNNb2RhbC5UaXRsZT5cbiAgICAgICAgPFByb2dyZXNzVGFic1xuICAgICAgICAgIHZhbHVlPXthY3RpdmVTdGVwfVxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHZhbHVlIGFzIFdpemFyZFN0ZXBcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdmlzaWJsZVN0ZXBzLmluZGV4T2Yoc3RlcClcbiAgICAgICAgICAgIGlmICghaXNTdGVwRGlzYWJsZWQoaW5kZXgpKSBzZXRBY3RpdmVTdGVwKHN0ZXApXG4gICAgICAgICAgfX1cbiAgICAgICAgICBzdHlsZT17bW9kYWxXaXphcmRTdHlsZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxGb2N1c01vZGFsLkhlYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiLW15LTIgdy1mdWxsIGJvcmRlci1sXCI+XG4gICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuTGlzdCBjbGFzc05hbWU9XCJqdXN0aWZ5LXN0YXJ0LXN0YXJ0IGZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIHt2aXNpYmxlU3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5UcmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgIGtleT17c3RlcH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3N0ZXB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cz17c3RlcFN0YXR1cyhzdGVwKX1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzU3RlcERpc2FibGVkKGluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWF4LXctWzIwMHB4XSB0cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtzdGVwWzBdLnRvVXBwZXJDYXNlKCkgKyBzdGVwLnNsaWNlKDEpfVxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuTGlzdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvRm9jdXNNb2RhbC5IZWFkZXI+XG5cbiAgICAgICAgICA8Rm9jdXNNb2RhbC5Cb2R5IGNsYXNzTmFtZT1cIm92ZXJmbG93LWhpZGRlbiBwLTBcIiBzdHlsZT17bW9kYWxCb2R5U3R5bGV9PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBzdHlsZT17XG4gICAgICAgICAgICAgICAgYWN0aXZlU3RlcCA9PT0gXCJwcmljZXNcIlxuICAgICAgICAgICAgICAgICAgPyB7IGhlaWdodDogXCIxMDAlXCIsIG92ZXJmbG93OiBcImhpZGRlblwiLCB3aWR0aDogXCIxMDAlXCIgfVxuICAgICAgICAgICAgICAgICAgOiBtb2RhbFNjcm9sbFN0eWxlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHN0eWxlPXtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVN0ZXAgPT09IFwicHJpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgPyB7IGhlaWdodDogXCIxMDAlXCIsIHdpZHRoOiBcIjEwMCVcIiB9XG4gICAgICAgICAgICAgICAgICAgIDogbW9kYWxGb3JtU3R5bGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7YWN0aXZlU3RlcCA9PT0gXCJkZXRhaWxzXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwiZGV0YWlsc1wiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHtyb3cgPyBcIkVkaXQgQ291cG9uIFByb2R1Y3RcIiA6IFwiQ3JlYXRlIENvdXBvbiBQcm9kdWN0XCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvSGVhZGluZz5cbiAgICAgICAgICAgICAgICAgICAgPERpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJHZW5lcmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dGhyZWVDb2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QudGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXaW50ZXIgamFja2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTdWJ0aXRsZVwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5zdWJ0aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIldhcm0gYW5kIGNvenlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkhhbmRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJUaGUgVVJMLWZyaWVuZGx5IGlkZW50aWZpZXIgZm9yIHRoaXMgcHJvZHVjdC4gSWYgbGVmdCBlbXB0eSwgTWVkdXNhIGdlbmVyYXRlcyBpdCBmcm9tIHRoZSB0aXRsZS5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8SGFuZGxlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5oYW5kbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhoYW5kbGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBoYW5kbGUgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJEZXNjcmlwdGlvblwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkEgd2FybSBhbmQgY296eSBqYWNrZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk1lZGlhXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWVkaWFVcGxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNVcGxvYWRpbmc9e3VwbG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE9e3Byb2R1Y3QubWVkaWF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVXBsb2FkPXsoZmlsZXMpID0+IHZvaWQgdXBsb2FkTWVkaWEoZmlsZXMpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblJlbW92ZT17KG1lZGlhKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6IGN1cnJlbnQubWVkaWEuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVkaWEuYXNzZXRfaWQgJiYgaXRlbS5hc3NldF9pZCAhPT0gbWVkaWEuYXNzZXRfaWQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFtZWRpYS5hc3NldF9pZCAmJiBpdGVtLnVybCAhPT0gbWVkaWEudXJsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTS1VcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5za3V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ09VUE9OLTAwMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgIDxEaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgICAgIDxQdXJjaGFzZUNvbmRpdGlvbnNGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgIGZpeGVkQW1vdW50PXtpc0Ftb3VudFR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVB1cmNoYXNlQ29uZGl0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHthY3RpdmVTdGVwID09PSBcIm9yZ2FuaXplXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwib3JnYW5pemVcIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPVwiT3JnYW5pemVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC14LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+RGlzY291bnRhYmxlPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IHByb21vdGlvbnMgdG8gZGlzY291bnQgdGhpcyBwcm9kdWN0J3Mgc2FsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3Byb2R1Y3QuZGlzY291bnRhYmxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGRpc2NvdW50YWJsZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50YWJsZTogQm9vbGVhbihkaXNjb3VudGFibGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNlbGxlclwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnNlbGxlcl9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMuc2VsbGVycyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoc2VsbGVyX2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBzZWxsZXJfaWQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUeXBlXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC50eXBlX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF90eXBlcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHR5cGVfaWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCB0eXBlX2lkIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2xsZWN0aW9uXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5jb2xsZWN0aW9uX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF9jb2xsZWN0aW9ucyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGNvbGxlY3Rpb25faWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhdGVnb3J5XCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5jYXRlZ29yeV9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfY2F0ZWdvcmllcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGNhdGVnb3J5X2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgY2F0ZWdvcnlfaWQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlRhZ1wiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QudGFnX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF90YWdzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodGFnX2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgdGFnX2lkIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHthY3RpdmVTdGVwID09PSBcImRldGFpbHNcIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IC4uLnN0YWNrU3R5bGUsIG1hcmdpblRvcDogMjQgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxEaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDb3Vwb25cIlxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiQ29uZmlndXJlIHRoZSBjb3Vwb24gaXNzdWVkIHdoZW4gdGhpcyBwcm9kdWN0IGlzIHB1cmNoYXNlZC5cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cGFuZWxTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAteC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPkNvdXBvbiBpc3N1YW5jZTwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc3N1ZSBjb3Vwb25zIHdoZW4gY3VzdG9tZXJzIHB1cmNoYXNlIHRoaXMgcHJvZHVjdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y291cG9uLmVuYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoZW5hYmxlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJUeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh0eXBlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvdXBvblR5cGUodHlwZSBhcyBDb3Vwb25UeXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlQ2hvaWNlcy5tYXAoKGNob2ljZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwLkNob2ljZUJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjaG9pY2UudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2hvaWNlLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2Nob2ljZS5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtjaG9pY2UuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24ucHJvbW90aW9uX3N0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHByb21vdGlvbl9zdGF0dXMpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9zdGF0dXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9zdGF0dXMgYXMgUHJvbW90aW9uU3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtzdGF0dXNDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuQ2hvaWNlQm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2Nob2ljZS52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjaG9pY2UudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17Y2hvaWNlLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e2Nob2ljZS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICB7KGlzQW1vdW50VHlwZSB8fCBpc1BlcmNlbnRhZ2VUeXBlKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT17aXNBbW91bnRUeXBlID8gXCJDb3Vwb24gVmFsdWVzXCIgOiBcIlZhbHVlXCJ9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNBbW91bnRUeXBlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y291cG9uLmFtb3VudHMubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbmN5ID0gY3VycmVuY2llcy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmNvZGUgPT09IHJvdy5jdXJyZW5jeV9jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e3Jvdy5rZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzaGFkb3ctZWxldmF0aW9uLWNhcmQtcmVzdCBiZy11aS1iZy1jb21wb25lbnQgcm91bmRlZC1tZCBweC00IHB5LTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Jvdy5jdXJyZW5jeV9jb2RlLnRvVXBwZXJDYXNlKCl9IENvdXBvbiBWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2N1cnJlbmN5Py5uYW1lIHx8IHJvdy5jdXJyZW5jeV9jb2RlLnRvVXBwZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q3VycmVuY3lBbW91bnRGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZT17cm93LmN1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cm93LmFtb3VudH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoYW1vdW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnRzOiBjdXJyZW50LmFtb3VudHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0sIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9PT0gcm93SW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgLi4uaXRlbSwgYW1vdW50IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IWNvdXBvbi5hbW91bnRzLmxlbmd0aCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgYXQgbGVhc3Qgb25lIGVmZmVjdGl2ZSBDdXJyZW5jeSBDb2RlIGNvbmRpdGlvbiB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb3Vwb24gVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQZXJjZW50YWdlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5wZXJjZW50YWdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHBlcmNlbnRhZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgICAge2lzSXRlbVNjb3BlZERpc2NvdW50ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJBbGxvY2F0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uYWxsb2NhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhhbGxvY2F0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uOiBhbGxvY2F0aW9uIGFzIENvdXBvbkFsbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5DaG9pY2VCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJlYWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJFYWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJBcHBsaWVzIHZhbHVlIG9uIGVhY2ggaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuQ2hvaWNlQm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwib25jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiT25jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiTGltaXQgZGlzY291bnQgdG8gbWF4IHF1YW50aXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwaXJhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIkNvbnRyb2wgd2hlbiBpc3N1ZWQgY291cG9ucyBleHBpcmUuXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIHBvbGljeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uZXhwaXJhdGlvbl90eXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KGV4cGlyYXRpb25fdHlwZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl90eXBlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl90eXBlIGFzIEV4cGlyYXRpb25Qb2xpY3lUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5vbmVcIj5Ob25lPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZHVyYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiBhZnRlciBpc3N1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmaXhlZFwiPkZpeGVkIGRhdGU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2NvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZHVyYXRpb25cIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIGRheXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPXsxfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmV4cGlyYXRpb25fZGF5c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9kYXlzOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZml4ZWRcIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmVzIGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5leHBpcmF0aW9uX2RhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fZGF0ZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Y291cG9uLmV4cGlyYXRpb25fdHlwZSAhPT0gXCJub25lXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDYXAgZXhwaXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC14LTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IC4uLnBhbmVsU3R5bGUsIHBhZGRpbmc6IFwiOHB4IDEycHhcIiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtcGFpZ24gZW5kIG9yIGNhcCBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2NvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IEJvb2xlYW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIGNhcCBkYXRlXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5leHBpcmF0aW9uX2NhcF9hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9hdDogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJDaG9vc2Ugd2hldGhlciBldmVyeSBpc3N1ZWQgY291cG9uIGlzIHVuaXF1ZSBvciBzaGFyZXMgb25lIGNvZGUuXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2RlIHN0cmF0ZWd5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5jb2RlX3N0cmF0ZWd5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KGNvZGVfc3RyYXRlZ3kpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfc3RyYXRlZ3k6IGNvZGVfc3RyYXRlZ3kgYXMgQ29kZVN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInVuaXF1ZV9jb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwic2hhcmVkX2NvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWQgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2NvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInVuaXF1ZV9jb2RlXCIgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ29kZSBwcmVmaXhcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmNvZGVfcHJlZml4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNPVVBPTlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfcHJlZml4OiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTaGFyZWQgY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uc2hhcmVkX2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU1VNTUVSMTVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfY29kZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIklzc3VhbmNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJNYXggaXNzdWFuY2UgcGVyIGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPXsxfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW1vdW50VHlwZSAmJiBjb3Vwb24uYW1vdW50cy5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQcm9tb3Rpb24gbWlycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnByb21vdGlvbl9taXJyb3JfbW9kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uLnR5cGUgPT09IFwiYnV5X3hfZ2V0X3lcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsocHJvbW90aW9uX21pcnJvcl9tb2RlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlIGFzIE1pcnJvck1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJub25lXCI+Tm9uZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJtYW51YWxcIj5NYW51YWw8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiYXV0b1wiPkF1dG88L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIGFjdGl2ZVN0ZXAgPT09IFwiY2FtcGFpZ25cIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJjYW1wYWlnblwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJDYW1wYWlnblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDYW1wYWlnbiBtb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24ubW9kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsobW9kZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBtb2RlIGFzIENhbXBhaWduTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5vbmVcIj5ObyBjYW1wYWlnbjwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJleGlzdGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGlzdGluZyBjYW1wYWlnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5ld1wiPk5ldyBjYW1wYWlnbjwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NhbXBhaWduLm1vZGUgPT09IFwiZXhpc3RpbmdcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4aXN0aW5nIGNhbXBhaWduXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLmNhbXBhaWduX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5jYW1wYWlnbnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGNhbXBhaWduX2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjYW1wYWlnbi5tb2RlID09PSBcIm5ld1wiICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiSWRlbnRpZmllclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbi5jYW1wYWlnbl9pZGVudGlmaWVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduX2lkZW50aWZpZXI6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlN0YXJ0cyBhdFwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbi5zdGFydHNfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzX2F0OiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFbmRzIGF0XCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLmVuZHNfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kc19hdDogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2FjdGl2ZVN0ZXAgPT09IFwicHJpY2VzXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwicHJpY2VzXCIgc3R5bGU9e3sgaGVpZ2h0OiBcIjEwMCVcIiB9fT5cbiAgICAgICAgICAgICAgICAgICAgPFByb2R1Y3RQcmljZXNUYWJsZVxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgY291cG9uVmFsdWU9e2Zvcm1hdENvdXBvblZhbHVlKGNvdXBvbiwgY3VycmVuY2llcyl9XG4gICAgICAgICAgICAgICAgICAgICAgcHJpY2VzPXtwcm9kdWN0LnByaWNlX2Ftb3VudHN9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhjdXJyZW5jeUNvZGUsIHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VfYW1vdW50czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQucHJpY2VfYW1vdW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VycmVuY3lDb2RlXTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Gb2N1c01vZGFsLkJvZHk+XG5cbiAgICAgICAgICA8Rm9jdXNNb2RhbC5Gb290ZXIgc3R5bGU9e3sgZmxleFNocmluazogMCB9fT5cbiAgICAgICAgICAgIDxCdXR0b24gdmFyaWFudD1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpID0+IG9uT3BlbkNoYW5nZShmYWxzZSl9PlxuICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAge2N1cnJlbnRTdGVwSW5kZXggPiAwICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICBzZXRBY3RpdmVTdGVwKHZpc2libGVTdGVwc1tjdXJyZW50U3RlcEluZGV4IC0gMV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQmFja1xuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7Y3VycmVudFN0ZXBJbmRleCA8IHZpc2libGVTdGVwcy5sZW5ndGggLSAxID8gKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFhY3RpdmVTdGVwQ29tcGxldGV9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gY3VycmVudFN0ZXBJbmRleCArIDFcbiAgICAgICAgICAgICAgICAgIHNldEZ1cnRoZXN0U3RlcEluZGV4KChjdXJyZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChjdXJyZW50LCBuZXh0SW5kZXgpLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlU3RlcCh2aXNpYmxlU3RlcHNbbmV4dEluZGV4XSlcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQ29udGludWVcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFhY3RpdmVTdGVwQ29tcGxldGV9XG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nPXtzYXZpbmd9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBzYXZlKCl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBTYXZlXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0ZvY3VzTW9kYWwuRm9vdGVyPlxuICAgICAgICA8L1Byb2dyZXNzVGFicz5cbiAgICAgIDwvRm9jdXNNb2RhbC5Db250ZW50PlxuICAgIDwvRm9jdXNNb2RhbD5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQ291cG9uUHJvZHVjdHNQYWdlKHtcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgPSBmYWxzZSxcbiAgYXBpQmFzZSxcbiAgdGl0bGUsXG59OiB7XG4gIGFsbG93UHJvbW90aW9uTWlycm9yPzogYm9vbGVhblxuICBhcGlCYXNlOiBBcGlCYXNlXG4gIHRpdGxlOiBzdHJpbmdcbn0pIHtcbiAgY29uc3QgW3Byb2R1Y3RzLCBzZXRQcm9kdWN0c10gPSB1c2VTdGF0ZTxDb3Vwb25Qcm9kdWN0Um93W10+KFtdKVxuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxPcHRpb25zUGF5bG9hZD4oe30pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbW9kYWxPcGVuLCBzZXRNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtlZGl0aW5nUm93LCBzZXRFZGl0aW5nUm93XSA9IHVzZVN0YXRlPENvdXBvblByb2R1Y3RSb3cgfCBudWxsPihudWxsKVxuICBjb25zdCBwcm9tcHQgPSB1c2VQcm9tcHQoKVxuICBjb25zdCBjb3Vwb25CYXNlID0gYCR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzYFxuXG4gIGNvbnN0IGxvYWQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0TG9hZGluZyh0cnVlKVxuICAgIHNldExvYWRFcnJvcihudWxsKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbcHJvZHVjdHNQYXlsb2FkLCBvcHRpb25zUGF5bG9hZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGFwaUZldGNoPHsgY291cG9uX3Byb2R1Y3RzOiBDb3Vwb25Qcm9kdWN0Um93W10gfT4oY291cG9uQmFzZSksXG4gICAgICAgIGFwaUZldGNoPE9wdGlvbnNQYXlsb2FkPihgJHtjb3Vwb25CYXNlfS9vcHRpb25zYCksXG4gICAgICBdKVxuICAgICAgc2V0UHJvZHVjdHMocHJvZHVjdHNQYXlsb2FkLmNvdXBvbl9wcm9kdWN0cyB8fCBbXSlcbiAgICAgIHNldE9wdGlvbnMob3B0aW9uc1BheWxvYWQgfHwge30pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBcIkZhaWxlZCB0byBsb2FkIGNvdXBvbiBwcm9kdWN0c1wiXG4gICAgICBzZXRMb2FkRXJyb3IobWVzc2FnZSlcbiAgICAgIHRvYXN0LmVycm9yKG1lc3NhZ2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9LCBbY291cG9uQmFzZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB2b2lkIGxvYWQoKVxuICB9LCBbbG9hZF0pXG5cbiAgY29uc3QgcmVtb3ZlID0gYXN5bmMgKHJvdzogQ291cG9uUHJvZHVjdFJvdykgPT4ge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHByb21wdCh7XG4gICAgICB0aXRsZTogXCJSZW1vdmUgY291cG9uIHByb2R1Y3Q/XCIsXG4gICAgICBkZXNjcmlwdGlvbjogYFRoaXMgcmVtb3ZlcyBjb3Vwb24gaXNzdWFuY2UgZnJvbSAke3Jvdy5wcm9kdWN0LnRpdGxlIHx8IHJvdy5wcm9kdWN0LmlkXG4gICAgICAgIH0uIFRoZSB1bmRlcmx5aW5nIE1lZHVzYSBwcm9kdWN0IHdpbGwgcmVtYWluIGF2YWlsYWJsZS5gLFxuICAgICAgY29uZmlybVRleHQ6IFwiUmVtb3ZlIHByb2R1Y3RcIixcbiAgICAgIGNhbmNlbFRleHQ6IFwiQ2FuY2VsXCIsXG4gICAgICB2YXJpYW50OiBcImRhbmdlclwiLFxuICAgIH0pXG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUZldGNoKGAke2NvdXBvbkJhc2V9LyR7cm93LnByb2R1Y3QuaWR9YCwgeyBtZXRob2Q6IFwiREVMRVRFXCIgfSlcbiAgICAgIHRvYXN0LnN1Y2Nlc3MoXCJDb3Vwb24gY29uZmlndXJhdGlvbiByZW1vdmVkXCIpXG4gICAgICBhd2FpdCBsb2FkKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIkRlbGV0ZSBmYWlsZWRcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCBtaXJyb3IgPSBhc3luYyAocm93OiBDb3Vwb25Qcm9kdWN0Um93KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUZldGNoKFxuICAgICAgICBgL2FkbWluL2NvdXBvbi1wcm9kdWN0cy8ke3Jvdy5wcm9kdWN0LmlkfS9taXJyb3ItcHJvbW90aW9uYCxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe30pLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgdG9hc3Quc3VjY2VzcyhcIlByb21vdGlvbiBtaXJyb3IgY3JlYXRlZFwiKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiTWlycm9yIGZhaWxlZFwiKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTYgcHktNFwiPlxuICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgxXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgPEJ1dHRvbiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gdm9pZCBsb2FkKCl9PlxuICAgICAgICAgICAgPEFycm93UGF0aCAvPiBSZWZyZXNoXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgc2V0RWRpdGluZ1JvdyhudWxsKVxuICAgICAgICAgICAgICBzZXRNb2RhbE9wZW4odHJ1ZSlcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFBsdXMgLz4gQ3JlYXRlXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT1cIkxvYWRpbmcgY291cG9uIHByb2R1Y3RzXCIgLz5cbiAgICAgICkgOiBsb2FkRXJyb3IgPyAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPXtsb2FkRXJyb3J9IC8+XG4gICAgICApIDogcHJvZHVjdHMubGVuZ3RoID8gKFxuICAgICAgICA8VGFibGU+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlcj5cbiAgICAgICAgICAgIDxUYWJsZS5Sb3c+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlByb2R1Y3Q8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlN0YXR1czwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+VHlwZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q29kZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q2FtcGFpZ248L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPklzc3VlZDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGwgLz5cbiAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgIDwvVGFibGUuSGVhZGVyPlxuICAgICAgICAgIDxUYWJsZS5Cb2R5XG4gICAgICAgICAgICBzdHlsZT17eyBib3JkZXJCb3R0b206ICdub25lJyB9fT5cbiAgICAgICAgICAgIHtwcm9kdWN0cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSByb3cuY291cG9uX3Byb2R1Y3RfY29uZmlnXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPFRhYmxlLlJvdyBrZXk9e3Jvdy5pZH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckJvdHRvbTogJ25vbmUnLCBiYWNrZ3JvdW5kOiAnbm9uZScgfX0+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3Jvdy5wcm9kdWN0LnRpdGxlIHx8IHJvdy5wcm9kdWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cm93LnByb2R1Y3QuaGFuZGxlIHx8IHJvdy5wcm9kdWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPFN0YXR1c0JhZGdlXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I9e2NvdXBvblN0YXR1c0NvbG9yKGNvbmZpZy5wcm9tb3Rpb25fc3RhdHVzKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHtjb25maWcucHJvbW90aW9uX3N0YXR1cyB8fCBcImRyYWZ0XCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvU3RhdHVzQmFkZ2U+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57Y291cG9uVHlwZUxhYmVsKGNvbmZpZyl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIHtjb25maWcuY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb25maWcuc2hhcmVkX2NvZGUgfHwgXCJTaGFyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIDogYCR7Y29uZmlnLmNvZGVfcHJlZml4IHx8IFwiQ09VUE9OXCJ9LSpgfVxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2NhbXBhaWduTGFiZWwoY29uZmlnKX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57cm93LmVudGl0bGVtZW50c19jb3VudCB8fCAwfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLmFtb3VudHM/Lmxlbmd0aCB8fCAwKSA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG1pcnJvcihyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRpbmdSb3cocm93KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRNb2RhbE9wZW4odHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBlbmNpbFNxdWFyZSAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgcmVtb3ZlKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRyYXNoIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1RhYmxlLkJvZHk+XG4gICAgICAgIDwvVGFibGU+XG4gICAgICApIDogKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZVxuICAgICAgICAgIHRpdGxlPVwiTm8gY291cG9uIHByb2R1Y3RzIGZvdW5kXCJcbiAgICAgICAgICBkZXNjcmlwdGlvbj1cIkNyZWF0ZSBhIG5ldyBjb3Vwb24gcHJvZHVjdCB0byBnZXQgc3RhcnRlZC5cIlxuICAgICAgICAvPlxuICAgICAgKX1cblxuICAgICAgPENvdXBvblByb2R1Y3RNb2RhbFxuICAgICAgICBvcGVuPXttb2RhbE9wZW59XG4gICAgICAgIHJvdz17ZWRpdGluZ1Jvd31cbiAgICAgICAgYXBpQmFzZT17YXBpQmFzZX1cbiAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgYWxsb3dQcm9tb3Rpb25NaXJyb3I9e2FsbG93UHJvbW90aW9uTWlycm9yfVxuICAgICAgICBvbk9wZW5DaGFuZ2U9e3NldE1vZGFsT3Blbn1cbiAgICAgICAgb25TYXZlZD17bG9hZH1cbiAgICAgIC8+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cbiIsICJpbXBvcnQgeyBUZXh0IH0gZnJvbSBcIkBtZWR1c2Fqcy91aVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBDb3Vwb25FbXB0eVN0YXRlKHtcbiAgZGVzY3JpcHRpb24sXG4gIHRpdGxlLFxufToge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBmbGV4LTEgZmxleC1jb2wgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggbWluLWgtWzI1MHB4XSB3LWZ1bGwgZmxleC0xIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC02IHB5LTRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNpemUtZnVsbCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+e3RpdGxlfTwvVGV4dD5cbiAgICAgICAgICB7ZGVzY3JpcHRpb24gPyA8VGV4dD57ZGVzY3JpcHRpb259PC9UZXh0PiA6IG51bGx9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsICJpbXBvcnQgeyBDb3Vwb25EZXRhaWxQYWdlVmlldyB9IGZyb20gXCIuLi8uLi8uLi8uLi9kYXNoYm9hcmQvY291cG9ucy9jb3Vwb24tbWFuYWdlclwiXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvdXBvbkRldGFpbFBhZ2UoKSB7XG4gIHJldHVybiA8Q291cG9uRGV0YWlsUGFnZVZpZXcgYXBpQmFzZT1cIi9hZG1pblwiIC8+XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSb3V0ZUNvbmZpZyB9IGZyb20gXCJAbWVyY3VyanMvZGFzaGJvYXJkLXNka1wiXG5pbXBvcnQgeyBSZWNlaXB0UGVyY2VudCB9IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHsgQ291cG9uUHJvZHVjdHNQYWdlVmlldyB9IGZyb20gXCIuLi8uLi8uLi8uLi9kYXNoYm9hcmQvY291cG9ucy9jb3Vwb24tbWFuYWdlclwiXG5cbmV4cG9ydCBjb25zdCBjb25maWc6IFJvdXRlQ29uZmlnID0ge1xuICBsYWJlbDogXCJDb3Vwb24gUHJvZHVjdHNcIixcbiAgaWNvbjogUmVjZWlwdFBlcmNlbnQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvdXBvblByb2R1Y3RzUGFnZSgpIHtcbiAgcmV0dXJuIChcbiAgICA8Q291cG9uUHJvZHVjdHNQYWdlVmlld1xuICAgICAgYXBpQmFzZT1cIi9hZG1pblwiXG4gICAgICB0aXRsZT1cIkNvdXBvbiBQcm9kdWN0c1wiXG4gICAgICBhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgIC8+XG4gIClcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUE7QUFBQSxFQUNFLFNBQVc7QUFBQSxJQUNULE1BQVE7QUFBQSxJQUNSLGNBQWdCO0FBQUEsRUFDbEI7QUFDRjs7O0FDSEEsSUFBTyxlQUFRO0FBQUEsRUFDYixJQUFJO0FBQUEsSUFDRixhQUFhO0FBQUEsRUFDZjtBQUNGOzs7QUNMQSxJQUFBQSxnQkFBK0I7OztBQ0QvQixJQUFBQyxnQkFRTztBQUNQLElBQUFDLGdCQU9PO0FBQ1AsSUFBQUMsYUFtQk87OztBQ3BDUCxtQkFVTztBQUNQLG1CQVdPO0FBQ1AsSUFBQUMsYUF1Qk87OztBQzlDUCxnQkFBcUI7QUFZYjtBQVZELFNBQVMsaUJBQWlCO0FBQUEsRUFDL0I7QUFBQSxFQUNBO0FBQ0YsR0FHRztBQUNELFNB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QUN0QixlQUFlLE9BQWM7QUFBQSxJQUMvQjtBQUFBLElBQ0E7QUFBQSxNQUNFLE9BQU9DLFFBQXFCO0FBQUEsTUFDNUIsTUFBTUEsUUFBcUI7QUFBQSxNQUMzQixNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixlQUFlQSxRQUFxQjtBQUFBLElBQ3RDO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTyxnQkFBUTtBQUFBLEVBQ2IsY0FBYztBQUFBLElBQ1osU0FBUyxDQUFDO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxZQUFZO0FBQUEsSUFDVixjQUFjLENBQUM7QUFBQSxFQUNqQjtBQUFBLEVBQ0EsZUFBZTtBQUFBLElBQ2IsVUFBVSxDQUFDO0FBQUEsRUFDYjtBQUFBLEVBQ0EsWUFBWTtBQUNkOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfaWNvbnMiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9pY29ucyIsICJpbXBvcnRfdWkiLCAiaW1wb3J0X3VpIiwgImltcG9ydF9qc3hfcnVudGltZSIsICJjb25maWciLCAicm93IiwgInZhbHVlIiwgInZhbHVlcyIsICJwYXlsb2FkIiwgInJvdyIsICJjb25maWciLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImJhY2tlbmRVcmwiLCAiYXBpRXJyb3JNZXNzYWdlIiwgImFwaUZldGNoIiwgImFtb3VudCIsICJjdXJyZW5jeSIsICJhcGlGZXRjaCIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImltcG9ydF9pY29ucyIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiY29uZmlnIiwgIkNvdXBvblByb2R1Y3RzUGFnZSIsICJDb3Vwb25Qcm9kdWN0c1BhZ2UiLCAiY29uZmlnIl0KfQo=
3206
+
3207
+ module.exports = module.exports.default || module.exports