siarashield_workspace 0.0.54 → 0.0.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -46,7 +46,7 @@ Copy/paste:
46
46
  default-src 'self';
47
47
  script-src 'self' 'nonce-REPLACE_WITH_NONCE' https://embed.mycybersiara.com https://embedcdn.mycybersiara.com;
48
48
  script-src-elem 'self' 'nonce-REPLACE_WITH_NONCE' https://embed.mycybersiara.com https://embedcdn.mycybersiara.com;
49
- script-src-attr 'self' 'unsafe-inline';
49
+ script-src-attr 'none';
50
50
  connect-src 'self' https://embed.mycybersiara.com https://embedcdn.mycybersiara.com;
51
51
  style-src 'self' 'nonce-REPLACE_WITH_NONCE' https://embed.mycybersiara.com https://mycybersiara.com https://fonts.googleapis.com https://cdnjs.cloudflare.com;
52
52
  style-src-elem 'self' 'nonce-REPLACE_WITH_NONCE' https://embed.mycybersiara.com https://mycybersiara.com https://fonts.googleapis.com https://cdnjs.cloudflare.com;
@@ -99,6 +99,7 @@ export const environment = {
99
99
  ```html
100
100
  <siara-shield
101
101
  [publicKey]="environment.siaraShieldPublicKey"
102
+ [cspNonce]="cspNonce"
102
103
  (token)="onCaptchaToken($event)"
103
104
  ></siara-shield>
104
105
 
@@ -217,7 +218,18 @@ Get keys from [mycybersiara.com](https://mycybersiara.com).
217
218
 
218
219
  If your app has no strict CSP, default integration works without extra setup.
219
220
 
220
- For strict CSP, use a **server-generated nonce per request**.
221
+ For strict CSP, use a **server-generated nonce per request**. The same nonce must appear in your `Content-Security-Policy` header and in `meta[name="csp-nonce"]` (or an existing `script[nonce]`). Do not ship the literal placeholder `REPLACE_WITH_NONCE` to browsers.
222
+
223
+ ### `script-src-attr 'none'` vs `style-src-attr`
224
+
225
+ | Directive | Recommended value | Why |
226
+ | --- | --- | --- |
227
+ | `script-src-attr` | `'none'` | With a configured nonce, the package migrates vendor `onclick` / `on*` attributes to `addEventListener`. |
228
+ | `style-src-attr` | `'self' 'unsafe-inline'` | Vendor/jQuery still sets `style=""` and `element.style` for show/hide and layout. A `style-src` nonce does not cover those. |
229
+
230
+ Do **not** set `style-src-attr 'none'` unless you have validated the full captcha flow under that policy. The current embed still relies on inline style attributes.
231
+
232
+ If you cannot use `script-src-attr 'none'` yet, pass `allowInlineEventAttributes: true` to `getSiaraShieldCspDirectives()` / `getSiaraShieldCspPolicy()` to generate `script-src-attr 'self' 'unsafe-inline'` instead.
221
233
 
222
234
  ### Recommended policy example
223
235
 
@@ -225,7 +237,7 @@ For strict CSP, use a **server-generated nonce per request**.
225
237
  default-src 'self';
226
238
  script-src 'self' 'nonce-<dynamic>' https://embed.mycybersiara.com https://embedcdn.mycybersiara.com;
227
239
  script-src-elem 'self' 'nonce-<dynamic>' https://embed.mycybersiara.com https://embedcdn.mycybersiara.com;
228
- script-src-attr 'self' 'unsafe-inline';
240
+ script-src-attr 'none';
229
241
  connect-src 'self' https://embed.mycybersiara.com https://embedcdn.mycybersiara.com;
230
242
  style-src 'self' 'nonce-<dynamic>' https://embed.mycybersiara.com https://mycybersiara.com https://fonts.googleapis.com https://cdnjs.cloudflare.com;
231
243
  style-src-elem 'self' 'nonce-<dynamic>' https://embed.mycybersiara.com https://mycybersiara.com https://fonts.googleapis.com https://cdnjs.cloudflare.com;
@@ -254,6 +266,11 @@ If your app already has jQuery, set `[loadJQuery]="false"` (or `loadJQuery: fals
254
266
  - `CheckCaptcha` not available:
255
267
  - Ensure initialization completed.
256
268
  - Ensure CSP allows required hosts and nonce.
269
+ - CSP console errors on `script-src-attr`:
270
+ - Use a real per-request nonce (not `REPLACE_WITH_NONCE` / `__CSP_NONCE__`).
271
+ - Confirm `script-src-attr 'none'` (or allow inline event attributes only if you opted in via `allowInlineEventAttributes`).
272
+ - CSP console errors on `style-src-attr`:
273
+ - Keep `style-src-attr 'self' 'unsafe-inline'` unless you have verified the widget without it.
257
274
  - Token not available immediately:
258
275
  - Use async check methods (`checkCaptchaAsync` / `checkSiaraShieldCaptchaAsync`).
259
276
 
@@ -50,6 +50,7 @@ export function getSiaraShieldCspDirectives(options) {
50
50
  // Default to strict/safe CSP. Customers can explicitly opt-in if they accept the risk.
51
51
  const includeUnsafeInlineScript = options?.includeUnsafeInlineScript ?? false;
52
52
  const includeUnsafeInlineStyle = options?.includeUnsafeInlineStyle ?? false;
53
+ const allowInlineEventAttributes = options?.allowInlineEventAttributes ?? false;
53
54
  const nonce = nonceSource(options?.nonce);
54
55
  const scriptHosts = includeGoogleApis ? [...SCRIPT_HOSTS, ...OPTIONAL_SCRIPT_HOSTS] : [...SCRIPT_HOSTS];
55
56
  const styleSources = unique([SELF, nonce, ...STYLE_HOSTS]);
@@ -57,12 +58,12 @@ export function getSiaraShieldCspDirectives(options) {
57
58
  'default-src': unique([SELF]),
58
59
  /**
59
60
  * CSP note:
60
- * - Vendor HTML includes inline event handlers (onclick, etc). CSP nonces do NOT cover those.
61
- * - We keep `script-src-elem` strict (nonce + host allowlist), and scope inline allowances to attributes only.
61
+ * - Vendor HTML can include inline event handlers (onclick, etc). CSP nonces do NOT cover those.
62
+ * - With a configured nonce, the package migrates those handlers to addEventListener so `script-src-attr 'none'` works.
62
63
  */
63
64
  'script-src': unique([SELF, nonce, ...scriptHosts, includeUnsafeInlineScript ? UNSAFE_INLINE : undefined]),
64
65
  'script-src-elem': unique([SELF, nonce, ...scriptHosts]),
65
- 'script-src-attr': unique([SELF, "'unsafe-inline'"]),
66
+ 'script-src-attr': unique(allowInlineEventAttributes ? [SELF, UNSAFE_INLINE] : ["'none'"]),
66
67
  'connect-src': unique([SELF, ...CONNECT_HOSTS]),
67
68
  'img-src': unique([SELF, DATA, ...IMG_HOSTS]),
68
69
  /**
@@ -92,4 +93,4 @@ export function mergeSiaraShieldCspPolicy(existingPolicy, options) {
92
93
  .map(([name, values]) => serializeDirective(name, values))
93
94
  .join('; ');
94
95
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmEtc2hpZWxkLWNzcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpYXJhc2hpZWxkLXdvcmtzcGFjZS9zcmMvbGliL3NpYXJhLXNoaWVsZC1jc3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYUEsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDO0FBQ3RCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUNyQixNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztBQUV4QyxNQUFNLFlBQVksR0FBRyxDQUFDLG1DQUFtQyxFQUFFLGdDQUFnQyxDQUFVLENBQUM7QUFDdEcsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLDZCQUE2QixDQUFVLENBQUM7QUFDdkUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxtQ0FBbUMsQ0FBVSxDQUFDO0FBQ3ZHLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLGdDQUFnQztJQUNoQywwQkFBMEI7SUFDMUIsOEJBQThCO0lBQzlCLDhCQUE4QjtDQUN0QixDQUFDO0FBQ1gsTUFBTSxVQUFVLEdBQUc7SUFDakIsMkJBQTJCO0lBQzNCLDBCQUEwQjtJQUMxQiw4QkFBOEI7Q0FDdEIsQ0FBQztBQUNYLE1BQU0sU0FBUyxHQUFHO0lBQ2hCLGdDQUFnQztJQUNoQyxtQ0FBbUM7SUFDbkMsMEJBQTBCO0NBQ2xCLENBQUM7QUFFWCxTQUFTLE1BQU0sQ0FBQyxNQUFpQztJQUMvQyxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUNqQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLEdBQUcsQ0FBQyxD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LGtCQUFrQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgU2lhcmFTaGllbGRDc3BPcHRpb25zIHtcbiAgLyoqIFNlcnZlci1nZW5lcmF0ZWQgbm9uY2UgdmFsdWUgd2l0aG91dCB0aGUgYCdub25jZS0nYCBwcmVmaXguICovXG4gIG5vbmNlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaWYgdGhlIGN1c3RvbWVyIHN0aWxsIGxvYWRzIGpRdWVyeSBmcm9tIEdvb2dsZSdzIENETi4gKi9cbiAgaW5jbHVkZUdvb2dsZUFwaXM/OiBib29sZWFuO1xuICAvKiogSW5jbHVkZSBgc2NyaXB0LXNyYyAndW5zYWZlLWlubGluZSdgIChub3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24pLiAqL1xuICBpbmNsdWRlVW5zYWZlSW5saW5lU2NyaXB0PzogYm9vbGVhbjtcbiAgLyoqIEluY2x1ZGUgYHN0eWxlLXNyYyAndW5zYWZlLWlubGluZSdgIChub3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24pLiAqL1xuICBpbmNsdWRlVW5zYWZlSW5saW5lU3R5bGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBTaWFyYVNoaWVsZENzcERpcmVjdGl2ZXMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cbmNvbnN0IFNFTEYgPSBcIidzZWxmJ1wiO1xuY29uc3QgREFUQSA9ICdkYXRhOic7XG5jb25zdCBVTlNBRkVfSU5MSU5FID0gXCIndW5zYWZlLWlubGluZSdcIjtcblxuY29uc3QgU0NSSVBUX0hPU1RTID0gWydodHRwczovL2VtYmVkY2RuLm15Y3liZXJzaWFyYS5jb20nLCAnaHR0cHM6Ly9lbWJlZC5teWN5YmVyc2lhcmEuY29tJ10gYXMgY29uc3Q7XG5jb25zdCBPUFRJT05BTF9TQ1JJUFRfSE9TVFMgPSBbJ2h0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbSddIGFzIGNvbnN0O1xuY29uc3QgQ09OTkVDVF9IT1NUUyA9IFsnaHR0cHM6Ly9lbWJlZC5teWN5YmVyc2lhcmEuY29tJywgJ2h0dHBzOi8vZW1iZWRjZG4ubXljeWJlcnNpYXJhLmNvbSddIGFzIGNvbnN0O1xuY29uc3QgU1RZTEVfSE9TVFMgPSBbXG4gICdodHRwczovL2VtYmVkLm15Y3liZXJzaWFyYS5jb20nLFxuICAnaHR0cHM6Ly9teWN5YmVyc2lhcmEuY29tJyxcbiAgJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20nLFxuICAnaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbScsXG5dIGFzIGNvbnN0O1xuY29uc3QgRk9OVF9IT1NUUyA9IFtcbiAgJ2h0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20nLFxuICAnaHR0cHM6Ly9teWN5YmVyc2lhcmEuY29tJyxcbiAgJ2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20nLFxuXSBhcyBjb25zdDtcbmNvbnN0IElNR19IT1NUUyA9IFtcbiAgJ2h0dHBzOi8vZW1iZWQubXljeWJlcnNpYXJhLmNvbScsXG4gICdodHRwczovL2VtYmVkY2RuLm15Y3liZXJzaWFyYS5jb20nLFxuICAnaHR0cHM6Ly9teWN5YmVyc2lhcmEuY29tJyxcbl0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIHVuaXF1ZSh2YWx1ZXM6IEFycmF5PHN0cmluZyB8IHVuZGVmaW5lZD4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4ubmV3IFNldCh2YWx1ZXMuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlICYmIHZhbHVlLnRyaW0oKSkpKV07XG59XG5cbmZ1bmN0aW9uIG5vbmNlU291cmNlKG5vbmNlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG5vbmNlID8gYCdub25jZS0ke25vbmNlfSdgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVEaXJlY3RpdmUobmFtZTogc3RyaW5nLCB2YWx1ZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gYCR7bmFtZX0gJHt2YWx1ZXMuam9pbignICcpfWAgOiBuYW1lO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBvbGljeShwb2xpY3k6IHN0cmluZyk6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbiAgZm9yIChjb25zdCByYXdEaXJlY3RpdmUgb2YgcG9saWN5LnNwbGl0KCc7JykpIHtcbiAgICBjb25zdCBkaXJlY3RpdmUgPSByYXdEaXJlY3RpdmUudHJpbSgpO1xuICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0cyA9IGRpcmVjdGl2ZS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBbbmFtZSwgLi4udmFsdWVzXSA9IHBhcnRzO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZGlyZWN0aXZlcy5zZXQobmFtZSwgdmFsdWVzKTtcbiAgfVxuXG4gIHJldHVybiBkaXJlY3RpdmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lhcmFTaGllbGRDc3BEaXJlY3RpdmVzKG9wdGlvbnM/OiBTaWFyYVNoaWVsZENzcE9wdGlvbnMpOiBTaWFyYVNoaWVsZENzcERpcmVjdGl2ZXMge1xuICBjb25zdCBpbmNsdWRlR29vZ2xlQXBpcyA9IG9wdGlvbnM/LmluY2x1ZGVHb29nbGVBcGlzID8/IGZhbHNlO1xuICAvLyBEZWZhdWx0IHRvIHN0cmljdC9zYWZlIENTUC4gQ3VzdG9tZXJzIGNhbiBleHBsaWNpdGx5IG9wdC1pbiBpZiB0aGV5IGFjY2VwdCB0aGUgcmlzay5cbiAgY29uc3QgaW5jbHVkZVVuc2FmZUlubGluZVNjcmlwdCA9IG9wdGlvbnM/LmluY2x1ZGVVbnNhZmVJbmxpbmVTY3JpcHQgPz8gZmFsc2U7XG4gIGNvbnN0IGluY2x1ZGVVbnNhZmVJbmxpbmVTdHlsZSA9IG9wdGlvbnM/LmluY2x1ZGVVbnNhZmVJbmxpbmVTdHlsZSA/PyBmYWxzZTtcbiAgY29uc3Qgbm9uY2UgPSBub25jZVNvdXJjZShvcHRpb25zPy5ub25jZSk7XG4gIGNvbnN0IHNjcmlwdEhvc3RzID0gaW5jbHVkZUdvb2dsZUFwaXMgPyBbLi4uU0NSSVBUX0hPU1RTLCAuLi5PUFRJT05BTF9TQ1JJUFRfSE9TVFNdIDogWy4uLlNDUklQVF9IT1NUU107XG4gIGNvbnN0IHN0eWxlU291cmNlcyA9IHVuaXF1ZShbU0VMRiwgbm9uY2UsIC4uLlNUWUxFX0hPU1RTXSk7XG5cbiAgcmV0dXJuIHtcbiAgICAnZGVmYXVsdC1zcmMnOiB1bmlxdWUoW1NFTEZdKSxcbiAgICAvKipcbiAgICAgKiBDU1Agbm90ZTpcbiAgICAgKiAtIFZlbmRvciBIVE1MIGluY2x1ZGVzIGlubGluZSBldmVudCBoYW5kbGVycyAob25jbGljaywgZXRjKS4gQ1NQIG5vbmNlcyBkbyBOT1QgY292ZXIgdGhvc2UuXG4gICAgICogLSBXZSBrZWVwIGBzY3JpcHQtc3JjLWVsZW1gIHN0cmljdCAobm9uY2UgKyBob3N0IGFsbG93bGlzdCksIGFuZCBzY29wZSBpbmxpbmUgYWxsb3dhbmNlcyB0byBhdHRyaWJ1dGVzIG9ubHkuXG4gICAgICovXG4gICAgJ3NjcmlwdC1zcmMnOiB1bmlxdWUoW1NFTEYsIG5vbmNlLCAuLi5zY3JpcHRIb3N0cywgaW5jbHVkZVVuc2FmZUlubGluZVNjcmlwdCA/IFVOU0FGRV9JTkxJTkUgOiB1bmRlZmluZWRdKSxcbiAgICAnc2NyaXB0LXNyYy1lbGVtJzogdW5pcXVlKFtTRUxGLCBub25jZSwgLi4uc2NyaXB0SG9zdHNdKSxcbiAgICAnc2NyaXB0LXNyYy1hdHRyJzogdW5pcXVlKFtTRUxGLCBcIid1bnNhZmUtaW5saW5lJ1wiXSksXG4gICAgJ2Nvbm5lY3Qtc3JjJzogdW5pcXVlKFtTRUxGLCAuLi5DT05ORUNUX0hPU1RTXSksXG4gICAgJ2ltZy1zcmMnOiB1bmlxdWUoW1NFTEYsIERBVEEsIC4uLklNR19IT1NUU10pLFxuICAgIC8qKlxuICAgICAqIENTUCBub3RlOlxuICAgICAqIC0gQSBub25jZSBhbGxvd3MgYDxzdHlsZSBub25jZT1cIi4uLlwiPi4uLjwvc3R5bGU+YCBidXQgZG9lcyBOT1QgYWxsb3cgYHN0eWxlPVwiXCJgIGF0dHJpYnV0ZXMgLyBgZWxlbWVudC5zdHlsZT0uLi5gLlxuICAgICAqIC0gVmVuZG9yL2pRdWVyeSB1c2VzIHN0eWxlIGF0dHJpYnV0ZXMgaW4gc29tZSBmbG93cywgc28gd2Ugc2NvcGUgYCd1bnNhZmUtaW5saW5lJ2AgdG8gKmF0dHJpYnV0ZXMgb25seSouXG4gICAgICogLSBUaGlzIGtlZXBzIHNjcmlwdHMgc3RyaWN0IHdoaWxlIHJlc3RvcmluZyBjb21wYXRpYmlsaXR5IHdpdGhvdXQgcmVxdWlyaW5nIGBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnYC5cbiAgICAgKi9cbiAgICAnc3R5bGUtc3JjJzogdW5pcXVlKFsuLi5zdHlsZVNvdXJjZXMsIGluY2x1ZGVVbnNhZmVJbmxpbmVTdHlsZSA/IFVOU0FGRV9JTkxJTkUgOiB1bmRlZmluZWRdKSxcbiAgICAnc3R5bGUtc3JjLWVsZW0nOiB1bmlxdWUoc3R5bGVTb3VyY2VzKSxcbiAgICAnc3R5bGUtc3JjLWF0dHInOiB1bmlxdWUoW1NFTEYsIGluY2x1ZGVVbnNhZmVJbmxpbmVTdHlsZSA/IFVOU0FGRV9JTkxJTkUgOiBcIid1bnNhZmUtaW5saW5lJ1wiXSksXG4gICAgJ2ZvbnQtc3JjJzogdW5pcXVlKFtTRUxGLCAuLi5GT05UX0hPU1RTLCBEQVRBXSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaWFyYVNoaWVsZENzcFBvbGljeShvcHRpb25zPzogU2lhcmFTaGllbGRDc3BPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGdldFNpYXJhU2hpZWxkQ3NwRGlyZWN0aXZlcyhvcHRpb25zKSlcbiAgICAubWFwKChbbmFtZSwgdmFsdWVzXSkgPT4gc2VyaWFsaXplRGlyZWN0aXZlKG5hbWUsIHZhbHVlcykpXG4gICAgLmpvaW4oJzsgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVNpYXJhU2hpZWxkQ3NwUG9saWN5KGV4aXN0aW5nUG9saWN5OiBzdHJpbmcsIG9wdGlvbnM/OiBTaWFyYVNoaWVsZENzcE9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBkaXJlY3RpdmVzID0gcGFyc2VQb2xpY3koZXhpc3RpbmdQb2xpY3kpO1xuICBjb25zdCByZWNvbW1lbmRlZCA9IGdldFNpYXJhU2hpZWxkQ3NwRGlyZWN0aXZlcyhvcHRpb25zKTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29tbWVuZGVkKSkge1xuICAgIGRpcmVjdGl2ZXMuc2V0KG5hbWUsIHVuaXF1ZShbLi4uKGRpcmVjdGl2ZXMuZ2V0KG5hbWUpID8/IFtdKSwgLi4udmFsdWVzXSkpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi5kaXJlY3RpdmVzLmVudHJpZXMoKV1cbiAgICAubWFwKChbbmFtZSwgdmFsdWVzXSkgPT4gc2VyaWFsaXplRGlyZWN0aXZlKG5hbWUsIHZhbHVlcykpXG4gICAgLmpvaW4oJzsgJyk7XG59XG4iXX0=
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmEtc2hpZWxkLWNzcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpYXJhc2hpZWxkLXdvcmtzcGFjZS9zcmMvbGliL3NpYXJhLXNoaWVsZC1jc3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUEsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDO0FBQ3RCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUNyQixNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztBQUV4QyxNQUFNLFlBQVksR0FBRyxDQUFDLG1DQUFtQyxFQUFFLGdDQUFnQyxDQUFVLENBQUM7QUFDdEcsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLDZCQUE2QixDQUFVLENBQUM7QUFDdkUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxtQ0FBbUMsQ0FBVSxDQUFDO0FBQ3ZHLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLGdDQUFnQztJQUNoQywwQkFBMEI7SUFDMUIsOEJBQThCO0lBQzlCLDhCQUE4QjtDQUN0QixDQUFDO0FBQ1gsTUFBTSxVQUFVLEdBQUc7SUFDakIsMkJBQTJCO0lBQzNCLDBCQUEwQjtJQUMxQiw4QkFBOEI7Q0FDdEIsQ0FBQztBQUNYLE1BQU0sU0FBUyxHQUFHO0lBQ2hCLGdDQUFnQztJQUNoQyxtQ0FBbUM7SUFDbkMsMEJBQTBCO0NBQ2xCLENBQUM7QUFFWCxTQUFTLE1BQU0sQ0FBQyxNQUFpQztJQUMvQyxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUNqQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLEdBQUcsQ0FBQyxD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SUFFRCxPQUFPLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgU2lhcmFTaGllbGRDc3BPcHRpb25zIHtcclxuICAvKiogU2VydmVyLWdlbmVyYXRlZCBub25jZSB2YWx1ZSB3aXRob3V0IHRoZSBgJ25vbmNlLSdgIHByZWZpeC4gKi9cclxuICBub25jZT86IHN0cmluZztcclxuICAvKiogT3B0aW9uYWwgaWYgdGhlIGN1c3RvbWVyIHN0aWxsIGxvYWRzIGpRdWVyeSBmcm9tIEdvb2dsZSdzIENETi4gKi9cclxuICBpbmNsdWRlR29vZ2xlQXBpcz86IGJvb2xlYW47XHJcbiAgLyoqIEluY2x1ZGUgYHNjcmlwdC1zcmMgJ3Vuc2FmZS1pbmxpbmUnYCAobm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uKS4gKi9cclxuICBpbmNsdWRlVW5zYWZlSW5saW5lU2NyaXB0PzogYm9vbGVhbjtcclxuICAvKiogSW5jbHVkZSBgc2NyaXB0LXNyYy1hdHRyICdzZWxmJyAndW5zYWZlLWlubGluZSdgIGluc3RlYWQgb2YgYCdub25lJ2AuICovXHJcbiAgYWxsb3dJbmxpbmVFdmVudEF0dHJpYnV0ZXM/OiBib29sZWFuO1xyXG4gIC8qKiBJbmNsdWRlIGBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnYCAobm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uKS4gKi9cclxuICBpbmNsdWRlVW5zYWZlSW5saW5lU3R5bGU/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTaWFyYVNoaWVsZENzcERpcmVjdGl2ZXMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XHJcblxyXG5jb25zdCBTRUxGID0gXCInc2VsZidcIjtcclxuY29uc3QgREFUQSA9ICdkYXRhOic7XHJcbmNvbnN0IFVOU0FGRV9JTkxJTkUgPSBcIid1bnNhZmUtaW5saW5lJ1wiO1xyXG5cclxuY29uc3QgU0NSSVBUX0hPU1RTID0gWydodHRwczovL2VtYmVkY2RuLm15Y3liZXJzaWFyYS5jb20nLCAnaHR0cHM6Ly9lbWJlZC5teWN5YmVyc2lhcmEuY29tJ10gYXMgY29uc3Q7XHJcbmNvbnN0IE9QVElPTkFMX1NDUklQVF9IT1NUUyA9IFsnaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tJ10gYXMgY29uc3Q7XHJcbmNvbnN0IENPTk5FQ1RfSE9TVFMgPSBbJ2h0dHBzOi8vZW1iZWQubXljeWJlcnNpYXJhLmNvbScsICdodHRwczovL2VtYmVkY2RuLm15Y3liZXJzaWFyYS5jb20nXSBhcyBjb25zdDtcclxuY29uc3QgU1RZTEVfSE9TVFMgPSBbXHJcbiAgJ2h0dHBzOi8vZW1iZWQubXljeWJlcnNpYXJhLmNvbScsXHJcbiAgJ2h0dHBzOi8vbXljeWJlcnNpYXJhLmNvbScsXHJcbiAgJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20nLFxyXG4gICdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tJyxcclxuXSBhcyBjb25zdDtcclxuY29uc3QgRk9OVF9IT1NUUyA9IFtcclxuICAnaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbScsXHJcbiAgJ2h0dHBzOi8vbXljeWJlcnNpYXJhLmNvbScsXHJcbiAgJ2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20nLFxyXG5dIGFzIGNvbnN0O1xyXG5jb25zdCBJTUdfSE9TVFMgPSBbXHJcbiAgJ2h0dHBzOi8vZW1iZWQubXljeWJlcnNpYXJhLmNvbScsXHJcbiAgJ2h0dHBzOi8vZW1iZWRjZG4ubXljeWJlcnNpYXJhLmNvbScsXHJcbiAgJ2h0dHBzOi8vbXljeWJlcnNpYXJhLmNvbScsXHJcbl0gYXMgY29uc3Q7XHJcblxyXG5mdW5jdGlvbiB1bmlxdWUodmFsdWVzOiBBcnJheTxzdHJpbmcgfCB1bmRlZmluZWQ+KTogc3RyaW5nW10ge1xyXG4gIHJldHVybiBbLi4ubmV3IFNldCh2YWx1ZXMuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlICYmIHZhbHVlLnRyaW0oKSkpKV07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5vbmNlU291cmNlKG5vbmNlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICByZXR1cm4gbm9uY2UgPyBgJ25vbmNlLSR7bm9uY2V9J2AgOiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlcmlhbGl6ZURpcmVjdGl2ZShuYW1lOiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10pOiBzdHJpbmcge1xyXG4gIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IGAke25hbWV9ICR7dmFsdWVzLmpvaW4oJyAnKX1gIDogbmFtZTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VQb2xpY3kocG9saWN5OiBzdHJpbmcpOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xyXG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XHJcblxyXG4gIGZvciAoY29uc3QgcmF3RGlyZWN0aXZlIG9mIHBvbGljeS5zcGxpdCgnOycpKSB7XHJcbiAgICBjb25zdCBkaXJlY3RpdmUgPSByYXdEaXJlY3RpdmUudHJpbSgpO1xyXG4gICAgaWYgKCFkaXJlY3RpdmUpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGFydHMgPSBkaXJlY3RpdmUuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICBjb25zdCBbbmFtZSwgLi4udmFsdWVzXSA9IHBhcnRzO1xyXG4gICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRpcmVjdGl2ZXMuc2V0KG5hbWUsIHZhbHVlcyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGlyZWN0aXZlcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpYXJhU2hpZWxkQ3NwRGlyZWN0aXZlcyhvcHRpb25zPzogU2lhcmFTaGllbGRDc3BPcHRpb25zKTogU2lhcmFTaGllbGRDc3BEaXJlY3RpdmVzIHtcclxuICBjb25zdCBpbmNsdWRlR29vZ2xlQXBpcyA9IG9wdGlvbnM/LmluY2x1ZGVHb29nbGVBcGlzID8/IGZhbHNlO1xyXG4gIC8vIERlZmF1bHQgdG8gc3RyaWN0L3NhZmUgQ1NQLiBDdXN0b21lcnMgY2FuIGV4cGxpY2l0bHkgb3B0LWluIGlmIHRoZXkgYWNjZXB0IHRoZSByaXNrLlxyXG4gIGNvbnN0IGluY2x1ZGVVbnNhZmVJbmxpbmVTY3JpcHQgPSBvcHRpb25zPy5pbmNsdWRlVW5zYWZlSW5saW5lU2NyaXB0ID8/IGZhbHNlO1xyXG4gIGNvbnN0IGluY2x1ZGVVbnNhZmVJbmxpbmVTdHlsZSA9IG9wdGlvbnM/LmluY2x1ZGVVbnNhZmVJbmxpbmVTdHlsZSA/PyBmYWxzZTtcclxuICBjb25zdCBhbGxvd0lubGluZUV2ZW50QXR0cmlidXRlcyA9IG9wdGlvbnM/LmFsbG93SW5saW5lRXZlbnRBdHRyaWJ1dGVzID8/IGZhbHNlO1xyXG4gIGNvbnN0IG5vbmNlID0gbm9uY2VTb3VyY2Uob3B0aW9ucz8ubm9uY2UpO1xyXG4gIGNvbnN0IHNjcmlwdEhvc3RzID0gaW5jbHVkZUdvb2dsZUFwaXMgPyBbLi4uU0NSSVBUX0hPU1RTLCAuLi5PUFRJT05BTF9TQ1JJUFRfSE9TVFNdIDogWy4uLlNDUklQVF9IT1NUU107XHJcbiAgY29uc3Qgc3R5bGVTb3VyY2VzID0gdW5pcXVlKFtTRUxGLCBub25jZSwgLi4uU1RZTEVfSE9TVFNdKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgICdkZWZhdWx0LXNyYyc6IHVuaXF1ZShbU0VMRl0pLFxyXG4gICAgLyoqXHJcbiAgICAgKiBDU1Agbm90ZTpcclxuICAgICAqIC0gVmVuZG9yIEhUTUwgY2FuIGluY2x1ZGUgaW5saW5lIGV2ZW50IGhhbmRsZXJzIChvbmNsaWNrLCBldGMpLiBDU1Agbm9uY2VzIGRvIE5PVCBjb3ZlciB0aG9zZS5cclxuICAgICAqIC0gV2l0aCBhIGNvbmZpZ3VyZWQgbm9uY2UsIHRoZSBwYWNrYWdlIG1pZ3JhdGVzIHRob3NlIGhhbmRsZXJzIHRvIGFkZEV2ZW50TGlzdGVuZXIgc28gYHNjcmlwdC1zcmMtYXR0ciAnbm9uZSdgIHdvcmtzLlxyXG4gICAgICovXHJcbiAgICAnc2NyaXB0LXNyYyc6IHVuaXF1ZShbU0VMRiwgbm9uY2UsIC4uLnNjcmlwdEhvc3RzLCBpbmNsdWRlVW5zYWZlSW5saW5lU2NyaXB0ID8gVU5TQUZFX0lOTElORSA6IHVuZGVmaW5lZF0pLFxyXG4gICAgJ3NjcmlwdC1zcmMtZWxlbSc6IHVuaXF1ZShbU0VMRiwgbm9uY2UsIC4uLnNjcmlwdEhvc3RzXSksXHJcbiAgICAnc2NyaXB0LXNyYy1hdHRyJzogdW5pcXVlKGFsbG93SW5saW5lRXZlbnRBdHRyaWJ1dGVzID8gW1NFTEYsIFVOU0FGRV9JTkxJTkVdIDogW1wiJ25vbmUnXCJdKSxcclxuICAgICdjb25uZWN0LXNyYyc6IHVuaXF1ZShbU0VMRiwgLi4uQ09OTkVDVF9IT1NUU10pLFxyXG4gICAgJ2ltZy1zcmMnOiB1bmlxdWUoW1NFTEYsIERBVEEsIC4uLklNR19IT1NUU10pLFxyXG4gICAgLyoqXHJcbiAgICAgKiBDU1Agbm90ZTpcclxuICAgICAqIC0gQSBub25jZSBhbGxvd3MgYDxzdHlsZSBub25jZT1cIi4uLlwiPi4uLjwvc3R5bGU+YCBidXQgZG9lcyBOT1QgYWxsb3cgYHN0eWxlPVwiXCJgIGF0dHJpYnV0ZXMgLyBgZWxlbWVudC5zdHlsZT0uLi5gLlxyXG4gICAgICogLSBWZW5kb3IvalF1ZXJ5IHVzZXMgc3R5bGUgYXR0cmlidXRlcyBpbiBzb21lIGZsb3dzLCBzbyB3ZSBzY29wZSBgJ3Vuc2FmZS1pbmxpbmUnYCB0byAqYXR0cmlidXRlcyBvbmx5Ki5cclxuICAgICAqIC0gVGhpcyBrZWVwcyBzY3JpcHRzIHN0cmljdCB3aGlsZSByZXN0b3JpbmcgY29tcGF0aWJpbGl0eSB3aXRob3V0IHJlcXVpcmluZyBgc3R5bGUtc3JjICd1bnNhZmUtaW5saW5lJ2AuXHJcbiAgICAgKi9cclxuICAgICdzdHlsZS1zcmMnOiB1bmlxdWUoWy4uLnN0eWxlU291cmNlcywgaW5jbHVkZVVuc2FmZUlubGluZVN0eWxlID8gVU5TQUZFX0lOTElORSA6IHVuZGVmaW5lZF0pLFxyXG4gICAgJ3N0eWxlLXNyYy1lbGVtJzogdW5pcXVlKHN0eWxlU291cmNlcyksXHJcbiAgICAnc3R5bGUtc3JjLWF0dHInOiB1bmlxdWUoW1NFTEYsIGluY2x1ZGVVbnNhZmVJbmxpbmVTdHlsZSA/IFVOU0FGRV9JTkxJTkUgOiBcIid1bnNhZmUtaW5saW5lJ1wiXSksXHJcbiAgICAnZm9udC1zcmMnOiB1bmlxdWUoW1NFTEYsIC4uLkZPTlRfSE9TVFMsIERBVEFdKSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lhcmFTaGllbGRDc3BQb2xpY3kob3B0aW9ucz86IFNpYXJhU2hpZWxkQ3NwT3B0aW9ucyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGdldFNpYXJhU2hpZWxkQ3NwRGlyZWN0aXZlcyhvcHRpb25zKSlcclxuICAgIC5tYXAoKFtuYW1lLCB2YWx1ZXNdKSA9PiBzZXJpYWxpemVEaXJlY3RpdmUobmFtZSwgdmFsdWVzKSlcclxuICAgIC5qb2luKCc7ICcpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VTaWFyYVNoaWVsZENzcFBvbGljeShleGlzdGluZ1BvbGljeTogc3RyaW5nLCBvcHRpb25zPzogU2lhcmFTaGllbGRDc3BPcHRpb25zKTogc3RyaW5nIHtcclxuICBjb25zdCBkaXJlY3RpdmVzID0gcGFyc2VQb2xpY3koZXhpc3RpbmdQb2xpY3kpO1xyXG4gIGNvbnN0IHJlY29tbWVuZGVkID0gZ2V0U2lhcmFTaGllbGRDc3BEaXJlY3RpdmVzKG9wdGlvbnMpO1xyXG5cclxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29tbWVuZGVkKSkge1xyXG4gICAgZGlyZWN0aXZlcy5zZXQobmFtZSwgdW5pcXVlKFsuLi4oZGlyZWN0aXZlcy5nZXQobmFtZSkgPz8gW10pLCAuLi52YWx1ZXNdKSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gWy4uLmRpcmVjdGl2ZXMuZW50cmllcygpXVxyXG4gICAgLm1hcCgoW25hbWUsIHZhbHVlc10pID0+IHNlcmlhbGl6ZURpcmVjdGl2ZShuYW1lLCB2YWx1ZXMpKVxyXG4gICAgLmpvaW4oJzsgJyk7XHJcbn1cclxuIl19
@@ -1,3 +1,4 @@
1
+ import { installVendorInlineEventMigration } from './siara-shield-vendor-event-migration';
1
2
  const SCRIPT_STATUS_BY_DOCUMENT = new WeakMap();
2
3
  const SCRIPT_PENDING_BY_DOCUMENT = new WeakMap();
3
4
  const DYNAMIC_SCRIPT_NONCE_STATE_KEY = '__siaraShieldDynamicScriptNonceState__';
@@ -267,6 +268,7 @@ export function prepareScriptNonce(documentRef, explicitNonce) {
267
268
  if (effectiveDocumentRef) {
268
269
  patchState.nonceByDocument.set(effectiveDocumentRef, resolvedNonce);
269
270
  ensureNonceMutationObserver(effectiveDocumentRef);
271
+ installVendorInlineEventMigration(effectiveDocumentRef);
270
272
  }
271
273
  }
272
274
  else {
@@ -315,4 +317,4 @@ export function loadScript(documentRef, src, options) {
315
317
  pendingBySrc.set(src, pending);
316
318
  return pending;
317
319
  }
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmEtc2hpZWxkLXNjcmlwdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpYXJhc2hpZWxkLXdvcmtzcGFjZS9zcmMvbGliL3NpYXJhLXNoaWVsZC1zY3JpcHQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYUEsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBdUMsQ0FBQztBQUNyRixNQUFNLDBCQUEwQixHQUFHLElBQUksT0FBTyxFQUF3QyxDQUFDO0FBQ3ZGLE1BQU0sOEJBQThCLEdBQUcsd0NBQXdDLENBQUM7QUFFaEYsU0FBUyxjQUFjLENBQUMsV0FBcUI7SUFDM0MsSUFBSSxXQUFXLEdBQUcseUJBQXlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFDOUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLFdBQXFCO0lBQzVDLElBQUksWUFBWSxHQUFHLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsWUFBWSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQ2hELDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLCtCQUErQjtJQUN0QyxNQUFNLFdBQVcsR0FBRyxVQUVuQixDQUFDO0lBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUM7UUFD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QUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbInR5cGUgU2NyaXB0U3RhdHVzID0gJ2xvYWRpbmcnIHwgJ2xvYWRlZCcgfCAnZXJyb3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdExvYWRPcHRpb25zIHtcbiAgbm9uY2U/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBEeW5hbWljU2NyaXB0Tm9uY2VQYXRjaFN0YXRlIHtcbiAgbm9uY2VCeURvY3VtZW50OiBXZWFrTWFwPERvY3VtZW50LCBzdHJpbmc+O1xuICBvYnNlcnZlckJ5RG9jdW1lbnQ6IFdlYWtNYXA8RG9jdW1lbnQsIE11dGF0aW9uT2JzZXJ2ZXI+O1xuICBpbmxpbmVDYXB0Y2hhU2NyaXB0QnlEb2N1bWVudDogV2Vha01hcDxEb2N1bWVudCwgU2V0PHN0cmluZz4+O1xuICBwYXRjaGVkOiBib29sZWFuO1xufVxuXG5jb25zdCBTQ1JJUFRfU1RBVFVTX0JZX0RPQ1VNRU5UID0gbmV3IFdlYWtNYXA8RG9jdW1lbnQsIE1hcDxzdHJpbmcsIFNjcmlwdFN0YXR1cz4+KCk7XG5jb25zdCBTQ1JJUFRfUEVORElOR19CWV9ET0NVTUVOVCA9IG5ldyBXZWFrTWFwPERvY3VtZW50LCBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+Pj4oKTtcbmNvbnN0IERZTkFNSUNfU0NSSVBUX05PTkNFX1NUQVRFX0tFWSA9ICdfX3NpYXJhU2hpZWxkRHluYW1pY1NjcmlwdE5vbmNlU3RhdGVfXyc7XG5cbmZ1bmN0aW9uIGdldFN0YXR1c0J5U3JjKGRvY3VtZW50UmVmOiBEb2N1bWVudCk6IE1hcDxzdHJpbmcsIFNjcmlwdFN0YXR1cz4ge1xuICBsZXQgc3RhdHVzQnlTcmMgPSBTQ1JJUFRfU1RBVFVTX0JZX0RPQ1VNRU5ULmdldChkb2N1bWVudFJlZik7XG4gIGlmICghc3RhdHVzQnlTcmMpIHtcbiAgICBzdGF0dXNCeVNyYyA9IG5ldyBNYXA8c3RyaW5nLCBTY3JpcHRTdGF0dXM+KCk7XG4gICAgU0NSSVBUX1NUQVRVU19CWV9ET0NVTUVOVC5zZXQoZG9jdW1lbnRSZWYsIHN0YXR1c0J5U3JjKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0dXNCeVNyYztcbn1cblxuZnVuY3Rpb24gZ2V0UGVuZGluZ0J5U3JjKGRvY3VtZW50UmVmOiBEb2N1bWVudCk6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+IHtcbiAgbGV0IHBlbmRpbmdCeVNyYyA9IFNDUklQVF9QRU5ESU5HX0JZX0RPQ1VNRU5ULmdldChkb2N1bWVudFJlZik7XG4gIGlmICghcGVuZGluZ0J5U3JjKSB7XG4gICAgcGVuZGluZ0J5U3JjID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG4gICAgU0NSSVBUX1BFTkRJTkdfQllfRE9DVU1FTlQuc2V0KGRvY3VtZW50UmVmLCBwZW5kaW5nQnlTcmMpO1xuICB9XG5cbiAgcmV0dXJuIHBlbmRpbmdCeVNyYztcbn1cblxuZnVuY3Rpb24gZ2V0RHluYW1pY1NjcmlwdE5vbmNlUGF0Y2hTdGF0ZSgpOiBEeW5hbWljU2NyaXB0Tm9uY2VQYXRjaFN0YXRlIHtcbiAgY29uc3QgZ2xvYmFsU3RhdGUgPSBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgIFtEWU5BTUlDX1NDUklQVF9OT05DRV9TVEFURV9LRVldPzogRHluYW1pY1NjcmlwdE5vbmNlUGF0Y2hTdGF0ZTtcbiAgfTtcblxuICBpZiAoIWdsb2JhbFN0YXRlW0RZTkFNSUNfU0NSSVBUX05PTkNFX1NUQVRFX0tFWV0pIHtcbiAgICBnbG9iYWxTdGF0ZVtEWU5BTUlDX1NDUklQVF9OT05DRV9TVEFURV9LRVldID0ge1xuICAgICAgbm9uY2VCeURvY3VtZW50OiBuZXcgV2Vha01hcDxEb2N1bWVudCwgc3RyaW5nPigpLFxuICAgICAgb2JzZXJ2ZXJCeURvY3VtZW50OiBuZXcgV2Vha01hcDxEb2N1bWVudCwgTXV0YXRpb25PYnNlcnZlcj4oKSxcbiAgICAgIGlubGluZUNhcHRjaGFTY3JpcHRCeURvY3VtZW50OiBuZXcgV2Vha01hcDxEb2N1bWVudCwgU2V0PHN0cmluZz4+KCksXG4gICAgICBwYXRjaGVkOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGdsb2JhbFN0YXRlW0RZTkFNSUNfU0NSSVBUX05PTkNFX1NUQVRFX0tFWV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5vbmNlKG5vbmNlPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBub25jZT8udHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZCA/IHRyaW1tZWQgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzU2NyaXB0RWxlbWVudChub2RlOiBOb2RlKTogbm9kZSBpcyBIVE1MU2NyaXB0RWxlbWVudCB7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3NjcmlwdCc7XG59XG5cbmZ1bmN0aW9uIGlzU3R5bGVFbGVtZW50KG5vZGU6IE5vZGUpOiBub2RlIGlzIEhUTUxTdHlsZUVsZW1lbnQge1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdHlsZSc7XG59XG5cbmZ1bmN0aW9uIGlzU3R5bGVzaGVldExpbmtFbGVtZW50KG5vZGU6IE5vZGUpOiBub2RlIGlzIEhUTUxMaW5rRWxlbWVudCB7XG4gIGlmICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB8fCBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2xpbmsnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlbCA9IChub2RlLmdldEF0dHJpYnV0ZSgncmVsJykgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiByZWwgPT09ICdzdHlsZXNoZWV0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U2NyaXB0Tm9uY2Uoc2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCwgbm9uY2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVzb2x2ZWROb25jZSA9IG5vcm1hbGl6ZU5vbmNlKG5vbmNlKTtcbiAgaWYgKCFyZXNvbHZlZE5vbmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnbm9uY2UnLCByZXNvbHZlZE5vbmNlKTtcbiAgc2NyaXB0Lm5vbmNlID0gcmVzb2x2ZWROb25jZTtcblxuICAvLyBTb21lIHZlbmRvciBIVE1MIGZyYWdtZW50cyBpbmNsdWRlIGlubGluZSBzY3JpcHRzIHRoYXQgZXhlY3V0ZSBpbW1lZGlhdGVseSBkdXJpbmcgaW5zZXJ0aW9uLlxuICAvLyBJbiBzdHJpY3QgQ1NQIG1vZGUgdGhlc2UgcnVuIHdpdGggYSBub25jZSwgYnV0IGNhbiBzdGlsbCByYWNlIERPTSBpbnNlcnRpb24gYW5kIGNyYXNoXG4gIC8vIChlLmcuIGBudWxsLnF1ZXJ5U2VsZWN0b3IoLi4uKWApLiBXZSBkZWZlbnNpdmVseSByZXRyeSBvbmNlIG9uIGZhaWx1cmUuXG4gIGlmICghc2NyaXB0LnNyYykge1xuICAgIGNvbnN0IGJvZHkgPSBzY3JpcHQudGV4dENvbnRlbnQgPz8gJyc7XG4gICAgaWYgKGJvZHkgJiYgIWJvZHkuaW5jbHVkZXMoJ19fc2lhcmFTaGllbGRJbmxpbmVSZXRyeV9fJykpIHtcbiAgICAgIHNjcmlwdC50ZXh0Q29udGVudCA9IGAoZnVuY3Rpb24oKXtcXG5gICtcbiAgICAgICAgYCAgdmFyIF9fc2lhcmFTaGllbGRJbmxpbmVSZXRyeV9fID0gdHJ1ZTtcXG5gICtcbiAgICAgICAgYCAgZnVuY3Rpb24gX19ydW4oKXtcXG4ke2JvZHl9XFxuICB9XFxuYCArXG4gICAgICAgIGAgIHRyeSB7IF9fcnVuKCk7IH0gY2F0Y2ggKGUpIHtcXG5gICtcbiAgICAgICAgYCAgICB0cnkgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IHRyeSB7IF9fcnVuKCk7IH0gY2F0Y2ggKF9lKSB7fSB9LCAwKTsgfSBjYXRjaCAoX3QpIHt9XFxuYCArXG4gICAgICAgIGAgIH1cXG5gICtcbiAgICAgICAgYH0pKCk7YDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlTdHlsZU5vbmNlKHN0eWxlOiBIVE1MU3R5bGVFbGVtZW50LCBub25jZT86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZXNvbHZlZE5vbmNlID0gbm9ybWFsaXplTm9uY2Uobm9uY2UpO1xuICBpZiAoIXJlc29sdmVkTm9uY2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgcmVzb2x2ZWROb25jZSk7XG4gIHN0eWxlLm5vbmNlID0gcmVzb2x2ZWROb25jZTtcbn1cblxuZnVuY3Rpb24gYXBwbHlMaW5rTm9uY2UobGluazogSFRNTExpbmtFbGVtZW50LCBub25jZT86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZXNvbHZlZE5vbmNlID0gbm9ybWFsaXplTm9uY2Uobm9uY2UpO1xuICBpZiAoIXJlc29sdmVkTm9uY2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5rLnNldEF0dHJpYnV0ZSgnbm9uY2UnLCByZXNvbHZlZE5vbmNlKTtcbiAgLy8gYEhUTUxMaW5rRWxlbWVudC5ub25jZWAgZXhpc3RzIGluIG1vZGVybiBicm93c2Vycy5cbiAgKGxpbmsgYXMgSFRNTExpbmtFbGVtZW50ICYgeyBub25jZT86IHN0cmluZyB9KS5ub25jZSA9IHJlc29sdmVkTm9uY2U7XG59XG5cbmZ1bmN0aW9uIGFwcGx5Tm9uY2VUb05vZGUobm9kZTogTm9kZSwgbm9uY2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGlzU2NyaXB0RWxlbWVudChub2RlKSkge1xuICAgIGFwcGx5U2NyaXB0Tm9uY2Uobm9kZSwgbm9uY2UpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNTdHlsZUVsZW1lbnQobm9kZSkpIHtcbiAgICBhcHBseVN0eWxlTm9uY2Uobm9kZSwgbm9uY2UpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNTdHlsZXNoZWV0TGlua0VsZW1lbnQobm9kZSkpIHtcbiAgICBhcHBseUxpbmtOb25jZShub2RlLCBub25jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlUcmFja2VkTm9uY2Uobm9kZTogTm9kZSk6IHZvaWQge1xuICBjb25zdCBkb2N1bWVudFJlZiA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgaWYgKCFkb2N1bWVudFJlZikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5vbmNlID0gZ2V0RHluYW1pY1NjcmlwdE5vbmNlUGF0Y2hTdGF0ZSgpLm5vbmNlQnlEb2N1bWVudC5nZXQoZG9jdW1lbnRSZWYpO1xuICBhcHBseU5vbmNlVG9Ob2RlKG5vZGUsIG5vbmNlKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhY2tlZElubGluZUNhcHRjaGFTY3JpcHRzKGRvY3VtZW50UmVmOiBEb2N1bWVudCk6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgcGF0Y2hTdGF0ZSA9IGdldER5bmFtaWNTY3JpcHROb25jZVBhdGNoU3RhdGUoKTtcbiAgbGV0IHRyYWNrZWRTY3JpcHRzID0gcGF0Y2hTdGF0ZS5pbmxpbmVDYXB0Y2hhU2NyaXB0QnlEb2N1bWVudC5nZXQoZG9jdW1lbnRSZWYpO1xuICBpZiAoIXRyYWNrZWRTY3JpcHRzKSB7XG4gICAgdHJhY2tlZFNjcmlwdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwYXRjaFN0YXRlLmlubGluZUNhcHRjaGFTY3JpcHRCeURvY3VtZW50LnNldChkb2N1bWVudFJlZiwgdHJhY2tlZFNjcmlwdHMpO1xuICB9XG5cbiAgcmV0dXJuIHRyYWNrZWRTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTa2lwRHVwbGljYXRlSW5saW5lQ2FwdGNoYVNjcmlwdChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGlmICghaXNTY3JpcHRFbGVtZW50KG5vZGUpIHx8IEJvb2xlYW4obm9kZS5zcmMpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgc2NyaXB0Qm9keSA9IChub2RlLnRleHRDb250ZW50ID8/ICcnKS50cmltKCk7XG4gIGlmICghc2NyaXB0Qm9keSB8fCAhc2NyaXB0Qm9keS5pbmNsdWRlcygnY3VycmVudExhbmdDb2RlJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBkb2N1bWVudFJlZiA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgaWYgKCFkb2N1bWVudFJlZikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHRyYWNrZWRTY3JpcHRzID0gZ2V0VHJhY2tlZElubGluZUNhcHRjaGFTY3JpcHRzKGRvY3VtZW50UmVmKTtcbiAgaWYgKHRyYWNrZWRTY3JpcHRzLmhhcyhzY3JpcHRCb2R5KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJhY2tlZFNjcmlwdHMuYWRkKHNjcmlwdEJvZHkpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHdhbGtBbmRBcHBseU5vbmNlKHJvb3Q6IE5vZGUsIG5vbmNlPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghbm9uY2UpIHJldHVybjtcblxuICAvLyBGYXN0IHBhdGg6IHJvb3QgaXRzZWxmIGlzIG5vbmNlYWJsZS5cbiAgaWYgKGlzU2NyaXB0RWxlbWVudChyb290KSB8fCBpc1N0eWxlRWxlbWVudChyb290KSB8fCBpc1N0eWxlc2hlZXRMaW5rRWxlbWVudChyb290KSkge1xuICAgIGFwcGx5Tm9uY2VUb05vZGUocm9vdCwgbm9uY2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENvbW1vbiBwYXRoIGZvciBqUXVlcnk6IGFwcGVuZCBEb2N1bWVudEZyYWdtZW50IGNvbnRhaW5pbmcgbm9kZXMgY3JlYXRlZCB2aWEgSFRNTCBwYXJzaW5nLlxuICBpZiAocm9vdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgcm9vdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICBjb25zdCBub25jZWFibGUgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGw/Lignc2NyaXB0LHN0eWxlLGxpbmtbcmVsPVwic3R5bGVzaGVldFwiXScpID8/IFtdO1xuICAgIGZvciAoY29uc3QgZWwgb2Ygbm9uY2VhYmxlKSB7XG4gICAgICBhcHBseU5vbmNlVG9Ob2RlKGVsIGFzIHVua25vd24gYXMgTm9kZSwgbm9uY2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlbnN1cmVOb25jZU11dGF0aW9uT2JzZXJ2ZXIoZG9jdW1lbnRSZWY6IERvY3VtZW50KTogdm9pZCB7XG4gIGNvbnN0IHBhdGNoU3RhdGUgPSBnZXREeW5hbWljU2NyaXB0Tm9uY2VQYXRjaFN0YXRlKCk7XG4gIGlmIChwYXRjaFN0YXRlLm9ic2VydmVyQnlEb2N1bWVudC5nZXQoZG9jdW1lbnRSZWYpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigocmVjb3JkcykgPT4ge1xuICAgIGNvbnN0IG5vbmNlID0gcGF0Y2hTdGF0ZS5ub25jZUJ5RG9jdW1lbnQuZ2V0KGRvY3VtZW50UmVmKTtcbiAgICBpZiAoIW5vbmNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcmVjb3JkLmFkZGVkTm9kZXMpIHtcbiAgICAgICAgd2Fsa0FuZEFwcGx5Tm9uY2Uobm9kZSwgbm9uY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gT2JzZXJ2ZSB0aGUgZnVsbCBkb2N1bWVudCBiZWNhdXNlIHNjcmlwdHMgY2FuIGJlIGluamVjdGVkIGludG8gYm9keS9oZWFkIGJ5IHZlbmRvci9qUXVlcnkuXG4gIGNvbnN0IHJvb3QgPSBkb2N1bWVudFJlZi5kb2N1bWVudEVsZW1lbnQgPz8gZG9jdW1lbnRSZWY7XG4gIG9ic2VydmVyLm9ic2VydmUocm9vdCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gIHBhdGNoU3RhdGUub2JzZXJ2ZXJCeURvY3VtZW50LnNldChkb2N1bWVudFJlZiwgb2JzZXJ2ZXIpO1xufVxuXG5mdW5jdGlvbiB0ZWFyZG93bk5vbmNlTXV0YXRpb25PYnNlcnZlcihkb2N1bWVudFJlZjogRG9jdW1lbnQpOiB2b2lkIHtcbiAgY29uc3QgcGF0Y2hTdGF0ZSA9IGdldER5bmFtaWNTY3JpcHROb25jZVBhdGNoU3RhdGUoKTtcbiAgY29uc3Qgb2JzZXJ2ZXIgPSBwYXRjaFN0YXRlLm9ic2VydmVyQnlEb2N1bWVudC5nZXQoZG9jdW1lbnRSZWYpO1xuICBpZiAoIW9ic2VydmVyKSByZXR1cm47XG4gIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgcGF0Y2hTdGF0ZS5vYnNlcnZlckJ5RG9jdW1lbnQuZGVsZXRlKGRvY3VtZW50UmVmKTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0Tm9uY2VJbnRvSHRtbChodG1sOiBzdHJpbmcsIG5vbmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZE5vbmNlID0gbm9ybWFsaXplTm9uY2Uobm9uY2UpO1xuICBpZiAoIXJlc29sdmVkTm9uY2UpIHJldHVybiBodG1sO1xuXG4gIC8vIElmIHRhZyBhbHJlYWR5IGluY2x1ZGVzIG5vbmNlLCBsZWF2ZSBpdC5cbiAgY29uc3Qgd2l0aE5vbmNlQXR0ciA9IGAgbm9uY2U9XCIke3Jlc29sdmVkTm9uY2V9XCJgO1xuXG4gIGNvbnN0IGFkZE5vbmNlVG9UYWcgPSAodGFnOiAnc2NyaXB0JyB8ICdzdHlsZScpID0+IHtcbiAgICBjb25zdCBvcGVuVGFnID0gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPyk/PmAsICdnaScpO1xuICAgIHJldHVybiAoaW5wdXQ6IHN0cmluZykgPT5cbiAgICAgIGlucHV0LnJlcGxhY2Uob3BlblRhZywgKG1hdGNoKSA9PiB7XG4gICAgICAgIGlmICgvW1xcc1wiJ11ub25jZVxccyo9Ly50ZXN0KG1hdGNoKSkgcmV0dXJuIG1hdGNoO1xuICAgICAgICAvLyBJbnNlcnQgbm9uY2UgYmVmb3JlIGNsb3NpbmcgYD5gXG4gICAgICAgIHJldHVybiBtYXRjaC5yZXBsYWNlKC8+JC8sIGAke3dpdGhOb25jZUF0dHJ9PmApO1xuICAgICAgfSk7XG4gIH07XG5cbiAgLy8gRm9yIGxpbmsgcmVsPXN0eWxlc2hlZXQsIGFkZCBub25jZSB3aGVuIG1pc3NpbmcuXG4gIGNvbnN0IGxpbmtPcGVuVGFnID0gLzxsaW5rXFxiW14+XSo+L2dpO1xuICBjb25zdCBhZGROb25jZVRvU3R5bGVzaGVldExpbmsgPSAoaW5wdXQ6IHN0cmluZykgPT5cbiAgICBpbnB1dC5yZXBsYWNlKGxpbmtPcGVuVGFnLCAobWF0Y2gpID0+IHtcbiAgICAgIGlmICgvW1xcc1wiJ11ub25jZVxccyo9Ly50ZXN0KG1hdGNoKSkgcmV0dXJuIG1hdGNoO1xuICAgICAgaWYgKCEvXFxicmVsXFxzKj1cXHMqW1wiJ10/c3R5bGVzaGVldFtcIiddPy9pLnRlc3QobWF0Y2gpKSByZXR1cm4gbWF0Y2g7XG4gICAgICByZXR1cm4gbWF0Y2gucmVwbGFjZSgvPiQvLCBgJHt3aXRoTm9uY2VBdHRyfT5gKTtcbiAgICB9KTtcblxuICByZXR1cm4gYWRkTm9uY2VUb1N0eWxlc2hlZXRMaW5rKGFkZE5vbmNlVG9UYWcoJ3N0eWxlJykoYWRkTm9uY2VUb1RhZygnc2NyaXB0JykoaHRtbCkpKTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hEeW5hbWljU2NyaXB0SW5zZXJ0aW9uKCk6IHZvaWQge1xuICBjb25zdCBwYXRjaFN0YXRlID0gZ2V0RHluYW1pY1NjcmlwdE5vbmNlUGF0Y2hTdGF0ZSgpO1xuICBpZiAocGF0Y2hTdGF0ZS5wYXRjaGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxBcHBlbmRDaGlsZCA9IE5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO1xuICBjb25zdCBvcmlnaW5hbEluc2VydEJlZm9yZSA9IE5vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZTtcbiAgY29uc3Qgb3JpZ2luYWxSZXBsYWNlQ2hpbGQgPSBOb2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQ7XG4gIGNvbnN0IG9yaWdpbmFsSW5zZXJ0QWRqYWNlbnRIVE1MID0gRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRIVE1MO1xuXG4gIE5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKTogVCB7XG4gICAgLy8gVmVuZG9yIGNhcHRjaGEgaW5qZWN0cyBhbiBpbmxpbmUgc25pcHBldCB3aXRoIGBjdXJyZW50TGFuZ0NvZGVgIHRoYXQgY3Jhc2hlcyB3aGVuIGFwcGVuZGVkIHR3aWNlLlxuICAgIGlmIChzaG91bGRTa2lwRHVwbGljYXRlSW5saW5lQ2FwdGNoYVNjcmlwdChub2RlKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFwcGx5VHJhY2tlZE5vbmNlKG5vZGUpO1xuICAgIHJldHVybiBvcmlnaW5hbEFwcGVuZENoaWxkLmNhbGwodGhpcywgbm9kZSkgYXMgVDtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiA8VCBleHRlbmRzIE5vZGU+KG5vZGU6IFQsIGNoaWxkOiBOb2RlIHwgbnVsbCk6IFQge1xuICAgIGlmIChzaG91bGRTa2lwRHVwbGljYXRlSW5saW5lQ2FwdGNoYVNjcmlwdChub2RlKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFwcGx5VHJhY2tlZE5vbmNlKG5vZGUpO1xuICAgIHJldHVybiBvcmlnaW5hbEluc2VydEJlZm9yZS5jYWxsKHRoaXMsIG5vZGUsIGNoaWxkKSBhcyBUO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgTm9kZT4obm9kZTogTm9kZSwgY2hpbGQ6IFQpOiBUIHtcbiAgICBhcHBseVRyYWNrZWROb25jZShub2RlKTtcbiAgICByZXR1cm4gb3JpZ2luYWxSZXBsYWNlQ2hpbGQuY2FsbCh0aGlzLCBub2RlLCBjaGlsZCkgYXMgVDtcbiAgfTtcblxuICBFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEhUTUwgPSBmdW5jdGlvbiAocG9zaXRpb246IEluc2VydFBvc2l0aW9uLCB0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkb2N1bWVudFJlZiA9IHRoaXMub3duZXJEb2N1bWVudDtcbiAgICBjb25zdCBub25jZSA9IGRvY3VtZW50UmVmID8gcGF0Y2hTdGF0ZS5ub25jZUJ5RG9jdW1lbnQuZ2V0KGRvY3VtZW50UmVmKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXRjaGVkVGV4dCA9IG5vbmNlID8gaW5qZWN0Tm9uY2VJbnRvSHRtbCh0ZXh0LCBub25jZSkgOiB0ZXh0O1xuICAgIHJldHVybiBvcmlnaW5hbEluc2VydEFkamFjZW50SFRNTC5jYWxsKHRoaXMsIHBvc2l0aW9uLCBwYXRjaGVkVGV4dCk7XG4gIH07XG5cbiAgcGF0Y2hTdGF0ZS5wYXRjaGVkID0gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDc3BOb25jZShkb2N1bWVudFJlZjogRG9jdW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBleHBsaWNpdE5vbmNlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdE5vbmNlID0gbm9ybWFsaXplTm9uY2UoZXhwbGljaXROb25jZSk7XG4gIGlmIChyZXNvbHZlZEV4cGxpY2l0Tm9uY2UpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRFeHBsaWNpdE5vbmNlO1xuICB9XG5cbiAgaWYgKCFkb2N1bWVudFJlZikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBzY3JpcHRXaXRoTm9uY2UgPSBkb2N1bWVudFJlZi5xdWVyeVNlbGVjdG9yPEhUTUxTY3JpcHRFbGVtZW50Pignc2NyaXB0W25vbmNlXScpO1xuICBjb25zdCBub25jZUZyb21TY3JpcHQgPSBub3JtYWxpemVOb25jZShzY3JpcHRXaXRoTm9uY2U/LmdldEF0dHJpYnV0ZSgnbm9uY2UnKSA/PyBzY3JpcHRXaXRoTm9uY2U/Lm5vbmNlKTtcbiAgaWYgKG5vbmNlRnJvbVNjcmlwdCkge1xuICAgIHJldHVybiBub25jZUZyb21TY3JpcHQ7XG4gIH1cblxuICBjb25zdCBub25jZU1ldGEgPSBkb2N1bWVudFJlZi5xdWVyeVNlbGVjdG9yPEhUTUxNZXRhRWxlbWVudD4oJ21ldGFbbmFtZT1cImNzcC1ub25jZVwiXScpO1xuICByZXR1cm4gbm9ybWFsaXplTm9uY2Uobm9uY2VNZXRhPy5jb250ZW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVTY3JpcHROb25jZShkb2N1bWVudFJlZjogRG9jdW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBleHBsaWNpdE5vbmNlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWROb25jZSA9IHJlc29sdmVDc3BOb25jZShkb2N1bWVudFJlZiwgZXhwbGljaXROb25jZSk7XG4gIGNvbnN0IHBhdGNoU3RhdGUgPSBnZXREeW5hbWljU2NyaXB0Tm9uY2VQYXRjaFN0YXRlKCk7XG5cbiAgaWYgKHJlc29sdmVkTm9uY2UpIHtcbiAgICAvLyBET00gcGF0Y2hpbmcgaXMgb25seSBuZWVkZWQgd2hlbiBhIENTUCBub25jZSBtdXN0IGJlIHByb3BhZ2F0ZWQuXG4gICAgcGF0Y2hEeW5hbWljU2NyaXB0SW5zZXJ0aW9uKCk7XG4gICAgY29uc3QgZWZmZWN0aXZlRG9jdW1lbnRSZWYgPSBkb2N1bWVudFJlZiA/PyBnbG9iYWxUaGlzLmRvY3VtZW50O1xuICAgIGlmIChlZmZlY3RpdmVEb2N1bWVudFJlZikge1xuICAgICAgcGF0Y2hTdGF0ZS5ub25jZUJ5RG9jdW1lbnQuc2V0KGVmZmVjdGl2ZURvY3VtZW50UmVmLCByZXNvbHZlZE5vbmNlKTtcbiAgICAgIGVuc3VyZU5vbmNlTXV0YXRpb25PYnNlcnZlcihlZmZlY3RpdmVEb2N1bWVudFJlZik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkb2N1bWVudFJlZikge1xuICAgICAgcGF0Y2hTdGF0ZS5ub25jZUJ5RG9jdW1lbnQuZGVsZXRlKGRvY3VtZW50UmVmKTtcbiAgICAgIHRlYXJkb3duTm9uY2VNdXRhdGlvbk9ic2VydmVyKGRvY3VtZW50UmVmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzb2x2ZWROb25jZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRTY3JpcHQoZG9jdW1lbnRSZWY6IERvY3VtZW50LCBzcmM6IHN0cmluZywgb3B0aW9ucz86IFNjcmlwdExvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5vbmNlID0gbm9ybWFsaXplTm9uY2Uob3B0aW9ucz8ubm9uY2UpO1xuICBjb25zdCBzdGF0dXNCeVNyYyA9IGdldFN0YXR1c0J5U3JjKGRvY3VtZW50UmVmKTtcbiAgY29uc3QgcGVuZGluZ0J5U3JjID0gZ2V0UGVuZGluZ0J5U3JjKGRvY3VtZW50UmVmKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudFJlZi5xdWVyeVNlbGVjdG9yPEhUTUxTY3JpcHRFbGVtZW50Pihgc2NyaXB0W3NyYz1cIiR7c3JjfVwiXWApO1xuXG4gIGlmIChleGlzdGluZykge1xuICAgIGFwcGx5U2NyaXB0Tm9uY2UoZXhpc3RpbmcsIG5vbmNlKTtcbiAgICBjb25zdCBzdGF0dXMgPSBzdGF0dXNCeVNyYy5nZXQoc3JjKTtcbiAgICBpZiAoc3RhdHVzID09PSAnbG9hZGVkJykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmcgPSBwZW5kaW5nQnlTcmMuZ2V0KHNyYyk7XG4gICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgIHJldHVybiBwZW5kaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHN0YXR1c0J5U3JjLnNldChzcmMsICdsb2FkaW5nJyk7XG5cbiAgY29uc3QgcGVuZGluZyA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudFJlZi5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc3JjID0gc3JjO1xuICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG4gICAgYXBwbHlTY3JpcHROb25jZShzY3JpcHQsIG5vbmNlKTtcbiAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgc3RhdHVzQnlTcmMuc2V0KHNyYywgJ2xvYWRlZCcpO1xuICAgICAgcGVuZGluZ0J5U3JjLmRlbGV0ZShzcmMpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICBzdGF0dXNCeVNyYy5zZXQoc3JjLCAnZXJyb3InKTtcbiAgICAgIHBlbmRpbmdCeVNyYy5kZWxldGUoc3JjKTtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHNjcmlwdDogJHtzcmN9LiBDaGVjayBDU1AgYWxsb3dsaXN0IGFuZCBub25jZSBjb25maWd1cmF0aW9uLmApKTtcbiAgICB9O1xuICAgIGRvY3VtZW50UmVmLmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgfSk7XG5cbiAgcGVuZGluZ0J5U3JjLnNldChzcmMsIHBlbmRpbmcpO1xuICByZXR1cm4gcGVuZGluZztcbn1cbiJdfQ==
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmEtc2hpZWxkLXNjcmlwdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpYXJhc2hpZWxkLXdvcmtzcGFjZS9zcmMvbGliL3NpYXJhLXNoaWVsZC1zY3JpcHQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFlMUYsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBdUMsQ0FBQztBQUNyRixNQUFNLDBCQUEwQixHQUFHLElBQUksT0FBTyxFQUF3QyxDQUFDO0FBQ3ZGLE1BQU0sOEJBQThCLEdBQUcsd0NBQXdDLENBQUM7QUFFaEYsU0FBUyxjQUFjLENBQUMsV0FBcUI7SUFDM0MsSUFBSSxXQUFXLEdBQUcseUJBQXlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFDOUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLFdBQXFCO0lBQzVDLElBQUksWUFBWSxHQUFHLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsWUFBWSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQ2hELDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLCtCQUErQjtJQUN0QyxNQUFNLFdBQVcsR0FBRyxVQUVuQixDQUFDO0lBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUM7UUFDakQsV0FBVyxDQUFDLDhCQUE4QixDQUFDLEdBQUc7WUFDNUMsZUFBZSxFQUFFLElBQUksT0FBTyxFQUFvQjtZQUNoRCxrQkFBa0IsRUFBRSxJQUFJLE9BQU8sRUFBOEI7WUFDN0QsNkJBQTZCLEVBQUUsSUFBSSxPQUFPLEVBQXlCO1lBQ25FLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxLQUFxQjtJQUMzQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDOUIsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxJQUFVO0lBQ2pDLE9BQU8sSUFBSSxZQUFZLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsSUFBVTtJQUNoQyxPQUFPLElBQUksWUFBWSxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLENBQUM7QUFDM0UsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsSUFBVTtJQUN6QyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN4RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0QsT0FBTyxHQUFHLEtBQUssWUFBWSxDQUFDO0FBQzlCLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBeUIsRUFBRSxLQUFjO0lBQ3hFLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM1QyxNQUFNLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQztJQUU3QiwrRkFBK0Y7SUFDL0Ysd0ZBQXdGO0lBQ3hGLDBFQUEwRTtJQUMxRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQ3RDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLENBQUM7WUFDekQsTUFBTSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0I7Z0JBQ25DLDRDQUE0QztnQkFDNUMsd0JBQXdCLElBQUksU0FBUztnQkFDckMsa0NBQWtDO2dCQUNsQywwRkFBMEY7Z0JBQzFGLE9BQU87Z0JBQ1AsT0FBTyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsS0FBdUIsRUFBRSxLQUFjO0lBQzlELE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsT0FBTztJQUNULENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMzQyxLQUFLLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQztBQUM5QixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsSUFBcUIsRUFBRSxLQUFjO0lBQzNELE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMxQyxxREFBcUQ7SUFDcEQsSUFBNkMsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLElBQVUsRUFBRSxLQUFjO0lBQ2xELElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDMUIsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlCLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdCLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQVU7SUFDbkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUN2QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRywrQkFBK0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakYsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxTQUFTLDhCQUE4QixDQUFDLFdBQXFCO0lBQzNELE1BQU0sVUFBVSxHQUFHLCtCQUErQixFQUFFLENBQUM7SUFDckQsSUFBSSxjQUFjLEdBQUcsVUFBVSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDbkMsVUFBVSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLHNDQUFzQyxDQUFDLElBQVU7SUFDeEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25ELElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyw4QkFBOEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRSxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsSUFBVSxFQUFFLEtBQWM7SUFDbkQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBRW5CLHVDQUF1QztJQUN2QyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNuRixnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUIsT0FBTztJQUNULENBQUM7SUFFRCw2RkFBNkY7SUFDN0YsSUFBSSxJQUFJLFlBQVksT0FBTyxJQUFJLElBQUksWUFBWSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLHFDQUFxQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZGLEtBQUssTUFBTSxFQUFFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDM0IsZ0JBQWdCLENBQUMsRUFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUFDLFdBQXFCO0lBQ3hELE1BQU0sVUFBVSxHQUFHLCtCQUErQixFQUFFLENBQUM7SUFDckQsSUFBSSxVQUFVLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDbkQsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDaEQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBRW5CLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3JDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsNkZBQTZGO0lBQzdGLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxlQUFlLElBQUksV0FBVyxDQUFDO0lBQ3hELFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxVQUFVLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsU0FBUyw2QkFBNkIsQ0FBQyxXQUFxQjtJQUMxRCxNQUFNLFVBQVUsR0FBRywrQkFBK0IsRUFBRSxDQUFDO0lBQ3JELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEUsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPO0lBQ3RCLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixVQUFVLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLElBQVksRUFBRSxLQUFhO0lBQ3RELE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxJQUFJLENBQUMsYUFBYTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWhDLDJDQUEyQztJQUMzQyxNQUFNLGFBQWEsR0FBRyxXQUFXLGFBQWEsR0FBRyxDQUFDO0lBRWxELE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBdUIsRUFBRSxFQUFFO1FBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekQsT0FBTyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQ3ZCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDL0IsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ2hELGtDQUFrQztZQUNsQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGLG1EQUFtRDtJQUNuRCxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQztJQUN0QyxNQUFNLHdCQUF3QixHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDakQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNuQyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoRCxJQUFJLENBQUMsbUNBQW1DLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ25FLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQsU0FBUywyQkFBMkI7SUFDbEMsTUFBTSxVQUFVLEdBQUcsK0JBQStCLEVBQUUsQ0FBQztJQUNyRCxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDdkQsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUN6RCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQ3pELE1BQU0sMEJBQTBCLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztJQUV4RSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUEwQixJQUFPO1FBQzVELG9HQUFvRztRQUNwRyxJQUFJLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBTSxDQUFDO0lBQ25ELENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFVBQTBCLElBQU8sRUFBRSxLQUFrQjtRQUNqRixJQUFJLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQU0sQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUEwQixJQUFVLEVBQUUsS0FBUTtRQUMxRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBTSxDQUFDO0lBQzNELENBQUMsQ0FBQztJQUVGLE9BQU8sQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxRQUF3QixFQUFFLElBQVk7UUFDckYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDcEYsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwRSxPQUFPLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQztJQUVGLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLFdBQXdDLEVBQUUsYUFBc0I7SUFDOUYsTUFBTSxxQkFBcUIsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUQsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzFCLE9BQU8scUJBQXFCLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBb0IsZUFBZSxDQUFDLENBQUM7SUFDdEYsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQWtCLHdCQUF3QixDQUFDLENBQUM7SUFDdkYsT0FBTyxjQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsV0FBd0MsRUFBRSxhQUFzQjtJQUNqRyxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sVUFBVSxHQUFHLCtCQUErQixFQUFFLENBQUM7SUFFckQsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixtRUFBbUU7UUFDbkUsMkJBQTJCLEVBQUUsQ0FBQztRQUM5QixNQUFNLG9CQUFvQixHQUFHLFdBQVcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ2hFLElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUN6QixVQUFVLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNwRSwyQkFBMkIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2xELGlDQUFpQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixVQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQyw2QkFBNkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLFdBQXFCLEVBQUUsR0FBVyxFQUFFLE9BQTJCO0lBQ3hGLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFvQixlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFFdEYsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRWhDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3BELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakIsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDcEIsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ25CLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUM7UUFDRixNQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUNwQixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM5QixZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxnREFBZ0QsQ0FBQyxDQUFDLENBQUM7UUFDbkcsQ0FBQyxDQUFDO1FBQ0YsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5zdGFsbFZlbmRvcklubGluZUV2ZW50TWlncmF0aW9uIH0gZnJvbSAnLi9zaWFyYS1zaGllbGQtdmVuZG9yLWV2ZW50LW1pZ3JhdGlvbic7XHJcblxyXG50eXBlIFNjcmlwdFN0YXR1cyA9ICdsb2FkaW5nJyB8ICdsb2FkZWQnIHwgJ2Vycm9yJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2NyaXB0TG9hZE9wdGlvbnMge1xyXG4gIG5vbmNlPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRHluYW1pY1NjcmlwdE5vbmNlUGF0Y2hTdGF0ZSB7XHJcbiAgbm9uY2VCeURvY3VtZW50OiBXZWFrTWFwPERvY3VtZW50LCBzdHJpbmc+O1xyXG4gIG9ic2VydmVyQnlEb2N1bWVudDogV2Vha01hcDxEb2N1bWVudCwgTXV0YXRpb25PYnNlcnZlcj47XHJcbiAgaW5saW5lQ2FwdGNoYVNjcmlwdEJ5RG9jdW1lbnQ6IFdlYWtNYXA8RG9jdW1lbnQsIFNldDxzdHJpbmc+PjtcclxuICBwYXRjaGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5jb25zdCBTQ1JJUFRfU1RBVFVTX0JZX0RPQ1VNRU5UID0gbmV3IFdlYWtNYXA8RG9jdW1lbnQsIE1hcDxzdHJpbmcsIFNjcmlwdFN0YXR1cz4+KCk7XHJcbmNvbnN0IFNDUklQVF9QRU5ESU5HX0JZX0RPQ1VNRU5UID0gbmV3IFdlYWtNYXA8RG9jdW1lbnQsIE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+PigpO1xyXG5jb25zdCBEWU5BTUlDX1NDUklQVF9OT05DRV9TVEFURV9LRVkgPSAnX19zaWFyYVNoaWVsZER5bmFtaWNTY3JpcHROb25jZVN0YXRlX18nO1xyXG5cclxuZnVuY3Rpb24gZ2V0U3RhdHVzQnlTcmMoZG9jdW1lbnRSZWY6IERvY3VtZW50KTogTWFwPHN0cmluZywgU2NyaXB0U3RhdHVzPiB7XHJcbiAgbGV0IHN0YXR1c0J5U3JjID0gU0NSSVBUX1NUQVRVU19CWV9ET0NVTUVOVC5nZXQoZG9jdW1lbnRSZWYpO1xyXG4gIGlmICghc3RhdHVzQnlTcmMpIHtcclxuICAgIHN0YXR1c0J5U3JjID0gbmV3IE1hcDxzdHJpbmcsIFNjcmlwdFN0YXR1cz4oKTtcclxuICAgIFNDUklQVF9TVEFUVVNfQllfRE9DVU1FTlQuc2V0KGRvY3VtZW50UmVmLCBzdGF0dXNCeVNyYyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gc3RhdHVzQnlTcmM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFBlbmRpbmdCeVNyYyhkb2N1bWVudFJlZjogRG9jdW1lbnQpOiBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiB7XHJcbiAgbGV0IHBlbmRpbmdCeVNyYyA9IFNDUklQVF9QRU5ESU5HX0JZX0RPQ1VNRU5ULmdldChkb2N1bWVudFJlZik7XHJcbiAgaWYgKCFwZW5kaW5nQnlTcmMpIHtcclxuICAgIHBlbmRpbmdCeVNyYyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xyXG4gICAgU0NSSVBUX1BFTkRJTkdfQllfRE9DVU1FTlQuc2V0KGRvY3VtZW50UmVmLCBwZW5kaW5nQnlTcmMpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHBlbmRpbmdCeVNyYztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RHluYW1pY1NjcmlwdE5vbmNlUGF0Y2hTdGF0ZSgpOiBEeW5hbWljU2NyaXB0Tm9uY2VQYXRjaFN0YXRlIHtcclxuICBjb25zdCBnbG9iYWxTdGF0ZSA9IGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XHJcbiAgICBbRFlOQU1JQ19TQ1JJUFRfTk9OQ0VfU1RBVEVfS0VZXT86IER5bmFtaWNTY3JpcHROb25jZVBhdGNoU3RhdGU7XHJcbiAgfTtcclxuXHJcbiAgaWYgKCFnbG9iYWxTdGF0ZVtEWU5BTUlDX1NDUklQVF9OT05DRV9TVEFURV9LRVldKSB7XHJcbiAgICBnbG9iYWxTdGF0ZVtEWU5BTUlDX1NDUklQVF9OT05DRV9TVEFURV9LRVldID0ge1xyXG4gICAgICBub25jZUJ5RG9jdW1lbnQ6IG5ldyBXZWFrTWFwPERvY3VtZW50LCBzdHJpbmc+KCksXHJcbiAgICAgIG9ic2VydmVyQnlEb2N1bWVudDogbmV3IFdlYWtNYXA8RG9jdW1lbnQsIE11dGF0aW9uT2JzZXJ2ZXI+KCksXHJcbiAgICAgIGlubGluZUNhcHRjaGFTY3JpcHRCeURvY3VtZW50OiBuZXcgV2Vha01hcDxEb2N1bWVudCwgU2V0PHN0cmluZz4+KCksXHJcbiAgICAgIHBhdGNoZWQ6IGZhbHNlLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJldHVybiBnbG9iYWxTdGF0ZVtEWU5BTUlDX1NDUklQVF9OT05DRV9TVEFURV9LRVldO1xyXG59XHJcblxyXG5mdW5jdGlvbiBub3JtYWxpemVOb25jZShub25jZT86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IHRyaW1tZWQgPSBub25jZT8udHJpbSgpO1xyXG4gIHJldHVybiB0cmltbWVkID8gdHJpbW1lZCA6IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNTY3JpcHRFbGVtZW50KG5vZGU6IE5vZGUpOiBub2RlIGlzIEhUTUxTY3JpcHRFbGVtZW50IHtcclxuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzY3JpcHQnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1N0eWxlRWxlbWVudChub2RlOiBOb2RlKTogbm9kZSBpcyBIVE1MU3R5bGVFbGVtZW50IHtcclxuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdHlsZSc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU3R5bGVzaGVldExpbmtFbGVtZW50KG5vZGU6IE5vZGUpOiBub2RlIGlzIEhUTUxMaW5rRWxlbWVudCB7XHJcbiAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHx8IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnbGluaycpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgY29uc3QgcmVsID0gKG5vZGUuZ2V0QXR0cmlidXRlKCdyZWwnKSA/PyAnJykudG9Mb3dlckNhc2UoKTtcclxuICByZXR1cm4gcmVsID09PSAnc3R5bGVzaGVldCc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNjcmlwdE5vbmNlKHNjcmlwdDogSFRNTFNjcmlwdEVsZW1lbnQsIG5vbmNlPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgY29uc3QgcmVzb2x2ZWROb25jZSA9IG5vcm1hbGl6ZU5vbmNlKG5vbmNlKTtcclxuICBpZiAoIXJlc29sdmVkTm9uY2UpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgcmVzb2x2ZWROb25jZSk7XHJcbiAgc2NyaXB0Lm5vbmNlID0gcmVzb2x2ZWROb25jZTtcclxuXHJcbiAgLy8gU29tZSB2ZW5kb3IgSFRNTCBmcmFnbWVudHMgaW5jbHVkZSBpbmxpbmUgc2NyaXB0cyB0aGF0IGV4ZWN1dGUgaW1tZWRpYXRlbHkgZHVyaW5nIGluc2VydGlvbi5cclxuICAvLyBJbiBzdHJpY3QgQ1NQIG1vZGUgdGhlc2UgcnVuIHdpdGggYSBub25jZSwgYnV0IGNhbiBzdGlsbCByYWNlIERPTSBpbnNlcnRpb24gYW5kIGNyYXNoXHJcbiAgLy8gKGUuZy4gYG51bGwucXVlcnlTZWxlY3RvciguLi4pYCkuIFdlIGRlZmVuc2l2ZWx5IHJldHJ5IG9uY2Ugb24gZmFpbHVyZS5cclxuICBpZiAoIXNjcmlwdC5zcmMpIHtcclxuICAgIGNvbnN0IGJvZHkgPSBzY3JpcHQudGV4dENvbnRlbnQgPz8gJyc7XHJcbiAgICBpZiAoYm9keSAmJiAhYm9keS5pbmNsdWRlcygnX19zaWFyYVNoaWVsZElubGluZVJldHJ5X18nKSkge1xyXG4gICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBgKGZ1bmN0aW9uKCl7XFxuYCArXHJcbiAgICAgICAgYCAgdmFyIF9fc2lhcmFTaGllbGRJbmxpbmVSZXRyeV9fID0gdHJ1ZTtcXG5gICtcclxuICAgICAgICBgICBmdW5jdGlvbiBfX3J1bigpe1xcbiR7Ym9keX1cXG4gIH1cXG5gICtcclxuICAgICAgICBgICB0cnkgeyBfX3J1bigpOyB9IGNhdGNoIChlKSB7XFxuYCArXHJcbiAgICAgICAgYCAgICB0cnkgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IHRyeSB7IF9fcnVuKCk7IH0gY2F0Y2ggKF9lKSB7fSB9LCAwKTsgfSBjYXRjaCAoX3QpIHt9XFxuYCArXHJcbiAgICAgICAgYCAgfVxcbmAgK1xyXG4gICAgICAgIGB9KSgpO2A7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseVN0eWxlTm9uY2Uoc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQsIG5vbmNlPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgY29uc3QgcmVzb2x2ZWROb25jZSA9IG5vcm1hbGl6ZU5vbmNlKG5vbmNlKTtcclxuICBpZiAoIXJlc29sdmVkTm9uY2UpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHN0eWxlLnNldEF0dHJpYnV0ZSgnbm9uY2UnLCByZXNvbHZlZE5vbmNlKTtcclxuICBzdHlsZS5ub25jZSA9IHJlc29sdmVkTm9uY2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwcGx5TGlua05vbmNlKGxpbms6IEhUTUxMaW5rRWxlbWVudCwgbm9uY2U/OiBzdHJpbmcpOiB2b2lkIHtcclxuICBjb25zdCByZXNvbHZlZE5vbmNlID0gbm9ybWFsaXplTm9uY2Uobm9uY2UpO1xyXG4gIGlmICghcmVzb2x2ZWROb25jZSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgbGluay5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgcmVzb2x2ZWROb25jZSk7XHJcbiAgLy8gYEhUTUxMaW5rRWxlbWVudC5ub25jZWAgZXhpc3RzIGluIG1vZGVybiBicm93c2Vycy5cclxuICAobGluayBhcyBIVE1MTGlua0VsZW1lbnQgJiB7IG5vbmNlPzogc3RyaW5nIH0pLm5vbmNlID0gcmVzb2x2ZWROb25jZTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlOb25jZVRvTm9kZShub2RlOiBOb2RlLCBub25jZT86IHN0cmluZyk6IHZvaWQge1xyXG4gIGlmIChpc1NjcmlwdEVsZW1lbnQobm9kZSkpIHtcclxuICAgIGFwcGx5U2NyaXB0Tm9uY2Uobm9kZSwgbm9uY2UpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBpZiAoaXNTdHlsZUVsZW1lbnQobm9kZSkpIHtcclxuICAgIGFwcGx5U3R5bGVOb25jZShub2RlLCBub25jZSk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGlmIChpc1N0eWxlc2hlZXRMaW5rRWxlbWVudChub2RlKSkge1xyXG4gICAgYXBwbHlMaW5rTm9uY2Uobm9kZSwgbm9uY2UpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlUcmFja2VkTm9uY2Uobm9kZTogTm9kZSk6IHZvaWQge1xyXG4gIGNvbnN0IGRvY3VtZW50UmVmID0gbm9kZS5vd25lckRvY3VtZW50O1xyXG4gIGlmICghZG9jdW1lbnRSZWYpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5vbmNlID0gZ2V0RHluYW1pY1NjcmlwdE5vbmNlUGF0Y2hTdGF0ZSgpLm5vbmNlQnlEb2N1bWVudC5nZXQoZG9jdW1lbnRSZWYpO1xyXG4gIGFwcGx5Tm9uY2VUb05vZGUobm9kZSwgbm9uY2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUcmFja2VkSW5saW5lQ2FwdGNoYVNjcmlwdHMoZG9jdW1lbnRSZWY6IERvY3VtZW50KTogU2V0PHN0cmluZz4ge1xyXG4gIGNvbnN0IHBhdGNoU3RhdGUgPSBnZXREeW5hbWljU2NyaXB0Tm9uY2VQYXRjaFN0YXRlKCk7XHJcbiAgbGV0IHRyYWNrZWRTY3JpcHRzID0gcGF0Y2hTdGF0ZS5pbmxpbmVDYXB0Y2hhU2NyaXB0QnlEb2N1bWVudC5nZXQoZG9jdW1lbnRSZWYpO1xyXG4gIGlmICghdHJhY2tlZFNjcmlwdHMpIHtcclxuICAgIHRyYWNrZWRTY3JpcHRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICBwYXRjaFN0YXRlLmlubGluZUNhcHRjaGFTY3JpcHRCeURvY3VtZW50LnNldChkb2N1bWVudFJlZiwgdHJhY2tlZFNjcmlwdHMpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRyYWNrZWRTY3JpcHRzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG91bGRTa2lwRHVwbGljYXRlSW5saW5lQ2FwdGNoYVNjcmlwdChub2RlOiBOb2RlKTogYm9vbGVhbiB7XHJcbiAgaWYgKCFpc1NjcmlwdEVsZW1lbnQobm9kZSkgfHwgQm9vbGVhbihub2RlLnNyYykpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHNjcmlwdEJvZHkgPSAobm9kZS50ZXh0Q29udGVudCA/PyAnJykudHJpbSgpO1xyXG4gIGlmICghc2NyaXB0Qm9keSB8fCAhc2NyaXB0Qm9keS5pbmNsdWRlcygnY3VycmVudExhbmdDb2RlJykpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGRvY3VtZW50UmVmID0gbm9kZS5vd25lckRvY3VtZW50O1xyXG4gIGlmICghZG9jdW1lbnRSZWYpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHRyYWNrZWRTY3JpcHRzID0gZ2V0VHJhY2tlZElubGluZUNhcHRjaGFTY3JpcHRzKGRvY3VtZW50UmVmKTtcclxuICBpZiAodHJhY2tlZFNjcmlwdHMuaGFzKHNjcmlwdEJvZHkpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHRyYWNrZWRTY3JpcHRzLmFkZChzY3JpcHRCb2R5KTtcclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdhbGtBbmRBcHBseU5vbmNlKHJvb3Q6IE5vZGUsIG5vbmNlPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgaWYgKCFub25jZSkgcmV0dXJuO1xyXG5cclxuICAvLyBGYXN0IHBhdGg6IHJvb3QgaXRzZWxmIGlzIG5vbmNlYWJsZS5cclxuICBpZiAoaXNTY3JpcHRFbGVtZW50KHJvb3QpIHx8IGlzU3R5bGVFbGVtZW50KHJvb3QpIHx8IGlzU3R5bGVzaGVldExpbmtFbGVtZW50KHJvb3QpKSB7XHJcbiAgICBhcHBseU5vbmNlVG9Ob2RlKHJvb3QsIG5vbmNlKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vIENvbW1vbiBwYXRoIGZvciBqUXVlcnk6IGFwcGVuZCBEb2N1bWVudEZyYWdtZW50IGNvbnRhaW5pbmcgbm9kZXMgY3JlYXRlZCB2aWEgSFRNTCBwYXJzaW5nLlxyXG4gIGlmIChyb290IGluc3RhbmNlb2YgRWxlbWVudCB8fCByb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xyXG4gICAgY29uc3Qgbm9uY2VhYmxlID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsPy4oJ3NjcmlwdCxzdHlsZSxsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl0nKSA/PyBbXTtcclxuICAgIGZvciAoY29uc3QgZWwgb2Ygbm9uY2VhYmxlKSB7XHJcbiAgICAgIGFwcGx5Tm9uY2VUb05vZGUoZWwgYXMgdW5rbm93biBhcyBOb2RlLCBub25jZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBlbnN1cmVOb25jZU11dGF0aW9uT2JzZXJ2ZXIoZG9jdW1lbnRSZWY6IERvY3VtZW50KTogdm9pZCB7XHJcbiAgY29uc3QgcGF0Y2hTdGF0ZSA9IGdldER5bmFtaWNTY3JpcHROb25jZVBhdGNoU3RhdGUoKTtcclxuICBpZiAocGF0Y2hTdGF0ZS5vYnNlcnZlckJ5RG9jdW1lbnQuZ2V0KGRvY3VtZW50UmVmKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigocmVjb3JkcykgPT4ge1xyXG4gICAgY29uc3Qgbm9uY2UgPSBwYXRjaFN0YXRlLm5vbmNlQnlEb2N1bWVudC5nZXQoZG9jdW1lbnRSZWYpO1xyXG4gICAgaWYgKCFub25jZSkgcmV0dXJuO1xyXG5cclxuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcclxuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHJlY29yZC5hZGRlZE5vZGVzKSB7XHJcbiAgICAgICAgd2Fsa0FuZEFwcGx5Tm9uY2Uobm9kZSwgbm9uY2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIC8vIE9ic2VydmUgdGhlIGZ1bGwgZG9jdW1lbnQgYmVjYXVzZSBzY3JpcHRzIGNhbiBiZSBpbmplY3RlZCBpbnRvIGJvZHkvaGVhZCBieSB2ZW5kb3IvalF1ZXJ5LlxyXG4gIGNvbnN0IHJvb3QgPSBkb2N1bWVudFJlZi5kb2N1bWVudEVsZW1lbnQgPz8gZG9jdW1lbnRSZWY7XHJcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShyb290LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcclxuICBwYXRjaFN0YXRlLm9ic2VydmVyQnlEb2N1bWVudC5zZXQoZG9jdW1lbnRSZWYsIG9ic2VydmVyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gdGVhcmRvd25Ob25jZU11dGF0aW9uT2JzZXJ2ZXIoZG9jdW1lbnRSZWY6IERvY3VtZW50KTogdm9pZCB7XHJcbiAgY29uc3QgcGF0Y2hTdGF0ZSA9IGdldER5bmFtaWNTY3JpcHROb25jZVBhdGNoU3RhdGUoKTtcclxuICBjb25zdCBvYnNlcnZlciA9IHBhdGNoU3RhdGUub2JzZXJ2ZXJCeURvY3VtZW50LmdldChkb2N1bWVudFJlZik7XHJcbiAgaWYgKCFvYnNlcnZlcikgcmV0dXJuO1xyXG4gIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICBwYXRjaFN0YXRlLm9ic2VydmVyQnlEb2N1bWVudC5kZWxldGUoZG9jdW1lbnRSZWYpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbmplY3ROb25jZUludG9IdG1sKGh0bWw6IHN0cmluZywgbm9uY2U6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgcmVzb2x2ZWROb25jZSA9IG5vcm1hbGl6ZU5vbmNlKG5vbmNlKTtcclxuICBpZiAoIXJlc29sdmVkTm9uY2UpIHJldHVybiBodG1sO1xyXG5cclxuICAvLyBJZiB0YWcgYWxyZWFkeSBpbmNsdWRlcyBub25jZSwgbGVhdmUgaXQuXHJcbiAgY29uc3Qgd2l0aE5vbmNlQXR0ciA9IGAgbm9uY2U9XCIke3Jlc29sdmVkTm9uY2V9XCJgO1xyXG5cclxuICBjb25zdCBhZGROb25jZVRvVGFnID0gKHRhZzogJ3NjcmlwdCcgfCAnc3R5bGUnKSA9PiB7XHJcbiAgICBjb25zdCBvcGVuVGFnID0gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPyk/PmAsICdnaScpO1xyXG4gICAgcmV0dXJuIChpbnB1dDogc3RyaW5nKSA9PlxyXG4gICAgICBpbnB1dC5yZXBsYWNlKG9wZW5UYWcsIChtYXRjaCkgPT4ge1xyXG4gICAgICAgIGlmICgvW1xcc1wiJ11ub25jZVxccyo9Ly50ZXN0KG1hdGNoKSkgcmV0dXJuIG1hdGNoO1xyXG4gICAgICAgIC8vIEluc2VydCBub25jZSBiZWZvcmUgY2xvc2luZyBgPmBcclxuICAgICAgICByZXR1cm4gbWF0Y2gucmVwbGFjZSgvPiQvLCBgJHt3aXRoTm9uY2VBdHRyfT5gKTtcclxuICAgICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgLy8gRm9yIGxpbmsgcmVsPXN0eWxlc2hlZXQsIGFkZCBub25jZSB3aGVuIG1pc3NpbmcuXHJcbiAgY29uc3QgbGlua09wZW5UYWcgPSAvPGxpbmtcXGJbXj5dKj4vZ2k7XHJcbiAgY29uc3QgYWRkTm9uY2VUb1N0eWxlc2hlZXRMaW5rID0gKGlucHV0OiBzdHJpbmcpID0+XHJcbiAgICBpbnB1dC5yZXBsYWNlKGxpbmtPcGVuVGFnLCAobWF0Y2gpID0+IHtcclxuICAgICAgaWYgKC9bXFxzXCInXW5vbmNlXFxzKj0vLnRlc3QobWF0Y2gpKSByZXR1cm4gbWF0Y2g7XHJcbiAgICAgIGlmICghL1xcYnJlbFxccyo9XFxzKltcIiddP3N0eWxlc2hlZXRbXCInXT8vaS50ZXN0KG1hdGNoKSkgcmV0dXJuIG1hdGNoO1xyXG4gICAgICByZXR1cm4gbWF0Y2gucmVwbGFjZSgvPiQvLCBgJHt3aXRoTm9uY2VBdHRyfT5gKTtcclxuICAgIH0pO1xyXG5cclxuICByZXR1cm4gYWRkTm9uY2VUb1N0eWxlc2hlZXRMaW5rKGFkZE5vbmNlVG9UYWcoJ3N0eWxlJykoYWRkTm9uY2VUb1RhZygnc2NyaXB0JykoaHRtbCkpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGF0Y2hEeW5hbWljU2NyaXB0SW5zZXJ0aW9uKCk6IHZvaWQge1xyXG4gIGNvbnN0IHBhdGNoU3RhdGUgPSBnZXREeW5hbWljU2NyaXB0Tm9uY2VQYXRjaFN0YXRlKCk7XHJcbiAgaWYgKHBhdGNoU3RhdGUucGF0Y2hlZCkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgb3JpZ2luYWxBcHBlbmRDaGlsZCA9IE5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO1xyXG4gIGNvbnN0IG9yaWdpbmFsSW5zZXJ0QmVmb3JlID0gTm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO1xyXG4gIGNvbnN0IG9yaWdpbmFsUmVwbGFjZUNoaWxkID0gTm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkO1xyXG4gIGNvbnN0IG9yaWdpbmFsSW5zZXJ0QWRqYWNlbnRIVE1MID0gRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRIVE1MO1xyXG5cclxuICBOb2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgTm9kZT4obm9kZTogVCk6IFQge1xyXG4gICAgLy8gVmVuZG9yIGNhcHRjaGEgaW5qZWN0cyBhbiBpbmxpbmUgc25pcHBldCB3aXRoIGBjdXJyZW50TGFuZ0NvZGVgIHRoYXQgY3Jhc2hlcyB3aGVuIGFwcGVuZGVkIHR3aWNlLlxyXG4gICAgaWYgKHNob3VsZFNraXBEdXBsaWNhdGVJbmxpbmVDYXB0Y2hhU2NyaXB0KG5vZGUpKSB7XHJcbiAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG4gICAgYXBwbHlUcmFja2VkTm9uY2Uobm9kZSk7XHJcbiAgICByZXR1cm4gb3JpZ2luYWxBcHBlbmRDaGlsZC5jYWxsKHRoaXMsIG5vZGUpIGFzIFQ7XHJcbiAgfTtcclxuXHJcbiAgTm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBULCBjaGlsZDogTm9kZSB8IG51bGwpOiBUIHtcclxuICAgIGlmIChzaG91bGRTa2lwRHVwbGljYXRlSW5saW5lQ2FwdGNoYVNjcmlwdChub2RlKSkge1xyXG4gICAgICByZXR1cm4gbm9kZTtcclxuICAgIH1cclxuICAgIGFwcGx5VHJhY2tlZE5vbmNlKG5vZGUpO1xyXG4gICAgcmV0dXJuIG9yaWdpbmFsSW5zZXJ0QmVmb3JlLmNhbGwodGhpcywgbm9kZSwgY2hpbGQpIGFzIFQ7XHJcbiAgfTtcclxuXHJcbiAgTm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBOb2RlLCBjaGlsZDogVCk6IFQge1xyXG4gICAgYXBwbHlUcmFja2VkTm9uY2Uobm9kZSk7XHJcbiAgICByZXR1cm4gb3JpZ2luYWxSZXBsYWNlQ2hpbGQuY2FsbCh0aGlzLCBub2RlLCBjaGlsZCkgYXMgVDtcclxuICB9O1xyXG5cclxuICBFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEhUTUwgPSBmdW5jdGlvbiAocG9zaXRpb246IEluc2VydFBvc2l0aW9uLCB0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRvY3VtZW50UmVmID0gdGhpcy5vd25lckRvY3VtZW50O1xyXG4gICAgY29uc3Qgbm9uY2UgPSBkb2N1bWVudFJlZiA/IHBhdGNoU3RhdGUubm9uY2VCeURvY3VtZW50LmdldChkb2N1bWVudFJlZikgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBwYXRjaGVkVGV4dCA9IG5vbmNlID8gaW5qZWN0Tm9uY2VJbnRvSHRtbCh0ZXh0LCBub25jZSkgOiB0ZXh0O1xyXG4gICAgcmV0dXJuIG9yaWdpbmFsSW5zZXJ0QWRqYWNlbnRIVE1MLmNhbGwodGhpcywgcG9zaXRpb24sIHBhdGNoZWRUZXh0KTtcclxuICB9O1xyXG5cclxuICBwYXRjaFN0YXRlLnBhdGNoZWQgPSB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNzcE5vbmNlKGRvY3VtZW50UmVmOiBEb2N1bWVudCB8IG51bGwgfCB1bmRlZmluZWQsIGV4cGxpY2l0Tm9uY2U/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IHJlc29sdmVkRXhwbGljaXROb25jZSA9IG5vcm1hbGl6ZU5vbmNlKGV4cGxpY2l0Tm9uY2UpO1xyXG4gIGlmIChyZXNvbHZlZEV4cGxpY2l0Tm9uY2UpIHtcclxuICAgIHJldHVybiByZXNvbHZlZEV4cGxpY2l0Tm9uY2U7XHJcbiAgfVxyXG5cclxuICBpZiAoIWRvY3VtZW50UmVmKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2NyaXB0V2l0aE5vbmNlID0gZG9jdW1lbnRSZWYucXVlcnlTZWxlY3RvcjxIVE1MU2NyaXB0RWxlbWVudD4oJ3NjcmlwdFtub25jZV0nKTtcclxuICBjb25zdCBub25jZUZyb21TY3JpcHQgPSBub3JtYWxpemVOb25jZShzY3JpcHRXaXRoTm9uY2U/LmdldEF0dHJpYnV0ZSgnbm9uY2UnKSA/PyBzY3JpcHRXaXRoTm9uY2U/Lm5vbmNlKTtcclxuICBpZiAobm9uY2VGcm9tU2NyaXB0KSB7XHJcbiAgICByZXR1cm4gbm9uY2VGcm9tU2NyaXB0O1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgbm9uY2VNZXRhID0gZG9jdW1lbnRSZWYucXVlcnlTZWxlY3RvcjxIVE1MTWV0YUVsZW1lbnQ+KCdtZXRhW25hbWU9XCJjc3Atbm9uY2VcIl0nKTtcclxuICByZXR1cm4gbm9ybWFsaXplTm9uY2Uobm9uY2VNZXRhPy5jb250ZW50KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVTY3JpcHROb25jZShkb2N1bWVudFJlZjogRG9jdW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBleHBsaWNpdE5vbmNlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICBjb25zdCByZXNvbHZlZE5vbmNlID0gcmVzb2x2ZUNzcE5vbmNlKGRvY3VtZW50UmVmLCBleHBsaWNpdE5vbmNlKTtcclxuICBjb25zdCBwYXRjaFN0YXRlID0gZ2V0RHluYW1pY1NjcmlwdE5vbmNlUGF0Y2hTdGF0ZSgpO1xyXG5cclxuICBpZiAocmVzb2x2ZWROb25jZSkge1xyXG4gICAgLy8gRE9NIHBhdGNoaW5nIGlzIG9ubHkgbmVlZGVkIHdoZW4gYSBDU1Agbm9uY2UgbXVzdCBiZSBwcm9wYWdhdGVkLlxyXG4gICAgcGF0Y2hEeW5hbWljU2NyaXB0SW5zZXJ0aW9uKCk7XHJcbiAgICBjb25zdCBlZmZlY3RpdmVEb2N1bWVudFJlZiA9IGRvY3VtZW50UmVmID8/IGdsb2JhbFRoaXMuZG9jdW1lbnQ7XHJcbiAgICBpZiAoZWZmZWN0aXZlRG9jdW1lbnRSZWYpIHtcclxuICAgICAgcGF0Y2hTdGF0ZS5ub25jZUJ5RG9jdW1lbnQuc2V0KGVmZmVjdGl2ZURvY3VtZW50UmVmLCByZXNvbHZlZE5vbmNlKTtcclxuICAgICAgZW5zdXJlTm9uY2VNdXRhdGlvbk9ic2VydmVyKGVmZmVjdGl2ZURvY3VtZW50UmVmKTtcclxuICAgICAgaW5zdGFsbFZlbmRvcklubGluZUV2ZW50TWlncmF0aW9uKGVmZmVjdGl2ZURvY3VtZW50UmVmKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgaWYgKGRvY3VtZW50UmVmKSB7XHJcbiAgICAgIHBhdGNoU3RhdGUubm9uY2VCeURvY3VtZW50LmRlbGV0ZShkb2N1bWVudFJlZik7XHJcbiAgICAgIHRlYXJkb3duTm9uY2VNdXRhdGlvbk9ic2VydmVyKGRvY3VtZW50UmVmKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiByZXNvbHZlZE5vbmNlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZFNjcmlwdChkb2N1bWVudFJlZjogRG9jdW1lbnQsIHNyYzogc3RyaW5nLCBvcHRpb25zPzogU2NyaXB0TG9hZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICBjb25zdCBub25jZSA9IG5vcm1hbGl6ZU5vbmNlKG9wdGlvbnM/Lm5vbmNlKTtcclxuICBjb25zdCBzdGF0dXNCeVNyYyA9IGdldFN0YXR1c0J5U3JjKGRvY3VtZW50UmVmKTtcclxuICBjb25zdCBwZW5kaW5nQnlTcmMgPSBnZXRQZW5kaW5nQnlTcmMoZG9jdW1lbnRSZWYpO1xyXG4gIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnRSZWYucXVlcnlTZWxlY3RvcjxIVE1MU2NyaXB0RWxlbWVudD4oYHNjcmlwdFtzcmM9XCIke3NyY31cIl1gKTtcclxuXHJcbiAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICBhcHBseVNjcmlwdE5vbmNlKGV4aXN0aW5nLCBub25jZSk7XHJcbiAgICBjb25zdCBzdGF0dXMgPSBzdGF0dXNCeVNyYy5nZXQoc3JjKTtcclxuICAgIGlmIChzdGF0dXMgPT09ICdsb2FkZWQnKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwZW5kaW5nID0gcGVuZGluZ0J5U3JjLmdldChzcmMpO1xyXG4gICAgaWYgKHBlbmRpbmcpIHtcclxuICAgICAgcmV0dXJuIHBlbmRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gIH1cclxuXHJcbiAgc3RhdHVzQnlTcmMuc2V0KHNyYywgJ2xvYWRpbmcnKTtcclxuXHJcbiAgY29uc3QgcGVuZGluZyA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50UmVmLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgc2NyaXB0LnNyYyA9IHNyYztcclxuICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XHJcbiAgICBhcHBseVNjcmlwdE5vbmNlKHNjcmlwdCwgbm9uY2UpO1xyXG4gICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgc3RhdHVzQnlTcmMuc2V0KHNyYywgJ2xvYWRlZCcpO1xyXG4gICAgICBwZW5kaW5nQnlTcmMuZGVsZXRlKHNyYyk7XHJcbiAgICAgIHJlc29sdmUoKTtcclxuICAgIH07XHJcbiAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgc3RhdHVzQnlTcmMuc2V0KHNyYywgJ2Vycm9yJyk7XHJcbiAgICAgIHBlbmRpbmdCeVNyYy5kZWxldGUoc3JjKTtcclxuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgc2NyaXB0OiAke3NyY30uIENoZWNrIENTUCBhbGxvd2xpc3QgYW5kIG5vbmNlIGNvbmZpZ3VyYXRpb24uYCkpO1xyXG4gICAgfTtcclxuICAgIGRvY3VtZW50UmVmLmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcclxuICB9KTtcclxuXHJcbiAgcGVuZGluZ0J5U3JjLnNldChzcmMsIHBlbmRpbmcpO1xyXG4gIHJldHVybiBwZW5kaW5nO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,130 @@
1
+ import { getSiaraShieldGlobals } from './siara-shield.globals';
2
+ const VENDOR_EVENT_MIGRATION_KEY = '__siaraShieldVendorEventMigrationInstalled__';
3
+ const MIGRATED_MARKER = 'data-siara-shield-event-migrated';
4
+ const INLINE_EVENT_ATTRIBUTES = [
5
+ 'onclick',
6
+ 'ondblclick',
7
+ 'onmousedown',
8
+ 'onmouseup',
9
+ 'onkeydown',
10
+ 'onkeyup',
11
+ 'onchange',
12
+ 'oninput',
13
+ 'onsubmit',
14
+ ];
15
+ function toDomEventName(attributeName) {
16
+ return attributeName.slice(2);
17
+ }
18
+ function resolveGlobalCallable(name) {
19
+ const globals = getSiaraShieldGlobals();
20
+ const candidate = globals[name];
21
+ return typeof candidate === 'function' ? candidate : undefined;
22
+ }
23
+ function invokeWindowOpenExpression(expression) {
24
+ const match = /^window\.open\(\s*(['"])(.*?)\1\s*(?:,\s*(['"])(.*?)\3\s*)?\)(?:\.focus\(\))?;?$/i.exec(expression);
25
+ if (!match) {
26
+ return false;
27
+ }
28
+ const targetWindow = globalThis.open(match[2], match[4] || '_blank');
29
+ targetWindow?.focus();
30
+ return true;
31
+ }
32
+ function invokeGlobalFunctionExpression(expression) {
33
+ const match = /^([_$a-zA-Z][\w$]*)\((.*)\);?$/s.exec(expression);
34
+ if (!match) {
35
+ return false;
36
+ }
37
+ const fn = resolveGlobalCallable(match[1]);
38
+ if (!fn) {
39
+ return false;
40
+ }
41
+ const args = match[2].trim();
42
+ if (!args) {
43
+ fn();
44
+ return true;
45
+ }
46
+ if (/^(['"]).*\1$/.test(args)) {
47
+ fn(args.slice(1, -1));
48
+ return true;
49
+ }
50
+ fn();
51
+ return true;
52
+ }
53
+ function invokeInlineEventExpression(expression) {
54
+ const trimmed = expression.trim();
55
+ if (!trimmed) {
56
+ return;
57
+ }
58
+ for (const part of trimmed.split(';')) {
59
+ const statement = part.trim();
60
+ if (!statement) {
61
+ continue;
62
+ }
63
+ if (invokeWindowOpenExpression(statement) || invokeGlobalFunctionExpression(statement)) {
64
+ continue;
65
+ }
66
+ }
67
+ }
68
+ function migrateInlineEventAttribute(element, attributeName) {
69
+ const expression = element.getAttribute(attributeName);
70
+ if (!expression) {
71
+ return;
72
+ }
73
+ element.removeAttribute(attributeName);
74
+ const eventName = toDomEventName(attributeName);
75
+ element.addEventListener(eventName, (event) => {
76
+ if (eventName === 'submit') {
77
+ event.preventDefault();
78
+ }
79
+ invokeInlineEventExpression(expression);
80
+ });
81
+ }
82
+ export function migrateVendorInlineEventAttributes(root) {
83
+ if (root instanceof HTMLElement && root.hasAttribute(MIGRATED_MARKER)) {
84
+ return;
85
+ }
86
+ const elements = [];
87
+ if (root instanceof HTMLElement) {
88
+ elements.push(root);
89
+ }
90
+ if (root instanceof Element || root instanceof Document || root instanceof DocumentFragment) {
91
+ elements.push(...Array.from(root.querySelectorAll('[onclick],[ondblclick],[onmousedown],[onmouseup],[onkeydown],[onkeyup],[onchange],[oninput],[onsubmit]')));
92
+ }
93
+ for (const element of elements) {
94
+ if (element.hasAttribute(MIGRATED_MARKER)) {
95
+ continue;
96
+ }
97
+ for (const attributeName of INLINE_EVENT_ATTRIBUTES) {
98
+ migrateInlineEventAttribute(element, attributeName);
99
+ }
100
+ element.setAttribute(MIGRATED_MARKER, 'true');
101
+ }
102
+ }
103
+ export function installVendorInlineEventMigration(documentRef) {
104
+ const globals = globalThis;
105
+ if (globals[VENDOR_EVENT_MIGRATION_KEY]) {
106
+ migrateVendorInlineEventAttributes(documentRef);
107
+ return;
108
+ }
109
+ const observer = new MutationObserver((records) => {
110
+ for (const record of records) {
111
+ if (record.type === 'attributes' && record.target instanceof HTMLElement) {
112
+ migrateVendorInlineEventAttributes(record.target);
113
+ continue;
114
+ }
115
+ for (const node of record.addedNodes) {
116
+ migrateVendorInlineEventAttributes(node);
117
+ }
118
+ }
119
+ });
120
+ const root = documentRef.documentElement ?? documentRef;
121
+ observer.observe(root, {
122
+ childList: true,
123
+ subtree: true,
124
+ attributes: true,
125
+ attributeFilter: [...INLINE_EVENT_ATTRIBUTES],
126
+ });
127
+ migrateVendorInlineEventAttributes(documentRef);
128
+ globals[VENDOR_EVENT_MIGRATION_KEY] = true;
129
+ }
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmEtc2hpZWxkLXZlbmRvci1ldmVudC1taWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zaWFyYXNoaWVsZC13b3Jrc3BhY2Uvc3JjL2xpYi9zaWFyYS1zaGllbGQtdmVuZG9yLWV2ZW50LW1pZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRCxNQUFNLDBCQUEwQixHQUFHLDhDQUE4QyxDQUFDO0FBQ2xGLE1BQU0sZUFBZSxHQUFHLGtDQUFrQyxDQUFDO0FBRTNELE1BQU0sdUJBQXVCLEdBQUc7SUFDOUIsU0FBUztJQUNULFlBQVk7SUFDWixhQUFhO0lBQ2IsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0NBQ0YsQ0FBQztBQUlYLFNBQVMsY0FBYyxDQUFDLGFBQW1DO0lBQ3pELE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxJQUFZO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixFQUE2QixDQUFDO0lBQ25FLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPLE9BQU8sU0FBUyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUUsU0FBNkMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3RHLENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLFVBQWtCO0lBQ3BELE1BQU0sS0FBSyxHQUFHLG1GQUFtRixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMs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SyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3JDLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsZUFBZSxJQUFJLFdBQVcsQ0FBQztJQUN4RCxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtRQUNyQixTQUFTLEVBQUUsSUFBSTtRQUNmLE9BQU8sRUFBRSxJQUFJO1FBQ2IsVUFBVSxFQUFFLElBQUk7UUFDaEIsZUFBZSxFQUFFLENBQUMsR0FBRyx1QkFBdUIsQ0FBQztLQUM5QyxDQUFDLENBQUM7SUFFSCxrQ0FBa0MsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsMEJBQTBCLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFNpYXJhU2hpZWxkR2xvYmFscyB9IGZyb20gJy4vc2lhcmEtc2hpZWxkLmdsb2JhbHMnO1xyXG5cclxuY29uc3QgVkVORE9SX0VWRU5UX01JR1JBVElPTl9LRVkgPSAnX19zaWFyYVNoaWVsZFZlbmRvckV2ZW50TWlncmF0aW9uSW5zdGFsbGVkX18nO1xyXG5jb25zdCBNSUdSQVRFRF9NQVJLRVIgPSAnZGF0YS1zaWFyYS1zaGllbGQtZXZlbnQtbWlncmF0ZWQnO1xyXG5cclxuY29uc3QgSU5MSU5FX0VWRU5UX0FUVFJJQlVURVMgPSBbXHJcbiAgJ29uY2xpY2snLFxyXG4gICdvbmRibGNsaWNrJyxcclxuICAnb25tb3VzZWRvd24nLFxyXG4gICdvbm1vdXNldXAnLFxyXG4gICdvbmtleWRvd24nLFxyXG4gICdvbmtleXVwJyxcclxuICAnb25jaGFuZ2UnLFxyXG4gICdvbmlucHV0JyxcclxuICAnb25zdWJtaXQnLFxyXG5dIGFzIGNvbnN0O1xyXG5cclxudHlwZSBJbmxpbmVFdmVudEF0dHJpYnV0ZSA9ICh0eXBlb2YgSU5MSU5FX0VWRU5UX0FUVFJJQlVURVMpW251bWJlcl07XHJcblxyXG5mdW5jdGlvbiB0b0RvbUV2ZW50TmFtZShhdHRyaWJ1dGVOYW1lOiBJbmxpbmVFdmVudEF0dHJpYnV0ZSk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUuc2xpY2UoMik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVHbG9iYWxDYWxsYWJsZShuYW1lOiBzdHJpbmcpOiAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bikgfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IGdsb2JhbHMgPSBnZXRTaWFyYVNoaWVsZEdsb2JhbHMoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICBjb25zdCBjYW5kaWRhdGUgPSBnbG9iYWxzW25hbWVdO1xyXG4gIHJldHVybiB0eXBlb2YgY2FuZGlkYXRlID09PSAnZnVuY3Rpb24nID8gKGNhbmRpZGF0ZSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSA6IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZnVuY3Rpb24gaW52b2tlV2luZG93T3BlbkV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgY29uc3QgbWF0Y2ggPSAvXndpbmRvd1xcLm9wZW5cXChcXHMqKFsnXCJdKSguKj8pXFwxXFxzKig/OixcXHMqKFsnXCJdKSguKj8pXFwzXFxzKik/XFwpKD86XFwuZm9jdXNcXChcXCkpPzs/JC9pLmV4ZWMoZXhwcmVzc2lvbik7XHJcbiAgaWYgKCFtYXRjaCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdGFyZ2V0V2luZG93ID0gZ2xvYmFsVGhpcy5vcGVuKG1hdGNoWzJdLCBtYXRjaFs0XSB8fCAnX2JsYW5rJyk7XHJcbiAgdGFyZ2V0V2luZG93Py5mb2N1cygpO1xyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnZva2VHbG9iYWxGdW5jdGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgY29uc3QgbWF0Y2ggPSAvXihbXyRhLXpBLVpdW1xcdyRdKilcXCgoLiopXFwpOz8kL3MuZXhlYyhleHByZXNzaW9uKTtcclxuICBpZiAoIW1hdGNoKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjb25zdCBmbiA9IHJlc29sdmVHbG9iYWxDYWxsYWJsZShtYXRjaFsxXSk7XHJcbiAgaWYgKCFmbikge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgYXJncyA9IG1hdGNoWzJdLnRyaW0oKTtcclxuICBpZiAoIWFyZ3MpIHtcclxuICAgIGZuKCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGlmICgvXihbJ1wiXSkuKlxcMSQvLnRlc3QoYXJncykpIHtcclxuICAgIGZuKGFyZ3Muc2xpY2UoMSwgLTEpKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZm4oKTtcclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW52b2tlSW5saW5lRXZlbnRFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZyk6IHZvaWQge1xyXG4gIGNvbnN0IHRyaW1tZWQgPSBleHByZXNzaW9uLnRyaW0oKTtcclxuICBpZiAoIXRyaW1tZWQpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGZvciAoY29uc3QgcGFydCBvZiB0cmltbWVkLnNwbGl0KCc7JykpIHtcclxuICAgIGNvbnN0IHN0YXRlbWVudCA9IHBhcnQudHJpbSgpO1xyXG4gICAgaWYgKCFzdGF0ZW1lbnQpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGludm9rZVdpbmRvd09wZW5FeHByZXNzaW9uKHN0YXRlbWVudCkgfHwgaW52b2tlR2xvYmFsRnVuY3Rpb25FeHByZXNzaW9uKHN0YXRlbWVudCkpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBtaWdyYXRlSW5saW5lRXZlbnRBdHRyaWJ1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGF0dHJpYnV0ZU5hbWU6IElubGluZUV2ZW50QXR0cmlidXRlKTogdm9pZCB7XHJcbiAgY29uc3QgZXhwcmVzc2lvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xyXG4gIGlmICghZXhwcmVzc2lvbikge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XHJcbiAgY29uc3QgZXZlbnROYW1lID0gdG9Eb21FdmVudE5hbWUoYXR0cmlidXRlTmFtZSk7XHJcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgKGV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnROYW1lID09PSAnc3VibWl0Jykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gICAgaW52b2tlSW5saW5lRXZlbnRFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWlncmF0ZVZlbmRvcklubGluZUV2ZW50QXR0cmlidXRlcyhyb290OiBOb2RlKTogdm9pZCB7XHJcbiAgaWYgKHJvb3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiByb290Lmhhc0F0dHJpYnV0ZShNSUdSQVRFRF9NQVJLRVIpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBlbGVtZW50czogSFRNTEVsZW1lbnRbXSA9IFtdO1xyXG4gIGlmIChyb290IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgIGVsZW1lbnRzLnB1c2gocm9vdCk7XHJcbiAgfVxyXG5cclxuICBpZiAocm9vdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgcm9vdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IHJvb3QgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XHJcbiAgICBlbGVtZW50cy5wdXNoKFxyXG4gICAgICAuLi5BcnJheS5mcm9tKFxyXG4gICAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXHJcbiAgICAgICAgICAnW29uY2xpY2tdLFtvbmRibGNsaWNrXSxbb25tb3VzZWRvd25dLFtvbm1vdXNldXBdLFtvbmtleWRvd25dLFtvbmtleXVwXSxbb25jaGFuZ2VdLFtvbmlucHV0XSxbb25zdWJtaXRdJyxcclxuICAgICAgICApLFxyXG4gICAgICApLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xyXG4gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKE1JR1JBVEVEX01BUktFUikpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIElOTElORV9FVkVOVF9BVFRSSUJVVEVTKSB7XHJcbiAgICAgIG1pZ3JhdGVJbmxpbmVFdmVudEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShNSUdSQVRFRF9NQVJLRVIsICd0cnVlJyk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbFZlbmRvcklubGluZUV2ZW50TWlncmF0aW9uKGRvY3VtZW50UmVmOiBEb2N1bWVudCk6IHZvaWQge1xyXG4gIGNvbnN0IGdsb2JhbHMgPSBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYgeyBbVkVORE9SX0VWRU5UX01JR1JBVElPTl9LRVldPzogYm9vbGVhbiB9O1xyXG4gIGlmIChnbG9iYWxzW1ZFTkRPUl9FVkVOVF9NSUdSQVRJT05fS0VZXSkge1xyXG4gICAgbWlncmF0ZVZlbmRvcklubGluZUV2ZW50QXR0cmlidXRlcyhkb2N1bWVudFJlZik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChyZWNvcmRzKSA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XHJcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gJ2F0dHJpYnV0ZXMnICYmIHJlY29yZC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIG1pZ3JhdGVWZW5kb3JJbmxpbmVFdmVudEF0dHJpYnV0ZXMocmVjb3JkLnRhcmdldCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByZWNvcmQuYWRkZWROb2Rlcykge1xyXG4gICAgICAgIG1pZ3JhdGVWZW5kb3JJbmxpbmVFdmVudEF0dHJpYnV0ZXMobm9kZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgY29uc3Qgcm9vdCA9IGRvY3VtZW50UmVmLmRvY3VtZW50RWxlbWVudCA/PyBkb2N1bWVudFJlZjtcclxuICBvYnNlcnZlci5vYnNlcnZlKHJvb3QsIHtcclxuICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgIHN1YnRyZWU6IHRydWUsXHJcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxyXG4gICAgYXR0cmlidXRlRmlsdGVyOiBbLi4uSU5MSU5FX0VWRU5UX0FUVFJJQlVURVNdLFxyXG4gIH0pO1xyXG5cclxuICBtaWdyYXRlVmVuZG9ySW5saW5lRXZlbnRBdHRyaWJ1dGVzKGRvY3VtZW50UmVmKTtcclxuICBnbG9iYWxzW1ZFTkRPUl9FVkVOVF9NSUdSQVRJT05fS0VZXSA9IHRydWU7XHJcbn1cclxuIl19
@@ -176,6 +176,135 @@ function installCaptchaSubmitGuard() {
176
176
  globalState[SUBMIT_GUARD_STATE_KEY] = true;
177
177
  }
178
178
 
179
+ const VENDOR_EVENT_MIGRATION_KEY = '__siaraShieldVendorEventMigrationInstalled__';
180
+ const MIGRATED_MARKER = 'data-siara-shield-event-migrated';
181
+ const INLINE_EVENT_ATTRIBUTES = [
182
+ 'onclick',
183
+ 'ondblclick',
184
+ 'onmousedown',
185
+ 'onmouseup',
186
+ 'onkeydown',
187
+ 'onkeyup',
188
+ 'onchange',
189
+ 'oninput',
190
+ 'onsubmit',
191
+ ];
192
+ function toDomEventName(attributeName) {
193
+ return attributeName.slice(2);
194
+ }
195
+ function resolveGlobalCallable(name) {
196
+ const globals = getSiaraShieldGlobals();
197
+ const candidate = globals[name];
198
+ return typeof candidate === 'function' ? candidate : undefined;
199
+ }
200
+ function invokeWindowOpenExpression(expression) {
201
+ const match = /^window\.open\(\s*(['"])(.*?)\1\s*(?:,\s*(['"])(.*?)\3\s*)?\)(?:\.focus\(\))?;?$/i.exec(expression);
202
+ if (!match) {
203
+ return false;
204
+ }
205
+ const targetWindow = globalThis.open(match[2], match[4] || '_blank');
206
+ targetWindow?.focus();
207
+ return true;
208
+ }
209
+ function invokeGlobalFunctionExpression(expression) {
210
+ const match = /^([_$a-zA-Z][\w$]*)\((.*)\);?$/s.exec(expression);
211
+ if (!match) {
212
+ return false;
213
+ }
214
+ const fn = resolveGlobalCallable(match[1]);
215
+ if (!fn) {
216
+ return false;
217
+ }
218
+ const args = match[2].trim();
219
+ if (!args) {
220
+ fn();
221
+ return true;
222
+ }
223
+ if (/^(['"]).*\1$/.test(args)) {
224
+ fn(args.slice(1, -1));
225
+ return true;
226
+ }
227
+ fn();
228
+ return true;
229
+ }
230
+ function invokeInlineEventExpression(expression) {
231
+ const trimmed = expression.trim();
232
+ if (!trimmed) {
233
+ return;
234
+ }
235
+ for (const part of trimmed.split(';')) {
236
+ const statement = part.trim();
237
+ if (!statement) {
238
+ continue;
239
+ }
240
+ if (invokeWindowOpenExpression(statement) || invokeGlobalFunctionExpression(statement)) {
241
+ continue;
242
+ }
243
+ }
244
+ }
245
+ function migrateInlineEventAttribute(element, attributeName) {
246
+ const expression = element.getAttribute(attributeName);
247
+ if (!expression) {
248
+ return;
249
+ }
250
+ element.removeAttribute(attributeName);
251
+ const eventName = toDomEventName(attributeName);
252
+ element.addEventListener(eventName, (event) => {
253
+ if (eventName === 'submit') {
254
+ event.preventDefault();
255
+ }
256
+ invokeInlineEventExpression(expression);
257
+ });
258
+ }
259
+ function migrateVendorInlineEventAttributes(root) {
260
+ if (root instanceof HTMLElement && root.hasAttribute(MIGRATED_MARKER)) {
261
+ return;
262
+ }
263
+ const elements = [];
264
+ if (root instanceof HTMLElement) {
265
+ elements.push(root);
266
+ }
267
+ if (root instanceof Element || root instanceof Document || root instanceof DocumentFragment) {
268
+ elements.push(...Array.from(root.querySelectorAll('[onclick],[ondblclick],[onmousedown],[onmouseup],[onkeydown],[onkeyup],[onchange],[oninput],[onsubmit]')));
269
+ }
270
+ for (const element of elements) {
271
+ if (element.hasAttribute(MIGRATED_MARKER)) {
272
+ continue;
273
+ }
274
+ for (const attributeName of INLINE_EVENT_ATTRIBUTES) {
275
+ migrateInlineEventAttribute(element, attributeName);
276
+ }
277
+ element.setAttribute(MIGRATED_MARKER, 'true');
278
+ }
279
+ }
280
+ function installVendorInlineEventMigration(documentRef) {
281
+ const globals = globalThis;
282
+ if (globals[VENDOR_EVENT_MIGRATION_KEY]) {
283
+ migrateVendorInlineEventAttributes(documentRef);
284
+ return;
285
+ }
286
+ const observer = new MutationObserver((records) => {
287
+ for (const record of records) {
288
+ if (record.type === 'attributes' && record.target instanceof HTMLElement) {
289
+ migrateVendorInlineEventAttributes(record.target);
290
+ continue;
291
+ }
292
+ for (const node of record.addedNodes) {
293
+ migrateVendorInlineEventAttributes(node);
294
+ }
295
+ }
296
+ });
297
+ const root = documentRef.documentElement ?? documentRef;
298
+ observer.observe(root, {
299
+ childList: true,
300
+ subtree: true,
301
+ attributes: true,
302
+ attributeFilter: [...INLINE_EVENT_ATTRIBUTES],
303
+ });
304
+ migrateVendorInlineEventAttributes(documentRef);
305
+ globals[VENDOR_EVENT_MIGRATION_KEY] = true;
306
+ }
307
+
179
308
  const SCRIPT_STATUS_BY_DOCUMENT = new WeakMap();
180
309
  const SCRIPT_PENDING_BY_DOCUMENT = new WeakMap();
181
310
  const DYNAMIC_SCRIPT_NONCE_STATE_KEY = '__siaraShieldDynamicScriptNonceState__';
@@ -445,6 +574,7 @@ function prepareScriptNonce(documentRef, explicitNonce) {
445
574
  if (effectiveDocumentRef) {
446
575
  patchState.nonceByDocument.set(effectiveDocumentRef, resolvedNonce);
447
576
  ensureNonceMutationObserver(effectiveDocumentRef);
577
+ installVendorInlineEventMigration(effectiveDocumentRef);
448
578
  }
449
579
  }
450
580
  else {
@@ -1081,6 +1211,7 @@ function getSiaraShieldCspDirectives(options) {
1081
1211
  // Default to strict/safe CSP. Customers can explicitly opt-in if they accept the risk.
1082
1212
  const includeUnsafeInlineScript = options?.includeUnsafeInlineScript ?? false;
1083
1213
  const includeUnsafeInlineStyle = options?.includeUnsafeInlineStyle ?? false;
1214
+ const allowInlineEventAttributes = options?.allowInlineEventAttributes ?? false;
1084
1215
  const nonce = nonceSource(options?.nonce);
1085
1216
  const scriptHosts = includeGoogleApis ? [...SCRIPT_HOSTS, ...OPTIONAL_SCRIPT_HOSTS] : [...SCRIPT_HOSTS];
1086
1217
  const styleSources = unique([SELF, nonce, ...STYLE_HOSTS]);
@@ -1088,12 +1219,12 @@ function getSiaraShieldCspDirectives(options) {
1088
1219
  'default-src': unique([SELF]),
1089
1220
  /**
1090
1221
  * CSP note:
1091
- * - Vendor HTML includes inline event handlers (onclick, etc). CSP nonces do NOT cover those.
1092
- * - We keep `script-src-elem` strict (nonce + host allowlist), and scope inline allowances to attributes only.
1222
+ * - Vendor HTML can include inline event handlers (onclick, etc). CSP nonces do NOT cover those.
1223
+ * - With a configured nonce, the package migrates those handlers to addEventListener so `script-src-attr 'none'` works.
1093
1224
  */
1094
1225
  'script-src': unique([SELF, nonce, ...scriptHosts, includeUnsafeInlineScript ? UNSAFE_INLINE : undefined]),
1095
1226
  'script-src-elem': unique([SELF, nonce, ...scriptHosts]),
1096
- 'script-src-attr': unique([SELF, "'unsafe-inline'"]),
1227
+ 'script-src-attr': unique(allowInlineEventAttributes ? [SELF, UNSAFE_INLINE] : ["'none'"]),
1097
1228
  'connect-src': unique([SELF, ...CONNECT_HOSTS]),
1098
1229
  'img-src': unique([SELF, DATA, ...IMG_HOSTS]),
1099
1230
  /**