/ components / TrustDialog / TrustDialog.tsx
TrustDialog.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import { homedir } from 'os';
  3  import React from 'react';
  4  import { logEvent } from 'src/services/analytics/index.js';
  5  import { setSessionTrustAccepted } from '../../bootstrap/state.js';
  6  import type { Command } from '../../commands.js';
  7  import { useExitOnCtrlCDWithKeybindings } from '../../hooks/useExitOnCtrlCDWithKeybindings.js';
  8  import { Box, Link, Text } from '../../ink.js';
  9  import { useKeybinding } from '../../keybindings/useKeybinding.js';
 10  import { getMcpConfigsByScope } from '../../services/mcp/config.js';
 11  import { BASH_TOOL_NAME } from '../../tools/BashTool/toolName.js';
 12  import { checkHasTrustDialogAccepted, saveCurrentProjectConfig } from '../../utils/config.js';
 13  import { getCwd } from '../../utils/cwd.js';
 14  import { getFsImplementation } from '../../utils/fsOperations.js';
 15  import { gracefulShutdownSync } from '../../utils/gracefulShutdown.js';
 16  import { Select } from '../CustomSelect/index.js';
 17  import { PermissionDialog } from '../permissions/PermissionDialog.js';
 18  import { getApiKeyHelperSources, getAwsCommandsSources, getBashPermissionSources, getDangerousEnvVarsSources, getGcpCommandsSources, getHooksSources, getOtelHeadersHelperSources } from './utils.js';
 19  type Props = {
 20    onDone(): void;
 21    commands?: Command[];
 22  };
 23  export function TrustDialog(t0) {
 24    const $ = _c(33);
 25    const {
 26      onDone,
 27      commands
 28    } = t0;
 29    let t1;
 30    if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
 31      t1 = getMcpConfigsByScope("project");
 32      $[0] = t1;
 33    } else {
 34      t1 = $[0];
 35    }
 36    const {
 37      servers: projectServers
 38    } = t1;
 39    let t2;
 40    if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
 41      t2 = Object.keys(projectServers);
 42      $[1] = t2;
 43    } else {
 44      t2 = $[1];
 45    }
 46    const hasMcpServers = t2.length > 0;
 47    let t3;
 48    if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
 49      t3 = getHooksSources();
 50      $[2] = t3;
 51    } else {
 52      t3 = $[2];
 53    }
 54    const hooksSettingSources = t3;
 55    const hasHooks = hooksSettingSources.length > 0;
 56    let t4;
 57    if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
 58      t4 = getBashPermissionSources();
 59      $[3] = t4;
 60    } else {
 61      t4 = $[3];
 62    }
 63    const bashSettingSources = t4;
 64    let t5;
 65    if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
 66      t5 = getApiKeyHelperSources();
 67      $[4] = t5;
 68    } else {
 69      t5 = $[4];
 70    }
 71    const apiKeyHelperSources = t5;
 72    const hasApiKeyHelper = apiKeyHelperSources.length > 0;
 73    let t6;
 74    if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
 75      t6 = getAwsCommandsSources();
 76      $[5] = t6;
 77    } else {
 78      t6 = $[5];
 79    }
 80    const awsCommandsSources = t6;
 81    const hasAwsCommands = awsCommandsSources.length > 0;
 82    let t7;
 83    if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
 84      t7 = getGcpCommandsSources();
 85      $[6] = t7;
 86    } else {
 87      t7 = $[6];
 88    }
 89    const gcpCommandsSources = t7;
 90    const hasGcpCommands = gcpCommandsSources.length > 0;
 91    let t8;
 92    if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
 93      t8 = getOtelHeadersHelperSources();
 94      $[7] = t8;
 95    } else {
 96      t8 = $[7];
 97    }
 98    const otelHeadersHelperSources = t8;
 99    const hasOtelHeadersHelper = otelHeadersHelperSources.length > 0;
100    let t9;
101    if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
102      t9 = getDangerousEnvVarsSources();
103      $[8] = t9;
104    } else {
105      t9 = $[8];
106    }
107    const dangerousEnvVarsSources = t9;
108    const hasDangerousEnvVars = dangerousEnvVarsSources.length > 0;
109    let t10;
110    if ($[9] !== commands) {
111      t10 = commands?.some(_temp2) ?? false;
112      $[9] = commands;
113      $[10] = t10;
114    } else {
115      t10 = $[10];
116    }
117    const hasSlashCommandBash = t10;
118    let t11;
119    if ($[11] !== commands) {
120      t11 = commands?.some(_temp4) ?? false;
121      $[11] = commands;
122      $[12] = t11;
123    } else {
124      t11 = $[12];
125    }
126    const hasSkillsBash = t11;
127    const hasAnyBashExecution = bashSettingSources.length > 0 || hasSlashCommandBash || hasSkillsBash;
128    const hasTrustDialogAccepted = checkHasTrustDialogAccepted();
129    let t12;
130    let t13;
131    if ($[13] !== hasAnyBashExecution) {
132      t12 = () => {
133        const isHomeDir = homedir() === getCwd();
134        logEvent("tengu_trust_dialog_shown", {
135          isHomeDir,
136          hasMcpServers,
137          hasHooks,
138          hasBashExecution: hasAnyBashExecution,
139          hasApiKeyHelper,
140          hasAwsCommands,
141          hasGcpCommands,
142          hasOtelHeadersHelper,
143          hasDangerousEnvVars
144        });
145      };
146      t13 = [hasMcpServers, hasHooks, hasAnyBashExecution, hasApiKeyHelper, hasAwsCommands, hasGcpCommands, hasOtelHeadersHelper, hasDangerousEnvVars];
147      $[13] = hasAnyBashExecution;
148      $[14] = t12;
149      $[15] = t13;
150    } else {
151      t12 = $[14];
152      t13 = $[15];
153    }
154    React.useEffect(t12, t13);
155    let t14;
156    if ($[16] !== hasAnyBashExecution || $[17] !== onDone) {
157      t14 = function onChange(value) {
158        if (value === "exit") {
159          gracefulShutdownSync(1);
160          return;
161        }
162        const isHomeDir_0 = homedir() === getCwd();
163        logEvent("tengu_trust_dialog_accept", {
164          isHomeDir: isHomeDir_0,
165          hasMcpServers,
166          hasHooks,
167          hasBashExecution: hasAnyBashExecution,
168          hasApiKeyHelper,
169          hasAwsCommands,
170          hasGcpCommands,
171          hasOtelHeadersHelper,
172          hasDangerousEnvVars
173        });
174        if (isHomeDir_0) {
175          setSessionTrustAccepted(true);
176        } else {
177          saveCurrentProjectConfig(_temp5);
178        }
179        onDone();
180      };
181      $[16] = hasAnyBashExecution;
182      $[17] = onDone;
183      $[18] = t14;
184    } else {
185      t14 = $[18];
186    }
187    const onChange = t14;
188    const exitState = useExitOnCtrlCDWithKeybindings(_temp6);
189    let t15;
190    if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
191      t15 = {
192        context: "Confirmation"
193      };
194      $[19] = t15;
195    } else {
196      t15 = $[19];
197    }
198    useKeybinding("confirm:no", _temp7, t15);
199    if (hasTrustDialogAccepted) {
200      setTimeout(onDone);
201      return null;
202    }
203    let t16;
204    let t17;
205    let t18;
206    if ($[20] === Symbol.for("react.memo_cache_sentinel")) {
207      t16 = <Text bold={true}>{getFsImplementation().cwd()}</Text>;
208      t17 = <Text>Quick safety check: Is this a project you created or one you trust? (Like your own code, a well-known open source project, or work from your team). If not, take a moment to review what{"'"}s in this folder first.</Text>;
209      t18 = <Text>Claude Code{"'"}ll be able to read, edit, and execute files here.</Text>;
210      $[20] = t16;
211      $[21] = t17;
212      $[22] = t18;
213    } else {
214      t16 = $[20];
215      t17 = $[21];
216      t18 = $[22];
217    }
218    let t19;
219    if ($[23] === Symbol.for("react.memo_cache_sentinel")) {
220      t19 = <Text dimColor={true}><Link url="https://code.claude.com/docs/en/security">Security guide</Link></Text>;
221      $[23] = t19;
222    } else {
223      t19 = $[23];
224    }
225    let t20;
226    if ($[24] === Symbol.for("react.memo_cache_sentinel")) {
227      t20 = [{
228        label: "Yes, I trust this folder",
229        value: "enable_all"
230      }, {
231        label: "No, exit",
232        value: "exit"
233      }];
234      $[24] = t20;
235    } else {
236      t20 = $[24];
237    }
238    let t21;
239    if ($[25] !== onChange) {
240      t21 = <Select options={t20} onChange={value_0 => onChange(value_0 as 'enable_all' | 'exit')} onCancel={() => onChange("exit")} />;
241      $[25] = onChange;
242      $[26] = t21;
243    } else {
244      t21 = $[26];
245    }
246    let t22;
247    if ($[27] !== exitState.keyName || $[28] !== exitState.pending) {
248      t22 = <Text dimColor={true}>{exitState.pending ? <>Press {exitState.keyName} again to exit</> : <>Enter to confirm ยท Esc to cancel</>}</Text>;
249      $[27] = exitState.keyName;
250      $[28] = exitState.pending;
251      $[29] = t22;
252    } else {
253      t22 = $[29];
254    }
255    let t23;
256    if ($[30] !== t21 || $[31] !== t22) {
257      t23 = <PermissionDialog color="warning" titleColor="warning" title="Accessing workspace:"><Box flexDirection="column" gap={1} paddingTop={1}>{t16}{t17}{t18}{t19}{t21}{t22}</Box></PermissionDialog>;
258      $[30] = t21;
259      $[31] = t22;
260      $[32] = t23;
261    } else {
262      t23 = $[32];
263    }
264    return t23;
265  }
266  function _temp7() {
267    gracefulShutdownSync(0);
268  }
269  function _temp6() {
270    return gracefulShutdownSync(1);
271  }
272  function _temp5(current) {
273    return {
274      ...current,
275      hasTrustDialogAccepted: true
276    };
277  }
278  function _temp4(command_0) {
279    return command_0.type === "prompt" && (command_0.loadedFrom === "skills" || command_0.loadedFrom === "plugin") && (command_0.source === "projectSettings" || command_0.source === "localSettings" || command_0.source === "plugin") && command_0.allowedTools?.some(_temp3);
280  }
281  function _temp3(tool_0) {
282    return tool_0 === BASH_TOOL_NAME || tool_0.startsWith(BASH_TOOL_NAME + "(");
283  }
284  function _temp2(command) {
285    return command.type === "prompt" && command.loadedFrom === "commands_DEPRECATED" && (command.source === "projectSettings" || command.source === "localSettings") && command.allowedTools?.some(_temp);
286  }
287  function _temp(tool) {
288    return tool === BASH_TOOL_NAME || tool.startsWith(BASH_TOOL_NAME + "(");
289  }
290  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJob21lZGlyIiwiUmVhY3QiLCJsb2dFdmVudCIsInNldFNlc3Npb25UcnVzdEFjY2VwdGVkIiwiQ29tbWFuZCIsInVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyIsIkJveCIsIkxpbmsiLCJUZXh0IiwidXNlS2V5YmluZGluZyIsImdldE1jcENvbmZpZ3NCeVNjb3BlIiwiQkFTSF9UT09MX05BTUUiLCJjaGVja0hhc1RydXN0RGlhbG9nQWNjZXB0ZWQiLCJzYXZlQ3VycmVudFByb2plY3RDb25maWciLCJnZXRDd2QiLCJnZXRGc0ltcGxlbWVudGF0aW9uIiwiZ3JhY2VmdWxTaHV0ZG93blN5bmMiLCJTZWxlY3QiLCJQZXJtaXNzaW9uRGlhbG9nIiwiZ2V0QXBpS2V5SGVscGVyU291cmNlcyIsImdldEF3c0NvbW1hbmRzU291cmNlcyIsImdldEJhc2hQZXJtaXNzaW9uU291cmNlcyIsImdldERhbmdlcm91c0VudlZhcnNTb3VyY2VzIiwiZ2V0R2NwQ29tbWFuZHNTb3VyY2VzIiwiZ2V0SG9va3NTb3VyY2VzIiwiZ2V0T3RlbEhlYWRlcnNIZWxwZXJTb3VyY2VzIiwiUHJvcHMiLCJvbkRvbmUiLCJjb21tYW5kcyIsIlRydXN0RGlhbG9nIiwidDAiLCIkIiwiX2MiLCJ0MSIsIlN5bWJvbCIsImZvciIsInNlcnZlcnMiLCJwcm9qZWN0U2VydmVycyIsInQyIiwiT2JqZWN0Iiwia2V5cyIsImhhc01jcFNlcnZlcnMiLCJsZW5ndGgiLCJ0MyIsImhvb2tzU2V0dGluZ1NvdXJjZXMiLCJoYXNIb29rcyIsInQ0IiwiYmFzaFNldHRpbmdTb3VyY2VzIiwidDUiLCJhcGlLZXlIZWxwZXJTb3VyY2VzIiwiaGFzQXBpS2V5SGVscGVyIiwidDYiLCJhd3NDb21tYW5kc1NvdXJjZXMiLCJoYXNBd3NDb21tYW5kcyIsInQ3IiwiZ2NwQ29tbWFuZHNTb3VyY2VzIiwiaGFzR2NwQ29tbWFuZHMiLCJ0OCIsIm90ZWxIZWFkZXJzSGVscGVyU291cmNlcyIsImhhc090ZWxIZWFkZXJzSGVscGVyIiwidDkiLCJkYW5nZXJvdXNFbnZWYXJzU291cmNlcyIsImhhc0Rhbmdlcm91c0VudlZhcnMiLCJ0MTAiLCJzb21lIiwiX3RlbXAyIiwiaGFzU2xhc2hDb21tYW5kQmFzaCIsInQxMSIsIl90ZW1wNCIsImhhc1NraWxsc0Jhc2giLCJoYXNBbnlCYXNoRXhlY3V0aW9uIiwiaGFzVHJ1c3REaWFsb2dBY2NlcHRlZCIsInQxMiIsInQxMyIsImlzSG9tZURpciIsImhhc0Jhc2hFeGVjdXRpb24iLCJ1c2VFZmZlY3QiLCJ0MTQiLCJvbkNoYW5nZSIsInZhbHVlIiwiaXNIb21lRGlyXzAiLCJfdGVtcDUiLCJleGl0U3RhdGUiLCJfdGVtcDYiLCJ0MTUiLCJjb250ZXh0IiwiX3RlbXA3Iiwic2V0VGltZW91dCIsInQxNiIsInQxNyIsInQxOCIsImN3ZCIsInQxOSIsInQyMCIsImxhYmVsIiwidDIxIiwidmFsdWVfMCIsInQyMiIsImtleU5hbWUiLCJwZW5kaW5nIiwidDIzIiwiY3VycmVudCIsImNvbW1hbmRfMCIsImNvbW1hbmQiLCJ0eXBlIiwibG9hZGVkRnJvbSIsInNvdXJjZSIsImFsbG93ZWRUb29scyIsIl90ZW1wMyIsInRvb2xfMCIsInRvb2wiLCJzdGFydHNXaXRoIiwiX3RlbXAiXSwic291cmNlcyI6WyJUcnVzdERpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJ1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgbG9nRXZlbnQgfSBmcm9tICdzcmMvc2VydmljZXMvYW5hbHl0aWNzL2luZGV4LmpzJ1xuaW1wb3J0IHsgc2V0U2Vzc2lvblRydXN0QWNjZXB0ZWQgfSBmcm9tICcuLi8uLi9ib290c3RyYXAvc3RhdGUuanMnXG5pbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IHVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncy5qcydcbmltcG9ydCB7IEJveCwgTGluaywgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmcgfSBmcm9tICcuLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHsgZ2V0TWNwQ29uZmlnc0J5U2NvcGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tY3AvY29uZmlnLmpzJ1xuaW1wb3J0IHsgQkFTSF9UT09MX05BTUUgfSBmcm9tICcuLi8uLi90b29scy9CYXNoVG9vbC90b29sTmFtZS5qcydcbmltcG9ydCB7XG4gIGNoZWNrSGFzVHJ1c3REaWFsb2dBY2NlcHRlZCxcbiAgc2F2ZUN1cnJlbnRQcm9qZWN0Q29uZmlnLFxufSBmcm9tICcuLi8uLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQgeyBnZXRDd2QgfSBmcm9tICcuLi8uLi91dGlscy9jd2QuanMnXG5pbXBvcnQgeyBnZXRGc0ltcGxlbWVudGF0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMvZnNPcGVyYXRpb25zLmpzJ1xuaW1wb3J0IHsgZ3JhY2VmdWxTaHV0ZG93blN5bmMgfSBmcm9tICcuLi8uLi91dGlscy9ncmFjZWZ1bFNodXRkb3duLmpzJ1xuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnLi4vQ3VzdG9tU2VsZWN0L2luZGV4LmpzJ1xuaW1wb3J0IHsgUGVybWlzc2lvbkRpYWxvZyB9IGZyb20gJy4uL3Blcm1pc3Npb25zL1Blcm1pc3Npb25EaWFsb2cuanMnXG5pbXBvcnQge1xuICBnZXRBcGlLZXlIZWxwZXJTb3VyY2VzLFxuICBnZXRBd3NDb21tYW5kc1NvdXJjZXMsXG4gIGdldEJhc2hQZXJtaXNzaW9uU291cmNlcyxcbiAgZ2V0RGFuZ2Vyb3VzRW52VmFyc1NvdXJjZXMsXG4gIGdldEdjcENvbW1hbmRzU291cmNlcyxcbiAgZ2V0SG9va3NTb3VyY2VzLFxuICBnZXRPdGVsSGVhZGVyc0hlbHBlclNvdXJjZXMsXG59IGZyb20gJy4vdXRpbHMuanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIG9uRG9uZSgpOiB2b2lkXG4gIGNvbW1hbmRzPzogQ29tbWFuZFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUcnVzdERpYWxvZyh7IG9uRG9uZSwgY29tbWFuZHMgfTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB7IHNlcnZlcnM6IHByb2plY3RTZXJ2ZXJzIH0gPSBnZXRNY3BDb25maWdzQnlTY29wZSgncHJvamVjdCcpXG5cbiAgLy8gSW4gYWxsIGNhc2VzLCB3ZSBnZW5lcmFsbHkgY2hlY2sgb25seSB0aGUgcHJvamVjdC1sZXZlbCBhbmRcbiAgLy8gcHJvamVjdC1sb2NhbC1sZXZlbCBzZXR0aW5ncywgd2hpY2ggd2UgYXNzdW1lIHRoYXQgdXNlcnMgZG8gbm90IGNvbmZpZ3VyZVxuICAvLyBkaXJlY3RseSBjb21wYXJlZCB0byB1c2VyLWxldmVsIHNldHRpbmdzLlxuXG4gIC8vIENoZWNrIGZvciBNQ1BzXG4gIGNvbnN0IGhhc01jcFNlcnZlcnMgPSBPYmplY3Qua2V5cyhwcm9qZWN0U2VydmVycykubGVuZ3RoID4gMFxuICAvLyBDaGVjayBmb3IgaG9va3NcbiAgY29uc3QgaG9va3NTZXR0aW5nU291cmNlcyA9IGdldEhvb2tzU291cmNlcygpXG4gIGNvbnN0IGhhc0hvb2tzID0gaG9va3NTZXR0aW5nU291cmNlcy5sZW5ndGggPiAwXG4gIC8vIENoZWNrIHdoZXRoZXIgY29kZSBleGVjdXRpb24gaXMgYWxsb3dlZCBpbiBwZXJtaXNzaW9ucyBhbmQgc2xhc2ggY29tbWFuZHNcbiAgY29uc3QgYmFzaFNldHRpbmdTb3VyY2VzID0gZ2V0QmFzaFBlcm1pc3Npb25Tb3VyY2VzKClcbiAgLy8gQ2hlY2sgZm9yIGFwaUtleUhlbHBlciB3aGljaCBleGVjdXRlcyBhcmJpdHJhcnkgY29tbWFuZHNcbiAgY29uc3QgYXBpS2V5SGVscGVyU291cmNlcyA9IGdldEFwaUtleUhlbHBlclNvdXJjZXMoKVxuICBjb25zdCBoYXNBcGlLZXlIZWxwZXIgPSBhcGlLZXlIZWxwZXJTb3VyY2VzLmxlbmd0aCA+IDBcbiAgLy8gQ2hlY2sgZm9yIEFXUyBjb21tYW5kcyB3aGljaCBleGVjdXRlIGFyYml0cmFyeSBjb21tYW5kc1xuICBjb25zdCBhd3NDb21tYW5kc1NvdXJjZXMgPSBnZXRBd3NDb21tYW5kc1NvdXJjZXMoKVxuICBjb25zdCBoYXNBd3NDb21tYW5kcyA9IGF3c0NvbW1hbmRzU291cmNlcy5sZW5ndGggPiAwXG4gIC8vIENoZWNrIGZvciBHQ1AgY29tbWFuZHMgd2hpY2ggZXhlY3V0ZSBhcmJpdHJhcnkgY29tbWFuZHNcbiAgY29uc3QgZ2NwQ29tbWFuZHNTb3VyY2VzID0gZ2V0R2NwQ29tbWFuZHNTb3VyY2VzKClcbiAgY29uc3QgaGFzR2NwQ29tbWFuZHMgPSBnY3BDb21tYW5kc1NvdXJjZXMubGVuZ3RoID4gMFxuICAvLyBDaGVjayBmb3Igb3RlbEhlYWRlcnNIZWxwZXIgd2hpY2ggZXhlY3V0ZXMgYXJiaXRyYXJ5IGNvbW1hbmRzXG4gIGNvbnN0IG90ZWxIZWFkZXJzSGVscGVyU291cmNlcyA9IGdldE90ZWxIZWFkZXJzSGVscGVyU291cmNlcygpXG4gIGNvbnN0IGhhc090ZWxIZWFkZXJzSGVscGVyID0gb3RlbEhlYWRlcnNIZWxwZXJTb3VyY2VzLmxlbmd0aCA+IDBcbiAgLy8gQ2hlY2sgZm9yIGRhbmdlcm91cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKG5vdCBpbiBTQUZFX0VOVl9WQVJTKVxuICBjb25zdCBkYW5nZXJvdXNFbnZWYXJzU291cmNlcyA9IGdldERhbmdlcm91c0VudlZhcnNTb3VyY2VzKClcbiAgY29uc3QgaGFzRGFuZ2Vyb3VzRW52VmFycyA9IGRhbmdlcm91c0VudlZhcnNTb3VyY2VzLmxlbmd0aCA+IDBcblxuICBjb25zdCBoYXNTbGFzaENvbW1hbmRCYXNoID1cbiAgICBjb21tYW5kcz8uc29tZShcbiAgICAgIGNvbW1hbmQgPT5cbiAgICAgICAgY29tbWFuZC50eXBlID09PSAncHJvbXB0JyAmJlxuICAgICAgICBjb21tYW5kLmxvYWRlZEZyb20gPT09ICdjb21tYW5kc19ERVBSRUNBVEVEJyAmJlxuICAgICAgICAoY29tbWFuZC5zb3VyY2UgPT09ICdwcm9qZWN0U2V0dGluZ3MnIHx8XG4gICAgICAgICAgY29tbWFuZC5zb3VyY2UgPT09ICdsb2NhbFNldHRpbmdzJykgJiZcbiAgICAgICAgY29tbWFuZC5hbGxvd2VkVG9vbHM/LnNvbWUoXG4gICAgICAgICAgKHRvb2w6IHN0cmluZykgPT5cbiAgICAgICAgICAgIHRvb2wgPT09IEJBU0hfVE9PTF9OQU1FIHx8IHRvb2wuc3RhcnRzV2l0aChCQVNIX1RPT0xfTkFNRSArICcoJyksXG4gICAgICAgICksXG4gICAgKSA/PyBmYWxzZVxuXG4gIGNvbnN0IGhhc1NraWxsc0Jhc2ggPVxuICAgIGNvbW1hbmRzPy5zb21lKFxuICAgICAgY29tbWFuZCA9PlxuICAgICAgICBjb21tYW5kLnR5cGUgPT09ICdwcm9tcHQnICYmXG4gICAgICAgIChjb21tYW5kLmxvYWRlZEZyb20gPT09ICdza2lsbHMnIHx8IGNvbW1hbmQubG9hZGVkRnJvbSA9PT0gJ3BsdWdpbicpICYmXG4gICAgICAgIChjb21tYW5kLnNvdXJjZSA9PT0gJ3Byb2plY3RTZXR0aW5ncycgfHxcbiAgICAgICAgICBjb21tYW5kLnNvdXJjZSA9PT0gJ2xvY2FsU2V0dGluZ3MnIHx8XG4gICAgICAgICAgY29tbWFuZC5zb3VyY2UgPT09ICdwbHVnaW4nKSAmJlxuICAgICAgICBjb21tYW5kLmFsbG93ZWRUb29scz8uc29tZShcbiAgICAgICAgICAodG9vbDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgdG9vbCA9PT0gQkFTSF9UT09MX05BTUUgfHwgdG9vbC5zdGFydHNXaXRoKEJBU0hfVE9PTF9OQU1FICsgJygnKSxcbiAgICAgICAgKSxcbiAgICApID8/IGZhbHNlXG5cbiAgY29uc3QgaGFzQW55QmFzaEV4ZWN1dGlvbiA9XG4gICAgYmFzaFNldHRpbmdTb3VyY2VzLmxlbmd0aCA+IDAgfHwgaGFzU2xhc2hDb21tYW5kQmFzaCB8fCBoYXNTa2lsbHNCYXNoXG5cbiAgY29uc3QgaGFzVHJ1c3REaWFsb2dBY2NlcHRlZCA9IGNoZWNrSGFzVHJ1c3REaWFsb2dBY2NlcHRlZCgpXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBpc0hvbWVEaXIgPSBob21lZGlyKCkgPT09IGdldEN3ZCgpXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X3RydXN0X2RpYWxvZ19zaG93bicsIHtcbiAgICAgIGlzSG9tZURpcixcbiAgICAgIGhhc01jcFNlcnZlcnMsXG4gICAgICBoYXNIb29rcyxcbiAgICAgIGhhc0Jhc2hFeGVjdXRpb246IGhhc0FueUJhc2hFeGVjdXRpb24sXG4gICAgICBoYXNBcGlLZXlIZWxwZXIsXG4gICAgICBoYXNBd3NDb21tYW5kcyxcbiAgICAgIGhhc0djcENvbW1hbmRzLFxuICAgICAgaGFzT3RlbEhlYWRlcnNIZWxwZXIsXG4gICAgICBoYXNEYW5nZXJvdXNFbnZWYXJzLFxuICAgIH0pXG4gIH0sIFtcbiAgICBoYXNNY3BTZXJ2ZXJzLFxuICAgIGhhc0hvb2tzLFxuICAgIGhhc0FueUJhc2hFeGVjdXRpb24sXG4gICAgaGFzQXBpS2V5SGVscGVyLFxuICAgIGhhc0F3c0NvbW1hbmRzLFxuICAgIGhhc0djcENvbW1hbmRzLFxuICAgIGhhc090ZWxIZWFkZXJzSGVscGVyLFxuICAgIGhhc0Rhbmdlcm91c0VudlZhcnMsXG4gIF0pXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2UodmFsdWU6ICdlbmFibGVfYWxsJyB8ICdleGl0Jykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ2V4aXQnKSB7XG4gICAgICBncmFjZWZ1bFNodXRkb3duU3luYygxKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNIb21lRGlyID0gaG9tZWRpcigpID09PSBnZXRDd2QoKVxuXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X3RydXN0X2RpYWxvZ19hY2NlcHQnLCB7XG4gICAgICBpc0hvbWVEaXIsXG4gICAgICBoYXNNY3BTZXJ2ZXJzLFxuICAgICAgaGFzSG9va3MsXG4gICAgICBoYXNCYXNoRXhlY3V0aW9uOiBoYXNBbnlCYXNoRXhlY3V0aW9uLFxuICAgICAgaGFzQXBpS2V5SGVscGVyLFxuICAgICAgaGFzQXdzQ29tbWFuZHMsXG4gICAgICBoYXNHY3BDb21tYW5kcyxcbiAgICAgIGhhc090ZWxIZWFkZXJzSGVscGVyLFxuICAgICAgaGFzRGFuZ2Vyb3VzRW52VmFycyxcbiAgICB9KVxuXG4gICAgaWYgKGlzSG9tZURpcikge1xuICAgICAgLy8gRm9yIGhvbWUgZGlyZWN0b3J5LCBzdG9yZSB0cnVzdCBpbiBzZXNzaW9uIG1lbW9yeSBvbmx5IChub3QgcGVyc2lzdGVkIHRvIGRpc2spXG4gICAgICAvLyBUaGlzIGFsbG93cyBob29rcyBhbmQgb3RoZXIgdHJ1c3QtcmVxdWlyaW5nIGZlYXR1cmVzIHRvIHdvcmsgZHVyaW5nIHRoaXMgc2Vzc2lvblxuICAgICAgLy8gd2hpbGUgcHJlc2VydmluZyB0aGUgc2VjdXJpdHkgaW50ZW50IG9mIG5vdCBwZXJtYW5lbnRseSB0cnVzdGluZyBob21lIGRpclxuICAgICAgc2V0U2Vzc2lvblRydXN0QWNjZXB0ZWQodHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgc2F2ZUN1cnJlbnRQcm9qZWN0Q29uZmlnKGN1cnJlbnQgPT4gKHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgaGFzVHJ1c3REaWFsb2dBY2NlcHRlZDogdHJ1ZSxcbiAgICAgIH0pKVxuICAgIH1cblxuICAgIC8vIERvIE5PVCB3cml0ZSBNQ1Agc2VydmVyIHNldHRpbmdzIGhlcmUuIGhhbmRsZU1jcGpzb25TZXJ2ZXJBcHByb3ZhbHMgaW5cbiAgICAvLyBpbnRlcmFjdGl2ZUhlbHBlcnMudHN4IHJ1bnMgcmlnaHQgYWZ0ZXIgdGhpcyBkaWFsb2cgYW5kIHNob3dzIHRoZSBwZXItc2VydmVyIGFwcHJvdmFsXG4gICAgLy8gVUkuIFdyaXRpbmcgZW5hYmxlZE1jcGpzb25TZXJ2ZXJzL2VuYWJsZUFsbFByb2plY3RNY3BTZXJ2ZXJzIGhlcmUgd291bGRcbiAgICAvLyBtYXJrIGV2ZXJ5IHNlcnZlciAnYXBwcm92ZWQnIGFuZCBzaWxlbnRseSBza2lwIHRoYXQgZGlhbG9nLiBTZWUgIzE1NTU4LlxuXG4gICAgb25Eb25lKClcbiAgfVxuXG4gIC8vIERlZmF1bHQgb25FeGl0IGlzIHVzZUFwcCgpLmV4aXQoKSDihpIgSW5rLnVubW91bnQoKSwgd2hpY2ggdGVhcnMgZG93biB0aGVcbiAgLy8gUmVhY3QgdHJlZSBidXQgbmV2ZXIgY2FsbHMgb25Eb25lKCkuIHNob3dTZXR1cFNjcmVlbnMoKSBpblxuICAvLyBpbnRlcmFjdGl2ZUhlbHBlcnMudHN4IGF3YWl0cyBhIFByb21pc2UgdGhhdCBvbmx5IHJlc29sdmVzIHZpYSBvbkRvbmUsXG4gIC8vIHNvIHRoZSBkZWZhdWx0IHdvdWxkIGhhbmcgdGhlIGF3YWl0IGZvcmV2ZXIuIFdpdGgga2V5YmluZGluZ1xuICAvLyBjdXN0b21pemF0aW9uIGVuYWJsZWQsIHRoZSBjaG9raWRhciB3YXRjaGVyIChwZXJzaXN0ZW50OiB0cnVlKSBrZWVwcyB0aGVcbiAgLy8gZXZlbnQgbG9vcCBhbGl2ZSBhbmQgdGhlIHByb2Nlc3MgZnJlZXplcy4gRXhwbGljaXRseSBleGl0IDEgbGlrZSBcIk5vXCIuXG4gIGNvbnN0IGV4aXRTdGF0ZSA9IHVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncygoKSA9PlxuICAgIGdyYWNlZnVsU2h1dGRvd25TeW5jKDEpLFxuICApXG5cbiAgLy8gVXNlIGNvbmZpZ3VyYWJsZSBrZXliaW5kaW5nIGZvciBFU0MgdG8gY2FuY2VsL2V4aXRcbiAgdXNlS2V5YmluZGluZyhcbiAgICAnY29uZmlybTpubycsXG4gICAgKCkgPT4ge1xuICAgICAgZ3JhY2VmdWxTaHV0ZG93blN5bmMoMClcbiAgICB9LFxuICAgIHsgY29udGV4dDogJ0NvbmZpcm1hdGlvbicgfSxcbiAgKVxuXG4gIC8vIEF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0aGUgdHJ1c3QgZGlhbG9nIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgc2hvd24uXG4gIGlmIChoYXNUcnVzdERpYWxvZ0FjY2VwdGVkKSB7XG4gICAgc2V0VGltZW91dChvbkRvbmUpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFBlcm1pc3Npb25EaWFsb2dcbiAgICAgIGNvbG9yPVwid2FybmluZ1wiXG4gICAgICB0aXRsZUNvbG9yPVwid2FybmluZ1wiXG4gICAgICB0aXRsZT1cIkFjY2Vzc2luZyB3b3Jrc3BhY2U6XCJcbiAgICA+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezF9IHBhZGRpbmdUb3A9ezF9PlxuICAgICAgICA8VGV4dCBib2xkPntnZXRGc0ltcGxlbWVudGF0aW9uKCkuY3dkKCl9PC9UZXh0PlxuXG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIFF1aWNrIHNhZmV0eSBjaGVjazogSXMgdGhpcyBhIHByb2plY3QgeW91IGNyZWF0ZWQgb3Igb25lIHlvdSB0cnVzdD9cbiAgICAgICAgICAoTGlrZSB5b3VyIG93biBjb2RlLCBhIHdlbGwta25vd24gb3BlbiBzb3VyY2UgcHJvamVjdCwgb3Igd29yayBmcm9tXG4gICAgICAgICAgeW91ciB0ZWFtKS4gSWYgbm90LCB0YWtlIGEgbW9tZW50IHRvIHJldmlldyB3aGF0e1wiJ1wifXMgaW4gdGhpcyBmb2xkZXJcbiAgICAgICAgICBmaXJzdC5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICBDbGF1ZGUgQ29kZXtcIidcIn1sbCBiZSBhYmxlIHRvIHJlYWQsIGVkaXQsIGFuZCBleGVjdXRlIGZpbGVzIGhlcmUuXG4gICAgICAgIDwvVGV4dD5cblxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICA8TGluayB1cmw9XCJodHRwczovL2NvZGUuY2xhdWRlLmNvbS9kb2NzL2VuL3NlY3VyaXR5XCI+XG4gICAgICAgICAgICBTZWN1cml0eSBndWlkZVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgPC9UZXh0PlxuXG4gICAgICAgIDxTZWxlY3RcbiAgICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAgICB7IGxhYmVsOiAnWWVzLCBJIHRydXN0IHRoaXMgZm9sZGVyJywgdmFsdWU6ICdlbmFibGVfYWxsJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ05vLCBleGl0JywgdmFsdWU6ICdleGl0JyB9LFxuICAgICAgICAgIF19XG4gICAgICAgICAgb25DaGFuZ2U9e3ZhbHVlID0+IG9uQ2hhbmdlKHZhbHVlIGFzICdlbmFibGVfYWxsJyB8ICdleGl0Jyl9XG4gICAgICAgICAgb25DYW5jZWw9eygpID0+IG9uQ2hhbmdlKCdleGl0Jyl9XG4gICAgICAgIC8+XG5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAge2V4aXRTdGF0ZS5wZW5kaW5nID8gKFxuICAgICAgICAgICAgPD5QcmVzcyB7ZXhpdFN0YXRlLmtleU5hbWV9IGFnYWluIHRvIGV4aXQ8Lz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPD5FbnRlciB0byBjb25maXJtIMK3IEVzYyB0byBjYW5jZWw8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICA8L1Blcm1pc3Npb25EaWFsb2c+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVNBLE9BQU8sUUFBUSxJQUFJO0FBQzVCLE9BQU9DLEtBQUssTUFBTSxPQUFPO0FBQ3pCLFNBQVNDLFFBQVEsUUFBUSxpQ0FBaUM7QUFDMUQsU0FBU0MsdUJBQXVCLFFBQVEsMEJBQTBCO0FBQ2xFLGNBQWNDLE9BQU8sUUFBUSxtQkFBbUI7QUFDaEQsU0FBU0MsOEJBQThCLFFBQVEsK0NBQStDO0FBQzlGLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUM5QyxTQUFTQyxhQUFhLFFBQVEsb0NB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