cdk-preflight 0.0.88 → 0.0.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -9600,6 +9600,6 @@
9600
9600
  "symbolId": "src/index:PreflightOptions"
9601
9601
  }
9602
9602
  },
9603
- "version": "0.0.88",
9604
- "fingerprint": "CXzmYwHl9KjGIPP7/0+U/pUgkxVbGmlyO/nAKoQAWgs="
9603
+ "version": "0.0.90",
9604
+ "fingerprint": "BzLdIa+zyuX2bZ9ekgz2ptzQAK3iXgG5xlTglx25p5I="
9605
9605
  }
package/AGENTS.md CHANGED
@@ -114,7 +114,8 @@ bench/ # real-deploy verification (needs an AWS account; no
114
114
  - **Intrinsics inside `input.resources` values are marker objects, never strings** (measured 2026-09-03, 1.7.0-beta): `Fn::GetAtt` appears as `{"__kind": "getatt:Arn", "__ref": "B"}` and `Fn::Sub` as `{"__dynamic": "Sub:..."}` at any nesting depth. A plain `is_string(v)` guard therefore safely mutes rules that judge string shapes (ARN format, prefixes) on values users wired via intrinsics — no logical-ID false positives. Reference implementations: `pf-iam-policy-resource-format`, `pf-iam-policy-action-format`.
115
115
  - **Dynamic reference strings are markerized too** (measured 2026-09-03): a literal `{{resolve:ssm:/path}}` property value surfaces as `{"__dynamic": "dynamic reference: {{resolve:ssm:/path}}", "__param_type": "String"}` and `resolve()` is undefined for it. A rule that judges the reference text itself (e.g. the SSM parameter path) must read the raw property with `object.get` and extract the `__dynamic` string. Reference implementation: `pf-ec2-instance-ami-arch`.
116
116
  - **Deploy-region rules**: the enforce plugin injects a generated module defining `deploy_region` (and `deploy_account` when the account id is concrete) whenever the app-level region is concrete (`deployEnvironmentModule` in `src/private/enforce.ts`; the test harness injects `us-east-1` for fixtures). Rules must read it as `data.cdk_preflight.deploy_region` — the data reference is undefined when not injected, so the rule skips; a bare `deploy_region` variable would be a compile error. `data.cdk_preflight.deploy_account` works the same way (`pf-kms-key-policy-lockout` treats any account as ours when it is absent, `pf-kms-alias-target` skips its account check). Consequences: region-dependent rules are silent in warn mode (`enforce: false` hands rules to the CDK built-in plugin, which we cannot inject into) and in region-agnostic apps; say so in `meta.yaml#repro.evidence`. Reference implementations: `pf-dynamodb-global-table-replica-region`, `pf-dynamodb-kinesis-stream-region`.
117
- - Helper rules must use a unique `_pf_<rule>_...` prefix (all rules share one package).
117
+ - Helper rules must use a unique `_pf_<rule>_...` prefix (all rules share one package, and the enforce plugin loads a service's rules as a single module). `bundle-rules` fails the build when two modules define the same top-level name — without the check, the second definition merges into the first as an incremental rule and both rules quietly change meaning. A name two rules genuinely need belongs in `rules/_lib/`.
118
+ - **`meta.resourceTypes` is load-bearing, not documentation.** The enforce plugin compiles only the rules whose declared types appear in the synthesized templates — rule compilation is the dominant fixed cost (~4.6s for the whole pack, ~0.8s for the ~100 rules a typical app keeps), so this is what keeps `cdk synth` usable as the pack grows. A type a rule *reads* but does not *declare* makes the rule silently stop firing on real apps. Declare every type the rule touches, including the counterpart of a cross-resource rule; `test/rules.test.ts` checks every rule survives pruning against its own fail template.
118
119
  - A helper several rules of one service need (parsing an opaque DSL, enumerating nested scopes) goes in `rules/_lib/<service>.rego` with a `_pf_<service>lib_` prefix (`rules/_lib/sfn.rego` is the reference: ASL from `DefinitionString` *or* the L1 `Definition` object, nested Parallel/Map scopes to depth 3, effective QueryLanguage). Rules never reference another rule's helpers — `exclude` can unload any rule, a lib is always loaded.
119
120
  - **Cheap screen for definition-level constraints**: some services expose their create-time validator as a free API (`aws stepfunctions validate-state-machine-definition --type STANDARD|EXPRESS` is the same validator CreateStateMachine runs). Use it to triage doc hypotheses before spending a CloudFormation deploy on each — 100 Step Functions hypotheses took minutes (2026-09-05). The real-deploy gate stays.
120
121
  3. `npx ts-node --transpile-only --project test/tsconfig.json scripts/rule-check.ts check <service|rule-id>` while iterating: it reads `rules/` straight from disk into a single engine (no bundle, no meta validation, no jest) and reports, per rule, whether the fail template fires its own rule, the pass template is silent for every rule, and neither trips a built-in ERROR/FATAL. Then `npx projen bundle-rules` and `npx jest test/rules.test.ts test/structure.test.ts` — the duplication guard and fixture checks run there for real. Prefer `jest -t` while iterating; the full suite is 3,228 tests / ~2 min (measured 2026-09-08), so keep it for the pre-PR run.
@@ -157,6 +158,9 @@ bench/ # real-deploy verification (needs an AWS account; no
157
158
  - **Tuple destructuring in `some [a, b] in <array literal>` does not schedule** ("statements not scheduled in query", measured 2026-09-04). Iterating a table of pairs inline is not available — a **set literal** of tuples fails the same way (measured 2026-09-05); build a set with one helper rule per case and destructure that set (`some [name, path, v] in _pf_x_bad`), which does work.
158
159
  - **Rego source lines are capped at 1024 columns** ("line exceeds maximum column width of 1024", measured 2026-09-05) — the failure surfaces as a parse error that takes the whole custom package down. Wrap long literal tables (the IANA zone list in `pf-ssm-maintenance-window-schedule` is one entry per line).
159
160
  - **Template-level `Transform` is exposed as `input.template.transforms`** (always an array of strings, measured 2026-09-05; `input.template` also carries `description`, `formatVersion`, `rawTopLevelKeys`). Reference: `pf-secretsmanager-hosted-rotation`, which requires an `AWS::SecretsManager-*` transform.
161
+ - **Rule compilation cost scales with the number of custom modules, not their total size** (measured 2026-09-11): 1,775 modules / 2.0MB of Rego compile in 6.2s; the same rules concatenated into 38 service-level modules compile in 1.0s and produce identical diagnostics. `src/private/enforce.ts#mergeRuleModules` therefore loads one module per service. Module boundaries carry no semantics in Rego — every rule is `package cdk_preflight`, so the whole pack is one namespace whether or not it is concatenated, and a diagnostic's `ruleId` comes from `make_diag_full`, never from the module name. The flip side is that a helper named the same in two rules has *always* merged silently into one incremental definition; `bundle-rules` now fails on any top-level name owned by two modules (`nameCollisions`), and shared definitions belong in `rules/_lib/`.
162
+ - **Constructing a second `RegoEngine` in one process degrades super-linearly unless the previous one is freed first** (measured 2026-09-11): 3.8s -> 11.2s -> 22.1s for three identical engines; calling `engine.free()` *before* building the next one gives 3.5s -> 0.4s -> 0.5s (the WASM module stays warm). `src/private/enforce.ts` therefore keeps a single-slot engine cache and frees the old engine before compiling a new rule set.
163
+ - **`validateDetailed(tpl, { disableBuiltinRules: true })` skips the engine's own rules**: first validate of a 70-resource template drops from 3.27s to 0.22s (measured 2026-09-11). The enforce plugin passes it whenever `strict` is off, because the CDK built-in plugin already evaluates those rules on the same template and we discard their diagnostics anyway.
160
164
  - **Probe scripts that load the engine outside jest never exit on their own** and were found spinning at 100% CPU an hour later (measured 2026-09-05). End ad-hoc `ts-node` probes with `process.exit(0)` and wrap them in `perl -e 'alarm 300; exec @ARGV'`.
161
165
  - **Service APIs that the CloudFormation handler calls verbatim are a cheap triage** (KMS CreateKey/CreateAlias/ReplicateKey, Secrets Manager GetRandomPassword/RotateSecret, SSM PutParameter/CreateDocument/CreateMaintenanceWindow/CreateAssociation, measured 2026-09-05): a rejected call is free and its message is what the stack event will show. Handler-only checks (SecretString vs GenerateSecretString, HostedRotationLambda's transform, Automation associations needing AutomationTargetParameterName) still need a stack.
162
166
  - **`resolve()` of `Fn::GetAtt <Resource>.<Attr>` also returns the target's logical ID** (measured 2026-09-05), exactly like a `Ref`. So `resolve(sub, "Properties.Endpoint")` on `Fn::GetAtt Queue.Arn` yields `"Queue"`, which can be fed to `resources_of_type(...)` membership and a second `resolve` on the target. When the *kind* of reference matters (a URL-taking property handed an ARN), read the raw document: `Ref` is `{"__kind": "resource", "__ref": "Q"}`, `Fn::GetAtt` is `{"__kind": "getatt:<Attr>", "__ref": "Q"}`; `flatten_list` drops `__kind`. Reference implementations: `pf-sqs-queue-policy-queues`, `pf-sns-topic-policy-topics`.
package/lib/index.js CHANGED
@@ -17,7 +17,7 @@ const rules_generated_1 = require("./rules.generated");
17
17
  * Preflight.apply(app);
18
18
  */
19
19
  class Preflight {
20
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "0.0.88" };
20
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "0.0.90" };
21
21
  /**
22
22
  * Register the cdk-preflight rules on an App or Stage.
23
23
  */
@@ -72,6 +72,40 @@ export declare function installEnforceGate(scope: IConstruct): void;
72
72
  export declare function fallbackFormat(pluginReports: any[]): string;
73
73
  /** (テストからも利用するため export している) */
74
74
  export declare function loadFormatter(): any | undefined;
75
+ /**
76
+ * ルールを service ごとに 1 モジュールへまとめる。
77
+ *
78
+ * コンパイル時間はルール本体の量よりモジュール数で効いてくる(実測 1844 ルールを
79
+ * 1 ルール 1 モジュールで載せると約 6.2s、service 単位の 39 モジュールに畳むと約 1.0s)。
80
+ * ルールはもともと全部 `package cdk_preflight` なので、Rego から見れば結合しても
81
+ * しなくても同じ 1 パッケージ——モジュール境界に意味論は無い。したがって畳めるのだが、
82
+ * 裏を返せば「別ルールが同じ名前のヘルパーを定義すると黙って 1 つの規則に合流する」
83
+ * という危険も結合前から存在する。bundle-rules がルール間のトップレベル名衝突を
84
+ * 弾いているのはそのため(共有したい定義は rules/_lib/ に置く)。
85
+ * (テストからも利用するため export している)
86
+ */
87
+ export declare function mergeRuleModules(rules: BundledRuleData[]): {
88
+ name: string;
89
+ content: string;
90
+ }[];
91
+ /**
92
+ * テンプレート群に出てくるリソースタイプ。刈り込みに使えないテンプレートが 1 枚でもあれば
93
+ * undefined を返し、刈り込みそのものを諦める(何が載っているか分からないまま落とすと、
94
+ * ルールが黙って発火しなくなる = enforce にとって最悪の壊れ方になるため)。
95
+ * (テストからも利用するため export している)
96
+ */
97
+ export declare function templateResourceTypes(templatePaths: string[]): Set<string> | undefined;
98
+ /**
99
+ * テンプレートに出てくるリソースタイプに関係するルールだけを選ぶ。
100
+ *
101
+ * エンジンのコンパイル時間はルール数でほぼ決まるので(実測 1844 ルールで約 4.6s、
102
+ * 典型的なアプリに残る 100 ルール前後なら 0.8s 前後)、これが固定費の主な削りどころ。
103
+ * 安全性は meta.resourceTypes の宣言に乗っている: ルールが見るリソースタイプが
104
+ * 宣言から漏れていると刈られて発火しなくなるため、test/rules.test.ts が全ルールについて
105
+ * 「自分の fail テンプレートで刈り残ること」を検査している。
106
+ * (テストからも利用するため export している)
107
+ */
108
+ export declare function prune(rules: BundledRuleData[], types: Set<string> | undefined): BundledRuleData[];
75
109
  /**
76
110
  * @aws/cloudformation-validate を解決する。
77
111
  * 通常は aws-cdk-lib が bundledDependencies として同梱しているコピーに乗る。
@@ -40,6 +40,9 @@ exports.isConcreteRegion = isConcreteRegion;
40
40
  exports.installEnforceGate = installEnforceGate;
41
41
  exports.fallbackFormat = fallbackFormat;
42
42
  exports.loadFormatter = loadFormatter;
43
+ exports.mergeRuleModules = mergeRuleModules;
44
+ exports.templateResourceTypes = templateResourceTypes;
45
+ exports.prune = prune;
43
46
  exports.loadEngine = loadEngine;
44
47
  const fs = __importStar(require("fs"));
45
48
  const path = __importStar(require("path"));
@@ -110,9 +113,18 @@ class PreflightEnforcePlugin {
110
113
  const account = isConcreteAccount(context.accountId) ? context.accountId : undefined;
111
114
  const ours = new Set(this.rules.map((r) => r.id));
112
115
  const violations = [];
116
+ // 全テンプレートの和集合で刈り込む。テンプレートごとに刈るとエンジンを何度も
117
+ // 作り直すことになり、そちらのコストの方が高くつく(regoEngineCached のコメント参照)。
118
+ const rules = prune(this.rules, templateResourceTypes(context.stackTemplates.map((st) => st.templatePath)));
119
+ // 1 本も残らない = このアプリのリソースに関係するルールが無い。エンジンを組む必要も無い
120
+ // (libs だけを載せたエンジンは violation ルールを持たず、評価時に落ちる)。
121
+ // strict のときは組み込みエンジンの findings を拾う仕事が残るので通常どおり進む。
122
+ if (rules.length === 0 && !this.strict) {
123
+ return { success: true, violations: [] };
124
+ }
113
125
  let eng;
114
126
  try {
115
- eng = regoEngineCached(engine, this.rules, region, account);
127
+ eng = regoEngineCached(engine, rules, region, account);
116
128
  }
117
129
  catch (e) {
118
130
  // ルールパックがコンパイルできない = どのテンプレートも検査できないので、
@@ -127,6 +139,10 @@ class PreflightEnforcePlugin {
127
139
  accountId: context.accountId,
128
140
  region: context.region,
129
141
  },
142
+ // 組み込みルールは CDK 組み込みの CloudFormationValidatePlugin が同じテンプレートに
143
+ // 対して既に走らせている。strict でなければ結果も使わず捨てているので、丸ごと切る
144
+ // (実測 70 リソース 1 枚で初回 3.27s -> 0.22s)。strict のときだけ必要になる。
145
+ disableBuiltinRules: !this.strict,
130
146
  });
131
147
  }
132
148
  catch (e) {
@@ -343,20 +359,100 @@ function loadEngineCached() {
343
359
  }
344
360
  return cachedEngineModule === false ? undefined : cachedEngineModule;
345
361
  }
346
- const regoEngineCache = new Map();
362
+ // エンジン(WASM)は 1 プロセスに 1 つだけ生かす。作り直す前に free() しないとインスタンスが
363
+ // 積み上がり、2 個目以降の構築が超線形に遅くなる(実測: free 無しで 3.8s -> 11.2s -> 22.1s、
364
+ // 構築前に free すると 3.5s -> 0.4s)。ルールセットが変わる(Stage ごとに exclude が違う、
365
+ // テストで複数アプリを合成する)たびに作り直すので、キャッシュは 1 スロットで足りる。
366
+ let cachedRegoEngine;
347
367
  function regoEngineCached(engineModule, rules, region, account) {
348
368
  const key = `${region ?? ''}|${account ?? ''}|${rules.map((r) => r.id).join(',')}`;
349
- if (!regoEngineCache.has(key)) {
369
+ if (cachedRegoEngine?.key !== key) {
370
+ cachedRegoEngine?.engine?.free?.();
371
+ cachedRegoEngine = undefined;
350
372
  const customRules = [
351
373
  ...rules_generated_1.BUNDLED_LIBS.map((l) => ({ name: l.name, content: l.rego })),
352
- ...rules.map((r) => ({ name: r.id, content: r.rego })),
374
+ ...mergeRuleModules(rules),
353
375
  ];
354
376
  if (region !== undefined) {
355
377
  customRules.push(deployEnvironmentModule(region, account));
356
378
  }
357
- regoEngineCache.set(key, new engineModule.RegoEngine({ customRules }));
379
+ cachedRegoEngine = { key, engine: new engineModule.RegoEngine({ customRules }) };
380
+ }
381
+ return cachedRegoEngine.engine;
382
+ }
383
+ /** 全ルールに共通の rego ヘッダ。bundle-rules が package 名と import を 1 種類に強制している。 */
384
+ const REGO_HEADER = 'package cdk_preflight\n\nimport rego.v1\n';
385
+ /**
386
+ * ルールを service ごとに 1 モジュールへまとめる。
387
+ *
388
+ * コンパイル時間はルール本体の量よりモジュール数で効いてくる(実測 1844 ルールを
389
+ * 1 ルール 1 モジュールで載せると約 6.2s、service 単位の 39 モジュールに畳むと約 1.0s)。
390
+ * ルールはもともと全部 `package cdk_preflight` なので、Rego から見れば結合しても
391
+ * しなくても同じ 1 パッケージ——モジュール境界に意味論は無い。したがって畳めるのだが、
392
+ * 裏を返せば「別ルールが同じ名前のヘルパーを定義すると黙って 1 つの規則に合流する」
393
+ * という危険も結合前から存在する。bundle-rules がルール間のトップレベル名衝突を
394
+ * 弾いているのはそのため(共有したい定義は rules/_lib/ に置く)。
395
+ * (テストからも利用するため export している)
396
+ */
397
+ function mergeRuleModules(rules) {
398
+ const byService = new Map();
399
+ for (const r of rules) {
400
+ const body = r.rego.replace(/^(?:package|import)\s.*\n/gm, '');
401
+ byService.set(r.service, [...byService.get(r.service) ?? [], body]);
358
402
  }
359
- return regoEngineCache.get(key);
403
+ return [...byService].map(([service, bodies]) => ({
404
+ name: `_pf_service_${service}`,
405
+ content: REGO_HEADER + bodies.join('\n'),
406
+ }));
407
+ }
408
+ /**
409
+ * テンプレート群に出てくるリソースタイプ。刈り込みに使えないテンプレートが 1 枚でもあれば
410
+ * undefined を返し、刈り込みそのものを諦める(何が載っているか分からないまま落とすと、
411
+ * ルールが黙って発火しなくなる = enforce にとって最悪の壊れ方になるため)。
412
+ * (テストからも利用するため export している)
413
+ */
414
+ function templateResourceTypes(templatePaths) {
415
+ const types = new Set();
416
+ for (const templatePath of templatePaths) {
417
+ let template;
418
+ try {
419
+ template = JSON.parse(fs.readFileSync(templatePath, 'utf8'));
420
+ }
421
+ catch {
422
+ return undefined;
423
+ }
424
+ // Transform(SAM 等)はマクロ展開で別のリソースに化けるので、生のテンプレートから
425
+ // 読めるリソースタイプは当てにならない。
426
+ if (template?.Transform !== undefined)
427
+ return undefined;
428
+ for (const resource of Object.values(template?.Resources ?? {})) {
429
+ // Fn::ForEach などで Type が静的に読めないエントリがあれば諦める。
430
+ if (typeof resource?.Type !== 'string')
431
+ return undefined;
432
+ types.add(resource.Type);
433
+ }
434
+ }
435
+ return types;
436
+ }
437
+ /**
438
+ * テンプレートに出てくるリソースタイプに関係するルールだけを選ぶ。
439
+ *
440
+ * エンジンのコンパイル時間はルール数でほぼ決まるので(実測 1844 ルールで約 4.6s、
441
+ * 典型的なアプリに残る 100 ルール前後なら 0.8s 前後)、これが固定費の主な削りどころ。
442
+ * 安全性は meta.resourceTypes の宣言に乗っている: ルールが見るリソースタイプが
443
+ * 宣言から漏れていると刈られて発火しなくなるため、test/rules.test.ts が全ルールについて
444
+ * 「自分の fail テンプレートで刈り残ること」を検査している。
445
+ * (テストからも利用するため export している)
446
+ */
447
+ function prune(rules, types) {
448
+ if (types === undefined)
449
+ return rules;
450
+ // 刈る根拠が無いルールは残す: "*"(全リソース型に効くタグ系ルール)と、
451
+ // resourceTypes が空のもの(バンドル済みルールは非空が保証されているので、該当するのは
452
+ // 手で組み立てたルール = テストや将来のテンプレート層ルールだけ)。
453
+ return rules.filter((r) => r.resourceTypes.length === 0
454
+ || r.resourceTypes.includes('*')
455
+ || r.resourceTypes.some((t) => types.has(t)));
360
456
  }
361
457
  /**
362
458
  * @aws/cloudformation-validate を解決する。
@@ -381,4 +477,4 @@ function loadEngine() {
381
477
  return undefined;
382
478
  }
383
479
  }
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLDBEQU1DO0FBR0QsOENBRUM7QUFNRCw0Q0FFQztBQThLRCxnREFpQkM7QUF1REQsd0NBaUJDO0FBYUQsc0NBUUM7QUFnQ0QsZ0NBZUM7QUE5WEQsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qiw2Q0FNcUI7QUFFckIsd0RBQXdFO0FBRXhFLDBEQUEwRDtBQUMxRDs4REFDOEQ7QUFFOUQ7OztHQUdHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztBQUUvRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsU0FBa0I7SUFDeEUsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2RyxPQUFPO1FBQ0wsSUFBSSxFQUFFLDhCQUFzQjtRQUM1QixPQUFPLEVBQUUsK0RBQStELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBTyxFQUFFO0tBQzdHLENBQUM7QUFDSixDQUFDO0FBRUQseUZBQXlGO0FBQ3pGLFNBQWdCLGlCQUFpQixDQUFDLFNBQTZCO0lBQzdELE9BQU8sT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLE1BQTBCO0lBQ3pELE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBWUQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsc0JBQXNCO0lBSWQ7SUFDQTtJQUpILElBQUksR0FBRyxtQkFBVyxDQUFDO0lBRW5DLFlBQ21CLEtBQXdCLEVBQ3hCLE1BQWU7UUFEZixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixXQUFNLEdBQU4sTUFBTSxDQUFTO0lBQy9CLENBQUM7SUFFRyxRQUFRLENBQUMsT0FBaUM7UUFDL0MsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FDWCxpRUFBaUU7Z0JBQ2pFLGdFQUFnRTtnQkFDaEUsK0RBQStELENBQ2hFLENBQUM7WUFDRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDM0MsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdFLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3JGLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBRXpDLElBQUksR0FBUSxDQUFDO1FBQ2IsSUFBSSxDQUFDO1lBQ0gsR0FBRyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLHdDQUF3QztZQUN4QyxnREFBZ0Q7WUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pHLENBQUM7UUFFRCxLQUFLLE1BQU0sRUFBRSxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QyxJQUFJLE1BQVcsQ0FBQztZQUNoQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO29CQUN0RSx3QkFBd0IsRUFBRTt3QkFDeEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO3dCQUM1QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07cUJBQ3ZCO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLDREQUE0RDtnQkFDNUQsMENBQTBDO2dCQUMxQyw4Q0FBOEM7Z0JBQzlDLG9EQUFvRDtnQkFDcEQsdUNBQXVDO2dCQUN2QyxVQUFVLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxTQUFTO1lBQ1gsQ0FBQztZQUNELEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBdUIsRUFBRSxDQUFDO2dCQUNqRSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU07dUJBQzFCLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUTt1QkFDckIsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVztvQkFBRSxTQUFTO2dCQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDO29CQUNkLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTTtvQkFDbEIsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPO29CQUN0QixRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7b0JBQ2pDLGtCQUFrQixFQUFFLENBQUM7NEJBQ25CLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLFdBQVc7NEJBQ3JELFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWTs0QkFDN0IsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUM7eUJBQzVDLENBQUM7b0JBQ0YsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQzFGLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBRUQsNERBQTREO1FBQzVELHNEQUFzRDtRQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUNqRyxDQUFDO0NBQ0Y7QUE1RUQsd0RBNEVDO0FBRUQsaUNBQWlDO0FBQ2pDLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFakQ7Ozs7R0FJRztBQUNILFNBQVMsV0FBVyxDQUFDLFFBQTRCO0lBQy9DLFFBQVEsUUFBUSxFQUFFLENBQUM7UUFDakIsS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLE9BQU87WUFDVixPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLE1BQU07WUFDVCxPQUFPLFNBQVMsQ0FBQztRQUNuQixLQUFLLE1BQU07WUFDVCxPQUFPLGVBQWUsQ0FBQztRQUN6QixLQUFLLE9BQU87WUFDVixPQUFPLE9BQU8sQ0FBQztRQUNqQjtZQUNFLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ1UsUUFBQSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztBQUVuRCwwREFBMEQ7QUFDMUQsU0FBUyxlQUFlLENBQUMsQ0FBVTtJQUNqQyxNQUFNLE9BQU8sR0FBSSxDQUF1QyxFQUFFLE9BQU8sQ0FBQztJQUNsRSxPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakYsQ0FBQztBQUVELGdEQUFnRDtBQUNoRCxTQUFTLG9CQUFvQixDQUFDLEVBQXdELEVBQUUsQ0FBVTtJQUNoRyxPQUFPO1FBQ0wsUUFBUSxFQUFFLHlCQUFpQjtRQUMzQixXQUFXLEVBQ1QsaUdBQWlHO2NBQy9GLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsUUFBUSxFQUFFLE9BQU87UUFDakIsR0FBRyxFQUFFLHlFQUF5RTtjQUMxRSwrRUFBK0U7UUFDbkYsa0JBQWtCLEVBQUUsQ0FBQztnQkFDbkIsYUFBYSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0I7Z0JBQ3BDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWTtnQkFDN0IsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDO2FBQzFCLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELDZFQUE2RTtBQUNoRSxRQUFBLFdBQVcsR0FBRyxlQUFlLENBQUM7QUFFM0MsdUVBQXVFO0FBQ3ZFLE1BQU0sc0JBQXNCLEdBQUcsd0JBQXdCLENBQUM7QUFFeEQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBRS9EOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxLQUFpQjtJQUNsRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM3QixJQUFJLENBQUMsaUJBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTztJQUM3QixNQUFNLEdBQUcsR0FBRyxJQUE0QyxDQUFDO0lBQ3pELElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUFFLE9BQU87SUFDaEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUUvRSxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQXFDLEVBQUUsRUFBRTtRQUNwRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLFNBQWlCO0lBQzlDLElBQUksYUFBb0IsQ0FBQztJQUN6QixJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLGFBQWEsR0FBRyxNQUFNLEVBQUUsYUFBYSxJQUFJLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asb0NBQW9DO1FBQ3BDLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FDL0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEtBQUssbUJBQVcsSUFBSSxDQUFDLEVBQUUsVUFBVSxLQUFLLFNBQVMsQ0FDcEUsQ0FBQztJQUNGLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTztJQUVwQixzQ0FBc0M7SUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUM1QyxNQUFNLElBQUksS0FBSyxDQUNiLDREQUE0RDtRQUM1RCwrRkFBK0Y7UUFDL0YsbUVBQW1FLENBQ3BFLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLGFBQW9CO0lBQ3pDLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDeEMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGVBQWU7UUFDakIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxhQUFvQjtJQUNqRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNuQyxLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sRUFBRSxVQUFVLElBQUksRUFBRSxFQUFFLENBQUM7WUFDakQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNyRCxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVE7Z0JBQ3BCLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xELEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNwRCxNQUFNLENBQUMsSUFBSSxDQUNULEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksU0FBUyxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUMsVUFBVSxLQUFLO29CQUMxRyxNQUFNLENBQUMsQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDLHNCQUFzQixFQUFFLFNBQVMsS0FBSyxDQUFDLENBQUMsWUFBWSxJQUFJO29CQUNwRix3QkFBd0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FDNUQsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsbURBQW1EO0FBQ25ELDhDQUE4QztBQUM5QyxJQUFJLGVBQXdDLENBQUM7QUFDN0MsU0FBUyxtQkFBbUI7SUFDMUIsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbEMsZUFBZSxHQUFHLGFBQWEsRUFBRSxJQUFJLEtBQUssQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxlQUFlLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztBQUNqRSxDQUFDO0FBRUQsaUNBQWlDO0FBQ2pDLFNBQWdCLGFBQWE7SUFDM0IsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztRQUMxRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaURBQWlELENBQUMsQ0FBQyxDQUFDO1FBQzNGLE9BQU8sT0FBTyxHQUFHLEVBQUUsdUJBQXVCLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsSUFBSSxrQkFBMkMsQ0FBQztBQUNoRCxTQUFTLGdCQUFnQjtJQUN2QixJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLGtCQUFrQixHQUFHLFVBQVUsRUFBRSxJQUFJLEtBQUssQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7QUFDL0MsU0FBUyxnQkFBZ0IsQ0FBQyxZQUFpQixFQUFFLEtBQXdCLEVBQUUsTUFBZSxFQUFFLE9BQWdCO0lBQ3RHLE1BQU0sR0FBRyxHQUFHLEdBQUcsTUFBTSxJQUFJLEVBQUUsSUFBSSxPQUFPLElBQUksRUFBRSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNuRixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLEdBQUcsOEJBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDL0QsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZELENBQUM7UUFDRixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QixXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVU7SUFDeEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsZUFBZTtJQUNqQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsMkNBQTJDLEVBQUU7WUFDMUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5QixDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEFwcCxcbiAgdHlwZSBJUG9saWN5VmFsaWRhdGlvbkNvbnRleHQsXG4gIHR5cGUgSVBvbGljeVZhbGlkYXRpb25QbHVnaW4sXG4gIHR5cGUgUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCxcbiAgdHlwZSBQb2xpY3lWaW9sYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQlVORExFRF9MSUJTLCB0eXBlIEJ1bmRsZWRSdWxlRGF0YSB9IGZyb20gJy4uL3J1bGVzLmdlbmVyYXRlZCc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAtLSBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlIOOBr1xuICAgYXdzLWNkay1saWIg5ZCM5qKx44Kz44OU44O844KS5YuV55qE6Kej5rG644GZ44KL6Kit6KiI77yI5L6d5a2Y44Gr44Gv6LyJ44Gb44Gq44GE77yJ44CCUkVBRE1FL0FHRU5UUy5tZCDlj4LnhacgKi9cblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIFJlZ28gbW9kdWxlIHRoYXQgY2FycmllcyB0aGUgZGVwbG95bWVudFxuICogZW52aXJvbm1lbnQgaW50byBydWxlIGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBERVBMT1lfRU5WX01PRFVMRV9OQU1FID0gJ19wZl9kZXBsb3lfZW52aXJvbm1lbnQnO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBnZW5lcmF0ZWQgbW9kdWxlIGRlZmluaW5nIGBkZXBsb3lfcmVnaW9uYCBmb3IgdGhlIHJ1bGUgcGFja2FnZS5cbiAqXG4gKiBSdWxlcyBtdXN0IHJlYWQgaXQgYXMgYGRhdGEuY2RrX3ByZWZsaWdodC5kZXBsb3lfcmVnaW9uYCAobmV2ZXIgYXMgYSBiYXJlXG4gKiB2YXJpYWJsZSk6IHRoZSBkYXRhIHJlZmVyZW5jZSBpcyBzaW1wbHkgdW5kZWZpbmVkIHdoZW4gdGhlIG1vZHVsZSBpcyBub3RcbiAqIGluamVjdGVkIOKAlCB0aGUgcnVsZSBib2R5IGZhaWxzIGFuZCB0aGUgcnVsZSBza2lwcyDigJQgd2hpbGUgYSBiYXJlIHZhcmlhYmxlXG4gKiB3b3VsZCBiZSBhIGNvbXBpbGUgZXJyb3IuIEluamVjdGVkIGJ5IHRoZSBlbmZvcmNlIHBsdWdpbiB3aGVuIHRoZSBhcHAtbGV2ZWxcbiAqIHJlZ2lvbiBpcyBjb25jcmV0ZTsgdGhlIHdhcm4gbW9kZSAoQ0RLIGJ1aWx0LWluIHBsdWdpbikgbmV2ZXIgaW5qZWN0cyBpdCxcbiAqIHNvIHJlZ2lvbi1kZXBlbmRlbnQgcnVsZXMgb25seSBmaXJlIGluIGVuZm9yY2UgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcGxveUVudmlyb25tZW50TW9kdWxlKHJlZ2lvbjogc3RyaW5nLCBhY2NvdW50SWQ/OiBzdHJpbmcpOiB7IG5hbWU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0ge1xuICBjb25zdCBhY2NvdW50ID0gaXNDb25jcmV0ZUFjY291bnQoYWNjb3VudElkKSA/IGBkZXBsb3lfYWNjb3VudCA6PSAke0pTT04uc3RyaW5naWZ5KGFjY291bnRJZCl9XFxuYCA6ICcnO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IERFUExPWV9FTlZfTU9EVUxFX05BTUUsXG4gICAgY29udGVudDogYHBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuZGVwbG95X3JlZ2lvbiA6PSAke0pTT04uc3RyaW5naWZ5KHJlZ2lvbil9XFxuJHthY2NvdW50fWAsXG4gIH07XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBhY2NvdW50IGZyb20gdGhlIHZhbGlkYXRpb24gY29udGV4dCBpcyBhIGNvbmNyZXRlIDEyLWRpZ2l0IGFjY291bnQgaWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb25jcmV0ZUFjY291bnQoYWNjb3VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhY2NvdW50SWQgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBhY2NvdW50SWQgPT09ICdzdHJpbmcnICYmIC9eXFxkezEyfSQvLnRlc3QoYWNjb3VudElkKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpb24gZnJvbSB0aGUgdmFsaWRhdGlvbiBjb250ZXh0IGlzIGEgY29uY3JldGUgcmVnaW9uIG5hbWVcbiAqIChhcyBvcHBvc2VkIHRvIHVuZGVmaW5lZCwgYW4gdW5yZXNvbHZlZCB0b2tlbiwgb3IgYSBwbGFjZWhvbGRlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbmNyZXRlUmVnaW9uKHJlZ2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogcmVnaW9uIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgcmVnaW9uID09PSAnc3RyaW5nJyAmJiAvXlthLXpdezJ9KC1bYS16XSspKy1cXGQrJC8udGVzdChyZWdpb24pO1xufVxuXG5pbnRlcmZhY2UgRW5naW5lRGlhZ25vc3RpYyB7XG4gIHJlYWRvbmx5IHJ1bGVJZDogc3RyaW5nO1xuICByZWFkb25seSBzZXZlcml0eTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW50aXR5PzogeyByZWFkb25seSBsb2dpY2FsSWQ/OiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgcHJvcGVydHlQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIGVuZm9yY2Ug44Oi44O844OJ55So44Gu5YaF6YOo44OX44Op44Kw44Kk44Oz44CCXG4gKlxuICogQ0RLIOe1hOOBv+i+vOOBv+OBriBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBr+WFqCBmaW5kaW5nIOOCkiB3YXJuaW5nIOOBq+S4uOOCgeOCi+OBn+OCgVxuICog77yIYXdzLWNkay1saWIgMi4yNjcuMCDlrp/muKzjgIHmmIfmoLzjg5Xjg6njgrDjgoLnhKHlirnvvInjgIHlkIzjgZjjgqjjg7Pjgrjjg7PjgpLnm7TmjqXlkbzjgbPjgIFcbiAqIGNkay1wcmVmbGlnaHQg44Gu44Or44O844Or6YGV5Y+N77yI44GK44KI44GzIHN0cmljdCDmmYLjga/jgqjjg7Pjgrjjg7Pjga7jgqjjg6njg7zjgq/jg6njgrnvvInjgpJcbiAqIHBvbGljeSB2YWxpZGF0aW9uIOOBruWkseaVl+OBqOOBl+OBpuWgseWRiuOBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgIJcbiAqL1xuZXhwb3J0IGNsYXNzIFByZWZsaWdodEVuZm9yY2VQbHVnaW4gaW1wbGVtZW50cyBJUG9saWN5VmFsaWRhdGlvblBsdWdpbiB7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lID0gUExVR0lOX05BTUU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBydWxlczogQnVuZGxlZFJ1bGVEYXRhW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdHJpY3Q6IGJvb2xlYW4sXG4gICkge31cblxuICBwdWJsaWMgdmFsaWRhdGUoY29udGV4dDogSVBvbGljeVZhbGlkYXRpb25Db250ZXh0KTogUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCB7XG4gICAgY29uc3QgZW5naW5lID0gbG9hZEVuZ2luZUNhY2hlZCgpO1xuICAgIGlmICghZW5naW5lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ2Nkay1wcmVmbGlnaHQ6IGNvdWxkIG5vdCByZXNvbHZlIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGU7ICcgK1xuICAgICAgICAnZW5mb3JjZSBtb2RlIGlzIHVuYXZhaWxhYmxlIGFuZCBubyBwcmVmbGlnaHQgY2hlY2tzIHdlcmUgcnVuLiAnICtcbiAgICAgICAgJ0luc3RhbGwgaXQgYXMgYSBkZXZEZXBlbmRlbmN5IG9yIHVzZSB0aGUgZGVmYXVsdCAod2FybikgbW9kZS4nLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHZpb2xhdGlvbnM6IFtdIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaW9uID0gaXNDb25jcmV0ZVJlZ2lvbihjb250ZXh0LnJlZ2lvbikgPyBjb250ZXh0LnJlZ2lvbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhY2NvdW50ID0gaXNDb25jcmV0ZUFjY291bnQoY29udGV4dC5hY2NvdW50SWQpID8gY29udGV4dC5hY2NvdW50SWQgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3VycyA9IG5ldyBTZXQodGhpcy5ydWxlcy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBjb25zdCB2aW9sYXRpb25zOiBQb2xpY3lWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgbGV0IGVuZzogYW55O1xuICAgIHRyeSB7XG4gICAgICBlbmcgPSByZWdvRW5naW5lQ2FjaGVkKGVuZ2luZSwgdGhpcy5ydWxlcywgcmVnaW9uLCBhY2NvdW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyDjg6vjg7zjg6vjg5Hjg4Pjgq/jgYzjgrPjg7Pjg5HjgqTjg6vjgafjgY3jgarjgYQgPSDjganjga7jg4bjg7Pjg5fjg6zjg7zjg4jjgoLmpJzmn7vjgafjgY3jgarjgYTjga7jgafjgIFcbiAgICAgIC8vIOWFqOOCueOCv+ODg+OCr+OBtuOCkyB2aW9sYXRpb24g44KS56uL44Gm44KL77yIMSDmnprjgZrjgaTjga4gY2F0Y2gg44Gr44Gv5Yiw6YGU44GX44Gq44GE77yJ44CCXG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgdmlvbGF0aW9uczogY29udGV4dC5zdGFja1RlbXBsYXRlcy5tYXAoKHN0KSA9PiBlbmdpbmVFcnJvclZpb2xhdGlvbihzdCwgZSkpIH07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdCBvZiBjb250ZXh0LnN0YWNrVGVtcGxhdGVzKSB7XG4gICAgICBsZXQgcmVwb3J0OiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICByZXBvcnQgPSBlbmcudmFsaWRhdGVEZXRhaWxlZChuZXcgZW5naW5lLlRlbXBsYXRlRmlsZShzdC50ZW1wbGF0ZVBhdGgpLCB7XG4gICAgICAgICAgcHNldWRvUGFyYW1ldGVyT3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IGNvbnRleHQuYWNjb3VudElkLFxuICAgICAgICAgICAgcmVnaW9uOiBjb250ZXh0LnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gdGhyb3cg44KS5aSW44Gr5Ye644GZ44GoIENESyDjga/jgZPjga7lkbzjgbPlh7rjgZfjgpIgcGx1Z2luIGZhaWx1cmXvvIh2aW9sYXRpb24g44K844Ot77yJ44Go44GX44GmXG4gICAgICAgIC8vIOiomOmMsuOBmeOCi+OBoOOBkeOBq+OBquOCiuOAgeOBk+OBk+OBvuOBp+OBq+mbhuOCgeOBn+mBleWPjeOCguW+jOe2muODhuODs+ODl+ODrOODvOODiOOBrumBleWPjeOCguS4uOOBlOOBqOa2iOOBiOOAgVxuICAgICAgICAvLyDmrovjgovjga7jga8gYGZhaWxlZDogdW5kZWZpbmVkYCDjgaDjgZHjgavjgarjgovvvIhpc3N1ZSAjMTUx77yJ44CCXG4gICAgICAgIC8vIHN5bnRoIOOCkuatouOCgeOCi+OBruOBryBpbnN0YWxsRW5mb3JjZUdhdGUg44Gu5b2555uu44CC44GT44GT44Gv44CM44Gp44Gu44K544K/44OD44Kv44Gn5L2V44GMXG4gICAgICAgIC8vIOi1t+OBjeOBn+OBi+OAjeOCkuODrOODneODvOODiOOBq+aui+OBl+OAgeS7luOCueOCv+ODg+OCr+OBruODq+ODvOODq+OCkui1sOOCieOBm+e2muOBkeOCi+OBn+OCgeOBruOCguOBruOAglxuICAgICAgICB2aW9sYXRpb25zLnB1c2goZW5naW5lRXJyb3JWaW9sYXRpb24oc3QsIGUpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGQgb2YgKHJlcG9ydC5kaWFnbm9zdGljcyA/PyBbXSkgYXMgRW5naW5lRGlhZ25vc3RpY1tdKSB7XG4gICAgICAgIGNvbnN0IGlzT3VycyA9IGQuc291cmNlID09PSAnQ1VTVE9NJyAmJiBvdXJzLmhhcyhkLnJ1bGVJZCk7XG4gICAgICAgIGNvbnN0IGlzU3RyaWN0SGl0ID0gdGhpcy5zdHJpY3RcbiAgICAgICAgICAmJiBkLnNvdXJjZSAhPT0gJ0NVU1RPTSdcbiAgICAgICAgICAmJiAoZC5zZXZlcml0eSA9PT0gJ0VSUk9SJyB8fCBkLnNldmVyaXR5ID09PSAnRkFUQUwnKTtcbiAgICAgICAgaWYgKCFpc091cnMgJiYgIWlzU3RyaWN0SGl0KSBjb250aW51ZTtcbiAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICBydWxlTmFtZTogZC5ydWxlSWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGQubWVzc2FnZSxcbiAgICAgICAgICBzZXZlcml0eTogbWFwU2V2ZXJpdHkoZC5zZXZlcml0eSksXG4gICAgICAgICAgdmlvbGF0aW5nUmVzb3VyY2VzOiBbe1xuICAgICAgICAgICAgcmVzb3VyY2VMb2dpY2FsSWQ6IGQuZW50aXR5Py5sb2dpY2FsSWQgPz8gJyh1bmtub3duKScsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IHN0LnRlbXBsYXRlUGF0aCxcbiAgICAgICAgICAgIGxvY2F0aW9uczogW2QucHJvcGVydHlQYXRoID8/ICcodGVtcGxhdGUpJ10sXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgLi4uKGQuZG9jdW1lbnRhdGlvblVybCA/IHsgcnVsZU1ldGFkYXRhOiB7IERvY3VtZW50YXRpb25Vcmw6IGQuZG9jdW1lbnRhdGlvblVybCB9IH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENESyDntYTjgb/ovrzjgb/jga4gQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbiDjgajlkIzjgZjliKTlrprjgIJ3YXJuaW5nIOOBoOOBkeOBquOCiVxuICAgIC8vIOODrOODneODvOODiOOBq+OBr+i8ieOCi+OBjOWQiOaIkOOBr+mAmuOCi++8iENMSSDlgbTjga8gc3VjY2Vzcy9mYWlsdXJlIOOBq+mWouOCj+OCieOBmuW/heOBmuWHuuWKm+OBmeOCi++8ieOAglxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHZpb2xhdGlvbnMuZXZlcnkoKHYpID0+ICFCTE9DS1NfU1lOVEguaGFzKFN0cmluZyh2LnNldmVyaXR5KSkpLCB2aW9sYXRpb25zIH07XG4gIH1cbn1cblxuLyoqIOWQiOaIkOOCkuatouOCgeOCiyB2aW9sYXRpb24gc2V2ZXJpdHnjgIIgKi9cbmNvbnN0IEJMT0NLU19TWU5USCA9IG5ldyBTZXQoWydlcnJvcicsICdmYXRhbCddKTtcblxuLyoqXG4gKiDjgqjjg7Pjgrjjg7Pjga4gc2V2ZXJpdHkg44KSIHBvbGljeSB2YWxpZGF0aW9uIOOBriBzZXZlcml0eSDjgavlhpnjgZnjgILooajjga8gYXdzLWNkay1saWIgMi4yNjcuMCDjga5cbiAqIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44Go5ZCM5LiA44CCYHJlcHJvLm1ldGhvZDogZG9jLW9ubHlgIOOBruODq+ODvOODq+OBryBXQVJOIOOCkuWHuuOBmeOBruOBp1xuICogd2FybmluZyDjgavjgarjgorjgIHloLHlkYrjga/jgZXjgozjgovjgYwgc3ludGgg44Gv5q2i44KB44Gq44GE77yI6Ki85oug44GM5a6f5qmf44Gu44OH44OX44Ot44Kk5aSx5pWX44Gn44Gv44Gq44GE44Gf44KB77yJ44CCXG4gKi9cbmZ1bmN0aW9uIG1hcFNldmVyaXR5KHNldmVyaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgY2FzZSAnRkFUQUwnOlxuICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgIHJldHVybiAnZXJyb3InO1xuICAgIGNhc2UgJ1dBUk4nOlxuICAgICAgcmV0dXJuICd3YXJuaW5nJztcbiAgICBjYXNlICdJTkZPJzpcbiAgICAgIHJldHVybiAnaW5mb3JtYXRpb25hbCc7XG4gICAgY2FzZSAnREVCVUcnOlxuICAgICAgcmV0dXJuICdkZWJ1Zyc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnd2FybmluZyc7XG4gIH1cbn1cblxuLyoqXG4gKiDjg6vjg7zjg6voqZXkvqHjgZ3jga7jgoLjga7jgYzlpLHmlZfjgZfjgZ/jgZPjgajjgpLooajjgZkgdmlvbGF0aW9uIOOBriBydWxlTmFtZeOAglxuICog44OQ44Oz44OJ44Or5riI44G/44Or44O844Or44GuIGlkIOOBp+OBr+OBquOBhOOBruOBpyBgZXhjbHVkZWAg44Gn44Gv5raI44Gb44Gq44GE77yI5raI44GX44Gm44KI44GE54q25oWL44Gn44Gv44Gq44GE77yJ44CCXG4gKi9cbmV4cG9ydCBjb25zdCBFTkdJTkVfRVJST1JfUlVMRSA9ICdwZi1lbmdpbmUtZXJyb3InO1xuXG4vKiog44Ko44Oz44K444Oz44GM5oqV44GS44Gf5YCk44KS44Oh44OD44K744O844K444Gr6JC944Go44GZ44CC44Ko44Oz44K444Oz44GvIEVycm9yIOOBp+OBr+OBquOBj+e0oOOBruaWh+Wtl+WIl+OCkuaKleOBkuOCi+OBk+OBqOOBjOOBguOCi+OAgiAqL1xuZnVuY3Rpb24gZW5naW5lRXJyb3JUZXh0KGU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gKGUgYXMgeyBtZXNzYWdlPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubWVzc2FnZTtcbiAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlLmxlbmd0aCA+IDAgPyBtZXNzYWdlIDogU3RyaW5nKGUpO1xufVxuXG4vKiogMSDmnprjga7jg4bjg7Pjg5fjg6zjg7zjg4jjgpLmpJzmn7vjgafjgY3jgarjgYvjgaPjgZ/jgZPjgajjgpIgdmlvbGF0aW9uIOOBqOOBl+OBpuWgseWRiuOBmeOCi+OAgiAqL1xuZnVuY3Rpb24gZW5naW5lRXJyb3JWaW9sYXRpb24oc3Q6IHsgc3RhY2tDb25zdHJ1Y3RQYXRoOiBzdHJpbmc7IHRlbXBsYXRlUGF0aDogc3RyaW5nIH0sIGU6IHVua25vd24pOiBQb2xpY3lWaW9sYXRpb24ge1xuICByZXR1cm4ge1xuICAgIHJ1bGVOYW1lOiBFTkdJTkVfRVJST1JfUlVMRSxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdjZGstcHJlZmxpZ2h0IGNvdWxkIG5vdCBldmFsdWF0ZSBpdHMgcnVsZXMgZm9yIHRoaXMgdGVtcGxhdGUsIHNvIG5vIHByZWZsaWdodCBydWxlIHJhbiBmb3IgaXQ6ICdcbiAgICAgICsgZW5naW5lRXJyb3JUZXh0KGUpLFxuICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgIGZpeDogJ1JlcG9ydCB0aGlzIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9iYWRtaW50b25jcnllci9jZGstcHJlZmxpZ2h0L2lzc3VlczsgJ1xuICAgICAgKyAndG8gdW5ibG9jayB0aGUgYnVpbGQgbWVhbndoaWxlLCB1c2UgUHJlZmxpZ2h0LmFwcGx5KGFwcCwgeyBlbmZvcmNlOiBmYWxzZSB9KS4nLFxuICAgIHZpb2xhdGluZ1Jlc291cmNlczogW3tcbiAgICAgIGNvbnN0cnVjdFBhdGg6IHN0LnN0YWNrQ29uc3RydWN0UGF0aCxcbiAgICAgIHRlbXBsYXRlUGF0aDogc3QudGVtcGxhdGVQYXRoLFxuICAgICAgbG9jYXRpb25zOiBbJyh0ZW1wbGF0ZSknXSxcbiAgICB9XSxcbiAgfTtcbn1cblxuLyoqIFRoZSBwbHVnaW4gbmFtZSByZWNvcmRlZCBpbiBgdmFsaWRhdGlvbi1yZXBvcnQuanNvbmAgZm9yIG91ciBmaW5kaW5ncy4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fTkFNRSA9ICdjZGstcHJlZmxpZ2h0JztcblxuLyoqIFRoZSBjbG91ZCBhc3NlbWJseSBmaWxlIHRoZSBDREsgd3JpdGVzIGl0cyB2YWxpZGF0aW9uIHJlcG9ydCB0by4gKi9cbmNvbnN0IFZBTElEQVRJT05fUkVQT1JUX0ZJTEUgPSAndmFsaWRhdGlvbi1yZXBvcnQuanNvbic7XG5cbmNvbnN0IEdBVEVfSU5TVEFMTEVEID0gU3ltYm9sLmZvcignY2RrLXByZWZsaWdodC5lbmZvcmNlR2F0ZScpO1xuXG4vKipcbiAqIGVuZm9yY2Ug44Oi44O844OJ44Gu5Y+W44KK44GT44G844GX44KS5aGe44GQ44Ky44O844OI44KSIEFwcCDjgavku5XovrzjgoDjgIJcbiAqXG4gKiBDREsgQ0xJIDIuMTEyOC4xIOS7pemZjeOBryBhcHAg44Gr44CM44Os44Od44O844OI44GvIENMSSDjgYzlh6bnkIbjgZnjgovjgI3jgajkvJ3jgYjjgZ/jgYbjgYjjgadcbiAqIGB2YWxpZGF0aW9uLXJlcG9ydC5qc29uYCDjgpLoh6rliIbjgafoqq3jgoDjgYzjgIHjgZ3jga7ntZ7jgorovrzjgb/vvIh0b29sa2l0LWxpYiDjga5cbiAqIGBmaWx0ZXJSZXBvcnRzQnlTdGFja3Ng77yJ44GMIHZpb2xhdGlvbiDjga4gY29uc3RydWN0UGF0aCDlhYjpoK3jgrvjgrDjg6Hjg7Pjg4jjgpJcbiAqIOmBuOaKnuOCueOCv+ODg+OCr+OBriBoaWVyYXJjaGljYWxJZCDjgajnqoHjgY3lkIjjgo/jgZvjgovjgZ/jgoHjgIFgU3RhZ2UvU3RhY2tgIOW9ouW8j+OBq+OBquOCi1xuICogU3RhZ2Ug5YaF44K544K/44OD44Kv44Gu6YGV5Y+N44GM44GZ44G544Gm5o2o44Gm44KJ44KM44CBc3ludGgg44GM6buZ44Gj44Gm5oiQ5Yqf44GZ44KL77yIaXNzdWUgIzExM++8ieOAglxuICpcbiAqIOOBneOBk+OBpyBzeW50aCDlrozkuoblvozjgavjg6zjg53jg7zjg4jjgpLoqq3jgb/nm7TjgZfjgIFjZGstcHJlZmxpZ2h0IOOBrumBleWPjeOBjOaui+OBo+OBpuOBhOOCjOOBsFxuICog6Ieq5YiG44Gn5aCx5ZGK44GX44GmIHN5bnRoIOOCkuatouOCgeOCi+OAguODqeOCpOODluODqeODquOBjOiHquWKm+OBp+WgseWRiuOBmeOCi+e1jOi3r++8iOe0oOOBriBub2RlIOWun+ihjOOAgVxuICogamVzdOOAgUNMSSAyLjExMjguMSDmnKrmuoDvvInjgafjga8gc3ludGgg44GM5L6L5aSW44KS5oqV44GS44KL44Gf44KB44GT44GT44Gr44Gv5Yiw6YGU44Gb44Ga44CBXG4gKiDkuozph43loLHlkYrjga/otbfjgY3jgarjgYTjgIJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxFbmZvcmNlR2F0ZShzY29wZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICBjb25zdCByb290ID0gc2NvcGUubm9kZS5yb290O1xuICBpZiAoIUFwcC5pc0FwcChyb290KSkgcmV0dXJuO1xuICBjb25zdCBhcHAgPSByb290IGFzIEFwcCAmIHsgW0dBVEVfSU5TVEFMTEVEXT86IGJvb2xlYW4gfTtcbiAgaWYgKGFwcFtHQVRFX0lOU1RBTExFRF0pIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcCwgR0FURV9JTlNUQUxMRUQsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuXG4gIGNvbnN0IHN5bnRoID0gYXBwLnN5bnRoLmJpbmQoYXBwKTtcbiAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgYXBwLnN5bnRoID0gKG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFwcFsnc3ludGgnXT5bMF0pID0+IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IHN5bnRoKG9wdGlvbnMpO1xuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgY2hlY2tlZCA9IHRydWU7XG4gICAgICBmYWlsSWZSZXBvcnRVbmhhbmRsZWQoYXNzZW1ibHkuZGlyZWN0b3J5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFzc2VtYmx5O1xuICB9O1xufVxuXG4vKipcbiAqIOODrOODneODvOODiOOBqyBjZGstcHJlZmxpZ2h0IOOBruWkseaVl+OBjOaui+OBo+OBpuOBhOOCjOOBsOOAgWZpbmRpbmdzIOOCkuWHuuWKm+OBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgIJcbiAqXG4gKiDliKTlrprjga8gY2RrLXByZWZsaWdodCDjga7jg6zjg53jg7zjg4jjgaDjgZHjgpLopovjgovjgILntYTjgb/ovrzjgb/jgqjjg7Pjgrjjg7PjgoQgY29uc3RydWN0IGFubm90YXRpb25cbiAqIOOBoOOBkeOBjOWkseaVl+OBl+OBpuOBhOOCi+WgtOWQiOOBryBDTEkg44GM5q2j44GX44GP5omx44GI44KL44Gu44Gn44CB44GT44Gh44KJ44Gv6buZ44Gj44GmIENMSSDjgavku7vjgZvjgovjgIJcbiAqIOmAhuOBq+eZuueBq+OBmeOCi+OBqOOBjeOBr+ODrOODneODvOODiOWFqOS9k+OCkuWHuuOBmeOAguOBk+OBk+OBpyBzeW50aCDjgpLmraLjgoHjgovjgaggQ0xJIOWBtOOBruWHuuWKm+OBjFxuICog5LiA5YiH6LWw44KJ44Gq44GE44Gf44KB44CB5ZCM5pmC44Gr5Ye644Gm44GE44Gf44Gv44Ga44Gu5LuW44OX44Op44Kw44Kk44Oz44GuIGZpbmRpbmcg44GM5raI44GI44Gm44GX44G+44GG44CCXG4gKi9cbmZ1bmN0aW9uIGZhaWxJZlJlcG9ydFVuaGFuZGxlZChkaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICBsZXQgcGx1Z2luUmVwb3J0czogYW55W107XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb3J0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpcmVjdG9yeSwgVkFMSURBVElPTl9SRVBPUlRfRklMRSksICd1dGY4JykpO1xuICAgIHBsdWdpblJlcG9ydHMgPSByZXBvcnQ/LnBsdWdpblJlcG9ydHMgPz8gW107XG4gIH0gY2F0Y2gge1xuICAgIC8vIOODrOODneODvOODiOOBjOeEoeOBhO+8iOODl+ODqeOCsOOCpOODs+acquWun+ihjO+8ieOBvuOBn+OBr+WjiuOCjOOBpuOBhOOCi+WgtOWQiOOBr+S9leOCguOBl+OBquOBhFxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBmYWlsZWQgPSBwbHVnaW5SZXBvcnRzLnNvbWUoXG4gICAgKHIpID0+IHI/LnBsdWdpbk5hbWUgPT09IFBMVUdJTl9OQU1FICYmIHI/LmNvbmNsdXNpb24gPT09ICdmYWlsdXJlJyxcbiAgKTtcbiAgaWYgKCFmYWlsZWQpIHJldHVybjtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmVycm9yKGZvcm1hdFJlcG9ydHMocGx1Z2luUmVwb3J0cykpO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ2Nkay1wcmVmbGlnaHQ6IHZhbGlkYXRpb24gZmFpbGVkLiBGaXggdGhlIGZpbmRpbmdzIGFib3ZlLCAnICtcbiAgICBcImFja25vd2xlZGdlIHRoZW0gd2l0aCBWYWxpZGF0aW9ucy5vZihzY29wZSkuYWNrbm93bGVkZ2UoeyBpZDogJ2Nkay1wcmVmbGlnaHQ6OjxydWxlLWlkPicgfSksIFwiICtcbiAgICAnb3IgZXhjbHVkZSB0aGUgcnVsZSB2aWEgUHJlZmxpZ2h0LmFwcGx5KGFwcCwgeyBleGNsdWRlOiBbLi4uXSB9KS4nLFxuICApO1xufVxuXG4vKipcbiAqIENESyDmnKzkvZPjga7jg5Xjgqnjg7zjg57jg4Pjgr/jgafmlbTlvaLjgZfjgIFDTEkg44Go5ZCM5LiA44Gu6KaL44Gf55uu44Gr44GZ44KL44CCXG4gKiDnp4HmnInjg5Hjgrnjgarjga7jgafop6PmsbrjgafjgY3jgarjgYTjgZPjgajjgYzjgYLjgorjgIHjgZ3jga7loLTlkIjjga/mnIDlsI/pmZDjga7oh6rliY3mlbTlvaLjgavokL3jgajjgZlcbiAqIO+8iOimi+OBn+ebruOCiOOCiuOAjOiQveOBqOOBmeOAjeOBk+OBqOOCkuWEquWFiOOBmeOCi++8ieOAglxuICovXG5mdW5jdGlvbiBmb3JtYXRSZXBvcnRzKHBsdWdpblJlcG9ydHM6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybWF0dGVyID0gbG9hZEZvcm1hdHRlckNhY2hlZCgpO1xuICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0VmFsaWRhdGlvblJlcG9ydHMocHJvY2Vzcy5jd2QoKSwgcGx1Z2luUmVwb3J0cykuam9pbignXFxuXFxuJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrRm9ybWF0KHBsdWdpblJlcG9ydHMpO1xufVxuXG4vKipcbiAqIENESyDmnKzkvZPjga7jg5Xjgqnjg7zjg57jg4Pjgr/jgpLop6PmsbrjgafjgY3jgarjgYTjgajjgY3jga7mnIDlsI/pmZDjga7mlbTlvaLjgIJcbiAqIOimi+OBn+ebruOBr+WKo+OCi+OBjOOAgWZpbmRpbmdzIOOCkuW/heOBmuiqreOCgeOCi+W9ouOBp+WHuuOBmeOBn+OCgeOBruacgOW+jOOBruegpuOAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhbGxiYWNrRm9ybWF0KHBsdWdpblJlcG9ydHM6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgYmxvY2tzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlcG9ydCBvZiBwbHVnaW5SZXBvcnRzKSB7XG4gICAgZm9yIChjb25zdCB2aW9sYXRpb24gb2YgcmVwb3J0Py52aW9sYXRpb25zID8/IFtdKSB7XG4gICAgICBjb25zdCBhY2tJZCA9IFN0cmluZyh2aW9sYXRpb24ucnVsZU5hbWUpLmluY2x1ZGVzKCc6OicpXG4gICAgICAgID8gdmlvbGF0aW9uLnJ1bGVOYW1lXG4gICAgICAgIDogYCR7cmVwb3J0LnBsdWdpbk5hbWV9Ojoke3Zpb2xhdGlvbi5ydWxlTmFtZX1gO1xuICAgICAgZm9yIChjb25zdCBjIG9mIHZpb2xhdGlvbi52aW9sYXRpbmdDb25zdHJ1Y3RzID8/IFtdKSB7XG4gICAgICAgIGJsb2Nrcy5wdXNoKFxuICAgICAgICAgIGAke1N0cmluZyh2aW9sYXRpb24uc2V2ZXJpdHkgPz8gJ0VSUk9SJykudG9VcHBlckNhc2UoKX0gJHt2aW9sYXRpb24uZGVzY3JpcHRpb259ICgke3JlcG9ydC5wbHVnaW5OYW1lfSlcXG5gICtcbiAgICAgICAgICBgICAgJHtjLmNvbnN0cnVjdFBhdGh9ICgke2MuY2xvdWRGb3JtYXRpb25SZXNvdXJjZT8ubG9naWNhbElkfSkgJHtjLmNvbnN0cnVjdEZxbn1cXG5gICtcbiAgICAgICAgICBgICAgQWNrbm93bGVkZ2Ugd2l0aCAnJHtTdHJpbmcoYWNrSWQpLnJlcGxhY2UoLyAvZywgJy0nKX0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJsb2Nrcy5qb2luKCdcXG5cXG4nKTtcbn1cblxuLy8g44OV44Kp44O844Oe44OD44K/44GvIGF3cy1jZGstbGliIOOBruengeacieODkeOCueOBq+OBguOCiiBgZXhwb3J0c2Ag44GL44KJ6KaL44GI44Gq44GE44Gf44KB44CBXG4vLyDjgqjjg7Pjgrjjg7Pop6PmsbrvvIhsb2FkRW5naW5l77yJ44Go5ZCM44GY44GP44OR44OD44Kx44O844K444Or44O844OI44GL44KJ44Gu57W25a++44OR44K544Gn6Kqt44G/6L6844KA44CCXG5sZXQgY2FjaGVkRm9ybWF0dGVyOiBhbnkgfCBmYWxzZSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGxvYWRGb3JtYXR0ZXJDYWNoZWQoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNhY2hlZEZvcm1hdHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkRm9ybWF0dGVyID0gbG9hZEZvcm1hdHRlcigpID8/IGZhbHNlO1xuICB9XG4gIHJldHVybiBjYWNoZWRGb3JtYXR0ZXIgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogY2FjaGVkRm9ybWF0dGVyO1xufVxuXG4vKiog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIkgKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRm9ybWF0dGVyKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbGliUm9vdCA9IHBhdGguZGlybmFtZShyZXF1aXJlLnJlc29sdmUoJ2F3cy1jZGstbGliL3BhY2thZ2UuanNvbicpKTtcbiAgICBjb25zdCBtb2QgPSByZXF1aXJlKHBhdGguam9pbihsaWJSb290LCAnY29yZS9saWIvdmFsaWRhdGlvbi9wcml2YXRlL21vZGVybi1mb3JtYXR0ZXIuanMnKSk7XG4gICAgcmV0dXJuIHR5cGVvZiBtb2Q/LmZvcm1hdFZhbGlkYXRpb25SZXBvcnRzID09PSAnZnVuY3Rpb24nID8gbW9kIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8vIOOCqOODs+OCuOODs++8iFdBU03vvInjga7liJ3mnJ/ljJbjga/ph43jgYTjgZ/jgoHjgIHjg6Ljgrjjg6Xjg7zjg6vjg6zjg5njg6vjgafjgq3jg6Pjg4Pjgrfjg6XjgZnjgotcbmxldCBjYWNoZWRFbmdpbmVNb2R1bGU6IGFueSB8IGZhbHNlIHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gbG9hZEVuZ2luZUNhY2hlZCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICBpZiAoY2FjaGVkRW5naW5lTW9kdWxlID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWNoZWRFbmdpbmVNb2R1bGUgPSBsb2FkRW5naW5lKCkgPz8gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZEVuZ2luZU1vZHVsZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBjYWNoZWRFbmdpbmVNb2R1bGU7XG59XG5cbmNvbnN0IHJlZ29FbmdpbmVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5mdW5jdGlvbiByZWdvRW5naW5lQ2FjaGVkKGVuZ2luZU1vZHVsZTogYW55LCBydWxlczogQnVuZGxlZFJ1bGVEYXRhW10sIHJlZ2lvbj86IHN0cmluZywgYWNjb3VudD86IHN0cmluZyk6IGFueSB7XG4gIGNvbnN0IGtleSA9IGAke3JlZ2lvbiA/PyAnJ318JHthY2NvdW50ID8/ICcnfXwke3J1bGVzLm1hcCgocikgPT4gci5pZCkuam9pbignLCcpfWA7XG4gIGlmICghcmVnb0VuZ2luZUNhY2hlLmhhcyhrZXkpKSB7XG4gICAgY29uc3QgY3VzdG9tUnVsZXMgPSBbXG4gICAgICAuLi5CVU5ETEVEX0xJQlMubWFwKChsKSA9PiAoeyBuYW1lOiBsLm5hbWUsIGNvbnRlbnQ6IGwucmVnbyB9KSksXG4gICAgICAuLi5ydWxlcy5tYXAoKHIpID0+ICh7IG5hbWU6IHIuaWQsIGNvbnRlbnQ6IHIucmVnbyB9KSksXG4gICAgXTtcbiAgICBpZiAocmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN1c3RvbVJ1bGVzLnB1c2goZGVwbG95RW52aXJvbm1lbnRNb2R1bGUocmVnaW9uLCBhY2NvdW50KSk7XG4gICAgfVxuICAgIHJlZ29FbmdpbmVDYWNoZS5zZXQoa2V5LCBuZXcgZW5naW5lTW9kdWxlLlJlZ29FbmdpbmUoeyBjdXN0b21SdWxlcyB9KSk7XG4gIH1cbiAgcmV0dXJuIHJlZ29FbmdpbmVDYWNoZS5nZXQoa2V5KTtcbn1cblxuLyoqXG4gKiBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlIOOCkuino+axuuOBmeOCi+OAglxuICog6YCa5bi444GvIGF3cy1jZGstbGliIOOBjCBidW5kbGVkRGVwZW5kZW5jaWVzIOOBqOOBl+OBpuWQjOaiseOBl+OBpuOBhOOCi+OCs+ODlOODvOOBq+S5l+OCi+OAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbmdpbmUoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZSgnQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZScpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGxpYlBrZyA9IHJlcXVpcmUucmVzb2x2ZSgnYXdzLWNkay1saWIvcGFja2FnZS5qc29uJyk7XG4gICAgY29uc3QgZW5nUGtnID0gcmVxdWlyZS5yZXNvbHZlKCdAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbcGF0aC5kaXJuYW1lKGxpYlBrZyldLFxuICAgIH0pO1xuICAgIHJldHVybiByZXF1aXJlKHBhdGguZGlybmFtZShlbmdQa2cpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
480
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLDBEQU1DO0FBR0QsOENBRUM7QUFNRCw0Q0FFQztBQTZMRCxnREFpQkM7QUF1REQsd0NBaUJDO0FBYUQsc0NBUUM7QUFnREQsNENBVUM7QUFRRCxzREFtQkM7QUFZRCxzQkFRQztBQU9ELGdDQWVDO0FBN2RELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsNkNBTXFCO0FBRXJCLHdEQUF3RTtBQUV4RSwwREFBMEQ7QUFDMUQ7OERBQzhEO0FBRTlEOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsd0JBQXdCLENBQUM7QUFFL0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsTUFBYyxFQUFFLFNBQWtCO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdkcsT0FBTztRQUNMLElBQUksRUFBRSw4QkFBc0I7UUFDNUIsT0FBTyxFQUFFLCtEQUErRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sRUFBRTtLQUM3RyxDQUFDO0FBQ0osQ0FBQztBQUVELHlGQUF5RjtBQUN6RixTQUFnQixpQkFBaUIsQ0FBQyxTQUE2QjtJQUM3RCxPQUFPLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUEwQjtJQUN6RCxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSww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RyxDQUFDO1dBQzdCLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVU7SUFDeEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsZUFBZTtJQUNqQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsMkNBQTJDLEVBQUU7WUFDMUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5QixDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEFwcCxcbiAgdHlwZSBJUG9saWN5VmFsaWRhdGlvbkNvbnRleHQsXG4gIHR5cGUgSVBvbGljeVZhbGlkYXRpb25QbHVnaW4sXG4gIHR5cGUgUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCxcbiAgdHlwZSBQb2xpY3lWaW9sYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQlVORExFRF9MSUJTLCB0eXBlIEJ1bmRsZWRSdWxlRGF0YSB9IGZyb20gJy4uL3J1bGVzLmdlbmVyYXRlZCc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAtLSBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlIOOBr1xuICAgYXdzLWNkay1saWIg5ZCM5qKx44Kz44OU44O844KS5YuV55qE6Kej5rG644GZ44KL6Kit6KiI77yI5L6d5a2Y44Gr44Gv6LyJ44Gb44Gq44GE77yJ44CCUkVBRE1FL0FHRU5UUy5tZCDlj4LnhacgKi9cblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIFJlZ28gbW9kdWxlIHRoYXQgY2FycmllcyB0aGUgZGVwbG95bWVudFxuICogZW52aXJvbm1lbnQgaW50byBydWxlIGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBERVBMT1lfRU5WX01PRFVMRV9OQU1FID0gJ19wZl9kZXBsb3lfZW52aXJvbm1lbnQnO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBnZW5lcmF0ZWQgbW9kdWxlIGRlZmluaW5nIGBkZXBsb3lfcmVnaW9uYCBmb3IgdGhlIHJ1bGUgcGFja2FnZS5cbiAqXG4gKiBSdWxlcyBtdXN0IHJlYWQgaXQgYXMgYGRhdGEuY2RrX3ByZWZsaWdodC5kZXBsb3lfcmVnaW9uYCAobmV2ZXIgYXMgYSBiYXJlXG4gKiB2YXJpYWJsZSk6IHRoZSBkYXRhIHJlZmVyZW5jZSBpcyBzaW1wbHkgdW5kZWZpbmVkIHdoZW4gdGhlIG1vZHVsZSBpcyBub3RcbiAqIGluamVjdGVkIOKAlCB0aGUgcnVsZSBib2R5IGZhaWxzIGFuZCB0aGUgcnVsZSBza2lwcyDigJQgd2hpbGUgYSBiYXJlIHZhcmlhYmxlXG4gKiB3b3VsZCBiZSBhIGNvbXBpbGUgZXJyb3IuIEluamVjdGVkIGJ5IHRoZSBlbmZvcmNlIHBsdWdpbiB3aGVuIHRoZSBhcHAtbGV2ZWxcbiAqIHJlZ2lvbiBpcyBjb25jcmV0ZTsgdGhlIHdhcm4gbW9kZSAoQ0RLIGJ1aWx0LWluIHBsdWdpbikgbmV2ZXIgaW5qZWN0cyBpdCxcbiAqIHNvIHJlZ2lvbi1kZXBlbmRlbnQgcnVsZXMgb25seSBmaXJlIGluIGVuZm9yY2UgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcGxveUVudmlyb25tZW50TW9kdWxlKHJlZ2lvbjogc3RyaW5nLCBhY2NvdW50SWQ/OiBzdHJpbmcpOiB7IG5hbWU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0ge1xuICBjb25zdCBhY2NvdW50ID0gaXNDb25jcmV0ZUFjY291bnQoYWNjb3VudElkKSA/IGBkZXBsb3lfYWNjb3VudCA6PSAke0pTT04uc3RyaW5naWZ5KGFjY291bnRJZCl9XFxuYCA6ICcnO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IERFUExPWV9FTlZfTU9EVUxFX05BTUUsXG4gICAgY29udGVudDogYHBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuZGVwbG95X3JlZ2lvbiA6PSAke0pTT04uc3RyaW5naWZ5KHJlZ2lvbil9XFxuJHthY2NvdW50fWAsXG4gIH07XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBhY2NvdW50IGZyb20gdGhlIHZhbGlkYXRpb24gY29udGV4dCBpcyBhIGNvbmNyZXRlIDEyLWRpZ2l0IGFjY291bnQgaWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb25jcmV0ZUFjY291bnQoYWNjb3VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhY2NvdW50SWQgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBhY2NvdW50SWQgPT09ICdzdHJpbmcnICYmIC9eXFxkezEyfSQvLnRlc3QoYWNjb3VudElkKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpb24gZnJvbSB0aGUgdmFsaWRhdGlvbiBjb250ZXh0IGlzIGEgY29uY3JldGUgcmVnaW9uIG5hbWVcbiAqIChhcyBvcHBvc2VkIHRvIHVuZGVmaW5lZCwgYW4gdW5yZXNvbHZlZCB0b2tlbiwgb3IgYSBwbGFjZWhvbGRlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbmNyZXRlUmVnaW9uKHJlZ2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogcmVnaW9uIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgcmVnaW9uID09PSAnc3RyaW5nJyAmJiAvXlthLXpdezJ9KC1bYS16XSspKy1cXGQrJC8udGVzdChyZWdpb24pO1xufVxuXG5pbnRlcmZhY2UgRW5naW5lRGlhZ25vc3RpYyB7XG4gIHJlYWRvbmx5IHJ1bGVJZDogc3RyaW5nO1xuICByZWFkb25seSBzZXZlcml0eTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW50aXR5PzogeyByZWFkb25seSBsb2dpY2FsSWQ/OiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgcHJvcGVydHlQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIGVuZm9yY2Ug44Oi44O844OJ55So44Gu5YaF6YOo44OX44Op44Kw44Kk44Oz44CCXG4gKlxuICogQ0RLIOe1hOOBv+i+vOOBv+OBriBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBr+WFqCBmaW5kaW5nIOOCkiB3YXJuaW5nIOOBq+S4uOOCgeOCi+OBn+OCgVxuICog77yIYXdzLWNkay1saWIgMi4yNjcuMCDlrp/muKzjgIHmmIfmoLzjg5Xjg6njgrDjgoLnhKHlirnvvInjgIHlkIzjgZjjgqjjg7Pjgrjjg7PjgpLnm7TmjqXlkbzjgbPjgIFcbiAqIGNkay1wcmVmbGlnaHQg44Gu44Or44O844Or6YGV5Y+N77yI44GK44KI44GzIHN0cmljdCDmmYLjga/jgqjjg7Pjgrjjg7Pjga7jgqjjg6njg7zjgq/jg6njgrnvvInjgpJcbiAqIHBvbGljeSB2YWxpZGF0aW9uIOOBruWkseaVl+OBqOOBl+OBpuWgseWRiuOBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgIJcbiAqL1xuZXhwb3J0IGNsYXNzIFByZWZsaWdodEVuZm9yY2VQbHVnaW4gaW1wbGVtZW50cyBJUG9saWN5VmFsaWRhdGlvblBsdWdpbiB7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lID0gUExVR0lOX05BTUU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBydWxlczogQnVuZGxlZFJ1bGVEYXRhW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdHJpY3Q6IGJvb2xlYW4sXG4gICkge31cblxuICBwdWJsaWMgdmFsaWRhdGUoY29udGV4dDogSVBvbGljeVZhbGlkYXRpb25Db250ZXh0KTogUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCB7XG4gICAgY29uc3QgZW5naW5lID0gbG9hZEVuZ2luZUNhY2hlZCgpO1xuICAgIGlmICghZW5naW5lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ2Nkay1wcmVmbGlnaHQ6IGNvdWxkIG5vdCByZXNvbHZlIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGU7ICcgK1xuICAgICAgICAnZW5mb3JjZSBtb2RlIGlzIHVuYXZhaWxhYmxlIGFuZCBubyBwcmVmbGlnaHQgY2hlY2tzIHdlcmUgcnVuLiAnICtcbiAgICAgICAgJ0luc3RhbGwgaXQgYXMgYSBkZXZEZXBlbmRlbmN5IG9yIHVzZSB0aGUgZGVmYXVsdCAod2FybikgbW9kZS4nLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHZpb2xhdGlvbnM6IFtdIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaW9uID0gaXNDb25jcmV0ZVJlZ2lvbihjb250ZXh0LnJlZ2lvbikgPyBjb250ZXh0LnJlZ2lvbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhY2NvdW50ID0gaXNDb25jcmV0ZUFjY291bnQoY29udGV4dC5hY2NvdW50SWQpID8gY29udGV4dC5hY2NvdW50SWQgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3VycyA9IG5ldyBTZXQodGhpcy5ydWxlcy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBjb25zdCB2aW9sYXRpb25zOiBQb2xpY3lWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgLy8g5YWo44OG44Oz44OX44Os44O844OI44Gu5ZKM6ZuG5ZCI44Gn5YiI44KK6L6844KA44CC44OG44Oz44OX44Os44O844OI44GU44Go44Gr5YiI44KL44Go44Ko44Oz44K444Oz44KS5L2V5bqm44KCXG4gICAgLy8g5L2c44KK55u044GZ44GT44Go44Gr44Gq44KK44CB44Gd44Gh44KJ44Gu44Kz44K544OI44Gu5pa544GM6auY44GP44Gk44GP77yIcmVnb0VuZ2luZUNhY2hlZCDjga7jgrPjg6Hjg7Pjg4jlj4LnhafvvInjgIJcbiAgICBjb25zdCBydWxlcyA9IHBydW5lKHRoaXMucnVsZXMsIHRlbXBsYXRlUmVzb3VyY2VUeXBlcyhjb250ZXh0LnN0YWNrVGVtcGxhdGVzLm1hcCgoc3QpID0+IHN0LnRlbXBsYXRlUGF0aCkpKTtcblxuICAgIC8vIDEg5pys44KC5q6L44KJ44Gq44GEID0g44GT44Gu44Ki44OX44Oq44Gu44Oq44K944O844K544Gr6Zai5L+C44GZ44KL44Or44O844Or44GM54Sh44GE44CC44Ko44Oz44K444Oz44KS57WE44KA5b+F6KaB44KC54Sh44GEXG4gICAgLy8g77yIbGlicyDjgaDjgZHjgpLovInjgZvjgZ/jgqjjg7Pjgrjjg7Pjga8gdmlvbGF0aW9uIOODq+ODvOODq+OCkuaMgeOBn+OBmuOAgeipleS+oeaZguOBq+iQveOBoeOCi++8ieOAglxuICAgIC8vIHN0cmljdCDjga7jgajjgY3jga/ntYTjgb/ovrzjgb/jgqjjg7Pjgrjjg7Pjga4gZmluZGluZ3Mg44KS5ou+44GG5LuV5LqL44GM5q6L44KL44Gu44Gn6YCa5bi444Gp44GK44KK6YCy44KA44CCXG4gICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5zdHJpY3QpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHZpb2xhdGlvbnM6IFtdIH07XG4gICAgfVxuXG4gICAgbGV0IGVuZzogYW55O1xuICAgIHRyeSB7XG4gICAgICBlbmcgPSByZWdvRW5naW5lQ2FjaGVkKGVuZ2luZSwgcnVsZXMsIHJlZ2lvbiwgYWNjb3VudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8g44Or44O844Or44OR44OD44Kv44GM44Kz44Oz44OR44Kk44Or44Gn44GN44Gq44GEID0g44Gp44Gu44OG44Oz44OX44Os44O844OI44KC5qSc5p+744Gn44GN44Gq44GE44Gu44Gn44CBXG4gICAgICAvLyDlhajjgrnjgr/jg4Pjgq/jgbbjgpMgdmlvbGF0aW9uIOOCkueri+OBpuOCi++8iDEg5p6a44Ga44Gk44GuIGNhdGNoIOOBq+OBr+WIsOmBlOOBl+OBquOBhO+8ieOAglxuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHZpb2xhdGlvbnM6IGNvbnRleHQuc3RhY2tUZW1wbGF0ZXMubWFwKChzdCkgPT4gZW5naW5lRXJyb3JWaW9sYXRpb24oc3QsIGUpKSB9O1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3Qgb2YgY29udGV4dC5zdGFja1RlbXBsYXRlcykge1xuICAgICAgbGV0IHJlcG9ydDogYW55O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVwb3J0ID0gZW5nLnZhbGlkYXRlRGV0YWlsZWQobmV3IGVuZ2luZS5UZW1wbGF0ZUZpbGUoc3QudGVtcGxhdGVQYXRoKSwge1xuICAgICAgICAgIHBzZXVkb1BhcmFtZXRlck92ZXJyaWRlczoge1xuICAgICAgICAgICAgYWNjb3VudElkOiBjb250ZXh0LmFjY291bnRJZCxcbiAgICAgICAgICAgIHJlZ2lvbjogY29udGV4dC5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyDntYTjgb/ovrzjgb/jg6vjg7zjg6vjga8gQ0RLIOe1hOOBv+i+vOOBv+OBriBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBjOWQjOOBmOODhuODs+ODl+ODrOODvOODiOOBq1xuICAgICAgICAgIC8vIOWvvuOBl+OBpuaXouOBq+i1sOOCieOBm+OBpuOBhOOCi+OAgnN0cmljdCDjgafjgarjgZHjgozjgbDntZDmnpzjgoLkvb/jgo/jgZrmjajjgabjgabjgYTjgovjga7jgafjgIHkuLjjgZTjgajliIfjgotcbiAgICAgICAgICAvLyDvvIjlrp/muKwgNzAg44Oq44K944O844K5IDEg5p6a44Gn5Yid5ZueIDMuMjdzIC0+IDAuMjJz77yJ44CCc3RyaWN0IOOBruOBqOOBjeOBoOOBkeW/heimgeOBq+OBquOCi+OAglxuICAgICAgICAgIGRpc2FibGVCdWlsdGluUnVsZXM6ICF0aGlzLnN0cmljdCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHRocm93IOOCkuWkluOBq+WHuuOBmeOBqCBDREsg44Gv44GT44Gu5ZG844Gz5Ye644GX44KSIHBsdWdpbiBmYWlsdXJl77yIdmlvbGF0aW9uIOOCvOODre+8ieOBqOOBl+OBplxuICAgICAgICAvLyDoqJjpjLLjgZnjgovjgaDjgZHjgavjgarjgorjgIHjgZPjgZPjgb7jgafjgavpm4bjgoHjgZ/pgZXlj43jgoLlvozntprjg4bjg7Pjg5fjg6zjg7zjg4jjga7pgZXlj43jgoLkuLjjgZTjgajmtojjgYjjgIFcbiAgICAgICAgLy8g5q6L44KL44Gu44GvIGBmYWlsZWQ6IHVuZGVmaW5lZGAg44Gg44GR44Gr44Gq44KL77yIaXNzdWUgIzE1Me+8ieOAglxuICAgICAgICAvLyBzeW50aCDjgpLmraLjgoHjgovjga7jga8gaW5zdGFsbEVuZm9yY2VHYXRlIOOBruW9ueebruOAguOBk+OBk+OBr+OAjOOBqeOBruOCueOCv+ODg+OCr+OBp+S9leOBjFxuICAgICAgICAvLyDotbfjgY3jgZ/jgYvjgI3jgpLjg6zjg53jg7zjg4jjgavmrovjgZfjgIHku5bjgrnjgr/jg4Pjgq/jga7jg6vjg7zjg6vjgpLotbDjgonjgZvntprjgZHjgovjgZ/jgoHjga7jgoLjga7jgIJcbiAgICAgICAgdmlvbGF0aW9ucy5wdXNoKGVuZ2luZUVycm9yVmlvbGF0aW9uKHN0LCBlKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBkIG9mIChyZXBvcnQuZGlhZ25vc3RpY3MgPz8gW10pIGFzIEVuZ2luZURpYWdub3N0aWNbXSkge1xuICAgICAgICBjb25zdCBpc091cnMgPSBkLnNvdXJjZSA9PT0gJ0NVU1RPTScgJiYgb3Vycy5oYXMoZC5ydWxlSWQpO1xuICAgICAgICBjb25zdCBpc1N0cmljdEhpdCA9IHRoaXMuc3RyaWN0XG4gICAgICAgICAgJiYgZC5zb3VyY2UgIT09ICdDVVNUT00nXG4gICAgICAgICAgJiYgKGQuc2V2ZXJpdHkgPT09ICdFUlJPUicgfHwgZC5zZXZlcml0eSA9PT0gJ0ZBVEFMJyk7XG4gICAgICAgIGlmICghaXNPdXJzICYmICFpc1N0cmljdEhpdCkgY29udGludWU7XG4gICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgcnVsZU5hbWU6IGQucnVsZUlkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkLm1lc3NhZ2UsXG4gICAgICAgICAgc2V2ZXJpdHk6IG1hcFNldmVyaXR5KGQuc2V2ZXJpdHkpLFxuICAgICAgICAgIHZpb2xhdGluZ1Jlc291cmNlczogW3tcbiAgICAgICAgICAgIHJlc291cmNlTG9naWNhbElkOiBkLmVudGl0eT8ubG9naWNhbElkID8/ICcodW5rbm93biknLFxuICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBzdC50ZW1wbGF0ZVBhdGgsXG4gICAgICAgICAgICBsb2NhdGlvbnM6IFtkLnByb3BlcnR5UGF0aCA/PyAnKHRlbXBsYXRlKSddLFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIC4uLihkLmRvY3VtZW50YXRpb25VcmwgPyB7IHJ1bGVNZXRhZGF0YTogeyBEb2N1bWVudGF0aW9uVXJsOiBkLmRvY3VtZW50YXRpb25VcmwgfSB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDREsg57WE44G/6L6844G/44GuIENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4g44Go5ZCM44GY5Yik5a6a44CCd2FybmluZyDjgaDjgZHjgarjgolcbiAgICAvLyDjg6zjg53jg7zjg4jjgavjga/ovInjgovjgYzlkIjmiJDjga/pgJrjgovvvIhDTEkg5YG044GvIHN1Y2Nlc3MvZmFpbHVyZSDjgavplqLjgo/jgonjgZrlv4XjgZrlh7rlipvjgZnjgovvvInjgIJcbiAgICByZXR1cm4geyBzdWNjZXNzOiB2aW9sYXRpb25zLmV2ZXJ5KCh2KSA9PiAhQkxPQ0tTX1NZTlRILmhhcyhTdHJpbmcodi5zZXZlcml0eSkpKSwgdmlvbGF0aW9ucyB9O1xuICB9XG59XG5cbi8qKiDlkIjmiJDjgpLmraLjgoHjgosgdmlvbGF0aW9uIHNldmVyaXR544CCICovXG5jb25zdCBCTE9DS1NfU1lOVEggPSBuZXcgU2V0KFsnZXJyb3InLCAnZmF0YWwnXSk7XG5cbi8qKlxuICog44Ko44Oz44K444Oz44GuIHNldmVyaXR5IOOCkiBwb2xpY3kgdmFsaWRhdGlvbiDjga4gc2V2ZXJpdHkg44Gr5YaZ44GZ44CC6KGo44GvIGF3cy1jZGstbGliIDIuMjY3LjAg44GuXG4gKiBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBqOWQjOS4gOOAgmByZXByby5tZXRob2Q6IGRvYy1vbmx5YCDjga7jg6vjg7zjg6vjga8gV0FSTiDjgpLlh7rjgZnjga7jgadcbiAqIHdhcm5pbmcg44Gr44Gq44KK44CB5aCx5ZGK44Gv44GV44KM44KL44GMIHN5bnRoIOOBr+atouOCgeOBquOBhO+8iOiovOaLoOOBjOWun+apn+OBruODh+ODl+ODreOCpOWkseaVl+OBp+OBr+OBquOBhOOBn+OCge+8ieOAglxuICovXG5mdW5jdGlvbiBtYXBTZXZlcml0eShzZXZlcml0eTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgIGNhc2UgJ0ZBVEFMJzpcbiAgICBjYXNlICdFUlJPUic6XG4gICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICBjYXNlICdXQVJOJzpcbiAgICAgIHJldHVybiAnd2FybmluZyc7XG4gICAgY2FzZSAnSU5GTyc6XG4gICAgICByZXR1cm4gJ2luZm9ybWF0aW9uYWwnO1xuICAgIGNhc2UgJ0RFQlVHJzpcbiAgICAgIHJldHVybiAnZGVidWcnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ3dhcm5pbmcnO1xuICB9XG59XG5cbi8qKlxuICog44Or44O844Or6KmV5L6h44Gd44Gu44KC44Gu44GM5aSx5pWX44GX44Gf44GT44Go44KS6KGo44GZIHZpb2xhdGlvbiDjga4gcnVsZU5hbWXjgIJcbiAqIOODkOODs+ODieODq+a4iOOBv+ODq+ODvOODq+OBriBpZCDjgafjga/jgarjgYTjga7jgacgYGV4Y2x1ZGVgIOOBp+OBr+a2iOOBm+OBquOBhO+8iOa2iOOBl+OBpuOCiOOBhOeKtuaFi+OBp+OBr+OBquOBhO+8ieOAglxuICovXG5leHBvcnQgY29uc3QgRU5HSU5FX0VSUk9SX1JVTEUgPSAncGYtZW5naW5lLWVycm9yJztcblxuLyoqIOOCqOODs+OCuOODs+OBjOaKleOBkuOBn+WApOOCkuODoeODg+OCu+ODvOOCuOOBq+iQveOBqOOBmeOAguOCqOODs+OCuOODs+OBryBFcnJvciDjgafjga/jgarjgY/ntKDjga7mloflrZfliJfjgpLmipXjgZLjgovjgZPjgajjgYzjgYLjgovjgIIgKi9cbmZ1bmN0aW9uIGVuZ2luZUVycm9yVGV4dChlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IChlIGFzIHsgbWVzc2FnZT86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2U7XG4gIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZS5sZW5ndGggPiAwID8gbWVzc2FnZSA6IFN0cmluZyhlKTtcbn1cblxuLyoqIDEg5p6a44Gu44OG44Oz44OX44Os44O844OI44KS5qSc5p+744Gn44GN44Gq44GL44Gj44Gf44GT44Go44KSIHZpb2xhdGlvbiDjgajjgZfjgabloLHlkYrjgZnjgovjgIIgKi9cbmZ1bmN0aW9uIGVuZ2luZUVycm9yVmlvbGF0aW9uKHN0OiB7IHN0YWNrQ29uc3RydWN0UGF0aDogc3RyaW5nOyB0ZW1wbGF0ZVBhdGg6IHN0cmluZyB9LCBlOiB1bmtub3duKTogUG9saWN5VmlvbGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBydWxlTmFtZTogRU5HSU5FX0VSUk9SX1JVTEUsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnY2RrLXByZWZsaWdodCBjb3VsZCBub3QgZXZhbHVhdGUgaXRzIHJ1bGVzIGZvciB0aGlzIHRlbXBsYXRlLCBzbyBubyBwcmVmbGlnaHQgcnVsZSByYW4gZm9yIGl0OiAnXG4gICAgICArIGVuZ2luZUVycm9yVGV4dChlKSxcbiAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICBmaXg6ICdSZXBvcnQgdGhpcyBhdCBodHRwczovL2dpdGh1Yi5jb20vYmFkbWludG9uY3J5ZXIvY2RrLXByZWZsaWdodC9pc3N1ZXM7ICdcbiAgICAgICsgJ3RvIHVuYmxvY2sgdGhlIGJ1aWxkIG1lYW53aGlsZSwgdXNlIFByZWZsaWdodC5hcHBseShhcHAsIHsgZW5mb3JjZTogZmFsc2UgfSkuJyxcbiAgICB2aW9sYXRpbmdSZXNvdXJjZXM6IFt7XG4gICAgICBjb25zdHJ1Y3RQYXRoOiBzdC5zdGFja0NvbnN0cnVjdFBhdGgsXG4gICAgICB0ZW1wbGF0ZVBhdGg6IHN0LnRlbXBsYXRlUGF0aCxcbiAgICAgIGxvY2F0aW9uczogWycodGVtcGxhdGUpJ10sXG4gICAgfV0sXG4gIH07XG59XG5cbi8qKiBUaGUgcGx1Z2luIG5hbWUgcmVjb3JkZWQgaW4gYHZhbGlkYXRpb24tcmVwb3J0Lmpzb25gIGZvciBvdXIgZmluZGluZ3MuICovXG5leHBvcnQgY29uc3QgUExVR0lOX05BTUUgPSAnY2RrLXByZWZsaWdodCc7XG5cbi8qKiBUaGUgY2xvdWQgYXNzZW1ibHkgZmlsZSB0aGUgQ0RLIHdyaXRlcyBpdHMgdmFsaWRhdGlvbiByZXBvcnQgdG8uICovXG5jb25zdCBWQUxJREFUSU9OX1JFUE9SVF9GSUxFID0gJ3ZhbGlkYXRpb24tcmVwb3J0Lmpzb24nO1xuXG5jb25zdCBHQVRFX0lOU1RBTExFRCA9IFN5bWJvbC5mb3IoJ2Nkay1wcmVmbGlnaHQuZW5mb3JjZUdhdGUnKTtcblxuLyoqXG4gKiBlbmZvcmNlIOODouODvOODieOBruWPluOCiuOBk+OBvOOBl+OCkuWhnuOBkOOCsuODvOODiOOCkiBBcHAg44Gr5LuV6L6844KA44CCXG4gKlxuICogQ0RLIENMSSAyLjExMjguMSDku6XpmY3jga8gYXBwIOOBq+OAjOODrOODneODvOODiOOBryBDTEkg44GM5Yem55CG44GZ44KL44CN44Go5Lyd44GI44Gf44GG44GI44GnXG4gKiBgdmFsaWRhdGlvbi1yZXBvcnQuanNvbmAg44KS6Ieq5YiG44Gn6Kqt44KA44GM44CB44Gd44Gu57We44KK6L6844G/77yIdG9vbGtpdC1saWIg44GuXG4gKiBgZmlsdGVyUmVwb3J0c0J5U3RhY2tzYO+8ieOBjCB2aW9sYXRpb24g44GuIGNvbnN0cnVjdFBhdGgg5YWI6aCt44K744Kw44Oh44Oz44OI44KSXG4gKiDpgbjmip7jgrnjgr/jg4Pjgq/jga4gaGllcmFyY2hpY2FsSWQg44Go56qB44GN5ZCI44KP44Gb44KL44Gf44KB44CBYFN0YWdlL1N0YWNrYCDlvaLlvI/jgavjgarjgotcbiAqIFN0YWdlIOWGheOCueOCv+ODg+OCr+OBrumBleWPjeOBjOOBmeOBueOBpuaNqOOBpuOCieOCjOOAgXN5bnRoIOOBjOm7meOBo+OBpuaIkOWKn+OBmeOCi++8iGlzc3VlICMxMTPvvInjgIJcbiAqXG4gKiDjgZ3jgZPjgacgc3ludGgg5a6M5LqG5b6M44Gr44Os44Od44O844OI44KS6Kqt44G/55u044GX44CBY2RrLXByZWZsaWdodCDjga7pgZXlj43jgYzmrovjgaPjgabjgYTjgozjgbBcbiAqIOiHquWIhuOBp+WgseWRiuOBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgILjg6njgqTjg5bjg6njg6rjgYzoh6rlipvjgafloLHlkYrjgZnjgovntYzot6/vvIjntKDjga4gbm9kZSDlrp/ooYzjgIFcbiAqIGplc3TjgIFDTEkgMi4xMTI4LjEg5pyq5rqA77yJ44Gn44GvIHN5bnRoIOOBjOS+i+WkluOCkuaKleOBkuOCi+OBn+OCgeOBk+OBk+OBq+OBr+WIsOmBlOOBm+OBmuOAgVxuICog5LqM6YeN5aCx5ZGK44Gv6LW344GN44Gq44GE44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsRW5mb3JjZUdhdGUoc2NvcGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgY29uc3Qgcm9vdCA9IHNjb3BlLm5vZGUucm9vdDtcbiAgaWYgKCFBcHAuaXNBcHAocm9vdCkpIHJldHVybjtcbiAgY29uc3QgYXBwID0gcm9vdCBhcyBBcHAgJiB7IFtHQVRFX0lOU1RBTExFRF0/OiBib29sZWFuIH07XG4gIGlmIChhcHBbR0FURV9JTlNUQUxMRURdKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAsIEdBVEVfSU5TVEFMTEVELCB7IHZhbHVlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcblxuICBjb25zdCBzeW50aCA9IGFwcC5zeW50aC5iaW5kKGFwcCk7XG4gIGxldCBjaGVja2VkID0gZmFsc2U7XG4gIGFwcC5zeW50aCA9IChvcHRpb25zPzogUGFyYW1ldGVyczxBcHBbJ3N5bnRoJ10+WzBdKSA9PiB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBzeW50aChvcHRpb25zKTtcbiAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgIGNoZWNrZWQgPSB0cnVlO1xuICAgICAgZmFpbElmUmVwb3J0VW5oYW5kbGVkKGFzc2VtYmx5LmRpcmVjdG9yeSk7XG4gICAgfVxuICAgIHJldHVybiBhc3NlbWJseTtcbiAgfTtcbn1cblxuLyoqXG4gKiDjg6zjg53jg7zjg4jjgasgY2RrLXByZWZsaWdodCDjga7lpLHmlZfjgYzmrovjgaPjgabjgYTjgozjgbDjgIFmaW5kaW5ncyDjgpLlh7rlipvjgZfjgaYgc3ludGgg44KS5q2i44KB44KL44CCXG4gKlxuICog5Yik5a6a44GvIGNkay1wcmVmbGlnaHQg44Gu44Os44Od44O844OI44Gg44GR44KS6KaL44KL44CC57WE44G/6L6844G/44Ko44Oz44K444Oz44KEIGNvbnN0cnVjdCBhbm5vdGF0aW9uXG4gKiDjgaDjgZHjgYzlpLHmlZfjgZfjgabjgYTjgovloLTlkIjjga8gQ0xJIOOBjOato+OBl+OBj+aJseOBiOOCi+OBruOBp+OAgeOBk+OBoeOCieOBr+m7meOBo+OBpiBDTEkg44Gr5Lu744Gb44KL44CCXG4gKiDpgIbjgavnmbrngavjgZnjgovjgajjgY3jga/jg6zjg53jg7zjg4jlhajkvZPjgpLlh7rjgZnjgILjgZPjgZPjgacgc3ludGgg44KS5q2i44KB44KL44GoIENMSSDlgbTjga7lh7rlipvjgYxcbiAqIOS4gOWIh+i1sOOCieOBquOBhOOBn+OCgeOAgeWQjOaZguOBq+WHuuOBpuOBhOOBn+OBr+OBmuOBruS7luODl+ODqeOCsOOCpOODs+OBriBmaW5kaW5nIOOBjOa2iOOBiOOBpuOBl+OBvuOBhuOAglxuICovXG5mdW5jdGlvbiBmYWlsSWZSZXBvcnRVbmhhbmRsZWQoZGlyZWN0b3J5OiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IHBsdWdpblJlcG9ydHM6IGFueVtdO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9ydCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJlY3RvcnksIFZBTElEQVRJT05fUkVQT1JUX0ZJTEUpLCAndXRmOCcpKTtcbiAgICBwbHVnaW5SZXBvcnRzID0gcmVwb3J0Py5wbHVnaW5SZXBvcnRzID8/IFtdO1xuICB9IGNhdGNoIHtcbiAgICAvLyDjg6zjg53jg7zjg4jjgYznhKHjgYTvvIjjg5fjg6njgrDjgqTjg7PmnKrlrp/ooYzvvInjgb7jgZ/jga/lo4rjgozjgabjgYTjgovloLTlkIjjga/kvZXjgoLjgZfjgarjgYRcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZmFpbGVkID0gcGx1Z2luUmVwb3J0cy5zb21lKFxuICAgIChyKSA9PiByPy5wbHVnaW5OYW1lID09PSBQTFVHSU5fTkFNRSAmJiByPy5jb25jbHVzaW9uID09PSAnZmFpbHVyZScsXG4gICk7XG4gIGlmICghZmFpbGVkKSByZXR1cm47XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5lcnJvcihmb3JtYXRSZXBvcnRzKHBsdWdpblJlcG9ydHMpKTtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdjZGstcHJlZmxpZ2h0OiB2YWxpZGF0aW9uIGZhaWxlZC4gRml4IHRoZSBmaW5kaW5ncyBhYm92ZSwgJyArXG4gICAgXCJhY2tub3dsZWRnZSB0aGVtIHdpdGggVmFsaWRhdGlvbnMub2Yoc2NvcGUpLmFja25vd2xlZGdlKHsgaWQ6ICdjZGstcHJlZmxpZ2h0Ojo8cnVsZS1pZD4nIH0pLCBcIiArXG4gICAgJ29yIGV4Y2x1ZGUgdGhlIHJ1bGUgdmlhIFByZWZsaWdodC5hcHBseShhcHAsIHsgZXhjbHVkZTogWy4uLl0gfSkuJyxcbiAgKTtcbn1cblxuLyoqXG4gKiBDREsg5pys5L2T44Gu44OV44Kp44O844Oe44OD44K/44Gn5pW05b2i44GX44CBQ0xJIOOBqOWQjOS4gOOBruimi+OBn+ebruOBq+OBmeOCi+OAglxuICog56eB5pyJ44OR44K544Gq44Gu44Gn6Kej5rG644Gn44GN44Gq44GE44GT44Go44GM44GC44KK44CB44Gd44Gu5aC05ZCI44Gv5pyA5bCP6ZmQ44Gu6Ieq5YmN5pW05b2i44Gr6JC944Go44GZXG4gKiDvvIjopovjgZ/nm67jgojjgorjgIzokL3jgajjgZnjgI3jgZPjgajjgpLlhKrlhYjjgZnjgovvvInjgIJcbiAqL1xuZnVuY3Rpb24gZm9ybWF0UmVwb3J0cyhwbHVnaW5SZXBvcnRzOiBhbnlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGZvcm1hdHRlciA9IGxvYWRGb3JtYXR0ZXJDYWNoZWQoKTtcbiAgaWYgKGZvcm1hdHRlcikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdFZhbGlkYXRpb25SZXBvcnRzKHByb2Nlc3MuY3dkKCksIHBsdWdpblJlcG9ydHMpLmpvaW4oJ1xcblxcbicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxsYmFja0Zvcm1hdChwbHVnaW5SZXBvcnRzKTtcbn1cblxuLyoqXG4gKiBDREsg5pys5L2T44Gu44OV44Kp44O844Oe44OD44K/44KS6Kej5rG644Gn44GN44Gq44GE44Go44GN44Gu5pyA5bCP6ZmQ44Gu5pW05b2i44CCXG4gKiDopovjgZ/nm67jga/liqPjgovjgYzjgIFmaW5kaW5ncyDjgpLlv4XjgZroqq3jgoHjgovlvaLjgaflh7rjgZnjgZ/jgoHjga7mnIDlvozjga7noKbjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWxsYmFja0Zvcm1hdChwbHVnaW5SZXBvcnRzOiBhbnlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJsb2Nrczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZXBvcnQgb2YgcGx1Z2luUmVwb3J0cykge1xuICAgIGZvciAoY29uc3QgdmlvbGF0aW9uIG9mIHJlcG9ydD8udmlvbGF0aW9ucyA/PyBbXSkge1xuICAgICAgY29uc3QgYWNrSWQgPSBTdHJpbmcodmlvbGF0aW9uLnJ1bGVOYW1lKS5pbmNsdWRlcygnOjonKVxuICAgICAgICA/IHZpb2xhdGlvbi5ydWxlTmFtZVxuICAgICAgICA6IGAke3JlcG9ydC5wbHVnaW5OYW1lfTo6JHt2aW9sYXRpb24ucnVsZU5hbWV9YDtcbiAgICAgIGZvciAoY29uc3QgYyBvZiB2aW9sYXRpb24udmlvbGF0aW5nQ29uc3RydWN0cyA/PyBbXSkge1xuICAgICAgICBibG9ja3MucHVzaChcbiAgICAgICAgICBgJHtTdHJpbmcodmlvbGF0aW9uLnNldmVyaXR5ID8/ICdFUlJPUicpLnRvVXBwZXJDYXNlKCl9ICR7dmlvbGF0aW9uLmRlc2NyaXB0aW9ufSAoJHtyZXBvcnQucGx1Z2luTmFtZX0pXFxuYCArXG4gICAgICAgICAgYCAgICR7Yy5jb25zdHJ1Y3RQYXRofSAoJHtjLmNsb3VkRm9ybWF0aW9uUmVzb3VyY2U/LmxvZ2ljYWxJZH0pICR7Yy5jb25zdHJ1Y3RGcW59XFxuYCArXG4gICAgICAgICAgYCAgIEFja25vd2xlZGdlIHdpdGggJyR7U3RyaW5nKGFja0lkKS5yZXBsYWNlKC8gL2csICctJyl9J2AsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBibG9ja3Muam9pbignXFxuXFxuJyk7XG59XG5cbi8vIOODleOCqeODvOODnuODg+OCv+OBryBhd3MtY2RrLWxpYiDjga7np4HmnInjg5HjgrnjgavjgYLjgoogYGV4cG9ydHNgIOOBi+OCieimi+OBiOOBquOBhOOBn+OCgeOAgVxuLy8g44Ko44Oz44K444Oz6Kej5rG677yIbG9hZEVuZ2luZe+8ieOBqOWQjOOBmOOBj+ODkeODg+OCseODvOOCuOODq+ODvOODiOOBi+OCieOBrue1tuWvvuODkeOCueOBp+iqreOBv+i+vOOCgOOAglxubGV0IGNhY2hlZEZvcm1hdHRlcjogYW55IHwgZmFsc2UgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBsb2FkRm9ybWF0dGVyQ2FjaGVkKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjYWNoZWRGb3JtYXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhY2hlZEZvcm1hdHRlciA9IGxvYWRGb3JtYXR0ZXIoKSA/PyBmYWxzZTtcbiAgfVxuICByZXR1cm4gY2FjaGVkRm9ybWF0dGVyID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGNhY2hlZEZvcm1hdHRlcjtcbn1cblxuLyoqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZvcm1hdHRlcigpOiBhbnkgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IGxpYlJvb3QgPSBwYXRoLmRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKCdhd3MtY2RrLWxpYi9wYWNrYWdlLmpzb24nKSk7XG4gICAgY29uc3QgbW9kID0gcmVxdWlyZShwYXRoLmpvaW4obGliUm9vdCwgJ2NvcmUvbGliL3ZhbGlkYXRpb24vcHJpdmF0ZS9tb2Rlcm4tZm9ybWF0dGVyLmpzJykpO1xuICAgIHJldHVybiB0eXBlb2YgbW9kPy5mb3JtYXRWYWxpZGF0aW9uUmVwb3J0cyA9PT0gJ2Z1bmN0aW9uJyA/IG1vZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vLyDjgqjjg7Pjgrjjg7PvvIhXQVNN77yJ44Gu5Yid5pyf5YyW44Gv6YeN44GE44Gf44KB44CB44Oi44K444Ol44O844Or44Os44OZ44Or44Gn44Kt44Oj44OD44K344Ol44GZ44KLXG5sZXQgY2FjaGVkRW5naW5lTW9kdWxlOiBhbnkgfCBmYWxzZSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGxvYWRFbmdpbmVDYWNoZWQoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNhY2hlZEVuZ2luZU1vZHVsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkRW5naW5lTW9kdWxlID0gbG9hZEVuZ2luZSgpID8/IGZhbHNlO1xuICB9XG4gIHJldHVybiBjYWNoZWRFbmdpbmVNb2R1bGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogY2FjaGVkRW5naW5lTW9kdWxlO1xufVxuXG4vLyDjgqjjg7Pjgrjjg7PvvIhXQVNN77yJ44GvIDEg44OX44Ot44K744K544GrIDEg44Gk44Gg44GR55Sf44GL44GZ44CC5L2c44KK55u044GZ5YmN44GrIGZyZWUoKSDjgZfjgarjgYTjgajjgqTjg7Pjgrnjgr/jg7PjgrnjgYxcbi8vIOepjeOBv+S4iuOBjOOCiuOAgTIg5YCL55uu5Lul6ZmN44Gu5qeL56+J44GM6LaF57ea5b2i44Gr6YGF44GP44Gq44KL77yI5a6f5risOiBmcmVlIOeEoeOBl+OBpyAzLjhzIC0+IDExLjJzIC0+IDIyLjFz44CBXG4vLyDmp4vnr4nliY3jgasgZnJlZSDjgZnjgovjgaggMy41cyAtPiAwLjRz77yJ44CC44Or44O844Or44K744OD44OI44GM5aSJ44KP44KL77yIU3RhZ2Ug44GU44Go44GrIGV4Y2x1ZGUg44GM6YGV44GG44CBXG4vLyDjg4bjgrnjg4jjgafopIfmlbDjgqLjg5fjg6rjgpLlkIjmiJDjgZnjgovvvInjgZ/jgbPjgavkvZzjgornm7TjgZnjga7jgafjgIHjgq3jg6Pjg4Pjgrfjg6Xjga8gMSDjgrnjg63jg4Pjg4jjgafotrPjgorjgovjgIJcbmxldCBjYWNoZWRSZWdvRW5naW5lOiB7IGtleTogc3RyaW5nOyBlbmdpbmU6IGFueSB9IHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gcmVnb0VuZ2luZUNhY2hlZChlbmdpbmVNb2R1bGU6IGFueSwgcnVsZXM6IEJ1bmRsZWRSdWxlRGF0YVtdLCByZWdpb24/OiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBrZXkgPSBgJHtyZWdpb24gPz8gJyd9fCR7YWNjb3VudCA/PyAnJ318JHtydWxlcy5tYXAoKHIpID0+IHIuaWQpLmpvaW4oJywnKX1gO1xuICBpZiAoY2FjaGVkUmVnb0VuZ2luZT8ua2V5ICE9PSBrZXkpIHtcbiAgICBjYWNoZWRSZWdvRW5naW5lPy5lbmdpbmU/LmZyZWU/LigpO1xuICAgIGNhY2hlZFJlZ29FbmdpbmUgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3VzdG9tUnVsZXMgPSBbXG4gICAgICAuLi5CVU5ETEVEX0xJQlMubWFwKChsKSA9PiAoeyBuYW1lOiBsLm5hbWUsIGNvbnRlbnQ6IGwucmVnbyB9KSksXG4gICAgICAuLi5tZXJnZVJ1bGVNb2R1bGVzKHJ1bGVzKSxcbiAgICBdO1xuICAgIGlmIChyZWdpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY3VzdG9tUnVsZXMucHVzaChkZXBsb3lFbnZpcm9ubWVudE1vZHVsZShyZWdpb24sIGFjY291bnQpKTtcbiAgICB9XG4gICAgY2FjaGVkUmVnb0VuZ2luZSA9IHsga2V5LCBlbmdpbmU6IG5ldyBlbmdpbmVNb2R1bGUuUmVnb0VuZ2luZSh7IGN1c3RvbVJ1bGVzIH0pIH07XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFJlZ29FbmdpbmUuZW5naW5lO1xufVxuXG4vKiog5YWo44Or44O844Or44Gr5YWx6YCa44GuIHJlZ28g44OY44OD44OA44CCYnVuZGxlLXJ1bGVzIOOBjCBwYWNrYWdlIOWQjeOBqCBpbXBvcnQg44KSIDEg56iu6aGe44Gr5by35Yi244GX44Gm44GE44KL44CCICovXG5jb25zdCBSRUdPX0hFQURFUiA9ICdwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcbic7XG5cbi8qKlxuICog44Or44O844Or44KSIHNlcnZpY2Ug44GU44Go44GrIDEg44Oi44K444Ol44O844Or44G444G+44Go44KB44KL44CCXG4gKlxuICog44Kz44Oz44OR44Kk44Or5pmC6ZaT44Gv44Or44O844Or5pys5L2T44Gu6YeP44KI44KK44Oi44K444Ol44O844Or5pWw44Gn5Yq544GE44Gm44GP44KL77yI5a6f5risIDE4NDQg44Or44O844Or44KSXG4gKiAxIOODq+ODvOODqyAxIOODouOCuOODpeODvOODq+OBp+i8ieOBm+OCi+OBqOe0hCA2LjJz44CBc2VydmljZSDljZjkvY3jga4gMzkg44Oi44K444Ol44O844Or44Gr55Wz44KA44Go57SEIDEuMHPvvInjgIJcbiAqIOODq+ODvOODq+OBr+OCguOBqOOCguOBqOWFqOmDqCBgcGFja2FnZSBjZGtfcHJlZmxpZ2h0YCDjgarjga7jgafjgIFSZWdvIOOBi+OCieimi+OCjOOBsOe1kOWQiOOBl+OBpuOCglxuICog44GX44Gq44GP44Gm44KC5ZCM44GYIDEg44OR44OD44Kx44O844K44oCU4oCU44Oi44K444Ol44O844Or5aKD55WM44Gr5oSP5ZGz6KuW44Gv54Sh44GE44CC44GX44Gf44GM44Gj44Gm55Wz44KB44KL44Gu44Gg44GM44CBXG4gKiDoo4/jgpLov5TjgZvjgbDjgIzliKXjg6vjg7zjg6vjgYzlkIzjgZjlkI3liY3jga7jg5jjg6vjg5Hjg7zjgpLlrprnvqnjgZnjgovjgajpu5njgaPjgaYgMSDjgaTjga7opo/liYfjgavlkIjmtYHjgZnjgovjgI1cbiAqIOOBqOOBhOOBhuWNsemZuuOCgue1kOWQiOWJjeOBi+OCieWtmOWcqOOBmeOCi+OAgmJ1bmRsZS1ydWxlcyDjgYzjg6vjg7zjg6vplpPjga7jg4jjg4Pjg5fjg6zjg5njg6vlkI3ooZ3nqoHjgpJcbiAqIOW8vuOBhOOBpuOBhOOCi+OBruOBr+OBneOBruOBn+OCge+8iOWFseacieOBl+OBn+OBhOWumue+qeOBryBydWxlcy9fbGliLyDjgavnva7jgY/vvInjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJ1bGVNb2R1bGVzKHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSk6IHsgbmFtZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgYnlTZXJ2aWNlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBmb3IgKGNvbnN0IHIgb2YgcnVsZXMpIHtcbiAgICBjb25zdCBib2R5ID0gci5yZWdvLnJlcGxhY2UoL14oPzpwYWNrYWdlfGltcG9ydClcXHMuKlxcbi9nbSwgJycpO1xuICAgIGJ5U2VydmljZS5zZXQoci5zZXJ2aWNlLCBbLi4uYnlTZXJ2aWNlLmdldChyLnNlcnZpY2UpID8/IFtdLCBib2R5XSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5ieVNlcnZpY2VdLm1hcCgoW3NlcnZpY2UsIGJvZGllc10pID0+ICh7XG4gICAgbmFtZTogYF9wZl9zZXJ2aWNlXyR7c2VydmljZX1gLFxuICAgIGNvbnRlbnQ6IFJFR09fSEVBREVSICsgYm9kaWVzLmpvaW4oJ1xcbicpLFxuICB9KSk7XG59XG5cbi8qKlxuICog44OG44Oz44OX44Os44O844OI576k44Gr5Ye644Gm44GP44KL44Oq44K944O844K544K/44Kk44OX44CC5YiI44KK6L6844G/44Gr5L2/44GI44Gq44GE44OG44Oz44OX44Os44O844OI44GMIDEg5p6a44Gn44KC44GC44KM44GwXG4gKiB1bmRlZmluZWQg44KS6L+U44GX44CB5YiI44KK6L6844G/44Gd44Gu44KC44Gu44KS6Kum44KB44KL77yI5L2V44GM6LyJ44Gj44Gm44GE44KL44GL5YiG44GL44KJ44Gq44GE44G+44G+6JC944Go44GZ44Go44CBXG4gKiDjg6vjg7zjg6vjgYzpu5njgaPjgabnmbrngavjgZfjgarjgY/jgarjgosgPSBlbmZvcmNlIOOBq+OBqOOBo+OBpuacgOaCquOBruWjiuOCjOaWueOBq+OBquOCi+OBn+OCge+8ieOAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlUmVzb3VyY2VUeXBlcyh0ZW1wbGF0ZVBhdGhzOiBzdHJpbmdbXSk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB0ZW1wbGF0ZVBhdGggb2YgdGVtcGxhdGVQYXRocykge1xuICAgIGxldCB0ZW1wbGF0ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICB0ZW1wbGF0ZSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBUcmFuc2Zvcm3vvIhTQU0g562J77yJ44Gv44Oe44Kv44Ot5bGV6ZaL44Gn5Yil44Gu44Oq44K944O844K544Gr5YyW44GR44KL44Gu44Gn44CB55Sf44Gu44OG44Oz44OX44Os44O844OI44GL44KJXG4gICAgLy8g6Kqt44KB44KL44Oq44K944O844K544K/44Kk44OX44Gv5b2T44Gm44Gr44Gq44KJ44Gq44GE44CCXG4gICAgaWYgKHRlbXBsYXRlPy5UcmFuc2Zvcm0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIE9iamVjdC52YWx1ZXModGVtcGxhdGU/LlJlc291cmNlcyA/PyB7fSkgYXMgYW55W10pIHtcbiAgICAgIC8vIEZuOjpGb3JFYWNoIOOBquOBqeOBpyBUeXBlIOOBjOmdmeeahOOBq+iqreOCgeOBquOBhOOCqOODs+ODiOODquOBjOOBguOCjOOBsOirpuOCgeOCi+OAglxuICAgICAgaWYgKHR5cGVvZiByZXNvdXJjZT8uVHlwZSAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB0eXBlcy5hZGQocmVzb3VyY2UuVHlwZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0eXBlcztcbn1cblxuLyoqXG4gKiDjg4bjg7Pjg5fjg6zjg7zjg4jjgavlh7rjgabjgY/jgovjg6rjgr3jg7zjgrnjgr/jgqTjg5fjgavplqLkv4LjgZnjgovjg6vjg7zjg6vjgaDjgZHjgpLpgbjjgbbjgIJcbiAqXG4gKiDjgqjjg7Pjgrjjg7Pjga7jgrPjg7Pjg5HjgqTjg6vmmYLplpPjga/jg6vjg7zjg6vmlbDjgafjgbvjgbzmsbrjgb7jgovjga7jgafvvIjlrp/muKwgMTg0NCDjg6vjg7zjg6vjgafntIQgNC42c+OAgVxuICog5YW45Z6L55qE44Gq44Ki44OX44Oq44Gr5q6L44KLIDEwMCDjg6vjg7zjg6vliY3lvozjgarjgokgMC44cyDliY3lvozvvInjgIHjgZPjgozjgYzlm7rlrprosrvjga7kuLvjgarliYrjgorjganjgZPjgo3jgIJcbiAqIOWuieWFqOaAp+OBryBtZXRhLnJlc291cmNlVHlwZXMg44Gu5a6j6KiA44Gr5LmX44Gj44Gm44GE44KLOiDjg6vjg7zjg6vjgYzopovjgovjg6rjgr3jg7zjgrnjgr/jgqTjg5fjgYxcbiAqIOWuo+iogOOBi+OCiea8j+OCjOOBpuOBhOOCi+OBqOWIiOOCieOCjOOBpueZuueBq+OBl+OBquOBj+OBquOCi+OBn+OCgeOAgXRlc3QvcnVsZXMudGVzdC50cyDjgYzlhajjg6vjg7zjg6vjgavjgaTjgYTjgaZcbiAqIOOAjOiHquWIhuOBriBmYWlsIOODhuODs+ODl+ODrOODvOODiOOBp+WIiOOCiuaui+OCi+OBk+OBqOOAjeOCkuaknOafu+OBl+OBpuOBhOOCi+OAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBydW5lKHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSwgdHlwZXM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkKTogQnVuZGxlZFJ1bGVEYXRhW10ge1xuICBpZiAodHlwZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHJ1bGVzO1xuICAvLyDliIjjgovmoLnmi6DjgYznhKHjgYTjg6vjg7zjg6vjga/mrovjgZk6IFwiKlwi77yI5YWo44Oq44K944O844K55Z6L44Gr5Yq544GP44K/44Kw57O744Or44O844Or77yJ44Go44CBXG4gIC8vIHJlc291cmNlVHlwZXMg44GM56m644Gu44KC44Gu77yI44OQ44Oz44OJ44Or5riI44G/44Or44O844Or44Gv6Z2e56m644GM5L+d6Ki844GV44KM44Gm44GE44KL44Gu44Gn44CB6Kmy5b2T44GZ44KL44Gu44GvXG4gIC8vIOaJi+OBp+e1hOOBv+eri+OBpuOBn+ODq+ODvOODqyA9IOODhuOCueODiOOChOWwhuadpeOBruODhuODs+ODl+ODrOODvOODiOWxpOODq+ODvOODq+OBoOOBke+8ieOAglxuICByZXR1cm4gcnVsZXMuZmlsdGVyKChyKSA9PiByLnJlc291cmNlVHlwZXMubGVuZ3RoID09PSAwXG4gICAgfHwgci5yZXNvdXJjZVR5cGVzLmluY2x1ZGVzKCcqJylcbiAgICB8fCByLnJlc291cmNlVHlwZXMuc29tZSgodCkgPT4gdHlwZXMuaGFzKHQpKSk7XG59XG5cbi8qKlxuICogQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZSDjgpLop6PmsbrjgZnjgovjgIJcbiAqIOmAmuW4uOOBryBhd3MtY2RrLWxpYiDjgYwgYnVuZGxlZERlcGVuZGVuY2llcyDjgajjgZfjgablkIzmorHjgZfjgabjgYTjgovjgrPjg5Tjg7zjgavkuZfjgovjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW5naW5lKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ0Bhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBsaWJQa2cgPSByZXF1aXJlLnJlc29sdmUoJ2F3cy1jZGstbGliL3BhY2thZ2UuanNvbicpO1xuICAgIGNvbnN0IGVuZ1BrZyA9IHJlcXVpcmUucmVzb2x2ZSgnQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZS9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3BhdGguZGlybmFtZShsaWJQa2cpXSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVxdWlyZShwYXRoLmRpcm5hbWUoZW5nUGtnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==