obsidian-integration-testing 2.0.2 → 2.0.4

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.
@@ -47,41 +47,55 @@ async function coreSetup(params) {
47
47
  (0, import_log.log)("[integration-setup] Creating transport...");
48
48
  const transport = await (0, import_transport_factory.createTransportFromOptions)(transportOptions);
49
49
  (0, import_log.log)(`[integration-setup] Transport created: ${transport.constructor.name}`);
50
- (0, import_log.log)(`[integration-setup] Project root: ${projectRoot}`);
51
- const distPath = await resolveDistPath(projectRoot);
52
- const manifestJson = JSON.parse(await (0, import_promises.readFile)((0, import_node_path.join)(distPath, "manifest.json"), "utf-8"));
53
- const pluginId = manifestJson.id;
54
- if (transport.isMobile && manifestJson.isDesktopOnly) {
55
- throw new Error(
56
- `Plugin "${pluginId}" has isDesktopOnly: true in manifest.json. Mobile integration tests cannot run for desktop-only plugins.`
57
- );
58
- }
59
- const mainJs = (0, import_node_path.join)(distPath, MAIN_JS);
60
- const buildStat = await (0, import_promises.stat)(mainJs);
61
- (0, import_log.log)(`[integration-setup] Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
62
- const tempVault = new import_temp_vault.TempVault();
63
- (0, import_log.log)(`[integration-setup] Created temp vault: ${tempVault.path}`);
64
- const pluginDir = (0, import_node_path.join)(tempVault.path, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
65
- await (0, import_promises.mkdir)(pluginDir, { recursive: true });
66
- await (0, import_promises.cp)(distPath, pluginDir, { recursive: true });
67
- await (0, import_promises.writeFile)((0, import_node_path.join)(tempVault.path, OBSIDIAN_CONFIG_DIR, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
68
- (0, import_log.log)("[integration-setup] Syncing vault to device...");
69
- await tempVault.syncToDevice(transport);
70
- (0, import_log.log)("[integration-setup] Registering vault...");
71
- await tempVault.register(transport);
72
- (0, import_log.log)("[integration-setup] Vault registered.");
73
- (0, import_log.log)(`[integration-setup] Enabling plugin "${pluginId}"...`);
74
- const { errorMessage } = await (0, import_obsidian_cli.evalInObsidian)({
75
- args: { pluginId },
76
- fn: import_enable_plugin.enablePluginWithErrorCapture,
77
- shouldSkipPreflightChecks: true,
78
- transport,
79
- vaultPath: tempVault.path
80
- });
81
- if (errorMessage) {
82
- throw new Error(`Plugin "${pluginId}" failed to load: ${errorMessage}`);
50
+ let tempVault;
51
+ try {
52
+ (0, import_log.log)(`[integration-setup] Project root: ${projectRoot}`);
53
+ const distPath = await resolveDistPath(projectRoot);
54
+ const manifestJson = JSON.parse(await (0, import_promises.readFile)((0, import_node_path.join)(distPath, "manifest.json"), "utf-8"));
55
+ const pluginId = manifestJson.id;
56
+ if (transport.isMobile && manifestJson.isDesktopOnly) {
57
+ throw new Error(
58
+ `Plugin "${pluginId}" has isDesktopOnly: true in manifest.json. Mobile integration tests cannot run for desktop-only plugins.`
59
+ );
60
+ }
61
+ const mainJs = (0, import_node_path.join)(distPath, MAIN_JS);
62
+ const buildStat = await (0, import_promises.stat)(mainJs);
63
+ (0, import_log.log)(`[integration-setup] Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
64
+ tempVault = new import_temp_vault.TempVault();
65
+ (0, import_log.log)(`[integration-setup] Created temp vault: ${tempVault.path}`);
66
+ const pluginDir = (0, import_node_path.join)(tempVault.path, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
67
+ await (0, import_promises.mkdir)(pluginDir, { recursive: true });
68
+ await (0, import_promises.cp)(distPath, pluginDir, { recursive: true });
69
+ await (0, import_promises.writeFile)((0, import_node_path.join)(tempVault.path, OBSIDIAN_CONFIG_DIR, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
70
+ (0, import_log.log)("[integration-setup] Syncing vault to device...");
71
+ await tempVault.syncToDevice(transport);
72
+ (0, import_log.log)("[integration-setup] Registering vault...");
73
+ await tempVault.register(transport);
74
+ (0, import_log.log)("[integration-setup] Vault registered.");
75
+ (0, import_log.log)(`[integration-setup] Enabling plugin "${pluginId}"...`);
76
+ const { errorMessage } = await (0, import_obsidian_cli.evalInObsidian)({
77
+ args: { pluginId },
78
+ fn: import_enable_plugin.enablePluginWithErrorCapture,
79
+ shouldSkipPreflightChecks: true,
80
+ transport,
81
+ vaultPath: tempVault.path
82
+ });
83
+ if (errorMessage) {
84
+ throw new Error(`Plugin "${pluginId}" failed to load: ${errorMessage}`);
85
+ }
86
+ (0, import_log.log)(`[integration-setup] Plugin "${pluginId}" enabled successfully.`);
87
+ } catch (error) {
88
+ (0, import_log.log)("[integration-setup] Setup failed, cleaning up...");
89
+ try {
90
+ if (tempVault) {
91
+ await tempVault.dispose(transport);
92
+ }
93
+ await transport.dispose?.();
94
+ } catch (cleanupError) {
95
+ (0, import_log.log)(`[integration-setup] Cleanup error (non-fatal): ${String(cleanupError)}`);
96
+ }
97
+ throw error;
83
98
  }
84
- (0, import_log.log)(`[integration-setup] Plugin "${pluginId}" enabled successfully.`);
85
99
  return { tempVault, transport, transportOptions };
86
100
  }
87
101
  async function coreTeardown(result) {
@@ -124,4 +138,4 @@ async function resolveDistPath(projectRoot) {
124
138
  coreSetup,
125
139
  coreTeardown
126
140
  });
127
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9vYnNpZGlhbi1jbGkuY2pzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb3JlU2V0dXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFBhcmFtcyB7XG4gIC8qKiBUcmFuc3BvcnQgb3B0aW9ucy4gV2hlbiBvbWl0dGVkLCBkZWZhdWx0cyB0byB0aGUgQ0xJIHRyYW5zcG9ydC4gKi9cbiAgdHJhbnNwb3J0T3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkge0BsaW5rIGNvcmVTZXR1cH0sIHVzZWQgYnkgZnJhbWV3b3JrIGFkYXB0ZXJzXG4gKiB0byBwYXNzIGNvbnRleHQgdG8gdGVzdCB3b3JrZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFJlc3VsdCB7XG4gIC8qKiBUaGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLiAqL1xuICB0ZW1wVmF1bHQ6IFRlbXBWYXVsdDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSB1c2VkIGR1cmluZyBzZXR1cC4gKi9cbiAgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRoYXQgd2VyZSByZXNvbHZlZC4gKi9cbiAgdHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgc2V0dXAgbG9naWMuXG4gKlxuICogTG9hZHMgYC5lbnZgIGZyb20gdGhlIHByb2plY3Qgcm9vdCwgY3JlYXRlcyBhIHRyYW5zcG9ydCwgY29waWVzIHRoZSBidWlsdFxuICogcGx1Z2luIGludG8gYSB0ZW1wb3JhcnkgdmF1bHQsIHJlZ2lzdGVycyB0aGUgdmF1bHQgd2l0aCBPYnNpZGlhbiwgYW5kXG4gKiBlbmFibGVzIHRoZSBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNldHVwIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgcmVzdWx0IGNvbnRhaW5pbmcgdGhlIHRlbXAgdmF1bHQsIHRyYW5zcG9ydCwgYW5kIHJlc29sdmVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlU2V0dXAocGFyYW1zPzogQ29yZVNldHVwUGFyYW1zKTogUHJvbWlzZTxDb3JlU2V0dXBSZXN1bHQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBmaW5kUHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZW52RmlsZVBhdGggPSBqb2luKHByb2plY3RSb290LCAnLmVudicpO1xuICBpZiAoZXhpc3RzU3luYyhlbnZGaWxlUGF0aCkpIHtcbiAgICBsb2FkRW52RmlsZShlbnZGaWxlUGF0aCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gcGFyYW1zPy50cmFuc3BvcnRPcHRpb25zO1xuICBsb2coJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gQ3JlYXRpbmcgdHJhbnNwb3J0Li4uJyk7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cF0gVHJhbnNwb3J0IGNyZWF0ZWQ6ICR7dHJhbnNwb3J0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG5cbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIFByb2plY3Qgcm9vdDogJHtwcm9qZWN0Um9vdH1gKTtcbiAgY29uc3QgZGlzdFBhdGggPSBhd2FpdCByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3QpO1xuICBjb25zdCBtYW5pZmVzdEpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlzdFBhdGgsICdtYW5pZmVzdC5qc29uJyksICd1dGYtOCcpKSBhcyBQbHVnaW5NYW5pZmVzdDtcbiAgY29uc3QgcGx1Z2luSWQgPSBtYW5pZmVzdEpzb24uaWQ7XG5cbiAgaWYgKHRyYW5zcG9ydC5pc01vYmlsZSAmJiBtYW5pZmVzdEpzb24uaXNEZXNrdG9wT25seSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBpc0Rlc2t0b3BPbmx5OiB0cnVlIGluIG1hbmlmZXN0Lmpzb24uIE1vYmlsZSBpbnRlZ3JhdGlvbiB0ZXN0cyBjYW5ub3QgcnVuIGZvciBkZXNrdG9wLW9ubHkgcGx1Z2lucy5gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1haW5KcyA9IGpvaW4oZGlzdFBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZFN0YXQgPSBhd2FpdCBzdGF0KG1haW5Kcyk7XG5cbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gIGNvbnN0IHRlbXBWYXVsdCA9IG5ldyBUZW1wVmF1bHQoKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIENyZWF0ZWQgdGVtcCB2YXVsdDogJHt0ZW1wVmF1bHQucGF0aH1gKTtcbiAgY29uc3QgcGx1Z2luRGlyID0gam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgUExVR0lOU19ESVIsIHBsdWdpbklkKTtcbiAgYXdhaXQgbWtkaXIocGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHRlbXBWYXVsdC5wYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBDT01NVU5JVFlfUExVR0lOU19KU09OKSwgSlNPTi5zdHJpbmdpZnkoW3BsdWdpbklkXSkpO1xuXG4gIGxvZygnW2ludGVncmF0aW9uLXNldHVwXSBTeW5jaW5nIHZhdWx0IHRvIGRldmljZS4uLicpO1xuICBhd2FpdCB0ZW1wVmF1bHQuc3luY1RvRGV2aWNlKHRyYW5zcG9ydCk7XG4gIGxvZygnW2ludGVncmF0aW9uLXNldHVwXSBSZWdpc3RlcmluZyB2YXVsdC4uLicpO1xuICBhd2FpdCB0ZW1wVmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcbiAgbG9nKCdbaW50ZWdyYXRpb24tc2V0dXBdIFZhdWx0IHJlZ2lzdGVyZWQuJyk7XG5cbiAgLy8gRW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQuIE9ic2lkaWFuJ3MgZW5hYmxlUGx1Z2luKCkgd3JhcHNcbiAgLy8gTG9hZFBsdWdpbigpIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3MgZXJyb3JzIGFuZCByZXR1cm5zIGZhbHNlLlxuICAvLyBXZSBtb25rZXktcGF0Y2ggbG9hZFBsdWdpbigpIHRvIGNhcHR1cmUgdGhlIGVycm9yIGJlZm9yZSBpdCdzIHN3YWxsb3dlZC5cbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIEVuYWJsaW5nIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIuLi5gKTtcbiAgY29uc3QgeyBlcnJvck1lc3NhZ2UgfSA9IGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBhcmdzOiB7IHBsdWdpbklkIH0sXG4gICAgZm46IGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUsXG4gICAgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrczogdHJ1ZSxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmF1bHRQYXRoOiB0ZW1wVmF1bHQucGF0aFxuICB9KTtcblxuICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgfVxuXG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwXSBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LmApO1xuXG4gIHJldHVybiB7IHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH07XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZXN1bHQ/LnRlbXBWYXVsdC5kaXNwb3NlKHJlc3VsdC50cmFuc3BvcnQpO1xuICBhd2FpdCByZXN1bHQ/LnRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcHJvamVjdCByb290IGJ5IHdhbGtpbmcgdXAgZnJvbSBgcHJvY2Vzcy5jd2QoKWAgbG9va2luZyBmb3IgYHBhY2thZ2UuanNvbmAuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZmluZFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIExvb3AgdGVybWluYXRlcyBhdCBmaWxlc3lzdGVtIHJvb3QuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGV4aXN0c1N5bmMoam9pbihkaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGpvaW4oZGlyLCAnLi4nKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcHJvamVjdCByb290IChubyBwYWNrYWdlLmpzb24gZm91bmQpLicpO1xuICAgIH1cbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZGlzdCBwYXRoIHRvIHVzZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKlxuICogUGlja3Mgd2hpY2hldmVyIG9mIGBkaXN0L2RldmAgYW5kIGBkaXN0L2J1aWxkYCBoYXMgYSBuZXdlciBgbWFpbi5qc2AuXG4gKiBJZiBvbmx5IG9uZSBleGlzdHMsIHRoYXQgb25lIGlzIHVzZWQuIFRocm93cyBpZiBuZWl0aGVyIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdFJvb3QgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGNob3NlbiBkaXN0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkZXZQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9ERVYpO1xuICBjb25zdCBidWlsZFBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0JVSUxEKTtcbiAgY29uc3QgZGV2TWFpbkpzID0gam9pbihkZXZQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRNYWluSnMgPSBqb2luKGJ1aWxkUGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGRldlN0YXQgPSBleGlzdHNTeW5jKGRldk1haW5KcykgPyBhd2FpdCBzdGF0KGRldk1haW5KcykgOiBudWxsO1xuICBjb25zdCBidWlsZFN0YXQgPSBleGlzdHNTeW5jKGJ1aWxkTWFpbkpzKSA/IGF3YWl0IHN0YXQoYnVpbGRNYWluSnMpIDogbnVsbDtcblxuICBpZiAoZGV2U3RhdCAmJiBidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gZGV2U3RhdC5tdGltZSA+IGJ1aWxkU3RhdC5tdGltZSA/IGRldlBhdGggOiBidWlsZFBhdGg7XG4gIH1cblxuICBpZiAoZGV2U3RhdCkge1xuICAgIHJldHVybiBkZXZQYXRoO1xuICB9XG5cbiAgaWYgKGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBidWlsZFBhdGg7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJ1aWxkIGZvdW5kLiBSdW4gYG5wbSBydW4gYnVpbGRgIG9yIGBucG0gcnVuIGRldmAgZmlyc3QuJyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQSxxQkFBMkI7QUFDM0Isc0JBTU87QUFDUCx1QkFBcUI7QUFDckIsMEJBQTRCO0FBSzVCLDJCQUE2QztBQUM3QyxpQkFBb0I7QUFDcEIsMEJBQStCO0FBQy9CLHdCQUEwQjtBQUMxQiwrQkFBMkM7QUFFM0MsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sYUFBYTtBQUNuQixNQUFNLFVBQVU7QUFDaEIsTUFBTSxz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
141
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9vYnNpZGlhbi1jbGkuY2pzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb3JlU2V0dXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFBhcmFtcyB7XG4gIC8qKiBUcmFuc3BvcnQgb3B0aW9ucy4gV2hlbiBvbWl0dGVkLCBkZWZhdWx0cyB0byB0aGUgQ0xJIHRyYW5zcG9ydC4gKi9cbiAgdHJhbnNwb3J0T3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkge0BsaW5rIGNvcmVTZXR1cH0sIHVzZWQgYnkgZnJhbWV3b3JrIGFkYXB0ZXJzXG4gKiB0byBwYXNzIGNvbnRleHQgdG8gdGVzdCB3b3JrZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFJlc3VsdCB7XG4gIC8qKiBUaGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLiAqL1xuICB0ZW1wVmF1bHQ6IFRlbXBWYXVsdDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSB1c2VkIGR1cmluZyBzZXR1cC4gKi9cbiAgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRoYXQgd2VyZSByZXNvbHZlZC4gKi9cbiAgdHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgc2V0dXAgbG9naWMuXG4gKlxuICogTG9hZHMgYC5lbnZgIGZyb20gdGhlIHByb2plY3Qgcm9vdCwgY3JlYXRlcyBhIHRyYW5zcG9ydCwgY29waWVzIHRoZSBidWlsdFxuICogcGx1Z2luIGludG8gYSB0ZW1wb3JhcnkgdmF1bHQsIHJlZ2lzdGVycyB0aGUgdmF1bHQgd2l0aCBPYnNpZGlhbiwgYW5kXG4gKiBlbmFibGVzIHRoZSBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNldHVwIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgcmVzdWx0IGNvbnRhaW5pbmcgdGhlIHRlbXAgdmF1bHQsIHRyYW5zcG9ydCwgYW5kIHJlc29sdmVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlU2V0dXAocGFyYW1zPzogQ29yZVNldHVwUGFyYW1zKTogUHJvbWlzZTxDb3JlU2V0dXBSZXN1bHQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBmaW5kUHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZW52RmlsZVBhdGggPSBqb2luKHByb2plY3RSb290LCAnLmVudicpO1xuICBpZiAoZXhpc3RzU3luYyhlbnZGaWxlUGF0aCkpIHtcbiAgICBsb2FkRW52RmlsZShlbnZGaWxlUGF0aCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gcGFyYW1zPy50cmFuc3BvcnRPcHRpb25zO1xuICBsb2coJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gQ3JlYXRpbmcgdHJhbnNwb3J0Li4uJyk7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cF0gVHJhbnNwb3J0IGNyZWF0ZWQ6ICR7dHJhbnNwb3J0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG5cbiAgbGV0IHRlbXBWYXVsdDogVGVtcFZhdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIFByb2plY3Qgcm9vdDogJHtwcm9qZWN0Um9vdH1gKTtcbiAgICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gICAgY29uc3QgbWFuaWZlc3RKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShqb2luKGRpc3RQYXRoLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG4gICAgY29uc3QgcGx1Z2luSWQgPSBtYW5pZmVzdEpzb24uaWQ7XG5cbiAgICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBpc0Rlc2t0b3BPbmx5OiB0cnVlIGluIG1hbmlmZXN0Lmpzb24uIE1vYmlsZSBpbnRlZ3JhdGlvbiB0ZXN0cyBjYW5ub3QgcnVuIGZvciBkZXNrdG9wLW9ubHkgcGx1Z2lucy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5KcyA9IGpvaW4oZGlzdFBhdGgsIE1BSU5fSlMpO1xuICAgIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwXSBVc2luZyAke2Rpc3RQYXRofSAoJHtidWlsZFN0YXQubXRpbWUudG9JU09TdHJpbmcoKX0pLiBJZiBvdXRkYXRlZCwgcmVidWlsZC5gKTtcblxuICAgIHRlbXBWYXVsdCA9IG5ldyBUZW1wVmF1bHQoKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cF0gQ3JlYXRlZCB0ZW1wIHZhdWx0OiAke3RlbXBWYXVsdC5wYXRofWApO1xuICAgIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gICAgYXdhaXQgbWtkaXIocGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBjcChkaXN0UGF0aCwgcGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICAgIGxvZygnW2ludGVncmF0aW9uLXNldHVwXSBTeW5jaW5nIHZhdWx0IHRvIGRldmljZS4uLicpO1xuICAgIGF3YWl0IHRlbXBWYXVsdC5zeW5jVG9EZXZpY2UodHJhbnNwb3J0KTtcbiAgICBsb2coJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gUmVnaXN0ZXJpbmcgdmF1bHQuLi4nKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcbiAgICBsb2coJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gVmF1bHQgcmVnaXN0ZXJlZC4nKTtcblxuICAgIC8vIEVuYWJsZSB0aGUgcGx1Z2luIGFuZCB2ZXJpZnkgaXQgbG9hZGVkLiBPYnNpZGlhbidzIGVuYWJsZVBsdWdpbigpIHdyYXBzXG4gICAgLy8gTG9hZFBsdWdpbigpIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3MgZXJyb3JzIGFuZCByZXR1cm5zIGZhbHNlLlxuICAgIC8vIFdlIG1vbmtleS1wYXRjaCBsb2FkUGx1Z2luKCkgdG8gY2FwdHVyZSB0aGUgZXJyb3IgYmVmb3JlIGl0J3Mgc3dhbGxvd2VkLlxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwXSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG4gICAgY29uc3QgeyBlcnJvck1lc3NhZ2UgfSA9IGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAgIGFyZ3M6IHsgcGx1Z2luSWQgfSxcbiAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrczogdHJ1ZSxcbiAgICAgIHRyYW5zcG9ydCxcbiAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICB9KTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZW5hYmxlZCBzdWNjZXNzZnVsbHkuYCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKCdbaW50ZWdyYXRpb24tc2V0dXBdIFNldHVwIGZhaWxlZCwgY2xlYW5pbmcgdXAuLi4nKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRlbXBWYXVsdCkge1xuICAgICAgICBhd2FpdCB0ZW1wVmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIENsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHsgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmstYWdub3N0aWMgZ2xvYmFsIHRlYXJkb3duIGxvZ2ljLlxuICpcbiAqIERpc3Bvc2VzIG9mIHRoZSB0ZW1wb3JhcnkgdmF1bHQgYW5kIHRyYW5zcG9ydCBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJlc3VsdCBmcm9tIHtAbGluayBjb3JlU2V0dXB9LiBXaGVuIGB1bmRlZmluZWRgLCBkb2VzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlVGVhcmRvd24ocmVzdWx0PzogQ29yZVNldHVwUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlc3VsdD8udGVtcFZhdWx0LmRpc3Bvc2UocmVzdWx0LnRyYW5zcG9ydCk7XG4gIGF3YWl0IHJlc3VsdD8udHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIGBwcm9jZXNzLmN3ZCgpYCBsb29raW5nIGZvciBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5mdW5jdGlvbiBmaW5kUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gTG9vcCB0ZXJtaW5hdGVzIGF0IGZpbGVzeXN0ZW0gcm9vdC5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gam9pbihkaXIsICcuLicpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcm9qZWN0IHJvb3QgKG5vIHBhY2thZ2UuanNvbiBmb3VuZCkuJyk7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXN0IHBhdGggdG8gdXNlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBQaWNrcyB3aGljaGV2ZXIgb2YgYGRpc3QvZGV2YCBhbmQgYGRpc3QvYnVpbGRgIGhhcyBhIG5ld2VyIGBtYWluLmpzYC5cbiAqIElmIG9ubHkgb25lIGV4aXN0cywgdGhhdCBvbmUgaXMgdXNlZC4gVGhyb3dzIGlmIG5laXRoZXIgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRldlBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0RFVik7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfQlVJTEQpO1xuICBjb25zdCBkZXZNYWluSnMgPSBqb2luKGRldlBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZE1haW5KcyA9IGpvaW4oYnVpbGRQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgZGV2U3RhdCA9IGV4aXN0c1N5bmMoZGV2TWFpbkpzKSA/IGF3YWl0IHN0YXQoZGV2TWFpbkpzKSA6IG51bGw7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGV4aXN0c1N5bmMoYnVpbGRNYWluSnMpID8gYXdhaXQgc3RhdChidWlsZE1haW5KcykgOiBudWxsO1xuXG4gIGlmIChkZXZTdGF0ICYmIGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBkZXZTdGF0Lm10aW1lID4gYnVpbGRTdGF0Lm10aW1lID8gZGV2UGF0aCA6IGJ1aWxkUGF0aDtcbiAgfVxuXG4gIGlmIChkZXZTdGF0KSB7XG4gICAgcmV0dXJuIGRldlBhdGg7XG4gIH1cblxuICBpZiAoYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBgbnBtIHJ1biBidWlsZGAgb3IgYG5wbSBydW4gZGV2YCBmaXJzdC4nKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBLHFCQUEyQjtBQUMzQixzQkFNTztBQUNQLHVCQUFxQjtBQUNyQiwwQkFBNEI7QUFLNUIsMkJBQTZDO0FBQzdDLGlCQUFvQjtBQUNwQiwwQkFBK0I7QUFDL0Isd0JBQTBCO0FBQzFCLCtCQUEyQztBQUUzQyxNQUFNLFdBQVc7QUFDakIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sVUFBVTtBQUNoQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSx5QkFBeUI7QUFtQy9CLGVBQXNCLFVBQVUsUUFBb0Q7QUFDbEYsUUFBTSxjQUFjLGdCQUFnQjtBQUNwQyxRQUFNLGtCQUFjLHVCQUFLLGFBQWEsTUFBTTtBQUM1QyxVQUFJLDJCQUFXLFdBQVcsR0FBRztBQUMzQix5Q0FBWSxXQUFXO0FBQUEsRUFDekI7QUFFQSxRQUFNLG1CQUFtQixRQUFRO0FBQ2pDLHNCQUFJLDJDQUEyQztBQUMvQyxRQUFNLFlBQVksVUFBTSxxREFBMkIsZ0JBQWdCO0FBQ25FLHNCQUFJLDBDQUEwQyxVQUFVLFlBQVksSUFBSSxFQUFFO0FBRTFFLE1BQUk7QUFFSixNQUFJO0FBQ0Ysd0JBQUkscUNBQXFDLFdBQVcsRUFBRTtBQUN0RCxVQUFNLFdBQVcsTUFBTSxnQkFBZ0IsV0FBVztBQUNsRCxVQUFNLGVBQWUsS0FBSyxNQUFNLFVBQU0sOEJBQVMsdUJBQUssVUFBVSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3hGLFVBQU0sV0FBVyxhQUFhO0FBRTlCLFFBQUksVUFBVSxZQUFZLGFBQWEsZUFBZTtBQUNwRCxZQUFNLElBQUk7QUFBQSxRQUNSLFdBQVcsUUFBUTtBQUFBLE1BQ3JCO0FBQUEsSUFDRjtBQUVBLFVBQU0sYUFBUyx1QkFBSyxVQUFVLE9BQU87QUFDckMsVUFBTSxZQUFZLFVBQU0sc0JBQUssTUFBTTtBQUVuQyx3QkFBSSw2QkFBNkIsUUFBUSxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUMsMEJBQTBCO0FBRXJHLGdCQUFZLElBQUksNEJBQVU7QUFDMUIsd0JBQUksMkNBQTJDLFVBQVUsSUFBSSxFQUFFO0FBQy9ELFVBQU0sZ0JBQVksdUJBQUssVUFBVSxNQUFNLHFCQUFxQixhQUFhLFFBQVE7QUFDakYsY0FBTSx1QkFBTSxXQUFXLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDMUMsY0FBTSxvQkFBRyxVQUFVLFdBQVcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNqRCxjQUFNLCtCQUFVLHVCQUFLLFVBQVUsTUFBTSxxQkFBcUIsc0JBQXNCLEdBQUcsS0FBSyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0csd0JBQUksZ0RBQWdEO0FBQ3BELFVBQU0sVUFBVSxhQUFhLFNBQVM7QUFDdEMsd0JBQUksMENBQTBDO0FBQzlDLFVBQU0sVUFBVSxTQUFTLFNBQVM7QUFDbEMsd0JBQUksdUNBQXVDO0FBSzNDLHdCQUFJLHdDQUF3QyxRQUFRLE1BQU07QUFDMUQsVUFBTSxFQUFFLGFBQWEsSUFBSSxVQUFNLG9DQUFlO0FBQUEsTUFDNUMsTUFBTSxFQUFFLFNBQVM7QUFBQSxNQUNqQixJQUFJO0FBQUEsTUFDSiwyQkFBMkI7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsV0FBVyxVQUFVO0FBQUEsSUFDdkIsQ0FBQztBQUVELFFBQUksY0FBYztBQUNoQixZQUFNLElBQUksTUFBTSxXQUFXLFFBQVEscUJBQXFCLFlBQVksRUFBRTtBQUFBLElBQ3hFO0FBRUEsd0JBQUksK0JBQStCLFFBQVEseUJBQXlCO0FBQUEsRUFDdEUsU0FBUyxPQUFnQjtBQUN2Qix3QkFBSSxrREFBa0Q7QUFDdEQsUUFBSTtBQUNGLFVBQUksV0FBVztBQUNiLGNBQU0sVUFBVSxRQUFRLFNBQVM7QUFBQSxNQUNuQztBQUNBLFlBQU0sVUFBVSxVQUFVO0FBQUEsSUFDNUIsU0FBUyxjQUF1QjtBQUM5QiwwQkFBSSxrREFBa0QsT0FBTyxZQUFZLENBQUMsRUFBRTtBQUFBLElBQzlFO0FBQ0EsVUFBTTtBQUFBLEVBQ1I7QUFFQSxTQUFPLEVBQUUsV0FBVyxXQUFXLGlCQUFpQjtBQUNsRDtBQVNBLGVBQXNCLGFBQWEsUUFBeUM7QUFDMUUsUUFBTSxRQUFRLFVBQVUsUUFBUSxPQUFPLFNBQVM7QUFDaEQsUUFBTSxRQUFRLFVBQVUsVUFBVTtBQUNwQztBQU9BLFNBQVMsa0JBQTBCO0FBQ2pDLE1BQUksTUFBTSxRQUFRLElBQUk7QUFHdEIsU0FBTyxNQUFNO0FBQ1gsWUFBSSwrQkFBVyx1QkFBSyxLQUFLLGNBQWMsQ0FBQyxHQUFHO0FBQ3pDLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxhQUFTLHVCQUFLLEtBQUssSUFBSTtBQUM3QixRQUFJLFdBQVcsS0FBSztBQUNsQixZQUFNLElBQUksTUFBTSxzREFBc0Q7QUFBQSxJQUN4RTtBQUNBLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFXQSxlQUFlLGdCQUFnQixhQUFzQztBQUNuRSxRQUFNLGNBQVUsdUJBQUssYUFBYSxRQUFRO0FBQzFDLFFBQU0sZ0JBQVksdUJBQUssYUFBYSxVQUFVO0FBQzlDLFFBQU0sZ0JBQVksdUJBQUssU0FBUyxPQUFPO0FBQ3ZDLFFBQU0sa0JBQWMsdUJBQUssV0FBVyxPQUFPO0FBQzNDLFFBQU0sY0FBVSwyQkFBVyxTQUFTLElBQUksVUFBTSxzQkFBSyxTQUFTLElBQUk7QUFDaEUsUUFBTSxnQkFBWSwyQkFBVyxXQUFXLElBQUksVUFBTSxzQkFBSyxXQUFXLElBQUk7QUFFdEUsTUFBSSxXQUFXLFdBQVc7QUFDeEIsV0FBTyxRQUFRLFFBQVEsVUFBVSxRQUFRLFVBQVU7QUFBQSxFQUNyRDtBQUVBLE1BQUksU0FBUztBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxXQUFXO0FBQ2IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLElBQUksTUFBTSw2REFBNkQ7QUFDL0U7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -21,12 +21,24 @@ __export(log_exports, {
21
21
  log: () => log
22
22
  });
23
23
  module.exports = __toCommonJS(log_exports);
24
+ const DATE_COMPONENT_PAD_LENGTH = 2;
25
+ const MILLISECOND_PAD_LENGTH = 3;
24
26
  function log(message) {
25
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
27
+ const timestamp = formatLocalTimestamp(/* @__PURE__ */ new Date());
26
28
  console.warn(`[${timestamp}] ${message}`);
27
29
  }
30
+ function formatLocalTimestamp(date) {
31
+ const year = String(date.getFullYear());
32
+ const month = String(date.getMonth() + 1).padStart(DATE_COMPONENT_PAD_LENGTH, "0");
33
+ const day = String(date.getDate()).padStart(DATE_COMPONENT_PAD_LENGTH, "0");
34
+ const hours = String(date.getHours()).padStart(DATE_COMPONENT_PAD_LENGTH, "0");
35
+ const minutes = String(date.getMinutes()).padStart(DATE_COMPONENT_PAD_LENGTH, "0");
36
+ const seconds = String(date.getSeconds()).padStart(DATE_COMPONENT_PAD_LENGTH, "0");
37
+ const milliseconds = String(date.getMilliseconds()).padStart(MILLISECOND_PAD_LENGTH, "0");
38
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
39
+ }
28
40
  // Annotate the CommonJS export names for ESM import in node:
29
41
  0 && (module.exports = {
30
42
  log
31
43
  });
32
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xvZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVybmFsIGxvZ2dpbmcgaGVscGVyIHRoYXQgcHJlcGVuZHMgSVNPIHRpbWVzdGFtcHMgdG8gaW50ZWdyYXRpb24tc2V0dXAgbWVzc2FnZXMuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFRoaW4gbG9nZ2luZyB3cmFwcGVyLCBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLiAqL1xuXG4vKipcbiAqIExvZ3MgYSB0aW1lc3RhbXBlZCBtZXNzYWdlIHRvIHN0ZGVyciB2aWEgYGNvbnNvbGUud2FybmAuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBsb2cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgY29uc29sZS53YXJuKGBbJHt0aW1lc3RhbXB9XSAke21lc3NhZ2V9YCk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYU8sU0FBUyxJQUFJLFNBQXVCO0FBQ3pDLFFBQU0sYUFBWSxvQkFBSSxLQUFLLEdBQUUsWUFBWTtBQUN6QyxVQUFRLEtBQUssSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO0FBQzFDOyIsCiAgIm5hbWVzIjogW10KfQo=
44
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xvZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVybmFsIGxvZ2dpbmcgaGVscGVyIHRoYXQgcHJlcGVuZHMgbG9jYWwtdGltZXpvbmUgdGltZXN0YW1wcyB0byBpbnRlZ3JhdGlvbi1zZXR1cCBtZXNzYWdlcy5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gVGhpbiBsb2dnaW5nIHdyYXBwZXIsIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMuICovXG5cbmNvbnN0IERBVEVfQ09NUE9ORU5UX1BBRF9MRU5HVEggPSAyO1xuY29uc3QgTUlMTElTRUNPTkRfUEFEX0xFTkdUSCA9IDM7XG5cbi8qKlxuICogTG9ncyBhIHRpbWVzdGFtcGVkIG1lc3NhZ2UgdG8gc3RkZXJyIHZpYSBgY29uc29sZS53YXJuYC5cbiAqXG4gKiBVc2VzIGxvY2FsIHRpbWV6b25lIGZvciByZWFkYWJpbGl0eS5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGxvZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdGltZXN0YW1wID0gZm9ybWF0TG9jYWxUaW1lc3RhbXAobmV3IERhdGUoKSk7XG4gIGNvbnNvbGUud2FybihgWyR7dGltZXN0YW1wfV0gJHttZXNzYWdlfWApO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBkYXRlIGFzIGEgbG9jYWwtdGltZXpvbmUgdGltZXN0YW1wIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIGxpa2UgYDIwMjYtMDQtMjQgMTY6NDE6MzEuNjA5YC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0TG9jYWxUaW1lc3RhbXAoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gIGNvbnN0IHllYXIgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoREFURV9DT01QT05FTlRfUEFEX0xFTkdUSCwgJzAnKTtcbiAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydChEQVRFX0NPTVBPTkVOVF9QQURfTEVOR1RILCAnMCcpO1xuICBjb25zdCBob3VycyA9IFN0cmluZyhkYXRlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KERBVEVfQ09NUE9ORU5UX1BBRF9MRU5HVEgsICcwJyk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBTdHJpbmcoZGF0ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KERBVEVfQ09NUE9ORU5UX1BBRF9MRU5HVEgsICcwJyk7XG4gIGNvbnN0IHNlY29uZHMgPSBTdHJpbmcoZGF0ZS5nZXRTZWNvbmRzKCkpLnBhZFN0YXJ0KERBVEVfQ09NUE9ORU5UX1BBRF9MRU5HVEgsICcwJyk7XG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IFN0cmluZyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKS5wYWRTdGFydChNSUxMSVNFQ09ORF9QQURfTEVOR1RILCAnMCcpO1xuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aG91cnN9OiR7bWludXRlc306JHtzZWNvbmRzfS4ke21pbGxpc2Vjb25kc31gO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0seUJBQXlCO0FBU3hCLFNBQVMsSUFBSSxTQUF1QjtBQUN6QyxRQUFNLFlBQVkscUJBQXFCLG9CQUFJLEtBQUssQ0FBQztBQUNqRCxVQUFRLEtBQUssSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO0FBQzFDO0FBUUEsU0FBUyxxQkFBcUIsTUFBb0I7QUFDaEQsUUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLENBQUM7QUFDdEMsUUFBTSxRQUFRLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxFQUFFLFNBQVMsMkJBQTJCLEdBQUc7QUFDakYsUUFBTSxNQUFNLE9BQU8sS0FBSyxRQUFRLENBQUMsRUFBRSxTQUFTLDJCQUEyQixHQUFHO0FBQzFFLFFBQU0sUUFBUSxPQUFPLEtBQUssU0FBUyxDQUFDLEVBQUUsU0FBUywyQkFBMkIsR0FBRztBQUM3RSxRQUFNLFVBQVUsT0FBTyxLQUFLLFdBQVcsQ0FBQyxFQUFFLFNBQVMsMkJBQTJCLEdBQUc7QUFDakYsUUFBTSxVQUFVLE9BQU8sS0FBSyxXQUFXLENBQUMsRUFBRSxTQUFTLDJCQUEyQixHQUFHO0FBQ2pGLFFBQU0sZUFBZSxPQUFPLEtBQUssZ0JBQWdCLENBQUMsRUFBRSxTQUFTLHdCQUF3QixHQUFHO0FBQ3hGLFNBQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxZQUFZO0FBQy9FOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -1,11 +1,13 @@
1
1
  /**
2
2
  * @file
3
3
  *
4
- * Internal logging helper that prepends ISO timestamps to integration-setup messages.
4
+ * Internal logging helper that prepends local-timezone timestamps to integration-setup messages.
5
5
  */
6
6
  /**
7
7
  * Logs a timestamped message to stderr via `console.warn`.
8
8
  *
9
+ * Uses local timezone for readability.
10
+ *
9
11
  * @param message - The message to log.
10
12
  */
11
13
  export declare function log(message: string): void;
@@ -34,6 +34,8 @@ __export(transport_factory_exports, {
34
34
  module.exports = __toCommonJS(transport_factory_exports);
35
35
  var import_node_child_process = require("node:child_process");
36
36
  var import_node_http = __toESM(require("node:http"), 1);
37
+ var import_node_path = require("node:path");
38
+ var import_node_process = __toESM(require("node:process"), 1);
37
39
  var import_webdriverio = require("webdriverio");
38
40
  var import_log = require("./log.cjs");
39
41
  var import_transport_appium = require("./transport-appium.cjs");
@@ -41,13 +43,18 @@ var import_transport_desktop_cdp = require("./transport-desktop-cdp.cjs");
41
43
  var import_transport_desktop_cli = require("./transport-desktop-cli.cjs");
42
44
  const APP_PACKAGE = "md.obsidian";
43
45
  const APP_ACTIVITY = `${APP_PACKAGE}.MainActivity`;
46
+ const ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS = 5e3;
44
47
  const APPIUM_CONNECTION_RETRY_COUNT = 1;
45
- const APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 1e4;
48
+ const APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 6e4;
46
49
  const APPIUM_PREFLIGHT_TIMEOUT_IN_MILLISECONDS = 5e3;
47
50
  const APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS = 500;
48
51
  const APPIUM_START_TIMEOUT_IN_MILLISECONDS = 6e4;
49
52
  const CDP_DEFAULT_PORT = 8315;
50
53
  const COMMAND_TIMEOUT_IN_MILLISECONDS = 300;
54
+ const EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS = 2e3;
55
+ const EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS = 12e4;
56
+ const KEYCODE_MENU = 82;
57
+ const KEYCODE_WAKEUP = 224;
51
58
  const SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS = 3e4;
52
59
  let cachedTransport;
53
60
  async function createTransportFromOptions(options) {
@@ -98,6 +105,23 @@ function checkAppiumReachable(url) {
98
105
  });
99
106
  });
100
107
  }
108
+ async function checkDeviceConnected(deviceId) {
109
+ const output = await new Promise((resolve, reject) => {
110
+ (0, import_node_child_process.execFile)("adb", ["devices"], { timeout: ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS }, (error, stdout, stderr) => {
111
+ if (error) {
112
+ reject(new Error(`Failed to run 'adb devices': ${error.message}. Is ADB installed and in PATH?`));
113
+ return;
114
+ }
115
+ if (stderr) {
116
+ (0, import_log.log)(`[transport-factory] ADB stderr: ${stderr.trim()}`);
117
+ }
118
+ resolve(stdout);
119
+ });
120
+ });
121
+ const lines = output.split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
122
+ const deviceLine = lines.find((line) => line.startsWith(deviceId));
123
+ return deviceLine?.includes(" device") ?? false;
124
+ }
101
125
  async function createAppiumTransport(options) {
102
126
  const url = new URL(options.appiumUrl);
103
127
  const port = Number(url.port);
@@ -105,65 +129,139 @@ async function createAppiumTransport(options) {
105
129
  throw new Error(`Invalid port in appiumUrl: ${url.port}`);
106
130
  }
107
131
  const appId = options.appId ?? APP_PACKAGE;
108
- (0, import_log.log)(`[transport-factory] Checking Appium server at ${options.appiumUrl}...`);
109
132
  let appiumProcess;
133
+ let emulatorProcess;
134
+ try {
135
+ [appiumProcess, emulatorProcess] = await startAppiumAndEmulator({
136
+ appiumUrl: url,
137
+ avdName: options.avdName,
138
+ deviceId: options.deviceId,
139
+ port,
140
+ shouldAutoStartAppium: options.shouldAutoStartAppium
141
+ });
142
+ (0, import_log.log)(`[transport-factory] Connecting to Appium (device=${options.deviceId}, app=${appId})...`);
143
+ const browser = await (0, import_webdriverio.remote)({
144
+ capabilities: {
145
+ "appium:appActivity": APP_ACTIVITY,
146
+ "appium:appPackage": appId,
147
+ "appium:autoGrantPermissions": true,
148
+ "appium:automationName": "UiAutomator2",
149
+ "appium:newCommandTimeout": COMMAND_TIMEOUT_IN_MILLISECONDS,
150
+ "appium:noReset": true,
151
+ "appium:settings": {
152
+ "appium:chromedriverAutodownload": true
153
+ },
154
+ "appium:skipServerInstallation": true,
155
+ "appium:udid": options.deviceId,
156
+ "appium:uiautomator2ServerLaunchTimeout": SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS,
157
+ "platformName": "Android"
158
+ },
159
+ connectionRetryCount: APPIUM_CONNECTION_RETRY_COUNT,
160
+ connectionRetryTimeout: APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS,
161
+ hostname: url.hostname,
162
+ path: url.pathname,
163
+ port
164
+ });
165
+ (0, import_log.log)("[transport-factory] Appium session established.");
166
+ const transport = new import_transport_appium.AppiumTransport({
167
+ appId,
168
+ browser,
169
+ platform: "android",
170
+ ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath }
171
+ });
172
+ const originalDispose = transport.dispose.bind(transport);
173
+ transport.dispose = async () => {
174
+ await originalDispose();
175
+ if (appiumProcess) {
176
+ appiumProcess.kill();
177
+ (0, import_log.log)("[transport-factory] Auto-started Appium server stopped.");
178
+ }
179
+ if (emulatorProcess) {
180
+ emulatorProcess.kill();
181
+ (0, import_log.log)("[transport-factory] Auto-started emulator stopped.");
182
+ }
183
+ };
184
+ return transport;
185
+ } catch (error) {
186
+ if (appiumProcess) {
187
+ appiumProcess.kill();
188
+ (0, import_log.log)("[transport-factory] Killed auto-started Appium server after connection failure.");
189
+ }
190
+ if (emulatorProcess) {
191
+ emulatorProcess.kill();
192
+ (0, import_log.log)("[transport-factory] Killed auto-started emulator after connection failure.");
193
+ }
194
+ throw error;
195
+ }
196
+ }
197
+ async function ensureDeviceConnected(params) {
198
+ const { avdName, deviceId } = params;
199
+ (0, import_log.log)(`[transport-factory] Checking device ${deviceId} is connected via ADB...`);
200
+ if (await checkDeviceConnected(deviceId)) {
201
+ (0, import_log.log)(`[transport-factory] Device ${deviceId} is connected.`);
202
+ return void 0;
203
+ }
204
+ if (!avdName) {
205
+ throw new Error(
206
+ `Device "${deviceId}" is not connected. Start the emulator before running integration tests, or set avdName in transport options to auto-start it.`
207
+ );
208
+ }
209
+ (0, import_log.log)(`[transport-factory] Device ${deviceId} not found, starting emulator AVD "${avdName}"...`);
210
+ const emulatorProcess = startEmulator(avdName);
211
+ await waitForDevice(deviceId);
212
+ (0, import_log.log)(`[transport-factory] Emulator "${avdName}" started, device ${deviceId} is connected.`);
213
+ return emulatorProcess;
214
+ }
215
+ function resolveEmulatorBinary() {
216
+ const sdkRoot = import_node_process.default.env["ANDROID_HOME"] ?? import_node_process.default.env["ANDROID_SDK_ROOT"];
217
+ if (!sdkRoot) {
218
+ throw new Error(
219
+ "Cannot find Android emulator: neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable is set."
220
+ );
221
+ }
222
+ return (0, import_node_path.join)(sdkRoot, "emulator", "emulator");
223
+ }
224
+ async function startAppiumAndEmulator(params) {
225
+ const { appiumUrl, avdName, deviceId, port, shouldAutoStartAppium } = params;
226
+ let needsAppiumStart = false;
227
+ (0, import_log.log)(`[transport-factory] Checking Appium server at ${appiumUrl.href}...`);
110
228
  try {
111
- await checkAppiumReachable(url);
229
+ await checkAppiumReachable(appiumUrl);
112
230
  (0, import_log.log)("[transport-factory] Appium server is reachable.");
113
231
  } catch (error) {
114
- if (options.shouldAutoStartAppium === false) {
232
+ if (shouldAutoStartAppium === false) {
115
233
  throw error;
116
234
  }
235
+ needsAppiumStart = true;
236
+ }
237
+ let appiumProcess;
238
+ if (needsAppiumStart) {
117
239
  (0, import_log.log)(`[transport-factory] Appium not reachable, auto-starting on port ${String(port)}...`);
118
240
  appiumProcess = startAppiumServer(port);
119
- await waitForAppiumReady(url);
120
- (0, import_log.log)("[transport-factory] Auto-started Appium server is ready.");
121
- }
122
- (0, import_log.log)(`[transport-factory] Connecting to Appium (device=${options.deviceId}, app=${appId})...`);
123
- const browser = await (0, import_webdriverio.remote)({
124
- capabilities: {
125
- "appium:appActivity": APP_ACTIVITY,
126
- "appium:appPackage": appId,
127
- "appium:autoGrantPermissions": true,
128
- "appium:automationName": "UiAutomator2",
129
- "appium:newCommandTimeout": COMMAND_TIMEOUT_IN_MILLISECONDS,
130
- "appium:noReset": true,
131
- "appium:settings": {
132
- "appium:chromedriverAutodownload": true
133
- },
134
- "appium:skipServerInstallation": true,
135
- "appium:udid": options.deviceId,
136
- "appium:uiautomator2ServerLaunchTimeout": SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS,
137
- "platformName": "Android"
138
- },
139
- connectionRetryCount: APPIUM_CONNECTION_RETRY_COUNT,
140
- connectionRetryTimeout: APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS,
141
- hostname: url.hostname,
142
- path: url.pathname,
143
- port
144
- });
145
- (0, import_log.log)("[transport-factory] Appium session established.");
146
- const transport = new import_transport_appium.AppiumTransport({
147
- appId,
148
- browser,
149
- platform: "android",
150
- ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath }
151
- });
152
- if (appiumProcess) {
153
- const originalDispose = transport.dispose.bind(transport);
154
- transport.dispose = async () => {
155
- await originalDispose();
156
- appiumProcess.kill();
157
- (0, import_log.log)("[transport-factory] Auto-started Appium server stopped.");
158
- };
159
241
  }
160
- return transport;
242
+ const [, emulatorProcess] = await Promise.all([
243
+ needsAppiumStart ? waitForAppiumReady(appiumUrl).then(() => {
244
+ (0, import_log.log)("[transport-factory] Auto-started Appium server is ready.");
245
+ }) : Promise.resolve(),
246
+ ensureDeviceConnected({ avdName, deviceId })
247
+ ]);
248
+ return [appiumProcess, emulatorProcess];
161
249
  }
162
250
  function startAppiumServer(port) {
163
251
  const child = (0, import_node_child_process.spawn)(`npx appium --log-timestamp --port ${String(port)}`, {
164
252
  detached: true,
165
253
  shell: true,
166
- stdio: "inherit"
254
+ stdio: ["ignore", "inherit", "inherit"]
255
+ });
256
+ child.unref();
257
+ return child;
258
+ }
259
+ function startEmulator(avdName) {
260
+ const emulatorBinary = resolveEmulatorBinary();
261
+ (0, import_log.log)(`[transport-factory] Running: ${emulatorBinary} -avd ${avdName} -no-snapshot-save`);
262
+ const child = (0, import_node_child_process.spawn)(emulatorBinary, ["-avd", avdName, "-no-snapshot-save"], {
263
+ detached: true,
264
+ stdio: ["ignore", "ignore", "ignore"]
167
265
  });
168
266
  child.unref();
169
267
  return child;
@@ -184,9 +282,82 @@ async function waitForAppiumReady(url) {
184
282
  `Auto-started Appium server did not become ready within ${String(APPIUM_START_TIMEOUT_IN_MILLISECONDS)}ms`
185
283
  );
186
284
  }
285
+ async function waitForBoot(deviceId, deadline) {
286
+ while (Date.now() < deadline) {
287
+ const isBooted = await new Promise((resolve) => {
288
+ (0, import_node_child_process.execFile)(
289
+ "adb",
290
+ ["-s", deviceId, "shell", "getprop", "sys.boot_completed"],
291
+ { timeout: ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS },
292
+ (_error, stdout) => {
293
+ resolve(stdout.trim() === "1");
294
+ }
295
+ );
296
+ });
297
+ if (isBooted) {
298
+ (0, import_log.log)(`[transport-factory] Device ${deviceId} boot completed.`);
299
+ return;
300
+ }
301
+ await new Promise((resolve) => {
302
+ setTimeout(resolve, EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS);
303
+ });
304
+ }
305
+ throw new Error(
306
+ `Device "${deviceId}" connected but did not finish booting within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
307
+ );
308
+ }
309
+ async function waitForDevice(deviceId) {
310
+ const deadline = Date.now() + EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS;
311
+ while (Date.now() < deadline) {
312
+ if (await checkDeviceConnected(deviceId)) {
313
+ (0, import_log.log)(`[transport-factory] Device ${deviceId} appeared in ADB, waiting for boot to complete...`);
314
+ await waitForBoot(deviceId, deadline);
315
+ await wakeScreen(deviceId);
316
+ return;
317
+ }
318
+ await new Promise((resolve) => {
319
+ setTimeout(resolve, EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS);
320
+ });
321
+ }
322
+ throw new Error(
323
+ `Emulator device "${deviceId}" did not appear within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
324
+ );
325
+ }
326
+ async function wakeScreen(deviceId) {
327
+ (0, import_log.log)(`[transport-factory] Waking screen on device ${deviceId}...`);
328
+ await new Promise((resolve, reject) => {
329
+ (0, import_node_child_process.execFile)(
330
+ "adb",
331
+ ["-s", deviceId, "shell", "input", "keyevent", String(KEYCODE_WAKEUP)],
332
+ { timeout: ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS },
333
+ (error) => {
334
+ if (error) {
335
+ reject(new Error(`Failed to wake screen: ${error instanceof Error ? error.message : "unknown error"}`));
336
+ } else {
337
+ resolve();
338
+ }
339
+ }
340
+ );
341
+ });
342
+ await new Promise((resolve, reject) => {
343
+ (0, import_node_child_process.execFile)(
344
+ "adb",
345
+ ["-s", deviceId, "shell", "input", "keyevent", String(KEYCODE_MENU)],
346
+ { timeout: ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS },
347
+ (error) => {
348
+ if (error) {
349
+ reject(new Error(`Failed to dismiss lock screen: ${error instanceof Error ? error.message : "unknown error"}`));
350
+ } else {
351
+ resolve();
352
+ }
353
+ }
354
+ );
355
+ });
356
+ (0, import_log.log)(`[transport-factory] Screen wake complete on device ${deviceId}.`);
357
+ }
187
358
  // Annotate the CommonJS export names for ESM import in node:
188
359
  0 && (module.exports = {
189
360
  createTransportFromOptions,
190
361
  getOrCreateTransport
191
362
  });
192
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gJ3dlYmRyaXZlcmlvJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0uY2pzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHsgRGVza3RvcENsaVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2xpLmNqcyc7XG5cbmNvbnN0IEFQUF9QQUNLQUdFID0gJ21kLm9ic2lkaWFuJztcbmNvbnN0IEFQUF9BQ1RJVklUWSA9IGAke0FQUF9QQUNLQUdFfS5NYWluQWN0aXZpdHlgO1xuY29uc3QgQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQgPSAxO1xuY29uc3QgQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcbmNvbnN0IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBDRFBfREVGQVVMVF9QT1JUID0gODMxNTtcbmNvbnN0IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwMDA7XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jbGknKSB7XG4gICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDbGlUcmFuc3BvcnQgKG5vIG9wdGlvbnMgb3IgdHlwZT1vYnNpZGlhbi1jbGkpJyk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2xpVHJhbnNwb3J0KCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBDcmVhdGluZyBEZXNrdG9wQ2RwVHJhbnNwb3J0IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQgPz8gQ0RQX0RFRkFVTFRfUE9SVCl9KWApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydCh7XG4gICAgICAuLi4ob3B0aW9ucy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgICAuLi4ob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBQb3J0OiBvcHRpb25zLnBvcnQgfSksXG4gICAgICAuLi4ob3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBDcmVhdGluZyBBcHBpdW1UcmFuc3BvcnQgKHVybD0ke29wdGlvbnMuYXBwaXVtVXJsfSwgZGV2aWNlPSR7b3B0aW9ucy5kZXZpY2VJZH0pYCk7XG4gIHJldHVybiBjcmVhdGVBcHBpdW1UcmFuc3BvcnQob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBxdWljayBIVFRQIGNoZWNrIGFnYWluc3QgdGhlIEFwcGl1bSBzZXJ2ZXIncyBzdGF0dXMgZW5kcG9pbnQuXG4gKlxuICogRmFpbHMgZmFzdCAod2l0aGluIHtAbGluayBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTfSkgd2l0aFxuICogYSBjbGVhciBlcnJvciBtZXNzYWdlIGluc3RlYWQgb2YgbGV0dGluZyBXZWJEcml2ZXJJTyByZXRyeSBzaWxlbnRseSBmb3IgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIHBhcnNlZCBBcHBpdW0gVVJMLlxuICovXG5mdW5jdGlvbiBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1c1VybCA9IG5ldyBVUkwoJy9zdGF0dXMnLCB1cmwpO1xuICAgIGNvbnN0IHJlcSA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyB0aW1lb3V0OiBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChyZXMpID0+IHtcbiAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCByZWFjaCBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn06ICR7ZXJyLm1lc3NhZ2V9LiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBcHBpdW1UcmFuc3BvcnQob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8QXBwaXVtVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcG9ydCBpbiBhcHBpdW1Vcmw6ICR7dXJsLnBvcnR9YCk7XG4gIH1cblxuICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHtvcHRpb25zLmFwcGl1bVVybH0uLi5gKTtcbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGF3YWl0IGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChvcHRpb25zLnNob3VsZEF1dG9TdGFydEFwcGl1bSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgIGFwcGl1bVByb2Nlc3MgPSBzdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgICBhd2FpdCB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsKTtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHkuJyk7XG4gIH1cblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ29ubmVjdGluZyB0byBBcHBpdW0gKGRldmljZT0ke29wdGlvbnMuZGV2aWNlSWR9LCBhcHA9JHthcHBJZH0pLi4uYCk7XG4gIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgJ2FwcGl1bTphdXRvR3JhbnRQZXJtaXNzaW9ucyc6IHRydWUsXG4gICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAnYXBwaXVtOnNldHRpbmdzJzoge1xuICAgICAgICAnYXBwaXVtOmNocm9tZWRyaXZlckF1dG9kb3dubG9hZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICAnYXBwaXVtOnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24nOiB0cnVlLFxuICAgICAgJ2FwcGl1bTp1ZGlkJzogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCc6IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgfSxcbiAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQsXG4gICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgcG9ydFxuICB9KTtcblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgIGFwcElkLFxuICAgIGJyb3dzZXIsXG4gICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSlcbiAgfSk7XG5cbiAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICBjb25zdCBvcmlnaW5hbERpc3Bvc2UgPSB0cmFuc3BvcnQuZGlzcG9zZS5iaW5kKHRyYW5zcG9ydCk7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2UgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgIGFwcGl1bVByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIHN0b3BwZWQuJyk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc3BvcnQ7XG59XG5cbi8qKlxuICogU3Bhd25zIGFuIEFwcGl1bSBzZXJ2ZXIgYXMgYSBkZXRhY2hlZCBiYWNrZ3JvdW5kIHByb2Nlc3MuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCB0byBzdGFydCBBcHBpdW0gb24uXG4gKiBAcmV0dXJucyBUaGUgc3Bhd25lZCBjaGlsZCBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggYXBwaXVtIC0tbG9nLXRpbWVzdGFtcCAtLXBvcnQgJHtTdHJpbmcocG9ydCl9YCwge1xuICAgIGRldGFjaGVkOiB0cnVlLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFBvbGxzIHRoZSBBcHBpdW0gc2VydmVyIHVudGlsIGl0IHJlc3BvbmRzIHRvIGAvc3RhdHVzYC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgXG4gICk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEsZ0NBQXNCO0FBQ3RCLHVCQUFpQjtBQUNqQix5QkFBdUI7QUFRdkIsaUJBQW9CO0FBQ3BCLDhCQUFnQztBQUNoQyxtQ0FBb0M7QUFDcEMsbUNBQW9DO0FBRXBDLE1BQU0sY0FBYztBQUNwQixNQUFNLGVBQWUsR0FBRyxXQUFXO0FBQ25DLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sa0RBQWtEO0FBQ3hELE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0sNkNBQTZDO0FBQ25ELE1BQU0sdUNBQXVDO0FBQzdDLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sa0NBQWtDO0FBQ3hDLE1BQU0sd0NBQXdDO0FBRTlDLElBQUk7QUFRSixlQUFzQiwyQkFBMkIsU0FBZ0U7QUFDL0csTUFBSSxDQUFDLFdBQVcsUUFBUSxTQUFTLGdCQUFnQjtBQUMvQyx3QkFBSSxvRkFBb0Y7QUFDeEYsV0FBTyxJQUFJLGlEQUFvQjtBQUFBLEVBQ2pDO0FBRUEsTUFBSSxRQUFRLFNBQVMsZ0JBQWdCO0FBQ25DLHdCQUFJLDBEQUEwRCxRQUFRLFFBQVEsV0FBVyxVQUFVLE9BQU8sUUFBUSxRQUFRLGdCQUFnQixDQUFDLEdBQUc7QUFDOUksV0FBTyxJQUFJLGlEQUFvQjtBQUFBLE1BQzdCLEdBQUksUUFBUSxTQUFTLFVBQWEsRUFBRSxTQUFTLFFBQVEsS0FBSztBQUFBLE1BQzFELEdBQUksUUFBUSxTQUFTLFVBQWEsRUFBRSxTQUFTLFFBQVEsS0FBSztBQUFBLE1BQzFELEdBQUksUUFBUSxpQ0FBaUMsVUFBYSxFQUFFLDhCQUE4QixRQUFRLDZCQUE2QjtBQUFBLElBQ2pJLENBQUM7QUFBQSxFQUNIO0FBRUEsc0JBQUkscURBQXFELFFBQVEsU0FBUyxZQUFZLFFBQVEsUUFBUSxH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
363
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkuY2pzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBhdXRvLXN0YXJ0IGlmIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC4gKi9cbiAgYXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuICovXG4gIGF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIERldmljZSBVRElELiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydCAobm8gb3B0aW9ucyBvciB0eXBlPW9ic2lkaWFuLWNsaSknKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcbiAgcmV0dXJuIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHF1aWNrIEhUVFAgY2hlY2sgYWdhaW5zdCB0aGUgQXBwaXVtIHNlcnZlcidzIHN0YXR1cyBlbmRwb2ludC5cbiAqXG4gKiBGYWlscyBmYXN0ICh3aXRoaW4ge0BsaW5rIEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9KSB3aXRoXG4gKiBhIGNsZWFyIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBsZXR0aW5nIFdlYkRyaXZlcklPIHJldHJ5IHNpbGVudGx5IGZvciBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgcGFyc2VkIEFwcGl1bSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRldmljZSBpcyBjb25uZWN0ZWQgdmlhIEFEQi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgY29uc3QgZGV2aWNlTGluZSA9IGxpbmVzLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChkZXZpY2VJZCkpO1xuICByZXR1cm4gZGV2aWNlTGluZT8uaW5jbHVkZXMoJ1xcdGRldmljZScpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwaXVtVHJhbnNwb3J0KG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPEFwcGl1bVRyYW5zcG9ydD4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICB9XG5cbiAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdID0gYXdhaXQgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgIGRldmljZUlkOiBvcHRpb25zLmRldmljZUlkLFxuICAgICAgcG9ydCxcbiAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW1cbiAgICB9KTtcblxuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7b3B0aW9ucy5kZXZpY2VJZH0sIGFwcD0ke2FwcElkfSkuLi5gKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgJ2FwcGl1bTphdXRvR3JhbnRQZXJtaXNzaW9ucyc6IHRydWUsXG4gICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAgICdhcHBpdW06c2V0dGluZ3MnOiB7XG4gICAgICAgICAgJ2FwcGl1bTpjaHJvbWVkcml2ZXJBdXRvZG93bmxvYWQnOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgICdhcHBpdW06c2tpcFNlcnZlckluc3RhbGxhdGlvbic6IHRydWUsXG4gICAgICAgICdhcHBpdW06dWRpZCc6IG9wdGlvbnMuZGV2aWNlSWQsXG4gICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCc6IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQsXG4gICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICBwb3J0XG4gICAgfSk7XG5cbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCBvcmlnaW5hbERpc3Bvc2UgPSB0cmFuc3BvcnQuZGlzcG9zZS5iaW5kKHRyYW5zcG9ydCk7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2UgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGFwcGl1bVByb2Nlc3Mua2lsbCgpO1xuICAgICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzLmtpbGwoKTtcbiAgICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBlbXVsYXRvciBzdG9wcGVkLicpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdHJhbnNwb3J0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICBhcHBpdW1Qcm9jZXNzLmtpbGwoKTtcbiAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEtpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgY29ubmVjdGVkLCBvcHRpb25hbGx5IGF1dG8tc3RhcnRpbmcgYW5cbiAqIGVtdWxhdG9yIGlmIGFuIEFWRCBuYW1lIGlzIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBEZXZpY2UgYW5kIG9wdGlvbmFsIEFWRCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHBhcmFtcy5hdmROYW1lIC0gQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuXG4gKiBAcGFyYW0gcGFyYW1zLmRldmljZUlkIC0gRGV2aWNlIFVESUQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgZW11bGF0b3IgY2hpbGQgcHJvY2VzcyBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8Q2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWQgfSA9IHBhcmFtcztcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQgdmlhIEFEQi4uLmApO1xuXG4gIGlmIChhd2FpdCBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZCkpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFhdmROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgaXMgbm90IGNvbm5lY3RlZC4gU3RhcnQgdGhlIGVtdWxhdG9yIGJlZm9yZSBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzLGBcbiAgICAgICAgKyAnIG9yIHNldCBhdmROYW1lIGluIHRyYW5zcG9ydCBvcHRpb25zIHRvIGF1dG8tc3RhcnQgaXQuJ1xuICAgICk7XG4gIH1cblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCwgc3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uYCk7XG4gIGNvbnN0IGVtdWxhdG9yUHJvY2VzcyA9IHN0YXJ0RW11bGF0b3IoYXZkTmFtZSk7XG4gIGF3YWl0IHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgcmV0dXJuIGVtdWxhdG9yUHJvY2Vzcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgQW5kcm9pZCBlbXVsYXRvciBiaW5hcnkuXG4gKlxuICogVXNlcyBgQU5EUk9JRF9IT01FYCBvciBgQU5EUk9JRF9TREtfUk9PVGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgc2V0LFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gYGVtdWxhdG9yYCAoYXNzdW1lcyBpdCdzIGluIFBBVEgpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBlbXVsYXRvciBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gIGlmICghc2RrUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG59XG5cbi8qKlxuICogU3RhcnRzIHRoZSBBcHBpdW0gc2VydmVyIGFuZCBlbXVsYXRvciBpbiBwYXJhbGxlbCB3aGVuIGJvdGggbmVlZCBhdXRvLXN0YXJ0aW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBDb25maWd1cmF0aW9uIGZvciBBcHBpdW0gYW5kIGVtdWxhdG9yIHN0YXJ0dXAuXG4gKiBAcmV0dXJucyBBIHR1cGxlIG9mIGBbYXBwaXVtUHJvY2VzcywgZW11bGF0b3JQcm9jZXNzXWAsIGVpdGhlciBvZiB3aGljaCBtYXkgYmUgYHVuZGVmaW5lZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0QXBwaXVtQW5kRW11bGF0b3IocGFyYW1zOiBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUGFyYW1zKTogUHJvbWlzZTxbQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkLCBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWRdPiB7XG4gIGNvbnN0IHsgYXBwaXVtVXJsLCBhdmROYW1lLCBkZXZpY2VJZCwgcG9ydCwgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtIH0gPSBwYXJhbXM7XG5cbiAgbGV0IG5lZWRzQXBwaXVtU3RhcnQgPSBmYWxzZTtcblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ2hlY2tpbmcgQXBwaXVtIHNlcnZlciBhdCAke2FwcGl1bVVybC5ocmVmfS4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IGNoZWNrQXBwaXVtUmVhY2hhYmxlKGFwcGl1bVVybCk7XG4gICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChzaG91bGRBdXRvU3RhcnRBcHBpdW0gPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgbmVlZHNBcHBpdW1TdGFydCA9IHRydWU7XG4gIH1cblxuICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChuZWVkc0FwcGl1bVN0YXJ0KSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgYXBwaXVtUHJvY2VzcyA9IHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQpO1xuICB9XG5cbiAgY29uc3QgWywgZW11bGF0b3JQcm9jZXNzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBuZWVkc0FwcGl1bVN0YXJ0XG4gICAgICA/IHdhaXRGb3JBcHBpdW1SZWFkeShhcHBpdW1VcmwpLnRoZW4oKCkgPT4ge1xuICAgICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHkuJyk7XG4gICAgICB9KVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICBlbnN1cmVEZXZpY2VDb25uZWN0ZWQoeyBhdmROYW1lLCBkZXZpY2VJZCB9KVxuICBdKTtcblxuICByZXR1cm4gW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc107XG59XG5cbi8qKlxuICogU3Bhd25zIGFuIEFwcGl1bSBzZXJ2ZXIgYXMgYSBkZXRhY2hlZCBiYWNrZ3JvdW5kIHByb2Nlc3MuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCB0byBzdGFydCBBcHBpdW0gb24uXG4gKiBAcmV0dXJucyBUaGUgc3Bhd25lZCBjaGlsZCBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggYXBwaXVtIC0tbG9nLXRpbWVzdGFtcCAtLXBvcnQgJHtTdHJpbmcocG9ydCl9YCwge1xuICAgIGRldGFjaGVkOiB0cnVlLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXVxuICB9KTtcblxuICBjaGlsZC51bnJlZigpO1xuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICogU3Bhd25zIGFuIEFuZHJvaWQgZW11bGF0b3IgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3MuXG4gKlxuICogQHBhcmFtIGF2ZE5hbWUgLSBUaGUgQVZEIG5hbWUgdG8gc3RhcnQuXG4gKiBAcmV0dXJucyBUaGUgc3Bhd25lZCBjaGlsZCBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZyk6IENoaWxkUHJvY2VzcyB7XG4gIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gcmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk7XG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBSdW5uaW5nOiAke2VtdWxhdG9yQmluYXJ5fSAtYXZkICR7YXZkTmFtZX0gLW5vLXNuYXBzaG90LXNhdmVgKTtcbiAgY29uc3QgY2hpbGQgPSBzcGF3bihlbXVsYXRvckJpbmFyeSwgWyctYXZkJywgYXZkTmFtZSwgJy1uby1zbmFwc2hvdC1zYXZlJ10sIHtcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddXG4gIH0pO1xuXG4gIGNoaWxkLnVucmVmKCk7XG4gIHJldHVybiBjaGlsZDtcbn1cblxuLyoqXG4gKiBQb2xscyB0aGUgQXBwaXVtIHNlcnZlciB1bnRpbCBpdCByZXNwb25kcyB0byBgL3N0YXR1c2AuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBBcHBpdW0gc2VydmVyIFVSTC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckFwcGl1bVJlYWR5KHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyhBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYFxuICApO1xufVxuXG4vKipcbiAqIFdhaXRzIGZvciB0aGUgZGV2aWNlIHRvIGZpbmlzaCBib290aW5nIGJ5IHBvbGxpbmcgYHN5cy5ib290X2NvbXBsZXRlZGAuXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElELlxuICogQHBhcmFtIGRlYWRsaW5lIC0gQWJzb2x1dGUgdGltZXN0YW1wIGRlYWRsaW5lLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpZiAoaXNCb290ZWQpIHtcbiAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBEZXZpY2UgJHtkZXZpY2VJZH0gYm9vdCBjb21wbGV0ZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgY29ubmVjdGVkIGJ1dCBkaWQgbm90IGZpbmlzaCBib290aW5nIHdpdGhpbiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gXG4gICk7XG59XG5cbi8qKlxuICogUG9sbHMgYGFkYiBkZXZpY2VzYCB1bnRpbCB0aGUgc3BlY2lmaWVkIGRldmljZSBhcHBlYXJzIGluIHRoZSBgZGV2aWNlYCBzdGF0ZS5cbiAqXG4gKiBBbHNvIHdhaXRzIGZvciB0aGUgZGV2aWNlIHRvIGZpbmlzaCBib290aW5nIGJ5IGNoZWNraW5nIGBzeXMuYm9vdF9jb21wbGV0ZWRgLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byB3YWl0IGZvci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckRldmljZShkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChhd2FpdCBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZCkpIHtcbiAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBEZXZpY2UgJHtkZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICBhd2FpdCB3YWl0Rm9yQm9vdChkZXZpY2VJZCwgZGVhZGxpbmUpO1xuICAgICAgYXdhaXQgd2FrZVNjcmVlbihkZXZpY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEVtdWxhdG9yIGRldmljZSBcIiR7ZGV2aWNlSWR9XCIgZGlkIG5vdCBhcHBlYXIgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBXYWtlcyB0aGUgZW11bGF0b3Igc2NyZWVuIGFuZCBkaXNtaXNzZXMgdGhlIGxvY2sgc2NyZWVuLlxuICpcbiAqIEFmdGVyIGJvb3QsIHRoZSBlbXVsYXRvciBzY3JlZW4gbWF5IGJlIG9mZi4gU2VuZHMgYEtFWUNPREVfV0FLRVVQYCB0byB0dXJuXG4gKiBvbiB0aGUgZGlzcGxheSBhbmQgYEtFWUNPREVfTUVOVWAgdG8gZGlzbWlzcyB0aGUgbG9jayBzY3JlZW4uXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElELlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIFdha2luZyBzY3JlZW4gb24gZGV2aWNlICR7ZGV2aWNlSWR9Li4uYCk7XG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGV4ZWNGaWxlKFxuICAgICAgJ2FkYicsXG4gICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhLRVlDT0RFX1dBS0VVUCldLFxuICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHdha2Ugc2NyZWVuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9KTtcblxuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoXG4gICAgICAnYWRiJyxcbiAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgU3RyaW5nKEtFWUNPREVfTUVOVSldLFxuICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGRpc21pc3MgbG9jayBzY3JlZW46ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuXG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEsZ0NBR087QUFDUCx1QkFBaUI7QUFDakIsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQUNwQix5QkFBdUI7QUFRdkIsaUJBQW9CO0FBQ3BCLDhC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