system-testing 1.0.117 → 1.0.119

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.
@@ -7,6 +7,7 @@ import { wait } from "awaitery";
7
7
  import timeout from "awaitery/build/timeout.js";
8
8
  import WebDriverDriver from "./webdriver-driver.js";
9
9
  const MAX_NATIVE_VIEWPORT_SCROLL_STEPS = 8;
10
+ const DEFAULT_NATIVE_NEW_COMMAND_TIMEOUT_SECONDS = 180;
10
11
  /**
11
12
  * Appium timeout values returned by Selenium.
12
13
  * @typedef {{implicit: number, pageLoad?: number, script?: number}} NativeTimeouts
@@ -209,6 +210,38 @@ export async function ensureChromeUserDataDirCapability({ browserName, capabilit
209
210
  };
210
211
  return userDataDir;
211
212
  }
213
+ /**
214
+ * Keeps native Appium sessions alive while the React Native app opens the system-test WebSocket.
215
+ * @param {object} args
216
+ * @param {Record<string, any>} args.capabilities
217
+ * @returns {void}
218
+ */
219
+ export function ensureNativeNewCommandTimeoutCapability({ capabilities }) {
220
+ const platformName = capabilities.platformName;
221
+ if (typeof platformName !== "string" || platformName.toLowerCase() !== "android")
222
+ return;
223
+ if (typeof capabilities.browserName === "string" && capabilities.browserName.length > 0)
224
+ return;
225
+ if (capabilities["appium:newCommandTimeout"] !== undefined)
226
+ return;
227
+ if (capabilities.newCommandTimeout !== undefined)
228
+ return;
229
+ capabilities["appium:newCommandTimeout"] = DEFAULT_NATIVE_NEW_COMMAND_TIMEOUT_SECONDS;
230
+ }
231
+ /**
232
+ * Whether a driver config resolves to a native Appium app session rather than a browser.
233
+ * Native app sessions launch an installed app (no `browserName`), so the system-test harness
234
+ * must start the client WebSocket before the app launches and allow the native-safe connect timeout.
235
+ * @param {import("../browser.js").BrowserDriverConfig} [driverConfig]
236
+ * @returns {boolean}
237
+ */
238
+ export function isAppiumNativeAppDriverConfig(driverConfig) {
239
+ if (driverConfig?.type !== "appium")
240
+ return false;
241
+ const options = driverConfig.options ?? {};
242
+ const browserName = options.capabilities?.browserName ?? options.browserName;
243
+ return typeof browserName !== "string" || browserName.length === 0;
244
+ }
212
245
  /**
213
246
  * @typedef {object} AppiumDriverOptions
214
247
  * @property {string} [serverUrl] Remote Appium server URL to connect to.
@@ -267,6 +300,7 @@ export default class AppiumDriver extends WebDriverDriver {
267
300
  browserName: this.options.browserName,
268
301
  capabilities
269
302
  });
303
+ ensureNativeNewCommandTimeoutCapability({ capabilities });
270
304
  const builder = new Builder().usingServer(this.serverUrl);
271
305
  if (Object.keys(capabilities).length > 0) {
272
306
  builder.withCapabilities(capabilities);
@@ -912,4 +946,4 @@ export default class AppiumDriver extends WebDriverDriver {
912
946
  return `http://${address}:${port}${basePath}`;
913
947
  }
914
948
  }
915
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDdEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRCxNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQTtBQUUxQzs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFLO0lBQ3pCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBSztJQUM3QixPQUFPLEtB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QUFTLElBQUksQ0FBQyxXQUFXLENBQUE7SUFDckcsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxVQUFVO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFBO1FBQ2pELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFBO1FBQ3BDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVuSSxPQUFPLFVBQVUsT0FBTyxJQUFJLElBQUksR0FBRyxRQUFRLEVBQUUsQ0FBQTtJQUMvQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQge0J1aWxkZXIsIEJ5fSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcbmltcG9ydCB7Q29tbWFuZCwgTmFtZX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9saWIvY29tbWFuZC5qc1wiXG5pbXBvcnQge09yaWdpbn0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9saWIvaW5wdXQuanNcIlxuaW1wb3J0IHt3YWl0fSBmcm9tIFwiYXdhaXRlcnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IFdlYkRyaXZlckRyaXZlciBmcm9tIFwiLi93ZWJkcml2ZXItZHJpdmVyLmpzXCJcblxuY29uc3QgTUFYX05BVElWRV9WSUVXUE9SVF9TQ1JPTExfU1RFUFMgPSA4XG5cbi8qKlxuICogQXBwaXVtIHRpbWVvdXQgdmFsdWVzIHJldHVybmVkIGJ5IFNlbGVuaXVtLlxuICogQHR5cGVkZWYge3tpbXBsaWNpdDogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dHNcbiAqL1xuLyoqXG4gKiBBcHBpdW0gdGltZW91dCB1cGRhdGUgc2hhcGUgYWNjZXB0ZWQgYnkgU2VsZW5pdW0uXG4gKiBAdHlwZWRlZiB7e2ltcGxpY2l0PzogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dE9wdGlvbnNcbiAqL1xuLyoqXG4gKiBOYXRpdmUgQXBwaXVtIHdpbmRvdyBkaW1lbnNpb25zLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9fSBOYXRpdmVXaW5kb3dSZWN0XG4gKi9cbi8qKlxuICogVHJhY2tzIG5hdGl2ZSBzY3JvbGwgZmFsbGJhY2tzIHRoYXQgYWxyZWFkeSByZXBvcnRlZCBubyBtb3ZlbWVudC5cbiAqIEB0eXBlZGVmIHt7dHJ5RWxlbWVudFNjcm9sbDogYm9vbGVhbiwgdHJ5Vmlld3BvcnRTY3JvbGw6IGJvb2xlYW59fSBOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlXG4gKi9cbi8qKlxuICogTmF0aXZlIHZpZXdwb3J0IHNjcm9sbCBkaXJlY3Rpb24uXG4gKiBAdHlwZWRlZiB7XCJkb3duXCJ8XCJ1cFwifSBOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvblxuICovXG4vKipcbiAqIE5hdGl2ZSBBbmRyb2lkIGxvb2t1cCB3b3JrIGV4ZWN1dGVkIGJ5IHRoZSBzY3JvbGxpbmcgcG9sbGVyLlxuICogQHR5cGVkZWYge3tkZXNjcmlwdGlvbjogc3RyaW5nLCBkaXJlY3RGaW5kOiAoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Piwgc2Nyb2xsU2VsZWN0b3JzOiBzdHJpbmdbXX19IE5hdGl2ZUNvbnRyb2xMb29rdXBcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge3Vua25vd259IGNhdXNlXG4gKiBAcmV0dXJucyB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fVxuICovXG5mdW5jdGlvbiBlcnJvcldpdGhDYXVzZShtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fSAqLyAobmV3IEVycm9yKG1lc3NhZ2UpKVxuICBlcnJvci5jYXVzZSA9IGNhdXNlXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCByZWdleCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUmVnZXgtc2FmZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCBcIlxcXFwkJlwiKVxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIHF1b3RlZCBVaUF1dG9tYXRvciBKYXZhIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgSmF2YSBzdHJpbmcgdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEphdmEtc3RyaW5nLXNhZmUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSmF2YVN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciBSZWFjdCBOYXRpdmUgYW5kIHBhY2thZ2UtcXVhbGlmaWVkIHJlc291cmNlIElEcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmVzb3VyY2UgaWQgc3VmZml4IHRvIG1hdGNoLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWRNYXRjaGVzKFwiKF58Lio6aWQvKSR7ZXNjYXBlSmF2YVN0cmluZyhlc2NhcGVSZWdFeHAodGVzdElkKSl9JFwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgdmlzaWJsZSB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVpQXV0b21hdG9yIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVaUF1dG9tYXRvciBzZWxlY3RvciBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkge1xuICByZXR1cm4gYG5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb25Db250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBuYXRpdmUgbG9va3VwIGZhaWxlZCBiZWNhdXNlIHRoZSBjb250cm9sIGlzIG5vdCBjdXJyZW50bHkgbW91bnRlZCBvbnNjcmVlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgVmFsdWUgdGhyb3duIGJ5IEFwcGl1bSBsb29rdXAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBuYXRpdmUgc2Nyb2xsaW5nIHNob3VsZCBiZSBhdHRlbXB0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZFwiKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQ291bGRuJ3QgZ2V0IGVsZW1lbnRzXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGhvc3RlZCBBcHBpdW0gZHJpdmVyIGxhY2tzIHRoZSBtb2JpbGUgZ2VzdHVyZSBleHRlbnNpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIFZhbHVlIHRocm93biBieSBBcHBpdW0uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBXM0MgYWN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk5vdFlldEltcGxlbWVudGVkRXJyb3JcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiTWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWRcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiVW5rbm93biBtb2JpbGUgY29tbWFuZFwiKVxufVxuXG4vKipcbiAqIEFkZHMgYSBVaUF1dG9tYXRvciB0ZXh0IHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsdGVyU2VsZWN0b3IgVWlBdXRvbWF0b3IgdGV4dCBvciBkZXNjcmlwdGlvbiBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBmaWx0ZXJTZWxlY3Rvcikge1xuICBjb25zdCBwcmVmaXggPSBcIm5ldyBVaVNlbGVjdG9yKClcIlxuXG4gIGlmICghZmlsdGVyU2VsZWN0b3Iuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBBbmRyb2lkIHNlbGVjdG9yIHRvIHN0YXJ0IHdpdGggJHtwcmVmaXh9LCBnb3QgJHtmaWx0ZXJTZWxlY3Rvcn1gKVxuICB9XG5cbiAgcmV0dXJuIGAke3Jlc291cmNlU2VsZWN0b3J9JHtmaWx0ZXJTZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKX1gXG59XG5cbi8qKlxuICogQWRkcyBhIFVpQXV0b21hdG9yIGNoaWxkIHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGRTZWxlY3RvciBVaUF1dG9tYXRvciBjaGlsZCBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBjaGlsZFNlbGVjdG9yKSB7XG4gIHJldHVybiBgJHtyZXNvdXJjZVNlbGVjdG9yfS5jaGlsZFNlbGVjdG9yKCR7Y2hpbGRTZWxlY3Rvcn0pYFxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGFzIGFuIFhQYXRoIHN0cmluZyBsaXRlcmFsLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCBYUGF0aCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUXVvdGVkIGxpdGVyYWwgb3IgY29uY2F0IGV4cHJlc3Npb24gc2FmZSBmb3IgWFBhdGguXG4gKi9cbmZ1bmN0aW9uIHhwYXRoU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgaWYgKCF2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHJldHVybiBgJyR7dmFsdWV9J2BcblxuICByZXR1cm4gYGNvbmNhdCgke3ZhbHVlLnNwbGl0KCdcIicpLm1hcCgocGFydCkgPT4gYFwiJHtwYXJ0fVwiYCkuam9pbihcIiwgJ1xcXCInLCBcIil9KWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gWFBhdGggc2VsZWN0b3IgZm9yIHRleHQgdW5kZXIgb25lIG5hdGl2ZSBBbmRyb2lkIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSZXNvdXJjZSBpZCBzdWZmaXggdG8gc2NvcGUgdW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlIGluc2lkZSB0aGF0IHNjb3BlLlxuICogQHJldHVybnMge3N0cmluZ30gWFBhdGggc2VsZWN0b3Igc291cmNlLlxuICovXG5mdW5jdGlvbiBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlSWQgPSB4cGF0aFN0cmluZ0xpdGVyYWwodGVzdElkKVxuICBjb25zdCB0ZXh0ID0geHBhdGhTdHJpbmdMaXRlcmFsKGV4cGVjdGVkVGV4dClcbiAgY29uc3QgcmVzb3VyY2VQcmVkaWNhdGUgPSBgKEByZXNvdXJjZS1pZCA9ICR7cmVzb3VyY2VJZH0gb3Igc3Vic3RyaW5nKEByZXNvdXJjZS1pZCwgc3RyaW5nLWxlbmd0aChAcmVzb3VyY2UtaWQpIC0gc3RyaW5nLWxlbmd0aCgke3Jlc291cmNlSWR9KSArIDEpID0gJHtyZXNvdXJjZUlkfSlgXG4gIGNvbnN0IHRleHRQcmVkaWNhdGUgPSBgKGNvbnRhaW5zKEB0ZXh0LCAke3RleHR9KSBvciBjb250YWlucyhAY29udGVudC1kZXNjLCAke3RleHR9KSlgXG5cbiAgcmV0dXJuIGAvLypbJHtyZXNvdXJjZVByZWRpY2F0ZX0gYW5kICR7dGV4dFByZWRpY2F0ZX1dIHwgLy8qWyR7cmVzb3VyY2VQcmVkaWNhdGV9XS8vKlske3RleHRQcmVkaWNhdGV9XWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgc2VsZWN0b3JzIHRoYXQgc2NvcGUgdGV4dCBtYXRjaGluZyB0byBvbmUgbmF0aXZlIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgdGVzdCBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0aGF0IG11c3QgYXBwZWFyIG9uIHRoYXQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVWlBdXRvbWF0b3Igc2VsZWN0b3JzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlU2VsZWN0b3IgPSBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcblxuICByZXR1cm4gW1xuICAgIGNvbWJpbmVBbmRyb2lkU2VsZWN0b3JzKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpLFxuICAgIGNoaWxkQW5kcm9pZFNlbGVjdG9yKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpXG4gIF1cbn1cblxuLyoqXG4gKiBCdWlsZHMgbmF0aXZlIEFuZHJvaWQgc2Nyb2xsIHNlbGVjdG9ycyBmb3IgYSBzY29wZWQgdGV4dCBhc3NlcnRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSB0ZXN0IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgb24gdGhhdCBlbGVtZW50LlxuICogQHJldHVybnMge3N0cmluZ1tdfSBVaUF1dG9tYXRvciBzZWxlY3RvcnMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSxcbiAgICBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcbiAgXVxufVxuXG4vKipcbiAqIEVuc3VyZXMgQ2hyb21lIEFwcGl1bSBjYXBhYmlsaXRpZXMgdXNlIGEgY2FsbGVyLW93bmVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKiBUaGlzIGF2b2lkcyByZXBlYXRlZCBzZXNzaW9ucyBsZWFraW5nIHRlbXAgcHJvZmlsZXMgdW5kZXIgYC90bXBgIGluIENJLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5icm93c2VyTmFtZV1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50ZW1wUm9vdERpcl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDaHJvbWVVc2VyRGF0YURpckNhcGFiaWxpdHkoe2Jyb3dzZXJOYW1lLCBjYXBhYmlsaXRpZXMsIHRlbXBSb290RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidG1wXCIsIFwiYXBwaXVtLWNocm9tZS11c2VyLWRhdGFcIil9KSB7XG4gIGNvbnN0IHJlc29sdmVkQnJvd3Nlck5hbWUgPSBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPz8gYnJvd3Nlck5hbWVcblxuICBpZiAodHlwZW9mIHJlc29sdmVkQnJvd3Nlck5hbWUgIT09IFwic3RyaW5nXCIgfHwgcmVzb2x2ZWRCcm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNocm9tZVwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGxhdGZvcm1OYW1lID0gY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZVxuXG4gIGlmICh0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBjYXBhYmlsaXRpZXNbXCJnb29nOmNocm9tZU9wdGlvbnNcIl1cbiAgY29uc3QgYXJncyA9IEFycmF5LmlzQXJyYXkoY2hyb21lT3B0aW9ucz8uYXJncykgPyBbLi4uY2hyb21lT3B0aW9ucy5hcmdzXSA6IFtdXG5cbiAgaWYgKGFyZ3Muc29tZSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmIGFyZy5zdGFydHNXaXRoKFwiLS11c2VyLWRhdGEtZGlyPVwiKSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBhd2FpdCBmcy5ta2Rpcih0ZW1wUm9vdERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgY29uc3QgdXNlckRhdGFEaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbih0ZW1wUm9vdERpciwgXCJwcm9maWxlLVwiKSlcblxuICBhcmdzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke3VzZXJEYXRhRGlyfWApXG4gIGNhcGFiaWxpdGllc1tcImdvb2c6Y2hyb21lT3B0aW9uc1wiXSA9IHtcbiAgICAuLi4oY2hyb21lT3B0aW9ucyA/PyB7fSksXG4gICAgYXJnc1xuICB9XG5cbiAgcmV0dXJuIHVzZXJEYXRhRGlyXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXBwaXVtRHJpdmVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZXJ2ZXJVcmxdIFJlbW90ZSBBcHBpdW0gc2VydmVyIFVSTCB0byBjb25uZWN0IHRvLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbc2VydmVyQXJnc10gT3B0aW9ucyBwYXNzZWQgdG8gdGhlIEFwcGl1bSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbdXNlRHJpdmVyc10gQXBwaXVtIGRyaXZlciBuYW1lcyB0byBsb2FkIHdoZW4gc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2NhcGFiaWxpdGllc10gRGVzaXJlZCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBzZXNzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFticm93c2VyTmFtZV0gQnJvd3NlciBuYW1lIGZvciB3ZWIgc2Vzc2lvbnMuXG4gKiBAcHJvcGVydHkge1wiYWNjZXNzaWJpbGl0eUlkXCJ8XCJjc3NcInxcImlkXCJ9IFt0ZXN0SWRTdHJhdGVneV0gU3RyYXRlZ3kgZm9yIHJlc29sdmluZyB0ZXN0IElEcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGVzdElkQXR0cmlidXRlXSBBdHRyaWJ1dGUgbmFtZSB3aGVuIHVzaW5nIHRoZSBDU1MgdGVzdCBJRCBzdHJhdGVneS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaW5kQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciBsb29rdXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBudWxsfSBbdmlzaWJsZV0gV2hldGhlciB0byByZXF1aXJlIGVsZW1lbnRzIHRvIGJlIHZpc2libGUgKGB0cnVlYCkgb3IgaGlkZGVuIChgZmFsc2VgKS4gVXNlIGBudWxsYCB0byBkaXNhYmxlIHZpc2liaWxpdHkgZmlsdGVyaW5nLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2Nyb2xsVG9dIFdoZXRoZXIgdG8gc2Nyb2xsIGZvdW5kIGVsZW1lbnRzIGludG8gdmlldyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbc2Nyb2xsQ29udGFpbmVyVGVzdElEc10gTmF0aXZlIHRlc3QgSURzIHRoYXQgc2hvdWxkIGJlIHRyaWVkIGFzIHNjcm9sbCBjb250YWluZXJzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdmlld3BvcnQgZ2VzdHVyZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cblxuLyoqXG4gKiBBcHBpdW0gZHJpdmVyIGJhY2tlZCBieSB0aGUgQXBwaXVtIHNlcnZlciBwYWNrYWdlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcHBpdW1Ecml2ZXIgZXh0ZW5kcyBXZWJEcml2ZXJEcml2ZXIge1xuICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgY2hyb21lVXNlckRhdGFEaXIgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCBzZXJ2ZXJBcmdzID0gey4uLih0aGlzLm9wdGlvbnMuc2VydmVyQXJncyA/PyB7fSl9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZURyaXZlcnMgJiYgIXNlcnZlckFyZ3MudXNlRHJpdmVycykge1xuICAgICAgc2VydmVyQXJncy51c2VEcml2ZXJzID0gdGhpcy5vcHRpb25zLnVzZURyaXZlcnNcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNlcnZlclVybCkge1xuICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSB0aGlzLm9wdGlvbnMuc2VydmVyVXJsXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFwcGl1bU1vZHVsZSA9IGF3YWl0IGltcG9ydChcImFwcGl1bVwiKVxuICAgICAgY29uc3QgYXBwaXVtTWFpbiA9IGFwcGl1bU1vZHVsZS5tYWluID8/IGFwcGl1bU1vZHVsZS5kZWZhdWx0Py5tYWluXG5cbiAgICAgIGlmICghYXBwaXVtTWFpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBcHBpdW0gbWFpbigpIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGFwcGl1bSBwYWNrYWdlXCIpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwaXVtU2VydmVyID0gYXdhaXQgYXBwaXVtTWFpbihzZXJ2ZXJBcmdzKVxuICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSB0aGlzLmJ1aWxkU2VydmVyVXJsKHNlcnZlckFyZ3MpXG4gICAgfVxuXG4gICAgY29uc3QgY2FwYWJpbGl0aWVzID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcyA/IHsuLi50aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzfSA6IHt9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lICYmICFjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpIHtcbiAgICAgIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuICAgIH1cbiAgICBpZiAoY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IFwiXCJcbiAgICB9XG5cbiAgICB0aGlzLmNocm9tZVVzZXJEYXRhRGlyID0gYXdhaXQgZW5zdXJlQ2hyb21lVXNlckRhdGFEaXJDYXBhYmlsaXR5KHtcbiAgICAgIGJyb3dzZXJOYW1lOiB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUsXG4gICAgICBjYXBhYmlsaXRpZXNcbiAgICB9KVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCkudXNpbmdTZXJ2ZXIodGhpcy5zZXJ2ZXJVcmwpXG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2FwYWJpbGl0aWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICBidWlsZGVyLndpdGhDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJEcml2ZXIgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKClcblxuICAgICAgdGhpcy5zZXRXZWJEcml2ZXIod2ViRHJpdmVyKVxuICAgICAgdGhpcy5pbnN0YWxsRXhpdEhhbmRsZXJzKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQ2hyb21lVXNlckRhdGFEaXIoKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5zdG9wKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuYXBwaXVtU2VydmVyPy5jbG9zZSkge1xuICAgICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgQXBwaXVtIHNlcnZlclwifSwgYXN5bmMgKCkgPT4gYXdhaXQgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy5hcHBpdW1TZXJ2ZXI+fSAqLyAodGhpcy5hcHBpdW1TZXJ2ZXIpLmNsb3NlKCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwaXVtU2VydmVyID0gdW5kZWZpbmVkXG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBjbGVhbnVwQ2hyb21lVXNlckRhdGFEaXIoKSB7XG4gICAgaWYgKCF0aGlzLmNocm9tZVVzZXJEYXRhRGlyKSByZXR1cm5cblxuICAgIGNvbnN0IGNocm9tZVVzZXJEYXRhRGlyID0gdGhpcy5jaHJvbWVVc2VyRGF0YURpclxuXG4gICAgdGhpcy5jaHJvbWVVc2VyRGF0YURpciA9IHVuZGVmaW5lZFxuICAgIGF3YWl0IGZzLnJtKGNocm9tZVVzZXJEYXRhRGlyLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbGwgY29va2llcy4gU2tpcHBlZCBmb3IgbmF0aXZlIGFwcCBjb250ZXh0cyB3aGVyZSBjb29raWVcbiAgICogbWFuYWdlbWVudCBpcyBub3Qgc3VwcG9ydGVkIGJ5IFVpQXV0b21hdG9yMi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDb29raWVzKCkge1xuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICBpZiAoIWJyb3dzZXJOYW1lKSByZXR1cm5cblxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZUFsbENvb2tpZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIGdldEJyb3dzZXJMb2dzKCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG4gICAgY29uc3QgaXNBbmRyb2lkID0gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCJcblxuICAgIGlmIChpc0FuZHJvaWQgJiYgIWJyb3dzZXJOYW1lKSB7XG4gICAgICBsZXQgZW50cmllc1xuXG4gICAgICB0cnkge1xuICAgICAgICBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5sb2dzKCkuZ2V0KFwibG9nY2F0XCIpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvZ2NhdExvZ3MgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZW50cnkubWVzc2FnZS5tYXRjaCgvXiguKykgKFxcZCspOihcXGQrKSAoLispJC8pXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlTWF0Y2ggPyBtZXNzYWdlTWF0Y2hbNF0gOiBlbnRyeS5tZXNzYWdlXG5cbiAgICAgICAgbG9nY2F0TG9ncy5wdXNoKGAke2VudHJ5LmxldmVsLm5hbWV9OiAke21lc3NhZ2V9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvZ2NhdExvZ3NcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuZ2V0QnJvd3NlckxvZ3MoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgdGVzdCBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIGNvbnN0IHRlc3RJZFN0cmF0ZWd5ID0gdGhpcy5vcHRpb25zLnRlc3RJZFN0cmF0ZWd5ID8/IFwiYWNjZXNzaWJpbGl0eUlkXCJcblxuICAgIGlmICh0ZXN0SWRTdHJhdGVneSA9PT0gXCJjc3NcIikge1xuICAgICAgY29uc3QgdGVzdElkQXR0cmlidXRlID0gdGhpcy5vcHRpb25zLnRlc3RJZEF0dHJpYnV0ZSA/PyBcImRhdGEtdGVzdGlkXCJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmQoYFske3Rlc3RJZEF0dHJpYnV0ZX09JyR7dGVzdElEfSddYCwgYXJncylcbiAgICB9XG4gICAgaWYgKHRlc3RJZFN0cmF0ZWd5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeUlkKHRlc3RJRCwgYXJncylcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElELCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpcyBjdXJyZW50bHkgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaGFzVGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwfSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aChcIkVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgXCIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGxCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9IC0gJHtlcnJvci5tZXNzYWdlfSAoYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfSlgLCBlcnJvcilcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3YXMgZm91bmQgYnkgYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnRzWzBdKSB7XG4gICAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcywgc2Nyb2xsVG8gPSBmYWxzZSwgdmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICB2b2lkIHNjcm9sbENvbnRhaW5lclRlc3RJRHNcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncykuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJ1c2VCYXNlU2VsZWN0b3JcIilcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBnZXRUaW1lTGVmdCA9ICgpID0+IE1hdGgubWF4KGFjdHVhbFRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSksIDApXG4gICAgY29uc3QgZ2V0RWxlbWVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiYWNjZXNzaWJpbGl0eSBpZFwiLCB0ZXN0SWQpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCB0aGlzLmlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgJiYgZ2V0VGltZUxlZnQoKSA+IDApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaXMgZGlzcGxheWVkLiBGb3IgbmF0aXZlIGFwcCBjb250ZXh0cywgYWx3YXlzXG4gICAqIHJldHVybnMgdHJ1ZSBiZWNhdXNlIFNlbGVuaXVtJ3MgaXNEaXNwbGF5ZWQoKSBKUyBhdG9tIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICogYnkgVWlBdXRvbWF0b3IyIGluIG5hdGl2ZSBtb2RlLCBhbmQgZWxlbWVudHMgZm91bmQgYnkgVWlBdXRvbWF0b3IyJ3NcbiAgICogYWNjZXNzaWJpbGl0eSBpZCAvIGlkIHNlYXJjaCBhcmUgYWxyZWFkeSBpbiB0aGUgcmVuZGVyZWQgdmlldyBoaWVyYXJjaHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBpc0VsZW1lbnREaXNwbGF5ZWQoZWxlbWVudCkge1xuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICBpZiAoIWJyb3dzZXJOYW1lKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeUlkKHRlc3RJZCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpICYmIGFyZ3Muc2Nyb2xsVG8pIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sQnlJZCh0ZXN0SWQsIGFyZ3MpXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHNcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsQnlJZCh0ZXN0SWQsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9IC0gJHtlcnJvci5tZXNzYWdlfSAoaWQ6ICR7dGVzdElkfSlgLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7dHlwZW9mIGVycm9yfSAtICR7ZXJyb3J9IChpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnRzWzBdKSB7XG4gICAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcywgc2Nyb2xsVG8gPSBmYWxzZSwgdmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICB2b2lkIHNjcm9sbENvbnRhaW5lclRlc3RJRHNcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncykuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJ1c2VCYXNlU2VsZWN0b3JcIilcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBnZXRUaW1lTGVmdCA9ICgpID0+IE1hdGgubWF4KGFjdHVhbFRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSksIDApXG4gICAgY29uc3QgZ2V0RWxlbWVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHModGhpcy5pZExvY2F0b3IodGVzdElkKSlcblxuICAgICAgaWYgKHZpc2libGUgIT09IHRydWUgJiYgdmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmb3VuZEVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgdGhpcy5pc0VsZW1lbnREaXNwbGF5ZWQoZWxlbWVudClcblxuICAgICAgICBpZiAodmlzaWJsZSAmJiAhaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG4gICAgICAgIGlmICghdmlzaWJsZSAmJiBpc0Rpc3BsYXllZCkgY29udGludWVcblxuICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbHRlcmVkRWxlbWVudHNcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50cyA9IFtdXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGltZUxlZnQgPSBhY3R1YWxUaW1lb3V0ID09IDAgPyAwIDogZ2V0VGltZUxlZnQoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGltZUxlZnQgPT0gMCkge1xuICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkud2FpdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9LCB0aW1lTGVmdClcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIlRpbWVvdXRFcnJvclwiICYmIGdldFRpbWVMZWZ0KCkgPiAwKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBDb3VsZG4ndCBnZXQgZWxlbWVudHMgd2l0aCBpZDogJHt0ZXN0SWR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gaWQgbG9jYXRvciBmb3IgdGhlIGFjdGl2ZSBBcHBpdW0gY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBUZXN0IGlkIG9yIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEByZXR1cm5zIHtCeX0gU2VsZW5pdW0vQXBwaXVtIGxvY2F0b3IuXG4gICAqL1xuICBpZExvY2F0b3IodGVzdElkKSB7XG4gICAgaWYgKHRoaXMuaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpKSB7XG4gICAgICByZXR1cm4gbmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpKVxuICAgIH1cblxuICAgIHJldHVybiBCeS5pZCh0ZXN0SWQpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbmF0aXZlIEFuZHJvaWQgdmlzaWJsZSB0ZXh0IG9yIGFuIGFjY2Vzc2liaWxpdHkgbGFiZWwsIHNjcm9sbGluZyBpdCBpbnRvIHZpZXcgd2hlbiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTmF0aXZlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgdGV4dC5cbiAgICovXG4gIGFzeW5jIGZpbmRCeU5hdGl2ZVRleHQoZXhwZWN0ZWRUZXh0LCBhcmdzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5kQnlOYXRpdmVUZXh0IGlzIG9ubHkgc3VwcG9ydGVkIGZvciBuYXRpdmUgQW5kcm9pZCBBcHBpdW0gc2Vzc2lvbnNcIilcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvcnMgPSBbYW5kcm9pZFRleHRDb250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCksIGFuZHJvaWREZXNjcmlwdGlvbkNvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KV1cbiAgICBjb25zdCBkaXJlY3RGaW5kID0gYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBzZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBzZWxlY3RvcikpXG5cbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHJldHVybiBlbGVtZW50c1swXVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYnkgdGV4dCBvciBhY2Nlc3NpYmlsaXR5IGxhYmVsOiAke2V4cGVjdGVkVGV4dH1gKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhOYXRpdmVJbXBsaWNpdFdhaXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xXaXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGB0ZXh0IG9yIGFjY2Vzc2liaWxpdHkgbGFiZWw6ICR7ZXhwZWN0ZWRUZXh0fWAsXG4gICAgICAgIGRpcmVjdEZpbmQsXG4gICAgICAgIHNjcm9sbFNlbGVjdG9yczogc2VsZWN0b3JzXG4gICAgICB9LCB7Li4uYXJncywgc2Nyb2xsVG86IGFyZ3Muc2Nyb2xsVG8gPz8gdHJ1ZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCBhIHRlc3QgaWQgb3ducyBleHBlY3RlZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgdW5kZXIgdGhlIHRlc3QgaWQuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclRlc3RJRFRleHQodGVzdElkLCBleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIGF3YWl0IHN1cGVyLndhaXRGb3JUZXN0SURUZXh0KHRlc3RJZCwgZXhwZWN0ZWRUZXh0LCBhcmdzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3JzID0gbmF0aXZlVGVzdElEVGV4dFNlbGVjdG9ycyh0ZXN0SWQsIGV4cGVjdGVkVGV4dClcbiAgICBjb25zdCBzY29wZWRUZXh0WHBhdGggPSBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIHNlbGVjdG9yKSlcblxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2VyZSBmb3VuZCBieSBpZCAke3Rlc3RJZH0gd2l0aCB0ZXh0ICR7ZXhwZWN0ZWRUZXh0fWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnRzWzBdKSByZXR1cm4gZWxlbWVudHNbMF1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2NvcGVkVGV4dEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkueHBhdGgoc2NvcGVkVGV4dFhwYXRoKSlcbiAgICAgIGlmIChzY29wZWRUZXh0RWxlbWVudHNbMF0pIHJldHVybiBzY29wZWRUZXh0RWxlbWVudHNbMF1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGJ5IGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLndpdGhOYXRpdmVJbXBsaWNpdFdhaXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBuYXRpdmVUZXN0SURUZXh0U2Nyb2xsU2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgICAgfSwgey4uLmFyZ3MsIHNjcm9sbFRvOiBhcmdzLnNjcm9sbFRvID8/IHRydWV9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBuYXRpdmUgQW5kcm9pZCBjb250cm9sIGJ5IHJlc291cmNlIGlkLCBzY3JvbGxpbmcgaXQgaW50byB2aWV3IGZpcnN0IHdoZW4gcmVxdWVzdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc10gT3B0aW9uYWwgbG9va3VwIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIG5hdGl2ZSBlbGVtZW50LlxuICAgKi9cbiAgYXN5bmMgZmluZE5hdGl2ZUNvbnRyb2xCeUlkKHRlc3RJZCwgYXJncyA9IHt9KSB7XG4gICAgY29uc3QgZGlyZWN0RmluZCA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZmluZEJ5SWQodGVzdElkLCB7Li4uYXJncywgdGltZW91dDogMCwgc2Nyb2xsVG86IGZhbHNlfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhOYXRpdmVJbXBsaWNpdFdhaXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xXaXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBpZDogJHt0ZXN0SWR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBbYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpXVxuICAgICAgfSwgYXJncylcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgbmF0aXZlIGNvbnRyb2wsIHRyeWluZyBkaXJlY3QgbG9va3VwLCBVaVNjcm9sbGFibGUsIGFuZCB2aWV3cG9ydCBnZXN0dXJlIHNjcm9sbGluZy5cbiAgICogQHBhcmFtIHtOYXRpdmVDb250cm9sTG9va3VwfSBsb29rdXAgTG9va3VwIGNhbGxiYWNrcyBhbmQgZGlhZ25vc3RpY3MuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcobG9va3VwLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcyA9IFtdLCBzY3JvbGxUbyA9IHRydWUsIHRpbWVvdXQgPSAxMDAwMH0gPSBhcmdzXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGxldCBhdHRlbXB0ZWRVaVNlbGVjdG9yU2Nyb2xsID0gZmFsc2VcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IGxhc3RFcnJvclxuXG4gICAgZG8ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGxvb2t1cC5kaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgICBpZiAoIWF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwpIHtcbiAgICAgICAgICBhdHRlbXB0ZWRVaVNlbGVjdG9yU2Nyb2xsID0gdHJ1ZVxuICAgICAgICAgIGZvciAoY29uc3Qgc2Nyb2xsU2VsZWN0b3Igb2YgbG9va3VwLnNjcm9sbFNlbGVjdG9ycykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVVaVNlbGVjdG9ySW50b1ZpZXcoc2Nyb2xsU2VsZWN0b3IsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICB2b2lkIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgbG9va3VwLmRpcmVjdEZpbmQoKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgICAgdm9pZCBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhWaWV3cG9ydFNjYW4obG9va3VwLmRpcmVjdEZpbmQsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgICBsYXN0RXJyb3IgPSBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aW1lb3V0ID09PSAwKSBicmVha1xuICAgICAgYXdhaXQgd2FpdCgxMDApXG4gICAgfSB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXQpXG5cbiAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSAke2xvb2t1cC5kZXNjcmlwdGlvbn1gLCBsYXN0RXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoZXMgbmF0aXZlIGNvbnRlbnQgYXJvdW5kIHRoZSBjdXJyZW50IHZpZXdwb3J0IHNvIHJldGFpbmVkIG9mZnNldHMgYW5kXG4gICAqIGJlbG93LWZvbGQgdGFyZ2V0cyBhcmUgYm90aCByZWFjaGFibGUgd2l0aG91dCBleGhhdXN0aW5nIHRoZSB0aW1lb3V0IGJ1ZGdldC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gZGlyZWN0RmluZCBMb29rdXAgdG8gcmV0cnkgYWZ0ZXIgZWFjaCBzY3JvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNjcm9sbENvbnRhaW5lclRlc3RJRHMgTmF0aXZlIHRlc3QgSURzIHRoYXQgbWF5IGlkZW50aWZ5IHNjcm9sbCBjb250YWluZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIGNvbnRyb2wuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbFdpdGhWaWV3cG9ydFNjYW4oZGlyZWN0RmluZCwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcykge1xuICAgIGNvbnN0IHVwU2Nyb2xsU3RhdGUgPSB0aGlzLm5ld05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGUoKVxuICAgIGNvbnN0IGRvd25TY3JvbGxTdGF0ZSA9IHRoaXMubmV3TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZSgpXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgTUFYX05BVElWRV9WSUVXUE9SVF9TQ1JPTExfU1RFUFM7IGluZGV4ICs9IDEpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlVmlld3BvcnQodXBTY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgXCJ1cFwiKVxuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZGlyZWN0RmluZCgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIWlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZVZpZXdwb3J0KGRvd25TY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgXCJkb3duXCIpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBuYXRpdmUgdmlld3BvcnQgc2NhblwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlfSBGcmVzaCBzY3JvbGwgZmFsbGJhY2sgc3RhdGUuXG4gICAqL1xuICBuZXdOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0cnlFbGVtZW50U2Nyb2xsOiB0cnVlLFxuICAgICAgdHJ5Vmlld3BvcnRTY3JvbGw6IHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBleHBsaWNpdCBuYXRpdmUgcG9sbGluZyB3aXRob3V0IEFwcGl1bSdzIGltcGxpY2l0IHdhaXQgZXh0ZW5kaW5nIGV2ZXJ5IGZhaWxlZCBwcm9iZS5cbiAgICogQHRlbXBsYXRlIFRSZXN1bHQgUmVzdWx0IHR5cGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbXBsaWNpdFdhaXRNcyBJbXBsaWNpdCB3YWl0IGR1cmF0aW9uIHRvIGFwcGx5IGR1cmluZyB0aGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUUmVzdWx0Pn0gY2FsbGJhY2sgV29yayB0aGF0IG93bnMgaXRzIG93biBwb2xsaW5nIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFRSZXN1bHQ+fSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoTmF0aXZlSW1wbGljaXRXYWl0KGltcGxpY2l0V2FpdE1zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHRpbWVvdXRzID0gLyoqIEB0eXBlIHtOYXRpdmVUaW1lb3V0c30gKi8gKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuZ2V0VGltZW91dHMoKSlcblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoLyoqIEB0eXBlIHtOYXRpdmVUaW1lb3V0T3B0aW9uc30gKi8gKHtpbXBsaWNpdDogaW1wbGljaXRXYWl0TXN9KSlcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cygvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRPcHRpb25zfSAqLyAoe2ltcGxpY2l0OiB0aW1lb3V0cy5pbXBsaWNpdH0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSB2aXNpYmxlIG5hdGl2ZSB2aWV3cG9ydCB3aGVuIFVpU2Nyb2xsYWJsZSBjYW5ub3QgaWRlbnRpZnkgdGhlIG93bmluZyBTY3JvbGxWaWV3LlxuICAgKiBAcGFyYW0ge05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGV9IHNjcm9sbFN0YXRlIFBlci1sb29rdXAgQXBwaXVtIHNjcm9sbCBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxEaXJlY3Rpb259IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gc2Nyb2xsIHRoZSBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgQXBwaXVtIHBlcmZvcm1zIHRoZSBnZXN0dXJlLlxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsTmF0aXZlVmlld3BvcnQoc2Nyb2xsU3RhdGUsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMsIGRpcmVjdGlvbikge1xuICAgIGNvbnN0IHdpbmRvd1JlY3QgPSAvKiogQHR5cGUge05hdGl2ZVdpbmRvd1JlY3R9ICovIChhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLndpbmRvdygpLmdldFJlY3QoKSlcbiAgICBjb25zdCBob3Jpem9udGFsSW5zZXQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpbmRvd1JlY3Qud2lkdGggKiAwLjEpKVxuICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2luZG93UmVjdC5oZWlnaHQgKiAwLjIpKVxuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgd2luZG93UmVjdC53aWR0aCAtIGhvcml6b250YWxJbnNldCAqIDIpXG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3dSZWN0LmhlaWdodCAqIDAuNikpXG5cbiAgICBpZiAoc2Nyb2xsU3RhdGUudHJ5RWxlbWVudFNjcm9sbCAmJiBzY3JvbGxDb250YWluZXJUZXN0SURzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3Qgc2Nyb2xsQ29udGFpbmVyVGVzdElEIG9mIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkaWRTY3JvbGwgPSBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZUVsZW1lbnQoc2Nyb2xsQ29udGFpbmVyVGVzdElELCBkaXJlY3Rpb24pXG4gICAgICAgICAgaWYgKGRpZFNjcm9sbCkgcmV0dXJuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgc2Nyb2xsU3RhdGUudHJ5RWxlbWVudFNjcm9sbCA9IGZhbHNlXG4gICAgICAgICAgaWYgKCFpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcIm1vYmlsZTogc2Nyb2xsR2VzdHVyZVwiLCB7XG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBsZWZ0OiBob3Jpem9udGFsSW5zZXQsXG4gICAgICAgICAgcGVyY2VudDogMC43NSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgd2lkdGhcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGRpZFNjcm9sbCA9PT0gdHJ1ZSkgcmV0dXJuXG4gICAgICAgIHNjcm9sbFN0YXRlLnRyeVZpZXdwb3J0U2Nyb2xsID0gZmFsc2VcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNjcm9sbFN0YXRlLnRyeVZpZXdwb3J0U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgaWYgKCFpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjZW50ZXJYID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnggKyB3aW5kb3dSZWN0LndpZHRoIC8gMilcbiAgICBjb25zdCBzdGFydFkgPSBNYXRoLmZsb29yKHdpbmRvd1JlY3QueSArIHdpbmRvd1JlY3QuaGVpZ2h0ICogKGRpcmVjdGlvbiA9PT0gXCJkb3duXCIgPyAwLjc4IDogMC4yOCkpXG4gICAgY29uc3QgZW5kWSA9IE1hdGguZmxvb3Iod2luZG93UmVjdC55ICsgd2luZG93UmVjdC5oZWlnaHQgKiAoZGlyZWN0aW9uID09PSBcImRvd25cIiA/IDAuMjggOiAwLjc4KSlcblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZShuZXcgQ29tbWFuZChOYW1lLkFDVElPTlMpLnNldFBhcmFtZXRlcihcImFjdGlvbnNcIiwgW1xuICAgICAge1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAge2R1cmF0aW9uOiAxMDAsIG9yaWdpbjogT3JpZ2luLlZJRVdQT1JULCB0eXBlOiBcInBvaW50ZXJNb3ZlXCIsIHg6IGNlbnRlclgsIHk6IHN0YXJ0WX0sXG4gICAgICAgICAge2J1dHRvbjogMCwgdHlwZTogXCJwb2ludGVyRG93blwifSxcbiAgICAgICAgICB7ZHVyYXRpb246IDI1MCwgb3JpZ2luOiBPcmlnaW4uVklFV1BPUlQsIHR5cGU6IFwicG9pbnRlck1vdmVcIiwgeDogY2VudGVyWCwgeTogZW5kWX0sXG4gICAgICAgICAge2J1dHRvbjogMCwgdHlwZTogXCJwb2ludGVyVXBcIn1cbiAgICAgICAgXSxcbiAgICAgICAgaWQ6IFwibmF0aXZlIHNjcm9sbCBmaW5nZXJcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHBvaW50ZXJUeXBlOiBcInRvdWNoXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogXCJwb2ludGVyXCJcbiAgICAgIH1cbiAgICBdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIGEgc3BlY2lmaWMgbmF0aXZlIEFuZHJvaWQgZWxlbWVudCBieSB0ZXN0IGlkIHdoZW4gQXBwaXVtIGV4cG9zZXMgaXQgYXMgYSBzY3JvbGwgY29udGFpbmVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge05hdGl2ZVZpZXdwb3J0U2Nyb2xsRGlyZWN0aW9ufSBkaXJlY3Rpb24gRGlyZWN0aW9uIHRvIHNjcm9sbCB0aGUgY29udGVudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgQXBwaXVtIHJlcG9ydGVkIG1vcmUgY29udGVudCB0byBzY3JvbGwuXG4gICAqL1xuICBhc3luYyBzY3JvbGxOYXRpdmVFbGVtZW50KHRlc3RJZCwgZGlyZWN0aW9uKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkpKVxuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSBlbGVtZW50c1swXVxuXG4gICAgaWYgKCFzY3JvbGxFbGVtZW50KSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcIm1vYmlsZTogc2Nyb2xsR2VzdHVyZVwiLCB7XG4gICAgICBkaXJlY3Rpb24sXG4gICAgICBlbGVtZW50SWQ6IGF3YWl0IHNjcm9sbEVsZW1lbnQuZ2V0SWQoKSxcbiAgICAgIHBlcmNlbnQ6IDAuNzVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRpZFNjcm9sbCA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGFuIG9mZnNjcmVlbiBBbmRyb2lkIGNvbnRyb2wgaW50byBhIFNjcm9sbFZpZXctYmFja2VkIG5hdGl2ZSBoaWVyYXJjaHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1aVNlbGVjdG9yIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IGNvbnRyb2wuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNjcm9sbENvbnRhaW5lclRlc3RJRHMgTmF0aXZlIHRlc3QgSURzIHRoYXQgbWF5IGlkZW50aWZ5IHNjcm9sbCBjb250YWluZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgVWlBdXRvbWF0b3IgYXR0ZW1wdHMgdGhlIHNjcm9sbC5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZVVpU2VsZWN0b3JJbnRvVmlldyh1aVNlbGVjdG9yLCBzY3JvbGxDb250YWluZXJUZXN0SURzKSB7XG4gICAgY29uc3Qgc2Nyb2xsYWJsZVNlbGVjdG9ycyA9IFtcbiAgICAgIC4uLnNjcm9sbENvbnRhaW5lclRlc3RJRHMubWFwKChzY3JvbGxDb250YWluZXJUZXN0SUQpID0+IGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3Ioc2Nyb2xsQ29udGFpbmVyVGVzdElEKSksXG4gICAgICBcIm5ldyBVaVNlbGVjdG9yKCkuc2Nyb2xsYWJsZSh0cnVlKVwiXG4gICAgXVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgbGFzdEVycm9yXG5cbiAgICBmb3IgKGNvbnN0IHNjcm9sbGFibGVTZWxlY3RvciBvZiBzY3JvbGxhYmxlU2VsZWN0b3JzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGBuZXcgVWlTY3JvbGxhYmxlKCR7c2Nyb2xsYWJsZVNlbGVjdG9yfSkuc2Nyb2xsSW50b1ZpZXcoJHt1aVNlbGVjdG9yfSlgKSlcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGFzdEVycm9yKSB0aHJvdyBsYXN0RXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzZXNzaW9uIGlzIGEgbmF0aXZlIEFuZHJvaWQgYXBwLCBub3QgQW5kcm9pZCBDaHJvbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIHdoZW4gVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgbG9va3VwIHNob3VsZCBiZSB1c2VkLlxuICAgKi9cbiAgaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybU5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5wbGF0Zm9ybU5hbWVcbiAgICBjb25zdCBicm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuXG4gICAgcmV0dXJuIHR5cGVvZiBwbGF0Zm9ybU5hbWUgPT09IFwic3RyaW5nXCIgJiYgcGxhdGZvcm1OYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYW5kcm9pZFwiICYmICFicm93c2VyTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gc2VydmVyQXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgYnVpbGRTZXJ2ZXJVcmwoc2VydmVyQXJncykge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXJBcmdzLmFkZHJlc3MgPz8gXCIxMjcuMC4wLjFcIlxuICAgIGNvbnN0IHBvcnQgPSBzZXJ2ZXJBcmdzLnBvcnQgPz8gNDcyM1xuICAgIGNvbnN0IGJhc2VQYXRoID0gc2VydmVyQXJncy5iYXNlUGF0aCA/IChzZXJ2ZXJBcmdzLmJhc2VQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gc2VydmVyQXJncy5iYXNlUGF0aCA6IGAvJHtzZXJ2ZXJBcmdzLmJhc2VQYXRofWApIDogXCJcIlxuXG4gICAgcmV0dXJuIGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9JHtiYXNlUGF0aH1gXG4gIH1cbn1cbiJdfQ==
949
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDdEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRCxNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQTtBQUMxQyxNQUFNLDBDQUEwQyxHQUFHLEdBQUcsQ0FBQTtBQUV0RDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFLO0lBQ3pCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBSztJQUM3QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDMUQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsTUFBTTtJQUM5QyxPQUFPLGlEQUFpRCxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFBO0FBQ3JHLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLFlBQVk7SUFDdEQsT0FBTyxrQ0FBa0MsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQTtBQUM3RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQ0FBa0MsQ0FBQyxZQUFZO0lBQzdELE9BQU8seUNBQXlDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUE7QUFDcEYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHlCQUF5QixDQUFDLEtBQUs7SUFDdEMsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTNDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0FBQy9HLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUywrQkFBK0IsQ0FBQyxLQUFLO0lBQzVDLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUUzQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDO1FBQ3JELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLHFDQUFxQyxDQUFDO1FBQzdELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUE7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjO0lBQy9ELE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFBO0lBRWpDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsTUFBTSxTQUFTLGNBQWMsRUFBRSxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVELE9BQU8sR0FBRyxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFBO0FBQ3BFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsYUFBYTtJQUMzRCxPQUFPLEdBQUcsZ0JBQWdCLGtCQUFrQixhQUFhLEdBQUcsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBSztJQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksS0FBSyxHQUFHLENBQUE7SUFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFBO0lBRTdDLE9BQU8sVUFBVSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFBO0FBQ2xGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLFlBQVk7SUFDbEQsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDN0MsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDN0MsTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsVUFBVSwyRUFBMkUsVUFBVSxZQUFZLFVBQVUsR0FBRyxDQUFBO0lBQ3JLLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixJQUFJLGdDQUFnQyxJQUFJLElBQUksQ0FBQTtJQUV0RixPQUFPLE9BQU8saUJBQWlCLFFBQVEsYUFBYSxXQUFXLGlCQUFpQixRQUFRLGFBQWEsR0FBRyxDQUFBO0FBQzFHLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMseUJBQXlCLENBQUMsTUFBTSxFQUFFLFlBQVk7SUFDckQsTUFBTSxnQkFBZ0IsR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUxRCxPQUFPO1FBQ0wsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsMkJBQTJCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEYsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsa0NBQWtDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0Ysb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsMkJBQTJCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakYsb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsa0NBQWtDLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDekYsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsK0JBQStCLENBQUMsTUFBTSxFQUFFLFlBQVk7SUFDM0QsT0FBTztRQUNMLEdBQUcseUJBQXlCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQztRQUNsRCx5QkFBeUIsQ0FBQyxNQUFNLENBQUM7S0FDbEMsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUNBQWlDLENBQUMsRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUseUJBQXlCLENBQUMsRUFBQztJQUMzSixNQUFNLG1CQUFtQixHQUFHLFlBQVksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFBO0lBRW5FLElBQUksT0FBTyxtQkFBbUIsS0FBSyxRQUFRLElBQUksbUJBQW1CLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUYsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUE7SUFFOUMsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2pGLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUN4RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBRTlFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEYsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUU5QyxNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtJQUV4RSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQzNDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHO1FBQ25DLEdBQUcsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUk7S0FDTCxDQUFBO0lBRUQsT0FBTyxXQUFXLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVDQUF1QyxDQUFDLEVBQUMsWUFBWSxFQUFDO0lBQ3BFLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUE7SUFFOUMsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVM7UUFBRSxPQUFNO0lBQ3hGLElBQUksT0FBTyxZQUFZLENBQUMsV0FBVyxLQUFLLFFBQVEsSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTTtJQUMvRixJQUFJLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLFNBQVM7UUFBRSxPQUFNO0lBQ2xFLElBQUksWUFBWSxDQUFDLGlCQUFpQixLQUFLLFNBQVM7UUFBRSxPQUFNO0lBRXhELFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLDBDQUEwQyxDQUFBO0FBQ3ZGLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsWUFBWTtJQUN4RCxJQUFJLFlBQVksRUFBRSxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRWpELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO0lBQzFDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUUsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUE7SUFFNUUsT0FBTyxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUE7QUFDcEUsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNIOzs7Ozs7O0dBT0c7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLGVBQWU7SUFBekQ7O1FBQ0UsaUNBQWlDO1FBQ2pDLHNCQUFpQixHQUFHLFNBQVMsQ0FBQTtJQXd2Qi9CLENBQUM7SUF0dkJDOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLFVBQVUsR0FBRyxFQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFBO1FBRXZELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEQsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQTtRQUNqRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUE7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFlBQVksR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFBO1lBRWxFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFBO1lBQ3pFLENBQUM7WUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ2hELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNsRCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFcEYsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMxRCxZQUFZLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFBO1FBQ3JELENBQUM7UUFDRCxJQUFJLFlBQVksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0MsWUFBWSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUE7UUFDL0IsQ0FBQztRQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLGlDQUFpQyxDQUFDO1lBQy9ELFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDckMsWUFBWTtTQUNiLENBQUMsQ0FBQTtRQUNGLHVDQUF1QyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQTtRQUV2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFekQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDeEMsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO1lBRXZDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFDNUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFBO1lBQ3JDLE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDcEIsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUM3QixNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLHFDQUFxQyxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLG9EQUFvRCxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDdk0sQ0FBQztZQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFBO1lBQzdCLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUE7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsS0FBSyxDQUFDLHdCQUF3QjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtZQUFFLE9BQU07UUFFbkMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUE7UUFFaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQTtRQUNsQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQjtRQUNwQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUE7UUFFdEYsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFNO1FBRXhCLE1BQU0sS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFBO1FBQzVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQTtRQUN0RixNQUFNLFNBQVMsR0FBRyxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsQ0FBQTtRQUU5RixJQUFJLFNBQVMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzlCLElBQUksT0FBTyxDQUFBO1lBRVgsSUFBSSxDQUFDO2dCQUNILE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkUsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLEVBQUUsQ0FBQTtZQUNYLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUE7WUFFckIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtnQkFDbkUsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUE7Z0JBRTlELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQ3BELENBQUM7WUFFRCxPQUFPLFVBQVUsQ0FBQTtRQUNuQixDQUFDO1FBRUQsT0FBTyxNQUFNLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJO1FBQzdCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxJQUFJLGlCQUFpQixDQUFBO1FBRXZFLElBQUksY0FBYyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzdCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLGFBQWEsQ0FBQTtZQUNyRSxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNsRSxDQUFDO1FBQ0QsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDNUIsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzFDLENBQUM7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJO1FBQzFCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBQyxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQTtZQUN0RCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0YsT0FBTyxLQUFLLENBQUE7WUFDZCxDQUFDO1lBRUQsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQzNDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUM1Qix3REFBd0Q7UUFDeEQsSUFBSSxRQUFRLENBQUE7UUFFWixJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzFELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sY0FBYyxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDLE9BQU8sdUJBQXVCLE1BQU0sR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQzNHLENBQUM7WUFFRCxNQUFNLGNBQWMsQ0FBQyxHQUFHLE9BQU8sS0FBSyxNQUFNLEtBQUssdUJBQXVCLE1BQU0sR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3pGLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sb0NBQW9DLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDdkcsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqQixNQUFNLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUE7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsMEJBQTBCLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDakgsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUMxQyxNQUFNLEVBQUMsc0JBQXNCLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxPQUFPLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQTtRQUM3RixLQUFLLHNCQUFzQixDQUFBO1FBQzNCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssaUJBQWlCLENBQUMsQ0FBQTtRQUNyRixJQUFJLGFBQWEsQ0FBQTtRQUVqQixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQTtRQUN0QyxDQUFDO2FBQU0sQ0FBQztZQUNOLGFBQWEsR0FBRyxPQUFPLENBQUE7UUFDekIsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFN0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzVCLE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQy9FLE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzdCLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBRWhHLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzFDLE9BQU8sYUFBYSxDQUFBO1lBQ3RCLENBQUM7WUFFRCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQTtZQUUzQixLQUFLLE1BQU0sT0FBTyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFFMUQsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXO29CQUFFLFNBQVE7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLElBQUksV0FBVztvQkFBRSxTQUFRO2dCQUVyQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDaEMsQ0FBQztZQUVELE9BQU8sZ0JBQWdCLENBQUE7UUFDekIsQ0FBQyxDQUFBO1FBQ0Qsd0RBQXdEO1FBQ3hELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUVqQixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtZQUV2RCxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2xCLFFBQVEsR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFBO2dCQUNoQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO3dCQUN4QyxRQUFRLEdBQUcsTUFBTSxXQUFXLEVBQUUsQ0FBQTt3QkFFOUIsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtvQkFDNUIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO2dCQUNkLENBQUM7Z0JBRUQsTUFBSztZQUNQLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksS0FBSyxZQUFZLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxjQUFjLElBQUksV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzdGLFNBQVE7Z0JBQ1YsQ0FBQztnQkFFRCxNQUFNLGNBQWMsQ0FBQyxnREFBZ0QsTUFBTSxLQUFLLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQzFJLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzNDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBTztRQUM5QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUE7UUFFdEYsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUU3QixPQUFPLE1BQU0sT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDOUIsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEQsT0FBTyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdkQsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUM1Qix3REFBd0Q7UUFDeEQsSUFBSSxRQUFRLENBQUE7UUFFWixJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUM3QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO2dCQUMzQixNQUFNLGNBQWMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDN0YsQ0FBQztZQUVELE1BQU0sY0FBYyxDQUFDLEdBQUcsT0FBTyxLQUFLLE1BQU0sS0FBSyxTQUFTLE1BQU0sR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzNFLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sc0JBQXNCLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDekYsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqQixNQUFNLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUE7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ25HLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQzdCLE1BQU0sRUFBQyxzQkFBc0IsRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBQzdGLEtBQUssc0JBQXNCLENBQUE7UUFDM0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ3JGLElBQUksYUFBYSxDQUFBO1FBRWpCLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFBO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ04sYUFBYSxHQUFHLE9BQU8sQ0FBQTtRQUN6QixDQUFDO1FBRUQsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUU3RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDNUIsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDL0UsTUFBTSxXQUFXLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtZQUVwRixJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUMxQyxPQUFPLGFBQWEsQ0FBQTtZQUN0QixDQUFDO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUE7WUFFM0IsS0FBSyxNQUFNLE9BQU8sSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBRTFELElBQUksT0FBTyxJQUFJLENBQUMsV0FBVztvQkFBRSxTQUFRO2dCQUNyQyxJQUFJLENBQUMsT0FBTyxJQUFJLFdBQVc7b0JBQUUsU0FBUTtnQkFFckMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ2hDLENBQUM7WUFFRCxPQUFPLGdCQUFnQixDQUFBO1FBQ3pCLENBQUMsQ0FBQTtRQUNELHdEQUF3RDtRQUN4RCxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUE7UUFFakIsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7WUFFdkQsSUFBSSxDQUFDO2dCQUNILElBQUksUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNsQixRQUFRLEdBQUcsTUFBTSxXQUFXLEVBQUUsQ0FBQTtnQkFDaEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTt3QkFDeEMsUUFBUSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUE7d0JBRTlCLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7b0JBQzVCLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQTtnQkFDZCxDQUFDO2dCQUVELE1BQUs7WUFDUCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM3RixTQUFRO2dCQUNWLENBQUM7Z0JBRUQsTUFBTSxjQUFjLENBQUMsa0NBQWtDLE1BQU0sS0FBSyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUM1SCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMzQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLE1BQU07UUFDZCxJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQzFFLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUE7UUFDMUYsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsMkJBQTJCLENBQUMsWUFBWSxDQUFDLEVBQUUsa0NBQWtDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtRQUMvRyxNQUFNLFVBQVUsR0FBRyxLQUFLLElBQUksRUFBRTtZQUM1QixLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtnQkFFakcsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDN0MsQ0FBQztZQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELFlBQVksRUFBRSxDQUFDLENBQUE7UUFDOUYsQ0FBQyxDQUFBO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDckQsT0FBTyxNQUFNLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztnQkFDL0MsV0FBVyxFQUFFLGdDQUFnQyxZQUFZLEVBQUU7Z0JBQzNELFVBQVU7Z0JBQ1YsZUFBZSxFQUFFLFNBQVM7YUFDM0IsRUFBRSxFQUFDLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBQyxDQUFDLENBQUE7UUFDaEQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUM7WUFDdEMsTUFBTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN6RCxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUNqRSxNQUFNLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDcEUsTUFBTSxVQUFVLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDNUIsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7Z0JBRWpHLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sc0JBQXNCLE1BQU0sY0FBYyxZQUFZLEVBQUUsQ0FBQyxDQUFBO2dCQUNuSCxDQUFDO2dCQUNELElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFBRSxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNyQyxDQUFDO1lBRUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO1lBQzVGLElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFFdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsTUFBTSxjQUFjLFlBQVksRUFBRSxDQUFDLENBQUE7UUFDeEYsQ0FBQyxDQUFBO1FBRUQsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzlDLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDO2dCQUN4QyxXQUFXLEVBQUUsTUFBTSxNQUFNLGNBQWMsWUFBWSxFQUFFO2dCQUNyRCxVQUFVO2dCQUNWLGVBQWUsRUFBRSwrQkFBK0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO2FBQ3ZFLEVBQUUsRUFBQyxHQUFHLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ2hELENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUMzQyxNQUFNLFVBQVUsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBQyxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBRWxHLE9BQU8sTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3JELE9BQU8sTUFBTSxJQUFJLENBQUMsOEJBQThCLENBQUM7Z0JBQy9DLFdBQVcsRUFBRSxPQUFPLE1BQU0sRUFBRTtnQkFDNUIsVUFBVTtnQkFDVixlQUFlLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNyRCxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsOEJBQThCLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3BELE1BQU0sRUFBQyxzQkFBc0IsR0FBRyxFQUFFLEVBQUUsUUFBUSxHQUFHLElBQUksRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBQzVFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUM1QixJQUFJLHlCQUF5QixHQUFHLEtBQUssQ0FBQTtRQUNyQyxzQkFBc0I7UUFDdEIsSUFBSSxTQUFTLENBQUE7UUFFYixHQUFHLENBQUM7WUFDRixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUNsQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDO29CQUFFLE1BQU0sS0FBSyxDQUFBO2dCQUNsRCxTQUFTLEdBQUcsS0FBSyxDQUFBO1lBQ25CLENBQUM7WUFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO29CQUMvQix5QkFBeUIsR0FBRyxJQUFJLENBQUE7b0JBQ2hDLEtBQUssTUFBTSxjQUFjLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO3dCQUNwRCxJQUFJLENBQUM7NEJBQ0gsTUFBTSxJQUFJLENBQUMsOEJBQThCLENBQUMsY0FBYyxFQUFFLHNCQUFzQixDQUFDLENBQUE7d0JBQ25GLENBQUM7d0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzs0QkFDZixLQUFLLEtBQUssQ0FBQTt3QkFDWixDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLENBQUM7b0JBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtnQkFDbEMsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUM7d0JBQUUsTUFBTSxLQUFLLENBQUE7b0JBQ2xELEtBQUssS0FBSyxDQUFBO2dCQUNaLENBQUM7Z0JBRUQsSUFBSSxDQUFDO29CQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxDQUFBO2dCQUNoRyxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQzt3QkFBRSxNQUFNLEtBQUssQ0FBQTtvQkFDbEQsU0FBUyxHQUFHLEtBQUssQ0FBQTtnQkFDbkIsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLE9BQU8sS0FBSyxDQUFDO2dCQUFFLE1BQUs7WUFDeEIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDakIsQ0FBQyxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLEdBQUcsT0FBTyxFQUFDO1FBRTFDLE1BQU0sY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQTtRQUN0RCxNQUFNLGNBQWMsQ0FBQyxtQ0FBbUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDM0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCO1FBQ3hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFBO1FBQ3pELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFBO1FBRTNELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxnQ0FBZ0MsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekUsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFBO1lBRTVFLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sVUFBVSxFQUFFLENBQUE7WUFDM0IsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQztvQkFBRSxNQUFNLEtBQUssQ0FBQTtZQUNwRCxDQUFDO1lBRUQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBRWhGLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sVUFBVSxFQUFFLENBQUE7WUFDM0IsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQztvQkFBRSxNQUFNLEtBQUssQ0FBQTtZQUNwRCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQTtJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCw0QkFBNEI7UUFDMUIsT0FBTztZQUNMLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsaUJBQWlCLEVBQUUsSUFBSTtTQUN4QixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsUUFBUTtRQUNuRCxNQUFNLFFBQVEsR0FBRyw2QkFBNkIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFFakcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsRUFBQyxRQUFRLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hILElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxRQUFRLEVBQUUsQ0FBQTtRQUN6QixDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxTQUFTO1FBQ3ZFLE1BQU0sVUFBVSxHQUFHLCtCQUErQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUMxRyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN2RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsS0FBSyxHQUFHLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUUvRCxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsSUFBSSxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsS0FBSyxNQUFNLHFCQUFxQixJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQzNELElBQUksQ0FBQztvQkFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsRUFBRSxTQUFTLENBQUMsQ0FBQTtvQkFDbEYsSUFBSSxTQUFTO3dCQUFFLE9BQU07Z0JBQ3ZCLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixXQUFXLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFBO29CQUNwQyxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDO3dCQUFFLE1BQU0sS0FBSyxDQUFBO2dCQUMxRCxDQUFDO1lBQ0gsQ0FBQztZQUVELFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7UUFDdEMsQ0FBQztRQUVELElBQUksV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsRUFBRTtvQkFDakYsU0FBUztvQkFDVCxNQUFNO29CQUNOLElBQUksRUFBRSxlQUFlO29CQUNyQixPQUFPLEVBQUUsSUFBSTtvQkFDYixHQUFHO29CQUNILEtBQUs7aUJBQ04sQ0FBQyxDQUFBO2dCQUNGLElBQUksU0FBUyxLQUFLLElBQUk7b0JBQUUsT0FBTTtnQkFDOUIsV0FBVyxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQTtZQUN2QyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixXQUFXLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFBO2dCQUNyQyxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDO29CQUFFLE1BQU0sS0FBSyxDQUFBO1lBQzFELENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDL0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDbEcsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFFaEcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFO1lBQ2xGO2dCQUNFLE9BQU8sRUFBRTtvQkFDUCxFQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUM7b0JBQ3BGLEVBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFDO29CQUNoQyxFQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUM7b0JBQ2xGLEVBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDO2lCQUMvQjtnQkFDRCxFQUFFLEVBQUUsc0JBQXNCO2dCQUMxQixVQUFVLEVBQUU7b0JBQ1YsV0FBVyxFQUFFLE9BQU87aUJBQ3JCO2dCQUNELElBQUksRUFBRSxTQUFTO2FBQ2hCO1NBQ0YsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFNBQVM7UUFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLHNCQUFzQixFQUFFLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMxSCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFakMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUVoQyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLEVBQUU7WUFDakYsU0FBUztZQUNULFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDdEMsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUE7UUFFRixPQUFPLFNBQVMsS0FBSyxJQUFJLENBQUE7SUFDM0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLDhCQUE4QixDQUFDLFVBQVUsRUFBRSxzQkFBc0I7UUFDckUsTUFBTSxtQkFBbUIsR0FBRztZQUMxQixHQUFHLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzFHLG1DQUFtQztTQUNwQyxDQUFBO1FBQ0Qsc0JBQXNCO1FBQ3RCLElBQUksU0FBUyxDQUFBO1FBRWIsS0FBSyxNQUFNLGtCQUFrQixJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxvQkFBb0Isa0JBQWtCLG9CQUFvQixVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0JBQ2hLLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUFFLE9BQU07WUFDakMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQTtZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksU0FBUztZQUFFLE1BQU0sU0FBUyxDQUFBO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCx5QkFBeUI7UUFDdkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFBO1FBQzVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQTtRQUV0RixPQUFPLE9BQU8sWUFBWSxLQUFLLFFBQVEsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUyxJQUFJLENBQUMsV0FBVyxDQUFBO0lBQ3JHLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjLENBQUMsVUFBVTtRQUN2QixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQTtRQUNqRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQTtRQUNwQyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFbkksT0FBTyxVQUFVLE9BQU8sSUFBSSxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUE7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtCdWlsZGVyLCBCeX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQge0NvbW1hbmQsIE5hbWV9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2NvbW1hbmQuanNcIlxuaW1wb3J0IHtPcmlnaW59IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2lucHV0LmpzXCJcbmltcG9ydCB7d2FpdH0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBXZWJEcml2ZXJEcml2ZXIgZnJvbSBcIi4vd2ViZHJpdmVyLWRyaXZlci5qc1wiXG5cbmNvbnN0IE1BWF9OQVRJVkVfVklFV1BPUlRfU0NST0xMX1NURVBTID0gOFxuY29uc3QgREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTID0gMTgwXG5cbi8qKlxuICogQXBwaXVtIHRpbWVvdXQgdmFsdWVzIHJldHVybmVkIGJ5IFNlbGVuaXVtLlxuICogQHR5cGVkZWYge3tpbXBsaWNpdDogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dHNcbiAqL1xuLyoqXG4gKiBBcHBpdW0gdGltZW91dCB1cGRhdGUgc2hhcGUgYWNjZXB0ZWQgYnkgU2VsZW5pdW0uXG4gKiBAdHlwZWRlZiB7e2ltcGxpY2l0PzogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dE9wdGlvbnNcbiAqL1xuLyoqXG4gKiBOYXRpdmUgQXBwaXVtIHdpbmRvdyBkaW1lbnNpb25zLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9fSBOYXRpdmVXaW5kb3dSZWN0XG4gKi9cbi8qKlxuICogVHJhY2tzIG5hdGl2ZSBzY3JvbGwgZmFsbGJhY2tzIHRoYXQgYWxyZWFkeSByZXBvcnRlZCBubyBtb3ZlbWVudC5cbiAqIEB0eXBlZGVmIHt7dHJ5RWxlbWVudFNjcm9sbDogYm9vbGVhbiwgdHJ5Vmlld3BvcnRTY3JvbGw6IGJvb2xlYW59fSBOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlXG4gKi9cbi8qKlxuICogTmF0aXZlIHZpZXdwb3J0IHNjcm9sbCBkaXJlY3Rpb24uXG4gKiBAdHlwZWRlZiB7XCJkb3duXCJ8XCJ1cFwifSBOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvblxuICovXG4vKipcbiAqIE5hdGl2ZSBBbmRyb2lkIGxvb2t1cCB3b3JrIGV4ZWN1dGVkIGJ5IHRoZSBzY3JvbGxpbmcgcG9sbGVyLlxuICogQHR5cGVkZWYge3tkZXNjcmlwdGlvbjogc3RyaW5nLCBkaXJlY3RGaW5kOiAoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Piwgc2Nyb2xsU2VsZWN0b3JzOiBzdHJpbmdbXX19IE5hdGl2ZUNvbnRyb2xMb29rdXBcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge3Vua25vd259IGNhdXNlXG4gKiBAcmV0dXJucyB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fVxuICovXG5mdW5jdGlvbiBlcnJvcldpdGhDYXVzZShtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fSAqLyAobmV3IEVycm9yKG1lc3NhZ2UpKVxuICBlcnJvci5jYXVzZSA9IGNhdXNlXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCByZWdleCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUmVnZXgtc2FmZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCBcIlxcXFwkJlwiKVxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIHF1b3RlZCBVaUF1dG9tYXRvciBKYXZhIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgSmF2YSBzdHJpbmcgdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEphdmEtc3RyaW5nLXNhZmUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSmF2YVN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciBSZWFjdCBOYXRpdmUgYW5kIHBhY2thZ2UtcXVhbGlmaWVkIHJlc291cmNlIElEcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmVzb3VyY2UgaWQgc3VmZml4IHRvIG1hdGNoLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWRNYXRjaGVzKFwiKF58Lio6aWQvKSR7ZXNjYXBlSmF2YVN0cmluZyhlc2NhcGVSZWdFeHAodGVzdElkKSl9JFwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgdmlzaWJsZSB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVpQXV0b21hdG9yIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVaUF1dG9tYXRvciBzZWxlY3RvciBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkge1xuICByZXR1cm4gYG5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb25Db250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBuYXRpdmUgbG9va3VwIGZhaWxlZCBiZWNhdXNlIHRoZSBjb250cm9sIGlzIG5vdCBjdXJyZW50bHkgbW91bnRlZCBvbnNjcmVlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgVmFsdWUgdGhyb3duIGJ5IEFwcGl1bSBsb29rdXAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBuYXRpdmUgc2Nyb2xsaW5nIHNob3VsZCBiZSBhdHRlbXB0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZFwiKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQ291bGRuJ3QgZ2V0IGVsZW1lbnRzXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGhvc3RlZCBBcHBpdW0gZHJpdmVyIGxhY2tzIHRoZSBtb2JpbGUgZ2VzdHVyZSBleHRlbnNpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIFZhbHVlIHRocm93biBieSBBcHBpdW0uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBXM0MgYWN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk5vdFlldEltcGxlbWVudGVkRXJyb3JcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiTWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWRcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiVW5rbm93biBtb2JpbGUgY29tbWFuZFwiKVxufVxuXG4vKipcbiAqIEFkZHMgYSBVaUF1dG9tYXRvciB0ZXh0IHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsdGVyU2VsZWN0b3IgVWlBdXRvbWF0b3IgdGV4dCBvciBkZXNjcmlwdGlvbiBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBmaWx0ZXJTZWxlY3Rvcikge1xuICBjb25zdCBwcmVmaXggPSBcIm5ldyBVaVNlbGVjdG9yKClcIlxuXG4gIGlmICghZmlsdGVyU2VsZWN0b3Iuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBBbmRyb2lkIHNlbGVjdG9yIHRvIHN0YXJ0IHdpdGggJHtwcmVmaXh9LCBnb3QgJHtmaWx0ZXJTZWxlY3Rvcn1gKVxuICB9XG5cbiAgcmV0dXJuIGAke3Jlc291cmNlU2VsZWN0b3J9JHtmaWx0ZXJTZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKX1gXG59XG5cbi8qKlxuICogQWRkcyBhIFVpQXV0b21hdG9yIGNoaWxkIHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGRTZWxlY3RvciBVaUF1dG9tYXRvciBjaGlsZCBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBjaGlsZFNlbGVjdG9yKSB7XG4gIHJldHVybiBgJHtyZXNvdXJjZVNlbGVjdG9yfS5jaGlsZFNlbGVjdG9yKCR7Y2hpbGRTZWxlY3Rvcn0pYFxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGFzIGFuIFhQYXRoIHN0cmluZyBsaXRlcmFsLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCBYUGF0aCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUXVvdGVkIGxpdGVyYWwgb3IgY29uY2F0IGV4cHJlc3Npb24gc2FmZSBmb3IgWFBhdGguXG4gKi9cbmZ1bmN0aW9uIHhwYXRoU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgaWYgKCF2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHJldHVybiBgJyR7dmFsdWV9J2BcblxuICByZXR1cm4gYGNvbmNhdCgke3ZhbHVlLnNwbGl0KCdcIicpLm1hcCgocGFydCkgPT4gYFwiJHtwYXJ0fVwiYCkuam9pbihcIiwgJ1xcXCInLCBcIil9KWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gWFBhdGggc2VsZWN0b3IgZm9yIHRleHQgdW5kZXIgb25lIG5hdGl2ZSBBbmRyb2lkIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSZXNvdXJjZSBpZCBzdWZmaXggdG8gc2NvcGUgdW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlIGluc2lkZSB0aGF0IHNjb3BlLlxuICogQHJldHVybnMge3N0cmluZ30gWFBhdGggc2VsZWN0b3Igc291cmNlLlxuICovXG5mdW5jdGlvbiBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlSWQgPSB4cGF0aFN0cmluZ0xpdGVyYWwodGVzdElkKVxuICBjb25zdCB0ZXh0ID0geHBhdGhTdHJpbmdMaXRlcmFsKGV4cGVjdGVkVGV4dClcbiAgY29uc3QgcmVzb3VyY2VQcmVkaWNhdGUgPSBgKEByZXNvdXJjZS1pZCA9ICR7cmVzb3VyY2VJZH0gb3Igc3Vic3RyaW5nKEByZXNvdXJjZS1pZCwgc3RyaW5nLWxlbmd0aChAcmVzb3VyY2UtaWQpIC0gc3RyaW5nLWxlbmd0aCgke3Jlc291cmNlSWR9KSArIDEpID0gJHtyZXNvdXJjZUlkfSlgXG4gIGNvbnN0IHRleHRQcmVkaWNhdGUgPSBgKGNvbnRhaW5zKEB0ZXh0LCAke3RleHR9KSBvciBjb250YWlucyhAY29udGVudC1kZXNjLCAke3RleHR9KSlgXG5cbiAgcmV0dXJuIGAvLypbJHtyZXNvdXJjZVByZWRpY2F0ZX0gYW5kICR7dGV4dFByZWRpY2F0ZX1dIHwgLy8qWyR7cmVzb3VyY2VQcmVkaWNhdGV9XS8vKlske3RleHRQcmVkaWNhdGV9XWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgc2VsZWN0b3JzIHRoYXQgc2NvcGUgdGV4dCBtYXRjaGluZyB0byBvbmUgbmF0aXZlIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgdGVzdCBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0aGF0IG11c3QgYXBwZWFyIG9uIHRoYXQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVWlBdXRvbWF0b3Igc2VsZWN0b3JzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlU2VsZWN0b3IgPSBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcblxuICByZXR1cm4gW1xuICAgIGNvbWJpbmVBbmRyb2lkU2VsZWN0b3JzKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpLFxuICAgIGNoaWxkQW5kcm9pZFNlbGVjdG9yKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpXG4gIF1cbn1cblxuLyoqXG4gKiBCdWlsZHMgbmF0aXZlIEFuZHJvaWQgc2Nyb2xsIHNlbGVjdG9ycyBmb3IgYSBzY29wZWQgdGV4dCBhc3NlcnRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSB0ZXN0IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgb24gdGhhdCBlbGVtZW50LlxuICogQHJldHVybnMge3N0cmluZ1tdfSBVaUF1dG9tYXRvciBzZWxlY3RvcnMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSxcbiAgICBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcbiAgXVxufVxuXG4vKipcbiAqIEVuc3VyZXMgQ2hyb21lIEFwcGl1bSBjYXBhYmlsaXRpZXMgdXNlIGEgY2FsbGVyLW93bmVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKiBUaGlzIGF2b2lkcyByZXBlYXRlZCBzZXNzaW9ucyBsZWFraW5nIHRlbXAgcHJvZmlsZXMgdW5kZXIgYC90bXBgIGluIENJLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5icm93c2VyTmFtZV1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50ZW1wUm9vdERpcl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDaHJvbWVVc2VyRGF0YURpckNhcGFiaWxpdHkoe2Jyb3dzZXJOYW1lLCBjYXBhYmlsaXRpZXMsIHRlbXBSb290RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidG1wXCIsIFwiYXBwaXVtLWNocm9tZS11c2VyLWRhdGFcIil9KSB7XG4gIGNvbnN0IHJlc29sdmVkQnJvd3Nlck5hbWUgPSBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPz8gYnJvd3Nlck5hbWVcblxuICBpZiAodHlwZW9mIHJlc29sdmVkQnJvd3Nlck5hbWUgIT09IFwic3RyaW5nXCIgfHwgcmVzb2x2ZWRCcm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNocm9tZVwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGxhdGZvcm1OYW1lID0gY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZVxuXG4gIGlmICh0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBjYXBhYmlsaXRpZXNbXCJnb29nOmNocm9tZU9wdGlvbnNcIl1cbiAgY29uc3QgYXJncyA9IEFycmF5LmlzQXJyYXkoY2hyb21lT3B0aW9ucz8uYXJncykgPyBbLi4uY2hyb21lT3B0aW9ucy5hcmdzXSA6IFtdXG5cbiAgaWYgKGFyZ3Muc29tZSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmIGFyZy5zdGFydHNXaXRoKFwiLS11c2VyLWRhdGEtZGlyPVwiKSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBhd2FpdCBmcy5ta2Rpcih0ZW1wUm9vdERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgY29uc3QgdXNlckRhdGFEaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbih0ZW1wUm9vdERpciwgXCJwcm9maWxlLVwiKSlcblxuICBhcmdzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke3VzZXJEYXRhRGlyfWApXG4gIGNhcGFiaWxpdGllc1tcImdvb2c6Y2hyb21lT3B0aW9uc1wiXSA9IHtcbiAgICAuLi4oY2hyb21lT3B0aW9ucyA/PyB7fSksXG4gICAgYXJnc1xuICB9XG5cbiAgcmV0dXJuIHVzZXJEYXRhRGlyXG59XG5cbi8qKlxuICogS2VlcHMgbmF0aXZlIEFwcGl1bSBzZXNzaW9ucyBhbGl2ZSB3aGlsZSB0aGUgUmVhY3QgTmF0aXZlIGFwcCBvcGVucyB0aGUgc3lzdGVtLXRlc3QgV2ViU29ja2V0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTmF0aXZlTmV3Q29tbWFuZFRpbWVvdXRDYXBhYmlsaXR5KHtjYXBhYmlsaXRpZXN9KSB7XG4gIGNvbnN0IHBsYXRmb3JtTmFtZSA9IGNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWVcblxuICBpZiAodHlwZW9mIHBsYXRmb3JtTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJhbmRyb2lkXCIpIHJldHVyblxuICBpZiAodHlwZW9mIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUubGVuZ3RoID4gMCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXNbXCJhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXRcIl0gIT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXMubmV3Q29tbWFuZFRpbWVvdXQgIT09IHVuZGVmaW5lZCkgcmV0dXJuXG5cbiAgY2FwYWJpbGl0aWVzW1wiYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0XCJdID0gREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTXG59XG5cbi8qKlxuICogV2hldGhlciBhIGRyaXZlciBjb25maWcgcmVzb2x2ZXMgdG8gYSBuYXRpdmUgQXBwaXVtIGFwcCBzZXNzaW9uIHJhdGhlciB0aGFuIGEgYnJvd3Nlci5cbiAqIE5hdGl2ZSBhcHAgc2Vzc2lvbnMgbGF1bmNoIGFuIGluc3RhbGxlZCBhcHAgKG5vIGBicm93c2VyTmFtZWApLCBzbyB0aGUgc3lzdGVtLXRlc3QgaGFybmVzc1xuICogbXVzdCBzdGFydCB0aGUgY2xpZW50IFdlYlNvY2tldCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyBhbmQgYWxsb3cgdGhlIG5hdGl2ZS1zYWZlIGNvbm5lY3QgdGltZW91dC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYnJvd3Nlci5qc1wiKS5Ccm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyQ29uZmlnXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FwcGl1bU5hdGl2ZUFwcERyaXZlckNvbmZpZyhkcml2ZXJDb25maWcpIHtcbiAgaWYgKGRyaXZlckNvbmZpZz8udHlwZSAhPT0gXCJhcHBpdW1cIikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgb3B0aW9ucyA9IGRyaXZlckNvbmZpZy5vcHRpb25zID8/IHt9XG4gIGNvbnN0IGJyb3dzZXJOYW1lID0gb3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IG9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICByZXR1cm4gdHlwZW9mIGJyb3dzZXJOYW1lICE9PSBcInN0cmluZ1wiIHx8IGJyb3dzZXJOYW1lLmxlbmd0aCA9PT0gMFxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwcGl1bURyaXZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VydmVyVXJsXSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgdG8gY29ubmVjdCB0by5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3NlcnZlckFyZ3NdIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBBcHBpdW0gc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3VzZURyaXZlcnNdIEFwcGl1bSBkcml2ZXIgbmFtZXMgdG8gbG9hZCB3aGVuIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtjYXBhYmlsaXRpZXNdIERlc2lyZWQgY2FwYWJpbGl0aWVzIGZvciB0aGUgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYnJvd3Nlck5hbWVdIEJyb3dzZXIgbmFtZSBmb3Igd2ViIHNlc3Npb25zLlxuICogQHByb3BlcnR5IHtcImFjY2Vzc2liaWxpdHlJZFwifFwiY3NzXCJ8XCJpZFwifSBbdGVzdElkU3RyYXRlZ3ldIFN0cmF0ZWd5IGZvciByZXNvbHZpbmcgdGVzdCBJRHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rlc3RJZEF0dHJpYnV0ZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyB0aGUgQ1NTIHRlc3QgSUQgc3RyYXRlZ3kuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG5cbi8qKlxuICogQXBwaXVtIGRyaXZlciBiYWNrZWQgYnkgdGhlIEFwcGl1bSBzZXJ2ZXIgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3Qgc2VydmVyQXJncyA9IHsuLi4odGhpcy5vcHRpb25zLnNlcnZlckFyZ3MgPz8ge30pfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VEcml2ZXJzICYmICFzZXJ2ZXJBcmdzLnVzZURyaXZlcnMpIHtcbiAgICAgIHNlcnZlckFyZ3MudXNlRHJpdmVycyA9IHRoaXMub3B0aW9ucy51c2VEcml2ZXJzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5vcHRpb25zLnNlcnZlclVybFxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcHBpdW1Nb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJhcHBpdW1cIilcbiAgICAgIGNvbnN0IGFwcGl1bU1haW4gPSBhcHBpdW1Nb2R1bGUubWFpbiA/PyBhcHBpdW1Nb2R1bGUuZGVmYXVsdD8ubWFpblxuXG4gICAgICBpZiAoIWFwcGl1bU1haW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwaXVtIG1haW4oKSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBhcHBpdW0gcGFja2FnZVwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGl1bVNlcnZlciA9IGF3YWl0IGFwcGl1bU1haW4oc2VydmVyQXJncylcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5idWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKVxuICAgIH1cblxuICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXMgPyB7Li4udGhpcy5vcHRpb25zLmNhcGFiaWxpdGllc30gOiB7fVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5icm93c2VyTmFtZSAmJiAhY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICB9XG4gICAgaWYgKGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSBcIlwiXG4gICAgfVxuXG4gICAgdGhpcy5jaHJvbWVVc2VyRGF0YURpciA9IGF3YWl0IGVuc3VyZUNocm9tZVVzZXJEYXRhRGlyQ2FwYWJpbGl0eSh7XG4gICAgICBicm93c2VyTmFtZTogdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lLFxuICAgICAgY2FwYWJpbGl0aWVzXG4gICAgfSlcbiAgICBlbnN1cmVOYXRpdmVOZXdDb21tYW5kVGltZW91dENhcGFiaWxpdHkoe2NhcGFiaWxpdGllc30pXG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKS51c2luZ1NlcnZlcih0aGlzLnNlcnZlclVybClcblxuICAgIGlmIChPYmplY3Qua2V5cyhjYXBhYmlsaXRpZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGJ1aWxkZXIud2l0aENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYkRyaXZlciA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKVxuXG4gICAgICB0aGlzLnNldFdlYkRyaXZlcih3ZWJEcml2ZXIpXG4gICAgICB0aGlzLmluc3RhbGxFeGl0SGFuZGxlcnMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLnN0b3AoKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5hcHBpdW1TZXJ2ZXI/LmNsb3NlKSB7XG4gICAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgY2xvc2luZyBBcHBpdW0gc2VydmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLmFwcGl1bVNlcnZlcj59ICovICh0aGlzLmFwcGl1bVNlcnZlcikuY2xvc2UoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5hcHBpdW1TZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENocm9tZVVzZXJEYXRhRGlyKClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpIHtcbiAgICBpZiAoIXRoaXMuY2hyb21lVXNlckRhdGFEaXIpIHJldHVyblxuXG4gICAgY29uc3QgY2hyb21lVXNlckRhdGFEaXIgPSB0aGlzLmNocm9tZVVzZXJEYXRhRGlyXG5cbiAgICB0aGlzLmNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgZnMucm0oY2hyb21lVXNlckRhdGFEaXIsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBjb29raWVzLiBTa2lwcGVkIGZvciBuYXRpdmUgYXBwIGNvbnRleHRzIHdoZXJlIGNvb2tpZVxuICAgKiBtYW5hZ2VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgVWlBdXRvbWF0b3IyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVyblxuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlQWxsQ29va2llcygpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgY29uc3QgcGxhdGZvcm1OYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8ucGxhdGZvcm1OYW1lXG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICBjb25zdCBpc0FuZHJvaWQgPSB0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIlxuXG4gICAgaWYgKGlzQW5kcm9pZCAmJiAhYnJvd3Nlck5hbWUpIHtcbiAgICAgIGxldCBlbnRyaWVzXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJpZXMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLmxvZ3MoKS5nZXQoXCJsb2djYXRcIilcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW11cbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9nY2F0TG9ncyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBtZXNzYWdlTWF0Y2ggPSBlbnRyeS5tZXNzYWdlLm1hdGNoKC9eKC4rKSAoXFxkKyk6KFxcZCspICguKykkLylcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VNYXRjaCA/IG1lc3NhZ2VNYXRjaFs0XSA6IGVudHJ5Lm1lc3NhZ2VcblxuICAgICAgICBsb2djYXRMb2dzLnB1c2goYCR7ZW50cnkubGV2ZWwubmFtZX06ICR7bWVzc2FnZX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9nY2F0TG9nc1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5nZXRCcm93c2VyTG9ncygpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElELlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgY29uc3QgdGVzdElkU3RyYXRlZ3kgPSB0aGlzLm9wdGlvbnMudGVzdElkU3RyYXRlZ3kgPz8gXCJhY2Nlc3NpYmlsaXR5SWRcIlxuXG4gICAgaWYgKHRlc3RJZFN0cmF0ZWd5ID09PSBcImNzc1wiKSB7XG4gICAgICBjb25zdCB0ZXN0SWRBdHRyaWJ1dGUgPSB0aGlzLm9wdGlvbnMudGVzdElkQXR0cmlidXRlID8/IFwiZGF0YS10ZXN0aWRcIlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChgWyR7dGVzdElkQXR0cmlidXRlfT0nJHt0ZXN0SUR9J11gLCBhcmdzKVxuICAgIH1cbiAgICBpZiAodGVzdElkU3RyYXRlZ3kgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEJ5SWQodGVzdElELCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGlzIGN1cnJlbnRseSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBoYXNUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwgey4uLmFyZ3MsIHRpbWVvdXQ6IDB9KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzXG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbEJ5QWNjZXNzaWJpbGl0eUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke3R5cGVvZiBlcnJvcn0gLSAke2Vycm9yfSAoYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGxCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCJhY2Nlc3NpYmlsaXR5IGlkXCIsIHRlc3RJZCkpXG5cbiAgICAgIGlmICh2aXNpYmxlICE9PSB0cnVlICYmIHZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IHRoaXMuaXNFbGVtZW50RGlzcGxheWVkKGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJUaW1lb3V0RXJyb3JcIiAmJiBnZXRUaW1lTGVmdCgpID4gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgQ291bGRuJ3QgZ2V0IGVsZW1lbnRzIHdpdGggYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBpcyBkaXNwbGF5ZWQuIEZvciBuYXRpdmUgYXBwIGNvbnRleHRzLCBhbHdheXNcbiAgICogcmV0dXJucyB0cnVlIGJlY2F1c2UgU2VsZW5pdW0ncyBpc0Rpc3BsYXllZCgpIEpTIGF0b20gaXMgbm90IHN1cHBvcnRlZFxuICAgKiBieSBVaUF1dG9tYXRvcjIgaW4gbmF0aXZlIG1vZGUsIGFuZCBlbGVtZW50cyBmb3VuZCBieSBVaUF1dG9tYXRvcjInc1xuICAgKiBhY2Nlc3NpYmlsaXR5IGlkIC8gaWQgc2VhcmNoIGFyZSBhbHJlYWR5IGluIHRoZSByZW5kZXJlZCB2aWV3IGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkgJiYgYXJncy5zY3JvbGxUbykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGxCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsQnlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyh0aGlzLmlkTG9jYXRvcih0ZXN0SWQpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCB0aGlzLmlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgJiYgZ2V0VGltZUxlZnQoKSA+IDApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIGlkOiAke3Rlc3RJZH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBpZCBsb2NhdG9yIGZvciB0aGUgYWN0aXZlIEFwcGl1bSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFRlc3QgaWQgb3IgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHJldHVybnMge0J5fSBTZWxlbml1bS9BcHBpdW0gbG9jYXRvci5cbiAgICovXG4gIGlkTG9jYXRvcih0ZXN0SWQpIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHJldHVybiBuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIEJ5LmlkKHRlc3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBuYXRpdmUgQW5kcm9pZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbCwgc2Nyb2xsaW5nIGl0IGludG8gdmlldyB3aGVuIG5lZWRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBOYXRpdmUgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZXh0LlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmF0aXZlVGV4dChleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmRCeU5hdGl2ZVRleHQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG5hdGl2ZSBBbmRyb2lkIEFwcGl1bSBzZXNzaW9uc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9ycyA9IFthbmRyb2lkVGV4dENvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSwgYW5kcm9pZERlc2NyaXB0aW9uQ29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpXVxuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIHNlbGVjdG9yKSlcblxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuIGVsZW1lbnRzWzBdXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBieSB0ZXh0IG9yIGFjY2Vzc2liaWxpdHkgbGFiZWw6ICR7ZXhwZWN0ZWRUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYHRleHQgb3IgYWNjZXNzaWJpbGl0eSBsYWJlbDogJHtleHBlY3RlZFRleHR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBzZWxlY3RvcnNcbiAgICAgIH0sIHsuLi5hcmdzLCBzY3JvbGxUbzogYXJncy5zY3JvbGxUbyA/PyB0cnVlfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIGEgdGVzdCBpZCBvd25zIGV4cGVjdGVkIHZpc2libGUgdGV4dCBvciBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdGhhdCBtdXN0IGFwcGVhciB1bmRlciB0aGUgdGVzdCBpZC5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVGVzdElEVGV4dCh0ZXN0SWQsIGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzQW5kcm9pZE5hdGl2ZUFwcENvbnRleHQoKSkge1xuICAgICAgYXdhaXQgc3VwZXIud2FpdEZvclRlc3RJRFRleHQodGVzdElkLCBleHBlY3RlZFRleHQsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvcnMgPSBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgIGNvbnN0IHNjb3BlZFRleHRYcGF0aCA9IGFuZHJvaWRTY29wZWRUZXh0WHBhdGgodGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgY29uc3QgZGlyZWN0RmluZCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3Igb2Ygc2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgc2VsZWN0b3IpKVxuXG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3ZXJlIGZvdW5kIGJ5IGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHNbMF0pIHJldHVybiBlbGVtZW50c1swXVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY29wZWRUZXh0RWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhCeS54cGF0aChzY29wZWRUZXh0WHBhdGgpKVxuICAgICAgaWYgKHNjb3BlZFRleHRFbGVtZW50c1swXSkgcmV0dXJuIHNjb3BlZFRleHRFbGVtZW50c1swXVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYnkgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgICB9LCB7Li4uYXJncywgc2Nyb2xsVG86IGFyZ3Muc2Nyb2xsVG8gPz8gdHJ1ZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIG5hdGl2ZSBBbmRyb2lkIGNvbnRyb2wgYnkgcmVzb3VyY2UgaWQsIHNjcm9sbGluZyBpdCBpbnRvIHZpZXcgZmlyc3Qgd2hlbiByZXF1ZXN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBkaXJlY3RGaW5kID0gYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5maW5kQnlJZCh0ZXN0SWQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwLCBzY3JvbGxUbzogZmFsc2V9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYGlkOiAke3Rlc3RJZH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IFthbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCldXG4gICAgICB9LCBhcmdzKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBuYXRpdmUgY29udHJvbCwgdHJ5aW5nIGRpcmVjdCBsb29rdXAsIFVpU2Nyb2xsYWJsZSwgYW5kIHZpZXdwb3J0IGdlc3R1cmUgc2Nyb2xsaW5nLlxuICAgKiBAcGFyYW0ge05hdGl2ZUNvbnRyb2xMb29rdXB9IGxvb2t1cCBMb29rdXAgY2FsbGJhY2tzIGFuZCBkaWFnbm9zdGljcy5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBNYXRjaGluZyBuYXRpdmUgZWxlbWVudC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyhsb29rdXAsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzID0gW10sIHNjcm9sbFRvID0gdHJ1ZSwgdGltZW91dCA9IDEwMDAwfSA9IGFyZ3NcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgbGV0IGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgbGFzdEVycm9yXG5cbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgbG9va3VwLmRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICAgIGlmICghYXR0ZW1wdGVkVWlTZWxlY3RvclNjcm9sbCkge1xuICAgICAgICAgIGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSB0cnVlXG4gICAgICAgICAgZm9yIChjb25zdCBzY3JvbGxTZWxlY3RvciBvZiBsb29rdXAuc2Nyb2xsU2VsZWN0b3JzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZVVpU2VsZWN0b3JJbnRvVmlldyhzY3JvbGxTZWxlY3Rvciwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHZvaWQgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBsb29rdXAuZGlyZWN0RmluZCgpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgICB2b2lkIGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2Nhbihsb29rdXAuZGlyZWN0RmluZCwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoIWlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRpbWVvdXQgPT09IDApIGJyZWFrXG4gICAgICBhd2FpdCB3YWl0KDEwMClcbiAgICB9IHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgdGltZW91dClcblxuICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5ICR7bG9va3VwLmRlc2NyaXB0aW9ufWAsIGxhc3RFcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBuYXRpdmUgY29udGVudCBhcm91bmQgdGhlIGN1cnJlbnQgdmlld3BvcnQgc28gcmV0YWluZWQgb2Zmc2V0cyBhbmRcbiAgICogYmVsb3ctZm9sZCB0YXJnZXRzIGFyZSBib3RoIHJlYWNoYWJsZSB3aXRob3V0IGV4aGF1c3RpbmcgdGhlIHRpbWVvdXQgYnVkZ2V0LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBkaXJlY3RGaW5kIExvb2t1cCB0byByZXRyeSBhZnRlciBlYWNoIHNjcm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgY29udHJvbC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2NhbihkaXJlY3RGaW5kLCBzY3JvbGxDb250YWluZXJUZXN0SURzKSB7XG4gICAgY29uc3QgdXBTY3JvbGxTdGF0ZSA9IHRoaXMubmV3TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZSgpXG4gICAgY29uc3QgZG93blNjcm9sbFN0YXRlID0gdGhpcy5uZXdOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlKClcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBNQVhfTkFUSVZFX1ZJRVdQT1JUX1NDUk9MTF9TVEVQUzsgaW5kZXggKz0gMSkge1xuICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVWaWV3cG9ydCh1cFNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcInVwXCIpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlVmlld3BvcnQoZG93blNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcImRvd25cIilcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIG5hdGl2ZSB2aWV3cG9ydCBzY2FuXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGV9IEZyZXNoIHNjcm9sbCBmYWxsYmFjayBzdGF0ZS5cbiAgICovXG4gIG5ld05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyeUVsZW1lbnRTY3JvbGw6IHRydWUsXG4gICAgICB0cnlWaWV3cG9ydFNjcm9sbDogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGxpY2l0IG5hdGl2ZSBwb2xsaW5nIHdpdGhvdXQgQXBwaXVtJ3MgaW1wbGljaXQgd2FpdCBleHRlbmRpbmcgZXZlcnkgZmFpbGVkIHByb2JlLlxuICAgKiBAdGVtcGxhdGUgVFJlc3VsdCBSZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGltcGxpY2l0V2FpdE1zIEltcGxpY2l0IHdhaXQgZHVyYXRpb24gdG8gYXBwbHkgZHVyaW5nIHRoZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFRSZXN1bHQ+fSBjYWxsYmFjayBXb3JrIHRoYXQgb3ducyBpdHMgb3duIHBvbGxpbmcgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VFJlc3VsdD59IENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhOYXRpdmVJbXBsaWNpdFdhaXQoaW1wbGljaXRXYWl0TXMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdGltZW91dHMgPSAvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRzfSAqLyAoYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5nZXRUaW1lb3V0cygpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cygvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRPcHRpb25zfSAqLyAoe2ltcGxpY2l0OiBpbXBsaWNpdFdhaXRNc30pKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLnNldFRpbWVvdXRzKC8qKiBAdHlwZSB7TmF0aXZlVGltZW91dE9wdGlvbnN9ICovICh7aW1wbGljaXQ6IHRpbWVvdXRzLmltcGxpY2l0fSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHZpc2libGUgbmF0aXZlIHZpZXdwb3J0IHdoZW4gVWlTY3JvbGxhYmxlIGNhbm5vdCBpZGVudGlmeSB0aGUgb3duaW5nIFNjcm9sbFZpZXcuXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZX0gc2Nyb2xsU3RhdGUgUGVyLWxvb2t1cCBBcHBpdW0gc2Nyb2xsIHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBzY3JvbGxDb250YWluZXJUZXN0SURzIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IG1heSBpZGVudGlmeSBzY3JvbGwgY29udGFpbmVycy5cbiAgICogQHBhcmFtIHtOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvbn0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBzY3JvbGwgdGhlIGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBBcHBpdW0gcGVyZm9ybXMgdGhlIGdlc3R1cmUuXG4gICAqL1xuICBhc3luYyBzY3JvbGxOYXRpdmVWaWV3cG9ydChzY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgZGlyZWN0aW9uKSB7XG4gICAgY29uc3Qgd2luZG93UmVjdCA9IC8qKiBAdHlwZSB7TmF0aXZlV2luZG93UmVjdH0gKi8gKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkud2luZG93KCkuZ2V0UmVjdCgpKVxuICAgIGNvbnN0IGhvcml6b250YWxJbnNldCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2luZG93UmVjdC53aWR0aCAqIDAuMSkpXG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3dSZWN0LmhlaWdodCAqIDAuMikpXG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCB3aW5kb3dSZWN0LndpZHRoIC0gaG9yaXpvbnRhbEluc2V0ICogMilcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpbmRvd1JlY3QuaGVpZ2h0ICogMC42KSlcblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsICYmIHNjcm9sbENvbnRhaW5lclRlc3RJRHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBzY3JvbGxDb250YWluZXJUZXN0SUQgb2Ygc2Nyb2xsQ29udGFpbmVyVGVzdElEcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlRWxlbWVudChzY3JvbGxDb250YWluZXJUZXN0SUQsIGRpcmVjdGlvbilcbiAgICAgICAgICBpZiAoZGlkU2Nyb2xsKSByZXR1cm5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNjcm9sbFN0YXRlLnRyeUVsZW1lbnRTY3JvbGwgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlWaWV3cG9ydFNjcm9sbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IGhvcml6b250YWxJbnNldCxcbiAgICAgICAgICBwZXJjZW50OiAwLjc1LFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICB3aWR0aFxuICAgICAgICB9KVxuICAgICAgICBpZiAoZGlkU2Nyb2xsID09PSB0cnVlKSByZXR1cm5cbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNlbnRlclggPSBNYXRoLmZsb29yKHdpbmRvd1JlY3QueCArIHdpbmRvd1JlY3Qud2lkdGggLyAyKVxuICAgIGNvbnN0IHN0YXJ0WSA9IE1hdGguZmxvb3Iod2luZG93UmVjdC55ICsgd2luZG93UmVjdC5oZWlnaHQgKiAoZGlyZWN0aW9uID09PSBcImRvd25cIiA/IDAuNzggOiAwLjI4KSlcbiAgICBjb25zdCBlbmRZID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnkgKyB3aW5kb3dSZWN0LmhlaWdodCAqIChkaXJlY3Rpb24gPT09IFwiZG93blwiID8gMC4yOCA6IDAuNzgpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlKG5ldyBDb21tYW5kKE5hbWUuQUNUSU9OUykuc2V0UGFyYW1ldGVyKFwiYWN0aW9uc1wiLCBbXG4gICAgICB7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICB7ZHVyYXRpb246IDEwMCwgb3JpZ2luOiBPcmlnaW4uVklFV1BPUlQsIHR5cGU6IFwicG9pbnRlck1vdmVcIiwgeDogY2VudGVyWCwgeTogc3RhcnRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJEb3duXCJ9LFxuICAgICAgICAgIHtkdXJhdGlvbjogMjUwLCBvcmlnaW46IE9yaWdpbi5WSUVXUE9SVCwgdHlwZTogXCJwb2ludGVyTW92ZVwiLCB4OiBjZW50ZXJYLCB5OiBlbmRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJVcFwifVxuICAgICAgICBdLFxuICAgICAgICBpZDogXCJuYXRpdmUgc2Nyb2xsIGZpbmdlclwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcG9pbnRlclR5cGU6IFwidG91Y2hcIlxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBcInBvaW50ZXJcIlxuICAgICAgfVxuICAgIF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgYSBzcGVjaWZpYyBuYXRpdmUgQW5kcm9pZCBlbGVtZW50IGJ5IHRlc3QgaWQgd2hlbiBBcHBpdW0gZXhwb3NlcyBpdCBhcyBhIHNjcm9sbCBjb250YWluZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxEaXJlY3Rpb259IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gc2Nyb2xsIHRoZSBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciBBcHBpdW0gcmVwb3J0ZWQgbW9yZSBjb250ZW50IHRvIHNjcm9sbC5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZUVsZW1lbnQodGVzdElkLCBkaXJlY3Rpb24pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3IodGVzdElkKSkpXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IGVsZW1lbnRzWzBdXG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGVsZW1lbnRJZDogYXdhaXQgc2Nyb2xsRWxlbWVudC5nZXRJZCgpLFxuICAgICAgcGVyY2VudDogMC43NVxuICAgIH0pXG5cbiAgICByZXR1cm4gZGlkU2Nyb2xsID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYW4gb2Zmc2NyZWVuIEFuZHJvaWQgY29udHJvbCBpbnRvIGEgU2Nyb2xsVmlldy1iYWNrZWQgbmF0aXZlIGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVpU2VsZWN0b3IgVWlBdXRvbWF0b3Igc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgY29udHJvbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBVaUF1dG9tYXRvciBhdHRlbXB0cyB0aGUgc2Nyb2xsLlxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsTmF0aXZlVWlTZWxlY3RvckludG9WaWV3KHVpU2VsZWN0b3IsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpIHtcbiAgICBjb25zdCBzY3JvbGxhYmxlU2VsZWN0b3JzID0gW1xuICAgICAgLi4uc2Nyb2xsQ29udGFpbmVyVGVzdElEcy5tYXAoKHNjcm9sbENvbnRhaW5lclRlc3RJRCkgPT4gYW5kcm9pZFJlc291cmNlSWRTZWxlY3RvcihzY3JvbGxDb250YWluZXJUZXN0SUQpKSxcbiAgICAgIFwibmV3IFVpU2VsZWN0b3IoKS5zY3JvbGxhYmxlKHRydWUpXCJcbiAgICBdXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCBsYXN0RXJyb3JcblxuICAgIGZvciAoY29uc3Qgc2Nyb2xsYWJsZVNlbGVjdG9yIG9mIHNjcm9sbGFibGVTZWxlY3RvcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgYG5ldyBVaVNjcm9sbGFibGUoJHtzY3JvbGxhYmxlU2VsZWN0b3J9KS5zY3JvbGxJbnRvVmlldygke3VpU2VsZWN0b3J9KWApKVxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsYXN0RXJyb3IpIHRocm93IGxhc3RFcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgYSBuYXRpdmUgQW5kcm9pZCBhcHAsIG5vdCBBbmRyb2lkIENocm9tZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiBVaUF1dG9tYXRvciByZXNvdXJjZS1pZCBsb29rdXAgc2hvdWxkIGJlIHVzZWQuXG4gICAqL1xuICBpc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICByZXR1cm4gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCIgJiYgIWJyb3dzZXJOYW1lXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzZXJ2ZXJBcmdzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHNlcnZlckFyZ3MuYWRkcmVzcyA/PyBcIjEyNy4wLjAuMVwiXG4gICAgY29uc3QgcG9ydCA9IHNlcnZlckFyZ3MucG9ydCA/PyA0NzIzXG4gICAgY29uc3QgYmFzZVBhdGggPSBzZXJ2ZXJBcmdzLmJhc2VQYXRoID8gKHNlcnZlckFyZ3MuYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBzZXJ2ZXJBcmdzLmJhc2VQYXRoIDogYC8ke3NlcnZlckFyZ3MuYmFzZVBhdGh9YCkgOiBcIlwiXG5cbiAgICByZXR1cm4gYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0ke2Jhc2VQYXRofWBcbiAgfVxufVxuIl19
@@ -1,11 +1,3 @@
1
- /**
2
- * @typedef {object} SeleniumDriverOptions
3
- * @property {string} [browserName] Browser name used by the WebDriver session.
4
- * @property {string[]} [chromeArguments] Chrome CLI arguments.
5
- * @property {import("selenium-webdriver/chrome.js").Options} [chromeOptions] Preconfigured Chrome options instance.
6
- * @property {Record<string, any>} [capabilities] Extra WebDriver capabilities.
7
- * @property {Record<string, any>} [loggingPrefs] Logging preferences for browser logs.
8
- */
9
1
  /**
10
2
  * Selenium WebDriver implementation.
11
3
  */
@@ -20,6 +12,10 @@ export type SeleniumDriverOptions = {
20
12
  * Chrome CLI arguments.
21
13
  */
22
14
  chromeArguments?: string[] | undefined;
15
+ /**
16
+ * Path to the Chromedriver executable.
17
+ */
18
+ chromedriverPath?: string | undefined;
23
19
  /**
24
20
  * Preconfigured Chrome options instance.
25
21
  */
@@ -28,6 +24,10 @@ export type SeleniumDriverOptions = {
28
24
  * Extra WebDriver capabilities.
29
25
  */
30
26
  capabilities?: Record<string, any> | undefined;
27
+ /**
28
+ * Timeout while waiting for Selenium to create a WebDriver session.
29
+ */
30
+ driverStartTimeout?: number | undefined;
31
31
  /**
32
32
  * Logging preferences for browser logs.
33
33
  */
@@ -1,14 +1,53 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
1
3
  import { Builder } from "selenium-webdriver";
4
+ import timeout from "awaitery/build/timeout.js";
2
5
  import chrome from "selenium-webdriver/chrome.js";
3
6
  import WebDriverDriver from "./webdriver-driver.js";
7
+ const DEFAULT_DRIVER_START_TIMEOUT_MS = 60000;
4
8
  /**
5
9
  * @typedef {object} SeleniumDriverOptions
6
10
  * @property {string} [browserName] Browser name used by the WebDriver session.
7
11
  * @property {string[]} [chromeArguments] Chrome CLI arguments.
12
+ * @property {string} [chromedriverPath] Path to the Chromedriver executable.
8
13
  * @property {import("selenium-webdriver/chrome.js").Options} [chromeOptions] Preconfigured Chrome options instance.
9
14
  * @property {Record<string, any>} [capabilities] Extra WebDriver capabilities.
15
+ * @property {number} [driverStartTimeout] Timeout while waiting for Selenium to create a WebDriver session.
10
16
  * @property {Record<string, any>} [loggingPrefs] Logging preferences for browser logs.
11
17
  */
18
+ /** @returns {string | undefined} */
19
+ function findChromedriverOnPath() {
20
+ const pathEnv = process.env.PATH;
21
+ if (!pathEnv)
22
+ return undefined;
23
+ const executableNames = process.platform === "win32" ? ["chromedriver.exe", "chromedriver.cmd", "chromedriver.bat", "chromedriver"] : ["chromedriver"];
24
+ for (const directory of pathEnv.split(path.delimiter)) {
25
+ if (!directory)
26
+ continue;
27
+ for (const executableName of executableNames) {
28
+ const executablePath = path.join(directory, executableName);
29
+ if (isExecutableFile(executablePath))
30
+ return executablePath;
31
+ }
32
+ }
33
+ return undefined;
34
+ }
35
+ /**
36
+ * @param {string} filePath
37
+ * @returns {boolean}
38
+ */
39
+ function isExecutableFile(filePath) {
40
+ try {
41
+ fs.accessSync(filePath, fs.constants.X_OK);
42
+ return true;
43
+ }
44
+ catch (error) {
45
+ if (error && typeof error === "object" && "code" in error && (error.code === "ENOENT" || error.code === "EACCES" || error.code === "ENOTDIR")) {
46
+ return false;
47
+ }
48
+ throw error;
49
+ }
50
+ }
12
51
  /**
13
52
  * Selenium WebDriver implementation.
14
53
  */
@@ -30,6 +69,10 @@ export default class SeleniumDriver extends WebDriverDriver {
30
69
  }
31
70
  const builder = new Builder().forBrowser(this.options.browserName ?? "chrome").setChromeOptions(chromeOptions);
32
71
  const capabilities = builder.getCapabilities();
72
+ const chromedriverPath = this.options.chromedriverPath ?? process.env.SYSTEM_TEST_CHROMEDRIVER_PATH ?? findChromedriverOnPath();
73
+ if (chromedriverPath) {
74
+ builder.setChromeService(new chrome.ServiceBuilder(chromedriverPath));
75
+ }
33
76
  const loggingPrefs = this.options.loggingPrefs ?? { browser: "ALL" };
34
77
  capabilities.set("goog:loggingPrefs", loggingPrefs);
35
78
  if (this.options.capabilities) {
@@ -37,9 +80,11 @@ export default class SeleniumDriver extends WebDriverDriver {
37
80
  capabilities.set(key, value);
38
81
  }
39
82
  }
40
- const webDriver = await builder.build();
83
+ const webDriver = await timeout({ timeout: this.options.driverStartTimeout ?? DEFAULT_DRIVER_START_TIMEOUT_MS, errorMessage: "timeout while starting Selenium WebDriver" }, async () => {
84
+ return await builder.build();
85
+ });
41
86
  this.setWebDriver(webDriver);
42
87
  this.installExitHandlers();
43
88
  }
44
89
  }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZW5pdW0tZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlcnMvc2VsZW5pdW0tZHJpdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMxQyxPQUFPLE1BQU0sTUFBTSw4QkFBOEIsQ0FBQTtBQUNqRCxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRDs7Ozs7OztHQU9HO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGNBQWUsU0FBUSxlQUFlO0lBQ3pEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3BHLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJO1lBQ3RELHlCQUF5QjtZQUN6QixlQUFlO1lBQ2YsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCx5QkFBeUI7U0FDMUIsQ0FBQTtRQUVELEtBQUssTUFBTSxRQUFRLElBQUksZUFBZSxFQUFFLENBQUM7WUFDdkMsYUFBYSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0QyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDOUcsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBRTlDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxDQUFBO1FBQ2xFLFlBQVksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFFbkQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzlCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDckUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDOUIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUV2QyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO0lBQzVCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QnVpbGRlcn0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQgY2hyb21lIGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvY2hyb21lLmpzXCJcbmltcG9ydCBXZWJEcml2ZXJEcml2ZXIgZnJvbSBcIi4vd2ViZHJpdmVyLWRyaXZlci5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsZW5pdW1Ecml2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Jyb3dzZXJOYW1lXSBCcm93c2VyIG5hbWUgdXNlZCBieSB0aGUgV2ViRHJpdmVyIHNlc3Npb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbY2hyb21lQXJndW1lbnRzXSBDaHJvbWUgQ0xJIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyL2Nocm9tZS5qc1wiKS5PcHRpb25zfSBbY2hyb21lT3B0aW9uc10gUHJlY29uZmlndXJlZCBDaHJvbWUgb3B0aW9ucyBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2NhcGFiaWxpdGllc10gRXh0cmEgV2ViRHJpdmVyIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2xvZ2dpbmdQcmVmc10gTG9nZ2luZyBwcmVmZXJlbmNlcyBmb3IgYnJvd3NlciBsb2dzLlxuICovXG5cbi8qKlxuICogU2VsZW5pdW0gV2ViRHJpdmVyIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWxlbml1bURyaXZlciBleHRlbmRzIFdlYkRyaXZlckRyaXZlciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGNvbnN0IGNocm9tZU9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuY2hyb21lT3B0aW9ucyA/IHRoaXMub3B0aW9ucy5jaHJvbWVPcHRpb25zIDogbmV3IGNocm9tZS5PcHRpb25zKClcbiAgICBjb25zdCBjaHJvbWVBcmd1bWVudHMgPSB0aGlzLm9wdGlvbnMuY2hyb21lQXJndW1lbnRzID8/IFtcbiAgICAgIFwiLS1kaXNhYmxlLWRldi1zaG0tdXNhZ2VcIixcbiAgICAgIFwiLS1kaXNhYmxlLWdwdVwiLFxuICAgICAgXCItLWhlYWRsZXNzPW5ld1wiLFxuICAgICAgXCItLW5vLXNhbmRib3hcIixcbiAgICAgIFwiLS13aW5kb3ctc2l6ZT0xOTIwLDEwODBcIlxuICAgIF1cblxuICAgIGZvciAoY29uc3QgYXJndW1lbnQgb2YgY2hyb21lQXJndW1lbnRzKSB7XG4gICAgICBjaHJvbWVPcHRpb25zLmFkZEFyZ3VtZW50cyhhcmd1bWVudClcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKS5mb3JCcm93c2VyKHRoaXMub3B0aW9ucy5icm93c2VyTmFtZSA/PyBcImNocm9tZVwiKS5zZXRDaHJvbWVPcHRpb25zKGNocm9tZU9wdGlvbnMpXG4gICAgY29uc3QgY2FwYWJpbGl0aWVzID0gYnVpbGRlci5nZXRDYXBhYmlsaXRpZXMoKVxuXG4gICAgY29uc3QgbG9nZ2luZ1ByZWZzID0gdGhpcy5vcHRpb25zLmxvZ2dpbmdQcmVmcyA/PyB7YnJvd3NlcjogXCJBTExcIn1cbiAgICBjYXBhYmlsaXRpZXMuc2V0KFwiZ29vZzpsb2dnaW5nUHJlZnNcIiwgbG9nZ2luZ1ByZWZzKVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgIGNhcGFiaWxpdGllcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3ZWJEcml2ZXIgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKClcblxuICAgIHRoaXMuc2V0V2ViRHJpdmVyKHdlYkRyaXZlcilcbiAgICB0aGlzLmluc3RhbGxFeGl0SGFuZGxlcnMoKVxuICB9XG59XG4iXX0=
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZW5pdW0tZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlcnMvc2VsZW5pdW0tZHJpdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQzFDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLDhCQUE4QixDQUFBO0FBQ2pELE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFBO0FBRW5ELE1BQU0sK0JBQStCLEdBQUcsS0FBSyxDQUFBO0FBRTdDOzs7Ozs7Ozs7R0FTRztBQUVILG9DQUFvQztBQUNwQyxTQUFTLHNCQUFzQjtJQUM3QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQTtJQUVoQyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sU0FBUyxDQUFBO0lBRTlCLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBRXRKLEtBQUssTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUztZQUFFLFNBQVE7UUFFeEIsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUM3QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQTtZQUUzRCxJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztnQkFBRSxPQUFPLGNBQWMsQ0FBQTtRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFFBQVE7SUFDaEMsSUFBSSxDQUFDO1FBQ0gsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMxQyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDOUksT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUE7SUFDYixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxjQUFlLFNBQVEsZUFBZTtJQUN6RDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNwRyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsSUFBSTtZQUN0RCx5QkFBeUI7WUFDekIsZUFBZTtZQUNmLGdCQUFnQjtZQUNoQixjQUFjO1lBQ2QseUJBQXlCO1NBQzFCLENBQUE7UUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3ZDLGFBQWEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEMsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzlHLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUM5QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsSUFBSSxzQkFBc0IsRUFBRSxDQUFBO1FBRS9ILElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQTtRQUN2RSxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLENBQUE7UUFDbEUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUVuRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDOUIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNyRSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLElBQUksK0JBQStCLEVBQUUsWUFBWSxFQUFFLDJDQUEyQyxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkwsT0FBTyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUM5QixDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtCdWlsZGVyfSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBjaHJvbWUgZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9jaHJvbWUuanNcIlxuaW1wb3J0IFdlYkRyaXZlckRyaXZlciBmcm9tIFwiLi93ZWJkcml2ZXItZHJpdmVyLmpzXCJcblxuY29uc3QgREVGQVVMVF9EUklWRVJfU1RBUlRfVElNRU9VVF9NUyA9IDYwMDAwXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsZW5pdW1Ecml2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Jyb3dzZXJOYW1lXSBCcm93c2VyIG5hbWUgdXNlZCBieSB0aGUgV2ViRHJpdmVyIHNlc3Npb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbY2hyb21lQXJndW1lbnRzXSBDaHJvbWUgQ0xJIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2hyb21lZHJpdmVyUGF0aF0gUGF0aCB0byB0aGUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlci9jaHJvbWUuanNcIikuT3B0aW9uc30gW2Nocm9tZU9wdGlvbnNdIFByZWNvbmZpZ3VyZWQgQ2hyb21lIG9wdGlvbnMgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtjYXBhYmlsaXRpZXNdIEV4dHJhIFdlYkRyaXZlciBjYXBhYmlsaXRpZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RyaXZlclN0YXJ0VGltZW91dF0gVGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBTZWxlbml1bSB0byBjcmVhdGUgYSBXZWJEcml2ZXIgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2xvZ2dpbmdQcmVmc10gTG9nZ2luZyBwcmVmZXJlbmNlcyBmb3IgYnJvd3NlciBsb2dzLlxuICovXG5cbi8qKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuZnVuY3Rpb24gZmluZENocm9tZWRyaXZlck9uUGF0aCgpIHtcbiAgY29uc3QgcGF0aEVudiA9IHByb2Nlc3MuZW52LlBBVEhcblxuICBpZiAoIXBhdGhFbnYpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBleGVjdXRhYmxlTmFtZXMgPSBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBbXCJjaHJvbWVkcml2ZXIuZXhlXCIsIFwiY2hyb21lZHJpdmVyLmNtZFwiLCBcImNocm9tZWRyaXZlci5iYXRcIiwgXCJjaHJvbWVkcml2ZXJcIl0gOiBbXCJjaHJvbWVkcml2ZXJcIl1cblxuICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBwYXRoRW52LnNwbGl0KHBhdGguZGVsaW1pdGVyKSkge1xuICAgIGlmICghZGlyZWN0b3J5KSBjb250aW51ZVxuXG4gICAgZm9yIChjb25zdCBleGVjdXRhYmxlTmFtZSBvZiBleGVjdXRhYmxlTmFtZXMpIHtcbiAgICAgIGNvbnN0IGV4ZWN1dGFibGVQYXRoID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgZXhlY3V0YWJsZU5hbWUpXG5cbiAgICAgIGlmIChpc0V4ZWN1dGFibGVGaWxlKGV4ZWN1dGFibGVQYXRoKSkgcmV0dXJuIGV4ZWN1dGFibGVQYXRoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRXhlY3V0YWJsZUZpbGUoZmlsZVBhdGgpIHtcbiAgdHJ5IHtcbiAgICBmcy5hY2Nlc3NTeW5jKGZpbGVQYXRoLCBmcy5jb25zdGFudHMuWF9PSylcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgKGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIgfHwgZXJyb3IuY29kZSA9PT0gXCJFQUNDRVNcIiB8fCBlcnJvci5jb2RlID09PSBcIkVOT1RESVJcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlbml1bSBXZWJEcml2ZXIgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVuaXVtRHJpdmVyIGV4dGVuZHMgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3QgY2hyb21lT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5jaHJvbWVPcHRpb25zID8gdGhpcy5vcHRpb25zLmNocm9tZU9wdGlvbnMgOiBuZXcgY2hyb21lLk9wdGlvbnMoKVxuICAgIGNvbnN0IGNocm9tZUFyZ3VtZW50cyA9IHRoaXMub3B0aW9ucy5jaHJvbWVBcmd1bWVudHMgPz8gW1xuICAgICAgXCItLWRpc2FibGUtZGV2LXNobS11c2FnZVwiLFxuICAgICAgXCItLWRpc2FibGUtZ3B1XCIsXG4gICAgICBcIi0taGVhZGxlc3M9bmV3XCIsXG4gICAgICBcIi0tbm8tc2FuZGJveFwiLFxuICAgICAgXCItLXdpbmRvdy1zaXplPTE5MjAsMTA4MFwiXG4gICAgXVxuXG4gICAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBjaHJvbWVBcmd1bWVudHMpIHtcbiAgICAgIGNocm9tZU9wdGlvbnMuYWRkQXJndW1lbnRzKGFyZ3VtZW50KVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpLmZvckJyb3dzZXIodGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lID8/IFwiY2hyb21lXCIpLnNldENocm9tZU9wdGlvbnMoY2hyb21lT3B0aW9ucylcbiAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBidWlsZGVyLmdldENhcGFiaWxpdGllcygpXG4gICAgY29uc3QgY2hyb21lZHJpdmVyUGF0aCA9IHRoaXMub3B0aW9ucy5jaHJvbWVkcml2ZXJQYXRoID8/IHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0NIUk9NRURSSVZFUl9QQVRIID8/IGZpbmRDaHJvbWVkcml2ZXJPblBhdGgoKVxuXG4gICAgaWYgKGNocm9tZWRyaXZlclBhdGgpIHtcbiAgICAgIGJ1aWxkZXIuc2V0Q2hyb21lU2VydmljZShuZXcgY2hyb21lLlNlcnZpY2VCdWlsZGVyKGNocm9tZWRyaXZlclBhdGgpKVxuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dpbmdQcmVmcyA9IHRoaXMub3B0aW9ucy5sb2dnaW5nUHJlZnMgPz8ge2Jyb3dzZXI6IFwiQUxMXCJ9XG4gICAgY2FwYWJpbGl0aWVzLnNldChcImdvb2c6bG9nZ2luZ1ByZWZzXCIsIGxvZ2dpbmdQcmVmcylcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzKSkge1xuICAgICAgICBjYXBhYmlsaXRpZXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViRHJpdmVyID0gYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5vcHRpb25zLmRyaXZlclN0YXJ0VGltZW91dCA/PyBERUZBVUxUX0RSSVZFUl9TVEFSVF9USU1FT1VUX01TLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSBzdGFydGluZyBTZWxlbml1bSBXZWJEcml2ZXJcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmJ1aWxkKClcbiAgICB9KVxuXG4gICAgdGhpcy5zZXRXZWJEcml2ZXIod2ViRHJpdmVyKVxuICAgIHRoaXMuaW5zdGFsbEV4aXRIYW5kbGVycygpXG4gIH1cbn1cbiJdfQ==