@afixt/test-utils 1.1.2 → 1.1.4

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 (132) hide show
  1. package/.claude/settings.local.json +6 -2
  2. package/.github/workflows/test.yml +26 -0
  3. package/BROWSER_TESTING.md +109 -0
  4. package/CLAUDE.md +22 -0
  5. package/package.json +6 -8
  6. package/playwright.config.js +27 -0
  7. package/src/domUtils.js +1 -1
  8. package/src/getAccessibleName.js +8 -4
  9. package/src/getCSSGeneratedContent.js +9 -5
  10. package/src/getFocusableElements.js +13 -4
  11. package/src/getImageText.js +4 -1
  12. package/src/testContrast.js +5 -1
  13. package/test/__screenshots__/getImageText.test.js/getImageText-should-be-an-async-function-1.png +0 -0
  14. package/test/__screenshots__/getImageText.test.js/getImageText-should-be-defined-and-exported-from-the-module-1.png +0 -0
  15. package/test/__screenshots__/getImageText.test.js/getImageText-should-handle-empty-string-input-gracefully-1.png +0 -0
  16. package/test/__screenshots__/getImageText.test.js/getImageText-should-handle-invalid-image-paths-gracefully-1.png +0 -0
  17. package/test/__screenshots__/getImageText.test.js/getImageText-should-handle-null-or-undefined-input-gracefully-1.png +0 -0
  18. package/test/__screenshots__/getImageText.test.js/getImageText-should-log-errors-in-non-test-environments-1.png +0 -0
  19. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-call-original-addEventListener-1.png +0 -0
  20. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-added-event-listeners-1.png +0 -0
  21. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-listeners-for-different-event-types-1.png +0 -0
  22. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-multiple-listeners-for-the-same-event-1.png +0 -0
  23. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-addEventListener-override-should-track-options-parameter-1.png +0 -0
  24. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getEventListeners-should-return-all-event-listeners-for-an-element-1.png +0 -0
  25. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getEventListeners-should-return-empty-object-for-elements-without-listeners-1.png +0 -0
  26. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getXPath-should-generate-XPath-for-elements-without-id-1.png +0 -0
  27. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getXPath-should-handle-multiple-siblings-correctly-1.png +0 -0
  28. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-getXPath-should-return-XPath-for-element-with-id-1.png +0 -0
  29. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-event-listeners-on-child-elements-1.png +0 -0
  30. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-event-listeners-on-root-element-1.png +0 -0
  31. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-listeners-from-multiple-elements-1.png +0 -0
  32. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-list-multiple-event-types-on-same-element-1.png +0 -0
  33. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-return-empty-array-when-no-event-listeners-exist-1.png +0 -0
  34. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-use-document-as-default-root-element-1.png +0 -0
  35. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-listEventListeners-should-work-with-custom-root-element-1.png +0 -0
  36. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-call-original-removeEventListener-1.png +0 -0
  37. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-handle-removing-non-existent-listeners-gracefully-1.png +0 -0
  38. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-only-remove-the-specified-listener-1.png +0 -0
  39. package/test/__screenshots__/listEventListeners.test.js/listEventListeners-removeEventListener-override-should-remove-tracked-event-listeners-1.png +0 -0
  40. package/test/arrayUtils.test.js +22 -0
  41. package/test/domUtils.test.js +241 -0
  42. package/test/getAccessibleName.test.js +182 -0
  43. package/test/getAccessibleText.test.js +350 -79
  44. package/test/getCSSGeneratedContent.test.js +175 -1
  45. package/test/getFocusableElements.test.js +106 -35
  46. package/test/getImageText.test.js +95 -12
  47. package/test/getStyleObject.test.js +19 -1
  48. package/test/hasCSSGeneratedContent.test.js +7 -2
  49. package/test/hasParent.test.js +116 -0
  50. package/test/hasValidAriaRole.test.js +64 -2
  51. package/test/index.test.js +165 -0
  52. package/test/interactiveRoles.test.js +60 -0
  53. package/test/isAriaAttributesValid.test.js +36 -0
  54. package/test/isDataTable.test.js +492 -0
  55. package/test/isFocusable.test.js +94 -1
  56. package/test/isValidUrl.test.js +31 -19
  57. package/test/isVisible.test.js +121 -3
  58. package/test/playwright/css-pseudo-elements.spec.js +155 -0
  59. package/test/playwright/fixtures/css-pseudo-elements.html +77 -0
  60. package/test/setup.js +9 -1
  61. package/test/stringUtils.test.js +277 -1
  62. package/test/testContrast.test.js +614 -9
  63. package/test/testLang.test.js +152 -11
  64. package/test/testOrder.integration.test.js +369 -0
  65. package/test/testOrder.test.js +756 -21
  66. package/todo.md +11 -1
  67. package/vitest.config.js +8 -1
  68. package/coverage/base.css +0 -224
  69. package/coverage/block-navigation.js +0 -87
  70. package/coverage/coverage-final.json +0 -51
  71. package/coverage/favicon.png +0 -0
  72. package/coverage/index.html +0 -161
  73. package/coverage/prettify.css +0 -1
  74. package/coverage/prettify.js +0 -2
  75. package/coverage/sort-arrow-sprite.png +0 -0
  76. package/coverage/sorter.js +0 -196
  77. package/coverage/test-utils/docs/scripts/core.js.html +0 -2263
  78. package/coverage/test-utils/docs/scripts/core.min.js.html +0 -151
  79. package/coverage/test-utils/docs/scripts/index.html +0 -176
  80. package/coverage/test-utils/docs/scripts/resize.js.html +0 -355
  81. package/coverage/test-utils/docs/scripts/search.js.html +0 -880
  82. package/coverage/test-utils/docs/scripts/search.min.js.html +0 -100
  83. package/coverage/test-utils/docs/scripts/third-party/fuse.js.html +0 -109
  84. package/coverage/test-utils/docs/scripts/third-party/hljs-line-num-original.js.html +0 -1192
  85. package/coverage/test-utils/docs/scripts/third-party/hljs-line-num.js.html +0 -85
  86. package/coverage/test-utils/docs/scripts/third-party/hljs-original.js.html +0 -15598
  87. package/coverage/test-utils/docs/scripts/third-party/hljs.js.html +0 -85
  88. package/coverage/test-utils/docs/scripts/third-party/index.html +0 -236
  89. package/coverage/test-utils/docs/scripts/third-party/popper.js.html +0 -100
  90. package/coverage/test-utils/docs/scripts/third-party/tippy.js.html +0 -88
  91. package/coverage/test-utils/docs/scripts/third-party/tocbot.js.html +0 -2098
  92. package/coverage/test-utils/docs/scripts/third-party/tocbot.min.js.html +0 -85
  93. package/coverage/test-utils/index.html +0 -131
  94. package/coverage/test-utils/src/arrayUtils.js.html +0 -283
  95. package/coverage/test-utils/src/domUtils.js.html +0 -622
  96. package/coverage/test-utils/src/getAccessibleName.js.html +0 -1444
  97. package/coverage/test-utils/src/getAccessibleText.js.html +0 -271
  98. package/coverage/test-utils/src/getAriaAttributesByElement.js.html +0 -142
  99. package/coverage/test-utils/src/getCSSGeneratedContent.js.html +0 -265
  100. package/coverage/test-utils/src/getComputedRole.js.html +0 -592
  101. package/coverage/test-utils/src/getFocusableElements.js.html +0 -163
  102. package/coverage/test-utils/src/getGeneratedContent.js.html +0 -130
  103. package/coverage/test-utils/src/getImageText.js.html +0 -160
  104. package/coverage/test-utils/src/getStyleObject.js.html +0 -220
  105. package/coverage/test-utils/src/hasAccessibleName.js.html +0 -166
  106. package/coverage/test-utils/src/hasAttribute.js.html +0 -130
  107. package/coverage/test-utils/src/hasCSSGeneratedContent.js.html +0 -145
  108. package/coverage/test-utils/src/hasHiddenParent.js.html +0 -172
  109. package/coverage/test-utils/src/hasParent.js.html +0 -247
  110. package/coverage/test-utils/src/hasValidAriaAttributes.js.html +0 -175
  111. package/coverage/test-utils/src/hasValidAriaRole.js.html +0 -172
  112. package/coverage/test-utils/src/index.html +0 -611
  113. package/coverage/test-utils/src/index.js.html +0 -274
  114. package/coverage/test-utils/src/interactiveRoles.js.html +0 -145
  115. package/coverage/test-utils/src/isAriaAttributesValid.js.html +0 -304
  116. package/coverage/test-utils/src/isComplexTable.js.html +0 -412
  117. package/coverage/test-utils/src/isDataTable.js.html +0 -799
  118. package/coverage/test-utils/src/isFocusable.js.html +0 -187
  119. package/coverage/test-utils/src/isHidden.js.html +0 -136
  120. package/coverage/test-utils/src/isOffScreen.js.html +0 -133
  121. package/coverage/test-utils/src/isValidUrl.js.html +0 -124
  122. package/coverage/test-utils/src/isVisible.js.html +0 -271
  123. package/coverage/test-utils/src/listEventListeners.js.html +0 -370
  124. package/coverage/test-utils/src/queryCache.js.html +0 -1156
  125. package/coverage/test-utils/src/stringUtils.js.html +0 -535
  126. package/coverage/test-utils/src/testContrast.js.html +0 -784
  127. package/coverage/test-utils/src/testLang.js.html +0 -1810
  128. package/coverage/test-utils/src/testOrder.js.html +0 -355
  129. package/coverage/test-utils/vitest.config.browser.js.html +0 -133
  130. package/coverage/test-utils/vitest.config.js.html +0 -157
  131. package/test/browser-setup.js +0 -68
  132. package/vitest.config.browser.js +0 -17
@@ -1,1156 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for test-utils/src/queryCache.js</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">test-utils/src</a> queryCache.js</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">95.88% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>303/316</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">92.1% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>70/76</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>16/16</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">95.88% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>303/316</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
424
- <span class="cline-any cline-yes">1x</span>
425
- <span class="cline-any cline-yes">1x</span>
426
- <span class="cline-any cline-yes">1x</span>
427
- <span class="cline-any cline-neutral">&nbsp;</span>
428
- <span class="cline-any cline-yes">1x</span>
429
- <span class="cline-any cline-yes">1x</span>
430
- <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-yes">1x</span>
432
- <span class="cline-any cline-yes">1x</span>
433
- <span class="cline-any cline-yes">33x</span>
434
- <span class="cline-any cline-yes">3x</span>
435
- <span class="cline-any cline-yes">3x</span>
436
- <span class="cline-any cline-neutral">&nbsp;</span>
437
- <span class="cline-any cline-yes">30x</span>
438
- <span class="cline-any cline-yes">30x</span>
439
- <span class="cline-any cline-yes">30x</span>
440
- <span class="cline-any cline-yes">30x</span>
441
- <span class="cline-any cline-yes">30x</span>
442
- <span class="cline-any cline-yes">30x</span>
443
- <span class="cline-any cline-yes">33x</span>
444
- <span class="cline-any cline-yes">33x</span>
445
- <span class="cline-any cline-yes">33x</span>
446
- <span class="cline-any cline-yes">33x</span>
447
- <span class="cline-any cline-yes">33x</span>
448
- <span class="cline-any cline-yes">33x</span>
449
- <span class="cline-any cline-yes">33x</span>
450
- <span class="cline-any cline-yes">33x</span>
451
- <span class="cline-any cline-yes">33x</span>
452
- <span class="cline-any cline-yes">33x</span>
453
- <span class="cline-any cline-yes">33x</span>
454
- <span class="cline-any cline-yes">33x</span>
455
- <span class="cline-any cline-yes">33x</span>
456
- <span class="cline-any cline-yes">33x</span>
457
- <span class="cline-any cline-yes">33x</span>
458
- <span class="cline-any cline-yes">33x</span>
459
- <span class="cline-any cline-yes">33x</span>
460
- <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-yes">1x</span>
462
- <span class="cline-any cline-yes">1x</span>
463
- <span class="cline-any cline-yes">1x</span>
464
- <span class="cline-any cline-yes">1x</span>
465
- <span class="cline-any cline-yes">1x</span>
466
- <span class="cline-any cline-yes">1x</span>
467
- <span class="cline-any cline-yes">38x</span>
468
- <span class="cline-any cline-yes">3x</span>
469
- <span class="cline-any cline-yes">3x</span>
470
- <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-yes">35x</span>
472
- <span class="cline-any cline-yes">35x</span>
473
- <span class="cline-any cline-yes">35x</span>
474
- <span class="cline-any cline-yes">38x</span>
475
- <span class="cline-any cline-yes">6x</span>
476
- <span class="cline-any cline-yes">6x</span>
477
- <span class="cline-any cline-yes">6x</span>
478
- <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-yes">29x</span>
480
- <span class="cline-any cline-yes">29x</span>
481
- <span class="cline-any cline-yes">29x</span>
482
- <span class="cline-any cline-yes">29x</span>
483
- <span class="cline-any cline-yes">38x</span>
484
- <span class="cline-any cline-neutral">&nbsp;</span>
485
- <span class="cline-any cline-yes">1x</span>
486
- <span class="cline-any cline-yes">1x</span>
487
- <span class="cline-any cline-yes">1x</span>
488
- <span class="cline-any cline-yes">1x</span>
489
- <span class="cline-any cline-yes">1x</span>
490
- <span class="cline-any cline-yes">1x</span>
491
- <span class="cline-any cline-yes">17x</span>
492
- <span class="cline-any cline-yes">3x</span>
493
- <span class="cline-any cline-yes">3x</span>
494
- <span class="cline-any cline-neutral">&nbsp;</span>
495
- <span class="cline-any cline-yes">14x</span>
496
- <span class="cline-any cline-yes">14x</span>
497
- <span class="cline-any cline-yes">14x</span>
498
- <span class="cline-any cline-yes">17x</span>
499
- <span class="cline-any cline-yes">2x</span>
500
- <span class="cline-any cline-yes">2x</span>
501
- <span class="cline-any cline-yes">2x</span>
502
- <span class="cline-any cline-neutral">&nbsp;</span>
503
- <span class="cline-any cline-yes">12x</span>
504
- <span class="cline-any cline-yes">12x</span>
505
- <span class="cline-any cline-yes">12x</span>
506
- <span class="cline-any cline-yes">12x</span>
507
- <span class="cline-any cline-yes">17x</span>
508
- <span class="cline-any cline-neutral">&nbsp;</span>
509
- <span class="cline-any cline-yes">1x</span>
510
- <span class="cline-any cline-yes">1x</span>
511
- <span class="cline-any cline-yes">1x</span>
512
- <span class="cline-any cline-yes">1x</span>
513
- <span class="cline-any cline-yes">1x</span>
514
- <span class="cline-any cline-yes">1x</span>
515
- <span class="cline-any cline-yes">17x</span>
516
- <span class="cline-any cline-yes">3x</span>
517
- <span class="cline-any cline-yes">3x</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-yes">14x</span>
520
- <span class="cline-any cline-yes">14x</span>
521
- <span class="cline-any cline-yes">17x</span>
522
- <span class="cline-any cline-yes">1x</span>
523
- <span class="cline-any cline-yes">1x</span>
524
- <span class="cline-any cline-yes">1x</span>
525
- <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-yes">13x</span>
527
- <span class="cline-any cline-yes">13x</span>
528
- <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-yes">13x</span>
530
- <span class="cline-any cline-yes">17x</span>
531
- <span class="cline-any cline-yes">8x</span>
532
- <span class="cline-any cline-yes">8x</span>
533
- <span class="cline-any cline-yes">17x</span>
534
- <span class="cline-any cline-yes">5x</span>
535
- <span class="cline-any cline-yes">5x</span>
536
- <span class="cline-any cline-yes">5x</span>
537
- <span class="cline-any cline-no">&nbsp;</span>
538
- <span class="cline-any cline-no">&nbsp;</span>
539
- <span class="cline-any cline-no">&nbsp;</span>
540
- <span class="cline-any cline-no">&nbsp;</span>
541
- <span class="cline-any cline-no">&nbsp;</span>
542
- <span class="cline-any cline-no">&nbsp;</span>
543
- <span class="cline-any cline-yes">5x</span>
544
- <span class="cline-any cline-no">&nbsp;</span>
545
- <span class="cline-any cline-no">&nbsp;</span>
546
- <span class="cline-any cline-no">&nbsp;</span>
547
- <span class="cline-any cline-neutral">&nbsp;</span>
548
- <span class="cline-any cline-yes">13x</span>
549
- <span class="cline-any cline-yes">13x</span>
550
- <span class="cline-any cline-yes">17x</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-yes">1x</span>
553
- <span class="cline-any cline-yes">1x</span>
554
- <span class="cline-any cline-yes">1x</span>
555
- <span class="cline-any cline-yes">1x</span>
556
- <span class="cline-any cline-yes">1x</span>
557
- <span class="cline-any cline-yes">1x</span>
558
- <span class="cline-any cline-yes">3x</span>
559
- <span class="cline-any cline-yes">3x</span>
560
- <span class="cline-any cline-yes">3x</span>
561
- <span class="cline-any cline-yes">3x</span>
562
- <span class="cline-any cline-yes">15x</span>
563
- <span class="cline-any cline-yes">7x</span>
564
- <span class="cline-any cline-yes">7x</span>
565
- <span class="cline-any cline-yes">7x</span>
566
- <span class="cline-any cline-yes">7x</span>
567
- <span class="cline-any cline-yes">15x</span>
568
- <span class="cline-any cline-yes">3x</span>
569
- <span class="cline-any cline-yes">3x</span>
570
- <span class="cline-any cline-yes">3x</span>
571
- <span class="cline-any cline-neutral">&nbsp;</span>
572
- <span class="cline-any cline-yes">1x</span>
573
- <span class="cline-any cline-yes">1x</span>
574
- <span class="cline-any cline-yes">1x</span>
575
- <span class="cline-any cline-yes">1x</span>
576
- <span class="cline-any cline-yes">1x</span>
577
- <span class="cline-any cline-yes">1x</span>
578
- <span class="cline-any cline-yes">3x</span>
579
- <span class="cline-any cline-yes">3x</span>
580
- <span class="cline-any cline-yes">3x</span>
581
- <span class="cline-any cline-yes">3x</span>
582
- <span class="cline-any cline-yes">4x</span>
583
- <span class="cline-any cline-yes">3x</span>
584
- <span class="cline-any cline-yes">3x</span>
585
- <span class="cline-any cline-yes">3x</span>
586
- <span class="cline-any cline-yes">3x</span>
587
- <span class="cline-any cline-yes">4x</span>
588
- <span class="cline-any cline-yes">3x</span>
589
- <span class="cline-any cline-yes">3x</span>
590
- <span class="cline-any cline-yes">3x</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-yes">1x</span>
593
- <span class="cline-any cline-yes">1x</span>
594
- <span class="cline-any cline-yes">1x</span>
595
- <span class="cline-any cline-yes">1x</span>
596
- <span class="cline-any cline-yes">1x</span>
597
- <span class="cline-any cline-yes">2x</span>
598
- <span class="cline-any cline-yes">2x</span>
599
- <span class="cline-any cline-yes">2x</span>
600
- <span class="cline-any cline-yes">2x</span>
601
- <span class="cline-any cline-yes">2x</span>
602
- <span class="cline-any cline-yes">2x</span>
603
- <span class="cline-any cline-yes">2x</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-yes">1x</span>
606
- <span class="cline-any cline-yes">1x</span>
607
- <span class="cline-any cline-yes">1x</span>
608
- <span class="cline-any cline-yes">1x</span>
609
- <span class="cline-any cline-yes">1x</span>
610
- <span class="cline-any cline-yes">1x</span>
611
- <span class="cline-any cline-yes">1x</span>
612
- <span class="cline-any cline-yes">1x</span>
613
- <span class="cline-any cline-yes">1x</span>
614
- <span class="cline-any cline-yes">1x</span>
615
- <span class="cline-any cline-yes">1x</span>
616
- <span class="cline-any cline-yes">1x</span>
617
- <span class="cline-any cline-yes">1x</span>
618
- <span class="cline-any cline-yes">1x</span>
619
- <span class="cline-any cline-neutral">&nbsp;</span>
620
- <span class="cline-any cline-yes">1x</span>
621
- <span class="cline-any cline-yes">1x</span>
622
- <span class="cline-any cline-yes">1x</span>
623
- <span class="cline-any cline-yes">1x</span>
624
- <span class="cline-any cline-yes">1x</span>
625
- <span class="cline-any cline-yes">49x</span>
626
- <span class="cline-any cline-yes">40x</span>
627
- <span class="cline-any cline-yes">40x</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-yes">9x</span>
630
- <span class="cline-any cline-yes">49x</span>
631
- <span class="cline-any cline-no">&nbsp;</span>
632
- <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-yes">9x</span>
635
- <span class="cline-any cline-yes">49x</span>
636
- <span class="cline-any cline-yes">1x</span>
637
- <span class="cline-any cline-yes">1x</span>
638
- <span class="cline-any cline-yes">1x</span>
639
- <span class="cline-any cline-yes">1x</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-yes">8x</span>
642
- <span class="cline-any cline-yes">8x</span>
643
- <span class="cline-any cline-yes">8x</span>
644
- <span class="cline-any cline-yes">8x</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-yes">8x</span>
647
- <span class="cline-any cline-yes">49x</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-yes">1x</span>
650
- <span class="cline-any cline-yes">1x</span>
651
- <span class="cline-any cline-yes">1x</span>
652
- <span class="cline-any cline-yes">1x</span>
653
- <span class="cline-any cline-yes">1x</span>
654
- <span class="cline-any cline-yes">41x</span>
655
- <span class="cline-any cline-yes">41x</span>
656
- <span class="cline-any cline-yes">3x</span>
657
- <span class="cline-any cline-yes">3x</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-yes">41x</span>
660
- <span class="cline-any cline-yes">41x</span>
661
- <span class="cline-any cline-yes">41x</span>
662
- <span class="cline-any cline-yes">41x</span>
663
- <span class="cline-any cline-yes">41x</span>
664
- <span class="cline-any cline-yes">41x</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-yes">1x</span>
667
- <span class="cline-any cline-yes">1x</span>
668
- <span class="cline-any cline-yes">1x</span>
669
- <span class="cline-any cline-yes">1x</span>
670
- <span class="cline-any cline-yes">1x</span>
671
- <span class="cline-any cline-yes">14x</span>
672
- <span class="cline-any cline-yes">12x</span>
673
- <span class="cline-any cline-yes">12x</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-yes">2x</span>
676
- <span class="cline-any cline-yes">14x</span>
677
- <span class="cline-any cline-no">&nbsp;</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-yes">2x</span>
681
- <span class="cline-any cline-yes">14x</span>
682
- <span class="cline-any cline-yes">1x</span>
683
- <span class="cline-any cline-yes">1x</span>
684
- <span class="cline-any cline-yes">1x</span>
685
- <span class="cline-any cline-yes">1x</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-yes">1x</span>
688
- <span class="cline-any cline-yes">1x</span>
689
- <span class="cline-any cline-yes">1x</span>
690
- <span class="cline-any cline-yes">1x</span>
691
- <span class="cline-any cline-neutral">&nbsp;</span>
692
- <span class="cline-any cline-yes">1x</span>
693
- <span class="cline-any cline-yes">14x</span>
694
- <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-yes">1x</span>
696
- <span class="cline-any cline-yes">1x</span>
697
- <span class="cline-any cline-yes">1x</span>
698
- <span class="cline-any cline-yes">1x</span>
699
- <span class="cline-any cline-yes">1x</span>
700
- <span class="cline-any cline-yes">13x</span>
701
- <span class="cline-any cline-yes">13x</span>
702
- <span class="cline-any cline-yes">1x</span>
703
- <span class="cline-any cline-yes">1x</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-yes">13x</span>
706
- <span class="cline-any cline-yes">13x</span>
707
- <span class="cline-any cline-yes">13x</span>
708
- <span class="cline-any cline-yes">13x</span>
709
- <span class="cline-any cline-yes">13x</span>
710
- <span class="cline-any cline-yes">13x</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-yes">1x</span>
713
- <span class="cline-any cline-yes">1x</span>
714
- <span class="cline-any cline-yes">1x</span>
715
- <span class="cline-any cline-yes">1x</span>
716
- <span class="cline-any cline-yes">1x</span>
717
- <span class="cline-any cline-yes">3x</span>
718
- <span class="cline-any cline-yes">3x</span>
719
- <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-yes">3x</span>
721
- <span class="cline-any cline-yes">9x</span>
722
- <span class="cline-any cline-yes">9x</span>
723
- <span class="cline-any cline-yes">9x</span>
724
- <span class="cline-any cline-neutral">&nbsp;</span>
725
- <span class="cline-any cline-yes">9x</span>
726
- <span class="cline-any cline-yes">3x</span>
727
- <span class="cline-any cline-yes">3x</span>
728
- <span class="cline-any cline-yes">3x</span>
729
- <span class="cline-any cline-yes">9x</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-yes">3x</span>
732
- <span class="cline-any cline-yes">3x</span>
733
- <span class="cline-any cline-yes">3x</span>
734
- <span class="cline-any cline-yes">3x</span>
735
- <span class="cline-any cline-yes">3x</span>
736
- <span class="cline-any cline-yes">3x</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-yes">1x</span>
739
- <span class="cline-any cline-yes">1x</span>
740
- <span class="cline-any cline-yes">1x</span>
741
- <span class="cline-any cline-yes">1x</span>
742
- <span class="cline-any cline-yes">1x</span>
743
- <span class="cline-any cline-yes">1x</span>
744
- <span class="cline-any cline-yes">1x</span>
745
- <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-yes">1x</span>
747
- <span class="cline-any cline-yes">2x</span>
748
- <span class="cline-any cline-yes">2x</span>
749
- <span class="cline-any cline-yes">2x</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-yes">2x</span>
752
- <span class="cline-any cline-yes">1x</span>
753
- <span class="cline-any cline-yes">1x</span>
754
- <span class="cline-any cline-yes">1x</span>
755
- <span class="cline-any cline-yes">2x</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-yes">1x</span>
758
- <span class="cline-any cline-yes">1x</span>
759
- <span class="cline-any cline-yes">1x</span>
760
- <span class="cline-any cline-yes">1x</span>
761
- <span class="cline-any cline-yes">1x</span>
762
- <span class="cline-any cline-yes">1x</span>
763
- <span class="cline-any cline-neutral">&nbsp;</span>
764
- <span class="cline-any cline-yes">1x</span>
765
- <span class="cline-any cline-yes">1x</span>
766
- <span class="cline-any cline-yes">1x</span>
767
- <span class="cline-any cline-yes">1x</span>
768
- <span class="cline-any cline-yes">1x</span>
769
- <span class="cline-any cline-yes">8x</span>
770
- <span class="cline-any cline-yes">8x</span>
771
- <span class="cline-any cline-yes">8x</span>
772
- <span class="cline-any cline-yes">8x</span>
773
- <span class="cline-any cline-yes">8x</span>
774
- <span class="cline-any cline-yes">8x</span>
775
- <span class="cline-any cline-yes">8x</span>
776
- <span class="cline-any cline-yes">8x</span>
777
- <span class="cline-any cline-yes">8x</span>
778
- <span class="cline-any cline-yes">1x</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-yes">1x</span></td><td class="text"><pre class="prettyprint lang-js">/**
781
- * @module QueryCache
782
- * @description Advanced DOM query caching utility with TTL, size limits, and performance optimizations
783
- */
784
- &nbsp;
785
- // Sentinel value to distinguish between cache miss and cached null
786
- const CACHE_MISS = Symbol('CACHE_MISS');
787
- &nbsp;
788
- class QueryCache {
789
- constructor(targetElement, options = {}) {
790
- if (!targetElement || !(targetElement instanceof Element || targetElement === document)) {
791
- throw new Error('QueryCache requires a valid DOM element or document');
792
- }
793
- &nbsp;
794
- this.targetElement = targetElement;
795
- this.cache = new Map();
796
- this.computedStyleCache = new Map();
797
-
798
- // Configuration options
799
- this.options = {
800
- maxCacheSize: options.maxCacheSize || 1000,
801
- maxComputedStyleSize: options.maxComputedStyleSize || 500,
802
- ttl: options.ttl || 60000, // Default 60 seconds
803
- evictionStrategy: options.evictionStrategy || 'lru' // 'lru' or 'fifo'
804
- };
805
-
806
- // Cache metadata for LRU/FIFO eviction
807
- this.cacheMetadata = new Map();
808
- this.computedStyleMetadata = new Map();
809
-
810
- // Statistics
811
- this.stats = {
812
- hits: 0,
813
- misses: 0,
814
- evictions: 0
815
- };
816
- }
817
- &nbsp;
818
- /**
819
- * Get a single element by selector with caching
820
- * @param {string} selector - CSS selector
821
- * @returns {Element|null} - Cached or fresh query result
822
- */
823
- querySelector(selector) {
824
- if (typeof selector !== 'string' || !selector.trim()) {
825
- throw new Error('querySelector requires a non-empty string selector');
826
- }
827
- &nbsp;
828
- const cacheKey = `single:${selector}`;
829
- const cached = this._getCachedValue(cacheKey);
830
-
831
- if (cached !== CACHE_MISS) {
832
- this.stats.hits++;
833
- return cached;
834
- }
835
- &nbsp;
836
- this.stats.misses++;
837
- const element = this.targetElement.querySelector(selector);
838
- this._setCachedValue(cacheKey, element);
839
- return element;
840
- }
841
- &nbsp;
842
- /**
843
- * Get elements by selector with caching
844
- * @param {string} selector - CSS selector
845
- * @returns {NodeList} - Cached or fresh query results
846
- */
847
- querySelectorAll(selector) {
848
- if (typeof selector !== 'string' || !selector.trim()) {
849
- throw new Error('querySelectorAll requires a non-empty string selector');
850
- }
851
- &nbsp;
852
- const cacheKey = `all:${selector}`;
853
- const cached = this._getCachedValue(cacheKey);
854
-
855
- if (cached !== CACHE_MISS) {
856
- this.stats.hits++;
857
- return cached;
858
- }
859
- &nbsp;
860
- this.stats.misses++;
861
- const elements = this.targetElement.querySelectorAll(selector);
862
- this._setCachedValue(cacheKey, elements);
863
- return elements;
864
- }
865
- &nbsp;
866
- /**
867
- * Get computed style for an element with caching
868
- * @param {Element} element - DOM element
869
- * @returns {CSSStyleDeclaration} - Cached or fresh computed style
870
- */
871
- getComputedStyle(element) {
872
- if (!element || !(element instanceof Element)) {
873
- throw new Error('getComputedStyle requires a valid DOM element');
874
- }
875
- &nbsp;
876
- const cached = this._getCachedComputedStyle(element);
877
-
878
- if (cached !== CACHE_MISS) {
879
- this.stats.hits++;
880
- return cached;
881
- }
882
- &nbsp;
883
- this.stats.misses++;
884
- let computedStyle;
885
- &nbsp;
886
- // Handle test environment gracefully
887
- if (typeof global !== 'undefined' &amp;&amp; (global.jest || global.vitest)) {
888
- // In test environment, create a mock computed style with basic properties
889
- computedStyle = this._createMockComputedStyle(element);
890
- } else if (typeof window !== 'undefined' &amp;&amp; window.getComputedStyle) {
891
- try {
892
- computedStyle = window.getComputedStyle(element);
893
- } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
894
- <span class="cstat-no" title="statement not covered" > // Log the error and provide a fallback for environments where getComputedStyle fails</span>
895
- <span class="cstat-no" title="statement not covered" > if (typeof console !== 'undefined' &amp;&amp; console.error) {</span>
896
- <span class="cstat-no" title="statement not covered" > console.error('getComputedStyle failed:', error);</span>
897
- <span class="cstat-no" title="statement not covered" > }</span>
898
- <span class="cstat-no" title="statement not covered" > computedStyle = this._createMockComputedStyle(element);</span>
899
- <span class="cstat-no" title="statement not covered" > }</span>
900
- }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
901
- <span class="cstat-no" title="statement not covered" > // Fallback for other environments</span>
902
- <span class="cstat-no" title="statement not covered" > computedStyle = this._createMockComputedStyle(element);</span>
903
- <span class="cstat-no" title="statement not covered" > }</span>
904
- &nbsp;
905
- this._setCachedComputedStyle(element, computedStyle);
906
- return computedStyle;
907
- }
908
- &nbsp;
909
- /**
910
- * Invalidate specific cache entries by selector pattern
911
- * @param {string|RegExp} pattern - Selector pattern to match
912
- * @returns {number} - Number of entries invalidated
913
- */
914
- invalidate(pattern) {
915
- let count = 0;
916
- const regex = pattern instanceof RegExp ? pattern : new RegExp(pattern);
917
-
918
- for (const [key] of this.cache) {
919
- if (regex.test(key)) {
920
- this.cache.delete(key);
921
- this.cacheMetadata.delete(key);
922
- count++;
923
- }
924
- }
925
-
926
- return count;
927
- }
928
- &nbsp;
929
- /**
930
- * Invalidate computed style cache for specific elements
931
- * @param {Element|Element[]} elements - Element(s) to invalidate
932
- * @returns {number} - Number of entries invalidated
933
- */
934
- invalidateComputedStyles(elements) {
935
- const elemArray = Array.isArray(elements) ? elements : [elements];
936
- let count = 0;
937
-
938
- for (const element of elemArray) {
939
- if (this.computedStyleCache.has(element)) {
940
- this.computedStyleCache.delete(element);
941
- this.computedStyleMetadata.delete(element);
942
- count++;
943
- }
944
- }
945
-
946
- return count;
947
- }
948
- &nbsp;
949
- /**
950
- * Get cache statistics
951
- * @returns {Object} - Cache statistics
952
- */
953
- getStats() {
954
- return {
955
- ...this.stats,
956
- cacheSize: this.cache.size,
957
- computedStyleCacheSize: this.computedStyleCache.size,
958
- hitRate: this.stats.hits / (this.stats.hits + this.stats.misses) || 0
959
- };
960
- }
961
- &nbsp;
962
- /**
963
- * Clear all caches
964
- */
965
- clear() {
966
- this.cache.clear();
967
- this.computedStyleCache.clear();
968
- this.cacheMetadata.clear();
969
- this.computedStyleMetadata.clear();
970
- this.stats = {
971
- hits: 0,
972
- misses: 0,
973
- evictions: 0
974
- };
975
- }
976
- &nbsp;
977
- /**
978
- * Private method to get cached value with TTL check
979
- * @private
980
- */
981
- _getCachedValue(key) {
982
- if (!this.cache.has(key)) {
983
- return CACHE_MISS;
984
- }
985
- &nbsp;
986
- const metadata = this.cacheMetadata.get(key);
987
- if (!metadata) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
988
- <span class="cstat-no" title="statement not covered" > return CACHE_MISS;</span>
989
- <span class="cstat-no" title="statement not covered" > }</span>
990
- &nbsp;
991
- // Check TTL
992
- if (Date.now() - metadata.timestamp &gt; this.options.ttl) {
993
- this.cache.delete(key);
994
- this.cacheMetadata.delete(key);
995
- return CACHE_MISS;
996
- }
997
- &nbsp;
998
- // Update access time for LRU
999
- if (this.options.evictionStrategy === 'lru') {
1000
- metadata.lastAccessed = Date.now();
1001
- }
1002
- &nbsp;
1003
- return this.cache.get(key);
1004
- }
1005
- &nbsp;
1006
- /**
1007
- * Private method to set cached value with eviction
1008
- * @private
1009
- */
1010
- _setCachedValue(key, value) {
1011
- // Check cache size limit
1012
- if (this.cache.size &gt;= this.options.maxCacheSize) {
1013
- this._evictFromCache();
1014
- }
1015
- &nbsp;
1016
- this.cache.set(key, value);
1017
- this.cacheMetadata.set(key, {
1018
- timestamp: Date.now(),
1019
- lastAccessed: Date.now()
1020
- });
1021
- }
1022
- &nbsp;
1023
- /**
1024
- * Private method to get cached computed style with TTL check
1025
- * @private
1026
- */
1027
- _getCachedComputedStyle(element) {
1028
- if (!this.computedStyleCache.has(element)) {
1029
- return CACHE_MISS;
1030
- }
1031
- &nbsp;
1032
- const metadata = this.computedStyleMetadata.get(element);
1033
- if (!metadata) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1034
- <span class="cstat-no" title="statement not covered" > return CACHE_MISS;</span>
1035
- <span class="cstat-no" title="statement not covered" > }</span>
1036
- &nbsp;
1037
- // Check TTL
1038
- if (Date.now() - metadata.timestamp &gt; this.options.ttl) {
1039
- this.computedStyleCache.delete(element);
1040
- this.computedStyleMetadata.delete(element);
1041
- return CACHE_MISS;
1042
- }
1043
- &nbsp;
1044
- // Update access time for LRU
1045
- if (this.options.evictionStrategy === 'lru') {
1046
- metadata.lastAccessed = Date.now();
1047
- }
1048
- &nbsp;
1049
- return this.computedStyleCache.get(element);
1050
- }
1051
- &nbsp;
1052
- /**
1053
- * Private method to set cached computed style with eviction
1054
- * @private
1055
- */
1056
- _setCachedComputedStyle(element, computedStyle) {
1057
- // Check cache size limit
1058
- if (this.computedStyleCache.size &gt;= this.options.maxComputedStyleSize) {
1059
- this._evictFromComputedStyleCache();
1060
- }
1061
- &nbsp;
1062
- this.computedStyleCache.set(element, computedStyle);
1063
- this.computedStyleMetadata.set(element, {
1064
- timestamp: Date.now(),
1065
- lastAccessed: Date.now()
1066
- });
1067
- }
1068
- &nbsp;
1069
- /**
1070
- * Private method to evict entries from main cache
1071
- * @private
1072
- */
1073
- _evictFromCache() {
1074
- let oldestKey = null;
1075
- let oldestTime = Infinity;
1076
- &nbsp;
1077
- for (const [key, metadata] of this.cacheMetadata) {
1078
- const timeToCompare = this.options.evictionStrategy === 'lru'
1079
- ? metadata.lastAccessed
1080
- : metadata.timestamp;
1081
- &nbsp;
1082
- if (timeToCompare &lt; oldestTime) {
1083
- oldestTime = timeToCompare;
1084
- oldestKey = key;
1085
- }
1086
- }
1087
- &nbsp;
1088
- if (oldestKey !== null) {
1089
- this.cache.delete(oldestKey);
1090
- this.cacheMetadata.delete(oldestKey);
1091
- this.stats.evictions++;
1092
- }
1093
- }
1094
- &nbsp;
1095
- /**
1096
- * Private method to evict entries from computed style cache
1097
- * @private
1098
- */
1099
- _evictFromComputedStyleCache() {
1100
- let oldestElement = null;
1101
- let oldestTime = Infinity;
1102
- &nbsp;
1103
- for (const [element, metadata] of this.computedStyleMetadata) {
1104
- const timeToCompare = this.options.evictionStrategy === 'lru'
1105
- <span class="branch-0 cbranch-no" title="branch not covered" > ? metadata.lastAccessed </span>
1106
- : metadata.timestamp;
1107
- &nbsp;
1108
- if (timeToCompare &lt; oldestTime) {
1109
- oldestTime = timeToCompare;
1110
- oldestElement = element;
1111
- }
1112
- }
1113
- &nbsp;
1114
- if (oldestElement !== null) {
1115
- this.computedStyleCache.delete(oldestElement);
1116
- this.computedStyleMetadata.delete(oldestElement);
1117
- this.stats.evictions++;
1118
- }
1119
- }
1120
- &nbsp;
1121
- /**
1122
- * Private method to create mock computed style
1123
- * @private
1124
- */
1125
- _createMockComputedStyle(element) {
1126
- return {
1127
- backgroundColor: element.style?.backgroundColor || 'rgba(0, 0, 0, 0)',
1128
- color: element.style?.color || 'rgb(0, 0, 0)',
1129
- display: element.style?.display || 'block',
1130
- visibility: element.style?.visibility || 'visible',
1131
- opacity: element.style?.opacity || '1',
1132
- getPropertyValue: (prop) =&gt; element.style?.[prop] <span class="branch-0 cbranch-no" title="branch not covered" >|| '',</span>
1133
- };
1134
- }
1135
- }
1136
- &nbsp;
1137
- export default QueryCache;</pre></td></tr></table></pre>
1138
-
1139
- <div class='push'></div><!-- for sticky footer -->
1140
- </div><!-- /wrapper -->
1141
- <div class='footer quiet pad2 space-top1 center small'>
1142
- Code coverage generated by
1143
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1144
- at 2025-06-23T19:41:12.391Z
1145
- </div>
1146
- <script src="../../prettify.js"></script>
1147
- <script>
1148
- window.onload = function () {
1149
- prettyPrint();
1150
- };
1151
- </script>
1152
- <script src="../../sorter.js"></script>
1153
- <script src="../../block-navigation.js"></script>
1154
- </body>
1155
- </html>
1156
-