obsidian-integration-testing 12.1.0 → 12.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/lib/cjs/adb.cjs +61 -0
  2. package/dist/lib/cjs/adb.d.cts +61 -0
  3. package/dist/lib/cjs/device-screenshot.cjs +42 -0
  4. package/dist/lib/cjs/device-screenshot.d.cts +36 -0
  5. package/dist/lib/cjs/device-setting-restore.cjs +45 -0
  6. package/dist/lib/cjs/device-setting-restore.d.cts +60 -0
  7. package/dist/lib/cjs/device-settings-command.cjs +49 -0
  8. package/dist/lib/cjs/device-settings-command.d.cts +76 -0
  9. package/dist/lib/cjs/device-settings.cjs +88 -0
  10. package/dist/lib/cjs/device-settings.d.cts +94 -0
  11. package/dist/lib/cjs/emulator-device-id.cjs +32 -0
  12. package/dist/lib/cjs/emulator-device-id.d.cts +49 -0
  13. package/dist/lib/cjs/index.cjs +56 -3
  14. package/dist/lib/cjs/index.d.cts +18 -0
  15. package/dist/lib/cjs/library.cjs +1 -1
  16. package/dist/lib/cjs/mobile-input.cjs +14 -1
  17. package/dist/lib/cjs/mobile-input.d.cts +30 -0
  18. package/dist/lib/cjs/namespace-bootstrap.cjs +9 -1
  19. package/dist/lib/cjs/resolve-emulator-device-id.cjs +54 -0
  20. package/dist/lib/cjs/resolve-emulator-device-id.d.cts +28 -0
  21. package/dist/lib/cjs/soft-keyboard-geometry.cjs +75 -0
  22. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +156 -0
  23. package/dist/lib/cjs/soft-keyboard.cjs +118 -0
  24. package/dist/lib/cjs/soft-keyboard.d.cts +82 -0
  25. package/dist/lib/cjs/transport-appium.cjs +5 -1
  26. package/dist/lib/esm/adb.d.mts +61 -0
  27. package/dist/lib/esm/adb.mjs +35 -0
  28. package/dist/lib/esm/device-screenshot.d.mts +36 -0
  29. package/dist/lib/esm/device-screenshot.mjs +18 -0
  30. package/dist/lib/esm/device-setting-restore.d.mts +60 -0
  31. package/dist/lib/esm/device-setting-restore.mjs +20 -0
  32. package/dist/lib/esm/device-settings-command.d.mts +76 -0
  33. package/dist/lib/esm/device-settings-command.mjs +23 -0
  34. package/dist/lib/esm/device-settings.d.mts +94 -0
  35. package/dist/lib/esm/device-settings.mjs +67 -0
  36. package/dist/lib/esm/emulator-device-id.d.mts +49 -0
  37. package/dist/lib/esm/emulator-device-id.mjs +8 -0
  38. package/dist/lib/esm/index.d.mts +18 -0
  39. package/dist/lib/esm/index.mjs +58 -2
  40. package/dist/lib/esm/library.mjs +1 -1
  41. package/dist/lib/esm/mobile-input.d.mts +30 -0
  42. package/dist/lib/esm/mobile-input.mjs +12 -1
  43. package/dist/lib/esm/namespace-bootstrap.mjs +9 -1
  44. package/dist/lib/esm/resolve-emulator-device-id.d.mts +28 -0
  45. package/dist/lib/esm/resolve-emulator-device-id.mjs +33 -0
  46. package/dist/lib/esm/soft-keyboard-geometry.d.mts +156 -0
  47. package/dist/lib/esm/soft-keyboard-geometry.mjs +47 -0
  48. package/dist/lib/esm/soft-keyboard.d.mts +82 -0
  49. package/dist/lib/esm/soft-keyboard.mjs +91 -0
  50. package/dist/lib/esm/transport-appium.mjs +7 -1
  51. package/package.json +4 -3
@@ -0,0 +1,94 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Reads and writes Android device settings — and wraps the one setting a
5
+ * screenshot suite has to change.
6
+ *
7
+ * The screenshot AVDs are built `hw.keyboard=yes`, so Android suppresses the
8
+ * on-screen keyboard even where the page asks for one. `show_ime_with_hard_keyboard`
9
+ * is what turns it back on. {@link withSoftKeyboardEnabled} flips it, runs the
10
+ * work, and puts the device back exactly as it found it — including restoring a
11
+ * setting that had never been written, which takes a delete rather than a write
12
+ * (see `device-setting-restore`).
13
+ *
14
+ * Every function here shells out, so the whole module is integration-time code;
15
+ * the restore decision and the argument list it depends on are unit-tested in
16
+ * their own modules.
17
+ */
18
+ import type { DeviceSettingNamespace } from './device-settings-command.cjs';
19
+ /**
20
+ * Parameters for {@link deleteDeviceSetting} and {@link readDeviceSetting}.
21
+ */
22
+ export interface DeviceSettingParams {
23
+ /**
24
+ * The device to address.
25
+ */
26
+ readonly deviceId: string;
27
+ /**
28
+ * The setting's name within {@link namespace}, e.g. `show_ime_with_hard_keyboard`.
29
+ */
30
+ readonly name: string;
31
+ /**
32
+ * The settings namespace the name lives in.
33
+ *
34
+ * @default {@link DeviceSettingNamespace.Secure}
35
+ */
36
+ readonly namespace?: DeviceSettingNamespace;
37
+ }
38
+ /**
39
+ * Parameters for {@link withSoftKeyboardEnabled}.
40
+ *
41
+ * @typeParam T - What the wrapped work returns.
42
+ */
43
+ export interface WithSoftKeyboardEnabledParams<T> {
44
+ /**
45
+ * The work to run while the on-screen keyboard is permitted.
46
+ */
47
+ readonly callback: (this: void) => Promise<T>;
48
+ /**
49
+ * The device to address.
50
+ */
51
+ readonly deviceId: string;
52
+ }
53
+ /**
54
+ * Parameters for {@link writeDeviceSetting}.
55
+ */
56
+ export interface WriteDeviceSettingParams extends DeviceSettingParams {
57
+ /**
58
+ * The value to write.
59
+ */
60
+ readonly value: string;
61
+ }
62
+ /**
63
+ * Clears a device setting, returning it to never-having-been-written.
64
+ *
65
+ * @param params - The device, the setting and its namespace.
66
+ * @returns A {@link Promise} that resolves once the setting is gone.
67
+ */
68
+ export declare function deleteDeviceSetting(params: DeviceSettingParams): Promise<void>;
69
+ /**
70
+ * Reads a device setting.
71
+ *
72
+ * @param params - The device, the setting and its namespace.
73
+ * @returns A {@link Promise} that resolves to the setting's value, or the literal `null` when it has never
74
+ * been written.
75
+ */
76
+ export declare function readDeviceSetting(params: DeviceSettingParams): Promise<string>;
77
+ /**
78
+ * Permits the on-screen keyboard for the duration of a callback, then restores the device exactly.
79
+ *
80
+ * The restore runs whether the callback succeeded or threw — a suite that dies mid-capture must not leave
81
+ * the device configured differently than it found it.
82
+ *
83
+ * @typeParam T - What the wrapped work returns.
84
+ * @param params - The device and the work to run.
85
+ * @returns A {@link Promise} that resolves to whatever the callback returned.
86
+ */
87
+ export declare function withSoftKeyboardEnabled<T>(params: WithSoftKeyboardEnabledParams<T>): Promise<T>;
88
+ /**
89
+ * Writes a device setting.
90
+ *
91
+ * @param params - The device, the setting, its namespace and the value to write.
92
+ * @returns A {@link Promise} that resolves once the setting is written.
93
+ */
94
+ export declare function writeDeviceSetting(params: WriteDeviceSettingParams): Promise<void>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var emulator_device_id_exports = {};
20
+ __export(emulator_device_id_exports, {
21
+ selectEmulatorDeviceId: () => selectEmulatorDeviceId
22
+ });
23
+ module.exports = __toCommonJS(emulator_device_id_exports);
24
+ function selectEmulatorDeviceId(params) {
25
+ const match = params.candidates.find((candidate) => candidate.avdName === params.avdName);
26
+ return match ? match.deviceId : null;
27
+ }
28
+ // Annotate the CommonJS export names for ESM import in node:
29
+ 0 && (module.exports = {
30
+ selectEmulatorDeviceId
31
+ });
32
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWRldmljZS1pZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFBpY2tzIHRoZSBydW5uaW5nIGVtdWxhdG9yIHRoYXQgYmVsb25ncyB0byBhIG5hbWVkIEFWRC5cbiAqXG4gKiBBIGNhcHR1cmUgc3VpdGUgbXVzdCBuZXZlciB0YWtlIFwidGhlIGZpcnN0IGRldmljZSBgYWRiIGRldmljZXNgIGxpc3RzXCIuIFR3b1xuICogdGhpbmdzIHJvdXRpbmVseSBtYWtlIHRoYXQgdGhlIHdyb25nIGRldmljZSBvbiB0aGlzIGZsZWV0OiBhIHBoeXNpY2FsIHBob25lIGlzXG4gKiBvZnRlbiBwbHVnZ2VkIGludG8gdGhlIHNhbWUgbWFjaGluZSwgYW5kIHRoZSBoYXJuZXNzJ3Mgb3duIGBvYnNpZGlhbl90ZXN0YCBBVkRcbiAqIHJ1bnMgYXQgYSBkaWZmZXJlbnQgZ2VvbWV0cnkgdGhhbiB0aGUgYG9ic2lkaWFuX3NjcmVlbnNob3RzYCBBVkQgc2l6ZWQgdG8gdGhlXG4gKiBzdG9yZSdzIGZyYW1lLiBQaWNraW5nIGJ5IHBvc2l0aW9uIHNpbGVudGx5IHBob3RvZ3JhcGhzIHRoZSB3cm9uZyBzY3JlZW4gYXRcbiAqIHRoZSB3cm9uZyBzaXplLCBhbmQgdGhlIGRpbWVuc2lvbiBhc3NlcnRpb24gdGhhdCB3b3VsZCBoYXZlIGNhdWdodCBpdCBmaXJlc1xuICogc2V2ZXJhbCBtaW51dGVzIGxhdGVyLCBhZnRlciB0aGUgcnVuLlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgYGFkYmAgcm91bmQtdHJpcHMgdGhhdCBnYXRoZXIgdGhlIEFWRCBuYW1lcyBsaXZlIGluXG4gKiBgcmVzb2x2ZS1lbXVsYXRvci1kZXZpY2UtaWRgLlxuICovXG5cbi8qKlxuICogT25lIHJ1bm5pbmcgZW11bGF0b3IsIHBhaXJlZCB3aXRoIHRoZSBBVkQgaXQgd2FzIHN0YXJ0ZWQgZnJvbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXVsYXRvckRldmljZUNhbmRpZGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgQVZEIG5hbWUgdGhlIGVtdWxhdG9yIHJlcG9ydHMsIGUuZy4gYG9ic2lkaWFuX3NjcmVlbnNob3RzYC5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElELCBlLmcuIGBlbXVsYXRvci01NTU0YC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNlbGVjdEVtdWxhdG9yRGV2aWNlSWR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdEVtdWxhdG9yRGV2aWNlSWRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIEFWRCBuYW1lIHRvIG1hdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFdmVyeSBydW5uaW5nIGVtdWxhdG9yLCB3aXRoIHRoZSBBVkQgZWFjaCB3YXMgc3RhcnRlZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuZGlkYXRlczogcmVhZG9ubHkgRW11bGF0b3JEZXZpY2VDYW5kaWRhdGVbXTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgZW11bGF0b3Igc3RhcnRlZCBmcm9tIGEgbmFtZWQgQVZELlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQVZEIHRvIG1hdGNoIGFuZCB0aGUgcnVubmluZyBlbXVsYXRvcnMgdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBkZXZpY2UgVURJRCwgb3IgYG51bGxgIHdoZW4gbm8gcnVubmluZyBlbXVsYXRvciBjYXJyaWVzIHRoYXQgQVZEIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RFbXVsYXRvckRldmljZUlkKHBhcmFtczogU2VsZWN0RW11bGF0b3JEZXZpY2VJZFBhcmFtcyk6IG51bGwgfCBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IHBhcmFtcy5jYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmF2ZE5hbWUgPT09IHBhcmFtcy5hdmROYW1lKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2guZGV2aWNlSWQgOiBudWxsO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXFETyxTQUFTLHVCQUF1QixRQUFxRDtBQUMxRixRQUFNLFFBQVEsT0FBTyxXQUFXLEtBQUssQ0FBQyxjQUFjLFVBQVUsWUFBWSxPQUFPLE9BQU87QUFDeEYsU0FBTyxRQUFRLE1BQU0sV0FBVztBQUNsQzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Picks the running emulator that belongs to a named AVD.
5
+ *
6
+ * A capture suite must never take "the first device `adb devices` lists". Two
7
+ * things routinely make that the wrong device on this fleet: a physical phone is
8
+ * often plugged into the same machine, and the harness's own `obsidian_test` AVD
9
+ * runs at a different geometry than the `obsidian_screenshots` AVD sized to the
10
+ * store's frame. Picking by position silently photographs the wrong screen at
11
+ * the wrong size, and the dimension assertion that would have caught it fires
12
+ * several minutes later, after the run.
13
+ *
14
+ * Pure and unit-tested; the `adb` round-trips that gather the AVD names live in
15
+ * `resolve-emulator-device-id`.
16
+ */
17
+ /**
18
+ * One running emulator, paired with the AVD it was started from.
19
+ */
20
+ export interface EmulatorDeviceCandidate {
21
+ /**
22
+ * The AVD name the emulator reports, e.g. `obsidian_screenshots`.
23
+ */
24
+ readonly avdName: string;
25
+ /**
26
+ * The device UDID, e.g. `emulator-5554`.
27
+ */
28
+ readonly deviceId: string;
29
+ }
30
+ /**
31
+ * Parameters for {@link selectEmulatorDeviceId}.
32
+ */
33
+ export interface SelectEmulatorDeviceIdParams {
34
+ /**
35
+ * The AVD name to match.
36
+ */
37
+ readonly avdName: string;
38
+ /**
39
+ * Every running emulator, with the AVD each was started from.
40
+ */
41
+ readonly candidates: readonly EmulatorDeviceCandidate[];
42
+ }
43
+ /**
44
+ * Picks the emulator started from a named AVD.
45
+ *
46
+ * @param params - The AVD to match and the running emulators to match against.
47
+ * @returns The matching device UDID, or `null` when no running emulator carries that AVD name.
48
+ */
49
+ export declare function selectEmulatorDeviceId(params: SelectEmulatorDeviceIdParams): null | string;
@@ -23,9 +23,13 @@ __export(index_exports, {
23
23
  ConfigDirectoryFallbackError: () => import_config_directory_fallback_error.ConfigDirectoryFallbackError,
24
24
  ContextId: () => import_context_id.ContextId,
25
25
  DEFAULT_CONFIG_DIRECTORY: () => import_config_directory.DEFAULT_CONFIG_DIRECTORY,
26
+ DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS: () => import_soft_keyboard_geometry.DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS,
26
27
  DEFAULT_OBSIDIAN_VERSION_SPECS: () => import_version_matrix.DEFAULT_OBSIDIAN_VERSION_SPECS,
27
28
  DesktopCdpTransport: () => import_transport_desktop_cdp.DesktopCdpTransport,
28
29
  DesktopOnlyPluginSkipError: () => import_desktop_only_plugin_skip_error.DesktopOnlyPluginSkipError,
30
+ DeviceSettingNamespace: () => import_device_settings_command.DeviceSettingNamespace,
31
+ DeviceSettingRestoreKind: () => import_device_setting_restore.DeviceSettingRestoreKind,
32
+ DeviceSettingVerb: () => import_device_settings_command.DeviceSettingVerb,
29
33
  IncompatibleInstallerVersionError: () => import_incompatible_installer_version_error.IncompatibleInstallerVersionError,
30
34
  IntegrationSetupFailedError: () => import_integration_setup_failed_error.IntegrationSetupFailedError,
31
35
  OwnedInstanceExitedError: () => import_owned_instance_exited_error.OwnedInstanceExitedError,
@@ -38,14 +42,19 @@ __export(index_exports, {
38
42
  buildDemoVaultPopulate: () => import_demo_vault_populate.buildDemoVaultPopulate,
39
43
  buildDemoVaultPopulateAsync: () => import_demo_vault_bootstrap.buildDemoVaultPopulateAsync,
40
44
  buildDeviceMetricsOverride: () => import_capture_screenshot.buildDeviceMetricsOverride,
45
+ buildDeviceSettingsCommandArguments: () => import_device_settings_command.buildDeviceSettingsCommandArguments,
41
46
  buildLabelSvg: () => import_label_screenshot.buildLabelSvg,
47
+ buildSoftKeyboardDiagnosticMessage: () => import_soft_keyboard_geometry.buildSoftKeyboardDiagnosticMessage,
48
+ captureDeviceScreenshot: () => import_device_screenshot.captureDeviceScreenshot,
42
49
  captureObsidianScreenshot: () => import_capture_obsidian_screenshot.captureObsidianScreenshot,
43
50
  checkIsMobileTransport: () => import_transport_options.checkIsMobileTransport,
51
+ checkIsSoftKeyboardUp: () => import_soft_keyboard_geometry.checkIsSoftKeyboardUp,
44
52
  computeFitToCanvas: () => import_fit_screenshot.computeFitToCanvas,
45
53
  computeLabelBand: () => import_label_screenshot.computeLabelBand,
46
54
  connectToCdp: () => import_connect_to_cdp.connectToCdp,
47
55
  createTransportFromOptions: () => import_transport_factory.createTransportFromOptions,
48
56
  decodeBase64Png: () => import_capture_screenshot.decodeBase64Png,
57
+ deleteDeviceSetting: () => import_device_settings.deleteDeviceSetting,
49
58
  escapeSvgText: () => import_label_screenshot.escapeSvgText,
50
59
  evalInObsidian: () => import_eval_in_obsidian.evalInObsidian,
51
60
  fitScreenshotToCanvas: () => import_fit_screenshot.fitScreenshotToCanvas,
@@ -53,22 +62,36 @@ __export(index_exports, {
53
62
  isPng: () => import_capture_screenshot.isPng,
54
63
  labelScreenshot: () => import_label_screenshot.labelScreenshot,
55
64
  openObsidianSettingsTab: () => import_open_obsidian_settings_tab.openObsidianSettingsTab,
65
+ parseInputMethodState: () => import_soft_keyboard_geometry.parseInputMethodState,
56
66
  pollInObsidian: () => import_poll_in_obsidian.pollInObsidian,
67
+ raiseSoftKeyboard: () => import_soft_keyboard.raiseSoftKeyboard,
57
68
  readDemoVaultTree: () => import_demo_vault_tree.readDemoVaultTree,
69
+ readDeviceSetting: () => import_device_settings.readDeviceSetting,
58
70
  readPngDimensions: () => import_capture_screenshot.readPngDimensions,
59
71
  registerLibResolver: () => import_lib_registry.registerLibResolver,
60
72
  registerVault: () => import_vault_registry.registerVault,
61
73
  resolveAsarFallback: () => import_asar_fallback_detection.resolveAsarFallback,
74
+ resolveDeviceSettingRestore: () => import_device_setting_restore.resolveDeviceSettingRestore,
62
75
  resolveElectronCompatibility: () => import_electron_compatibility.resolveElectronCompatibility,
76
+ resolveEmulatorDeviceId: () => import_resolve_emulator_device_id.resolveEmulatorDeviceId,
63
77
  resolveInstallerCompatibility: () => import_installer_compatibility.resolveInstallerCompatibility,
64
78
  resolveMissingInjectedPlugins: () => import_demo_vault_populate.resolveMissingInjectedPlugins,
79
+ resolveSoftKeyboardTapPoints: () => import_soft_keyboard_geometry.resolveSoftKeyboardTapPoints,
80
+ runAdbBinary: () => import_adb.runAdbBinary,
81
+ runAdbText: () => import_adb.runAdbText,
82
+ runAdbTextWithoutDevice: () => import_adb.runAdbTextWithoutDevice,
65
83
  runObsidianVersionMatrix: () => import_run_version_matrix.runObsidianVersionMatrix,
84
+ selectEmulatorDeviceId: () => import_emulator_device_id.selectEmulatorDeviceId,
66
85
  setSetupErrorResolver: () => import_context_provider.setSetupErrorResolver,
67
86
  setTransportOptionsResolver: () => import_context_provider.setTransportOptionsResolver,
68
87
  setVaultPathResolver: () => import_context_provider.setVaultPathResolver,
69
- unregisterVault: () => import_vault_registry.unregisterVault
88
+ tapDevice: () => import_soft_keyboard.tapDevice,
89
+ unregisterVault: () => import_vault_registry.unregisterVault,
90
+ withSoftKeyboardEnabled: () => import_device_settings.withSoftKeyboardEnabled,
91
+ writeDeviceSetting: () => import_device_settings.writeDeviceSetting
70
92
  });
71
93
  module.exports = __toCommonJS(index_exports);
94
+ var import_adb = require("./adb.cjs");
72
95
  var import_asar_fallback_detection = require("./asar-fallback-detection.cjs");
73
96
  var import_capture_obsidian_screenshot = require("./capture-obsidian-screenshot.cjs");
74
97
  var import_capture_screenshot = require("./capture-screenshot.cjs");
@@ -81,7 +104,12 @@ var import_demo_vault_bootstrap = require("./demo-vault-bootstrap.cjs");
81
104
  var import_demo_vault_populate = require("./demo-vault-populate.cjs");
82
105
  var import_demo_vault_tree = require("./demo-vault-tree.cjs");
83
106
  var import_desktop_only_plugin_skip_error = require("./desktop-only-plugin-skip-error.cjs");
107
+ var import_device_screenshot = require("./device-screenshot.cjs");
108
+ var import_device_setting_restore = require("./device-setting-restore.cjs");
109
+ var import_device_settings_command = require("./device-settings-command.cjs");
110
+ var import_device_settings = require("./device-settings.cjs");
84
111
  var import_electron_compatibility = require("./electron-compatibility.cjs");
112
+ var import_emulator_device_id = require("./emulator-device-id.cjs");
85
113
  var import_eval_in_obsidian = require("./eval-in-obsidian.cjs");
86
114
  var import_fit_screenshot = require("./fit-screenshot.cjs");
87
115
  var import_incompatible_installer_version_error = require("./incompatible-installer-version-error.cjs");
@@ -95,8 +123,11 @@ var import_open_obsidian_settings_tab = require("./open-obsidian-settings-tab.cj
95
123
  var import_owned_instance_exited_error = require("./owned-instance-exited-error.cjs");
96
124
  var import_poll_in_obsidian = require("./poll-in-obsidian.cjs");
97
125
  var import_renderer_failed_to_initialize_error = require("./renderer-failed-to-initialize-error.cjs");
126
+ var import_resolve_emulator_device_id = require("./resolve-emulator-device-id.cjs");
98
127
  var import_run_version_matrix = require("./run-version-matrix.cjs");
99
128
  var import_silent_asar_fallback_error = require("./silent-asar-fallback-error.cjs");
129
+ var import_soft_keyboard_geometry = require("./soft-keyboard-geometry.cjs");
130
+ var import_soft_keyboard = require("./soft-keyboard.cjs");
100
131
  var import_temporary_vault = require("./temporary-vault.cjs");
101
132
  var import_transport_appium = require("./transport-appium.cjs");
102
133
  var import_transport_desktop_cdp = require("./transport-desktop-cdp.cjs");
@@ -111,9 +142,13 @@ var import_version_matrix = require("./version-matrix.cjs");
111
142
  ConfigDirectoryFallbackError,
112
143
  ContextId,
113
144
  DEFAULT_CONFIG_DIRECTORY,
145
+ DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS,
114
146
  DEFAULT_OBSIDIAN_VERSION_SPECS,
115
147
  DesktopCdpTransport,
116
148
  DesktopOnlyPluginSkipError,
149
+ DeviceSettingNamespace,
150
+ DeviceSettingRestoreKind,
151
+ DeviceSettingVerb,
117
152
  IncompatibleInstallerVersionError,
118
153
  IntegrationSetupFailedError,
119
154
  OwnedInstanceExitedError,
@@ -126,14 +161,19 @@ var import_version_matrix = require("./version-matrix.cjs");
126
161
  buildDemoVaultPopulate,
127
162
  buildDemoVaultPopulateAsync,
128
163
  buildDeviceMetricsOverride,
164
+ buildDeviceSettingsCommandArguments,
129
165
  buildLabelSvg,
166
+ buildSoftKeyboardDiagnosticMessage,
167
+ captureDeviceScreenshot,
130
168
  captureObsidianScreenshot,
131
169
  checkIsMobileTransport,
170
+ checkIsSoftKeyboardUp,
132
171
  computeFitToCanvas,
133
172
  computeLabelBand,
134
173
  connectToCdp,
135
174
  createTransportFromOptions,
136
175
  decodeBase64Png,
176
+ deleteDeviceSetting,
137
177
  escapeSvgText,
138
178
  evalInObsidian,
139
179
  fitScreenshotToCanvas,
@@ -141,19 +181,32 @@ var import_version_matrix = require("./version-matrix.cjs");
141
181
  isPng,
142
182
  labelScreenshot,
143
183
  openObsidianSettingsTab,
184
+ parseInputMethodState,
144
185
  pollInObsidian,
186
+ raiseSoftKeyboard,
145
187
  readDemoVaultTree,
188
+ readDeviceSetting,
146
189
  readPngDimensions,
147
190
  registerLibResolver,
148
191
  registerVault,
149
192
  resolveAsarFallback,
193
+ resolveDeviceSettingRestore,
150
194
  resolveElectronCompatibility,
195
+ resolveEmulatorDeviceId,
151
196
  resolveInstallerCompatibility,
152
197
  resolveMissingInjectedPlugins,
198
+ resolveSoftKeyboardTapPoints,
199
+ runAdbBinary,
200
+ runAdbText,
201
+ runAdbTextWithoutDevice,
153
202
  runObsidianVersionMatrix,
203
+ selectEmulatorDeviceId,
154
204
  setSetupErrorResolver,
155
205
  setTransportOptionsResolver,
156
206
  setVaultPathResolver,
157
- unregisterVault
207
+ tapDevice,
208
+ unregisterVault,
209
+ withSoftKeyboardEnabled,
210
+ writeDeviceSetting
158
211
  });
159
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUge1xuICBBc2FyRmFsbGJhY2ssXG4gIEFzYXJGYWxsYmFja1RpZXIsXG4gIFJlc29sdmVBc2FyRmFsbGJhY2tQYXJhbXNcbn0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5janMnO1xuZXhwb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24uY2pzJztcbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdE9wdGlvbnMgfSBmcm9tICcuL2NhcHR1cmUtb2JzaWRpYW4tc2NyZWVuc2hvdC5janMnO1xuZXhwb3J0IHsgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdCB9IGZyb20gJy4vY2FwdHVyZS1vYnNpZGlhbi1zY3JlZW5zaG90LmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLFxuICBQbmdEaW1lbnNpb25zXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5leHBvcnQge1xuICBidWlsZERldmljZU1ldHJpY3NPdmVycmlkZSxcbiAgZGVjb2RlQmFzZTY0UG5nLFxuICBpc1BuZyxcbiAgcmVhZFBuZ0RpbWVuc2lvbnNcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QuY2pzJztcbmV4cG9ydCB0eXBlIHsgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5LWZhbGxiYWNrLWVycm9yLmNqcyc7XG5leHBvcnQgeyBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5LWZhbGxiYWNrLWVycm9yLmNqcyc7XG5leHBvcnQge1xuICBhc3NlcnRWYWxpZENvbmZpZ0RpcmVjdG9yeSxcbiAgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZXG59IGZyb20gJy4vY29uZmlnLWRpcmVjdG9yeS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29udGV4dEFyZ3VtZW50cyxcbiAgQ29udGV4dE9mXG59IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuZXhwb3J0IHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIFNldHVwRXJyb3JSZXNvbHZlcixcbiAgVHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIuY2pzJztcbmV4cG9ydCB7XG4gIHNldFNldHVwRXJyb3JSZXNvbHZlcixcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtcyxcbiAgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1Jlc3VsdCxcbiAgSW5zdGFsbGVkUGx1Z2luSW5mb1xufSBmcm9tICcuL2RlbW8tdmF1bHQtYm9vdHN0cmFwLmNqcyc7XG5leHBvcnQge1xuICBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zLFxuICBidWlsZERlbW9WYXVsdFBvcHVsYXRlQXN5bmNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LWJvb3RzdHJhcC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zLFxuICBJbmplY3RQbHVnaW5QYXJhbXMsXG4gIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5janMnO1xuZXhwb3J0IHtcbiAgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZSxcbiAgcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LXBvcHVsYXRlLmNqcyc7XG5leHBvcnQgdHlwZSB7IFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUuY2pzJztcbmV4cG9ydCB7IHJlYWREZW1vVmF1bHRUcmVlIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUuY2pzJztcbmV4cG9ydCB7IERlc2t0b3BPbmx5UGx1Z2luU2tpcEVycm9yIH0gZnJvbSAnLi9kZXNrdG9wLW9ubHktcGx1Z2luLXNraXAtZXJyb3IuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgRWxlY3Ryb25Db21wYXRpYmlsaXR5LFxuICBFbGVjdHJvbkNvbXBhdGliaWxpdHlUaWVyLFxuICBSZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5UGFyYW1zXG59IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5janMnO1xuZXhwb3J0IHsgcmVzb2x2ZUVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENvbW1vbkFyZ3VtZW50cyxcbiAgQ3JlYXRlTm90ZVBhcmFtcyxcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIEdlbmVyaWNPYmplY3QsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTGliLFxuICBNb3VzZUJ1dHRvbixcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmV4cG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbXB1dGVGaXRUb0NhbnZhc1BhcmFtcyxcbiAgRml0U2NyZWVuc2hvdFRvQ2FudmFzT3B0aW9ucyxcbiAgRml0VG9DYW52YXNHZW9tZXRyeVxufSBmcm9tICcuL2ZpdC1zY3JlZW5zaG90LmNqcyc7XG5leHBvcnQge1xuICBjb21wdXRlRml0VG9DYW52YXMsXG4gIGZpdFNjcmVlbnNob3RUb0NhbnZhc1xufSBmcm9tICcuL2ZpdC1zY3JlZW5zaG90LmNqcyc7XG5leHBvcnQgdHlwZSB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IuY2pzJztcbmV4cG9ydCB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvciB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHksXG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHlUaWVyLFxuICBSZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eVBhcmFtc1xufSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5leHBvcnQgeyByZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmV4cG9ydCB0eXBlIHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2ludGVncmF0aW9uLXNldHVwLWZhaWxlZC1lcnJvci5janMnO1xuZXhwb3J0IHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbi1zZXR1cC1mYWlsZWQtZXJyb3IuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29tcHV0ZUxhYmVsQmFuZFBhcmFtcyxcbiAgTGFiZWxCYW5kR2VvbWV0cnksXG4gIExhYmVsU2NyZWVuc2hvdE9wdGlvbnNcbn0gZnJvbSAnLi9sYWJlbC1zY3JlZW5zaG90LmNqcyc7XG5leHBvcnQge1xuICBidWlsZExhYmVsU3ZnLFxuICBjb21wdXRlTGFiZWxCYW5kLFxuICBlc2NhcGVTdmdUZXh0LFxuICBsYWJlbFNjcmVlbnNob3Rcbn0gZnJvbSAnLi9sYWJlbC1zY3JlZW5zaG90LmNqcyc7XG5leHBvcnQgdHlwZSB7IExpYlJlc29sdmVyIH0gZnJvbSAnLi9saWItcmVnaXN0cnkuY2pzJztcbmV4cG9ydCB7IHJlZ2lzdGVyTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhblJ1bnRpbWVWZXJzaW9ucyxcbiAgT2JzaWRpYW5WZXJzaW9uQ2hhbmdlbG9nVXJscyxcbiAgT2JzaWRpYW5WZXJzaW9uRG93bmxvYWRzLFxuICBPYnNpZGlhblZlcnNpb25NZXRhZGF0YVxufSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5leHBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5leHBvcnQge1xuICBDQVRBTFlTVF9MQVRFU1QsXG4gIFBVQkxJQ19MQVRFU1Rcbn0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLmNqcyc7XG5leHBvcnQgdHlwZSB7IE9wZW5PYnNpZGlhblNldHRpbmdzVGFiT3B0aW9ucyB9IGZyb20gJy4vb3Blbi1vYnNpZGlhbi1zZXR0aW5ncy10YWIuY2pzJztcbmV4cG9ydCB7IG9wZW5PYnNpZGlhblNldHRpbmdzVGFiIH0gZnJvbSAnLi9vcGVuLW9ic2lkaWFuLXNldHRpbmdzLXRhYi5janMnO1xuZXhwb3J0IHR5cGUgeyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdGVkLWVycm9yLmNqcyc7XG5leHBvcnQgeyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IgfSBmcm9tICcuL293bmVkLWluc3RhbmNlLWV4aXRlZC1lcnJvci5janMnO1xuZXhwb3J0IHR5cGUgeyBQb2xsSW5PYnNpZGlhblBhcmFtcyB9IGZyb20gJy4vcG9sbC1pbi1vYnNpZGlhbi5janMnO1xuZXhwb3J0IHsgcG9sbEluT2JzaWRpYW4gfSBmcm9tICcuL3BvbGwtaW4tb2JzaWRpYW4uY2pzJztcbmV4cG9ydCB7IFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3IgfSBmcm9tICcuL3JlbmRlcmVyLWZhaWxlZC10by1pbml0aWFsaXplLWVycm9yLmNqcyc7XG5leHBvcnQgdHlwZSB7IFJ1bk9ic2lkaWFuVmVyc2lvbk1hdHJpeFBhcmFtcyB9IGZyb20gJy4vcnVuLXZlcnNpb24tbWF0cml4LmNqcyc7XG5leHBvcnQgeyBydW5PYnNpZGlhblZlcnNpb25NYXRyaXggfSBmcm9tICcuL3J1bi12ZXJzaW9uLW1hdHJpeC5janMnO1xuZXhwb3J0IHR5cGUgeyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9zaWxlbnQtYXNhci1mYWxsYmFjay1lcnJvci5janMnO1xuZXhwb3J0IHsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3IgfSBmcm9tICcuL3NpbGVudC1hc2FyLWZhbGxiYWNrLWVycm9yLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIFBvcHVsYXRlRmlsZUNvbnRlbnQsXG4gIFBvcHVsYXRlRmlsZXNQYXJhbXMsXG4gIFRlbXBvcmFyeVZhdWx0T3B0aW9uc1xufSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5janMnO1xuZXhwb3J0IHsgVGVtcG9yYXJ5VmF1bHQgfSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBpdW1TZXNzaW9uSW5mbyxcbiAgQXBwaXVtVHJhbnNwb3J0Q29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuZXhwb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VBc2FyLFxuICBPd25lZEluc3RhbmNlQ29uZmlnLFxuICBPd25lZEluc3RhbmNlRW5kcG9pbnRcbn0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAuY2pzJztcbmV4cG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuZXhwb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcbmV4cG9ydCB7IGNoZWNrSXNNb2JpbGVUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbnNvbGVDYXB0dXJlSGFuZGxlLFxuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcbmV4cG9ydCB7XG4gIHJlZ2lzdGVyVmF1bHQsXG4gIHVucmVnaXN0ZXJWYXVsdFxufSBmcm9tICcuL3ZhdWx0LXJlZ2lzdHJ5LmNqcyc7XG5leHBvcnQgdHlwZSB7IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5IH0gZnJvbSAnLi92ZXJzaW9uLW1hdHJpeC5janMnO1xuZXhwb3J0IHsgREVGQVVMVF9PQlNJRElBTl9WRVJTSU9OX1NQRUNTIH0gZnJvbSAnLi92ZXJzaW9uLW1hdHJpeC5janMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVdBLHFDQUFvQztBQUVwQyx5Q0FBMEM7QUFLMUMsZ0NBS087QUFFUCw2Q0FBNkM7QUFDN0MsOEJBR087QUFLUCw0QkFBNkI7QUFLN0Isd0JBQTBCO0FBTTFCLDhCQUlPO0FBTVAsa0NBR087QUFNUCxpQ0FHTztBQUVQLDZCQUFrQztBQUNsQyw0Q0FBMkM7QUFNM0Msb0NBQTZDO0FBa0I3Qyw4QkFBK0I7QUFNL0IsNEJBR087QUFFUCxrREFBa0Q7QUFNbEQscUNBQThDO0FBRTlDLDRDQUE0QztBQU01Qyw4QkFLTztBQUVQLDBCQUFvQztBQU9wQywrQkFBbUM7QUFDbkMsOEJBR087QUFFUCx3Q0FBd0M7QUFFeEMseUNBQXlDO0FBRXpDLDhCQUErQjtBQUMvQixpREFBZ0Q7QUFFaEQsZ0NBQXlDO0FBRXpDLHdDQUF3QztBQU14Qyw2QkFBK0I7QUFLL0IsOEJBQWdDO0FBT2hDLG1DQUFvQztBQUNwQywrQkFBMkM7QUFNM0MsK0JBQXVDO0FBTXZDLDRCQUdPO0FBRVAsNEJBQStDOyIsCiAgIm5hbWVzIjogW10KfQo=
212
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUgeyBSdW5BZGJQYXJhbXMgfSBmcm9tICcuL2FkYi5janMnO1xuZXhwb3J0IHtcbiAgcnVuQWRiQmluYXJ5LFxuICBydW5BZGJUZXh0LFxuICBydW5BZGJUZXh0V2l0aG91dERldmljZVxufSBmcm9tICcuL2FkYi5janMnO1xuZXhwb3J0IHR5cGUge1xuICBBc2FyRmFsbGJhY2ssXG4gIEFzYXJGYWxsYmFja1RpZXIsXG4gIFJlc29sdmVBc2FyRmFsbGJhY2tQYXJhbXNcbn0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5janMnO1xuZXhwb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24uY2pzJztcbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdE9wdGlvbnMgfSBmcm9tICcuL2NhcHR1cmUtb2JzaWRpYW4tc2NyZWVuc2hvdC5janMnO1xuZXhwb3J0IHsgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdCB9IGZyb20gJy4vY2FwdHVyZS1vYnNpZGlhbi1zY3JlZW5zaG90LmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLFxuICBQbmdEaW1lbnNpb25zXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5leHBvcnQge1xuICBidWlsZERldmljZU1ldHJpY3NPdmVycmlkZSxcbiAgZGVjb2RlQmFzZTY0UG5nLFxuICBpc1BuZyxcbiAgcmVhZFBuZ0RpbWVuc2lvbnNcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QuY2pzJztcbmV4cG9ydCB0eXBlIHsgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5LWZhbGxiYWNrLWVycm9yLmNqcyc7XG5leHBvcnQgeyBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5LWZhbGxiYWNrLWVycm9yLmNqcyc7XG5leHBvcnQge1xuICBhc3NlcnRWYWxpZENvbmZpZ0RpcmVjdG9yeSxcbiAgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZXG59IGZyb20gJy4vY29uZmlnLWRpcmVjdG9yeS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29udGV4dEFyZ3VtZW50cyxcbiAgQ29udGV4dE9mXG59IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuZXhwb3J0IHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIFNldHVwRXJyb3JSZXNvbHZlcixcbiAgVHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIuY2pzJztcbmV4cG9ydCB7XG4gIHNldFNldHVwRXJyb3JSZXNvbHZlcixcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtcyxcbiAgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1Jlc3VsdCxcbiAgSW5zdGFsbGVkUGx1Z2luSW5mb1xufSBmcm9tICcuL2RlbW8tdmF1bHQtYm9vdHN0cmFwLmNqcyc7XG5leHBvcnQge1xuICBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zLFxuICBidWlsZERlbW9WYXVsdFBvcHVsYXRlQXN5bmNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LWJvb3RzdHJhcC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zLFxuICBJbmplY3RQbHVnaW5QYXJhbXMsXG4gIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5janMnO1xuZXhwb3J0IHtcbiAgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZSxcbiAgcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LXBvcHVsYXRlLmNqcyc7XG5leHBvcnQgdHlwZSB7IFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUuY2pzJztcbmV4cG9ydCB7IHJlYWREZW1vVmF1bHRUcmVlIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUuY2pzJztcbmV4cG9ydCB7IERlc2t0b3BPbmx5UGx1Z2luU2tpcEVycm9yIH0gZnJvbSAnLi9kZXNrdG9wLW9ubHktcGx1Z2luLXNraXAtZXJyb3IuY2pzJztcbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZURldmljZVNjcmVlbnNob3RQYXJhbXMgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90LmNqcyc7XG5leHBvcnQgeyBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdCB9IGZyb20gJy4vZGV2aWNlLXNjcmVlbnNob3QuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgRGV2aWNlU2V0dGluZ1Jlc3RvcmUsXG4gIERldmljZVNldHRpbmdSZXN0b3JlRGVsZXRlLFxuICBEZXZpY2VTZXR0aW5nUmVzdG9yZVdyaXRlXG59IGZyb20gJy4vZGV2aWNlLXNldHRpbmctcmVzdG9yZS5janMnO1xuZXhwb3J0IHtcbiAgRGV2aWNlU2V0dGluZ1Jlc3RvcmVLaW5kLFxuICByZXNvbHZlRGV2aWNlU2V0dGluZ1Jlc3RvcmVcbn0gZnJvbSAnLi9kZXZpY2Utc2V0dGluZy1yZXN0b3JlLmNqcyc7XG5leHBvcnQgdHlwZSB7IEJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzUGFyYW1zIH0gZnJvbSAnLi9kZXZpY2Utc2V0dGluZ3MtY29tbWFuZC5janMnO1xuZXhwb3J0IHtcbiAgYnVpbGREZXZpY2VTZXR0aW5nc0NvbW1hbmRBcmd1bWVudHMsXG4gIERldmljZVNldHRpbmdOYW1lc3BhY2UsXG4gIERldmljZVNldHRpbmdWZXJiXG59IGZyb20gJy4vZGV2aWNlLXNldHRpbmdzLWNvbW1hbmQuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgRGV2aWNlU2V0dGluZ1BhcmFtcyxcbiAgV2l0aFNvZnRLZXlib2FyZEVuYWJsZWRQYXJhbXMsXG4gIFdyaXRlRGV2aWNlU2V0dGluZ1BhcmFtc1xufSBmcm9tICcuL2RldmljZS1zZXR0aW5ncy5janMnO1xuZXhwb3J0IHtcbiAgZGVsZXRlRGV2aWNlU2V0dGluZyxcbiAgcmVhZERldmljZVNldHRpbmcsXG4gIHdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkLFxuICB3cml0ZURldmljZVNldHRpbmdcbn0gZnJvbSAnLi9kZXZpY2Utc2V0dGluZ3MuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgRWxlY3Ryb25Db21wYXRpYmlsaXR5LFxuICBFbGVjdHJvbkNvbXBhdGliaWxpdHlUaWVyLFxuICBSZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5UGFyYW1zXG59IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5janMnO1xuZXhwb3J0IHsgcmVzb2x2ZUVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBFbXVsYXRvckRldmljZUNhbmRpZGF0ZSxcbiAgU2VsZWN0RW11bGF0b3JEZXZpY2VJZFBhcmFtc1xufSBmcm9tICcuL2VtdWxhdG9yLWRldmljZS1pZC5janMnO1xuZXhwb3J0IHsgc2VsZWN0RW11bGF0b3JEZXZpY2VJZCB9IGZyb20gJy4vZW11bGF0b3ItZGV2aWNlLWlkLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIENsaWNrRWxlbWVudFBhcmFtcyxcbiAgQ2xpY2tNb3VzZVBhcmFtcyxcbiAgQ29tbW9uQXJndW1lbnRzLFxuICBDcmVhdGVOb3RlUGFyYW1zLFxuICBFdmFsSW5PYnNpZGlhblBhcmFtcyxcbiAgR2VuZXJpY09iamVjdCxcbiAgSG92ZXJFbGVtZW50UGFyYW1zLFxuICBMaWIsXG4gIE1vdXNlQnV0dG9uLFxuICBNb3ZlTW91c2VQYXJhbXMsXG4gIE9wZW5TZXR0aW5nc1RhYlBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtcyxcbiAgV2FpdFVudGlsUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuZXhwb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29tcHV0ZUZpdFRvQ2FudmFzUGFyYW1zLFxuICBGaXRTY3JlZW5zaG90VG9DYW52YXNPcHRpb25zLFxuICBGaXRUb0NhbnZhc0dlb21ldHJ5XG59IGZyb20gJy4vZml0LXNjcmVlbnNob3QuY2pzJztcbmV4cG9ydCB7XG4gIGNvbXB1dGVGaXRUb0NhbnZhcyxcbiAgZml0U2NyZWVuc2hvdFRvQ2FudmFzXG59IGZyb20gJy4vZml0LXNjcmVlbnNob3QuY2pzJztcbmV4cG9ydCB0eXBlIHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci5janMnO1xuZXhwb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSxcbiAgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eVRpZXIsXG4gIFJlc29sdmVJbnN0YWxsZXJDb21wYXRpYmlsaXR5UGFyYW1zXG59IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmV4cG9ydCB7IHJlc29sdmVJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5janMnO1xuZXhwb3J0IHR5cGUgeyBJbnRlZ3JhdGlvblNldHVwRmFpbGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vaW50ZWdyYXRpb24tc2V0dXAtZmFpbGVkLWVycm9yLmNqcyc7XG5leHBvcnQgeyBJbnRlZ3JhdGlvblNldHVwRmFpbGVkRXJyb3IgfSBmcm9tICcuL2ludGVncmF0aW9uLXNldHVwLWZhaWxlZC1lcnJvci5janMnO1xuZXhwb3J0IHR5cGUge1xuICBDb21wdXRlTGFiZWxCYW5kUGFyYW1zLFxuICBMYWJlbEJhbmRHZW9tZXRyeSxcbiAgTGFiZWxTY3JlZW5zaG90T3B0aW9uc1xufSBmcm9tICcuL2xhYmVsLXNjcmVlbnNob3QuY2pzJztcbmV4cG9ydCB7XG4gIGJ1aWxkTGFiZWxTdmcsXG4gIGNvbXB1dGVMYWJlbEJhbmQsXG4gIGVzY2FwZVN2Z1RleHQsXG4gIGxhYmVsU2NyZWVuc2hvdFxufSBmcm9tICcuL2xhYmVsLXNjcmVlbnNob3QuY2pzJztcbmV4cG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuZXhwb3J0IHsgcmVnaXN0ZXJMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5LmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUnVudGltZVZlcnNpb25zLFxuICBPYnNpZGlhblZlcnNpb25DaGFuZ2Vsb2dVcmxzLFxuICBPYnNpZGlhblZlcnNpb25Eb3dubG9hZHMsXG4gIE9ic2lkaWFuVmVyc2lvbk1ldGFkYXRhXG59IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEuY2pzJztcbmV4cG9ydCB7IGdldFZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEuY2pzJztcbmV4cG9ydCB7XG4gIENBVEFMWVNUX0xBVEVTVCxcbiAgUFVCTElDX0xBVEVTVFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24uY2pzJztcbmV4cG9ydCB0eXBlIHsgT3Blbk9ic2lkaWFuU2V0dGluZ3NUYWJPcHRpb25zIH0gZnJvbSAnLi9vcGVuLW9ic2lkaWFuLXNldHRpbmdzLXRhYi5janMnO1xuZXhwb3J0IHsgb3Blbk9ic2lkaWFuU2V0dGluZ3NUYWIgfSBmcm9tICcuL29wZW4tb2JzaWRpYW4tc2V0dGluZ3MtdGFiLmNqcyc7XG5leHBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0ZWQtZXJyb3IuY2pzJztcbmV4cG9ydCB7IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvciB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdGVkLWVycm9yLmNqcyc7XG5leHBvcnQgdHlwZSB7IFBvbGxJbk9ic2lkaWFuUGFyYW1zIH0gZnJvbSAnLi9wb2xsLWluLW9ic2lkaWFuLmNqcyc7XG5leHBvcnQgeyBwb2xsSW5PYnNpZGlhbiB9IGZyb20gJy4vcG9sbC1pbi1vYnNpZGlhbi5janMnO1xuZXhwb3J0IHsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvciB9IGZyb20gJy4vcmVuZGVyZXItZmFpbGVkLXRvLWluaXRpYWxpemUtZXJyb3IuY2pzJztcbmV4cG9ydCB0eXBlIHsgUmVzb2x2ZUVtdWxhdG9yRGV2aWNlSWRQYXJhbXMgfSBmcm9tICcuL3Jlc29sdmUtZW11bGF0b3ItZGV2aWNlLWlkLmNqcyc7XG5leHBvcnQgeyByZXNvbHZlRW11bGF0b3JEZXZpY2VJZCB9IGZyb20gJy4vcmVzb2x2ZS1lbXVsYXRvci1kZXZpY2UtaWQuY2pzJztcbmV4cG9ydCB0eXBlIHsgUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zIH0gZnJvbSAnLi9ydW4tdmVyc2lvbi1tYXRyaXguY2pzJztcbmV4cG9ydCB7IHJ1bk9ic2lkaWFuVmVyc2lvbk1hdHJpeCB9IGZyb20gJy4vcnVuLXZlcnNpb24tbWF0cml4LmNqcyc7XG5leHBvcnQgdHlwZSB7IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL3NpbGVudC1hc2FyLWZhbGxiYWNrLWVycm9yLmNqcyc7XG5leHBvcnQgeyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvciB9IGZyb20gJy4vc2lsZW50LWFzYXItZmFsbGJhY2stZXJyb3IuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZVBhcmFtcyxcbiAgQ2hlY2tJc1NvZnRLZXlib2FyZFVwUGFyYW1zLFxuICBFbGVtZW50UmVjdCxcbiAgUmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50c1BhcmFtcyxcbiAgU29mdEtleWJvYXJkVGFwUG9pbnQsXG4gIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5LmNqcyc7XG5leHBvcnQge1xuICBidWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlLFxuICBjaGVja0lzU29mdEtleWJvYXJkVXAsXG4gIERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTLFxuICBwYXJzZUlucHV0TWV0aG9kU3RhdGUsXG4gIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5LmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLFxuICBUYXBEZXZpY2VQYXJhbXNcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLmNqcyc7XG5leHBvcnQge1xuICByYWlzZVNvZnRLZXlib2FyZCxcbiAgdGFwRGV2aWNlXG59IGZyb20gJy4vc29mdC1rZXlib2FyZC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBQb3B1bGF0ZUZpbGVDb250ZW50LFxuICBQb3B1bGF0ZUZpbGVzUGFyYW1zLFxuICBUZW1wb3JhcnlWYXVsdE9wdGlvbnNcbn0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQuY2pzJztcbmV4cG9ydCB7IFRlbXBvcmFyeVZhdWx0IH0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQXBwaXVtU2Vzc2lvbkluZm8sXG4gIEFwcGl1bVRyYW5zcG9ydENvbmZpZ1xufSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0uY2pzJztcbmV4cG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnLFxuICBPd25lZEluc3RhbmNlQXNhcixcbiAgT3duZWRJbnN0YW5jZUNvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUVuZHBvaW50XG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5leHBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAuY2pzJztcbmV4cG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5leHBvcnQgeyBjaGVja0lzTW9iaWxlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5janMnO1xuZXhwb3J0IHR5cGUge1xuICBDb25zb2xlQ2FwdHVyZUhhbmRsZSxcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5leHBvcnQge1xuICByZWdpc3RlclZhdWx0LFxuICB1bnJlZ2lzdGVyVmF1bHRcbn0gZnJvbSAnLi92YXVsdC1yZWdpc3RyeS5janMnO1xuZXhwb3J0IHR5cGUgeyBPYnNpZGlhblZlcnNpb25NYXRyaXhFbnRyeSB9IGZyb20gJy4vdmVyc2lvbi1tYXRyaXguY2pzJztcbmV4cG9ydCB7IERFRkFVTFRfT0JTSURJQU5fVkVSU0lPTl9TUEVDUyB9IGZyb20gJy4vdmVyc2lvbi1tYXRyaXguY2pzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9BLGlCQUlPO0FBTVAscUNBQW9DO0FBRXBDLHlDQUEwQztBQUsxQyxnQ0FLTztBQUVQLDZDQUE2QztBQUM3Qyw4QkFHTztBQUtQLDRCQUE2QjtBQUs3Qix3QkFBMEI7QUFNMUIsOEJBSU87QUFNUCxrQ0FHTztBQU1QLGlDQUdPO0FBRVAsNkJBQWtDO0FBQ2xDLDRDQUEyQztBQUUzQywrQkFBd0M7QUFNeEMsb0NBR087QUFFUCxxQ0FJTztBQU1QLDZCQUtPO0FBTVAsb0NBQTZDO0FBSzdDLGdDQUF1QztBQWtCdkMsOEJBQStCO0FBTS9CLDRCQUdPO0FBRVAsa0RBQWtEO0FBTWxELHFDQUE4QztBQUU5Qyw0Q0FBNEM7QUFNNUMsOEJBS087QUFFUCwwQkFBb0M7QUFPcEMsK0JBQW1DO0FBQ25DLDhCQUdPO0FBRVAsd0NBQXdDO0FBRXhDLHlDQUF5QztBQUV6Qyw4QkFBK0I7QUFDL0IsaURBQWdEO0FBRWhELHdDQUF3QztBQUV4QyxnQ0FBeUM7QUFFekMsd0NBQXdDO0FBU3hDLG9DQU1PO0FBS1AsMkJBR087QUFNUCw2QkFBK0I7QUFLL0IsOEJBQWdDO0FBT2hDLG1DQUFvQztBQUNwQywrQkFBMkM7QUFNM0MsK0JBQXVDO0FBTXZDLDRCQUdPO0FBRVAsNEJBQStDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -3,6 +3,8 @@
3
3
  *
4
4
  * Contains the entry point for the integration testing module.
5
5
  */
6
+ export type { RunAdbParams } from './adb.cjs';
7
+ export { runAdbBinary, runAdbText, runAdbTextWithoutDevice } from './adb.cjs';
6
8
  export type { AsarFallback, AsarFallbackTier, ResolveAsarFallbackParams } from './asar-fallback-detection.cjs';
7
9
  export { resolveAsarFallback } from './asar-fallback-detection.cjs';
8
10
  export type { CaptureObsidianScreenshotOptions } from './capture-obsidian-screenshot.cjs';
@@ -25,8 +27,18 @@ export { buildDemoVaultPopulate, resolveMissingInjectedPlugins } from './demo-va
25
27
  export type { ReadDemoVaultTreeParams } from './demo-vault-tree.cjs';
26
28
  export { readDemoVaultTree } from './demo-vault-tree.cjs';
27
29
  export { DesktopOnlyPluginSkipError } from './desktop-only-plugin-skip-error.cjs';
30
+ export type { CaptureDeviceScreenshotParams } from './device-screenshot.cjs';
31
+ export { captureDeviceScreenshot } from './device-screenshot.cjs';
32
+ export type { DeviceSettingRestore, DeviceSettingRestoreDelete, DeviceSettingRestoreWrite } from './device-setting-restore.cjs';
33
+ export { DeviceSettingRestoreKind, resolveDeviceSettingRestore } from './device-setting-restore.cjs';
34
+ export type { BuildDeviceSettingsCommandArgumentsParams } from './device-settings-command.cjs';
35
+ export { buildDeviceSettingsCommandArguments, DeviceSettingNamespace, DeviceSettingVerb } from './device-settings-command.cjs';
36
+ export type { DeviceSettingParams, WithSoftKeyboardEnabledParams, WriteDeviceSettingParams } from './device-settings.cjs';
37
+ export { deleteDeviceSetting, readDeviceSetting, withSoftKeyboardEnabled, writeDeviceSetting } from './device-settings.cjs';
28
38
  export type { ElectronCompatibility, ElectronCompatibilityTier, ResolveElectronCompatibilityParams } from './electron-compatibility.cjs';
29
39
  export { resolveElectronCompatibility } from './electron-compatibility.cjs';
40
+ export type { EmulatorDeviceCandidate, SelectEmulatorDeviceIdParams } from './emulator-device-id.cjs';
41
+ export { selectEmulatorDeviceId } from './emulator-device-id.cjs';
30
42
  export type { ClickElementParams, ClickMouseParams, CommonArguments, CreateNoteParams, EvalInObsidianParams, GenericObject, HoverElementParams, Lib, MouseButton, MoveMouseParams, OpenSettingsTabParams, PressKeyParams, TypeIntoEditorParams, UnhoverElementParams, WaitUntilParams } from './eval-in-obsidian.cjs';
31
43
  export { evalInObsidian } from './eval-in-obsidian.cjs';
32
44
  export type { ComputeFitToCanvasParams, FitScreenshotToCanvasOptions, FitToCanvasGeometry } from './fit-screenshot.cjs';
@@ -51,10 +63,16 @@ export { OwnedInstanceExitedError } from './owned-instance-exited-error.cjs';
51
63
  export type { PollInObsidianParams } from './poll-in-obsidian.cjs';
52
64
  export { pollInObsidian } from './poll-in-obsidian.cjs';
53
65
  export { RendererFailedToInitializeError } from './renderer-failed-to-initialize-error.cjs';
66
+ export type { ResolveEmulatorDeviceIdParams } from './resolve-emulator-device-id.cjs';
67
+ export { resolveEmulatorDeviceId } from './resolve-emulator-device-id.cjs';
54
68
  export type { RunObsidianVersionMatrixParams } from './run-version-matrix.cjs';
55
69
  export { runObsidianVersionMatrix } from './run-version-matrix.cjs';
56
70
  export type { SilentAsarFallbackErrorConstructorParams } from './silent-asar-fallback-error.cjs';
57
71
  export { SilentAsarFallbackError } from './silent-asar-fallback-error.cjs';
72
+ export type { BuildSoftKeyboardDiagnosticMessageParams, CheckIsSoftKeyboardUpParams, ElementRect, ResolveSoftKeyboardTapPointsParams, SoftKeyboardTapPoint, SoftKeyboardViewportSnapshot } from './soft-keyboard-geometry.cjs';
73
+ export { buildSoftKeyboardDiagnosticMessage, checkIsSoftKeyboardUp, DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS, parseInputMethodState, resolveSoftKeyboardTapPoints } from './soft-keyboard-geometry.cjs';
74
+ export type { RaiseSoftKeyboardParams, TapDeviceParams } from './soft-keyboard.cjs';
75
+ export { raiseSoftKeyboard, tapDevice } from './soft-keyboard.cjs';
58
76
  export type { PopulateFileContent, PopulateFilesParams, TemporaryVaultOptions } from './temporary-vault.cjs';
59
77
  export { TemporaryVault } from './temporary-vault.cjs';
60
78
  export type { AppiumSessionInfo, AppiumTransportConfig } from './transport-appium.cjs';
@@ -21,7 +21,7 @@ __export(library_exports, {
21
21
  LIBRARY_VERSION: () => LIBRARY_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(library_exports);
24
- const LIBRARY_VERSION = false ? "dev" : "12.1.0";
24
+ const LIBRARY_VERSION = false ? "dev" : "12.1.2";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  LIBRARY_VERSION
@@ -20,7 +20,9 @@ var mobile_input_exports = {};
20
20
  __export(mobile_input_exports, {
21
21
  MOBILE_INPUT_BINDING_NAME: () => MOBILE_INPUT_BINDING_NAME,
22
22
  MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS: () => MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS,
23
+ buildClaimInputExpression: () => buildClaimInputExpression,
23
24
  buildResolveInputExpression: () => buildResolveInputExpression,
25
+ checkInputClaimGranted: () => checkInputClaimGranted,
24
26
  codePointOf: () => codePointOf,
25
27
  toCdpInputCommands: () => toCdpInputCommands,
26
28
  toCdpModifiers: () => toCdpModifiers
@@ -65,9 +67,18 @@ const DIGIT_ZERO_CODE_POINT = codePointOf("0");
65
67
  const DIGIT_NINE_CODE_POINT = codePointOf("9");
66
68
  const UPPERCASE_A_CODE_POINT = codePointOf("A");
67
69
  const UPPERCASE_Z_CODE_POINT = codePointOf("Z");
70
+ function buildClaimInputExpression(id) {
71
+ return `window.__obsidianIntegrationTesting?.claimInput?.(${JSON.stringify(id)})`;
72
+ }
68
73
  function buildResolveInputExpression(id, errorMessage) {
69
74
  return `window.__obsidianIntegrationTesting?.resolveInput?.(${JSON.stringify(id)}, ${JSON.stringify(errorMessage ?? null)})`;
70
75
  }
76
+ function checkInputClaimGranted(result) {
77
+ if (typeof result !== "object" || result === null) {
78
+ return true;
79
+ }
80
+ return result.result?.value !== false;
81
+ }
71
82
  function codePointOf(text) {
72
83
  const codePoint = text.codePointAt(FIRST_CODE_POINT_INDEX);
73
84
  if (codePoint === void 0) {
@@ -165,9 +176,11 @@ function toPointerCommands(request) {
165
176
  0 && (module.exports = {
166
177
  MOBILE_INPUT_BINDING_NAME,
167
178
  MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS,
179
+ buildClaimInputExpression,
168
180
  buildResolveInputExpression,
181
+ checkInputClaimGranted,
169
182
  codePointOf,
170
183
  toCdpInputCommands,
171
184
  toCdpModifiers
172
185
  });
173
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vYmlsZS1pbnB1dC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRyYW5zbGF0ZXMgYSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ2hyb21lIERldlRvb2xzIFByb3RvY29sIGBJbnB1dC4qYCBjb21tYW5kc1xuICogdGhhdCByZWFsaXplIGl0IChzZWUgKipMMzkqKikuXG4gKlxuICogUHVyZSBhbmQgc3luY2hyb25vdXMgYnkgZGVzaWduOiB0aGUgV2ViVmlldyBjb25uZWN0aW9uICh7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb259KSBzZW5kcyB3aGF0ZXZlciB0aGlzXG4gKiByZXR1cm5zLCBzbyBldmVyeSBkZWNpc2lvbiB0aGF0IGlzIHdvcnRoIGEgdGVzdCBcdTIwMTQgdGhlIHRvdWNoIHBhaXIgYSB0YXAgZXhwYW5kcyBpbnRvLCB0aGUgZHdlbGwgYVxuICogbG9uZy1wcmVzcyBhZGRzLCB0aGUgYHJhd0tleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgc2hhcGUgYSBrZXkgcHJlc3MgbWlycm9ycyBmcm9tIHRoZSBkZXNrdG9wIHR3aW4sIHRoZVxuICogbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgbGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIHRyYW5zcG9ydCdzIEkvTyBwYXRoLlxuICpcbiAqIFRoZSByZXF1ZXN0IHRyYXZlbHMgcmVuZGVyZXIgXHUyMTkyIGhvc3QgYXMgSlNPTiAodGhlIHJlbmRlcmVyIGNvbXB1dGVzIHRoZSBjb29yZGluYXRlcywgYmVjYXVzZSBvbmx5IGl0IGNhblxuICogc2VlIHRoZSBET00pLCBzbyBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgY29tbWFuZCBzaGFwZXMgYXJlIGRlbGliZXJhdGVseSBwbGFpbiBkYXRhLlxuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGZ1bmN0aW9uIHRoZSBob3N0IGV4cG9zZXMgb24gdGhlIHBhZ2Ugc28gdGhlIHJlbmRlcmVyIGNhbiBoYW5kIGl0IGFuXG4gKiBpbnB1dCByZXF1ZXN0IG1pZC1jbG9zdXJlLlxuICpcbiAqIEl0IGlzIHBhc3NlZCAqaW50byogdGhlIHNlcmlhbGl6ZWQgYm9vdHN0cmFwIGNsb3N1cmUgYXMgZGF0YSByYXRoZXIgdGhhbiByZWZlcmVuY2VkIGZyb20gaXQsIGJlY2F1c2UgdGhhdFxuICogY2xvc3VyZSBtYXkgbm90IHJlYWQgb3V0ZXIgc2NvcGUgKCoqTDE1KiopIFx1MjAxNCBzbyB0aGlzIHN0YXlzIHRoZSBzaW5nbGUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUgPSAnX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0lucHV0JztcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgcmVuZGVyZXIgd2FpdHMgZm9yIHRoZSBob3N0IHRvIHNlcnZpY2Ugb25lIGlucHV0IHJlcXVlc3QgYmVmb3JlIGdpdmluZyB1cC5cbiAqXG4gKiBHZW5lcm91cyByZWxhdGl2ZSB0byB0aGUgd29yayAoYSB0YXAgaXMgdHdvIENEUCBjb21tYW5kczsgYSBsb25nLXByZXNzIGFkZHMgYSA2MDBtcyBkd2VsbCk6IHRoZSBwb2ludCBpc1xuICogdG8gZmFpbCB3aXRoIGEgbGVnaWJsZSBlcnJvciByYXRoZXIgdGhhbiBoYW5nIHRoZSBjbG9zdXJlIHVudGlsIHRoZSB3aG9sZSBydW4gdGltZXMgb3V0LiBQYXNzZWQgaW50byB0aGVcbiAqIGJvb3RzdHJhcCBjbG9zdXJlIGFzIGRhdGEsIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUV9LlxuICovXG5leHBvcnQgY29uc3QgTU9CSUxFX0lOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuXG4vKipcbiAqIEEgc2luZ2xlIENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb21tYW5kLlxuICpcbiAqIEl0IG9uY2UgYWxzbyBjYXJyaWVkIGEgYGRlbGF5QmVmb3JlSW5NaWxsaXNlY29uZHNgLCBzbyB0aGUgaG9zdCB3b3VsZCBzbGVlcCBiZXR3ZWVuIHRoZSB0d28gaGFsdmVzIG9mIGFcbiAqIGxvbmctcHJlc3MuIFRoYXQgZHdlbGwgaXMgZ29uZTogdGhlIGdlc3R1cmUgaXMgbm93IG9uZSBgSW5wdXQuc3ludGhlc2l6ZVRhcEdlc3R1cmVgIHRoYXQgaG9sZHMgaXRzZWxmXG4gKiBmb3IgaXRzIG93biBgZHVyYXRpb25gLCBzbyBubyBjb21tYW5kIGluIGFueSBzZXF1ZW5jZSBuZWVkcyB0byBiZSBzcGFjZWQgZnJvbSB0aGUgb25lIGJlZm9yZSBpdCwgYW5kIGFcbiAqIGtub2Igbm90aGluZyBzZXRzIGlzIHdvcnNlIHRoYW4gbm8ga25vYi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBJbnB1dENvbW1hbmQge1xuICAvKipcbiAgICogVGhlIENEUCBtZXRob2QgbmFtZSwgZS5nLiBgSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50YC5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSByZW5kZXJlciBoYW5kcyB0byB0aGUgaG9zdCBiaW5kaW5nOiBvbmUgcmVxdWVzdCwgcGx1cyB0aGUgaWQgdG8gYW5zd2VyIGl0IG9uLlxuICpcbiAqIFRoZSByZW5kZXJlciBidWlsZHMgdGhpcyBsaXRlcmFsIGluc2lkZSB0aGUgc2VyaWFsaXplZCBib290c3RyYXAgY2xvc3VyZSwgd2hpY2ggY2Fubm90IGltcG9ydCAoKipMMTUqKiksXG4gKiBzbyB0aGUgc2hhcGUgaXMgZGVjbGFyZWQgaGVyZSBhbmQgbWlycm9yZWQgdGhlcmUuIFRoZXkgYXJlIG9uZSB3aXJlIGZvcm1hdDsgY2hhbmdlIHRoZW0gdG9nZXRoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlSW5wdXRFbnZlbG9wZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBpZCB0aGUgcmVuZGVyZXIgaXMgd2FpdGluZyBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdG8gaW5qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdDogTW9iaWxlSW5wdXRSZXF1ZXN0O1xufVxuXG4vKipcbiAqIEFueXRoaW5nIHRoZSByZW5kZXJlciBjYW4gYXNrIHRoZSBob3N0IHRvIGluamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9iaWxlSW5wdXRSZXF1ZXN0ID0gTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHwgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdDtcblxuLyoqXG4gKiBBIHRydXN0ZWQga2V5IHByZXNzIHRvIGluamVjdCBvbiBtb2JpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gcHJlc3MsIGluIHRoZSBzYW1lIHNwZWxsaW5nIHRoZSBkZXNrdG9wIHR3aW4gdGFrZXM6IGVpdGhlciBhIG5hbWVkIGtleVxuICAgKiAoYEVudGVyYCwgYEVzY2FwZWAsIGBUYWJgLCBgQmFja3NwYWNlYCwgYERlbGV0ZWAsIGFuIGFycm93KSBvciBhIHNpbmdsZSBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuXG4gIC8qKlxuICAgKiBNb2RpZmllcnMgYWxyZWFkeSByZXNvbHZlZCB0byB0aGVpciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsb3dlcmNhc2UgbmFtZXMgYnkgdGhlIHJlbmRlcmVyJ3NcbiAgICogYHRvRWxlY3Ryb25Nb2RpZmllcnNgIFx1MjAxNCB0aGUgb25lIG1hcHBpbmcgYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgc2hhcmUsIHNvIGAnTW9kJ2AgY2Fubm90IG1lYW4gdHdvXG4gICAqIGRpZmZlcmVudCB0aGluZ3MgKCoqTDE3KiopLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIHRydXN0ZWQgcG9pbnRlciBnZXN0dXJlIHRvIGluamVjdCBvbiBtb2JpbGUsIGluIENTUyBwaXhlbHMgd2l0aGluIHRoZSBXZWJWaWV3J3Mgb3duIHZpZXdwb3J0LlxuICpcbiAqIE5vIGRldmljZS1waXhlbCBjb252ZXJzaW9uIGlzIGludm9sdmVkOiBDRFAgdGFrZXMgcGFnZSBjb29yZGluYXRlcywgc28gYGRldmljZVBpeGVsUmF0aW9gIGFuZCB0aGVcbiAqIFdlYlZpZXcncyBvZmZzZXQgdW5kZXIgdGhlIHN0YXR1cyBiYXIgbmV2ZXIgZW50ZXIgdGhlIHBpY3R1cmUgKHRoZXkgd291bGQgZm9yIG5hdGl2ZSBpbmplY3Rpb24pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Qge1xuICAvKipcbiAgICogYHRhcGAgaXMgdGhlIHRvdWNoIGFuYWxvZyBvZiBhIGxlZnQgY2xpY2s7IGBsb25nUHJlc3NgIGlzIHRoZSBtb2JpbGUgY29udGV4dC1tZW51IGdlc3R1cmUsIGkuZS4gd2hhdCBhXG4gICAqIGRlc2t0b3AgcmlnaHQgY2xpY2sgbWVhbnMgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdsb25nUHJlc3MnIHwgJ3RhcCc7XG5cbiAgLyoqXG4gICAqIFNlZSB7QGxpbmsgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0Lm1vZGlmaWVyc30uXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeCBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeSBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhvdyBsb25nIGEgbG9uZy1wcmVzcyBob2xkcyB0aGUgdG91Y2ggZG93biBiZWZvcmUgcmVsZWFzaW5nIGl0LlxuICpcbiAqIEl0IGhhcyB0byBjbGVhciAqKkFuZHJvaWQncyoqIGxvbmctcHJlc3MgdGhyZXNob2xkLCB3aGljaCBpcyA1MDBtcyBieSBkZWZhdWx0OiB0aGUgZ2VzdHVyZSBpc1xuICogcmVjb2duaXplZCBieSB0aGUgcGxhdGZvcm0sIGFuZCB0aGUgYGNvbnRleHRtZW51YCBPYnNpZGlhbidzIG1lbnVzIGhhbmcgb2ZmIGlzIHdoYXQgdGhlIHJlY29nbml6ZXJcbiAqIGVtaXRzLiA2MDBtcyBjbGVhcnMgdGhhdCB3aXRoIG1hcmdpbiB3aXRob3V0IG1ha2luZyBldmVyeSBsb25nLXByZXNzIHRlc3Qgbm90aWNlYWJseSBzbG93ZXIuXG4gKlxuICogVGhpcyBjb3JyZWN0cyB0aGUgZm9ybWVyIHJlYWRpbmcgXHUyMDE0IHRoYXQgT2JzaWRpYW4gTW9iaWxlIGltcGxlbWVudHMgbG9uZy1wcmVzcyBpdHNlbGYsIG9uIGEgSmF2YVNjcmlwdFxuICogYHRvdWNoc3RhcnRgIHRpbWVyLCBzbyB0aGUgZHdlbGwgb25seSBoYWQgdG8gY2xlYXIgKml0cyogdGhyZXNob2xkLiBNZWFzdXJlZCBhZ2FpbnN0IGEgcmVhbFxuICogYC5uYXYtZmlsZS10aXRsZWAsIGEgNjAwbXMgZHdlbGwgYmV0d2VlbiB0d28gZGlzcGF0Y2hlZCB0b3VjaGVzIG9wZW5lZCB0aGUgbm90ZSBpbnN0ZWFkIG9mIGl0cyBtZW51O1xuICogc2VlIHtAbGluayB0b1BvaW50ZXJDb21tYW5kc30gZm9yIHdoeSB0aGUgZHdlbGwgYWxvbmUgd2FzIG5ldmVyIGdvaW5nIHRvIGJlIGVub3VnaC5cbiAqL1xuY29uc3QgTE9OR19QUkVTU19EV0VMTF9JTl9NSUxMSVNFQ09ORFMgPSA2MDA7XG5cbmNvbnN0IE5PX01PRElGSUVSUyA9IDA7XG5jb25zdCBNT0RJRklFUl9CSVRfQUxUID0gMTtcbmNvbnN0IE1PRElGSUVSX0JJVF9DT05UUk9MID0gMjtcbmNvbnN0IE1PRElGSUVSX0JJVF9NRVRBID0gNDtcbmNvbnN0IE1PRElGSUVSX0JJVF9TSElGVCA9IDg7XG5cbi8qKlxuICogQ0RQJ3MgbW9kaWZpZXIgYml0bWFzaywgd2hpY2ggaXMgbm90IHRoZSBzYW1lIHNwZWxsaW5nIGFzIEVsZWN0cm9uJ3Mgc3RyaW5nIGxpc3QuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L0lucHV0LyNtZXRob2QtZGlzcGF0Y2hLZXlFdmVudH1cbiAqL1xuY29uc3QgQ0RQX01PRElGSUVSX0JJVF9CWV9OQU1FID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oW1xuICBbJ2FsdCcsIE1PRElGSUVSX0JJVF9BTFRdLFxuICBbJ2NvbnRyb2wnLCBNT0RJRklFUl9CSVRfQ09OVFJPTF0sXG4gIFsnbWV0YScsIE1PRElGSUVSX0JJVF9NRVRBXSxcbiAgWydzaGlmdCcsIE1PRElGSUVSX0JJVF9TSElGVF1cbl0pO1xuXG5jb25zdCBLRVlfQ09ERV9CQUNLU1BBQ0UgPSA4O1xuY29uc3QgS0VZX0NPREVfVEFCID0gOTtcbmNvbnN0IEtFWV9DT0RFX0VOVEVSID0gMTM7XG5jb25zdCBLRVlfQ09ERV9FU0NBUEUgPSAyNztcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX0xFRlQgPSAzNztcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX1VQID0gMzg7XG5jb25zdCBLRVlfQ09ERV9BUlJPV19SSUdIVCA9IDM5O1xuY29uc3QgS0VZX0NPREVfQVJST1dfRE9XTiA9IDQwO1xuY29uc3QgS0VZX0NPREVfREVMRVRFID0gNDY7XG5cbi8qKlxuICogTmFtZWQga2V5cywgd2l0aCB0aGUgYHRleHRgIGEgcmVhbCBrZXkgcHJlc3Mgd291bGQgcHJvZHVjZSAoYWJzZW50IHdoZW4gaXQgcHJvZHVjZXMgbm9uZSkuXG4gKlxuICogT25seSBrZXlzIHRoZXNlIHN1aXRlcyBhY3R1YWxseSBwcmVzcyBhcmUgbGlzdGVkLCBwbHVzIHRoZSBlZGl0aW5nIGtleXMgYSBjYWxsZXIgd291bGQgcmVhc29uYWJseSByZWFjaFxuICogZm9yIG5leHQuIEFuIHVua25vd24gbXVsdGktY2hhcmFjdGVyIGtleSBpcyBhIGNhbGxlciBlcnJvciwgbm90IGEgc2lsZW50IG5vLW9wIFx1MjAxNCBzZWVcbiAqIHtAbGluayB0b0tleUNvbW1hbmRzfS5cbiAqL1xuY29uc3QgTkFNRURfS0VZUyA9IG5ldyBNYXA8c3RyaW5nLCBOYW1lZEtleT4oW1xuICBbJ0Fycm93RG93bicsIHsgY29kZTogJ0Fycm93RG93bicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQVJST1dfRE9XTiB9XSxcbiAgWydBcnJvd0xlZnQnLCB7IGNvZGU6ICdBcnJvd0xlZnQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX0xFRlQgfV0sXG4gIFsnQXJyb3dSaWdodCcsIHsgY29kZTogJ0Fycm93UmlnaHQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX1JJR0hUIH1dLFxuICBbJ0Fycm93VXAnLCB7IGNvZGU6ICdBcnJvd1VwJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9BUlJPV19VUCB9XSxcbiAgWydCYWNrc3BhY2UnLCB7IGNvZGU6ICdCYWNrc3BhY2UnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0JBQ0tTUEFDRSB9XSxcbiAgWydEZWxldGUnLCB7IGNvZGU6ICdEZWxldGUnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0RFTEVURSB9XSxcbiAgWydFbnRlcicsIHsgY29kZTogJ0VudGVyJywgdGV4dDogJ1xccicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfRU5URVIgfV0sXG4gIFsnRXNjYXBlJywgeyBjb2RlOiAnRXNjYXBlJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9FU0NBUEUgfV0sXG4gIFsnVGFiJywgeyBjb2RlOiAnVGFiJywgdGV4dDogJ1xcdCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfVEFCIH1dXG5dKTtcblxuY29uc3QgRklSU1RfQ09ERV9QT0lOVF9JTkRFWCA9IDA7XG5jb25zdCBESUdJVF9aRVJPX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignMCcpO1xuY29uc3QgRElHSVRfTklORV9DT0RFX1BPSU5UID0gY29kZVBvaW50T2YoJzknKTtcbmNvbnN0IFVQUEVSQ0FTRV9BX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignQScpO1xuY29uc3QgVVBQRVJDQVNFX1pfQ09ERV9QT0lOVCA9IGNvZGVQb2ludE9mKCdaJyk7XG5cbi8qKlxuICogVGhlIENEUCBzcGVsbGluZyBvZiBvbmUgbmFtZWQga2V5LlxuICovXG5pbnRlcmZhY2UgTmFtZWRLZXkge1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRleHQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXhwcmVzc2lvbiB0aGUgaG9zdCBldmFsdWF0ZXMgdG8gYW5zd2VyIG9uZSBpbnB1dCByZXF1ZXN0LlxuICpcbiAqIE9wdGlvbmFsIGNoYWluaW5nIHRocm91Z2hvdXQ6IGJ5IHRoZSB0aW1lIHRoZSBob3N0IGFuc3dlcnMsIHRoZSBwYWdlIG1heSBoYXZlIG5hdmlnYXRlZCBhbmQgZHJvcHBlZCB0aGVcbiAqIG5hbWVzcGFjZSwgYW5kIGEgYFR5cGVFcnJvcmAgaW5zaWRlIHRoaXMgZXZhbHVhdGUgd291bGQgYmUgcmVwb3J0ZWQgYXMgYW4gaW5qZWN0aW9uIGZhaWx1cmUgdGhhdCBhbHJlYWR5XG4gKiBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdGhlIHJlbmRlcmVyIGlzIHdhaXRpbmcgb24uXG4gKiBAcGFyYW0gZXJyb3JNZXNzYWdlIC0gV2h5IHRoZSBpbmplY3Rpb24gZmFpbGVkLCB3aGVuIGl0IGRpZC4gT21pdCBvbiBzdWNjZXNzLlxuICogQHJldHVybnMgQSBzZWxmLWNvbnRhaW5lZCBleHByZXNzaW9uIHRvIHBhc3MgdG8gYFJ1bnRpbWUuZXZhbHVhdGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LnJlc29sdmVJbnB1dD8uKCR7SlNPTi5zdHJpbmdpZnkoaWQpfSwgJHtKU09OLnN0cmluZ2lmeShlcnJvck1lc3NhZ2UgPz8gbnVsbCl9KWA7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IGNvZGUgcG9pbnQgb2YgYSBub24tZW1wdHkgc3RyaW5nLlxuICpcbiAqIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBpcyB0eXBlZCBgbnVtYmVyIHwgdW5kZWZpbmVkYCwgc28gZXZlcnkgY2FsbCBzaXRlIHdvdWxkIG90aGVyd2lzZSBjYXJyeSBhXG4gKiBgPz8gZmFsbGJhY2tgIHRoYXQgbm8gaW5wdXQgY2FuIGV2ZXIgcmVhY2ggXHUyMDE0IGEgZGVhZCBicmFuY2ggdW5kZXIgdGhlIDEwMCUgY292ZXJhZ2UgZ2F0ZS4gVGhyb3dpbmcgaGVyZVxuICoga2VlcHMgdGhhdCBpbXBvc3NpYmxlIGNhc2UgaW4gT05FIHBsYWNlLCB3aGVyZSBhIHVuaXQgdGVzdCBjYW4gcmVhY2ggaXQgZGlyZWN0bHksIGluc3RlYWQgb2Ygc3ByZWFkaW5nXG4gKiB1bnJlYWNoYWJsZSBmYWxsYmFja3MgKG9yIGNvdmVyYWdlIHN1cHByZXNzaW9ucykgYWNyb3NzIHRoZSBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHRleHQgLSBBIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcmV0dXJucyBJdHMgZmlyc3QgY29kZSBwb2ludC5cbiAqIEB0aHJvd3MgV2hlbiBgdGV4dGAgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlUG9pbnRPZih0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBjb2RlUG9pbnQgPSB0ZXh0LmNvZGVQb2ludEF0KEZJUlNUX0NPREVfUE9JTlRfSU5ERVgpO1xuICBpZiAoY29kZVBvaW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvZGVQb2ludE9mIHJlY2VpdmVkIGFuIGVtcHR5IHN0cmluZy4nKTtcbiAgfVxuXG4gIHJldHVybiBjb2RlUG9pbnQ7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIG1vYmlsZSBpbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ0RQIGNvbW1hbmRzIHRoYXQgcmVhbGl6ZSBpdC5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFdoYXQgdGhlIHJlbmRlcmVyIGFza2VkIHRoZSBob3N0IHRvIGluamVjdC5cbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kcyB0byBzZW5kLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwSW5wdXRDb21tYW5kcyhyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGlmIChyZXF1ZXN0LmtpbmQgPT09ICdrZXknKSB7XG4gICAgcmV0dXJuIHRvS2V5Q29tbWFuZHMocmVxdWVzdCk7XG4gIH1cblxuICByZXR1cm4gdG9Qb2ludGVyQ29tbWFuZHMocmVxdWVzdCk7XG59XG5cbi8qKlxuICogRm9sZHMgcmVzb2x2ZWQgbW9kaWZpZXIgbmFtZXMgaW50byBDRFAncyBiaXRtYXNrLlxuICpcbiAqIFVua25vd24gbmFtZXMgYXJlIGlnbm9yZWQgcmF0aGVyIHRoYW4gdGhyb3dpbmc6IHRoZSByZW5kZXJlcidzIGB0b0VsZWN0cm9uTW9kaWZpZXJzYCBpcyBleGhhdXN0aXZlIG92ZXJcbiAqIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCB1bmlvbiwgc28gYW4gdW5rbm93biBuYW1lIGhlcmUgd291bGQgbWVhbiB0aGUgdHdvIGNvcGllcyBoYXZlIGFscmVhZHkgZHJpZnRlZCwgYW5kXG4gKiBmYWlsaW5nIHRoZSB3aG9sZSBnZXN0dXJlIGlzIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHByZXNzaW5nIGl0IHVubW9kaWZpZWQuXG4gKlxuICogQHBhcmFtIG1vZGlmaWVycyAtIFJlc29sdmVkIGxvd2VyY2FzZSBtb2RpZmllciBuYW1lcy5cbiAqIEByZXR1cm5zIFRoZSBDRFAgbW9kaWZpZXIgYml0bWFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwTW9kaWZpZXJzKG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICAvLyBTdW1taW5nIERJU1RJTkNUIGJpdHMgZXF1YWxzIE9SLWluZyB0aGVtLCBhbmQgdGhlIGBTZXRgIGlzIHdoYXQgbWFrZXMgdGhhdCBob2xkIGV2ZW4gd2hlbiBhIGNhbGxlclxuICAvLyBQYXNzZXMgdGhlIHNhbWUgbW9kaWZpZXIgdHdpY2UgXHUyMDE0IHNvIHRoZSBtYXNrIGlzIGJ1aWx0IHdpdGhvdXQgYSBiaXR3aXNlIG9wZXJhdG9yLlxuICBjb25zdCBiaXRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgbW9kaWZpZXJzKSB7XG4gICAgY29uc3QgYml0ID0gQ0RQX01PRElGSUVSX0JJVF9CWV9OQU1FLmdldChtb2RpZmllcik7XG4gICAgaWYgKGJpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiaXRzLmFkZChiaXQpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBiaXRtYXNrID0gTk9fTU9ESUZJRVJTO1xuICBmb3IgKGNvbnN0IGJpdCBvZiBiaXRzKSB7XG4gICAgYml0bWFzayArPSBiaXQ7XG4gIH1cblxuICByZXR1cm4gYml0bWFzaztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGtleSBuYW1lIHRvIGl0cyBDRFAgc3BlbGxpbmcuXG4gKlxuICogQHBhcmFtIGtleSAtIEEgbmFtZWQga2V5IG9yIGEgc2luZ2xlIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiByZXNvbHZlS2V5KGtleTogc3RyaW5nKTogTmFtZWRLZXkge1xuICBjb25zdCBuYW1lZEtleSA9IE5BTUVEX0tFWVMuZ2V0KGtleSk7XG4gIGlmIChuYW1lZEtleSkge1xuICAgIHJldHVybiBuYW1lZEtleTtcbiAgfVxuXG4gIC8vIFwiRXhhY3RseSBvbmUgY29kZSBwb2ludFwiLCB0ZXN0ZWQgd2l0aG91dCBzcGxpdHRpbmcgdGhlIHN0cmluZzogYGZyb21Db2RlUG9pbnRgIHJvdW5kLXRyaXBzIG9ubHkgd2hlblxuICAvLyBga2V5YCBpcyB0aGF0IHNpbmdsZSBjb2RlIHBvaW50LCBzbyBhbiBhc3RyYWwtcGxhbmUgY2hhcmFjdGVyIGNvdW50cyBhcyBvbmUgYW5kIGAnQ3RybCtLJ2AgZG9lcyBub3QuXG4gIGNvbnN0IGNvZGVQb2ludCA9IGtleS5jb2RlUG9pbnRBdChGSVJTVF9DT0RFX1BPSU5UX0lOREVYKTtcbiAgaWYgKGNvZGVQb2ludCA9PT0gdW5kZWZpbmVkIHx8IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCkgIT09IGtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBwcmVzc0tleSByZWNlaXZlZCBhbiB1bmtub3duIGtleSBuYW1lIG9uIG1vYmlsZTogJHtKU09OLnN0cmluZ2lmeShrZXkpfS4gYFxuICAgICAgICArIGBQYXNzIGEgc2luZ2xlIGNoYXJhY3RlciBvciBvbmUgb2Y6ICR7Wy4uLk5BTUVEX0tFWVMua2V5cygpXS5qb2luKCcsICcpfS5gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHVwcGVyQ2FzZWRDb2RlUG9pbnQgPSBjb2RlUG9pbnRPZihrZXkudG9VcHBlckNhc2UoKSk7XG4gIHJldHVybiB7XG4gICAgY29kZTogcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludCksXG4gICAgdGV4dDoga2V5LFxuICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogdXBwZXJDYXNlZENvZGVQb2ludFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwaHlzaWNhbCBgY29kZWAgZm9yIGEgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAqXG4gKiBDaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEFTQ0lJIGxldHRlci9kaWdpdCByb3dzIGhhdmUgbm8gc3RhYmxlIHBoeXNpY2FsIGtleSwgc28gdGhleSBnZXQgYW4gZW1wdHlcbiAqIGBjb2RlYCBcdTIwMTQgdGhlIGB0ZXh0YCBzdGlsbCBjYXJyaWVzIHRoZW0sIHdoaWNoIGlzIHdoYXQgYW4gZWRpdG9yIHJlYWRzLlxuICpcbiAqIEBwYXJhbSB1cHBlckNhc2VkQ29kZVBvaW50IC0gVGhlIGNoYXJhY3RlcidzIHVwcGVyLWNhc2VkIGNvZGUgcG9pbnQuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIGBjb2RlYCwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlcmUgaXMgbm8gc3RhYmxlIG9uZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHVwcGVyQ2FzZWRDb2RlUG9pbnQgPj0gVVBQRVJDQVNFX0FfQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IFVQUEVSQ0FTRV9aX0NPREVfUE9JTlQpIHtcbiAgICByZXR1cm4gYEtleSR7U3RyaW5nLmZyb21Db2RlUG9pbnQodXBwZXJDYXNlZENvZGVQb2ludCl9YDtcbiAgfVxuXG4gIGlmICh1cHBlckNhc2VkQ29kZVBvaW50ID49IERJR0lUX1pFUk9fQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IERJR0lUX05JTkVfQ09ERV9QT0lOVCkge1xuICAgIHJldHVybiBgRGlnaXQke1N0cmluZy5mcm9tQ29kZVBvaW50KHVwcGVyQ2FzZWRDb2RlUG9pbnQpfWA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kIHNlcXVlbmNlIGZvciBhIGtleSBwcmVzcy5cbiAqXG4gKiBNaXJyb3JzIHRoZSBkZXNrdG9wIHR3aW4ncyB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgIGluIENEUCdzIHNwZWxsaW5nOiBgcmF3S2V5RG93bmAgZmlyZXNcbiAqIGBrZXlkb3duYCBhbG9uZSwgYGNoYXJgIGZpcmVzIGBrZXlwcmVzc2AgLyBgYmVmb3JlaW5wdXRgIC8gYGlucHV0YCwgYGtleVVwYCBmaXJlcyBga2V5dXBgLiBBIGtleSB0aGF0XG4gKiBwcm9kdWNlcyBubyB0ZXh0IChgRXNjYXBlYCkgc2tpcHMgdGhlIGBjaGFyYCwgZXhhY3RseSBhcyBhIHJlYWwgb25lIGRvZXMuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUga2V5IHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5Q29tbWFuZHMocmVxdWVzdDogTW9iaWxlS2V5SW5wdXRSZXF1ZXN0KTogQ2RwSW5wdXRDb21tYW5kW10ge1xuICBjb25zdCB7IGNvZGUsIHRleHQsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZSB9ID0gcmVzb2x2ZUtleShyZXF1ZXN0LmtleSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcbiAgY29uc3QgYmFzZSA9IHsgY29kZSwga2V5OiByZXF1ZXN0LmtleSwgbW9kaWZpZXJzLCB3aW5kb3dzVmlydHVhbEtleUNvZGUgfTtcblxuICBjb25zdCBjb21tYW5kczogQ2RwSW5wdXRDb21tYW5kW10gPSBbXG4gICAgeyBtZXRob2Q6ICdJbnB1dC5kaXNwYXRjaEtleUV2ZW50JywgcGFyYW1zOiB7IC4uLmJhc2UsIHR5cGU6ICdyYXdLZXlEb3duJyB9IH1cbiAgXTtcblxuICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29tbWFuZHMucHVzaCh7IG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoS2V5RXZlbnQnLCBwYXJhbXM6IHsgLi4uYmFzZSwgdGV4dCwgdHlwZTogJ2NoYXInIH0gfSk7XG4gIH1cblxuICBjb21tYW5kcy5wdXNoKHsgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHBhcmFtczogeyAuLi5iYXNlLCB0eXBlOiAna2V5VXAnIH0gfSk7XG5cbiAgcmV0dXJuIGNvbW1hbmRzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBzZXF1ZW5jZSBmb3IgYSB0YXAgb3IgYSBsb25nLXByZXNzLlxuICpcbiAqICoqVGhlIHR3byBnZXN0dXJlcyB0YWtlIGRpZmZlcmVudCBDRFAgcm91dGVzLCBhbmQgdGhhdCBhc3ltbWV0cnkgaXMgdGhlIHdob2xlIHBvaW50LioqXG4gKlxuICogQSB0YXAgaXMgYSB0cnVzdGVkIHRvdWNoIHBhaXIsIHdoaWNoIGlzIGFsbCBDaHJvbWl1bSBuZWVkcyBcdTIwMTQgaXQgc3ludGhlc2l6ZXMgYHBvaW50ZXJkb3duYCAvXG4gKiBgdG91Y2hzdGFydGAgLyBgcG9pbnRlcnVwYCAvIGB0b3VjaGVuZGAgLyBgY2xpY2tgIGZyb20gaXQsIGV2ZXJ5IG9uZSBgaXNUcnVzdGVkYC4gVGhlIHJlbGVhc2UgY2Fycmllc1xuICogYW4gZW1wdHkgYHRvdWNoUG9pbnRzYCBsaXN0LCB3aGljaCBpcyBDRFAncyBzcGVsbGluZyBmb3IgXCJhbGwgZmluZ2VycyBsaWZ0ZWRcIi5cbiAqXG4gKiBBIGxvbmctcHJlc3MgY2Fubm90IGJlIHRoYXQgc2FtZSBwYWlyIGhlbGQgYXBhcnQgYnkgYSBkd2VsbCwgYmVjYXVzZSBgSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50YCBpbmplY3RzXG4gKiBhIGBXZWJUb3VjaEV2ZW50YCAqKnBhc3QqKiBBbmRyb2lkJ3MgZ2VzdHVyZSByZWNvZ25pemVyOiBubyByZWNvZ25pemVyIHNlZXMgdGhlIGhvbGQsIHNvIG5vIGxvbmctcHJlc3NcbiAqIGdlc3R1cmUgaXMgZXZlciBwcm9kdWNlZCBhbmQgdGhlIHBhaXIgaXMgY2xhc3NpZmllZCBhcyBhIHRhcCBob3dldmVyIGxvbmcgdGhlIGR3ZWxsIGlzLlxuICogYElucHV0LnN5bnRoZXNpemVUYXBHZXN0dXJlYCBpbnN0ZWFkIGdvZXMgdGhyb3VnaCBDaHJvbWl1bSdzIHN5bnRoZXRpYy1nZXN0dXJlIGNvbnRyb2xsZXIsIHdoaWNoIGJ1aWxkc1xuICogcmVhbCBgTW90aW9uRXZlbnRgcyBhbmQgZmVlZHMgdGhlbSB0byB0aGUgcGxhdGZvcm0gcmVjb2duaXplciBcdTIwMTQgdGhlIHN0ZXAgdGhlIGRpc3BhdGNoIHJvdXRlIHNraXBzLlxuICpcbiAqIE1lYXN1cmVkIG9uIGEgbGl2ZSBlbXVsYXRvciAoMjAyNi0wOS0wOCk6IHRoZSBkaXNwYXRjaCBwYWlyIHdpdGggYSA2MDBtcyBkd2VsbCwgYWltZWQgYXQgYSAqKnJlYWwqKlxuICogYC5uYXYtZmlsZS10aXRsZWAgaW4gdGhlIGZpbGUgZXhwbG9yZXIsIHByb2R1Y2VkIGBwb2ludGVyZG93bmAgLyBgdG91Y2hzdGFydGAgLyBgdG91Y2hlbmRgIC8gYGNsaWNrYCBhbmRcbiAqICoqb3BlbmVkIHRoZSBub3RlKiogXHUyMDE0IGEgdGFwLiBObyBgY29udGV4dG1lbnVgLCBhbmQgbm8gT2JzaWRpYW4gbWVudS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSBwb2ludGVyIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvUG9pbnRlckNvbW1hbmRzKHJlcXVlc3Q6IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcblxuICBpZiAocmVxdWVzdC5raW5kID09PSAnbG9uZ1ByZXNzJykge1xuICAgIC8vIGBzeW50aGVzaXplVGFwR2VzdHVyZWAgdGFrZXMgbm8gbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgQ0RQJ3MgZ2VzdHVyZSBBUEkgaGFzIG5vIHBhcmFtZXRlciBmb3Igb25lIFx1MjAxNCBhbmRcbiAgICAvLyBBIHRvdWNoIHNjcmVlbiBoYXMgbm8gbW9kaWZpZXIga2V5cyB0byBob2xkIGR1cmluZyBhIHByZXNzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGNhcnJ5IGhlcmUuXG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnSW5wdXQuc3ludGhlc2l6ZVRhcEdlc3R1cmUnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBkdXJhdGlvbjogTE9OR19QUkVTU19EV0VMTF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgZ2VzdHVyZVNvdXJjZVR5cGU6ICd0b3VjaCcsXG4gICAgICAgICAgeDogcmVxdWVzdC54LFxuICAgICAgICAgIHk6IHJlcXVlc3QueVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50JyxcbiAgICAgIHBhcmFtczogeyBtb2RpZmllcnMsIHRvdWNoUG9pbnRzOiBbeyB4OiByZXF1ZXN0LngsIHk6IHJlcXVlc3QueSB9XSwgdHlwZTogJ3RvdWNoU3RhcnQnIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsXG4gICAgICBwYXJhbXM6IHsgbW9kaWZpZXJzLCB0b3VjaFBvaW50czogW10sIHR5cGU6ICd0b3VjaEVuZCcgfVxuICAgIH1cbiAgXTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBc0JPLE1BQU0sNEJBQTRCO0FBU2xDLE1BQU0sdUNBQXVDO0FBNkdwRCxNQUFNLG1DQUFtQztBQUV6QyxNQUFNLGVBQWU7QUFDckIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxxQkFBcUI7QUFPM0IsTUFBTSwyQkFBMkIsb0JBQUksSUFBb0I7QUFBQSxFQUN2RCxDQUFDLE9BQU8sZ0JBQWdCO0FBQUEsRUFDeEIsQ0FBQyxXQUFXLG9CQUFvQjtBQUFBLEVBQ2hDLENBQUMsUUFBUSxpQkFBaUI7QUFBQSxFQUMxQixDQUFDLFNBQVMsa0JBQWtCO0FBQzlCLENBQUM7QUFFRCxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGVBQWU7QUFDckIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxrQkFBa0I7QUFTeEIsTUFBTSxhQUFhLG9CQUFJLElBQXNCO0FBQUEsRUFDM0MsQ0FBQyxhQUFhLEVBQUUsTUFBTSxhQUFhLHVCQUF1QixvQkFBb0IsQ0FBQztBQUFBLEVBQy9FLENBQUMsYUFBYSxFQUFFLE1BQU0sYUFBYSx1QkFBdUIsb0JBQW9CLENBQUM7QUFBQSxFQUMvRSxDQUFDLGNBQWMsRUFBRSxNQUFNLGNBQWMsdUJBQXVCLHFCQUFxQixDQUFDO0FBQUEsRUFDbEYsQ0FBQyxXQUFXLEVBQUUsTUFBTSxXQUFXLHVCQUF1QixrQkFBa0IsQ0FBQztBQUFBLEVBQ3pFLENBQUMsYUFBYSxFQUFFLE1BQU0sYUFBYSx1QkFBdUIsbUJBQW1C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
186
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vYmlsZS1pbnB1dC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRyYW5zbGF0ZXMgYSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ2hyb21lIERldlRvb2xzIFByb3RvY29sIGBJbnB1dC4qYCBjb21tYW5kc1xuICogdGhhdCByZWFsaXplIGl0IChzZWUgKipMMzkqKikuXG4gKlxuICogUHVyZSBhbmQgc3luY2hyb25vdXMgYnkgZGVzaWduOiB0aGUgV2ViVmlldyBjb25uZWN0aW9uICh7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb259KSBzZW5kcyB3aGF0ZXZlciB0aGlzXG4gKiByZXR1cm5zLCBzbyBldmVyeSBkZWNpc2lvbiB0aGF0IGlzIHdvcnRoIGEgdGVzdCBcdTIwMTQgdGhlIHRvdWNoIHBhaXIgYSB0YXAgZXhwYW5kcyBpbnRvLCB0aGUgZHdlbGwgYVxuICogbG9uZy1wcmVzcyBhZGRzLCB0aGUgYHJhd0tleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgc2hhcGUgYSBrZXkgcHJlc3MgbWlycm9ycyBmcm9tIHRoZSBkZXNrdG9wIHR3aW4sIHRoZVxuICogbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgbGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIHRyYW5zcG9ydCdzIEkvTyBwYXRoLlxuICpcbiAqIFRoZSByZXF1ZXN0IHRyYXZlbHMgcmVuZGVyZXIgXHUyMTkyIGhvc3QgYXMgSlNPTiAodGhlIHJlbmRlcmVyIGNvbXB1dGVzIHRoZSBjb29yZGluYXRlcywgYmVjYXVzZSBvbmx5IGl0IGNhblxuICogc2VlIHRoZSBET00pLCBzbyBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgY29tbWFuZCBzaGFwZXMgYXJlIGRlbGliZXJhdGVseSBwbGFpbiBkYXRhLlxuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGZ1bmN0aW9uIHRoZSBob3N0IGV4cG9zZXMgb24gdGhlIHBhZ2Ugc28gdGhlIHJlbmRlcmVyIGNhbiBoYW5kIGl0IGFuXG4gKiBpbnB1dCByZXF1ZXN0IG1pZC1jbG9zdXJlLlxuICpcbiAqIEl0IGlzIHBhc3NlZCAqaW50byogdGhlIHNlcmlhbGl6ZWQgYm9vdHN0cmFwIGNsb3N1cmUgYXMgZGF0YSByYXRoZXIgdGhhbiByZWZlcmVuY2VkIGZyb20gaXQsIGJlY2F1c2UgdGhhdFxuICogY2xvc3VyZSBtYXkgbm90IHJlYWQgb3V0ZXIgc2NvcGUgKCoqTDE1KiopIFx1MjAxNCBzbyB0aGlzIHN0YXlzIHRoZSBzaW5nbGUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUgPSAnX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0lucHV0JztcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgcmVuZGVyZXIgd2FpdHMgZm9yIHRoZSBob3N0IHRvIHNlcnZpY2Ugb25lIGlucHV0IHJlcXVlc3QgYmVmb3JlIGdpdmluZyB1cC5cbiAqXG4gKiBHZW5lcm91cyByZWxhdGl2ZSB0byB0aGUgd29yayAoYSB0YXAgaXMgdHdvIENEUCBjb21tYW5kczsgYSBsb25nLXByZXNzIGFkZHMgYSA2MDBtcyBkd2VsbCk6IHRoZSBwb2ludCBpc1xuICogdG8gZmFpbCB3aXRoIGEgbGVnaWJsZSBlcnJvciByYXRoZXIgdGhhbiBoYW5nIHRoZSBjbG9zdXJlIHVudGlsIHRoZSB3aG9sZSBydW4gdGltZXMgb3V0LiBQYXNzZWQgaW50byB0aGVcbiAqIGJvb3RzdHJhcCBjbG9zdXJlIGFzIGRhdGEsIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUV9LlxuICovXG5leHBvcnQgY29uc3QgTU9CSUxFX0lOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuXG4vKipcbiAqIEEgc2luZ2xlIENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb21tYW5kLlxuICpcbiAqIEl0IG9uY2UgYWxzbyBjYXJyaWVkIGEgYGRlbGF5QmVmb3JlSW5NaWxsaXNlY29uZHNgLCBzbyB0aGUgaG9zdCB3b3VsZCBzbGVlcCBiZXR3ZWVuIHRoZSB0d28gaGFsdmVzIG9mIGFcbiAqIGxvbmctcHJlc3MuIFRoYXQgZHdlbGwgaXMgZ29uZTogdGhlIGdlc3R1cmUgaXMgbm93IG9uZSBgSW5wdXQuc3ludGhlc2l6ZVRhcEdlc3R1cmVgIHRoYXQgaG9sZHMgaXRzZWxmXG4gKiBmb3IgaXRzIG93biBgZHVyYXRpb25gLCBzbyBubyBjb21tYW5kIGluIGFueSBzZXF1ZW5jZSBuZWVkcyB0byBiZSBzcGFjZWQgZnJvbSB0aGUgb25lIGJlZm9yZSBpdCwgYW5kIGFcbiAqIGtub2Igbm90aGluZyBzZXRzIGlzIHdvcnNlIHRoYW4gbm8ga25vYi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBJbnB1dENvbW1hbmQge1xuICAvKipcbiAgICogVGhlIENEUCBtZXRob2QgbmFtZSwgZS5nLiBgSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50YC5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSByZW5kZXJlciBoYW5kcyB0byB0aGUgaG9zdCBiaW5kaW5nOiBvbmUgcmVxdWVzdCwgcGx1cyB0aGUgaWQgdG8gYW5zd2VyIGl0IG9uLlxuICpcbiAqIFRoZSByZW5kZXJlciBidWlsZHMgdGhpcyBsaXRlcmFsIGluc2lkZSB0aGUgc2VyaWFsaXplZCBib290c3RyYXAgY2xvc3VyZSwgd2hpY2ggY2Fubm90IGltcG9ydCAoKipMMTUqKiksXG4gKiBzbyB0aGUgc2hhcGUgaXMgZGVjbGFyZWQgaGVyZSBhbmQgbWlycm9yZWQgdGhlcmUuIFRoZXkgYXJlIG9uZSB3aXJlIGZvcm1hdDsgY2hhbmdlIHRoZW0gdG9nZXRoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlSW5wdXRFbnZlbG9wZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBpZCB0aGUgcmVuZGVyZXIgaXMgd2FpdGluZyBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdG8gaW5qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdDogTW9iaWxlSW5wdXRSZXF1ZXN0O1xufVxuXG4vKipcbiAqIEFueXRoaW5nIHRoZSByZW5kZXJlciBjYW4gYXNrIHRoZSBob3N0IHRvIGluamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9iaWxlSW5wdXRSZXF1ZXN0ID0gTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHwgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdDtcblxuLyoqXG4gKiBBIHRydXN0ZWQga2V5IHByZXNzIHRvIGluamVjdCBvbiBtb2JpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gcHJlc3MsIGluIHRoZSBzYW1lIHNwZWxsaW5nIHRoZSBkZXNrdG9wIHR3aW4gdGFrZXM6IGVpdGhlciBhIG5hbWVkIGtleVxuICAgKiAoYEVudGVyYCwgYEVzY2FwZWAsIGBUYWJgLCBgQmFja3NwYWNlYCwgYERlbGV0ZWAsIGFuIGFycm93KSBvciBhIHNpbmdsZSBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuXG4gIC8qKlxuICAgKiBNb2RpZmllcnMgYWxyZWFkeSByZXNvbHZlZCB0byB0aGVpciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsb3dlcmNhc2UgbmFtZXMgYnkgdGhlIHJlbmRlcmVyJ3NcbiAgICogYHRvRWxlY3Ryb25Nb2RpZmllcnNgIFx1MjAxNCB0aGUgb25lIG1hcHBpbmcgYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgc2hhcmUsIHNvIGAnTW9kJ2AgY2Fubm90IG1lYW4gdHdvXG4gICAqIGRpZmZlcmVudCB0aGluZ3MgKCoqTDE3KiopLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIHRydXN0ZWQgcG9pbnRlciBnZXN0dXJlIHRvIGluamVjdCBvbiBtb2JpbGUsIGluIENTUyBwaXhlbHMgd2l0aGluIHRoZSBXZWJWaWV3J3Mgb3duIHZpZXdwb3J0LlxuICpcbiAqIE5vIGRldmljZS1waXhlbCBjb252ZXJzaW9uIGlzIGludm9sdmVkOiBDRFAgdGFrZXMgcGFnZSBjb29yZGluYXRlcywgc28gYGRldmljZVBpeGVsUmF0aW9gIGFuZCB0aGVcbiAqIFdlYlZpZXcncyBvZmZzZXQgdW5kZXIgdGhlIHN0YXR1cyBiYXIgbmV2ZXIgZW50ZXIgdGhlIHBpY3R1cmUgKHRoZXkgd291bGQgZm9yIG5hdGl2ZSBpbmplY3Rpb24pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Qge1xuICAvKipcbiAgICogYHRhcGAgaXMgdGhlIHRvdWNoIGFuYWxvZyBvZiBhIGxlZnQgY2xpY2s7IGBsb25nUHJlc3NgIGlzIHRoZSBtb2JpbGUgY29udGV4dC1tZW51IGdlc3R1cmUsIGkuZS4gd2hhdCBhXG4gICAqIGRlc2t0b3AgcmlnaHQgY2xpY2sgbWVhbnMgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdsb25nUHJlc3MnIHwgJ3RhcCc7XG5cbiAgLyoqXG4gICAqIFNlZSB7QGxpbmsgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0Lm1vZGlmaWVyc30uXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeCBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeSBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBDRFAgYFJlbW90ZU9iamVjdGAgYW4gZXZhbHVhdGUgcmV0dXJucywgcmVkdWNlZCB0byB0aGUgb25lIGZpZWxkIHRoaXMgbW9kdWxlIHJlYWRzLlxuICovXG5pbnRlcmZhY2UgRXZhbHVhdGVSZW1vdGVPYmplY3Qge1xuICByZWFkb25seSB2YWx1ZT86IHVua25vd247XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2YgYSBDRFAgYFJ1bnRpbWUuZXZhbHVhdGVgIHJlcGx5IHRoaXMgbW9kdWxlIHJlYWRzLlxuICpcbiAqIERlY2xhcmVkIHJhdGhlciB0aGFuIGltcG9ydGVkOiB0aGUgaGFybmVzcyB0YWxrcyB0byB0aGUgV2ViVmlldyBkZWJ1Z2dlciBvdmVyIGEgcmF3IHNvY2tldCwgc28gdGhlcmVcbiAqIGlzIG5vIGdlbmVyYXRlZCBwcm90b2NvbCB0eXBlIHRvIHJlYWNoIGZvciwgYW5kIG9ubHkgdGhlIHJldHVybmVkIHZhbHVlIG1hdHRlcnMgaGVyZS5cbiAqL1xuaW50ZXJmYWNlIEV2YWx1YXRlUmVzdWx0IHtcbiAgcmVhZG9ubHkgcmVzdWx0PzogRXZhbHVhdGVSZW1vdGVPYmplY3Q7XG59XG5cbi8qKlxuICogSG93IGxvbmcgYSBsb25nLXByZXNzIGhvbGRzIHRoZSB0b3VjaCBkb3duIGJlZm9yZSByZWxlYXNpbmcgaXQuXG4gKlxuICogSXQgaGFzIHRvIGNsZWFyICoqQW5kcm9pZCdzKiogbG9uZy1wcmVzcyB0aHJlc2hvbGQsIHdoaWNoIGlzIDUwMG1zIGJ5IGRlZmF1bHQ6IHRoZSBnZXN0dXJlIGlzXG4gKiByZWNvZ25pemVkIGJ5IHRoZSBwbGF0Zm9ybSwgYW5kIHRoZSBgY29udGV4dG1lbnVgIE9ic2lkaWFuJ3MgbWVudXMgaGFuZyBvZmYgaXMgd2hhdCB0aGUgcmVjb2duaXplclxuICogZW1pdHMuIDYwMG1zIGNsZWFycyB0aGF0IHdpdGggbWFyZ2luIHdpdGhvdXQgbWFraW5nIGV2ZXJ5IGxvbmctcHJlc3MgdGVzdCBub3RpY2VhYmx5IHNsb3dlci5cbiAqXG4gKiBUaGlzIGNvcnJlY3RzIHRoZSBmb3JtZXIgcmVhZGluZyBcdTIwMTQgdGhhdCBPYnNpZGlhbiBNb2JpbGUgaW1wbGVtZW50cyBsb25nLXByZXNzIGl0c2VsZiwgb24gYSBKYXZhU2NyaXB0XG4gKiBgdG91Y2hzdGFydGAgdGltZXIsIHNvIHRoZSBkd2VsbCBvbmx5IGhhZCB0byBjbGVhciAqaXRzKiB0aHJlc2hvbGQuIE1lYXN1cmVkIGFnYWluc3QgYSByZWFsXG4gKiBgLm5hdi1maWxlLXRpdGxlYCwgYSA2MDBtcyBkd2VsbCBiZXR3ZWVuIHR3byBkaXNwYXRjaGVkIHRvdWNoZXMgb3BlbmVkIHRoZSBub3RlIGluc3RlYWQgb2YgaXRzIG1lbnU7XG4gKiBzZWUge0BsaW5rIHRvUG9pbnRlckNvbW1hbmRzfSBmb3Igd2h5IHRoZSBkd2VsbCBhbG9uZSB3YXMgbmV2ZXIgZ29pbmcgdG8gYmUgZW5vdWdoLlxuICovXG5jb25zdCBMT05HX1BSRVNTX0RXRUxMX0lOX01JTExJU0VDT05EUyA9IDYwMDtcblxuY29uc3QgTk9fTU9ESUZJRVJTID0gMDtcbmNvbnN0IE1PRElGSUVSX0JJVF9BTFQgPSAxO1xuY29uc3QgTU9ESUZJRVJfQklUX0NPTlRST0wgPSAyO1xuY29uc3QgTU9ESUZJRVJfQklUX01FVEEgPSA0O1xuY29uc3QgTU9ESUZJRVJfQklUX1NISUZUID0gODtcblxuLyoqXG4gKiBDRFAncyBtb2RpZmllciBiaXRtYXNrLCB3aGljaCBpcyBub3QgdGhlIHNhbWUgc3BlbGxpbmcgYXMgRWxlY3Ryb24ncyBzdHJpbmcgbGlzdC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvSW5wdXQvI21ldGhvZC1kaXNwYXRjaEtleUV2ZW50fVxuICovXG5jb25zdCBDRFBfTU9ESUZJRVJfQklUX0JZX05BTUUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPihbXG4gIFsnYWx0JywgTU9ESUZJRVJfQklUX0FMVF0sXG4gIFsnY29udHJvbCcsIE1PRElGSUVSX0JJVF9DT05UUk9MXSxcbiAgWydtZXRhJywgTU9ESUZJRVJfQklUX01FVEFdLFxuICBbJ3NoaWZ0JywgTU9ESUZJRVJfQklUX1NISUZUXVxuXSk7XG5cbmNvbnN0IEtFWV9DT0RFX0JBQ0tTUEFDRSA9IDg7XG5jb25zdCBLRVlfQ09ERV9UQUIgPSA5O1xuY29uc3QgS0VZX0NPREVfRU5URVIgPSAxMztcbmNvbnN0IEtFWV9DT0RFX0VTQ0FQRSA9IDI3O1xuY29uc3QgS0VZX0NPREVfQVJST1dfTEVGVCA9IDM3O1xuY29uc3QgS0VZX0NPREVfQVJST1dfVVAgPSAzODtcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX1JJR0hUID0gMzk7XG5jb25zdCBLRVlfQ09ERV9BUlJPV19ET1dOID0gNDA7XG5jb25zdCBLRVlfQ09ERV9ERUxFVEUgPSA0NjtcblxuLyoqXG4gKiBOYW1lZCBrZXlzLCB3aXRoIHRoZSBgdGV4dGAgYSByZWFsIGtleSBwcmVzcyB3b3VsZCBwcm9kdWNlIChhYnNlbnQgd2hlbiBpdCBwcm9kdWNlcyBub25lKS5cbiAqXG4gKiBPbmx5IGtleXMgdGhlc2Ugc3VpdGVzIGFjdHVhbGx5IHByZXNzIGFyZSBsaXN0ZWQsIHBsdXMgdGhlIGVkaXRpbmcga2V5cyBhIGNhbGxlciB3b3VsZCByZWFzb25hYmx5IHJlYWNoXG4gKiBmb3IgbmV4dC4gQW4gdW5rbm93biBtdWx0aS1jaGFyYWN0ZXIga2V5IGlzIGEgY2FsbGVyIGVycm9yLCBub3QgYSBzaWxlbnQgbm8tb3AgXHUyMDE0IHNlZVxuICoge0BsaW5rIHRvS2V5Q29tbWFuZHN9LlxuICovXG5jb25zdCBOQU1FRF9LRVlTID0gbmV3IE1hcDxzdHJpbmcsIE5hbWVkS2V5PihbXG4gIFsnQXJyb3dEb3duJywgeyBjb2RlOiAnQXJyb3dEb3duJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9BUlJPV19ET1dOIH1dLFxuICBbJ0Fycm93TGVmdCcsIHsgY29kZTogJ0Fycm93TGVmdCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQVJST1dfTEVGVCB9XSxcbiAgWydBcnJvd1JpZ2h0JywgeyBjb2RlOiAnQXJyb3dSaWdodCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQVJST1dfUklHSFQgfV0sXG4gIFsnQXJyb3dVcCcsIHsgY29kZTogJ0Fycm93VXAnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX1VQIH1dLFxuICBbJ0JhY2tzcGFjZScsIHsgY29kZTogJ0JhY2tzcGFjZScsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQkFDS1NQQUNFIH1dLFxuICBbJ0RlbGV0ZScsIHsgY29kZTogJ0RlbGV0ZScsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfREVMRVRFIH1dLFxuICBbJ0VudGVyJywgeyBjb2RlOiAnRW50ZXInLCB0ZXh0OiAnXFxyJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9FTlRFUiB9XSxcbiAgWydFc2NhcGUnLCB7IGNvZGU6ICdFc2NhcGUnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0VTQ0FQRSB9XSxcbiAgWydUYWInLCB7IGNvZGU6ICdUYWInLCB0ZXh0OiAnXFx0Jywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9UQUIgfV1cbl0pO1xuXG5jb25zdCBGSVJTVF9DT0RFX1BPSU5UX0lOREVYID0gMDtcbmNvbnN0IERJR0lUX1pFUk9fQ09ERV9QT0lOVCA9IGNvZGVQb2ludE9mKCcwJyk7XG5jb25zdCBESUdJVF9OSU5FX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignOScpO1xuY29uc3QgVVBQRVJDQVNFX0FfQ09ERV9QT0lOVCA9IGNvZGVQb2ludE9mKCdBJyk7XG5jb25zdCBVUFBFUkNBU0VfWl9DT0RFX1BPSU5UID0gY29kZVBvaW50T2YoJ1onKTtcblxuLyoqXG4gKiBUaGUgQ0RQIHNwZWxsaW5nIG9mIG9uZSBuYW1lZCBrZXkuXG4gKi9cbmludGVyZmFjZSBOYW1lZEtleSB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBleHByZXNzaW9uIHRoZSBob3N0IGV2YWx1YXRlcyB0byBjbGFpbSBvbmUgaW5wdXQgcmVxdWVzdCBiZWZvcmUgaW5qZWN0aW5nIGl0LlxuICpcbiAqIENEUCBkZWxpdmVycyBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCB0byAqKmV2ZXJ5KiogYXR0YWNoZWQgc2Vzc2lvbiwgc28gZWFjaCBOb2RlIHByb2Nlc3MgaG9sZGluZyBhblxuICogaW5wdXQgY2hhbm5lbCB0byB0aGlzIFdlYlZpZXcgc2VydmljZXMgdGhlIHNhbWUgcmVxdWVzdCBhbmQgaW5qZWN0cyB0aGUgc2FtZSBnZXN0dXJlLiBUaGUgY2xhaW0gaXNcbiAqIHdoYXQgbWFrZXMgdGhlIGluamVjdGlvbiBleGFjdGx5LW9uY2UgYWNyb3NzIGFsbCBvZiB0aGVtOiB0aGUgcGFnZSBpcyB0aGUgb25seSB0aGluZyBldmVyeSBob3N0XG4gKiBzaGFyZXMsIGFuZCBpdCBydW5zIHRoZSByYWNpbmcgZXZhbHVhdGVzIG9uZSBhZnRlciBhbm90aGVyIG9uIGl0cyBzaW5nbGUgdGhyZWFkLCBzbyBleGFjdGx5IG9uZSBvZlxuICogdGhlbSBnZXRzIGB0cnVlYC5cbiAqXG4gKiBPcHRpb25hbCBjaGFpbmluZyBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHtAbGluayBidWlsZFJlc29sdmVJbnB1dEV4cHJlc3Npb259LCBhbmQgaXQgaXMgd2h5XG4gKiB7QGxpbmsgY2hlY2tJbnB1dENsYWltR3JhbnRlZH0gdHJlYXRzIGEgbm9uLWBmYWxzZWAgcmVzdWx0IGFzIGNsYWltZWQ6IGEgcGFnZSB0aGF0IGhhcyBkcm9wcGVkIHRoZVxuICogbmFtZXNwYWNlIHlpZWxkcyBgdW5kZWZpbmVkYCwgYW5kIGluamVjdGluZyB0d2ljZSBpcyBhIGZhciBiZXR0ZXIgZmFpbHVyZSB0aGFuIG5ldmVyIGluamVjdGluZy5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgcmVxdWVzdCBpZCB0byBjbGFpbS5cbiAqIEByZXR1cm5zIEEgc2VsZi1jb250YWluZWQgZXhwcmVzc2lvbiB0byBwYXNzIHRvIGBSdW50aW1lLmV2YWx1YXRlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2xhaW1JbnB1dEV4cHJlc3Npb24oaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LmNsYWltSW5wdXQ/Ligke0pTT04uc3RyaW5naWZ5KGlkKX0pYDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGV4cHJlc3Npb24gdGhlIGhvc3QgZXZhbHVhdGVzIHRvIGFuc3dlciBvbmUgaW5wdXQgcmVxdWVzdC5cbiAqXG4gKiBPcHRpb25hbCBjaGFpbmluZyB0aHJvdWdob3V0OiBieSB0aGUgdGltZSB0aGUgaG9zdCBhbnN3ZXJzLCB0aGUgcGFnZSBtYXkgaGF2ZSBuYXZpZ2F0ZWQgYW5kIGRyb3BwZWQgdGhlXG4gKiBuYW1lc3BhY2UsIGFuZCBhIGBUeXBlRXJyb3JgIGluc2lkZSB0aGlzIGV2YWx1YXRlIHdvdWxkIGJlIHJlcG9ydGVkIGFzIGFuIGluamVjdGlvbiBmYWlsdXJlIHRoYXQgYWxyZWFkeVxuICogc3VjY2VlZGVkLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSByZXF1ZXN0IGlkIHRoZSByZW5kZXJlciBpcyB3YWl0aW5nIG9uLlxuICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIFdoeSB0aGUgaW5qZWN0aW9uIGZhaWxlZCwgd2hlbiBpdCBkaWQuIE9taXQgb24gc3VjY2Vzcy5cbiAqIEByZXR1cm5zIEEgc2VsZi1jb250YWluZWQgZXhwcmVzc2lvbiB0byBwYXNzIHRvIGBSdW50aW1lLmV2YWx1YXRlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVzb2x2ZUlucHV0RXhwcmVzc2lvbihpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5yZXNvbHZlSW5wdXQ/Ligke0pTT04uc3RyaW5naWZ5KGlkKX0sICR7SlNPTi5zdHJpbmdpZnkoZXJyb3JNZXNzYWdlID8/IG51bGwpfSlgO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgYFJ1bnRpbWUuZXZhbHVhdGVgIHJlc3VsdCBmb3Ige0BsaW5rIGJ1aWxkQ2xhaW1JbnB1dEV4cHJlc3Npb259IGFuZCBzYXlzIHdoZXRoZXIgdG8gaW5qZWN0LlxuICpcbiAqICoqRGVsaWJlcmF0ZWx5IGZhaWxzIE9QRU4uKiogT25seSBhIGxpdGVyYWwgYGZhbHNlYCBcdTIwMTQgdGhlIHBhZ2UgYWN0aXZlbHkgc2F5aW5nIGFub3RoZXIgaG9zdCBhbHJlYWR5XG4gKiBjbGFpbWVkIHRoaXMgaWQgXHUyMDE0IHN0b3BzIHRoZSBpbmplY3Rpb24uIEEgbWlzc2luZyBuYW1lc3BhY2UsIGEgcGFnZSBtaWQtbmF2aWdhdGlvbiwgb3IgYW55IHJlc3VsdFxuICogc2hhcGUgdGhpcyBkb2VzIG5vdCByZWNvZ25pemUgeWllbGRzIGB0cnVlYCwgYmVjYXVzZSBhIGdlc3R1cmUgaW5qZWN0ZWQgdHdpY2UgaXMgYSBmYXIgYmV0dGVyXG4gKiBmYWlsdXJlIHRoYW4gYSBnZXN0dXJlIG5ldmVyIGluamVjdGVkIGF0IGFsbDogdGhlIGZpcnN0IGlzIGEgZG91YmxlZCB0YXAsIHRoZSBzZWNvbmQgaXMgYSB0ZXN0IHRoYXRcbiAqIGhhbmdzIHVudGlsIHRoZSByZW5kZXJlcidzIHRpbWVvdXQgYW5kIHJlcG9ydHMgbm90aGluZyB1c2VmdWwuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByYXcgYFJ1bnRpbWUuZXZhbHVhdGVgIHJlc3VsdCBvYmplY3QuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoaXMgaG9zdCBzaG91bGQgcGVyZm9ybSB0aGUgaW5qZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJbnB1dENsYWltR3JhbnRlZChyZXN1bHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIChyZXN1bHQgYXMgRXZhbHVhdGVSZXN1bHQpLnJlc3VsdD8udmFsdWUgIT09IGZhbHNlO1xufVxuXG4vKipcbiAqIFRoZSBmaXJzdCBjb2RlIHBvaW50IG9mIGEgbm9uLWVtcHR5IHN0cmluZy5cbiAqXG4gKiBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgaXMgdHlwZWQgYG51bWJlciB8IHVuZGVmaW5lZGAsIHNvIGV2ZXJ5IGNhbGwgc2l0ZSB3b3VsZCBvdGhlcndpc2UgY2FycnkgYVxuICogYD8/IGZhbGxiYWNrYCB0aGF0IG5vIGlucHV0IGNhbiBldmVyIHJlYWNoIFx1MjAxNCBhIGRlYWQgYnJhbmNoIHVuZGVyIHRoZSAxMDAlIGNvdmVyYWdlIGdhdGUuIFRocm93aW5nIGhlcmVcbiAqIGtlZXBzIHRoYXQgaW1wb3NzaWJsZSBjYXNlIGluIE9ORSBwbGFjZSwgd2hlcmUgYSB1bml0IHRlc3QgY2FuIHJlYWNoIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIG9mIHNwcmVhZGluZ1xuICogdW5yZWFjaGFibGUgZmFsbGJhY2tzIChvciBjb3ZlcmFnZSBzdXBwcmVzc2lvbnMpIGFjcm9zcyB0aGUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gQSBub24tZW1wdHkgc3RyaW5nLlxuICogQHJldHVybnMgSXRzIGZpcnN0IGNvZGUgcG9pbnQuXG4gKiBAdGhyb3dzIFdoZW4gYHRleHRgIGlzIGVtcHR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZVBvaW50T2YodGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgY29kZVBvaW50ID0gdGV4dC5jb2RlUG9pbnRBdChGSVJTVF9DT0RFX1BPSU5UX0lOREVYKTtcbiAgaWYgKGNvZGVQb2ludCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb2RlUG9pbnRPZiByZWNlaXZlZCBhbiBlbXB0eSBzdHJpbmcuJyk7XG4gIH1cblxuICByZXR1cm4gY29kZVBvaW50O1xufVxuXG4vKipcbiAqIFRyYW5zbGF0ZXMgYSBtb2JpbGUgaW5wdXQgcmVxdWVzdCBpbnRvIHRoZSBvcmRlcmVkIENEUCBjb21tYW5kcyB0aGF0IHJlYWxpemUgaXQuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBXaGF0IHRoZSByZW5kZXJlciBhc2tlZCB0aGUgaG9zdCB0byBpbmplY3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NkcElucHV0Q29tbWFuZHMocmVxdWVzdDogTW9iaWxlSW5wdXRSZXF1ZXN0KTogQ2RwSW5wdXRDb21tYW5kW10ge1xuICBpZiAocmVxdWVzdC5raW5kID09PSAna2V5Jykge1xuICAgIHJldHVybiB0b0tleUNvbW1hbmRzKHJlcXVlc3QpO1xuICB9XG5cbiAgcmV0dXJuIHRvUG9pbnRlckNvbW1hbmRzKHJlcXVlc3QpO1xufVxuXG4vKipcbiAqIEZvbGRzIHJlc29sdmVkIG1vZGlmaWVyIG5hbWVzIGludG8gQ0RQJ3MgYml0bWFzay5cbiAqXG4gKiBVbmtub3duIG5hbWVzIGFyZSBpZ25vcmVkIHJhdGhlciB0aGFuIHRocm93aW5nOiB0aGUgcmVuZGVyZXIncyBgdG9FbGVjdHJvbk1vZGlmaWVyc2AgaXMgZXhoYXVzdGl2ZSBvdmVyXG4gKiBPYnNpZGlhbidzIGBNb2RpZmllcmAgdW5pb24sIHNvIGFuIHVua25vd24gbmFtZSBoZXJlIHdvdWxkIG1lYW4gdGhlIHR3byBjb3BpZXMgaGF2ZSBhbHJlYWR5IGRyaWZ0ZWQsIGFuZFxuICogZmFpbGluZyB0aGUgd2hvbGUgZ2VzdHVyZSBpcyBhIHdvcnNlIG91dGNvbWUgdGhhbiBwcmVzc2luZyBpdCB1bm1vZGlmaWVkLlxuICpcbiAqIEBwYXJhbSBtb2RpZmllcnMgLSBSZXNvbHZlZCBsb3dlcmNhc2UgbW9kaWZpZXIgbmFtZXMuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIG1vZGlmaWVyIGJpdG1hc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NkcE1vZGlmaWVycyhtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgLy8gU3VtbWluZyBESVNUSU5DVCBiaXRzIGVxdWFscyBPUi1pbmcgdGhlbSwgYW5kIHRoZSBgU2V0YCBpcyB3aGF0IG1ha2VzIHRoYXQgaG9sZCBldmVuIHdoZW4gYSBjYWxsZXJcbiAgLy8gUGFzc2VzIHRoZSBzYW1lIG1vZGlmaWVyIHR3aWNlIFx1MjAxNCBzbyB0aGUgbWFzayBpcyBidWlsdCB3aXRob3V0IGEgYml0d2lzZSBvcGVyYXRvci5cbiAgY29uc3QgYml0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIG1vZGlmaWVycykge1xuICAgIGNvbnN0IGJpdCA9IENEUF9NT0RJRklFUl9CSVRfQllfTkFNRS5nZXQobW9kaWZpZXIpO1xuICAgIGlmIChiaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYml0cy5hZGQoYml0KTtcbiAgICB9XG4gIH1cblxuICBsZXQgYml0bWFzayA9IE5PX01PRElGSUVSUztcbiAgZm9yIChjb25zdCBiaXQgb2YgYml0cykge1xuICAgIGJpdG1hc2sgKz0gYml0O1xuICB9XG5cbiAgcmV0dXJuIGJpdG1hc2s7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBrZXkgbmFtZSB0byBpdHMgQ0RQIHNwZWxsaW5nLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBBIG5hbWVkIGtleSBvciBhIHNpbmdsZSBwcmludGFibGUgY2hhcmFjdGVyLlxuICogQHJldHVybnMgVGhlIENEUCBzcGVsbGluZy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUtleShrZXk6IHN0cmluZyk6IE5hbWVkS2V5IHtcbiAgY29uc3QgbmFtZWRLZXkgPSBOQU1FRF9LRVlTLmdldChrZXkpO1xuICBpZiAobmFtZWRLZXkpIHtcbiAgICByZXR1cm4gbmFtZWRLZXk7XG4gIH1cblxuICAvLyBcIkV4YWN0bHkgb25lIGNvZGUgcG9pbnRcIiwgdGVzdGVkIHdpdGhvdXQgc3BsaXR0aW5nIHRoZSBzdHJpbmc6IGBmcm9tQ29kZVBvaW50YCByb3VuZC10cmlwcyBvbmx5IHdoZW5cbiAgLy8gYGtleWAgaXMgdGhhdCBzaW5nbGUgY29kZSBwb2ludCwgc28gYW4gYXN0cmFsLXBsYW5lIGNoYXJhY3RlciBjb3VudHMgYXMgb25lIGFuZCBgJ0N0cmwrSydgIGRvZXMgbm90LlxuICBjb25zdCBjb2RlUG9pbnQgPSBrZXkuY29kZVBvaW50QXQoRklSU1RfQ09ERV9QT0lOVF9JTkRFWCk7XG4gIGlmIChjb2RlUG9pbnQgPT09IHVuZGVmaW5lZCB8fCBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlUG9pbnQpICE9PSBrZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcHJlc3NLZXkgcmVjZWl2ZWQgYW4gdW5rbm93biBrZXkgbmFtZSBvbiBtb2JpbGU6ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0uIGBcbiAgICAgICAgKyBgUGFzcyBhIHNpbmdsZSBjaGFyYWN0ZXIgb3Igb25lIG9mOiAke1suLi5OQU1FRF9LRVlTLmtleXMoKV0uam9pbignLCAnKX0uYFxuICAgICk7XG4gIH1cblxuICBjb25zdCB1cHBlckNhc2VkQ29kZVBvaW50ID0gY29kZVBvaW50T2Yoa2V5LnRvVXBwZXJDYXNlKCkpO1xuICByZXR1cm4ge1xuICAgIGNvZGU6IHJlc29sdmVLZXlDb2RlKHVwcGVyQ2FzZWRDb2RlUG9pbnQpLFxuICAgIHRleHQ6IGtleSxcbiAgICB3aW5kb3dzVmlydHVhbEtleUNvZGU6IHVwcGVyQ2FzZWRDb2RlUG9pbnRcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGh5c2ljYWwgYGNvZGVgIGZvciBhIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gKlxuICogQ2hhcmFjdGVycyBvdXRzaWRlIHRoZSBBU0NJSSBsZXR0ZXIvZGlnaXQgcm93cyBoYXZlIG5vIHN0YWJsZSBwaHlzaWNhbCBrZXksIHNvIHRoZXkgZ2V0IGFuIGVtcHR5XG4gKiBgY29kZWAgXHUyMDE0IHRoZSBgdGV4dGAgc3RpbGwgY2FycmllcyB0aGVtLCB3aGljaCBpcyB3aGF0IGFuIGVkaXRvciByZWFkcy5cbiAqXG4gKiBAcGFyYW0gdXBwZXJDYXNlZENvZGVQb2ludCAtIFRoZSBjaGFyYWN0ZXIncyB1cHBlci1jYXNlZCBjb2RlIHBvaW50LlxuICogQHJldHVybnMgVGhlIENEUCBgY29kZWAsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZXJlIGlzIG5vIHN0YWJsZSBvbmUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVLZXlDb2RlKHVwcGVyQ2FzZWRDb2RlUG9pbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh1cHBlckNhc2VkQ29kZVBvaW50ID49IFVQUEVSQ0FTRV9BX0NPREVfUE9JTlQgJiYgdXBwZXJDYXNlZENvZGVQb2ludCA8PSBVUFBFUkNBU0VfWl9DT0RFX1BPSU5UKSB7XG4gICAgcmV0dXJuIGBLZXkke1N0cmluZy5mcm9tQ29kZVBvaW50KHVwcGVyQ2FzZWRDb2RlUG9pbnQpfWA7XG4gIH1cblxuICBpZiAodXBwZXJDYXNlZENvZGVQb2ludCA+PSBESUdJVF9aRVJPX0NPREVfUE9JTlQgJiYgdXBwZXJDYXNlZENvZGVQb2ludCA8PSBESUdJVF9OSU5FX0NPREVfUE9JTlQpIHtcbiAgICByZXR1cm4gYERpZ2l0JHtTdHJpbmcuZnJvbUNvZGVQb2ludCh1cHBlckNhc2VkQ29kZVBvaW50KX1gO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBzZXF1ZW5jZSBmb3IgYSBrZXkgcHJlc3MuXG4gKlxuICogTWlycm9ycyB0aGUgZGVza3RvcCB0d2luJ3MgdHJ1c3RlZCBga2V5RG93bmAgXHUyMTkyIGBjaGFyYCBcdTIxOTIgYGtleVVwYCBpbiBDRFAncyBzcGVsbGluZzogYHJhd0tleURvd25gIGZpcmVzXG4gKiBga2V5ZG93bmAgYWxvbmUsIGBjaGFyYCBmaXJlcyBga2V5cHJlc3NgIC8gYGJlZm9yZWlucHV0YCAvIGBpbnB1dGAsIGBrZXlVcGAgZmlyZXMgYGtleXVwYC4gQSBrZXkgdGhhdFxuICogcHJvZHVjZXMgbm8gdGV4dCAoYEVzY2FwZWApIHNraXBzIHRoZSBgY2hhcmAsIGV4YWN0bHkgYXMgYSByZWFsIG9uZSBkb2VzLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0IC0gVGhlIGtleSByZXF1ZXN0LlxuICogQHJldHVybnMgVGhlIGNvbW1hbmRzIHRvIHNlbmQsIGluIG9yZGVyLlxuICovXG5mdW5jdGlvbiB0b0tleUNvbW1hbmRzKHJlcXVlc3Q6IE1vYmlsZUtleUlucHV0UmVxdWVzdCk6IENkcElucHV0Q29tbWFuZFtdIHtcbiAgY29uc3QgeyBjb2RlLCB0ZXh0LCB3aW5kb3dzVmlydHVhbEtleUNvZGUgfSA9IHJlc29sdmVLZXkocmVxdWVzdC5rZXkpO1xuICBjb25zdCBtb2RpZmllcnMgPSB0b0NkcE1vZGlmaWVycyhyZXF1ZXN0Lm1vZGlmaWVycyk7XG4gIGNvbnN0IGJhc2UgPSB7IGNvZGUsIGtleTogcmVxdWVzdC5rZXksIG1vZGlmaWVycywgd2luZG93c1ZpcnR1YWxLZXlDb2RlIH07XG5cbiAgY29uc3QgY29tbWFuZHM6IENkcElucHV0Q29tbWFuZFtdID0gW1xuICAgIHsgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHBhcmFtczogeyAuLi5iYXNlLCB0eXBlOiAncmF3S2V5RG93bicgfSB9XG4gIF07XG5cbiAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbW1hbmRzLnB1c2goeyBtZXRob2Q6ICdJbnB1dC5kaXNwYXRjaEtleUV2ZW50JywgcGFyYW1zOiB7IC4uLmJhc2UsIHRleHQsIHR5cGU6ICdjaGFyJyB9IH0pO1xuICB9XG5cbiAgY29tbWFuZHMucHVzaCh7IG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoS2V5RXZlbnQnLCBwYXJhbXM6IHsgLi4uYmFzZSwgdHlwZTogJ2tleVVwJyB9IH0pO1xuXG4gIHJldHVybiBjb21tYW5kcztcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbW1hbmQgc2VxdWVuY2UgZm9yIGEgdGFwIG9yIGEgbG9uZy1wcmVzcy5cbiAqXG4gKiAqKlRoZSB0d28gZ2VzdHVyZXMgdGFrZSBkaWZmZXJlbnQgQ0RQIHJvdXRlcywgYW5kIHRoYXQgYXN5bW1ldHJ5IGlzIHRoZSB3aG9sZSBwb2ludC4qKlxuICpcbiAqIEEgdGFwIGlzIGEgdHJ1c3RlZCB0b3VjaCBwYWlyLCB3aGljaCBpcyBhbGwgQ2hyb21pdW0gbmVlZHMgXHUyMDE0IGl0IHN5bnRoZXNpemVzIGBwb2ludGVyZG93bmAgL1xuICogYHRvdWNoc3RhcnRgIC8gYHBvaW50ZXJ1cGAgLyBgdG91Y2hlbmRgIC8gYGNsaWNrYCBmcm9tIGl0LCBldmVyeSBvbmUgYGlzVHJ1c3RlZGAuIFRoZSByZWxlYXNlIGNhcnJpZXNcbiAqIGFuIGVtcHR5IGB0b3VjaFBvaW50c2AgbGlzdCwgd2hpY2ggaXMgQ0RQJ3Mgc3BlbGxpbmcgZm9yIFwiYWxsIGZpbmdlcnMgbGlmdGVkXCIuXG4gKlxuICogQSBsb25nLXByZXNzIGNhbm5vdCBiZSB0aGF0IHNhbWUgcGFpciBoZWxkIGFwYXJ0IGJ5IGEgZHdlbGwsIGJlY2F1c2UgYElucHV0LmRpc3BhdGNoVG91Y2hFdmVudGAgaW5qZWN0c1xuICogYSBgV2ViVG91Y2hFdmVudGAgKipwYXN0KiogQW5kcm9pZCdzIGdlc3R1cmUgcmVjb2duaXplcjogbm8gcmVjb2duaXplciBzZWVzIHRoZSBob2xkLCBzbyBubyBsb25nLXByZXNzXG4gKiBnZXN0dXJlIGlzIGV2ZXIgcHJvZHVjZWQgYW5kIHRoZSBwYWlyIGlzIGNsYXNzaWZpZWQgYXMgYSB0YXAgaG93ZXZlciBsb25nIHRoZSBkd2VsbCBpcy5cbiAqIGBJbnB1dC5zeW50aGVzaXplVGFwR2VzdHVyZWAgaW5zdGVhZCBnb2VzIHRocm91Z2ggQ2hyb21pdW0ncyBzeW50aGV0aWMtZ2VzdHVyZSBjb250cm9sbGVyLCB3aGljaCBidWlsZHNcbiAqIHJlYWwgYE1vdGlvbkV2ZW50YHMgYW5kIGZlZWRzIHRoZW0gdG8gdGhlIHBsYXRmb3JtIHJlY29nbml6ZXIgXHUyMDE0IHRoZSBzdGVwIHRoZSBkaXNwYXRjaCByb3V0ZSBza2lwcy5cbiAqXG4gKiBNZWFzdXJlZCBvbiBhIGxpdmUgZW11bGF0b3IgKDIwMjYtMDktMDgpOiB0aGUgZGlzcGF0Y2ggcGFpciB3aXRoIGEgNjAwbXMgZHdlbGwsIGFpbWVkIGF0IGEgKipyZWFsKipcbiAqIGAubmF2LWZpbGUtdGl0bGVgIGluIHRoZSBmaWxlIGV4cGxvcmVyLCBwcm9kdWNlZCBgcG9pbnRlcmRvd25gIC8gYHRvdWNoc3RhcnRgIC8gYHRvdWNoZW5kYCAvIGBjbGlja2AgYW5kXG4gKiAqKm9wZW5lZCB0aGUgbm90ZSoqIFx1MjAxNCBhIHRhcC4gTm8gYGNvbnRleHRtZW51YCwgYW5kIG5vIE9ic2lkaWFuIG1lbnUuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgcG9pbnRlciByZXF1ZXN0LlxuICogQHJldHVybnMgVGhlIGNvbW1hbmRzIHRvIHNlbmQsIGluIG9yZGVyLlxuICovXG5mdW5jdGlvbiB0b1BvaW50ZXJDb21tYW5kcyhyZXF1ZXN0OiBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0KTogQ2RwSW5wdXRDb21tYW5kW10ge1xuICBjb25zdCBtb2RpZmllcnMgPSB0b0NkcE1vZGlmaWVycyhyZXF1ZXN0Lm1vZGlmaWVycyk7XG5cbiAgaWYgKHJlcXVlc3Qua2luZCA9PT0gJ2xvbmdQcmVzcycpIHtcbiAgICAvLyBgc3ludGhlc2l6ZVRhcEdlc3R1cmVgIHRha2VzIG5vIG1vZGlmaWVyIGJpdG1hc2sgXHUyMDE0IENEUCdzIGdlc3R1cmUgQVBJIGhhcyBubyBwYXJhbWV0ZXIgZm9yIG9uZSBcdTIwMTQgYW5kXG4gICAgLy8gQSB0b3VjaCBzY3JlZW4gaGFzIG5vIG1vZGlmaWVyIGtleXMgdG8gaG9sZCBkdXJpbmcgYSBwcmVzcywgc28gdGhlcmUgaXMgbm90aGluZyB0byBjYXJyeSBoZXJlLlxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogJ0lucHV0LnN5bnRoZXNpemVUYXBHZXN0dXJlJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZHVyYXRpb246IExPTkdfUFJFU1NfRFdFTExfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgIGdlc3R1cmVTb3VyY2VUeXBlOiAndG91Y2gnLFxuICAgICAgICAgIHg6IHJlcXVlc3QueCxcbiAgICAgICAgICB5OiByZXF1ZXN0LnlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF07XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsXG4gICAgICBwYXJhbXM6IHsgbW9kaWZpZXJzLCB0b3VjaFBvaW50czogW3sgeDogcmVxdWVzdC54LCB5OiByZXF1ZXN0LnkgfV0sIHR5cGU6ICd0b3VjaFN0YXJ0JyB9XG4gICAgfSxcbiAgICB7XG4gICAgICBtZXRob2Q6ICdJbnB1dC5kaXNwYXRjaFRvdWNoRXZlbnQnLFxuICAgICAgcGFyYW1zOiB7IG1vZGlmaWVycywgdG91Y2hQb2ludHM6IFtdLCB0eXBlOiAndG91Y2hFbmQnIH1cbiAgICB9XG4gIF07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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