@openreplay/tracker 7.0.3 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/cjs/app/index.d.ts +10 -0
  3. package/cjs/app/index.js +56 -5
  4. package/cjs/app/messages.gen.d.ts +2 -0
  5. package/cjs/app/messages.gen.js +15 -1
  6. package/cjs/app/observer/observer.js +2 -2
  7. package/cjs/app/sanitizer.d.ts +1 -0
  8. package/cjs/app/sanitizer.js +6 -4
  9. package/cjs/app/session.d.ts +4 -0
  10. package/cjs/app/session.js +18 -0
  11. package/cjs/common/interaction.d.ts +1 -0
  12. package/cjs/common/messages.gen.d.ts +12 -2
  13. package/cjs/index.d.ts +1 -0
  14. package/cjs/index.js +9 -1
  15. package/cjs/modules/attributeSender.d.ts +14 -0
  16. package/cjs/modules/attributeSender.js +44 -0
  17. package/cjs/modules/img.js +4 -4
  18. package/cjs/modules/tabs.d.ts +2 -0
  19. package/cjs/modules/tabs.js +13 -0
  20. package/cjs/utils.d.ts +1 -1
  21. package/cjs/utils.js +13 -11
  22. package/coverage/clover.xml +683 -620
  23. package/coverage/coverage-final.json +13 -12
  24. package/coverage/lcov-report/index.html +47 -47
  25. package/coverage/lcov-report/main/app/guards.ts.html +42 -42
  26. package/coverage/lcov-report/main/app/index.html +34 -34
  27. package/coverage/lcov-report/main/app/index.ts.html +62 -8
  28. package/coverage/lcov-report/main/app/logger.ts.html +1 -1
  29. package/coverage/lcov-report/main/app/messages.gen.ts.html +1 -1
  30. package/coverage/lcov-report/main/app/observer/iframe_observer.ts.html +1 -1
  31. package/coverage/lcov-report/main/app/observer/iframe_offsets.ts.html +1 -1
  32. package/coverage/lcov-report/main/app/observer/index.html +1 -1
  33. package/coverage/lcov-report/main/app/observer/shadow_root_observer.ts.html +1 -1
  34. package/coverage/lcov-report/main/app/observer/top_observer.ts.html +1 -1
  35. package/coverage/lcov-report/main/app/sanitizer.ts.html +98 -98
  36. package/coverage/lcov-report/main/app/session.ts.html +1 -1
  37. package/coverage/lcov-report/main/app/ticker.ts.html +1 -1
  38. package/coverage/lcov-report/main/index.html +24 -24
  39. package/coverage/lcov-report/main/index.ts.html +126 -6
  40. package/coverage/lcov-report/main/modules/attributeSender.ts.html +217 -0
  41. package/coverage/lcov-report/main/modules/axiosSpy.ts.html +1 -1
  42. package/coverage/lcov-report/main/modules/connection.ts.html +1 -1
  43. package/coverage/lcov-report/main/modules/console.ts.html +1 -1
  44. package/coverage/lcov-report/main/modules/constructedStyleSheets.ts.html +1 -1
  45. package/coverage/lcov-report/main/modules/cssrules.ts.html +1 -1
  46. package/coverage/lcov-report/main/modules/exception.ts.html +1 -1
  47. package/coverage/lcov-report/main/{app/nodes.ts.html → modules/featureFlags.ts.html} +124 -127
  48. package/coverage/lcov-report/main/modules/focus.ts.html +1 -1
  49. package/coverage/lcov-report/main/modules/fonts.ts.html +1 -1
  50. package/coverage/lcov-report/main/modules/img.ts.html +6 -6
  51. package/coverage/lcov-report/main/modules/index.html +38 -8
  52. package/coverage/lcov-report/main/modules/input.ts.html +1 -1
  53. package/coverage/lcov-report/main/modules/mouse.ts.html +1 -1
  54. package/coverage/lcov-report/main/modules/network.ts.html +1 -1
  55. package/coverage/lcov-report/main/modules/performance.ts.html +1 -1
  56. package/coverage/lcov-report/main/modules/scroll.ts.html +1 -1
  57. package/coverage/lcov-report/main/modules/selection.ts.html +1 -1
  58. package/coverage/lcov-report/main/modules/tabs.ts.html +1 -1
  59. package/coverage/lcov-report/main/modules/timing.ts.html +1 -1
  60. package/coverage/lcov-report/main/modules/viewport.ts.html +1 -1
  61. package/coverage/lcov-report/main/utils.ts.html +112 -112
  62. package/coverage/lcov-report/webworker/BatchWriter.ts.html +125 -176
  63. package/coverage/lcov-report/webworker/MessageEncoder.gen.ts.html +88 -88
  64. package/coverage/lcov-report/webworker/PrimitiveEncoder.ts.html +110 -110
  65. package/coverage/lcov-report/webworker/QueueSender.ts.html +140 -110
  66. package/coverage/lcov-report/webworker/index.html +56 -71
  67. package/coverage/lcov-report/webworker/index.ts.html +34 -10
  68. package/coverage/lcov.info +1232 -1092
  69. package/lib/app/index.d.ts +10 -0
  70. package/lib/app/index.js +57 -6
  71. package/lib/app/messages.gen.d.ts +2 -0
  72. package/lib/app/messages.gen.js +12 -0
  73. package/lib/app/observer/observer.js +3 -3
  74. package/lib/app/sanitizer.d.ts +1 -0
  75. package/lib/app/sanitizer.js +4 -3
  76. package/lib/app/session.d.ts +4 -0
  77. package/lib/app/session.js +18 -0
  78. package/lib/common/interaction.d.ts +1 -0
  79. package/lib/common/messages.gen.d.ts +12 -2
  80. package/lib/common/tsconfig.tsbuildinfo +1 -1
  81. package/lib/index.d.ts +1 -0
  82. package/lib/index.js +9 -1
  83. package/lib/modules/attributeSender.d.ts +14 -0
  84. package/lib/modules/attributeSender.js +39 -0
  85. package/lib/modules/img.js +5 -5
  86. package/lib/modules/tabs.d.ts +2 -0
  87. package/lib/modules/tabs.js +10 -0
  88. package/lib/utils.d.ts +1 -1
  89. package/lib/utils.js +11 -9
  90. package/package.json +5 -2
  91. package/coverage/lcov-report/main/app/observer/observer.ts.html +0 -1282
  92. package/coverage/lcov-report/main/vendors/finder/finder.ts.html +0 -1381
  93. package/coverage/lcov-report/main/vendors/finder/index.html +0 -116
  94. package/coverage/lcov-report/webworker/StringDictionary.ts.html +0 -124
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/269</span>
28
+ <span class='fraction'>0/276</span>
29
29
  </div>
30
30
 
31
31
 
@@ -39,14 +39,14 @@
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/53</span>
42
+ <span class='fraction'>0/56</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/258</span>
49
+ <span class='fraction'>0/265</span>
50
50
  </div>
51
51
 
52
52
 
@@ -719,7 +719,26 @@
719
719
  <a name='L654'></a><a href='#L654'>654</a>
720
720
  <a name='L655'></a><a href='#L655'>655</a>
721
721
  <a name='L656'></a><a href='#L656'>656</a>
722
- <a name='L657'></a><a href='#L657'>657</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
723
742
  <span class="cline-any cline-no">&nbsp;</span>
724
743
  <span class="cline-any cline-no">&nbsp;</span>
725
744
  <span class="cline-any cline-no">&nbsp;</span>
@@ -730,7 +749,6 @@
730
749
  <span class="cline-any cline-no">&nbsp;</span>
731
750
  <span class="cline-any cline-no">&nbsp;</span>
732
751
  <span class="cline-any cline-no">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
752
  <span class="cline-any cline-neutral">&nbsp;</span>
735
753
  <span class="cline-any cline-neutral">&nbsp;</span>
736
754
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -837,6 +855,8 @@
837
855
  <span class="cline-any cline-no">&nbsp;</span>
838
856
  <span class="cline-any cline-neutral">&nbsp;</span>
839
857
  <span class="cline-any cline-no">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-no">&nbsp;</span>
840
860
  <span class="cline-any cline-no">&nbsp;</span>
841
861
  <span class="cline-any cline-no">&nbsp;</span>
842
862
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -845,6 +865,7 @@
845
865
  <span class="cline-any cline-neutral">&nbsp;</span>
846
866
  <span class="cline-any cline-neutral">&nbsp;</span>
847
867
  <span class="cline-any cline-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
869
  <span class="cline-any cline-no">&nbsp;</span>
849
870
  <span class="cline-any cline-no">&nbsp;</span>
850
871
  <span class="cline-any cline-no">&nbsp;</span>
@@ -881,6 +902,7 @@
881
902
  <span class="cline-any cline-no">&nbsp;</span>
882
903
  <span class="cline-any cline-no">&nbsp;</span>
883
904
  <span class="cline-any cline-no">&nbsp;</span>
905
+ <span class="cline-any cline-no">&nbsp;</span>
884
906
  <span class="cline-any cline-neutral">&nbsp;</span>
885
907
  <span class="cline-any cline-no">&nbsp;</span>
886
908
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1170,6 +1192,14 @@
1170
1192
  <span class="cline-any cline-neutral">&nbsp;</span>
1171
1193
  <span class="cline-any cline-neutral">&nbsp;</span>
1172
1194
  <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1173
1203
  <span class="cline-any cline-no">&nbsp;</span>
1174
1204
  <span class="cline-any cline-neutral">&nbsp;</span>
1175
1205
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1267,6 +1297,7 @@
1267
1297
  <span class="cline-any cline-neutral">&nbsp;</span>
1268
1298
  <span class="cline-any cline-neutral">&nbsp;</span>
1269
1299
  <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-neutral">&nbsp;</span>
1270
1301
  <span class="cline-any cline-no">&nbsp;</span>
1271
1302
  <span class="cline-any cline-neutral">&nbsp;</span>
1272
1303
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1358,6 +1389,11 @@
1358
1389
  <span class="cline-any cline-neutral">&nbsp;</span>
1359
1390
  <span class="cline-any cline-neutral">&nbsp;</span>
1360
1391
  <span class="cline-any cline-neutral">&nbsp;</span>
1392
+ <span class="cline-any cline-neutral">&nbsp;</span>
1393
+ <span class="cline-any cline-no">&nbsp;</span>
1394
+ <span class="cline-any cline-neutral">&nbsp;</span>
1395
+ <span class="cline-any cline-neutral">&nbsp;</span>
1396
+ <span class="cline-any cline-no">&nbsp;</span>
1361
1397
  <span class="cline-any cline-no">&nbsp;</span>
1362
1398
  <span class="cline-any cline-no">&nbsp;</span>
1363
1399
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1386,7 +1422,7 @@
1386
1422
  <span class="cstat-no" title="statement not covered" >import Session from './session.js'</span>
1387
1423
  <span class="cstat-no" title="statement not covered" >import { gzip } from 'fflate'</span>
1388
1424
  <span class="cstat-no" title="statement not covered" >import { deviceMemory, jsHeapSizeLimit } from '../modules/performance.js'</span>
1389
- &nbsp;
1425
+ <span class="cstat-no" title="statement not covered" >import AttributeSender from '../modules/attributeSender.js'</span>
1390
1426
  import type { Options as ObserverOptions } from './observer/top_observer.js'
1391
1427
  import type { Options as SanitizerOptions } from './sanitizer.js'
1392
1428
  import type { Options as LoggerOptions } from './logger.js'
@@ -1486,15 +1522,18 @@ export const <span class="cstat-no" title="statement not covered" >DEFAULT_INGES
1486
1522
  private readonly <span class="cstat-no" title="statement not covered" >startCallbacks: Array&lt;StartCallback&gt; = []</span>
1487
1523
  private readonly <span class="cstat-no" title="statement not covered" >stopCallbacks: Array&lt;() =&gt; any&gt; = []</span>
1488
1524
  private readonly <span class="cstat-no" title="statement not covered" >commitCallbacks: Array&lt;CommitCallback&gt; = []</span>
1489
- private readonly options: AppOptions
1525
+ public readonly options: AppOptions
1490
1526
  public readonly networkOptions?: NetworkOptions
1491
1527
  private readonly revID: string
1492
1528
  private <span class="cstat-no" title="statement not covered" >activityState: ActivityState = ActivityState.NotActive</span>
1493
1529
  private readonly <span class="cstat-no" title="statement not covered" >version = 'TRACKER_VERSION' /</span>/ TODO: version compatability check inside each plugin.
1494
1530
  private readonly worker?: TypedWorker
1531
+ private <span class="cstat-no" title="statement not covered" >featureFlags: string[] = []</span>
1532
+ &nbsp;
1495
1533
  private <span class="cstat-no" title="statement not covered" >compressionThreshold = 24 * 1000</span>
1496
1534
  private <span class="cstat-no" title="statement not covered" >restartAttempts = 0</span>
1497
1535
  private readonly <span class="cstat-no" title="statement not covered" >bc: BroadcastChannel = new BroadcastChannel('rick')</span>
1536
+ public attributeSender: AttributeSender
1498
1537
  &nbsp;
1499
1538
  <span class="fstat-no" title="function not covered" > constructor(p</span>rojectKey: string, sessionToken: string | undefined, options: Partial&lt;Options&gt;) {
1500
1539
  // if (options.onStart !== undefined) {
@@ -1535,6 +1574,7 @@ export const <span class="cstat-no" title="statement not covered" >DEFAULT_INGES
1535
1574
  <span class="cstat-no" title="statement not covered" > this.debug = new Logger(this.options.__debug__)</span>
1536
1575
  <span class="cstat-no" title="statement not covered" > this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent)</span>
1537
1576
  <span class="cstat-no" title="statement not covered" > this.session = new Session(this, this.options)</span>
1577
+ <span class="cstat-no" title="statement not covered" > this.attributeSender = new AttributeSender(this)</span>
1538
1578
  <span class="cstat-no" title="statement not covered" > this.session.attachUpdateCallback(<span class="fstat-no" title="function not covered" >({</span> userID, metadata }) =&gt; {</span>
1539
1579
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (userID != null) {</span>
1540
1580
  // TODO: nullable userID
@@ -1824,6 +1864,14 @@ export const <span class="cstat-no" title="statement not covered" >DEFAULT_INGES
1824
1864
  <span class="cstat-no" title="statement not covered" > return this.activityState === ActivityState.Active</span>
1825
1865
  }
1826
1866
  &nbsp;
1867
+ <span class="fstat-no" title="function not covered" > isFeatureActive(</span>feature: string): boolean {
1868
+ <span class="cstat-no" title="statement not covered" > return this.featureFlags.includes(feature)</span>
1869
+ }
1870
+ &nbsp;
1871
+ <span class="fstat-no" title="function not covered" > getFeatureFlags(</span>): string[] {
1872
+ <span class="cstat-no" title="statement not covered" > return this.featureFlags</span>
1873
+ }
1874
+ &nbsp;
1827
1875
  <span class="fstat-no" title="function not covered" > resetNextPageSession(</span>flag: boolean) {
1828
1876
  <span class="cstat-no" title="statement not covered" > if (flag) {</span>
1829
1877
  <span class="cstat-no" title="statement not covered" > this.sessionStorage.setItem(this.options.session_reset_key, 't')</span>
@@ -1923,6 +1971,7 @@ export const <span class="cstat-no" title="statement not covered" >DEFAULT_INGES
1923
1971
  sessionID, // derived from token
1924
1972
  startTimestamp, // real startTS (server time), derived from sessionID
1925
1973
  } = <span class="cstat-no" title="statement not covered" >r</span>
1974
+ // TODO: insert feature flags here
1926
1975
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1927
1976
  typeof token !== 'string' ||
1928
1977
  typeof userUUID !== 'string' ||
@@ -2013,9 +2062,14 @@ export const <span class="cstat-no" title="statement not covered" >DEFAULT_INGES
2013
2062
  })
2014
2063
  }
2015
2064
  }
2065
+ &nbsp;
2066
+ <span class="fstat-no" title="function not covered" > getTabId(</span>) {
2067
+ <span class="cstat-no" title="statement not covered" > return this.session.getTabId()</span>
2068
+ }
2016
2069
  <span class="fstat-no" title="function not covered" > stop(</span>stopWorker = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: void {
2017
2070
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState !== ActivityState.NotActive) {</span>
2018
2071
  <span class="cstat-no" title="statement not covered" > try {</span>
2072
+ <span class="cstat-no" title="statement not covered" > this.attributeSender.clear()</span>
2019
2073
  <span class="cstat-no" title="statement not covered" > this.sanitizer.clear()</span>
2020
2074
  <span class="cstat-no" title="statement not covered" > this.observer.disconnect()</span>
2021
2075
  <span class="cstat-no" title="statement not covered" > this.nodes.clear()</span>
@@ -2038,7 +2092,7 @@ export const <span class="cstat-no" title="statement not covered" >DEFAULT_INGES
2038
2092
  <div class='footer quiet pad2 space-top1 center small'>
2039
2093
  Code coverage generated by
2040
2094
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2041
- at 2023-05-31T15:51:28.464Z
2095
+ at 2023-06-15T15:49:15.198Z
2042
2096
  </div>
2043
2097
  <script src="../../prettify.js"></script>
2044
2098
  <script>
@@ -262,7 +262,7 @@ export type Options = true | _Options | LogLevel
262
262
  <div class='footer quiet pad2 space-top1 center small'>
263
263
  Code coverage generated by
264
264
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
265
- at 2023-05-31T15:51:28.464Z
265
+ at 2023-06-15T15:49:15.198Z
266
266
  </div>
267
267
  <script src="../../prettify.js"></script>
268
268
  <script>
@@ -2737,7 +2737,7 @@ export { default, Type } from '../../common/messages.gen.js'
2737
2737
  <div class='footer quiet pad2 space-top1 center small'>
2738
2738
  Code coverage generated by
2739
2739
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2740
- at 2023-05-31T15:51:28.464Z
2740
+ at 2023-06-15T15:49:15.198Z
2741
2741
  </div>
2742
2742
  <script src="../../prettify.js"></script>
2743
2743
  <script>
@@ -133,7 +133,7 @@
133
133
  <div class='footer quiet pad2 space-top1 center small'>
134
134
  Code coverage generated by
135
135
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
136
- at 2023-05-31T15:51:28.464Z
136
+ at 2023-06-15T15:49:15.198Z
137
137
  </div>
138
138
  <script src="../../../prettify.js"></script>
139
139
  <script>
@@ -274,7 +274,7 @@ type OffsetState = {
274
274
  <div class='footer quiet pad2 space-top1 center small'>
275
275
  Code coverage generated by
276
276
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
277
- at 2023-05-31T15:51:28.464Z
277
+ at 2023-06-15T15:49:15.198Z
278
278
  </div>
279
279
  <script src="../../../prettify.js"></script>
280
280
  <script>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2023-05-31T15:51:28.464Z
149
+ at 2023-06-15T15:49:15.198Z
150
150
  </div>
151
151
  <script src="../../../prettify.js"></script>
152
152
  <script>
@@ -127,7 +127,7 @@
127
127
  <div class='footer quiet pad2 space-top1 center small'>
128
128
  Code coverage generated by
129
129
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
130
- at 2023-05-31T15:51:28.464Z
130
+ at 2023-06-15T15:49:15.198Z
131
131
  </div>
132
132
  <script src="../../../prettify.js"></script>
133
133
  <script>
@@ -520,7 +520,7 @@ const attachShadowNativeFn = <span class="cstat-no" title="statement not covered
520
520
  <div class='footer quiet pad2 space-top1 center small'>
521
521
  Code coverage generated by
522
522
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
523
- at 2023-05-31T15:51:28.464Z
523
+ at 2023-06-15T15:49:15.198Z
524
524
  </div>
525
525
  <script src="../../../prettify.js"></script>
526
526
  <script>