cdk-preflight 0.0.84 → 0.0.86

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/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.84" };
20
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "0.0.86" };
21
21
  /**
22
22
  * Register the cdk-preflight rules on an App or Stage.
23
23
  */
@@ -42,6 +42,11 @@ export declare class PreflightEnforcePlugin implements IPolicyValidationPlugin {
42
42
  constructor(rules: BundledRuleData[], strict: boolean);
43
43
  validate(context: IPolicyValidationContext): PolicyValidationPluginReport;
44
44
  }
45
+ /**
46
+ * ルール評価そのものが失敗したことを表す violation の ruleName。
47
+ * バンドル済みルールの id ではないので `exclude` では消せない(消してよい状態ではない)。
48
+ */
49
+ export declare const ENGINE_ERROR_RULE = "pf-engine-error";
45
50
  /** The plugin name recorded in `validation-report.json` for our findings. */
46
51
  export declare const PLUGIN_NAME = "cdk-preflight";
47
52
  /**
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.PLUGIN_NAME = exports.PreflightEnforcePlugin = exports.DEPLOY_ENV_MODULE_NAME = void 0;
36
+ exports.PLUGIN_NAME = exports.ENGINE_ERROR_RULE = exports.PreflightEnforcePlugin = exports.DEPLOY_ENV_MODULE_NAME = void 0;
37
37
  exports.deployEnvironmentModule = deployEnvironmentModule;
38
38
  exports.isConcreteAccount = isConcreteAccount;
39
39
  exports.isConcreteRegion = isConcreteRegion;
@@ -108,16 +108,36 @@ class PreflightEnforcePlugin {
108
108
  }
109
109
  const region = isConcreteRegion(context.region) ? context.region : undefined;
110
110
  const account = isConcreteAccount(context.accountId) ? context.accountId : undefined;
111
- const eng = regoEngineCached(engine, this.rules, region, account);
112
111
  const ours = new Set(this.rules.map((r) => r.id));
113
112
  const violations = [];
113
+ let eng;
114
+ try {
115
+ eng = regoEngineCached(engine, this.rules, region, account);
116
+ }
117
+ catch (e) {
118
+ // ルールパックがコンパイルできない = どのテンプレートも検査できないので、
119
+ // 全スタックぶん violation を立てる(1 枚ずつの catch には到達しない)。
120
+ return { success: false, violations: context.stackTemplates.map((st) => engineErrorViolation(st, e)) };
121
+ }
114
122
  for (const st of context.stackTemplates) {
115
- const report = eng.validateDetailed(new engine.TemplateFile(st.templatePath), {
116
- pseudoParameterOverrides: {
117
- accountId: context.accountId,
118
- region: context.region,
119
- },
120
- });
123
+ let report;
124
+ try {
125
+ report = eng.validateDetailed(new engine.TemplateFile(st.templatePath), {
126
+ pseudoParameterOverrides: {
127
+ accountId: context.accountId,
128
+ region: context.region,
129
+ },
130
+ });
131
+ }
132
+ catch (e) {
133
+ // throw を外に出すと CDK はこの呼び出しを plugin failure(violation ゼロ)として
134
+ // 記録するだけになり、ここまでに集めた違反も後続テンプレートの違反も丸ごと消え、
135
+ // 残るのは `failed: undefined` だけになる(issue #151)。
136
+ // synth を止めるのは installEnforceGate の役目。ここは「どのスタックで何が
137
+ // 起きたか」をレポートに残し、他スタックのルールを走らせ続けるためのもの。
138
+ violations.push(engineErrorViolation(st, e));
139
+ continue;
140
+ }
121
141
  for (const d of (report.diagnostics ?? [])) {
122
142
  const isOurs = d.source === 'CUSTOM' && ours.has(d.ruleId);
123
143
  const isStrictHit = this.strict
@@ -128,7 +148,7 @@ class PreflightEnforcePlugin {
128
148
  violations.push({
129
149
  ruleName: d.ruleId,
130
150
  description: d.message,
131
- severity: 'error',
151
+ severity: mapSeverity(d.severity),
132
152
  violatingResources: [{
133
153
  resourceLogicalId: d.entity?.logicalId ?? '(unknown)',
134
154
  templatePath: st.templatePath,
@@ -138,10 +158,60 @@ class PreflightEnforcePlugin {
138
158
  });
139
159
  }
140
160
  }
141
- return { success: violations.length === 0, violations };
161
+ // CDK 組み込みの CloudFormationValidatePlugin と同じ判定。warning だけなら
162
+ // レポートには載るが合成は通る(CLI 側は success/failure に関わらず必ず出力する)。
163
+ return { success: violations.every((v) => !BLOCKS_SYNTH.has(String(v.severity))), violations };
142
164
  }
143
165
  }
144
166
  exports.PreflightEnforcePlugin = PreflightEnforcePlugin;
167
+ /** 合成を止める violation severity。 */
168
+ const BLOCKS_SYNTH = new Set(['error', 'fatal']);
169
+ /**
170
+ * エンジンの severity を policy validation の severity に写す。表は aws-cdk-lib 2.267.0 の
171
+ * CloudFormationValidatePlugin と同一。`repro.method: doc-only` のルールは WARN を出すので
172
+ * warning になり、報告はされるが synth は止めない(証拠が実機のデプロイ失敗ではないため)。
173
+ */
174
+ function mapSeverity(severity) {
175
+ switch (severity) {
176
+ case 'FATAL':
177
+ case 'ERROR':
178
+ return 'error';
179
+ case 'WARN':
180
+ return 'warning';
181
+ case 'INFO':
182
+ return 'informational';
183
+ case 'DEBUG':
184
+ return 'debug';
185
+ default:
186
+ return 'warning';
187
+ }
188
+ }
189
+ /**
190
+ * ルール評価そのものが失敗したことを表す violation の ruleName。
191
+ * バンドル済みルールの id ではないので `exclude` では消せない(消してよい状態ではない)。
192
+ */
193
+ exports.ENGINE_ERROR_RULE = 'pf-engine-error';
194
+ /** エンジンが投げた値をメッセージに落とす。エンジンは Error ではなく素の文字列を投げることがある。 */
195
+ function engineErrorText(e) {
196
+ const message = e?.message;
197
+ return typeof message === 'string' && message.length > 0 ? message : String(e);
198
+ }
199
+ /** 1 枚のテンプレートを検査できなかったことを violation として報告する。 */
200
+ function engineErrorViolation(st, e) {
201
+ return {
202
+ ruleName: exports.ENGINE_ERROR_RULE,
203
+ description: 'cdk-preflight could not evaluate its rules for this template, so no preflight rule ran for it: '
204
+ + engineErrorText(e),
205
+ severity: 'error',
206
+ fix: 'Report this at https://github.com/badmintoncryer/cdk-preflight/issues; '
207
+ + 'to unblock the build meanwhile, use Preflight.apply(app, { enforce: false }).',
208
+ violatingResources: [{
209
+ constructPath: st.stackConstructPath,
210
+ templatePath: st.templatePath,
211
+ locations: ['(template)'],
212
+ }],
213
+ };
214
+ }
145
215
  /** The plugin name recorded in `validation-report.json` for our findings. */
146
216
  exports.PLUGIN_NAME = 'cdk-preflight';
147
217
  /** The cloud assembly file the CDK writes its validation report to. */
@@ -311,4 +381,4 @@ function loadEngine() {
311
381
  return undefined;
312
382
  }
313
383
  }
314
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLDBEQU1DO0FBR0QsOENBRUM7QUFNRCw0Q0FFQztBQW1HRCxnREFpQkM7QUF1REQsd0NBaUJDO0FBYUQsc0NBUUM7QUFnQ0QsZ0NBZUM7QUFuVEQsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qiw2Q0FNcUI7QUFFckIsd0RBQXdFO0FBRXhFLDBEQUEwRDtBQUMxRDs4REFDOEQ7QUFFOUQ7OztHQUdHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztBQUUvRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsU0FBa0I7SUFDeEUsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2RyxPQUFPO1FBQ0wsSUFBSSxFQUFFLDhCQUFzQjtRQUM1QixPQUFPLEVBQUUsK0RBQStELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBTyxFQUFFO0tBQzdHLENBQUM7QUFDSixDQUFDO0FBRUQseUZBQXlGO0FBQ3pGLFNBQWdCLGlCQUFpQixDQUFDLFNBQTZCO0lBQzdELE9BQU8sT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLE1BQTBCO0lBQ3pELE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBWUQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsc0JBQXNCO0lBSWQ7SUFDQTtJQUpILElBQUksR0FBRyxtQkFBVyxDQUFDO0lBRW5DLFlBQ21CLEtBQXdCLEVBQ3hCLE1BQWU7UUFEZixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixXQUFNLEdBQU4sTUFBTSxDQUFTO0lBQy9CLENBQUM7SUFFRyxRQUFRLENBQUMsT0FBaUM7UUFDL0MsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FDWCxpRUFBaUU7Z0JBQ2pFLGdFQUFnRTtnQkFDaEUsK0RBQStELENBQ2hFLENBQUM7WUFDRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDM0MsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdFLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3JGLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxVQUFVLEdBQXNCLEVBQUUsQ0FBQztRQUV6QyxLQUFLLE1BQU0sRUFBRSxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDNUUsd0JBQXdCLEVBQUU7b0JBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2lCQUN2QjthQUNGLENBQUMsQ0FBQztZQUNILEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBdUIsRUFBRSxDQUFDO2dCQUNqRSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU07dUJBQzFCLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUTt1QkFDckIsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVztvQkFBRSxTQUFTO2dCQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDO29CQUNkLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTTtvQkFDbEIsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPO29CQUN0QixRQUFRLEVBQUUsT0FBTztvQkFDakIsa0JBQWtCLEVBQUUsQ0FBQzs0QkFDbkIsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLElBQUksV0FBVzs0QkFDckQsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZOzRCQUM3QixTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQzt5QkFDNUMsQ0FBQztvQkFDRixHQUFHLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDMUYsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzFELENBQUM7Q0FDRjtBQXZERCx3REF1REM7QUFFRCw2RUFBNkU7QUFDaEUsUUFBQSxXQUFXLEdBQUcsZUFBZSxDQUFDO0FBRTNDLHVFQUF1RTtBQUN2RSxNQUFNLHNCQUFzQixHQUFHLHdCQUF3QixDQUFDO0FBRXhELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUUvRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsS0FBaUI7SUFDbEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDN0IsSUFBSSxDQUFDLGlCQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU87SUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBNEMsQ0FBQztJQUN6RCxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFBRSxPQUFPO0lBQ2hDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFL0UsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFxQyxFQUFFLEVBQUU7UUFDcEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixxQkFBcUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxTQUFpQjtJQUM5QyxJQUFJLGFBQW9CLENBQUM7SUFDekIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRyxhQUFhLEdBQUcsTUFBTSxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLG9DQUFvQztRQUNwQyxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQy9CLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxLQUFLLG1CQUFXLElBQUksQ0FBQyxFQUFFLFVBQVUsS0FBSyxTQUFTLENBQ3BFLENBQUM7SUFDRixJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU87SUFFcEIsc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FDYiw0REFBNEQ7UUFDNUQsK0ZBQStGO1FBQy9GLG1FQUFtRSxDQUNwRSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxhQUFvQjtJQUN6QyxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3hDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUM7WUFDSCxPQUFPLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxlQUFlO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixjQUFjLENBQUMsYUFBb0I7SUFDakQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLEtBQUssTUFBTSxNQUFNLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbkMsS0FBSyxNQUFNLFNBQVMsSUFBSSxNQUFNLEVBQUUsVUFBVSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDckQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRO2dCQUNwQixDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLFNBQVMsQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLFVBQVUsS0FBSztvQkFDMUcsTUFBTSxDQUFDLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLEtBQUssQ0FBQyxDQUFDLFlBQVksSUFBSTtvQkFDcEYsd0JBQXdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQzVELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELG1EQUFtRDtBQUNuRCw4Q0FBOEM7QUFDOUMsSUFBSSxlQUF3QyxDQUFDO0FBQzdDLFNBQVMsbUJBQW1CO0lBQzFCLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLGVBQWUsR0FBRyxhQUFhLEVBQUUsSUFBSSxLQUFLLENBQUM7SUFDN0MsQ0FBQztJQUNELE9BQU8sZUFBZSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7QUFDakUsQ0FBQztBQUVELGlDQUFpQztBQUNqQyxTQUFnQixhQUFhO0lBQzNCLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7UUFDMUUsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlEQUFpRCxDQUFDLENBQUMsQ0FBQztRQUMzRixPQUFPLE9BQU8sR0FBRyxFQUFFLHVCQUF1QixLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDOUUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsdUNBQXVDO0FBQ3ZDLElBQUksa0JBQTJDLENBQUM7QUFDaEQsU0FBUyxnQkFBZ0I7SUFDdkIsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxrQkFBa0IsR0FBRyxVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUM7SUFDN0MsQ0FBQztJQUNELE9BQU8sa0JBQWtCLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0FBQy9DLFNBQVMsZ0JBQWdCLENBQUMsWUFBaUIsRUFBRSxLQUF3QixFQUFFLE1BQWUsRUFBRSxPQUFnQjtJQUN0RyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLElBQUksT0FBTyxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDbkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLFdBQVcsR0FBRztZQUNsQixHQUFHLDhCQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN2RCxDQUFDO1FBQ0YsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekIsV0FBVyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxPQUFPLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixVQUFVO0lBQ3hCLElBQUksQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGVBQWU7SUFDakIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLDJDQUEyQyxFQUFFO1lBQzFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDOUIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBBcHAsXG4gIHR5cGUgSVBvbGljeVZhbGlkYXRpb25Db250ZXh0LFxuICB0eXBlIElQb2xpY3lWYWxpZGF0aW9uUGx1Z2luLFxuICB0eXBlIFBvbGljeVZhbGlkYXRpb25QbHVnaW5SZXBvcnQsXG4gIHR5cGUgUG9saWN5VmlvbGF0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJVTkRMRURfTElCUywgdHlwZSBCdW5kbGVkUnVsZURhdGEgfSBmcm9tICcuLi9ydWxlcy5nZW5lcmF0ZWQnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgLS0gQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZSDjga9cbiAgIGF3cy1jZGstbGliIOWQjOaiseOCs+ODlOODvOOCkuWLleeahOino+axuuOBmeOCi+ioreioiO+8iOS+neWtmOOBq+OBr+i8ieOBm+OBquOBhO+8ieOAglJFQURNRS9BR0VOVFMubWQg5Y+C54WnICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBSZWdvIG1vZHVsZSB0aGF0IGNhcnJpZXMgdGhlIGRlcGxveW1lbnRcbiAqIGVudmlyb25tZW50IGludG8gcnVsZSBldmFsdWF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgREVQTE9ZX0VOVl9NT0RVTEVfTkFNRSA9ICdfcGZfZGVwbG95X2Vudmlyb25tZW50JztcblxuLyoqXG4gKiBCdWlsZCB0aGUgZ2VuZXJhdGVkIG1vZHVsZSBkZWZpbmluZyBgZGVwbG95X3JlZ2lvbmAgZm9yIHRoZSBydWxlIHBhY2thZ2UuXG4gKlxuICogUnVsZXMgbXVzdCByZWFkIGl0IGFzIGBkYXRhLmNka19wcmVmbGlnaHQuZGVwbG95X3JlZ2lvbmAgKG5ldmVyIGFzIGEgYmFyZVxuICogdmFyaWFibGUpOiB0aGUgZGF0YSByZWZlcmVuY2UgaXMgc2ltcGx5IHVuZGVmaW5lZCB3aGVuIHRoZSBtb2R1bGUgaXMgbm90XG4gKiBpbmplY3RlZCDigJQgdGhlIHJ1bGUgYm9keSBmYWlscyBhbmQgdGhlIHJ1bGUgc2tpcHMg4oCUIHdoaWxlIGEgYmFyZSB2YXJpYWJsZVxuICogd291bGQgYmUgYSBjb21waWxlIGVycm9yLiBJbmplY3RlZCBieSB0aGUgZW5mb3JjZSBwbHVnaW4gd2hlbiB0aGUgYXBwLWxldmVsXG4gKiByZWdpb24gaXMgY29uY3JldGU7IHRoZSB3YXJuIG1vZGUgKENESyBidWlsdC1pbiBwbHVnaW4pIG5ldmVyIGluamVjdHMgaXQsXG4gKiBzbyByZWdpb24tZGVwZW5kZW50IHJ1bGVzIG9ubHkgZmlyZSBpbiBlbmZvcmNlIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3lFbnZpcm9ubWVudE1vZHVsZShyZWdpb246IHN0cmluZywgYWNjb3VudElkPzogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9IHtcbiAgY29uc3QgYWNjb3VudCA9IGlzQ29uY3JldGVBY2NvdW50KGFjY291bnRJZCkgPyBgZGVwbG95X2FjY291bnQgOj0gJHtKU09OLnN0cmluZ2lmeShhY2NvdW50SWQpfVxcbmAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBERVBMT1lfRU5WX01PRFVMRV9OQU1FLFxuICAgIGNvbnRlbnQ6IGBwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbmRlcGxveV9yZWdpb24gOj0gJHtKU09OLnN0cmluZ2lmeShyZWdpb24pfVxcbiR7YWNjb3VudH1gLFxuICB9O1xufVxuXG4vKiogV2hldGhlciB0aGUgYWNjb3VudCBmcm9tIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgaXMgYSBjb25jcmV0ZSAxMi1kaWdpdCBhY2NvdW50IGlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uY3JldGVBY2NvdW50KGFjY291bnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYWNjb3VudElkIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYWNjb3VudElkID09PSAnc3RyaW5nJyAmJiAvXlxcZHsxMn0kLy50ZXN0KGFjY291bnRJZCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaW9uIGZyb20gdGhlIHZhbGlkYXRpb24gY29udGV4dCBpcyBhIGNvbmNyZXRlIHJlZ2lvbiBuYW1lXG4gKiAoYXMgb3Bwb3NlZCB0byB1bmRlZmluZWQsIGFuIHVucmVzb2x2ZWQgdG9rZW4sIG9yIGEgcGxhY2Vob2xkZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb25jcmV0ZVJlZ2lvbihyZWdpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHJlZ2lvbiBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHJlZ2lvbiA9PT0gJ3N0cmluZycgJiYgL15bYS16XXsyfSgtW2Etel0rKSstXFxkKyQvLnRlc3QocmVnaW9uKTtcbn1cblxuaW50ZXJmYWNlIEVuZ2luZURpYWdub3N0aWMge1xuICByZWFkb25seSBydWxlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IHN0cmluZztcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudGl0eT86IHsgcmVhZG9ubHkgbG9naWNhbElkPzogc3RyaW5nIH07XG4gIHJlYWRvbmx5IHByb3BlcnR5UGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgZG9jdW1lbnRhdGlvblVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBlbmZvcmNlIOODouODvOODieeUqOOBruWGhemDqOODl+ODqeOCsOOCpOODs+OAglxuICpcbiAqIENESyDntYTjgb/ovrzjgb/jga4gQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbiDjga/lhaggZmluZGluZyDjgpIgd2FybmluZyDjgavkuLjjgoHjgovjgZ/jgoFcbiAqIO+8iGF3cy1jZGstbGliIDIuMjY3LjAg5a6f5ris44CB5piH5qC844OV44Op44Kw44KC54Sh5Yq577yJ44CB5ZCM44GY44Ko44Oz44K444Oz44KS55u05o6l5ZG844Gz44CBXG4gKiBjZGstcHJlZmxpZ2h0IOOBruODq+ODvOODq+mBleWPje+8iOOBiuOCiOOBsyBzdHJpY3Qg5pmC44Gv44Ko44Oz44K444Oz44Gu44Ko44Op44O844Kv44Op44K577yJ44KSXG4gKiBwb2xpY3kgdmFsaWRhdGlvbiDjga7lpLHmlZfjgajjgZfjgabloLHlkYrjgZfjgaYgc3ludGgg44KS5q2i44KB44KL44CCXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmVmbGlnaHRFbmZvcmNlUGx1Z2luIGltcGxlbWVudHMgSVBvbGljeVZhbGlkYXRpb25QbHVnaW4ge1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZSA9IFBMVUdJTl9OQU1FO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVsZXM6IEJ1bmRsZWRSdWxlRGF0YVtdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaWN0OiBib29sZWFuLFxuICApIHt9XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRleHQ6IElQb2xpY3lWYWxpZGF0aW9uQ29udGV4dCk6IFBvbGljeVZhbGlkYXRpb25QbHVnaW5SZXBvcnQge1xuICAgIGNvbnN0IGVuZ2luZSA9IGxvYWRFbmdpbmVDYWNoZWQoKTtcbiAgICBpZiAoIWVuZ2luZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdjZGstcHJlZmxpZ2h0OiBjb3VsZCBub3QgcmVzb2x2ZSBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlOyAnICtcbiAgICAgICAgJ2VuZm9yY2UgbW9kZSBpcyB1bmF2YWlsYWJsZSBhbmQgbm8gcHJlZmxpZ2h0IGNoZWNrcyB3ZXJlIHJ1bi4gJyArXG4gICAgICAgICdJbnN0YWxsIGl0IGFzIGEgZGV2RGVwZW5kZW5jeSBvciB1c2UgdGhlIGRlZmF1bHQgKHdhcm4pIG1vZGUuJyxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB2aW9sYXRpb25zOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lvbiA9IGlzQ29uY3JldGVSZWdpb24oY29udGV4dC5yZWdpb24pID8gY29udGV4dC5yZWdpb24gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWNjb3VudCA9IGlzQ29uY3JldGVBY2NvdW50KGNvbnRleHQuYWNjb3VudElkKSA/IGNvbnRleHQuYWNjb3VudElkIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVuZyA9IHJlZ29FbmdpbmVDYWNoZWQoZW5naW5lLCB0aGlzLnJ1bGVzLCByZWdpb24sIGFjY291bnQpO1xuICAgIGNvbnN0IG91cnMgPSBuZXcgU2V0KHRoaXMucnVsZXMubWFwKChyKSA9PiByLmlkKSk7XG4gICAgY29uc3QgdmlvbGF0aW9uczogUG9saWN5VmlvbGF0aW9uW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc3Qgb2YgY29udGV4dC5zdGFja1RlbXBsYXRlcykge1xuICAgICAgY29uc3QgcmVwb3J0ID0gZW5nLnZhbGlkYXRlRGV0YWlsZWQobmV3IGVuZ2luZS5UZW1wbGF0ZUZpbGUoc3QudGVtcGxhdGVQYXRoKSwge1xuICAgICAgICBwc2V1ZG9QYXJhbWV0ZXJPdmVycmlkZXM6IHtcbiAgICAgICAgICBhY2NvdW50SWQ6IGNvbnRleHQuYWNjb3VudElkLFxuICAgICAgICAgIHJlZ2lvbjogY29udGV4dC5yZWdpb24sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgZCBvZiAocmVwb3J0LmRpYWdub3N0aWNzID8/IFtdKSBhcyBFbmdpbmVEaWFnbm9zdGljW10pIHtcbiAgICAgICAgY29uc3QgaXNPdXJzID0gZC5zb3VyY2UgPT09ICdDVVNUT00nICYmIG91cnMuaGFzKGQucnVsZUlkKTtcbiAgICAgICAgY29uc3QgaXNTdHJpY3RIaXQgPSB0aGlzLnN0cmljdFxuICAgICAgICAgICYmIGQuc291cmNlICE9PSAnQ1VTVE9NJ1xuICAgICAgICAgICYmIChkLnNldmVyaXR5ID09PSAnRVJST1InIHx8IGQuc2V2ZXJpdHkgPT09ICdGQVRBTCcpO1xuICAgICAgICBpZiAoIWlzT3VycyAmJiAhaXNTdHJpY3RIaXQpIGNvbnRpbnVlO1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgIHJ1bGVOYW1lOiBkLnJ1bGVJZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZC5tZXNzYWdlLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIHZpb2xhdGluZ1Jlc291cmNlczogW3tcbiAgICAgICAgICAgIHJlc291cmNlTG9naWNhbElkOiBkLmVudGl0eT8ubG9naWNhbElkID8/ICcodW5rbm93biknLFxuICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBzdC50ZW1wbGF0ZVBhdGgsXG4gICAgICAgICAgICBsb2NhdGlvbnM6IFtkLnByb3BlcnR5UGF0aCA/PyAnKHRlbXBsYXRlKSddLFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIC4uLihkLmRvY3VtZW50YXRpb25VcmwgPyB7IHJ1bGVNZXRhZGF0YTogeyBEb2N1bWVudGF0aW9uVXJsOiBkLmRvY3VtZW50YXRpb25VcmwgfSB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzdWNjZXNzOiB2aW9sYXRpb25zLmxlbmd0aCA9PT0gMCwgdmlvbGF0aW9ucyB9O1xuICB9XG59XG5cbi8qKiBUaGUgcGx1Z2luIG5hbWUgcmVjb3JkZWQgaW4gYHZhbGlkYXRpb24tcmVwb3J0Lmpzb25gIGZvciBvdXIgZmluZGluZ3MuICovXG5leHBvcnQgY29uc3QgUExVR0lOX05BTUUgPSAnY2RrLXByZWZsaWdodCc7XG5cbi8qKiBUaGUgY2xvdWQgYXNzZW1ibHkgZmlsZSB0aGUgQ0RLIHdyaXRlcyBpdHMgdmFsaWRhdGlvbiByZXBvcnQgdG8uICovXG5jb25zdCBWQUxJREFUSU9OX1JFUE9SVF9GSUxFID0gJ3ZhbGlkYXRpb24tcmVwb3J0Lmpzb24nO1xuXG5jb25zdCBHQVRFX0lOU1RBTExFRCA9IFN5bWJvbC5mb3IoJ2Nkay1wcmVmbGlnaHQuZW5mb3JjZUdhdGUnKTtcblxuLyoqXG4gKiBlbmZvcmNlIOODouODvOODieOBruWPluOCiuOBk+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/IGZhbHNlO1xuICB9XG4gIHJldHVybiBjYWNoZWRFbmdpbmVNb2R1bGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogY2FjaGVkRW5naW5lTW9kdWxlO1xufVxuXG5jb25zdCByZWdvRW5naW5lQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuZnVuY3Rpb24gcmVnb0VuZ2luZUNhY2hlZChlbmdpbmVNb2R1bGU6IGFueSwgcnVsZXM6IEJ1bmRsZWRSdWxlRGF0YVtdLCByZWdpb24/OiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBrZXkgPSBgJHtyZWdpb24gPz8gJyd9fCR7YWNjb3VudCA/PyAnJ318JHtydWxlcy5tYXAoKHIpID0+IHIuaWQpLmpvaW4oJywnKX1gO1xuICBpZiAoIXJlZ29FbmdpbmVDYWNoZS5oYXMoa2V5KSkge1xuICAgIGNvbnN0IGN1c3RvbVJ1bGVzID0gW1xuICAgICAgLi4uQlVORExFRF9MSUJTLm1hcCgobCkgPT4gKHsgbmFtZTogbC5uYW1lLCBjb250ZW50OiBsLnJlZ28gfSkpLFxuICAgICAgLi4ucnVsZXMubWFwKChyKSA9PiAoeyBuYW1lOiByLmlkLCBjb250ZW50OiByLnJlZ28gfSkpLFxuICAgIF07XG4gICAgaWYgKHJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdXN0b21SdWxlcy5wdXNoKGRlcGxveUVudmlyb25tZW50TW9kdWxlKHJlZ2lvbiwgYWNjb3VudCkpO1xuICAgIH1cbiAgICByZWdvRW5naW5lQ2FjaGUuc2V0KGtleSwgbmV3IGVuZ2luZU1vZHVsZS5SZWdvRW5naW5lKHsgY3VzdG9tUnVsZXMgfSkpO1xuICB9XG4gIHJldHVybiByZWdvRW5naW5lQ2FjaGUuZ2V0KGtleSk7XG59XG5cbi8qKlxuICogQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZSDjgpLop6PmsbrjgZnjgovjgIJcbiAqIOmAmuW4uOOBryBhd3MtY2RrLWxpYiDjgYwgYnVuZGxlZERlcGVuZGVuY2llcyDjgajjgZfjgablkIzmorHjgZfjgabjgYTjgovjgrPjg5Tjg7zjgavkuZfjgovjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW5naW5lKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ0Bhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBsaWJQa2cgPSByZXF1aXJlLnJlc29sdmUoJ2F3cy1jZGstbGliL3BhY2thZ2UuanNvbicpO1xuICAgIGNvbnN0IGVuZ1BrZyA9IHJlcXVpcmUucmVzb2x2ZSgnQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZS9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3BhdGguZGlybmFtZShsaWJQa2cpXSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVxdWlyZShwYXRoLmRpcm5hbWUoZW5nUGtnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLDBEQU1DO0FBR0QsOENBRUM7QUFNRCw0Q0FFQztBQThLRCxnREFpQkM7QUF1REQsd0NBaUJDO0FBYUQsc0NBUUM7QUFnQ0QsZ0NBZUM7QUE5WEQsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qiw2Q0FNcUI7QUFFckIsd0RBQXdFO0FBRXhFLDBEQUEwRDtBQUMxRDs4REFDOEQ7QUFFOUQ7OztHQUdHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztBQUUvRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsU0FBa0I7SUFDeEUsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2RyxPQUFPO1FBQ0wsSUFBSSxFQUFFLDhCQUFzQjtRQUM1QixPQUFPLEVBQUUsK0RBQStELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBTyxFQUFFO0tBQzdHLENBQUM7QUFDSixDQUFDO0FBRUQseUZBQXlGO0FBQ3pGLFNBQWdCLGlCQUFpQixDQUFDLFNBQTZCO0lBQzdELE9BQU8sT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLE1BQTBCO0lBQ3pELE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FB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MEIsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsMkNBQTJDLEVBQUU7WUFDMUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5QixDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEFwcCxcbiAgdHlwZSBJUG9saWN5VmFsaWRhdGlvbkNvbnRleHQsXG4gIHR5cGUgSVBvbGljeVZhbGlkYXRpb25QbHVnaW4sXG4gIHR5cGUgUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCxcbiAgdHlwZSBQb2xpY3lWaW9sYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQlVORExFRF9MSUJTLCB0eXBlIEJ1bmRsZWRSdWxlRGF0YSB9IGZyb20gJy4uL3J1bGVzLmdlbmVyYXRlZCc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAtLSBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlIOOBr1xuICAgYXdzLWNkay1saWIg5ZCM5qKx44Kz44OU44O844KS5YuV55qE6Kej5rG644GZ44KL6Kit6KiI77yI5L6d5a2Y44Gr44Gv6LyJ44Gb44Gq44GE77yJ44CCUkVBRE1FL0FHRU5UUy5tZCDlj4LnhacgKi9cblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIFJlZ28gbW9kdWxlIHRoYXQgY2FycmllcyB0aGUgZGVwbG95bWVudFxuICogZW52aXJvbm1lbnQgaW50byBydWxlIGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBERVBMT1lfRU5WX01PRFVMRV9OQU1FID0gJ19wZl9kZXBsb3lfZW52aXJvbm1lbnQnO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBnZW5lcmF0ZWQgbW9kdWxlIGRlZmluaW5nIGBkZXBsb3lfcmVnaW9uYCBmb3IgdGhlIHJ1bGUgcGFja2FnZS5cbiAqXG4gKiBSdWxlcyBtdXN0IHJlYWQgaXQgYXMgYGRhdGEuY2RrX3ByZWZsaWdodC5kZXBsb3lfcmVnaW9uYCAobmV2ZXIgYXMgYSBiYXJlXG4gKiB2YXJpYWJsZSk6IHRoZSBkYXRhIHJlZmVyZW5jZSBpcyBzaW1wbHkgdW5kZWZpbmVkIHdoZW4gdGhlIG1vZHVsZSBpcyBub3RcbiAqIGluamVjdGVkIOKAlCB0aGUgcnVsZSBib2R5IGZhaWxzIGFuZCB0aGUgcnVsZSBza2lwcyDigJQgd2hpbGUgYSBiYXJlIHZhcmlhYmxlXG4gKiB3b3VsZCBiZSBhIGNvbXBpbGUgZXJyb3IuIEluamVjdGVkIGJ5IHRoZSBlbmZvcmNlIHBsdWdpbiB3aGVuIHRoZSBhcHAtbGV2ZWxcbiAqIHJlZ2lvbiBpcyBjb25jcmV0ZTsgdGhlIHdhcm4gbW9kZSAoQ0RLIGJ1aWx0LWluIHBsdWdpbikgbmV2ZXIgaW5qZWN0cyBpdCxcbiAqIHNvIHJlZ2lvbi1kZXBlbmRlbnQgcnVsZXMgb25seSBmaXJlIGluIGVuZm9yY2UgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcGxveUVudmlyb25tZW50TW9kdWxlKHJlZ2lvbjogc3RyaW5nLCBhY2NvdW50SWQ/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