@adguard/agtree 3.3.0 → 3.4.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 (263) hide show
  1. package/dist/ast-utils/clone.js +1 -1
  2. package/dist/ast-utils/modifiers.js +1 -1
  3. package/dist/ast-utils/network-rules.js +1 -1
  4. package/dist/ast-utils/scriptlets.js +1 -1
  5. package/dist/common/abp-snippet-injection-body-common.js +1 -1
  6. package/dist/common/agent-common.js +1 -1
  7. package/dist/common/ubo-selector-common.js +1 -1
  8. package/dist/compatibility-tables/base.js +2 -2
  9. package/dist/compatibility-tables/compatibility-table-data.js +1 -1
  10. package/dist/compatibility-tables/modifiers.js +4 -3
  11. package/dist/compatibility-tables/platforms.js +32 -30
  12. package/dist/compatibility-tables/redirects.js +11 -7
  13. package/dist/compatibility-tables/schemas/base.js +1 -1
  14. package/dist/compatibility-tables/schemas/modifier.js +1 -1
  15. package/dist/compatibility-tables/schemas/platform.js +57 -4
  16. package/dist/compatibility-tables/schemas/redirect.js +1 -1
  17. package/dist/compatibility-tables/schemas/resource-type.js +1 -1
  18. package/dist/compatibility-tables/schemas/scriptlet.js +1 -1
  19. package/dist/compatibility-tables/scriptlets.js +1 -1
  20. package/dist/compatibility-tables/utils/platform-helpers.js +290 -7
  21. package/dist/compatibility-tables/utils/resource-type-helpers.js +2 -2
  22. package/dist/compatibility-tables/utils/zod-camelcase.js +1 -1
  23. package/dist/converter/base-interfaces/base-converter.js +1 -1
  24. package/dist/converter/base-interfaces/conversion-result.js +1 -1
  25. package/dist/converter/base-interfaces/rule-converter-base.js +1 -1
  26. package/dist/converter/comment/index.js +1 -1
  27. package/dist/converter/cosmetic/css.js +1 -1
  28. package/dist/converter/cosmetic/element-hiding.js +1 -1
  29. package/dist/converter/cosmetic/header-removal.js +1 -1
  30. package/dist/converter/cosmetic/html.js +1 -1
  31. package/dist/converter/cosmetic/index.js +1 -1
  32. package/dist/converter/cosmetic/rule-modifiers/adg.js +1 -1
  33. package/dist/converter/cosmetic/rule-modifiers/ubo.js +2 -1
  34. package/dist/converter/cosmetic/scriptlet.js +1 -1
  35. package/dist/converter/css/index.js +2 -1
  36. package/dist/converter/data/css.js +1 -1
  37. package/dist/converter/filter-list.js +1 -1
  38. package/dist/converter/index.js +1 -1
  39. package/dist/converter/misc/network-rule-modifier.js +1 -1
  40. package/dist/converter/network/index.js +1 -1
  41. package/dist/converter/raw-filter-list.js +1 -1
  42. package/dist/converter/raw-rule.js +2 -1
  43. package/dist/converter/rule.js +1 -1
  44. package/dist/deserializer/base-deserializer.js +1 -1
  45. package/dist/deserializer/comment/agent-comment-deserializer.js +1 -1
  46. package/dist/deserializer/comment/agent-deserializer.js +1 -1
  47. package/dist/deserializer/comment/comment-rule-deserializer.js +1 -1
  48. package/dist/deserializer/comment/config-comment-deserializer.js +1 -1
  49. package/dist/deserializer/comment/hint-comment-deserializer.js +1 -1
  50. package/dist/deserializer/comment/hint-deserializer.js +1 -1
  51. package/dist/deserializer/comment/metadata-comment-deserializer.js +1 -1
  52. package/dist/deserializer/comment/pre-processor-comment-deserializer.js +1 -1
  53. package/dist/deserializer/comment/simple-comment-deserializer.js +1 -1
  54. package/dist/deserializer/cosmetic/cosmetic-rule-deserializer.js +1 -1
  55. package/dist/deserializer/cosmetic/css-injection-body-deserializer.js +1 -1
  56. package/dist/deserializer/cosmetic/element-hiding-body-deserializer.js +1 -1
  57. package/dist/deserializer/cosmetic/scriptlet-body/abp-snippet-injection-body-deserializer.js +1 -1
  58. package/dist/deserializer/cosmetic/scriptlet-body/adg-scriptlet-injection-body-deserializer.js +1 -1
  59. package/dist/deserializer/cosmetic/scriptlet-body/scriptlet-body-deserializer.js +1 -1
  60. package/dist/deserializer/cosmetic/scriptlet-body/ubo-scriptlet-injection-body-deserializer.js +1 -1
  61. package/dist/deserializer/empty-rule-deserializer.js +1 -1
  62. package/dist/deserializer/filterlist-deserializer.js +1 -1
  63. package/dist/deserializer/index.js +1 -1
  64. package/dist/deserializer/invalid-rule-deserializer.js +1 -1
  65. package/dist/deserializer/invalid-rule-error-node-deserializer.js +1 -1
  66. package/dist/deserializer/misc/domain-list-deserializer.js +1 -1
  67. package/dist/deserializer/misc/list-item-deserializer.js +1 -1
  68. package/dist/deserializer/misc/list-items-deserializer.js +1 -1
  69. package/dist/deserializer/misc/logical-expression-deserializer.js +1 -1
  70. package/dist/deserializer/misc/modifier-deserializer.js +1 -1
  71. package/dist/deserializer/misc/modifier-list-deserializer.js +1 -1
  72. package/dist/deserializer/misc/parameter-list-deserializer.js +1 -1
  73. package/dist/deserializer/misc/value-deserializer.js +1 -1
  74. package/dist/deserializer/network/host-rule-deserializer.js +1 -1
  75. package/dist/deserializer/network/hostname-list-deserializer.js +1 -1
  76. package/dist/deserializer/network/network-rule-deserializer.js +1 -1
  77. package/dist/deserializer/rule-deserializer.js +1 -1
  78. package/dist/deserializer/syntax-deserialization-map.js +1 -1
  79. package/dist/errors/adblock-syntax-error.js +1 -1
  80. package/dist/errors/binary-schema-mismatch-error.js +1 -1
  81. package/dist/errors/not-implemented-error.js +1 -1
  82. package/dist/errors/rule-conversion-error.js +1 -1
  83. package/dist/generator/base-generator.js +1 -1
  84. package/dist/generator/comment/agent-comment-generator.js +1 -1
  85. package/dist/generator/comment/agent-generator.js +1 -1
  86. package/dist/generator/comment/comment-rule-generator.js +1 -1
  87. package/dist/generator/comment/config-comment-generator.js +1 -1
  88. package/dist/generator/comment/hint-comment-generator.js +1 -1
  89. package/dist/generator/comment/hint-generator.js +1 -1
  90. package/dist/generator/comment/metadata-comment-generator.js +1 -1
  91. package/dist/generator/comment/pre-processor-comment-generator.js +1 -1
  92. package/dist/generator/comment/simple-comment-generator.js +1 -1
  93. package/dist/generator/cosmetic/body/abp-snippet-injection-body-generator.js +1 -1
  94. package/dist/generator/cosmetic/body/adg-scriptlet-injection-body-generator.js +1 -1
  95. package/dist/generator/cosmetic/body/ubo-scriptlet-injection-body-generator.js +1 -1
  96. package/dist/generator/cosmetic/cosmetic-rule-body-generator.js +1 -1
  97. package/dist/generator/cosmetic/cosmetic-rule-generator.js +1 -1
  98. package/dist/generator/cosmetic/cosmetic-rule-pattern-generator.js +1 -1
  99. package/dist/generator/css/adg-css-injection-generator.js +1 -1
  100. package/dist/generator/filterlist-generator.js +1 -1
  101. package/dist/generator/index.js +1 -1
  102. package/dist/generator/misc/domain-list-generator.js +1 -1
  103. package/dist/generator/misc/list-items-generator.js +1 -1
  104. package/dist/generator/misc/logical-expression-generator.js +1 -1
  105. package/dist/generator/misc/modifier-generator.js +1 -1
  106. package/dist/generator/misc/modifier-list-generator.js +1 -1
  107. package/dist/generator/misc/parameter-list-generator.js +1 -1
  108. package/dist/generator/misc/value-generator.js +1 -1
  109. package/dist/generator/network/host-rule-generator.js +1 -1
  110. package/dist/generator/network/network-rule-generator.js +1 -1
  111. package/dist/generator/rule-generator.js +1 -1
  112. package/dist/index.js +4 -4
  113. package/dist/marshalling-utils/comment/agent-comment-common.js +1 -1
  114. package/dist/marshalling-utils/comment/agent-common.js +1 -1
  115. package/dist/marshalling-utils/comment/config-comment-common.js +1 -1
  116. package/dist/marshalling-utils/comment/hint-comment-common.js +1 -1
  117. package/dist/marshalling-utils/comment/hint-common.js +1 -1
  118. package/dist/marshalling-utils/comment/metadata-comment-common.js +1 -1
  119. package/dist/marshalling-utils/comment/pre-processor-comment-common.js +1 -1
  120. package/dist/marshalling-utils/comment/simple-comment-common.js +1 -1
  121. package/dist/marshalling-utils/cosmetic/body/abp-snippet-injection-body-common.js +1 -1
  122. package/dist/marshalling-utils/cosmetic/body/adg-scriptlet-injection-body-common.js +1 -1
  123. package/dist/marshalling-utils/cosmetic/body/css-injection-body-common.js +1 -1
  124. package/dist/marshalling-utils/cosmetic/body/element-hiding-body-common.js +1 -1
  125. package/dist/marshalling-utils/cosmetic/body/ubo-scriptlet-injection-body-common.js +1 -1
  126. package/dist/marshalling-utils/cosmetic/cosmetic-rule-common.js +1 -1
  127. package/dist/marshalling-utils/empty-rule-common.js +1 -1
  128. package/dist/marshalling-utils/filter-list-common.js +1 -1
  129. package/dist/marshalling-utils/invalid-rule-common.js +1 -1
  130. package/dist/marshalling-utils/invalid-rule-error-node-common.js +1 -1
  131. package/dist/marshalling-utils/misc/binary-type-common.js +1 -1
  132. package/dist/marshalling-utils/misc/domain-list-common.js +1 -1
  133. package/dist/marshalling-utils/misc/host-rule-common.js +1 -1
  134. package/dist/marshalling-utils/misc/hostname-list-common.js +1 -1
  135. package/dist/marshalling-utils/misc/list-item-common.js +1 -1
  136. package/dist/marshalling-utils/misc/logical-expression-common.js +1 -1
  137. package/dist/marshalling-utils/misc/modifier-common.js +1 -1
  138. package/dist/marshalling-utils/misc/modifier-list-common.js +1 -1
  139. package/dist/marshalling-utils/misc/parameter-list-common.js +1 -1
  140. package/dist/marshalling-utils/misc/value-common.js +1 -1
  141. package/dist/marshalling-utils/network/network-rule-common.js +1 -1
  142. package/dist/marshalling-utils/syntax-serialization-map.js +1 -1
  143. package/dist/nodes/index.js +1 -1
  144. package/dist/package.json.js +2 -2
  145. package/dist/parser/base-parser.js +1 -1
  146. package/dist/parser/comment/agent-comment-parser.js +1 -1
  147. package/dist/parser/comment/agent-parser.js +1 -1
  148. package/dist/parser/comment/comment-parser.js +1 -1
  149. package/dist/parser/comment/config-comment-parser.js +1 -1
  150. package/dist/parser/comment/hint-comment-parser.js +1 -1
  151. package/dist/parser/comment/hint-parser.js +1 -1
  152. package/dist/parser/comment/metadata-comment-parser.js +1 -1
  153. package/dist/parser/comment/preprocessor-parser.js +1 -1
  154. package/dist/parser/comment/simple-comment-parser.js +1 -1
  155. package/dist/parser/cosmetic/body/abp-snippet-injection-body-parser.js +1 -1
  156. package/dist/parser/cosmetic/body/adg-scriptlet-injection-body-parser.js +1 -1
  157. package/dist/parser/cosmetic/body/ubo-scriptlet-injection-body-parser.js +1 -1
  158. package/dist/parser/cosmetic/cosmetic-rule-parser.js +1 -1
  159. package/dist/parser/css/adg-css-injection-parser.js +1 -1
  160. package/dist/parser/css/balancing.js +1 -1
  161. package/dist/parser/css/constants.js +1 -1
  162. package/dist/parser/css/css-token-stream.js +1 -1
  163. package/dist/parser/css/ubo-selector-parser.js +1 -1
  164. package/dist/parser/filterlist-parser.js +1 -1
  165. package/dist/parser/index.js +1 -1
  166. package/dist/parser/misc/app-list-parser.js +1 -1
  167. package/dist/parser/misc/domain-list-parser.js +1 -1
  168. package/dist/parser/misc/list-items-parser.js +1 -1
  169. package/dist/parser/misc/logical-expression-parser.js +1 -1
  170. package/dist/parser/misc/method-list-parser.js +1 -1
  171. package/dist/parser/misc/modifier-list.js +1 -1
  172. package/dist/parser/misc/modifier-parser.js +1 -1
  173. package/dist/parser/misc/parameter-list-parser.js +1 -1
  174. package/dist/parser/misc/stealth-option-list-parser.js +1 -1
  175. package/dist/parser/misc/ubo-parameter-list-parser.js +1 -1
  176. package/dist/parser/misc/value-parser.js +1 -1
  177. package/dist/parser/network/host-rule-parser.js +1 -1
  178. package/dist/parser/network/network-rule-parser.js +1 -1
  179. package/dist/parser/options.js +1 -1
  180. package/dist/parser/rule-parser.js +1 -1
  181. package/dist/serializer/base-serializer.js +1 -1
  182. package/dist/serializer/comment/agent-comment-serializer.js +1 -1
  183. package/dist/serializer/comment/agent-serializer.js +1 -1
  184. package/dist/serializer/comment/comment-rule-serializer.js +1 -1
  185. package/dist/serializer/comment/config-comment-serializer.js +1 -1
  186. package/dist/serializer/comment/hint-comment-serializer.js +1 -1
  187. package/dist/serializer/comment/hint-serializer.js +1 -1
  188. package/dist/serializer/comment/metadata-comment-serializer.js +1 -1
  189. package/dist/serializer/comment/pre-processor-comment-serializer.js +1 -1
  190. package/dist/serializer/comment/simple-comment-serializer.js +1 -1
  191. package/dist/serializer/cosmetic/body/abp-snippet-injection-body-serializer.js +1 -1
  192. package/dist/serializer/cosmetic/body/adg-scriptlet-injection-body-serializer.js +1 -1
  193. package/dist/serializer/cosmetic/body/scriptlet-body-serializer.js +1 -1
  194. package/dist/serializer/cosmetic/body/ubo-scriptlet-injection-body-serializer.js +1 -1
  195. package/dist/serializer/cosmetic/cosmetic-rule-serializer.js +1 -1
  196. package/dist/serializer/cosmetic/css-injection-body-serializer.js +1 -1
  197. package/dist/serializer/cosmetic/element-hiding-body-serializer.js +1 -1
  198. package/dist/serializer/empty-rule-serializer.js +1 -1
  199. package/dist/serializer/filterlist-serializer.js +1 -1
  200. package/dist/serializer/index.js +1 -1
  201. package/dist/serializer/invalid-rule-error-node-serializer.js +1 -1
  202. package/dist/serializer/invalid-rule-serializer.js +1 -1
  203. package/dist/serializer/misc/domain-list-serializer.js +1 -1
  204. package/dist/serializer/misc/list-item-serializer.js +1 -1
  205. package/dist/serializer/misc/list-items-serializer.js +1 -1
  206. package/dist/serializer/misc/logical-expression-serializer.js +1 -1
  207. package/dist/serializer/misc/modifier-list-serializer.js +1 -1
  208. package/dist/serializer/misc/modifier-serializer.js +1 -1
  209. package/dist/serializer/misc/parameter-list-serializer.js +1 -1
  210. package/dist/serializer/misc/value-serializer.js +1 -1
  211. package/dist/serializer/network/host-rule-serializer.js +1 -1
  212. package/dist/serializer/network/hostname-list-serializer.js +1 -1
  213. package/dist/serializer/network/network-rule-serializer.js +1 -1
  214. package/dist/serializer/rule-serializer.js +1 -1
  215. package/dist/types/compatibility-tables/base.d.ts +11 -11
  216. package/dist/types/compatibility-tables/index.d.ts +3 -2
  217. package/dist/types/compatibility-tables/platforms.d.ts +67 -33
  218. package/dist/types/compatibility-tables/redirects.d.ts +3 -3
  219. package/dist/types/compatibility-tables/schemas/base.d.ts +1 -1
  220. package/dist/types/compatibility-tables/schemas/platform.d.ts +16 -5
  221. package/dist/types/compatibility-tables/utils/platform-helpers.d.ts +112 -3
  222. package/dist/types/compatibility-tables/utils/resource-type-helpers.d.ts +3 -3
  223. package/dist/types/index.d.ts +2 -2
  224. package/dist/types/utils/adblockers.d.ts +28 -0
  225. package/dist/types/utils/bit-count.d.ts +21 -0
  226. package/dist/types/utils/index.d.ts +2 -0
  227. package/dist/types/utils/noop-modifier.d.ts +8 -0
  228. package/dist/types/utils/storage-interface.d.ts +1 -1
  229. package/dist/types/utils/types.d.ts +21 -0
  230. package/dist/types/validator/constants.d.ts +0 -9
  231. package/dist/types/validator/helpers.d.ts +0 -8
  232. package/dist/types/validator/index.d.ts +10 -9
  233. package/dist/utils/adblockers.js +28 -5
  234. package/dist/utils/binary-schema-version.js +1 -1
  235. package/dist/utils/bit-count.js +37 -0
  236. package/dist/utils/byte-buffer.js +1 -1
  237. package/dist/utils/categorizer.js +1 -1
  238. package/dist/utils/clone.js +1 -1
  239. package/dist/utils/constants.js +1 -1
  240. package/dist/utils/cosmetic-rule-separator.js +1 -1
  241. package/dist/utils/deep-freeze.js +1 -1
  242. package/dist/utils/domain.js +1 -1
  243. package/dist/utils/error.js +1 -1
  244. package/dist/utils/index.js +2 -1
  245. package/dist/utils/input-byte-buffer.js +1 -1
  246. package/dist/utils/is-chromium.js +1 -1
  247. package/dist/utils/logical-expression.js +1 -1
  248. package/dist/utils/multi-value-map.js +1 -1
  249. package/dist/utils/noop-modifier.js +29 -0
  250. package/dist/utils/output-byte-buffer.js +1 -1
  251. package/dist/utils/position-provider.js +1 -1
  252. package/dist/utils/quotes.js +1 -1
  253. package/dist/utils/regexp.js +1 -1
  254. package/dist/utils/string.js +1 -1
  255. package/dist/utils/text-decoder-polyfill.js +1 -1
  256. package/dist/utils/text-encoder-polyfill.js +1 -1
  257. package/dist/utils/type-guards.js +1 -1
  258. package/dist/validator/constants.js +3 -13
  259. package/dist/validator/helpers.js +2 -13
  260. package/dist/validator/index.js +44 -48
  261. package/dist/validator/value.js +1 -1
  262. package/dist/version.js +1 -1
  263. package/package.json +1 -1
@@ -1,10 +1,12 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
6
6
  */
7
7
  import { SpecificPlatform, GenericPlatform } from '../platforms.js';
8
+ import { AdblockProduct } from '../../utils/adblockers.js';
9
+ import { getBitCount } from '../../utils/bit-count.js';
8
10
 
9
11
  /* eslint-disable no-bitwise */
10
12
  /**
@@ -56,7 +58,16 @@ const GENERIC_PLATFORM_MAP = new Map([
56
58
  ['abp_any', GenericPlatform.AbpAny],
57
59
  ['any', GenericPlatform.Any],
58
60
  ]);
59
- new Map([
61
+ /**
62
+ * Map of products to their platform name prefixes.
63
+ * Used for filtering generic platforms by product.
64
+ */
65
+ const PRODUCT_PREFIX_MAP = {
66
+ [AdblockProduct.Adg]: 'Adg',
67
+ [AdblockProduct.Ubo]: 'Ubo',
68
+ [AdblockProduct.Abp]: 'Abp',
69
+ };
70
+ const SPECIFIC_PLATFORM_HUMAN_READABLE_NAME_MAP = new Map([
60
71
  [SpecificPlatform.AdgOsWindows, 'AdGuard for Windows'],
61
72
  [SpecificPlatform.AdgOsMac, 'AdGuard for Mac'],
62
73
  [SpecificPlatform.AdgOsAndroid, 'AdGuard for Android'],
@@ -75,6 +86,8 @@ new Map([
75
86
  [SpecificPlatform.AbpExtOpera, 'AdBlock Plus for Opera'],
76
87
  [SpecificPlatform.AbpExtEdge, 'AdBlock Plus for Edge'],
77
88
  [SpecificPlatform.AbpExtFirefox, 'AdBlock Plus for Firefox'],
89
+ ]);
90
+ const GENERIC_PLATFORM_HUMAN_READABLE_NAME_MAP = new Map([
78
91
  [GenericPlatform.AdgOsAny, 'AdGuard for any OS'],
79
92
  [GenericPlatform.AdgSafariAny, 'AdGuard for any Safari'],
80
93
  [GenericPlatform.AdgExtChromium, 'AdGuard for any Chromium-based extension'],
@@ -89,15 +102,207 @@ new Map([
89
102
  [GenericPlatform.Any, 'Any platform'],
90
103
  ]);
91
104
  /**
92
- * Check if the platform is a generic platform.
105
+ * Generic platforms for each product, ordered from most specific to least specific.
106
+ * Computed lazily on first access.
107
+ */
108
+ let PRODUCT_GENERIC_PLATFORMS = null;
109
+ /**
110
+ * Map of products to their specific platforms.
111
+ * Cached after first call to avoid recomputing.
112
+ */
113
+ let PRODUCT_SPECIFIC_PLATFORMS = null;
114
+ /**
115
+ * Initializes and returns the product generic platforms map.
116
+ * Filters all generic platforms by product prefix and sorts by specificity (fewer bits = more specific).
117
+ *
118
+ * @returns Map of products to their generic platforms, ordered from most to least specific.
119
+ */
120
+ const getProductGenericPlatforms = () => {
121
+ if (PRODUCT_GENERIC_PLATFORMS !== null) {
122
+ return PRODUCT_GENERIC_PLATFORMS;
123
+ }
124
+ const result = {
125
+ [AdblockProduct.Adg]: [],
126
+ [AdblockProduct.Ubo]: [],
127
+ [AdblockProduct.Abp]: [],
128
+ };
129
+ // Iterate over all generic platforms and group by product prefix
130
+ const genericPlatformEntries = Object.entries(GenericPlatform);
131
+ for (const [name, platform] of genericPlatformEntries) {
132
+ // Check which product this platform belongs to
133
+ for (const [product, prefix] of Object.entries(PRODUCT_PREFIX_MAP)) {
134
+ if (name.startsWith(prefix)) {
135
+ result[product].push(platform);
136
+ break;
137
+ }
138
+ }
139
+ }
140
+ // Sort each product's platforms by specificity (fewer bits set = more specific)
141
+ for (const product of Object.keys(result)) {
142
+ result[product].sort((a, b) => {
143
+ const bitsA = getBitCount(a);
144
+ const bitsB = getBitCount(b);
145
+ return bitsA - bitsB; // Ascending: fewer bits first (more specific)
146
+ });
147
+ }
148
+ // Cache the result as readonly
149
+ PRODUCT_GENERIC_PLATFORMS = result;
150
+ return PRODUCT_GENERIC_PLATFORMS;
151
+ };
152
+ /**
153
+ * Check if the platform is a generic platform (or a combination of platforms).
93
154
  *
94
155
  * @param platform Platform to check.
95
156
  *
96
- * @returns True if the platform is a generic platform, false otherwise.
157
+ * @returns True if the platform is a generic platform or combined platforms, false if it's a specific platform.
97
158
  */
98
159
  const isGenericPlatform = (platform) => {
99
- // if more than one bit is set, it's a generic platform
100
- return !!(platform & (platform - 1));
160
+ // if more than one bit is set, it's a generic platform or combined platforms
161
+ // Cast to number for bitwise operations
162
+ const num = platform;
163
+ return !!(num & (num - 1));
164
+ };
165
+ /**
166
+ * Check if the platform has multiple products specified.
167
+ * Multiple products means at least 2 of: AdgAny, AbpAny, UboAny.
168
+ *
169
+ * @param platform Platform to check.
170
+ *
171
+ * @returns True if at least 2 products are specified, false otherwise.
172
+ */
173
+ const hasPlatformMultipleProducts = (platform) => {
174
+ const hasAdg = !!(platform & GenericPlatform.AdgAny);
175
+ const hasAbp = !!(platform & GenericPlatform.AbpAny);
176
+ const hasUbo = !!(platform & GenericPlatform.UboAny);
177
+ return ((hasAdg && hasAbp)
178
+ || (hasAdg && hasUbo)
179
+ || (hasAbp && hasUbo));
180
+ };
181
+ /**
182
+ * Converts a platform to its corresponding adblock products.
183
+ *
184
+ * Note: This conversion is less specific than the platform itself, as it only returns
185
+ * which products (AdGuard/uBlock/Abp) are present, dropping specific platform information
186
+ * (e.g., Windows vs Chrome extension).
187
+ *
188
+ * @param platform Platform to convert.
189
+ *
190
+ * @returns Array of AdblockProduct values:
191
+ * - Empty array `[]` if platform is 0 or no products are found
192
+ * - Array of specific products based on which products are present
193
+ * (e.g., `['AdGuard', 'UblockOrigin']` if both AdGuard and uBlock Origin are specified)
194
+ * - `['AdGuard', 'UblockOrigin', 'AdblockPlus']` for GenericPlatform.Any
195
+ */
196
+ const platformToAdblockProduct = (platform) => {
197
+ const products = [];
198
+ if (platform & GenericPlatform.AdgAny) {
199
+ products.push(AdblockProduct.Adg);
200
+ }
201
+ if (platform & GenericPlatform.UboAny) {
202
+ products.push(AdblockProduct.Ubo);
203
+ }
204
+ if (platform & GenericPlatform.AbpAny) {
205
+ products.push(AdblockProduct.Abp);
206
+ }
207
+ return products;
208
+ };
209
+ /**
210
+ * Optimizes platform representation by combining specific platforms into generic ones.
211
+ * Returns the minimal set of platforms needed to represent the input.
212
+ *
213
+ * @param extractedPlatforms Platform bits for a single product.
214
+ * @param productGenericPlatforms Array of generic platforms for this product, ordered by specificity.
215
+ *
216
+ * @returns Optimized array of platforms.
217
+ */
218
+ const optimizePlatformRepresentation = (extractedPlatforms, productGenericPlatforms) => {
219
+ if (extractedPlatforms === 0) {
220
+ return [];
221
+ }
222
+ // Check if the input exactly matches any single generic platform (already optimal)
223
+ for (const genericPlatform of productGenericPlatforms) {
224
+ if (extractedPlatforms === genericPlatform) {
225
+ return [genericPlatform];
226
+ }
227
+ }
228
+ const result = [];
229
+ let remainingBits = extractedPlatforms;
230
+ // Try to match generic platforms from most specific to least specific
231
+ for (const genericPlatform of productGenericPlatforms) {
232
+ const genericBits = genericPlatform;
233
+ // Check if all bits of this generic platform are present in remaining bits
234
+ if ((remainingBits & genericBits) === genericBits) {
235
+ result.push(genericPlatform);
236
+ // Remove the matched bits from remaining
237
+ remainingBits &= ~genericBits;
238
+ // If no bits remain, we're done
239
+ if (remainingBits === 0) {
240
+ break;
241
+ }
242
+ }
243
+ }
244
+ // If there are remaining bits, we need to add them as specific platforms
245
+ // This shouldn't normally happen if our generic platforms cover all combinations,
246
+ // but we handle it for safety
247
+ if (remainingBits !== 0) {
248
+ result.push(remainingBits);
249
+ }
250
+ return result;
251
+ };
252
+ /**
253
+ * Splits a platform by products, returning a record mapping each product to its platforms.
254
+ * This is useful for iterating over each product separately when validating or processing.
255
+ *
256
+ * The function optimizes the platform representation by combining specific platforms
257
+ * into generic ones when possible, returning the minimal set needed.
258
+ *
259
+ * @param platform Platform to split (can be single or multi-product).
260
+ *
261
+ * @returns Record mapping products to optimized platform arrays:
262
+ * - Empty object `{}` if platform is 0 or no products are found
263
+ * - Object with single product key for single-product platforms
264
+ * - Object with multiple product keys for multi-product platforms
265
+ * - Each array contains the minimal representation using generic platforms where possible
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * // Multi-product platform
270
+ * const platforms = getPlatformsByProduct(GenericPlatform.AdgAny | GenericPlatform.UboAny);
271
+ * // Returns: {
272
+ * // 'AdGuard': [GenericPlatform.AdgAny],
273
+ * // 'UblockOrigin': [GenericPlatform.UboAny]
274
+ * // }
275
+ *
276
+ * // Mixed specific and generic
277
+ * const mixed = SpecificPlatform.AdgExtChrome | SpecificPlatform.AdgExtFirefox | SpecificPlatform.AdgOsWindows;
278
+ * const result = getPlatformsByProduct(mixed);
279
+ * // Might return: { 'AdGuard': [GenericPlatform.AdgExtChromium, SpecificPlatform.AdgOsWindows] }
280
+ *
281
+ * // Iterate and validate for each product
282
+ * for (const [product, platformList] of Object.entries(platforms)) {
283
+ * for (const p of platformList) {
284
+ * const result = modifierValidator.validate(p, modifier);
285
+ * console.log(`${product}: ${result.valid}`);
286
+ * }
287
+ * }
288
+ * ```
289
+ */
290
+ const getPlatformsByProduct = (platform) => {
291
+ const result = {};
292
+ const productPlatforms = getProductGenericPlatforms();
293
+ if (platform & GenericPlatform.AdgAny) {
294
+ const extracted = (platform & GenericPlatform.AdgAny);
295
+ result[AdblockProduct.Adg] = optimizePlatformRepresentation(extracted, productPlatforms[AdblockProduct.Adg]);
296
+ }
297
+ if (platform & GenericPlatform.UboAny) {
298
+ const extracted = (platform & GenericPlatform.UboAny);
299
+ result[AdblockProduct.Ubo] = optimizePlatformRepresentation(extracted, productPlatforms[AdblockProduct.Ubo]);
300
+ }
301
+ if (platform & GenericPlatform.AbpAny) {
302
+ const extracted = (platform & GenericPlatform.AbpAny);
303
+ result[AdblockProduct.Abp] = optimizePlatformRepresentation(extracted, productPlatforms[AdblockProduct.Abp]);
304
+ }
305
+ return result;
101
306
  };
102
307
  /**
103
308
  * Returns the platform enum value for the given platform string name.
@@ -133,5 +338,83 @@ const getSpecificPlatformName = (platform) => {
133
338
  }
134
339
  return specificPlatform;
135
340
  };
341
+ /**
342
+ * Returns the human-readable platform name for the given platform enum value.
343
+ *
344
+ * @param platform Platform enum value.
345
+ *
346
+ * @returns Human-readable platform name, e.g., 'AdGuard for Windows'.
347
+ *
348
+ * @throws Error if the platform is unknown.
349
+ */
350
+ const getHumanReadablePlatformName = (platform) => {
351
+ // Try specific platform first
352
+ const specificPlatform = SPECIFIC_PLATFORM_HUMAN_READABLE_NAME_MAP.get(platform);
353
+ if (specificPlatform) {
354
+ return specificPlatform;
355
+ }
356
+ // Then try generic platform
357
+ const genericPlatform = GENERIC_PLATFORM_HUMAN_READABLE_NAME_MAP.get(platform);
358
+ if (genericPlatform) {
359
+ return genericPlatform;
360
+ }
361
+ throw new Error(`Unknown platform: ${platform}`);
362
+ };
363
+ /**
364
+ * Gets all specific platforms for a given AdblockProduct.
365
+ * Results are cached after the first call.
366
+ *
367
+ * @param product AdblockProduct to get specific platforms for.
368
+ *
369
+ * @returns Array of all specific platforms for the given product.
370
+ *
371
+ * @example
372
+ * ```typescript
373
+ * const adgPlatforms = getProductSpecificPlatforms(AdblockProduct.Adg);
374
+ * // Returns: [AdgOsWindows, AdgOsMac, AdgOsAndroid, AdgExtChrome, ...]
375
+ * ```
376
+ */
377
+ const getProductSpecificPlatforms = (product) => {
378
+ // Initialize cache if needed
379
+ if (PRODUCT_SPECIFIC_PLATFORMS === null) {
380
+ const result = {
381
+ [AdblockProduct.Adg]: [],
382
+ [AdblockProduct.Ubo]: [],
383
+ [AdblockProduct.Abp]: [],
384
+ };
385
+ // Iterate over all specific platforms and group by product prefix
386
+ const specificPlatformEntries = Object.entries(SpecificPlatform);
387
+ for (const [name, platform] of specificPlatformEntries) {
388
+ // Check which product this platform belongs to
389
+ for (const [prod, prefix] of Object.entries(PRODUCT_PREFIX_MAP)) {
390
+ if (name.startsWith(prefix)) {
391
+ result[prod].push(platform);
392
+ break;
393
+ }
394
+ }
395
+ }
396
+ // Cache the result as readonly
397
+ PRODUCT_SPECIFIC_PLATFORMS = result;
398
+ }
399
+ return PRODUCT_SPECIFIC_PLATFORMS[product];
400
+ };
401
+ /**
402
+ * Gets all available platform names from the platform maps.
403
+ *
404
+ * @returns Object containing arrays of all specific and generic platform names.
405
+ *
406
+ * @example
407
+ * ```typescript
408
+ * const { specificPlatformNames, genericPlatformNames } = getAllPlatformNames();
409
+ * // specificPlatformNames: ['adg_os_windows', 'adg_os_mac', 'adg_os_android', ...]
410
+ * // genericPlatformNames: ['adg_os_any', 'adg_safari_any', 'adg_ext_chromium', ...]
411
+ * ```
412
+ */
413
+ const getAllPlatformNames = () => {
414
+ return {
415
+ specificPlatformNames: Array.from(SPECIFIC_PLATFORM_MAP.keys()),
416
+ genericPlatformNames: Array.from(GENERIC_PLATFORM_MAP.keys()),
417
+ };
418
+ };
136
419
 
137
- export { GENERIC_PLATFORM_MAP, SPECIFIC_PLATFORM_MAP, SPECIFIC_PLATFORM_MAP_REVERSE, getPlatformId, getSpecificPlatformName, isGenericPlatform };
420
+ export { GENERIC_PLATFORM_MAP, SPECIFIC_PLATFORM_MAP, SPECIFIC_PLATFORM_MAP_REVERSE, getAllPlatformNames, getHumanReadablePlatformName, getPlatformId, getPlatformsByProduct, getProductGenericPlatforms, getProductSpecificPlatforms, getSpecificPlatformName, hasPlatformMultipleProducts, isGenericPlatform, platformToAdblockProduct };
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -31,7 +31,7 @@ const RESOURCE_TYPE_MODIFIER_MAP = Object.freeze({
31
31
  * Gets the adblock modifier name for the given resource type.
32
32
  *
33
33
  * @param resourceType Resource type to get the modifier name for.
34
- * @param platform Platform to get the modifier for.
34
+ * @param platform Platform to get the modifier for (can be specific, generic, or combined platforms).
35
35
  *
36
36
  * @returns A string containing the adblock modifier name for the given resource type
37
37
  * or `null` if the modifier could not be found.
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -12,6 +12,7 @@ import { StringUtils } from '../../../utils/string.js';
12
12
  import { MultiValueMap } from '../../../utils/multi-value-map.js';
13
13
  import { clone } from '../../../utils/clone.js';
14
14
  import { createConversionResult } from '../../base-interfaces/conversion-result.js';
15
+ import '../../../utils/adblockers.js';
15
16
  import 'json5';
16
17
  import 'sprintf-js';
17
18
  import '@adguard/css-tokenizer';
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -11,6 +11,7 @@ import { LEGACY_EXT_CSS_ATTRIBUTE_PREFIX, ABP_EXT_CSS_PREFIX } from '../data/css
11
11
  import { BaseConverter } from '../base-interfaces/base-converter.js';
12
12
  import { createConversionResult } from '../base-interfaces/conversion-result.js';
13
13
  import { CssTokenStream } from '../../parser/css/css-token-stream.js';
14
+ import '../../utils/adblockers.js';
14
15
  import 'tldts';
15
16
  import { QuoteUtils } from '../../utils/quotes.js';
16
17
  import 'json5';
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -9,6 +9,7 @@ import { RuleParser } from '../parser/rule-parser.js';
9
9
  import { RuleConverter } from './rule.js';
10
10
  import { BaseConverter } from './base-interfaces/base-converter.js';
11
11
  import { RuleGenerator } from '../generator/rule-generator.js';
12
+ import '../utils/adblockers.js';
12
13
  import '@adguard/css-tokenizer';
13
14
  import 'sprintf-js';
14
15
  import '../parser/css/balancing.js';
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme
@@ -1,5 +1,5 @@
1
1
  /*
2
- * AGTree v3.3.0 (build date: Thu, 20 Nov 2025 14:22:17 GMT)
2
+ * AGTree v3.4.0 (build date: Fri, 28 Nov 2025 09:46:33 GMT)
3
3
  * (c) 2025 Adguard Software Ltd.
4
4
  * Released under the MIT license
5
5
  * https://github.com/AdguardTeam/tsurlfilter/tree/master/packages/agtree#readme