obsidian-integration-testing 15.0.0 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/adb.cjs +2 -2
- package/dist/lib/cjs/adb.d.cts +10 -0
- package/dist/lib/cjs/avd-name-channel.cjs +74 -0
- package/dist/lib/cjs/avd-name-channel.d.cts +152 -0
- package/dist/lib/cjs/avd-probe-verdict.cjs +11 -4
- package/dist/lib/cjs/avd-probe-verdict.d.cts +7 -0
- package/dist/lib/cjs/device-screenshot.cjs +1 -1
- package/dist/lib/cjs/device-screenshot.d.cts +3 -1
- package/dist/lib/cjs/emulator-backend.cjs +22 -1
- package/dist/lib/cjs/emulator-backend.d.cts +81 -0
- package/dist/lib/cjs/emulator-reclaim.cjs +78 -34
- package/dist/lib/cjs/emulator-reclaim.d.cts +57 -9
- package/dist/lib/cjs/enable-plugin.cjs +17 -8
- package/dist/lib/cjs/enable-plugin.d.cts +3 -1
- package/dist/lib/cjs/host-process-query-verdict.cjs +103 -0
- package/dist/lib/cjs/host-process-query-verdict.d.cts +196 -0
- package/dist/lib/cjs/index.cjs +14 -1
- package/dist/lib/cjs/index.d.cts +3 -1
- package/dist/lib/cjs/label-screenshot.cjs +2 -2
- package/dist/lib/cjs/launched-device-selection.cjs +46 -0
- package/dist/lib/cjs/launched-device-selection.d.cts +112 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/paint-out-status-bar.cjs +170 -0
- package/dist/lib/cjs/paint-out-status-bar.d.cts +236 -0
- package/dist/lib/cjs/port-owner-query-verdict.cjs +94 -0
- package/dist/lib/cjs/port-owner-query-verdict.d.cts +161 -0
- package/dist/lib/cjs/resolve-emulator-device-id.cjs +27 -4
- package/dist/lib/cjs/sharp-loader.cjs +1 -1
- package/dist/lib/cjs/sharp-loader.d.cts +67 -2
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +12 -2
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +17 -2
- package/dist/lib/cjs/soft-keyboard.cjs +130 -28
- package/dist/lib/cjs/soft-keyboard.d.cts +65 -6
- package/dist/lib/cjs/transport-appium.cjs +74 -4
- package/dist/lib/cjs/transport-appium.d.cts +49 -2
- package/dist/lib/cjs/transport-factory.cjs +162 -42
- package/dist/lib/esm/adb.d.mts +10 -0
- package/dist/lib/esm/adb.mjs +2 -2
- package/dist/lib/esm/avd-name-channel.d.mts +152 -0
- package/dist/lib/esm/avd-name-channel.mjs +45 -0
- package/dist/lib/esm/avd-probe-verdict.d.mts +7 -0
- package/dist/lib/esm/avd-probe-verdict.mjs +15 -4
- package/dist/lib/esm/device-screenshot.d.mts +3 -1
- package/dist/lib/esm/device-screenshot.mjs +1 -1
- package/dist/lib/esm/emulator-backend.d.mts +81 -0
- package/dist/lib/esm/emulator-backend.mjs +19 -1
- package/dist/lib/esm/emulator-reclaim.d.mts +57 -9
- package/dist/lib/esm/emulator-reclaim.mjs +84 -36
- package/dist/lib/esm/enable-plugin.d.mts +3 -1
- package/dist/lib/esm/enable-plugin.mjs +17 -8
- package/dist/lib/esm/host-process-query-verdict.d.mts +196 -0
- package/dist/lib/esm/host-process-query-verdict.mjs +74 -0
- package/dist/lib/esm/index.d.mts +3 -1
- package/dist/lib/esm/index.mjs +15 -1
- package/dist/lib/esm/label-screenshot.mjs +2 -2
- package/dist/lib/esm/launched-device-selection.d.mts +112 -0
- package/dist/lib/esm/launched-device-selection.mjs +21 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/paint-out-status-bar.d.mts +236 -0
- package/dist/lib/esm/paint-out-status-bar.mjs +142 -0
- package/dist/lib/esm/port-owner-query-verdict.d.mts +161 -0
- package/dist/lib/esm/port-owner-query-verdict.mjs +73 -0
- package/dist/lib/esm/resolve-emulator-device-id.mjs +32 -4
- package/dist/lib/esm/sharp-loader.d.mts +67 -2
- package/dist/lib/esm/sharp-loader.mjs +1 -1
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +17 -2
- package/dist/lib/esm/soft-keyboard-geometry.mjs +11 -2
- package/dist/lib/esm/soft-keyboard.d.mts +65 -6
- package/dist/lib/esm/soft-keyboard.mjs +131 -28
- package/dist/lib/esm/transport-appium.d.mts +49 -2
- package/dist/lib/esm/transport-appium.mjs +74 -4
- package/dist/lib/esm/transport-factory.mjs +176 -44
- package/package.json +1 -1
|
@@ -29,7 +29,7 @@ var import_capture_screenshot = require("./capture-screenshot.cjs");
|
|
|
29
29
|
var import_sharp_loader = require("./sharp-loader.cjs");
|
|
30
30
|
const FONT_SIZE_RATIO = 0.034;
|
|
31
31
|
const BAND_HEIGHT_RATIO = 2.2;
|
|
32
|
-
const BAND_OPACITY =
|
|
32
|
+
const BAND_OPACITY = 1;
|
|
33
33
|
const MINIMUM_FONT_SIZE_IN_PIXELS = 18;
|
|
34
34
|
const MINIMUM_HEIGHT_RATIO = 0.075;
|
|
35
35
|
const SIDE_MARGIN_RATIO = 0.04;
|
|
@@ -140,4 +140,4 @@ async function measureCaptionWidth(text, fontSizeInPixels) {
|
|
|
140
140
|
labelScreenshot,
|
|
141
141
|
measureLabelCaption
|
|
142
142
|
});
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xhYmVsLXNjcmVlbnNob3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBZGRzIGEgY2FwdGlvbiBiYW5kIHRvIGFuIGFscmVhZHktY2FwdHVyZWQgc2NyZWVuc2hvdC5cbiAqXG4gKiBBIHN0b3JlIGxpc3Rpbmcgc2hvd3Mgc2NyZWVuc2hvdHMgT05FIEFUIEEgVElNRSwgaW4gYSBjYXJvdXNlbCwgd2l0aCBub1xuICogY2FwdGlvbiBvZiBpdHMgb3duIFx1MjAxNCBzbyBhbiBpbWFnZSBoYXMgdG8gc2F5IHdoYXQgaXQgaXMgc2hvd2luZy4gV2l0aG91dCB0aGF0LFxuICogYSBzaG90IG9mIHRoZSBzdGF0ZSBhIHBsdWdpbiByZW1vdmVzIHJlYWRzIGFzIGEgc2hvdCBvZiB0aGUgc3RhdGUgdGhlIHBsdWdpblxuICogY2F1c2VzLCB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIG1lc3NhZ2UuXG4gKlxuICogVGhlIGJhbmQgaXMgZHJhd24gb3ZlciB0aGUgQk9UVE9NIG9mIHRoZSBmcmFtZSwgZm9yIHR3byByZWFzb25zOiB0aGUgdG9wIGlzXG4gKiB3aGVyZSB0aGUgY29udGVudCBiZWluZyBkZW1vbnN0cmF0ZWQgdXN1YWxseSBzdGFydHMsIGFuZCB0aGUgYm90dG9tIG9mIGFuXG4gKiBPYnNpZGlhbiBmcmFtZSBpcyBjaHJvbWUgXHUyMDE0IHN0YXR1cyBiYXIsIHdvcmQgY291bnQsIHN5bmMgaW5kaWNhdG9yIFx1MjAxNCB3aGljaCB0aGVcbiAqIGJhbmQgdGhlbiBjb3ZlcnMgcmF0aGVyIHRoYW4gY29tcGV0aW5nIHdpdGguXG4gKlxuICogVGhpcyBpcyBwb3N0LXByb2Nlc3NpbmcsIGRlbGliZXJhdGVseS4gVGhlIGNhcHR1cmUgc3RheXMgYW4gdW50b3VjaGVkIGRldmljZVxuICogZnJhbWUsIGFuZCByZXdvcmRpbmcgYSBsYWJlbCBuZWVkcyBubyByZS1zaG9vdC5cbiAqXG4gKiBBIGNhcHRpb24gdGhhdCBpcyB0b28gbG9uZyBmb3IgaXRzIGZyYW1lIGlzIE1FQVNVUkVEIGFuZCByZWplY3RlZCByYXRoZXIgdGhhblxuICogZHJhd24uIEFuIFNWRyBgPHRleHQ+YCBpcyBjbGlwcGVkIGJ5IGl0cyB2aWV3cG9ydCBhdCBib3RoIGVuZHMgd2l0aCBub1xuICogZWxsaXBzaXMgYW5kIG5vIGVycm9yLCBzbyBhbiBvdmVybG9uZyBjYXB0aW9uIHNoaXBzIGFzIGEgc2VudGVuY2UgZnJhZ21lbnRcbiAqIHRoYXQgbG9va3MgZGVsaWJlcmF0ZSBcdTIwMTQgYG5hYmxlZCBpbiBTZXR0aW5ncyAtIGEgbGlzdGVuaW5nIHBsdWdpbiBpcyB0b2xkYCBcdTIwMTRcbiAqIGFuZCB0aGUgZnJhbWUgaXMgc3RpbGwgZXhhY3RseSB0aGUgc2l6ZSBpdCBzaG91bGQgYmUsIHNvIGV2ZXJ5IGRpbWVuc2lvblxuICogYXNzZXJ0aW9uIGRvd25zdHJlYW0gc3RpbGwgcGFzc2VzLiBUaGUgb25seSBmZWVkYmFjayBhbnlvbmUgZXZlciBnb3Qgd2FzXG4gKiBsb29raW5nIGF0IHRoZSBQTkcuIFNlZSB7QGxpbmsgbWVhc3VyZUxhYmVsQ2FwdGlvbn0uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTaGFycENvbXBvc2l0ZUxheWVyIH0gZnJvbSAnLi9zaGFycC1sb2FkZXIuY2pzJztcblxuaW1wb3J0IHsgcmVhZFBuZ0RpbWVuc2lvbnMgfSBmcm9tICcuL2NhcHR1cmUtc2NyZWVuc2hvdC5janMnO1xuaW1wb3J0IHsgaW1wb3J0U2hhcnAgfSBmcm9tICcuL3NoYXJwLWxvYWRlci5janMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb21wdXRlTGFiZWxCYW5kfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlTGFiZWxCYW5kUGFyYW1zIHtcbiAgLyoqXG4gICAqIEhlaWdodCBvZiB0aGUgaW1hZ2UgYmVpbmcgbGFiZWxlZCwgaW4gcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VIZWlnaHRJblBpeGVsczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaWR0aCBvZiB0aGUgaW1hZ2UgYmVpbmcgbGFiZWxlZCwgaW4gcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VXaWR0aEluUGl4ZWxzOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGdlb21ldHJ5IG9mIHRoZSBjYXB0aW9uIGJhbmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFiZWxCYW5kR2VvbWV0cnkge1xuICAvKipcbiAgICogSG93IG11Y2ggaG9yaXpvbnRhbCByb29tIHRoZSBjYXB0aW9uIGhhcywgaW4gcGl4ZWxzOiB0aGUgaW1hZ2Ugd2lkdGggbGVzc1xuICAgKiB0aGUgbWFyZ2luIGhlbGQgY2xlYXIgYXQgZWFjaCBlbmQsIHNvIGEgY2FwdGlvbiB0aGF0IGZpdHMgZG9lcyBub3QgcmVhZCBhc1xuICAgKiB0aG91Z2ggaXQgd2VyZSBhYm91dCB0byB0b3VjaCB0aGUgZWRnZSBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uUm9vbUluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZvbnQgc2l6ZSBmb3IgdGhlIGNhcHRpb24sIGluIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IGZvbnRTaXplSW5QaXhlbHM6IG51bWJlcjtcblxuICAvKipcbiAgICogSGVpZ2h0IG9mIHRoZSBiYW5kLCBpbiBwaXhlbHMuXG4gICAqL1xuICByZWFkb25seSBoZWlnaHRJblBpeGVsczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIGltYWdlIHRvIHRoZSB0b3Agb2YgdGhlIGJhbmQsIGluIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IHRvcEluUGl4ZWxzOiBudW1iZXI7XG59XG5cbi8qKlxuICogV2hhdCBhIGNhcHRpb24gbWVhc3VyZXMgYWdhaW5zdCB0aGUgZnJhbWUgaXQgaXMgZGVzdGluZWQgZm9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsQ2FwdGlvbk1lYXN1cmVtZW50IHtcbiAgLyoqXG4gICAqIFRoZSByb29tIGF2YWlsYWJsZSwgaW4gcGl4ZWxzIFx1MjAxNCB7QGxpbmsgTGFiZWxCYW5kR2VvbWV0cnkuY2FwdGlvblJvb21JblBpeGVsc30uXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uUm9vbUluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNhcHRpb24gZml0cyB0aGF0IHJvb20uXG4gICAqL1xuICByZWFkb25seSBkb2VzRml0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIb3cgd2lkZSB0aGUgY2FwdGlvbiBhY3R1YWxseSByZW5kZXJzLCBpbiBwaXhlbHMsIGF0IHRoZSBzaXplIHRoZSBiYW5kXG4gICAqIHdvdWxkIGRyYXcgaXQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0V2lkdGhJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBsYWJlbFNjcmVlbnNob3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsU2NyZWVuc2hvdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNhcHRpb24uIEtlZXAgaXQgdG8gYSBoYW5kZnVsIG9mIHdvcmRzOiBpdCBpcyByZWFkIGF0IGxpc3RpbmctdGh1bWJuYWlsXG4gICAqIHNpemUsIGFuZCBpdCBpcyBuZWl0aGVyIHdyYXBwZWQgbm9yIHNocnVuayB0byBmaXQgXHUyMDE0IG9uZSB0aGF0IGRvZXMgbm90IGZpdFxuICAgKiBpcyBSRUpFQ1RFRCwgd2l0aCB0aGUgbWVhc3VyZWQgd2lkdGggYW5kIHRoZSByb29tIGF2YWlsYWJsZS4gQ2hlY2sgYVxuICAgKiBjYW5kaWRhdGUgd2l0aCB7QGxpbmsgbWVhc3VyZUxhYmVsQ2FwdGlvbn0gYmVmb3JlIGNvbW1pdHRpbmcgdG8gaXQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIG1lYXN1cmVMYWJlbENhcHRpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lYXN1cmVMYWJlbENhcHRpb25QYXJhbXMge1xuICAvKipcbiAgICogSGVpZ2h0IG9mIHRoZSBpbWFnZSB0aGUgY2FwdGlvbiBpcyBkZXN0aW5lZCBmb3IsIGluIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlSGVpZ2h0SW5QaXhlbHM6IG51bWJlcjtcblxuICAvKipcbiAgICogV2lkdGggb2YgdGhlIGltYWdlIHRoZSBjYXB0aW9uIGlzIGRlc3RpbmVkIGZvciwgaW4gcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VXaWR0aEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjYXB0aW9uIHRvIG1lYXN1cmUuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2FwdGlvbiBzaXplIGFzIGEgZnJhY3Rpb24gb2YgaW1hZ2UgV0lEVEgsIG5vdCBoZWlnaHQuXG4gKlxuICogV2lkdGggaXMgd2hhdCBnb3Zlcm5zIGxlZ2liaWxpdHkgaGVyZTogYSA5MDB4MTYwMCBwaG9uZSBmcmFtZSBhbmQgYSAxMjAweDgwMFxuICogZGVza3RvcCBmcmFtZSBhcmUgcmVhZCBhdCBzaW1pbGFyIG9uLXNjcmVlbiB3aWR0aHMgaW4gYSBsaXN0aW5nLCBzbyBzaXppbmcgYnlcbiAqIHdpZHRoIGtlZXBzIHRoZSBjYXB0aW9uIHZpc3VhbGx5IGNvbnNpc3RlbnQgYWNyb3NzIHRoZSB0d28uXG4gKi9cbmNvbnN0IEZPTlRfU0laRV9SQVRJTyA9IDAuMDM0O1xuXG4vKipcbiAqIEJhbmQgaGVpZ2h0IGFzIGEgbXVsdGlwbGUgb2YgdGhlIGZvbnQgc2l6ZSBcdTIwMTQgZW5vdWdoIHRvIHNpdCB0aGUgdGV4dCBvbiB3aXRoXG4gKiBjbGVhciBzcGFjZSBhYm92ZSBhbmQgYmVsb3cuXG4gKi9cbmNvbnN0IEJBTkRfSEVJR0hUX1JBVElPID0gMi4yO1xuXG4vKipcbiAqIE9wYWNpdHkgb2YgdGhlIGJhbmQuIE5lYXItb3BhcXVlIG9uIHB1cnBvc2U6IHRoZSBiYW5kIGV4aXN0cyBwYXJ0bHkgdG8gQ09WRVJcbiAqIHRoZSBjaHJvbWUgYWxvbmcgdGhlIGJvdHRvbSBvZiB0aGUgZnJhbWUsIGFuZCBhdCAwLjgyIGEgc3RhdHVzIGJhciBsZWdpYmx5XG4gKiBibGVkIHRocm91Z2ggYmVoaW5kIHRoZSBjYXB0aW9uLCB3aGljaCBsb29rZWQgbGlrZSBhIG1pc3Rha2UgcmF0aGVyIHRoYW4gYVxuICogZGVzaWduLlxuICovXG5jb25zdCBCQU5EX09QQUNJVFkgPSAwLjk0O1xuXG5jb25zdCBNSU5JTVVNX0ZPTlRfU0laRV9JTl9QSVhFTFMgPSAxODtcblxuLyoqXG4gKiBGbG9vciBvbiBiYW5kIGhlaWdodCBhcyBhIGZyYWN0aW9uIG9mIGltYWdlIEhFSUdIVC5cbiAqXG4gKiBIZWlnaHQgZGVyaXZlZCBmcm9tIHRoZSBjYXB0aW9uIGFsb25lIGlzIHRvbyBzaGFsbG93IG9uIGEgdGFsbCBmcmFtZTogb24gYVxuICogOTAweDE2MDAgcGhvbmUgaXQgY2FtZSB0byA2OHB4IGFuZCBzbGljZWQgdGhyb3VnaCB0aGUgc3RhdHVzIHJvdyBpdCB3YXMgbWVhbnRcbiAqIHRvIGNvdmVyLCBjbGlwcGluZyB0aGUgdGV4dCBtaWQtbGluZS4gVGhpcyBmbG9vciBtYWtlcyB0aGUgYmFuZCBkZWVwIGVub3VnaCB0b1xuICogc3dhbGxvdyB0aGF0IHJvdyB3aG9sZSAoMTIwcHggb24gYSA5MDB4MTYwMCBwaG9uZSksIGFuZCBpcyBpbmVydCBvbiBhIHdpZGUgZnJhbWUgd2hlcmUgdGhlIGNhcHRpb24tZGVyaXZlZFxuICogaGVpZ2h0IGlzIGFscmVhZHkgdGhlIGxhcmdlciBvZiB0aGUgdHdvLlxuICovXG5jb25zdCBNSU5JTVVNX0hFSUdIVF9SQVRJTyA9IDAuMDc1O1xuXG4vKipcbiAqIE1hcmdpbiBoZWxkIGNsZWFyIGF0IEVBQ0ggZW5kIG9mIHRoZSBjYXB0aW9uLCBhcyBhIGZyYWN0aW9uIG9mIGltYWdlIHdpZHRoLlxuICpcbiAqIEEgY2FwdGlvbiB0aGF0IGVuZHMgYSBwaXhlbCBpbnNpZGUgdGhlIGZyYW1lIGlzIGxlZ2FsbHkgdW4tY2xpcHBlZCBhbmQgc3RpbGxcbiAqIGxvb2tzIHdyb25nLCBzbyB0aGUgcm9vbSBhIGNhcHRpb24gaXMgbWVhc3VyZWQgYWdhaW5zdCBpcyB0aGUgZnJhbWUgbGVzcyB0aGlzXG4gKiBhdCBib3RoIGVuZHMgXHUyMDE0IDQ4cHggZWFjaCBzaWRlIG9uIGEgMTIwMHB4IGZyYW1lLlxuICovXG5jb25zdCBTSURFX01BUkdJTl9SQVRJTyA9IDAuMDQ7XG5cbi8qKlxuICogRGl2aXNvciB0aGF0IHR1cm5zIGEgc3BhbiBpbnRvIGl0cyBtaWRwb2ludCwgZm9yIGNlbnRlcmluZyB0aGUgY2FwdGlvbi5cbiAqL1xuY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4vKipcbiAqIFRoZSBjYXB0aW9uJ3MgdHlwZWZhY2UgYW5kIHdlaWdodCwgaW4gb25lIHBsYWNlIGJlY2F1c2UgdGhlIGJhbmQgYW5kIHRoZVxuICogbWVhc3VyZW1lbnQgY2FudmFzIE1VU1QgZHJhdyB3aXRoIHRoZSBzYW1lIG9uZXM6IGEgbWVhc3VyZW1lbnQgdGFrZW4gaW4gYVxuICogZGlmZmVyZW50IGZhY2UgaXMgbm90IGEgbWVhc3VyZW1lbnQgb2YgdGhlIHRoaW5nIHRoYXQgc2hpcHMuXG4gKi9cbmNvbnN0IEZPTlRfRkFNSUxZID0gJ1NlZ29lIFVJLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJztcblxuY29uc3QgRk9OVF9XRUlHSFQgPSAnNjAwJztcblxuY29uc3QgQ0FQVElPTl9GSUxMID0gJyNmZmZmZmYnO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIG9uZSBnbHlwaCdzIGFkdmFuY2Ugd2lkdGgsIGFzIGEgbXVsdGlwbGUgb2YgdGhlIGZvbnQgc2l6ZS5cbiAqXG4gKiBJdCBzaXplcyB0aGUgb2ZmLXNjcmVlbiBjYW52YXMgdGhlIGNhcHRpb24gaXMgbWVhc3VyZWQgb24sIGFuZCBpdCBvbmx5IGV2ZXJcbiAqIG5lZWRzIHRvIGJlIGFuIG92ZXItZXN0aW1hdGU6IGEgY2FudmFzIHRvbyBuYXJyb3cgd291bGQgY2xpcCB0aGUgdGV4dCBiZWluZ1xuICogbWVhc3VyZWQsIHVuZGVyLXJlcG9ydCBpdHMgd2lkdGgsIGFuZCByZWludHJvZHVjZSB0aGUgZXhhY3Qgc2lsZW50IGNsaXBwaW5nXG4gKiB0aGUgbWVhc3VyZW1lbnQgZXhpc3RzIHRvIGNhdGNoLiBObyBMYXRpbiBnbHlwaCBpbiBhIHByb3BvcnRpb25hbCBzYW5zXG4gKiBhZHZhbmNlcyBhIGZ1bGwgZW0gXHUyMDE0IGFuIGVtIGRhc2gsIHRoZSB3aWRlc3QsIGlzIDEuMCBcdTIwMTQgc28gMS4xIGlzIGhlYWRyb29tIGF0XG4gKiBuZWdsaWdpYmxlIGNvc3QgKG1lYXN1cmVkIHByb3NlIHJ1bnMgYWJvdXQgMC40NSBlbSBwZXIgY2hhcmFjdGVyLCBzbyB0aGVcbiAqIGNhbnZhcyBjb21lcyBvdXQgcm91Z2hseSAyLjV4IHRoZSB0ZXh0KS5cbiAqL1xuY29uc3QgTUFYSU1VTV9HTFlQSF9BRFZBTkNFX1JBVElPID0gMS4xO1xuXG4vKipcbiAqIEhlaWdodCBvZiB0aGUgbWVhc3VyZW1lbnQgY2FudmFzIGFzIGEgbXVsdGlwbGUgb2YgdGhlIGZvbnQgc2l6ZSwgc28gYXNjZW5kZXJzXG4gKiBhbmQgZGVzY2VuZGVycyBoYXZlIHJvb20gYW5kIHRoZSB0cmltIHJlYWRzIHRoZSBnbHlwaHMgcmF0aGVyIHRoYW4gdGhlIGVkZ2UuXG4gKi9cbmNvbnN0IE1FQVNVUkVNRU5UX0NBTlZBU19IRUlHSFRfUkFUSU8gPSAzO1xuXG4vKipcbiAqIEhvdyBmYXIgYSBwaXhlbCBtYXkgZGlmZmVyIGZyb20gdGhlIHRyYW5zcGFyZW50IHN1cnJvdW5kIGJlZm9yZSBgdHJpbWAgY291bnRzXG4gKiBpdCBhcyB0ZXh0LiBEZWxpYmVyYXRlbHkgZmFyIGxvd2VyIHRoYW4gYHNoYXJwYCdzIGRlZmF1bHQgb2YgMTA6IHRoZSBvdXRlcm1vc3RcbiAqIHBpeGVscyBvZiBhbiBhbnRpYWxpYXNlZCBnbHlwaCBhcmUgdmVyeSBmYWludCwgYW5kIHRoZSBkZWZhdWx0IGRpc2NhcmRzIHRoZW0sXG4gKiB1bmRlci1tZWFzdXJpbmcgYSBjYXB0aW9uIGJ5IGEgcGl4ZWwgb3IgdHdvIGF0IGVhY2ggZW5kLlxuICovXG5jb25zdCBUUklNX1RIUkVTSE9MRCA9IDE7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkQ2FwdGlvblRleHRFbGVtZW50fS5cbiAqL1xuaW50ZXJmYWNlIENhcHRpb25UZXh0RWxlbWVudFBhcmFtcyB7XG4gIHJlYWRvbmx5IGZvbnRTaXplSW5QaXhlbHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0QW5jaG9yOiAnbWlkZGxlJyB8ICdzdGFydCc7XG4gIHJlYWRvbmx5IHhJblBpeGVsczogbnVtYmVyO1xuICByZWFkb25seSB5SW5QaXhlbHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIFNWRyBmb3IgdGhlIGNhcHRpb24gYmFuZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSBjYXB0aW9uLlxuICogQHBhcmFtIGdlb21ldHJ5IC0gVGhlIGJhbmQgZ2VvbWV0cnkuXG4gKiBAcGFyYW0gaW1hZ2VXaWR0aEluUGl4ZWxzIC0gV2lkdGggb2YgdGhlIGltYWdlLCBzbyB0aGUgYmFuZCBzcGFucyBpdC5cbiAqIEByZXR1cm5zIFRoZSBTVkcgbWFya3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMYWJlbFN2Zyh0ZXh0OiBzdHJpbmcsIGdlb21ldHJ5OiBMYWJlbEJhbmRHZW9tZXRyeSwgaW1hZ2VXaWR0aEluUGl4ZWxzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCB7IGZvbnRTaXplSW5QaXhlbHMsIGhlaWdodEluUGl4ZWxzIH0gPSBnZW9tZXRyeTtcbiAgY29uc3QgY2FwdGlvbkVsZW1lbnQgPSBidWlsZENhcHRpb25UZXh0RWxlbWVudCh7XG4gICAgZm9udFNpemVJblBpeGVscyxcbiAgICB0ZXh0LFxuICAgIHRleHRBbmNob3I6ICdtaWRkbGUnLFxuICAgIHhJblBpeGVsczogaW1hZ2VXaWR0aEluUGl4ZWxzIC8gQ0VOVEVSX0RJVklTT1IsXG4gICAgeUluUGl4ZWxzOiBoZWlnaHRJblBpeGVscyAvIENFTlRFUl9ESVZJU09SXG4gIH0pO1xuXG4gIHJldHVybiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIke1N0cmluZyhpbWFnZVdpZHRoSW5QaXhlbHMpfVwiIGhlaWdodD1cIiR7U3RyaW5nKGhlaWdodEluUGl4ZWxzKX1cIj5gXG4gICAgKyBgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiJHtTdHJpbmcoaW1hZ2VXaWR0aEluUGl4ZWxzKX1cIiBoZWlnaHQ9XCIke1N0cmluZyhoZWlnaHRJblBpeGVscyl9XCIgYFxuICAgICsgYGZpbGw9XCIjMDAwMDAwXCIgZmlsbC1vcGFjaXR5PVwiJHtTdHJpbmcoQkFORF9PUEFDSVRZKX1cIi8+YFxuICAgICsgYCR7Y2FwdGlvbkVsZW1lbnR9PC9zdmc+YDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY2FwdGlvbiBiYW5kJ3Mgc2l6ZSBhbmQgcG9zaXRpb24gZm9yIGEgZ2l2ZW4gaW1hZ2UuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBpbWFnZSBkaW1lbnNpb25zLlxuICogQHJldHVybnMgVGhlIGJhbmQgZ2VvbWV0cnkuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGVpdGhlciBkaW1lbnNpb24gaXMgbm90IGEgcG9zaXRpdmUgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUxhYmVsQmFuZChwYXJhbXM6IENvbXB1dGVMYWJlbEJhbmRQYXJhbXMpOiBMYWJlbEJhbmRHZW9tZXRyeSB7XG4gIGNvbnN0IHsgaW1hZ2VIZWlnaHRJblBpeGVscywgaW1hZ2VXaWR0aEluUGl4ZWxzIH0gPSBwYXJhbXM7XG5cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW1hZ2VXaWR0aEluUGl4ZWxzKSB8fCBpbWFnZVdpZHRoSW5QaXhlbHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgY29tcHV0ZUxhYmVsQmFuZDogaW1hZ2VXaWR0aEluUGl4ZWxzIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyhpbWFnZVdpZHRoSW5QaXhlbHMpfS5gKTtcbiAgfVxuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGltYWdlSGVpZ2h0SW5QaXhlbHMpIHx8IGltYWdlSGVpZ2h0SW5QaXhlbHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgY29tcHV0ZUxhYmVsQmFuZDogaW1hZ2VIZWlnaHRJblBpeGVscyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLCBnb3QgJHtTdHJpbmcoaW1hZ2VIZWlnaHRJblBpeGVscyl9LmApO1xuICB9XG5cbiAgY29uc3QgZm9udFNpemVJblBpeGVscyA9IE1hdGgubWF4KE1JTklNVU1fRk9OVF9TSVpFX0lOX1BJWEVMUywgTWF0aC5yb3VuZChpbWFnZVdpZHRoSW5QaXhlbHMgKiBGT05UX1NJWkVfUkFUSU8pKTtcbiAgY29uc3QgY2FwdGlvbkhlaWdodEluUGl4ZWxzID0gTWF0aC5yb3VuZChmb250U2l6ZUluUGl4ZWxzICogQkFORF9IRUlHSFRfUkFUSU8pO1xuICBjb25zdCBmbG9vcmVkSGVpZ2h0SW5QaXhlbHMgPSBNYXRoLm1heChjYXB0aW9uSGVpZ2h0SW5QaXhlbHMsIE1hdGgucm91bmQoaW1hZ2VIZWlnaHRJblBpeGVscyAqIE1JTklNVU1fSEVJR0hUX1JBVElPKSk7XG4gIGNvbnN0IGhlaWdodEluUGl4ZWxzID0gTWF0aC5taW4oaW1hZ2VIZWlnaHRJblBpeGVscywgZmxvb3JlZEhlaWdodEluUGl4ZWxzKTtcbiAgY29uc3Qgc2lkZU1hcmdpbkluUGl4ZWxzID0gTWF0aC5yb3VuZChpbWFnZVdpZHRoSW5QaXhlbHMgKiBTSURFX01BUkdJTl9SQVRJTyk7XG5cbiAgcmV0dXJuIHtcbiAgICBjYXB0aW9uUm9vbUluUGl4ZWxzOiBpbWFnZVdpZHRoSW5QaXhlbHMgLSAoc2lkZU1hcmdpbkluUGl4ZWxzICogQ0VOVEVSX0RJVklTT1IpLFxuICAgIGZvbnRTaXplSW5QaXhlbHMsXG4gICAgaGVpZ2h0SW5QaXhlbHMsXG4gICAgdG9wSW5QaXhlbHM6IGltYWdlSGVpZ2h0SW5QaXhlbHMgLSBoZWlnaHRJblBpeGVsc1xuICB9O1xufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgaW5jbHVzaW9uIGluIFNWRyBjaGFyYWN0ZXIgZGF0YS5cbiAqXG4gKiBBIGNhcHRpb24gaXMgYXV0aG9yZWQgcGVyIHNjcmVlbnNob3QgYW5kIGNhbiBsZWdpdGltYXRlbHkgY29udGFpbiBgJmAgb3IgdGhlXG4gKiBhbmdsZSBicmFja2V0cyBPYnNpZGlhbiB1c2VzIGluIGxpbmsgc3ludGF4OyB1bmVzY2FwZWQsIHRob3NlIG1ha2UgdGhlIFNWR1xuICogaW1wb3NzaWJsZSB0byBwYXJzZSBhbmQgYHNoYXJwYCBmYWlscyBvbiBhIGNhcHRpb24gcmF0aGVyIHRoYW4gb24gYW4gaW1hZ2UuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgcmF3IGNhcHRpb24uXG4gKiBAcmV0dXJucyBUaGUgY2FwdGlvbiwgc2FmZSB0byBlbWJlZCBpbiBTVkcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVTdmdUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgIC5yZXBsYWNlQWxsKCc+JywgJyZndDsnKVxuICAgIC5yZXBsYWNlQWxsKCdcIicsICcmcXVvdDsnKVxuICAgIC5yZXBsYWNlQWxsKCdcXCcnLCAnJmFwb3M7Jyk7XG59XG5cbi8qKlxuICogRHJhd3MgYSBjYXB0aW9uIGJhbmQgYWNyb3NzIHRoZSBib3R0b20gb2YgYSBzY3JlZW5zaG90LlxuICpcbiAqIFRoZSBpbWFnZSBrZWVwcyBpdHMgZGltZW5zaW9ucyBleGFjdGx5OiB0aGUgYmFuZCBpcyBjb21wb3NpdGVkIE9WRVIgdGhlXG4gKiBmcmFtZSwgbmV2ZXIgYXBwZW5kZWQgdG8gaXQsIGJlY2F1c2UgdGhlIHN0b3JlIGV4cGVjdHMgYSBzcGVjaWZpYyBzaXplLlxuICpcbiAqIEBwYXJhbSBieXRlcyAtIFRoZSBjYXB0dXJlZCBQTkcuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBjYXB0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGFiZWxlZCBQTkcsIHRoZSBzYW1lIHNpemUgYXMgdGhlIGlucHV0LlxuICogQHRocm93cyBFcnJvciBpZiBgc2hhcnBgIGlzIG5vdCBpbnN0YWxsZWQsIHRoZSBpbWFnZSBkaW1lbnNpb25zIGNhbm5vdCBiZSByZWFkLCBvciB0aGUgY2FwdGlvbiBpcyB0b28gd2lkZSBmb3IgdGhlIGZyYW1lLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGFiZWxTY3JlZW5zaG90KGJ5dGVzOiBVaW50OEFycmF5LCBvcHRpb25zOiBMYWJlbFNjcmVlbnNob3RPcHRpb25zKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IHNoYXJwID0gYXdhaXQgaW1wb3J0U2hhcnAoJ2xhYmVsU2NyZWVuc2hvdCcpO1xuICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHNoYXJwKGJ5dGVzKS5tZXRhZGF0YSgpO1xuICBjb25zdCBpbWFnZVdpZHRoSW5QaXhlbHMgPSBtZXRhZGF0YS53aWR0aDtcbiAgY29uc3QgaW1hZ2VIZWlnaHRJblBpeGVscyA9IG1ldGFkYXRhLmhlaWdodDtcblxuICAvKiB2OCBpZ25vcmUgbmV4dCAzIC0tIERlZmVuc2l2ZTogYHNoYXJwYCByZWplY3RzIGEgbm9uLWltYWdlIGJlZm9yZSBpdCBjYW4gcmVwb3J0IG1ldGFkYXRhIHdpdGhvdXQgZGltZW5zaW9ucywgc28gdGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgZnJvbSBhIHRlc3QuICovXG4gIGlmIChpbWFnZVdpZHRoSW5QaXhlbHMgPT09IHVuZGVmaW5lZCB8fCBpbWFnZUhlaWdodEluUGl4ZWxzID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhYmVsU2NyZWVuc2hvdDogY291bGQgbm90IHJlYWQgdGhlIHNvdXJjZSBpbWFnZSBkaW1lbnNpb25zLicpO1xuICB9XG5cbiAgY29uc3QgZ2VvbWV0cnkgPSBjb21wdXRlTGFiZWxCYW5kKHsgaW1hZ2VIZWlnaHRJblBpeGVscywgaW1hZ2VXaWR0aEluUGl4ZWxzIH0pO1xuICBjb25zdCB0ZXh0V2lkdGhJblBpeGVscyA9IGF3YWl0IG1lYXN1cmVDYXB0aW9uV2lkdGgob3B0aW9ucy50ZXh0LCBnZW9tZXRyeS5mb250U2l6ZUluUGl4ZWxzKTtcblxuICBpZiAodGV4dFdpZHRoSW5QaXhlbHMgPiBnZW9tZXRyeS5jYXB0aW9uUm9vbUluUGl4ZWxzKSB7XG4gICAgY29uc3Qgb3ZlcmZsb3dJblBpeGVscyA9IHRleHRXaWR0aEluUGl4ZWxzIC0gZ2VvbWV0cnkuY2FwdGlvblJvb21JblBpeGVscztcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgbGFiZWxTY3JlZW5zaG90OiB0aGUgY2FwdGlvbiBpcyAke1N0cmluZyhvdmVyZmxvd0luUGl4ZWxzKX1weCB0b28gd2lkZSBmb3IgdGhlIGZyYW1lLiBgXG4gICAgICAgICsgYEl0IHJlbmRlcnMgJHtTdHJpbmcodGV4dFdpZHRoSW5QaXhlbHMpfXB4IGF0IGZvbnQtc2l6ZSAke1N0cmluZyhnZW9tZXRyeS5mb250U2l6ZUluUGl4ZWxzKX0sIGFuZCBhIGBcbiAgICAgICAgKyBgJHtTdHJpbmcoaW1hZ2VXaWR0aEluUGl4ZWxzKX1weCBmcmFtZSBoYXMgcm9vbSBmb3IgJHtTdHJpbmcoZ2VvbWV0cnkuY2FwdGlvblJvb21JblBpeGVscyl9cHguIGBcbiAgICAgICAgKyAnU2hvcnRlbiBpdDogYSBjYXB0aW9uIHRoYXQgZG9lcyBub3QgZml0IGlzIGNsaXBwZWQgYXQgQk9USCBlbmRzLCB3aXRoIG5vIGVsbGlwc2lzIHRvIHNob3cgaXQgaGFwcGVuZWQuICdcbiAgICAgICAgKyBgQ2FwdGlvbjogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLnRleHQpfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc3ZnID0gYnVpbGRMYWJlbFN2ZyhvcHRpb25zLnRleHQsIGdlb21ldHJ5LCBpbWFnZVdpZHRoSW5QaXhlbHMpO1xuICBjb25zdCBsYXllcjogU2hhcnBDb21wb3NpdGVMYXllciA9IHtcbiAgICBpbnB1dDogQnVmZmVyLmZyb20oc3ZnKSxcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogZ2VvbWV0cnkudG9wSW5QaXhlbHNcbiAgfTtcblxuICBjb25zdCBsYWJlbGVkID0gYXdhaXQgc2hhcnAoYnl0ZXMpXG4gICAgLmNvbXBvc2l0ZShbbGF5ZXJdKVxuICAgIC5wbmcoKVxuICAgIC50b0J1ZmZlcigpO1xuXG4gIHJldHVybiBuZXcgVWludDhBcnJheShsYWJlbGVkKTtcbn1cblxuLyoqXG4gKiBNZWFzdXJlcyBhIGNhcHRpb24gYWdhaW5zdCB0aGUgZnJhbWUgaXQgaXMgZGVzdGluZWQgZm9yLCB3aXRob3V0IGRyYXdpbmdcbiAqIGFueXRoaW5nLlxuICpcbiAqIFRoaXMgaXMgd2hhdCB7QGxpbmsgbGFiZWxTY3JlZW5zaG90fSByZWplY3RzIGFuIG92ZXJsb25nIGNhcHRpb24gd2l0aCwgZXhwb3NlZFxuICogc28gYSBjYXB0aW9uIGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgbnVtYmVyIGluIGhhbmQgaW5zdGVhZCBvZiBieSBjYXB0dXJpbmcgYVxuICogZnJhbWUgYW5kIGxvb2tpbmcgYXQgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjYXB0aW9uIGFuZCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgaW1hZ2UgaXQgaXMgZm9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbWVhc3VyZW1lbnQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGBzaGFycGAgaXMgbm90IGluc3RhbGxlZCwgb3IgZWl0aGVyIGRpbWVuc2lvbiBpcyBub3QgYSBwb3NpdGl2ZSBudW1iZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtZWFzdXJlTGFiZWxDYXB0aW9uKHBhcmFtczogTWVhc3VyZUxhYmVsQ2FwdGlvblBhcmFtcyk6IFByb21pc2U8TGFiZWxDYXB0aW9uTWVhc3VyZW1lbnQ+IHtcbiAgY29uc3QgeyBpbWFnZUhlaWdodEluUGl4ZWxzLCBpbWFnZVdpZHRoSW5QaXhlbHMsIHRleHQgfSA9IHBhcmFtcztcbiAgY29uc3QgZ2VvbWV0cnkgPSBjb21wdXRlTGFiZWxCYW5kKHsgaW1hZ2VIZWlnaHRJblBpeGVscywgaW1hZ2VXaWR0aEluUGl4ZWxzIH0pO1xuICBjb25zdCB0ZXh0V2lkdGhJblBpeGVscyA9IGF3YWl0IG1lYXN1cmVDYXB0aW9uV2lkdGgodGV4dCwgZ2VvbWV0cnkuZm9udFNpemVJblBpeGVscyk7XG5cbiAgcmV0dXJuIHtcbiAgICBjYXB0aW9uUm9vbUluUGl4ZWxzOiBnZW9tZXRyeS5jYXB0aW9uUm9vbUluUGl4ZWxzLFxuICAgIGRvZXNGaXQ6IHRleHRXaWR0aEluUGl4ZWxzIDw9IGdlb21ldHJ5LmNhcHRpb25Sb29tSW5QaXhlbHMsXG4gICAgdGV4dFdpZHRoSW5QaXhlbHNcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNhcHRpb24ncyBTVkcgYDx0ZXh0PmAgZWxlbWVudC5cbiAqXG4gKiBCb3RoIHRoZSBiYW5kIGFuZCB0aGUgbWVhc3VyZW1lbnQgY2FudmFzIGdvIHRocm91Z2ggaGVyZSwgc28gdGhlIHRoaW5nIHRoYXRcbiAqIGlzIG1lYXN1cmVkIGlzIGRyYXduIHdpdGggdGhlIHNhbWUgZmFjZSwgd2VpZ2h0IGFuZCBzaXplIGFzIHRoZSB0aGluZyB0aGF0XG4gKiBzaGlwcy4gVHdvIGhhbmQtd3JpdHRlbiBjb3BpZXMgd291bGQgYmUgZnJlZSB0byBkcmlmdCwgYW5kIGEgbWVhc3VyZW1lbnQgdGhhdFxuICogaGFzIGRyaWZ0ZWQgZnJvbSB0aGUgZHJhd2luZyBpcyB3b3JzZSB0aGFuIG5vIG1lYXN1cmVtZW50IGF0IGFsbC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNhcHRpb24sIGl0cyBzaXplLCBhbmQgd2hlcmUgdG8gYW5jaG9yIGl0LlxuICogQHJldHVybnMgVGhlIGA8dGV4dD5gIG1hcmt1cC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDYXB0aW9uVGV4dEVsZW1lbnQocGFyYW1zOiBDYXB0aW9uVGV4dEVsZW1lbnRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGZvbnRTaXplSW5QaXhlbHMsIHRleHQsIHRleHRBbmNob3IsIHhJblBpeGVscywgeUluUGl4ZWxzIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGA8dGV4dCB4PVwiJHtTdHJpbmcoeEluUGl4ZWxzKX1cIiB5PVwiJHtTdHJpbmcoeUluUGl4ZWxzKX1cIiBgXG4gICAgKyBgZm9udC1mYW1pbHk9XCIke0ZPTlRfRkFNSUxZfVwiIGZvbnQtc2l6ZT1cIiR7U3RyaW5nKGZvbnRTaXplSW5QaXhlbHMpfVwiIGBcbiAgICArIGBmb250LXdlaWdodD1cIiR7Rk9OVF9XRUlHSFR9XCIgZmlsbD1cIiR7Q0FQVElPTl9GSUxMfVwiIHRleHQtYW5jaG9yPVwiJHt0ZXh0QW5jaG9yfVwiIGRvbWluYW50LWJhc2VsaW5lPVwiY2VudHJhbFwiPmBcbiAgICArIGAke2VzY2FwZVN2Z1RleHQodGV4dCl9PC90ZXh0PmA7XG59XG5cbi8qKlxuICogTWVhc3VyZXMgaG93IHdpZGUgYSBjYXB0aW9uIHJlbmRlcnMgYXQgYSBnaXZlbiBzaXplLlxuICpcbiAqIFRoZSB0ZXh0IGlzIGRyYXduIGFsb25lIG9uIGEgdHJhbnNwYXJlbnQgY2FudmFzIGRlbGliZXJhdGVseSB3aWRlciB0aGFuIGl0IGNhblxuICogcG9zc2libHkgbmVlZCwgdGhlbiBgdHJpbWBtZWQgYmFjayB0byBpdHMgb3duIGluayBcdTIwMTQgdGhlIHNhbWUgbWVhc3VyZW1lbnQgdGhhdFxuICogd2FzIHByZXZpb3VzbHkgZG9uZSBieSBoYW5kLCBvbmNlLCBwZXIgY2FwdGlvbiwgYnkgd2hvZXZlciB0aG91Z2h0IHRvIGRvdWJ0XG4gKiBvbmUuIFRoZSByZW5kZXJlciBkb2luZyB0aGUgbWVhc3VyaW5nIGlzIHRoZSByZW5kZXJlciB0aGF0IGRyYXdzIHRoZSBiYW5kLCBzb1xuICogdGhlIHR3byBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgYSBmb250IHRoZSBob3N0IGRvZXMgb3IgZG9lcyBub3QgaGF2ZS5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSBjYXB0aW9uLlxuICogQHBhcmFtIGZvbnRTaXplSW5QaXhlbHMgLSBUaGUgc2l6ZSB0aGUgYmFuZCB3b3VsZCBkcmF3IGl0IGF0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmVuZGVyZWQgd2lkdGggaW4gcGl4ZWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiBtZWFzdXJlQ2FwdGlvbldpZHRoKHRleHQ6IHN0cmluZywgZm9udFNpemVJblBpeGVsczogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgLy8gQSBjYXB0aW9uIHdpdGggbm8gaW5rIGxlYXZlcyB0aGUgY2FudmFzIHVuaWZvcm1seSB0cmFuc3BhcmVudCwgYW5kIGB0cmltYFxuICAvLyByZXR1cm5zIHN1Y2ggYW4gaW1hZ2UgdW50b3VjaGVkIFx1MjAxNCBpLmUuIHJlcG9ydHMgdGhlIHdob2xlIGNhbnZhcyBhcyB0ZXh0LlxuICBpZiAodGV4dC50cmltKCkgPT09ICcnKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBzaGFycCA9IGF3YWl0IGltcG9ydFNoYXJwKCdtZWFzdXJlTGFiZWxDYXB0aW9uJyk7XG4gIGNvbnN0IHBhZGRpbmdJblBpeGVscyA9IGZvbnRTaXplSW5QaXhlbHMgKiBDRU5URVJfRElWSVNPUjtcbiAgY29uc3QgY2FudmFzV2lkdGhJblBpeGVscyA9IE1hdGguY2VpbChmb250U2l6ZUluUGl4ZWxzICogTUFYSU1VTV9HTFlQSF9BRFZBTkNFX1JBVElPICogdGV4dC5sZW5ndGgpICsgcGFkZGluZ0luUGl4ZWxzO1xuICBjb25zdCBjYW52YXNIZWlnaHRJblBpeGVscyA9IE1hdGguY2VpbChmb250U2l6ZUluUGl4ZWxzICogTUVBU1VSRU1FTlRfQ0FOVkFTX0hFSUdIVF9SQVRJTyk7XG4gIGNvbnN0IGNhcHRpb25FbGVtZW50ID0gYnVpbGRDYXB0aW9uVGV4dEVsZW1lbnQoe1xuICAgIGZvbnRTaXplSW5QaXhlbHMsXG4gICAgdGV4dCxcbiAgICB0ZXh0QW5jaG9yOiAnc3RhcnQnLFxuICAgIHhJblBpeGVsczogZm9udFNpemVJblBpeGVscyxcbiAgICB5SW5QaXhlbHM6IGNhbnZhc0hlaWdodEluUGl4ZWxzIC8gQ0VOVEVSX0RJVklTT1JcbiAgfSk7XG4gIGNvbnN0IHN2ZyA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIiR7U3RyaW5nKGNhbnZhc1dpZHRoSW5QaXhlbHMpfVwiIGhlaWdodD1cIiR7U3RyaW5nKGNhbnZhc0hlaWdodEluUGl4ZWxzKX1cIj5gXG4gICAgKyBgJHtjYXB0aW9uRWxlbWVudH08L3N2Zz5gO1xuXG4gIGNvbnN0IHRyaW1tZWQgPSBhd2FpdCBzaGFycChuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShzdmcpKSlcbiAgICAudHJpbSh7IHRocmVzaG9sZDogVFJJTV9USFJFU0hPTEQgfSlcbiAgICAucG5nKClcbiAgICAudG9CdWZmZXIoKTtcblxuICByZXR1cm4gcmVhZFBuZ0RpbWVuc2lvbnMobmV3IFVpbnQ4QXJyYXkodHJpbW1lZCkpLndpZHRoSW5QaXhlbHM7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xhYmVsLXNjcmVlbnNob3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBZGRzIGEgY2FwdGlvbiBiYW5kIHRvIGFuIGFscmVhZHktY2FwdHVyZWQgc2NyZWVuc2hvdC5cbiAqXG4gKiBBIHN0b3JlIGxpc3Rpbmcgc2hvd3Mgc2NyZWVuc2hvdHMgT05FIEFUIEEgVElNRSwgaW4gYSBjYXJvdXNlbCwgd2l0aCBub1xuICogY2FwdGlvbiBvZiBpdHMgb3duIFx1MjAxNCBzbyBhbiBpbWFnZSBoYXMgdG8gc2F5IHdoYXQgaXQgaXMgc2hvd2luZy4gV2l0aG91dCB0aGF0LFxuICogYSBzaG90IG9mIHRoZSBzdGF0ZSBhIHBsdWdpbiByZW1vdmVzIHJlYWRzIGFzIGEgc2hvdCBvZiB0aGUgc3RhdGUgdGhlIHBsdWdpblxuICogY2F1c2VzLCB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIG1lc3NhZ2UuXG4gKlxuICogVGhlIGJhbmQgaXMgZHJhd24gb3ZlciB0aGUgQk9UVE9NIG9mIHRoZSBmcmFtZSwgZm9yIHR3byByZWFzb25zOiB0aGUgdG9wIGlzXG4gKiB3aGVyZSB0aGUgY29udGVudCBiZWluZyBkZW1vbnN0cmF0ZWQgdXN1YWxseSBzdGFydHMsIGFuZCB0aGUgYm90dG9tIG9mIGFuXG4gKiBPYnNpZGlhbiBmcmFtZSBpcyBjaHJvbWUgXHUyMDE0IHN0YXR1cyBiYXIsIHdvcmQgY291bnQsIHN5bmMgaW5kaWNhdG9yIFx1MjAxNCB3aGljaCB0aGVcbiAqIGJhbmQgdGhlbiBjb3ZlcnMgcmF0aGVyIHRoYW4gY29tcGV0aW5nIHdpdGguXG4gKlxuICogVGhpcyBpcyBwb3N0LXByb2Nlc3NpbmcsIGRlbGliZXJhdGVseS4gVGhlIGNhcHR1cmUgc3RheXMgYW4gdW50b3VjaGVkIGRldmljZVxuICogZnJhbWUsIGFuZCByZXdvcmRpbmcgYSBsYWJlbCBuZWVkcyBubyByZS1zaG9vdC5cbiAqXG4gKiBBIGNhcHRpb24gdGhhdCBpcyB0b28gbG9uZyBmb3IgaXRzIGZyYW1lIGlzIE1FQVNVUkVEIGFuZCByZWplY3RlZCByYXRoZXIgdGhhblxuICogZHJhd24uIEFuIFNWRyBgPHRleHQ+YCBpcyBjbGlwcGVkIGJ5IGl0cyB2aWV3cG9ydCBhdCBib3RoIGVuZHMgd2l0aCBub1xuICogZWxsaXBzaXMgYW5kIG5vIGVycm9yLCBzbyBhbiBvdmVybG9uZyBjYXB0aW9uIHNoaXBzIGFzIGEgc2VudGVuY2UgZnJhZ21lbnRcbiAqIHRoYXQgbG9va3MgZGVsaWJlcmF0ZSBcdTIwMTQgYG5hYmxlZCBpbiBTZXR0aW5ncyAtIGEgbGlzdGVuaW5nIHBsdWdpbiBpcyB0b2xkYCBcdTIwMTRcbiAqIGFuZCB0aGUgZnJhbWUgaXMgc3RpbGwgZXhhY3RseSB0aGUgc2l6ZSBpdCBzaG91bGQgYmUsIHNvIGV2ZXJ5IGRpbWVuc2lvblxuICogYXNzZXJ0aW9uIGRvd25zdHJlYW0gc3RpbGwgcGFzc2VzLiBUaGUgb25seSBmZWVkYmFjayBhbnlvbmUgZXZlciBnb3Qgd2FzXG4gKiBsb29raW5nIGF0IHRoZSBQTkcuIFNlZSB7QGxpbmsgbWVhc3VyZUxhYmVsQ2FwdGlvbn0uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTaGFycENvbXBvc2l0ZUxheWVyIH0gZnJvbSAnLi9zaGFycC1sb2FkZXIuY2pzJztcblxuaW1wb3J0IHsgcmVhZFBuZ0RpbWVuc2lvbnMgfSBmcm9tICcuL2NhcHR1cmUtc2NyZWVuc2hvdC5janMnO1xuaW1wb3J0IHsgaW1wb3J0U2hhcnAgfSBmcm9tICcuL3NoYXJwLWxvYWRlci5janMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb21wdXRlTGFiZWxCYW5kfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlTGFiZWxCYW5kUGFyYW1zIHtcbiAgLyoqXG4gICAqIEhlaWdodCBvZiB0aGUgaW1hZ2UgYmVpbmcgbGFiZWxlZCwgaW4gcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VIZWlnaHRJblBpeGVsczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaWR0aCBvZiB0aGUgaW1hZ2UgYmVpbmcgbGFiZWxlZCwgaW4gcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VXaWR0aEluUGl4ZWxzOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGdlb21ldHJ5IG9mIHRoZSBjYXB0aW9uIGJhbmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFiZWxCYW5kR2VvbWV0cnkge1xuICAvKipcbiAgICogSG93IG11Y2ggaG9yaXpvbnRhbCByb29tIHRoZSBjYXB0aW9uIGhhcywgaW4gcGl4ZWxzOiB0aGUgaW1hZ2Ugd2lkdGggbGVzc1xuICAgKiB0aGUgbWFyZ2luIGhlbGQgY2xlYXIgYXQgZWFjaCBlbmQsIHNvIGEgY2FwdGlvbiB0aGF0IGZpdHMgZG9lcyBub3QgcmVhZCBhc1xuICAgKiB0aG91Z2ggaXQgd2VyZSBhYm91dCB0byB0b3VjaCB0aGUgZWRnZSBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uUm9vbUluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZvbnQgc2l6ZSBmb3IgdGhlIGNhcHRpb24sIGluIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IGZvbnRTaXplSW5QaXhlbHM6IG51bWJlcjtcblxuICAvKipcbiAgICogSGVpZ2h0IG9mIHRoZSBiYW5kLCBpbiBwaXhlbHMuXG4gICAqL1xuICByZWFkb25seSBoZWlnaHRJblBpeGVsczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIGltYWdlIHRvIHRoZSB0b3Agb2YgdGhlIGJhbmQsIGluIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IHRvcEluUGl4ZWxzOiBudW1iZXI7XG59XG5cbi8qKlxuICogV2hhdCBhIGNhcHRpb24gbWVhc3VyZXMgYWdhaW5zdCB0aGUgZnJhbWUgaXQgaXMgZGVzdGluZWQgZm9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsQ2FwdGlvbk1lYXN1cmVtZW50IHtcbiAgLyoqXG4gICAqIFRoZSByb29tIGF2YWlsYWJsZSwgaW4gcGl4ZWxzIFx1MjAxNCB7QGxpbmsgTGFiZWxCYW5kR2VvbWV0cnkuY2FwdGlvblJvb21JblBpeGVsc30uXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uUm9vbUluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNhcHRpb24gZml0cyB0aGF0IHJvb20uXG4gICAqL1xuICByZWFkb25seSBkb2VzRml0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIb3cgd2lkZSB0aGUgY2FwdGlvbiBhY3R1YWxseSByZW5kZXJzLCBpbiBwaXhlbHMsIGF0IHRoZSBzaXplIHRoZSBiYW5kXG4gICAqIHdvdWxkIGRyYXcgaXQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0V2lkdGhJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBsYWJlbFNjcmVlbnNob3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsU2NyZWVuc2hvdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNhcHRpb24uIEtlZXAgaXQgdG8gYSBoYW5kZnVsIG9mIHdvcmRzOiBpdCBpcyByZWFkIGF0IGxpc3RpbmctdGh1bWJuYWlsXG4gICAqIHNpemUsIGFuZCBpdCBpcyBuZWl0aGVyIHdyYXBwZWQgbm9yIHNocnVuayB0byBmaXQgXHUyMDE0IG9uZSB0aGF0IGRvZXMgbm90IGZpdFxuICAgKiBpcyBSRUpFQ1RFRCwgd2l0aCB0aGUgbWVhc3VyZWQgd2lkdGggYW5kIHRoZSByb29tIGF2YWlsYWJsZS4gQ2hlY2sgYVxuICAgKiBjYW5kaWRhdGUgd2l0aCB7QGxpbmsgbWVhc3VyZUxhYmVsQ2FwdGlvbn0gYmVmb3JlIGNvbW1pdHRpbmcgdG8gaXQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIG1lYXN1cmVMYWJlbENhcHRpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lYXN1cmVMYWJlbENhcHRpb25QYXJhbXMge1xuICAvKipcbiAgICogSGVpZ2h0IG9mIHRoZSBpbWFnZSB0aGUgY2FwdGlvbiBpcyBkZXN0aW5lZCBmb3IsIGluIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlSGVpZ2h0SW5QaXhlbHM6IG51bWJlcjtcblxuICAvKipcbiAgICogV2lkdGggb2YgdGhlIGltYWdlIHRoZSBjYXB0aW9uIGlzIGRlc3RpbmVkIGZvciwgaW4gcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VXaWR0aEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjYXB0aW9uIHRvIG1lYXN1cmUuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2FwdGlvbiBzaXplIGFzIGEgZnJhY3Rpb24gb2YgaW1hZ2UgV0lEVEgsIG5vdCBoZWlnaHQuXG4gKlxuICogV2lkdGggaXMgd2hhdCBnb3Zlcm5zIGxlZ2liaWxpdHkgaGVyZTogYSA5MDB4MTYwMCBwaG9uZSBmcmFtZSBhbmQgYSAxMjAweDgwMFxuICogZGVza3RvcCBmcmFtZSBhcmUgcmVhZCBhdCBzaW1pbGFyIG9uLXNjcmVlbiB3aWR0aHMgaW4gYSBsaXN0aW5nLCBzbyBzaXppbmcgYnlcbiAqIHdpZHRoIGtlZXBzIHRoZSBjYXB0aW9uIHZpc3VhbGx5IGNvbnNpc3RlbnQgYWNyb3NzIHRoZSB0d28uXG4gKi9cbmNvbnN0IEZPTlRfU0laRV9SQVRJTyA9IDAuMDM0O1xuXG4vKipcbiAqIEJhbmQgaGVpZ2h0IGFzIGEgbXVsdGlwbGUgb2YgdGhlIGZvbnQgc2l6ZSBcdTIwMTQgZW5vdWdoIHRvIHNpdCB0aGUgdGV4dCBvbiB3aXRoXG4gKiBjbGVhciBzcGFjZSBhYm92ZSBhbmQgYmVsb3cuXG4gKi9cbmNvbnN0IEJBTkRfSEVJR0hUX1JBVElPID0gMi4yO1xuXG4vKipcbiAqIE9wYWNpdHkgb2YgdGhlIGJhbmQuIEZ1bGx5IG9wYXF1ZSwgYW5kIHRoYXQgaXMgYSBkZWNpc2lvbiByYXRoZXIgdGhhbiBhXG4gKiBkZWZhdWx0OiB0aGUgYmFuZCdzIGpvYiBpcyB0byBDT1ZFUiB0aGUgY2hyb21lIGFsb25nIHRoZSBib3R0b20gb2YgdGhlIGZyYW1lLFxuICogc28gbm90aGluZyB1bmRlcm5lYXRoIGl0IG1heSByZWFjaCB0aGUgY2FwdHVyZWQgZnJhbWUgYXQgYWxsLlxuICpcbiAqIEl0IHdhcyAwLjk0LCBhIHZhbHVlIGNob3NlbiBvbmx5IGJlY2F1c2UgMC44MiBsZXQgYSBzdGF0dXMgYmFyIGxlZ2libHkgYmxlZWRcbiAqIHRocm91Z2ggYmVoaW5kIHRoZSBjYXB0aW9uIGFuZCBsb29rIGxpa2UgYSBtaXN0YWtlIHJhdGhlciB0aGFuIGEgZGVzaWduLlxuICogTm90aGluZyBpbiB0aGF0IGFyZ3VlZCBmb3IgMC45NCBvdmVyIGZ1bGwgb3BhY2l0eS4gV2hhdCAwLjk0IGRvZXMgaXMgYXR0ZW51YXRlXG4gKiB3aGF0ZXZlciBpcyB1bmRlciB0aGUgYmFuZCB0byBhYm91dCA2ICUgYnJpZ2h0bmVzcyBcdTIwMTQgaW52aXNpYmxlIHRvIGEgcmVhZGVyLFxuICogYW5kIHN0aWxsIDM0OSBkaWZmZXJpbmcgcGl4ZWxzIHRvIGEgZGlmZiwgbWVhc3VyZWQgb24gYSB0ZW1wb3JhcnkgdmF1bHQncyBuYW1lXG4gKiByZW5kZXJpbmcgdW5kZXIgdGhlIGJhbmQgb2YgYSAxMjAweDgwMCBkZXNrdG9wIGZyYW1lLiBBbnkgdmFsdWUgYmVsb3cgMSBob2xkc1xuICogdGhhdCBjaGFubmVsIG9wZW4gZm9yIGV2ZXJ5IHZhcnlpbmcgdGhpbmcgdGhlIGJvdHRvbSBjaHJvbWUgY2FuIGNhcnJ5IFx1MjAxNCBhXG4gKiBjbG9jaywgYSB3b3JkIGNvdW50LCBhIHN5bmMgaW5kaWNhdG9yIFx1MjAxNCBvbiBhIGZyYW1lIG5vYm9keSBoYXMgY2FwdHVyZWQgeWV0LlxuICpcbiAqIFdyaXR0ZW4gaW50byB0aGUgZW1pdHRlZCBTVkcgZXhwbGljaXRseSwgZXZlbiB0aG91Z2ggMSBpcyB3aGF0IGBmaWxsLW9wYWNpdHlgXG4gKiBkZWZhdWx0cyB0by4gRHJvcHBpbmcgdGhlIGF0dHJpYnV0ZSB3b3VsZCBsZWF2ZSB0aGlzIGNvbnN0YW50IHVudXNlZCBhbmQgdGFrZVxuICogdGhlIGRlY2lzaW9uIGF3YXkgd2l0aCBpdDogdGhlIGJhbmQgd291bGQgdGhlbiBiZSBvcGFxdWUgYnkgYWNjaWRlbnQgb2YgdGhlXG4gKiBmb3JtYXQgcmF0aGVyIHRoYW4gb24gcHVycG9zZSwgd2l0aCBub3RoaW5nIG5hbWVkIHRvIHJlYWQgYW5kIG5vdGhpbmcgdG9cbiAqIGFzc2VydCBvbi5cbiAqL1xuY29uc3QgQkFORF9PUEFDSVRZID0gMTtcblxuY29uc3QgTUlOSU1VTV9GT05UX1NJWkVfSU5fUElYRUxTID0gMTg7XG5cbi8qKlxuICogRmxvb3Igb24gYmFuZCBoZWlnaHQgYXMgYSBmcmFjdGlvbiBvZiBpbWFnZSBIRUlHSFQuXG4gKlxuICogSGVpZ2h0IGRlcml2ZWQgZnJvbSB0aGUgY2FwdGlvbiBhbG9uZSBpcyB0b28gc2hhbGxvdyBvbiBhIHRhbGwgZnJhbWU6IG9uIGFcbiAqIDkwMHgxNjAwIHBob25lIGl0IGNhbWUgdG8gNjhweCBhbmQgc2xpY2VkIHRocm91Z2ggdGhlIHN0YXR1cyByb3cgaXQgd2FzIG1lYW50XG4gKiB0byBjb3ZlciwgY2xpcHBpbmcgdGhlIHRleHQgbWlkLWxpbmUuIFRoaXMgZmxvb3IgbWFrZXMgdGhlIGJhbmQgZGVlcCBlbm91Z2ggdG9cbiAqIHN3YWxsb3cgdGhhdCByb3cgd2hvbGUgKDEyMHB4IG9uIGEgOTAweDE2MDAgcGhvbmUpLCBhbmQgaXMgaW5lcnQgb24gYSB3aWRlIGZyYW1lIHdoZXJlIHRoZSBjYXB0aW9uLWRlcml2ZWRcbiAqIGhlaWdodCBpcyBhbHJlYWR5IHRoZSBsYXJnZXIgb2YgdGhlIHR3by5cbiAqL1xuY29uc3QgTUlOSU1VTV9IRUlHSFRfUkFUSU8gPSAwLjA3NTtcblxuLyoqXG4gKiBNYXJnaW4gaGVsZCBjbGVhciBhdCBFQUNIIGVuZCBvZiB0aGUgY2FwdGlvbiwgYXMgYSBmcmFjdGlvbiBvZiBpbWFnZSB3aWR0aC5cbiAqXG4gKiBBIGNhcHRpb24gdGhhdCBlbmRzIGEgcGl4ZWwgaW5zaWRlIHRoZSBmcmFtZSBpcyBsZWdhbGx5IHVuLWNsaXBwZWQgYW5kIHN0aWxsXG4gKiBsb29rcyB3cm9uZywgc28gdGhlIHJvb20gYSBjYXB0aW9uIGlzIG1lYXN1cmVkIGFnYWluc3QgaXMgdGhlIGZyYW1lIGxlc3MgdGhpc1xuICogYXQgYm90aCBlbmRzIFx1MjAxNCA0OHB4IGVhY2ggc2lkZSBvbiBhIDEyMDBweCBmcmFtZS5cbiAqL1xuY29uc3QgU0lERV9NQVJHSU5fUkFUSU8gPSAwLjA0O1xuXG4vKipcbiAqIERpdmlzb3IgdGhhdCB0dXJucyBhIHNwYW4gaW50byBpdHMgbWlkcG9pbnQsIGZvciBjZW50ZXJpbmcgdGhlIGNhcHRpb24uXG4gKi9cbmNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuLyoqXG4gKiBUaGUgY2FwdGlvbidzIHR5cGVmYWNlIGFuZCB3ZWlnaHQsIGluIG9uZSBwbGFjZSBiZWNhdXNlIHRoZSBiYW5kIGFuZCB0aGVcbiAqIG1lYXN1cmVtZW50IGNhbnZhcyBNVVNUIGRyYXcgd2l0aCB0aGUgc2FtZSBvbmVzOiBhIG1lYXN1cmVtZW50IHRha2VuIGluIGFcbiAqIGRpZmZlcmVudCBmYWNlIGlzIG5vdCBhIG1lYXN1cmVtZW50IG9mIHRoZSB0aGluZyB0aGF0IHNoaXBzLlxuICovXG5jb25zdCBGT05UX0ZBTUlMWSA9ICdTZWdvZSBVSSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZic7XG5cbmNvbnN0IEZPTlRfV0VJR0hUID0gJzYwMCc7XG5cbmNvbnN0IENBUFRJT05fRklMTCA9ICcjZmZmZmZmJztcblxuLyoqXG4gKiBVcHBlciBib3VuZCBvbiBvbmUgZ2x5cGgncyBhZHZhbmNlIHdpZHRoLCBhcyBhIG11bHRpcGxlIG9mIHRoZSBmb250IHNpemUuXG4gKlxuICogSXQgc2l6ZXMgdGhlIG9mZi1zY3JlZW4gY2FudmFzIHRoZSBjYXB0aW9uIGlzIG1lYXN1cmVkIG9uLCBhbmQgaXQgb25seSBldmVyXG4gKiBuZWVkcyB0byBiZSBhbiBvdmVyLWVzdGltYXRlOiBhIGNhbnZhcyB0b28gbmFycm93IHdvdWxkIGNsaXAgdGhlIHRleHQgYmVpbmdcbiAqIG1lYXN1cmVkLCB1bmRlci1yZXBvcnQgaXRzIHdpZHRoLCBhbmQgcmVpbnRyb2R1Y2UgdGhlIGV4YWN0IHNpbGVudCBjbGlwcGluZ1xuICogdGhlIG1lYXN1cmVtZW50IGV4aXN0cyB0byBjYXRjaC4gTm8gTGF0aW4gZ2x5cGggaW4gYSBwcm9wb3J0aW9uYWwgc2Fuc1xuICogYWR2YW5jZXMgYSBmdWxsIGVtIFx1MjAxNCBhbiBlbSBkYXNoLCB0aGUgd2lkZXN0LCBpcyAxLjAgXHUyMDE0IHNvIDEuMSBpcyBoZWFkcm9vbSBhdFxuICogbmVnbGlnaWJsZSBjb3N0IChtZWFzdXJlZCBwcm9zZSBydW5zIGFib3V0IDAuNDUgZW0gcGVyIGNoYXJhY3Rlciwgc28gdGhlXG4gKiBjYW52YXMgY29tZXMgb3V0IHJvdWdobHkgMi41eCB0aGUgdGV4dCkuXG4gKi9cbmNvbnN0IE1BWElNVU1fR0xZUEhfQURWQU5DRV9SQVRJTyA9IDEuMTtcblxuLyoqXG4gKiBIZWlnaHQgb2YgdGhlIG1lYXN1cmVtZW50IGNhbnZhcyBhcyBhIG11bHRpcGxlIG9mIHRoZSBmb250IHNpemUsIHNvIGFzY2VuZGVyc1xuICogYW5kIGRlc2NlbmRlcnMgaGF2ZSByb29tIGFuZCB0aGUgdHJpbSByZWFkcyB0aGUgZ2x5cGhzIHJhdGhlciB0aGFuIHRoZSBlZGdlLlxuICovXG5jb25zdCBNRUFTVVJFTUVOVF9DQU5WQVNfSEVJR0hUX1JBVElPID0gMztcblxuLyoqXG4gKiBIb3cgZmFyIGEgcGl4ZWwgbWF5IGRpZmZlciBmcm9tIHRoZSB0cmFuc3BhcmVudCBzdXJyb3VuZCBiZWZvcmUgYHRyaW1gIGNvdW50c1xuICogaXQgYXMgdGV4dC4gRGVsaWJlcmF0ZWx5IGZhciBsb3dlciB0aGFuIGBzaGFycGAncyBkZWZhdWx0IG9mIDEwOiB0aGUgb3V0ZXJtb3N0XG4gKiBwaXhlbHMgb2YgYW4gYW50aWFsaWFzZWQgZ2x5cGggYXJlIHZlcnkgZmFpbnQsIGFuZCB0aGUgZGVmYXVsdCBkaXNjYXJkcyB0aGVtLFxuICogdW5kZXItbWVhc3VyaW5nIGEgY2FwdGlvbiBieSBhIHBpeGVsIG9yIHR3byBhdCBlYWNoIGVuZC5cbiAqL1xuY29uc3QgVFJJTV9USFJFU0hPTEQgPSAxO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZENhcHRpb25UZXh0RWxlbWVudH0uXG4gKi9cbmludGVyZmFjZSBDYXB0aW9uVGV4dEVsZW1lbnRQYXJhbXMge1xuICByZWFkb25seSBmb250U2l6ZUluUGl4ZWxzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgdGV4dEFuY2hvcjogJ21pZGRsZScgfCAnc3RhcnQnO1xuICByZWFkb25seSB4SW5QaXhlbHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgeUluUGl4ZWxzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBTVkcgZm9yIHRoZSBjYXB0aW9uIGJhbmQuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgY2FwdGlvbi5cbiAqIEBwYXJhbSBnZW9tZXRyeSAtIFRoZSBiYW5kIGdlb21ldHJ5LlxuICogQHBhcmFtIGltYWdlV2lkdGhJblBpeGVscyAtIFdpZHRoIG9mIHRoZSBpbWFnZSwgc28gdGhlIGJhbmQgc3BhbnMgaXQuXG4gKiBAcmV0dXJucyBUaGUgU1ZHIG1hcmt1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGFiZWxTdmcodGV4dDogc3RyaW5nLCBnZW9tZXRyeTogTGFiZWxCYW5kR2VvbWV0cnksIGltYWdlV2lkdGhJblBpeGVsczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgeyBmb250U2l6ZUluUGl4ZWxzLCBoZWlnaHRJblBpeGVscyB9ID0gZ2VvbWV0cnk7XG4gIGNvbnN0IGNhcHRpb25FbGVtZW50ID0gYnVpbGRDYXB0aW9uVGV4dEVsZW1lbnQoe1xuICAgIGZvbnRTaXplSW5QaXhlbHMsXG4gICAgdGV4dCxcbiAgICB0ZXh0QW5jaG9yOiAnbWlkZGxlJyxcbiAgICB4SW5QaXhlbHM6IGltYWdlV2lkdGhJblBpeGVscyAvIENFTlRFUl9ESVZJU09SLFxuICAgIHlJblBpeGVsczogaGVpZ2h0SW5QaXhlbHMgLyBDRU5URVJfRElWSVNPUlxuICB9KTtcblxuICByZXR1cm4gYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiJHtTdHJpbmcoaW1hZ2VXaWR0aEluUGl4ZWxzKX1cIiBoZWlnaHQ9XCIke1N0cmluZyhoZWlnaHRJblBpeGVscyl9XCI+YFxuICAgICsgYDxyZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIiR7U3RyaW5nKGltYWdlV2lkdGhJblBpeGVscyl9XCIgaGVpZ2h0PVwiJHtTdHJpbmcoaGVpZ2h0SW5QaXhlbHMpfVwiIGBcbiAgICArIGBmaWxsPVwiIzAwMDAwMFwiIGZpbGwtb3BhY2l0eT1cIiR7U3RyaW5nKEJBTkRfT1BBQ0lUWSl9XCIvPmBcbiAgICArIGAke2NhcHRpb25FbGVtZW50fTwvc3ZnPmA7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNhcHRpb24gYmFuZCdzIHNpemUgYW5kIHBvc2l0aW9uIGZvciBhIGdpdmVuIGltYWdlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgaW1hZ2UgZGltZW5zaW9ucy5cbiAqIEByZXR1cm5zIFRoZSBiYW5kIGdlb21ldHJ5LlxuICogQHRocm93cyBFcnJvciBpZiBlaXRoZXIgZGltZW5zaW9uIGlzIG5vdCBhIHBvc2l0aXZlIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVMYWJlbEJhbmQocGFyYW1zOiBDb21wdXRlTGFiZWxCYW5kUGFyYW1zKTogTGFiZWxCYW5kR2VvbWV0cnkge1xuICBjb25zdCB7IGltYWdlSGVpZ2h0SW5QaXhlbHMsIGltYWdlV2lkdGhJblBpeGVscyB9ID0gcGFyYW1zO1xuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGltYWdlV2lkdGhJblBpeGVscykgfHwgaW1hZ2VXaWR0aEluUGl4ZWxzIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbXB1dGVMYWJlbEJhbmQ6IGltYWdlV2lkdGhJblBpeGVscyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLCBnb3QgJHtTdHJpbmcoaW1hZ2VXaWR0aEluUGl4ZWxzKX0uYCk7XG4gIH1cblxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbWFnZUhlaWdodEluUGl4ZWxzKSB8fCBpbWFnZUhlaWdodEluUGl4ZWxzIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbXB1dGVMYWJlbEJhbmQ6IGltYWdlSGVpZ2h0SW5QaXhlbHMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKGltYWdlSGVpZ2h0SW5QaXhlbHMpfS5gKTtcbiAgfVxuXG4gIGNvbnN0IGZvbnRTaXplSW5QaXhlbHMgPSBNYXRoLm1heChNSU5JTVVNX0ZPTlRfU0laRV9JTl9QSVhFTFMsIE1hdGgucm91bmQoaW1hZ2VXaWR0aEluUGl4ZWxzICogRk9OVF9TSVpFX1JBVElPKSk7XG4gIGNvbnN0IGNhcHRpb25IZWlnaHRJblBpeGVscyA9IE1hdGgucm91bmQoZm9udFNpemVJblBpeGVscyAqIEJBTkRfSEVJR0hUX1JBVElPKTtcbiAgY29uc3QgZmxvb3JlZEhlaWdodEluUGl4ZWxzID0gTWF0aC5tYXgoY2FwdGlvbkhlaWdodEluUGl4ZWxzLCBNYXRoLnJvdW5kKGltYWdlSGVpZ2h0SW5QaXhlbHMgKiBNSU5JTVVNX0hFSUdIVF9SQVRJTykpO1xuICBjb25zdCBoZWlnaHRJblBpeGVscyA9IE1hdGgubWluKGltYWdlSGVpZ2h0SW5QaXhlbHMsIGZsb29yZWRIZWlnaHRJblBpeGVscyk7XG4gIGNvbnN0IHNpZGVNYXJnaW5JblBpeGVscyA9IE1hdGgucm91bmQoaW1hZ2VXaWR0aEluUGl4ZWxzICogU0lERV9NQVJHSU5fUkFUSU8pO1xuXG4gIHJldHVybiB7XG4gICAgY2FwdGlvblJvb21JblBpeGVsczogaW1hZ2VXaWR0aEluUGl4ZWxzIC0gKHNpZGVNYXJnaW5JblBpeGVscyAqIENFTlRFUl9ESVZJU09SKSxcbiAgICBmb250U2l6ZUluUGl4ZWxzLFxuICAgIGhlaWdodEluUGl4ZWxzLFxuICAgIHRvcEluUGl4ZWxzOiBpbWFnZUhlaWdodEluUGl4ZWxzIC0gaGVpZ2h0SW5QaXhlbHNcbiAgfTtcbn1cblxuLyoqXG4gKiBFc2NhcGVzIHRleHQgZm9yIGluY2x1c2lvbiBpbiBTVkcgY2hhcmFjdGVyIGRhdGEuXG4gKlxuICogQSBjYXB0aW9uIGlzIGF1dGhvcmVkIHBlciBzY3JlZW5zaG90IGFuZCBjYW4gbGVnaXRpbWF0ZWx5IGNvbnRhaW4gYCZgIG9yIHRoZVxuICogYW5nbGUgYnJhY2tldHMgT2JzaWRpYW4gdXNlcyBpbiBsaW5rIHN5bnRheDsgdW5lc2NhcGVkLCB0aG9zZSBtYWtlIHRoZSBTVkdcbiAqIGltcG9zc2libGUgdG8gcGFyc2UgYW5kIGBzaGFycGAgZmFpbHMgb24gYSBjYXB0aW9uIHJhdGhlciB0aGFuIG9uIGFuIGltYWdlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHJhdyBjYXB0aW9uLlxuICogQHJldHVybnMgVGhlIGNhcHRpb24sIHNhZmUgdG8gZW1iZWQgaW4gU1ZHLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlU3ZnVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlQWxsKCcmJywgJyZhbXA7JylcbiAgICAucmVwbGFjZUFsbCgnPCcsICcmbHQ7JylcbiAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7JylcbiAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAucmVwbGFjZUFsbCgnXFwnJywgJyZhcG9zOycpO1xufVxuXG4vKipcbiAqIERyYXdzIGEgY2FwdGlvbiBiYW5kIGFjcm9zcyB0aGUgYm90dG9tIG9mIGEgc2NyZWVuc2hvdC5cbiAqXG4gKiBUaGUgaW1hZ2Uga2VlcHMgaXRzIGRpbWVuc2lvbnMgZXhhY3RseTogdGhlIGJhbmQgaXMgY29tcG9zaXRlZCBPVkVSIHRoZVxuICogZnJhbWUsIG5ldmVyIGFwcGVuZGVkIHRvIGl0LCBiZWNhdXNlIHRoZSBzdG9yZSBleHBlY3RzIGEgc3BlY2lmaWMgc2l6ZS5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgLSBUaGUgY2FwdHVyZWQgUE5HLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgY2FwdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxhYmVsZWQgUE5HLCB0aGUgc2FtZSBzaXplIGFzIHRoZSBpbnB1dC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYHNoYXJwYCBpcyBub3QgaW5zdGFsbGVkLCB0aGUgaW1hZ2UgZGltZW5zaW9ucyBjYW5ub3QgYmUgcmVhZCwgb3IgdGhlIGNhcHRpb24gaXMgdG9vIHdpZGUgZm9yIHRoZSBmcmFtZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhYmVsU2NyZWVuc2hvdChieXRlczogVWludDhBcnJheSwgb3B0aW9uczogTGFiZWxTY3JlZW5zaG90T3B0aW9ucyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBzaGFycCA9IGF3YWl0IGltcG9ydFNoYXJwKCdsYWJlbFNjcmVlbnNob3QnKTtcbiAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBzaGFycChieXRlcykubWV0YWRhdGEoKTtcbiAgY29uc3QgaW1hZ2VXaWR0aEluUGl4ZWxzID0gbWV0YWRhdGEud2lkdGg7XG4gIGNvbnN0IGltYWdlSGVpZ2h0SW5QaXhlbHMgPSBtZXRhZGF0YS5oZWlnaHQ7XG5cbiAgLyogdjggaWdub3JlIG5leHQgMyAtLSBEZWZlbnNpdmU6IGBzaGFycGAgcmVqZWN0cyBhIG5vbi1pbWFnZSBiZWZvcmUgaXQgY2FuIHJlcG9ydCBtZXRhZGF0YSB3aXRob3V0IGRpbWVuc2lvbnMsIHNvIHRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlIGZyb20gYSB0ZXN0LiAqL1xuICBpZiAoaW1hZ2VXaWR0aEluUGl4ZWxzID09PSB1bmRlZmluZWQgfHwgaW1hZ2VIZWlnaHRJblBpeGVscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdsYWJlbFNjcmVlbnNob3Q6IGNvdWxkIG5vdCByZWFkIHRoZSBzb3VyY2UgaW1hZ2UgZGltZW5zaW9ucy4nKTtcbiAgfVxuXG4gIGNvbnN0IGdlb21ldHJ5ID0gY29tcHV0ZUxhYmVsQmFuZCh7IGltYWdlSGVpZ2h0SW5QaXhlbHMsIGltYWdlV2lkdGhJblBpeGVscyB9KTtcbiAgY29uc3QgdGV4dFdpZHRoSW5QaXhlbHMgPSBhd2FpdCBtZWFzdXJlQ2FwdGlvbldpZHRoKG9wdGlvbnMudGV4dCwgZ2VvbWV0cnkuZm9udFNpemVJblBpeGVscyk7XG5cbiAgaWYgKHRleHRXaWR0aEluUGl4ZWxzID4gZ2VvbWV0cnkuY2FwdGlvblJvb21JblBpeGVscykge1xuICAgIGNvbnN0IG92ZXJmbG93SW5QaXhlbHMgPSB0ZXh0V2lkdGhJblBpeGVscyAtIGdlb21ldHJ5LmNhcHRpb25Sb29tSW5QaXhlbHM7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGxhYmVsU2NyZWVuc2hvdDogdGhlIGNhcHRpb24gaXMgJHtTdHJpbmcob3ZlcmZsb3dJblBpeGVscyl9cHggdG9vIHdpZGUgZm9yIHRoZSBmcmFtZS4gYFxuICAgICAgICArIGBJdCByZW5kZXJzICR7U3RyaW5nKHRleHRXaWR0aEluUGl4ZWxzKX1weCBhdCBmb250LXNpemUgJHtTdHJpbmcoZ2VvbWV0cnkuZm9udFNpemVJblBpeGVscyl9LCBhbmQgYSBgXG4gICAgICAgICsgYCR7U3RyaW5nKGltYWdlV2lkdGhJblBpeGVscyl9cHggZnJhbWUgaGFzIHJvb20gZm9yICR7U3RyaW5nKGdlb21ldHJ5LmNhcHRpb25Sb29tSW5QaXhlbHMpfXB4LiBgXG4gICAgICAgICsgJ1Nob3J0ZW4gaXQ6IGEgY2FwdGlvbiB0aGF0IGRvZXMgbm90IGZpdCBpcyBjbGlwcGVkIGF0IEJPVEggZW5kcywgd2l0aCBubyBlbGxpcHNpcyB0byBzaG93IGl0IGhhcHBlbmVkLiAnXG4gICAgICAgICsgYENhcHRpb246ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucy50ZXh0KX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHN2ZyA9IGJ1aWxkTGFiZWxTdmcob3B0aW9ucy50ZXh0LCBnZW9tZXRyeSwgaW1hZ2VXaWR0aEluUGl4ZWxzKTtcbiAgY29uc3QgbGF5ZXI6IFNoYXJwQ29tcG9zaXRlTGF5ZXIgPSB7XG4gICAgaW5wdXQ6IEJ1ZmZlci5mcm9tKHN2ZyksXG4gICAgbGVmdDogMCxcbiAgICB0b3A6IGdlb21ldHJ5LnRvcEluUGl4ZWxzXG4gIH07XG5cbiAgY29uc3QgbGFiZWxlZCA9IGF3YWl0IHNoYXJwKGJ5dGVzKVxuICAgIC5jb21wb3NpdGUoW2xheWVyXSlcbiAgICAucG5nKClcbiAgICAudG9CdWZmZXIoKTtcblxuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGFiZWxlZCk7XG59XG5cbi8qKlxuICogTWVhc3VyZXMgYSBjYXB0aW9uIGFnYWluc3QgdGhlIGZyYW1lIGl0IGlzIGRlc3RpbmVkIGZvciwgd2l0aG91dCBkcmF3aW5nXG4gKiBhbnl0aGluZy5cbiAqXG4gKiBUaGlzIGlzIHdoYXQge0BsaW5rIGxhYmVsU2NyZWVuc2hvdH0gcmVqZWN0cyBhbiBvdmVybG9uZyBjYXB0aW9uIHdpdGgsIGV4cG9zZWRcbiAqIHNvIGEgY2FwdGlvbiBjYW4gYmUgY2hvc2VuIHdpdGggdGhlIG51bWJlciBpbiBoYW5kIGluc3RlYWQgb2YgYnkgY2FwdHVyaW5nIGFcbiAqIGZyYW1lIGFuZCBsb29raW5nIGF0IGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY2FwdGlvbiBhbmQgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGltYWdlIGl0IGlzIGZvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG1lYXN1cmVtZW50LlxuICogQHRocm93cyBFcnJvciBpZiBgc2hhcnBgIGlzIG5vdCBpbnN0YWxsZWQsIG9yIGVpdGhlciBkaW1lbnNpb24gaXMgbm90IGEgcG9zaXRpdmUgbnVtYmVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWVhc3VyZUxhYmVsQ2FwdGlvbihwYXJhbXM6IE1lYXN1cmVMYWJlbENhcHRpb25QYXJhbXMpOiBQcm9taXNlPExhYmVsQ2FwdGlvbk1lYXN1cmVtZW50PiB7XG4gIGNvbnN0IHsgaW1hZ2VIZWlnaHRJblBpeGVscywgaW1hZ2VXaWR0aEluUGl4ZWxzLCB0ZXh0IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGdlb21ldHJ5ID0gY29tcHV0ZUxhYmVsQmFuZCh7IGltYWdlSGVpZ2h0SW5QaXhlbHMsIGltYWdlV2lkdGhJblBpeGVscyB9KTtcbiAgY29uc3QgdGV4dFdpZHRoSW5QaXhlbHMgPSBhd2FpdCBtZWFzdXJlQ2FwdGlvbldpZHRoKHRleHQsIGdlb21ldHJ5LmZvbnRTaXplSW5QaXhlbHMpO1xuXG4gIHJldHVybiB7XG4gICAgY2FwdGlvblJvb21JblBpeGVsczogZ2VvbWV0cnkuY2FwdGlvblJvb21JblBpeGVscyxcbiAgICBkb2VzRml0OiB0ZXh0V2lkdGhJblBpeGVscyA8PSBnZW9tZXRyeS5jYXB0aW9uUm9vbUluUGl4ZWxzLFxuICAgIHRleHRXaWR0aEluUGl4ZWxzXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjYXB0aW9uJ3MgU1ZHIGA8dGV4dD5gIGVsZW1lbnQuXG4gKlxuICogQm90aCB0aGUgYmFuZCBhbmQgdGhlIG1lYXN1cmVtZW50IGNhbnZhcyBnbyB0aHJvdWdoIGhlcmUsIHNvIHRoZSB0aGluZyB0aGF0XG4gKiBpcyBtZWFzdXJlZCBpcyBkcmF3biB3aXRoIHRoZSBzYW1lIGZhY2UsIHdlaWdodCBhbmQgc2l6ZSBhcyB0aGUgdGhpbmcgdGhhdFxuICogc2hpcHMuIFR3byBoYW5kLXdyaXR0ZW4gY29waWVzIHdvdWxkIGJlIGZyZWUgdG8gZHJpZnQsIGFuZCBhIG1lYXN1cmVtZW50IHRoYXRcbiAqIGhhcyBkcmlmdGVkIGZyb20gdGhlIGRyYXdpbmcgaXMgd29yc2UgdGhhbiBubyBtZWFzdXJlbWVudCBhdCBhbGwuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjYXB0aW9uLCBpdHMgc2l6ZSwgYW5kIHdoZXJlIHRvIGFuY2hvciBpdC5cbiAqIEByZXR1cm5zIFRoZSBgPHRleHQ+YCBtYXJrdXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkQ2FwdGlvblRleHRFbGVtZW50KHBhcmFtczogQ2FwdGlvblRleHRFbGVtZW50UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBmb250U2l6ZUluUGl4ZWxzLCB0ZXh0LCB0ZXh0QW5jaG9yLCB4SW5QaXhlbHMsIHlJblBpeGVscyB9ID0gcGFyYW1zO1xuXG4gIHJldHVybiBgPHRleHQgeD1cIiR7U3RyaW5nKHhJblBpeGVscyl9XCIgeT1cIiR7U3RyaW5nKHlJblBpeGVscyl9XCIgYFxuICAgICsgYGZvbnQtZmFtaWx5PVwiJHtGT05UX0ZBTUlMWX1cIiBmb250LXNpemU9XCIke1N0cmluZyhmb250U2l6ZUluUGl4ZWxzKX1cIiBgXG4gICAgKyBgZm9udC13ZWlnaHQ9XCIke0ZPTlRfV0VJR0hUfVwiIGZpbGw9XCIke0NBUFRJT05fRklMTH1cIiB0ZXh0LWFuY2hvcj1cIiR7dGV4dEFuY2hvcn1cIiBkb21pbmFudC1iYXNlbGluZT1cImNlbnRyYWxcIj5gXG4gICAgKyBgJHtlc2NhcGVTdmdUZXh0KHRleHQpfTwvdGV4dD5gO1xufVxuXG4vKipcbiAqIE1lYXN1cmVzIGhvdyB3aWRlIGEgY2FwdGlvbiByZW5kZXJzIGF0IGEgZ2l2ZW4gc2l6ZS5cbiAqXG4gKiBUaGUgdGV4dCBpcyBkcmF3biBhbG9uZSBvbiBhIHRyYW5zcGFyZW50IGNhbnZhcyBkZWxpYmVyYXRlbHkgd2lkZXIgdGhhbiBpdCBjYW5cbiAqIHBvc3NpYmx5IG5lZWQsIHRoZW4gYHRyaW1gbWVkIGJhY2sgdG8gaXRzIG93biBpbmsgXHUyMDE0IHRoZSBzYW1lIG1lYXN1cmVtZW50IHRoYXRcbiAqIHdhcyBwcmV2aW91c2x5IGRvbmUgYnkgaGFuZCwgb25jZSwgcGVyIGNhcHRpb24sIGJ5IHdob2V2ZXIgdGhvdWdodCB0byBkb3VidFxuICogb25lLiBUaGUgcmVuZGVyZXIgZG9pbmcgdGhlIG1lYXN1cmluZyBpcyB0aGUgcmVuZGVyZXIgdGhhdCBkcmF3cyB0aGUgYmFuZCwgc29cbiAqIHRoZSB0d28gY2Fubm90IGRpc2FncmVlIGFib3V0IGEgZm9udCB0aGUgaG9zdCBkb2VzIG9yIGRvZXMgbm90IGhhdmUuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgY2FwdGlvbi5cbiAqIEBwYXJhbSBmb250U2l6ZUluUGl4ZWxzIC0gVGhlIHNpemUgdGhlIGJhbmQgd291bGQgZHJhdyBpdCBhdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlbmRlcmVkIHdpZHRoIGluIHBpeGVscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWVhc3VyZUNhcHRpb25XaWR0aCh0ZXh0OiBzdHJpbmcsIGZvbnRTaXplSW5QaXhlbHM6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gIC8vIEEgY2FwdGlvbiB3aXRoIG5vIGluayBsZWF2ZXMgdGhlIGNhbnZhcyB1bmlmb3JtbHkgdHJhbnNwYXJlbnQsIGFuZCBgdHJpbWBcbiAgLy8gcmV0dXJucyBzdWNoIGFuIGltYWdlIHVudG91Y2hlZCBcdTIwMTQgaS5lLiByZXBvcnRzIHRoZSB3aG9sZSBjYW52YXMgYXMgdGV4dC5cbiAgaWYgKHRleHQudHJpbSgpID09PSAnJykge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3Qgc2hhcnAgPSBhd2FpdCBpbXBvcnRTaGFycCgnbWVhc3VyZUxhYmVsQ2FwdGlvbicpO1xuICBjb25zdCBwYWRkaW5nSW5QaXhlbHMgPSBmb250U2l6ZUluUGl4ZWxzICogQ0VOVEVSX0RJVklTT1I7XG4gIGNvbnN0IGNhbnZhc1dpZHRoSW5QaXhlbHMgPSBNYXRoLmNlaWwoZm9udFNpemVJblBpeGVscyAqIE1BWElNVU1fR0xZUEhfQURWQU5DRV9SQVRJTyAqIHRleHQubGVuZ3RoKSArIHBhZGRpbmdJblBpeGVscztcbiAgY29uc3QgY2FudmFzSGVpZ2h0SW5QaXhlbHMgPSBNYXRoLmNlaWwoZm9udFNpemVJblBpeGVscyAqIE1FQVNVUkVNRU5UX0NBTlZBU19IRUlHSFRfUkFUSU8pO1xuICBjb25zdCBjYXB0aW9uRWxlbWVudCA9IGJ1aWxkQ2FwdGlvblRleHRFbGVtZW50KHtcbiAgICBmb250U2l6ZUluUGl4ZWxzLFxuICAgIHRleHQsXG4gICAgdGV4dEFuY2hvcjogJ3N0YXJ0JyxcbiAgICB4SW5QaXhlbHM6IGZvbnRTaXplSW5QaXhlbHMsXG4gICAgeUluUGl4ZWxzOiBjYW52YXNIZWlnaHRJblBpeGVscyAvIENFTlRFUl9ESVZJU09SXG4gIH0pO1xuICBjb25zdCBzdmcgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIke1N0cmluZyhjYW52YXNXaWR0aEluUGl4ZWxzKX1cIiBoZWlnaHQ9XCIke1N0cmluZyhjYW52YXNIZWlnaHRJblBpeGVscyl9XCI+YFxuICAgICsgYCR7Y2FwdGlvbkVsZW1lbnR9PC9zdmc+YDtcblxuICBjb25zdCB0cmltbWVkID0gYXdhaXQgc2hhcnAobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oc3ZnKSkpXG4gICAgLnRyaW0oeyB0aHJlc2hvbGQ6IFRSSU1fVEhSRVNIT0xEIH0pXG4gICAgLnBuZygpXG4gICAgLnRvQnVmZmVyKCk7XG5cbiAgcmV0dXJuIHJlYWRQbmdEaW1lbnNpb25zKG5ldyBVaW50OEFycmF5KHRyaW1tZWQpKS53aWR0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
|
|
@@ -0,0 +1,46 @@
|
|
|
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 launched_device_selection_exports = {};
|
|
20
|
+
__export(launched_device_selection_exports, {
|
|
21
|
+
resolveLaunchedDevice: () => resolveLaunchedDevice,
|
|
22
|
+
splitNewDevices: () => splitNewDevices
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(launched_device_selection_exports);
|
|
25
|
+
var import_avd_probe_verdict = require("./avd-probe-verdict.cjs");
|
|
26
|
+
function resolveLaunchedDevice(params) {
|
|
27
|
+
const match = params.candidates.find((candidate) => candidate.probedAvdName === params.avdName);
|
|
28
|
+
return {
|
|
29
|
+
deviceId: match?.deviceId,
|
|
30
|
+
otherAvdDeviceIds: params.candidates.filter((candidate) => candidate.probedAvdName !== void 0 && candidate.probedAvdName !== params.avdName).map((candidate) => candidate.deviceId),
|
|
31
|
+
unansweredDeviceIds: params.candidates.filter((candidate) => candidate.probedAvdName === void 0).map((candidate) => candidate.deviceId)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function splitNewDevices(params) {
|
|
35
|
+
const newDeviceIds = params.connectedDeviceIds.filter((deviceId) => !params.deviceIdsBefore.includes(deviceId));
|
|
36
|
+
return {
|
|
37
|
+
emulatorDeviceIds: newDeviceIds.filter((deviceId) => (0, import_avd_probe_verdict.checkIsEmulatorDeviceId)(deviceId)),
|
|
38
|
+
nonEmulatorDeviceIds: newDeviceIds.filter((deviceId) => !(0, import_avd_probe_verdict.checkIsEmulatorDeviceId)(deviceId))
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
42
|
+
0 && (module.exports = {
|
|
43
|
+
resolveLaunchedDevice,
|
|
44
|
+
splitNewDevices
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xhdW5jaGVkLWRldmljZS1zZWxlY3Rpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIHNlbGVjdGlvbiBvZiB0aGUgZGV2aWNlIGFuIGVtdWxhdG9yIHRoaXMgcnVuIGp1c3QgbGF1bmNoZWQgcHJvZHVjZWQuXG4gKlxuICogVGhlIHdhaXQgdXNlZCB0byB0YWtlIHRoZSBmaXJzdCBvbmxpbmUgZGV2aWNlIHRoYXQgd2FzIG5vdCBsaXN0ZWQgYmVmb3JlIHRoZVxuICogbGF1bmNoLiBUaGUgXCJiZWZvcmVcIiBzbmFwc2hvdCBsaXN0cyBvbmxpbmUgZGV2aWNlcyBvbmx5LCBzbyBhIGhhbmRzZXQgdGhhdCB3YXNcbiAqIGB1bmF1dGhvcml6ZWRgLCBgb2ZmbGluZWAgb3IgdW5wbHVnZ2VkIGF0IHRoYXQgbW9tZW50IFx1MjAxNCBhbmQgY2FtZSBvbmxpbmUgZHVyaW5nXG4gKiB0aGUgYm9vdCwgd2hpY2ggYSBVU0IgcmVjb25uZWN0IG9yIGFjY2VwdGluZyB0aGUgZGVidWdnaW5nIHByb21wdCBpcyBlbm91Z2hcbiAqIGZvciBcdTIwMTQgbG9va2VkIG5ldywgYW5kIHdhcyBhZG9wdGVkIGFzIHRoZSBlbXVsYXRvcjpcbiAqXG4gKiBgYGB0ZXh0XG4gKiBBVkQgXCJvYnNpZGlhbl90ZXN0XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uXG4gKiBXYWl0aW5nIGZvciBhIG5ldyBkZXZpY2UgdG8gYXBwZWFyIGluIEFEQiAuLi5cbiAqIERldmljZSAzQzE1Qk4wMDFZOTAwMDAwIGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLlxuICogRW11bGF0b3IgXCJvYnNpZGlhbl90ZXN0XCIgc3RhcnRlZCwgZGV2aWNlIDNDMTVCTjAwMVk5MDAwMDAgaXMgY29ubmVjdGVkIChvd25lZCBlbXVsYXRvciBQSURzOiBbXSlcbiAqIGBgYFxuICpcbiAqIFRoZSBzdWl0ZSB0aGVuIHJhbiBvbiB0aGUgcGhvbmUsIGFuZCB0aGUgZW11bGF0b3IgcmVhbGx5IGxhdW5jaGVkIHdhcyBvd25lZCBieVxuICogbm9ib2R5LiBTbyBhIG5ldyBkZXZpY2UgaXMgdGhlIGxhdW5jaGVkIGVtdWxhdG9yIG9ubHkgd2hlbiBpdCBpcyBhbiBlbXVsYXRvclxuICogKiphbmQqKiBpdCBzYXlzIGl0IGlzIHNlcnZpbmcgdGhlIGxhdW5jaGVkIEFWRCBcdTIwMTQgd2hpY2ggYWxzbyBrZWVwcyBhIHNlY29uZFxuICogZW11bGF0b3IgYW5vdGhlciBwcm9qZWN0IHN0YXJ0ZWQgY29uY3VycmVudGx5IGZyb20gYmVpbmcgYWRvcHRlZC5cbiAqXG4gKiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCBzbyB0aGUgZGVjaXNpb24gaXNcbiAqIHVuaXQtdGVzdGFibGU7IHRoZSBmYWN0b3J5IGRvZXMgdGhlIGBhZGJgIHJvdW5kLXRyaXBzLlxuICovXG5cbmltcG9ydCB7IGNoZWNrSXNFbXVsYXRvckRldmljZUlkIH0gZnJvbSAnLi9hdmQtcHJvYmUtdmVyZGljdC5janMnO1xuXG4vKipcbiAqIE9uZSBuZXcgZW11bGF0b3IgZGV2aWNlLCB3aXRoIHdoYXQgaXQgYW5zd2VyZWQgd2hlbiBhc2tlZCBmb3IgaXRzIEFWRCBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhdW5jaGVkRGV2aWNlQ2FuZGlkYXRlIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCwgZS5nLiBgZW11bGF0b3ItNTU1NGAuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVZEIHRoZSBkZXZpY2UgcmVwb3J0ZWQsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgZGlkIG5vdCBhbnN3ZXIuXG4gICAqL1xuICByZWFkb25seSBwcm9iZWRBdmROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIG5ldyBkZXZpY2VzIGEgcG9sbCBmb3VuZCwgc3BsaXQgYnkgd2hldGhlciB0aGV5IGNhbiBiZSB0aGUgbGF1bmNoZWQgZW11bGF0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV3RGV2aWNlU3BsaXQge1xuICAvKipcbiAgICogTmV3IGVtdWxhdG9yIGRldmljZXMsIHRvIGJlIGFza2VkIHdoaWNoIEFWRCB0aGV5IHNlcnZlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JEZXZpY2VJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOZXcgZGV2aWNlcyB0aGF0IGFyZSBub3QgZW11bGF0b3JzIChhIGhhbmRzZXQsIGEgVENQLWF0dGFjaGVkIGRldmljZSkgYW5kIGFyZSBuZXZlciBhZG9wdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRW11bGF0b3JEZXZpY2VJZHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlTGF1bmNoZWREZXZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVMYXVuY2hlZERldmljZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgQVZEIHRoaXMgcnVuIGxhdW5jaGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IGVtdWxhdG9yIGRldmljZXMsIHdpdGggdGhlaXIgcHJvYmUgYW5zd2Vycy5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmRpZGF0ZXM6IHJlYWRvbmx5IExhdW5jaGVkRGV2aWNlQ2FuZGlkYXRlW107XG59XG5cbi8qKlxuICogV2hhdCB0aGUgcHJvYmUgYW5zd2VycyBzYXkgYWJvdXQgdGhlIGxhdW5jaGVkIGVtdWxhdG9yJ3MgZGV2aWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVMYXVuY2hlZERldmljZVJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZGV2aWNlIHNlcnZpbmcgdGhlIGxhdW5jaGVkIEFWRCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBub25lIGRvZXMgeWV0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGV2aWNlcyB0aGF0IGFuc3dlcmVkIHdpdGggYSBkaWZmZXJlbnQgQVZEOiBhbm90aGVyIGVtdWxhdG9yLCBuZXZlciB0aGlzIHJ1bidzLlxuICAgKi9cbiAgcmVhZG9ubHkgb3RoZXJBdmREZXZpY2VJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBEZXZpY2VzIHRoYXQgZGlkIG5vdCBhbnN3ZXIgeWV0LCB0byBiZSBhc2tlZCBhZ2FpbiBvbiB0aGUgbmV4dCBwb2xsLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5hbnN3ZXJlZERldmljZUlkczogc3RyaW5nW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNwbGl0TmV3RGV2aWNlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXROZXdEZXZpY2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2VzIG9ubGluZSBub3cuXG4gICAqL1xuICByZWFkb25seSBjb25uZWN0ZWREZXZpY2VJZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGV2aWNlcyBvbmxpbmUgYmVmb3JlIHRoZSBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZHNCZWZvcmU6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBpY2tzIHRoZSBuZXcgZW11bGF0b3IgZGV2aWNlIHRoYXQgc2VydmVzIHRoZSBsYXVuY2hlZCBBVkQuXG4gKlxuICogU2lsZW5jZSBpcyBub3QgYSBtYXRjaDogYSBkZXZpY2UgdGhhdCBkaWQgbm90IGFuc3dlciBpcyBhc2tlZCBhZ2FpbiwgbmV2ZXIgYWRvcHRlZFxuICogb24gdGhlIHN0cmVuZ3RoIG9mIGJlaW5nIG5ldy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGxhdW5jaGVkIEFWRCBhbmQgdGhlIHByb2JlZCBjYW5kaWRhdGVzLlxuICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGRldmljZSwgcGx1cyB0aGUgb25lcyBydWxlZCBvdXQgYW5kIHRoZSBvbmVzIHN0aWxsIHVua25vd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTGF1bmNoZWREZXZpY2UocGFyYW1zOiBSZXNvbHZlTGF1bmNoZWREZXZpY2VQYXJhbXMpOiBSZXNvbHZlTGF1bmNoZWREZXZpY2VSZXN1bHQge1xuICBjb25zdCBtYXRjaCA9IHBhcmFtcy5jYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnByb2JlZEF2ZE5hbWUgPT09IHBhcmFtcy5hdmROYW1lKTtcbiAgcmV0dXJuIHtcbiAgICBkZXZpY2VJZDogbWF0Y2g/LmRldmljZUlkLFxuICAgIG90aGVyQXZkRGV2aWNlSWRzOiBwYXJhbXMuY2FuZGlkYXRlc1xuICAgICAgLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUucHJvYmVkQXZkTmFtZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZS5wcm9iZWRBdmROYW1lICE9PSBwYXJhbXMuYXZkTmFtZSlcbiAgICAgIC5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmRldmljZUlkKSxcbiAgICB1bmFuc3dlcmVkRGV2aWNlSWRzOiBwYXJhbXMuY2FuZGlkYXRlcy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnByb2JlZEF2ZE5hbWUgPT09IHVuZGVmaW5lZCkubWFwKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5kZXZpY2VJZClcbiAgfTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgdGhlIGRldmljZXMgdGhhdCB3ZXJlIG5vdCBvbmxpbmUgYmVmb3JlIHRoZSBsYXVuY2ggaW50byBlbXVsYXRvcnMgYW5kIGV2ZXJ5dGhpbmcgZWxzZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZXMgb25saW5lIG5vdyBhbmQgYmVmb3JlIHRoZSBsYXVuY2guXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRldmljZXMsIHNwbGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXROZXdEZXZpY2VzKHBhcmFtczogU3BsaXROZXdEZXZpY2VzUGFyYW1zKTogTmV3RGV2aWNlU3BsaXQge1xuICBjb25zdCBuZXdEZXZpY2VJZHMgPSBwYXJhbXMuY29ubmVjdGVkRGV2aWNlSWRzLmZpbHRlcigoZGV2aWNlSWQpID0+ICFwYXJhbXMuZGV2aWNlSWRzQmVmb3JlLmluY2x1ZGVzKGRldmljZUlkKSk7XG4gIHJldHVybiB7XG4gICAgZW11bGF0b3JEZXZpY2VJZHM6IG5ld0RldmljZUlkcy5maWx0ZXIoKGRldmljZUlkKSA9PiBjaGVja0lzRW11bGF0b3JEZXZpY2VJZChkZXZpY2VJZCkpLFxuICAgIG5vbkVtdWxhdG9yRGV2aWNlSWRzOiBuZXdEZXZpY2VJZHMuZmlsdGVyKChkZXZpY2VJZCkgPT4gIWNoZWNrSXNFbXVsYXRvckRldmljZUlkKGRldmljZUlkKSlcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTJCQSwrQkFBd0M7QUEyRmpDLFNBQVMsc0JBQXNCLFFBQWtFO0FBQ3RHLFFBQU0sUUFBUSxPQUFPLFdBQVcsS0FBSyxDQUFDLGNBQWMsVUFBVSxrQkFBa0IsT0FBTyxPQUFPO0FBQzlGLFNBQU87QUFBQSxJQUNMLFVBQVUsT0FBTztBQUFBLElBQ2pCLG1CQUFtQixPQUFPLFdBQ3ZCLE9BQU8sQ0FBQyxjQUFjLFVBQVUsa0JBQWtCLFVBQWEsVUFBVSxrQkFBa0IsT0FBTyxPQUFPLEVBQ3pHLElBQUksQ0FBQyxjQUFjLFVBQVUsUUFBUTtBQUFBLElBQ3hDLHFCQUFxQixPQUFPLFdBQVcsT0FBTyxDQUFDLGNBQWMsVUFBVSxrQkFBa0IsTUFBUyxFQUFFLElBQUksQ0FBQyxjQUFjLFVBQVUsUUFBUTtBQUFBLEVBQzNJO0FBQ0Y7QUFRTyxTQUFTLGdCQUFnQixRQUErQztBQUM3RSxRQUFNLGVBQWUsT0FBTyxtQkFBbUIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxPQUFPLGdCQUFnQixTQUFTLFFBQVEsQ0FBQztBQUM5RyxTQUFPO0FBQUEsSUFDTCxtQkFBbUIsYUFBYSxPQUFPLENBQUMsaUJBQWEsa0RBQXdCLFFBQVEsQ0FBQztBQUFBLElBQ3RGLHNCQUFzQixhQUFhLE9BQU8sQ0FBQyxhQUFhLEtBQUMsa0RBQXdCLFFBQVEsQ0FBQztBQUFBLEVBQzVGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Pure selection of the device an emulator this run just launched produced.
|
|
5
|
+
*
|
|
6
|
+
* The wait used to take the first online device that was not listed before the
|
|
7
|
+
* launch. The "before" snapshot lists online devices only, so a handset that was
|
|
8
|
+
* `unauthorized`, `offline` or unplugged at that moment — and came online during
|
|
9
|
+
* the boot, which a USB reconnect or accepting the debugging prompt is enough
|
|
10
|
+
* for — looked new, and was adopted as the emulator:
|
|
11
|
+
*
|
|
12
|
+
* ```text
|
|
13
|
+
* AVD "obsidian_test" not found on any existing device, starting a new emulator...
|
|
14
|
+
* Waiting for a new device to appear in ADB ...
|
|
15
|
+
* Device 3C15BN001Y900000 appeared in ADB, waiting for boot to complete...
|
|
16
|
+
* Emulator "obsidian_test" started, device 3C15BN001Y900000 is connected (owned emulator PIDs: [])
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* The suite then ran on the phone, and the emulator really launched was owned by
|
|
20
|
+
* nobody. So a new device is the launched emulator only when it is an emulator
|
|
21
|
+
* **and** it says it is serving the launched AVD — which also keeps a second
|
|
22
|
+
* emulator another project started concurrently from being adopted.
|
|
23
|
+
*
|
|
24
|
+
* Kept separate from the integration-only `transport-factory` so the decision is
|
|
25
|
+
* unit-testable; the factory does the `adb` round-trips.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* One new emulator device, with what it answered when asked for its AVD name.
|
|
29
|
+
*/
|
|
30
|
+
export interface LaunchedDeviceCandidate {
|
|
31
|
+
/**
|
|
32
|
+
* The device UDID, e.g. `emulator-5554`.
|
|
33
|
+
*/
|
|
34
|
+
readonly deviceId: string;
|
|
35
|
+
/**
|
|
36
|
+
* The AVD the device reported, or `undefined` when it did not answer.
|
|
37
|
+
*/
|
|
38
|
+
readonly probedAvdName: string | undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The new devices a poll found, split by whether they can be the launched emulator.
|
|
42
|
+
*/
|
|
43
|
+
export interface NewDeviceSplit {
|
|
44
|
+
/**
|
|
45
|
+
* New emulator devices, to be asked which AVD they serve.
|
|
46
|
+
*/
|
|
47
|
+
readonly emulatorDeviceIds: string[];
|
|
48
|
+
/**
|
|
49
|
+
* New devices that are not emulators (a handset, a TCP-attached device) and are never adopted.
|
|
50
|
+
*/
|
|
51
|
+
readonly nonEmulatorDeviceIds: string[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parameters for {@link resolveLaunchedDevice}.
|
|
55
|
+
*/
|
|
56
|
+
export interface ResolveLaunchedDeviceParams {
|
|
57
|
+
/**
|
|
58
|
+
* The AVD this run launched.
|
|
59
|
+
*/
|
|
60
|
+
readonly avdName: string;
|
|
61
|
+
/**
|
|
62
|
+
* The new emulator devices, with their probe answers.
|
|
63
|
+
*/
|
|
64
|
+
readonly candidates: readonly LaunchedDeviceCandidate[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* What the probe answers say about the launched emulator's device.
|
|
68
|
+
*/
|
|
69
|
+
export interface ResolveLaunchedDeviceResult {
|
|
70
|
+
/**
|
|
71
|
+
* The device serving the launched AVD, or `undefined` when none does yet.
|
|
72
|
+
*/
|
|
73
|
+
readonly deviceId: string | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Devices that answered with a different AVD: another emulator, never this run's.
|
|
76
|
+
*/
|
|
77
|
+
readonly otherAvdDeviceIds: string[];
|
|
78
|
+
/**
|
|
79
|
+
* Devices that did not answer yet, to be asked again on the next poll.
|
|
80
|
+
*/
|
|
81
|
+
readonly unansweredDeviceIds: string[];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Parameters for {@link splitNewDevices}.
|
|
85
|
+
*/
|
|
86
|
+
export interface SplitNewDevicesParams {
|
|
87
|
+
/**
|
|
88
|
+
* The devices online now.
|
|
89
|
+
*/
|
|
90
|
+
readonly connectedDeviceIds: readonly string[];
|
|
91
|
+
/**
|
|
92
|
+
* The devices online before the launch.
|
|
93
|
+
*/
|
|
94
|
+
readonly deviceIdsBefore: readonly string[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Picks the new emulator device that serves the launched AVD.
|
|
98
|
+
*
|
|
99
|
+
* Silence is not a match: a device that did not answer is asked again, never adopted
|
|
100
|
+
* on the strength of being new.
|
|
101
|
+
*
|
|
102
|
+
* @param params - The launched AVD and the probed candidates.
|
|
103
|
+
* @returns The matching device, plus the ones ruled out and the ones still unknown.
|
|
104
|
+
*/
|
|
105
|
+
export declare function resolveLaunchedDevice(params: ResolveLaunchedDeviceParams): ResolveLaunchedDeviceResult;
|
|
106
|
+
/**
|
|
107
|
+
* Splits the devices that were not online before the launch into emulators and everything else.
|
|
108
|
+
*
|
|
109
|
+
* @param params - The devices online now and before the launch.
|
|
110
|
+
* @returns The new devices, split.
|
|
111
|
+
*/
|
|
112
|
+
export declare function splitNewDevices(params: SplitNewDevicesParams): NewDeviceSplit;
|
package/dist/lib/cjs/library.cjs
CHANGED
|
@@ -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" : "
|
|
24
|
+
const LIBRARY_VERSION = false ? "dev" : "17.0.0";
|
|
25
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26
26
|
0 && (module.exports = {
|
|
27
27
|
LIBRARY_VERSION
|
|
@@ -0,0 +1,170 @@
|
|
|
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 paint_out_status_bar_exports = {};
|
|
20
|
+
__export(paint_out_status_bar_exports, {
|
|
21
|
+
DEFAULT_STATUS_BAR_EDGE_MARGIN_IN_PIXELS: () => DEFAULT_STATUS_BAR_EDGE_MARGIN_IN_PIXELS,
|
|
22
|
+
DEFAULT_STATUS_BAR_SAMPLE_INSET_IN_PIXELS: () => DEFAULT_STATUS_BAR_SAMPLE_INSET_IN_PIXELS,
|
|
23
|
+
buildStatusBarBandFailureMessage: () => buildStatusBarBandFailureMessage,
|
|
24
|
+
paintOutStatusBar: () => paintOutStatusBar,
|
|
25
|
+
resolveStatusBarBand: () => resolveStatusBarBand
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(paint_out_status_bar_exports);
|
|
28
|
+
var import_sharp_loader = require("./sharp-loader.cjs");
|
|
29
|
+
const DEFAULT_STATUS_BAR_EDGE_MARGIN_IN_PIXELS = 100;
|
|
30
|
+
const DEFAULT_STATUS_BAR_SAMPLE_INSET_IN_PIXELS = 4;
|
|
31
|
+
const BLUE_CHANNEL_OFFSET = 2;
|
|
32
|
+
const FILL_CHANNEL_COUNT = 3;
|
|
33
|
+
const GREEN_CHANNEL_OFFSET = 1;
|
|
34
|
+
const MINIMUM_SCANNED_COLUMN_COUNT = 2;
|
|
35
|
+
const RED_CHANNEL_OFFSET = 0;
|
|
36
|
+
function buildStatusBarBandFailureMessage(params) {
|
|
37
|
+
const {
|
|
38
|
+
edgeMarginInPixels,
|
|
39
|
+
heightInPixels,
|
|
40
|
+
verdict,
|
|
41
|
+
widthInPixels
|
|
42
|
+
} = params;
|
|
43
|
+
const lines = [
|
|
44
|
+
`paintOutStatusBar: the row under the status bar holds more than one color, so a band of ${String(heightInPixels)}px would paint over the app rather than over the device.`,
|
|
45
|
+
`band=${String(heightInPixels)}px sampleRow=y${String(verdict.sampleRowYInPixels)} scanned x${String(edgeMarginInPixels)}..${String(widthInPixels - edgeMarginInPixels)} of ${String(widthInPixels)}px distinctColors=${String(verdict.distinctColorCount)}`,
|
|
46
|
+
`sampled ${formatColor(verdict.backgroundColor)}, but x=${String(verdict.firstDifferentColumnXInPixels)} is ${formatColor(verdict.firstDifferentColor)}`,
|
|
47
|
+
"A taller status bar, or an Obsidian that draws higher, both look like this. Measure the band on a fresh frame and pass the height you measured: enlarging it until the check passes is how a capture paints over the product."
|
|
48
|
+
];
|
|
49
|
+
return lines.join("\n");
|
|
50
|
+
}
|
|
51
|
+
async function paintOutStatusBar(bytes, options) {
|
|
52
|
+
const { heightInPixels } = options;
|
|
53
|
+
const edgeMarginInPixels = options.edgeMarginInPixels ?? DEFAULT_STATUS_BAR_EDGE_MARGIN_IN_PIXELS;
|
|
54
|
+
const sharp = await (0, import_sharp_loader.importSharp)("paintOutStatusBar");
|
|
55
|
+
const { data, info } = await sharp(bytes).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
56
|
+
if (heightInPixels >= info.height) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
`paintOutStatusBar: a band of ${String(heightInPixels)}px would cover a frame that is only ${String(info.height)}px tall. That is a measurement of some other device, not of this frame.`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
const verdict = resolveStatusBarBand({
|
|
62
|
+
channelCount: info.channels,
|
|
63
|
+
edgeMarginInPixels,
|
|
64
|
+
heightInPixels,
|
|
65
|
+
pixels: data,
|
|
66
|
+
...options.sampleInsetInPixels !== void 0 && { sampleInsetInPixels: options.sampleInsetInPixels },
|
|
67
|
+
widthInPixels: info.width
|
|
68
|
+
});
|
|
69
|
+
if (!verdict.isClear) {
|
|
70
|
+
throw new Error(buildStatusBarBandFailureMessage({
|
|
71
|
+
edgeMarginInPixels,
|
|
72
|
+
heightInPixels,
|
|
73
|
+
verdict,
|
|
74
|
+
widthInPixels: info.width
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
const layer = {
|
|
78
|
+
input: {
|
|
79
|
+
create: {
|
|
80
|
+
background: verdict.backgroundColor,
|
|
81
|
+
channels: FILL_CHANNEL_COUNT,
|
|
82
|
+
height: heightInPixels,
|
|
83
|
+
width: info.width
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
left: 0,
|
|
87
|
+
top: 0
|
|
88
|
+
};
|
|
89
|
+
const painted = await sharp(bytes).composite([layer]).png().toBuffer();
|
|
90
|
+
return new Uint8Array(painted);
|
|
91
|
+
}
|
|
92
|
+
function resolveStatusBarBand(params) {
|
|
93
|
+
const {
|
|
94
|
+
channelCount,
|
|
95
|
+
heightInPixels,
|
|
96
|
+
pixels,
|
|
97
|
+
widthInPixels
|
|
98
|
+
} = params;
|
|
99
|
+
const edgeMarginInPixels = params.edgeMarginInPixels ?? DEFAULT_STATUS_BAR_EDGE_MARGIN_IN_PIXELS;
|
|
100
|
+
const sampleInsetInPixels = params.sampleInsetInPixels ?? DEFAULT_STATUS_BAR_SAMPLE_INSET_IN_PIXELS;
|
|
101
|
+
assertPositive("widthInPixels", widthInPixels);
|
|
102
|
+
assertPositive("heightInPixels", heightInPixels);
|
|
103
|
+
assertPositive("channelCount", channelCount);
|
|
104
|
+
const sampleRowYInPixels = heightInPixels - sampleInsetInPixels;
|
|
105
|
+
if (sampleRowYInPixels < 0) {
|
|
106
|
+
throw new Error(
|
|
107
|
+
`resolveStatusBarBand: a sample inset of ${String(sampleInsetInPixels)}px puts the sample row above the top of the frame for a band of ${String(heightInPixels)}px.`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
const lastScannedColumnXInPixels = widthInPixels - edgeMarginInPixels;
|
|
111
|
+
if (lastScannedColumnXInPixels - edgeMarginInPixels < MINIMUM_SCANNED_COLUMN_COUNT) {
|
|
112
|
+
throw new Error(
|
|
113
|
+
`resolveStatusBarBand: an edge margin of ${String(edgeMarginInPixels)}px leaves fewer than ${String(MINIMUM_SCANNED_COLUMN_COUNT)} columns of a ${String(widthInPixels)}px frame to scan, which is a check that cannot fail.`
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
const rowStartOffset = sampleRowYInPixels * widthInPixels * channelCount;
|
|
117
|
+
const requiredLength = rowStartOffset + widthInPixels * channelCount;
|
|
118
|
+
if (pixels.length < requiredLength) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`resolveStatusBarBand: the frame holds ${String(pixels.length)} bytes, too few for row y${String(sampleRowYInPixels)} of a ${String(widthInPixels)}px-wide frame at ${String(channelCount)} channels, which needs ${String(requiredLength)}.`
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
const backgroundColor = readColor(pixels, rowStartOffset + edgeMarginInPixels * channelCount);
|
|
124
|
+
const backgroundKey = formatColor(backgroundColor);
|
|
125
|
+
const colorKeys = /* @__PURE__ */ new Set();
|
|
126
|
+
let firstDifferentColor = null;
|
|
127
|
+
let firstDifferentColumnXInPixels = null;
|
|
128
|
+
for (let x = edgeMarginInPixels; x < lastScannedColumnXInPixels; x++) {
|
|
129
|
+
const color = readColor(pixels, rowStartOffset + x * channelCount);
|
|
130
|
+
const colorKey = formatColor(color);
|
|
131
|
+
colorKeys.add(colorKey);
|
|
132
|
+
if (firstDifferentColumnXInPixels !== null || colorKey === backgroundKey) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
firstDifferentColor = color;
|
|
136
|
+
firstDifferentColumnXInPixels = x;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
backgroundColor,
|
|
140
|
+
distinctColorCount: colorKeys.size,
|
|
141
|
+
firstDifferentColor,
|
|
142
|
+
firstDifferentColumnXInPixels,
|
|
143
|
+
isClear: colorKeys.size === 1,
|
|
144
|
+
sampleRowYInPixels
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function assertPositive(name, value) {
|
|
148
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
149
|
+
throw new Error(`resolveStatusBarBand: ${name} must be a positive number, got ${String(value)}.`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function formatColor(color) {
|
|
153
|
+
return color === null ? "(none)" : `rgb(${String(color.r)},${String(color.g)},${String(color.b)})`;
|
|
154
|
+
}
|
|
155
|
+
function readColor(pixels, offset) {
|
|
156
|
+
return {
|
|
157
|
+
b: pixels[offset + BLUE_CHANNEL_OFFSET] ?? 0,
|
|
158
|
+
g: pixels[offset + GREEN_CHANNEL_OFFSET] ?? 0,
|
|
159
|
+
r: pixels[offset + RED_CHANNEL_OFFSET] ?? 0
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
163
|
+
0 && (module.exports = {
|
|
164
|
+
DEFAULT_STATUS_BAR_EDGE_MARGIN_IN_PIXELS,
|
|
165
|
+
DEFAULT_STATUS_BAR_SAMPLE_INSET_IN_PIXELS,
|
|
166
|
+
buildStatusBarBandFailureMessage,
|
|
167
|
+
paintOutStatusBar,
|
|
168
|
+
resolveStatusBarBand
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3BhaW50LW91dC1zdGF0dXMtYmFyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUGFpbnRzIHRoZSBkZXZpY2UncyBzdGF0dXMgYmFyIG91dCBvZiBhIGNhcHR1cmVkIGZyYW1lLCBzbyBhIGRldmljZSBjYXB0dXJlXG4gKiBjYW4gYmUgY29tbWl0dGVkLlxuICpcbiAqIEEgZnJhbWVidWZmZXIgY2FycmllcyB0aGUgc3RhdHVzIGJhciwgYW5kIGEgc3RhdHVzIGJhciBjYXJyaWVzIGEgd2FsbCBjbG9jaywgYVxuICogYmF0dGVyeSB0aGF0IGNoYXJnZXMgd2hpbGUgdGhlIGVtdWxhdG9yIHJ1bnMgYW5kIGEgcmFkaW8gdGhhdCBjb21lcyBhbmQgZ29lcy5cbiAqIFNvIHJlLXJ1bm5pbmcgYSBjYXB0dXJlIHN1aXRlIG9uIGFuIHVuY2hhbmdlZCB0cmVlIHJld3JpdGVzIGl0cyBQTkdzIHdpdGhcbiAqIGNvbnRlbnQgbm9ib2R5IGNhbiBjb21taXQsIGFuZCB0aGUgY2h1cm4gaXMgaW52aXNpYmxlIHVudGlsIHNvbWVvbmUgZGlmZnMgdHdvXG4gKiBydW5zLiBgZGV2aWNlLXNjcmVlbnNob3RgJ3MgaGVhZGVyIGhhcyBhbHdheXMgc2FpZCBhIGRldmljZSBjYXB0dXJlIGlzIG5vdFxuICogYnl0ZS1yZXByb2R1Y2libGU7IHRoaXMgaXMgd2hhdCBtYWtlcyBvbmUuXG4gKlxuICogKipQaW5uaW5nIHRoZSBiYXIgd2FzIHRyaWVkIGZpcnN0LCBhbmQgaXMgTk9UIHN1ZmZpY2llbnQgXHUyMDE0IHRoYXQgZmluZGluZyBpcyB0aGVcbiAqIHJlYXNvbiB0aGlzIGhlbHBlciBleGlzdHMgcmF0aGVyIHRoYW4gYSBgd2l0aFN5c3RlbVVpRGVtb01vZGVgIG9uZS4qKiBTeXN0ZW1VSVxuICogZGVtbyBtb2RlIChgc3lzdWlfZGVtb19hbGxvd2VkYCwgcGx1cyBvbmUgYGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRlbW9gXG4gKiBicm9hZGNhc3QgcGVyIGFyZWE6IGNsb2NrIGF0IGEgZml4ZWQgYGhobW1gLCBiYXR0ZXJ5IGZ1bGwgYW5kIHVucGx1Z2dlZCxcbiAqIHJhZGlvcyBoaWRkZW4sIG5vdGlmaWNhdGlvbiBpY29ucyBvZmYpIGhlbGQgdGhlIGNsb2NrIGF0IGAxMjowMGAgYW5kIHR3byBydW5zXG4gKiBzdGlsbCBkaXNhZ3JlZWQgb24gKioxODIzIGZ1bGwtY29udHJhc3QgcGl4ZWxzKiosIGJlY2F1c2UgdGhlIGJhcidzIGxlYWRpbmdcbiAqIGdyb3VwIGlzIGxhaWQgb3V0IGF0IGEgZGlmZmVyZW50IG9mZnNldCBiZXR3ZWVuIGVtdWxhdG9yIGJvb3RzIFx1MjAxNFxuICogaW50ZXJtaXR0ZW50bHksIHJvdWdobHkgb25lIGJvb3QgaW4gZm91ci4gVGhlIFR1bmVyJ3MgYGljb25fYmxhY2tsaXN0YCBkb2VzXG4gKiBub3QgaGVscCBlaXRoZXI6IGRlbW8gbW9kZSBkcmF3cyBpdHMgb3duIGljb24gbGF5ZXIgYW5kIGlnbm9yZXMgaXQuIE1lYXN1cmVkXG4gKiBvbiBhIHJlYWwgQVZEIGFjcm9zcyBmaXZlIHBhaXJlZCBjYXB0dXJlIHJ1bnMgZm9yIGBvYnNpZGlhbi1saW5rLXBpY2tlcmAnc1xuICogc3RvcmUgZnJhbWVzLCB3aGljaCBpcyB3aGVyZSB0aGlzIHJlY2lwZSB3YXMgd29ya2VkIG91dCBiZWZvcmUgaXQgbW92ZWQgaGVyZS5cbiAqXG4gKiBSZW1vdmluZyB0aGUgYmFuZCByYXRoZXIgdGhhbiBwaW5uaW5nIGl0IGFsc28gcmV0aXJlcyBldmVyeSBkZXZpY2Ugc2V0dGluZ1xuICogdGhhdCBwaW5uaW5nIG5lZWRlZCwgYW5kIG5vdGhpbmcgaW4gYSBzdGF0dXMgYmFyIGlzIGV2aWRlbmNlIGFib3V0IGEgcGx1Z2luLiBBXG4gKiBsaXN0aW5nIGZyYW1lIHdpdGhvdXQgb25lIGlzIHdoYXQgYSBsaXN0aW5nIGZyYW1lIG5vcm1hbGx5IGxvb2tzIGxpa2UuXG4gKlxuICogKipUaGUgYmFuZCdzIGhlaWdodCBpcyB0aGUgY2FsbGVyJ3MgdG8gbWVhc3VyZSwgYW5kIHRoZXJlIGlzIGRlbGliZXJhdGVseSBub1xuICogZGVmYXVsdC4qKiBBIHdyb25nIGhlaWdodCBkb2VzIG5vdCBmYWlsIGxvdWRseSBieSBpdHNlbGYgXHUyMDE0IGl0IHBhaW50cyBvdmVyIHRoZVxuICogcHJvZHVjdC4gV2hhdCBzdGFuZHMgYmV0d2VlbiB0aGUgdHdvIGlzIHtAbGluayByZXNvbHZlU3RhdHVzQmFyQmFuZH06IHRoZSByb3dcbiAqIGp1c3QgdW5kZXIgdGhlIGJhcidzIG93biBjb250ZW50IG11c3QgYmUgb25lIGZsYXQgY29sb3IgYWxsIHRoZSB3YXkgYWNyb3NzLFxuICogd2hpY2ggaXMgd2hhdCBhbiBlbXB0eSBiYW5kIGxvb2tzIGxpa2UgYW5kIGlzIGFsc28gd2hlcmUgdGhlIGZpbGwgY29sb3IgaXNcbiAqIHNhbXBsZWQgZnJvbS4gQSB0YWxsZXIgYmFyLCBvciBhbiBPYnNpZGlhbiB0aGF0IGRyYXdzIGhpZ2hlciwgZmFpbHMgdGhlXG4gKiBjYXB0dXJlIGluc3RlYWQuXG4gKlxuICogQ29tcG9zaXRpbmcgb3ZlciBhIGNhcHR1cmVkIGZyYW1lIGlzIG5vdCBhIG5ldyBsaWJlcnR5OiBgbGFiZWxTY3JlZW5zaG90YFxuICogYWxyZWFkeSBkcmF3cyB0aGUgY2FwdGlvbiBiYW5kIGFjcm9zcyB0aGUgYm90dG9tIG9mIHRoZSBzYW1lIGltYWdlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU2hhcnBDb21wb3NpdGVMYXllciB9IGZyb20gJy4vc2hhcnAtbG9hZGVyLmNqcyc7XG5cbmltcG9ydCB7IGltcG9ydFNoYXJwIH0gZnJvbSAnLi9zaGFycC1sb2FkZXIuY2pzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRTdGF0dXNCYXJCYW5kRmFpbHVyZU1lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU3RhdHVzQmFyQmFuZEZhaWx1cmVNZXNzYWdlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEhvdyBmYXIgaW4gZnJvbSBlYWNoIGVkZ2UgdGhlIHJvdyB3YXMgc2Nhbm5lZCwgaW4gcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRnZU1hcmdpbkluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIGJhbmQgdGhhdCB3YXMgYWJvdXQgdG8gYmUgcGFpbnRlZCwgaW4gcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgaGVpZ2h0SW5QaXhlbHM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgYmVpbmcgcmVwb3J0ZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiBTdGF0dXNCYXJCYW5kVmVyZGljdDtcblxuICAvKipcbiAgICogVGhlIGZyYW1lJ3Mgd2lkdGgsIGluIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoSW5QaXhlbHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcGFpbnRPdXRTdGF0dXNCYXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhaW50T3V0U3RhdHVzQmFyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgZmFyIGluIGZyb20gZWFjaCBlZGdlIHRoZSBjbGVhci1vZi1jaHJvbWUgY2hlY2sgcmVhZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1NUQVRVU19CQVJfRURHRV9NQVJHSU5fSU5fUElYRUxTfVxuICAgKi9cbiAgcmVhZG9ubHkgZWRnZU1hcmdpbkluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGFsbCB0aGUgZGV2aWNlJ3Mgc3RhdHVzIGJhciBpcywgaW4gZnJhbWVidWZmZXIgcGl4ZWxzLlxuICAgKlxuICAgKiAqKk1lYXN1cmVkLCBuZXZlciBhc3N1bWVkLCBhbmQgZGVsaWJlcmF0ZWx5IHdpdGhvdXQgYSBkZWZhdWx0LioqIDI0ZHAgYXQgYVxuICAgKiBkZW5zaXR5IG9mIDMyMCBpcyA0OHB4LCBhbmQgdGhhdCBpcyBvbmUgQVZEJ3MgbnVtYmVyIHJhdGhlciB0aGFuIGEgY29uc3RhbnRcbiAgICogb2YgQW5kcm9pZC4gTWVhc3VyZSBpdCBvbiBhIGZyYW1lOiB0aGUgYmFyJ3Mgb3duIGNvbnRlbnQgb2NjdXBpZXMgdGhlIHRvcFxuICAgKiByb3dzLCBhIGZldyBlbXB0eSByb3dzIGZvbGxvdywgYW5kIHRoZSBhcHAncyB0b3AgY2hyb21lIHN0YXJ0cyBhdCBleGFjdGx5XG4gICAqIHRoaXMgb2Zmc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgaGVpZ2h0SW5QaXhlbHM6IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IGZhciBhYm92ZSB0aGUgYmFuZCdzIGJvdHRvbSBlZGdlIHRoZSBmaWxsIGNvbG9yIGlzIHNhbXBsZWQsIGluIHBpeGVscy5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERFRkFVTFRfU1RBVFVTX0JBUl9TQU1QTEVfSU5TRVRfSU5fUElYRUxTfVxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlSW5zZXRJblBpeGVscz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVzb2x2ZVN0YXR1c0JhckJhbmR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVTdGF0dXNCYXJCYW5kUGFyYW1zIHtcbiAgLyoqXG4gICAqIEhvdyBtYW55IGJ5dGVzIGVhY2ggcGl4ZWwgb2NjdXBpZXMgaW4ge0BsaW5rIFJlc29sdmVTdGF0dXNCYXJCYW5kUGFyYW1zLnBpeGVsc30gXHUyMDE0IDMgZm9yIFJHQiwgNCBmb3IgUkdCQS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgZmFyIGluIGZyb20gZWFjaCBlZGdlIHRvIHN0YXJ0IHJlYWRpbmcsIGluIHBpeGVscy5cbiAgICpcbiAgICogQSBkZXZpY2UncyByb3VuZGVkIGNvcm5lcnMgZGFya2VuIGEgaGFuZGZ1bCBvZiBwaXhlbHMgYXQgYm90aCBlbmRzIG9mIGV2ZXJ5XG4gICAqIHJvdyBpbiB0aGUgYmFuZCwgY29uc3RhbnRseSBhbmQgaGFybWxlc3NseTsgdGhlIGNoZWNrIGlzIGFib3V0IHdoYXQgdGhlIEFQUFxuICAgKiBkcmF3cywgc28gaXQgaWdub3JlcyB0aGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9TVEFUVVNfQkFSX0VER0VfTUFSR0lOX0lOX1BJWEVMU31cbiAgICovXG4gIHJlYWRvbmx5IGVkZ2VNYXJnaW5JblBpeGVscz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgYmFuZCwgaW4gcGl4ZWxzIFx1MjAxNCB0aGUgc2FtZSBudW1iZXIge0BsaW5rIHBhaW50T3V0U3RhdHVzQmFyfSB3b3VsZCBwYWludC5cbiAgICovXG4gIHJlYWRvbmx5IGhlaWdodEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFtZSdzIHJhdyBwaXhlbHMsIHJvdy1tYWpvciwgYXMgYHNoYXJwYCdzIGByYXcoKWAgcmVwb3J0cyB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgcGl4ZWxzOiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBIb3cgZmFyIGFib3ZlIHRoZSBiYW5kJ3MgYm90dG9tIGVkZ2UgdGhlIHJvdyBpcyByZWFkIGZyb20sIGluIHBpeGVscy5cbiAgICpcbiAgICogVGhlIGJhcidzIG93biBjb250ZW50IHN0b3BzIHNob3J0IG9mIHRoZSBiYW5kJ3MgYm90dG9tIGVkZ2UsIHNvIHRoZSByb3dzXG4gICAqIGltbWVkaWF0ZWx5IHVuZGVyIGl0IGFyZSBlbXB0eTsgdGhpcyBwaWNrcyBvbmUgb2YgdGhlbS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERFRkFVTFRfU1RBVFVTX0JBUl9TQU1QTEVfSU5TRVRfSU5fUElYRUxTfVxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlSW5zZXRJblBpeGVscz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZyYW1lJ3Mgd2lkdGgsIGluIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoSW5QaXhlbHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIGNvbG9yIHJlYWQgb3V0IG9mIGEgZnJhbWUsIGNoYW5uZWwgYnkgY2hhbm5lbC5cbiAqXG4gKiBUaGlzIHBhY2thZ2UncyBvd24gdHlwZSByYXRoZXIgdGhhbiBgc2hhcnBgJ3MsIGJlY2F1c2UgaXQgaXMgcGFydCBvZiB0aGVcbiAqIHB1YmxpYyBzdXJmYWNlIGFuZCBgc2hhcnBgIGlzIGFuIE9QVElPTkFMIHBlZXI6IGEgY29uc3VtZXIgdGhhdCBuZXZlciBpbnN0YWxsc1xuICogaXQgc3RpbGwgbmFtZXMgdGhpcy4gU3RydWN0dXJhbGx5IHdoYXQgYHNoYXJwYCdzIGBiYWNrZ3JvdW5kYCB0YWtlcywgd2hpY2ggaXNcbiAqIGhvdyB0aGUgZmlsbCBibG9jayBpcyBjcmVhdGVkIGZyb20gb25lIHdpdGggbm8gY29udmVyc2lvbiBpbiBiZXR3ZWVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c0JhckJhbmRDb2xvciB7XG4gIC8qKlxuICAgKiBUaGUgYmx1ZSBjaGFubmVsLCAwLTI1NS5cbiAgICovXG4gIHJlYWRvbmx5IGI6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGdyZWVuIGNoYW5uZWwsIDAtMjU1LlxuICAgKi9cbiAgcmVhZG9ubHkgZzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVkIGNoYW5uZWwsIDAtMjU1LlxuICAgKi9cbiAgcmVhZG9ubHkgcjogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJvdyB1bmRlciB0aGUgc3RhdHVzIGJhcidzIGNvbnRlbnQgdHVybmVkIG91dCB0byBob2xkLlxuICpcbiAqIFZlcmRpY3QtYXMtZGF0YSwgbGlrZSB0aGUgY29tcGF0aWJpbGl0eSBhbmQgdGVhcmRvd24gY2hlY2tzOiB0aGUgcmVhZGluZyBhbmRcbiAqIHRoZSB0aHJvd2luZyBhcmUgc2VwYXJhdGUsIHNvIGEgY2FsbGVyIGNhbiBhc2sgd2hhdCBhIGZyYW1lIGxvb2tzIGxpa2Ugd2l0aG91dFxuICogaGF2aW5nIHRvIGNhdGNoIGFuIGVycm9yIHRvIGZpbmQgb3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c0JhckJhbmRWZXJkaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBjb2xvciB0aGUgYmFuZCB3b3VsZCBiZSBmaWxsZWQgd2l0aCBcdTIwMTQgcmVhZCBmcm9tIHRoZSBmaXJzdCBzY2FubmVkIGNvbHVtbiBvZiB0aGUgc2FtcGxlIHJvdy5cbiAgICovXG4gIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvcjogU3RhdHVzQmFyQmFuZENvbG9yO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSBkaXN0aW5jdCBjb2xvcnMgdGhlIHNjYW5uZWQgcm93IGhvbGRzLiBPbmUgaXMgd2hhdCBhbiBlbXB0eSBiYW5kIGxvb2tzIGxpa2UuXG4gICAqL1xuICByZWFkb25seSBkaXN0aW5jdENvbG9yQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGNvbG9yIGF0IHtAbGluayBTdGF0dXNCYXJCYW5kVmVyZGljdC5maXJzdERpZmZlcmVudENvbHVtblhJblBpeGVsc30sIG9yIGBudWxsYCB3aGVuIHRoZSByb3cgaXMgZmxhdC5cbiAgICovXG4gIHJlYWRvbmx5IGZpcnN0RGlmZmVyZW50Q29sb3I6IG51bGwgfCBTdGF0dXNCYXJCYW5kQ29sb3I7XG5cbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBzY2FubmVkIGNvbHVtbiB0aGF0IGRpZmZlcnMgZnJvbSB7QGxpbmsgU3RhdHVzQmFyQmFuZFZlcmRpY3QuYmFja2dyb3VuZENvbG9yfSwgb3IgYG51bGxgIHdoZW4gdGhlIHJvdyBpcyBmbGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3REaWZmZXJlbnRDb2x1bW5YSW5QaXhlbHM6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJvdyBpcyBvbmUgZmxhdCBjb2xvciwgYW5kIHNvIHdoZXRoZXIgdGhlIGJhbmQgaG9sZHMgbm90aGluZyBidXQgZGV2aWNlIGNocm9tZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2xlYXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoaWNoIHJvdyB3YXMgcmVhZCwgYXMgYSBkaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIGZyYW1lIGluIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IHNhbXBsZVJvd1lJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhvdyBmYXIgaW4gZnJvbSBlYWNoIGVkZ2UgdGhlIGNsZWFyLW9mLWNocm9tZSBjaGVjayByZWFkcywgaW4gcGl4ZWxzLlxuICpcbiAqIEV4cG9ydGVkIGJlY2F1c2UgYSBjYWxsZXIgdGlnaHRlbmluZyBvciBsb29zZW5pbmcgaXQgd2FudHMgdG8gc2F5IHNvIHJlbGF0aXZlXG4gKiB0byB0aGlzIHJhdGhlciB0aGFuIGluIHRoZSBhYnN0cmFjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RBVFVTX0JBUl9FREdFX01BUkdJTl9JTl9QSVhFTFMgPSAxMDA7XG5cbi8qKlxuICogSG93IGZhciBhYm92ZSB0aGUgYmFuZCdzIGJvdHRvbSBlZGdlIHRoZSBzYW1wbGUgcm93IHNpdHMsIGluIHBpeGVscy5cbiAqXG4gKiBGb3VyIHJvd3MgdXA6IGZhciBlbm91Z2ggdG8gY2xlYXIgdGhlIGJhcidzIG93biBjb250ZW50LCBjbG9zZSBlbm91Z2ggdG8gc3RpbGxcbiAqIGJlIGluc2lkZSB0aGUgYmFuZCBvbiBldmVyeSBkZXZpY2UgdGhpcyBoYXMgYmVlbiBtZWFzdXJlZCBvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RBVFVTX0JBUl9TQU1QTEVfSU5TRVRfSU5fUElYRUxTID0gNDtcblxuLyoqXG4gKiBCeXRlIG9mZnNldCBvZiB0aGUgYmx1ZSBjaGFubmVsIHdpdGhpbiBvbmUgcGl4ZWwgb2YgYSByYXcgZnJhbWUuXG4gKi9cbmNvbnN0IEJMVUVfQ0hBTk5FTF9PRkZTRVQgPSAyO1xuXG4vKipcbiAqIEhvdyBtYW55IGNoYW5uZWxzIHRoZSBmaWxsIGJsb2NrIGlzIGNyZWF0ZWQgd2l0aCBcdTIwMTQgUkdCLCB3aXRoIG5vIGFscGhhLCBiZWNhdXNlIGl0IGlzIG9wYXF1ZSBieSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmNvbnN0IEZJTExfQ0hBTk5FTF9DT1VOVCA9IDM7XG5cbi8qKlxuICogQnl0ZSBvZmZzZXQgb2YgdGhlIGdyZWVuIGNoYW5uZWwgd2l0aGluIG9uZSBwaXhlbCBvZiBhIHJhdyBmcmFtZS5cbiAqL1xuY29uc3QgR1JFRU5fQ0hBTk5FTF9PRkZTRVQgPSAxO1xuXG4vKipcbiAqIFRoZSBmZXdlc3QgY29sdW1ucyBhIG1lYW5pbmdmdWwgc2NhbiBjYW4gY292ZXIuXG4gKlxuICogT25lIGNvbHVtbiBpcyB0cml2aWFsbHkgZmxhdCwgc28gYSBtYXJnaW4gdGhhdCBsZWF2ZXMgZmV3ZXIgdGhhbiB0d28gaXMgYVxuICogY2hlY2sgdGhhdCBjYW5ub3QgZmFpbCBcdTIwMTQgdGhlIGV4YWN0IHNoYXBlIHRoaXMgaGVscGVyIGV4aXN0cyB0byBhdm9pZC5cbiAqL1xuY29uc3QgTUlOSU1VTV9TQ0FOTkVEX0NPTFVNTl9DT1VOVCA9IDI7XG5cbi8qKlxuICogQnl0ZSBvZmZzZXQgb2YgdGhlIHJlZCBjaGFubmVsIHdpdGhpbiBvbmUgcGl4ZWwgb2YgYSByYXcgZnJhbWUuXG4gKi9cbmNvbnN0IFJFRF9DSEFOTkVMX09GRlNFVCA9IDA7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBtZXNzYWdlIGEgYmFuZCB0aGF0IGlzIG5vdCBjbGVhciBpcyByZWZ1c2VkIHdpdGguXG4gKlxuICogU2VwYXJhdGUgZnJvbSB0aGUgdGhyb3dpbmcgc28gaXQgY2FuIGJlIGFzc2VydGVkIG9uIGRpcmVjdGx5OiB3aGF0IG1ha2VzIHRoaXNcbiAqIGZhaWx1cmUgYWN0aW9uYWJsZSBpcyB0aGUgbWVhc3VyZW1lbnQsIG5vdCB0aGUgd29yZGluZyBhcm91bmQgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB2ZXJkaWN0IGFuZCB0aGUgZ2VvbWV0cnkgaXQgd2FzIHJlYWQgd2l0aC5cbiAqIEByZXR1cm5zIFRoZSBtZXNzYWdlLCByZWFkeSB0byB0aHJvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RhdHVzQmFyQmFuZEZhaWx1cmVNZXNzYWdlKHBhcmFtczogQnVpbGRTdGF0dXNCYXJCYW5kRmFpbHVyZU1lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgZWRnZU1hcmdpbkluUGl4ZWxzLFxuICAgIGhlaWdodEluUGl4ZWxzLFxuICAgIHZlcmRpY3QsXG4gICAgd2lkdGhJblBpeGVsc1xuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGxpbmVzID0gW1xuICAgICdwYWludE91dFN0YXR1c0JhcjogdGhlIHJvdyB1bmRlciB0aGUgc3RhdHVzIGJhciBob2xkcyBtb3JlIHRoYW4gb25lIGNvbG9yLCBzbyBhIGJhbmQgb2YgJ1xuICAgICsgYCR7U3RyaW5nKGhlaWdodEluUGl4ZWxzKX1weCB3b3VsZCBwYWludCBvdmVyIHRoZSBhcHAgcmF0aGVyIHRoYW4gb3ZlciB0aGUgZGV2aWNlLmAsXG4gICAgYGJhbmQ9JHtTdHJpbmcoaGVpZ2h0SW5QaXhlbHMpfXB4IHNhbXBsZVJvdz15JHtTdHJpbmcodmVyZGljdC5zYW1wbGVSb3dZSW5QaXhlbHMpfSBgXG4gICAgKyBgc2Nhbm5lZCB4JHtTdHJpbmcoZWRnZU1hcmdpbkluUGl4ZWxzKX0uLiR7U3RyaW5nKHdpZHRoSW5QaXhlbHMgLSBlZGdlTWFyZ2luSW5QaXhlbHMpfSBgXG4gICAgKyBgb2YgJHtTdHJpbmcod2lkdGhJblBpeGVscyl9cHggZGlzdGluY3RDb2xvcnM9JHtTdHJpbmcodmVyZGljdC5kaXN0aW5jdENvbG9yQ291bnQpfWAsXG4gICAgYHNhbXBsZWQgJHtmb3JtYXRDb2xvcih2ZXJkaWN0LmJhY2tncm91bmRDb2xvcil9LCBidXQgeD0ke1N0cmluZyh2ZXJkaWN0LmZpcnN0RGlmZmVyZW50Q29sdW1uWEluUGl4ZWxzKX0gYFxuICAgICsgYGlzICR7Zm9ybWF0Q29sb3IodmVyZGljdC5maXJzdERpZmZlcmVudENvbG9yKX1gLFxuICAgICdBIHRhbGxlciBzdGF0dXMgYmFyLCBvciBhbiBPYnNpZGlhbiB0aGF0IGRyYXdzIGhpZ2hlciwgYm90aCBsb29rIGxpa2UgdGhpcy4gTWVhc3VyZSB0aGUgYmFuZCBvbiBhIGZyZXNoICdcbiAgICArICdmcmFtZSBhbmQgcGFzcyB0aGUgaGVpZ2h0IHlvdSBtZWFzdXJlZDogZW5sYXJnaW5nIGl0IHVudGlsIHRoZSBjaGVjayBwYXNzZXMgaXMgaG93IGEgY2FwdHVyZSBwYWludHMgJ1xuICAgICsgJ292ZXIgdGhlIHByb2R1Y3QuJ1xuICBdO1xuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBGaWxscyB0aGUgc3RhdHVzLWJhciBiYW5kIHdpdGggdGhlIGJhY2tncm91bmQgYmVoaW5kIGl0LCBzbyB0aGUgZnJhbWUgY2FycmllcyBubyBkZXZpY2UgY2hyb21lLlxuICpcbiAqIFRoZSBpbWFnZSBrZWVwcyBpdHMgZGltZW5zaW9ucyBleGFjdGx5OiB0aGUgYmFuZCBpcyBjb21wb3NpdGVkIE9WRVIgdGhlIGZyYW1lLFxuICogbmV2ZXIgY3JvcHBlZCBvZmYgaXQsIGJlY2F1c2UgYSBzdG9yZSBsaXN0aW5nIGV4cGVjdHMgYSBzcGVjaWZpYyBzaXplIGFuZCBhXG4gKiBjcm9wcGVkIGZyYW1lIGlzIGEgZGlmZmVyZW50IHBpY3R1cmUuXG4gKlxuICogQHBhcmFtIGJ5dGVzIC0gVGhlIGRldmljZSBmcmFtZWJ1ZmZlciwgYXMgYGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90YCByZXR1cm5lZCBpdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gSG93IHRhbGwgdGhlIGJhbmQgaXMsIGFuZCBob3cgdGhlIGNoZWNrIHJlYWRzIGl0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2FtZSBmcmFtZSB3aXRoIHRoZSBiYW5kIHBhaW50ZWQgb3V0LCBhcyBQTkcgYnl0ZXMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGBzaGFycGAgaXMgbm90IGluc3RhbGxlZCwgdGhlIGJhbmQgaXMgYXMgdGFsbCBhcyB0aGUgZnJhbWUgb3IgdGFsbGVyLCBvciB0aGUgcm93IHVuZGVyXG4gKiAgIHRoZSBiYXIncyBjb250ZW50IGlzIG5vdCBvbmUgZmxhdCBjb2xvciBcdTIwMTQgc2VlIHtAbGluayBidWlsZFN0YXR1c0JhckJhbmRGYWlsdXJlTWVzc2FnZX0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYWludE91dFN0YXR1c0JhcihieXRlczogVWludDhBcnJheSwgb3B0aW9uczogUGFpbnRPdXRTdGF0dXNCYXJPcHRpb25zKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IHsgaGVpZ2h0SW5QaXhlbHMgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGVkZ2VNYXJnaW5JblBpeGVscyA9IG9wdGlvbnMuZWRnZU1hcmdpbkluUGl4ZWxzID8/IERFRkFVTFRfU1RBVFVTX0JBUl9FREdFX01BUkdJTl9JTl9QSVhFTFM7XG4gIGNvbnN0IHNoYXJwID0gYXdhaXQgaW1wb3J0U2hhcnAoJ3BhaW50T3V0U3RhdHVzQmFyJyk7XG4gIGNvbnN0IHsgZGF0YSwgaW5mbyB9ID0gYXdhaXQgc2hhcnAoYnl0ZXMpXG4gICAgLmVuc3VyZUFscGhhKClcbiAgICAucmF3KClcbiAgICAudG9CdWZmZXIoeyByZXNvbHZlV2l0aE9iamVjdDogdHJ1ZSB9KTtcblxuICBpZiAoaGVpZ2h0SW5QaXhlbHMgPj0gaW5mby5oZWlnaHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcGFpbnRPdXRTdGF0dXNCYXI6IGEgYmFuZCBvZiAke1N0cmluZyhoZWlnaHRJblBpeGVscyl9cHggd291bGQgY292ZXIgYSBmcmFtZSB0aGF0IGlzIG9ubHkgYFxuICAgICAgICArIGAke1N0cmluZyhpbmZvLmhlaWdodCl9cHggdGFsbC4gVGhhdCBpcyBhIG1lYXN1cmVtZW50IG9mIHNvbWUgb3RoZXIgZGV2aWNlLCBub3Qgb2YgdGhpcyBmcmFtZS5gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHZlcmRpY3QgPSByZXNvbHZlU3RhdHVzQmFyQmFuZCh7XG4gICAgY2hhbm5lbENvdW50OiBpbmZvLmNoYW5uZWxzLFxuICAgIGVkZ2VNYXJnaW5JblBpeGVscyxcbiAgICBoZWlnaHRJblBpeGVscyxcbiAgICBwaXhlbHM6IGRhdGEsXG4gICAgLi4uKG9wdGlvbnMuc2FtcGxlSW5zZXRJblBpeGVscyAhPT0gdW5kZWZpbmVkICYmIHsgc2FtcGxlSW5zZXRJblBpeGVsczogb3B0aW9ucy5zYW1wbGVJbnNldEluUGl4ZWxzIH0pLFxuICAgIHdpZHRoSW5QaXhlbHM6IGluZm8ud2lkdGhcbiAgfSk7XG5cbiAgaWYgKCF2ZXJkaWN0LmlzQ2xlYXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYnVpbGRTdGF0dXNCYXJCYW5kRmFpbHVyZU1lc3NhZ2Uoe1xuICAgICAgZWRnZU1hcmdpbkluUGl4ZWxzLFxuICAgICAgaGVpZ2h0SW5QaXhlbHMsXG4gICAgICB2ZXJkaWN0LFxuICAgICAgd2lkdGhJblBpeGVsczogaW5mby53aWR0aFxuICAgIH0pKTtcbiAgfVxuXG4gIGNvbnN0IGxheWVyOiBTaGFycENvbXBvc2l0ZUxheWVyID0ge1xuICAgIGlucHV0OiB7XG4gICAgICBjcmVhdGU6IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmVyZGljdC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGNoYW5uZWxzOiBGSUxMX0NIQU5ORUxfQ09VTlQsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0SW5QaXhlbHMsXG4gICAgICAgIHdpZHRoOiBpbmZvLndpZHRoXG4gICAgICB9XG4gICAgfSxcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogMFxuICB9O1xuXG4gIGNvbnN0IHBhaW50ZWQgPSBhd2FpdCBzaGFycChieXRlcylcbiAgICAuY29tcG9zaXRlKFtsYXllcl0pXG4gICAgLnBuZygpXG4gICAgLnRvQnVmZmVyKCk7XG5cbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHBhaW50ZWQpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSByb3cgdW5kZXIgdGhlIHN0YXR1cyBiYXIncyBjb250ZW50IGFuZCBzYXlzIHdoZXRoZXIgdGhlIGJhbmQgaXMgY2xlYXIgb2YgdGhlIGFwcC5cbiAqXG4gKiBUaGUgYmFuZCdzIGhlaWdodCBpcyBhIG51bWJlciBhIGNhbGxlciBtZWFzdXJlZCBvbmNlLCBhbmQgYSBtZWFzdXJlZCBudW1iZXJcbiAqIGNhbiBnbyBzdGFsZSBcdTIwMTQgYSB0YWxsZXIgc3RhdHVzIGJhciwgb3IgYW4gT2JzaWRpYW4gdGhhdCBkcmF3cyBoaWdoZXIsIHdvdWxkXG4gKiBoYXZlIHRoZSBjYXB0dXJlIHF1aWV0bHkgcGFpbnQgb3ZlciB0aGUgcHJvZHVjdC4gU28gdGhlIHJvdyBqdXN0IGJlbG93IHRoZVxuICogYmFyJ3Mgb3duIGNvbnRlbnQgaXMgcmVxdWlyZWQgdG8gYmUgb25lIGZsYXQgY29sb3IgYWxsIHRoZSB3YXkgYWNyb3NzOiB0aGF0XG4gKiBpcyB3aGF0IGFuIGVtcHR5IGJhbmQgbG9va3MgbGlrZSwgYW5kIGl0IGlzIHdoYXQgdGhlIGZpbGwgY29sb3IgaXMgcmVhZCBmcm9tLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZnJhbWUncyByYXcgcGl4ZWxzIGFuZCB0aGUgYmFuZCdzIGdlb21ldHJ5LlxuICogQHJldHVybnMgV2hhdCB0aGUgc2Nhbm5lZCByb3cgaG9sZHMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBnZW9tZXRyeSBpcyBkZWdlbmVyYXRlIFx1MjAxNCBhIG5vbi1wb3NpdGl2ZSBkaW1lbnNpb24sIGEgc2FtcGxlIHJvdyBhYm92ZSB0aGUgdG9wIG9mXG4gKiAgIHRoZSBmcmFtZSwgYSBtYXJnaW4gdGhhdCBsZWF2ZXMgbm90aGluZyB0byBzY2FuLCBvciBhIGJ1ZmZlciB0b28gc2hvcnQgdG8gaG9sZCB0aGUgcm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVN0YXR1c0JhckJhbmQocGFyYW1zOiBSZXNvbHZlU3RhdHVzQmFyQmFuZFBhcmFtcyk6IFN0YXR1c0JhckJhbmRWZXJkaWN0IHtcbiAgY29uc3Qge1xuICAgIGNoYW5uZWxDb3VudCxcbiAgICBoZWlnaHRJblBpeGVscyxcbiAgICBwaXhlbHMsXG4gICAgd2lkdGhJblBpeGVsc1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCBlZGdlTWFyZ2luSW5QaXhlbHMgPSBwYXJhbXMuZWRnZU1hcmdpbkluUGl4ZWxzID8/IERFRkFVTFRfU1RBVFVTX0JBUl9FREdFX01BUkdJTl9JTl9QSVhFTFM7XG4gIGNvbnN0IHNhbXBsZUluc2V0SW5QaXhlbHMgPSBwYXJhbXMuc2FtcGxlSW5zZXRJblBpeGVscyA/PyBERUZBVUxUX1NUQVRVU19CQVJfU0FNUExFX0lOU0VUX0lOX1BJWEVMUztcblxuICBhc3NlcnRQb3NpdGl2ZSgnd2lkdGhJblBpeGVscycsIHdpZHRoSW5QaXhlbHMpO1xuICBhc3NlcnRQb3NpdGl2ZSgnaGVpZ2h0SW5QaXhlbHMnLCBoZWlnaHRJblBpeGVscyk7XG4gIGFzc2VydFBvc2l0aXZlKCdjaGFubmVsQ291bnQnLCBjaGFubmVsQ291bnQpO1xuXG4gIGNvbnN0IHNhbXBsZVJvd1lJblBpeGVscyA9IGhlaWdodEluUGl4ZWxzIC0gc2FtcGxlSW5zZXRJblBpeGVscztcblxuICBpZiAoc2FtcGxlUm93WUluUGl4ZWxzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByZXNvbHZlU3RhdHVzQmFyQmFuZDogYSBzYW1wbGUgaW5zZXQgb2YgJHtTdHJpbmcoc2FtcGxlSW5zZXRJblBpeGVscyl9cHggcHV0cyB0aGUgc2FtcGxlIHJvdyBhYm92ZSB0aGUgdG9wIGBcbiAgICAgICAgKyBgb2YgdGhlIGZyYW1lIGZvciBhIGJhbmQgb2YgJHtTdHJpbmcoaGVpZ2h0SW5QaXhlbHMpfXB4LmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbGFzdFNjYW5uZWRDb2x1bW5YSW5QaXhlbHMgPSB3aWR0aEluUGl4ZWxzIC0gZWRnZU1hcmdpbkluUGl4ZWxzO1xuXG4gIGlmIChsYXN0U2Nhbm5lZENvbHVtblhJblBpeGVscyAtIGVkZ2VNYXJnaW5JblBpeGVscyA8IE1JTklNVU1fU0NBTk5FRF9DT0xVTU5fQ09VTlQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcmVzb2x2ZVN0YXR1c0JhckJhbmQ6IGFuIGVkZ2UgbWFyZ2luIG9mICR7U3RyaW5nKGVkZ2VNYXJnaW5JblBpeGVscyl9cHggbGVhdmVzIGZld2VyIHRoYW4gYFxuICAgICAgICArIGAke1N0cmluZyhNSU5JTVVNX1NDQU5ORURfQ09MVU1OX0NPVU5UKX0gY29sdW1ucyBvZiBhICR7U3RyaW5nKHdpZHRoSW5QaXhlbHMpfXB4IGZyYW1lIHRvIHNjYW4sIGBcbiAgICAgICAgKyAnd2hpY2ggaXMgYSBjaGVjayB0aGF0IGNhbm5vdCBmYWlsLidcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgcm93U3RhcnRPZmZzZXQgPSBzYW1wbGVSb3dZSW5QaXhlbHMgKiB3aWR0aEluUGl4ZWxzICogY2hhbm5lbENvdW50O1xuICBjb25zdCByZXF1aXJlZExlbmd0aCA9IHJvd1N0YXJ0T2Zmc2V0ICsgd2lkdGhJblBpeGVscyAqIGNoYW5uZWxDb3VudDtcblxuICBpZiAocGl4ZWxzLmxlbmd0aCA8IHJlcXVpcmVkTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJlc29sdmVTdGF0dXNCYXJCYW5kOiB0aGUgZnJhbWUgaG9sZHMgJHtTdHJpbmcocGl4ZWxzLmxlbmd0aCl9IGJ5dGVzLCB0b28gZmV3IGZvciByb3cgYFxuICAgICAgICArIGB5JHtTdHJpbmcoc2FtcGxlUm93WUluUGl4ZWxzKX0gb2YgYSAke1N0cmluZyh3aWR0aEluUGl4ZWxzKX1weC13aWRlIGZyYW1lIGF0IGBcbiAgICAgICAgKyBgJHtTdHJpbmcoY2hhbm5lbENvdW50KX0gY2hhbm5lbHMsIHdoaWNoIG5lZWRzICR7U3RyaW5nKHJlcXVpcmVkTGVuZ3RoKX0uYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSByZWFkQ29sb3IocGl4ZWxzLCByb3dTdGFydE9mZnNldCArIGVkZ2VNYXJnaW5JblBpeGVscyAqIGNoYW5uZWxDb3VudCk7XG4gIGNvbnN0IGJhY2tncm91bmRLZXkgPSBmb3JtYXRDb2xvcihiYWNrZ3JvdW5kQ29sb3IpO1xuICBjb25zdCBjb2xvcktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGZpcnN0RGlmZmVyZW50Q29sb3I6IG51bGwgfCBTdGF0dXNCYXJCYW5kQ29sb3IgPSBudWxsO1xuICBsZXQgZmlyc3REaWZmZXJlbnRDb2x1bW5YSW5QaXhlbHM6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuXG4gIGZvciAobGV0IHggPSBlZGdlTWFyZ2luSW5QaXhlbHM7IHggPCBsYXN0U2Nhbm5lZENvbHVtblhJblBpeGVsczsgeCsrKSB7XG4gICAgY29uc3QgY29sb3IgPSByZWFkQ29sb3IocGl4ZWxzLCByb3dTdGFydE9mZnNldCArIHggKiBjaGFubmVsQ291bnQpO1xuICAgIGNvbnN0IGNvbG9yS2V5ID0gZm9ybWF0Q29sb3IoY29sb3IpO1xuICAgIGNvbG9yS2V5cy5hZGQoY29sb3JLZXkpO1xuXG4gICAgaWYgKGZpcnN0RGlmZmVyZW50Q29sdW1uWEluUGl4ZWxzICE9PSBudWxsIHx8IGNvbG9yS2V5ID09PSBiYWNrZ3JvdW5kS2V5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmaXJzdERpZmZlcmVudENvbG9yID0gY29sb3I7XG4gICAgZmlyc3REaWZmZXJlbnRDb2x1bW5YSW5QaXhlbHMgPSB4O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZGlzdGluY3RDb2xvckNvdW50OiBjb2xvcktleXMuc2l6ZSxcbiAgICBmaXJzdERpZmZlcmVudENvbG9yLFxuICAgIGZpcnN0RGlmZmVyZW50Q29sdW1uWEluUGl4ZWxzLFxuICAgIGlzQ2xlYXI6IGNvbG9yS2V5cy5zaXplID09PSAxLFxuICAgIHNhbXBsZVJvd1lJblBpeGVsc1xuICB9O1xufVxuXG4vKipcbiAqIFJlZnVzZXMgYSBkaW1lbnNpb24gdGhhdCBjYW5ub3QgZGVzY3JpYmUgYSBmcmFtZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBwYXJhbWV0ZXIgYmVpbmcgY2hlY2tlZCwgc28gdGhlIG1lc3NhZ2UgbmFtZXMgaXQuXG4gKiBAcGFyYW0gdmFsdWUgLSBXaGF0IHdhcyBwYXNzZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyLlxuICovXG5mdW5jdGlvbiBhc3NlcnRQb3NpdGl2ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlc29sdmVTdGF0dXNCYXJCYW5kOiAke25hbWV9IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9LmApO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGNvbG9yIGFzIHRleHQsIGZvciBjb21wYXJpc29uIGFuZCBmb3IgdGhlIGRpYWdub3N0aWMuXG4gKlxuICogVGhlIHNhbWUgcmVuZGVyaW5nIGRvZXMgYm90aCBqb2JzIG9uIHB1cnBvc2U6IHdoYXQgYSByZWFkZXIgaXMgc2hvd24gaXMgdGhlXG4gKiB2YWx1ZSB0aGUgY29tcGFyaXNvbiB3YXMgbWFkZSBvbiwgcmF0aGVyIHRoYW4gYSByZS1mb3JtYXR0aW5nIG9mIGl0LlxuICpcbiAqIEBwYXJhbSBjb2xvciAtIFRoZSBjb2xvciwgb3IgYG51bGxgIHdoZW4gdGhlcmUgd2FzIG5vbmUgdG8gcmVwb3J0LlxuICogQHJldHVybnMgVGhlIGNvbG9yIGFzIGByZ2IocixnLGIpYCwgb3IgYChub25lKWAuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdENvbG9yKGNvbG9yOiBudWxsIHwgU3RhdHVzQmFyQmFuZENvbG9yKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbG9yID09PSBudWxsID8gJyhub25lKScgOiBgcmdiKCR7U3RyaW5nKGNvbG9yLnIpfSwke1N0cmluZyhjb2xvci5nKX0sJHtTdHJpbmcoY29sb3IuYil9KWA7XG59XG5cbi8qKlxuICogUmVhZHMgb25lIHBpeGVsJ3MgY29sb3Igb3V0IG9mIGEgcmF3IGZyYW1lLCBpZ25vcmluZyBhbnkgYWxwaGEgY2hhbm5lbC5cbiAqXG4gKiBAcGFyYW0gcGl4ZWxzIC0gVGhlIGZyYW1lJ3MgcmF3IGJ5dGVzLlxuICogQHBhcmFtIG9mZnNldCAtIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcGl4ZWwuXG4gKiBAcmV0dXJucyBUaGUgY29sb3IgYXQgdGhhdCBvZmZzZXQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDb2xvcihwaXhlbHM6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyKTogU3RhdHVzQmFyQmFuZENvbG9yIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFRoZSBmYWxsYmFja3MgYXJlIHVucmVhY2hhYmxlOiBldmVyeSByZWFkIGlzIGluc2lkZSBhIHJvdyBgcmVzb2x2ZVN0YXR1c0JhckJhbmRgIGhhcyBhbHJlYWR5IHByb3ZlZCB0aGUgYnVmZmVyIGxvbmcgZW5vdWdoIHRvIGhvbGQuIFRoZXkgYXJlIGhlcmUgYmVjYXVzZSBhbiBpbmRleCByZWFkIGlzIHR5cGVkIGBudW1iZXIgfCB1bmRlZmluZWRgLCBub3QgYmVjYXVzZSBhIHBpeGVsIGNhbiBiZSBtaXNzaW5nLiAqL1xuICByZXR1cm4ge1xuICAgIGI6IHBpeGVsc1tvZmZzZXQgKyBCTFVFX0NIQU5ORUxfT0ZGU0VUXSA/PyAwLFxuICAgIGc6IHBpeGVsc1tvZmZzZXQgKyBHUkVFTl9DSEFOTkVMX09GRlNFVF0gPz8gMCxcbiAgICByOiBwaXhlbHNbb2Zmc2V0ICsgUkVEX0NIQU5ORUxfT0ZGU0VUXSA/PyAwXG4gIH07XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEyQ0EsMEJBQTRCO0FBNktyQixNQUFNLDJDQUEyQztBQVFqRCxNQUFNLDRDQUE0QztBQUt6RCxNQUFNLHNCQUFzQjtBQUs1QixNQUFNLHFCQUFxQjtBQUszQixNQUFNLHVCQUF1QjtBQVE3QixNQUFNLCtCQUErQjtBQUtyQyxNQUFNLHFCQUFxQjtBQVdwQixTQUFTLGlDQUFpQyxRQUF3RDtBQUN2RyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFFBQU0sUUFBUTtBQUFBLElBQ1osMkZBQ0ssT0FBTyxjQUFjLENBQUM7QUFBQSxJQUMzQixRQUFRLE9BQU8sY0FBYyxDQUFDLGlCQUFpQixPQUFPLFFBQVEsa0JBQWtCLENBQUMsYUFDbkUsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLE9BQU8sZ0JBQWdCLGtCQUFrQixDQUFDLE9BQy9FLE9BQU8sYUFBYSxDQUFDLHFCQUFxQixPQUFPLFFBQVEsa0JBQWtCLENBQUM7QUFBQSxJQUNwRixXQUFXLFlBQVksUUFBUSxlQUFlLENBQUMsV0FBVyxPQUFPLFFBQVEsNkJBQTZCLENBQUMsT0FDL0YsWUFBWSxRQUFRLG1CQUFtQixDQUFDO0FBQUEsSUFDaEQ7QUFBQSxFQUdGO0FBRUEsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4QjtBQWVBLGVBQXNCLGtCQUFrQixPQUFtQixTQUF3RDtBQUNqSCxRQUFNLEVBQUUsZUFBZSxJQUFJO0FBQzNCLFFBQU0scUJBQXFCLFFBQVEsc0JBQXNCO0FBQ3pELFFBQU0sUUFBUSxVQUFNLGlDQUFZLG1CQUFtQjtBQUNuRCxRQUFNLEVBQUUsTUFBTSxLQUFLLElBQUksTUFBTSxNQUFNLEtBQUss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
|