@canonry/canonry 4.136.1 → 4.137.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +2 -1
  2. package/assets/assets/{AuditHistoryPanel-B73VrWNb.js → AuditHistoryPanel-B6GEmlVM.js} +1 -1
  3. package/assets/assets/{BacklinksPage-CLVMg_qx.js → BacklinksPage-Cr3QegNo.js} +1 -1
  4. package/assets/assets/{ChartPrimitives-P81CbvWc.js → ChartPrimitives-rhsGzU1A.js} +1 -1
  5. package/assets/assets/{HistoryPage-IcDqWBYW.js → HistoryPage-B3HrxyPP.js} +1 -1
  6. package/assets/assets/ProjectPage-D3WiL3RI.js +8 -0
  7. package/assets/assets/{RunRow-BTH3-Tml.js → RunRow-MsV1RLPm.js} +1 -1
  8. package/assets/assets/{RunsPage-B0k5wjFN.js → RunsPage-BVlv0j3Y.js} +1 -1
  9. package/assets/assets/{SettingsPage-DGnT3Vdr.js → SettingsPage-Dfd-T4o9.js} +1 -1
  10. package/assets/assets/{TrafficPage-D79PC0bB.js → TrafficPage-Bl1jj73m.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-BYEVjfFm.js → TrafficSourceDetailPage-CinQcKmY.js} +1 -1
  12. package/assets/assets/{arrow-left-DCdFYJK-.js → arrow-left-CHU6s_Xn.js} +1 -1
  13. package/assets/assets/extract-error-message-BDdyZgyf.js +1 -0
  14. package/assets/assets/index-BNulljlk.js +213 -0
  15. package/assets/assets/{trash-2-CEz2iXBv.js → trash-2-BE5oH1Tj.js} +1 -1
  16. package/assets/index.html +1 -1
  17. package/dist/{chunk-PIMWEIJ3.js → chunk-7RF5EDUO.js} +3141 -400
  18. package/dist/{chunk-YQ2RXMU2.js → chunk-PBTB3FCN.js} +207 -195
  19. package/dist/{chunk-OESGFFUO.js → chunk-UVWI6VPP.js} +1 -1
  20. package/dist/{chunk-YMF35LN5.js → chunk-XEX5CLQW.js} +163 -133
  21. package/dist/cli.js +147 -33
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-BKLR57RQ.js → intelligence-service-JEFHUGVX.js} +2 -2
  25. package/dist/mcp.js +2 -2
  26. package/package.json +9 -9
  27. package/assets/assets/ProjectPage-DTivvVIl.js +0 -8
  28. package/assets/assets/extract-error-message-bM0aUBUI.js +0 -1
  29. package/assets/assets/index-CMuA-uEN.js +0 -210
@@ -53,6 +53,22 @@ function quotaExceeded(metric, details) {
53
53
  function providerError(message, details) {
54
54
  return new AppError("PROVIDER_ERROR", message, 502, details);
55
55
  }
56
+ function noProvider(projectName, details) {
57
+ return new AppError(
58
+ "NO_PROVIDER",
59
+ `No runnable answer provider is configured for '${projectName}'. Configure a provider before starting a run.`,
60
+ 503,
61
+ { projectName, ...details }
62
+ );
63
+ }
64
+ function noQueries(projectName) {
65
+ return new AppError(
66
+ "NO_QUERIES",
67
+ `Project '${projectName}' has no tracked queries. Add at least one query before starting a run.`,
68
+ 422,
69
+ { projectName }
70
+ );
71
+ }
56
72
  function runInProgress(projectName) {
57
73
  return new AppError("RUN_IN_PROGRESS", `A run is already in progress for '${projectName}'`, 409);
58
74
  }
@@ -300,6 +316,2914 @@ var gaMeasurementAnalysisDtoSchema = z2.object({
300
316
  })
301
317
  });
302
318
 
319
+ // ../../node_modules/.pnpm/uc.micro@3.0.0/node_modules/uc.micro/build/index.mjs
320
+ var Any = /[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
321
+ var Cc = /[\0-\x1F\x7F-\x9F]/;
322
+ var P = /[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B4E\u1B4F\u1B5A-\u1B60\u1B7D-\u1B7F\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDD6E\uDEAD\uDED0\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9\uDFD4\uDFD5\uDFD7\uDFD8]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09\uDFE1]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDD6D-\uDD6F\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD839\uDDFF|\uD83A[\uDD5E\uDD5F]/;
323
+ var Z = /[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/;
324
+
325
+ // ../../node_modules/.pnpm/linkify-it@6.1.0/node_modules/linkify-it/build/index.mjs
326
+ var REBuilder = class {
327
+ src_Any = Any.source;
328
+ src_Cc = Cc.source;
329
+ src_Z = Z.source;
330
+ src_P = P.source;
331
+ src_ZPCc = [
332
+ this.src_Z,
333
+ this.src_P,
334
+ this.src_Cc
335
+ ].join("|");
336
+ src_ZCc = [this.src_Z, this.src_Cc].join("|");
337
+ cache = {};
338
+ opts = {
339
+ maxLength: 1e4,
340
+ urlAuth: false,
341
+ schema_names: []
342
+ };
343
+ constructor(opts = {}) {
344
+ this.opts = {
345
+ ...this.opts,
346
+ ...opts
347
+ };
348
+ }
349
+ set(opts = {}) {
350
+ this.opts = {
351
+ ...this.opts,
352
+ ...opts
353
+ };
354
+ this.cache = {};
355
+ return this;
356
+ }
357
+ escapeRE(str) {
358
+ return str.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
359
+ }
360
+ nestedPairRE(open, close, depth = 4) {
361
+ const openRE = this.escapeRE(open);
362
+ const closeRE = this.escapeRE(close);
363
+ const atom = `(?:(?!${this.src_ZCc}|${openRE}|${closeRE}).)`;
364
+ let pair = `${openRE}${atom}{0,1000}${closeRE}`;
365
+ for (let level = 2; level <= depth; level++) pair = `${openRE}(?:${atom}|${pair}){0,1000}${closeRE}`;
366
+ return pair;
367
+ }
368
+ get_text_separators() {
369
+ return this.cache.text_separators ??= /[><\uff5c]/;
370
+ }
371
+ get_pseudo_letter() {
372
+ return this.cache.src_pseudo_letter ??= new RegExp(`(?:(?!${this.get_text_separators().source}|${this.src_ZPCc})${this.src_Any})`);
373
+ }
374
+ get_ipv4_addr() {
375
+ return this.cache.src_ip4 ??= /* @__PURE__ */ new RegExp("(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])[.]){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])");
376
+ }
377
+ get_ipv6_addr() {
378
+ const h16 = "[0-9A-Fa-f]{1,4}";
379
+ const ls32 = `(?:(?:${h16}:${h16})|${this.get_ipv4_addr().source})`;
380
+ return this.cache.src_ip6_addr ??= new RegExp(`(?:(?:${h16}:){6}${ls32}|::(?:${h16}:){5}${ls32}|(?:${h16})?::(?:${h16}:){4}${ls32}|(?:(?:${h16}:){0,1}${h16})?::(?:${h16}:){3}${ls32}|(?:(?:${h16}:){0,2}${h16})?::(?:${h16}:){2}${ls32}|(?:(?:${h16}:){0,3}${h16})?::${h16}:${ls32}|(?:(?:${h16}:){0,4}${h16})?::${ls32}|(?:(?:${h16}:){0,5}${h16})?::${h16}|(?:(?:${h16}:){0,6}${h16})?::)`);
381
+ }
382
+ get_ipv6_url_host() {
383
+ return this.cache.src_ip6_host ??= new RegExp(`\\[${this.get_ipv6_addr().source}\\]`);
384
+ }
385
+ get_ipv6_mail_host() {
386
+ return this.cache.src_ipv6_mail_host ??= new RegExp(`\\[IPv6:${this.get_ipv6_addr().source}\\]`);
387
+ }
388
+ get_auth() {
389
+ return this.cache.src_auth ??= new RegExp(`(?:(?:(?!${this.src_ZCc}|[@/\\[\\]()]).){1,50}@)?`);
390
+ }
391
+ get_port() {
392
+ return this.cache.src_port ??= /* @__PURE__ */ new RegExp("(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?");
393
+ }
394
+ get_host_terminator() {
395
+ return this.cache.src_host_terminator ??= new RegExp(`(?=$|${this.get_text_separators().source}|${this.src_ZPCc})(?!${this.opts["---"] ? "-(?!--)|" : "-|"}_|:\\d|\\.-|\\.(?!$|${this.src_ZPCc}))`);
396
+ }
397
+ get_path_terminator() {
398
+ return this.cache.src_path_terminator ??= new RegExp(`${this.src_ZPCc}|${this.get_text_separators().source}`);
399
+ }
400
+ get_path() {
401
+ return this.cache.src_path ??= new RegExp(`(?:[/?#](?:${this.nestedPairRE("[", "]")}|${this.nestedPairRE("(", ")")}|${this.nestedPairRE("{", "}")}|\\"(?:(?!${this.src_ZCc}|["]).){1,100}\\"|\\'(?:(?!${this.src_ZCc}|[']).){1,100}\\'|\\'(?=${this.get_pseudo_letter().source}|[-])|\\.{2,20}[:]?[a-zA-Z0-9%/&]|\\.(?!${this.src_ZCc}|[.]|$)|` + (this.opts["---"] ? "\\-(?!--(?:[^-]|$))(?:-{0,19})|" : "\\-{1,20}|") + `,(?!${this.src_ZCc}|$)|;(?!${this.src_ZCc}|$)|\\!{1,20}(?!${this.src_ZCc}|[!]|$)|\\?(?!${this.src_ZCc}|[?]|$)|` + this.get_path_extra().source + `[\\\\/:%@#&=_~*]|(?!${this.get_path_terminator().source}).){1,${this.opts.maxLength}}|\\/)?`);
402
+ }
403
+ get_mail_name() {
404
+ return this.cache.src_mail_name ??= /* @__PURE__ */ new RegExp("[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9](?:[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9]|[.](?=[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9])){0,63}");
405
+ }
406
+ get_xn() {
407
+ return this.cache.src_xn ??= /* @__PURE__ */ new RegExp("xn--[a-z0-9\\-]{1,59}");
408
+ }
409
+ get_tld() {
410
+ if (this.cache.tld) return this.cache.tld;
411
+ const tlds_src = [...new Set(this.opts.tlds || [])].sort().reverse().join("|");
412
+ this.cache.tld = new RegExp(`${tlds_src || "$#none#$"}|${this.get_xn().source}`);
413
+ return this.cache.tld;
414
+ }
415
+ get_domain_root() {
416
+ return this.cache.src_domain_root ??= new RegExp("(?:" + this.get_xn().source + `|${this.get_pseudo_letter().source}{1,63})`);
417
+ }
418
+ get_domain() {
419
+ return this.cache.src_domain ??= new RegExp("(?:" + this.get_xn().source + `|(?:${this.get_pseudo_letter().source})|(?:${this.get_pseudo_letter().source}(?:-|${this.get_pseudo_letter().source}){0,61}${this.get_pseudo_letter().source}))`);
420
+ }
421
+ get_url_host_port() {
422
+ return this.cache.url_host_port ??= new RegExp("(?:" + this.get_ipv6_url_host().source + `|(?:(?:(?:${this.get_domain().source})\\.){0,10}${this.get_domain().source}))` + this.get_port().source + this.get_host_terminator().source);
423
+ }
424
+ get_fuzzy_url_host_port() {
425
+ return this.cache.fuzzy_url_host_port ??= new RegExp("(?:" + (this.opts.fuzzyIP ? this.get_ipv4_addr().source + "|" : "") + `(?:(?:(?:${this.get_domain().source})\\.){1,10}(?:${this.get_tld().source})))` + this.get_host_terminator().source);
426
+ }
427
+ get_mail_host() {
428
+ return this.cache.src_mail_host ??= new RegExp("(?:" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})\\.){0,4}${this.get_domain().source}))` + this.get_host_terminator().source);
429
+ }
430
+ get_fuzzy_mail_host() {
431
+ return this.cache.src_fuzzy_mail_host ??= new RegExp("(?:" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})[.]){1,4}${this.get_domain_root().source}))` + this.get_host_terminator().source);
432
+ }
433
+ get_path_extra() {
434
+ return this.cache.src_path_extra ??= /* @__PURE__ */ new RegExp("");
435
+ }
436
+ get_fuzzy_mail_host_search() {
437
+ return this.cache.mail_fuzzy_host_search ??= new RegExp(`@${this.get_fuzzy_mail_host().source}`, "ig");
438
+ }
439
+ get_fuzzy_link_search() {
440
+ return this.cache.link_fuzzy_search ??= new RegExp(`(^|(?![.:/\\-_@])(?:[$+<=>^\`|\uFF5C]|${this.src_ZPCc}))(?:(?![$+<=>^\`|\uFF5C])${this.get_fuzzy_url_host_port().source}${this.get_path().source})`, "ig");
441
+ }
442
+ get_http_validator() {
443
+ return this.cache.http_validator ??= new RegExp("\\/\\/" + (this.opts.urlAuth ? this.get_auth().source : "") + this.get_url_host_port().source + this.get_path().source, "iy");
444
+ }
445
+ get_relative_proto_validator() {
446
+ return this.cache.relative_proto_validator ??= new RegExp((this.opts.urlAuth ? this.get_auth().source : "") + `(?:localhost|${this.get_ipv6_url_host().source}|(?:(?:${this.get_domain().source})[.]){1,10}${this.get_domain_root().source})` + this.get_port().source + this.get_host_terminator().source + this.get_path().source, "iy");
447
+ }
448
+ get_mail_name_validator() {
449
+ return this.cache.mail_name_validator ??= new RegExp(`(?:^|${this.get_text_separators().source}|"|\\(|${this.src_ZCc})(${this.get_mail_name().source})$`);
450
+ }
451
+ get_mailto_validator() {
452
+ return this.cache.mailto_validator ??= new RegExp(`${this.get_mail_name().source}@${this.get_mail_host().source}`, "iy");
453
+ }
454
+ get_schema_names() {
455
+ return this.cache.schema_names ??= new RegExp((this.opts.schema_names || []).map((name) => this.escapeRE(name)).join("|"));
456
+ }
457
+ get_schema_search() {
458
+ return this.cache.schema_search ??= new RegExp(`(^|(?!_)(?:[><\uFF5C]|${this.src_ZPCc}))(${this.get_schema_names().source})`, "ig");
459
+ }
460
+ get_schema_at_start() {
461
+ return this.cache.schema_at_start ??= new RegExp(`^${this.get_schema_search().source}`, "i");
462
+ }
463
+ };
464
+ var web_schema = {
465
+ validate: (text, pos, self) => {
466
+ const re = self.re.get_http_validator();
467
+ re.lastIndex = pos;
468
+ const m = re.exec(text);
469
+ return m ? m[0].length : 0;
470
+ },
471
+ normalize: (match, self) => self.normalize(match)
472
+ };
473
+ var defaultSchemas = {
474
+ "http:": web_schema,
475
+ "https:": web_schema,
476
+ "ftp:": web_schema,
477
+ "//": {
478
+ validate: function(text, pos, self) {
479
+ const re = self.re.get_relative_proto_validator();
480
+ re.lastIndex = pos;
481
+ const m = re.exec(text);
482
+ if (m) {
483
+ if (pos >= 3 && text[pos - 3] === ":") return 0;
484
+ if (pos >= 3 && text[pos - 3] === "/") return 0;
485
+ return m[0].length;
486
+ }
487
+ return 0;
488
+ },
489
+ normalize: (match, self) => self.normalize(match)
490
+ },
491
+ "mailto:": {
492
+ validate: function(text, pos, self) {
493
+ const re = self.re.get_mailto_validator();
494
+ re.lastIndex = pos;
495
+ const m = re.exec(text);
496
+ return m ? m[0].length : 0;
497
+ },
498
+ normalize: (match, self) => self.normalize(match)
499
+ }
500
+ };
501
+ var tlds_2ch = "a:cdefgilmnoqrstuwxz|b:abdefghijmnorstvwyz|c:acdfghiklmnoruvwxyz|d:ejkmoz|e:cegrstu|f:ijkmor|g:abdefghilmnpqrstuwy|h:kmnrtu|i:delmnoqrst|j:emop|k:eghimnprwyz|l:abcikrstuvy|m:acdeghklmnopqrstuvwxyz|n:acefgilopruz|o:m|p:aefghklmnrstwy|q:a|r:eosuw|s:abcdeghijklmnortuvxyz|t:cdfghjklmnortvwz|u:agksyz|v:aceginu|w:fs|y:et|z:amw";
502
+ var tlds_default = "biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444";
503
+ function unpackTlds() {
504
+ const result = tlds_default.split("|");
505
+ tlds_2ch.split("|").forEach((item) => {
506
+ const sep = item.indexOf(":");
507
+ const prefix = item.slice(0, sep);
508
+ for (const suffix of item.slice(sep + 1)) result.push(prefix + suffix);
509
+ });
510
+ return result;
511
+ }
512
+ var defaultOptions = {
513
+ fuzzyLink: false,
514
+ fuzzyEmail: true,
515
+ fuzzyIP: false,
516
+ "---": false,
517
+ tlds: unpackTlds(),
518
+ urlAuth: false,
519
+ maxLength: 1e4
520
+ };
521
+ var Match = class {
522
+ /** Prefix (protocol) for matched string. Empty for fuzzy links. */
523
+ schema;
524
+ /** First position of matched string. */
525
+ index;
526
+ /** Next position after matched string. */
527
+ lastIndex;
528
+ /** Matched string. */
529
+ raw;
530
+ /** Normalized text of matched string. */
531
+ text;
532
+ /** Normalized URL of matched string. */
533
+ url;
534
+ constructor(text, schema, index, lastIndex) {
535
+ const raw = text.slice(index, lastIndex);
536
+ this.schema = schema.toLowerCase();
537
+ this.index = index;
538
+ this.lastIndex = lastIndex;
539
+ this.raw = raw;
540
+ this.text = raw;
541
+ this.url = raw;
542
+ }
543
+ };
544
+ var LinkifyIt = class {
545
+ __opts__;
546
+ __schemas__;
547
+ re;
548
+ /**
549
+ * Creates new linkifier instance.
550
+ *
551
+ * By default understands:
552
+ *
553
+ * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links
554
+ * - "fuzzy" emails (foo@bar.com).
555
+ *
556
+ * See {@link LinkifyConstructorOptions} for available options.
557
+ *
558
+ * @param options Recognition options.
559
+ *
560
+ * @example
561
+ * ```javascript
562
+ * import { LinkifyIt } from 'linkify-it'
563
+ *
564
+ * const linkify = new LinkifyIt({ fuzzyLink: true })
565
+ *
566
+ * linkify
567
+ * .tlds(require('tlds')) // Reload with full TLD list
568
+ * .tlds('onion', true) // Add unofficial `.onion` domain
569
+ * .add('ftp:', null) // Disable `ftp:` protocol
570
+ * .set({ fuzzyIP: true }) // Enable IPs in fuzzy links
571
+ *
572
+ * console.log(linkify.test('Site github.com!')) // true
573
+ * console.log(linkify.match('Site github.com!'))
574
+ * ```
575
+ */
576
+ constructor(options = {}) {
577
+ const { rebuilder, ...linkifyOptions } = options;
578
+ this.__opts__ = {
579
+ ...defaultOptions,
580
+ ...linkifyOptions
581
+ };
582
+ this.__schemas__ = { ...defaultSchemas };
583
+ this.re = rebuilder || new REBuilder();
584
+ this.re.set({
585
+ ...this.__opts__,
586
+ schema_names: Object.keys(this.__schemas__)
587
+ });
588
+ }
589
+ /**
590
+ * Add new rule definition.
591
+ *
592
+ * `schema` is a link prefix (usually, protocol name with `:` at the end,
593
+ * `skype:` for example). `linkify-it` makes sure that prefix is not
594
+ * preceded with alphanumeric char and symbols. Only whitespaces and
595
+ * punctuation allowed.
596
+ *
597
+ * `definition` is a rule to check tail after link prefix. To disable an
598
+ * existing rule, pass `null`.
599
+ *
600
+ * @param schema Rule name (fixed pattern prefix).
601
+ * @param definition Schema definition, or `null` to disable the rule.
602
+ *
603
+ * See [twitter mentions example](https://github.com/markdown-it/linkify-it/blob/master/examples/twitter.mjs).
604
+ */
605
+ add(schema, definition = null) {
606
+ if (!definition) delete this.__schemas__[schema];
607
+ else {
608
+ const def = {
609
+ normalize: (match, self) => self.normalize(match),
610
+ ...definition
611
+ };
612
+ this.__schemas__[schema] = def;
613
+ }
614
+ this.re.set({
615
+ ...this.__opts__,
616
+ schema_names: Object.keys(this.__schemas__)
617
+ });
618
+ return this;
619
+ }
620
+ /**
621
+ * Set recognition options for links without schema.
622
+ *
623
+ * @param options Recognition options.
624
+ */
625
+ set(options = {}) {
626
+ this.__opts__ = {
627
+ ...this.__opts__,
628
+ ...options
629
+ };
630
+ this.re.set({
631
+ ...this.__opts__,
632
+ schema_names: Object.keys(this.__schemas__)
633
+ });
634
+ return this;
635
+ }
636
+ /**
637
+ * Searches linkifiable pattern and returns `true` on success or `false` on fail.
638
+ *
639
+ * @param text Text to scan.
640
+ */
641
+ test(text) {
642
+ if (!text.length) return false;
643
+ let m, re;
644
+ re = this.re.get_schema_search();
645
+ re.lastIndex = 0;
646
+ while ((m = re.exec(text)) !== null) if (this.testSchemaAt(text, m[2], re.lastIndex)) return true;
647
+ if (this.__opts__.fuzzyLink && this.__schemas__["http:"]) {
648
+ re = this.re.get_fuzzy_link_search();
649
+ re.lastIndex = 0;
650
+ if (re.exec(text) !== null) return true;
651
+ }
652
+ if (this.__opts__.fuzzyEmail && this.__schemas__["mailto:"]) {
653
+ if (text.indexOf("@") >= 0) {
654
+ const mailHostRe = this.re.get_fuzzy_mail_host_search();
655
+ const mailNameRe = this.re.get_mail_name_validator();
656
+ mailHostRe.lastIndex = 0;
657
+ while ((m = mailHostRe.exec(text)) !== null) {
658
+ const name = text.slice(Math.max(0, m.index - 65), m.index);
659
+ if (mailNameRe.test(name)) return true;
660
+ }
661
+ }
662
+ }
663
+ return false;
664
+ }
665
+ /**
666
+ * Similar to {@link LinkifyIt.test} but checks only specific protocol tail exactly
667
+ * at given position. Returns length of found pattern (0 on fail).
668
+ *
669
+ * @param text Text to scan.
670
+ * @param schema Rule (schema) name.
671
+ * @param pos Text offset to check from.
672
+ */
673
+ testSchemaAt(text, schema, pos) {
674
+ if (!this.__schemas__[schema.toLowerCase()]) return 0;
675
+ return this.__schemas__[schema.toLowerCase()].validate(text.slice(0, pos + this.__opts__.maxLength), pos, this);
676
+ }
677
+ /**
678
+ * Returns array of found link descriptions or `null` on fail. We strongly
679
+ * recommend to use {@link LinkifyIt.test} first, for best speed.
680
+ *
681
+ * @param text Text to scan.
682
+ */
683
+ match(text) {
684
+ const result = [];
685
+ const schemaRe = this.re.get_schema_search();
686
+ let fuzzyLinkRe;
687
+ let mailHostRe;
688
+ let mailNameRe;
689
+ let fuzzyLinkCandidate;
690
+ let fuzzyEmailCandidate;
691
+ let schemaPrefix;
692
+ let schemaDone = false;
693
+ let fuzzyLinkDone = false;
694
+ let fuzzyEmailDone = false;
695
+ let pos = 0;
696
+ if (!text.length) return null;
697
+ schemaRe.lastIndex = 0;
698
+ if (this.__opts__.fuzzyLink && this.__schemas__["http:"]) {
699
+ fuzzyLinkRe = this.re.get_fuzzy_link_search();
700
+ fuzzyLinkRe.lastIndex = 0;
701
+ }
702
+ if (this.__opts__.fuzzyEmail && this.__schemas__["mailto:"]) {
703
+ mailHostRe = this.re.get_fuzzy_mail_host_search();
704
+ mailHostRe.lastIndex = 0;
705
+ mailNameRe = this.re.get_mail_name_validator();
706
+ }
707
+ for (; ; ) {
708
+ const scanFrom = Math.max(pos - 1, 0);
709
+ if (mailHostRe && mailNameRe && !fuzzyEmailDone && (!fuzzyEmailCandidate || fuzzyEmailCandidate.index < pos)) {
710
+ if (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;
711
+ for (; ; ) {
712
+ const m = mailHostRe.exec(text);
713
+ if (!m) {
714
+ fuzzyEmailDone = true;
715
+ fuzzyEmailCandidate = void 0;
716
+ break;
717
+ }
718
+ const name = mailNameRe.exec(text.slice(Math.max(0, m.index - 65), m.index));
719
+ if (!name) continue;
720
+ fuzzyEmailCandidate = {
721
+ schema: "mailto:",
722
+ index: m.index - name[1].length,
723
+ lastIndex: m.index + m[0].length
724
+ };
725
+ if (fuzzyEmailCandidate.index >= pos) break;
726
+ if (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;
727
+ }
728
+ }
729
+ if (fuzzyLinkRe && !fuzzyLinkDone && (!fuzzyLinkCandidate || fuzzyLinkCandidate.index < pos)) {
730
+ if (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;
731
+ for (; ; ) {
732
+ const m = fuzzyLinkRe.exec(text);
733
+ if (!m) {
734
+ fuzzyLinkDone = true;
735
+ fuzzyLinkCandidate = void 0;
736
+ break;
737
+ }
738
+ fuzzyLinkCandidate = {
739
+ schema: "",
740
+ index: m.index + m[1].length,
741
+ lastIndex: m.index + m[0].length
742
+ };
743
+ if (fuzzyLinkCandidate.index >= pos) break;
744
+ if (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;
745
+ }
746
+ }
747
+ let fuzzyCandidate = fuzzyEmailCandidate;
748
+ if (!fuzzyCandidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < fuzzyCandidate.index || fuzzyLinkCandidate.index === fuzzyCandidate.index && fuzzyLinkCandidate.lastIndex > fuzzyCandidate.lastIndex)) fuzzyCandidate = fuzzyLinkCandidate;
749
+ let schemaCandidate;
750
+ if (!schemaDone) for (; ; ) {
751
+ if (!schemaPrefix) {
752
+ if (schemaRe.lastIndex < scanFrom) schemaRe.lastIndex = scanFrom;
753
+ const m = schemaRe.exec(text);
754
+ if (!m) {
755
+ schemaDone = true;
756
+ break;
757
+ }
758
+ schemaPrefix = {
759
+ schema: m[2],
760
+ index: m.index + m[1].length,
761
+ lastIndex: m.index + m[0].length
762
+ };
763
+ }
764
+ if (schemaPrefix.index < pos) {
765
+ schemaPrefix = void 0;
766
+ continue;
767
+ }
768
+ if (fuzzyCandidate && schemaPrefix.index > fuzzyCandidate.index) break;
769
+ const prefix = schemaPrefix;
770
+ schemaPrefix = void 0;
771
+ const len = this.testSchemaAt(text, prefix.schema, prefix.lastIndex);
772
+ if (len) {
773
+ schemaCandidate = {
774
+ schema: prefix.schema,
775
+ index: prefix.index,
776
+ lastIndex: prefix.lastIndex + len
777
+ };
778
+ break;
779
+ }
780
+ }
781
+ let candidate = schemaCandidate;
782
+ if (!candidate || fuzzyEmailCandidate && (fuzzyEmailCandidate.index < candidate.index || fuzzyEmailCandidate.index === candidate.index && fuzzyEmailCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyEmailCandidate;
783
+ if (!candidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < candidate.index || fuzzyLinkCandidate.index === candidate.index && fuzzyLinkCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyLinkCandidate;
784
+ if (!candidate) break;
785
+ if (candidate === fuzzyEmailCandidate) fuzzyEmailCandidate = void 0;
786
+ else if (candidate === fuzzyLinkCandidate) fuzzyLinkCandidate = void 0;
787
+ const match = new Match(text, candidate.schema, candidate.index, candidate.lastIndex);
788
+ if (match.schema) this.__schemas__[match.schema].normalize(match, this);
789
+ else this.normalize(match);
790
+ result.push(match);
791
+ pos = candidate.lastIndex;
792
+ }
793
+ if (result.length) return result;
794
+ return null;
795
+ }
796
+ /**
797
+ * Returns fully-formed (not fuzzy) link if it starts at the beginning
798
+ * of the string, and null otherwise.
799
+ *
800
+ * @param text Text to scan.
801
+ */
802
+ matchAtStart(text) {
803
+ if (!text.length) return null;
804
+ const m = this.re.get_schema_at_start().exec(text);
805
+ if (!m) return null;
806
+ const len = this.testSchemaAt(text, m[2], m[0].length);
807
+ if (!len) return null;
808
+ const match = new Match(text, m[2], m.index + m[1].length, m.index + m[0].length + len);
809
+ this.__schemas__[match.schema].normalize(match, this);
810
+ return match;
811
+ }
812
+ /**
813
+ * Load (or merge) new TLDs list. Those are used for fuzzy links (without
814
+ * prefix) to avoid false positives. By default this algorithm is used:
815
+ *
816
+ * - hostname with any 2-letter root zones are ok.
817
+ * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф
818
+ * are ok.
819
+ * - encoded (`xn--...`) root zones are ok.
820
+ *
821
+ * If list is replaced, then exact match for 2-chars root zones will be checked.
822
+ *
823
+ * @param list List of TLDs.
824
+ * @param keepOld Merge with current list if `true` (`false` by default).
825
+ */
826
+ tlds(list, keepOld = false) {
827
+ list = Array.isArray(list) ? list : [list];
828
+ if (!keepOld) this.__opts__.tlds = list;
829
+ else this.__opts__.tlds = this.__opts__.tlds.concat(list);
830
+ this.re.set({
831
+ ...this.__opts__,
832
+ schema_names: Object.keys(this.__schemas__)
833
+ });
834
+ return this;
835
+ }
836
+ /**
837
+ * Default normalizer (if schema does not define its own).
838
+ *
839
+ * @param match Match to normalize.
840
+ */
841
+ normalize(match) {
842
+ if (!match.schema) match.url = `http://${match.url}`;
843
+ if (match.schema === "mailto:" && !/^mailto:/i.test(match.url)) match.url = `mailto:${match.url}`;
844
+ }
845
+ };
846
+
847
+ // ../../node_modules/.pnpm/tlds@1.261.0/node_modules/tlds/index.json
848
+ var tlds_default2 = [
849
+ "aaa",
850
+ "aarp",
851
+ "abb",
852
+ "abbott",
853
+ "abbvie",
854
+ "abc",
855
+ "able",
856
+ "abogado",
857
+ "abudhabi",
858
+ "ac",
859
+ "academy",
860
+ "accenture",
861
+ "accountant",
862
+ "accountants",
863
+ "aco",
864
+ "actor",
865
+ "ad",
866
+ "ads",
867
+ "adult",
868
+ "ae",
869
+ "aeg",
870
+ "aero",
871
+ "aetna",
872
+ "af",
873
+ "afl",
874
+ "africa",
875
+ "ag",
876
+ "agakhan",
877
+ "agency",
878
+ "ai",
879
+ "aig",
880
+ "airbus",
881
+ "airforce",
882
+ "airtel",
883
+ "akdn",
884
+ "al",
885
+ "alibaba",
886
+ "alipay",
887
+ "allfinanz",
888
+ "allstate",
889
+ "ally",
890
+ "alsace",
891
+ "alstom",
892
+ "am",
893
+ "amazon",
894
+ "americanexpress",
895
+ "americanfamily",
896
+ "amex",
897
+ "amfam",
898
+ "amica",
899
+ "amsterdam",
900
+ "analytics",
901
+ "android",
902
+ "anquan",
903
+ "anz",
904
+ "ao",
905
+ "aol",
906
+ "apartments",
907
+ "app",
908
+ "apple",
909
+ "aq",
910
+ "aquarelle",
911
+ "ar",
912
+ "arab",
913
+ "aramco",
914
+ "archi",
915
+ "army",
916
+ "arpa",
917
+ "art",
918
+ "arte",
919
+ "as",
920
+ "asda",
921
+ "asia",
922
+ "associates",
923
+ "at",
924
+ "athleta",
925
+ "attorney",
926
+ "au",
927
+ "auction",
928
+ "audi",
929
+ "audible",
930
+ "audio",
931
+ "auspost",
932
+ "author",
933
+ "auto",
934
+ "autos",
935
+ "aw",
936
+ "aws",
937
+ "ax",
938
+ "axa",
939
+ "az",
940
+ "azure",
941
+ "ba",
942
+ "baby",
943
+ "baidu",
944
+ "banamex",
945
+ "band",
946
+ "bank",
947
+ "bar",
948
+ "barcelona",
949
+ "barclaycard",
950
+ "barclays",
951
+ "barefoot",
952
+ "bargains",
953
+ "baseball",
954
+ "basketball",
955
+ "bauhaus",
956
+ "bayern",
957
+ "bb",
958
+ "bbc",
959
+ "bbt",
960
+ "bbva",
961
+ "bcg",
962
+ "bcn",
963
+ "bd",
964
+ "be",
965
+ "beats",
966
+ "beauty",
967
+ "beer",
968
+ "berlin",
969
+ "best",
970
+ "bestbuy",
971
+ "bet",
972
+ "bf",
973
+ "bg",
974
+ "bh",
975
+ "bharti",
976
+ "bi",
977
+ "bible",
978
+ "bid",
979
+ "bike",
980
+ "bing",
981
+ "bingo",
982
+ "bio",
983
+ "biz",
984
+ "bj",
985
+ "black",
986
+ "blackfriday",
987
+ "blockbuster",
988
+ "blog",
989
+ "bloomberg",
990
+ "blue",
991
+ "bm",
992
+ "bms",
993
+ "bmw",
994
+ "bn",
995
+ "bnpparibas",
996
+ "bo",
997
+ "boats",
998
+ "boehringer",
999
+ "bofa",
1000
+ "bom",
1001
+ "bond",
1002
+ "boo",
1003
+ "book",
1004
+ "booking",
1005
+ "bosch",
1006
+ "bostik",
1007
+ "boston",
1008
+ "bot",
1009
+ "boutique",
1010
+ "box",
1011
+ "br",
1012
+ "bradesco",
1013
+ "bridgestone",
1014
+ "broadway",
1015
+ "broker",
1016
+ "brother",
1017
+ "brussels",
1018
+ "bs",
1019
+ "bt",
1020
+ "build",
1021
+ "builders",
1022
+ "business",
1023
+ "buy",
1024
+ "buzz",
1025
+ "bv",
1026
+ "bw",
1027
+ "by",
1028
+ "bz",
1029
+ "bzh",
1030
+ "ca",
1031
+ "cab",
1032
+ "cafe",
1033
+ "cal",
1034
+ "call",
1035
+ "calvinklein",
1036
+ "cam",
1037
+ "camera",
1038
+ "camp",
1039
+ "canon",
1040
+ "capetown",
1041
+ "capital",
1042
+ "capitalone",
1043
+ "car",
1044
+ "caravan",
1045
+ "cards",
1046
+ "care",
1047
+ "career",
1048
+ "careers",
1049
+ "cars",
1050
+ "casa",
1051
+ "case",
1052
+ "cash",
1053
+ "casino",
1054
+ "cat",
1055
+ "catering",
1056
+ "catholic",
1057
+ "cba",
1058
+ "cbn",
1059
+ "cbre",
1060
+ "cc",
1061
+ "cd",
1062
+ "center",
1063
+ "ceo",
1064
+ "cern",
1065
+ "cf",
1066
+ "cfa",
1067
+ "cfd",
1068
+ "cg",
1069
+ "ch",
1070
+ "chanel",
1071
+ "channel",
1072
+ "charity",
1073
+ "chase",
1074
+ "chat",
1075
+ "cheap",
1076
+ "chintai",
1077
+ "christmas",
1078
+ "chrome",
1079
+ "church",
1080
+ "ci",
1081
+ "cipriani",
1082
+ "circle",
1083
+ "cisco",
1084
+ "citadel",
1085
+ "citi",
1086
+ "citic",
1087
+ "city",
1088
+ "ck",
1089
+ "cl",
1090
+ "claims",
1091
+ "cleaning",
1092
+ "click",
1093
+ "clinic",
1094
+ "clinique",
1095
+ "clothing",
1096
+ "cloud",
1097
+ "club",
1098
+ "clubmed",
1099
+ "cm",
1100
+ "cn",
1101
+ "co",
1102
+ "coach",
1103
+ "codes",
1104
+ "coffee",
1105
+ "college",
1106
+ "cologne",
1107
+ "com",
1108
+ "commbank",
1109
+ "community",
1110
+ "company",
1111
+ "compare",
1112
+ "computer",
1113
+ "comsec",
1114
+ "condos",
1115
+ "construction",
1116
+ "consulting",
1117
+ "contact",
1118
+ "contractors",
1119
+ "cooking",
1120
+ "cool",
1121
+ "coop",
1122
+ "corsica",
1123
+ "country",
1124
+ "coupon",
1125
+ "coupons",
1126
+ "courses",
1127
+ "cpa",
1128
+ "cr",
1129
+ "credit",
1130
+ "creditcard",
1131
+ "creditunion",
1132
+ "cricket",
1133
+ "crown",
1134
+ "crs",
1135
+ "cruise",
1136
+ "cruises",
1137
+ "cu",
1138
+ "cuisinella",
1139
+ "cv",
1140
+ "cw",
1141
+ "cx",
1142
+ "cy",
1143
+ "cymru",
1144
+ "cyou",
1145
+ "cz",
1146
+ "dad",
1147
+ "dance",
1148
+ "data",
1149
+ "date",
1150
+ "dating",
1151
+ "datsun",
1152
+ "day",
1153
+ "dclk",
1154
+ "dds",
1155
+ "de",
1156
+ "deal",
1157
+ "dealer",
1158
+ "deals",
1159
+ "degree",
1160
+ "delivery",
1161
+ "dell",
1162
+ "deloitte",
1163
+ "delta",
1164
+ "democrat",
1165
+ "dental",
1166
+ "dentist",
1167
+ "desi",
1168
+ "design",
1169
+ "dev",
1170
+ "dhl",
1171
+ "diamonds",
1172
+ "diet",
1173
+ "digital",
1174
+ "direct",
1175
+ "directory",
1176
+ "discount",
1177
+ "discover",
1178
+ "dish",
1179
+ "diy",
1180
+ "dj",
1181
+ "dk",
1182
+ "dm",
1183
+ "dnp",
1184
+ "do",
1185
+ "docs",
1186
+ "doctor",
1187
+ "dog",
1188
+ "domains",
1189
+ "dot",
1190
+ "download",
1191
+ "drive",
1192
+ "dtv",
1193
+ "dubai",
1194
+ "dupont",
1195
+ "durban",
1196
+ "dvag",
1197
+ "dvr",
1198
+ "dz",
1199
+ "earth",
1200
+ "eat",
1201
+ "ec",
1202
+ "eco",
1203
+ "edeka",
1204
+ "edu",
1205
+ "education",
1206
+ "ee",
1207
+ "eg",
1208
+ "email",
1209
+ "emerck",
1210
+ "energy",
1211
+ "engineer",
1212
+ "engineering",
1213
+ "enterprises",
1214
+ "epson",
1215
+ "equipment",
1216
+ "er",
1217
+ "ericsson",
1218
+ "erni",
1219
+ "es",
1220
+ "esq",
1221
+ "estate",
1222
+ "et",
1223
+ "eu",
1224
+ "eurovision",
1225
+ "eus",
1226
+ "events",
1227
+ "exchange",
1228
+ "expert",
1229
+ "exposed",
1230
+ "express",
1231
+ "extraspace",
1232
+ "fage",
1233
+ "fail",
1234
+ "fairwinds",
1235
+ "faith",
1236
+ "family",
1237
+ "fan",
1238
+ "fans",
1239
+ "farm",
1240
+ "farmers",
1241
+ "fashion",
1242
+ "fast",
1243
+ "fedex",
1244
+ "feedback",
1245
+ "ferrari",
1246
+ "ferrero",
1247
+ "fi",
1248
+ "fidelity",
1249
+ "fido",
1250
+ "film",
1251
+ "final",
1252
+ "finance",
1253
+ "financial",
1254
+ "fire",
1255
+ "firestone",
1256
+ "firmdale",
1257
+ "fish",
1258
+ "fishing",
1259
+ "fit",
1260
+ "fitness",
1261
+ "fj",
1262
+ "fk",
1263
+ "flickr",
1264
+ "flights",
1265
+ "flir",
1266
+ "florist",
1267
+ "flowers",
1268
+ "fly",
1269
+ "fm",
1270
+ "fo",
1271
+ "foo",
1272
+ "food",
1273
+ "football",
1274
+ "ford",
1275
+ "forex",
1276
+ "forsale",
1277
+ "forum",
1278
+ "foundation",
1279
+ "fox",
1280
+ "fr",
1281
+ "free",
1282
+ "fresenius",
1283
+ "frl",
1284
+ "frogans",
1285
+ "frontier",
1286
+ "ftr",
1287
+ "fujitsu",
1288
+ "fun",
1289
+ "fund",
1290
+ "furniture",
1291
+ "futbol",
1292
+ "fyi",
1293
+ "ga",
1294
+ "gal",
1295
+ "gallery",
1296
+ "gallo",
1297
+ "gallup",
1298
+ "game",
1299
+ "games",
1300
+ "gap",
1301
+ "garden",
1302
+ "gay",
1303
+ "gb",
1304
+ "gbiz",
1305
+ "gd",
1306
+ "gdn",
1307
+ "ge",
1308
+ "gea",
1309
+ "gent",
1310
+ "genting",
1311
+ "george",
1312
+ "gf",
1313
+ "gg",
1314
+ "ggee",
1315
+ "gh",
1316
+ "gi",
1317
+ "gift",
1318
+ "gifts",
1319
+ "gives",
1320
+ "giving",
1321
+ "gl",
1322
+ "glass",
1323
+ "gle",
1324
+ "global",
1325
+ "globo",
1326
+ "gm",
1327
+ "gmail",
1328
+ "gmbh",
1329
+ "gmo",
1330
+ "gmx",
1331
+ "gn",
1332
+ "godaddy",
1333
+ "gold",
1334
+ "goldpoint",
1335
+ "golf",
1336
+ "goo",
1337
+ "goodyear",
1338
+ "goog",
1339
+ "google",
1340
+ "gop",
1341
+ "got",
1342
+ "gov",
1343
+ "gp",
1344
+ "gq",
1345
+ "gr",
1346
+ "grainger",
1347
+ "graphics",
1348
+ "gratis",
1349
+ "green",
1350
+ "gripe",
1351
+ "grocery",
1352
+ "group",
1353
+ "gs",
1354
+ "gt",
1355
+ "gu",
1356
+ "gucci",
1357
+ "guge",
1358
+ "guide",
1359
+ "guitars",
1360
+ "guru",
1361
+ "gw",
1362
+ "gy",
1363
+ "hair",
1364
+ "hamburg",
1365
+ "hangout",
1366
+ "haus",
1367
+ "hbo",
1368
+ "hdfc",
1369
+ "hdfcbank",
1370
+ "health",
1371
+ "healthcare",
1372
+ "help",
1373
+ "helsinki",
1374
+ "here",
1375
+ "hermes",
1376
+ "hiphop",
1377
+ "hisamitsu",
1378
+ "hitachi",
1379
+ "hiv",
1380
+ "hk",
1381
+ "hkt",
1382
+ "hm",
1383
+ "hn",
1384
+ "hockey",
1385
+ "holdings",
1386
+ "holiday",
1387
+ "homedepot",
1388
+ "homegoods",
1389
+ "homes",
1390
+ "homesense",
1391
+ "honda",
1392
+ "horse",
1393
+ "hospital",
1394
+ "host",
1395
+ "hosting",
1396
+ "hot",
1397
+ "hotels",
1398
+ "hotmail",
1399
+ "house",
1400
+ "how",
1401
+ "hr",
1402
+ "hsbc",
1403
+ "ht",
1404
+ "hu",
1405
+ "hughes",
1406
+ "hyatt",
1407
+ "hyundai",
1408
+ "ibm",
1409
+ "icbc",
1410
+ "ice",
1411
+ "icu",
1412
+ "id",
1413
+ "ie",
1414
+ "ieee",
1415
+ "ifm",
1416
+ "ikano",
1417
+ "il",
1418
+ "im",
1419
+ "imamat",
1420
+ "imdb",
1421
+ "immo",
1422
+ "immobilien",
1423
+ "in",
1424
+ "inc",
1425
+ "industries",
1426
+ "infiniti",
1427
+ "info",
1428
+ "ing",
1429
+ "ink",
1430
+ "institute",
1431
+ "insurance",
1432
+ "insure",
1433
+ "int",
1434
+ "international",
1435
+ "intuit",
1436
+ "investments",
1437
+ "io",
1438
+ "ipiranga",
1439
+ "iq",
1440
+ "ir",
1441
+ "irish",
1442
+ "is",
1443
+ "ismaili",
1444
+ "ist",
1445
+ "istanbul",
1446
+ "it",
1447
+ "itau",
1448
+ "itv",
1449
+ "jaguar",
1450
+ "java",
1451
+ "jcb",
1452
+ "je",
1453
+ "jeep",
1454
+ "jetzt",
1455
+ "jewelry",
1456
+ "jio",
1457
+ "jll",
1458
+ "jm",
1459
+ "jmp",
1460
+ "jnj",
1461
+ "jo",
1462
+ "jobs",
1463
+ "joburg",
1464
+ "jot",
1465
+ "joy",
1466
+ "jp",
1467
+ "jpmorgan",
1468
+ "jprs",
1469
+ "juegos",
1470
+ "juniper",
1471
+ "kaufen",
1472
+ "kddi",
1473
+ "ke",
1474
+ "kerryhotels",
1475
+ "kerryproperties",
1476
+ "kfh",
1477
+ "kg",
1478
+ "kh",
1479
+ "ki",
1480
+ "kia",
1481
+ "kids",
1482
+ "kim",
1483
+ "kindle",
1484
+ "kitchen",
1485
+ "kiwi",
1486
+ "km",
1487
+ "kn",
1488
+ "koeln",
1489
+ "komatsu",
1490
+ "kosher",
1491
+ "kp",
1492
+ "kpmg",
1493
+ "kpn",
1494
+ "kr",
1495
+ "krd",
1496
+ "kred",
1497
+ "kuokgroup",
1498
+ "kw",
1499
+ "ky",
1500
+ "kyoto",
1501
+ "kz",
1502
+ "la",
1503
+ "lacaixa",
1504
+ "lamborghini",
1505
+ "lamer",
1506
+ "land",
1507
+ "landrover",
1508
+ "lanxess",
1509
+ "lasalle",
1510
+ "lat",
1511
+ "latino",
1512
+ "latrobe",
1513
+ "law",
1514
+ "lawyer",
1515
+ "lb",
1516
+ "lc",
1517
+ "lds",
1518
+ "lease",
1519
+ "leclerc",
1520
+ "lefrak",
1521
+ "legal",
1522
+ "lego",
1523
+ "lexus",
1524
+ "lgbt",
1525
+ "li",
1526
+ "lidl",
1527
+ "life",
1528
+ "lifeinsurance",
1529
+ "lifestyle",
1530
+ "lighting",
1531
+ "like",
1532
+ "lilly",
1533
+ "limited",
1534
+ "limo",
1535
+ "lincoln",
1536
+ "link",
1537
+ "live",
1538
+ "living",
1539
+ "lk",
1540
+ "llc",
1541
+ "llp",
1542
+ "loan",
1543
+ "loans",
1544
+ "locker",
1545
+ "locus",
1546
+ "lol",
1547
+ "london",
1548
+ "lotte",
1549
+ "lotto",
1550
+ "love",
1551
+ "lpl",
1552
+ "lplfinancial",
1553
+ "lr",
1554
+ "ls",
1555
+ "lt",
1556
+ "ltd",
1557
+ "ltda",
1558
+ "lu",
1559
+ "lundbeck",
1560
+ "luxe",
1561
+ "luxury",
1562
+ "lv",
1563
+ "ly",
1564
+ "ma",
1565
+ "madrid",
1566
+ "maif",
1567
+ "maison",
1568
+ "makeup",
1569
+ "man",
1570
+ "management",
1571
+ "mango",
1572
+ "map",
1573
+ "market",
1574
+ "marketing",
1575
+ "markets",
1576
+ "marriott",
1577
+ "marshalls",
1578
+ "mattel",
1579
+ "mba",
1580
+ "mc",
1581
+ "mckinsey",
1582
+ "md",
1583
+ "me",
1584
+ "med",
1585
+ "media",
1586
+ "meet",
1587
+ "melbourne",
1588
+ "meme",
1589
+ "memorial",
1590
+ "men",
1591
+ "menu",
1592
+ "merckmsd",
1593
+ "mg",
1594
+ "mh",
1595
+ "miami",
1596
+ "microsoft",
1597
+ "mil",
1598
+ "mini",
1599
+ "mint",
1600
+ "mit",
1601
+ "mitsubishi",
1602
+ "mk",
1603
+ "ml",
1604
+ "mlb",
1605
+ "mls",
1606
+ "mm",
1607
+ "mma",
1608
+ "mn",
1609
+ "mo",
1610
+ "mobi",
1611
+ "mobile",
1612
+ "moda",
1613
+ "moe",
1614
+ "moi",
1615
+ "mom",
1616
+ "monash",
1617
+ "money",
1618
+ "monster",
1619
+ "mormon",
1620
+ "mortgage",
1621
+ "moscow",
1622
+ "moto",
1623
+ "motorcycles",
1624
+ "mov",
1625
+ "movie",
1626
+ "mp",
1627
+ "mq",
1628
+ "mr",
1629
+ "ms",
1630
+ "msd",
1631
+ "mt",
1632
+ "mtn",
1633
+ "mtr",
1634
+ "mu",
1635
+ "museum",
1636
+ "music",
1637
+ "mv",
1638
+ "mw",
1639
+ "mx",
1640
+ "my",
1641
+ "mz",
1642
+ "na",
1643
+ "nab",
1644
+ "nagoya",
1645
+ "name",
1646
+ "navy",
1647
+ "nba",
1648
+ "nc",
1649
+ "ne",
1650
+ "nec",
1651
+ "net",
1652
+ "netbank",
1653
+ "netflix",
1654
+ "network",
1655
+ "neustar",
1656
+ "new",
1657
+ "news",
1658
+ "next",
1659
+ "nextdirect",
1660
+ "nexus",
1661
+ "nf",
1662
+ "nfl",
1663
+ "ng",
1664
+ "ngo",
1665
+ "nhk",
1666
+ "ni",
1667
+ "nico",
1668
+ "nike",
1669
+ "nikon",
1670
+ "ninja",
1671
+ "nissan",
1672
+ "nissay",
1673
+ "nl",
1674
+ "no",
1675
+ "nokia",
1676
+ "norton",
1677
+ "now",
1678
+ "nowruz",
1679
+ "nowtv",
1680
+ "np",
1681
+ "nr",
1682
+ "nra",
1683
+ "nrw",
1684
+ "ntt",
1685
+ "nu",
1686
+ "nyc",
1687
+ "nz",
1688
+ "obi",
1689
+ "observer",
1690
+ "office",
1691
+ "okinawa",
1692
+ "olayan",
1693
+ "olayangroup",
1694
+ "ollo",
1695
+ "om",
1696
+ "omega",
1697
+ "one",
1698
+ "ong",
1699
+ "onl",
1700
+ "online",
1701
+ "ooo",
1702
+ "open",
1703
+ "oracle",
1704
+ "orange",
1705
+ "org",
1706
+ "organic",
1707
+ "origins",
1708
+ "osaka",
1709
+ "otsuka",
1710
+ "ott",
1711
+ "ovh",
1712
+ "pa",
1713
+ "page",
1714
+ "panasonic",
1715
+ "paris",
1716
+ "pars",
1717
+ "partners",
1718
+ "parts",
1719
+ "party",
1720
+ "pay",
1721
+ "pccw",
1722
+ "pe",
1723
+ "pet",
1724
+ "pf",
1725
+ "pfizer",
1726
+ "pg",
1727
+ "ph",
1728
+ "pharmacy",
1729
+ "phd",
1730
+ "philips",
1731
+ "phone",
1732
+ "photo",
1733
+ "photography",
1734
+ "photos",
1735
+ "physio",
1736
+ "pics",
1737
+ "pictet",
1738
+ "pictures",
1739
+ "pid",
1740
+ "pin",
1741
+ "ping",
1742
+ "pink",
1743
+ "pioneer",
1744
+ "pizza",
1745
+ "pk",
1746
+ "pl",
1747
+ "place",
1748
+ "play",
1749
+ "playstation",
1750
+ "plumbing",
1751
+ "plus",
1752
+ "pm",
1753
+ "pn",
1754
+ "pnc",
1755
+ "pohl",
1756
+ "poker",
1757
+ "politie",
1758
+ "porn",
1759
+ "post",
1760
+ "pr",
1761
+ "praxi",
1762
+ "press",
1763
+ "prime",
1764
+ "pro",
1765
+ "prod",
1766
+ "productions",
1767
+ "prof",
1768
+ "progressive",
1769
+ "promo",
1770
+ "properties",
1771
+ "property",
1772
+ "protection",
1773
+ "pru",
1774
+ "prudential",
1775
+ "ps",
1776
+ "pt",
1777
+ "pub",
1778
+ "pw",
1779
+ "pwc",
1780
+ "py",
1781
+ "qa",
1782
+ "qpon",
1783
+ "quebec",
1784
+ "quest",
1785
+ "racing",
1786
+ "radio",
1787
+ "re",
1788
+ "read",
1789
+ "realestate",
1790
+ "realtor",
1791
+ "realty",
1792
+ "recipes",
1793
+ "red",
1794
+ "redumbrella",
1795
+ "rehab",
1796
+ "reise",
1797
+ "reisen",
1798
+ "reit",
1799
+ "reliance",
1800
+ "ren",
1801
+ "rent",
1802
+ "rentals",
1803
+ "repair",
1804
+ "report",
1805
+ "republican",
1806
+ "rest",
1807
+ "restaurant",
1808
+ "review",
1809
+ "reviews",
1810
+ "rexroth",
1811
+ "rich",
1812
+ "richardli",
1813
+ "ricoh",
1814
+ "ril",
1815
+ "rio",
1816
+ "rip",
1817
+ "ro",
1818
+ "rocks",
1819
+ "rodeo",
1820
+ "rogers",
1821
+ "room",
1822
+ "rs",
1823
+ "rsvp",
1824
+ "ru",
1825
+ "rugby",
1826
+ "ruhr",
1827
+ "run",
1828
+ "rw",
1829
+ "rwe",
1830
+ "ryukyu",
1831
+ "sa",
1832
+ "saarland",
1833
+ "safe",
1834
+ "safety",
1835
+ "sakura",
1836
+ "sale",
1837
+ "salon",
1838
+ "samsclub",
1839
+ "samsung",
1840
+ "sandvik",
1841
+ "sandvikcoromant",
1842
+ "sanofi",
1843
+ "sap",
1844
+ "sarl",
1845
+ "sas",
1846
+ "save",
1847
+ "saxo",
1848
+ "sb",
1849
+ "sbi",
1850
+ "sbs",
1851
+ "sc",
1852
+ "scb",
1853
+ "schaeffler",
1854
+ "schmidt",
1855
+ "scholarships",
1856
+ "school",
1857
+ "schule",
1858
+ "schwarz",
1859
+ "science",
1860
+ "scot",
1861
+ "sd",
1862
+ "se",
1863
+ "search",
1864
+ "seat",
1865
+ "secure",
1866
+ "security",
1867
+ "seek",
1868
+ "select",
1869
+ "sener",
1870
+ "services",
1871
+ "seven",
1872
+ "sew",
1873
+ "sex",
1874
+ "sexy",
1875
+ "sfr",
1876
+ "sg",
1877
+ "sh",
1878
+ "shangrila",
1879
+ "sharp",
1880
+ "shell",
1881
+ "shia",
1882
+ "shiksha",
1883
+ "shoes",
1884
+ "shop",
1885
+ "shopping",
1886
+ "shouji",
1887
+ "show",
1888
+ "si",
1889
+ "silk",
1890
+ "sina",
1891
+ "singles",
1892
+ "site",
1893
+ "sj",
1894
+ "sk",
1895
+ "ski",
1896
+ "skin",
1897
+ "sky",
1898
+ "skype",
1899
+ "sl",
1900
+ "sling",
1901
+ "sm",
1902
+ "smart",
1903
+ "smile",
1904
+ "sn",
1905
+ "sncf",
1906
+ "so",
1907
+ "soccer",
1908
+ "social",
1909
+ "softbank",
1910
+ "software",
1911
+ "sohu",
1912
+ "solar",
1913
+ "solutions",
1914
+ "song",
1915
+ "sony",
1916
+ "soy",
1917
+ "spa",
1918
+ "space",
1919
+ "sport",
1920
+ "spot",
1921
+ "sr",
1922
+ "srl",
1923
+ "ss",
1924
+ "st",
1925
+ "stada",
1926
+ "staples",
1927
+ "star",
1928
+ "statebank",
1929
+ "statefarm",
1930
+ "stc",
1931
+ "stcgroup",
1932
+ "stockholm",
1933
+ "storage",
1934
+ "store",
1935
+ "stream",
1936
+ "studio",
1937
+ "study",
1938
+ "style",
1939
+ "su",
1940
+ "sucks",
1941
+ "supplies",
1942
+ "supply",
1943
+ "support",
1944
+ "surf",
1945
+ "surgery",
1946
+ "suzuki",
1947
+ "sv",
1948
+ "swatch",
1949
+ "swiss",
1950
+ "sx",
1951
+ "sy",
1952
+ "sydney",
1953
+ "systems",
1954
+ "sz",
1955
+ "tab",
1956
+ "taipei",
1957
+ "talk",
1958
+ "taobao",
1959
+ "target",
1960
+ "tatamotors",
1961
+ "tatar",
1962
+ "tattoo",
1963
+ "tax",
1964
+ "taxi",
1965
+ "tc",
1966
+ "tci",
1967
+ "td",
1968
+ "tdk",
1969
+ "team",
1970
+ "tech",
1971
+ "technology",
1972
+ "tel",
1973
+ "temasek",
1974
+ "tennis",
1975
+ "teva",
1976
+ "tf",
1977
+ "tg",
1978
+ "th",
1979
+ "thd",
1980
+ "theater",
1981
+ "theatre",
1982
+ "tiaa",
1983
+ "tickets",
1984
+ "tienda",
1985
+ "tips",
1986
+ "tires",
1987
+ "tirol",
1988
+ "tj",
1989
+ "tjmaxx",
1990
+ "tjx",
1991
+ "tk",
1992
+ "tkmaxx",
1993
+ "tl",
1994
+ "tm",
1995
+ "tmall",
1996
+ "tn",
1997
+ "to",
1998
+ "today",
1999
+ "tokyo",
2000
+ "tools",
2001
+ "top",
2002
+ "toray",
2003
+ "toshiba",
2004
+ "total",
2005
+ "tours",
2006
+ "town",
2007
+ "toyota",
2008
+ "toys",
2009
+ "tr",
2010
+ "trade",
2011
+ "trading",
2012
+ "training",
2013
+ "travel",
2014
+ "travelers",
2015
+ "travelersinsurance",
2016
+ "trust",
2017
+ "trv",
2018
+ "tt",
2019
+ "tube",
2020
+ "tui",
2021
+ "tunes",
2022
+ "tushu",
2023
+ "tv",
2024
+ "tvs",
2025
+ "tw",
2026
+ "tz",
2027
+ "ua",
2028
+ "ubank",
2029
+ "ubs",
2030
+ "ug",
2031
+ "uk",
2032
+ "unicom",
2033
+ "university",
2034
+ "uno",
2035
+ "uol",
2036
+ "ups",
2037
+ "us",
2038
+ "uy",
2039
+ "uz",
2040
+ "va",
2041
+ "vacations",
2042
+ "vana",
2043
+ "vanguard",
2044
+ "vc",
2045
+ "ve",
2046
+ "vegas",
2047
+ "ventures",
2048
+ "verisign",
2049
+ "verm\xF6gensberater",
2050
+ "verm\xF6gensberatung",
2051
+ "versicherung",
2052
+ "vet",
2053
+ "vg",
2054
+ "vi",
2055
+ "viajes",
2056
+ "video",
2057
+ "vig",
2058
+ "viking",
2059
+ "villas",
2060
+ "vin",
2061
+ "vip",
2062
+ "virgin",
2063
+ "visa",
2064
+ "vision",
2065
+ "viva",
2066
+ "vivo",
2067
+ "vlaanderen",
2068
+ "vn",
2069
+ "vodka",
2070
+ "volvo",
2071
+ "vote",
2072
+ "voting",
2073
+ "voto",
2074
+ "voyage",
2075
+ "vu",
2076
+ "wales",
2077
+ "walmart",
2078
+ "walter",
2079
+ "wang",
2080
+ "wanggou",
2081
+ "watch",
2082
+ "watches",
2083
+ "weather",
2084
+ "weatherchannel",
2085
+ "webcam",
2086
+ "weber",
2087
+ "website",
2088
+ "wed",
2089
+ "wedding",
2090
+ "weibo",
2091
+ "weir",
2092
+ "wf",
2093
+ "whoswho",
2094
+ "wien",
2095
+ "wiki",
2096
+ "williamhill",
2097
+ "win",
2098
+ "windows",
2099
+ "wine",
2100
+ "winners",
2101
+ "wme",
2102
+ "wolterskluwer",
2103
+ "woodside",
2104
+ "work",
2105
+ "works",
2106
+ "world",
2107
+ "wow",
2108
+ "ws",
2109
+ "wtc",
2110
+ "wtf",
2111
+ "xbox",
2112
+ "xerox",
2113
+ "xihuan",
2114
+ "xin",
2115
+ "xxx",
2116
+ "xyz",
2117
+ "yachts",
2118
+ "yahoo",
2119
+ "yamaxun",
2120
+ "yandex",
2121
+ "ye",
2122
+ "yodobashi",
2123
+ "yoga",
2124
+ "yokohama",
2125
+ "you",
2126
+ "youtube",
2127
+ "yt",
2128
+ "yun",
2129
+ "za",
2130
+ "zappos",
2131
+ "zara",
2132
+ "zero",
2133
+ "zip",
2134
+ "zm",
2135
+ "zone",
2136
+ "zuerich",
2137
+ "zw",
2138
+ "\u03B5\u03BB",
2139
+ "\u03B5\u03C5",
2140
+ "\u0431\u0433",
2141
+ "\u0431\u0435\u043B",
2142
+ "\u0434\u0435\u0442\u0438",
2143
+ "\u0435\u044E",
2144
+ "\u043A\u0430\u0442\u043E\u043B\u0438\u043A",
2145
+ "\u043A\u043E\u043C",
2146
+ "\u043C\u043A\u0434",
2147
+ "\u043C\u043E\u043D",
2148
+ "\u043C\u043E\u0441\u043A\u0432\u0430",
2149
+ "\u043E\u043D\u043B\u0430\u0439\u043D",
2150
+ "\u043E\u0440\u0433",
2151
+ "\u0440\u0443\u0441",
2152
+ "\u0440\u0444",
2153
+ "\u0441\u0430\u0439\u0442",
2154
+ "\u0441\u0440\u0431",
2155
+ "\u0443\u043A\u0440",
2156
+ "\u049B\u0430\u0437",
2157
+ "\u0570\u0561\u0575",
2158
+ "\u05D9\u05E9\u05E8\u05D0\u05DC",
2159
+ "\u05E7\u05D5\u05DD",
2160
+ "\u0627\u0628\u0648\u0638\u0628\u064A",
2161
+ "\u0627\u0631\u0627\u0645\u0643\u0648",
2162
+ "\u0627\u0644\u0627\u0631\u062F\u0646",
2163
+ "\u0627\u0644\u0628\u062D\u0631\u064A\u0646",
2164
+ "\u0627\u0644\u062C\u0632\u0627\u0626\u0631",
2165
+ "\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629",
2166
+ "\u0627\u0644\u0639\u0644\u064A\u0627\u0646",
2167
+ "\u0627\u0644\u0645\u063A\u0631\u0628",
2168
+ "\u0627\u0645\u0627\u0631\u0627\u062A",
2169
+ "\u0627\u06CC\u0631\u0627\u0646",
2170
+ "\u0628\u0627\u0631\u062A",
2171
+ "\u0628\u0627\u0632\u0627\u0631",
2172
+ "\u0628\u064A\u062A\u0643",
2173
+ "\u0628\u06BE\u0627\u0631\u062A",
2174
+ "\u062A\u0648\u0646\u0633",
2175
+ "\u0633\u0648\u062F\u0627\u0646",
2176
+ "\u0633\u0648\u0631\u064A\u0629",
2177
+ "\u0634\u0628\u0643\u0629",
2178
+ "\u0639\u0631\u0627\u0642",
2179
+ "\u0639\u0631\u0628",
2180
+ "\u0639\u0645\u0627\u0646",
2181
+ "\u0641\u0644\u0633\u0637\u064A\u0646",
2182
+ "\u0642\u0637\u0631",
2183
+ "\u0643\u0627\u062B\u0648\u0644\u064A\u0643",
2184
+ "\u0643\u0648\u0645",
2185
+ "\u0645\u0635\u0631",
2186
+ "\u0645\u0644\u064A\u0633\u064A\u0627",
2187
+ "\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627",
2188
+ "\u0645\u0648\u0642\u0639",
2189
+ "\u0647\u0645\u0631\u0627\u0647",
2190
+ "\u067E\u0627\u06A9\u0633\u062A\u0627\u0646",
2191
+ "\u0680\u0627\u0631\u062A",
2192
+ "\u0915\u0949\u092E",
2193
+ "\u0928\u0947\u091F",
2194
+ "\u092D\u093E\u0930\u0924",
2195
+ "\u092D\u093E\u0930\u0924\u092E\u094D",
2196
+ "\u092D\u093E\u0930\u094B\u0924",
2197
+ "\u0938\u0902\u0917\u0920\u0928",
2198
+ "\u09AC\u09BE\u0982\u09B2\u09BE",
2199
+ "\u09AD\u09BE\u09B0\u09A4",
2200
+ "\u09AD\u09BE\u09F0\u09A4",
2201
+ "\u0A2D\u0A3E\u0A30\u0A24",
2202
+ "\u0AAD\u0ABE\u0AB0\u0AA4",
2203
+ "\u0B2D\u0B3E\u0B30\u0B24",
2204
+ "\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE",
2205
+ "\u0B87\u0BB2\u0B99\u0BCD\u0B95\u0BC8",
2206
+ "\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD",
2207
+ "\u0C2D\u0C3E\u0C30\u0C24\u0C4D",
2208
+ "\u0CAD\u0CBE\u0CB0\u0CA4",
2209
+ "\u0D2D\u0D3E\u0D30\u0D24\u0D02",
2210
+ "\u0DBD\u0D82\u0D9A\u0DCF",
2211
+ "\u0E04\u0E2D\u0E21",
2212
+ "\u0E44\u0E17\u0E22",
2213
+ "\u0EA5\u0EB2\u0EA7",
2214
+ "\u10D2\u10D4",
2215
+ "\u307F\u3093\u306A",
2216
+ "\u30A2\u30DE\u30BE\u30F3",
2217
+ "\u30AF\u30E9\u30A6\u30C9",
2218
+ "\u30B0\u30FC\u30B0\u30EB",
2219
+ "\u30B3\u30E0",
2220
+ "\u30B9\u30C8\u30A2",
2221
+ "\u30BB\u30FC\u30EB",
2222
+ "\u30D5\u30A1\u30C3\u30B7\u30E7\u30F3",
2223
+ "\u30DD\u30A4\u30F3\u30C8",
2224
+ "\u4E16\u754C",
2225
+ "\u4E2D\u4FE1",
2226
+ "\u4E2D\u56FD",
2227
+ "\u4E2D\u570B",
2228
+ "\u4E2D\u6587\u7F51",
2229
+ "\u4E9A\u9A6C\u900A",
2230
+ "\u4F01\u4E1A",
2231
+ "\u4F5B\u5C71",
2232
+ "\u4FE1\u606F",
2233
+ "\u5065\u5EB7",
2234
+ "\u516B\u5366",
2235
+ "\u516C\u53F8",
2236
+ "\u516C\u76CA",
2237
+ "\u53F0\u6E7E",
2238
+ "\u53F0\u7063",
2239
+ "\u5546\u57CE",
2240
+ "\u5546\u5E97",
2241
+ "\u5546\u6807",
2242
+ "\u5609\u91CC",
2243
+ "\u5609\u91CC\u5927\u9152\u5E97",
2244
+ "\u5728\u7EBF",
2245
+ "\u5927\u62FF",
2246
+ "\u5929\u4E3B\u6559",
2247
+ "\u5A31\u4E50",
2248
+ "\u5BB6\u96FB",
2249
+ "\u5E7F\u4E1C",
2250
+ "\u5FAE\u535A",
2251
+ "\u6148\u5584",
2252
+ "\u6211\u7231\u4F60",
2253
+ "\u624B\u673A",
2254
+ "\u62DB\u8058",
2255
+ "\u653F\u52A1",
2256
+ "\u653F\u5E9C",
2257
+ "\u65B0\u52A0\u5761",
2258
+ "\u65B0\u95FB",
2259
+ "\u65F6\u5C1A",
2260
+ "\u66F8\u7C4D",
2261
+ "\u673A\u6784",
2262
+ "\u6DE1\u9A6C\u9521",
2263
+ "\u6E38\u620F",
2264
+ "\u6FB3\u9580",
2265
+ "\u70B9\u770B",
2266
+ "\u79FB\u52A8",
2267
+ "\u7EC4\u7EC7\u673A\u6784",
2268
+ "\u7F51\u5740",
2269
+ "\u7F51\u5E97",
2270
+ "\u7F51\u7AD9",
2271
+ "\u7F51\u7EDC",
2272
+ "\u8054\u901A",
2273
+ "\u8C37\u6B4C",
2274
+ "\u8D2D\u7269",
2275
+ "\u901A\u8CA9",
2276
+ "\u96C6\u56E2",
2277
+ "\u96FB\u8A0A\u76C8\u79D1",
2278
+ "\u98DE\u5229\u6D66",
2279
+ "\u98DF\u54C1",
2280
+ "\u9910\u5385",
2281
+ "\u9999\u683C\u91CC\u62C9",
2282
+ "\u9999\u6E2F",
2283
+ "\uB2F7\uB137",
2284
+ "\uB2F7\uCEF4",
2285
+ "\uC0BC\uC131",
2286
+ "\uD55C\uAD6D"
2287
+ ];
2288
+
2289
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/domain.js
2290
+ function shareSameDomainSuffix(hostname, vhost) {
2291
+ if (hostname.endsWith(vhost)) {
2292
+ return hostname.length === vhost.length || hostname[hostname.length - vhost.length - 1] === ".";
2293
+ }
2294
+ return false;
2295
+ }
2296
+ function extractDomainWithSuffix(hostname, publicSuffix) {
2297
+ const publicSuffixIndex = hostname.length - publicSuffix.length - 2;
2298
+ const lastDotBeforeSuffixIndex = hostname.lastIndexOf(".", publicSuffixIndex);
2299
+ if (lastDotBeforeSuffixIndex === -1) {
2300
+ return hostname;
2301
+ }
2302
+ return hostname.slice(lastDotBeforeSuffixIndex + 1);
2303
+ }
2304
+ function getDomain(suffix, hostname, options) {
2305
+ if (options.validHosts !== null) {
2306
+ const validHosts = options.validHosts;
2307
+ for (const vhost of validHosts) {
2308
+ if (
2309
+ /*@__INLINE__*/
2310
+ shareSameDomainSuffix(hostname, vhost)
2311
+ ) {
2312
+ return vhost;
2313
+ }
2314
+ }
2315
+ }
2316
+ let numberOfLeadingDots = 0;
2317
+ if (hostname.startsWith(".")) {
2318
+ while (numberOfLeadingDots < hostname.length && hostname[numberOfLeadingDots] === ".") {
2319
+ numberOfLeadingDots += 1;
2320
+ }
2321
+ }
2322
+ if (suffix.length === hostname.length - numberOfLeadingDots) {
2323
+ return null;
2324
+ }
2325
+ return (
2326
+ /*@__INLINE__*/
2327
+ extractDomainWithSuffix(hostname, suffix)
2328
+ );
2329
+ }
2330
+
2331
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/domain-without-suffix.js
2332
+ function getDomainWithoutSuffix(domain, suffix) {
2333
+ return domain.slice(0, -suffix.length - 1);
2334
+ }
2335
+
2336
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/extract-hostname.js
2337
+ var CONTROL_CHARS = /[\t\n\r]/g;
2338
+ var extractedHostnameValidated = false;
2339
+ function isValidHostnameChar(code) {
2340
+ return code >= 97 && code <= 122 || // a-z
2341
+ code >= 48 && code <= 57 || // 0-9
2342
+ code > 127 || // non-ASCII (accepted, not punycode-checked)
2343
+ code >= 65 && code <= 90 || // A-Z (becomes valid once lowercased)
2344
+ code === 45 || // '-'
2345
+ code === 95;
2346
+ }
2347
+ function getSpecialScheme(url, schemeStart, colonIndex) {
2348
+ const length = colonIndex - schemeStart;
2349
+ const c0 = url.charCodeAt(schemeStart) | 32;
2350
+ if (length === 2) {
2351
+ return c0 === 119 && (url.charCodeAt(schemeStart + 1) | 32) === 115 ? 1 : 0;
2352
+ } else if (length === 3) {
2353
+ const c1 = url.charCodeAt(schemeStart + 1) | 32;
2354
+ const c2 = url.charCodeAt(schemeStart + 2) | 32;
2355
+ if (c0 === 119 && c1 === 115 && c2 === 115)
2356
+ return 1;
2357
+ if (c0 === 102 && c1 === 116 && c2 === 112)
2358
+ return 1;
2359
+ return 0;
2360
+ } else if (length === 4) {
2361
+ const c1 = url.charCodeAt(schemeStart + 1) | 32;
2362
+ const c2 = url.charCodeAt(schemeStart + 2) | 32;
2363
+ const c3 = url.charCodeAt(schemeStart + 3) | 32;
2364
+ if (c0 === 104 && c1 === 116 && c2 === 116 && c3 === 112)
2365
+ return 1;
2366
+ if (c0 === 102 && c1 === 105 && c2 === 108 && c3 === 101)
2367
+ return 2;
2368
+ return 0;
2369
+ } else if (length === 5) {
2370
+ return c0 === 104 && (url.charCodeAt(schemeStart + 1) | 32) === 116 && (url.charCodeAt(schemeStart + 2) | 32) === 116 && (url.charCodeAt(schemeStart + 3) | 32) === 112 && (url.charCodeAt(schemeStart + 4) | 32) === 115 ? 1 : 0;
2371
+ }
2372
+ return 0;
2373
+ }
2374
+ function extractHostname(url, urlIsValidHostname, validate = false) {
2375
+ let start = 0;
2376
+ let end = url.length;
2377
+ let hasUpper = false;
2378
+ let isSpecial = false;
2379
+ extractedHostnameValidated = false;
2380
+ if (!urlIsValidHostname) {
2381
+ if (url.startsWith("data:")) {
2382
+ return null;
2383
+ }
2384
+ while (start < url.length && url.charCodeAt(start) <= 32) {
2385
+ start += 1;
2386
+ }
2387
+ while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {
2388
+ end -= 1;
2389
+ }
2390
+ if (url.charCodeAt(start) === 47 && url.charCodeAt(start + 1) === 47) {
2391
+ start += 2;
2392
+ } else {
2393
+ const indexOfProtocol = url.indexOf(":/", start);
2394
+ if (indexOfProtocol !== -1) {
2395
+ const special = getSpecialScheme(url, start, indexOfProtocol);
2396
+ if (special === 1) {
2397
+ isSpecial = true;
2398
+ start = indexOfProtocol + 2;
2399
+ while (url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) {
2400
+ start += 1;
2401
+ }
2402
+ } else if (special === 2) {
2403
+ isSpecial = true;
2404
+ start = indexOfProtocol + 1;
2405
+ let slashes = 0;
2406
+ while ((url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) && slashes < 2) {
2407
+ start += 1;
2408
+ slashes += 1;
2409
+ }
2410
+ if (slashes < 2) {
2411
+ return null;
2412
+ }
2413
+ } else {
2414
+ for (let i = start; i < indexOfProtocol; i += 1) {
2415
+ const code = url.charCodeAt(i) | 32;
2416
+ if (!(code >= 97 && code <= 122 || // [a, z]
2417
+ code >= 48 && code <= 57 || // [0, 9]
2418
+ code === 46 || // '.'
2419
+ code === 45 || // '-'
2420
+ code === 43)) {
2421
+ const raw = url.charCodeAt(i);
2422
+ if (raw === 9 || raw === 10 || raw === 13) {
2423
+ return extractHostname(url.replace(CONTROL_CHARS, ""), urlIsValidHostname, validate);
2424
+ }
2425
+ return null;
2426
+ }
2427
+ }
2428
+ if (url.charCodeAt(indexOfProtocol + 2) === 47) {
2429
+ start = indexOfProtocol + 3;
2430
+ } else {
2431
+ return null;
2432
+ }
2433
+ }
2434
+ } else if (url.charCodeAt(start) !== 91) {
2435
+ let indexOfColon = -1;
2436
+ for (let i = start; i < end; i += 1) {
2437
+ const code = url.charCodeAt(i);
2438
+ if (code === 9 || code === 10 || code === 13) {
2439
+ return extractHostname(url.replace(CONTROL_CHARS, ""), urlIsValidHostname, validate);
2440
+ }
2441
+ if (code === 58) {
2442
+ indexOfColon = i;
2443
+ break;
2444
+ }
2445
+ if (code === 47 || code === 92 || code === 63 || code === 35) {
2446
+ break;
2447
+ }
2448
+ }
2449
+ if (indexOfColon !== -1) {
2450
+ let hasIdentifier = false;
2451
+ for (let i = indexOfColon + 1; i < end; i += 1) {
2452
+ const code = url.charCodeAt(i);
2453
+ if (code === 47 || code === 92 || code === 63 || code === 35) {
2454
+ break;
2455
+ }
2456
+ if (code === 64) {
2457
+ hasIdentifier = true;
2458
+ break;
2459
+ }
2460
+ }
2461
+ if (!hasIdentifier) {
2462
+ let allDigits = true;
2463
+ let i = indexOfColon + 1;
2464
+ for (; i < end; i += 1) {
2465
+ const code = url.charCodeAt(i);
2466
+ if (code === 47 || code === 92 || code === 63 || code === 35) {
2467
+ break;
2468
+ }
2469
+ if (code < 48 || code > 57) {
2470
+ allDigits = false;
2471
+ break;
2472
+ }
2473
+ }
2474
+ if (i === indexOfColon + 1) {
2475
+ allDigits = false;
2476
+ }
2477
+ if (!allDigits) {
2478
+ const special = getSpecialScheme(url, start, indexOfColon);
2479
+ if (special === 0) {
2480
+ let isBareIpv6 = false;
2481
+ for (let j = indexOfColon + 1; j < end; j += 1) {
2482
+ const code = url.charCodeAt(j);
2483
+ if (code === 47 || code === 92 || code === 63 || code === 35) {
2484
+ break;
2485
+ }
2486
+ if (code === 58) {
2487
+ isBareIpv6 = true;
2488
+ break;
2489
+ }
2490
+ }
2491
+ if (!isBareIpv6) {
2492
+ return null;
2493
+ }
2494
+ } else {
2495
+ isSpecial = true;
2496
+ start = indexOfColon + 1;
2497
+ if (special === 2) {
2498
+ let slashes = 0;
2499
+ while ((url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) && slashes < 2) {
2500
+ start += 1;
2501
+ slashes += 1;
2502
+ }
2503
+ if (slashes < 2) {
2504
+ return null;
2505
+ }
2506
+ } else {
2507
+ while (url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) {
2508
+ start += 1;
2509
+ }
2510
+ }
2511
+ }
2512
+ }
2513
+ }
2514
+ }
2515
+ }
2516
+ }
2517
+ let indexOfIdentifier = -1;
2518
+ let indexOfClosingBracket = -1;
2519
+ let indexOfPort = -1;
2520
+ let indexOfFirstColon = -1;
2521
+ let hasControl = false;
2522
+ let vValid = validate;
2523
+ let vLastDot = start - 1;
2524
+ let vLastCode = -1;
2525
+ if (validate && start < end) {
2526
+ const c0 = url.charCodeAt(start);
2527
+ if (!/*@__INLINE__*/
2528
+ (isValidHostnameChar(c0) || c0 === 46 || c0 === 95) || c0 === 45) {
2529
+ vValid = false;
2530
+ }
2531
+ }
2532
+ for (let i = start; i < end; i += 1) {
2533
+ const code = url.charCodeAt(i);
2534
+ if (code < 64) {
2535
+ if (code === 47 || code === 35 || code === 63) {
2536
+ end = i;
2537
+ break;
2538
+ } else if (code === 58) {
2539
+ if (indexOfFirstColon === -1) {
2540
+ indexOfFirstColon = i;
2541
+ }
2542
+ indexOfPort = i;
2543
+ } else if (code === 9 || code === 10 || code === 13) {
2544
+ hasControl = true;
2545
+ } else if (validate) {
2546
+ if (code === 46) {
2547
+ if (i - vLastDot > 64 || vLastCode === 46 || vLastCode === 45) {
2548
+ vValid = false;
2549
+ }
2550
+ vLastDot = i;
2551
+ } else if (code < 48 || code > 57) {
2552
+ if (code !== 45 || vLastCode === 46) {
2553
+ vValid = false;
2554
+ }
2555
+ }
2556
+ }
2557
+ } else if (isSpecial && code === 92) {
2558
+ end = i;
2559
+ break;
2560
+ } else if (code === 64) {
2561
+ indexOfIdentifier = i;
2562
+ indexOfFirstColon = -1;
2563
+ } else if (code === 93) {
2564
+ indexOfClosingBracket = i;
2565
+ } else if (code >= 65 && code <= 90) {
2566
+ hasUpper = true;
2567
+ } else if (validate && !/*@__INLINE__*/
2568
+ isValidHostnameChar(code)) {
2569
+ vValid = false;
2570
+ }
2571
+ if (validate) {
2572
+ vLastCode = code;
2573
+ }
2574
+ }
2575
+ if (hasControl) {
2576
+ return extractHostname(url.replace(CONTROL_CHARS, ""), urlIsValidHostname, validate);
2577
+ }
2578
+ if (indexOfIdentifier !== -1 && indexOfIdentifier >= start && indexOfIdentifier < end) {
2579
+ start = indexOfIdentifier + 1;
2580
+ }
2581
+ if (url.charCodeAt(start) === 91) {
2582
+ if (indexOfClosingBracket !== -1) {
2583
+ return url.slice(start + 1, indexOfClosingBracket).toLowerCase();
2584
+ }
2585
+ return null;
2586
+ } else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end && // A host:port has exactly one ':' in the host (so its first ':' is its
2587
+ // last); a bare, unbracketed IPv6 literal ("2a01:e35::1") has >= 2, so
2588
+ // its first ':' precedes the last. Only the former has a ':port' to trim.
2589
+ indexOfFirstColon === indexOfPort) {
2590
+ end = indexOfPort;
2591
+ }
2592
+ if (start >= end) {
2593
+ return null;
2594
+ }
2595
+ if (validate && vValid && indexOfIdentifier === -1 && indexOfPort === -1 && indexOfClosingBracket === -1 && url.charCodeAt(end - 1) !== 46 && end - start <= 255 && // total length
2596
+ end - vLastDot - 1 <= 63 && // last label length
2597
+ vLastCode !== 45) {
2598
+ extractedHostnameValidated = true;
2599
+ }
2600
+ }
2601
+ while (end > start + 1 && url.charCodeAt(end - 1) === 46) {
2602
+ end -= 1;
2603
+ }
2604
+ const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url;
2605
+ if (hasUpper) {
2606
+ return hostname.toLowerCase();
2607
+ }
2608
+ return hostname;
2609
+ }
2610
+
2611
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/is-ip.js
2612
+ function isProbablyIpv4(hostname) {
2613
+ if (hostname.length < 7) {
2614
+ return false;
2615
+ }
2616
+ if (hostname.length > 15) {
2617
+ return false;
2618
+ }
2619
+ let numberOfDots = 0;
2620
+ for (let i = 0; i < hostname.length; i += 1) {
2621
+ const code = hostname.charCodeAt(i);
2622
+ if (code === 46) {
2623
+ numberOfDots += 1;
2624
+ } else if (code < 48 || code > 57) {
2625
+ return false;
2626
+ }
2627
+ }
2628
+ return numberOfDots === 3 && hostname.charCodeAt(0) !== 46 && hostname.charCodeAt(hostname.length - 1) !== 46;
2629
+ }
2630
+ function isProbablyIpv6(hostname) {
2631
+ if (hostname.length < 3) {
2632
+ return false;
2633
+ }
2634
+ let start = hostname.startsWith("[") ? 1 : 0;
2635
+ let end = hostname.length;
2636
+ if (hostname[end - 1] === "]") {
2637
+ end -= 1;
2638
+ }
2639
+ if (end - start > 39) {
2640
+ return false;
2641
+ }
2642
+ let hasColon = false;
2643
+ for (; start < end; start += 1) {
2644
+ const code = hostname.charCodeAt(start);
2645
+ if (code === 58) {
2646
+ hasColon = true;
2647
+ } else if (!(code >= 48 && code <= 57 || // 0-9
2648
+ code >= 97 && code <= 102 || // a-f
2649
+ code >= 65 && code <= 70)) {
2650
+ return false;
2651
+ }
2652
+ }
2653
+ return hasColon;
2654
+ }
2655
+ function isIp(hostname) {
2656
+ return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);
2657
+ }
2658
+
2659
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/is-special-use.js
2660
+ var SPECIAL_USE_DOMAINS = [
2661
+ "test",
2662
+ // RFC 6761
2663
+ "localhost",
2664
+ // RFC 6761
2665
+ "invalid",
2666
+ // RFC 6761
2667
+ "example",
2668
+ // RFC 6761
2669
+ "example.com",
2670
+ // RFC 6761
2671
+ "example.net",
2672
+ // RFC 6761
2673
+ "example.org",
2674
+ // RFC 6761
2675
+ "local",
2676
+ // RFC 6762 (mDNS)
2677
+ "onion",
2678
+ // RFC 7686 (Tor)
2679
+ "alt",
2680
+ // RFC 9476
2681
+ "home.arpa",
2682
+ // RFC 8375
2683
+ "ipv4only.arpa",
2684
+ // RFC 8880
2685
+ "resolver.arpa",
2686
+ // RFC 9462
2687
+ "service.arpa",
2688
+ // RFC 9665
2689
+ "6tisch.arpa",
2690
+ // RFC 9031
2691
+ "eap.arpa"
2692
+ // RFC 9965
2693
+ ];
2694
+ function isSpecialUse(hostname) {
2695
+ for (const name of SPECIAL_USE_DOMAINS) {
2696
+ if (hostname.endsWith(name) && (hostname.length === name.length || hostname.charCodeAt(hostname.length - name.length - 1) === 46)) {
2697
+ return true;
2698
+ }
2699
+ }
2700
+ return false;
2701
+ }
2702
+
2703
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/is-valid.js
2704
+ function isValidAscii(code) {
2705
+ return code >= 97 && code <= 122 || code >= 48 && code <= 57 || code > 127;
2706
+ }
2707
+ function is_valid_default(hostname) {
2708
+ if (hostname.length > 255) {
2709
+ return false;
2710
+ }
2711
+ if (hostname.length === 0) {
2712
+ return false;
2713
+ }
2714
+ if (
2715
+ /*@__INLINE__*/
2716
+ !isValidAscii(hostname.charCodeAt(0)) && hostname.charCodeAt(0) !== 46 && // '.' (dot)
2717
+ hostname.charCodeAt(0) !== 95
2718
+ ) {
2719
+ return false;
2720
+ }
2721
+ let lastDotIndex = -1;
2722
+ let lastCharCode = -1;
2723
+ const len = hostname.length;
2724
+ for (let i = 0; i < len; i += 1) {
2725
+ const code = hostname.charCodeAt(i);
2726
+ if (code === 46) {
2727
+ if (
2728
+ // Check that previous label is < 63 bytes long (64 = 63 + '.')
2729
+ i - lastDotIndex > 64 || // Check that previous character was not already a '.'
2730
+ lastCharCode === 46 || // Check that the previous label does not end with '-' (RFC 1035 §2.3.1 LDH).
2731
+ // '_' is intentionally NOT restricted: DNS allows any octet (RFC 2181 §11) and
2732
+ // WHATWG URL does not treat '_' as a forbidden host code point.
2733
+ lastCharCode === 45
2734
+ ) {
2735
+ return false;
2736
+ }
2737
+ lastDotIndex = i;
2738
+ } else if (
2739
+ // A forbidden character in the label...
2740
+ !/*@__INLINE__*/
2741
+ (isValidAscii(code) || code === 45 || code === 95) || // ...or a '-' starting a label (the byte right after a '.'). A label must
2742
+ // not begin with a hyphen (RFC 1034 §3.5 / RFC 1035 §2.3.1 LDH, as amended
2743
+ // by RFC 1123 §2.1; cf. UTS #46 CheckHyphens). The first label is covered by
2744
+ // the leading-character guard above; mirrors the trailing-'-' rule below.
2745
+ code === 45 && lastCharCode === 46
2746
+ ) {
2747
+ return false;
2748
+ }
2749
+ lastCharCode = code;
2750
+ }
2751
+ return (
2752
+ // Check that last label is shorter than 63 chars
2753
+ len - lastDotIndex - 1 <= 63 && // Check that the last character is an allowed trailing label character.
2754
+ // Since we already checked that the char is a valid hostname character,
2755
+ // we only need to check that it's different from '-'.
2756
+ lastCharCode !== 45
2757
+ );
2758
+ }
2759
+
2760
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/options.js
2761
+ function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, detectSpecialUse = false, extractHostname: extractHostname2 = true, mixedInputs = true, validHosts = null, validateHostname = true }) {
2762
+ return {
2763
+ allowIcannDomains,
2764
+ allowPrivateDomains,
2765
+ detectIp,
2766
+ detectSpecialUse,
2767
+ extractHostname: extractHostname2,
2768
+ mixedInputs,
2769
+ validHosts,
2770
+ validateHostname
2771
+ };
2772
+ }
2773
+ var DEFAULT_OPTIONS = (
2774
+ /*@__INLINE__*/
2775
+ setDefaultsImpl({})
2776
+ );
2777
+ function setDefaults(options) {
2778
+ if (options === void 0) {
2779
+ return DEFAULT_OPTIONS;
2780
+ }
2781
+ return (
2782
+ /*@__INLINE__*/
2783
+ setDefaultsImpl(options)
2784
+ );
2785
+ }
2786
+
2787
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/subdomain.js
2788
+ function getSubdomain(hostname, domain) {
2789
+ if (domain.length === hostname.length) {
2790
+ return "";
2791
+ }
2792
+ return hostname.slice(0, -domain.length - 1);
2793
+ }
2794
+
2795
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/factory.js
2796
+ function getEmptyResult() {
2797
+ return {
2798
+ domain: null,
2799
+ domainWithoutSuffix: null,
2800
+ hostname: null,
2801
+ isIcann: null,
2802
+ isIp: null,
2803
+ isPrivate: null,
2804
+ isSpecialUse: null,
2805
+ publicSuffix: null,
2806
+ subdomain: null
2807
+ };
2808
+ }
2809
+ function resetResult(result) {
2810
+ result.domain = null;
2811
+ result.domainWithoutSuffix = null;
2812
+ result.hostname = null;
2813
+ result.isIcann = null;
2814
+ result.isIp = null;
2815
+ result.isPrivate = null;
2816
+ result.isSpecialUse = null;
2817
+ result.publicSuffix = null;
2818
+ result.subdomain = null;
2819
+ }
2820
+ function parseImpl(url, step, suffixLookup2, partialOptions, result) {
2821
+ const options = (
2822
+ /*@__INLINE__*/
2823
+ setDefaults(partialOptions)
2824
+ );
2825
+ if (typeof url !== "string") {
2826
+ return result;
2827
+ }
2828
+ let urlIsValid = false;
2829
+ if (!options.extractHostname) {
2830
+ result.hostname = url;
2831
+ } else if (options.mixedInputs) {
2832
+ urlIsValid = is_valid_default(url);
2833
+ result.hostname = extractHostname(url, urlIsValid, options.validateHostname);
2834
+ } else {
2835
+ result.hostname = extractHostname(url, false, options.validateHostname);
2836
+ }
2837
+ if (options.detectIp && result.hostname !== null) {
2838
+ result.isIp = isIp(result.hostname);
2839
+ if (result.isIp) {
2840
+ return result;
2841
+ }
2842
+ }
2843
+ if (options.validateHostname && options.extractHostname && result.hostname !== null && // Skip the re-scan when `url` was already validated and extractHostname
2844
+ // returned it unchanged (same reference => identical string, still valid).
2845
+ !(urlIsValid && result.hostname === url) && // Skip the re-scan when extractHostname already validated the host inline
2846
+ // (a confirmed-valid simple authority — see extract-hostname.ts).
2847
+ !extractedHostnameValidated && !is_valid_default(result.hostname)) {
2848
+ result.hostname = null;
2849
+ return result;
2850
+ }
2851
+ if (step === 0 || result.hostname === null) {
2852
+ return result;
2853
+ }
2854
+ if (step === 5 && options.detectSpecialUse) {
2855
+ result.isSpecialUse = isSpecialUse(result.hostname);
2856
+ }
2857
+ suffixLookup2(result.hostname, options, result);
2858
+ if (step === 2 || result.publicSuffix === null) {
2859
+ return result;
2860
+ }
2861
+ result.domain = getDomain(result.publicSuffix, result.hostname, options);
2862
+ if (step === 3 || result.domain === null) {
2863
+ return result;
2864
+ }
2865
+ result.subdomain = getSubdomain(result.hostname, result.domain);
2866
+ if (step === 4) {
2867
+ return result;
2868
+ }
2869
+ result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix);
2870
+ return result;
2871
+ }
2872
+
2873
+ // ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/lookup/fast-path.js
2874
+ function fast_path_default(hostname, options, out) {
2875
+ if (!options.allowPrivateDomains && hostname.length > 3) {
2876
+ const last = hostname.length - 1;
2877
+ const c3 = hostname.charCodeAt(last);
2878
+ const c2 = hostname.charCodeAt(last - 1);
2879
+ const c1 = hostname.charCodeAt(last - 2);
2880
+ const c0 = hostname.charCodeAt(last - 3);
2881
+ if (c3 === 109 && c2 === 111 && c1 === 99 && c0 === 46) {
2882
+ out.isIcann = true;
2883
+ out.isPrivate = false;
2884
+ out.publicSuffix = "com";
2885
+ return true;
2886
+ } else if (c3 === 103 && c2 === 114 && c1 === 111 && c0 === 46) {
2887
+ out.isIcann = true;
2888
+ out.isPrivate = false;
2889
+ out.publicSuffix = "org";
2890
+ return true;
2891
+ } else if (c3 === 117 && c2 === 100 && c1 === 101 && c0 === 46) {
2892
+ out.isIcann = true;
2893
+ out.isPrivate = false;
2894
+ out.publicSuffix = "edu";
2895
+ return true;
2896
+ } else if (c3 === 118 && c2 === 111 && c1 === 103 && c0 === 46) {
2897
+ out.isIcann = true;
2898
+ out.isPrivate = false;
2899
+ out.publicSuffix = "gov";
2900
+ return true;
2901
+ } else if (c3 === 116 && c2 === 101 && c1 === 110 && c0 === 46) {
2902
+ out.isIcann = true;
2903
+ out.isPrivate = false;
2904
+ out.publicSuffix = "net";
2905
+ return true;
2906
+ } else if (c3 === 101 && c2 === 100 && c1 === 46) {
2907
+ out.isIcann = true;
2908
+ out.isPrivate = false;
2909
+ out.publicSuffix = "de";
2910
+ return true;
2911
+ }
2912
+ }
2913
+ return false;
2914
+ }
2915
+
2916
+ // ../../node_modules/.pnpm/tldts@7.4.9/node_modules/tldts/dist/es6/src/data/trie.js
2917
+ var nodeFlags = /* @__PURE__ */ new Uint8Array([1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 0, 2, 2, 0, 2, 0, 0, 1, 0, 0, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 2, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 2, 2, 0, 0, 0, 2, 0, 1, 1, 0, 2, 0, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]);
2918
+ var edgeStart = /* @__PURE__ */ new Uint16Array([0, 0, 0, 10, 11, 18, 106, 111, 117, 124, 130, 136, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 157, 159, 226, 239, 241, 242, 243, 258, 265, 266, 269, 270, 271, 274, 276, 295, 296, 298, 307, 312, 313, 331, 332, 335, 337, 338, 340, 374, 375, 377, 380, 381, 385, 387, 391, 394, 426, 429, 442, 443, 451, 452, 454, 464, 478, 479, 480, 489, 490, 527, 532, 548, 568, 574, 615, 616, 643, 670, 671, 819, 825, 828, 829, 830, 835, 840, 849, 871, 872, 873, 874, 875, 876, 877, 895, 897, 898, 901, 903, 904, 906, 908, 923, 938, 943, 944, 946, 947, 948, 949, 950, 952, 955, 960, 961, 962, 964, 965, 968, 971, 972, 973, 986, 988, 1e3, 1011, 1019, 1021, 1061, 1064, 1068, 1069, 1071, 1074, 1085, 1087, 1097, 1099, 1105, 1107, 1108, 1110, 1113, 1114, 1115, 1167, 1169, 1171, 1191, 1192, 1193, 1194, 1196, 1207, 1238, 1249, 1261, 1270, 1277, 1282, 1295, 1306, 1319, 1320, 1331, 1365, 1366, 1367, 1382, 1397, 1469, 1470, 1472, 1473, 1507, 1508, 1509, 1512, 1516, 1518, 1547, 1548, 1556, 1557, 1558, 1560, 1562, 1563, 1565, 1566, 1567, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1594, 1595, 1596, 1598, 2053, 2056, 2057, 2059, 2066, 2073, 2083, 2087, 2098, 2099, 2100, 2112, 2113, 2115, 2117, 2118, 2125, 2126, 2128, 2129, 2131, 2132, 2133, 2134, 2135, 2209, 2211, 2232, 2233, 2234, 2236, 2262, 2263, 2314, 2315, 2317, 2324, 2330, 2340, 2350, 2403, 2404, 2405, 2415, 2429, 2430, 2433, 2440, 2441, 2449, 2450, 2451, 2452, 2453, 2464, 2465, 2466, 2468, 2469, 2470, 2471, 2473, 2483, 2495, 2501, 2533, 2537, 2539, 2540, 2542, 2543, 2554, 2555, 2557, 2565, 2572, 2578, 2583, 2584, 2590, 2593, 2599, 2606, 2607, 2614, 2622, 2623, 2624, 2662, 2668, 2683, 2684, 2689, 2707, 2738, 2756, 2758, 2761, 2769, 2771, 2778, 2830, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2868, 2869, 2870, 2871, 2872, 2873, 2875, 2876, 2880, 2964, 2977, 2978, 3414, 3418, 3432, 3484, 3512, 3534, 3592, 3614, 3629, 3692, 3743, 3781, 3817, 3842, 3984, 4030, 4081, 4100, 4134, 4149, 4169, 4199, 4230, 4253, 4284, 4314, 4346, 4373, 4448, 4470, 4508, 4518, 4552, 4571, 4597, 4639, 4689, 4715, 4784, 4785, 4787, 4810, 4833, 4869, 4900, 4917, 4974, 4987, 5011, 5040, 5042, 5076, 5092, 5120, 5425, 5434, 5443, 5450, 5467, 5471, 5477, 5516, 5518, 5525, 5532, 5541, 5548, 5549, 5560, 5563, 5578, 5579, 5588, 5589, 5598, 5607, 5613, 5615, 5616, 5617, 5653, 5654, 5656, 5664, 5671, 5684, 5688, 5690, 5691, 5697, 5704, 5718, 5728, 5733, 5741, 5749, 5755, 5756, 5760, 5762, 5763, 5775, 5776, 5777, 5778, 5780, 5781, 5784, 5786, 5789, 5793, 5794, 5800, 5801, 5802, 5804, 5806, 5808, 5809, 5810, 5813, 5815, 5818, 5819, 5821, 6019, 6026, 6027, 6037, 6042, 6059, 6073, 6082, 6083, 6084, 6088, 6089, 6091, 6093, 6099, 6100, 6103, 6104, 6106, 6107, 6108, 7008, 7009, 7013, 7031, 7040, 7043, 7050, 7051, 7053, 7054, 7055, 7057, 7109, 7110, 7113, 7114, 7231, 7232, 7243, 7254, 7261, 7264, 7273, 7274, 7275, 7290, 7345, 7536, 7538, 7539, 7541, 7546, 7559, 7574, 7581, 7590, 7593, 7596, 7603, 7611, 7615, 7616, 7617, 7631, 7635, 7644, 7645, 7646, 7650, 7685, 7686, 7703, 7710, 7718, 7719, 7724, 7732, 7776, 7777, 7783, 7786, 7797, 7802, 7803, 7806, 7839, 7840, 7846, 7853, 7854, 7863, 7872, 7887, 7891, 7943, 7944, 7949, 7951, 7954, 7956, 7957, 7958, 7967, 7981, 7989, 8003, 8015, 8016, 8018, 8020, 8042, 8053, 8059, 8060, 8072, 8084, 8171, 8183, 8185, 8194, 8197, 8203, 8228, 8231, 8232, 8233, 8235, 8238, 8241, 8252, 8254, 8256, 8284, 8358, 8365, 8369, 8370, 8379, 8401, 8402, 8407, 8408, 8487, 8489, 8491, 8500, 8504, 8510, 8516, 8522, 8532, 8537, 8538, 8556, 8567, 8572, 8577, 8587, 8593, 8597, 8603, 8609, 10217, 10218, 10219, 10226, 10228]);
2919
+ var edgeLength = /* @__PURE__ */ new Uint8Array([3, 3, 3, 3, 3, 3, 3, 3, 5, 8, 8, 2, 2, 3, 3, 3, 3, 3, 8, 5, 5, 5, 5, 5, 3, 3, 5, 5, 9, 12, 19, 8, 19, 8, 11, 9, 9, 8, 7, 7, 6, 8, 9, 16, 10, 7, 7, 11, 8, 6, 6, 9, 7, 11, 7, 14, 4, 4, 4, 4, 4, 4, 10, 7, 6, 6, 6, 6, 10, 10, 6, 10, 10, 22, 11, 9, 10, 10, 10, 9, 10, 8, 7, 7, 7, 8, 21, 13, 11, 11, 9, 10, 9, 13, 10, 8, 8, 9, 12, 9, 7, 10, 7, 7, 13, 7, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 6, 3, 3, 3, 3, 3, 3, 2, 5, 3, 3, 3, 7, 2, 2, 2, 2, 2, 2, 3, 3, 3, 1, 1, 7, 8, 5, 2, 2, 7, 2, 2, 1, 4, 1, 11, 9, 9, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 5, 11, 9, 9, 13, 7, 14, 7, 6, 6, 6, 7, 6, 6, 6, 6, 6, 10, 7, 11, 9, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 8, 7, 10, 9, 9, 9, 8, 9, 8, 10, 6, 9, 9, 8, 10, 10, 7, 8, 1, 9, 10, 12, 12, 12, 10, 9, 9, 10, 10, 9, 9, 1, 1, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 4, 3, 3, 3, 7, 4, 4, 4, 3, 3, 6, 7, 3, 4, 1, 2, 2, 2, 6, 1, 2, 2, 2, 2, 2, 12, 5, 3, 8, 9, 13, 4, 4, 13, 9, 9, 11, 7, 3, 12, 9, 2, 2, 2, 3, 3, 3, 3, 3, 8, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 7, 10, 15, 7, 15, 15, 20, 15, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 13, 13, 9, 9, 9, 9, 9, 9, 7, 8, 6, 8, 8, 6, 8, 13, 8, 8, 6, 13, 8, 11, 13, 8, 6, 13, 8, 6, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 9, 9, 9, 10, 14, 14, 11, 13, 13, 9, 9, 9, 9, 9, 9, 2, 6, 9, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 2, 3, 3, 3, 3, 3, 3, 7, 7, 2, 3, 2, 2, 5, 3, 3, 3, 3, 3, 3, 4, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 5, 7, 2, 2, 12, 8, 10, 8, 10, 7, 18, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 2, 3, 3, 3, 5, 5, 3, 8, 8, 6, 8, 6, 6, 4, 6, 7, 7, 7, 10, 11, 2, 5, 5, 3, 3, 3, 3, 3, 3, 5, 5, 6, 11, 10, 7, 7, 7, 4, 4, 4, 2, 3, 3, 3, 3, 3, 2, 7, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 11, 7, 6, 9, 6, 6, 8, 10, 8, 6, 8, 13, 4, 4, 4, 4, 4, 10, 8, 11, 8, 8, 8, 10, 10, 7, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 10, 13, 7, 8, 7, 11, 8, 8, 6, 9, 8, 8, 6, 6, 6, 8, 8, 6, 6, 6, 6, 6, 9, 7, 6, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 9, 7, 8, 10, 8, 8, 2, 3, 3, 3, 3, 3, 2, 8, 9, 9, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 9, 2, 2, 3, 3, 3, 3, 3, 3, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 5, 3, 5, 4, 2, 3, 2, 4, 3, 9, 2, 2, 2, 2, 2, 5, 5, 3, 8, 8, 13, 6, 10, 9, 4, 7, 9, 11, 2, 3, 7, 3, 3, 4, 1, 3, 4, 2, 9, 3, 3, 12, 5, 3, 7, 10, 10, 7, 4, 4, 6, 14, 7, 9, 7, 13, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 8, 15, 4, 4, 2, 3, 3, 3, 7, 4, 9, 9, 2, 3, 3, 3, 5, 3, 2, 2, 7, 2, 7, 6, 6, 7, 2, 4, 2, 2, 2, 2, 2, 2, 8, 8, 8, 9, 5, 2, 3, 3, 3, 3, 3, 3, 10, 7, 4, 4, 4, 4, 3, 4, 2, 3, 3, 3, 3, 3, 10, 7, 4, 4, 4, 4, 2, 3, 3, 3, 3, 10, 7, 4, 4, 4, 4, 3, 9, 6, 6, 6, 9, 13, 9, 2, 2, 2, 8, 7, 9, 5, 3, 3, 3, 5, 5, 12, 9, 10, 7, 8, 7, 6, 8, 6, 11, 12, 7, 9, 10, 4, 4, 7, 8, 11, 6, 7, 9, 8, 7, 10, 8, 9, 15, 7, 8, 5, 4, 7, 2, 3, 3, 3, 2, 14, 10, 2, 14, 10, 2, 14, 3, 9, 13, 13, 10, 14, 16, 17, 11, 2, 14, 2, 14, 3, 9, 13, 10, 14, 16, 17, 11, 14, 10, 14, 2, 7, 3, 10, 7, 14, 10, 2, 14, 10, 9, 9, 17, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 10, 10, 10, 12, 9, 4, 10, 11, 8, 8, 8, 7, 9, 5, 3, 3, 3, 3, 3, 3, 3, 3, 5, 8, 4, 4, 4, 4, 4, 4, 6, 16, 3, 3, 14, 3, 14, 2, 14, 9, 13, 10, 10, 14, 16, 17, 11, 6, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 9, 9, 9, 9, 9, 9, 2, 14, 9, 13, 10, 10, 14, 16, 17, 11, 6, 2, 14, 9, 17, 13, 10, 10, 14, 16, 17, 11, 6, 2, 14, 9, 13, 10, 14, 16, 17, 11, 2, 14, 9, 13, 10, 16, 11, 2, 14, 10, 19, 7, 2, 14, 9, 13, 10, 19, 10, 7, 14, 16, 17, 11, 6, 2, 14, 9, 13, 10, 19, 7, 14, 16, 17, 11, 2, 14, 9, 13, 17, 13, 10, 10, 14, 16, 17, 11, 6, 3, 2, 14, 9, 13, 10, 10, 14, 16, 17, 11, 6, 9, 10, 12, 14, 14, 14, 12, 12, 12, 12, 12, 14, 14, 14, 10, 10, 10, 14, 9, 9, 9, 9, 14, 14, 14, 13, 13, 14, 9, 9, 9, 9, 9, 9, 4, 11, 2, 14, 9, 13, 17, 13, 10, 19, 10, 7, 14, 16, 17, 11, 6, 2, 14, 9, 13, 17, 13, 10, 19, 10, 7, 14, 16, 17, 11, 6, 2, 9, 10, 10, 7, 17, 3, 3, 12, 12, 16, 15, 15, 12, 14, 14, 14, 20, 20, 13, 12, 12, 12, 12, 12, 12, 20, 25, 14, 14, 12, 12, 10, 10, 10, 10, 9, 9, 9, 25, 4, 9, 17, 10, 7, 14, 16, 21, 13, 13, 14, 20, 14, 13, 17, 24, 9, 12, 13, 25, 13, 21, 20, 17, 9, 9, 9, 9, 9, 9, 12, 17, 4, 4, 9, 9, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 13, 13, 9, 9, 9, 9, 9, 9, 1, 8, 7, 11, 11, 1, 3, 3, 3, 4, 8, 9, 10, 14, 14, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 13, 13, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 12, 6, 14, 4, 12, 7, 2, 2, 1, 2, 7, 6, 4, 4, 4, 6, 8, 8, 7, 4, 5, 6, 3, 3, 3, 3, 4, 16, 8, 3, 5, 4, 3, 3, 3, 5, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, 12, 7, 7, 13, 9, 10, 12, 8, 9, 7, 8, 5, 12, 10, 13, 14, 5, 5, 5, 13, 5, 5, 5, 3, 3, 3, 5, 16, 5, 5, 5, 5, 5, 7, 12, 14, 8, 12, 8, 10, 12, 9, 11, 7, 9, 7, 10, 7, 13, 9, 7, 12, 8, 17, 7, 7, 16, 10, 13, 13, 8, 10, 10, 14, 17, 7, 16, 16, 15, 8, 10, 10, 12, 17, 7, 17, 14, 7, 10, 17, 8, 7, 7, 7, 8, 15, 15, 7, 14, 10, 10, 10, 11, 11, 7, 7, 13, 8, 10, 7, 16, 7, 8, 7, 14, 17, 12, 10, 11, 21, 8, 9, 7, 13, 9, 8, 13, 6, 12, 7, 6, 13, 10, 10, 10, 8, 18, 9, 17, 13, 10, 12, 6, 13, 6, 11, 8, 13, 10, 13, 18, 13, 11, 13, 8, 16, 7, 10, 8, 16, 12, 10, 8, 8, 6, 14, 11, 8, 15, 8, 8, 7, 7, 12, 7, 8, 9, 14, 15, 8, 9, 10, 9, 15, 7, 8, 8, 12, 13, 9, 10, 15, 15, 13, 7, 10, 10, 20, 7, 6, 9, 6, 6, 14, 11, 14, 11, 12, 9, 10, 16, 16, 12, 7, 11, 28, 8, 11, 10, 7, 21, 8, 7, 9, 4, 4, 4, 17, 7, 8, 6, 9, 6, 6, 13, 6, 6, 6, 6, 18, 20, 14, 8, 11, 12, 9, 10, 13, 15, 19, 8, 9, 12, 7, 10, 16, 12, 9, 9, 9, 14, 12, 11, 9, 12, 11, 18, 9, 9, 9, 10, 7, 7, 16, 8, 9, 7, 13, 12, 10, 18, 7, 8, 11, 7, 7, 8, 8, 13, 7, 7, 7, 11, 15, 13, 11, 7, 8, 15, 11, 7, 8, 18, 14, 13, 18, 15, 10, 12, 12, 9, 7, 11, 11, 8, 7, 10, 8, 14, 12, 10, 18, 7, 10, 9, 7, 8, 13, 10, 14, 9, 10, 8, 8, 23, 7, 7, 11, 12, 12, 17, 7, 7, 11, 11, 17, 16, 16, 7, 8, 11, 14, 14, 8, 10, 7, 7, 16, 16, 13, 9, 11, 9, 15, 15, 11, 11, 7, 7, 14, 7, 9, 7, 7, 16, 10, 13, 10, 11, 14, 7, 11, 10, 11, 7, 11, 10, 11, 15, 11, 15, 10, 12, 17, 10, 14, 13, 11, 11, 12, 13, 10, 7, 13, 10, 16, 12, 21, 9, 10, 10, 7, 11, 14, 17, 7, 7, 8, 11, 12, 8, 15, 14, 14, 8, 17, 12, 10, 10, 7, 9, 11, 7, 10, 7, 11, 18, 7, 11, 7, 12, 11, 8, 8, 14, 12, 7, 8, 15, 3, 7, 7, 5, 2, 9, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 5, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 5, 11, 6, 4, 7, 10, 7, 7, 11, 1, 10, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 7, 3, 5, 6, 3, 3, 5, 2, 2, 5, 3, 4, 13, 11, 3, 3, 6, 3, 5, 14, 2, 2, 3, 8, 2, 2, 12, 5, 18, 5, 3, 3, 3, 16, 5, 5, 5, 10, 7, 13, 12, 13, 9, 12, 14, 19, 9, 9, 21, 9, 9, 10, 6, 9, 6, 15, 10, 6, 12, 8, 6, 10, 15, 4, 4, 6, 6, 9, 9, 12, 16, 14, 23, 7, 7, 7, 14, 9, 7, 7, 11, 14, 10, 7, 10, 10, 10, 12, 6, 11, 10, 13, 11, 15, 11, 7, 12, 10, 3, 7, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 3, 7, 2, 5, 5, 3, 3, 5, 5, 5, 5, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 7, 10, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 3, 5, 5, 10, 9, 11, 8, 7, 12, 8, 9, 7, 6, 13, 11, 6, 13, 7, 9, 9, 4, 4, 4, 4, 4, 4, 6, 10, 7, 8, 13, 8, 8, 9, 14, 8, 10, 7, 7, 7, 9, 6, 9, 7, 2, 12, 5, 3, 3, 13, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 1, 7, 6, 4, 12, 3, 3, 3, 3, 3, 8, 7, 3, 3, 3, 3, 3, 3, 4, 4, 11, 14, 2, 8, 3, 5, 5, 8, 10, 8, 6, 4, 7, 17, 7, 4, 5, 2, 6, 3, 5, 2, 4, 4, 2, 12, 5, 5, 3, 15, 13, 10, 8, 11, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 3, 3, 3, 3, 4, 18, 2, 12, 5, 3, 3, 3, 3, 3, 5, 16, 8, 8, 9, 6, 6, 4, 4, 4, 4, 31, 6, 6, 10, 11, 21, 10, 9, 7, 10, 7, 7, 2, 4, 4, 4, 4, 6, 5, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 2, 2, 2, 5, 3, 3, 3, 7, 7, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 8, 2, 3, 3, 3, 3, 3, 5, 9, 11, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 5, 10, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 11, 10, 10, 10, 10, 10, 11, 10, 11, 10, 11, 10, 9, 9, 11, 3, 3, 3, 3, 3, 3, 5, 3, 7, 8, 8, 7, 6, 6, 11, 4, 4, 4, 7, 8, 9, 9, 2, 3, 7, 4, 4, 2, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 2, 2, 5, 5, 5, 5, 5, 3, 3, 5, 5, 5, 7, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 6, 9, 12, 3, 7, 10, 7, 2, 2, 3, 3, 3, 3, 3, 4, 3, 3, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 8, 8, 6, 6, 8, 6, 7, 4, 4, 4, 4, 4, 4, 6, 7, 5, 5, 20, 19, 8, 10, 9, 7, 10, 6, 8, 11, 6, 6, 6, 6, 13, 12, 8, 6, 7, 14, 11, 9, 2, 5, 3, 3, 6, 2, 3, 2, 2, 2, 2, 2, 2, 2, 5, 4, 3, 7, 6, 4, 7, 4, 3, 6, 4, 7, 2, 7, 7, 7, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 9, 10, 10, 8, 11, 7, 8, 20, 7, 8, 9, 8, 12, 6, 6, 6, 8, 9, 8, 12, 6, 6, 8, 13, 10, 12, 6, 6, 7, 7, 8, 9, 6, 4, 4, 4, 4, 4, 4, 4, 10, 6, 6, 6, 7, 14, 11, 10, 7, 8, 10, 8, 11, 14, 11, 11, 9, 7, 9, 8, 11, 9, 17, 10, 9, 2, 2, 2, 9, 3, 3, 3, 3, 15, 14, 9, 5, 5, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 12, 22, 19, 17, 18, 18, 19, 21, 7, 16, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 7, 16, 11, 11, 7, 7, 7, 7, 17, 7, 8, 12, 15, 9, 19, 7, 19, 8, 16, 21, 11, 12, 19, 14, 22, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 16, 19, 24, 12, 7, 14, 7, 12, 7, 8, 10, 10, 13, 7, 12, 12, 7, 7, 10, 18, 15, 12, 16, 7, 14, 12, 17, 10, 16, 17, 12, 17, 25, 7, 7, 7, 13, 6, 9, 6, 9, 18, 6, 6, 11, 20, 10, 6, 6, 6, 6, 6, 6, 6, 17, 6, 6, 6, 15, 6, 6, 6, 6, 6, 8, 14, 11, 12, 15, 13, 19, 17, 21, 7, 18, 8, 13, 13, 8, 12, 8, 6, 6, 13, 6, 15, 15, 16, 6, 6, 16, 6, 6, 6, 14, 6, 18, 6, 6, 6, 17, 18, 9, 13, 15, 8, 19, 8, 15, 15, 18, 14, 16, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 11, 10, 11, 6, 21, 23, 12, 17, 12, 11, 14, 13, 22, 15, 15, 11, 12, 14, 12, 7, 12, 8, 14, 12, 18, 10, 8, 16, 19, 17, 12, 14, 15, 8, 9, 19, 17, 12, 13, 13, 15, 18, 13, 23, 24, 23, 21, 17, 24, 8, 21, 8, 14, 14, 16, 14, 8, 8, 15, 20, 8, 19, 21, 9, 8, 13, 12, 13, 15, 11, 8, 11, 9, 9, 8, 11, 8, 21, 14, 21, 15, 15, 13, 7, 19, 7, 7, 7, 7, 7, 7, 16, 12, 17, 18, 7, 7, 11, 11, 7, 9, 9, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 10, 10, 7, 9, 7, 7, 7, 6, 8, 6, 6, 6, 6, 6, 6, 6, 7, 6, 8, 6, 6, 9, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 8, 9, 8, 7, 8, 7, 8, 10, 7, 5, 5, 5, 5, 5, 5, 3, 9, 7, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, 9, 11, 13, 7, 8, 9, 9, 5, 5, 5, 7, 8, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 7, 10, 9, 10, 7, 8, 5, 5, 5, 5, 5, 5, 7, 7, 9, 8, 7, 7, 6, 6, 6, 6, 6, 6, 10, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 10, 4, 4, 4, 4, 8, 7, 7, 10, 10, 9, 8, 8, 15, 9, 8, 8, 8, 8, 8, 9, 10, 9, 10, 7, 8, 13, 5, 5, 5, 5, 5, 3, 3, 7, 7, 8, 6, 6, 6, 4, 4, 11, 9, 7, 8, 9, 10, 7, 5, 5, 5, 5, 5, 3, 3, 7, 6, 6, 13, 7, 9, 8, 7, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 7, 8, 7, 8, 13, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 6, 6, 6, 6, 7, 6, 7, 6, 6, 9, 7, 4, 4, 4, 4, 4, 4, 4, 7, 8, 7, 8, 9, 8, 8, 8, 7, 10, 7, 8, 5, 5, 5, 5, 5, 5, 5, 5, 3, 7, 7, 7, 7, 9, 7, 10, 9, 6, 6, 6, 6, 6, 8, 8, 6, 6, 6, 7, 6, 6, 6, 9, 9, 4, 4, 13, 7, 10, 9, 9, 12, 7, 8, 8, 10, 8, 8, 8, 8, 8, 8, 5, 5, 5, 5, 3, 7, 7, 11, 7, 9, 8, 8, 6, 6, 10, 6, 8, 8, 8, 6, 7, 6, 6, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 8, 8, 16, 8, 9, 8, 7, 5, 5, 5, 5, 5, 3, 3, 7, 7, 7, 10, 15, 8, 9, 8, 9, 9, 6, 6, 6, 6, 6, 6, 7, 4, 8, 7, 8, 8, 7, 8, 11, 8, 5, 5, 5, 5, 5, 3, 7, 7, 6, 11, 16, 7, 6, 4, 4, 4, 4, 9, 9, 8, 8, 8, 13, 12, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 7, 8, 8, 9, 13, 7, 7, 7, 9, 8, 8, 9, 12, 7, 12, 7, 12, 8, 7, 10, 12, 9, 9, 6, 6, 8, 8, 6, 6, 6, 6, 6, 6, 6, 9, 8, 9, 11, 8, 6, 6, 6, 6, 6, 12, 7, 6, 6, 6, 9, 7, 7, 6, 6, 6, 6, 6, 11, 9, 6, 6, 6, 6, 6, 7, 9, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 7, 7, 7, 7, 7, 11, 7, 7, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 7, 7, 11, 11, 7, 12, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 13, 12, 8, 8, 8, 8, 7, 7, 7, 9, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 7, 11, 7, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 11, 6, 7, 9, 4, 4, 4, 4, 4, 4, 9, 9, 8, 9, 8, 8, 8, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 11, 7, 7, 7, 9, 6, 6, 11, 8, 10, 6, 6, 6, 12, 8, 8, 7, 6, 6, 8, 7, 4, 4, 4, 4, 4, 4, 4, 4, 9, 10, 9, 9, 8, 10, 9, 11, 8, 5, 5, 5, 7, 6, 6, 8, 7, 4, 4, 4, 4, 8, 7, 7, 8, 7, 8, 8, 5, 5, 5, 5, 7, 7, 8, 8, 8, 6, 6, 6, 6, 6, 10, 8, 9, 13, 6, 7, 6, 6, 8, 7, 8, 4, 4, 4, 4, 11, 8, 8, 8, 10, 5, 5, 8, 7, 8, 13, 8, 7, 6, 8, 6, 9, 7, 8, 7, 5, 5, 5, 5, 5, 5, 3, 3, 7, 8, 9, 6, 4, 8, 10, 10, 8, 12, 9, 13, 2, 7, 5, 5, 5, 5, 5, 7, 7, 10, 6, 6, 6, 6, 6, 6, 6, 8, 4, 4, 9, 8, 8, 8, 14, 8, 8, 8, 9, 8, 5, 5, 5, 5, 5, 3, 3, 9, 6, 6, 6, 6, 10, 12, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 11, 8, 7, 8, 8, 8, 5, 5, 3, 3, 3, 3, 7, 7, 6, 8, 6, 8, 11, 7, 6, 6, 6, 7, 4, 8, 11, 9, 10, 5, 5, 5, 3, 3, 3, 7, 7, 8, 9, 8, 15, 9, 6, 6, 6, 6, 6, 6, 11, 11, 4, 4, 4, 4, 4, 7, 9, 9, 10, 8, 7, 5, 5, 5, 5, 5, 5, 3, 3, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 7, 4, 4, 4, 4, 4, 9, 9, 8, 8, 10, 13, 5, 5, 5, 3, 17, 7, 7, 7, 7, 7, 8, 6, 8, 13, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 9, 10, 8, 8, 8, 5, 5, 5, 5, 3, 7, 7, 7, 8, 8, 6, 6, 6, 8, 8, 8, 9, 10, 8, 4, 8, 10, 9, 8, 8, 8, 9, 13, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 8, 9, 9, 7, 7, 7, 10, 9, 9, 8, 9, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 8, 8, 9, 9, 10, 8, 9, 7, 7, 5, 5, 5, 5, 5, 5, 3, 7, 8, 7, 6, 6, 8, 6, 6, 10, 4, 7, 8, 9, 12, 8, 7, 7, 5, 5, 5, 5, 5, 5, 3, 3, 7, 14, 7, 9, 8, 8, 6, 6, 8, 12, 12, 6, 6, 7, 7, 10, 4, 4, 4, 4, 4, 9, 9, 14, 9, 13, 8, 7, 5, 5, 5, 6, 6, 6, 7, 4, 8, 7, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 7, 7, 8, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 4, 4, 9, 9, 8, 8, 11, 7, 7, 7, 5, 5, 5, 3, 9, 8, 6, 6, 7, 4, 4, 4, 4, 4, 4, 8, 8, 11, 5, 5, 5, 7, 7, 7, 9, 6, 6, 6, 6, 6, 6, 9, 8, 4, 4, 4, 4, 7, 12, 9, 8, 8, 8, 7, 10, 10, 5, 5, 5, 5, 5, 5, 5, 3, 11, 14, 8, 7, 8, 8, 6, 6, 6, 6, 6, 8, 7, 6, 6, 6, 7, 6, 8, 9, 4, 4, 4, 7, 8, 9, 7, 9, 7, 7, 9, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 3, 9, 7, 7, 12, 14, 8, 6, 6, 12, 11, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 7, 4, 4, 4, 16, 9, 9, 9, 8, 9, 9, 9, 9, 9, 8, 8, 8, 13, 11, 8, 5, 5, 5, 5, 3, 7, 6, 6, 8, 8, 8, 6, 6, 7, 10, 7, 4, 4, 4, 4, 9, 7, 8, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 7, 7, 7, 9, 6, 6, 6, 6, 6, 8, 8, 7, 7, 9, 6, 6, 6, 7, 6, 6, 6, 6, 6, 15, 4, 4, 4, 4, 4, 8, 8, 7, 8, 12, 9, 8, 8, 8, 8, 8, 9, 8, 8, 10, 8, 8, 8, 8, 16, 9, 10, 2, 5, 5, 5, 5, 5, 5, 5, 9, 7, 6, 8, 9, 4, 4, 4, 4, 4, 7, 8, 8, 8, 9, 8, 11, 10, 5, 5, 5, 5, 3, 7, 8, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 4, 12, 10, 12, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 3, 3, 7, 7, 10, 8, 9, 7, 6, 10, 7, 6, 6, 4, 4, 8, 9, 7, 9, 9, 9, 9, 8, 8, 8, 8, 10, 5, 5, 5, 5, 5, 5, 8, 7, 6, 6, 6, 10, 6, 7, 10, 7, 4, 4, 4, 4, 4, 4, 4, 12, 9, 10, 7, 7, 10, 8, 10, 5, 12, 9, 6, 6, 6, 6, 6, 7, 6, 4, 4, 4, 10, 9, 9, 8, 7, 7, 5, 5, 5, 5, 5, 5, 3, 3, 13, 7, 7, 9, 7, 7, 7, 8, 9, 9, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 13, 9, 15, 15, 4, 4, 4, 4, 4, 10, 10, 9, 8, 9, 8, 8, 9, 7, 8, 7, 8, 5, 5, 7, 6, 6, 6, 4, 4, 4, 7, 8, 11, 8, 5, 5, 5, 5, 5, 5, 5, 7, 6, 6, 6, 6, 6, 6, 9, 11, 10, 7, 4, 4, 4, 9, 8, 8, 5, 5, 5, 5, 5, 9, 9, 6, 6, 6, 6, 6, 6, 6, 9, 9, 4, 4, 4, 4, 8, 8, 8, 9, 9, 8, 8, 8, 13, 2, 4, 2, 7, 5, 5, 5, 5, 5, 5, 9, 9, 6, 6, 6, 6, 10, 8, 8, 8, 6, 6, 6, 4, 4, 9, 8, 10, 8, 9, 8, 8, 8, 9, 8, 8, 5, 3, 3, 3, 11, 6, 6, 6, 7, 6, 6, 6, 4, 4, 9, 8, 5, 5, 5, 5, 5, 3, 11, 8, 6, 6, 6, 6, 6, 9, 7, 4, 4, 14, 10, 9, 8, 12, 8, 8, 8, 11, 15, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 10, 10, 7, 7, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 7, 11, 7, 7, 11, 11, 7, 8, 9, 10, 7, 7, 9, 9, 9, 9, 7, 7, 10, 8, 13, 8, 8, 8, 8, 11, 10, 6, 6, 8, 10, 11, 14, 14, 6, 6, 6, 6, 6, 6, 9, 11, 7, 7, 6, 8, 12, 11, 11, 6, 6, 10, 6, 6, 6, 6, 6, 10, 7, 7, 6, 6, 11, 6, 6, 6, 11, 8, 9, 7, 6, 10, 11, 9, 10, 11, 7, 11, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 6, 6, 8, 9, 10, 9, 6, 6, 6, 10, 6, 6, 6, 6, 11, 10, 11, 10, 9, 8, 7, 7, 7, 7, 11, 14, 8, 10, 9, 9, 8, 8, 7, 11, 8, 8, 8, 11, 11, 10, 10, 9, 10, 8, 11, 10, 8, 11, 9, 12, 8, 10, 8, 11, 8, 9, 9, 11, 11, 10, 11, 13, 8, 7, 8, 8, 9, 7, 8, 8, 8, 8, 7, 8, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 8, 6, 4, 4, 4, 11, 7, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 8, 7, 7, 8, 8, 4, 8, 7, 7, 7, 9, 7, 8, 9, 8, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 3, 3, 3, 4, 5, 5, 3, 8, 8, 6, 9, 4, 4, 10, 7, 3, 3, 3, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 2, 2, 2, 3, 3, 3, 3, 3, 4, 10, 2, 3, 3, 3, 3, 3, 3, 3, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 5, 2, 4, 2, 6, 2, 2, 9, 5, 5, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 9, 8, 7, 6, 6, 11, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 7, 7, 11, 8, 8, 6, 5, 11, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 3, 3, 3, 3, 6, 4, 4, 4, 4, 3, 3, 3, 3, 5, 7, 2, 3, 3, 3, 3, 3, 8, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 4, 4, 4, 4, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 6, 3, 3, 8, 10, 3, 4, 4, 1, 1, 1, 1, 1, 1, 1, 8, 9, 10, 7, 7, 1, 1, 3, 8, 7, 7, 8, 8, 8, 1, 6, 1, 1, 6, 3, 3, 4, 7, 3, 5, 5, 4, 4, 4, 4, 4, 2, 7, 7, 8, 12, 3, 4, 5, 1, 3, 4, 4, 10, 4, 3, 3, 3, 8, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 9, 20, 7, 5, 5, 5, 9, 13, 5, 5, 5, 5, 5, 3, 3, 3, 16, 5, 5, 5, 13, 7, 8, 8, 11, 8, 7, 9, 7, 11, 12, 9, 9, 8, 8, 11, 10, 14, 7, 12, 10, 11, 13, 7, 9, 11, 17, 17, 14, 13, 7, 8, 7, 10, 10, 7, 16, 13, 7, 8, 17, 12, 9, 8, 6, 7, 10, 6, 6, 12, 6, 8, 10, 8, 8, 8, 6, 8, 6, 14, 6, 6, 6, 13, 6, 10, 6, 6, 7, 14, 8, 6, 6, 10, 11, 10, 9, 9, 7, 7, 6, 6, 6, 9, 9, 7, 9, 10, 9, 13, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 8, 6, 8, 9, 10, 9, 7, 10, 10, 8, 7, 8, 7, 10, 12, 9, 8, 15, 8, 7, 8, 8, 7, 7, 15, 13, 7, 10, 9, 14, 18, 16, 7, 24, 7, 8, 10, 11, 16, 8, 14, 7, 9, 9, 9, 11, 13, 19, 14, 15, 14, 11, 7, 13, 9, 10, 7, 13, 9, 10, 11, 12, 8, 9, 2, 3, 5, 8, 7, 4, 4, 10, 5, 3, 3, 3, 3, 3, 5, 4, 4, 4, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 12, 5, 3, 8, 10, 15, 6, 7, 2, 3, 2, 5, 5, 12, 2, 5, 5, 5, 5, 2, 2, 5, 5, 12, 9, 5, 2, 2, 9, 5, 5, 12, 12, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 12, 5, 8, 8, 9, 5, 5, 5, 8, 19, 7, 16, 15, 14, 9, 9, 9, 9, 7, 11, 11, 11, 7, 14, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 12, 9, 9, 12, 12, 12, 15, 7, 11, 7, 14, 11, 18, 13, 8, 18, 15, 18, 12, 14, 12, 8, 8, 8, 8, 9, 9, 9, 12, 7, 10, 10, 8, 8, 12, 12, 12, 7, 12, 12, 9, 7, 7, 7, 7, 7, 8, 15, 12, 9, 10, 10, 7, 10, 10, 13, 11, 10, 9, 22, 11, 9, 8, 8, 8, 8, 8, 13, 18, 13, 9, 15, 19, 9, 7, 7, 10, 7, 7, 7, 11, 8, 13, 17, 7, 7, 10, 10, 10, 7, 20, 16, 7, 7, 7, 7, 7, 7, 11, 21, 12, 12, 13, 11, 14, 16, 8, 8, 13, 11, 7, 7, 13, 7, 7, 14, 15, 15, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 10, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 11, 8, 8, 12, 12, 11, 11, 8, 12, 9, 9, 9, 13, 13, 9, 9, 9, 9, 9, 9, 6, 10, 12, 6, 6, 6, 6, 17, 11, 7, 7, 7, 7, 14, 14, 12, 6, 7, 7, 6, 6, 15, 10, 13, 10, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 13, 9, 9, 15, 13, 6, 12, 12, 6, 19, 11, 10, 7, 7, 16, 8, 19, 17, 9, 9, 9, 9, 9, 6, 6, 6, 10, 8, 16, 8, 6, 6, 9, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 14, 6, 6, 6, 6, 20, 6, 9, 6, 14, 9, 9, 9, 6, 9, 8, 8, 12, 9, 8, 8, 8, 8, 7, 8, 12, 7, 8, 8, 8, 6, 8, 6, 6, 6, 6, 6, 6, 6, 9, 8, 8, 6, 6, 13, 9, 12, 13, 12, 14, 13, 12, 11, 11, 6, 8, 8, 8, 6, 13, 12, 11, 11, 12, 6, 11, 12, 11, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 15, 6, 6, 6, 6, 6, 6, 6, 13, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 6, 18, 6, 12, 13, 13, 13, 9, 10, 15, 9, 12, 6, 6, 6, 6, 6, 6, 6, 6, 9, 15, 10, 9, 10, 13, 9, 19, 8, 18, 17, 10, 10, 8, 8, 6, 6, 6, 6, 6, 6, 10, 14, 8, 16, 16, 9, 8, 15, 8, 8, 10, 12, 14, 7, 7, 8, 8, 7, 7, 7, 7, 8, 13, 13, 11, 9, 9, 9, 12, 10, 17, 8, 11, 9, 7, 7, 14, 8, 14, 14, 7, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 10, 10, 8, 14, 7, 7, 7, 7, 8, 8, 8, 8, 8, 17, 9, 7, 15, 7, 8, 12, 7, 9, 14, 7, 7, 7, 9, 13, 8, 14, 7, 16, 18, 13, 15, 14, 12, 13, 10, 15, 9, 7, 7, 7, 10, 13, 15, 15, 9, 9, 9, 9, 19, 11, 7, 11, 11, 13, 8, 8, 8, 8, 7, 12, 19, 17, 9, 9, 13, 7, 7, 7, 9, 7, 7, 7, 12, 13, 15, 10, 8, 8, 14, 15, 12, 13, 13, 8, 12, 14, 7, 11, 7, 14, 15, 13, 12, 8, 8, 8, 8, 11, 13, 15, 15, 8, 13, 12, 8, 8, 8, 13, 10, 16, 14, 11, 8, 8, 12, 12, 9, 15, 15, 12, 12, 13, 8, 8, 9, 12, 13, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 12, 11, 7, 14, 7, 13, 13, 13, 12, 18, 16, 7, 12, 11, 10, 10, 15, 9, 9, 9, 21, 7, 7, 7, 11, 16, 8, 8, 11, 11, 7, 7, 7, 7, 7, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 8, 9, 12, 14, 11, 9, 9, 9, 22, 12, 3, 8, 8, 15, 4, 2, 2, 5, 5, 3, 3, 3, 3, 3, 3, 6, 6, 4, 4, 4, 12, 7, 10, 2, 3, 3, 3, 3, 3, 3, 3, 6, 7, 3, 7, 5, 14, 4, 4, 7, 8, 10, 4, 1, 3, 3, 6, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 2, 2, 5, 3, 4, 2, 2, 2, 2, 2, 2, 11, 5, 5, 5, 11, 5, 5, 3, 5, 5, 5, 5, 11, 14, 13, 9, 11, 9, 12, 8, 11, 11, 8, 11, 16, 9, 9, 7, 10, 9, 12, 8, 15, 6, 7, 6, 6, 13, 10, 8, 11, 8, 6, 6, 6, 12, 16, 6, 11, 7, 8, 9, 18, 6, 6, 9, 4, 4, 6, 13, 6, 6, 6, 6, 8, 8, 9, 16, 7, 7, 14, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 15, 13, 7, 10, 7, 7, 10, 12, 16, 15, 7, 9, 9, 14, 11, 11, 10, 9, 10, 8, 12, 7, 8, 7, 7, 10, 12, 7, 12, 8, 7, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 5, 5, 5, 10, 4, 8, 7, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 7, 4, 5, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 8, 2, 2, 2, 8, 12, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 7, 11, 9, 8, 8, 8, 7, 8, 9, 7, 7, 9, 7, 7, 7, 10, 7, 7, 10, 9, 10, 6, 6, 6, 6, 6, 6, 15, 7, 8, 9, 9, 8, 6, 6, 10, 9, 6, 8, 13, 9, 7, 6, 6, 6, 6, 6, 6, 12, 6, 6, 7, 6, 7, 6, 6, 6, 10, 10, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 14, 6, 6, 7, 7, 9, 6, 6, 6, 6, 9, 9, 8, 9, 10, 9, 8, 9, 12, 7, 7, 7, 8, 7, 10, 12, 11, 9, 10, 7, 7, 7, 9, 10, 10, 8, 12, 9, 7, 7, 9, 8, 8, 8, 10, 7, 7, 8, 9, 9, 7, 7, 7, 8, 2, 4, 6, 3, 4, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 5, 8, 6, 4, 7, 3, 3, 3, 3, 3, 3, 3, 12, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 5, 3, 4, 7, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 6, 4, 3, 4, 2, 2, 2, 5, 3, 3, 3, 3, 3, 5, 4, 4, 4, 4, 7, 6, 8, 9, 2, 2, 2, 2, 3, 3, 3, 5, 7, 2, 3, 3, 8, 7, 7, 2, 2, 8, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 8, 8, 7, 7, 6, 10, 6, 9, 7, 11, 4, 6, 8, 8, 7, 8, 4, 5, 5, 5, 3, 3, 11, 8, 9, 6, 6, 8, 7, 4, 4, 7, 8, 7, 2, 2, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 7, 2, 2, 5, 3, 3, 2, 3, 3, 3, 3, 3, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 12, 5, 5, 3, 3, 3, 5, 10, 12, 6, 15, 4, 6, 6, 7, 14, 9, 3, 3, 3, 3, 3, 8, 2, 2, 3, 5, 3, 3, 3, 3, 3, 3, 8, 8, 8, 7, 5, 8, 4, 6, 11, 2, 2, 6, 7, 2, 9, 8, 5, 5, 3, 3, 5, 5, 7, 7, 6, 6, 10, 6, 6, 8, 9, 7, 4, 4, 4, 4, 7, 6, 6, 7, 7, 10, 9, 8, 11, 8, 3, 3, 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, 3, 7, 6, 2, 5, 6, 7, 6, 4, 8, 9, 11, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 5, 3, 3, 3, 3, 3, 9, 9, 6, 4, 8, 7, 7, 5, 9, 8, 6, 8, 7, 8, 5, 5, 5, 5, 5, 3, 3, 3, 16, 8, 7, 7, 7, 8, 7, 7, 7, 7, 9, 6, 9, 6, 10, 7, 7, 7, 6, 10, 8, 9, 11, 11, 8, 4, 4, 10, 8, 8, 6, 9, 6, 11, 8, 8, 8, 15, 7, 8, 9, 5, 3, 3, 3, 3, 3, 5, 11, 2, 2, 3, 8, 9, 10, 3, 2, 2, 2, 2, 2, 2, 3, 6, 4, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, 3, 3, 3, 11, 5, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 4, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 12, 7, 4, 12, 4, 6, 5, 4, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 11, 10, 6, 4, 6, 10, 8, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 5, 3, 4, 4, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 7, 8, 8, 7, 13, 12, 10, 10, 8, 8, 7, 7, 9, 12, 11, 6, 6, 8, 8, 9, 7, 7, 7, 10, 15, 10, 4, 4, 4, 4, 4, 11, 8, 8, 9, 7, 9, 14, 14, 12, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 12, 5, 5, 5, 8, 11, 10, 7, 9, 3, 8, 7, 3, 15, 13, 11, 4, 4, 2, 2, 2, 19, 7, 5, 5, 3, 3, 3, 3, 3, 3, 3, 5, 22, 18, 6, 14, 17, 4, 4, 19, 16, 18, 2, 3, 3, 2, 3, 2, 3, 3, 6, 4, 2, 3, 3, 2, 5, 3, 3, 3, 3, 3, 3, 3, 9, 9, 2, 3, 2, 2, 2, 3, 3, 3, 5, 7, 14, 7, 7, 12, 9, 13, 6, 11, 6, 10, 9, 7, 7, 8, 12, 12, 8, 8, 8, 10, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 5, 8, 10, 7, 8, 11, 8, 12, 9, 4, 7, 7, 9, 13, 2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 1, 2, 2, 3, 3, 3, 3, 3, 3, 5, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 4, 4, 4, 3, 2, 3, 3, 3, 3, 5, 2, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 12, 9, 8, 8, 9, 8, 6, 17, 6, 6, 6, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 4, 4, 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 7, 8, 8, 8, 10, 7, 13, 10, 8, 9, 3, 3, 5, 13, 3, 3, 3, 3, 3, 7, 7, 6, 6, 10, 13, 11, 11, 8, 8, 9, 8, 9, 9, 10, 10, 10, 11, 10, 10, 13, 13, 16, 15, 11, 12, 9, 9, 10, 9, 11, 10, 9, 9, 14, 7, 8, 3, 10, 7, 7, 3, 2, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 11, 6, 7, 4, 6, 2, 2, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 6, 4, 4, 2, 2, 2, 3, 3, 3, 3, 4, 4, 6, 6, 6, 6, 5, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 11, 6, 10, 9, 12, 7, 7, 11, 14, 9, 7, 12, 3, 3, 7, 12, 11, 12, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 5, 5, 5, 5, 5, 5, 5, 5, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 10, 3, 3, 3, 11, 3, 5, 9, 11, 8, 12, 14, 9, 7, 8, 7, 7, 11, 11, 7, 7, 10, 9, 8, 10, 9, 7, 7, 7, 7, 7, 7, 8, 8, 7, 11, 8, 8, 8, 7, 7, 10, 8, 7, 13, 12, 7, 17, 10, 8, 8, 11, 7, 11, 11, 14, 7, 11, 7, 8, 6, 9, 20, 8, 7, 9, 16, 7, 10, 6, 11, 10, 8, 9, 7, 16, 11, 11, 9, 8, 9, 8, 8, 8, 11, 8, 15, 8, 8, 9, 7, 8, 8, 11, 10, 7, 5, 7, 10, 10, 15, 7, 7, 7, 8, 7, 8, 8, 10, 11, 10, 10, 10, 11, 11, 7, 8, 6, 8, 8, 8, 10, 6, 8, 6, 6, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 16, 6, 15, 6, 7, 11, 11, 7, 9, 10, 11, 13, 10, 6, 16, 8, 10, 12, 11, 6, 6, 6, 6, 6, 6, 6, 10, 6, 10, 7, 7, 7, 7, 11, 7, 11, 6, 6, 6, 6, 6, 6, 17, 7, 7, 6, 6, 12, 22, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 7, 6, 6, 5, 6, 6, 8, 11, 6, 9, 14, 11, 9, 11, 7, 7, 8, 6, 6, 6, 8, 10, 9, 6, 6, 6, 6, 9, 7, 6, 6, 6, 6, 6, 15, 6, 4, 4, 4, 6, 4, 17, 8, 11, 6, 6, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 10, 6, 10, 6, 6, 6, 6, 12, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, 6, 6, 18, 6, 6, 6, 8, 9, 10, 7, 8, 9, 10, 11, 7, 13, 6, 8, 8, 6, 6, 14, 7, 7, 7, 7, 10, 7, 14, 9, 6, 6, 9, 15, 9, 7, 14, 6, 11, 14, 13, 7, 12, 8, 7, 7, 7, 7, 7, 12, 7, 10, 9, 16, 6, 8, 6, 5, 17, 6, 8, 10, 4, 6, 4, 10, 15, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 11, 7, 4, 4, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 19, 17, 6, 10, 11, 6, 6, 6, 6, 18, 6, 6, 11, 4, 4, 4, 5, 6, 6, 6, 9, 5, 6, 4, 6, 6, 4, 6, 6, 6, 6, 10, 6, 6, 4, 6, 6, 10, 6, 10, 6, 6, 6, 6, 11, 6, 6, 10, 6, 6, 8, 6, 6, 6, 8, 6, 11, 4, 11, 9, 10, 9, 11, 4, 8, 4, 11, 12, 7, 9, 8, 6, 7, 7, 8, 12, 12, 11, 13, 10, 11, 7, 7, 7, 9, 7, 11, 10, 7, 7, 7, 16, 11, 10, 11, 17, 9, 9, 8, 8, 7, 7, 7, 9, 7, 7, 7, 14, 7, 13, 9, 11, 10, 14, 10, 10, 12, 11, 10, 7, 10, 5, 14, 8, 8, 8, 9, 7, 8, 7, 7, 9, 8, 7, 8, 7, 7, 7, 7, 7, 7, 7, 11, 8, 10, 8, 7, 8, 14, 11, 8, 9, 9, 9, 8, 24, 10, 10, 12, 7, 7, 15, 11, 8, 8, 12, 11, 8, 9, 9, 7, 8, 9, 10, 11, 10, 11, 7, 12, 7, 7, 11, 9, 8, 14, 13, 12, 8, 11, 10, 8, 8, 7, 7, 14, 9, 10, 8, 9, 11, 7, 14, 8, 8, 13, 8, 8, 12, 7, 10, 14, 14, 11, 9, 10, 9, 9, 7, 7, 11, 11, 13, 9, 13, 5, 5, 5, 7, 9, 5, 11, 12, 14, 8, 7, 7, 11, 10, 9, 7, 8, 8, 7, 10, 11, 11, 5, 5, 7, 5, 5, 5, 7, 7, 15, 7, 7, 8, 7, 15, 12, 12, 10, 7, 8, 7, 11, 7, 7, 7, 23, 11, 8, 8, 11, 10, 7, 8, 11, 7, 19, 7, 7, 6, 9, 9, 9, 11, 3, 4, 7, 8, 6, 6, 4, 10, 8, 2, 2]);
2920
+ var edgeChild = /* @__PURE__ */ new Uint16Array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 1, 1, 1, 17, 1, 1, 1, 12, 1, 12, 1, 12, 13, 1, 1, 1, 1, 12, 1, 12, 1, 1, 1, 1, 1, 14, 21, 1, 1, 1, 1, 1, 1, 1, 19, 12, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 16, 1, 18, 1, 1, 15, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 22, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 12, 12, 12, 12, 1, 32, 0, 0, 0, 1, 1, 1, 1, 35, 34, 1, 1, 1, 1, 1, 33, 1, 1, 1, 1, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 39, 40, 0, 0, 0, 41, 0, 12, 1, 1, 12, 1, 1, 1, 1, 44, 45, 45, 45, 44, 45, 44, 44, 46, 45, 44, 45, 44, 44, 44, 44, 44, 44, 46, 44, 44, 44, 44, 44, 44, 45, 47, 47, 45, 44, 44, 44, 44, 44, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 52, 50, 50, 50, 52, 50, 51, 50, 53, 50, 51, 51, 50, 50, 50, 51, 53, 51, 53, 50, 51, 51, 12, 55, 55, 54, 56, 51, 53, 50, 50, 48, 49, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 60, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 67, 1, 12, 1, 1, 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 12, 1, 1, 1, 1, 89, 1, 91, 1, 1, 1, 1, 1, 1, 1, 1, 94, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 97, 97, 1, 1, 12, 1, 100, 1, 1, 1, 1, 1, 1, 1, 98, 1, 99, 1, 101, 1, 1, 1, 1, 1, 102, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 110, 111, 1, 1, 1, 1, 1, 1, 113, 113, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 121, 122, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 122, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 122, 1, 1, 1, 1, 1, 1, 1, 1, 1, 126, 123, 125, 120, 1, 124, 1, 1, 114, 1, 1, 1, 1, 117, 1, 127, 1, 1, 1, 1, 1, 119, 1, 108, 1, 109, 1, 12, 128, 106, 1, 112, 1, 1, 1, 1, 1, 107, 115, 1, 12, 12, 12, 118, 116, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 12, 12, 1, 1, 1, 1, 1, 12, 134, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 136, 1, 1, 1, 1, 1, 1, 1, 1, 137, 138, 12, 12, 135, 133, 45, 45, 140, 50, 50, 139, 142, 141, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 1, 0, 144, 132, 1, 0, 1, 12, 12, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 148, 147, 20, 1, 1, 12, 12, 1, 20, 12, 12, 1, 1, 1, 1, 1, 134, 1, 1, 152, 1, 1, 1, 1, 153, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 1, 136, 1, 1, 152, 1, 1, 1, 1, 153, 1, 1, 134, 1, 1, 1, 152, 1, 1, 1, 1, 153, 1, 1, 134, 1, 1, 1, 1, 1, 1, 1, 1, 134, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 160, 1, 1, 1, 152, 1, 1, 1, 1, 1, 153, 1, 1, 160, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 134, 1, 1, 1, 1, 152, 1, 1, 1, 1, 153, 1, 1, 1, 134, 1, 1, 152, 1, 1, 1, 1, 164, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 167, 1, 1, 160, 1, 1, 1, 1, 1, 152, 1, 1, 1, 1, 1, 153, 1, 1, 160, 1, 1, 1, 1, 1, 152, 1, 1, 1, 1, 1, 153, 1, 154, 158, 158, 12, 1, 12, 166, 1, 1, 1, 1, 1, 158, 158, 158, 154, 1, 1, 1, 157, 158, 161, 165, 1, 1, 1, 1, 157, 157, 1, 1, 156, 154, 154, 157, 170, 156, 170, 1, 1, 168, 1, 156, 155, 157, 1, 1, 1, 1, 157, 1, 159, 1, 1, 1, 12, 1, 162, 1, 162, 1, 1, 1, 162, 161, 163, 169, 156, 154, 1, 1, 1, 1, 1, 1, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 172, 173, 172, 172, 172, 172, 174, 174, 172, 173, 172, 173, 172, 172, 12, 12, 12, 12, 12, 1, 12, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 193, 1, 1, 1, 1, 12, 199, 200, 201, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 151, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 196, 1, 1, 1, 184, 1, 210, 1, 1, 1, 208, 1, 1, 205, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 190, 1, 1, 1, 186, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 182, 1, 1, 1, 1, 1, 1, 1, 191, 1, 1, 1, 1, 195, 1, 1, 1, 1, 171, 1, 1, 189, 1, 1, 1, 192, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 180, 1, 12, 1, 1, 12, 1, 1, 1, 1, 183, 1, 1, 1, 188, 1, 203, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 209, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 194, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 176, 12, 1, 1, 1, 178, 12, 1, 1, 1, 1, 1, 1, 1, 198, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 177, 1, 1, 1, 1, 1, 1, 204, 1, 1, 1, 181, 1, 1, 1, 187, 1, 12, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 191, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 175, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 185, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 207, 1, 1, 12, 1, 1, 1, 1, 179, 1, 1, 1, 185, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 197, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 202, 1, 1, 12, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 220, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 1, 225, 1, 1, 1, 0, 226, 223, 224, 1, 1, 1, 1, 1, 1, 231, 1, 233, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 229, 1, 1, 1, 1, 1, 235, 1, 1, 12, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 234, 1, 1, 1, 12, 1, 1, 1, 1, 230, 1, 1, 1, 228, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 232, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 241, 13, 1, 1, 1, 12, 12, 238, 239, 1, 1, 1, 1, 240, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 242, 1, 1, 12, 16, 1, 1, 1, 1, 1, 1, 1, 243, 1, 1, 1, 12, 12, 1, 1, 1, 1, 1, 243, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 256, 256, 1, 0, 0, 0, 0, 0, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0, 172, 261, 262, 1, 12, 1, 1, 1, 1, 12, 264, 1, 1, 263, 1, 1, 266, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 271, 272, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 12, 0, 283, 0, 0, 284, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 327, 327, 328, 327, 0, 185, 1, 1, 13, 323, 1, 321, 0, 0, 0, 0, 1, 0, 0, 0, 324, 1, 1, 329, 1, 205, 1, 1, 1, 1, 1, 322, 1, 319, 1, 325, 1, 317, 1, 326, 1, 318, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 12, 1, 12, 320, 320, 1, 1, 1, 316, 184, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 12, 1, 1, 1, 1, 315, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 332, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 266, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 372, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 340, 351, 1, 1, 339, 374, 1, 345, 1, 1, 337, 369, 1, 1, 355, 336, 341, 1, 1, 1, 348, 379, 357, 1, 1, 1, 1, 1, 1, 358, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 367, 371, 0, 0, 79, 1, 1, 0, 365, 342, 378, 343, 346, 353, 1, 368, 0, 1, 0, 79, 362, 360, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 381, 1, 1, 352, 1, 79, 1, 0, 1, 1, 1, 384, 1, 0, 0, 79, 359, 0, 1, 338, 1, 1, 1, 0, 1, 1, 361, 1, 0, 1, 1, 1, 0, 1, 386, 349, 1, 1, 0, 1, 0, 0, 377, 0, 1, 1, 1, 79, 370, 1, 1, 366, 363, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 344, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 376, 0, 79, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 380, 1, 1, 1, 0, 0, 383, 0, 0, 0, 1, 356, 1, 0, 79, 382, 1, 0, 0, 0, 0, 385, 1, 1, 0, 0, 1, 0, 1, 0, 354, 0, 350, 0, 1, 1, 1, 0, 1, 1, 0, 373, 347, 375, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 400, 400, 1, 1, 12, 12, 1, 400, 1, 1, 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 412, 1, 1, 0, 1, 1, 1, 1, 205, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 430, 430, 1, 1, 0, 0, 317, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 442, 1, 441, 1, 1, 1, 1, 1, 1, 1, 1, 445, 1, 12, 12, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 453, 1, 1, 1, 455, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 452, 1, 447, 1, 1, 1, 1, 435, 1, 1, 1, 1, 1, 1, 1, 1, 448, 12, 1, 1, 1, 1, 454, 1, 1, 1, 449, 444, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 317, 1, 433, 1, 1, 12, 451, 1, 1, 317, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 437, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 454, 1, 1, 1, 1, 317, 1, 450, 1, 1, 1, 439, 1, 1, 1, 1, 1, 440, 1, 456, 443, 1, 1, 1, 1, 1, 438, 1, 1, 1, 1, 1, 1, 1, 1, 1, 434, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 446, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 436, 1, 1, 1, 1, 1, 1, 1, 220, 457, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 462, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 12, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 466, 466, 466, 466, 466, 466, 466, 0, 466, 466, 466, 466, 466, 1, 466, 466, 466, 0, 466, 466, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 478, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 488, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 198, 198, 1, 492, 1, 1, 1, 491, 1, 1, 1, 1, 487, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 489, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 493, 1, 1, 490, 1, 1, 1, 1, 1, 1, 1, 1, 372, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 494, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 12, 1, 507, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 60, 1, 1, 12, 12, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 526, 1, 1, 1, 1, 1, 1, 1, 527, 1, 1, 1, 1, 1, 1, 1, 525, 1, 1, 12, 1, 529, 239, 1, 1, 12, 12, 1, 1, 12, 1, 12, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 539, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 132, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 107, 1, 1, 12, 1, 1, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 548, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 144, 1, 1, 1, 228, 1, 1, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 572, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 577, 1, 220, 1, 328, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 578, 1, 1, 1, 1, 0, 580, 0, 79, 0, 579, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 12, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 582, 582, 0, 585, 583, 582, 582, 582, 582, 582, 587, 582, 582, 591, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 588, 585, 582, 582, 585, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 583, 582, 582, 582, 582, 582, 589, 582, 582, 582, 582, 582, 582, 0, 0, 0, 1, 590, 1, 1, 1, 1, 584, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 595, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 12, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 65, 280, 306, 411, 535, 0, 4, 68, 236, 254, 282, 307, 334, 388, 413, 0, 499, 519, 536, 597, 9, 0, 61, 88, 398, 409, 429, 575, 0, 497, 518, 532, 612, 0, 30, 6, 0, 461, 500, 602, 560, 70, 0, 7, 285, 255, 389, 463, 416, 538, 79, 598, 0, 576, 309, 418, 465, 9, 105, 288, 506, 6, 30, 0, 311, 79, 391, 79, 483, 10, 6, 131, 248, 275, 0, 613, 509, 0, 563, 0, 64, 6, 6, 251, 95, 2, 432, 399, 410, 596, 0, 6, 0, 6, 286, 103, 6, 561, 501, 540, 0, 464, 390, 273, 287, 8, 71, 104, 599, 543, 392, 312, 300, 419, 146, 74, 290, 546, 510, 601, 564, 335, 330, 479, 6, 75, 149, 11, 0, 249, 522, 547, 565, 514, 551, 570, 611, 36, 6, 260, 295, 333, 304, 218, 30, 528, 553, 218, 42, 216, 265, 296, 305, 406, 423, 481, 274, 0, 73, 562, 0, 403, 417, 299, 79, 247, 79, 0, 581, 545, 504, 292, 421, 79, 393, 387, 0, 0, 0, 9, 555, 571, 217, 0, 424, 407, 531, 516, 573, 615, 85, 218, 43, 297, 396, 425, 569, 0, 511, 293, 276, 79, 215, 80, 28, 390, 30, 6, 394, 331, 303, 604, 592, 524, 550, 513, 0, 258, 81, 30, 405, 422, 0, 30, 426, 0, 219, 593, 517, 9, 408, 427, 218, 248, 86, 222, 594, 574, 557, 482, 428, 397, 250, 227, 87, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 129, 0, 0, 84, 549, 0, 0, 0, 0, 0, 0, 0, 27, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 503, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 281, 0, 0, 0, 0, 0, 530, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 314, 0, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 568, 0, 0, 0, 0, 600, 521, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 62, 0, 0, 0, 267, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 279, 610, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 0, 278, 0, 0, 0, 0, 0, 0, 567, 0, 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 502, 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 520, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 0, 614, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 544, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 29, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 558, 0, 270, 0, 0, 130, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 0, 414, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 415, 0, 0, 401, 0, 0, 0, 0, 0, 0, 603, 0, 0, 0, 541, 0, 0, 90, 0, 542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 508, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 618, 0, 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 605, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 623, 623, 623, 623, 623, 623, 623, 622, 624]);
2921
+ var labelText = "orgmilcomschnetedugovdrrformsfeedbackofficialaccoorgmilschnetgovmagazinemediaunioncargopilotgroupcaarespressworksaerodromeworkinggroupair-traffic-controlaircraftaccident-preventioneducatormarketplaceambulanceinsurancecateringairportrepbodyenginesoftwaremodellingair-surveillanceconsultingchartertrainermaintenanceservicesdesignflightskydivingfreightassociationstudentgroundhandlingdgcafuelclubtaxicrewshowballooningexpresstraderbrokerauthoragentsairtrafficjournalistsafetyconsultantmicrolightaccident-investigationparachutingequipmentproductionfederationrecreationscientistnavigationengineertradingglidingleasingresearchpassenger-associationentertainmentparaglidinghangglidingaerobaticrotorcraftemergencycertificationgovernmentaeroclubexchangelogisticschampionshiphomebuiltcouncilconferencecontrolairlinecivilaviationjournalorgcomnetedugovcoorgcomnomnetobjofforgcomnetuwukiloappsframerorgmilcomnetedugovcoradioorgcomnetcommuneedogpbcoitgvorgedugov*spreviewfrontendrelayononstagingupid*mtls*privatelinktypedreamdeveloperbravemochawindsurfaivenmirenupsunwnextbegetngrokclerkwale2bwebcsbrunputerflutterflowspawnbaseshiptodaymagicpatternsnetlifyondigitaloceanrailwayhostedclaudehasurabotdashvercelgithubluyanigadgetreplitcloudflaretelebitedgecomputeevervaultdetaexponyatnoopencrpplxzeaburwasmerframerzeropsconvexmedusajsspritesonherculeseasypanelstreamlitsnowflakemesserliloginlinehackclubnorthflankbase44corespeedadaptableleapcellngrok-freeclerkstagelovableon-fleek*us-west-3ap-south-2us-central-2us-central-1eu-central-1ap-south-1us-west-2us-east-2eu-north-1ap-north-1us-west-1us-east-1*rcloudintsegorgmilcomgobbetnetintedugovturmusicasenasamutualcoopip6uriurnin-addre164homeirisgovdixdaemoncloudnssthwien*inexexkunden4accogvormymyspreadshop4lima2ixortsinfofuturecmsfuturehosting12hpprivfuturemailinglima-cityfunkfeuer123webseitednshomemelmyspreadshopcloudletswasantqldvicactnswtascatholicwasaqldvictasvpsidwasantozqldorgcomvicasnactnetedugovnswtasconfhrsncomairflowlambda-urltransfer-webappairflowtransfer-webapptransfer-webapptransfer-webapp-fipstransfer-webappeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1privatenotebookstudiolabelingnotebookstudionotebooknotebook-fipslabelingnotebookstudionotebook-fipsnotebookstudio-fipsnotebook-fipsnotebookstudionotebook-fipsnotebookstudioeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2experimentsus-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1onrepostsagemakercopporgmilcompronetintedugovbiznameinfoshoprsorgmilcomnetedugovbrendlyresolvenzauscotvstoreorgcomnetedugovbizinfoidacaicoittvorgmilcomschnetedugovinfocloudezproxyacmymyspreadshopkuleuvenwebhostingtransurl123websitecloudnsinterhostsolutionsddns5476103298edgfacbmlonihkjutwvqpsryxzbarsycoororgcomedumyftpno-iporxcloud-ipfor-somemmafanfor-morewebhopselfipjozidyndnscloudnsdscloudfor-thefor-betteractivetrailcoeconorestooteorgcomeconeteduassurmoneyafricaarchitectesrestaurantloisirstourismavocatsinfoagrounivcoorgcomnetedugovtvdeportesaludtksatorgmilcomwebgobnetinteducienciaboliviarevistacooperativaempresanombreindustriamusicapatriamedicinademocraciapoliticapuebloindigenaplurinacionalarteblogwikiinfoagrotransportenoticiasprofesionalacademiaeconomiaecologiamovimientotecnologianaturalsimplesitecepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesmscepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesms*biaamfmtcmptvfeirasampajampanatalbelemananiradiog12medindfndbmdtrdthepoaggfjdfdefinfenflegsegongengcngorgzlgslglogppgmillelqslcimcomnomadmjabimbbibbsbabcrectecsjcetcpscpvhudieticriapipsiecnbiorioecogeoteoodoproatoartfstmatvetdetbetnetcntnotfotgrueduajuespappreptmpemparqsrvadvdevgovntrturagrjorfarjusmusdesvixxyzcozfozslzbhzmaringasantamariacampinagrandegoianiasorocabafloripasaobernardocuritibaboavistarecifeaparecidasaogoncasalvadorcuiabamorenamacapalondrinacontagemsocialfortalmaceioleilaoosascoriobranconiteroi9guacutcheblogflogvlogwikitaxicoopmanauspalmascaxiasjoinvillebaruericampinassantoandreribeiraoriopretoweorgcomnetedugovv0windsurfshiptodaycloudsitecoaccoorgnetgovofmilcomgovmediatechzacoorgcomnetedugsjgovmydnspenfnlabnbmbgcbcqconcontnuyksknsmyspreadshopno-ipawdevboxbarsyonidatemfuinabusavinstanceseceuguukussryzespawncsxcloud-ipmyphotosfantasyleaguetwmailcleverappsscrappingccwucloudnsftpaccessgame-serverccgovobjectsrmalpgcust*svcalp1aeappenginermalpgmyspreadshop4lima2ixsquare7cloudscale123websitefirenet12hpflowgotdnslinkyard-cloudcloudnslima-citydnskingobjectstorageedaccogoorusorgcomnetintedua\xE9roportxn--aroport-byaassogouvcomilgobgovcloudnses-1eu-west-1us-east-1euvipit1eurarubait1s3lbwebsites3websiteru-spbru-mskelasticcsrunstnukukcaukusnl-ams-1fr-par-1fr-par-2functionsnodess3ddlwhmrdbfnck8sifrs3-websitecockpitscblmgdbdtwhkafkpubprivs3ddlwhmrdbk8sifrs3-websitecockpitscblmgdbdtwhkafks3ddlrdbk8sifrs3-websitecockpitscblmgdbdtwhkafkk8sscalebookpl-wawfr-parnl-amsbaremetalsmartlabelinginstancesdechk2kuleuvenlaravelvoorloperurownoxazapscwhstgrvaporobservablehqelementorantagonistreclaimjoteluluencowaydiademjelasticmatlabmagentositetrendhostingaxarnetperspectajenv-arubajelejoteravendbemergenttrafficplexconvexkeliwebserveboltbegetcdnstaticson-rancherprimetelonstackitunison-servicesdnshomelinkyardbarsyjelecloudnscocomnetgovmycn-northwest-1cn-north-1s3s3-accesspoints3-websites3s3-accesspointrdsdualstacks3-deprecatedemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspoints3s3-accesspointrdsdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicn-northwest-1cn-north-1cn-northwest-1ebcomputeelbcn-north-1airflowcn-northwest-1cn-north-1oncn-northwest-1cn-north-1amazonawssagemakeramazonwebservicesdirectasgdsdhehahljlnmhbacscahqhshhihnlnynsnmofjbjzjxjtjhkcqtwgsjssxnxjxgxxzgz\u7DB2\u7D61\u7F51\u7EDC\u516C\u53F8orgmilcomnetedugovxn--55qx5dcanva-appsxn--io0a7iquickconnectcanvasitekhsjxn--od0algmyqnapcloudsrvrlessclustersrealtimestorageleadpagescarrdcrdorgmilcomnomnetedugovhidnssupabaserdpareplmypiumsoxmitotaplpagesfirewalledreplitowodevwebview-assetsvfswebview-assetss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecateds3-websites3-object-lambdaexecute-apis3s3-accesspoints3-websites3-accesspoint-fipss3-fipss3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9vfss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1us-northeast-1ap-southeast-1me-south-1af-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1mrapaccesspoints3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3eu-west-3ap-south-2eu-south-2computes3-ap-northeast-2elbrdss3-ap-east-1s3-sa-east-1s3-us-gov-west-1s3-eu-central-1s3-ca-central-1eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3s3-website-us-west-2s3-website-eu-west-1s3-external-1eu-central-1me-central-1ca-central-1il-central-1s3-us-west-1s3-eu-west-1s3-website-sa-east-1s3-website-ap-southeast-2ap-northeast-1ap-southeast-1s3-us-west-2s3-eu-west-2me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2s3-website-ap-southeast-1s3-1s3-globals3-ap-northeast-3eu-north-1airflowap-southeast-2s3-us-gov-east-1s3-fips-us-gov-east-1s3-me-south-1s3-ap-south-1ap-northeast-2s3-website-us-west-1ap-southeast-5s3-eu-north-1s3-ap-southeast-1s3-website-us-gov-west-1compute-1s3-eu-west-3us-gov-west-1s3-website-ap-northeast-1us-gov-east-1s3-fips-us-gov-west-1s3-website-us-east-1s3-ap-southeast-2ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3-us-east-2s3-ap-northeast-1authauthauth-fipsauth-fipseu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1rservicesbuilderstg-builderdev-builder*ociocpocsdemoinstanceeu-west-3eu-south-2ap-southeast-3ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1previeweu-4us-4us-1eu-1us-2eu-2us-3eu-3appspaasrag-cloudrag-cloud-chjcloudjcloud-ver-jpcdemonodebalancermembersipeuxvsoncillaocelotonzayalilynxsphinxfentigercustomercaracalo365cloudstaticxendevapp001testcode-builder-stgplatformapimediasiteprojedrydpagesjsu2u2-localx0desazacncoitrueu4uhkukgrbrushatenadiarymyspreadshopfrom-flfrom-wvwebspace-hosttheworkpchatenablogservesarcasmapplinzisakuratanwixsiteappchizigiizeis-into-carsdnsiskinkyadobeaemcloudis-a-therapistpgfogmyvncdojinis-an-actress1kappfldrvkozowqa2jpnmexprgmrfirewall-gatewaydynnscafjsfbsbxooguyxnbayfrom-gawoltlab-demois-a-anarchistwiardwebteaches-yogadattowebtb-hostinglive-websiteservegamegotpantheonfrom-nhsubsc-payfrom-ohvipsinaappfrom-cadyndns-officehomelinuxfrom-mahercules-appservebbsstreakusercontentfrom-okfrom-wyfastly-terrariumis-a-llamaqualyhqportalserveexchangeon-vaporvivenushopciscofreakgrayjayleaguesmetaaiusercontentfrom-iais-a-libertariansaves-the-whalestaveusercontentyolasiteoperaunitepoint2thisis-a-catererlinodeusercontentfrom-vagithubusercontentsells-for-lesshosteurcanva-appsplaystation-cloudddnsfreefrom-pafrom-prfrom-waddnskingoutsystemscloudhotelwithflightmydattois-a-nascarfanmydbserverminiserverdamnserverservehumouris-a-playerfrom-nvfrom-nmemergentagentgentappsamplifyappfrom-kyis-an-accountantnfshostserveircfrom-akpythonanywherestackhero-networkpostman-echolikescandydyndns-mailobservableusercontentserveftpfreeboxosfrom-utcdn77-storageamazonawsneat-urldyndns-serverlinodeis-a-teacherfrom-vtgleezemythic-beastsus1-pleniteu1-plenitla1-plenitpaywhirlservecounterstrikejdevcloudhealth-carereformis-into-animegoogleapisis-a-painterafricaisa-hockeynutatmetais-an-actora2hostedis-a-democratdatadetectest-le-patrondigitaloceanspacesis-a-designeris-a-hunterlinodeobjectstemp-dnsissmarterthanyoufrom-arsimplesiteevennodetownnews-stagingis-a-liberalgooglecodejelasticservemp3stdlibqualyhqpartnerdyndns-free1cooldnsest-a-la-masiondrayddnsdynuddnsfrom-orfrom-miis-a-bloggerfrom-himydobisscanvacodeis-an-engineerest-a-la-maisonupsunappdevinappswafflecellmyasustorwpenginepoweredfrom-ctservep2psame-appmyshopblocksthingdustdatalikes-piediscordsezis-with-thebanddev-myqnapcloudlpusercontentis-leetshopitsite3utilitiesis-a-personaltrainersinaappladeskis-a-cheflogoipselfipbase44-sandboxnospamproxyalibabacloudcsmesswithdnsauthgearappsiamallamawithgooglelutrausercontentmochausercontentframercanvasmytabitdyndns-homew-credentialless-staticblitzcpserverdiscordsaysis-a-nurseappspotatlassian-isolated-3premotewdfrom-mtwixstudiocode0emm180rmyactivedirectoryawsappsmytuleapdnsabrpolyspaceqbuserrenderbuiltwithdarkboutirgotdnsabrdnsdopaascanva-hosted-embedawsglobalacceleratorhomesecuritypcmyiphostditchyouripclever-clouddyndns-ipon-aptibleis-a-musiciansecuritytacticsappspaceusercontenthomeunixstrapiappsame-previewcf-ipfsmycloudnaselasticbeanstalkis-certifieddontexistkasserverik-serverdrive-platformatlassian-3pfirebaseappherokuappawsapprunnerbarsycenteris-a-cubicle-slaveservehttpmyshopifyis-a-guruquicksytessiiitesorsitesmagicpatternsappis-a-cpameteorappfrom-wiis-a-rockstarbumbleshrimpdattolocalreadthedocs-hostedfrom-rifamilydsdyndns-picsplesknsbplaceddnsaliasdynaliasdyndns-remotedoomdnsip-ddnsblogdnsis-a-doctorroutingthecloudamazoncognitobarsyonlinedsmynasddnsgurucloudflare-ipfsdeus-canvasfrom-idsmushcdnpagespeedmobilizerdyndns-at-homeunusualpersonhosted-by-previderis-a-republicandyn-o-saurstreamlitappworkisboringonthewificprapidqualifioappis-uberleetis-slickgetmyipwpdevcloudtypeformdyndns-at-workgentlentapismynascloudw-corp-staticblitzfrom-ingeekgalaxyservebeerfrom-mdonrenderspace-to-rentaivencloudappspacehostedonfabricawafaicloudcodespotblogspotatlassian-3p-us-gov-modfrom-ndfrom-msis-a-techieis-a-studentcustomer-ociis-a-photographerdurumisfrom-ksmassivegriddyndns-wikiis-an-entertaineris-a-hard-workermysecuritycamerafrom-mnrackmazedyndns-blogis-a-bulls-fanwritesthisblogfreemyipsimple-urlfrom-sdreservdauthgear-stagingest-mon-blogueuris-into-gamesrice-labsxtooldevicesakurawebis-an-anarchistoraclecloudappsdyndns-worksells-for-urhcloudfrom-dcfastvps-serverwpmucdnis-a-geekscrysecfrom-txis-into-cartoonsmodelscapetrycloudflarelocaltonetstreak-linkbalena-devicesfrom-njforgeblocksfreebox-oswebadorsitefrom-ncdoesntexisthobby-sitestreaklinkshomesecuritymacownprovidertuleap-partnersdattorelaywphostedmailalpha-myqnapcloudservequakeis-a-socialistservehalflifepivohostingdynuhostingquipelementsw-staticblitzdyndns-webfrom-deproject-studyaliases121is-not-certifiedhercules-devis-a-financialadvisorservepicsis-a-greenloseyouripfrom-ilwithyoutubemwcloudnonprodwiredbladehostingdnsdojofrom-tnpixolinomyqnapcloudis-an-artisthostedpiis-a-landscaperauiusercontentoaiusercontenton-forgeis-a-conservativedreamhostersnet-freaksapps-1and1is-goneencoreapifastly-edgefrom-nesalesforcefrom-scdeployagentoraclegovcloudappsfrom-alis-a-lawyercechirevultrobjectsstufftoreadisa-geekddnsgeeklovableprojecttry-snowplowfrom-moblogsyteis-a-bookkeepernogmyforumravendbmyboxdeelementoredsaacficogoorinforgcomgobnatneteduidstoreorgcomnetintedudevnomepublorgcomneteduathgovtestscalculatorspaynowinfoquizzesresearchedcloudnsfunnelsassessmentsjscaleforcetmacltdorgmilcompronetgovbizpresseklogesrsccloudcustomfltusrcloude4corealmgovmunicontentproxy9metacentrumdyndyndyndnsdynpagespages-researchitionoccustomercomymyspreadshopipv64diskussionsbereich4limacomrub2ixfirewall-gatewayddnssspdnsbarsykeymachinesquare7myhome-serverspeedpartnercommunity-proschuldockxenonconnectg\xFCnstigliefernbwcloud-os-instancedyndnssecmy-routerxn--gnstigliefern-wobin-butterl-o-g-i-nisteingeekin-dslin-berlinin-brbfuettertdasnetzleitungsenin-vpnlcube-serverdyn-ip24logoipdyn-berlinruhr-uni-bochum12hpgoipsrvdnsfruskygit-repossvn-reposinternet-dnsg\xFCnstigbestellenhome-webserverxn--gnstigbestellen-zvbbplacedheimdnscosidnswebspaceconfiglima-citydyndns1istmeinvirtualuserschulplattformmy-gatewayddnsseclebtimnetztest-iservmein-iservvirtual-userhome64iservschuletaifun-dnstraeumtgeradeschulserverdynamisches-dns123webseitednshomehs-heilbronndnsupdaterbssgraphicdwadpdwdaepeweaawapaafpfwfabwbpbacwcpcciwebuserapiobjectsidsiskospockkimodorikerbonesteamsparisjanewaypicardglobaltarpitreedpikekiraworfsulukirkarchertuckerhackercanarywesleystagingprereleaset3r2lpbravepanelngrokiservstglclcrmerpflypagesbarsyvivenushoplocalcertlocalplayerbearbloggatewaydeno-stagingis-not-ais-a-goodbotdashvercelmocha-sandboxplatter-appreplitgithubpreviewworkersinbrowserevervaultdetais-ahrsndenoxmitmodxmyaddrstorageapipayloadgrebedocruncontainersstgstagelclstageloginlineis-a-fullstackleapcellngrok-freeis-coolstoragewebharemediatechlibp2pdiscourseimaginecomyspreadshopstoreregbiz123hjemmesidefirmcoorgcomnetedugovsldorgmilcomwebgobartnetedugovtmorgpolcomsocartnetedugovassoagrondiscoodontk12medcuegyecpaabgengorgmilgalsaltulcomadmesmgobpubdocmonfindgnriouioproartlatvetnetfotedulojgovntrturibrbarxxxofficialbasechefprofmktgpsictechinfoarqtcontdentrrpppsiqgit-pagesritmedfieorgcomlibprieduaipgovriikmeactvsportorgmilcomscieunnetedugovnameinfopintouchtawktotawkmyspreadshoporgcomnomgobedu123miwebcomputeorgcomnetedugovbiznameinfocognito-idpeusc-de-east-1onjelasticnxaspdnsbarsydirectwpdeuxfleurstransurldogadoprvwcloudnsamazonwebservicesdnshomeuserpartycokoobinmkmstorjfidemopaasdymyspreadshopalandkapsiikixn--hkkinen-5wacloudplatformdatacenterh\xE4kkinen123kotisivuidacorgmilcompronetedugovbiznameinforadioorgcomneteduuserexperts-comptablestmmyspreadshopgretaprdcomnomynhccifbxoshuissier-justicenotairesaeroportfreeboxoson-webavocatassoportgouvkdnschirurgiens-dentistes-en-franceavouesfbx-os123sitewebveterinairechirurgiens-dentistespharmacienchambagrimedecinfreebox-osdediboxgoupilemszicpyicpvicppleysheezypagesedugovcnpyorgcomcybllcpvtnetedugovtnxonlineschooldaemond6atcopanelorgnetplybotdashstackitkaasorgmilcomnetedugovbizmodltdorgcomedugovcoorgcomneteduappwriteacorgcomnetedugovcloudtranslateusercontentorgcomnetedumobiassoorgcomnetedugovbarsysimplesitediscourseindorgmilcomgobneteduorgcomwebnetedugovguaminfonxhra\u6559\u80B2\u654E\u80B2\u7DB2\u7D61\u7F51\u7D61\u7EC4\u7E54\u7D44\u7E54\u7F51\u7EDC\u7DB2\u7EDC\u7EC4\u7EC7\u7D44\u7EC7\u516C\u53F8\u653F\u5E9C\u500B\u4EBA\u4E2A\u4EBA\u7B87\u4EBAltdorgcomincneteduidvgovxn--uc0ay4axn--55qx5dxn--mk0axixn--io0a7ixn--uc0atvxn--zf0avxxn--lcvr32dxn--od0algxn--wcvs22dxn--gmqw5axn--od0aq3bxn--mxtq1mxn--ciqpnxn--tn0agxn--gmq050iorgmilcomgobneteduiservwp2tempurlmircloudfreesitewpmudevmyfastgadgetcloudaccessjelehalfboltfastvpsemergenteasypanelopencraftizcombrendlynamefromrtpersoadultmedorgpolrelcomproartnetedufirminfoassoshopcoopgouvtmcomediahotelforumvideosportorgsexagrargameslakaseroticaerotikatozsdereklamcasino2000filmsuliinfoboltshopprivnewsszexcityutazasjogaszkonyveloingatlaneacaicogoormy\u1B29\u1B2E\u1B36milwebschnetkopbizzonedesaponpesxn--9tfkymyspreadshopgovmytabittabitorderravpageaccok12idforgnetgovmuniltdplcaccotttvorgcomnetmeca6g5gpgamubacaicniocoukuptverdruscsdelhiindorgmilcomwebnicfingenpronetintedugovresbizbiharbarsyinternetbusinessschooltravelsupabasealumnigujaratfirminfoaeropostbankcoopindevscloudnsno-ipbarsybarrell-of-knowledgebarrel-of-knowledgensupdategroks-thisdnsupdatefor-ourknowsitalldvrcammittwalddynamic-dnsv-infowebhopselfipdyndnshere-for-moreilovecollegemayfirstforumzcloudnsmittwaldservertypo3servergroks-theeusekd1uk0cdndyndnsidrawsainaueuapjpusstagemocksysdevicesclientcustreservdcustdevdisrecprodtestingcobeebyteutwenteboxfusebravepstmndedynngrokorgmilcomnomhzcnetedugovqcxqzzbarsythingdustmo-siemensrb-hostingprotonetfh-muenstergitbookbluebitecloudbeesusercontentnodeartkiloappsforgerockdarklangresinstagingapigeebubbleb-datascryptedhypernodedappnodepantheonsitegitlabgithubkeeneticvirtualservercleverappshostyhostingon-rioedugitticketstelebiton-acornwixstudioon-k3sicp0icp12038jeleqotobigvlairbubbleappsmyaddrstolosmyrdbxwebflowdrive-platformbeagleboardhasura-applolipopdefinimavaporcloudmusicianwebflowtestazurecontainerresindevicereadthedocsloginlineeditorxmoonscalesandcatsbasicserverwebthingsbrowsersafetymarkbeebyteappbitbucketidaccovistablogorgschnetgovxn--mgba3a4f16axn--mgba3a4fraarvanedge\u0627\u064A\u0631\u0627\u0646\u0627\u06CC\u0631\u0627\u0646jclaspeziapdudcefegelemeperetevebacanatavaparasabgagfgogrgpgalclblimfmrmcbmbvbfclcmcvcrcpcchlimifibicivipirisimncnbnanenrnpntnnolomobocoaogorosopotoptvtatctbtmtltotpulunutpspapaqsvpvvvtvavvrtrsrprgrfrcrbrarorkrvstsssbscsmsispzczbzbozen-suedtirolmyspreadshopxn--bulsan-sdtirol-nsbxn--valledaoste-ebbtrentinoaltoadigetrentin-sued-tirolxn--forlcesena-c8axn--forl-cesena-fcbxn--bozen-sdtirol-2obtriestetrentinsuedtiroltrentino-s-tirollecceudineaostesienaparmaluccapaviagenoapaduaaostamonzaabruzzoternirietiturinmilanbozenlaziofermoleccocuneonuoropratola-speziavdataaligfvgpugmolcalcamlomumbsicpmnvenvaoedugovabrsarmaremrbastoslazibxosfirenzetrentinos\xFCdtirolval-d-aostavalle-aostamessinacremonaravennatoscanatrentin-suedtirolbolognacalabriaurbinopesarofriuli-v-giuliaogliastraxn--valle-aoste-ebblaquilaandriatranibarlettasyncloudtrentinosudtirolxn--valle-d-aoste-ehbaostavalleyvalled-aostatrentino-alto-adigevallee-d-aostexn--balsan-sdtirol-nsbpistoiasicilialucaniacataniaiserniaperugiabresciaveneziagorizialiguriaimperiabulsan-suedtirolbalsan-suedtirolbarlettatraniandriaxn--trentino-sdtirol-szbforl\xEC-cesenatuscanyvall\xE9e-d-aostemantovavall\xE9e-aostecasertapiemontevalleaostaval-daostafriulivgiuliatrevisoforli-cesenavall\xE9edaosteferrarapescaravald-aostatrentino-altoadigefriuli-vegiuliavallee-aostecarboniaiglesiastarantomediocampidanovalleedaostetrentinosud-tirolcampobassotrentins\xFCd-tiroltrentinos\xFCd-tirolmonzabrianzatrentino-s\xFCdtirolxn--trentino-sd-tirol-c3bpotenzacosenzavicenzaemiliaromagnavenicefrosinonemarchepordenonetrentinosued-tirolvaresemolisevall\xE9eaostefriuli-veneziagiuliabasilicatalatinaanconasavonaveronamodenaaquilabiellabolzano-altoadigepugliafoggiaumbriatrentino-stirolgenovapadovamateranovararagusapiacenzatrentinostirolvalleeaostetempio-olbiatrentinsudtirolmassa-carrarafriuliveneziagiuliatrentinosuedtirolandria-barletta-tranitrapanixn--cesenaforl-i8amaceratacaltanissettaascoli-picenobrindisicarraramassacagliaririmininapolivibo-valentiachietibulsan-sudtirolbalsan-sudtiroltrentino-a-adigebulsanbalsaniglesiascarboniamilanotorinoteramodell-ogliastraarezzotrentinoalto-adigerovigotrentovenetoiglesias-carboniatrentino-sud-tirolaltoadigereggio-emiliareggio-calabriasardegnatranibarlettaandriapiedmontxn--sdtirol-n2amedio-campidanotrentino-s\xFCd-tirolfriuli-vgiuliafriuli-ve-giuliaromeennaromapisa32-b16-b64-blodiastibarineencomonaplesforlicesenailiadboxosalessandriasicilytrani-barletta-andriaxn--trentin-sdtirol-7vbpesarourbinotrentinsued-tirolcesena-forliforl\xECcesenaemilia-romagnamonzaebrianzaxn--trentinsdtirol-nsbtrentinos-tiroltrentins\xFCdtirolvalledaostaolbia-tempiocampidanomediovibovalentiasassarivalle-daostalombardyfriulivegiuliareggioemiliamonzaedellabrianzaalto-adigevercellitrentin-sudtiroltraniandriabarlettatrentino-sudtirolascolipicenobozen-s\xFCdtirolfriulive-giuliaflorencevaldaostaxn--cesena-forl-mcbcarbonia-iglesiasaosta-valleycarrara-massadellogliastratrentinoa-adigexn--valleaoste-e7apesaro-urbinoxn--trentinosdtirol-7vbxn--trentin-sd-tirol-rzbxn--trentinsd-tirol-6vbtrani-andria-barlettatrentin-s\xFCd-tirolxn--trentinosd-tirol-rzbgrossetomonza-e-della-brianzas\xFCdtirolreggiocalabriatrentinoaadigetrentin-s\xFCdtirolfriuliv-giuliaverbaniacampaniatrentino-aadigefriulivenezia-giuliasardiniaandriabarlettatranibarletta-trani-andriacatanzarooristanourbino-pesarocesena-forl\xECvalle-d-aostacampidano-medio123homepagesiracusatempioolbiasuedtirollombardiaavellinocesenaforl\xECtrentinofriuli-venezia-giuliabozen-sudtirolandria-trani-barlettabulsan-s\xFCdtirolbalsan-s\xFCdtirolmonza-brianzabolzanotrentino-sued-tirolbellunosalernolivornocrotonesondriodnshometrentinsud-tirolmassacarraratrentin-sud-tiroltrentino-suedtirolviterbobergamocesenaforliolbiatempiopalermobeneventoagrigentoofcoorgnetfmaitvphdengorgmilcomschnetedugovperagrikanieasukehandachitatokaiaisaikonanoharuamaobuhigashiuraowariasahiinuyamatobishimaiwakurashitarainazawatoyonegamagorimihamatoyotataharakariyayatomioguchikomakimiyoshinishiotokonamekiyosuchiryutoyohashiokazakiisshikikasugaikotakiratoeianjotogofusosetohazutsushimashinshirotakahamanisshinshikatsuhekinantoyokawaichinomiyatoyoakeodateogataakitaikawakyowahonjoogayurihonjonoshirokamiokakatagamimitanegojomeyokotekosakadaisenkazunonikahohonjyomoriyoshimisatohappoukamikoanihachirogatahigashinarusesembokufujisatokitaakitaitayanagiowanitakkomutsutsurutahirosakigonoheoirasetowadamisawanohejiaomorishingohiranairokunohehashikamitsugarushichinohehachinohenakadomarisannohekuroishisakaeisumiasahiotakiinzaiabikomatsudoyachiyomutsuzawakujukuriomigawakashiwatoganemihamanaritasakuranagaramobarahanamigawachoshishiroichoseikozakishisuikatorimidorichonankyonanfuttsuonjukufunabashinagareyamanodasosatakochuotohnoshourayasukimitsuyokaichibayotsukaidosodegauratateyamakamagayayokoshibahikariyachimatakatsuuratomisatokisarazukamogawaichikawanarashinoichinomiyashimofusaminamibososhirakoichiharaoamishirasatoikatahonaiainansaijoseiyoiyoozuuwajimaniihamanamikatamasakiuchikokihokutobetoonshikokuchuomatsuyamaimabarikamijimakumakogenyawatahamamatsunosabaeikedaobamasakaifukuiohionotsurugamihamawakasaminamiechizeneiheijikatsuyamatakahamaechizensoedaukihaomutaokawanishiogoribuzenonojosueumiokiotochikugosasagurisaigawamizumakishinyoshitomikurumekurateyamadakasuganakamamiyamanogatatakatahakataiizukakawaratagawakasuyaashiyainatsukimunakataminamitsuikishonaikurogifukuchikeisenhigashimiyakoshinguyukuhashiokagakiyamekogaongausuikahotohochuotoyotsumiyawakadazaifuhisayamatachiaraiyanagawanakagawahirokawachikujochikushinochikuhochikuzennamieotamaokumashowateneiiwakikoorinangoononishigoshimogoomotegomishimafukushimaasakawakagamiishishirakawaiitatefutabahiratayugawahanawakitakatakawamatakunimiyabukibandaihigashihironoyamatomiharuyamatsuriaizubangedatesomaaizuwakamatsuyanaizuaizumisatonishiaizuizumizakikitashiobarataishinkaneyamakoriyamainawashirotanagurafurudonosamegawasukagawaishikawatamakawaikedaogakitaruiginanenahashimahichisonakatsugawaibigawashirakawamizunamiminokamomitakekawauesekigaharatomikasakahogikitagatayamagatatajimianpachimotosuyaotsukakamigaharahidakanisekitokigujominogodoyorogifukasamatsutakayamawanouchihigashishirakawakasaharashimonitatsumagoichiyodakannakanrashowameiwakiryuotaoratomiokafujiokaitakuranaganoharahigashiagatsumatakasakishibukawaminakamikatashinatsukiyonokawabanumataannakaoizumimidorishintoisesakiuenoyoshiokakusatsutakayamanakanojonanmokutamamuratatebayashimaebashiotakekaitadaiwahongofuchukuietajimashobaramiharahatsukaichihigashihiroshimamiyoshikumanokurenakasakaseraseranishiasaminamifukuyamashinichionomichiosakikamijimajinsekikogentakeharaotobenanaeikedatohmaozoraobiraabirakyowaeniwataikibibaisharirebunerimohiroooketootarupippunishiokoppechitosefurubirahakodateshiranukakitahiroshimakushiroobihironanporoiwamizawaniikappukunneppufukushimanakasatsunaitoyourakuromatsunaiakabirakamisunagawashibechaurakawakamifuranonakatombetsuasahikawashimokawakayabeokoppebiratoriabashirisaromaatsumanumatahidakabifukamukawamikasahorokanaitoyotomisarufutsuhigashikawaishikarikitamiyoichiesashiiwanaitomariminamifuranoakkeshifuranotoyakoyakumootoineppushikaoishiraoinemuronayorohaboroashorobihororishirifujiutashinaihokutotakasuebetsuurausuassabukikonaishimamakinaiedatetoyabieinikiesanuryuoumuteshikagarikubetsuashibetsukimobetsuaibetsutobetsusobetsuembetsushimizuchippubetsurishirihokuryuhoronobeshintokutsubetsushibetsuhonbetsumombetsutsukigatakuriyamakoshimizushiriuchikutchanmurorannoboribetsukamishihorowassamushinshinotsukembuchiwakkanaikamoenaikiyosatotakinoueshikabesunagawafukagawanakagawatakikawakamikawahigashikagurahamatonbetsumatsumaemoseushirankoshishakotanimakanemashikeotofuketomakomaisandatambaitamiawajikasaiasagoshisoonoakoyashirotoyookaminamiawajiinagawafukusakitakasagokamigorikasugaharimayokawaashiyahimejiakashitaishiaogakisannantakinosumototakarazukanishinomiyashingugoshikinishiwakiyokatakaaioimikisayoyabukawanishiamagasakisasayamashinonsenkakogawaichikawakamikawatatsunotsukubaiwamaogawaasahisakaitokaioaraiitakobandodaigosuifuinaamikasumigaurakashimaomitamayachiyoshimodatetomobetoridehitachinakainashikisakuragawakasamayawaramoriyahitachiomiyanamegatayamagatahitachikamisuushikutakahagiibarakitonekoganakasowayukimihojosomitoryugasakishimotsumafujishirotsuchiurachikuseihitachiotashirosatotamatsukuriuchiharashikahakuinanaotsubatawajimakahokukawakitatsurugikaganominotosuzuuchinadakomatsuanamizunakanotohakusannonoichikanazawaiwateshiwafudaikawaimoriokaofunatohanamakikuzumakikitakamininohekunoheyamadayahabasumitaichinosekitanohatahiraizumirikuzentakatajobojiotsuchihironomiyakoiwaizumikarumaiichinohenodakujitonooshushizukuishifujisawamizusawakamaishikanegasakimannoutazukotohiraayagawazentsujihigashikagawauchinomikanonjisanukimarugamemitoyotakamatsutadotsunaoshimatonoshoakuneamamiizumihiokiyusuikinkoisasookouyamanakatanekagoshimakanoyaisenkawanabeminamitanemakurazakitarumizunishinoomotematsumotosatsumasendaioimatsudaayaseebinamiurazushinakaiodawaraiseharasagamiharahakoneaikawakaiseiatsugitsukuihadanoyamatoyamakitazamaoisochigasakininomiyayokosukakamakuraminamiashigarafujisawasamukawakiyokawahiratsukayugawaraokawaumajikochitsunootoyoakiinonishitosayasudahidakamiharasakawaniyodogawahigashitsunokagamigeiseisusakiotsukinaharisukumomurototosakamiochitoyotosashimizumotoyamanankokunakamurakitagawayusuharaogunichoyoukiasoutoozugyokutoamakusamifunetakamoriyamagaminamataminamiogunikikuchisumotoyamatonagasumashikiaraokumamotokamiamakusanishiharayatsushiroayabeseikasakyoideineujinakagyokameokakyotangokyotanabekyotambaminamiyamashiroyamashinatanabeyawatawazukaminaminantanmiyazuhigashiyamafukuchiyamakitamukokamojoyokizumaizuruujitawaraoyamazakinagaokakyokumiyamakawagoeinabeshimameiwaasahitaikiudonoisetsukisosakikuwanamihamamiyamasuzukatamakimisuginabarikumanokomonominamiisewataraitobakiwatakikihotadomatsusakayokkaichikameyamaureshinoishinomakishichikashukuohirataiwaosakizaohigashimatsushimashikamaiwanumashibataogawaraonagawakawasakiseminemarumoriminamisanrikukakudamuratawakuyatomiyanatoriwataritagajomisatotomekamirifushiroishimatsushimayamamotoshiogamafurukawahyugaebinotsunosaitoayakushimanobeokakitauramiyazakitakazakigokaseshiibamimatashintomikunitomikitakatakobayashikawaminamitakaharukijotakanabemiyakonojonishimeranichinankitagawakadogawamorotsukakisofukushimaminamimakisakaeobuseikedaogawamiasaokayaasahiotakiotarichinoinaomichikumakomaganechikuhokukaruizawayasuokaooshikaikusakaminamiaikitogakushimatsukawakawakamitateshinatakamorikitaaikishiojirimiyadahakubaiizunaiijimaiiyamamiyotasuzakayasakatoguraookuwanagawaminowahirayayamagataminamiminowafujimiomachisakakitakaginaganonakanosakuhokomoronagisoshinanomachiwadauedaiidaharasuwatomiachiaokianankisosakunozawaonsenagematsutakayamashimosuwamatsumotoyamanouchinakagawamochizukiazuminotatsunoobamaomuraseihiunzenosetofutsuikichijiwanagasakiisahayahasamisaikaikawatanasasebohiradokuchinotsugototogitsutsushimashimabarashinkamigotomatsuurayamazoekashibaikomakawaitenrioyodosangokoryoudaojiikarugayamatokoriyamatenkawakatsuragikurotakikawakamimiyakemitsuetakatorikamikitayamayamatotakadahegurishinjokanmakisakuraitawaramotogoseoudanarasoniandokawanishishimoichihigashiyoshinokashiharashimokitayamanosegawayoshinomintsivorytopazsakuragehirnsumomoaseinetopalmail-boxmokurenyoitamuikaojiyagosensanjoaganomyokoseiroagaomishibataniigatanagaokamurakamiuonumayuzawakariwatagamitainaitsunanminamiuonumatochioyahikojoetsuseiroukamosadoizumozakitokamachiitoigawasekikawakashiwazakitsubamemitsukekokonoesaikiusukibeppuusahimeshimakunisakihasamataketatsukumihitaoitahijikusuyufukujukamitsuebungoonobungotakadaibaraniimibizentsuyamaokayamakasaokahayashimayakagemaniwaakaiwamisakishinjotamanotakahashikibichuowakesojanagishookumenannishiawakurakurashikiasakuchisetouchikagaminosatoshotomigusukunakagusukuyaeseizenaurumaiheyaaguniogiminanjokinminamidaitokitanakagusukuyonaguniokinawaishigakikunigamiurasoekadenataramahiraraginozataketomishimojizamamitonakiitomanhigashimotobuyonabarugushikamionnanahanagohaebarukumejimakitadaitonakijinnishiharayomitanginowantokashikiishikawaikedasuitaminohizuminishisakaikananabenodaitoosakasayamayaokishiwadatadaokakaizukatondabayashichihayaakasakakumatorikadomasayamahigashiosakashijonawatehirakatataishimisakitajirihannansennankatanotoyonominatosettsuhigashiyodogawaibarakinosekitachuohigashisumiyoshifujiiderakashiwaraizumiotsutoyonakamatsubaramoriguchiizumisanoshimamototakatsukineyagawahabikinotakaishikawachinaganoyoshinogarikamiminearitaouchiimarihizenogikashimaariakekiyamafukudomikitagatakitahataomachigenkaikanzakinishiaritakyuragisagataratosutakushiroishikaratsuhamatamakouhokukawagoeyoshidasatteogoseirumaasakaurawaogawaniizaomiyayoriiotakishikihonjooganohannohanyuinasaitamaokegawaarakawayoshikawayokozehasudasayamahidakafukayachichibuiwatsukiryokamiyoshimikamiizumifujimiwarabiranzanmiyoshiminanoyashiosakadosugitomisatohigashichichibutodasokakukiyonokazoshiraokakasukabekounosukawajimatsurugashimamiyashirokitamotohatoyamamoroyamahatogayakumagayakawaguchinagatorokamisatomatsubushinamegawatokigawakamikawafujiminohigashimatsuyamakoshigayatokorozawas3isk01isk02ryuohkoseikonanaishorittotakashimamaibarahikonetorahimenishiazaikokagamokotoyasuotsukusatsunagahamamoriyamatoyosatotakatsukinotogawaomihachimanhigashiomiakagiunnanizumogotsuamayatsukakakinokimatsuehamadamasudahikawahikimiokuizumoyasugiyakumomisatotamayuohdahigashiizumookinoshimanishinoshimatsuwanoshimaneshimadafujiedayoshidashimodagotembaiwataatamikosaiyaizuitoizumishimahaibaramakinoharaomaezakikawanehonkannamisusonohigashiizufukuroinumazukawazufujiaraishizuokahamamatsushimizuizunokunimatsuzakimorimachiminamiizunishiizukikugawakakegawafujikawafujinomiyaujiietsugaoyamayaitaohiranikkoashikagakuroisokanumasakurashioyakarasuyamamotegiichikaikaminokawatochigihagamokanogisanobatonasumibunasushiobaranishikatautsunomiyaiwafunemashikoshimotsukeohtawaratakanezawaitanokomatsushimatokushimaichibaminamiaizumiwajikikainanmiyoshinarutomimamugiananmatsushigesanagochishishikuinakagawamachidachiyodakomaefussainagitaitochofufuchuomeotahigashiyamatotoshimaokutamaaogashimakodairaedogawaarakawahachiojishinagawatachikawashibuyasuginamihinodekiyosesumidaoshimanerimamitakahamuraadachinakanomizuhobunkyomegurominatokoganeihigashikurumekokubunjihigashimurayamamusashimurayamatamakitahinochuokotokatsushikakouzushimaogasawaraakishimakunitachishinjukusetagayamusashinohachijoitabashiakirunohinoharachizunanbukotouramisasawakasayonagokogehinoyazutottorinichinansakaiminatokawaharaoyabetairainamiasahinantoimizufuchutakaokakurobeyamadajohanatoyamatonaminyuzenfunahashinakaniikawanamerikawaunazukitogahimiuozufukumitsutateyamakamiichiiwadearidayuasainamitaijikatsuragiaridagawatanabemihamahidakakainankiminomisatoshingushirahamakamitondayurakozakoyagobokitayamawakayamakudoyamahashimotokushimotokozagawahirogawakinokawanachikatsuurarsuseroeoishidasagaeoguniasahinagaitendonanyoobanazawanishikawasakataohkuratozawamikawamamurogawayamagatafunagatatakahatashonaishinjokahokuiideyuzakawanishitsuruokakaminoyamayamanobeshiratakamurayamanakayamakaneyamahigashineyonezawasakegawamitouubeyuuabushimonosekitabuseoshimatoyotaiwakunihikarishunannagatohagihofukudamatsutokuyamashowadoshitsurunanbukoshukaiminami-alpsnirasakikosugeotsukioshinohokutominobuyamanashifuefukichuokofuichikawamisatoyamanakakonakamichitabayamanishikatsuranarusawafujikawahayakawafujiyoshidafujikawaguchikouenohara\u9577\u91CE\u4EAC\u90FD\u5C90\u961C\u5927\u962A\u4E09\u91CD\u7FA4\u99AC\u5343\u8449\u6ECB\u8CC0\u4F50\u8CC0\u5948\u826Fadednelgaccogogror\u79CB\u7530\u611B\u77E5\u9AD8\u77E5\u57FC\u7389\u6C96\u7E04\u6803\u6728\u718A\u672C\u5CA9\u624B\u9752\u68EE\u5C71\u68A8\u65B0\u6F5F\u5CF6\u6839\u9CE5\u53D6\u9577\u5D0E\u9999\u5DDD\u5BAE\u57CE\u77F3\u5DDD\u5927\u5206\u5BAE\u5D0E\u8328\u57CE\u5C71\u53E3\u5175\u5EAB\u5C71\u5F62\u5FB3\u5CF6\u5E83\u5CF6\u798F\u5CF6\u798F\u5CA1\u5CA1\u5C71\u5BCC\u5C71\u9759\u5CA1\u611B\u5A9B\u798F\u4E95\u6771\u4EACxn--4it168dhatenadiaryxn--vgu402ckawaiishophatenablogcocottenamaste\u5317\u6D77\u9053penneehimeiwateversestabachibashigagonnagunmapermahaccaakitaosakauh-ohblushkochiaichifukuikuroncapooitigohyogotokyokyotopunyuthickcheap0t00g00j0mie2-ddaapyawjg0amfemsubxiiboomoobutchueekpgwrgrherskrboyrdyupperunderflierchipsmydnsheavyangryhippygirlyrulez\u795E\u5948\u5DDD\u9E7F\u5150\u5CF6\u548C\u6B4C\u5C71bambinaxn--nit225kokayamasaitamaxn--k7yn95exn--1lqs03nsapporoparasitelolipopmcxn--efvn9sniigatafukuokatokushimafukushimahiroshimakagoshimafakefurokinawaxn--8pvr4ucoolblogxn--0trq7p7nnkawasakinagasakimiyazakichilloutxn--8ltr62kxn--klty5xpeeweezombiecutegirlxn--rny31hxn--uuwu58axn--ntso0iqx3axn--djrs72d6uytoyamanikitanyantakagawamimozanagoyaboyfriendxn--2m4a15egreaterchowderegoismyamagatafashionstorexn--elqq16hxn--pssu33lsendaimiyagixn--rht27zpecoriaomorisaloonwatsonvivianxn--djty4knobushipigboatnaganopinokoxn--f6qx53asadistvelvetsecretxn--5js045dchicappayamanashiibarakidigickgirlfriendxn--1lqs71dmongolianxn--c3s14mxn--qqqt11mtochigixn--5rtq34kparallelo0o0mondkobesagabonadecaoitanarafoolkilldecimainhiholomosblokilociaoundopupugifutankcrapflopnooroopsmodsholyjeezstripperpepperbittershizuokaxn--rht3dkitakyushureadymadeicurusversusmatrixxn--rht61ehungryfloppygloomycrankyhandcraftedlittlestarxn--klt787dxn--kltx9awhitesnowsunnydaytottorilovepoptheshopbuyshopxn--5rtp49cxn--d5qv7z876cwebaccelxn--kbrq7oxn--4pvxsxn--1ctwolovesickkumamotocatfoodxn--tor131oyokohamawakayamatonkotsuxn--ehqz56nxn--uist22hxn--6btw5axn--kltp7dyamaguchifrenchkisspussycatxn--4it797kxn--uisz3gbabybluexn--zbx025dnetgamersxn--7t0a264ckanagawaxn--6orx2rishikawaxn--ntsq17ghalfmoonschoolbusjellybeanxn--mkru45iusercontentlolitapunkxn--32vp30hsakurastoragehokkaidoshimanecandypopbabymilksupersaleweblikeraindropbackdropwebsozaikikirarahateblodaynightmeneacsccogoormobiinfoaeusxxorgmilcomnetedugovorgcomnetedugovbizinfotmprdorgmilcomnomedugovassnotairespresseassocoopgouvveterinairemedecinpharmaciensorgnetedugovtraorgcomedurepgovmeneperekgacscaiiocogoitoresmshsseoulbusanulsandaeguc01milvkimmvchungnamjeonnamjeonbukeliv-dnsgyeonggijejueliv-cdnincheondaejeongangwongyeongbukgwangjuchungbukgyeongnameliv-apicoeduindorgcomembnetedugovorgmilcomnetedugovjcloudorgcomnetintedugovperbnrinfocooyorgcomnetedugovipfscanvamypepw3sstorachakeeneticjoinmcinbrowserdwebcyonnftstoragemyfritzaemewphlxachotelltdorgcomwebsocschngonetintedugrpgovassnomgacsccoorgnetedugovbizinfo123websiteidorgmilcomasnnetedugovconfidmedorgcomplcschnetedugovaccoorgnetgovpresstmassoirseproxaccosoundcasthoptocraftvp4c66orgnetedugovitsmcdirmyboxbarsyedgestacksynologylogintonohostwebhopdiskstationi234tcp4hoocgroknoipprivmydsddnsdnsforlohmustransipdscloudfilegear-sgbrasiliafilegearframerbarsybarsyonlinecoprdorgmilcomnomedugovinforgcomnetedugovnameacprorgcomartnetedugovpresseinfoassoinstgouvorgnycedugovbarsydscloudjuorgcomnetedugovminisiteaccoororgcomnetgovorgmilcompronetintedugovbizmuseumnameinfoaerocoopaccoorgcomnetintedugovbizcooporgcomgobneteduorgmilcomnetedugovbiznameaccoorgmilneteduadvgovcoorgcomnetaltgovforgotherhiskeeneticispmanagernomassoprod5476132eastasiacentraluswesteuropewestus2eastus2rucdnwest1-usfra1-desandboxjls-sto1jls-sto3jls-sto2aglobalabglobalsslmapprodfreetlsmaplon-1lon-2ny-1fr-1sg-1ny-2paassnwebpaashostingjelasticnordeste-idcsocuserpagescwebfileblobservicebuscoreatlricnjsjelasticwebsitestoragesezagbinruhuukjptsmyspreadshopmynetnameakamaiorigin-stagingfrom-coipv64dynv6cdn77serveblogadobeaemcloudhicamsprytdnsupno-ipownipde5ovhicpfirewall-gatewaysytesmypsxbarsyusgovcloudapimyamazemyradwebakamaihdsaveincloudfastlylbfrom-lasubsc-paysquare7in-the-bandblackbaudcdnhomelinuxoninfernoctfcloudservebbsdns-dynamiccloudfrontakamai-stagingipifonyham-radio-opsenseeringclickrisingcommunity-profrom-nylocalcertgrafana-devedgesuite-stagingcloudflareanycasteating-organicatlassian-devmydattofeste-iplocaltotorprojectknx-serveredgekeycloudflareglobalcloudyclustercasacamserveftpakamaized-stagingakamaiorigindns-cloudmyeffectboomlabotdashbuyshousestwmailhetemlazure-mobilein-dslthruhereredirectmedynuddnsbouncemesupabaseluyanicloudappakamaicloudfunctionsdebiannhlfanpgafanstatic-accessin-vpnmysynologymafeloappudohomeftptrafficmanagersiteleafseidatmemsetcloudflarecloudaccesskeyword-onazure-apiis-a-chefdoes-itgets-itwebhopselfiphomeipkicks-assedgesuitewindowsserver-ontunnelmolemydissentscrapper-sitecloudflarecnuni5srcfggffiobbzabcdenodynuopikddnsvpndnsakadnselastxkinghostvps-hostfastlyhomeunixazureedgeshopselectdontexistmyfritzcloudjiffyalwaysdatasells-itsquaresbroke-itazurefddattolocalat-band-campmeinforumfamilydsazurestaticappsdefinimabplaceddnsaliasdynaliasnow-dnsblogdnsroutingthecloudendofinternetdsmynasakamaiedgemymediapcadobeio-staticakamaiedge-stagingakamaihd-stagingddns-ipprivatizehealthinsurancelive-onkrellianschokokeksmassivegridmysecuritycamerarackmazeserveminecraftfrom-azis-a-geekakamaizedmoonscalecryptonomicoffice-on-theusgovtrafficmanageradobeioruntimeedgekey-stagingreserve-onlinechannelsdvrdnsdojousgovcloudappcdn77-sslapps-1and1podzoneazurewebsitesdynathomescaleforceyandexcloudvusercontentisa-geekcdn-edgescoaemalcesappwriteazimuthtlonarvonoticeablestorecomwebrecnetperotherfirminfoartslgdloncogoiltdorgmilcolcomplcschgenngonetedugovbiznamefirmmobiacincoorgmilcomnomwebgobnetintedubizinfocomyspreadshopdemongovtransurl123websitehosting-clusterkhplaycistrongsnesosvalerv\xE5lerxn--vler-qoaossandeheroysandeher\xF8yb\xF8boheroyher\xF8yxn--hery-iraxn--b-5gavalerb\xF8boxn--b-5gasandesandexn--hery-iraxn--vler-qoav\xE5lerh\xE5re\xE5laahavaofsfvfhlolnlalrlhmfmtmahcostntbu\xE5strmreigersundmyspreadshopg\xE1ls\xE1eidsvolltingvollgildeskalflor\xF8vads\xF8vard\xF8vanylvenxn--bhccavuotna-k7astrandaxn--kvnangen-k0axn--sknland-fxaxn--mosjen-eyarakkestadhyllestadnannestadvevelstadvaapstenordre-landsondre-lands\xF8ndre-landtjieltexn--vrggt-xqads\xF8r-aurdalsor-aurdalheradstordmoldefordef\xF8rdeseljefedjeryggehemnexn--krehamn-dxasognegranes\xF8gnebrynetjomevallebykletokkegiskedovretj\xF8mehob\xF8lvoldasaudatolgas\xF8mnaviknad\xF8nnasomnadonnatranafrananesnaraumasmolatr\xE6nafr\xE6nalesjasm\xF8la\xF8rstaorstahitrafloraaukraloppafr\xF8yarissasnasahalsagalsaromsaraisar\xE1isafroyasn\xE5sagronghobolfjelltydal\xE5rdalardalaskimharamkraanghkekr\xE5anghkesorumbarumhurumb\xE6rums\xF8rummodums\xE1l\xE1tb\xE1l\xE1tfrognbjugnv\xE5ganvagangulenskienl\xF8tenlotenstrynvefsnxn--merker-kuaskaunsveiob\xF8mlobomloskj\xE5kvardoflorovadsosalatbalats\xE1latkl\xE6buklabuselbubarduulvikskjakkleppris\xF8rxn--nttery-byaefl\xE5eidflahofmilgolholsellomskifetvikdepvgsfhsaskerrisorhamarasnes\xE5snesr\xF8rosrorosxn--slat-5namasoynaroyvaroyluroydyroyaskoyradoyandoyrodoymeloyrad\xF8yand\xF8yr\xF8d\xF8ymel\xF8yask\xF8ylur\xF8ydyr\xF8ym\xE5s\xF8yv\xE6r\xF8yn\xE6r\xF8yhoylandeth\xF8ylandetdivtasvuodnal\xF8renskoglorenskognesoddtangenxn--tjme-hraxn--smla-hraxn--stjrdal-s1aunjargalillehammerunj\xE1rgaxn--hamary-fyadavvenjargaxn--bearalvhki-y4a123hjemmesidegjerdrumxn--brnnysund-m8acxn--tnsberg-q1axn--mlatvuopmi-s4axn--snsa-roaxn--skierv-utaxn--brum-voatysfjordkvafjordeidfjordkv\xE6fjordsongdalenmjondalenmj\xF8ndalenxn--gls-elackragerog\xE1\u014Bgaviikagangaviikas\xF8rreisasorreisas\xF8r-varangersor-varangerxn--risr-iraskiervaxn--frna-woaxn--trna-woakvinesdalleksvikleirvikr\xF8yrvikroyrviksvelvikvenneslaevje-og-hornnessandnessj\xF8enmarnardalvindafjordsandefjordenebakksnillfjordullensvangxn--trany-yuabr\xF8nn\xF8ysundnamsskoganaustevollxn--stjrdalshalsen-sqbnord-aurdalnord-frontr\xF8gstadtrogstadgrimstadflakstadgjerstadxn--sandy-yuaxn--leagaviika-52bnore-og-uvdalvegarsheixn--rlingen-mxaxn--ggaviika-8ya47hveg\xE5rsheikarlsoykvitsoymasfjordenhamaroyinderoyosteroydavvenj\xE1rgasauheradguovdageaidnuxn--vre-eiker-k8abronnoysiellakkr\xF8dsheradkrodsheradkvinnheradbr\xF8nn\xF8yxn--mtta-vrjjat-k7afxn--lrenskog-54akvits\xF8yv\xE1rgg\xE1tkarls\xF8yoster\xF8yinder\xF8yhamar\xF8ybronnoysundxn--aurskog-hland-jnbbahccavuotnab\xE1hccavuotnagiehtavuoatnastor-elvdalmidtre-gauldalxn--gildeskl-g0akarasjokevenassixn--bievt-0qaxn--yer-znalebesbynessebyxn--hbmer-xqamalselvm\xE5lselvxn--unjrga-rtam\xF8re-og-romsdalmore-og-romsdalhareidmeland\xF8rlandorlandstrand\xE5lg\xE5rdsolundalgardafjord\xE5fjorddielddanuorrikautokeinoxn--stre-toten-zcbskodjeaejriestangeliernebamblestokkefauskesn\xE5asesnaasekongsvingerlangevagberlevagxn--flor-jrahattfjelldalostre-toten\xF8stre-totenvestfoldxn--mely-ira\xE1laheadjualaheadjunordreisaxn--troms-zuaxn--lgrd-poacporsangerflatangerstavangerleikangerbremangersamnangergieldakarasjohkaxn--rdy-0nabfrostautsirasnoasatromsaxn--sr-aurdal-l8aflekkefjordj\xF8lsterjolsteraremarkhedmarkn\xE5\xE5mesjevuemienaamesjevuemiexn--vard-jrarollagmer\xE5kermerakerorskog\xF8rskogxn--bdddj-mrabd\xE1k\u014Boluoktaxn--osyro-wuaaknoluoktatrysilskjerv\xF8ymandaljondalbindalrindalmeldalsuldalorkdalsigdalalvdall\xE6rdalhurdalsirdalverdallerdallardaloppdal\xE5seralaseralhadselkrager\xF8divttasvuotnaoverhallasteinkjerxn--hnefoss-q1askedsmokorsettroms\xF8xn--dyry-iravestre-totenmuseumxn--sandnessjen-ogbrahkkeravjufylkesbiblb\xE1jddarbajddarxn--laheadju-7yarennes\xF8yxn--koluokta-7ya57hxn--hgebostad-g3aleirfjordstorfjordbalsfjordb\xE5tsfjordbatsfjordmuos\xE1tbiev\xE1tloab\xE1tk\xE1r\xE1\u0161johkan\xF8tter\xF8yxn--mjndalen-64anordkappl\xE1hppilahppialstahaugsiljanverranr\xF8ykenroykenhaldenlyngenbergenhortenh\xF8nefosshonefosstroandinbeiarnvarggatosoyroos\xF8yrotromsoidrettmuosatbievatruovatloabatvoagattynsetnessetxn--indery-fyask\xE1nitskanitraholtr\xE5holtxn--ystre-slidre-ujbandebusarpsborgbearduxn--karlsy-fyahordalandjorpelandj\xF8rpelanddeatnuringsakers\xF8r-odalsor-odalxn--slt-elabringerikeaudnedalnittedalnissedalhemsedalslattumsurnadalxn--blt-elabelverumstj\xF8rdalnaustdalhjartdalgj\xF8vikfyresdalhasviknarviklarvikgjovikmalvikgamviklenvikporsgrunnstjordalengerdaldrobakdr\xF8bakxn--msy-ula0hvestvagoyxn--vgan-qoaxn--ryken-vuaxn--lten-graxn--stfold-9xaxn--hpmir-xqaxn--lury-iram\xE1latvuopmimalatvuopmitysv\xE6rkirkenesbirkenesmoskenesb\xE1id\xE1rxn--fjord-lraxn--rdal-poabahcavuotnab\xE1hcavuotnaxn--frde-gralind\xE5sbearalvahkixn--hobl-irar\xE1hkker\xE1vjuxn--loabt-0qav\xE5g\xE5\xE1lt\xE1bod\xF8sundlundrader\xE5deetnetimeholeauregrueoddavagavegaranatanaarnasolasulaaltalekafusavangbergkvam\xE5mliamlibokntinnroangranosenoslobodor\xF8stroststat\xE5motamotivgupriv\xF8yeroyerliermossvossxn--nvuotna-hwalusterlunnermarkerh\xE1bmerhabmerhvalerfjalerxn--rholt-mratysvarbaidarfitjargaularh\xE1pmirhapmirmelhusfosnes\xF8ksnesoksnestysneshemnesevenesflesbergeidsbergtonsbergt\xF8nsberglindasxn--sndre-land-0cbnamsosxn--srum-gra\xF8ystre-slidreoystre-slidrevestre-slidretrondheimbalestrandxn--langevg-jxaaustrheimxn--skjk-soavagsoyaveroysandoykarmoyfinnoytranoyvestbytranbysykkylvenxn--hyanger-q1aspjelkavikandasuoloxn--fl-ziaxn--drbak-wuastathellexn--sr-varanger-ggbtelemarkxn--bhcavuotna-s4axn--porsgu-sta26f\u010D\xE1hcesuolocahcesuoloakrehamn\xE5krehamnsand\xF8ykarm\xF8yfinn\xF8ytran\xF8yv\xE5gs\xF8yaver\xF8ynamdalseidxn--lesund-huabadaddjaxn--vegrshei-c0axn--btsfjord-9zagildesk\xE5lporsanguxn--trgstad-r1an\xE1vuotnanavuotnahammerfestxn--sgne-graxn--brnny-wuacibestadharstadnarviikaeven\xE1\u0161\u0161ivestnesgjemnessandnesagdenesrennesoyxn--avery-yuaxn--tysvr-vrabearalv\xE1hkikongsbergspydebergrandabergxn--andy-iradavvesiidaxn--krdsherad-m8apors\xE1\u014Bgufredrikstadbjerkreimringeburennebuaurskog-holandnotteroyxn--vgsy-qoa0jxn--rmskog-byaskierv\xE1ivelandbyglandfrolandaurlandforsandxn--bjddar-ptamidsund\xE5lesundalesundfetsundfarsundovre-eiker\xF8vre-eikerakershusxn--moreke-juas\xF8rfold\xF8stfoldostfoldsorfoldh\xF8yangerhoyangerlevangerorkangertanangerxn--vestvgy-ixa6olillesandulsteinxn--rennesy-v1agranvinskjervoyxn--klbu-woalavagisxn--h-2faxn--ryrvik-byakafjordk\xE5fjordseljordfolkebiblxn--gjvik-wuajevnakerxn--kfjord-iuabudejjuxn--kranghke-b0axn--davvenjrga-y4axn--rland-uuaxn--ldingen-q1axn--mlselv-iuaxn--rady-iraxn--linds-prabrumunddalxn--ygarden-p1amo-i-ranaeidskogr\xF8mskogromskoghjelmelandxn--finny-yuaxn--sr-odal-q1axn--skjervy-v1aballangenkvanangenkv\xE6nangengratangenxn--hmmrfeasta-s4acvossevangensuohkanxn--rde-ulaxn--mli-tlaxn--ksnes-uuanordlandskanlandsk\xE5nlandsortlandfuoiskuxn--rros-graxn--hcesuolo-7ya35bxn--eveni-0qa01gagaivuotnag\xE1ivuotnaxn--seral-lradrammenmodalenmosjoenjan-mayentorskensteigengloppenxn--snes-poamatta-varjjatxn--sr-fron-q1aomasvuotnajessheimb\xE5d\xE5ddj\xE5xn--krager-gyaxn--kvfjord-nxaxn--asky-iraxn--snase-nraxn--bidr-5nacholt\xE5lenxn--vads-jraxn--jlster-byamosj\xF8enxn--rst-0nastavernxn--ostery-fyaxn--oppegrd-ixaxn--sknit-yqaxn--risa-5naoppeg\xE5rdskiptvetrendalenholtalenxn--mot-tlaxn--lhppi-xqaxn--holtlen-hxaxn--srreisa-q1akopervikxn--muost-0qaxn--bmlo-grahokksundkvalsundegersundxn--karmy-yuaullensakerxn--hylandet-54axn--kvitsy-fyaxn--bod-2nalangev\xE5gberlev\xE5gkristiansandxn--rsta-frahornindalstj\xF8rdalshalsenstjordalshalsensandnessjoenh\xE1mm\xE1rfeastaxn--lrdal-sras\xF8r-fronsor-fronnord-odalkristiansundm\xE1tta-v\xE1rjjatvestv\xE5g\xF8ynesoddennotoddenbuskerud\xF8ygardenoygardensalangenlavangenralingenr\xE6lingenlodingenl\xF8dingenlea\u014Bgaviikalaakesvuemieleangaviikauenorgexn--srfold-byaaskvollxn--rskog-uuaxn--nry-yla5gxn--vry-yla5ghammarfeastaxn--rhkkervju-01afxn--givuotna-8yakommunekrokstadelvanedre-eikerhagebostadh\xE6gebostadxn--berlevg-jxakviteseidxn--s-1faxn--l-1faxn--nmesjevuemie-tcbafuosskomo\xE5rekemoarekexn--lt-liacxn--jrpeland-54asvalbardoppegardholmestrandtvedestrandsogndalsokndalarendalsunndalfolldalxn--krjohka-hwab49jlyngdaletnedalnorddalsaltdalgausdalskedsmovaksdalgjesdalstordalxn--frya-hraaarbortedrangedalxn--smna-graaurskog-h\xF8landxn--vg-yiabtjeldsundhaugesundlindesnesxn--mre-og-romsdal-qqbxn--dnna-gradynmerseineshacknetenterprisecloudmineaccomaorim\u0101oriorgmilcriiwigennetschoolhealthkiwigovtgeekxn--mori-qsacloudnsparliamentcomedorgcompronetedugovmuseumwebsitekinservicebarsywebsitebuildereerobookheimdnsleapcelleero-stagetechcrscsslorigingohomecdbedeeeiemesecabgngilnlalplchfisiincnnoroptatitmtltruauhulumkdkukskjplvtrgrfrkrhrusesismycynzcznetinteduassoososcloudstgbetaaezaeuhkusjshatenadiarycdn77hoptozaptois-a-knightmyftpno-ipjpnddnssdpdnsspdnsbarsysweetpepperis-a-bruinsfanis-very-sweetservegameis-a-soxfanhomelinuxcdn77-secureservebbsmisconfusedwebredirectblogsitefreedesktopcouchpotatofriestoolforgeaccesscamis-lostreadmyblogsmall-webfedorapeopleserveftpis-a-celticsfanmywirepotagertwmailin-dslsellsyourhomeread-booksfreeddnscable-modemis-savednflfanufcfanmlbfanstuff-4-saleendoftheinternetin-vpnmy-firewallhomeftpis-localis-a-chefboldlygoingnowherewebhopselfipkicks-assroxatunkcamdvrfedoraprojectgotdnsdvrdnsdyndnspubtlspimientahomeunixdontexistfedorainfracloudwmflabsfspagesbmoattachmentsteckidsfamilydsdnsaliasdynaliasnow-dnscloudnsdoomdnsduckdnsblogdnshomednsroutingthecloudendofinternetdsmynasip-dynamicpoivronhttpbinmyfirewallis-very-evilmysecuritycamerais-a-linux-userwmcloudis-a-geektuxfamilyis-a-candidatedoesntexistis-very-badhobby-sitegame-hostaltervistais-foundis-a-patsfandnsdojohepforgepodzonedynservcollegefanis-very-goodfrom-meis-very-niceisa-geeknerdpolacmedsldingorgcomnomgobabonetedupleskaemhlxmyboxrockyprvcydeuxfleurspdnscodebergheyflowstatichostorgmilcomnomgobneteduorgcomeduiorgmilcomngonetedugovcloudns1337ngrokacorggogfamcomwebgobnetedugokgopgkpgovgosbizpasaugumicsopozpapuwmwsrprusiskwpspkppspkmpspokeoiawsawifoumsdnskokwpmuppuppsppiwwiwoowuzswkzoschrzpisdnwzmiuwwitdpssewsseumigugimoirmpinbwinbwiihupporzgwgriwupowwskrwioswuozstarostwokonsulattmpccopruszkowmyspreadshopostrodakartuzyopolegminamediaustkazgorajgoraolawailawalomzawloclradombytomjaworznotargilubinkoninzagantorunkutnokepnonakloczestsopotsanokturekplockslasksklepzarowlukowmedaidgdaorgmilrelcomnomatmgsmartneteduelkgovwawsossexbiztgorysejnytychypomorzeboleslawiechomesklepsdscloudunicloudzakopanelegnicarawa-mazbydgoszczswidnikkrasnikwloclawekbielawamragowograjeworealestatebeskidykaszubymalopolskaprzeworskswiebodzinlecznadfirmaszkolawarmiagdyniamiastakazimierz-dolnymalborkswidnicadlugolekaostrolekapodlasieelblagtravelsimplesitezachpomormielecszczecinnieruchomosciwalbrzychlezajsklublinbedzinpoznanwielunmielnooleckostarachowicedkontopowiatwroclawrybniksuwalkileborkslupskgdanskostrowwlkptarnobrzegtourismwegrowkrakowglogowyou2pilanysamailwrocinfoagroautobeepshopprivlapypiszlodzcfolksecommerce-shopmazurypulawyskoczowrzeszowpomorskiezgierzkaliszolkuszlowiczostrowiecsosnowiecmazowszewodzislawbialowiezazgorzeleckatowicepabianicejelenia-gorawolominkarpaczsieradznowarudaczeladzkonskowolaskierniewiceswinoujscieturystykabieszczadycieszynketrzynolsztynbialystokbabia-goraprochowicewarszawastalowa-wolapolkowicegorlicegliwiceponiatowalimanowalubartowaugustowkobierzyceopocznognieznoszczytnokolobrzegshoparenapodhalebielskoklodzkostargardatwithplayitownnamecoorgnetedugovacorgcomproestnetedugovbiznameislaprofinforechtngrokmedaaaacacpaenglawjurbarbarsykeeneticavocatacctcloudnsorgcomsecplonetedugov123paginaweborgcomnetintedugovnomepublidkinbarsygovx443cloudnsorgmilcomnetedugovcooporgmilcomschnetedugovnamecomcannetlibassoaemclantmcontstoreorgcomnomrecwwwbarsyfirminfoshopartsstackitmyddnswebspacelima-cityacincooxorgedugovbarsybrendlyhbvpsvpsspectrumlandinghostingacppmordoviamcprecbgorgmilcomspbnetintedumsknovgovbirrasmcdirmytismircloudvladimirnalchikadygeyamarinepyatigorskmyjinobashkiriaeurodirvladikavkazna4ugroznykustanaikalmykiacldmaildagestaniranbuildcanvaliaravalwixdevelopmentappwritemigrationneedleverceldatabasestackitcodereplravendbonporterlovableaccoorgmilnetgovcoopmedorgcompubschnetedugovservicemecomygovorggovtvmedorgcomnetedugovinfoedgfacbmlonihkutwpsryxzbdtmacfhppmyspreadshopbrandpartiorgcomfhvpress123minsidaitcouldbeworlanbibkommunalforbundfhskiopsyskomvuxkomforbnaturbruksgymnloginlineorgcomnetedugovenscaledeuusentbotdaorgmilcomnetgovnowteleporthashbangplatformlovablebarsyshopwarebasehoplixbarsyonlinemsf5gitappgitpagecofigma-govcaffeinefigmacanvasoltstputerbarsysupportchatgptsquareomniweopensocialcpanelnotionnovecorewpsquaredpreviewjelecyonbyensrhtfastvpspieboxconvexjouwwebheyflowplatformshloginlinemadethissourcecraftclouderaorgorgcomartedugouvunivmeorgcomnetedugovsurveysstatichfheiyuxs4allprojectmyfastubervibehostapp-ionosdeployagentmecoorgcomschnetedugovbizcncostoreorgmilcomneteduembaixadaconsuladokiraranohoprincipesaotomeheliohobarsystorebaseshopwaresellfyabkhaziavologdamordoviapenzalenugsochinavoiexnetspbmsknovnorth-kazakhstanashgabadkareliaarmeniageorgiavladimirnalchikivanovobukharaadygeyakhakassiakalugakrasnodarjambylaktyubinsktroitskbryanskobninskkurganazerbaijanpokrovskbashkiriatselinogradvladikavkazmurmansktulatuvamangyshlaktashkentchimkentgroznykaragandatermezarkhangelskkustanaikalmykiabalashoveast-kazakhstankaracoldagestantogliattibarsyredorgcomgobedumirenknightpointaccoorgjelasticdiscoursecleverappsschacmiincogoornetonlineshopcogoorgmilcomwebnicnetintedugovbiznametestcoorgmilcomnomnetedugovorangecloudpersoindorgcomfinnatnetgovensmincomtourismintlinfox0611oyaorgmilcomnetedugovquickconnectvpnplusnettprequalifymeaddrmyaddrntdllwadlnctvavdrk12orgmilpolbeltelcomwebgennetedutskkepgovbbsbiznameinfocoorgmilcompronetedugovbiznameinfobetter-thanworse-thansakurafromdyndnson-the-webmymailerorgmilurlcomneteduidvgovmydnsgameclubebizmeneacsccogotvorhotelmilmobiinfovodteiflgplkmsmsbcckhincndnvncoztltmkckppzpdprvcvkvlvcrkrkscxuzchernovtsyrivneyaltaodesavolynrovnolutskltdinforgcomnetedugovbizvinnicazhitomirternopilpoltavakropyvnytskyizaporizhzhiasevastopolsebastopoluzhgoroduzhhorodkharkovkharkivvinnytsiakhmelnytskyizaporizhzhecrimeaodessazhytomyrnikolaevcherkassydonetskluganskluhanskkirovogradivano-frankivskchernivtsikrymkievkyivlvivsumyzakarpattiamykolaivcherkasychernigovkhersonchernihivdnipropetrovskdnepropetrovskkhmelnitskiyneacsccogoorusorgmilcomedugovvmdhmyspreadshopadimono-ipbarsybytemarkbarsyonlinelayershiftnh-servretrosnubapicampaignservicelugaffinitylotteryweeklylotteryraffleentrygluglugsmeaccoindependent-inquestnimsitecopropymntltdorgplcschnetgovnhsbarsyindependent-commissionindependent-reviewpolicepublic-inquiryindependent-panelconnhospindependent-inquiryroyal-commissionoraclegovcloudappscck12libccphxcclibpvtparochchtrcck12libcceatonk12coglibtecgendstmusann-arborwashtenawcck12glghcck12sealibforksolympiabainbridge-islkeyporthoquiamyarrow-pointcentraliaport-townsendsequimport-ludlowrentonsilverdalebremertonredmondsheltonbellevueport-orchardport-angeleskingstonchehalisaberdeengig-harborseattlepoulsboidmdndsddemenegacalamaiavawapailalflnmdcncscohnhmihiviwiriinmntnmocoutvtctmtgunjokakwvnvprarorasmskstxwynykyazisadninsnngosrvis-bymircloudservernamepointtoenscaledland-4-salefreeddnsstuff-4-saleazure-apinoipcloudnsgolffanheliohostazurewebsitesgvorgmilcomgubneteducoorgcomnetd0egvorgmilcomnetedugovmydnsiacostoree12orgmilcomnomwebgobbibrectecnetintedugovraremprendefirminfoartseducok12orgcomnethidnsidacaiiosonlahanamhanoicamauhueorgcompronetintedugovbizbacninhtayninhhoabinhnamdinhtravinhhaiphongvinhlonghaiduongquangnamquangtrithuathienhuequangninhbacgianghaugiangquangbinhsoctrangbentrethanhphohochiminhdanangkontumhatinhkhanhhoathanhhoahealthgialailaocaiyenbaibackanngheanlonganphuyenphuthocanthodaklakdongnainameinfovinhphucdongthapkiengiangtiengiangquangngailaichaulangsonlamdongdaknonghagiangangiangcaobangbinhduongninhthuanbinhthuanbaclieuthaibinhninhbinhbinhdinhtuyenquanghungyenbaria-vungtauthainguyendienbienbinhphuocschbizputerimagine-proxyorgcomnetedugovcloud66advisormypetsdyndnsxn--8dbq2axn--4dbgdty6cxn--5dbhl8dxn--hebda8bxn--80auxn--d1atxn--c1avgxn--o1acxn--o1achxn--90azhxn--55qx5dxn--uc0atvxn--od0algxn--wcvs22dxn--gmqw5axn--mxtq1mxn--12c1fe0brxn--h3cuzk1dixn--12co0c3b4evaxn--12cfi8ixb8lxn--o3cyx2axn--m3ch0j3axn--j1adpxn--90amcxn--90a1afxn--h1ahnxn--j1ael8bxn--h1alizxn--c1avgxn--j1aefxn--80aaa0cvacxn--41acaffeineexeopentunnelbotdashtelebitorgtmaccoagricorgmilnomwebnicngonetaltedugovlawnisschoolgrondaraccoorgmilcomschnetedugovbizinfoprg1-zeropstritonstackitlimazeropsaccoorgmilgov\u044F\u0441\u043F\u0431\u043E\u0440\u0433\u043A\u043E\u043C\u043C\u0441\u043A\u0431\u0438\u0437\u043C\u0438\u0440\u0441\u0430\u043C\u0430\u0440\u0430\u043A\u0440\u044B\u043C\u0441\u043E\u0447\u0438\u0430\u043A\u043E\u0434\u043F\u0440\u043E\u0440\u0433\u043E\u0431\u0440\u0443\u043F\u0440\u05E6\u05D4\u05DC\u05DE\u05DE\u05E9\u05DC\u05D9\u05E9\u05D5\u05D1\u05D0\u05E7\u05D3\u05DE\u05D9\u05D4\u0E2D\u0E07\u0E04\u0E4C\u0E01\u0E23\u0E18\u0E38\u0E23\u0E01\u0E34\u0E08\u0E23\u0E31\u0E10\u0E1A\u0E32\u0E25\u0E28\u0E36\u0E01\u0E29\u0E32\u0E17\u0E2B\u0E32\u0E23\u0E40\u0E19\u0E47\u0E15\u6559\u80B2\u7DB2\u7D61\u7D44\u7E54\u516C\u53F8\u653F\u5E9C\u500B\u4EBA\uB2F7\uB137\uD55C\uAD6D\u6FB3\u95E8\u65B0\u95FB\u6FB3\u9580\u8054\u901A\u5BB6\u96FB\u5609\u91CC\u62DB\u8058\u901A\u8CA9\uB2F7\uCEF4\uC0BC\uC131\u30B3\u30E0\u10D2\u10D4\u0431\u0433\u0440\u0444\u0435\u044Eadcdbdgdidmdsdtdaebedeeegeiejekemenepereseveyegabacalamanauavapaqasazacfbfafgfnfpfwftfbgcgagggegkgngmgsgpgvgtgugilmlnlalclglplsltlhmimjmkmmmomambmcmdmfmgmzmpmsmtmgbbblbsbecccacnclcmcvctcscmhkhghchbhthphshlinikifigiaibicivisikninhnmncnbngnsnpnvntnjoionomobocoaofodorosotoptstttytatbtetgtithtmtltrusuvuaucueuguhulumunufjdjbjtjsjlkmkhkfkdkcktkukskpkgpmpnpkpjpgqaqmqiqsvtvcvbvmvlvrwpwtwzwbwcwawgwkwmwtrsrprgrfrercrbrarnrmrlrkrirhrwsusrssspsgsesbsaslsmsissxmxaxcxuypysylymykygybycyuztzsznzmzkzdzczbzaz\u03B5\u03BB\u03B5\u03C5\u4E16\u754C\u53F0\u7063\u8D2D\u7269\u516C\u76CA\u70B9\u770B\u81FA\u7063\u7F51\u7EDC\u66F8\u7C4D\u5728\u7EBF\u7F51\u7AD9\u624B\u673A\u673A\u6784\u5927\u62FF\u6E38\u620F\u4FE1\u606F\u53F0\u6E7E\u8C37\u6B4C\u6148\u5584\u5546\u6807\u9999\u6E2F\u4E2D\u56FD\u9910\u5385\u7F51\u5740\u4E2D\u570B\u5546\u57CE\u98DF\u54C1\u5FAE\u535A\u653F\u52A1\u79FB\u52A8\u96C6\u56E2\u516C\u53F8\u516B\u5366\u5546\u5E97\u5065\u5EB7\u7F51\u5E97\u653F\u5E9C\u65F6\u5C1A\u4F5B\u5C71\u4E2D\u4FE1\u5A31\u4E50\u5E7F\u4E1C\u4F01\u4E1Ahomedepotengineering\u0627\u0645\u0627\u0631\u0627\u062Arepublicankuokgroupversicherungchannelcitadelxn--pgbs0dhxn--b4w605ferdstatebankwebsitexn--mgb9awbf\u4E9A\u9A6C\u900A\u6DE1\u9A6C\u9521alibabaxn--ngbc5azdxn--mgbbh1axn--45br5cyltoshibabuildworldcloudtradeguideplacespacedancemoviephoneprimesmilebiblestyleappleazurestoreskypegripexn--l1accdrivelottehorsehouseleasechasereisestadahondaomegaaetnaamicaninjanokiamediadeltavodkaedekaosakapizzaslingemailgmailtirolshelltmallfinallegaltotalhotelamfamforumrehabmusicciticricohcoachwatchboschearthfaithirishmiamiarchidubaiguccipraxi\u307F\u3093\u306A\u30B9\u30C8\u30A2\u30BB\u30FC\u30EBcanonsalononionnikonepsonkoelngreensevencrownikanoradioaudioweiboglobopromogalloyahoociscorodeovideomangobingotokyovolvolottokyotophotosmartsportquesttrusthyattjetztadultcymrubaidutushuxn--kprw13dubankclickblackmerckgroupsharpcheapnowtvxn--h2brj9c\u05E7\u05D5\u05DD\u0570\u0561\u0575\u043E\u0440\u0433\u0441\u0440\u0431\u043C\u043E\u043D\u043A\u043E\u043C\u0431\u0435\u043B\u043C\u043A\u0434\u049B\u0430\u0437\u0440\u0443\u0441\u0443\u043A\u0440\u0645\u0635\u0631\u0642\u0637\u0631\u0639\u0631\u0628\u0643\u0648\u0645dadcfdmedwedredphdthdbidpidkrdmsdltdiceonewmeglemoerwecfageacbanbambaaaammakianraspacpaaxawtfbcgaegongingaigvigorgdogdhlmilrilonlaolloluoljllcalgalnflafltelsrlfrllplkimibmcamcombommomifmabbjcbscbcabnabtabmlbpubabcbbcnecincpncllcstcwtcpwcnyckfhbzhovhmoiskiobisbitcifyituipinvinwinxincbnbcnmanfangdnmenrenkpnmtnyunrunfununobiojioriohbogmofooboooooacoecoceongoproartistottnttbbtcateatlatvetpetbetnethktmitfitintjothotgotdotbotprueduicujnjyouinknhktdkappsapgapmapdnptopgopllpjmpzipvipripesqtrvdtvitvdevmovgovhivnrwlawsewnewbmwwownowhowdvrftrmtrsfrbarcartvscrseusawsupsubssbsadsddsldssasbmsmlsxxxboxfoxgmxtjxsextaxbuyflydiysoyjoyskypaydaygayxyzanzbizwebersenerpokerlameractortatarsolar\u0EA5\u0EB2\u0EA7\u0E04\u0E2D\u0E21\u0E44\u0E17\u0E22tourslocusnexuslexusgiftsbeatsboatspartspressglassswiss\u0915\u0949\u092E\u0928\u0947\u091Ftiresgivescodeshomesgamestunesshoescardswalesloansvegastoolsdealsautosparis\u30D5\u30A1\u30C3\u30B7\u30E7\u30F3workssucksrocksxeroxforexfedexpartylillymoneystudyrugbytoraytoday\u4E2D\u6587\u7F51xn--unup4y\u5929\u4E3B\u6559\u98DE\u5229\u6D66\u65B0\u52A0\u5761enterprises\u6211\u7231\u4F60\u5609\u91CC\u5927\u9152\u5E97christmasxn--fct429kholdingsxn--8y0a063axn--mgbx4cd0ablifestyleabogadoallstatenetbank\u0643\u0627\u062B\u0648\u0644\u064A\u0643xn--s9brj9cxn--gk3at1ebestbuycharityxn--55qx5dmicrosoftpropertybasketballhomegoodscorsicajewelrygallerygrocerysurgerycountrybrusselsverisignferreroxn--czr694bhdfcbankcommbanksoftbank\u067E\u0627\u0643\u0633\u062A\u0627\u0646\u067E\u0627\u06A9\u0633\u062A\u0627\u0646nextdirect\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0647\u0627\u0644\u0639\u0644\u064A\u0627\u0646xn--h2brj9c8cxn--80adxhksshikshaxn--mgbai9azgqp6jcuisinellabarclayscatholicxn--kpry57dcompanyxn--xhq521bblackfridayxn--mgba3a3ejtsandvikxn--d1acj3bacademydownload\u0645\u0644\u064A\u0633\u064A\u0627xn--j1amhxn--w4r85el8fhu5dnraipirangaathletaxn--fhbeixn--mgbqly7cvafrzuerichxn--c2br7g\u0B87\u0BB2\u0B99\u0BCD\u0B95\u0BC8contractorsxn--io0a7igraphicsinsurancetemasekxn--xkc2al3hye2amotorcyclesphotographydirectoryplumbingxn--vhquvclothingtrainingcleaningwilliamhilllightingxn--mgba3a4f16ashoppingcateringeducationokinawapicturesventuresproductionsxn--9et52uwalmart\u0D2D\u0D3E\u0D30\u0D24\u0D02supportrealestatecapitalonexn--nqv7fs00emaauspostfloristdentistxn--qxamgodaddybradescobargainsmitsubishikerryhotelsxn--9dbq2axn--3pxu8kimmobilienxn--fjq720axn--mgbtx2bholidaymckinseymadridbusinessbuildershelsinkixn--4gbrim\u043C\u043E\u0441\u043A\u0432\u0430\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u0629coffeedegreelacaixapartnersalsaceofficeabbvievoyageorangegeorgeonlinechromemobilekindlegoogleoraclecircleschulesecureinsurexn--mgba7c0bbn0aestatexn--mgbc0a9azcgcruisehangoutxn--vuq861bxn--42c2d9arexrothfirestoneuniversityxn--nnx388alifeinsuranceextraspace\u043E\u043D\u043B\u0430\u0439\u043Dverm\xF6gensberatersoftwarexn--fiqs8sxn--mgbab2bdxn--w4rs40ltienda\u092D\u093E\u0930\u0924\u092E\u094Dafricatoyotaotsukasakuracameracreditcardnagoyaconsultingnetworkjunipertheatermonsterprogressivepioneerxn--55qw42gracingdatingvotingvikinglivinggivingxn--bck1b9a5dre4cbrotherweatherjoburg\u0641\u0644\u0633\u0637\u064A\u0646lplfinancialxn--clchc0ea0b2g2a9gcdfutbolschoolsocialglobaldentalwoodsidechanelairtelmatteltravelrealtorwebcamstream\u0C2D\u0C3E\u0C30\u0C24\u0C4Dunicomalstomxn--nodexn--6frz82gmuseumfurniturexn--rvc1e0am3exn--mix891faccenturexn--11b4c3dismailineustardiscountquebeccomsecclinicservicesxn--y9a3aqxn--c1avgswatchchurchsearch\u0627\u0644\u0627\u0631\u062F\u0646marketingcontacthealthmonashshoujisanofitaipeiamericanexpresssuzuki\u30A2\u30DE\u30BE\u30F3\u30AF\u30E9\u30A6\u30C9\u30DD\u30A4\u30F3\u30C8bharti\u30B0\u30FC\u30B0\u30EBxn--mgberp4a5d4armemorialxn--1qqw23alondonmormoninstitutevisionbostonnortoncouponmaisonamazonvirginberlindesigndurbanolayannissananquanxihuanhitachikaufengardenreisenbayerntechnologydatsunxn--90a3aclatinocasinostudiophysioxn--ngbe9e0apharmacytattootaobaoaramcoexpertreportabbottdirectselectimamatfairwindspictettargetmarketintuittravelersinsurancecreditdupontryukyusuppliesxn--tckwebnpparibasschmidtmerckmsdyodobashirestaurantbridgestonecricketxn--fpcrj9c3dbostikbroadwayattorneylefrakemerckxn--fiq228c5hscareersfarmerswinnersflowersxn--wgbh1cguitarsxn--54b7fta0ccxn--p1acfmakeupgalluplandroverxn--kcrx77d1x4agoldpointbauhausxn--mgbayh7gpahiphopplaystationxn--mgba3a4fraxn--eckvdtc9dhyundaixn--gckr3f0fistanbulticketsmarketsflightschintaireviewsxn--3e0b707ewindowsxn--fiqz9sfinancialxn--fzys8d69uvgm\u0627\u0628\u0648\u0638\u0628\u064Adiscoverreview\u09AC\u09BE\u0982\u09B2\u09BExn--5su34j936bgsgmoscowobserverapartments\u0434\u0435\u0442\u0438\u0627\u0631\u0627\u0645\u0643\u0648\u0441\u0430\u0439\u0442eurovisionxn--i1b6b1a6a2exn--xkc2dl3a5ee0h\u062A\u0648\u0646\u0633\u0645\u0648\u0642\u0639\u0628\u0627\u0631\u062A\u0680\u0627\u0631\u062A\u0634\u0628\u0643\u0629\u0639\u0645\u0627\u0646\u0628\u064A\u062A\u0643\u0639\u0631\u0627\u0642readkredbondlandbandfundfoodprodgoldfordtubecafesafelifeggeeieeefreefagepagegugezonewinememenamegamesaleablebikenikelikecarecbreherefiresaveloveliveblueartedatesitevotecaseluxebofamodaltdaasdatiaayogasinavanashiaasiajavabbvatevavivadatazaraarpacasavisasncfprofmaifsurfgolfdvagsongbingpingwangkpmggoogblogpohlfailcooldellcalldeallidlsarlfilmteamroomfarmimdbarabclubhdfcicbchsbcgmbhrichtechfishdishcashminiernikddiaudiwikimobitaxicitikiwidesiqponskinloanakdnwienopenporncerntownimmolimoolloinfonicofidolegosaxozeroaerovivoautovotomotofastbestresthostpostnextlgbtchatseatgiftmeetdietreitmintrentgentspotscotguruitausohumenucyoubanklinkpinkdclktalksilkbookseekworkrsvpaarpjeepshopcoophelpcamppccwshowbeerstarruhrflirweirhaircarsparsjprshausplusnewstipstoysjobskidsfanspicsdocsxboxamexsexynavycitysonyarmyallybabyplaydeliverybuzzgbizlamborghiniphilips\u0DBD\u0D82\u0D9A\u0DCF\u0CAD\u0CBE\u0CB0\u0CA4fitnessexpresslanxesspfizercenterwalterlawyersoccercareerkosherbrokerlockerdealerdoctorauthorxn--mgbqly7c0a67fbcverm\xF6gensberatungjaguarxn--pssy2uxn--hxt814eflickrrepairrogersairbusxn--mgbai9a5eva00beventsyachtsxn--t60b56a\u09AD\u09BE\u09F0\u09A4\u09AD\u09BE\u09B0\u09A4\u092D\u093E\u0930\u0924\u092D\u093E\u0930\u094B\u0924viajeshermeshughesxn--j1aef\u0938\u0902\u0917\u0920\u0928villas\u0B2D\u0B3E\u0B30\u0B24claimshotels\u0AAD\u0ABE\u0AB0\u0AA4zapposphotosjuegoscondostatamotorsgratistennis\u0A2D\u0A3E\u0A30\u0A24tkmaxxtjmaxxschaeffleryandexxn--80aswgrealtysafetybeautyluxuryxn--3ds443gsupplyfamilyxn--o3cw4hhockeysydneyxn--90aenissayalipayenergycomputeragencyxn--rovu88b\u96FB\u8A0A\u76C8\u79D1xn--gecrj9cstatefarmaccountantaquarelleolayangroup\u9999\u683C\u91CC\u62C9xn--p1ai\u7EC4\u7EC7\u673A\u6784xn--1ck2e1bxn--mgbt3dhdschwarz\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627abudhabinowruzkomatsufujitsuhospitalxn--80asehdbxn--mgbtf8flxn--j6w193gxn--yfro4i67oprudentialxn--flw351ecruisescoursesrecipesxn--e1a4cferrarixn--ses554gxn--wgbl6awatchesstaplessinglesxn--mgbcpq6gpa1axn--otu796dpropertiescreditunionxn--mgbah1a3hjkrdstockholmhisamitsu\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629stcgroupdomainsoriginscouponsbloombergclubmedfroganslimitedxn--80aqecdr1aexposedinternationalequipmentbarclaycardxn--q7ce6axn--mgbi4ecexpprotectionassociatesconstructionxn--cck2b3bxn--45q11candroidfoundation\u05D9\u05E9\u05E8\u05D0\u05DCxn--mgbca7dzdocliniqueboutiqueengineerxn--qxa6asystemsfirmdalefashionauctionxn--nqv7finfinitirentalsreliancetradingweddingfishinghostinggentingbookingcookingxn--3hcrj9cgraingerxn--czrs0tdemocratsamsungyokohamaxn--h2breg3evexn--nyqy26alundbeckmelbournevacationssolutionsfrontierxn--vermgensberatung-pwbmanagementxn--cg4bkixn--mgb2ddeslincolnhamburgsandvikcoromantblockbusterairforcebarefootxn--4dbrk0ceinvestmentsfeedbackcommunityxn--ngbrx\u0627\u0644\u0628\u062D\u0631\u064A\u0646diamondsamsterdamhealthcareredumbrellaxn--mxtq1mxn--2scrj9cagakhanxn--mgbpl2fh\u043A\u0430\u0442\u043E\u043B\u0438\u043Acaravan\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCDrichardlimortgageamericanfamilyxn--fzc2c9e2cscholarshipssaarlandxn--imr513nvlaanderensamsclubgoodyearkitchen\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBEweatherchannelallfinanzxn--kput3i\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u06C3xn--90aisxn--efvy88h\u0627\u0644\u062C\u0632\u0627\u0626\u0631xn--mgbaam7a8hexchangejpmorganxn--tiq49xqyjfidelitysecurityxn--mk1bu44cwanggouxn--fiq64bxn--6qq986b3xlxn--mgbbh1a71exn--80ao21amarshallsxn--5tzm5gtravelerspanasoniclatrobeyoutubeaccountantsxn--rhqv96gxn--cckwcxetdanalyticsxn--ygbi2ammx\u0628\u0627\u0632\u0627\u0631\u0628\u06BE\u0627\u0631\u062A\u0633\u0648\u0631\u064A\u0629organicfresenius\u0633\u0648\u0631\u064A\u0627xn--9krt00axn--qcka1pmcxn--jlq480n2rgdeloittesciencefinancexn--jvr189mxn--30rr7yhomesensehotmailbaseballfootballleclercboehringerxn--q9jyb4cxn--mix082f\u0627\u0644\u064A\u0645\u0646\u0647\u0645\u0631\u0627\u0647politie\u0633\u0648\u062F\u0627\u0646\u0627\u064A\u0631\u0627\u0646\u0627\u06CC\u0631\u0627\u0646netflixyamaxunxn--lgbbat1ad8jcollegestoragecapetowncolognekerrypropertiesxn--mgbgu82axn--ogbpf8flxn--czru2dwhoswhociprianilasallexn--g2xx48cforsalebanamexaudiblexn--vermgensberater-ctbxn--zfr164bericssonvanguardxn--45brj9cindustriestheatremarriottxn--3bst00mcomparexn--mgberp4a5d4a87gcapitaldigital\u0627\u0644\u0645\u063A\u0631\u0628barcelonashangrilaxn--d1alfcalvinkleinwwwcitysapporokawasakinagoyasendaikobekitakyushuyokohamackjp";
2922
+ var rulesRoot = 621;
2923
+ var exceptionsRoot = 625;
2924
+
2925
+ // ../../node_modules/.pnpm/tldts@7.4.9/node_modules/tldts/dist/es6/src/suffix-trie.js
2926
+ var numberOfNodes = nodeFlags.length;
2927
+ var numberOfEdges = edgeLength.length;
2928
+ var edgeOffset = new Uint32Array(numberOfEdges);
2929
+ var edgeHash = new Uint32Array(numberOfEdges);
2930
+ var wildcardEdge = new Int32Array(numberOfNodes).fill(-1);
2931
+ for (let node = 0, offset = 0; node < numberOfNodes; node += 1) {
2932
+ for (let edge = edgeStart[node]; edge < edgeStart[node + 1]; edge += 1) {
2933
+ edgeOffset[edge] = offset;
2934
+ const end = offset + edgeLength[edge];
2935
+ let hash = 5381;
2936
+ for (let i = end - 1; i >= offset; i -= 1) {
2937
+ hash = hash * 33 ^ labelText.charCodeAt(i);
2938
+ }
2939
+ edgeHash[edge] = hash >>> 0;
2940
+ if (edgeLength[edge] === 1 && labelText.charCodeAt(offset) === 42) {
2941
+ wildcardEdge[node] = edge;
2942
+ }
2943
+ offset = end;
2944
+ }
2945
+ }
2946
+ var matchNode = -1;
2947
+ var matchStart = 0;
2948
+ var matchEnd = 0;
2949
+ function labelEquals(edge, hostname, start, length) {
2950
+ if (edgeLength[edge] !== length) {
2951
+ return false;
2952
+ }
2953
+ const offset = edgeOffset[edge];
2954
+ for (let i = 0; i < length; i += 1) {
2955
+ if (labelText.charCodeAt(offset + i) !== hostname.charCodeAt(start + i)) {
2956
+ return false;
2957
+ }
2958
+ }
2959
+ return true;
2960
+ }
2961
+ function findEdge(node, hash, hostname, start, length) {
2962
+ let lo = edgeStart[node];
2963
+ let hi = edgeStart[node + 1];
2964
+ while (lo < hi) {
2965
+ const mid = lo + hi >>> 1;
2966
+ const value = edgeHash[mid];
2967
+ if (value < hash) {
2968
+ lo = mid + 1;
2969
+ } else if (value > hash) {
2970
+ hi = mid;
2971
+ } else {
2972
+ for (let e = mid; e >= lo && edgeHash[e] === hash; e -= 1) {
2973
+ if (labelEquals(e, hostname, start, length))
2974
+ return e;
2975
+ }
2976
+ for (let e = mid + 1; e < hi && edgeHash[e] === hash; e += 1) {
2977
+ if (labelEquals(e, hostname, start, length))
2978
+ return e;
2979
+ }
2980
+ return -1;
2981
+ }
2982
+ }
2983
+ return -1;
2984
+ }
2985
+ function walk(hostname, root, allowedMask) {
2986
+ let node = root;
2987
+ let end = hostname.length;
2988
+ let hash = 5381;
2989
+ matchNode = -1;
2990
+ for (let i = hostname.length - 1; i >= 0; i -= 1) {
2991
+ const code = hostname.charCodeAt(i);
2992
+ if (code === 46) {
2993
+ const start = i + 1;
2994
+ let edge2 = findEdge(node, hash >>> 0, hostname, start, end - start);
2995
+ if (edge2 === -1) {
2996
+ edge2 = wildcardEdge[node];
2997
+ }
2998
+ if (edge2 === -1) {
2999
+ return matchNode !== -1;
3000
+ }
3001
+ node = edgeChild[edge2];
3002
+ if ((nodeFlags[node] & allowedMask) !== 0) {
3003
+ matchNode = node;
3004
+ matchStart = start;
3005
+ matchEnd = end;
3006
+ }
3007
+ end = i;
3008
+ hash = 5381;
3009
+ } else {
3010
+ hash = hash * 33 ^ code;
3011
+ }
3012
+ }
3013
+ let edge = findEdge(node, hash >>> 0, hostname, 0, end);
3014
+ if (edge === -1) {
3015
+ edge = wildcardEdge[node];
3016
+ }
3017
+ if (edge !== -1) {
3018
+ node = edgeChild[edge];
3019
+ if ((nodeFlags[node] & allowedMask) !== 0) {
3020
+ matchNode = node;
3021
+ matchStart = 0;
3022
+ matchEnd = end;
3023
+ }
3024
+ }
3025
+ return matchNode !== -1;
3026
+ }
3027
+ function suffixLookup(hostname, options, out) {
3028
+ if (fast_path_default(hostname, options, out)) {
3029
+ return;
3030
+ }
3031
+ const allowedMask = (options.allowPrivateDomains ? 2 : 0) | (options.allowIcannDomains ? 1 : 0);
3032
+ if (walk(hostname, exceptionsRoot, allowedMask)) {
3033
+ out.isIcann = (nodeFlags[matchNode] & 1) !== 0;
3034
+ out.isPrivate = (nodeFlags[matchNode] & 2) !== 0;
3035
+ out.publicSuffix = hostname.slice(matchEnd + 1);
3036
+ return;
3037
+ }
3038
+ if (walk(hostname, rulesRoot, allowedMask)) {
3039
+ out.isIcann = (nodeFlags[matchNode] & 1) !== 0;
3040
+ out.isPrivate = (nodeFlags[matchNode] & 2) !== 0;
3041
+ out.publicSuffix = hostname.slice(matchStart);
3042
+ return;
3043
+ }
3044
+ out.isIcann = false;
3045
+ out.isPrivate = false;
3046
+ const lastDot = hostname.lastIndexOf(".");
3047
+ out.publicSuffix = lastDot === -1 ? hostname : hostname.slice(lastDot + 1);
3048
+ }
3049
+
3050
+ // ../../node_modules/.pnpm/tldts@7.4.9/node_modules/tldts/dist/es6/index.js
3051
+ var RESULT = getEmptyResult();
3052
+ function getHostname(url, options) {
3053
+ resetResult(RESULT);
3054
+ return parseImpl(url, 0, suffixLookup, options, RESULT).hostname;
3055
+ }
3056
+ function getDomain2(url, options) {
3057
+ resetResult(RESULT);
3058
+ return parseImpl(url, 3, suffixLookup, options, RESULT).domain;
3059
+ }
3060
+ function getDomainWithoutSuffix2(url, options) {
3061
+ resetResult(RESULT);
3062
+ return parseImpl(url, 5, suffixLookup, options, RESULT).domainWithoutSuffix;
3063
+ }
3064
+
3065
+ // ../contracts/src/url-normalize.ts
3066
+ var DOMAIN_PARSE_OPTIONS = { allowPrivateDomains: true };
3067
+ var LINKIFY = new LinkifyIt({ fuzzyLink: true, fuzzyEmail: false }).tlds(tlds_default2);
3068
+ var STRIP_KEYS = /* @__PURE__ */ new Set([
3069
+ // Click identifiers
3070
+ "fbclid",
3071
+ "gclid",
3072
+ "msclkid",
3073
+ "ttclid",
3074
+ "li_fat_id",
3075
+ "igshid",
3076
+ "yclid",
3077
+ "dclid",
3078
+ "gbraid",
3079
+ "wbraid",
3080
+ "bingid",
3081
+ // Mailchimp
3082
+ "mc_cid",
3083
+ "mc_eid",
3084
+ // Google Analytics linkers
3085
+ "_ga",
3086
+ "_gl",
3087
+ // Google Tag Manager debug
3088
+ "gtm_latency",
3089
+ "gtm_debug",
3090
+ // WordPress internal noise
3091
+ "preview",
3092
+ "preview_id",
3093
+ "preview_nonce",
3094
+ "_thumbnail_id",
3095
+ // Common cache-busters/versioning
3096
+ "v",
3097
+ "ver",
3098
+ "version"
3099
+ ]);
3100
+ function shouldStrip(key) {
3101
+ if (STRIP_KEYS.has(key)) return true;
3102
+ if (key.startsWith("utm_")) return true;
3103
+ return false;
3104
+ }
3105
+ function parseQuery(query) {
3106
+ if (query === "") return [];
3107
+ return query.split("&").map((pair) => {
3108
+ const eq = pair.indexOf("=");
3109
+ if (eq === -1) return { key: pair, value: null };
3110
+ return { key: pair.slice(0, eq), value: pair.slice(eq + 1) };
3111
+ });
3112
+ }
3113
+ function encodeQuery(pairs) {
3114
+ return pairs.map((p) => p.value === null ? p.key : `${p.key}=${p.value}`).join("&");
3115
+ }
3116
+ function collapseRootIndex(path) {
3117
+ if (path === "/index.html" || path === "/index.php") return "/";
3118
+ return path;
3119
+ }
3120
+ function dropTrailingSlash(path) {
3121
+ if (path.length > 1 && path.endsWith("/")) {
3122
+ return path.replace(/\/+$/, "");
3123
+ }
3124
+ return path;
3125
+ }
3126
+ function absolutizeProjectUrl(url, canonicalDomain) {
3127
+ if (!url) return "";
3128
+ const trimmed = url.trim();
3129
+ if (!trimmed) return "";
3130
+ if (/^https?:\/\//i.test(trimmed)) return trimmed;
3131
+ if (trimmed.startsWith("//")) return `https:${trimmed}`;
3132
+ const host = canonicalDomain.trim().replace(/^https?:\/\//i, "").replace(/\/+$/, "");
3133
+ if (!host) return trimmed;
3134
+ if (trimmed.startsWith("/")) return `https://${host}${trimmed}`;
3135
+ return `https://${host}/${trimmed}`;
3136
+ }
3137
+ function hostOf(value) {
3138
+ if (value == null) return null;
3139
+ const trimmed = value.trim();
3140
+ if (!trimmed) return null;
3141
+ const hostname = getHostname(trimmed);
3142
+ return hostname ? hostname.replace(/^www\./i, "").toLowerCase() : null;
3143
+ }
3144
+ function registrableDomain(value) {
3145
+ if (value == null || value.trim() === "") return "";
3146
+ return getDomain2(value, DOMAIN_PARSE_OPTIONS)?.toLowerCase() ?? "";
3147
+ }
3148
+ function brandLabelFromDomain(value) {
3149
+ if (value == null || value.trim() === "") return "";
3150
+ return getDomainWithoutSuffix2(value, DOMAIN_PARSE_OPTIONS)?.toLowerCase() ?? "";
3151
+ }
3152
+ function hostMatchesDomain(candidate, domain) {
3153
+ const candidateHost = hostOf(candidate);
3154
+ const domainHost = hostOf(domain);
3155
+ if (!candidateHost || !domainHost) return false;
3156
+ return candidateHost === domainHost || candidateHost.endsWith(`.${domainHost}`);
3157
+ }
3158
+ function hostMatchesAnyDomain(candidate, domains) {
3159
+ return domains.some((domain) => hostMatchesDomain(candidate, domain));
3160
+ }
3161
+ function extractDomainsFromText(text) {
3162
+ if (!text) return [];
3163
+ const domains = /* @__PURE__ */ new Set();
3164
+ for (const match of LINKIFY.match(text) ?? []) {
3165
+ if (match.schema === "mailto:") continue;
3166
+ const host = hostOf(match.url);
3167
+ if (!host || !registrableDomain(host)) continue;
3168
+ domains.add(host);
3169
+ }
3170
+ return [...domains];
3171
+ }
3172
+ function textContainsDomain(text, domain) {
3173
+ return extractDomainsFromText(text).some((candidate) => hostMatchesDomain(candidate, domain));
3174
+ }
3175
+ function normalizeUrlPath(input) {
3176
+ if (input == null) return null;
3177
+ let trimmed = input.trim();
3178
+ if (trimmed === "") return null;
3179
+ trimmed = trimmed.replace(/&nbsp;/g, " ").replace(/\s+/g, " ").trim();
3180
+ if (trimmed === "" || trimmed === "/") return "/";
3181
+ if (trimmed === "(not set)") return null;
3182
+ trimmed = trimmed.replace(/([a-z0-9])[).]+$/i, "$1");
3183
+ if (trimmed.startsWith("/)") || trimmed.startsWith("/ ")) {
3184
+ trimmed = "/";
3185
+ }
3186
+ if (trimmed.includes(" ")) {
3187
+ trimmed = trimmed.split(" ")[0];
3188
+ }
3189
+ if (trimmed === "" || trimmed === "/") return "/";
3190
+ let pathPart;
3191
+ let queryPart;
3192
+ if (/^https?:\/\//i.test(trimmed)) {
3193
+ let url;
3194
+ try {
3195
+ url = new URL(trimmed);
3196
+ } catch {
3197
+ return null;
3198
+ }
3199
+ pathPart = url.pathname || "/";
3200
+ queryPart = url.search.startsWith("?") ? url.search.slice(1) : url.search;
3201
+ } else {
3202
+ let raw = trimmed;
3203
+ const hashIdx = raw.indexOf("#");
3204
+ if (hashIdx !== -1) raw = raw.slice(0, hashIdx);
3205
+ const qIdx = raw.indexOf("?");
3206
+ if (qIdx === -1) {
3207
+ pathPart = raw;
3208
+ queryPart = "";
3209
+ } else {
3210
+ pathPart = raw.slice(0, qIdx);
3211
+ queryPart = raw.slice(qIdx + 1);
3212
+ }
3213
+ }
3214
+ if (pathPart === "") pathPart = "/";
3215
+ pathPart = collapseRootIndex(pathPart);
3216
+ pathPart = dropTrailingSlash(pathPart);
3217
+ const pairs = parseQuery(queryPart).filter((p) => !shouldStrip(p.key));
3218
+ pairs.sort((a, b) => {
3219
+ if (a.key < b.key) return -1;
3220
+ if (a.key > b.key) return 1;
3221
+ return 0;
3222
+ });
3223
+ if (pairs.length === 0) return pathPart;
3224
+ return `${pathPart}?${encodeQuery(pairs)}`;
3225
+ }
3226
+
303
3227
  // ../contracts/src/project.ts
304
3228
  var configSourceSchema = z3.enum(["cli", "api", "config-file"]);
305
3229
  function findDuplicateLocationLabels(locations) {
@@ -420,72 +3344,7 @@ var competitorBatchRequestSchema = z3.object({
420
3344
  competitors: z3.array(z3.string().trim().min(1)).min(1)
421
3345
  });
422
3346
  function normalizeProjectDomain(input) {
423
- let domain = input.trim().toLowerCase();
424
- try {
425
- if (domain.includes("://")) {
426
- domain = new URL(domain).hostname.toLowerCase();
427
- }
428
- } catch {
429
- }
430
- return domain.replace(/^www\./, "");
431
- }
432
- var MULTI_LABEL_PUBLIC_SUFFIXES = /* @__PURE__ */ new Set([
433
- "ac.uk",
434
- "co.id",
435
- "co.il",
436
- "co.in",
437
- "co.jp",
438
- "co.kr",
439
- "co.nz",
440
- "co.th",
441
- "co.uk",
442
- "co.za",
443
- "com.au",
444
- "com.br",
445
- "com.cn",
446
- "com.mx",
447
- "com.ph",
448
- "com.sg",
449
- "com.tr",
450
- "edu.au",
451
- "edu.sg",
452
- "gov.au",
453
- "gov.uk",
454
- "me.uk",
455
- "ne.jp",
456
- "net.au",
457
- "net.br",
458
- "net.cn",
459
- "net.in",
460
- "net.tr",
461
- "or.jp",
462
- "or.kr",
463
- "org.au",
464
- "org.br",
465
- "org.in",
466
- "org.nz",
467
- "org.tr",
468
- "org.uk",
469
- "org.za"
470
- ]);
471
- function registrableDomain(input) {
472
- const normalized = normalizeProjectDomain(input);
473
- if (!normalized) return "";
474
- const hostname = normalized.split("/")[0]?.split(":")[0] ?? "";
475
- if (!hostname) return "";
476
- const labels = hostname.split(".").filter(Boolean);
477
- if (labels.length < 2) return "";
478
- if (labels.length === 2) return labels.join(".");
479
- const lastTwo = labels.slice(-2).join(".");
480
- if (MULTI_LABEL_PUBLIC_SUFFIXES.has(lastTwo)) {
481
- return labels.length >= 3 ? labels.slice(-3).join(".") : "";
482
- }
483
- return labels.slice(-2).join(".");
484
- }
485
- function brandLabelFromDomain(input) {
486
- const reg = registrableDomain(input);
487
- if (!reg) return "";
488
- return reg.split(".")[0] ?? "";
3347
+ return hostOf(input) ?? input.trim().toLowerCase().replace(/^www\./, "");
489
3348
  }
490
3349
  function effectiveDomains(project) {
491
3350
  const all = [project.canonicalDomain, ...project.ownedDomains ?? []];
@@ -2575,16 +5434,10 @@ var CATEGORY_LABELS = {
2575
5434
  other: "Independent sites"
2576
5435
  };
2577
5436
  function categorizeSource(uri) {
2578
- let domain;
2579
- try {
2580
- const url = new URL(uri.startsWith("http") ? uri : `https://${uri}`);
2581
- domain = url.hostname.replace(/^www\./, "");
2582
- } catch {
2583
- domain = uri.replace(/^https?:\/\//, "").replace(/^www\./, "").split("/")[0] ?? uri;
2584
- }
5437
+ const domain = hostOf(uri) ?? uri.trim().toLowerCase();
2585
5438
  const domainLower = domain.toLowerCase();
2586
5439
  for (const rule of SOURCE_CATEGORY_RULES) {
2587
- if (domainLower === rule.pattern || domainLower.endsWith(`.${rule.pattern}`) || rule.pattern.startsWith(".") && domainLower.endsWith(rule.pattern)) {
5440
+ if (!rule.pattern.startsWith(".") && hostMatchesDomain(domainLower, rule.pattern) || rule.pattern.startsWith(".") && domainLower.endsWith(rule.pattern)) {
2588
5441
  return { category: rule.category, label: rule.label, domain };
2589
5442
  }
2590
5443
  }
@@ -2607,6 +5460,89 @@ import { z as z20 } from "zod";
2607
5460
  // ../contracts/src/discovery.ts
2608
5461
  import { z as z19 } from "zod";
2609
5462
 
5463
+ // ../contracts/src/brand-matching.ts
5464
+ var WORD_SEGMENTER = new Intl.Segmenter("en", { granularity: "word" });
5465
+ var NON_WORD = /[^\p{L}\p{N}]+/gu;
5466
+ var WORD_RUNS = /[\p{L}\p{N}]+/gu;
5467
+ function normalizeForMatch(value) {
5468
+ return value.normalize("NFKC").toLocaleLowerCase("en");
5469
+ }
5470
+ function wordsOfNormalized(normalized) {
5471
+ const words = [];
5472
+ for (const segment of WORD_SEGMENTER.segment(normalized)) {
5473
+ if (!segment.isWordLike) continue;
5474
+ for (const word of segment.segment.match(WORD_RUNS) ?? []) words.push(word);
5475
+ }
5476
+ return words;
5477
+ }
5478
+ function brandWords(value) {
5479
+ return wordsOfNormalized(normalizeForMatch(value));
5480
+ }
5481
+ function brandKeyFromText(value) {
5482
+ return brandWords(value).join("");
5483
+ }
5484
+ function compileBrandAliases(aliases) {
5485
+ const keys = /* @__PURE__ */ new Set();
5486
+ let longest = 0;
5487
+ for (const alias of aliases) {
5488
+ if (!alias) continue;
5489
+ const key = brandKeyFromText(alias);
5490
+ if (!key) continue;
5491
+ keys.add(key);
5492
+ if (key.length > longest) longest = key.length;
5493
+ }
5494
+ return { keys, longest };
5495
+ }
5496
+ function matcherMatchesText(matcher, text) {
5497
+ if (!text || matcher.keys.size === 0) return false;
5498
+ const normalized = normalizeForMatch(text);
5499
+ const stripped = normalized.replace(NON_WORD, "");
5500
+ let possible = false;
5501
+ for (const key of matcher.keys) {
5502
+ if (stripped.includes(key)) {
5503
+ possible = true;
5504
+ break;
5505
+ }
5506
+ }
5507
+ if (!possible) return false;
5508
+ const words = wordsOfNormalized(normalized);
5509
+ for (let start = 0; start < words.length; start++) {
5510
+ let candidate = "";
5511
+ for (let end = start; end < words.length; end++) {
5512
+ candidate += words[end];
5513
+ if (matcher.keys.has(candidate)) return true;
5514
+ if (candidate.length >= matcher.longest) break;
5515
+ }
5516
+ }
5517
+ return false;
5518
+ }
5519
+ function matchedAliasKeys(matcher, text) {
5520
+ const found = /* @__PURE__ */ new Set();
5521
+ if (!text || matcher.keys.size === 0) return found;
5522
+ const normalized = normalizeForMatch(text);
5523
+ const stripped = normalized.replace(NON_WORD, "");
5524
+ const reachable = [...matcher.keys].filter((key) => stripped.includes(key));
5525
+ if (reachable.length === 0) return found;
5526
+ const words = wordsOfNormalized(normalized);
5527
+ for (let start = 0; start < words.length; start++) {
5528
+ let candidate = "";
5529
+ for (let end = start; end < words.length; end++) {
5530
+ candidate += words[end];
5531
+ if (matcher.keys.has(candidate)) found.add(candidate);
5532
+ if (candidate.length >= matcher.longest) break;
5533
+ }
5534
+ if (found.size === matcher.keys.size) break;
5535
+ }
5536
+ return found;
5537
+ }
5538
+ function textContainsBrandAlias(text, alias) {
5539
+ if (!alias) return false;
5540
+ return matcherMatchesText(compileBrandAliases([alias]), text);
5541
+ }
5542
+ function textContainsAnyBrandAlias(text, aliases) {
5543
+ return matcherMatchesText(compileBrandAliases(aliases), text);
5544
+ }
5545
+
2610
5546
  // ../contracts/src/embeddings.ts
2611
5547
  function cosineSimilarity(a, b) {
2612
5548
  if (a.length === 0 || b.length === 0) {
@@ -2704,139 +5640,6 @@ function computeDedupSimilarityStats(vectors, indexClusters) {
2704
5640
  return { perClusterMinSimilarity, bandPairFraction: round2(inBand / pairsTotal), pairsTotal };
2705
5641
  }
2706
5642
 
2707
- // ../contracts/src/url-normalize.ts
2708
- var STRIP_KEYS = /* @__PURE__ */ new Set([
2709
- // Click identifiers
2710
- "fbclid",
2711
- "gclid",
2712
- "msclkid",
2713
- "ttclid",
2714
- "li_fat_id",
2715
- "igshid",
2716
- "yclid",
2717
- "dclid",
2718
- "gbraid",
2719
- "wbraid",
2720
- "bingid",
2721
- // Mailchimp
2722
- "mc_cid",
2723
- "mc_eid",
2724
- // Google Analytics linkers
2725
- "_ga",
2726
- "_gl",
2727
- // Google Tag Manager debug
2728
- "gtm_latency",
2729
- "gtm_debug",
2730
- // WordPress internal noise
2731
- "preview",
2732
- "preview_id",
2733
- "preview_nonce",
2734
- "_thumbnail_id",
2735
- // Common cache-busters/versioning
2736
- "v",
2737
- "ver",
2738
- "version"
2739
- ]);
2740
- function shouldStrip(key) {
2741
- if (STRIP_KEYS.has(key)) return true;
2742
- if (key.startsWith("utm_")) return true;
2743
- return false;
2744
- }
2745
- function parseQuery(query) {
2746
- if (query === "") return [];
2747
- return query.split("&").map((pair) => {
2748
- const eq = pair.indexOf("=");
2749
- if (eq === -1) return { key: pair, value: null };
2750
- return { key: pair.slice(0, eq), value: pair.slice(eq + 1) };
2751
- });
2752
- }
2753
- function encodeQuery(pairs) {
2754
- return pairs.map((p) => p.value === null ? p.key : `${p.key}=${p.value}`).join("&");
2755
- }
2756
- function collapseRootIndex(path) {
2757
- if (path === "/index.html" || path === "/index.php") return "/";
2758
- return path;
2759
- }
2760
- function dropTrailingSlash(path) {
2761
- if (path.length > 1 && path.endsWith("/")) {
2762
- return path.replace(/\/+$/, "");
2763
- }
2764
- return path;
2765
- }
2766
- function absolutizeProjectUrl(url, canonicalDomain) {
2767
- if (!url) return "";
2768
- const trimmed = url.trim();
2769
- if (!trimmed) return "";
2770
- if (/^https?:\/\//i.test(trimmed)) return trimmed;
2771
- if (trimmed.startsWith("//")) return `https:${trimmed}`;
2772
- const host = canonicalDomain.trim().replace(/^https?:\/\//i, "").replace(/\/+$/, "");
2773
- if (!host) return trimmed;
2774
- if (trimmed.startsWith("/")) return `https://${host}${trimmed}`;
2775
- return `https://${host}/${trimmed}`;
2776
- }
2777
- function hostOf(value) {
2778
- if (value == null) return null;
2779
- const trimmed = value.trim();
2780
- if (!trimmed) return null;
2781
- try {
2782
- const url = trimmed.includes("://") ? new URL(trimmed) : new URL(`https://${trimmed}`);
2783
- return url.hostname.replace(/^www\./, "").toLowerCase();
2784
- } catch {
2785
- return null;
2786
- }
2787
- }
2788
- function normalizeUrlPath(input) {
2789
- if (input == null) return null;
2790
- let trimmed = input.trim();
2791
- if (trimmed === "") return null;
2792
- trimmed = trimmed.replace(/&nbsp;/g, " ").replace(/\s+/g, " ").trim();
2793
- if (trimmed === "" || trimmed === "/") return "/";
2794
- if (trimmed === "(not set)") return null;
2795
- trimmed = trimmed.replace(/([a-z0-9])[).]+$/i, "$1");
2796
- if (trimmed.startsWith("/)") || trimmed.startsWith("/ ")) {
2797
- trimmed = "/";
2798
- }
2799
- if (trimmed.includes(" ")) {
2800
- trimmed = trimmed.split(" ")[0];
2801
- }
2802
- if (trimmed === "" || trimmed === "/") return "/";
2803
- let pathPart;
2804
- let queryPart;
2805
- if (/^https?:\/\//i.test(trimmed)) {
2806
- let url;
2807
- try {
2808
- url = new URL(trimmed);
2809
- } catch {
2810
- return null;
2811
- }
2812
- pathPart = url.pathname || "/";
2813
- queryPart = url.search.startsWith("?") ? url.search.slice(1) : url.search;
2814
- } else {
2815
- let raw = trimmed;
2816
- const hashIdx = raw.indexOf("#");
2817
- if (hashIdx !== -1) raw = raw.slice(0, hashIdx);
2818
- const qIdx = raw.indexOf("?");
2819
- if (qIdx === -1) {
2820
- pathPart = raw;
2821
- queryPart = "";
2822
- } else {
2823
- pathPart = raw.slice(0, qIdx);
2824
- queryPart = raw.slice(qIdx + 1);
2825
- }
2826
- }
2827
- if (pathPart === "") pathPart = "/";
2828
- pathPart = collapseRootIndex(pathPart);
2829
- pathPart = dropTrailingSlash(pathPart);
2830
- const pairs = parseQuery(queryPart).filter((p) => !shouldStrip(p.key));
2831
- pairs.sort((a, b) => {
2832
- if (a.key < b.key) return -1;
2833
- if (a.key > b.key) return 1;
2834
- return 0;
2835
- });
2836
- if (pairs.length === 0) return pathPart;
2837
- return `${pathPart}?${encodeQuery(pairs)}`;
2838
- }
2839
-
2840
5643
  // ../contracts/src/discovery.ts
2841
5644
  var discoveryBucketSchema = z19.enum(["cited", "aspirational", "wasted-surface"]);
2842
5645
  var DiscoveryBuckets = discoveryBucketSchema.enum;
@@ -2965,48 +5768,20 @@ function seedCollapseWarning(input) {
2965
5768
  return `Seed dedup collapsed ${seedCountRaw} raw candidates into ${canonicalCount} canonical ${noun} at threshold ${dedupThreshold}. Distinct intents were likely merged into one cluster; re-run with a higher --dedup-threshold.`;
2966
5769
  }
2967
5770
  function filterBrandedSeedCandidates(input) {
2968
- const tokens = brandMatchTokens(input.brandNames, input.canonicalDomains);
2969
- if (tokens.length === 0) return { kept: [...input.candidates], droppedBranded: [] };
5771
+ const brandAliases = input.brandNames.filter((name) => brandKeyFromText(name).length >= 3);
5772
+ const domains = input.canonicalDomains.filter((domain) => hostOf(domain) !== null);
5773
+ if (brandAliases.length === 0 && domains.length === 0) {
5774
+ return { kept: [...input.candidates], droppedBranded: [] };
5775
+ }
2970
5776
  const kept = [];
2971
5777
  const droppedBranded = [];
2972
5778
  for (const candidate of input.candidates) {
2973
- const normalized = normalizeForBrandMatch(candidate);
2974
- if (tokens.some((token) => containsWholeToken(normalized, token))) droppedBranded.push(candidate);
5779
+ const branded = textContainsAnyBrandAlias(candidate, brandAliases) || domains.some((domain) => textContainsDomain(candidate, domain));
5780
+ if (branded) droppedBranded.push(candidate);
2975
5781
  else kept.push(candidate);
2976
5782
  }
2977
5783
  return { kept, droppedBranded };
2978
5784
  }
2979
- function normalizeForBrandMatch(text) {
2980
- return text.toLowerCase().replace(/\s+/g, " ").trim();
2981
- }
2982
- function brandMatchTokens(brandNames, canonicalDomains) {
2983
- const tokens = /* @__PURE__ */ new Set();
2984
- for (const name of brandNames) {
2985
- const normalized = normalizeForBrandMatch(name);
2986
- if (normalized.length < 3) continue;
2987
- tokens.add(normalized);
2988
- const squashed = normalized.replace(/[^a-z0-9]/g, "");
2989
- if (squashed.length >= 4 && squashed !== normalized) tokens.add(squashed);
2990
- }
2991
- for (const domain of canonicalDomains) {
2992
- const host = hostOf(domain) ?? normalizeForBrandMatch(domain).replace(/^www\./, "");
2993
- if (!host) continue;
2994
- tokens.add(host);
2995
- tokens.add(`www.${host}`);
2996
- }
2997
- return [...tokens];
2998
- }
2999
- function containsWholeToken(normalized, token) {
3000
- let index = normalized.indexOf(token);
3001
- while (index !== -1) {
3002
- const before = index === 0 ? " " : normalized[index - 1];
3003
- const afterIndex = index + token.length;
3004
- const after = afterIndex >= normalized.length ? " " : normalized[afterIndex];
3005
- if (!/[a-z0-9]/.test(before) && !/[a-z0-9]/.test(after)) return true;
3006
- index = normalized.indexOf(token, index + 1);
3007
- }
3008
- return false;
3009
- }
3010
5785
  var DISCOVERY_SEED_PROVIDERS = ["gemini", "openai"];
3011
5786
  var discoverySeedProviderSchema = z19.enum(DISCOVERY_SEED_PROVIDERS);
3012
5787
  var discoveryRunRequestSchema = z19.object({
@@ -3210,9 +5985,8 @@ function buildHarvestAnchorTerms(corpus, domains = []) {
3210
5985
  for (const token of significantHarvestTokens(text)) set.add(token);
3211
5986
  }
3212
5987
  for (const domain of domains) {
3213
- const host = hostOf(domain);
3214
- if (!host) continue;
3215
- const label = host.replace(/\.[a-z0-9]+$/, "");
5988
+ const label = brandLabelFromDomain(domain);
5989
+ if (!label) continue;
3216
5990
  for (const token of significantHarvestTokens(label)) set.add(token);
3217
5991
  }
3218
5992
  return [...set];
@@ -3336,19 +6110,10 @@ function surfaceClassFromCompetitorType(type) {
3336
6110
  return void 0;
3337
6111
  }
3338
6112
  }
3339
- function matchesAnyDomain(candidate, domains) {
3340
- if (!candidate) return false;
3341
- for (const domain of domains) {
3342
- const normalized = normalizeProjectDomain(domain);
3343
- if (!normalized) continue;
3344
- if (candidate === normalized || candidate.endsWith(`.${normalized}`)) return true;
3345
- }
3346
- return false;
3347
- }
3348
6113
  function classifySurfaceFromCategory(domain, category, context, storedClass) {
3349
6114
  const candidate = normalizeProjectDomain(domain);
3350
- if (matchesAnyDomain(candidate, context.projectDomains)) return SurfaceClasses.own;
3351
- if (matchesAnyDomain(candidate, context.competitorDomains)) return SurfaceClasses["direct-competitor"];
6115
+ if (hostMatchesAnyDomain(candidate, context.projectDomains)) return SurfaceClasses.own;
6116
+ if (hostMatchesAnyDomain(candidate, context.competitorDomains)) return SurfaceClasses["direct-competitor"];
3352
6117
  if (storedClass) return storedClass;
3353
6118
  switch (category) {
3354
6119
  case "directory":
@@ -4260,87 +7025,47 @@ var ga4SessionHistoryEntrySchema = z25.object({
4260
7025
  });
4261
7026
 
4262
7027
  // ../contracts/src/answer-visibility.ts
4263
- var GENERIC_TOKENS = /* @__PURE__ */ new Set([
4264
- "agency",
4265
- "app",
4266
- "company",
4267
- "corp",
4268
- "group",
4269
- "health",
4270
- "inc",
4271
- "llc",
4272
- "online",
4273
- "platform",
4274
- "services",
4275
- "site",
4276
- "solutions",
4277
- "software",
4278
- "systems",
4279
- "tech"
4280
- ]);
4281
- var MIN_BRAND_KEY_LENGTH = 6;
4282
- var BUSINESS_SUFFIXES = [
4283
- "incorporated",
4284
- "corporation",
4285
- "limited",
4286
- "company",
4287
- "gmbh",
4288
- "pllc",
4289
- "corp",
4290
- "group",
4291
- "llp",
4292
- "plc",
4293
- "llc",
4294
- "inc",
4295
- "ltd"
4296
- ];
7028
+ var MIN_DOMAIN_BRAND_KEY_LENGTH = 4;
4297
7029
  function extractAnswerMentions(answerText, brandNames, domains) {
4298
7030
  if (!answerText) return { mentioned: false, matchedTerms: [] };
4299
7031
  const matchedTerms = [];
4300
- const lowerAnswer = answerText.toLowerCase();
7032
+ const matchedDomainTerms = /* @__PURE__ */ new Set();
7033
+ const answerDomains = extractDomainsFromText(answerText);
4301
7034
  for (const domain of domains) {
4302
- const normalizedDomain = normalizeProjectDomain(domain);
7035
+ const normalizedDomain = hostOf(domain);
4303
7036
  if (!normalizedDomain || !normalizedDomain.includes(".")) continue;
4304
- if (domainMentioned(lowerAnswer, normalizedDomain)) {
7037
+ if (answerDomains.some((candidate) => hostMatchesDomain(candidate, normalizedDomain))) {
4305
7038
  matchedTerms.push(normalizedDomain);
7039
+ matchedDomainTerms.add(normalizedDomain);
4306
7040
  }
4307
7041
  }
4308
- const answerNormalized = normalizeText(answerText);
4309
- const answerBrandKey = brandKeyFromText(answerText);
7042
+ const candidates = [];
4310
7043
  for (const brandName of brandNames) {
4311
7044
  if (!brandName || !brandName.trim()) continue;
4312
- const normalizedCandidates = brandNormalizedCandidates(brandName);
4313
- const brandKeyCandidates = brandKeyCandidatesForMatch(brandName);
4314
- const matchesNormalized = normalizedCandidates.some(
4315
- (c) => new RegExp(`\\b${escapeRegExp(c)}\\b`).test(answerNormalized)
4316
- );
4317
- const matchesBrandKey = brandKeyCandidates.some(
4318
- (c) => c.length >= MIN_BRAND_KEY_LENGTH && answerBrandKey.includes(c)
4319
- );
4320
- if (matchesNormalized || matchesBrandKey) {
4321
- matchedTerms.push(brandName);
4322
- }
7045
+ const key = brandKeyFromText(brandName);
7046
+ if (key) candidates.push({ term: brandName, key });
4323
7047
  }
4324
- const brandTokens = collectBrandTokens(brandNames, domains);
4325
- const allTokens = [...brandTokens.primary, ...brandTokens.secondary];
4326
- const secondarySet = new Set(brandTokens.secondary);
4327
- let tokenMatches = 0;
4328
- const matchedPrimary = [];
4329
- for (const token of allTokens) {
4330
- if (new RegExp(`\\b${escapeRegExp(token)}\\b`).test(lowerAnswer)) {
4331
- tokenMatches++;
4332
- if (!secondarySet.has(token)) matchedPrimary.push(token);
4333
- }
7048
+ for (const domain of domains) {
7049
+ const brand = brandLabelFromDomain(domain);
7050
+ const key = brandKeyFromText(brand);
7051
+ if (key.length >= MIN_DOMAIN_BRAND_KEY_LENGTH) candidates.push({ term: brand, key });
4334
7052
  }
4335
- const tokenThresholdMet = allTokens.length > 0 && (allTokens.length === 1 && tokenMatches >= 1 || tokenMatches >= Math.min(2, allTokens.length));
4336
- if (tokenThresholdMet) {
4337
- matchedTerms.push(...matchedPrimary);
7053
+ if (candidates.length > 0) {
7054
+ const hits = matchedAliasKeys(
7055
+ compileBrandAliases(candidates.map((c) => c.term)),
7056
+ answerText
7057
+ );
7058
+ for (const candidate of candidates) {
7059
+ if (hits.has(candidate.key)) matchedTerms.push(candidate.term);
7060
+ }
4338
7061
  }
4339
7062
  const unique = [...new Set(matchedTerms)];
4340
- const domainMatches = unique.filter((t) => t.includes("."));
7063
+ const domainBrandKeys = new Set(
7064
+ [...matchedDomainTerms].map((domain) => brandKeyFromText(brandLabelFromDomain(domain))).filter(Boolean)
7065
+ );
4341
7066
  const dedupedFinal = unique.filter((term) => {
4342
- if (term.includes(".")) return true;
4343
- return !domainMatches.some((d) => d.toLowerCase().startsWith(term.toLowerCase() + "."));
7067
+ if (matchedDomainTerms.has(term)) return true;
7068
+ return !domainBrandKeys.has(brandKeyFromText(term));
4344
7069
  });
4345
7070
  return { mentioned: dedupedFinal.length > 0, matchedTerms: dedupedFinal };
4346
7071
  }
@@ -4353,75 +7078,6 @@ function visibilityStateFromAnswerMentioned(answerMentioned) {
4353
7078
  function mentionStateFromAnswerMentioned(answerMentioned) {
4354
7079
  return answerMentioned ? "mentioned" : "not-mentioned";
4355
7080
  }
4356
- function brandKeyFromText(value) {
4357
- return value.toLowerCase().replace(/[^a-z0-9]/g, "");
4358
- }
4359
- function domainMentioned(lowerAnswer, normalizedDomain) {
4360
- const escapedDomain = escapeRegExp(normalizedDomain.toLowerCase());
4361
- const patterns = [
4362
- new RegExp(`(^|[^a-z0-9-])${escapedDomain}($|[^a-z0-9-])`),
4363
- new RegExp(`https?://(?:www\\.)?${escapedDomain}(?:[/:?#]|$)`),
4364
- new RegExp(`www\\.${escapedDomain}(?:[/:?#]|$)`)
4365
- ];
4366
- return patterns.some((pattern) => pattern.test(lowerAnswer));
4367
- }
4368
- function collectBrandTokens(brandNames, domains) {
4369
- const primary = /* @__PURE__ */ new Set();
4370
- const secondary = /* @__PURE__ */ new Set();
4371
- for (const brandName of brandNames) {
4372
- if (!brandName || !brandName.trim()) continue;
4373
- const distinctiveWords = extractDistinctiveTokens(brandName);
4374
- if (distinctiveWords.length > 0) {
4375
- primary.add(distinctiveWords[0]);
4376
- for (let i = 1; i < distinctiveWords.length; i++) {
4377
- secondary.add(distinctiveWords[i]);
4378
- }
4379
- }
4380
- }
4381
- for (const domain of domains) {
4382
- const reg = registrableDomain(domain);
4383
- const brand = reg ? brandLabelFromDomain(reg) : normalizeProjectDomain(domain).split("/")[0]?.split(".")[0] ?? "";
4384
- const token = brand.replace(/[^a-z0-9]/gi, "").toLowerCase();
4385
- if (isDistinctiveToken(token)) primary.add(token);
4386
- }
4387
- for (const t of primary) secondary.delete(t);
4388
- return { primary: [...primary], secondary: [...secondary] };
4389
- }
4390
- function extractDistinctiveTokens(value) {
4391
- return normalizeText(value).split(" ").filter(isDistinctiveToken);
4392
- }
4393
- function isDistinctiveToken(token) {
4394
- if (token.length < 4) return false;
4395
- return !GENERIC_TOKENS.has(token);
4396
- }
4397
- function normalizeText(value) {
4398
- return value.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
4399
- }
4400
- function brandNormalizedCandidates(displayName) {
4401
- const original = normalizeText(displayName);
4402
- if (!original) return [];
4403
- const stripped = stripBusinessSuffix(original, " ");
4404
- if (!stripped || stripped === original) return [original];
4405
- return [original, stripped];
4406
- }
4407
- function brandKeyCandidatesForMatch(displayName) {
4408
- const original = brandKeyFromText(displayName);
4409
- if (!original) return [];
4410
- const stripped = stripBusinessSuffix(original, "");
4411
- return stripped && stripped !== original ? [original, stripped] : [original];
4412
- }
4413
- function stripBusinessSuffix(value, separator) {
4414
- for (const suffix of BUSINESS_SUFFIXES) {
4415
- const trailing = `${separator}${suffix}`;
4416
- if (value.endsWith(trailing) && value.length - trailing.length >= 3) {
4417
- return value.slice(0, -trailing.length);
4418
- }
4419
- }
4420
- return value;
4421
- }
4422
- function escapeRegExp(value) {
4423
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4424
- }
4425
7081
 
4426
7082
  // ../contracts/src/intelligence.ts
4427
7083
  import { z as z26 } from "zod";
@@ -6724,14 +9380,14 @@ function round(value, dp = 4) {
6724
9380
  const f = 10 ** dp;
6725
9381
  return (Math.round(value * f) + 0) / f;
6726
9382
  }
6727
- function wilsonInterval(successes, n, z39 = 1.96) {
9383
+ function wilsonInterval(successes, n, z40 = 1.96) {
6728
9384
  if (!Number.isFinite(n) || n <= 0) return null;
6729
9385
  const s = Math.max(0, Math.min(successes, n));
6730
9386
  const p = s / n;
6731
- const z210 = z39 * z39;
9387
+ const z210 = z40 * z40;
6732
9388
  const denom = 1 + z210 / n;
6733
9389
  const center = (p + z210 / (2 * n)) / denom;
6734
- const margin = z39 / denom * Math.sqrt(p * (1 - p) / n + z210 / (4 * n * n));
9390
+ const margin = z40 / denom * Math.sqrt(p * (1 - p) / n + z210 / (4 * n * n));
6735
9391
  return {
6736
9392
  low: round(Math.max(0, center - margin)),
6737
9393
  high: round(Math.min(1, center + margin))
@@ -7831,6 +10487,80 @@ function serializeForInlineScript(value) {
7831
10487
  }
7832
10488
 
7833
10489
  // ../contracts/src/telemetry.ts
10490
+ import { z as z39 } from "zod";
10491
+ var ONBOARDING_FLOW_VERSION = 1;
10492
+ var onboardingStepSchema = z39.enum([
10493
+ "system",
10494
+ "project",
10495
+ "queries",
10496
+ "competitors",
10497
+ "run"
10498
+ ]);
10499
+ var onboardingCountBucketSchema = z39.enum([
10500
+ "0",
10501
+ "1",
10502
+ "2-3",
10503
+ "4-5",
10504
+ "6-10",
10505
+ "11+"
10506
+ ]);
10507
+ function bucketOnboardingCount(value) {
10508
+ if (!Number.isFinite(value) || value <= 0) return "0";
10509
+ if (value < 2) return "1";
10510
+ if (value < 4) return "2-3";
10511
+ if (value < 6) return "4-5";
10512
+ if (value < 11) return "6-10";
10513
+ return "11+";
10514
+ }
10515
+ var onboardingBlockReasonSchema = z39.enum([
10516
+ "api_unavailable",
10517
+ "database_unavailable",
10518
+ "worker_unavailable",
10519
+ "no_provider",
10520
+ "no_queries",
10521
+ "provider_save_failed",
10522
+ "project_create_failed",
10523
+ "query_save_failed",
10524
+ "run_rejected",
10525
+ "run_failed",
10526
+ "run_cancelled",
10527
+ "unknown"
10528
+ ]);
10529
+ var onboardingEventBaseSchema = z39.object({
10530
+ eventId: z39.string().uuid(),
10531
+ flowVersion: z39.literal(ONBOARDING_FLOW_VERSION),
10532
+ onboardingSessionId: z39.string().uuid()
10533
+ });
10534
+ var onboardingTelemetryEventSchema = z39.discriminatedUnion("event", [
10535
+ onboardingEventBaseSchema.extend({
10536
+ event: z39.literal("onboarding.started"),
10537
+ step: onboardingStepSchema,
10538
+ resumed: z39.boolean()
10539
+ }).strict(),
10540
+ onboardingEventBaseSchema.extend({
10541
+ event: z39.literal("onboarding.step_completed"),
10542
+ step: onboardingStepSchema,
10543
+ method: z39.enum(["existing", "inline", "manual", "generated", "skipped", "automatic"]),
10544
+ countBucket: onboardingCountBucketSchema.optional()
10545
+ }).strict(),
10546
+ onboardingEventBaseSchema.extend({
10547
+ event: z39.literal("onboarding.blocked"),
10548
+ step: onboardingStepSchema,
10549
+ action: z39.enum(["continue", "configure_provider", "generate_queries", "save", "launch_run", "retry_run"]),
10550
+ reasonCode: onboardingBlockReasonSchema
10551
+ }).strict(),
10552
+ onboardingEventBaseSchema.extend({
10553
+ event: z39.literal("run.requested"),
10554
+ origin: z39.literal("dashboard_setup"),
10555
+ result: z39.enum(["queued", "rejected"]),
10556
+ providerCountBucket: onboardingCountBucketSchema,
10557
+ queryCountBucket: onboardingCountBucketSchema,
10558
+ reasonCode: onboardingBlockReasonSchema.optional()
10559
+ }).strict()
10560
+ ]);
10561
+ var telemetryEventAcceptedDtoSchema = z39.object({
10562
+ accepted: z39.boolean()
10563
+ });
7834
10564
  var GHOST_TELEMETRY_TEST_LOCATIONS = /* @__PURE__ */ new Set(["nyc", "lax", "chi"]);
7835
10565
  function isGhostTelemetryEvent(eventName, properties) {
7836
10566
  if (eventName !== "run.completed" && eventName !== "run.aborted") return false;
@@ -7865,6 +10595,8 @@ export {
7865
10595
  forbidden,
7866
10596
  quotaExceeded,
7867
10597
  providerError,
10598
+ noProvider,
10599
+ noQueries,
7868
10600
  runInProgress,
7869
10601
  operationInProgress,
7870
10602
  runNotCancellable,
@@ -7879,6 +10611,14 @@ export {
7879
10611
  gaMeasurementAnalysisWindowSchema,
7880
10612
  gaMeasurementHostScopeSchema,
7881
10613
  gaMeasurementAnalysisDtoSchema,
10614
+ absolutizeProjectUrl,
10615
+ hostOf,
10616
+ registrableDomain,
10617
+ brandLabelFromDomain,
10618
+ hostMatchesDomain,
10619
+ hostMatchesAnyDomain,
10620
+ textContainsDomain,
10621
+ normalizeUrlPath,
7882
10622
  findDuplicateLocationLabels,
7883
10623
  hasLocationLabel,
7884
10624
  orderLocationsDefaultFirst,
@@ -7894,8 +10634,6 @@ export {
7894
10634
  competitorDtoSchema,
7895
10635
  competitorBatchRequestSchema,
7896
10636
  normalizeProjectDomain,
7897
- registrableDomain,
7898
- brandLabelFromDomain,
7899
10637
  effectiveDomains,
7900
10638
  normalizeProjectAliases,
7901
10639
  effectiveBrandNames,
@@ -8012,13 +10750,13 @@ export {
8012
10750
  categorizeSource,
8013
10751
  categorizeSourceWithCompetitors,
8014
10752
  categoryLabel,
10753
+ brandKeyFromText,
10754
+ textContainsBrandAlias,
10755
+ textContainsAnyBrandAlias,
8015
10756
  cosineSimilarity,
8016
10757
  clusterByCosine,
8017
10758
  pickClusterRepresentative,
8018
10759
  computeDedupSimilarityStats,
8019
- absolutizeProjectUrl,
8020
- hostOf,
8021
- normalizeUrlPath,
8022
10760
  discoveryBucketSchema,
8023
10761
  DiscoveryBuckets,
8024
10762
  DEFAULT_DISCOVERY_PROMOTE_BUCKETS,
@@ -8074,7 +10812,6 @@ export {
8074
10812
  determineAnswerMentioned,
8075
10813
  visibilityStateFromAnswerMentioned,
8076
10814
  mentionStateFromAnswerMentioned,
8077
- brandKeyFromText,
8078
10815
  healthSnapshotDtoSchema,
8079
10816
  agentProvidersResponseDtoSchema,
8080
10817
  MemorySources,
@@ -8256,5 +10993,9 @@ export {
8256
10993
  normalizeIdTokens,
8257
10994
  embedClientConfigForRequest,
8258
10995
  serializeForInlineScript,
10996
+ ONBOARDING_FLOW_VERSION,
10997
+ bucketOnboardingCount,
10998
+ onboardingTelemetryEventSchema,
10999
+ telemetryEventAcceptedDtoSchema,
8259
11000
  isGhostTelemetryEvent
8260
11001
  };