@koda-sl/baker-cli 0.571.0-dev.6a3439a0a → 0.572.0-dev.61ba69c66

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 (1567) hide show
  1. package/README.md +7 -5
  2. package/dist/account-6RJ6ZI3B.js +82 -0
  3. package/dist/account-AIGNJ2RP.js +82 -0
  4. package/dist/account-E5LLPRZ6.js +139 -0
  5. package/dist/account-assets-J6SVHSXR.js +290 -0
  6. package/dist/account-level-FGE33OJT.js +612 -0
  7. package/dist/account-level-FGE33OJT.js.map +1 -0
  8. package/dist/account-reads-BNVCJ37E.js +220 -0
  9. package/dist/account-reads-BNVCJ37E.js.map +1 -0
  10. package/dist/account-users-MFH5CJIA.js +65 -0
  11. package/dist/account-users-MFH5CJIA.js.map +1 -0
  12. package/dist/account-writes-XNS4IKZV.js +68 -0
  13. package/dist/accounts-3ZWYGRVM.js +80 -0
  14. package/dist/accounts-5TLHSEZR.js +119 -0
  15. package/dist/accounts-BAZYYDFV.js +713 -0
  16. package/dist/accounts-L2HVNJUF.js +76 -0
  17. package/dist/accounts-NTBIRB52.js +115 -0
  18. package/dist/actions-N2FBJMT4.js +55 -0
  19. package/dist/active-entities-IJPRN45K.js +103 -0
  20. package/dist/activecampaign-U77COT2F.js +938 -0
  21. package/dist/activities-SS3SUWSS.js +75 -0
  22. package/dist/ad-group-writes-DTQSUNE2.js +172 -0
  23. package/dist/ad-groups-CX23GLVE.js +70 -0
  24. package/dist/ad-writes-HAAUOJCG.js +176 -0
  25. package/dist/add-ABPQTO2M.js +305 -0
  26. package/dist/add-BK6N7KWU.js +97 -0
  27. package/dist/add-ECN2FTMH.js +85 -0
  28. package/dist/add-FH7OVKFF.js +148 -0
  29. package/dist/add-KHY3H54G.js +81 -0
  30. package/dist/add-MZZLFU3M.js +513 -0
  31. package/dist/add-MZZLFU3M.js.map +1 -0
  32. package/dist/add-VDH2VCXR.js +107 -0
  33. package/dist/add-accounts-6JAOSCXK.js +91 -0
  34. package/dist/ads-BEMEXBDJ.js +128 -0
  35. package/dist/ads-GAU2XKNL.js +48 -0
  36. package/dist/ads-HZOXZ3FY.js +79 -0
  37. package/dist/ads-I5OBZ5VI.js +120 -0
  38. package/dist/adsets-PMQGA6TW.js +182 -0
  39. package/dist/advertisers-EOLL3VFQ.js +123 -0
  40. package/dist/advertisers-FNKY2PP4.js +125 -0
  41. package/dist/analytics-DOAUCF2Y.js +2437 -0
  42. package/dist/analytics-MR3T34KN.js +447 -0
  43. package/dist/animate-EKGVDSWM.js +480 -0
  44. package/dist/approved-WQL4Z4EB.js +73 -0
  45. package/dist/asset-writes-A5X2T6LQ.js +51 -0
  46. package/dist/assign-UMNHINRA.js +80 -0
  47. package/dist/audience-size-Q7DZ6TGM.js +76 -0
  48. package/dist/audience-writes-SNFFF2QR.js +328 -0
  49. package/dist/audience-writes-SNFFF2QR.js.map +1 -0
  50. package/dist/audiences-HBJGEGKL.js +106 -0
  51. package/dist/audiences-RDQZNGPI.js +280 -0
  52. package/dist/audiences-TA636UBN.js +85 -0
  53. package/dist/audit-H3F6FZNE.js +154 -0
  54. package/dist/audit-QMCK76AT.js +88 -0
  55. package/dist/autocomplete-DIBJ57VC.js +114 -0
  56. package/dist/avatars-UIXRGLPA.js +38 -0
  57. package/dist/bid-pricing-OMY2F2SB.js +103 -0
  58. package/dist/brand-WV6CAU3M.js +22 -0
  59. package/dist/brief-PNBP56X2.js +543 -0
  60. package/dist/brief-PNBP56X2.js.map +1 -0
  61. package/dist/businesses-56IUB5X4.js +54 -0
  62. package/dist/campaign-groups-PGJIQV4S.js +99 -0
  63. package/dist/campaign-writes-MAJ5FGXG.js +176 -0
  64. package/dist/campaign-writes-WL3YAEGJ.js +168 -0
  65. package/dist/campaigns-5L4ZTGF7.js +130 -0
  66. package/dist/campaigns-EK7EUKZD.js +113 -0
  67. package/dist/campaigns-HCJ3AIDK.js +78 -0
  68. package/dist/campaigns-NHACWGWS.js +111 -0
  69. package/dist/canvas-INL3J7HO.js +46 -0
  70. package/dist/capabilities-Y33EWDMJ.js +147 -0
  71. package/dist/cards-IWWKA5WH.js +85 -0
  72. package/dist/catalog-NSA2FUI2.js +66 -0
  73. package/dist/catalogs-QOE2V4QK.js +783 -0
  74. package/dist/catalogs-QOE2V4QK.js.map +1 -0
  75. package/dist/catalogs-SJMYID7N.js +130 -0
  76. package/dist/changes-2HOF2HSV.js +167 -0
  77. package/dist/chatgpt-J6MNVQVT.js +47 -0
  78. package/dist/chats-4HK6UYD2.js +584 -0
  79. package/dist/check-DJOIL56P.js +169 -0
  80. package/dist/check-DJOIL56P.js.map +1 -0
  81. package/dist/chunk-2B2JFTWI.js +296 -0
  82. package/dist/chunk-2HWX6AWY.js +2235 -0
  83. package/dist/chunk-2HWX6AWY.js.map +1 -0
  84. package/dist/chunk-2O5CCKV7.js +23 -0
  85. package/dist/chunk-2W6DMVGH.js +8954 -0
  86. package/dist/chunk-2W6DMVGH.js.map +1 -0
  87. package/dist/chunk-3BKESS5W.js +66 -0
  88. package/dist/chunk-3VBPJQ7L.js +288 -0
  89. package/dist/chunk-3X262BEG.js +19 -0
  90. package/dist/chunk-4CUBOXBS.js +99 -0
  91. package/dist/chunk-4CUBOXBS.js.map +1 -0
  92. package/dist/chunk-4CYB33V3.js +136 -0
  93. package/dist/chunk-4JB556VC.js +142 -0
  94. package/dist/chunk-4LZNCDHU.js +46 -0
  95. package/dist/chunk-4LZNCDHU.js.map +1 -0
  96. package/dist/chunk-4QYZJPSM.js +207 -0
  97. package/dist/chunk-4WLJYLRL.js +544 -0
  98. package/dist/chunk-55AX6DOP.js +86 -0
  99. package/dist/chunk-55AX6DOP.js.map +1 -0
  100. package/dist/chunk-56ZJO7TM.js +1320 -0
  101. package/dist/chunk-5LQGW5UF.js +138 -0
  102. package/dist/chunk-5U6OL4NN.js +709 -0
  103. package/dist/chunk-6IL7JFX5.js +203 -0
  104. package/dist/chunk-6LNCKT6S.js +35 -0
  105. package/dist/chunk-6LUDG5AB.js +476 -0
  106. package/dist/chunk-6UQV5DOD.js +45 -0
  107. package/dist/chunk-6V4UAC5I.js +2523 -0
  108. package/dist/chunk-6V4UAC5I.js.map +1 -0
  109. package/dist/chunk-6WA7QSCN.js +46 -0
  110. package/dist/chunk-7CHPHER2.js +455 -0
  111. package/dist/chunk-7J7ASYIM.js +225 -0
  112. package/dist/chunk-7MMTIJO3.js +220 -0
  113. package/dist/chunk-7Y3LKR4P.js +5368 -0
  114. package/dist/chunk-7Y3LKR4P.js.map +1 -0
  115. package/dist/chunk-AA3D7GZF.js +125 -0
  116. package/dist/chunk-AGL7EWP2.js +75 -0
  117. package/dist/chunk-AHVD6IEI.js +76 -0
  118. package/dist/chunk-ASJMLTMX.js +106 -0
  119. package/dist/chunk-AWENMEFC.js +297 -0
  120. package/dist/chunk-AYX7PB2L.js +1920 -0
  121. package/dist/chunk-AYX7PB2L.js.map +1 -0
  122. package/dist/chunk-BHZLKLK7.js +69 -0
  123. package/dist/chunk-BVER7I36.js +58 -0
  124. package/dist/chunk-C3RZNVLM.js +98 -0
  125. package/dist/chunk-CA5QBLIZ.js +114 -0
  126. package/dist/chunk-CKIENAAO.js +156 -0
  127. package/dist/chunk-CKIENAAO.js.map +1 -0
  128. package/dist/chunk-CONTVNSN.js +51 -0
  129. package/dist/chunk-EE6NZ6NG.js +225 -0
  130. package/dist/chunk-EG6HMBCF.js +188 -0
  131. package/dist/chunk-EGZM35HT.js +3510 -0
  132. package/dist/chunk-EGZM35HT.js.map +1 -0
  133. package/dist/chunk-ESSA3AWR.js +133 -0
  134. package/dist/chunk-ESSA3AWR.js.map +1 -0
  135. package/dist/chunk-FHLAJYZE.js +225 -0
  136. package/dist/chunk-FSNQFZ2Z.js +718 -0
  137. package/dist/chunk-G67OBCXI.js +91 -0
  138. package/dist/chunk-GFYGVIT3.js +392 -0
  139. package/dist/chunk-GRNHQWSV.js +430 -0
  140. package/dist/chunk-GWQSZWHT.js +42 -0
  141. package/dist/chunk-HBXR26LB.js +1518 -0
  142. package/dist/chunk-HKKHOMEQ.js +180 -0
  143. package/dist/chunk-HKKHOMEQ.js.map +1 -0
  144. package/dist/chunk-HUO5MZ7S.js +962 -0
  145. package/dist/chunk-HVL22WUU.js +930 -0
  146. package/dist/chunk-IA5GLVRV.js +64 -0
  147. package/dist/chunk-IEPCI2EB.js +479 -0
  148. package/dist/chunk-IKSBLQTL.js +5471 -0
  149. package/dist/chunk-IRLMIKI7.js +224 -0
  150. package/dist/chunk-IW4MX7OX.js +399 -0
  151. package/dist/chunk-J4WOF6WK.js +97 -0
  152. package/dist/chunk-J63TN3GR.js +89 -0
  153. package/dist/chunk-JESSFI7R.js +468 -0
  154. package/dist/chunk-K4QPBXV7.js +61 -0
  155. package/dist/chunk-K5VDDKKF.js +219 -0
  156. package/dist/chunk-KM5K47TW.js +152 -0
  157. package/dist/chunk-KPVZ2CZA.js +642 -0
  158. package/dist/chunk-KPVZ2CZA.js.map +1 -0
  159. package/dist/chunk-LGJIJVVH.js +131 -0
  160. package/dist/chunk-LHSSIUU4.js +604 -0
  161. package/dist/chunk-LQMPA4DY.js +685 -0
  162. package/dist/chunk-M3IXPK6U.js +344 -0
  163. package/dist/chunk-MJU5VKX2.js +91 -0
  164. package/dist/chunk-MRGU3NPN.js +163 -0
  165. package/dist/chunk-MSLFPL77.js +454 -0
  166. package/dist/chunk-MX5NQAK6.js +54 -0
  167. package/dist/chunk-MX5NQAK6.js.map +1 -0
  168. package/dist/chunk-NKCWJPMN.js +111 -0
  169. package/dist/chunk-NT7NCSEB.js +24026 -0
  170. package/dist/chunk-O5GZJ6YJ.js +1085 -0
  171. package/dist/chunk-O5GZJ6YJ.js.map +1 -0
  172. package/dist/chunk-OADMSHME.js +334 -0
  173. package/dist/chunk-OGWCLE4W.js +858 -0
  174. package/dist/chunk-OGWCLE4W.js.map +1 -0
  175. package/dist/chunk-ONGZKI5J.js +57 -0
  176. package/dist/chunk-OOZNTJP6.js +26 -0
  177. package/dist/chunk-OP3NHIFH.js +39 -0
  178. package/dist/chunk-OU4KWL6B.js +106 -0
  179. package/dist/chunk-OW3D63SI.js +91 -0
  180. package/dist/chunk-OW3D63SI.js.map +1 -0
  181. package/dist/chunk-PLIGHRIQ.js +312 -0
  182. package/dist/chunk-PLROJ3SX.js +73 -0
  183. package/dist/chunk-PSM3RI4B.js +167 -0
  184. package/dist/chunk-Q4O7ICAK.js +84 -0
  185. package/dist/chunk-Q6XM6ZDB.js +547 -0
  186. package/dist/chunk-QHRUCSRI.js +197 -0
  187. package/dist/chunk-QUDPMIW7.js +74 -0
  188. package/dist/chunk-R2JGUOT6.js +64 -0
  189. package/dist/chunk-R5I4IHJ5.js +494 -0
  190. package/dist/chunk-R5NABIJ4.js +1919 -0
  191. package/dist/chunk-R5NABIJ4.js.map +1 -0
  192. package/dist/chunk-RJXO66C4.js +66 -0
  193. package/dist/chunk-RYNN6UUF.js +69 -0
  194. package/dist/chunk-S4V2GOKV.js +215 -0
  195. package/dist/chunk-S7D4GTYY.js +191 -0
  196. package/dist/chunk-T4RV7XOC.js +217 -0
  197. package/dist/chunk-TDUAGNSQ.js +52 -0
  198. package/dist/chunk-TZRWET3S.js +285 -0
  199. package/dist/chunk-U5V4CIIG.js +274 -0
  200. package/dist/chunk-U625CQ3Y.js +287 -0
  201. package/dist/chunk-UDEVIXKX.js +1254 -0
  202. package/dist/chunk-UNLFRXST.js +126 -0
  203. package/dist/chunk-UNLFRXST.js.map +1 -0
  204. package/dist/chunk-UUDWZIDC.js +246 -0
  205. package/dist/chunk-VAQBBNLD.js +98 -0
  206. package/dist/chunk-VCDFBFPT.js +97 -0
  207. package/dist/chunk-VF3W7CI7.js +325 -0
  208. package/dist/chunk-VHOOAQY4.js +169 -0
  209. package/dist/chunk-VK2VC6A2.js +25 -0
  210. package/dist/chunk-WWPRSJOS.js +94 -0
  211. package/dist/chunk-XKYFNMTB.js +343 -0
  212. package/dist/chunk-XL42ZEVH.js +170 -0
  213. package/dist/chunk-XPUQFPIU.js +831 -0
  214. package/dist/chunk-XQEHLDGP.js +1744 -0
  215. package/dist/chunk-XQWC223L.js +56 -0
  216. package/dist/chunk-XYDHBLZ2.js +103 -0
  217. package/dist/chunk-XZO6ONVI.js +115 -0
  218. package/dist/chunk-YFFQ3HY4.js +139 -0
  219. package/dist/chunk-YGUGL4ZL.js +76 -0
  220. package/dist/chunk-YOHGEF2N.js +7899 -0
  221. package/dist/chunk-YOHGEF2N.js.map +1 -0
  222. package/dist/chunk-YT3S2XFG.js +84 -0
  223. package/dist/chunk-ZPCZ4XDB.js +148 -0
  224. package/dist/cite-2ZJG3FBV.js +191 -0
  225. package/dist/claim-IGU5W4CT.js +200 -0
  226. package/dist/cli.js +48 -47
  227. package/dist/cli.js.map +1 -1
  228. package/dist/client-MSRCSDB7.js +19 -0
  229. package/dist/code-T7Z5JDQ2.js +76 -0
  230. package/dist/companies-HCSBVXCE.js +198 -0
  231. package/dist/company-SSMY4G2T.js +308 -0
  232. package/dist/complete-FQNRXUI5.js +84 -0
  233. package/dist/config-XRPKA5QR.js +88 -0
  234. package/dist/connect-VXEE3QBU.js +45 -0
  235. package/dist/content-2JFP747N.js +85 -0
  236. package/dist/conversation-KKJKZIX5.js +96 -0
  237. package/dist/conversion-report-G65UHQRO.js +127 -0
  238. package/dist/conversion-upload-command-Z7IOS6ZG.js +440 -0
  239. package/dist/conversion-upload-command-Z7IOS6ZG.js.map +1 -0
  240. package/dist/conversion-writes-333V4OVR.js +122 -0
  241. package/dist/conversions-7UHCNIAO.js +140 -0
  242. package/dist/conversions-L6775Q22.js +78 -0
  243. package/dist/copy-writes-G7GJ5RWS.js +171 -0
  244. package/dist/copy-writes-G7GJ5RWS.js.map +1 -0
  245. package/dist/countries-XJVDM635.js +82 -0
  246. package/dist/create-AXWJECPP.js +239 -0
  247. package/dist/create-B24XHUGZ.js +62 -0
  248. package/dist/create-HJKTD5FN.js +218 -0
  249. package/dist/create-V4NGP5KB.js +135 -0
  250. package/dist/creatives-HLWMABYL.js +55 -0
  251. package/dist/creatives-HLWMABYL.js.map +1 -0
  252. package/dist/creatives-OKFLX67Y.js +118 -0
  253. package/dist/creatives-WX6GQ37F.js +229 -0
  254. package/dist/credentials-4JFUH6FN.js +290 -0
  255. package/dist/critique-4SF44VFJ.js +420 -0
  256. package/dist/critique-4SF44VFJ.js.map +1 -0
  257. package/dist/critique-S3PDXLAZ.js +233 -0
  258. package/dist/critique-S3PDXLAZ.js.map +1 -0
  259. package/dist/crm-6MLYUEK7.js +323 -0
  260. package/dist/crm-PUQBWZKE.js +229 -0
  261. package/dist/crop-V5MSIY5F.js +113 -0
  262. package/dist/currency-SCSJ5FW2.js +88 -0
  263. package/dist/custom-conversions-GN4JDS5F.js +128 -0
  264. package/dist/customers-WXD2LTUC.js +65 -0
  265. package/dist/decide-PW2NRMRK.js +199 -0
  266. package/dist/delete-EAJN6ZHT.js +67 -0
  267. package/dist/delete-GDIFIYA2.js +69 -0
  268. package/dist/delete-JQG3ZWQX.js +57 -0
  269. package/dist/delete-L7CGJ23X.js +71 -0
  270. package/dist/delete-OQREQEGN.js +85 -0
  271. package/dist/delete-ZR3DVLWU.js +69 -0
  272. package/dist/demographics-LMRGNO7J.js +141 -0
  273. package/dist/describe-OHWLLBDE.js +97 -0
  274. package/dist/describe-YELOXWHY.js +97 -0
  275. package/dist/dimensions-CLLCVVRY.js +101 -0
  276. package/dist/discard-K2KIIFJQ.js +69 -0
  277. package/dist/discover-SQJLRS4G.js +93 -0
  278. package/dist/discover-UJMDGDQO.js +172 -0
  279. package/dist/domain-CJX5JSLS.js +101 -0
  280. package/dist/download-HFDBP6BO.js +172 -0
  281. package/dist/download-SZ5P3GLV.js +337 -0
  282. package/dist/draft-7QDE2Z3N.js +315 -0
  283. package/dist/draft-A7ZQPUFS.js +579 -0
  284. package/dist/draft-A7ZQPUFS.js.map +1 -0
  285. package/dist/draft-ILXHFWTT.js +134 -0
  286. package/dist/draft-NUFU5YME.js +374 -0
  287. package/dist/draft-QSTD3DH2.js +220 -0
  288. package/dist/draft-TV5IH5U4.js +260 -0
  289. package/dist/draft-WNMHUFAH.js +138 -0
  290. package/dist/draft-XJP3SCZ6.js +333 -0
  291. package/dist/draft-XJP3SCZ6.js.map +1 -0
  292. package/dist/engine/index.js +14 -14
  293. package/dist/env-3256G2OE.js +53 -0
  294. package/dist/experiment-5L5USMAL.js +1397 -0
  295. package/dist/experiments-CFBG5UOT.js +237 -0
  296. package/dist/experiments-CFBG5UOT.js.map +1 -0
  297. package/dist/export-YSOM4E3B.js +168 -0
  298. package/dist/extract-7FYXXEQZ.js +143 -0
  299. package/dist/facets-2FRELYRC.js +117 -0
  300. package/dist/favorites-LTG2F6W2.js +178 -0
  301. package/dist/feed-RSBWEI75.js +177 -0
  302. package/dist/feedback-LZSJR5KL.js +116 -0
  303. package/dist/feedback-LZSJR5KL.js.map +1 -0
  304. package/dist/feedback-PQUM7UBT.js +114 -0
  305. package/dist/feedback-record-4MVI4O3Q.js +270 -0
  306. package/dist/feedback-record-4MVI4O3Q.js.map +1 -0
  307. package/dist/fetch-3PWYTX4R.js +139 -0
  308. package/dist/fetch-FLQYW27W.js +204 -0
  309. package/dist/find-SHHDWCPM.js +144 -0
  310. package/dist/fit-4XCDLF7C.js +65 -0
  311. package/dist/flows-4ALWJVNF.js +340 -0
  312. package/dist/follow-N4TKU3UM.js +94 -0
  313. package/dist/follow-competitors-AHQ57BWS.js +112 -0
  314. package/dist/following-CEYH33DW.js +113 -0
  315. package/dist/fonts-CYJ5EFR4.js +40 -0
  316. package/dist/forecast-AH3AFVJ7.js +170 -0
  317. package/dist/forecast-AH3AFVJ7.js.map +1 -0
  318. package/dist/forecast-SG2VUBZD.js +121 -0
  319. package/dist/funding-X7M5WLDX.js +85 -0
  320. package/dist/funnel-F7DS7PUN.js +397 -0
  321. package/dist/ga4-QPBAKGSH.js +55 -0
  322. package/dist/generate-LVBI3VDD.js +263 -0
  323. package/dist/get-DMV7KG2F.js +92 -0
  324. package/dist/get-EA7AX4NW.js +59 -0
  325. package/dist/get-EOSJWMWT.js +38 -0
  326. package/dist/get-HVQHHDW6.js +74 -0
  327. package/dist/get-KQLCVQCK.js +56 -0
  328. package/dist/get-NAOMB6Q2.js +62 -0
  329. package/dist/get-XYJBQFIT.js +62 -0
  330. package/dist/get-XZ7XPXZE.js +82 -0
  331. package/dist/gif-XJ26IWAP.js +111 -0
  332. package/dist/google-ED4VGLSX.js +3301 -0
  333. package/dist/google-ED4VGLSX.js.map +1 -0
  334. package/dist/google-QOKWSPOA.js +163 -0
  335. package/dist/google-ads-B4FBPQ7O.js +198 -0
  336. package/dist/group-7EYM3PNJ.js +43 -0
  337. package/dist/group-GDTEICRY.js +43 -0
  338. package/dist/gsc-KVIAZMF4.js +30 -0
  339. package/dist/history-22YGILIT.js +69 -0
  340. package/dist/history-E3JGYADF.js +102 -0
  341. package/dist/history-HKCSYH5L.js +153 -0
  342. package/dist/hubspot-LEW2RP5D.js +814 -0
  343. package/dist/icon-JLVEYF34.js +138 -0
  344. package/dist/ideas-JAIU4GC4.js +45 -0
  345. package/dist/images-ZG6RRAEP.js +92 -0
  346. package/dist/improve-XSHWCMZS.js +86 -0
  347. package/dist/ingest-GTXBGUNQ.js +28 -0
  348. package/dist/ingest-SX7K6GNE.js +131 -0
  349. package/dist/insights-IVUUWSQL.js +132 -0
  350. package/dist/insights-PJPQB46E.js +658 -0
  351. package/dist/inspect-55BXSPJG.js +192 -0
  352. package/dist/inspiration-NBOKHPZ5.js +53 -0
  353. package/dist/instant-experiences-ARST4KWB.js +265 -0
  354. package/dist/instant-experiences-ARST4KWB.js.map +1 -0
  355. package/dist/intent-KSVTHFFE.js +95 -0
  356. package/dist/job-4VXDCYSG.js +202 -0
  357. package/dist/job-create-NZEZDOZT.js +109 -0
  358. package/dist/job-status-XI3ENS7D.js +74 -0
  359. package/dist/keep-UYNOC3JZ.js +78 -0
  360. package/dist/keyword-gap-7UVDSID5.js +130 -0
  361. package/dist/keyword-metrics-QFRXZRAQ.js +200 -0
  362. package/dist/keywords-for-site-Q4BCJ4PQ.js +131 -0
  363. package/dist/knowledge-LVE3J3AK.js +195 -0
  364. package/dist/landing-AJYM5GBY.js +28 -0
  365. package/dist/landings-SIN3MTUZ.js +151 -0
  366. package/dist/languages-AIASAINW.js +40 -0
  367. package/dist/languages-RDR6EBNJ.js +55 -0
  368. package/dist/launches-4TVHXAZT.js +19 -0
  369. package/dist/layerize-OLVGZRND.js +190 -0
  370. package/dist/lead-routes-ZOQDPCR3.js +733 -0
  371. package/dist/leads-M57K5EDK.js +542 -0
  372. package/dist/leads-M57K5EDK.js.map +1 -0
  373. package/dist/leads-YSDLFBHN.js +115 -0
  374. package/dist/learn-FDQZNIP3.js +207 -0
  375. package/dist/library-7CLWRDM3.js +212 -0
  376. package/dist/lighthouse-3ACQ3MVG.js +75 -0
  377. package/dist/line-item-writes-JARN73DV.js +211 -0
  378. package/dist/line-items-B5GLDAJ2.js +107 -0
  379. package/dist/link-YAZF34BZ.js +67 -0
  380. package/dist/linkedin-MLPAY7IL.js +1345 -0
  381. package/dist/linkedin-MLPAY7IL.js.map +1 -0
  382. package/dist/linkedin-person-XDH7Q3PB.js +139 -0
  383. package/dist/list-6NYRZXKQ.js +76 -0
  384. package/dist/list-6WISGNQ2.js +65 -0
  385. package/dist/list-6YBIWX44.js +50 -0
  386. package/dist/list-72JQGWNO.js +154 -0
  387. package/dist/list-FX7OG3OJ.js +67 -0
  388. package/dist/list-ITPBLMV3.js +51 -0
  389. package/dist/list-J43GOBOX.js +57 -0
  390. package/dist/list-K4Z3BOWI.js +93 -0
  391. package/dist/list-ONSYTCX2.js +306 -0
  392. package/dist/locations-UNSREUBX.js +69 -0
  393. package/dist/locations-XAC3GME3.js +40 -0
  394. package/dist/log-PPNNFETI.js +95 -0
  395. package/dist/logo-UNVIMA4B.js +19 -0
  396. package/dist/lookup-L5QG3BWH.js +23 -0
  397. package/dist/make-YWW7Q4T5.js +1368 -0
  398. package/dist/make-YWW7Q4T5.js.map +1 -0
  399. package/dist/map-QILMIKS7.js +445 -0
  400. package/dist/mcp-GOKFM4PF.js +729 -0
  401. package/dist/media-BN6B75NF.js +18 -0
  402. package/dist/media-YDDWV32Y.js +89 -0
  403. package/dist/media-sources-HABLVJE3.js +35 -0
  404. package/dist/members-B4UI6ISY.js +47 -0
  405. package/dist/meme-2MERLAVW.js +108 -0
  406. package/dist/meta-7FJQD44L.js +124 -0
  407. package/dist/metrics-SBKBEZJR.js +152 -0
  408. package/dist/models-ZBLBNNEH.js +155 -0
  409. package/dist/normalize-5WVEQJXD.js +806 -0
  410. package/dist/normalize-YPQBHWYS.js +144 -0
  411. package/dist/older-spellings-KGYXGRHU.js +70 -0
  412. package/dist/older-spellings-KGYXGRHU.js.map +1 -0
  413. package/dist/options-BV3TVUCK.js +125 -0
  414. package/dist/organization-4OTGNRHP.js +949 -0
  415. package/dist/output-FX4KJAO5.js +24 -0
  416. package/dist/page-5KWQ7PM3.js +105 -0
  417. package/dist/page-photos-AUTUSCVR.js +119 -0
  418. package/dist/page-photos-AUTUSCVR.js.map +1 -0
  419. package/dist/pages-HKTAGXH3.js +67 -0
  420. package/dist/performance-4MWQVTTA.js +5565 -0
  421. package/dist/performance-TKE7NQF6.js +27 -0
  422. package/dist/pinterest-UDX53CWY.js +105 -0
  423. package/dist/pixels-BSNCVT77.js +109 -0
  424. package/dist/pixels-TR2PAYWV.js +62 -0
  425. package/dist/plan-V57AATQ5.js +208 -0
  426. package/dist/posts-JHMXNHDV.js +36 -0
  427. package/dist/preview-VY7UH2SK.js +245 -0
  428. package/dist/preview-XUG4K4KV.js +101 -0
  429. package/dist/profile-PV3R3BEG.js +159 -0
  430. package/dist/promoted-tweet-writes-O3S5OKUZ.js +183 -0
  431. package/dist/promoted-tweets-4ZKSEC4I.js +119 -0
  432. package/dist/properties-U2XUD2M6.js +101 -0
  433. package/dist/publish-4RAYD7VI.js +350 -0
  434. package/dist/query-4C6UQN42.js +62 -0
  435. package/dist/query-7FWE7GLV.js +231 -0
  436. package/dist/query-7Y2Y6YFI.js +236 -0
  437. package/dist/questionnaire-3IPJXJT7.js +94 -0
  438. package/dist/read-WEQLEI7R.js +141 -0
  439. package/dist/reddit-2FWCB7XY.js +29 -0
  440. package/dist/refresh-SGDB4QOD.js +97 -0
  441. package/dist/refresh-WZBVPKWE.js +42 -0
  442. package/dist/release-YL3ZII3Z.js +63 -0
  443. package/dist/relevant-pages-PF3LLUED.js +99 -0
  444. package/dist/remove-52MSQXSW.js +49 -0
  445. package/dist/remove-EIV7LJUA.js +53 -0
  446. package/dist/reopen-CW27MUJH.js +66 -0
  447. package/dist/rerun-4WUZY4SO.js +98 -0
  448. package/dist/rerun-4WUZY4SO.js.map +1 -0
  449. package/dist/research-234BOCKM.js +265 -0
  450. package/dist/research-RABLL4HR.js +75 -0
  451. package/dist/reset-5KJDDVJL.js +57 -0
  452. package/dist/reset-REUL47CB.js +57 -0
  453. package/dist/resolve-WRDEHLYL.js +124 -0
  454. package/dist/retry-2A5HV4SN.js +63 -0
  455. package/dist/retry-FNT2XVH3.js +65 -0
  456. package/dist/retry-failed-ND7UXYTJ.js +45 -0
  457. package/dist/revenue-YQV2BRGA.js +92 -0
  458. package/dist/revenue-YQV2BRGA.js.map +1 -0
  459. package/dist/rule-writes-L7BRELYW.js +531 -0
  460. package/dist/rule-writes-L7BRELYW.js.map +1 -0
  461. package/dist/rules-2CUG2YG7.js +217 -0
  462. package/dist/rules-5DIOAOOO.js +55 -0
  463. package/dist/rules-5DIOAOOO.js.map +1 -0
  464. package/dist/run-RKLNKV2U.js +73 -0
  465. package/dist/run-YKGN3GQR.js +69 -0
  466. package/dist/scaffold-ad-SPU2HKHU.js +1514 -0
  467. package/dist/scaffold-ad-SPU2HKHU.js.map +1 -0
  468. package/dist/scaffold-static-ad-ENGGU26W.js +1013 -0
  469. package/dist/scaffold-static-ad-ENGGU26W.js.map +1 -0
  470. package/dist/scaffold-video-OZHIU3SZ.js +886 -0
  471. package/dist/scaffold-video-OZHIU3SZ.js.map +1 -0
  472. package/dist/schedule-774JCRVM.js +67 -0
  473. package/dist/schedule-PKKSZ5RX.js +64 -0
  474. package/dist/scheduled-agents-ZI3EWKAT.js +55 -0
  475. package/dist/schema-BXNL4LKR.js +135 -0
  476. package/dist/schema-GFMVUZL2.js +152 -0
  477. package/dist/scrape-KKLE4WAU.js +2209 -0
  478. package/dist/screenshot-K6XOER6Z.js +103 -0
  479. package/dist/search-43ULIJL3.js +91 -0
  480. package/dist/search-AXUNJUWY.js +51 -0
  481. package/dist/search-DLLJEYMB.js +26 -0
  482. package/dist/search-LWWTXBB2.js +92 -0
  483. package/dist/search-VU6GI3U3.js +228 -0
  484. package/dist/search-XO365KES.js +177 -0
  485. package/dist/search-copy-BHNLLCUV.js +168 -0
  486. package/dist/seeds-6ROVZBFB.js +101 -0
  487. package/dist/select-4KMA72MV.js +111 -0
  488. package/dist/select-4KMA72MV.js.map +1 -0
  489. package/dist/sends-P6OPCYH5.js +349 -0
  490. package/dist/sequences-DP4BHM3E.js +146 -0
  491. package/dist/set-prompt-AII24NMX.js +200 -0
  492. package/dist/set-prompt-AII24NMX.js.map +1 -0
  493. package/dist/setup-links-T5TJZA3E.js +144 -0
  494. package/dist/shared-24IPELBM.js +32 -0
  495. package/dist/shopify-OQEKI7HC.js +4009 -0
  496. package/dist/site-QRLBZPEV.js +180 -0
  497. package/dist/sitemaps-SWADO4SI.js +77 -0
  498. package/dist/sites-H3FYJQFO.js +97 -0
  499. package/dist/skills-OYO6Y3DQ.js +47 -0
  500. package/dist/sources-U2WRH6D7.js +457 -0
  501. package/dist/sources-Y2BKZVXA.js +30 -0
  502. package/dist/stale-KE4K36UE.js +91 -0
  503. package/dist/stale-KE4K36UE.js.map +1 -0
  504. package/dist/stats-TTJHXR3E.js +34 -0
  505. package/dist/status-4BSXND3I.js +65 -0
  506. package/dist/sticker-CRIAIO75.js +103 -0
  507. package/dist/stock-TOFKLWSR.js +212 -0
  508. package/dist/studies-VFNWS6ND.js +250 -0
  509. package/dist/studio-WD364TWB.js +49 -0
  510. package/dist/study-writes-R7XYH3VH.js +472 -0
  511. package/dist/study-writes-R7XYH3VH.js.map +1 -0
  512. package/dist/suggest-GX4IROQN.js +66 -0
  513. package/dist/sync-BU7HU3FS.js +55 -0
  514. package/dist/sync-GQL5JX4U.js +57 -0
  515. package/dist/sync-VNBBOVBU.js +279 -0
  516. package/dist/sync-definition-EOARPSBS.js +71 -0
  517. package/dist/tag-SQ5ROLTP.js +57 -0
  518. package/dist/tag-manager-7S7PVYIJ.js +43 -0
  519. package/dist/tags-2226Q3VK.js +23 -0
  520. package/dist/tags-7QIBFIBX.js +227 -0
  521. package/dist/tags-BNWKAV3H.js +23 -0
  522. package/dist/tags-HG5EBHSO.js +23 -0
  523. package/dist/tags-WTN4EBT5.js +26 -0
  524. package/dist/targeting-SSI2F7XM.js +763 -0
  525. package/dist/targeting-SSI2F7XM.js.map +1 -0
  526. package/dist/targeting-constants-6KZXMRNI.js +118 -0
  527. package/dist/targeting-criteria-QSCRW75G.js +113 -0
  528. package/dist/targets-3KT3DO6O.js +106 -0
  529. package/dist/terms-IRLEAMIY.js +102 -0
  530. package/dist/testimonials-35FTFNQ5.js +32 -0
  531. package/dist/themes-WTMD2RE2.js +96 -0
  532. package/dist/themes-WTMD2RE2.js.map +1 -0
  533. package/dist/top-companies-JAWMSK2Q.js +111 -0
  534. package/dist/transcript-OIYU7F4E.js +165 -0
  535. package/dist/translate-S7ZQXQJH.js +604 -0
  536. package/dist/translate-S7ZQXQJH.js.map +1 -0
  537. package/dist/triggers-7QRQFTVM.js +144 -0
  538. package/dist/tweets-7XVF7PJO.js +123 -0
  539. package/dist/unfollow-ZCP6D2SC.js +46 -0
  540. package/dist/unlink-PYCYTYVN.js +70 -0
  541. package/dist/unstage-2OUF6ELM.js +88 -0
  542. package/dist/unstage-YADONHH6.js +96 -0
  543. package/dist/update-DEBDSBDI.js +81 -0
  544. package/dist/update-IDUSNDOI.js +192 -0
  545. package/dist/update-NG3HUYZZ.js +101 -0
  546. package/dist/update-P5IT7AIN.js +155 -0
  547. package/dist/update-U6NU7OXI.js +66 -0
  548. package/dist/upload-4F2JICEH.js +137 -0
  549. package/dist/upload-SS64KHDS.js +155 -0
  550. package/dist/upscale-JNNXDN6X.js +109 -0
  551. package/dist/url-options-EDPKAPPP.js +131 -0
  552. package/dist/url-params-4G26OEOO.js +101 -0
  553. package/dist/use-TKFP6WVP.js +111 -0
  554. package/dist/validate-HER6GMOZ.js +136 -0
  555. package/dist/validate-HER6GMOZ.js.map +1 -0
  556. package/dist/variant-3VTKOQUR.js +338 -0
  557. package/dist/videos-EDTBHLOZ.js +146 -0
  558. package/dist/videos-JRNJH66J.js +41 -0
  559. package/dist/view-6HX3FYMS.js +133 -0
  560. package/dist/viewer-check-OBBBAYV5.js +83 -0
  561. package/dist/web-GPUEUIDT.js +173 -0
  562. package/dist/winners-MEC77MZ4.js +113 -0
  563. package/dist/winning-ads-2DECFON4.js +86 -0
  564. package/dist/write-commands-AU2NJ4MR.js +1525 -0
  565. package/dist/write-commands-AU2NJ4MR.js.map +1 -0
  566. package/dist/write-commands-D5M5A4YI.js +721 -0
  567. package/dist/write-commands-LQVERLAQ.js +206 -0
  568. package/dist/write-commands-Y6U4WABA.js +1170 -0
  569. package/dist/write-commands-Y6U4WABA.js.map +1 -0
  570. package/dist/x-4TM5RET4.js +47 -0
  571. package/package.json +1 -1
  572. package/dist/account-EXGRZIXS.js +0 -82
  573. package/dist/account-JVDP5ERG.js +0 -82
  574. package/dist/account-NSBALYYS.js +0 -139
  575. package/dist/account-assets-EPEYTJFD.js +0 -290
  576. package/dist/account-level-VD4NLB2D.js +0 -611
  577. package/dist/account-level-VD4NLB2D.js.map +0 -1
  578. package/dist/account-reads-Z467VAL4.js +0 -219
  579. package/dist/account-reads-Z467VAL4.js.map +0 -1
  580. package/dist/account-users-342OZALE.js +0 -64
  581. package/dist/account-users-342OZALE.js.map +0 -1
  582. package/dist/account-writes-KEXINJ5D.js +0 -68
  583. package/dist/accounts-A47QUTTB.js +0 -76
  584. package/dist/accounts-E5TF2AFI.js +0 -115
  585. package/dist/accounts-QESGQJGZ.js +0 -713
  586. package/dist/accounts-QR6OQ3GC.js +0 -119
  587. package/dist/accounts-UWC2TT6R.js +0 -80
  588. package/dist/actions-NT3HXFFA.js +0 -55
  589. package/dist/active-entities-XRSJNBOV.js +0 -103
  590. package/dist/activecampaign-EYRHDSXY.js +0 -938
  591. package/dist/activities-ZDWREYR7.js +0 -75
  592. package/dist/ad-group-writes-SVR4RCKB.js +0 -172
  593. package/dist/ad-groups-C726HUXS.js +0 -70
  594. package/dist/ad-writes-RWJIWGEL.js +0 -176
  595. package/dist/add-25YZMFSH.js +0 -85
  596. package/dist/add-7MAL7JRX.js +0 -81
  597. package/dist/add-D44VCDRU.js +0 -148
  598. package/dist/add-EPOHDTUO.js +0 -305
  599. package/dist/add-JO4ZPS23.js +0 -97
  600. package/dist/add-NSW26HIM.js +0 -107
  601. package/dist/add-accounts-EKMSHAA4.js +0 -91
  602. package/dist/ads-3KK7VQPU.js +0 -79
  603. package/dist/ads-4YZYNU66.js +0 -128
  604. package/dist/ads-DGL5SGP3.js +0 -120
  605. package/dist/ads-EWZGIC4T.js +0 -48
  606. package/dist/adsets-PSVCPCE3.js +0 -182
  607. package/dist/advertisers-7NAPI5ZU.js +0 -125
  608. package/dist/advertisers-AHOWL3YL.js +0 -123
  609. package/dist/analytics-7H6NDVUQ.js +0 -447
  610. package/dist/analytics-GFFXCMLV.js +0 -2437
  611. package/dist/animate-GTUI7XX4.js +0 -480
  612. package/dist/approved-E4EZA5RT.js +0 -73
  613. package/dist/asset-writes-NDSHY5OT.js +0 -50
  614. package/dist/assign-SDPPWP3Q.js +0 -80
  615. package/dist/audience-size-LKDDHKED.js +0 -76
  616. package/dist/audience-writes-4KQXVGHO.js +0 -327
  617. package/dist/audience-writes-4KQXVGHO.js.map +0 -1
  618. package/dist/audiences-6L43K2T2.js +0 -280
  619. package/dist/audiences-T5LMTT3B.js +0 -85
  620. package/dist/audiences-UHLVATR6.js +0 -106
  621. package/dist/audit-46DO2HV3.js +0 -88
  622. package/dist/audit-TSZIQTUB.js +0 -154
  623. package/dist/autocomplete-5BSAOAMZ.js +0 -114
  624. package/dist/avatars-S6RRD7M3.js +0 -38
  625. package/dist/bid-pricing-5KUAINH4.js +0 -103
  626. package/dist/brand-KFK2MQWW.js +0 -22
  627. package/dist/brief-6DV2PKAU.js +0 -543
  628. package/dist/brief-6DV2PKAU.js.map +0 -1
  629. package/dist/businesses-TRFYMZ4I.js +0 -54
  630. package/dist/campaign-groups-5RPZPDNW.js +0 -99
  631. package/dist/campaign-writes-FUIGN5OR.js +0 -176
  632. package/dist/campaign-writes-XMYBEVZF.js +0 -168
  633. package/dist/campaigns-2MTON2IE.js +0 -130
  634. package/dist/campaigns-5A3IE735.js +0 -111
  635. package/dist/campaigns-JNP3VDZK.js +0 -113
  636. package/dist/campaigns-N2SWSBYT.js +0 -78
  637. package/dist/canvas-CHFNQTLY.js +0 -46
  638. package/dist/capabilities-2W3SRZ2I.js +0 -147
  639. package/dist/cards-CXKIVM4D.js +0 -85
  640. package/dist/catalog-6BER3SF7.js +0 -66
  641. package/dist/catalogs-4DNLG4AM.js +0 -782
  642. package/dist/catalogs-4DNLG4AM.js.map +0 -1
  643. package/dist/catalogs-G5NOKL4L.js +0 -130
  644. package/dist/changes-AS4RVEAL.js +0 -167
  645. package/dist/chatgpt-O6EEAYLF.js +0 -47
  646. package/dist/chats-4JLWMUAC.js +0 -584
  647. package/dist/check-BOKLY5WG.js +0 -107
  648. package/dist/check-BOKLY5WG.js.map +0 -1
  649. package/dist/chunk-2CC4CPDT.js +0 -225
  650. package/dist/chunk-3GXHML4V.js +0 -106
  651. package/dist/chunk-3KUNRKNV.js +0 -430
  652. package/dist/chunk-3QPG2D27.js +0 -125
  653. package/dist/chunk-3UNMVVSI.js +0 -917
  654. package/dist/chunk-3UNMVVSI.js.map +0 -1
  655. package/dist/chunk-3WN5GWX4.js +0 -94
  656. package/dist/chunk-4AO3LSYM.js +0 -73
  657. package/dist/chunk-4HFM5RCP.js +0 -217
  658. package/dist/chunk-4INBMXUS.js +0 -930
  659. package/dist/chunk-4NZ47VXO.js +0 -137
  660. package/dist/chunk-4NZ47VXO.js.map +0 -1
  661. package/dist/chunk-5NMKNHJI.js +0 -46
  662. package/dist/chunk-5NMKNHJI.js.map +0 -1
  663. package/dist/chunk-5QNW5PCM.js +0 -106
  664. package/dist/chunk-6AMN346B.js +0 -114
  665. package/dist/chunk-6D7WTUF3.js +0 -98
  666. package/dist/chunk-6DSPB6YA.js +0 -7904
  667. package/dist/chunk-6DSPB6YA.js.map +0 -1
  668. package/dist/chunk-6EOWBGGW.js +0 -191
  669. package/dist/chunk-6FQ7CJEX.js +0 -57
  670. package/dist/chunk-6MJKVNLL.js +0 -25
  671. package/dist/chunk-6OZDN2FI.js +0 -19
  672. package/dist/chunk-75OGTGC4.js +0 -89
  673. package/dist/chunk-7NBQQOCU.js +0 -97
  674. package/dist/chunk-AQRBEPZL.js +0 -138
  675. package/dist/chunk-AXLKR3E4.js +0 -66
  676. package/dist/chunk-AZIXX73C.js +0 -64
  677. package/dist/chunk-B64KJW5C.js +0 -476
  678. package/dist/chunk-BEZEZHQ6.js +0 -455
  679. package/dist/chunk-BIBXZJZI.js +0 -97
  680. package/dist/chunk-BMK4F4CU.js +0 -169
  681. package/dist/chunk-C52Q3L4C.js +0 -51
  682. package/dist/chunk-CBVUO7SK.js +0 -1744
  683. package/dist/chunk-CF5I4Q5M.js +0 -69
  684. package/dist/chunk-CST52ZME.js +0 -142
  685. package/dist/chunk-DGHSXHZR.js +0 -136
  686. package/dist/chunk-DHF4FXWS.js +0 -58
  687. package/dist/chunk-DPOUS5DN.js +0 -287
  688. package/dist/chunk-DW3H2XQA.js +0 -91
  689. package/dist/chunk-EAA273XW.js +0 -2250
  690. package/dist/chunk-EAA273XW.js.map +0 -1
  691. package/dist/chunk-EJ6EED6I.js +0 -69
  692. package/dist/chunk-EM5R3BYC.js +0 -131
  693. package/dist/chunk-EMR5KGNY.js +0 -685
  694. package/dist/chunk-EONUZOJV.js +0 -962
  695. package/dist/chunk-FLTAPEVY.js +0 -288
  696. package/dist/chunk-GRX3JXSR.js +0 -843
  697. package/dist/chunk-GRX3JXSR.js.map +0 -1
  698. package/dist/chunk-H25GY4U4.js +0 -139
  699. package/dist/chunk-H4RHZJ65.js +0 -207
  700. package/dist/chunk-H6ASYVQX.js +0 -544
  701. package/dist/chunk-HFIHXIYY.js +0 -547
  702. package/dist/chunk-HOA74TOS.js +0 -249
  703. package/dist/chunk-HOA74TOS.js.map +0 -1
  704. package/dist/chunk-HPF3USL2.js +0 -52
  705. package/dist/chunk-HQDNDKNR.js +0 -5471
  706. package/dist/chunk-HXSYWXLH.js +0 -709
  707. package/dist/chunk-I3QLWGKS.js +0 -64
  708. package/dist/chunk-IYDESWW4.js +0 -74
  709. package/dist/chunk-J4AWNWKN.js +0 -1919
  710. package/dist/chunk-J4AWNWKN.js.map +0 -1
  711. package/dist/chunk-JAK5VDSG.js +0 -103
  712. package/dist/chunk-JAME5NBT.js +0 -42
  713. package/dist/chunk-JGSEHX2Q.js +0 -3107
  714. package/dist/chunk-JGSEHX2Q.js.map +0 -1
  715. package/dist/chunk-JLAFNORO.js +0 -285
  716. package/dist/chunk-KG5VNPKU.js +0 -91
  717. package/dist/chunk-KGJ6EIX3.js +0 -76
  718. package/dist/chunk-KJHG2DWS.js +0 -170
  719. package/dist/chunk-L4QEMWNJ.js +0 -111
  720. package/dist/chunk-L7I47VGM.js +0 -46
  721. package/dist/chunk-LAMSUL26.js +0 -1518
  722. package/dist/chunk-LJEJCIHR.js +0 -246
  723. package/dist/chunk-LLTHDEM2.js +0 -479
  724. package/dist/chunk-M4KFO256.js +0 -188
  725. package/dist/chunk-M5PZ6QQB.js +0 -312
  726. package/dist/chunk-MFGUR5OD.js +0 -334
  727. package/dist/chunk-MIHY534L.js +0 -39
  728. package/dist/chunk-MKOI6QYM.js +0 -225
  729. package/dist/chunk-MPTNN35I.js +0 -325
  730. package/dist/chunk-MSIOGH67.js +0 -66
  731. package/dist/chunk-MTW2NDDD.js +0 -98
  732. package/dist/chunk-MZLPOYCC.js +0 -10058
  733. package/dist/chunk-MZLPOYCC.js.map +0 -1
  734. package/dist/chunk-NOCBNING.js +0 -638
  735. package/dist/chunk-NOCBNING.js.map +0 -1
  736. package/dist/chunk-NWLK5RPA.js +0 -197
  737. package/dist/chunk-NXNOXZGB.js +0 -2523
  738. package/dist/chunk-NXNOXZGB.js.map +0 -1
  739. package/dist/chunk-O5VSYBUA.js +0 -343
  740. package/dist/chunk-PR5OPERY.js +0 -167
  741. package/dist/chunk-Q3G4ZI2U.js +0 -84
  742. package/dist/chunk-Q5XUFN2W.js +0 -35
  743. package/dist/chunk-Q736UFSD.js +0 -75
  744. package/dist/chunk-QGAUDVMR.js +0 -148
  745. package/dist/chunk-QRRAMUKV.js +0 -468
  746. package/dist/chunk-QVQKCVP7.js +0 -85
  747. package/dist/chunk-QVQKCVP7.js.map +0 -1
  748. package/dist/chunk-RGLTITIH.js +0 -494
  749. package/dist/chunk-RIVQ4PQQ.js +0 -225
  750. package/dist/chunk-RLLPY62L.js +0 -163
  751. package/dist/chunk-RQHXWPET.js +0 -61
  752. package/dist/chunk-RRKUXGAU.js +0 -26
  753. package/dist/chunk-RULW4627.js +0 -23
  754. package/dist/chunk-S4RCF3YT.js +0 -156
  755. package/dist/chunk-S4RCF3YT.js.map +0 -1
  756. package/dist/chunk-S5S54J2K.js +0 -56
  757. package/dist/chunk-SIRRBWQ2.js +0 -215
  758. package/dist/chunk-TCLJRWST.js +0 -831
  759. package/dist/chunk-TLQY4QBW.js +0 -84
  760. package/dist/chunk-UK4XSLV2.js +0 -296
  761. package/dist/chunk-URGXEDFV.js +0 -76
  762. package/dist/chunk-UVUY6FLV.js +0 -1254
  763. package/dist/chunk-V4HS5JRL.js +0 -1320
  764. package/dist/chunk-V7EN5LFS.js +0 -115
  765. package/dist/chunk-WTOBG3YL.js +0 -392
  766. package/dist/chunk-WTPID22G.js +0 -152
  767. package/dist/chunk-WYMX3F47.js +0 -399
  768. package/dist/chunk-X5YHMGAT.js +0 -224
  769. package/dist/chunk-X7USE7IA.js +0 -24026
  770. package/dist/chunk-XA76OGSL.js +0 -718
  771. package/dist/chunk-XA7JN7YE.js +0 -297
  772. package/dist/chunk-XHAGX4J4.js +0 -604
  773. package/dist/chunk-XY7W6MQN.js +0 -274
  774. package/dist/chunk-YAINUFSC.js +0 -203
  775. package/dist/chunk-YAMKCMAS.js +0 -219
  776. package/dist/chunk-YRWCXYWW.js +0 -178
  777. package/dist/chunk-YRWCXYWW.js.map +0 -1
  778. package/dist/chunk-Z5BG47PO.js +0 -5752
  779. package/dist/chunk-Z5BG47PO.js.map +0 -1
  780. package/dist/chunk-Z7ICQKC2.js +0 -344
  781. package/dist/chunk-ZBXV2KOQ.js +0 -220
  782. package/dist/chunk-ZCGM7ZWM.js +0 -45
  783. package/dist/chunk-ZMNRSTNV.js +0 -454
  784. package/dist/cite-WCAOCOO5.js +0 -191
  785. package/dist/claim-L4WLCVUL.js +0 -200
  786. package/dist/client-VCKP6WBR.js +0 -19
  787. package/dist/code-VXOTFGD2.js +0 -76
  788. package/dist/companies-HW46BRQG.js +0 -198
  789. package/dist/company-KCIDE7SL.js +0 -308
  790. package/dist/complete-JXM25FVW.js +0 -84
  791. package/dist/config-UR45YCIN.js +0 -88
  792. package/dist/connect-7TX7AAM5.js +0 -45
  793. package/dist/content-EQQIKG5H.js +0 -85
  794. package/dist/conversation-YIDUB6GL.js +0 -96
  795. package/dist/conversion-report-33SG7SHU.js +0 -127
  796. package/dist/conversion-upload-command-N3OMLLF2.js +0 -439
  797. package/dist/conversion-upload-command-N3OMLLF2.js.map +0 -1
  798. package/dist/conversion-writes-XGGTBML5.js +0 -122
  799. package/dist/conversions-F4OZYUCT.js +0 -140
  800. package/dist/conversions-PPP4QK7U.js +0 -78
  801. package/dist/copy-writes-JVUX3YDL.js +0 -170
  802. package/dist/copy-writes-JVUX3YDL.js.map +0 -1
  803. package/dist/countries-GRCU4IGM.js +0 -82
  804. package/dist/create-6EAKNERA.js +0 -239
  805. package/dist/create-772LZHZR.js +0 -218
  806. package/dist/create-FDNMIVFX.js +0 -62
  807. package/dist/create-X2QM7GA7.js +0 -135
  808. package/dist/creatives-4EPM3RHG.js +0 -118
  809. package/dist/creatives-K2AAW6EL.js +0 -58
  810. package/dist/creatives-K2AAW6EL.js.map +0 -1
  811. package/dist/creatives-SNYN4KIM.js +0 -229
  812. package/dist/credentials-KZZVBO42.js +0 -290
  813. package/dist/critique-G5QXRHPF.js +0 -1451
  814. package/dist/critique-G5QXRHPF.js.map +0 -1
  815. package/dist/critique-PUHOJI7V.js +0 -232
  816. package/dist/critique-PUHOJI7V.js.map +0 -1
  817. package/dist/crm-4LZZVT4N.js +0 -229
  818. package/dist/crm-M6NXDU5B.js +0 -323
  819. package/dist/crop-NE7YX4SS.js +0 -113
  820. package/dist/currency-HK2ZW2VW.js +0 -88
  821. package/dist/custom-conversions-GQTU5E6X.js +0 -128
  822. package/dist/customers-V5NT4W7X.js +0 -65
  823. package/dist/decide-6Q5X3V3F.js +0 -199
  824. package/dist/delete-EKKOEB3N.js +0 -69
  825. package/dist/delete-GQIKNO53.js +0 -57
  826. package/dist/delete-LFZIPQEO.js +0 -69
  827. package/dist/delete-QHDDR66K.js +0 -85
  828. package/dist/delete-SP66F7ZV.js +0 -71
  829. package/dist/delete-YOEI63OT.js +0 -67
  830. package/dist/demographics-CEQ74O74.js +0 -141
  831. package/dist/describe-DJPIUEFE.js +0 -97
  832. package/dist/describe-MAGTSOW4.js +0 -97
  833. package/dist/dimensions-IC2H7V3H.js +0 -101
  834. package/dist/discard-5GDF3TP3.js +0 -69
  835. package/dist/discover-PSL2NBJL.js +0 -93
  836. package/dist/discover-Q5PAOIQQ.js +0 -172
  837. package/dist/domain-PKOUPHHF.js +0 -101
  838. package/dist/download-2WNTN7JQ.js +0 -172
  839. package/dist/download-EHDJXBAC.js +0 -337
  840. package/dist/draft-27NMTARB.js +0 -134
  841. package/dist/draft-CF4XNJG5.js +0 -578
  842. package/dist/draft-CF4XNJG5.js.map +0 -1
  843. package/dist/draft-F4CVSL2I.js +0 -332
  844. package/dist/draft-F4CVSL2I.js.map +0 -1
  845. package/dist/draft-JESKGZ6O.js +0 -138
  846. package/dist/draft-L2NXCIYT.js +0 -315
  847. package/dist/draft-MWYKIZC4.js +0 -260
  848. package/dist/draft-RZCTAOI2.js +0 -374
  849. package/dist/draft-UEVBUNKV.js +0 -220
  850. package/dist/env-NZXNMWSD.js +0 -53
  851. package/dist/experiment-XAYSEYTU.js +0 -1397
  852. package/dist/experiments-DWC6L72S.js +0 -236
  853. package/dist/experiments-DWC6L72S.js.map +0 -1
  854. package/dist/export-W54UZ62P.js +0 -168
  855. package/dist/extract-6HJXSOZW.js +0 -143
  856. package/dist/facets-TBOXGYJT.js +0 -117
  857. package/dist/favorites-Y6CT6NSQ.js +0 -178
  858. package/dist/feed-35BRQPTH.js +0 -177
  859. package/dist/feedback-MSMFYAEY.js +0 -114
  860. package/dist/feedback-WAC6S42V.js +0 -115
  861. package/dist/feedback-WAC6S42V.js.map +0 -1
  862. package/dist/feedback-record-XRQ2R2WD.js +0 -269
  863. package/dist/feedback-record-XRQ2R2WD.js.map +0 -1
  864. package/dist/fetch-I6P72CDL.js +0 -139
  865. package/dist/fetch-LGX7B3IC.js +0 -204
  866. package/dist/find-SVGRA7IA.js +0 -144
  867. package/dist/fit-RVWPRBNO.js +0 -65
  868. package/dist/flows-LA6EYMLS.js +0 -340
  869. package/dist/follow-24QSDNAG.js +0 -94
  870. package/dist/follow-competitors-AG4E4XFA.js +0 -112
  871. package/dist/following-YGM6TBK3.js +0 -113
  872. package/dist/fonts-WRC34VSV.js +0 -39
  873. package/dist/forecast-6VHRGBJG.js +0 -121
  874. package/dist/forecast-OVKXBLJB.js +0 -169
  875. package/dist/forecast-OVKXBLJB.js.map +0 -1
  876. package/dist/funding-WZNGXRLJ.js +0 -85
  877. package/dist/funnel-U3GQIGND.js +0 -397
  878. package/dist/ga4-W3U5YTRT.js +0 -55
  879. package/dist/generate-Y4NJEYIH.js +0 -263
  880. package/dist/get-3MTAVNTP.js +0 -56
  881. package/dist/get-5SPNAIUQ.js +0 -62
  882. package/dist/get-AHI247JG.js +0 -82
  883. package/dist/get-GEUSRD5Y.js +0 -59
  884. package/dist/get-JIZPYK3Z.js +0 -74
  885. package/dist/get-PF3HGECD.js +0 -62
  886. package/dist/get-TS2ZJDCQ.js +0 -38
  887. package/dist/get-YWDZYEAC.js +0 -92
  888. package/dist/gif-NP6EDGEE.js +0 -111
  889. package/dist/google-BMUJKAUO.js +0 -3300
  890. package/dist/google-BMUJKAUO.js.map +0 -1
  891. package/dist/google-ZVAIFXQZ.js +0 -163
  892. package/dist/google-ads-6Z7P3SCD.js +0 -198
  893. package/dist/group-3DT4UYSR.js +0 -43
  894. package/dist/group-OEKKCFXT.js +0 -43
  895. package/dist/gsc-4FEFPFPB.js +0 -30
  896. package/dist/history-4QUV45ZJ.js +0 -102
  897. package/dist/history-PD7FCTDD.js +0 -153
  898. package/dist/history-VKRYKQ4C.js +0 -69
  899. package/dist/hubspot-WEFAFKVJ.js +0 -814
  900. package/dist/icon-43UJTGGE.js +0 -138
  901. package/dist/ideas-SMSEXKIA.js +0 -45
  902. package/dist/images-KAT4BPYV.js +0 -92
  903. package/dist/improve-IMXQN6OD.js +0 -86
  904. package/dist/ingest-IHKTSJ4H.js +0 -28
  905. package/dist/ingest-TOHQ6MZA.js +0 -131
  906. package/dist/insights-3IPSEBYW.js +0 -132
  907. package/dist/insights-BR3456EI.js +0 -658
  908. package/dist/inspect-5MZBPDYS.js +0 -192
  909. package/dist/inspiration-XZI5KCQW.js +0 -53
  910. package/dist/instant-experiences-2LKF7XVK.js +0 -264
  911. package/dist/instant-experiences-2LKF7XVK.js.map +0 -1
  912. package/dist/intent-ZM4K623V.js +0 -95
  913. package/dist/job-GOX3KIKG.js +0 -202
  914. package/dist/job-create-F2PQSN3C.js +0 -109
  915. package/dist/job-status-3FMA5D7T.js +0 -74
  916. package/dist/keep-23ZYMWPG.js +0 -78
  917. package/dist/keyword-gap-FAAF2I6V.js +0 -130
  918. package/dist/keyword-metrics-EXNJRJBY.js +0 -200
  919. package/dist/keywords-for-site-5LW77QWF.js +0 -131
  920. package/dist/knowledge-7M7DSRF3.js +0 -195
  921. package/dist/landing-ZH4SD3DW.js +0 -28
  922. package/dist/landings-VNQ4VA2U.js +0 -151
  923. package/dist/languages-2X22HXM3.js +0 -55
  924. package/dist/languages-ZGDTERIQ.js +0 -40
  925. package/dist/launches-L4EUROCJ.js +0 -19
  926. package/dist/layerize-6QHQMA7Q.js +0 -190
  927. package/dist/lead-routes-5TPFJEVH.js +0 -733
  928. package/dist/leads-4TLOH47R.js +0 -541
  929. package/dist/leads-4TLOH47R.js.map +0 -1
  930. package/dist/leads-736RILZN.js +0 -115
  931. package/dist/learn-BESXWXEN.js +0 -207
  932. package/dist/library-MNJC24E4.js +0 -212
  933. package/dist/lighthouse-DJMAXFTD.js +0 -75
  934. package/dist/line-item-writes-FA72DHNQ.js +0 -211
  935. package/dist/line-items-XVYE3IYT.js +0 -107
  936. package/dist/link-6FPKFVC3.js +0 -67
  937. package/dist/linkedin-TE6P4RYN.js +0 -1344
  938. package/dist/linkedin-TE6P4RYN.js.map +0 -1
  939. package/dist/linkedin-person-TZJ6VEXE.js +0 -139
  940. package/dist/list-2277GCPH.js +0 -51
  941. package/dist/list-4R5EMKUQ.js +0 -154
  942. package/dist/list-537S75BZ.js +0 -76
  943. package/dist/list-MN2FPF3T.js +0 -306
  944. package/dist/list-ORO4WDF4.js +0 -67
  945. package/dist/list-Q52FPW3H.js +0 -50
  946. package/dist/list-V4PSDBLX.js +0 -93
  947. package/dist/list-WIXQXNKB.js +0 -65
  948. package/dist/list-XK33NCSC.js +0 -57
  949. package/dist/locations-A65MFB7Q.js +0 -69
  950. package/dist/locations-WN6B3IJK.js +0 -40
  951. package/dist/log-ABBZLPRU.js +0 -95
  952. package/dist/logo-4LSFZ3ZO.js +0 -19
  953. package/dist/lookup-WIM5WR25.js +0 -23
  954. package/dist/make-QAFKU6WO.js +0 -1367
  955. package/dist/make-QAFKU6WO.js.map +0 -1
  956. package/dist/map-52P35OKE.js +0 -445
  957. package/dist/mcp-PZ3VBIF4.js +0 -729
  958. package/dist/media-34I7UB7Z.js +0 -89
  959. package/dist/media-KKI3KWLR.js +0 -18
  960. package/dist/media-sources-TT374PLN.js +0 -35
  961. package/dist/members-CF6VG6ZW.js +0 -47
  962. package/dist/meme-6NFYFQ7T.js +0 -108
  963. package/dist/meta-2UK7KIE4.js +0 -124
  964. package/dist/metrics-3U3ZO2RF.js +0 -152
  965. package/dist/models-VOSJJFO2.js +0 -155
  966. package/dist/normalize-4LZCLMTQ.js +0 -144
  967. package/dist/normalize-G75RDSE4.js +0 -806
  968. package/dist/options-6IRL7CL6.js +0 -125
  969. package/dist/organization-WMLLJE66.js +0 -949
  970. package/dist/output-ELEO2Z6R.js +0 -24
  971. package/dist/page-4X6IBUWG.js +0 -105
  972. package/dist/page-photos-KNBLMFLN.js +0 -118
  973. package/dist/page-photos-KNBLMFLN.js.map +0 -1
  974. package/dist/pages-7HW5YOZV.js +0 -67
  975. package/dist/performance-A7CYFBW2.js +0 -5565
  976. package/dist/performance-HYSTXLTS.js +0 -27
  977. package/dist/pinterest-KA6VFDM4.js +0 -105
  978. package/dist/pixels-D5HF24FI.js +0 -109
  979. package/dist/pixels-U6UA662G.js +0 -62
  980. package/dist/plan-XCA6R3HZ.js +0 -208
  981. package/dist/posts-ALGM6ONV.js +0 -36
  982. package/dist/preview-55TRUF4Q.js +0 -245
  983. package/dist/preview-76ZP2QA3.js +0 -101
  984. package/dist/profile-NHUPUCBR.js +0 -159
  985. package/dist/promoted-tweet-writes-I5G4IDL5.js +0 -183
  986. package/dist/promoted-tweets-X5XNO7IT.js +0 -119
  987. package/dist/properties-2ZXA5BPJ.js +0 -101
  988. package/dist/publish-S2Z4EF4H.js +0 -350
  989. package/dist/query-63CTX2PH.js +0 -231
  990. package/dist/query-DMWY3TDD.js +0 -236
  991. package/dist/query-SAQADBM2.js +0 -62
  992. package/dist/questionnaire-WHE42RD4.js +0 -94
  993. package/dist/read-NESEKULG.js +0 -141
  994. package/dist/reddit-S2L5WDY7.js +0 -29
  995. package/dist/refresh-ILDEPU5A.js +0 -42
  996. package/dist/refresh-K2YTJSH3.js +0 -97
  997. package/dist/release-FX76IIVN.js +0 -63
  998. package/dist/relevant-pages-KTSODNNW.js +0 -99
  999. package/dist/remove-LOVWPLDO.js +0 -53
  1000. package/dist/remove-NHE4UT7G.js +0 -49
  1001. package/dist/reopen-DXV2Y6Z3.js +0 -66
  1002. package/dist/rerun-TFQCRRFK.js +0 -97
  1003. package/dist/rerun-TFQCRRFK.js.map +0 -1
  1004. package/dist/research-7PGDAKC7.js +0 -265
  1005. package/dist/research-HY5PSUCC.js +0 -75
  1006. package/dist/reset-MEHUQJA4.js +0 -57
  1007. package/dist/reset-Y5VZJRDQ.js +0 -57
  1008. package/dist/resolve-FAVABEJW.js +0 -124
  1009. package/dist/retry-5IY4MNDW.js +0 -65
  1010. package/dist/retry-OMJ3C3AX.js +0 -63
  1011. package/dist/retry-failed-R5HPQ3KQ.js +0 -45
  1012. package/dist/revenue-S4KFZCOI.js +0 -91
  1013. package/dist/revenue-S4KFZCOI.js.map +0 -1
  1014. package/dist/rule-writes-QB4IWFCJ.js +0 -530
  1015. package/dist/rule-writes-QB4IWFCJ.js.map +0 -1
  1016. package/dist/rules-66IGR2KA.js +0 -99
  1017. package/dist/rules-66IGR2KA.js.map +0 -1
  1018. package/dist/rules-FYVD2QBB.js +0 -217
  1019. package/dist/rules-add-G7YGOYZJ.js +0 -465
  1020. package/dist/rules-add-G7YGOYZJ.js.map +0 -1
  1021. package/dist/run-LJVBH3JS.js +0 -72
  1022. package/dist/run-XJBWDWN6.js +0 -69
  1023. package/dist/scaffold-ad-GNMCB3QY.js +0 -1513
  1024. package/dist/scaffold-ad-GNMCB3QY.js.map +0 -1
  1025. package/dist/scaffold-static-ad-QIWKWURL.js +0 -1013
  1026. package/dist/scaffold-static-ad-QIWKWURL.js.map +0 -1
  1027. package/dist/scaffold-video-G6G2NPUF.js +0 -885
  1028. package/dist/scaffold-video-G6G2NPUF.js.map +0 -1
  1029. package/dist/schedule-D7EDEM45.js +0 -67
  1030. package/dist/schedule-OX5XHXLH.js +0 -64
  1031. package/dist/scheduled-agents-A5ZFQB5X.js +0 -55
  1032. package/dist/schema-NTGHAPR2.js +0 -135
  1033. package/dist/schema-Z43AJOJ4.js +0 -152
  1034. package/dist/scrape-VL2RWSTW.js +0 -2209
  1035. package/dist/screenshot-Y6EEXS3Q.js +0 -103
  1036. package/dist/search-CXC7N5XJ.js +0 -51
  1037. package/dist/search-JEXYEAPQ.js +0 -228
  1038. package/dist/search-L3GTZYRW.js +0 -92
  1039. package/dist/search-TXBYKNQC.js +0 -91
  1040. package/dist/search-WCXQBMMM.js +0 -177
  1041. package/dist/search-XHSTUBDY.js +0 -26
  1042. package/dist/search-copy-FIPG7OCC.js +0 -168
  1043. package/dist/seeds-ADJKURNG.js +0 -101
  1044. package/dist/select-5ZD7FVBT.js +0 -110
  1045. package/dist/select-5ZD7FVBT.js.map +0 -1
  1046. package/dist/sends-RS4LWRAC.js +0 -349
  1047. package/dist/sequences-2RPKDKGQ.js +0 -146
  1048. package/dist/set-prompt-NGCVMQIQ.js +0 -199
  1049. package/dist/set-prompt-NGCVMQIQ.js.map +0 -1
  1050. package/dist/setup-links-4HCSF55G.js +0 -144
  1051. package/dist/shared-4GGUIOF2.js +0 -32
  1052. package/dist/shopify-GDR5WGHH.js +0 -4009
  1053. package/dist/site-B7LT6KAO.js +0 -180
  1054. package/dist/sitemaps-Z6IELTQV.js +0 -77
  1055. package/dist/sites-KLAKI2EY.js +0 -97
  1056. package/dist/skills-OJP36EVR.js +0 -47
  1057. package/dist/sources-6DPUEROC.js +0 -30
  1058. package/dist/sources-OSUXCLID.js +0 -457
  1059. package/dist/stale-YKFKPPOH.js +0 -90
  1060. package/dist/stale-YKFKPPOH.js.map +0 -1
  1061. package/dist/stats-MIMFX4R7.js +0 -34
  1062. package/dist/status-KIC3P5JV.js +0 -65
  1063. package/dist/sticker-IREEEN7I.js +0 -103
  1064. package/dist/stock-VWFUFRYV.js +0 -212
  1065. package/dist/studies-YGYAH3JI.js +0 -250
  1066. package/dist/studio-XLC37YGX.js +0 -49
  1067. package/dist/study-writes-UPGJB36A.js +0 -471
  1068. package/dist/study-writes-UPGJB36A.js.map +0 -1
  1069. package/dist/suggest-5RTISDLI.js +0 -66
  1070. package/dist/sync-OHIXI4I6.js +0 -55
  1071. package/dist/sync-QBW4XH2H.js +0 -57
  1072. package/dist/sync-VCAFAYW4.js +0 -279
  1073. package/dist/sync-definition-4KMJK46H.js +0 -70
  1074. package/dist/tag-DSCUKNC3.js +0 -57
  1075. package/dist/tag-manager-IINALUEJ.js +0 -43
  1076. package/dist/tags-4F5UBPYG.js +0 -227
  1077. package/dist/tags-4O5FPEEY.js +0 -26
  1078. package/dist/tags-7RKKCQ4X.js +0 -23
  1079. package/dist/tags-CB4MWI3A.js +0 -23
  1080. package/dist/tags-QZJIP4LJ.js +0 -23
  1081. package/dist/targeting-BM72UTI6.js +0 -762
  1082. package/dist/targeting-BM72UTI6.js.map +0 -1
  1083. package/dist/targeting-constants-54S3FXIF.js +0 -118
  1084. package/dist/targeting-criteria-65UU7EYD.js +0 -113
  1085. package/dist/targets-T742OPQI.js +0 -106
  1086. package/dist/terms-OFHNLW6U.js +0 -102
  1087. package/dist/testimonials-HKJJXONO.js +0 -32
  1088. package/dist/themes-Q6LVMEMF.js +0 -95
  1089. package/dist/themes-Q6LVMEMF.js.map +0 -1
  1090. package/dist/top-companies-T6AMU4C6.js +0 -111
  1091. package/dist/transcript-DOUYMZAP.js +0 -165
  1092. package/dist/translate-WKOXFZTQ.js +0 -603
  1093. package/dist/translate-WKOXFZTQ.js.map +0 -1
  1094. package/dist/triggers-EYY4GSUL.js +0 -144
  1095. package/dist/tweets-TRTXC6O4.js +0 -123
  1096. package/dist/unfollow-DATOGPLZ.js +0 -46
  1097. package/dist/unlink-JNM4WRZK.js +0 -70
  1098. package/dist/unstage-LLQCMZ5H.js +0 -96
  1099. package/dist/unstage-QF4JT5YP.js +0 -88
  1100. package/dist/update-6V3RBRIE.js +0 -101
  1101. package/dist/update-J4DURR4K.js +0 -192
  1102. package/dist/update-J7Y6LZC5.js +0 -155
  1103. package/dist/update-MQ4NYIU6.js +0 -66
  1104. package/dist/update-SD5YQIJC.js +0 -81
  1105. package/dist/upload-7PPMVWVA.js +0 -155
  1106. package/dist/upload-CEIYYPID.js +0 -137
  1107. package/dist/upscale-WVJZG76V.js +0 -109
  1108. package/dist/url-options-6WC2XQKB.js +0 -131
  1109. package/dist/url-params-OVBIP6UA.js +0 -101
  1110. package/dist/use-6FADOAFZ.js +0 -111
  1111. package/dist/validate-UHXI2ESE.js +0 -135
  1112. package/dist/validate-UHXI2ESE.js.map +0 -1
  1113. package/dist/variant-RNM36P4J.js +0 -338
  1114. package/dist/videos-GHFCOTT7.js +0 -146
  1115. package/dist/videos-Z72RXCRB.js +0 -41
  1116. package/dist/view-YR6MDLWL.js +0 -133
  1117. package/dist/viewer-check-655BZRML.js +0 -83
  1118. package/dist/web-4QN6QB7L.js +0 -173
  1119. package/dist/winners-4T5RFQXU.js +0 -113
  1120. package/dist/winning-ads-2J2RIOLR.js +0 -86
  1121. package/dist/write-commands-6D55SB56.js +0 -206
  1122. package/dist/write-commands-AIWLEGO2.js +0 -1169
  1123. package/dist/write-commands-AIWLEGO2.js.map +0 -1
  1124. package/dist/write-commands-UO3OQIHH.js +0 -721
  1125. package/dist/write-commands-V7B4FBMX.js +0 -1524
  1126. package/dist/write-commands-V7B4FBMX.js.map +0 -1
  1127. package/dist/x-7KXNCWTJ.js +0 -47
  1128. /package/dist/{account-JVDP5ERG.js.map → account-6RJ6ZI3B.js.map} +0 -0
  1129. /package/dist/{account-EXGRZIXS.js.map → account-AIGNJ2RP.js.map} +0 -0
  1130. /package/dist/{account-NSBALYYS.js.map → account-E5LLPRZ6.js.map} +0 -0
  1131. /package/dist/{account-assets-EPEYTJFD.js.map → account-assets-J6SVHSXR.js.map} +0 -0
  1132. /package/dist/{account-writes-KEXINJ5D.js.map → account-writes-XNS4IKZV.js.map} +0 -0
  1133. /package/dist/{accounts-UWC2TT6R.js.map → accounts-3ZWYGRVM.js.map} +0 -0
  1134. /package/dist/{accounts-QR6OQ3GC.js.map → accounts-5TLHSEZR.js.map} +0 -0
  1135. /package/dist/{accounts-QESGQJGZ.js.map → accounts-BAZYYDFV.js.map} +0 -0
  1136. /package/dist/{accounts-A47QUTTB.js.map → accounts-L2HVNJUF.js.map} +0 -0
  1137. /package/dist/{accounts-E5TF2AFI.js.map → accounts-NTBIRB52.js.map} +0 -0
  1138. /package/dist/{actions-NT3HXFFA.js.map → actions-N2FBJMT4.js.map} +0 -0
  1139. /package/dist/{active-entities-XRSJNBOV.js.map → active-entities-IJPRN45K.js.map} +0 -0
  1140. /package/dist/{activecampaign-EYRHDSXY.js.map → activecampaign-U77COT2F.js.map} +0 -0
  1141. /package/dist/{activities-ZDWREYR7.js.map → activities-SS3SUWSS.js.map} +0 -0
  1142. /package/dist/{ad-group-writes-SVR4RCKB.js.map → ad-group-writes-DTQSUNE2.js.map} +0 -0
  1143. /package/dist/{ad-groups-C726HUXS.js.map → ad-groups-CX23GLVE.js.map} +0 -0
  1144. /package/dist/{ad-writes-RWJIWGEL.js.map → ad-writes-HAAUOJCG.js.map} +0 -0
  1145. /package/dist/{add-EPOHDTUO.js.map → add-ABPQTO2M.js.map} +0 -0
  1146. /package/dist/{add-JO4ZPS23.js.map → add-BK6N7KWU.js.map} +0 -0
  1147. /package/dist/{add-25YZMFSH.js.map → add-ECN2FTMH.js.map} +0 -0
  1148. /package/dist/{add-D44VCDRU.js.map → add-FH7OVKFF.js.map} +0 -0
  1149. /package/dist/{add-7MAL7JRX.js.map → add-KHY3H54G.js.map} +0 -0
  1150. /package/dist/{add-NSW26HIM.js.map → add-VDH2VCXR.js.map} +0 -0
  1151. /package/dist/{add-accounts-EKMSHAA4.js.map → add-accounts-6JAOSCXK.js.map} +0 -0
  1152. /package/dist/{ads-4YZYNU66.js.map → ads-BEMEXBDJ.js.map} +0 -0
  1153. /package/dist/{ads-EWZGIC4T.js.map → ads-GAU2XKNL.js.map} +0 -0
  1154. /package/dist/{ads-3KK7VQPU.js.map → ads-HZOXZ3FY.js.map} +0 -0
  1155. /package/dist/{ads-DGL5SGP3.js.map → ads-I5OBZ5VI.js.map} +0 -0
  1156. /package/dist/{adsets-PSVCPCE3.js.map → adsets-PMQGA6TW.js.map} +0 -0
  1157. /package/dist/{advertisers-AHOWL3YL.js.map → advertisers-EOLL3VFQ.js.map} +0 -0
  1158. /package/dist/{advertisers-7NAPI5ZU.js.map → advertisers-FNKY2PP4.js.map} +0 -0
  1159. /package/dist/{analytics-GFFXCMLV.js.map → analytics-DOAUCF2Y.js.map} +0 -0
  1160. /package/dist/{analytics-7H6NDVUQ.js.map → analytics-MR3T34KN.js.map} +0 -0
  1161. /package/dist/{animate-GTUI7XX4.js.map → animate-EKGVDSWM.js.map} +0 -0
  1162. /package/dist/{approved-E4EZA5RT.js.map → approved-WQL4Z4EB.js.map} +0 -0
  1163. /package/dist/{asset-writes-NDSHY5OT.js.map → asset-writes-A5X2T6LQ.js.map} +0 -0
  1164. /package/dist/{assign-SDPPWP3Q.js.map → assign-UMNHINRA.js.map} +0 -0
  1165. /package/dist/{audience-size-LKDDHKED.js.map → audience-size-Q7DZ6TGM.js.map} +0 -0
  1166. /package/dist/{audiences-UHLVATR6.js.map → audiences-HBJGEGKL.js.map} +0 -0
  1167. /package/dist/{audiences-6L43K2T2.js.map → audiences-RDQZNGPI.js.map} +0 -0
  1168. /package/dist/{audiences-T5LMTT3B.js.map → audiences-TA636UBN.js.map} +0 -0
  1169. /package/dist/{audit-TSZIQTUB.js.map → audit-H3F6FZNE.js.map} +0 -0
  1170. /package/dist/{audit-46DO2HV3.js.map → audit-QMCK76AT.js.map} +0 -0
  1171. /package/dist/{autocomplete-5BSAOAMZ.js.map → autocomplete-DIBJ57VC.js.map} +0 -0
  1172. /package/dist/{avatars-S6RRD7M3.js.map → avatars-UIXRGLPA.js.map} +0 -0
  1173. /package/dist/{bid-pricing-5KUAINH4.js.map → bid-pricing-OMY2F2SB.js.map} +0 -0
  1174. /package/dist/{brand-KFK2MQWW.js.map → brand-WV6CAU3M.js.map} +0 -0
  1175. /package/dist/{businesses-TRFYMZ4I.js.map → businesses-56IUB5X4.js.map} +0 -0
  1176. /package/dist/{campaign-groups-5RPZPDNW.js.map → campaign-groups-PGJIQV4S.js.map} +0 -0
  1177. /package/dist/{campaign-writes-FUIGN5OR.js.map → campaign-writes-MAJ5FGXG.js.map} +0 -0
  1178. /package/dist/{campaign-writes-XMYBEVZF.js.map → campaign-writes-WL3YAEGJ.js.map} +0 -0
  1179. /package/dist/{campaigns-2MTON2IE.js.map → campaigns-5L4ZTGF7.js.map} +0 -0
  1180. /package/dist/{campaigns-JNP3VDZK.js.map → campaigns-EK7EUKZD.js.map} +0 -0
  1181. /package/dist/{campaigns-N2SWSBYT.js.map → campaigns-HCJ3AIDK.js.map} +0 -0
  1182. /package/dist/{campaigns-5A3IE735.js.map → campaigns-NHACWGWS.js.map} +0 -0
  1183. /package/dist/{canvas-CHFNQTLY.js.map → canvas-INL3J7HO.js.map} +0 -0
  1184. /package/dist/{capabilities-2W3SRZ2I.js.map → capabilities-Y33EWDMJ.js.map} +0 -0
  1185. /package/dist/{cards-CXKIVM4D.js.map → cards-IWWKA5WH.js.map} +0 -0
  1186. /package/dist/{catalog-6BER3SF7.js.map → catalog-NSA2FUI2.js.map} +0 -0
  1187. /package/dist/{catalogs-G5NOKL4L.js.map → catalogs-SJMYID7N.js.map} +0 -0
  1188. /package/dist/{changes-AS4RVEAL.js.map → changes-2HOF2HSV.js.map} +0 -0
  1189. /package/dist/{chatgpt-O6EEAYLF.js.map → chatgpt-J6MNVQVT.js.map} +0 -0
  1190. /package/dist/{chats-4JLWMUAC.js.map → chats-4HK6UYD2.js.map} +0 -0
  1191. /package/dist/{chunk-UK4XSLV2.js.map → chunk-2B2JFTWI.js.map} +0 -0
  1192. /package/dist/{chunk-RULW4627.js.map → chunk-2O5CCKV7.js.map} +0 -0
  1193. /package/dist/{chunk-AXLKR3E4.js.map → chunk-3BKESS5W.js.map} +0 -0
  1194. /package/dist/{chunk-FLTAPEVY.js.map → chunk-3VBPJQ7L.js.map} +0 -0
  1195. /package/dist/{chunk-6OZDN2FI.js.map → chunk-3X262BEG.js.map} +0 -0
  1196. /package/dist/{chunk-DGHSXHZR.js.map → chunk-4CYB33V3.js.map} +0 -0
  1197. /package/dist/{chunk-CST52ZME.js.map → chunk-4JB556VC.js.map} +0 -0
  1198. /package/dist/{chunk-H4RHZJ65.js.map → chunk-4QYZJPSM.js.map} +0 -0
  1199. /package/dist/{chunk-H6ASYVQX.js.map → chunk-4WLJYLRL.js.map} +0 -0
  1200. /package/dist/{chunk-V4HS5JRL.js.map → chunk-56ZJO7TM.js.map} +0 -0
  1201. /package/dist/{chunk-AQRBEPZL.js.map → chunk-5LQGW5UF.js.map} +0 -0
  1202. /package/dist/{chunk-HXSYWXLH.js.map → chunk-5U6OL4NN.js.map} +0 -0
  1203. /package/dist/{chunk-YAINUFSC.js.map → chunk-6IL7JFX5.js.map} +0 -0
  1204. /package/dist/{chunk-Q5XUFN2W.js.map → chunk-6LNCKT6S.js.map} +0 -0
  1205. /package/dist/{chunk-B64KJW5C.js.map → chunk-6LUDG5AB.js.map} +0 -0
  1206. /package/dist/{chunk-ZCGM7ZWM.js.map → chunk-6UQV5DOD.js.map} +0 -0
  1207. /package/dist/{chunk-L7I47VGM.js.map → chunk-6WA7QSCN.js.map} +0 -0
  1208. /package/dist/{chunk-BEZEZHQ6.js.map → chunk-7CHPHER2.js.map} +0 -0
  1209. /package/dist/{chunk-RIVQ4PQQ.js.map → chunk-7J7ASYIM.js.map} +0 -0
  1210. /package/dist/{chunk-ZBXV2KOQ.js.map → chunk-7MMTIJO3.js.map} +0 -0
  1211. /package/dist/{chunk-3QPG2D27.js.map → chunk-AA3D7GZF.js.map} +0 -0
  1212. /package/dist/{chunk-Q736UFSD.js.map → chunk-AGL7EWP2.js.map} +0 -0
  1213. /package/dist/{chunk-KGJ6EIX3.js.map → chunk-AHVD6IEI.js.map} +0 -0
  1214. /package/dist/{chunk-3GXHML4V.js.map → chunk-ASJMLTMX.js.map} +0 -0
  1215. /package/dist/{chunk-XA7JN7YE.js.map → chunk-AWENMEFC.js.map} +0 -0
  1216. /package/dist/{chunk-EJ6EED6I.js.map → chunk-BHZLKLK7.js.map} +0 -0
  1217. /package/dist/{chunk-DHF4FXWS.js.map → chunk-BVER7I36.js.map} +0 -0
  1218. /package/dist/{chunk-MTW2NDDD.js.map → chunk-C3RZNVLM.js.map} +0 -0
  1219. /package/dist/{chunk-6AMN346B.js.map → chunk-CA5QBLIZ.js.map} +0 -0
  1220. /package/dist/{chunk-C52Q3L4C.js.map → chunk-CONTVNSN.js.map} +0 -0
  1221. /package/dist/{chunk-2CC4CPDT.js.map → chunk-EE6NZ6NG.js.map} +0 -0
  1222. /package/dist/{chunk-M4KFO256.js.map → chunk-EG6HMBCF.js.map} +0 -0
  1223. /package/dist/{chunk-MKOI6QYM.js.map → chunk-FHLAJYZE.js.map} +0 -0
  1224. /package/dist/{chunk-XA76OGSL.js.map → chunk-FSNQFZ2Z.js.map} +0 -0
  1225. /package/dist/{chunk-DW3H2XQA.js.map → chunk-G67OBCXI.js.map} +0 -0
  1226. /package/dist/{chunk-WTOBG3YL.js.map → chunk-GFYGVIT3.js.map} +0 -0
  1227. /package/dist/{chunk-3KUNRKNV.js.map → chunk-GRNHQWSV.js.map} +0 -0
  1228. /package/dist/{chunk-JAME5NBT.js.map → chunk-GWQSZWHT.js.map} +0 -0
  1229. /package/dist/{chunk-LAMSUL26.js.map → chunk-HBXR26LB.js.map} +0 -0
  1230. /package/dist/{chunk-EONUZOJV.js.map → chunk-HUO5MZ7S.js.map} +0 -0
  1231. /package/dist/{chunk-4INBMXUS.js.map → chunk-HVL22WUU.js.map} +0 -0
  1232. /package/dist/{chunk-AZIXX73C.js.map → chunk-IA5GLVRV.js.map} +0 -0
  1233. /package/dist/{chunk-LLTHDEM2.js.map → chunk-IEPCI2EB.js.map} +0 -0
  1234. /package/dist/{chunk-HQDNDKNR.js.map → chunk-IKSBLQTL.js.map} +0 -0
  1235. /package/dist/{chunk-X5YHMGAT.js.map → chunk-IRLMIKI7.js.map} +0 -0
  1236. /package/dist/{chunk-WYMX3F47.js.map → chunk-IW4MX7OX.js.map} +0 -0
  1237. /package/dist/{chunk-7NBQQOCU.js.map → chunk-J4WOF6WK.js.map} +0 -0
  1238. /package/dist/{chunk-75OGTGC4.js.map → chunk-J63TN3GR.js.map} +0 -0
  1239. /package/dist/{chunk-QRRAMUKV.js.map → chunk-JESSFI7R.js.map} +0 -0
  1240. /package/dist/{chunk-RQHXWPET.js.map → chunk-K4QPBXV7.js.map} +0 -0
  1241. /package/dist/{chunk-YAMKCMAS.js.map → chunk-K5VDDKKF.js.map} +0 -0
  1242. /package/dist/{chunk-WTPID22G.js.map → chunk-KM5K47TW.js.map} +0 -0
  1243. /package/dist/{chunk-EM5R3BYC.js.map → chunk-LGJIJVVH.js.map} +0 -0
  1244. /package/dist/{chunk-XHAGX4J4.js.map → chunk-LHSSIUU4.js.map} +0 -0
  1245. /package/dist/{chunk-EMR5KGNY.js.map → chunk-LQMPA4DY.js.map} +0 -0
  1246. /package/dist/{chunk-Z7ICQKC2.js.map → chunk-M3IXPK6U.js.map} +0 -0
  1247. /package/dist/{chunk-KG5VNPKU.js.map → chunk-MJU5VKX2.js.map} +0 -0
  1248. /package/dist/{chunk-RLLPY62L.js.map → chunk-MRGU3NPN.js.map} +0 -0
  1249. /package/dist/{chunk-ZMNRSTNV.js.map → chunk-MSLFPL77.js.map} +0 -0
  1250. /package/dist/{chunk-L4QEMWNJ.js.map → chunk-NKCWJPMN.js.map} +0 -0
  1251. /package/dist/{chunk-X7USE7IA.js.map → chunk-NT7NCSEB.js.map} +0 -0
  1252. /package/dist/{chunk-MFGUR5OD.js.map → chunk-OADMSHME.js.map} +0 -0
  1253. /package/dist/{chunk-6FQ7CJEX.js.map → chunk-ONGZKI5J.js.map} +0 -0
  1254. /package/dist/{chunk-RRKUXGAU.js.map → chunk-OOZNTJP6.js.map} +0 -0
  1255. /package/dist/{chunk-MIHY534L.js.map → chunk-OP3NHIFH.js.map} +0 -0
  1256. /package/dist/{chunk-5QNW5PCM.js.map → chunk-OU4KWL6B.js.map} +0 -0
  1257. /package/dist/{chunk-M5PZ6QQB.js.map → chunk-PLIGHRIQ.js.map} +0 -0
  1258. /package/dist/{chunk-4AO3LSYM.js.map → chunk-PLROJ3SX.js.map} +0 -0
  1259. /package/dist/{chunk-PR5OPERY.js.map → chunk-PSM3RI4B.js.map} +0 -0
  1260. /package/dist/{chunk-Q3G4ZI2U.js.map → chunk-Q4O7ICAK.js.map} +0 -0
  1261. /package/dist/{chunk-HFIHXIYY.js.map → chunk-Q6XM6ZDB.js.map} +0 -0
  1262. /package/dist/{chunk-NWLK5RPA.js.map → chunk-QHRUCSRI.js.map} +0 -0
  1263. /package/dist/{chunk-IYDESWW4.js.map → chunk-QUDPMIW7.js.map} +0 -0
  1264. /package/dist/{chunk-I3QLWGKS.js.map → chunk-R2JGUOT6.js.map} +0 -0
  1265. /package/dist/{chunk-RGLTITIH.js.map → chunk-R5I4IHJ5.js.map} +0 -0
  1266. /package/dist/{chunk-MSIOGH67.js.map → chunk-RJXO66C4.js.map} +0 -0
  1267. /package/dist/{chunk-CF5I4Q5M.js.map → chunk-RYNN6UUF.js.map} +0 -0
  1268. /package/dist/{chunk-SIRRBWQ2.js.map → chunk-S4V2GOKV.js.map} +0 -0
  1269. /package/dist/{chunk-6EOWBGGW.js.map → chunk-S7D4GTYY.js.map} +0 -0
  1270. /package/dist/{chunk-4HFM5RCP.js.map → chunk-T4RV7XOC.js.map} +0 -0
  1271. /package/dist/{chunk-HPF3USL2.js.map → chunk-TDUAGNSQ.js.map} +0 -0
  1272. /package/dist/{chunk-JLAFNORO.js.map → chunk-TZRWET3S.js.map} +0 -0
  1273. /package/dist/{chunk-XY7W6MQN.js.map → chunk-U5V4CIIG.js.map} +0 -0
  1274. /package/dist/{chunk-DPOUS5DN.js.map → chunk-U625CQ3Y.js.map} +0 -0
  1275. /package/dist/{chunk-UVUY6FLV.js.map → chunk-UDEVIXKX.js.map} +0 -0
  1276. /package/dist/{chunk-LJEJCIHR.js.map → chunk-UUDWZIDC.js.map} +0 -0
  1277. /package/dist/{chunk-6D7WTUF3.js.map → chunk-VAQBBNLD.js.map} +0 -0
  1278. /package/dist/{chunk-BIBXZJZI.js.map → chunk-VCDFBFPT.js.map} +0 -0
  1279. /package/dist/{chunk-MPTNN35I.js.map → chunk-VF3W7CI7.js.map} +0 -0
  1280. /package/dist/{chunk-BMK4F4CU.js.map → chunk-VHOOAQY4.js.map} +0 -0
  1281. /package/dist/{chunk-6MJKVNLL.js.map → chunk-VK2VC6A2.js.map} +0 -0
  1282. /package/dist/{chunk-3WN5GWX4.js.map → chunk-WWPRSJOS.js.map} +0 -0
  1283. /package/dist/{chunk-O5VSYBUA.js.map → chunk-XKYFNMTB.js.map} +0 -0
  1284. /package/dist/{chunk-KJHG2DWS.js.map → chunk-XL42ZEVH.js.map} +0 -0
  1285. /package/dist/{chunk-TCLJRWST.js.map → chunk-XPUQFPIU.js.map} +0 -0
  1286. /package/dist/{chunk-CBVUO7SK.js.map → chunk-XQEHLDGP.js.map} +0 -0
  1287. /package/dist/{chunk-S5S54J2K.js.map → chunk-XQWC223L.js.map} +0 -0
  1288. /package/dist/{chunk-JAK5VDSG.js.map → chunk-XYDHBLZ2.js.map} +0 -0
  1289. /package/dist/{chunk-V7EN5LFS.js.map → chunk-XZO6ONVI.js.map} +0 -0
  1290. /package/dist/{chunk-H25GY4U4.js.map → chunk-YFFQ3HY4.js.map} +0 -0
  1291. /package/dist/{chunk-URGXEDFV.js.map → chunk-YGUGL4ZL.js.map} +0 -0
  1292. /package/dist/{chunk-TLQY4QBW.js.map → chunk-YT3S2XFG.js.map} +0 -0
  1293. /package/dist/{chunk-QGAUDVMR.js.map → chunk-ZPCZ4XDB.js.map} +0 -0
  1294. /package/dist/{cite-WCAOCOO5.js.map → cite-2ZJG3FBV.js.map} +0 -0
  1295. /package/dist/{claim-L4WLCVUL.js.map → claim-IGU5W4CT.js.map} +0 -0
  1296. /package/dist/{client-VCKP6WBR.js.map → client-MSRCSDB7.js.map} +0 -0
  1297. /package/dist/{code-VXOTFGD2.js.map → code-T7Z5JDQ2.js.map} +0 -0
  1298. /package/dist/{companies-HW46BRQG.js.map → companies-HCSBVXCE.js.map} +0 -0
  1299. /package/dist/{company-KCIDE7SL.js.map → company-SSMY4G2T.js.map} +0 -0
  1300. /package/dist/{complete-JXM25FVW.js.map → complete-FQNRXUI5.js.map} +0 -0
  1301. /package/dist/{config-UR45YCIN.js.map → config-XRPKA5QR.js.map} +0 -0
  1302. /package/dist/{connect-7TX7AAM5.js.map → connect-VXEE3QBU.js.map} +0 -0
  1303. /package/dist/{content-EQQIKG5H.js.map → content-2JFP747N.js.map} +0 -0
  1304. /package/dist/{conversation-YIDUB6GL.js.map → conversation-KKJKZIX5.js.map} +0 -0
  1305. /package/dist/{conversion-report-33SG7SHU.js.map → conversion-report-G65UHQRO.js.map} +0 -0
  1306. /package/dist/{conversion-writes-XGGTBML5.js.map → conversion-writes-333V4OVR.js.map} +0 -0
  1307. /package/dist/{conversions-F4OZYUCT.js.map → conversions-7UHCNIAO.js.map} +0 -0
  1308. /package/dist/{conversions-PPP4QK7U.js.map → conversions-L6775Q22.js.map} +0 -0
  1309. /package/dist/{countries-GRCU4IGM.js.map → countries-XJVDM635.js.map} +0 -0
  1310. /package/dist/{create-6EAKNERA.js.map → create-AXWJECPP.js.map} +0 -0
  1311. /package/dist/{create-FDNMIVFX.js.map → create-B24XHUGZ.js.map} +0 -0
  1312. /package/dist/{create-772LZHZR.js.map → create-HJKTD5FN.js.map} +0 -0
  1313. /package/dist/{create-X2QM7GA7.js.map → create-V4NGP5KB.js.map} +0 -0
  1314. /package/dist/{creatives-4EPM3RHG.js.map → creatives-OKFLX67Y.js.map} +0 -0
  1315. /package/dist/{creatives-SNYN4KIM.js.map → creatives-WX6GQ37F.js.map} +0 -0
  1316. /package/dist/{credentials-KZZVBO42.js.map → credentials-4JFUH6FN.js.map} +0 -0
  1317. /package/dist/{crm-M6NXDU5B.js.map → crm-6MLYUEK7.js.map} +0 -0
  1318. /package/dist/{crm-4LZZVT4N.js.map → crm-PUQBWZKE.js.map} +0 -0
  1319. /package/dist/{crop-NE7YX4SS.js.map → crop-V5MSIY5F.js.map} +0 -0
  1320. /package/dist/{currency-HK2ZW2VW.js.map → currency-SCSJ5FW2.js.map} +0 -0
  1321. /package/dist/{custom-conversions-GQTU5E6X.js.map → custom-conversions-GN4JDS5F.js.map} +0 -0
  1322. /package/dist/{customers-V5NT4W7X.js.map → customers-WXD2LTUC.js.map} +0 -0
  1323. /package/dist/{decide-6Q5X3V3F.js.map → decide-PW2NRMRK.js.map} +0 -0
  1324. /package/dist/{delete-YOEI63OT.js.map → delete-EAJN6ZHT.js.map} +0 -0
  1325. /package/dist/{delete-LFZIPQEO.js.map → delete-GDIFIYA2.js.map} +0 -0
  1326. /package/dist/{delete-GQIKNO53.js.map → delete-JQG3ZWQX.js.map} +0 -0
  1327. /package/dist/{delete-SP66F7ZV.js.map → delete-L7CGJ23X.js.map} +0 -0
  1328. /package/dist/{delete-QHDDR66K.js.map → delete-OQREQEGN.js.map} +0 -0
  1329. /package/dist/{delete-EKKOEB3N.js.map → delete-ZR3DVLWU.js.map} +0 -0
  1330. /package/dist/{demographics-CEQ74O74.js.map → demographics-LMRGNO7J.js.map} +0 -0
  1331. /package/dist/{describe-MAGTSOW4.js.map → describe-OHWLLBDE.js.map} +0 -0
  1332. /package/dist/{describe-DJPIUEFE.js.map → describe-YELOXWHY.js.map} +0 -0
  1333. /package/dist/{dimensions-IC2H7V3H.js.map → dimensions-CLLCVVRY.js.map} +0 -0
  1334. /package/dist/{discard-5GDF3TP3.js.map → discard-K2KIIFJQ.js.map} +0 -0
  1335. /package/dist/{discover-PSL2NBJL.js.map → discover-SQJLRS4G.js.map} +0 -0
  1336. /package/dist/{discover-Q5PAOIQQ.js.map → discover-UJMDGDQO.js.map} +0 -0
  1337. /package/dist/{domain-PKOUPHHF.js.map → domain-CJX5JSLS.js.map} +0 -0
  1338. /package/dist/{download-2WNTN7JQ.js.map → download-HFDBP6BO.js.map} +0 -0
  1339. /package/dist/{download-EHDJXBAC.js.map → download-SZ5P3GLV.js.map} +0 -0
  1340. /package/dist/{draft-L2NXCIYT.js.map → draft-7QDE2Z3N.js.map} +0 -0
  1341. /package/dist/{draft-27NMTARB.js.map → draft-ILXHFWTT.js.map} +0 -0
  1342. /package/dist/{draft-RZCTAOI2.js.map → draft-NUFU5YME.js.map} +0 -0
  1343. /package/dist/{draft-UEVBUNKV.js.map → draft-QSTD3DH2.js.map} +0 -0
  1344. /package/dist/{draft-MWYKIZC4.js.map → draft-TV5IH5U4.js.map} +0 -0
  1345. /package/dist/{draft-JESKGZ6O.js.map → draft-WNMHUFAH.js.map} +0 -0
  1346. /package/dist/{env-NZXNMWSD.js.map → env-3256G2OE.js.map} +0 -0
  1347. /package/dist/{experiment-XAYSEYTU.js.map → experiment-5L5USMAL.js.map} +0 -0
  1348. /package/dist/{export-W54UZ62P.js.map → export-YSOM4E3B.js.map} +0 -0
  1349. /package/dist/{extract-6HJXSOZW.js.map → extract-7FYXXEQZ.js.map} +0 -0
  1350. /package/dist/{facets-TBOXGYJT.js.map → facets-2FRELYRC.js.map} +0 -0
  1351. /package/dist/{favorites-Y6CT6NSQ.js.map → favorites-LTG2F6W2.js.map} +0 -0
  1352. /package/dist/{feed-35BRQPTH.js.map → feed-RSBWEI75.js.map} +0 -0
  1353. /package/dist/{feedback-MSMFYAEY.js.map → feedback-PQUM7UBT.js.map} +0 -0
  1354. /package/dist/{fetch-I6P72CDL.js.map → fetch-3PWYTX4R.js.map} +0 -0
  1355. /package/dist/{fetch-LGX7B3IC.js.map → fetch-FLQYW27W.js.map} +0 -0
  1356. /package/dist/{find-SVGRA7IA.js.map → find-SHHDWCPM.js.map} +0 -0
  1357. /package/dist/{fit-RVWPRBNO.js.map → fit-4XCDLF7C.js.map} +0 -0
  1358. /package/dist/{flows-LA6EYMLS.js.map → flows-4ALWJVNF.js.map} +0 -0
  1359. /package/dist/{follow-24QSDNAG.js.map → follow-N4TKU3UM.js.map} +0 -0
  1360. /package/dist/{follow-competitors-AG4E4XFA.js.map → follow-competitors-AHQ57BWS.js.map} +0 -0
  1361. /package/dist/{following-YGM6TBK3.js.map → following-CEYH33DW.js.map} +0 -0
  1362. /package/dist/{fonts-WRC34VSV.js.map → fonts-CYJ5EFR4.js.map} +0 -0
  1363. /package/dist/{forecast-6VHRGBJG.js.map → forecast-SG2VUBZD.js.map} +0 -0
  1364. /package/dist/{funding-WZNGXRLJ.js.map → funding-X7M5WLDX.js.map} +0 -0
  1365. /package/dist/{funnel-U3GQIGND.js.map → funnel-F7DS7PUN.js.map} +0 -0
  1366. /package/dist/{ga4-W3U5YTRT.js.map → ga4-QPBAKGSH.js.map} +0 -0
  1367. /package/dist/{generate-Y4NJEYIH.js.map → generate-LVBI3VDD.js.map} +0 -0
  1368. /package/dist/{get-YWDZYEAC.js.map → get-DMV7KG2F.js.map} +0 -0
  1369. /package/dist/{get-GEUSRD5Y.js.map → get-EA7AX4NW.js.map} +0 -0
  1370. /package/dist/{get-TS2ZJDCQ.js.map → get-EOSJWMWT.js.map} +0 -0
  1371. /package/dist/{get-JIZPYK3Z.js.map → get-HVQHHDW6.js.map} +0 -0
  1372. /package/dist/{get-3MTAVNTP.js.map → get-KQLCVQCK.js.map} +0 -0
  1373. /package/dist/{get-PF3HGECD.js.map → get-NAOMB6Q2.js.map} +0 -0
  1374. /package/dist/{get-5SPNAIUQ.js.map → get-XYJBQFIT.js.map} +0 -0
  1375. /package/dist/{get-AHI247JG.js.map → get-XZ7XPXZE.js.map} +0 -0
  1376. /package/dist/{gif-NP6EDGEE.js.map → gif-XJ26IWAP.js.map} +0 -0
  1377. /package/dist/{google-ZVAIFXQZ.js.map → google-QOKWSPOA.js.map} +0 -0
  1378. /package/dist/{google-ads-6Z7P3SCD.js.map → google-ads-B4FBPQ7O.js.map} +0 -0
  1379. /package/dist/{group-3DT4UYSR.js.map → group-7EYM3PNJ.js.map} +0 -0
  1380. /package/dist/{group-OEKKCFXT.js.map → group-GDTEICRY.js.map} +0 -0
  1381. /package/dist/{gsc-4FEFPFPB.js.map → gsc-KVIAZMF4.js.map} +0 -0
  1382. /package/dist/{history-VKRYKQ4C.js.map → history-22YGILIT.js.map} +0 -0
  1383. /package/dist/{history-4QUV45ZJ.js.map → history-E3JGYADF.js.map} +0 -0
  1384. /package/dist/{history-PD7FCTDD.js.map → history-HKCSYH5L.js.map} +0 -0
  1385. /package/dist/{hubspot-WEFAFKVJ.js.map → hubspot-LEW2RP5D.js.map} +0 -0
  1386. /package/dist/{icon-43UJTGGE.js.map → icon-JLVEYF34.js.map} +0 -0
  1387. /package/dist/{ideas-SMSEXKIA.js.map → ideas-JAIU4GC4.js.map} +0 -0
  1388. /package/dist/{images-KAT4BPYV.js.map → images-ZG6RRAEP.js.map} +0 -0
  1389. /package/dist/{improve-IMXQN6OD.js.map → improve-XSHWCMZS.js.map} +0 -0
  1390. /package/dist/{ingest-IHKTSJ4H.js.map → ingest-GTXBGUNQ.js.map} +0 -0
  1391. /package/dist/{ingest-TOHQ6MZA.js.map → ingest-SX7K6GNE.js.map} +0 -0
  1392. /package/dist/{insights-3IPSEBYW.js.map → insights-IVUUWSQL.js.map} +0 -0
  1393. /package/dist/{insights-BR3456EI.js.map → insights-PJPQB46E.js.map} +0 -0
  1394. /package/dist/{inspect-5MZBPDYS.js.map → inspect-55BXSPJG.js.map} +0 -0
  1395. /package/dist/{inspiration-XZI5KCQW.js.map → inspiration-NBOKHPZ5.js.map} +0 -0
  1396. /package/dist/{intent-ZM4K623V.js.map → intent-KSVTHFFE.js.map} +0 -0
  1397. /package/dist/{job-GOX3KIKG.js.map → job-4VXDCYSG.js.map} +0 -0
  1398. /package/dist/{job-create-F2PQSN3C.js.map → job-create-NZEZDOZT.js.map} +0 -0
  1399. /package/dist/{job-status-3FMA5D7T.js.map → job-status-XI3ENS7D.js.map} +0 -0
  1400. /package/dist/{keep-23ZYMWPG.js.map → keep-UYNOC3JZ.js.map} +0 -0
  1401. /package/dist/{keyword-gap-FAAF2I6V.js.map → keyword-gap-7UVDSID5.js.map} +0 -0
  1402. /package/dist/{keyword-metrics-EXNJRJBY.js.map → keyword-metrics-QFRXZRAQ.js.map} +0 -0
  1403. /package/dist/{keywords-for-site-5LW77QWF.js.map → keywords-for-site-Q4BCJ4PQ.js.map} +0 -0
  1404. /package/dist/{knowledge-7M7DSRF3.js.map → knowledge-LVE3J3AK.js.map} +0 -0
  1405. /package/dist/{landing-ZH4SD3DW.js.map → landing-AJYM5GBY.js.map} +0 -0
  1406. /package/dist/{landings-VNQ4VA2U.js.map → landings-SIN3MTUZ.js.map} +0 -0
  1407. /package/dist/{languages-ZGDTERIQ.js.map → languages-AIASAINW.js.map} +0 -0
  1408. /package/dist/{languages-2X22HXM3.js.map → languages-RDR6EBNJ.js.map} +0 -0
  1409. /package/dist/{launches-L4EUROCJ.js.map → launches-4TVHXAZT.js.map} +0 -0
  1410. /package/dist/{layerize-6QHQMA7Q.js.map → layerize-OLVGZRND.js.map} +0 -0
  1411. /package/dist/{lead-routes-5TPFJEVH.js.map → lead-routes-ZOQDPCR3.js.map} +0 -0
  1412. /package/dist/{leads-736RILZN.js.map → leads-YSDLFBHN.js.map} +0 -0
  1413. /package/dist/{learn-BESXWXEN.js.map → learn-FDQZNIP3.js.map} +0 -0
  1414. /package/dist/{library-MNJC24E4.js.map → library-7CLWRDM3.js.map} +0 -0
  1415. /package/dist/{lighthouse-DJMAXFTD.js.map → lighthouse-3ACQ3MVG.js.map} +0 -0
  1416. /package/dist/{line-item-writes-FA72DHNQ.js.map → line-item-writes-JARN73DV.js.map} +0 -0
  1417. /package/dist/{line-items-XVYE3IYT.js.map → line-items-B5GLDAJ2.js.map} +0 -0
  1418. /package/dist/{link-6FPKFVC3.js.map → link-YAZF34BZ.js.map} +0 -0
  1419. /package/dist/{linkedin-person-TZJ6VEXE.js.map → linkedin-person-XDH7Q3PB.js.map} +0 -0
  1420. /package/dist/{list-537S75BZ.js.map → list-6NYRZXKQ.js.map} +0 -0
  1421. /package/dist/{list-WIXQXNKB.js.map → list-6WISGNQ2.js.map} +0 -0
  1422. /package/dist/{list-Q52FPW3H.js.map → list-6YBIWX44.js.map} +0 -0
  1423. /package/dist/{list-4R5EMKUQ.js.map → list-72JQGWNO.js.map} +0 -0
  1424. /package/dist/{list-ORO4WDF4.js.map → list-FX7OG3OJ.js.map} +0 -0
  1425. /package/dist/{list-2277GCPH.js.map → list-ITPBLMV3.js.map} +0 -0
  1426. /package/dist/{list-XK33NCSC.js.map → list-J43GOBOX.js.map} +0 -0
  1427. /package/dist/{list-V4PSDBLX.js.map → list-K4Z3BOWI.js.map} +0 -0
  1428. /package/dist/{list-MN2FPF3T.js.map → list-ONSYTCX2.js.map} +0 -0
  1429. /package/dist/{locations-A65MFB7Q.js.map → locations-UNSREUBX.js.map} +0 -0
  1430. /package/dist/{locations-WN6B3IJK.js.map → locations-XAC3GME3.js.map} +0 -0
  1431. /package/dist/{log-ABBZLPRU.js.map → log-PPNNFETI.js.map} +0 -0
  1432. /package/dist/{logo-4LSFZ3ZO.js.map → logo-UNVIMA4B.js.map} +0 -0
  1433. /package/dist/{lookup-WIM5WR25.js.map → lookup-L5QG3BWH.js.map} +0 -0
  1434. /package/dist/{map-52P35OKE.js.map → map-QILMIKS7.js.map} +0 -0
  1435. /package/dist/{mcp-PZ3VBIF4.js.map → mcp-GOKFM4PF.js.map} +0 -0
  1436. /package/dist/{media-KKI3KWLR.js.map → media-BN6B75NF.js.map} +0 -0
  1437. /package/dist/{media-34I7UB7Z.js.map → media-YDDWV32Y.js.map} +0 -0
  1438. /package/dist/{media-sources-TT374PLN.js.map → media-sources-HABLVJE3.js.map} +0 -0
  1439. /package/dist/{members-CF6VG6ZW.js.map → members-B4UI6ISY.js.map} +0 -0
  1440. /package/dist/{meme-6NFYFQ7T.js.map → meme-2MERLAVW.js.map} +0 -0
  1441. /package/dist/{meta-2UK7KIE4.js.map → meta-7FJQD44L.js.map} +0 -0
  1442. /package/dist/{metrics-3U3ZO2RF.js.map → metrics-SBKBEZJR.js.map} +0 -0
  1443. /package/dist/{models-VOSJJFO2.js.map → models-ZBLBNNEH.js.map} +0 -0
  1444. /package/dist/{normalize-G75RDSE4.js.map → normalize-5WVEQJXD.js.map} +0 -0
  1445. /package/dist/{normalize-4LZCLMTQ.js.map → normalize-YPQBHWYS.js.map} +0 -0
  1446. /package/dist/{options-6IRL7CL6.js.map → options-BV3TVUCK.js.map} +0 -0
  1447. /package/dist/{organization-WMLLJE66.js.map → organization-4OTGNRHP.js.map} +0 -0
  1448. /package/dist/{output-ELEO2Z6R.js.map → output-FX4KJAO5.js.map} +0 -0
  1449. /package/dist/{page-4X6IBUWG.js.map → page-5KWQ7PM3.js.map} +0 -0
  1450. /package/dist/{pages-7HW5YOZV.js.map → pages-HKTAGXH3.js.map} +0 -0
  1451. /package/dist/{performance-A7CYFBW2.js.map → performance-4MWQVTTA.js.map} +0 -0
  1452. /package/dist/{performance-HYSTXLTS.js.map → performance-TKE7NQF6.js.map} +0 -0
  1453. /package/dist/{pinterest-KA6VFDM4.js.map → pinterest-UDX53CWY.js.map} +0 -0
  1454. /package/dist/{pixels-D5HF24FI.js.map → pixels-BSNCVT77.js.map} +0 -0
  1455. /package/dist/{pixels-U6UA662G.js.map → pixels-TR2PAYWV.js.map} +0 -0
  1456. /package/dist/{plan-XCA6R3HZ.js.map → plan-V57AATQ5.js.map} +0 -0
  1457. /package/dist/{posts-ALGM6ONV.js.map → posts-JHMXNHDV.js.map} +0 -0
  1458. /package/dist/{preview-55TRUF4Q.js.map → preview-VY7UH2SK.js.map} +0 -0
  1459. /package/dist/{preview-76ZP2QA3.js.map → preview-XUG4K4KV.js.map} +0 -0
  1460. /package/dist/{profile-NHUPUCBR.js.map → profile-PV3R3BEG.js.map} +0 -0
  1461. /package/dist/{promoted-tweet-writes-I5G4IDL5.js.map → promoted-tweet-writes-O3S5OKUZ.js.map} +0 -0
  1462. /package/dist/{promoted-tweets-X5XNO7IT.js.map → promoted-tweets-4ZKSEC4I.js.map} +0 -0
  1463. /package/dist/{properties-2ZXA5BPJ.js.map → properties-U2XUD2M6.js.map} +0 -0
  1464. /package/dist/{publish-S2Z4EF4H.js.map → publish-4RAYD7VI.js.map} +0 -0
  1465. /package/dist/{query-SAQADBM2.js.map → query-4C6UQN42.js.map} +0 -0
  1466. /package/dist/{query-63CTX2PH.js.map → query-7FWE7GLV.js.map} +0 -0
  1467. /package/dist/{query-DMWY3TDD.js.map → query-7Y2Y6YFI.js.map} +0 -0
  1468. /package/dist/{questionnaire-WHE42RD4.js.map → questionnaire-3IPJXJT7.js.map} +0 -0
  1469. /package/dist/{read-NESEKULG.js.map → read-WEQLEI7R.js.map} +0 -0
  1470. /package/dist/{reddit-S2L5WDY7.js.map → reddit-2FWCB7XY.js.map} +0 -0
  1471. /package/dist/{refresh-K2YTJSH3.js.map → refresh-SGDB4QOD.js.map} +0 -0
  1472. /package/dist/{refresh-ILDEPU5A.js.map → refresh-WZBVPKWE.js.map} +0 -0
  1473. /package/dist/{release-FX76IIVN.js.map → release-YL3ZII3Z.js.map} +0 -0
  1474. /package/dist/{relevant-pages-KTSODNNW.js.map → relevant-pages-PF3LLUED.js.map} +0 -0
  1475. /package/dist/{remove-NHE4UT7G.js.map → remove-52MSQXSW.js.map} +0 -0
  1476. /package/dist/{remove-LOVWPLDO.js.map → remove-EIV7LJUA.js.map} +0 -0
  1477. /package/dist/{reopen-DXV2Y6Z3.js.map → reopen-CW27MUJH.js.map} +0 -0
  1478. /package/dist/{research-7PGDAKC7.js.map → research-234BOCKM.js.map} +0 -0
  1479. /package/dist/{research-HY5PSUCC.js.map → research-RABLL4HR.js.map} +0 -0
  1480. /package/dist/{reset-Y5VZJRDQ.js.map → reset-5KJDDVJL.js.map} +0 -0
  1481. /package/dist/{reset-MEHUQJA4.js.map → reset-REUL47CB.js.map} +0 -0
  1482. /package/dist/{resolve-FAVABEJW.js.map → resolve-WRDEHLYL.js.map} +0 -0
  1483. /package/dist/{retry-OMJ3C3AX.js.map → retry-2A5HV4SN.js.map} +0 -0
  1484. /package/dist/{retry-5IY4MNDW.js.map → retry-FNT2XVH3.js.map} +0 -0
  1485. /package/dist/{retry-failed-R5HPQ3KQ.js.map → retry-failed-ND7UXYTJ.js.map} +0 -0
  1486. /package/dist/{rules-FYVD2QBB.js.map → rules-2CUG2YG7.js.map} +0 -0
  1487. /package/dist/{run-LJVBH3JS.js.map → run-RKLNKV2U.js.map} +0 -0
  1488. /package/dist/{run-XJBWDWN6.js.map → run-YKGN3GQR.js.map} +0 -0
  1489. /package/dist/{schedule-D7EDEM45.js.map → schedule-774JCRVM.js.map} +0 -0
  1490. /package/dist/{schedule-OX5XHXLH.js.map → schedule-PKKSZ5RX.js.map} +0 -0
  1491. /package/dist/{scheduled-agents-A5ZFQB5X.js.map → scheduled-agents-ZI3EWKAT.js.map} +0 -0
  1492. /package/dist/{schema-NTGHAPR2.js.map → schema-BXNL4LKR.js.map} +0 -0
  1493. /package/dist/{schema-Z43AJOJ4.js.map → schema-GFMVUZL2.js.map} +0 -0
  1494. /package/dist/{scrape-VL2RWSTW.js.map → scrape-KKLE4WAU.js.map} +0 -0
  1495. /package/dist/{screenshot-Y6EEXS3Q.js.map → screenshot-K6XOER6Z.js.map} +0 -0
  1496. /package/dist/{search-TXBYKNQC.js.map → search-43ULIJL3.js.map} +0 -0
  1497. /package/dist/{search-CXC7N5XJ.js.map → search-AXUNJUWY.js.map} +0 -0
  1498. /package/dist/{search-XHSTUBDY.js.map → search-DLLJEYMB.js.map} +0 -0
  1499. /package/dist/{search-L3GTZYRW.js.map → search-LWWTXBB2.js.map} +0 -0
  1500. /package/dist/{search-JEXYEAPQ.js.map → search-VU6GI3U3.js.map} +0 -0
  1501. /package/dist/{search-WCXQBMMM.js.map → search-XO365KES.js.map} +0 -0
  1502. /package/dist/{search-copy-FIPG7OCC.js.map → search-copy-BHNLLCUV.js.map} +0 -0
  1503. /package/dist/{seeds-ADJKURNG.js.map → seeds-6ROVZBFB.js.map} +0 -0
  1504. /package/dist/{sends-RS4LWRAC.js.map → sends-P6OPCYH5.js.map} +0 -0
  1505. /package/dist/{sequences-2RPKDKGQ.js.map → sequences-DP4BHM3E.js.map} +0 -0
  1506. /package/dist/{setup-links-4HCSF55G.js.map → setup-links-T5TJZA3E.js.map} +0 -0
  1507. /package/dist/{shared-4GGUIOF2.js.map → shared-24IPELBM.js.map} +0 -0
  1508. /package/dist/{shopify-GDR5WGHH.js.map → shopify-OQEKI7HC.js.map} +0 -0
  1509. /package/dist/{site-B7LT6KAO.js.map → site-QRLBZPEV.js.map} +0 -0
  1510. /package/dist/{sitemaps-Z6IELTQV.js.map → sitemaps-SWADO4SI.js.map} +0 -0
  1511. /package/dist/{sites-KLAKI2EY.js.map → sites-H3FYJQFO.js.map} +0 -0
  1512. /package/dist/{skills-OJP36EVR.js.map → skills-OYO6Y3DQ.js.map} +0 -0
  1513. /package/dist/{sources-OSUXCLID.js.map → sources-U2WRH6D7.js.map} +0 -0
  1514. /package/dist/{sources-6DPUEROC.js.map → sources-Y2BKZVXA.js.map} +0 -0
  1515. /package/dist/{stats-MIMFX4R7.js.map → stats-TTJHXR3E.js.map} +0 -0
  1516. /package/dist/{status-KIC3P5JV.js.map → status-4BSXND3I.js.map} +0 -0
  1517. /package/dist/{sticker-IREEEN7I.js.map → sticker-CRIAIO75.js.map} +0 -0
  1518. /package/dist/{stock-VWFUFRYV.js.map → stock-TOFKLWSR.js.map} +0 -0
  1519. /package/dist/{studies-YGYAH3JI.js.map → studies-VFNWS6ND.js.map} +0 -0
  1520. /package/dist/{studio-XLC37YGX.js.map → studio-WD364TWB.js.map} +0 -0
  1521. /package/dist/{suggest-5RTISDLI.js.map → suggest-GX4IROQN.js.map} +0 -0
  1522. /package/dist/{sync-OHIXI4I6.js.map → sync-BU7HU3FS.js.map} +0 -0
  1523. /package/dist/{sync-QBW4XH2H.js.map → sync-GQL5JX4U.js.map} +0 -0
  1524. /package/dist/{sync-VCAFAYW4.js.map → sync-VNBBOVBU.js.map} +0 -0
  1525. /package/dist/{sync-definition-4KMJK46H.js.map → sync-definition-EOARPSBS.js.map} +0 -0
  1526. /package/dist/{tag-DSCUKNC3.js.map → tag-SQ5ROLTP.js.map} +0 -0
  1527. /package/dist/{tag-manager-IINALUEJ.js.map → tag-manager-7S7PVYIJ.js.map} +0 -0
  1528. /package/dist/{tags-7RKKCQ4X.js.map → tags-2226Q3VK.js.map} +0 -0
  1529. /package/dist/{tags-4F5UBPYG.js.map → tags-7QIBFIBX.js.map} +0 -0
  1530. /package/dist/{tags-QZJIP4LJ.js.map → tags-BNWKAV3H.js.map} +0 -0
  1531. /package/dist/{tags-CB4MWI3A.js.map → tags-HG5EBHSO.js.map} +0 -0
  1532. /package/dist/{tags-4O5FPEEY.js.map → tags-WTN4EBT5.js.map} +0 -0
  1533. /package/dist/{targeting-constants-54S3FXIF.js.map → targeting-constants-6KZXMRNI.js.map} +0 -0
  1534. /package/dist/{targeting-criteria-65UU7EYD.js.map → targeting-criteria-QSCRW75G.js.map} +0 -0
  1535. /package/dist/{targets-T742OPQI.js.map → targets-3KT3DO6O.js.map} +0 -0
  1536. /package/dist/{terms-OFHNLW6U.js.map → terms-IRLEAMIY.js.map} +0 -0
  1537. /package/dist/{testimonials-HKJJXONO.js.map → testimonials-35FTFNQ5.js.map} +0 -0
  1538. /package/dist/{top-companies-T6AMU4C6.js.map → top-companies-JAWMSK2Q.js.map} +0 -0
  1539. /package/dist/{transcript-DOUYMZAP.js.map → transcript-OIYU7F4E.js.map} +0 -0
  1540. /package/dist/{triggers-EYY4GSUL.js.map → triggers-7QRQFTVM.js.map} +0 -0
  1541. /package/dist/{tweets-TRTXC6O4.js.map → tweets-7XVF7PJO.js.map} +0 -0
  1542. /package/dist/{unfollow-DATOGPLZ.js.map → unfollow-ZCP6D2SC.js.map} +0 -0
  1543. /package/dist/{unlink-JNM4WRZK.js.map → unlink-PYCYTYVN.js.map} +0 -0
  1544. /package/dist/{unstage-QF4JT5YP.js.map → unstage-2OUF6ELM.js.map} +0 -0
  1545. /package/dist/{unstage-LLQCMZ5H.js.map → unstage-YADONHH6.js.map} +0 -0
  1546. /package/dist/{update-SD5YQIJC.js.map → update-DEBDSBDI.js.map} +0 -0
  1547. /package/dist/{update-J4DURR4K.js.map → update-IDUSNDOI.js.map} +0 -0
  1548. /package/dist/{update-6V3RBRIE.js.map → update-NG3HUYZZ.js.map} +0 -0
  1549. /package/dist/{update-J7Y6LZC5.js.map → update-P5IT7AIN.js.map} +0 -0
  1550. /package/dist/{update-MQ4NYIU6.js.map → update-U6NU7OXI.js.map} +0 -0
  1551. /package/dist/{upload-CEIYYPID.js.map → upload-4F2JICEH.js.map} +0 -0
  1552. /package/dist/{upload-7PPMVWVA.js.map → upload-SS64KHDS.js.map} +0 -0
  1553. /package/dist/{upscale-WVJZG76V.js.map → upscale-JNNXDN6X.js.map} +0 -0
  1554. /package/dist/{url-options-6WC2XQKB.js.map → url-options-EDPKAPPP.js.map} +0 -0
  1555. /package/dist/{url-params-OVBIP6UA.js.map → url-params-4G26OEOO.js.map} +0 -0
  1556. /package/dist/{use-6FADOAFZ.js.map → use-TKFP6WVP.js.map} +0 -0
  1557. /package/dist/{variant-RNM36P4J.js.map → variant-3VTKOQUR.js.map} +0 -0
  1558. /package/dist/{videos-GHFCOTT7.js.map → videos-EDTBHLOZ.js.map} +0 -0
  1559. /package/dist/{videos-Z72RXCRB.js.map → videos-JRNJH66J.js.map} +0 -0
  1560. /package/dist/{view-YR6MDLWL.js.map → view-6HX3FYMS.js.map} +0 -0
  1561. /package/dist/{viewer-check-655BZRML.js.map → viewer-check-OBBBAYV5.js.map} +0 -0
  1562. /package/dist/{web-4QN6QB7L.js.map → web-GPUEUIDT.js.map} +0 -0
  1563. /package/dist/{winners-4T5RFQXU.js.map → winners-MEC77MZ4.js.map} +0 -0
  1564. /package/dist/{winning-ads-2J2RIOLR.js.map → winning-ads-2DECFON4.js.map} +0 -0
  1565. /package/dist/{write-commands-UO3OQIHH.js.map → write-commands-D5M5A4YI.js.map} +0 -0
  1566. /package/dist/{write-commands-6D55SB56.js.map → write-commands-LQVERLAQ.js.map} +0 -0
  1567. /package/dist/{x-7KXNCWTJ.js.map → x-4TM5RET4.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/engine/nodes/remote/image.ts","../src/engine/nodes/remote/registry-params.ts","../src/engine/nodes/local/staticFormat.ts","../src/engine/nodes/local/lib/plate-panels.ts","../src/engine/nodes/local/lib/subject-crop.ts","../src/engine/nodes/local/lib/picture-memo.ts","../src/engine/nodes/local/lib/words-band.ts","../src/engine/nodes/local/lib/safe-fit.ts","../src/engine/nodes/local/lib/words-layer.ts","../src/engine/nodes/local/lib/whole-render.ts","../src/engine/nodes/local/lib/size-consistency.ts"],"sourcesContent":["import {\n IMAGE_GENERATE_MODELS,\n IMAGE_TIER_CREDITS,\n imagePictureCredits,\n modelIdsAccepted,\n} from \"@baker/canvas-contract\";\nimport { z } from \"zod\";\nimport { ImageRef } from \"../../schema/refs.ts\";\nimport { delegated } from \"./delegate.ts\";\nimport { registryParamShape } from \"./registry-params.ts\";\n\n// Imported, never re-listed. This used to be a local copy of the roster, which\n// silently went stale the moment a model was added to the contract: the registry\n// priced and validated the new model while this enum still rejected it, so every\n// canvas using it failed with a confusing `INVALID_PARAMS` naming the OLD set.\n// The video node has always imported its roster; this now matches. A superseded id\n// (`MODEL_ALIASES`) stays accepted and is kept as written, so a recorded canvas and its\n// cache key never change; the backend runs it on its successor.\nconst imageModelEnum = z.enum(IMAGE_GENERATE_MODELS.flatMap(modelIdsAccepted) as [string, ...string[]]);\n\n// Permissive union of every param accepted by any curated model, derived from the\n// registry (`registryParamShape`), which is also the strict per-model gate: it rejects\n// params a specific model doesn't support and validates enum values. Spelled out here,\n// the `quality` list once stopped at `high` while gpt-image-2.5 grew `xhigh` and `max`,\n// and every ad `scaffold-ad` wrote failed validation before a single node ran.\nconst ImageGenerateParams = z\n .object({\n model: imageModelEnum,\n ...registryParamShape(\"image_generate\", {\n prompt: z.string().min(1),\n // Recraft v4 vector controls, sent as the provider's own `controls` block. The\n // registry types them as JSON; this is their shape.\n rgb_colors: z.array(z.array(z.number().int().min(0).max(255))),\n background_rgb_color: z.array(z.number().int().min(0).max(255)),\n }),\n })\n .strict();\n\n/**\n * A picture asked at the top quality step bills about what Nano Banana Pro's does: bench E5\n * measured gpt-image-2.5 at `max`, with the chosen ad and the logo as references, at $0.14 (9:16)\n * to $0.21 (3:4) a picture (.context/static-review/BENCH.md § \"E5 — true per-format adaptation\").\n */\nconst PRO_QUALITY = \"max\";\n\n/** The quote of one picture: the Pro image models and the top quality step at Pro's rate, the rest at the plain rate. */\nfunction creditsPerImage(params: { model?: unknown; quality?: unknown }): number {\n return params.quality === PRO_QUALITY ? IMAGE_TIER_CREDITS.pro : imagePictureCredits(String(params.model));\n}\n\n/** The `n` a node asks for. The registry-derived shape types it only as one of many params. */\nfunction imagesPerCall(params: object): number {\n return \"n\" in params && typeof params.n === \"number\" ? params.n : 1;\n}\n\nexport const imageGenerateNode = delegated({\n id: \"image_generate\",\n version: \"2.2.0\",\n category: \"image\",\n summary:\n \"Generate images for ad creatives. Curated model set: GPT Image 2.5, Gemini 3.1 Flash Image, Gemini 3 Pro Image, Recraft v4.1 Pro Vector. Per-model param support comes from the canvas-engine model registry.\",\n when_to_use:\n \"Use for hero shots, product photography, illustrations, and vector logos. `recraft/recraft-v4.1-pro-vector` for crisp vector / logo work; `openai/gpt-image-2` for photorealistic and in-image text (NOTE: it has no `image_size`, and no 4:5 / 5:4 — route portrait ad formats through Gemini or `image_aspect_adapt`); Gemini variants for fast iteration, extreme ratios, and editing via the `reference` input. `reference` accepts ONE image or an ARRAY of images — wire several to combine references in a single generation (e.g. a subject sheet + a font specimen + the original ad). Every reference is forwarded to the model in array order. `n` (only on models that declare it, e.g. `openai/gpt-image-2.5-sunburst`) returns several candidates of the same brief from one call, billed per image like separate calls; wire the whole `images` array into `image_select` to keep the best.\",\n // `reference` is one image or an ordered array of images. The backend forwards\n // each as a separate `image_url` to the provider (OpenRouter accepts many).\n inputs: z.object({ reference: z.union([ImageRef, z.array(ImageRef).min(1)]).optional() }).loose(),\n params: ImageGenerateParams,\n outputs: z.object({ images: z.array(ImageRef).min(1) }).strict(),\n outputKinds: { images: \"image\" },\n // Per image: `n` asks one call for several, and the provider bills each (measured: n=3\n // cost exactly 3x n=1, prompt tokens included). Usage-billed, so this is only the pre-run\n // quote; the charge is the provider's reported cost.\n cost: ({ params }) => ({\n credits: creditsPerImage(params) * imagesPerCall(params),\n seconds_estimate: 10,\n }),\n});\n","import { MODEL_REGISTRY, type NodeKind, type ParamSchema } from \"@baker/canvas-contract\";\nimport { z } from \"zod\";\n\n/**\n * A managed node's param schema, derived from the model registry rather than listed\n * by hand: the PERMISSIVE union of every param any model of `kind` declares. It\n * answers \"is this a param at all, and of the right shape\"; which model takes which\n * param, and which enum value, stays the registry validator's job\n * (`validateModelParams`), because a node schema cannot branch on the model.\n *\n * Listed by hand, this drifted: Seedance 2.5 declared `watermark` and the backend\n * forwarded it, while the node's strict schema refused it before it left the CLI.\n *\n * `overrides` replaces the derived schema for a param, for shapes the registry types\n * as `json` (the registry only knows it is JSON) or where the node wants a stricter\n * floor than the union (a non-empty prompt). A param is required only when every\n * model requires it.\n */\nexport function registryParamShape(\n kind: NodeKind,\n overrides: Readonly<Record<string, z.ZodType>> = {},\n): Record<string, z.ZodType> {\n const specs = Object.values(MODEL_REGISTRY[kind]);\n const byParam = new Map<string, ParamSchema[]>();\n for (const spec of specs) {\n for (const [name, schema] of Object.entries(spec.params)) {\n byParam.set(name, [...(byParam.get(name) ?? []), schema]);\n }\n }\n const shape: Record<string, z.ZodType> = {};\n for (const [name, schemas] of byParam) {\n const type = overrides[name] ?? unionOf(schemas);\n const requiredByAll = specs.every((spec) => spec.required.includes(name));\n shape[name] = requiredByAll ? type : type.optional();\n }\n return shape;\n}\n\nfunction unionOf(schemas: readonly ParamSchema[]): z.ZodType {\n const kinds = [...new Set(schemas.map((schema) => schema.kind))];\n if (kinds.length > 1) {\n const [first, second, ...rest] = kinds.map((k) => unionOf(schemas.filter((s) => s.kind === k)));\n return z.union([first as z.ZodType, second as z.ZodType, ...rest]);\n }\n switch (kinds[0]) {\n case \"string\":\n return stringUnion(schemas as Extract<ParamSchema, { kind: \"string\" }>[]);\n case \"number\":\n return numberUnion(schemas as Extract<ParamSchema, { kind: \"number\" }>[]);\n case \"boolean\":\n return z.boolean();\n default:\n return z.unknown();\n }\n}\n\n/** Every value some model enumerates, or any string once one model leaves it open. */\nfunction stringUnion(schemas: Extract<ParamSchema, { kind: \"string\" }>[]): z.ZodType {\n if (schemas.some((schema) => !schema.enum)) return z.string();\n const values = [...new Set(schemas.flatMap((schema) => schema.enum ?? []))];\n return z.enum(values as [string, ...string[]]);\n}\n\n/** Every value some model enumerates, or any number once one model leaves it open. */\nfunction numberUnion(schemas: Extract<ParamSchema, { kind: \"number\" }>[]): z.ZodType {\n if (schemas.some((schema) => !schema.enum)) return z.number();\n const values = [...new Set(schemas.flatMap((schema) => schema.enum ?? []))].sort((a, b) => a - b);\n return z.literal(values);\n}\n","import { supportedAspectRatios } from \"@baker/canvas-contract\";\nimport sharp from \"sharp\";\nimport { z } from \"zod\";\nimport type { ExecCtx } from \"../../engine/context.ts\";\nimport { defineNode } from \"../../engine/define.ts\";\nimport { blockingArea } from \"../../scaffold/platform-safe-area.ts\";\nimport {\n chooseLogoSpot,\n designerSpots,\n type GreyTable,\n greyTable,\n LOGO_POSITIONS,\n type LogoSlot,\n logoSlotLine,\n spreadUnder,\n straightEdgeIn,\n} from \"../../scaffold/static-logo.ts\";\nimport { deliveredSize } from \"../../scaffold/static-sizes.ts\";\nimport { ImageRef } from \"../../schema/refs.ts\";\nimport { callBackendExec } from \"../remote/delegate.ts\";\nimport { imageGenerateNode } from \"../remote/image.ts\";\nimport { boxesOfLine, buttonShape, type CopyLine, isButtonLine, withWordmark } from \"./lib/must-show.ts\";\nimport { imageOf, isRead, pngOf, rawOf, type StepRun, subjectsStep, timedStep } from \"./lib/node-steps.ts\";\nimport { platePanels } from \"./lib/plate-panels.ts\";\nimport type { ReviewUsage } from \"./lib/render-review.ts\";\nimport { type SubjectBox, SubjectBoxSchema } from \"./lib/subject-boxes.ts\";\nimport { type PixelRect, type SubjectCrop, subjectCrop } from \"./lib/subject-crop.ts\";\nimport { readTextBoxes, type TextBox, type TextBoxReading } from \"./lib/text-boxes.ts\";\nimport { cropRaw, takeWhole, WHOLE_PROBLEMS, type WholeProblem, type WholeTake } from \"./lib/whole-render.ts\";\nimport {\n compose,\n coveredSubjects,\n cropLayer,\n identityOutside,\n moveLayer,\n planWordsShift,\n protectFaces,\n type Raw,\n registerToSource,\n type Span,\n type WordsMove,\n warpToCut,\n wordsLayer,\n} from \"./lib/words-layer.ts\";\n\nconst Usage = z\n .object({ model: z.string(), inputTokens: z.number(), outputTokens: z.number(), costUsd: z.number() })\n .strict();\nconst Unit = z.number().min(0).max(1);\nconst SpanSchema = z.object({ x0: Unit, y0: Unit, x1: Unit, y1: Unit }).strict();\nconst Copy = z.array(z.object({ text: z.string().min(1), role: z.string().optional() }).strict());\nconst Rect = z.object({ x: z.number(), y: z.number(), width: z.number(), height: z.number() }).strict();\n\nconst REASONS = [\n \"band_too_far\",\n \"words_over_face\",\n \"subject_covered\",\n \"subject_cut\",\n \"words_misaligned\",\n \"words_not_read\",\n \"not_read\",\n] as const;\n\n/** What a size node did, small enough for the run record (`facts`): the dashboard explains a size from it. */\nexport const FormatFacts = z\n .object({\n format: z.string(),\n lead: z.boolean(),\n plate: z.object({ width: z.number(), height: z.number() }).strict(),\n crop: Rect,\n render_ratio: z.string(),\n upscale: z.number(),\n /** Each block of words code moved (into the band, off a face): its scale and shift, fractions of the size. */\n moves: z.array(z.object({ scale: z.number(), dx: z.number(), dy: z.number() }).strict()),\n /** How far the words render sat from the cut once lined up (RMS grey levels): the spike's calibration of `MISALIGNED`. */\n residual: z.number().optional(),\n reason: z.enum(REASONS).optional(),\n /** `subject_covered`: the products and animals the words hide most of in this size, as the reader names them. */\n covered: z.array(z.string()).optional(),\n /**\n * How the words were laid: `whole`, the words model's whole render, its redrawn subjects put back\n * from the picture; `masked`, only what it changed at the words, on the picture (when its render\n * could not be taken whole twice). Absent when no words were set (`subject_cut`).\n */\n words_mode: z.enum([\"whole\", \"masked\"]).optional(),\n /** `whole`: the share of the picture's detail the render kept where it was (`keptShare`). */\n kept: z.number().optional(),\n /** `whole`: the people, faces and products put back from the picture where the render redrew them. */\n restored: z.array(z.string()).optional(),\n /** Why the first render could not be taken whole, so the words were set a second time. */\n retried: z.enum(WHOLE_PROBLEMS).optional(),\n /** `masked`: why the second render could not be taken whole either. */\n refused: z.enum(WHOLE_PROBLEMS).optional(),\n reverted: z.number(),\n /** `masked`: the mean difference from the cut outside the words layer, 0 by construction. */\n identity: z.number().optional(),\n steps: z.array(\n z\n .object({\n name: z.enum([\"subjects\", \"words\", \"words_again\", \"boxes\"]),\n cached: z.boolean(),\n credits: z.number(),\n ms: z.number(),\n })\n .strict(),\n ),\n })\n .strict();\nexport type FormatFacts = z.infer<typeof FormatFacts>;\n\nconst Words = z\n .object({\n model: z.string().min(1),\n quality: z.string().optional(),\n prompt: z.string().min(1),\n /** A change to the words of this size (`--reword`, an autofix): the previous render (`inputs.previous`) leads. */\n edit: z\n .object({ instruction: z.string().min(1) })\n .strict()\n .optional(),\n })\n .strict();\n\n/** The registration residual (grey levels, RMS) past which the render is not the cut redrawn: only the words' boxes are taken. */\nexport const MISALIGNED = 40;\n\nconst FormatParamsSchema = z\n .object({\n format: z.string().regex(/^\\d+(?:\\.\\d+)?:\\d+(?:\\.\\d+)?$/),\n lead: z.boolean().optional(),\n placements: z.array(z.string().min(1)).optional(),\n words: Words,\n copy: Copy.optional(),\n in_scene: z.array(z.string().min(1)).optional(),\n /** The plan's subject zone, fractions of the plate: what the cut centres on when no subject was read. */\n core: SpanSchema.optional(),\n band_min_scale: z.number().min(0.5).max(1).optional(),\n /**\n * The other sizes cut from the same picture (a variant's lead is checked against them): when\n * one would cut a face, a product or a head, no words are paid for (`subject_cut`).\n */\n check_formats: z.array(z.string().regex(/^\\d+(?:\\.\\d+)?:\\d+(?:\\.\\d+)?$/)).optional(),\n /**\n * The brand's logo file is placed on this size afterwards (`static_logo`): the words draw no logo\n * and keep its slot empty, planned here inside the size's safe area off every face and product,\n * from the logo's shape (`aspect`, width over height) and where the concept puts it (`position`).\n */\n logo_slot: z\n .object({ aspect: z.number().positive(), position: z.enum(LOGO_POSITIONS).optional() })\n .strict()\n .optional(),\n })\n .strict();\n\nexport const staticFormatNode = defineNode({\n id: \"static_format\",\n version: \"1.9.0\",\n category: \"image\",\n location: \"local\",\n billing: \"reported\",\n summary:\n \"One delivered size of a static ad, from the ad's picture (`plate`): cuts the size at one scale around the people and products (`subjects`), and around the cards the picture draws for its words when it can, has the image model set the ad's designed words, logo and button on the cut (`params.words`, one paid call), and takes its whole render, lined up with the cut, putting back from the picture each person, face and product it redrew (soft-edged, in the render's light). Words the frame cuts, the app covers or a face sits under are moved by code on the render, with the band, card or pill they sit on. A render that moved the picture or redrew a subject, or whose words no move clears, is set again once; when that one moved or redrew too, only what it changed at the words is kept on the picture, and when its words are out of place twice, it stays whole and says where they are. Outputs the size (`image`), the cut it was set on (`cut`), the model's render (`words_raw`), where the words were laid when only they were kept (`words_alpha`) and what it did (`facts`).\",\n when_to_use:\n \"One per delivered size of a static ad built on one picture (`format_<size>`, role `static_format`). One image call at the words model's price (two when the first cannot be taken whole), kept apart from the free cut and compose: changing only the band, the placements or the node's version never pays for it again; `--regenerate format_<size>` does.\",\n inputs: z\n .object({\n plate: ImageRef,\n subjects: z.array(SubjectBoxSchema).optional(),\n logo: ImageRef.optional(),\n type: ImageRef.optional(),\n style: ImageRef.optional(),\n refs: z.array(ImageRef).optional(),\n previous: ImageRef.optional(),\n })\n .strict(),\n params: FormatParamsSchema,\n outputs: z\n .object({\n image: ImageRef,\n cut: ImageRef,\n words_raw: ImageRef.optional(),\n words_alpha: ImageRef.optional(),\n /** The slot the words left empty for the logo file, in the size's pixels (`params.logo_slot`). */\n logo_slot: Rect.optional(),\n facts: FormatFacts,\n usage: z.array(Usage).optional(),\n })\n .strict(),\n outputKinds: { image: \"image\", cut: \"image\", words_raw: \"image\", words_alpha: \"image\" },\n cost: ({ params }) =>\n imageGenerateNode.cost?.({ params: wordsCallParams(params.words, \"1:1\") as never }) ?? {\n credits: 0,\n seconds_estimate: 60,\n },\n async execute({ inputs, params, ctx }) {\n return await formatSize(inputs, params, ctx);\n },\n});\n\ntype FormatInputs = {\n plate: ImageRef;\n subjects?: SubjectBox[];\n logo?: ImageRef;\n type?: ImageRef;\n style?: ImageRef;\n refs?: ImageRef[];\n previous?: ImageRef;\n};\ntype FormatParams = z.infer<typeof FormatParamsSchema>;\ntype Step = FormatFacts[\"steps\"][number];\n\n/** The image call's params: the words model at the render rectangle's ratio. */\nfunction wordsCallParams(words: z.infer<typeof Words>, ratio: string): Record<string, unknown> {\n const prompt = words.edit ? `Edit: ${words.edit.instruction}\\n\\n${words.prompt}` : words.prompt;\n return { model: words.model, prompt, aspect_ratio: ratio, ...(words.quality ? { quality: words.quality } : {}) };\n}\n\nconst percent = (v: number) => Math.round(Math.max(0, Math.min(1, v)) * 100);\n\n/**\n * The runtime line the words prompt ends with: where the faces in this size sit, for the words\n * to keep off. Empty when no face is in the frame. Pure.\n */\nexport function wordsAvoid(faces: readonly Span[]): string {\n if (faces.length === 0) return \"\";\n const where = faces.map(\n (f) => `a face ${percent(f.y0)}-${percent(f.y1)}% down, ${percent(f.x0)}-${percent(f.x1)}% across`,\n );\n return `Keep every word, the logo and the button off ${where.join(\"; \")}.`;\n}\n\n/** One axis's strips cut away, as the words line says them (\"a strip 3% deep at its top and 3% at its bottom\"). */\nfunction stripsOf(before: number, after: number, sides: [string, string], depth: string): string[] {\n const cut = [\n ...(percent(before) >= 1 ? [{ share: percent(before), side: sides[0] }] : []),\n ...(percent(after) >= 1 ? [{ share: percent(after), side: sides[1] }] : []),\n ];\n return cut.map((s, i) =>\n i === 0 ? `a strip ${s.share}% ${depth} at its ${s.side}` : `${s.share}% at its ${s.side}`,\n );\n}\n\n/**\n * The runtime line the words prompt ends with when the model draws more than the size: which\n * strips of its frame the size cuts away, for the words to keep clear of (GPT draws no 4:5, and\n * its 3:4 is cut). Empty when the size is the whole frame drawn. Pure.\n */\nexport function wordsFrame(frame: PixelRect, work: { width: number; height: number }, format: string): string {\n const down = stripsOf(frame.y / work.height, 1 - (frame.y + frame.height) / work.height, [\"top\", \"bottom\"], \"deep\");\n const across = stripsOf(frame.x / work.width, 1 - (frame.x + frame.width) / work.width, [\"left\", \"right\"], \"wide\");\n const strips = [down.join(\" and \"), across.join(\" and \")].filter(Boolean);\n if (strips.length === 0) return \"\";\n const many = down.length + across.length > 1;\n return `This picture is cut to ${format} afterwards: ${strips.join(\", and \")} ${many ? \"are\" : \"is\"} cut away, so no word, logo or button comes near ${many ? \"them\" : \"it\"}.`;\n}\n\n/**\n * The boxes read on the words render, split: `inScene` are the lines that are part of the\n * picture (a screen's chat, a label: they stay the picture's), `designed` everything else read\n * (the copy, the logo, and a button's whole shape). Pure.\n */\nexport function splitWordBoxes(\n boxes: readonly TextBox[],\n copy: readonly CopyLine[],\n inScene: readonly string[],\n): { designed: TextBox[]; inScene: TextBox[] } {\n const logoWords = copy.filter((l) => /logo/i.test(l.role ?? \"\")).map((l) => l.text);\n const read = withWordmark(boxes, logoWords);\n const lines = copy.filter((l) => !/logo/i.test(l.role ?? \"\"));\n const ours = new Set(lines.flatMap((line) => boxesOfLine(line, read)));\n // A line the copy does not name is the picture's (a phone's \"9:41\", a sign): lifted, it was pasted twice.\n const unnamed = (b: TextBox) => lines.length > 0 && b.kind === \"text\" && !ours.has(b);\n const scene = new Set([...inScene.flatMap((text) => boxesOfLine({ text }, read)), ...read.filter(unnamed)]);\n const buttons = new Set(copy.filter(isButtonLine).flatMap((line) => boxesOfLine(line, read)));\n return {\n designed: read.filter((b) => !scene.has(b)).map((b) => (buttons.has(b) ? buttonShape(b) : b)),\n inScene: read.filter((b) => scene.has(b)),\n };\n}\n\n/** A box on the render rectangle, as fractions of the size's own frame inside it. */\nfunction toFrame<T extends Span>(b: T, frame: PixelRect, work: { width: number; height: number }): T {\n return {\n ...b,\n x0: (b.x0 * work.width - frame.x) / frame.width,\n y0: (b.y0 * work.height - frame.y) / frame.height,\n x1: (b.x1 * work.width - frame.x) / frame.width,\n y1: (b.y1 * work.height - frame.y) / frame.height,\n };\n}\n\n/** A subject box of the plate, as fractions of the pixel rectangle `rect` of it. */\nfunction subjectIn(b: SubjectBox, rect: PixelRect, plate: { width: number; height: number }): SubjectBox {\n return {\n ...b,\n x0: (b.x0 * plate.width - rect.x) / rect.width,\n y0: (b.y0 * plate.height - rect.y) / rect.height,\n x1: (b.x1 * plate.width - rect.x) / rect.width,\n y1: (b.y1 * plate.height - rect.y) / rect.height,\n };\n}\n\nconst visible = (b: Span) => b.x1 > 0 && b.y1 > 0 && b.x0 < 1 && b.y0 < 1;\n\n/** The size's frame: the render rectangle at delivered scale, and the size inside it. */\ntype Framing = {\n upscale: number;\n work: { width: number; height: number };\n frame: PixelRect;\n /** The render rectangle of the plate, at `work` pixels: what the words model is shown. */\n renderCut: Raw;\n /** The size's own cut, at delivered pixels. */\n cutFrame: Raw;\n};\n\nasync function frameSize(plateBytes: Buffer, crop: SubjectCrop, format: string): Promise<Framing> {\n const delivered = deliveredSize(format);\n const upscale = delivered.width / crop.rect.width;\n const work = { width: Math.round(crop.render.width * upscale), height: Math.round(crop.render.height * upscale) };\n const frame = {\n x: Math.min(work.width - delivered.width, Math.max(0, Math.round((crop.rect.x - crop.render.x) * upscale))),\n y: Math.min(work.height - delivered.height, Math.max(0, Math.round((crop.rect.y - crop.render.y) * upscale))),\n width: delivered.width,\n height: delivered.height,\n };\n const region = { left: crop.render.x, top: crop.render.y, width: crop.render.width, height: crop.render.height };\n const renderCut = await rawOf(await sharp(plateBytes).extract(region).toBuffer(), work);\n return { upscale, work, frame, renderCut, cutFrame: cropRaw(renderCut, frame) };\n}\n\n/** What the words model is shown: the render rectangle of the cut, its ratio, the faces in it and the size's frame inside it. */\ntype Shown = {\n cut: ImageRef;\n ratio: string;\n faces: readonly Span[];\n frame: PixelRect;\n work: { width: number; height: number };\n /** The slot kept empty for the logo file, in the size's pixels. */\n logo?: LogoSlot;\n};\n\n/** A rectangle of the size's frame stated as fractions of the render rectangle the model draws. */\nfunction slotOnWork(rect: PixelRect, frame: PixelRect, work: { width: number; height: number }): Span {\n return {\n x0: (frame.x + rect.x) / work.width,\n y0: (frame.y + rect.y) / work.height,\n x1: (frame.x + rect.x + rect.width) / work.width,\n y1: (frame.y + rect.y + rect.height) / work.height,\n };\n}\n\n/** The kinds of subject a logo, plate and all, never sits on or crowds: as the composite keeps it. */\nconst LOGO_AVOIDS = new Set([\"person\", \"face\", \"product\", \"animal\"]);\n\n/** The spread of the grey level (0-255) under a slot up to which the picture counts as plain ground: as the composite reads it. */\nconst PLAIN_GROUND_SPREAD = 18;\n\n/**\n * The slot the logo file is placed in on this size, chosen by the function the composite places it\n * with (`chooseLogoSpot`), before any word is set: a designer's place inside the safe area, its clear\n * space off every person, face, product and animal of the cut (`subjects`, fractions of the render\n * rectangle), on the cut's plain ground and through no edge when the cut is given (`picture`, the\n * size's frame); the concept's corner when no place is clean.\n */\nexport function sizeLogoSlot(\n params: Pick<FormatParams, \"format\" | \"placements\" | \"logo_slot\">,\n frame: PixelRect,\n work: { width: number; height: number },\n subjects: readonly SubjectBox[],\n picture?: GreyTable,\n): LogoSlot | undefined {\n if (!params.logo_slot) return undefined;\n const avoid = subjects\n .filter((s) => LOGO_AVOIDS.has(s.kind))\n .map((s) => ({\n x: Math.round(s.x0 * work.width - frame.x),\n y: Math.round(s.y0 * work.height - frame.y),\n width: Math.round((s.x1 - s.x0) * work.width),\n height: Math.round((s.y1 - s.y0) * work.height),\n }));\n const size = { width: frame.width, height: frame.height };\n const safe = blockingArea(params.format, params.placements);\n const shape = {\n aspect: params.logo_slot.aspect,\n ...(params.logo_slot.position ? { position: params.logo_slot.position } : {}),\n };\n const spot = chooseLogoSpot(size, safe, {\n ...shape,\n subjects: avoid,\n ...(picture\n ? {\n calm: (r: PixelRect) => spreadUnder(picture, r) <= PLAIN_GROUND_SPREAD,\n crossesEdge: (r: PixelRect) => straightEdgeIn(picture, r),\n }\n : {}),\n });\n return spot?.slot ?? designerSpots(size, safe, shape)[0];\n}\n\n/**\n * The paid call: the words model sets the words on the render rectangle; `again` says what the\n * last render did wrong, when they are set a second time. A step, so a re-run replays it.\n */\nasync function setWords(\n inputs: FormatInputs,\n params: FormatParams,\n run: StepRun<Step[\"name\"]>,\n shown: Shown,\n again?: string,\n): Promise<ImageRef> {\n const callParams = wordsCallParams(params.words, shown.ratio);\n const prompt = [\n callParams.prompt,\n wordsAvoid(shown.faces),\n wordsFrame(shown.frame, shown.work, params.format),\n shown.logo ? logoSlotLine(slotOnWork(shown.logo.clear, shown.frame, shown.work), shown.logo.position) : \"\",\n again,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n const references = [\n ...(inputs.previous && params.words.edit ? [inputs.previous] : []),\n shown.cut,\n ...[inputs.logo, inputs.type, inputs.style].filter((r): r is ImageRef => r !== undefined),\n ...(inputs.refs ?? []),\n ];\n const call = { ...callParams, prompt };\n return await timedStep(\n run,\n again ? \"words_again\" : \"words\",\n { params: call, references: references.map((r) => r.sha256) },\n async (suffix, stepCtx) => {\n const out = await callBackendExec({\n nodeType: imageGenerateNode.id,\n nodeVersion: imageGenerateNode.version,\n params: imageGenerateNode.params.parse(call),\n inputs: { reference: references },\n outputKinds: { images: \"image\" },\n ctx: stepCtx,\n idempotencySuffix: suffix,\n });\n const first = Array.isArray(out.images) ? (out.images[0] as ImageRef | undefined) : undefined;\n if (!first) throw new Error(\"static_format: the words call returned no picture\");\n return first;\n },\n );\n}\n\n/** Where the words were read on the render, split from what the scene prints; the whole frame when nothing could read it. */\nfunction wordsRead(reading: TextBoxReading, params: FormatParams): { designed: TextBox[]; inScene: TextBox[] } {\n if (reading.status === \"read\") return splitWordBoxes(reading.boxes, params.copy ?? [], params.in_scene ?? []);\n return { designed: [{ text: \"\", kind: \"text\", x0: 0, y0: 0, x1: 1, y1: 1 }], inScene: [] };\n}\n\ntype Lifted = {\n out: Raw;\n alpha: Float32Array;\n moves: WordsMove[];\n residual: number;\n reverted: number;\n /** The products and animals the words hide most of. */\n covered: string[];\n reason?: FormatFacts[\"reason\"];\n};\n\n/**\n * The words lifted off the render and laid on the size's cut: lined up, kept only at the words,\n * cut to the size, moved inside its band when they reach past it.\n */\nfunction liftWords(\n render: Raw,\n framing: Framing,\n words: { designed: TextBox[]; inScene: TextBox[]; read: boolean },\n subjects: readonly SubjectBox[],\n params: FormatParams,\n keepOut: readonly Span[] = [],\n): Lifted {\n const faces = subjects.filter((b) => b.kind === \"face\");\n const fit = registerToSource(render, framing.renderCut, words.read ? words.designed : []);\n const misaligned = fit.residual > MISALIGNED;\n const aligned = misaligned ? render : warpToCut(render, fit);\n const { layer, reverted } = wordsLayer(aligned, framing.renderCut, words.designed, {\n subjects,\n keepOut: words.inScene,\n boxesOnly: misaligned,\n });\n const sized = cropLayer(layer, framing.frame);\n const inFrame = <T extends Span>(b: T): T => toFrame(b, framing.frame, framing.work);\n const frameFaces = faces.map(inFrame).filter(visible);\n const frameWords = words.designed.map(inFrame).filter(visible);\n // Words nobody could place are never moved: the whole frame stands in for them, and moving it shrinks the picture.\n const plan = words.read\n ? planWordsShift(frameWords, params.format, {\n ...(params.placements ? { placements: params.placements } : {}),\n ...(params.band_min_scale !== undefined ? { minScale: params.band_min_scale } : {}),\n // A move never takes words into the slot kept for the logo, nor is made for it: moving a block\n // out of it cut its band through the letters (Cubicup 4:5, round 6); the logo goes elsewhere.\n faces: frameFaces,\n keepOut,\n })\n : { moves: [] };\n // A word never lands on a face, wherever the model set it or the move took it: the face shows.\n const { layer: placed, covered } = protectFaces(\n plan.moves.length > 0 ? moveLayer(sized, plan.moves) : sized,\n frameFaces,\n );\n // The size shows the product the others show: words that hide most of it are set again elsewhere.\n const hidden = coveredSubjects(placed, subjects.map(inFrame).filter(visible));\n const reason =\n (words.read ? undefined : \"words_not_read\") ??\n plan.reason ??\n (misaligned ? \"words_misaligned\" : undefined) ??\n (covered > 0 ? \"words_over_face\" : undefined) ??\n (hidden.length > 0 ? \"subject_covered\" : undefined);\n return {\n out: compose(framing.cutFrame, placed),\n alpha: placed.alpha,\n moves: plan.moves,\n residual: fit.residual,\n reverted,\n covered: hidden,\n ...(reason ? { reason } : {}),\n };\n}\n\nasync function alphaPng(alpha: Float32Array, width: number, height: number): Promise<Buffer> {\n return await sharp(Buffer.from(alpha.map((a) => Math.round(a * 255))), { raw: { width, height, channels: 1 } })\n .png()\n .toBuffer();\n}\n\nconst round3 = (v: number) => Math.round(v * 1000) / 1000;\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n/** What every size's facts start from: where it was cut and how much it was enlarged. */\ntype SizeBase = Pick<FormatFacts, \"format\" | \"lead\" | \"plate\" | \"crop\" | \"render_ratio\" | \"upscale\">;\n\n/** What a size's run kept beside its output: its step records, whether its subjects were read, its spend. */\ntype SizeRun = StepRun<Step[\"name\"]> & {\n subjectsRead: boolean;\n cut: ImageRef;\n framing: Framing;\n /** The slot kept for the logo with its clear space, fractions of the size: no word may sit there. */\n keepOut: Span[];\n};\n\n/** The facts of a size whose words were laid on the picture alone (`masked`). */\nfunction liftedFacts(base: SizeBase, lifted: Lifted, run: { identity: number; steps: Step[]; subjectsRead: boolean }) {\n const reason = lifted.reason ?? (run.subjectsRead ? undefined : \"not_read\");\n return {\n ...base,\n ...(reason ? { reason } : {}),\n ...(lifted.covered.length > 0 ? { covered: lifted.covered } : {}),\n moves: lifted.moves.map(({ fit }) => ({ scale: round3(fit.scale), dx: round3(fit.dx), dy: round3(fit.dy) })),\n residual: round1(lifted.residual),\n reverted: round3(lifted.reverted),\n identity: run.identity,\n steps: run.steps,\n } satisfies Omit<FormatFacts, \"words_mode\">;\n}\n\n/** One words call and what was read on it: its render at the work pixels, and where its words sit. */\ntype WordsTry = { ref: ImageRef; render: Raw; reading: TextBoxReading };\n\nasync function wordsTry(\n inputs: FormatInputs,\n params: FormatParams,\n run: SizeRun,\n shown: Shown,\n again?: string,\n): Promise<WordsTry> {\n const ref = await setWords(inputs, params, run, shown, again);\n const { bytes } = await imageOf(ref, \"static_format\");\n const reading = await timedStep<Step[\"name\"], TextBoxReading>(\n run,\n \"boxes\",\n { render: ref.sha256 },\n () => readTextBoxes(bytes, { onSpend: (u) => run.usage.push(u) }),\n { keep: isRead },\n );\n return { ref, render: await rawOf(bytes, run.framing.work), reading };\n}\n\n/** A words render taken whole (`takeWhole`), its words as read on it. */\nfunction takeOf(t: WordsTry, run: SizeRun, subjects: readonly SubjectBox[], params: FormatParams): WholeTake {\n const { framing } = run;\n return takeWhole({\n render: t.render,\n cut: framing.renderCut,\n frame: framing.frame,\n words:\n t.reading.status === \"read\" ? splitWordBoxes(t.reading.boxes, params.copy ?? [], params.in_scene ?? []) : null,\n subjects,\n format: params.format,\n ...(params.placements ? { placements: params.placements } : {}),\n ...(params.band_min_scale !== undefined ? { minScale: params.band_min_scale } : {}),\n ...(run.keepOut.length > 0 ? { keepOut: run.keepOut } : {}),\n });\n}\n\nconst quoted = (what: readonly string[]) => what.map((w) => `\"${w}\"`).join(\", \");\n\n/**\n * What the second words call is told of the first render: what it did wrong, said as what to do.\n * Appended to the words prompt. Pure.\n */\nexport function setAgain(problem: WholeProblem, what: readonly string[]): string {\n const said: Record<WholeProblem, string> = {\n picture_moved:\n \"Your last version moved or resized the picture to make room for the words. Keep Image 1 exactly where it is, at its size and framing; lay any band or card over its edge instead.\",\n subject_redrawn: `Your last version drew ${what.join(\" and \") || \"a person\"} again, elsewhere or in another pose. Keep them exactly as Image 1 shows them, where they are, and set the words around them.`,\n words_lost: `Your last version set ${quoted(what) || \"words\"} where this size is cut, the app's buttons cover them or the logo goes. Keep every word and the button inside the zones and out of the place kept plain for the logo.`,\n words_over_face:\n \"Your last version set words over a face. Keep every word, the logo and the button off every face.\",\n };\n return said[problem];\n}\n\n/** What a size taken whole delivers: the render with the picture put back, and what code moved. */\ntype Taken = { out: Raw; restored: string[]; covered: string[]; moves: WordsMove[]; kept: number; residual: number };\n\n/** Why a size taken whole still has its words out of place, as the review blocks it. */\nconst MISPLACED: Partial<Record<WholeProblem, FormatFacts[\"reason\"]>> = {\n words_lost: \"band_too_far\",\n words_over_face: \"words_over_face\",\n};\n\n/**\n * The size as the words render taken whole: its facts say what was put back, why the words were\n * set again (`retried`), and, when they are still out of place (`misplaced`), where, as the review\n * blocks it, so they are set again then.\n */\nasync function wholeSize(\n take: Taken,\n t: WordsTry,\n run: SizeRun,\n base: SizeBase,\n why: { retried?: WholeProblem; misplaced?: WholeProblem } = {},\n) {\n const { retried } = why;\n const image = (await run.ctx.assets.ingestBytes({\n bytes: await pngOf(take.out),\n kind: \"image\",\n mime: \"image/png\",\n })) as ImageRef;\n const reason =\n (t.reading.status === \"read\" ? undefined : \"words_not_read\") ??\n (why.misplaced ? MISPLACED[why.misplaced] : undefined) ??\n (take.covered.length > 0 ? \"subject_covered\" : undefined) ??\n (run.subjectsRead ? undefined : \"not_read\");\n const facts: FormatFacts = {\n ...base,\n ...(reason ? { reason } : {}),\n ...(take.covered.length > 0 ? { covered: take.covered } : {}),\n words_mode: \"whole\",\n kept: round3(take.kept),\n ...(take.restored.length > 0 ? { restored: take.restored } : {}),\n ...(retried ? { retried } : {}),\n moves: take.moves.map(({ fit }) => ({ scale: round3(fit.scale), dx: round3(fit.dx), dy: round3(fit.dy) })),\n residual: round1(take.residual),\n reverted: 0,\n steps: run.steps,\n };\n run.ctx.log(\n `${base.format}: cut ${base.crop.width}x${base.crop.height} (x${base.upscale}), words whole${take.moves.length > 0 ? \", moved\" : \"\"}${take.restored.length > 0 ? `, ${take.restored.join(\", \")} put back` : \"\"}${retried ? ` (set again: ${retried})` : \"\"}${reason ? `, ${reason}` : \"\"}`,\n );\n return { image, cut: run.cut, words_raw: t.ref, facts };\n}\n\n/** The size with only what a words render changed at the words laid on the picture: the last resort. */\nasync function maskedSize(\n t: WordsTry,\n run: SizeRun,\n base: SizeBase,\n subjects: readonly SubjectBox[],\n params: FormatParams,\n why: { retried: WholeProblem; refused: WholeProblem },\n) {\n const { framing } = run;\n const lifted = liftWords(\n t.render,\n framing,\n { ...wordsRead(t.reading, params), read: t.reading.status === \"read\" },\n subjects,\n params,\n run.keepOut,\n );\n const identity = identityOutside(lifted.out, framing.cutFrame, lifted.alpha);\n if (identity !== 0) throw new Error(`static_format: the picture outside the words changed (${identity})`);\n const [image, alpha] = await Promise.all([\n run.ctx.assets.ingestBytes({ bytes: await pngOf(lifted.out), kind: \"image\", mime: \"image/png\" }),\n run.ctx.assets.ingestBytes({\n bytes: await alphaPng(lifted.alpha, framing.frame.width, framing.frame.height),\n kind: \"image\",\n mime: \"image/png\",\n }),\n ]);\n const facts: FormatFacts = {\n ...liftedFacts(base, lifted, { identity, steps: run.steps, subjectsRead: run.subjectsRead }),\n words_mode: \"masked\",\n retried: why.retried,\n refused: why.refused,\n };\n run.ctx.log(\n `${base.format}: cut ${base.crop.width}x${base.crop.height} (x${base.upscale}), words set twice (${why.retried}, then ${why.refused}), only the words kept${lifted.moves.length > 0 ? \", moved\" : \"\"}${facts.reason ? `, ${facts.reason}` : \"\"}`,\n );\n return { image: image as ImageRef, cut: run.cut, words_raw: t.ref, words_alpha: alpha as ImageRef, facts };\n}\n\nasync function formatSize(inputs: FormatInputs, params: FormatParams, ctx: ExecCtx) {\n const { bytes: plateBytes, size: plate } = await imageOf(inputs.plate, \"static_format\");\n const steps: Step[] = [];\n const usage: ReviewUsage[] = [];\n const spend = () => (usage.length > 0 ? { usage } : {});\n const subjects = inputs.subjects ?? (await subjectsStep({ ctx, steps, usage }, inputs.plate, plateBytes));\n const ratios = supportedAspectRatios(\"image_generate\", params.words.model);\n // The cards the picture draws for its words are cut whole when the cut can: the words go in them.\n const panels = platePanels(await rawOf(plateBytes, plate));\n const crop = subjectCrop(plate, params.format, subjects, {\n ...(params.core ? { core: params.core } : {}),\n ...(ratios ? { renderRatios: ratios } : {}),\n ...(panels.length > 0 ? { panels } : {}),\n });\n const framing = await frameSize(plateBytes, crop, params.format);\n const cutRef = (await ctx.assets.ingestBytes({\n bytes: await pngOf(framing.cutFrame),\n kind: \"image\",\n mime: \"image/png\",\n })) as ImageRef;\n const base: SizeBase = {\n format: params.format,\n lead: params.lead ?? false,\n plate,\n crop: crop.rect,\n render_ratio: crop.render.ratio,\n upscale: round3(framing.upscale),\n };\n const shownSubjects = (subjects ?? []).map((s) => subjectIn(s, crop.render, plate)).filter(visible);\n // The logo file is placed afterwards: its slot, chosen as the composite chooses it, is kept empty by the words.\n const logo = sizeLogoSlot(params, framing.frame, framing.work, shownSubjects, greyTable(framing.cutFrame));\n const slotOut = logo ? { logo_slot: logo.rect } : {};\n // A variant's picture that cannot give every size it is cut to is set aside before its words are paid for.\n const elsewhere = (params.check_formats ?? [])\n .filter((f) => f !== params.format)\n .map((f) => ({ format: f, crop: subjectCrop(plate, f, subjects, params.core ? { core: params.core } : {}) }))\n .find((c) => !c.crop.fits);\n if (!crop.fits || elsewhere) {\n const lost = crop.fits && elsewhere ? `${elsewhere.format}: ${elsewhere.crop.cut.join(\", \")}` : crop.cut.join(\", \");\n ctx.log(`${params.format}: no cut keeps ${lost} whole; the words were not set`);\n const facts: FormatFacts = { ...base, reason: \"subject_cut\", moves: [], reverted: 0, identity: 0, steps };\n return { image: cutRef, cut: cutRef, facts, ...slotOut, ...spend() };\n }\n const shownCut = await ctx.assets.ingestBytes({\n bytes: await pngOf(framing.renderCut),\n kind: \"image\",\n mime: \"image/png\",\n });\n const keepOut = logo\n ? [\n {\n x0: logo.clear.x / framing.frame.width,\n y0: logo.clear.y / framing.frame.height,\n x1: (logo.clear.x + logo.clear.width) / framing.frame.width,\n y1: (logo.clear.y + logo.clear.height) / framing.frame.height,\n },\n ]\n : [];\n const run: SizeRun = { ctx, steps, usage, subjectsRead: subjects !== null, cut: cutRef, framing, keepOut };\n const shown: Shown = {\n cut: shownCut as ImageRef,\n ratio: crop.render.ratio,\n faces: shownSubjects.filter((s) => s.kind === \"face\"),\n frame: framing.frame,\n work: framing.work,\n ...(logo ? { logo } : {}),\n };\n return { ...(await letter({ inputs, params, run, shown, base, subjects: shownSubjects })), ...slotOut, ...spend() };\n}\n\n/** What lettering one size works from: the node's inputs and params, its run, what the model is shown, its facts so far. */\ntype Lettering = {\n inputs: FormatInputs;\n params: FormatParams;\n run: SizeRun;\n shown: Shown;\n base: SizeBase;\n subjects: readonly SubjectBox[];\n};\n\n/**\n * The size's words: the render taken whole; else set again once, told what went wrong; twice out of\n * place only, it stays whole and says so; twice no lettering of the picture, only the words are kept.\n */\nasync function letter(l: Lettering) {\n const { inputs, params, run, shown, base, subjects } = l;\n const first = await wordsTry(inputs, params, run, shown);\n const firstTake = takeOf(first, run, subjects, params);\n if (firstTake.ok) return await wholeSize(firstTake, first, run, base);\n // A render that is no lettering of the picture is set again once, told what went wrong.\n const second = await wordsTry(inputs, params, run, shown, setAgain(firstTake.problem, firstTake.what));\n const secondTake = takeOf(second, run, subjects, params);\n const retried = firstTake.problem;\n if (secondTake.ok) return await wholeSize(secondTake, second, run, base, { retried });\n // Twice its words out of place, the picture right: it stays whole, and says where its words are.\n const placed = [\n { take: secondTake, t: second },\n { take: firstTake, t: first },\n ].find((p) => p.take.whole);\n const whole = placed?.take.whole;\n if (placed && whole) {\n const taken = { ...whole, moves: [], kept: placed.take.kept, residual: placed.take.residual };\n return await wholeSize(taken, placed.t, run, base, { retried, misplaced: placed.take.problem });\n }\n // Twice refused: only the words are kept, off the render that kept more of the picture.\n const kept = secondTake.kept >= firstTake.kept ? second : first;\n return await maskedSize(kept, run, base, subjects, params, { retried, refused: secondTake.problem });\n}\n","/**\n * The cards, panels and buttons a static ad's picture draws for its words: each one flat colour,\n * inside the picture. A size's cut keeps them whole when it can (`subject-crop.ts`): the words\n * model sets the words in them where the picture drew them, so a cut through one cuts the words'\n * card (dev, Oct 2026: Zernio's 4:5 cut the top off the quote card its picture drew empty).\n *\n * Pure: a raw RGB picture in, rectangles as fractions of it out.\n */\nimport type { Raw, Span } from \"./words-layer.ts\";\n\n/** The width a picture is read at: a card is tens of pixels across there, and the read stays cheap. */\nconst READ_WIDTH = 288;\n/** The 5×5 spread of grey (levels) under which the picture is flat there: a card, never a photo's grain. */\nconst FLAT = 2;\n/** How far (levels, each channel) one pixel of a card is from the next: past it, an edge. */\nconst STEP = 3;\n/** The most a card's colour ranges over it (levels, each channel): a soft glow runs on far past it. */\nconst RANGE = 12;\n/** The least of the picture a card covers: a patch smaller holds no line of words. */\nconst MIN_AREA = 0.015;\n/** The least of its box a card fills: a round photo or a divider on it leaves holes, a ring of wall is no card. */\nconst MIN_FILL = 0.6;\n\n/** The mean of channel `c` of `img` over the `f`×`f` block whose corner is (`x`, `y`). */\nfunction blockMean(img: Raw, x: number, y: number, f: number, c: number): number {\n let sum = 0;\n for (let dy = 0; dy < f; dy++) {\n for (let dx = 0; dx < f; dx++) sum += img.data[((y + dy) * img.width + x + dx) * img.channels + c] ?? 0;\n }\n return sum / (f * f);\n}\n\n/** `img` averaged down by `f` on each side, as three channels. */\nfunction shrunk(img: Raw, f: number): Raw {\n const width = Math.floor(img.width / f);\n const height = Math.floor(img.height / f);\n const data = Buffer.alloc(width * height * 3);\n for (let i = 0; i < width * height; i++) {\n const x = i % width;\n const y = (i - x) / width;\n for (let c = 0; c < 3; c++) data[i * 3 + c] = Math.round(blockMean(img, x * f, y * f, f, c));\n }\n return { data, width, height, channels: 3 };\n}\n\n/** The spread (standard deviation) of `grey` over the 5×5 window around (`x`, `y`). */\nfunction spreadAt(grey: Float32Array, width: number, x: number, y: number): number {\n let sum = 0;\n let squares = 0;\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++) {\n const v = grey[(y + dy) * width + x + dx] ?? 0;\n sum += v;\n squares += v * v;\n }\n }\n const mean = sum / 25;\n return Math.sqrt(Math.max(0, squares / 25 - mean * mean));\n}\n\n/** Where `img` (three channels) is flat: the 5×5 spread of its grey under `FLAT`; its two-pixel rim is unread. */\nfunction flatOf(img: Raw): Uint8Array {\n const { width, height } = img;\n const grey = new Float32Array(width * height);\n for (let i = 0; i < grey.length; i++)\n grey[i] = 0.299 * (img.data[i * 3] ?? 0) + 0.587 * (img.data[i * 3 + 1] ?? 0) + 0.114 * (img.data[i * 3 + 2] ?? 0);\n const flat = new Uint8Array(width * height);\n for (let y = 2; y < height - 2; y++) {\n for (let x = 2; x < width - 2; x++) flat[y * width + x] = spreadAt(grey, width, x, y) < FLAT ? 1 : 0;\n }\n return flat;\n}\n\n/** What one region of the flat picture is: its box (pixels, inclusive), how many pixels, how far its colour ranges. */\ntype Region = { x0: number; y0: number; x1: number; y1: number; count: number; range: number };\n\n/** A region being grown: its box and count so far, and the lowest and highest of each channel met. */\ntype Growing = Region & { lo: number[]; hi: number[] };\n\n/** Takes pixel `i` (at `x`, `y`) of `img` into `r`. */\nfunction take(r: Growing, img: Raw, i: number, x: number, y: number): void {\n r.count++;\n r.x0 = Math.min(r.x0, x);\n r.x1 = Math.max(r.x1, x);\n r.y0 = Math.min(r.y0, y);\n r.y1 = Math.max(r.y1, y);\n for (let c = 0; c < 3; c++) {\n const v = img.data[i * 3 + c] ?? 0;\n r.lo[c] = Math.min(r.lo[c] ?? 255, v);\n r.hi[c] = Math.max(r.hi[c] ?? 0, v);\n }\n}\n\n/** The four neighbours of pixel `i` (at `x`) inside a `width`×`height` picture. */\nconst neighbours = (i: number, x: number, width: number, height: number): number[] =>\n [x > 0 ? i - 1 : -1, x < width - 1 ? i + 1 : -1, i - width, i + width].filter((j) => j >= 0 && j < width * height);\n\n/** The flat region grown from pixel `seed` through neighbours within `STEP` of each other, labelled in `seen`. */\nfunction regionFrom(img: Raw, flat: Uint8Array, seen: Uint8Array, seed: number): Region {\n const { width, height } = img;\n const r: Growing = { x0: width, y0: height, x1: -1, y1: -1, count: 0, range: 0, lo: [255, 255, 255], hi: [0, 0, 0] };\n const near = (a: number, b: number) =>\n [0, 1, 2].every((c) => Math.abs((img.data[a * 3 + c] ?? 0) - (img.data[b * 3 + c] ?? 0)) <= STEP);\n seen[seed] = 1;\n const stack = [seed];\n for (let i = stack.pop(); i !== undefined; i = stack.pop()) {\n const x = i % width;\n take(r, img, i, x, (i - x) / width);\n for (const j of neighbours(i, x, width, height)) {\n if (!flat[j] || seen[j] || !near(i, j)) continue;\n seen[j] = 1;\n stack.push(j);\n }\n }\n const range = Math.max(...[0, 1, 2].map((c) => (r.hi[c] ?? 0) - (r.lo[c] ?? 0)));\n return { x0: r.x0, y0: r.y0, x1: r.x1, y1: r.y1, count: r.count, range };\n}\n\n/** Whether `r` is a card: inside the picture (a ground the picture runs off is none), large, filled, one colour. */\nfunction isPanel(r: Region, width: number, height: number): boolean {\n // The 5×5 read leaves a two-pixel rim unread: a region reaching it runs off the picture.\n const inside = r.x0 > 2 && r.y0 > 2 && r.x1 < width - 3 && r.y1 < height - 3;\n const box = (r.x1 - r.x0 + 1) * (r.y1 - r.y0 + 1);\n return inside && box >= MIN_AREA * width * height && r.count >= MIN_FILL * box && r.range <= RANGE;\n}\n\n/** The cards, panels and buttons `img` draws (fractions of it), largest first. Pure. */\nexport function platePanels(img: Raw): Span[] {\n const f = Math.max(1, Math.round(img.width / READ_WIDTH));\n const small = f > 1 || img.channels !== 3 ? shrunk(img, f) : img;\n const flat = flatOf(small);\n const seen = new Uint8Array(flat.length);\n const panels: Array<Span & { area: number }> = [];\n for (let i = 0; i < flat.length; i++) {\n if (!flat[i] || seen[i]) continue;\n const r = regionFrom(small, flat, seen, i);\n if (!isPanel(r, small.width, small.height)) continue;\n panels.push({\n x0: r.x0 / small.width,\n y0: r.y0 / small.height,\n x1: (r.x1 + 1) / small.width,\n y1: (r.y1 + 1) / small.height,\n area: (r.x1 - r.x0 + 1) * (r.y1 - r.y0 + 1),\n });\n }\n return panels.sort((a, b) => b.area - a.area).map(({ area: _area, ...span }) => span);\n}\n","/**\n * Where a size is cut from a static ad's picture: the largest crop of the size's shape, at one\n * scale, placed so every face, animal and product stays whole and a person is cut only at the\n * bottom (feet before heads). Pure: sizes and boxes in, pixel rectangles out.\n *\n * The words model renders only its own ratios (GPT has no 4:5), so the cut also names the\n * smallest `render` rectangle of one of those ratios that holds the size: the model is shown\n * that, and the size is cut back out of what it returns.\n */\nimport type { SubjectBox } from \"./subject-boxes.ts\";\n\nexport type Size = { width: number; height: number };\nexport type PixelRect = { x: number; y: number; width: number; height: number };\n/** A rectangle as fractions of the frame, origin top-left. */\nexport type Span = { x0: number; y0: number; x1: number; y1: number };\n\nexport type SubjectCrop = {\n /** The size's crop of the picture, in its pixels. */\n rect: PixelRect;\n /** The rectangle the words model is shown: `rect` or a larger one of a ratio it renders, holding `rect`. */\n render: PixelRect & { ratio: string };\n /** False when no crop keeps every face, animal, product and the top of every person. */\n fits: boolean;\n /** The labels of what the crop cuts that must stay whole. */\n cut: string[];\n};\n\n/** Room kept around what must stay whole, as a share of the picture's side: a head never touches the edge. */\nconst SUBJECT_PAD = 0.02;\n\nfunction ratioOf(ratio: string): number {\n const [w, h] = ratio.split(\":\").map(Number);\n if (!w || !h || !Number.isFinite(w) || !Number.isFinite(h)) throw new Error(`not a W:H ratio: \"${ratio}\"`);\n return w / h;\n}\n\ntype Interval = { from: number; to: number };\n\nconst unionOf = (spans: readonly Interval[]): Interval | null =>\n spans.length === 0 ? null : { from: Math.min(...spans.map((s) => s.from)), to: Math.max(...spans.map((s) => s.to)) };\n\n/**\n * One axis: where a window of `length` starts in `full`, keeping `hard` inside it (padded when it\n * can be), the whole `soft` span when it fits and otherwise its start (what is lost goes at the\n * end: the feet). With nothing to keep it centres on `core`.\n */\nfunction placeAxis(\n full: number,\n length: number,\n hard: Interval | null,\n soft: Interval | null,\n core: Interval,\n): { at: number; fits: boolean } {\n const clampFull = (v: number) => Math.min(full - length, Math.max(0, v));\n const want = soft\n ? soft.to - soft.from <= length\n ? (soft.from + soft.to) / 2 - length / 2\n : soft.from - SUBJECT_PAD * full\n : (core.from + core.to) / 2 - length / 2;\n if (!hard) return { at: Math.round(clampFull(want)), fits: true };\n const pad = SUBJECT_PAD * full;\n for (const p of [pad, 0]) {\n const lo = Math.max(0, hard.to + p - length);\n const hi = Math.min(full - length, hard.from - p);\n if (lo <= hi + 1e-6) return { at: Math.round(Math.min(hi, Math.max(lo, want))), fits: true };\n }\n return { at: Math.round(clampFull((hard.from + hard.to) / 2 - length / 2)), fits: false };\n}\n\n/**\n * The size `format` cut from a picture of `plate` pixels around `subjects` (null or empty: centred\n * on `core`, the plan's subject zone, or the middle), and around the cards the picture draws for its\n * words (`panels`, fractions: `plate-panels.ts`) when a cut can keep them whole too; a card is never\n * what refuses a size. `renderRatios` are the ratios the words model renders; without them the render\n * rectangle is the crop.\n */\nexport function subjectCrop(\n plate: Size,\n format: string,\n subjects: readonly SubjectBox[] | null,\n opts: { core?: Span; renderRatios?: readonly string[]; panels?: readonly Span[] } = {},\n): SubjectCrop {\n const cards = (opts.panels ?? []).map((p): SubjectBox => ({ kind: \"product\", label: \"card\", ...p }));\n if (cards.length > 0) {\n const withCards = cropAround(plate, format, [...(subjects ?? []), ...cards], opts);\n if (withCards.fits) return withCards;\n }\n return cropAround(plate, format, subjects, opts);\n}\n\nfunction cropAround(\n plate: Size,\n format: string,\n subjects: readonly SubjectBox[] | null,\n opts: { core?: Span; renderRatios?: readonly string[] },\n): SubjectCrop {\n const r = ratioOf(format);\n let width = plate.width;\n let height = Math.round(plate.width / r);\n if (height > plate.height) {\n height = plate.height;\n width = Math.round(plate.height * r);\n }\n const boxes = subjects ?? [];\n const px = (b: SubjectBox): Interval => ({ from: b.x0 * plate.width, to: b.x1 * plate.width });\n const py = (b: SubjectBox): Interval => ({ from: b.y0 * plate.height, to: b.y1 * plate.height });\n // A person may lose their feet, never their head: only the top of their box must stay.\n const hardY = boxes.map((b) => (b.kind === \"person\" ? { from: py(b).from, to: py(b).from } : py(b)));\n const core = opts.core ?? { x0: 0, y0: 0, x1: 1, y1: 1 };\n const x = placeAxis(plate.width, width, unionOf(boxes.map(px)), unionOf(boxes.map(px)), {\n from: core.x0 * plate.width,\n to: core.x1 * plate.width,\n });\n const y = placeAxis(plate.height, height, unionOf(hardY), unionOf(boxes.map(py)), {\n from: core.y0 * plate.height,\n to: core.y1 * plate.height,\n });\n const rect = { x: x.at, y: y.at, width, height };\n const cut = boxes\n .filter((b, i) => {\n const hy = hardY[i] ?? py(b);\n return (\n px(b).from < rect.x - 0.5 ||\n px(b).to > rect.x + rect.width + 0.5 ||\n hy.from < rect.y - 0.5 ||\n hy.to > rect.y + rect.height + 0.5\n );\n })\n .map((b) => b.label);\n return { rect, render: renderRect(plate, rect, format, opts.renderRatios), fits: cut.length === 0, cut };\n}\n\n/**\n * The smallest rectangle of one of `ratios` that holds `rect` inside the picture, centred on it;\n * `rect` itself when its own ratio renders, when no ratio is given, or when none fits.\n */\nfunction renderRect(\n plate: Size,\n rect: PixelRect,\n format: string,\n ratios: readonly string[] | undefined,\n): PixelRect & { ratio: string } {\n if (!ratios || ratios.includes(format)) return { ...rect, ratio: format };\n const r = rect.width / rect.height;\n let best: (PixelRect & { ratio: string }) | null = null;\n for (const ratio of ratios) {\n const c = ratioOf(ratio);\n const width = c <= r ? rect.width : Math.round(rect.height * c);\n const height = c <= r ? Math.round(rect.width / c) : rect.height;\n if (width > plate.width || height > plate.height) continue;\n const place = (from: number, length: number, inner: number, full: number) =>\n Math.min(\n Math.min(from, full - length),\n Math.max(Math.max(0, from + inner - length), from - (length - inner) / 2),\n );\n const candidate = {\n x: Math.round(place(rect.x, width, rect.width, plate.width)),\n y: Math.round(place(rect.y, height, rect.height, plate.height)),\n width,\n height,\n ratio,\n };\n if (!best || width * height < best.width * best.height) best = candidate;\n }\n return best ?? { ...rect, ratio: format };\n}\n","/**\n * What was read off a picture, kept with it while it lives.\n *\n * A size's cut is judged against every render the words model makes for it, and a render refused\n * whole is lined up again to lift its words: the same reading of the same pixels, each time. The\n * pictures are never written to, so a reading is kept by the picture's identity and dropped with it.\n */\n\nconst ids = new WeakMap<object, number>();\nlet nextId = 0;\n\n/** A number standing for `picture` while it lives: the same picture, the same number. */\nexport function pictureId(picture: object): number {\n const known = ids.get(picture);\n if (known !== undefined) return known;\n const id = nextId++;\n ids.set(picture, id);\n return id;\n}\n\n/** A reading kept per picture and per `what` (everything else it depends on, spelled out). */\nexport function remembered<V>(): (picture: object, what: string, read: () => V) => V {\n const readings = new WeakMap<object, Map<string, V>>();\n return (picture, what, read) => {\n const known = readings.get(picture) ?? new Map<string, V>();\n readings.set(picture, known);\n const kept = known.get(what);\n if (kept !== undefined) return kept;\n const value = read();\n known.set(what, value);\n return value;\n };\n}\n","/**\n * The band or card a block of words sits on, as the words model laid it over the picture, and\n * that band moved with its words.\n *\n * Words the size's frame cuts or its app covers are moved by code on the words render\n * (`whole-render.ts`). Lifted off alone, words on a band left the band in pieces and the picture\n * showing through it (dev, Oct 2026). So a block on a band moves with its band, whole: where the\n * band was shows the picture again, or, along an edge of the frame the band ran to, more of the\n * band in its own look.\n *\n * Pure: raw RGB buffers and fractions in, buffers and fractions out.\n */\nimport type { Raw, Span } from \"./words-layer.ts\";\n\n/** How far around a block of words its ground is read, as a share of the frame's side. */\nconst GROUND_REACH = 0.06;\n/** A grey difference (levels) past which the render laid something over the picture there. */\nconst LAID = 24;\n/** A line of pixels laid over the picture past this share still runs across the band. */\nconst BAND_EDGE = 0.5;\n/** Past a band's edge the picture shows again at once: laid under this share (a soft glow fades out over it). */\nconst BAND_CLEAR = 0.1;\n/** How much of a band, card or pill is laid over the picture: a line of words alone covers far less of its box. */\nconst SOLID = 0.7;\n/** How deep past a band's edge the picture must show, as a share of the frame's longer side. */\nconst RING = 0.01;\n/** How deep a strip of the band along the edge it leaves shows its look, as a share of its depth. */\nconst LOOK_STRIP = 0.1;\n\n/** Where the render (lined up with the cut) laid something over the picture: 1 a pixel. */\nexport type LaidMap = { laid: Uint8Array; width: number; height: number };\n\n/** A half-open rectangle of pixels. */\ntype Rect = { x0: number; y0: number; x1: number; y1: number };\n\nconst greyAt = (img: Raw, i: number) =>\n 0.299 * (img.data[i * img.channels] ?? 0) +\n 0.587 * (img.data[i * img.channels + 1] ?? 0) +\n 0.114 * (img.data[i * img.channels + 2] ?? 0);\n\n/**\n * Where `aligned` is not `cut` in plain grey, no light taken out (a frosted band reads as light\n * otherwise): what the render laid over the picture. Pure.\n */\nexport function laidMap(aligned: Raw, cut: Raw): LaidMap {\n const { width, height } = cut;\n const laid = new Uint8Array(width * height);\n for (let i = 0; i < laid.length; i++) laid[i] = Math.abs(greyAt(aligned, i) - greyAt(cut, i)) > LAID ? 1 : 0;\n return { laid, width, height };\n}\n\nconst rectOf = (s: Span, width: number, height: number): Rect => ({\n x0: Math.floor(s.x0 * width),\n y0: Math.floor(s.y0 * height),\n x1: Math.ceil(s.x1 * width),\n y1: Math.ceil(s.y1 * height),\n});\n\n/** `r` inside a `width`×`height` frame. */\nconst clipped = (r: Rect, width: number, height: number): Rect => ({\n x0: Math.max(0, r.x0),\n y0: Math.max(0, r.y0),\n x1: Math.min(width, r.x1),\n y1: Math.min(height, r.y1),\n});\n\nconst holds = (r: Rect, x: number, y: number) => x >= r.x0 && x < r.x1 && y >= r.y0 && y < r.y1;\n\n/** How many pixels of `r` (inside the frame) are laid, of how many. */\nfunction laidIn(m: LaidMap, r: Rect): { laid: number; area: number } {\n const c = clipped(r, m.width, m.height);\n let laid = 0;\n for (let y = c.y0; y < c.y1; y++) for (let x = c.x0; x < c.x1; x++) laid += m.laid[y * m.width + x] ?? 0;\n return { laid, area: Math.max(0, c.x1 - c.x0) * Math.max(0, c.y1 - c.y0) };\n}\n\n/** The share of `r` laid over the picture; 0 for a rectangle outside the frame. */\nfunction share(m: LaidMap, r: Rect): number {\n const { laid, area } = laidIn(m, r);\n return area > 0 ? laid / area : 0;\n}\n\n/**\n * The share of the ring around the block `box` (fractions), out to `GROUND_REACH` past it, the\n * render laid something over: high for words on a band or card (opaque or frosted), a few\n * hundredths for words on a soft glow, none for words set on the picture itself. Pure.\n */\nexport function laidAround(m: LaidMap, box: Span): number {\n const reach = {\n x0: box.x0 - GROUND_REACH,\n y0: box.y0 - GROUND_REACH,\n x1: box.x1 + GROUND_REACH,\n y1: box.y1 + GROUND_REACH,\n };\n const outer = laidIn(m, rectOf(reach, m.width, m.height));\n const inner = laidIn(m, rectOf(box, m.width, m.height));\n const ring = outer.area - inner.area;\n return ring > 0 ? (outer.laid - inner.laid) / ring : 0;\n}\n\n/** The line of pixels just past side `side` of `r`, `depth` deep. */\nfunction past(r: Rect, side: number, depth: number): Rect {\n if (side === 0) return { ...r, y0: r.y0 - depth, y1: r.y0 };\n if (side === 1) return { ...r, y0: r.y1, y1: r.y1 + depth };\n if (side === 2) return { ...r, x0: r.x0 - depth, x1: r.x0 };\n return { ...r, x0: r.x1, x1: r.x1 + depth };\n}\n\n/** `r` one pixel larger on `side`. */\nfunction grown(r: Rect, side: number): Rect {\n if (side === 0) return { ...r, y0: r.y0 - 1 };\n if (side === 1) return { ...r, y1: r.y1 + 1 };\n if (side === 2) return { ...r, x0: r.x0 - 1 };\n return { ...r, x1: r.x1 + 1 };\n}\n\nconst atFrameEdge = (m: LaidMap, r: Rect, side: number) =>\n side === 0 ? r.y0 <= 0 : side === 1 ? r.y1 >= m.height : side === 2 ? r.x0 <= 0 : r.x1 >= m.width;\n\n/**\n * The band, card or pill (fractions) the block `box` sits on: grown out of the block while the\n * line past each side is laid over the picture. Null when nothing surrounds the block (words set\n * on the picture itself: no side grew short of the frame's edge), or when the picture does not\n * show again past every edge inside the frame, as nobody can tell where the band ends. Pure.\n */\nexport function bandUnder(m: LaidMap, box: Span): Span | null {\n const block = clipped(rectOf(box, m.width, m.height), m.width, m.height);\n // Grown from the middle of the line: a button's box is drawn past its words, and can reach past its pill.\n const inset = Math.min(Math.floor((block.y1 - block.y0) / 4), Math.floor((block.x1 - block.x0 - 1) / 2));\n const start = { x0: block.x0 + inset, y0: block.y0 + inset, x1: block.x1 - inset, y1: block.y1 - inset };\n let r = start;\n for (let grew = true; grew; ) {\n grew = false;\n for (let side = 0; side < 4; side++) {\n if (atFrameEdge(m, r, side) || share(m, past(r, side, 1)) < BAND_EDGE) continue;\n r = grown(r, side);\n grew = true;\n }\n }\n const outgrown = [r.y0 < start.y0, r.y1 > start.y1, r.x0 < start.x0, r.x1 > start.x1];\n const depth = Math.max(2, Math.round(RING * Math.max(m.width, m.height)));\n for (let side = 0; side < 4; side++) {\n if (!(outgrown[side] || atFrameEdge(m, r, side)) || share(m, past(r, side, depth)) >= BAND_CLEAR) return null;\n }\n // A line of words alone covers far less of its box than a band, card or pill does.\n if (share(m, r) < SOLID) return null;\n return { x0: r.x0 / m.width, y0: r.y0 / m.height, x1: r.x1 / m.width, y1: r.y1 / m.height };\n}\n\n/** A band (fractions of the render), how far it moves (fractions), and the lines it carries. */\nexport type BandMove = { band: Span; dx: number; dy: number; words: readonly Span[] };\n\n/** What a band is moved on: the render lined up, the cut, and the size so far. */\nexport type BandGround = { aligned: Raw; cut: Raw; out: Raw };\n\n/** A band's look on one channel, as a tone of the picture under it: `a` times the picture plus `b`. */\ntype Tone = { a: number; b: number };\n\n/** Sums for a line fit of the render's channel `ch` on the picture's, over `strip` outside `skip`. */\nfunction sumsOf(g: BandGround, strip: Rect, skip: readonly Rect[], ch: number) {\n const { width } = g.cut;\n const sums = { n: 0, x: 0, y: 0, xx: 0, xy: 0 };\n for (let y = strip.y0; y < strip.y1; y++) {\n for (let x = strip.x0; x < strip.x1; x++) {\n if (skip.some((r) => holds(r, x, y))) continue;\n const i = y * width + x;\n const u = g.cut.data[i * g.cut.channels + ch] ?? 0;\n const v = g.aligned.data[i * g.aligned.channels + ch] ?? 0;\n sums.n++;\n sums.x += u;\n sums.y += v;\n sums.xx += u * u;\n sums.xy += u * v;\n }\n }\n return sums;\n}\n\n/**\n * The tone that best gives the band's pixels in `strip` from the picture's under them (least\n * squares, per channel), its words (`skip`) left out: flat for a solid band, a faint picture for a\n * frosted one.\n */\nfunction toneOf(g: BandGround, strip: Rect, skip: readonly Rect[]): Tone[] {\n const c = clipped(strip, g.cut.width, g.cut.height);\n return [0, 1, 2].map((ch) => {\n const s = sumsOf(g, c, skip, ch);\n if (s.n === 0) return { a: 0, b: 0 };\n const spread = s.xx - (s.x * s.x) / s.n;\n const a = spread > s.n ? Math.min(1, Math.max(0, (s.xy - (s.x * s.y) / s.n) / spread)) : 0;\n return { a, b: (s.y - a * s.x) / s.n };\n });\n}\n\n/** How deep past a band the render's light is read, as a share of the frame's height. */\nconst LIGHT_DEPTH = 0.02;\n\n/** The picture just past `r` on the side it leaves when it moves by (`dx`, `dy`) pixels. */\nfunction ringPast(r: Rect, dx: number, dy: number, depth: number): Rect {\n if (dy < 0) return { ...r, y0: r.y1, y1: r.y1 + depth };\n if (dy > 0) return { ...r, y0: r.y0 - depth, y1: r.y0 };\n if (dx < 0) return { ...r, x0: r.x1, x1: r.x1 + depth };\n return { ...r, x0: r.x0 - depth, x1: r.x0 };\n}\n\n/**\n * The render's light over the picture's on `ring`, per channel (the median ratio): read on the\n * picture beside a band, since under it the band is all there is to read.\n */\nfunction lightOn(g: BandGround, ring: Rect): number[] {\n const { width, height } = g.cut;\n const c = clipped(ring, width, height);\n return [0, 1, 2].map((ch) => {\n const ratios: number[] = [];\n for (let y = c.y0; y < c.y1; y++) {\n for (let x = c.x0; x < c.x1; x++) {\n const i = y * width + x;\n const under = g.cut.data[i * g.cut.channels + ch] ?? 0;\n if (under >= 16) ratios.push((g.aligned.data[i * g.aligned.channels + ch] ?? 0) / under);\n }\n }\n ratios.sort((a, b) => a - b);\n return Math.min(2, Math.max(0.5, ratios[Math.floor(ratios.length / 2)] ?? 1));\n });\n}\n\n/**\n * Along the side the band leaves when it moves by (`dx`, `dy`) pixels, when it ran to the frame's\n * edge there across the whole frame: `strip`, the band's own pixels along that edge, whose look is\n * laid on `zone`, what it leaves. Null when the band leaves no edge of the frame behind.\n */\nfunction edgeLeft(r: Rect, dx: number, dy: number, width: number, height: number): { strip: Rect; zone: Rect } | null {\n const deep = Math.max(1, Math.round(LOOK_STRIP * (r.y1 - r.y0)));\n const wide = Math.max(1, Math.round(LOOK_STRIP * (r.x1 - r.x0)));\n // Two pixels short of the edge is on it: the band is found on half the pixels. A card the frame\n // cut is no band running off it: where it was shows the picture.\n const across = r.x0 <= 2 && r.x1 >= width - 2;\n const down = r.y0 <= 2 && r.y1 >= height - 2;\n if (dy < 0 && across && r.y1 >= height - 2)\n return { strip: { ...r, y0: r.y1 - deep }, zone: { ...r, y0: r.y1 + dy } };\n if (dy > 0 && across && r.y0 <= 2) return { strip: { ...r, y1: r.y0 + deep }, zone: { ...r, y1: r.y0 + dy } };\n if (dx < 0 && down && r.x1 >= width - 2) return { strip: { ...r, x0: r.x1 - wide }, zone: { ...r, x0: r.x1 + dx } };\n if (dx > 0 && down && r.x0 <= 2) return { strip: { ...r, x1: r.x0 + wide }, zone: { ...r, x1: r.x0 + dx } };\n return null;\n}\n\n/** How far into a band's corner its rounding is looked for, as a share of its shorter side. */\nconst CORNER = 0.5;\n\n/** A corner of a band's box: where it is (box pixels), which way the box runs from it, and whether it can be rounded. */\ntype Corner = { x: number; y: number; sx: number; sy: number; open: boolean };\n\n/** Takes out of `shape` (`w` wide) the bare pixels (`bare`) reached from corner `c`, within `reach` of it. */\nfunction floodCorner(shape: Uint8Array, w: number, c: Corner, reach: number, bare: (x: number, y: number) => boolean) {\n const near = (x: number, y: number) =>\n (x - c.x) * c.sx >= 0 && (x - c.x) * c.sx < reach && (y - c.y) * c.sy >= 0 && (y - c.y) * c.sy < reach;\n shape[c.y * w + c.x] = 0;\n const stack = [c.y * w + c.x];\n for (let at = stack.pop(); at !== undefined; at = stack.pop()) {\n const x = at % w;\n const y = (at - x) / w;\n for (const [nx, ny] of [\n [x + 1, y],\n [x - 1, y],\n [x, y + 1],\n [x, y - 1],\n ] as const) {\n if (!near(nx, ny) || shape[ny * w + nx] === 0 || !bare(nx, ny)) continue;\n shape[ny * w + nx] = 0;\n stack.push(ny * w + nx);\n }\n }\n}\n\n/**\n * Which pixels of `r` (1 a pixel, row by row) are the band: all but what its rounded corners leave\n * of the picture, the pixels the render laid nothing over reached from a corner without crossing\n * the band. A corner on the frame's edge is no corner: the band runs on past it.\n */\nfunction shapeOf(g: BandGround, r: Rect): Uint8Array {\n const w = r.x1 - r.x0;\n const h = r.y1 - r.y0;\n const shape = new Uint8Array(Math.max(0, w * h)).fill(1);\n if (w <= 0 || h <= 0) return shape;\n const reach = Math.floor(CORNER * Math.min(w, h));\n const bare = (x: number, y: number) => {\n const i = (r.y0 + y) * g.cut.width + r.x0 + x;\n return Math.abs(greyAt(g.aligned, i) - greyAt(g.cut, i)) <= LAID;\n };\n const corners: Corner[] = [\n { x: 0, y: 0, sx: 1, sy: 1, open: r.x0 > 0 && r.y0 > 0 },\n { x: w - 1, y: 0, sx: -1, sy: 1, open: r.x1 < g.cut.width && r.y0 > 0 },\n { x: 0, y: h - 1, sx: 1, sy: -1, open: r.x0 > 0 && r.y1 < g.cut.height },\n { x: w - 1, y: h - 1, sx: -1, sy: -1, open: r.x1 < g.cut.width && r.y1 < g.cut.height },\n ];\n for (const c of corners) if (c.open && bare(c.x, c.y)) floodCorner(shape, w, c, reach, bare);\n return shape;\n}\n\n/** Each pixel (`x`, `y`) of `r` that `shape` marks as the band. */\nfunction eachOf(r: Rect, shape: Uint8Array, at: (x: number, y: number) => void): void {\n const w = r.x1 - r.x0;\n for (let k = 0; k < shape.length; k++) if (shape[k]) at(r.x0 + (k % w), r.y0 + Math.floor(k / w));\n}\n\n/** How far past a band's box its soft edge reaches (the antialiased line the box stops short of), as a share of the frame's longer side. */\nconst SOFT_EDGE = 0.003;\n\n/** Each pixel (`x`, `y`) of `r`. */\nfunction eachIn(r: Rect, at: (x: number, y: number) => void): void {\n for (let y = r.y0; y < r.y1; y++) for (let x = r.x0; x < r.x1; x++) at(x, y);\n}\n\n/**\n * `g.out` with the band `move.band` moved by (`move.dx`, `move.dy`), the words on it with it: the\n * band's pixels are the render's (its rounded corners leave the picture beside them where it is,\n * `shapeOf`), and where it was and is no longer, its soft edge and corners included, shows the\n * picture under it in the render's light read beside it (`lightOn`), or, when the band ran to an\n * edge of the frame it now leaves, more of the band in its own look (a tone of the picture under it,\n * so a frosted band stays frosted). Pure.\n */\nexport function moveBand(g: BandGround, move: BandMove): Raw {\n const { width, height } = g.cut;\n const r = clipped(rectOf(move.band, width, height), width, height);\n const soft = Math.max(1, Math.round(SOFT_EDGE * Math.max(width, height)));\n const left = clipped({ x0: r.x0 - soft, y0: r.y0 - soft, x1: r.x1 + soft, y1: r.y1 + soft }, width, height);\n const dx = Math.round(move.dx * width);\n const dy = Math.round(move.dy * height);\n const data = Buffer.alloc(width * height * 3);\n if (g.out.channels === 3) g.out.data.copy(data, 0, 0, width * height * 3);\n else\n for (let i = 0; i < width * height; i++) g.out.data.copy(data, i * 3, i * g.out.channels, i * g.out.channels + 3);\n const shape = shapeOf(g, r);\n const edge = edgeLeft(r, dx, dy, width, height);\n const tone = edge\n ? toneOf(\n g,\n edge.strip,\n move.words.map((w) => rectOf(w, width, height)),\n )\n : [];\n const light = lightOn(g, ringPast(left, dx, dy, Math.max(4, Math.round(LIGHT_DEPTH * height))));\n eachIn(left, (x, y) => {\n const i = y * width + x;\n const band = edge !== null && holds(edge.zone, x, y);\n for (let ch = 0; ch < 3; ch++) {\n const under = g.cut.data[i * g.cut.channels + ch] ?? 0;\n const t = tone[ch] ?? { a: 0, b: 0 };\n const v = band ? t.a * under + t.b : under * (light[ch] ?? 1);\n data[i * 3 + ch] = Math.max(0, Math.min(255, Math.round(v)));\n }\n });\n eachOf(r, shape, (x, y) => {\n const to = { x: x + dx, y: y + dy };\n if (to.x < 0 || to.y < 0 || to.x >= width || to.y >= height) return;\n const from = y * width + x;\n g.aligned.data.copy(data, (to.y * width + to.x) * 3, from * g.aligned.channels, from * g.aligned.channels + 3);\n });\n return { data, width, height, channels: 3 };\n}\n","/**\n * The correction that brings a finished 9:16's words and logo inside the band Stories and\n * Reels leave clear, without asking the image model again: shrink the whole picture a little\n * and shift it, then carry its plain edge into the uncovered margin (never a busy one).\n *\n * Why here and not in a re-render: the image model cannot move an element by a few points on\n * request (a `--fix` asking for \"8% up\" moved it about 1%), and agents looped 2-17 renders on\n * it. `planSafeFit` is pure; `fitPicture` only transforms bytes.\n */\nimport sharp from \"sharp\";\nimport {\n blockingArea,\n blockingPlacements,\n type RightRail,\n type SafeArea,\n} from \"../../../scaffold/platform-safe-area.ts\";\nimport { bandViolations, FRAME_CUT } from \"./band-check.ts\";\nimport {\n boxesOfLine,\n buttonShape,\n type CopyLine,\n isButtonLine,\n roleKey,\n shownBoxes,\n withWordmark,\n} from \"./must-show.ts\";\nimport type { TextBox } from \"./text-boxes.ts\";\n\n/**\n * How far inside the band the fit aims, on every side: the reader draws its boxes a little\n * differently on each read, and the run review reads the fitted picture again.\n */\nexport const FIT_HEADROOM = 0.01;\n\n/**\n * The smallest scale a fit takes. Measured on the 20 cached bench 9:16s: a shrink to 0.85 or\n * more, its margin filled from the picture's own edge under a feathered seam, still looked like\n * the picture as rendered; below it the filled edges show. 19 of 20 cleared\n * the Reels band at 0.82 or more, most at 0.93 or more.\n */\nexport const MIN_FIT_SCALE = 0.85;\n\n/**\n * The smallest scale a fit takes on a flat ground (`minFitScale`). Prod, Oct 2026: of 40 9:16s in\n * one Session, 33 needed more than `MIN_FIT_SCALE`; flat-cream ones laid out from 12% to 94% of the\n * height cleared Reels at 0.70, their margins carried from the edge the ad's own ground with no\n * seam to see. 0.65 leaves room for the reader drawing its boxes a little looser on another read.\n */\nexport const MIN_FLAT_FIT_SCALE = 0.65;\n\n/** Where the shrunk picture goes: its scale, and its top-left corner as fractions of the frame. */\nexport type SafeFit = { scale: number; x: number; y: number };\n\n/**\n * The boxes a fit moves the ad for. Given the ad's copy, only its logo and the copy that must be\n * seen (`must-show.ts`): never what the scene prints, a line printed again in it, or a supporting\n * line an interface covers (one the frame cuts is placed). Without it (a canvas from before), every box read.\n */\nexport function boxesToPlace(\n boxes: readonly TextBox[],\n format: string,\n opts: { placements?: readonly string[]; copy?: readonly CopyLine[] } = {},\n): TextBox[] {\n if (!opts.copy) return [...boxes];\n const placements = blockingPlacements(opts.placements);\n const past = (box: TextBox) => bandViolations([box], format, { placements })[0];\n // A supporting line the frame cuts is lost all the same: the review blocks it, so it is placed.\n const cut = (box: TextBox) => (past(box)?.clearance ?? 1) <= FRAME_CUT;\n const logoWords = opts.copy.filter((l) => roleKey(l.role) === \"logo\").map((l) => l.text);\n const read = withWordmark(boxes, logoWords);\n // A button is placed by its shape, as the review judges it: its words alone can stand clear of an edge it sits on.\n const buttons = new Set(opts.copy.filter(isButtonLine).flatMap((line) => boxesOfLine(line, read)));\n return shownBoxes(read, opts.copy, (box) => !past(box))\n .filter((shown) => !shown.supporting || cut(shown.box))\n .map((shown) => (buttons.has(shown.box) ? buttonShape(shown.box) : shown.box));\n}\n\n/**\n * Where a fit lands the boxes: inside what the placements' interfaces really draw over (`covered`,\n * Reels' buttons included), the line the review blocks at, and the band's margin at the sides. A\n * feed size, which nothing covers, keeps its band.\n */\nfunction targetArea(format: string, placements?: readonly string[]): SafeArea & { rail?: RightRail } {\n const area = blockingArea(format, placements);\n const covered = area.covered;\n if (!covered) return area;\n return { ...area, top: covered.top, bottom: covered.bottom, ...(covered.rail ? { rail: covered.rail } : {}) };\n}\n\n/**\n * The fit that clears `format`'s band for `placements`, or null when nothing reaches past it or\n * clearing it would take a shrink below `minScale` (`MIN_FIT_SCALE` unless given: a fit whose\n * margins are painted, not carried from the edge, may go further).\n */\nexport function planSafeFit(\n boxes: readonly TextBox[],\n format: string,\n opts: { placements?: readonly string[]; minScale?: number; contain?: boolean } = {},\n): SafeFit | null {\n const area = targetArea(format, opts.placements);\n // Checked as the review checks it: only what an interface draws over, or the frame cuts, blocks.\n const violations = bandViolations(boxes, format, { placements: blockingPlacements(opts.placements) });\n if (!violations.some((v) => v.covered || v.clearance <= FRAME_CUT)) return null;\n // A line that reaches down beside the buttons keeps clear of them: the whole picture is fitted inside.\n const rail = area.rail && boxes.some((b) => b.y1 > (area.rail?.from ?? 1)) ? area.rail.width : 0;\n const union = {\n x0: Math.min(...boxes.map((b) => b.x0)),\n y0: Math.min(...boxes.map((b) => b.y0)),\n x1: Math.max(...boxes.map((b) => b.x1)),\n y1: Math.max(...boxes.map((b) => b.y1)),\n };\n const band = {\n x0: area.left + FIT_HEADROOM,\n y0: area.top + FIT_HEADROOM,\n x1: 1 - Math.max(area.right, rail) - FIT_HEADROOM,\n y1: 1 - area.bottom - FIT_HEADROOM,\n };\n const scale = Math.min(1, (band.y1 - band.y0) / (union.y1 - union.y0), (band.x1 - band.x0) / (union.x1 - union.x0));\n if (opts.contain) return containedFit(union, band, opts.minScale ?? MIN_FIT_SCALE, scale);\n if (scale < (opts.minScale ?? MIN_FIT_SCALE)) return null;\n return {\n scale,\n x: offset(scale, union.x0, union.x1, band.x0, band.x1),\n y: offset(scale, union.y0, union.y1, band.y0, band.y1),\n };\n}\n\n/** How finely `containedFit` steps the scale down. */\nconst CONTAIN_STEP = 0.005;\n\ntype Span = { x0: number; y0: number; x1: number; y1: number };\n\n/**\n * The largest fit, from `from` down to `minScale`, that lands the boxes' `union` inside `band`\n * with the whole picture inside the frame: nothing of it shifted off an edge, its margins all\n * painted. Each axis starts where the picture moves least from where it was. Null when none does.\n */\nfunction containedFit(union: Span, band: Span, minScale: number, from: number): SafeFit | null {\n const start = (scale: number, lo0: number, hi0: number, b0: number, b1: number): number | null => {\n const lo = Math.max(0, b0 - scale * lo0);\n const hi = Math.min(1 - scale, b1 - scale * hi0);\n if (lo > hi + 1e-9) return null;\n // Anchored where it was when it can be (an edge-to-edge picture keeps its top), else nearest.\n return Math.min(hi, Math.max(lo, 0));\n };\n for (let scale = Math.min(1, from); scale >= minScale - 1e-9; scale -= CONTAIN_STEP) {\n const x = start(scale, union.x0, union.x1, band.x0, band.x1);\n const y = start(scale, union.y0, union.y1, band.y0, band.y1);\n if (x !== null && y !== null) {\n // Centred across: a picture shrunk on both sides reads as the same picture, not pushed aside.\n const cx = Math.min(\n Math.min(1 - scale, band.x1 - scale * union.x1),\n Math.max(Math.max(0, band.x0 - scale * union.x0), (1 - scale) / 2),\n );\n return { scale, x: cx, y };\n }\n }\n return null;\n}\n\n/**\n * Where the shrunk picture starts on one axis: centred, unless that leaves the boxes' span\n * outside the band, then the nearest start that puts it inside (the middle of the range when\n * no start does).\n */\nfunction offset(scale: number, from: number, to: number, bandFrom: number, bandTo: number): number {\n const lo = bandFrom - scale * from;\n const hi = bandTo - scale * to;\n if (lo > hi) return (lo + hi) / 2;\n return Math.min(hi, Math.max(lo, (1 - scale) / 2));\n}\n\n/** How deep into the picture an edge must stay the same to be carried on, as a share of the frame's side. */\nconst PLAIN_DEPTH = 0.03;\n/** The most a pixel may differ from the one at the edge, over that depth, summed over its channels. */\nconst PLAIN_DEPTH_STEP = 36;\n/** A jump along the edge this large (summed over channels) is one thing's border crossing it. */\nconst PLAIN_JUMP = 60;\n/** The most borders an edge may cross and still read as plain ground: a two-tone split, never a row of cards. */\nconst PLAIN_JUMPS = 2;\n\nexport type Raw = { data: Buffer; width: number; height: number; channels: number };\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/**\n * How many borders cross the picture's `side`, or null when it does not look the same\n * `PLAIN_DEPTH` in as at the edge. Pure.\n */\nfunction edgeBorders(img: Raw, side: Side): number | null {\n const along = side === \"top\" || side === \"bottom\" ? img.width : img.height;\n const across = side === \"top\" || side === \"bottom\" ? img.height : img.width;\n const depth = Math.max(1, Math.round(PLAIN_DEPTH * across));\n const at = (i: number, d: number) => {\n const inward = side === \"top\" || side === \"left\" ? d : across - 1 - d;\n const [x, y] = side === \"top\" || side === \"bottom\" ? [i, inward] : [inward, i];\n return (y * img.width + x) * img.channels;\n };\n const step = (a: number, b: number) => {\n let sum = 0;\n for (let c = 0; c < Math.min(3, img.channels); c++)\n sum += Math.abs((img.data[a + c] ?? 0) - (img.data[b + c] ?? 0));\n return sum;\n };\n let jumps = 0;\n for (let i = 0; i < along; i++) {\n for (let d = 1; d <= depth; d++) if (step(at(i, 0), at(i, d)) > PLAIN_DEPTH_STEP) return null;\n if (i > 0 && step(at(i - 1, 0), at(i, 0)) > PLAIN_JUMP) jumps++;\n }\n return jumps;\n}\n\n/**\n * Whether the picture's `side` is plain ground that can be carried outward unchanged: it looks\n * the same `PLAIN_DEPTH` in as at the edge, and at most `PLAIN_JUMPS` borders cross it. Pure.\n */\nexport function plainEdge(img: Raw, side: Side): boolean {\n const borders = edgeBorders(img, side);\n return borders !== null && borders <= PLAIN_JUMPS;\n}\n\n/**\n * The smallest scale a fit of `image` takes: `MIN_FLAT_FIT_SCALE` when every edge is one flat\n * ground no border crosses, so whatever margin the shrink uncovers is that same ground;\n * `MIN_FIT_SCALE` otherwise.\n */\nexport async function minFitScale(image: Buffer): Promise<number> {\n const { data, info } = await sharp(image).removeAlpha().raw().toBuffer({ resolveWithObject: true });\n const raw: Raw = { data, width: info.width, height: info.height, channels: info.channels };\n const flat = ([\"top\", \"bottom\", \"left\", \"right\"] as const).every((side) => edgeBorders(raw, side) === 0);\n return flat ? MIN_FLAT_FIT_SCALE : MIN_FIT_SCALE;\n}\n\n/**\n * `image` with `fit` applied, at the same pixel size: the picture shrunk (Lanczos) and set\n * with its top-left at (`x`, `y`) of the frame, what falls off the frame cut, and each margin\n * it uncovers filled by carrying its edge on, or null when an edge it would carry is not plain\n * ground. Tier 1, Oct 2026: a margin filled from a busy edge, mirrored and blurred, read as \"a\n * blurred duplicate\" and \"the faded thing at the bottom\", worse than a line Reels covers. PNG out.\n */\nexport async function fitPicture(image: Buffer, fit: SafeFit): Promise<Buffer | null> {\n const { width = 0, height = 0 } = await sharp(image).metadata();\n const sw = Math.max(1, Math.round(width * fit.scale));\n const sh = Math.max(1, Math.round(height * fit.scale));\n const px = Math.round(fit.x * width);\n const py = Math.round(fit.y * height);\n // The part of the shrunk picture that lands on the frame.\n const left = Math.max(0, -px);\n const top = Math.max(0, -py);\n const w = Math.min(sw, width - px) - left;\n const h = Math.min(sh, height - py) - top;\n const shrunk = await sharp(image)\n .removeAlpha()\n .resize(sw, sh, { fit: \"fill\", kernel: \"lanczos3\" })\n .extract({ left, top, width: w, height: h })\n .raw()\n .toBuffer({ resolveWithObject: true });\n const pad = { left: Math.max(0, px), top: Math.max(0, py) };\n const extend = { ...pad, right: width - pad.left - w, bottom: height - pad.top - h };\n const raw: Raw = { data: shrunk.data, width: w, height: h, channels: shrunk.info.channels };\n const sides = ([\"top\", \"bottom\", \"left\", \"right\"] as const).filter((side) => extend[side] > 0);\n if (!sides.every((side) => plainEdge(raw, side))) return null;\n return sharp(shrunk.data, { raw: { width: w, height: h, channels: shrunk.info.channels } })\n .extend({ ...extend, extendWith: \"copy\" })\n .png()\n .toBuffer();\n}\n","/**\n * The words a size's edit set, lifted off the model's render and laid on the size's cut of the\n * picture, with nothing else of the render kept.\n *\n * The words model redraws the whole frame, a few pixels off and a little different everywhere.\n * So code lines the render up with the cut (`registerToSource`), keeps only what changed at the\n * designed words, logo and button (`wordsLayer`), and composes that on the cut (`compose`): the\n * rest of the size is the picture's own pixels, which `identityOutside` proves. A face is never\n * replaced by the model's pixels; a scrim or card over it only darkens or tints it (a gain).\n *\n * Pure: raw RGB buffers and fractions in, buffers and numbers out.\n */\nimport { blockingArea, blockingPlacements } from \"../../../scaffold/platform-safe-area.ts\";\nimport { bandViolations } from \"./band-check.ts\";\nimport { pictureId, remembered } from \"./picture-memo.ts\";\nimport { FIT_HEADROOM } from \"./safe-fit.ts\";\nimport type { TextBox } from \"./text-boxes.ts\";\n\nexport type Raw = { data: Buffer; width: number; height: number; channels: number };\n/** A rectangle as fractions of the frame, origin top-left. */\nexport type Span = { x0: number; y0: number; x1: number; y1: number };\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** How the render maps onto the cut: render(c + scale·(p − c) + d) is the cut's p, `c` the frame's centre, d in pixels. */\nexport type Registration = { scale: number; dx: number; dy: number; residual: number };\n\n/** A grey picture; `flat`, where it has no texture of its own (a band, a card laid over the picture). */\ntype Gray = { data: Float32Array; width: number; height: number; flat?: Uint8Array };\n\nconst inSpans = (spans: readonly Span[], fx: number, fy: number) =>\n spans.some((s) => fx >= s.x0 && fx <= s.x1 && fy >= s.y0 && fy <= s.y1);\n\n/** Which of `size` pixels along one axis have their centre in [lo, hi], as `inSpans` reads it (1). */\nfunction centresIn(lo: number, hi: number, size: number): Uint8Array {\n const inside = new Uint8Array(size);\n for (let t = 0; t < size; t++) {\n const f = (t + 0.5) / size;\n inside[t] = f >= lo && f <= hi ? 1 : 0;\n }\n return inside;\n}\n\n/** The pixels of a `width`×`height` frame whose centre `inSpans` puts in one of `spans` (1), row-major. */\nfunction spanMask(spans: readonly Span[], width: number, height: number): Uint8Array {\n const mask = new Uint8Array(width * height);\n for (const s of spans) {\n const across = centresIn(s.x0, s.x1, width);\n const down = centresIn(s.y0, s.y1, height);\n for (let y = 0; y < height; y++) {\n if (down[y]) for (let x = 0; x < width; x++) mask[y * width + x] ||= across[x] ?? 0;\n }\n }\n return mask;\n}\n\n/** The four pixels around (u, v), clamped inside a `width`×`height` frame, and their bilinear weights. */\nfunction taps(u: number, v: number, width: number, height: number): { at: number[]; w: number[] } {\n const x = Math.min(width - 1, Math.max(0, u));\n const y = Math.min(height - 1, Math.max(0, v));\n const x0 = Math.floor(x);\n const y0 = Math.floor(y);\n const x1 = Math.min(width - 1, x0 + 1);\n const y1 = Math.min(height - 1, y0 + 1);\n const fx = x - x0;\n const fy = y - y0;\n return {\n at: [y0 * width + x0, y0 * width + x1, y1 * width + x0, y1 * width + x1],\n w: [(1 - fx) * (1 - fy), fx * (1 - fy), (1 - fx) * fy, fx * fy],\n };\n}\n\n/** The weighted sum of `values` at `t`'s pixels, `stride` values a pixel, channel `c`. */\nfunction tapped(values: ArrayLike<number>, t: { at: number[]; w: number[] }, stride = 1, c = 0, missing = 0): number {\n let sum = 0;\n for (let k = 0; k < 4; k++) sum += (t.w[k] ?? 0) * (values[(t.at[k] ?? 0) * stride + c] ?? missing);\n return sum;\n}\n\nfunction grayOf(img: Raw): Gray {\n const data = new Float32Array(img.width * img.height);\n for (let i = 0; i < data.length; i++) {\n const o = i * img.channels;\n data[i] = 0.299 * (img.data[o] ?? 0) + 0.587 * (img.data[o + 1] ?? 0) + 0.114 * (img.data[o + 2] ?? 0);\n }\n return { data, width: img.width, height: img.height };\n}\n\n/** `g` averaged down by a whole factor so its long edge is at most `edge`. */\nfunction shrink(g: Gray, edge: number): Gray {\n const f = Math.max(1, Math.ceil(Math.max(g.width, g.height) / edge));\n if (f === 1) return g;\n const width = Math.floor(g.width / f);\n const height = Math.floor(g.height / f);\n const data = new Float32Array(width * height);\n for (let i = 0; i < width * height; i++) {\n const x = (i % width) * f;\n const y = Math.floor(i / width) * f;\n let sum = 0;\n for (let j = 0; j < f; j++) {\n const row = (y + j) * g.width + x;\n for (let k = 0; k < f; k++) sum += g.data[row + k] ?? 0;\n }\n data[i] = sum / (f * f);\n }\n return { data, width, height };\n}\n\ntype Candidate = { scale: number; dx: number; dy: number };\n\n/** The most pixels a level is judged on: past it every other row and column, which lines up as well. */\nconst JUDGED_MAX = 20_000;\n\n/** The pixels a level is judged on, row by row: each with its column, and where each row's run starts (`rows`, then `starts`). */\ntype Judged = { at: Int32Array; xs: Int32Array; rows: Int32Array; starts: Int32Array };\n\n/** The pixels a level is judged on: off the edges a shift may reach into, and outside `exclude`. */\nfunction judgedPixels(g: Gray, exclude: readonly Span[]): Judged {\n const mx = Math.ceil(g.width * 0.04);\n const my = Math.ceil(g.height * 0.04);\n const step = g.width * g.height > JUDGED_MAX ? 2 : 1;\n const out: number[] = [];\n for (let i = 0; i < g.width * g.height; i++) {\n const x = i % g.width;\n const y = Math.floor(i / g.width);\n if (x % step !== 0 || y % step !== 0) continue;\n if (x < mx || y < my || x >= g.width - mx || y >= g.height - my) continue;\n if (!inSpans(exclude, x / g.width, y / g.height)) out.push(i);\n }\n const rows: number[] = [];\n const starts: number[] = [];\n out.forEach((i, j) => {\n const y = Math.floor(i / g.width);\n if (rows[rows.length - 1] === y) return;\n rows.push(y);\n starts.push(j);\n });\n starts.push(out.length);\n return {\n at: Int32Array.from(out),\n xs: Int32Array.from(out, (i) => i % g.width),\n rows: Int32Array.from(rows),\n starts: Int32Array.from(starts),\n };\n}\n\n/**\n * Where each of `count` cut pixels along one axis lands on a render `size` long, mapped to\n * `origin + scale·t`: the nearest render pixel, and the pixel before it and how far past it for a\n * bilinear read clamped inside the render. One axis at a time, since a candidate maps each column\n * and each row on its own.\n */\ntype Axis = { near: Int32Array; at: Int32Array; frac: Float64Array };\n\nfunction axisOf(origin: number, scale: number, count: number, size: number): Axis {\n const near = new Int32Array(count);\n const at = new Int32Array(count);\n const frac = new Float64Array(count);\n for (let t = 0; t < count; t++) {\n const p = origin + scale * t;\n near[t] = Math.min(size - 1, Math.max(0, Math.round(p)));\n const q = Math.min(size - 1.001, Math.max(0, p));\n at[t] = q | 0;\n frac[t] = q - (at[t] ?? 0);\n }\n return { near, at, frac };\n}\n\n/**\n * A pixel's difference counts up to this (grey levels) in the line-up: past it, something was laid\n * there (a card, a pill's edge), and how far off it is says nothing about where the picture sits.\n */\nconst MISFIT_CAP = 40;\n/** The 3×3 spread (grey levels) under which a render's pixel is flat: no texture to line up on. */\nconst LINEUP_FLAT = 1.5;\n\n/** `g` with where it is flat: a band or card laid over the picture fits every shift alike, and is left out. */\nfunction withFlat(g: Gray): Gray {\n const flat = new Uint8Array(g.width * g.height);\n for (let i = 0; i < flat.length; i++) {\n const x = i % g.width;\n const y = (i - x) / g.width;\n if (x === 0 || y === 0 || x === g.width - 1 || y === g.height - 1) continue;\n let sum = 0;\n let square = 0;\n for (let k = 0; k < 9; k++) {\n const v = g.data[(y + Math.floor(k / 3) - 1) * g.width + x + (k % 3) - 1] ?? 0;\n sum += v;\n square += v * v;\n }\n flat[i] = Math.sqrt(Math.max(0, square / 9 - (sum / 9) ** 2)) < LINEUP_FLAT ? 1 : 0;\n }\n return { ...g, flat };\n}\n\n/**\n * Mean squared difference of the cut and the render mapped by `c` (shift in full pixels, `k` level\n * pixels each), each pixel's capped at `cap` grey levels, over the pixels that land on texture of\n * the render (`render.flat` left out). Infinite once it cannot come in under `beat`, or must\n * come in over `above`, checked at each row: every pixel still to read adds at least nothing to the\n * sum and at most one to the count.\n */\nfunction misfit(\n cut: Gray,\n render: Gray,\n judged: Judged,\n k: number,\n c: Candidate,\n cap = MISFIT_CAP,\n beat = Number.POSITIVE_INFINITY,\n above = Number.POSITIVE_INFINITY,\n): number {\n const cx = cut.width / 2;\n const cy = cut.height / 2;\n const ox = cx - c.scale * cx + c.dx * k;\n const oy = cy - c.scale * cy + c.dy * k;\n const cols = axisOf(ox, c.scale, cut.width, render.width);\n const rows = axisOf(oy, c.scale, cut.height, render.height);\n const look: Sampling = { cut, render, judged, cols, most: cap * cap };\n const count = judged.at.length;\n const acc = { sum: 0, n: 0 };\n for (let r = 0; r < judged.rows.length; r++) {\n const from = judged.starts[r] ?? 0;\n const least = acc.sum / (acc.n + count - from);\n if (least >= beat || least > above) return Number.POSITIVE_INFINITY;\n rowMisfit(look, rows, judged.rows[r] ?? 0, from, judged.starts[r + 1] ?? count, acc);\n }\n return acc.n > 0 ? acc.sum / acc.n : Number.POSITIVE_INFINITY;\n}\n\n/** `data` (a frame `width` wide) between pixel `i`, its right, lower and lower-right neighbours, `fx` across and `fy` down. */\nfunction bilinear(data: Float32Array, i: number, width: number, fx: number, fy: number): number {\n const top = (data[i] ?? 0) * (1 - fx) + (data[i + 1] ?? 0) * fx;\n const bottom = (data[i + width] ?? 0) * (1 - fx) + (data[i + width + 1] ?? 0) * fx;\n return top * (1 - fy) + bottom * fy;\n}\n\n/** What `rowMisfit` reads for one candidate: both pictures, the judged pixels, where each column lands, the cap squared. */\ntype Sampling = { cut: Gray; render: Gray; judged: Judged; cols: Axis; most: number };\n\n/** `misfit` over the judged pixels `from`-`to` of cut row `y`, added to `acc` in order. */\nfunction rowMisfit(\n s: Sampling,\n rows: Axis,\n y: number,\n from: number,\n to: number,\n acc: { sum: number; n: number },\n): void {\n const { width, data, flat } = s.render;\n const { near, at, frac } = s.cols;\n const flatRow = (rows.near[y] ?? 0) * width;\n const row = (rows.at[y] ?? 0) * width;\n const fy = rows.frac[y] ?? 0;\n for (let j = from; j < to; j++) {\n const x = s.judged.xs[j] ?? 0;\n if (flat?.[flatRow + (near[x] ?? 0)]) continue;\n const d = (s.cut.data[s.judged.at[j] ?? 0] ?? 0) - bilinear(data, row + (at[x] ?? 0), width, frac[x] ?? 0, fy);\n acc.sum += Math.min(d * d, s.most);\n acc.n++;\n }\n}\n\n/** The farthest the render is searched from the cut: its own drift measured a few pixels; 3% is room. */\nconst MAX_SHIFT = 0.03;\nconst MAX_SCALE_OFF = 0.03;\n\ntype Level = { edge: number; scales: number[]; reach: number | null };\n\n/** The search pyramid: every scale and shift up to 3% on a coarse frame, then twice refined around the best. */\nconst LEVELS: readonly Level[] = [\n { edge: 128, scales: [-0.03, -0.02, -0.01, 0, 0.01, 0.02, 0.03], reach: null },\n { edge: 256, scales: [-0.005, 0, 0.005], reach: 2 },\n { edge: 512, scales: [-0.0025, 0, 0.0025], reach: 1 },\n];\n\n/** The best candidate on one level of the pyramid, around `centre`. */\nfunction searchLevel(\n cut: Gray,\n render: Gray,\n k: number,\n level: Level,\n centre: Candidate,\n exclude: readonly Span[],\n): { best: Candidate; score: number } {\n const judged = judgedPixels(cut, exclude);\n const reach = level.reach ?? Math.ceil(MAX_SHIFT * Math.max(cut.width, cut.height));\n let best = centre;\n let score = Number.POSITIVE_INFINITY;\n // The centre is read first only to bound the rest: a candidate sure to fit worse is dropped early.\n const atCentre = misfit(cut, render, judged, k, centre);\n const side = 2 * reach + 1;\n for (const ds of level.scales) {\n const scale = centre.scale + ds;\n if (Math.abs(scale - 1) > MAX_SCALE_OFF + 1e-9) continue;\n for (let s = 0; s < side * side; s++) {\n const c = { scale, dx: centre.dx + ((s % side) - reach) / k, dy: centre.dy + (Math.floor(s / side) - reach) / k };\n const m = misfit(cut, render, judged, k, c, MISFIT_CAP, score, atCentre);\n if (m < score) {\n score = m;\n best = c;\n }\n }\n }\n return { best, score };\n}\n\n/**\n * How `render` (the words model's frame, resized to the cut's pixels) lines up with `cut`:\n * a coarse-to-fine search of scale (0.97-1.03) and shift (±3%), minimising the squared\n * difference outside `exclude` (where the words were set, which differ on purpose) and off what\n * the render laid flat (a band, a card), each pixel's capped (`MISFIT_CAP`), so nothing laid over\n * the picture pulls it. `residual` is the root-mean-square difference left there, uncapped, in\n * grey levels.\n */\nexport function registerToSource(render: Raw, cut: Raw, exclude: readonly Span[]): Registration {\n return lineUps(render, `${pictureId(cut)} ${JSON.stringify(exclude)}`, () => lineUp(render, cut, exclude));\n}\n\n/** A render refused whole is lined up again to lift its words: the same render, cut and words, the same line-up. */\nconst lineUps = remembered<Registration>();\nconst warps = remembered<Raw>();\n\nfunction lineUp(render: Raw, cut: Raw, exclude: readonly Span[]): Registration {\n const full = { cut: grayOf(cut), render: grayOf(render) };\n let best: Candidate = { scale: 1, dx: 0, dy: 0 };\n let finest = { cut: full.cut, render: full.render, k: 1 };\n for (const level of LEVELS) {\n const c = shrink(full.cut, level.edge);\n const r = withFlat(shrink(full.render, level.edge));\n const k = c.width / cut.width;\n best = searchLevel(c, r, k, level, best, exclude).best;\n finest = { cut: c, render: r, k };\n }\n const judged = judgedPixels(finest.cut, exclude);\n const residual = misfit(finest.cut, finest.render, judged, finest.k, best, Number.POSITIVE_INFINITY);\n return { ...best, residual: Math.sqrt(residual) };\n}\n\n/** `taps` along one axis of a frame `size` long, for every pixel `t` mapped to `centre + scale·(t − centre) + shift`. */\nfunction bilinearAxis(centre: number, scale: number, shift: number, size: number) {\n const lo = new Int32Array(size);\n const hi = new Int32Array(size);\n const frac = new Float64Array(size);\n for (let t = 0; t < size; t++) {\n const p = Math.min(size - 1, Math.max(0, centre + scale * (t - centre) + shift));\n lo[t] = Math.floor(p);\n hi[t] = Math.min(size - 1, (lo[t] ?? 0) + 1);\n frac[t] = p - (lo[t] ?? 0);\n }\n return { lo, hi, frac };\n}\n\n/** `render` mapped onto the cut's frame by `fit` (bilinear, edges carried), at its own pixel size, RGB. */\nexport function warpToCut(render: Raw, fit: Pick<Registration, \"scale\" | \"dx\" | \"dy\">): Raw {\n return warps(render, `${fit.scale} ${fit.dx} ${fit.dy}`, () => warped(render, fit));\n}\n\nfunction warped(render: Raw, fit: Pick<Registration, \"scale\" | \"dx\" | \"dy\">): Raw {\n const { width, height } = render;\n const out = Buffer.alloc(width * height * 3);\n const cols = bilinearAxis(width / 2, fit.scale, fit.dx, width);\n const rows = bilinearAxis(height / 2, fit.scale, fit.dy, height);\n for (let y = 0; y < height; y++) {\n const row = { y, top: (rows.lo[y] ?? 0) * width, bottom: (rows.hi[y] ?? 0) * width, fy: rows.frac[y] ?? 0 };\n warpRow(render, out, cols, row);\n }\n return { data: out, width, height, channels: 3 };\n}\n\n/** Row `row.y` of `warped`: each pixel the four render pixels around where it lands, weighed, RGB. */\nfunction warpRow(\n render: Raw,\n out: Buffer,\n cols: ReturnType<typeof bilinearAxis>,\n row: { y: number; top: number; bottom: number; fy: number },\n): void {\n const { width, channels, data } = render;\n const { fy } = row;\n for (let x = 0; x < width; x++) {\n const fx = cols.frac[x] ?? 0;\n const w = [(1 - fx) * (1 - fy), fx * (1 - fy), (1 - fx) * fy, fx * fy] as const;\n const lo = cols.lo[x] ?? 0;\n const hi = cols.hi[x] ?? 0;\n const a = [\n (row.top + lo) * channels,\n (row.top + hi) * channels,\n (row.bottom + lo) * channels,\n (row.bottom + hi) * channels,\n ] as const;\n const o = (row.y * width + x) * 3;\n for (let c = 0; c < 3; c++) {\n out[o + c] = Math.round(\n w[0] * (data[a[0] + c] ?? 0) +\n w[1] * (data[a[1] + c] ?? 0) +\n w[2] * (data[a[2] + c] ?? 0) +\n w[3] * (data[a[3] + c] ?? 0),\n );\n }\n }\n}\n\n/**\n * The words layer: what of the model's (aligned) render is laid on the cut, per pixel.\n * `alpha` how much of the layer a pixel takes; `ink` how much of that is the model's own pixel\n * (`pixels`), the rest the cut's pixel times `gain` (the model's low-frequency tone change: a\n * scrim, a card's shadow). Row-major; `pixels` and `gain` have three values a pixel.\n */\nexport type WordsLayer = {\n width: number;\n height: number;\n alpha: Float32Array;\n ink: Float32Array;\n pixels: Buffer;\n gain: Float32Array;\n};\n\nfunction emptyLayer(width: number, height: number): WordsLayer {\n return {\n width,\n height,\n alpha: new Float32Array(width * height),\n ink: new Float32Array(width * height),\n pixels: Buffer.alloc(width * height * 3),\n gain: new Float32Array(width * height * 3).fill(1),\n };\n}\n\n/** The grid the change is read on, in pixels a cell. */\nconst CELL = 8;\n/** A cell whose mean largest-channel difference is at least this changed (grey levels). */\nconst CHANGED = 14;\n/** A pixel inside a words box is the model's from this difference, fully from `MATTE_HI`. */\nconst MATTE_LO = 8;\nconst MATTE_HI = 32;\n/** How far past a words box the model's pixels are taken, as a share of the box's height (anti-aliasing, a pill's edge). */\nconst BOX_PAD = 0.3;\n/** How far a change may sit from a words box and still be the words' (a card, a scrim), as a share of the frame's width. */\nconst TOUCH = 0.02;\n/** The gain a tone change may apply, either way: past it, it is not a tone. */\nconst GAIN_MAX = 4;\n/** A cell with fewer pixels outside the words than this takes its tone from the cells around it. */\nconst TONE_MIN_PIXELS = (CELL * CELL) / 4;\n\n/** `b` padded by `BOX_PAD` of its height on every side (the same pixels across as down): a line with its anti-aliasing and a pill's edge. */\nexport const padded = (b: Span, width: number, height: number): Span => {\n const pad = BOX_PAD * (b.y1 - b.y0);\n const padX = (pad * height) / width;\n return { x0: b.x0 - padX, y0: b.y0 - pad, x1: b.x1 + padX, y1: b.y1 + pad };\n};\n\ntype Grid = { gw: number; gh: number; cell: (x: number, y: number) => number; span: (g: number) => Span };\n\nfunction gridOf(width: number, height: number): Grid {\n const gw = Math.ceil(width / CELL);\n const gh = Math.ceil(height / CELL);\n return {\n gw,\n gh,\n cell: (x, y) => Math.floor(y / CELL) * gw + Math.floor(x / CELL),\n span: (g) => {\n const gx = g % gw;\n const gy = Math.floor(g / gw);\n return {\n x0: (gx * CELL) / width,\n y0: (gy * CELL) / height,\n x1: ((gx + 1) * CELL) / width,\n y1: ((gy + 1) * CELL) / height,\n };\n },\n };\n}\n\n/** The 8 cells around `g` on the grid. */\nfunction neighbours(g: number, grid: Grid): number[] {\n const gx = g % grid.gw;\n const gy = Math.floor(g / grid.gw);\n const out: number[] = [];\n for (let k = 0; k < 9; k++) {\n const nx = gx + (k % 3) - 1;\n const ny = gy + Math.floor(k / 3) - 1;\n if (k !== 4 && nx >= 0 && ny >= 0 && nx < grid.gw && ny < grid.gh) out.push(ny * grid.gw + nx);\n }\n return out;\n}\n\ntype CellStats = {\n /** Each cell's mean largest-channel difference. */\n diff: Float32Array;\n /** Each pixel's largest-channel difference. */\n pixelDiff: Float32Array;\n /** Each cell's mean colour, render and cut, read off its pixels outside the words only. */\n meanA: Float32Array;\n meanC: Float32Array;\n toneCount: Float32Array;\n};\n\n/** Adds pixel `i` (at cell `g`) of the render and the cut to `s`; its colour only when `tone`. */\nfunction addPixel(s: CellStats, aligned: Raw, cut: Raw, i: number, g: number, tone: boolean): number {\n let d = 0;\n for (let c = 0; c < 3; c++) {\n const a = aligned.data[i * aligned.channels + c] ?? 0;\n const b = cut.data[i * cut.channels + c] ?? 0;\n d = Math.max(d, Math.abs(a - b));\n if (!tone) continue;\n s.meanA[g * 3 + c] = (s.meanA[g * 3 + c] ?? 0) + a;\n s.meanC[g * 3 + c] = (s.meanC[g * 3 + c] ?? 0) + b;\n }\n return d;\n}\n\n/** How much each cell and pixel changed, and each cell's colour outside the words. */\nfunction cellStats(aligned: Raw, cut: Raw, words: Uint8Array, grid: Grid): CellStats {\n const cells = grid.gw * grid.gh;\n const s: CellStats = {\n diff: new Float32Array(cells),\n pixelDiff: new Float32Array(cut.width * cut.height),\n meanA: new Float32Array(cells * 3),\n meanC: new Float32Array(cells * 3),\n toneCount: new Float32Array(cells),\n };\n const count = new Float32Array(cells);\n for (let i = 0; i < cut.width * cut.height; i++) {\n const x = i % cut.width;\n const y = Math.floor(i / cut.width);\n const g = grid.cell(x, y);\n // The tone is read only off what is not words: a white headline is not a lighter scrim.\n const tone = !words[i];\n const d = addPixel(s, aligned, cut, i, g, tone);\n s.pixelDiff[i] = d;\n s.diff[g] = (s.diff[g] ?? 0) + d;\n count[g] = (count[g] ?? 0) + 1;\n if (tone) s.toneCount[g] = (s.toneCount[g] ?? 0) + 1;\n }\n for (let k = 0; k < cells * 3; k++) {\n const g = Math.floor(k / 3);\n if (k % 3 === 0) s.diff[g] = (s.diff[g] ?? 0) / (count[g] || 1);\n s.meanA[k] = (s.meanA[k] ?? 0) / (s.toneCount[g] || 1);\n s.meanC[k] = (s.meanC[k] ?? 0) / (s.toneCount[g] || 1);\n }\n return s;\n}\n\nconst isChanged = (diff: Float32Array, g: number) => (diff[g] ?? 0) >= CHANGED;\n\n/** Marks every changed cell connected to `start` (8-connected) as region `id`. */\nfunction flood(start: number, id: number, diff: Float32Array, region: Int32Array, grid: Grid): void {\n region[start] = id;\n const stack = [start];\n while (stack.length > 0) {\n const g = stack.pop() ?? 0;\n const next = neighbours(g, grid).filter((n) => isChanged(diff, n) && (region[n] ?? -1) < 0);\n for (const n of next) region[n] = id;\n stack.push(...next);\n }\n}\n\n/** Each changed cell's region (8-connected), -1 for an unchanged cell, and how many regions there are. */\nfunction changedRegions(diff: Float32Array, grid: Grid): { region: Int32Array; count: number } {\n const region = new Int32Array(diff.length).fill(-1);\n let count = 0;\n for (let start = 0; start < diff.length; start++) {\n if (!isChanged(diff, start) || (region[start] ?? -1) >= 0) continue;\n flood(start, count, diff, region, grid);\n count++;\n }\n return { region, count };\n}\n\n/** Each cell's tone change (the render's mean over the cut's, per channel, kept within `GAIN_MAX`), or null when it is mostly words. */\nfunction cellGain(s: CellStats, g: number): number[] | null {\n if ((s.toneCount[g] ?? 0) < TONE_MIN_PIXELS) return null;\n return [0, 1, 2].map((c) => {\n const ratio = ((s.meanA[g * 3 + c] ?? 0) + 8) / ((s.meanC[g * 3 + c] ?? 0) + 8);\n return Math.min(GAIN_MAX, Math.max(1 / GAIN_MAX, ratio));\n });\n}\n\n/** The mean of the known gains around `g`, or null when none is known yet. */\nfunction neighbourGain(gain: Float32Array, known: Uint8Array, g: number, grid: Grid): number[] | null {\n const around = neighbours(g, grid).filter((n) => known[n]);\n if (around.length === 0) return null;\n return [0, 1, 2].map((c) => around.reduce((sum, n) => sum + (gain[n * 3 + c] ?? 1), 0) / around.length);\n}\n\n/** One pass of the spread: every unknown cell next to a known one takes their mean. How many it filled. */\nfunction spreadGains(gain: Float32Array, known: Uint8Array, grid: Grid): number {\n const filled: Array<[number, number[]]> = [];\n for (let g = 0; g < known.length; g++) {\n const from = known[g] ? null : neighbourGain(gain, known, g, grid);\n if (from) filled.push([g, from]);\n }\n for (const [g, value] of filled) {\n gain.set(value, g * 3);\n known[g] = 1;\n }\n return filled.length;\n}\n\n/** Every cell's tone gain; a cell mostly words takes its neighbours', spreading inward until every cell has one. */\nfunction toneGains(s: CellStats, grid: Grid): Float32Array {\n const cells = grid.gw * grid.gh;\n const gain = new Float32Array(cells * 3).fill(1);\n const known = new Uint8Array(cells);\n for (let g = 0; g < cells; g++) {\n const own = cellGain(s, g);\n if (!own) continue;\n gain.set(own, g * 3);\n known[g] = 1;\n }\n let spread = 1;\n while (spread > 0) spread = spreadGains(gain, known, grid);\n return gain;\n}\n\n/**\n * The gains averaged over each cell and its neighbours: a scrim or a card's shade is smooth across\n * cells, and a cell whose own gain is far from its neighbours' is something drawn again, which the\n * tone check then finds.\n */\nfunction smoothGains(gains: Float32Array, grid: Grid): Float32Array {\n const out = new Float32Array(gains.length);\n for (let g = 0; g < grid.gw * grid.gh; g++) {\n const around = [g, ...neighbours(g, grid)];\n for (let c = 0; c < 3; c++) {\n out[g * 3 + c] = around.reduce((sum, n) => sum + (gains[n * 3 + c] ?? 1), 0) / around.length;\n }\n }\n return out;\n}\n\n/** The most a cell may still differ from the cut times its gain (mean largest-channel, grey levels) and be a tone. */\nconst STRUCTURAL = 16;\n\n/** Each cell's mean largest-channel difference between the render and the cut times the cell's gain, outside the words. */\nfunction toneMisfit(aligned: Raw, cut: Raw, gains: Float32Array, words: Uint8Array, grid: Grid): Float32Array {\n const sum = new Float32Array(grid.gw * grid.gh);\n const count = new Float32Array(grid.gw * grid.gh);\n for (let i = 0; i < cut.width * cut.height; i++) {\n const x = i % cut.width;\n const y = (i - x) / cut.width;\n if (words[i]) continue;\n const g = grid.cell(x, y);\n let d = 0;\n for (let c = 0; c < 3; c++) {\n const want = Math.min(255, (cut.data[i * cut.channels + c] ?? 0) * (gains[g * 3 + c] ?? 1));\n d = Math.max(d, Math.abs((aligned.data[i * aligned.channels + c] ?? 0) - want));\n }\n sum[g] = (sum[g] ?? 0) + d;\n count[g] = (count[g] ?? 0) + 1;\n }\n return sum.map((v, g) => (count[g] ? v / (count[g] ?? 1) : 0));\n}\n\n/** The cell centres around a pixel and their bilinear weights, to read a per-cell value there. */\nfunction cellTaps(grid: Grid, x: number, y: number): { at: number[]; w: number[] } {\n return taps((x + 0.5) / CELL - 0.5, (y + 0.5) / CELL - 0.5, grid.gw, grid.gh);\n}\n\n/**\n * The words layer of `aligned` (the render, lined up with the cut) over `cut`, for the `designed`\n * words, logo and button boxes. A change is kept only when it touches one: inside a box padded by\n * `BOX_PAD` the model's pixels, matted by how much they changed; in the rest of a kept change its\n * tone as a gain on the cut. On a person, face or product (`subjects`) only the box itself takes the\n * model's pixels, never its padding (the model may have drawn the subject elsewhere); `keepOut`\n * (text that is part of the scene) takes nothing; `boxesOnly` takes no tone, only the boxes.\n * `reverted`: the share of the frame the model changed that was put back to the cut. Pure.\n */\nexport function wordsLayer(\n aligned: Raw,\n cut: Raw,\n designed: readonly Span[],\n opts: { subjects?: readonly Span[]; keepOut?: readonly Span[]; boxesOnly?: boolean } = {},\n): { layer: WordsLayer; reverted: number } {\n const { width, height } = cut;\n const grid = gridOf(width, height);\n const boxes = designed.map((b) => padded(b, width, height));\n const tight = designed.map((b) => ({ ...b }));\n const inBoxes = spanMask(boxes, width, height);\n const stats = cellStats(aligned, cut, inBoxes, grid);\n const kept = keptChange(stats.diff, boxes, grid, (TOUCH * width) / height);\n const gains = smoothGains(toneGains(stats, grid), grid);\n // A tone is only what a gain explains (a scrim, a card on plain ground). A change it does not\n // explain is something drawn again (a person moved, a lamp added) and goes back to the cut; without\n // a trusted alignment no tone is taken at all, only the boxes.\n const misfit = opts.boxesOnly ? null : toneMisfit(aligned, cut, gains, inBoxes, grid);\n const tone = kept.tone.map((t, g) => (t > 0 && misfit && (misfit[g] ?? 0) < STRUCTURAL ? 1 : 0));\n const dropped = kept.tone.reduce((n, t, g) => n + (t > 0 && !tone[g] ? 1 : 0), 0);\n const reverted = kept.reverted + dropped / kept.tone.length;\n const look: PixelLook = {\n aligned,\n stats,\n grid,\n boxes: inBoxes,\n tone,\n gains,\n tight: spanMask(tight, width, height),\n subjects: spanMask(opts.subjects ?? [], width, height),\n keepOut: spanMask(opts.keepOut ?? [], width, height),\n };\n const layer = emptyLayer(width, height);\n for (let i = 0; i < width * height; i++) setLayerPixel(layer, look, i);\n return { layer, reverted };\n}\n\nconst overlaps = (a: Span, b: Span) => a.x0 < b.x1 && a.x1 > b.x0 && a.y0 < b.y1 && a.y1 > b.y0;\n\n/**\n * Which cells' change is the words' (1 in `tone`): every cell of a changed region touching a words\n * box (`boxes` grown by `TOUCH`, `touchY` of the height down). `reverted`: the share of cells\n * changed in a region that touches none, outside the boxes, which the cut takes back.\n */\nfunction keptChange(\n diff: Float32Array,\n boxes: readonly Span[],\n grid: Grid,\n touchY: number,\n): { tone: Float32Array; reverted: number } {\n const { region, count } = changedRegions(diff, grid);\n const near = boxes.map((b) => ({ x0: b.x0 - TOUCH, y0: b.y0 - touchY, x1: b.x1 + TOUCH, y1: b.y1 + touchY }));\n const kept = new Uint8Array(count);\n for (let g = 0; g < region.length; g++) {\n const id = region[g] ?? -1;\n if (id >= 0 && near.some((b) => overlaps(grid.span(g), b))) kept[id] = 1;\n }\n const tone = new Float32Array(region.length);\n let reverted = 0;\n for (let g = 0; g < region.length; g++) {\n const id = region[g] ?? -1;\n if (id < 0) continue;\n if (kept[id]) tone[g] = 1;\n else if (!boxes.some((b) => overlaps(grid.span(g), b))) reverted++;\n }\n return { tone, reverted: reverted / region.length };\n}\n\n/** What `setLayerPixel` reads: the render, the change, the kept tone and its gains, and what it must leave alone. */\ntype PixelLook = {\n aligned: Raw;\n stats: CellStats;\n grid: Grid;\n /** The pixels in a padded words box (1); `tight`, `subjects` and `keepOut` the same for theirs. */\n boxes: Uint8Array;\n tone: Float32Array;\n gains: Float32Array;\n /** The boxes as read, without padding: all a box takes on a subject. */\n tight: Uint8Array;\n subjects: Uint8Array;\n keepOut: Uint8Array;\n};\n\n/** Pixel `i` of the layer: the model's pixel matted inside a words box (only the box as read, on a subject), the tone in the rest of a kept change. */\nfunction setLayerPixel(layer: WordsLayer, look: PixelLook, i: number): void {\n const x = i % layer.width;\n const y = Math.floor(i / layer.width);\n const onSubject = look.subjects[i] === 1;\n const inBox = (onSubject ? look.tight : look.boxes)[i] === 1;\n if (!inBox && look.keepOut[i]) return;\n // Only within a kept change: a tone is never read off a change that was put back.\n const near = look.tone[look.grid.cell(x, y)] ? cellTaps(look.grid, x, y) : undefined;\n const toned = near ? tapped(look.tone, near, 1, 0, 1) : 0;\n const changed = ((look.stats.pixelDiff[i] ?? 0) - MATTE_LO) / (MATTE_HI - MATTE_LO);\n const matte = inBox ? Math.min(1, Math.max(0, changed)) : 0;\n const a = Math.max(matte, toned);\n if (a <= 0) return;\n layer.alpha[i] = a;\n layer.ink[i] = inBox ? 1 : 0;\n const cells = near ?? cellTaps(look.grid, x, y);\n for (let c = 0; c < 3; c++) {\n layer.pixels[i * 3 + c] = look.aligned.data[i * look.aligned.channels + c] ?? 0;\n layer.gain[i * 3 + c] = tapped(look.gains, cells, 3, c, 1);\n }\n}\n\n/**\n * The layer with no word on a face (fractions of the layer's frame): where a model pixel would land\n * on one, the face shows instead; a tone over it stays. `covered`: the share of the faces' pixels\n * a word was taken off. Pure.\n */\nexport function protectFaces(layer: WordsLayer, faces: readonly Span[]): { layer: WordsLayer; covered: number } {\n if (faces.length === 0) return { layer, covered: 0 };\n const alpha = Float32Array.from(layer.alpha);\n const ink = Float32Array.from(layer.ink);\n let onFace = 0;\n let covered = 0;\n for (let i = 0; i < alpha.length; i++) {\n const fx = ((i % layer.width) + 0.5) / layer.width;\n const fy = (Math.floor(i / layer.width) + 0.5) / layer.height;\n if (!inSpans(faces, fx, fy)) continue;\n onFace++;\n const k = ink[i] ?? 0;\n if (k <= 0 || (alpha[i] ?? 0) <= 0) continue;\n covered++;\n alpha[i] = (alpha[i] ?? 0) * (1 - k);\n ink[i] = 0;\n }\n return { layer: { ...layer, alpha, ink }, covered: onFace > 0 ? covered / onFace : 0 };\n}\n\n/** A subject is hidden by the words when they cover this share of its box. */\nconst HIDDEN = 0.5;\n\n/**\n * The products and animals (`subjects`, fractions of the layer's frame) whose box the words cover\n * over `HIDDEN` of (alpha at least one half): the size no longer shows what the others do. Faces\n * are kept by `protectFaces`; a person's body under a headline is an ordinary layout. Pure.\n */\nexport function coveredSubjects(\n layer: WordsLayer,\n subjects: ReadonlyArray<Span & { kind: string; label: string }>,\n): string[] {\n return subjects\n .filter((b) => b.kind === \"product\" || b.kind === \"animal\")\n .filter((b) => {\n const x0 = Math.max(0, Math.floor(b.x0 * layer.width));\n const x1 = Math.min(layer.width, Math.ceil(b.x1 * layer.width));\n const y0 = Math.max(0, Math.floor(b.y0 * layer.height));\n const y1 = Math.min(layer.height, Math.ceil(b.y1 * layer.height));\n let covered = 0;\n for (let y = y0; y < y1; y++) {\n for (let x = x0; x < x1; x++) if ((layer.alpha[y * layer.width + x] ?? 0) >= 0.5) covered++;\n }\n const all = (x1 - x0) * (y1 - y0);\n return all > 0 && covered / all > HIDDEN;\n })\n .map((b) => b.label);\n}\n\n/** The layer laid on the cut: a pixel the layer does not take is the cut's, exactly. */\nexport function compose(cut: Raw, layer: WordsLayer): Raw {\n const { width, height } = cut;\n const out = Buffer.alloc(width * height * 3);\n for (let k = 0; k < width * height * 3; k++) {\n const i = Math.floor(k / 3);\n const c = k % 3;\n const base = cut.data[i * cut.channels + c] ?? 0;\n const a = layer.alpha[i] ?? 0;\n if (a <= 0) {\n out[k] = base;\n continue;\n }\n const ink = layer.ink[i] ?? 0;\n const toned = Math.min(255, base * (layer.gain[k] ?? 1));\n out[k] = Math.round(base * (1 - a) + (ink * (layer.pixels[k] ?? 0) + (1 - ink) * toned) * a);\n }\n return { data: out, width, height, channels: 3 };\n}\n\n/** The mean difference between `out` and `cut` where the layer takes nothing: 0 when the picture outside the words is the cut's own. */\nexport function identityOutside(out: Raw, cut: Raw, alpha: Float32Array): number {\n let sum = 0;\n let n = 0;\n for (let k = 0; k < cut.width * cut.height * 3; k++) {\n const i = Math.floor(k / 3);\n if ((alpha[i] ?? 0) > 0) continue;\n sum += Math.abs((out.data[i * out.channels + (k % 3)] ?? 0) - (cut.data[i * cut.channels + (k % 3)] ?? 0));\n n++;\n }\n return n > 0 ? sum / n : 0;\n}\n\n/** The smallest scale a words move takes before the size's words are set again instead. */\nexport const MIN_WORDS_SCALE = 0.8;\n/** The farthest a group of words is moved off a face, as a share of the frame's height: past it, its words are set again. */\nexport const MAX_WORDS_MOVE = 0.12;\n/**\n * The farthest a group of words past the band is moved out from under the interface. A Meta 9:16 keeps\n * clear of Reels' caption as well as Stories' reply bar (`blockingArea`), the bottom 32%: a button GPT\n * sets at 86-93% of the height is up to a quarter of the frame from clear.\n */\nexport const MAX_BAND_MOVE = 0.25;\n/** Lines closer than this (a share of the height) move together, as one block. */\nconst GROUP_GAP = 0.04;\n/** How finely a move's scale and place are searched. */\nconst SCALE_STEP = 0.05;\nconst MOVE_STEP = 0.005;\n\n/** A move of words: scaled by `scale` about (`cx`, `cy`), then shifted by (`dx`, `dy`); fractions of the frame. */\nexport type WordsShift = { scale: number; cx: number; cy: number; dx: number; dy: number };\n/** One block of words (`group`, the area its layer takes) and its move. */\nexport type WordsMove = { group: Span; fit: WordsShift };\nexport type WordsShiftPlan = { moves: WordsMove[]; reason?: \"band_too_far\" | \"words_over_face\" };\n\n/** How far to move [from, to] to land it inside [lo, hi] (it fits). */\nconst into = (from: number, to: number, lo: number, hi: number) => Math.max(lo - from, 0) + Math.min(hi - to, 0);\n\nconst unionOf = (boxes: readonly Span[]): Span => ({\n x0: Math.min(...boxes.map((b) => b.x0)),\n y0: Math.min(...boxes.map((b) => b.y0)),\n x1: Math.max(...boxes.map((b) => b.x1)),\n y1: Math.max(...boxes.map((b) => b.y1)),\n});\n\nconst overlap = (a: Span, b: Span) => a.x0 < b.x1 && a.x1 > b.x0 && a.y0 < b.y1 && a.y1 > b.y0;\n\n/**\n * Where a block reaching down to `bottom` may be set, first choice first, with the fit's headroom:\n * the band `format`'s placements leave clear, then, where an interface draws over less than the\n * band keeps clear (Stories' header and reply bar), clear of what it draws: the review blocks only\n * words it covers.\n */\nfunction clearAreas(format: string, placements: readonly string[] | undefined, bottom: number): Span[] {\n const area = blockingArea(format, placements);\n // A line that reaches down beside Reels' buttons keeps clear of them.\n const rail = area.rail && bottom > area.rail.from ? area.rail.width : 0;\n const band = {\n x0: area.left + FIT_HEADROOM,\n y0: area.top + FIT_HEADROOM,\n x1: 1 - Math.max(area.right, rail) - FIT_HEADROOM,\n y1: 1 - area.bottom - FIT_HEADROOM,\n };\n const covered = area.covered;\n if (!covered) return [band];\n const drawn = covered.rail && bottom > covered.rail.from ? covered.rail.width : 0;\n return [\n band,\n {\n x0: band.x0,\n y0: covered.top + FIT_HEADROOM,\n x1: 1 - Math.max(area.right, drawn) - FIT_HEADROOM,\n y1: 1 - covered.bottom - FIT_HEADROOM,\n },\n ];\n}\n\n/** The words in blocks, top to bottom: lines less than `GROUP_GAP` apart are one block. */\nfunction wordGroups(words: readonly TextBox[]): TextBox[][] {\n const sorted = [...words].sort((a, b) => a.y0 - b.y0);\n const groups: TextBox[][] = [];\n for (const box of sorted) {\n const last = groups.at(-1);\n if (last && box.y0 - Math.max(...last.map((b) => b.y1)) < GROUP_GAP) last.push(box);\n else groups.push([box]);\n }\n return groups;\n}\n\ntype Placing = {\n areas: readonly Span[];\n faces: readonly Span[];\n others: readonly Span[];\n minScale: number;\n /** How far the block may move (`MAX_WORDS_MOVE`, or `MAX_BAND_MOVE` for one past the band). */\n reach: number;\n};\n\n/** Whether the block's union, moved by `fit`, sits in `area`, off every face and off the other blocks. */\nfunction placed(union: Span, fit: WordsShift, area: Span, p: Placing, withFaces: boolean): boolean {\n const m = movedSpan(union, fit);\n const inArea = m.x0 >= area.x0 - 1e-9 && m.x1 <= area.x1 + 1e-9 && m.y0 >= area.y0 - 1e-9 && m.y1 <= area.y1 + 1e-9;\n return inArea && !p.others.some((o) => overlap(m, o)) && !(withFaces && p.faces.some((f) => overlap(m, f)));\n}\n\n/** The smallest shift of the block at `at`'s scale (the place nearest where it was, within `p.reach`) that sets it in `area`. */\nfunction shiftInto(\n union: Span,\n at: { scale: number; cx: number; cy: number },\n area: Span,\n p: Placing,\n withFaces: boolean,\n): WordsShift | null {\n const half = (at.scale * (union.x1 - union.x0)) / 2;\n const dx = into(at.cx - half, at.cx + half, area.x0, area.x1);\n const steps = Math.round(p.reach / MOVE_STEP);\n for (let k = 0; k <= 2 * steps; k++) {\n const dy = (k % 2 === 0 ? 1 : -1) * Math.ceil(k / 2) * MOVE_STEP;\n const fit = { ...at, dx, dy };\n if (placed(union, fit, area, p, withFaces)) return fit;\n }\n return null;\n}\n\n/**\n * The smallest move of one block that sets it in one of `p.areas`, off the faces and the other\n * blocks: largest scale first, and at each scale the first area that takes it; null when none does.\n */\nfunction blockMove(union: Span, p: Placing, withFaces: boolean): WordsShift | null {\n const cx = (union.x0 + union.x1) / 2;\n const cy = (union.y0 + union.y1) / 2;\n for (let scale = 1; scale >= p.minScale - 1e-9; scale -= SCALE_STEP) {\n for (const area of p.areas) {\n const fit = shiftInto(union, { scale, cx, cy }, area, p, withFaces);\n if (fit) return fit;\n }\n }\n return null;\n}\n\nconst unmoved = (fit: WordsShift) => fit.scale === 1 && fit.dx === 0 && fit.dy === 0;\n\n/** `area` as wide as `union` at least: a block clear of the band's sides moves up or down only, at its own size. */\nconst across = (area: Span, union: Span): Span => ({\n ...area,\n x0: Math.min(area.x0, union.x0),\n x1: Math.max(area.x1, union.x1),\n});\n\n/**\n * How the words move so each block of `words` (the designed words, logo and button, read in the\n * size's frame) sits inside the band `format`'s placements leave clear and off every face: each\n * block on its own, shifted first and scaled (down to `minScale`) only when shifting cannot, never\n * further than `MAX_WORDS_MOVE` off a face (`MAX_BAND_MOVE` out from under the interface). A block already clear stays. `reason` names a block no move\n * clears: `band_too_far`, or `words_over_face` when only a face is in the way. Pure.\n */\nexport function planWordsShift(\n words: readonly TextBox[],\n format: string,\n opts: {\n placements?: readonly string[];\n minScale?: number;\n faces?: readonly Span[];\n /** Places no move may take words into (the logo's slot), though words already there are not moved for them. */\n keepOut?: readonly Span[];\n } = {},\n): WordsShiftPlan {\n const faces = opts.faces ?? [];\n const obstacles = [...faces, ...(opts.keepOut ?? [])];\n const groups = wordGroups(words).map((g) => ({ boxes: g, union: unionOf(g) }));\n const moves: WordsMove[] = [];\n let reason: WordsShiftPlan[\"reason\"];\n for (const [i, group] of groups.entries()) {\n const violations = bandViolations(group.boxes, format, { placements: blockingPlacements(opts.placements) });\n const past = violations.length > 0;\n const onFace = faces.some((f) => overlap(group.union, f));\n if (!past && !onFace) continue;\n const sideways = violations.some((v) => v.edges.includes(\"left\") || v.edges.includes(\"right\"));\n const p: Placing = {\n areas: clearAreas(format, opts.placements, group.union.y1).map((a) => (sideways ? a : across(a, group.union))),\n faces: obstacles,\n others: groups.filter((_, j) => j !== i).map((g) => g.union),\n minScale: opts.minScale ?? MIN_WORDS_SCALE,\n reach: past ? MAX_BAND_MOVE : MAX_WORDS_MOVE,\n };\n const step = stepOf(group.union, past, p);\n if (typeof step === \"string\") reason ??= step;\n else if (step) moves.push({ group: group.union, fit: step });\n }\n return reason ? { moves, reason } : { moves };\n}\n\n/**\n * One block's move into `p.areas`, null when it already sits in one; else why no move clears it:\n * `words_over_face` when only a face is in the way.\n */\nfunction stepOf(union: Span, past: boolean, p: Placing): WordsShift | null | \"band_too_far\" | \"words_over_face\" {\n const fit = blockMove(union, p, true);\n if (fit) return unmoved(fit) ? null : fit;\n return blockMove(union, p, false) || !past ? \"words_over_face\" : \"band_too_far\";\n}\n\n/** Where `fit` takes a box. Pure. */\nexport function movedSpan<T extends Span>(b: T, fit: WordsShift): T {\n const at = (v: number, c: number, d: number) => c + fit.scale * (v - c) + d;\n return {\n ...b,\n x0: at(b.x0, fit.cx, fit.dx),\n y0: at(b.y0, fit.cy, fit.dy),\n x1: at(b.x1, fit.cx, fit.dx),\n y1: at(b.y1, fit.cy, fit.dy),\n };\n}\n\n/** How far past a block the layer it takes reaches (a card, a pill's shadow), as a share of the frame's side. */\nconst GROUP_REACH = 0.03;\n\n/** The block whose area (grown by `GROUP_REACH`) holds pixel `i`, or -1. */\nfunction blockAt(layer: WordsLayer, moves: readonly WordsMove[], i: number): number {\n const fx = ((i % layer.width) + 0.5) / layer.width;\n const fy = (Math.floor(i / layer.width) + 0.5) / layer.height;\n return moves.findIndex(\n (m) =>\n fx >= m.group.x0 - GROUP_REACH &&\n fx <= m.group.x1 + GROUP_REACH &&\n fy >= m.group.y0 - GROUP_REACH &&\n fy <= m.group.y1 + GROUP_REACH,\n );\n}\n\n/**\n * Which move owns each layer pixel: a pixel in a block's area (grown by `GROUP_REACH`), and every\n * layer pixel touching one, since a button's pill or a card reaches past the words read on it;\n * -1 for none.\n */\nfunction owners(layer: WordsLayer, moves: readonly WordsMove[]): Int16Array {\n const { width } = layer;\n const own = new Int16Array(width * layer.height).fill(-1);\n for (let i = 0; i < own.length; i++) if ((layer.alpha[i] ?? 0) > 0) own[i] = blockAt(layer, moves, i);\n spreadOwners(own, layer.alpha, width);\n return own;\n}\n\n/**\n * Each owned pixel's owner spread to the layer pixels it touches, depth first from the last owned\n * pixel. Every pixel enters the stack once: as a seed, or as it is claimed.\n */\nfunction spreadOwners(own: Int16Array, alpha: Float32Array, width: number): void {\n const { stack, seeds } = seedsOf(own);\n let top = seeds;\n const free = (n: number) => n >= 0 && n < own.length && (own[n] ?? -1) < 0 && (alpha[n] ?? 0) > 0;\n while (top > 0) {\n const i = stack[--top] ?? 0;\n const block = own[i] ?? -1;\n for (const n of touching(i, width)) {\n if (!free(n)) continue;\n own[n] = block;\n stack[top++] = n;\n }\n }\n}\n\n/** A stack with room for every pixel, the owned ones first, in order. */\nfunction seedsOf(own: Int16Array): { stack: Int32Array; seeds: number } {\n const stack = new Int32Array(own.length);\n let seeds = 0;\n for (let i = 0; i < own.length; i++) if ((own[i] ?? -1) >= 0) stack[seeds++] = i;\n return { stack, seeds };\n}\n\n/** Pixel `i`'s left, right, upper and lower neighbours in a frame `width` wide; -1 past a side edge. */\nfunction touching(i: number, width: number): number[] {\n const x = i % width;\n return [x > 0 ? i - 1 : -1, x < width - 1 ? i + 1 : -1, i - width, i + width];\n}\n\n/** Copies pixel `from` of `layer` to pixel `to` of `out`, when it takes more of the layer there than what `out` has. */\nfunction takePixel(out: WordsLayer, to: number, layer: WordsLayer, t: { at: number[]; w: number[] }): void {\n const a = tapped(layer.alpha, t);\n if (a <= (out.alpha[to] ?? 0)) return;\n out.alpha[to] = a;\n out.ink[to] = tapped(layer.ink, t);\n for (let c = 0; c < 3; c++) {\n out.pixels[to * 3 + c] = Math.round(tapped(layer.pixels, t, 3, c));\n out.gain[to * 3 + c] = tapped(layer.gain, t, 3, c, 1);\n }\n}\n\n/** Lays block `k` of `layer` (its pixels by `own`) onto `out`, moved by `fit`. */\nfunction moveBlock(out: WordsLayer, layer: WordsLayer, own: Int16Array, k: number, fit: WordsShift): void {\n const { width, height } = layer;\n const back = (p: number, c: number, d: number, size: number) =>\n c * size + (p + 0.5 - c * size - d * size) / fit.scale - 0.5;\n for (let i = 0; i < width * height; i++) {\n const u = back(i % width, fit.cx, fit.dx, width);\n const v = back(Math.floor(i / width), fit.cy, fit.dy, height);\n const inside = u >= 0 && v >= 0 && u <= width - 1 && v <= height - 1;\n if (inside && own[Math.round(v) * width + Math.round(u)] === k) takePixel(out, i, layer, taps(u, v, width, height));\n }\n}\n\n/**\n * The part of `layer` the blocks of `moves` own (`owners`): what a move takes with it, nothing\n * else of the layer. Its `alpha` is where the moved words were. Pure.\n */\nexport function movedPart(layer: WordsLayer, moves: readonly WordsMove[]): WordsLayer {\n const own = owners(layer, moves);\n const out = emptyLayer(layer.width, layer.height);\n for (let i = 0; i < own.length; i++) {\n if ((own[i] ?? -1) >= 0) takePixel(out, i, layer, { at: [i, i, i, i], w: [1, 0, 0, 0] });\n }\n return out;\n}\n\n/** The layer with each block moved by its own fit (bilinear): what a block leaves takes nothing, what no move owns stays. */\nexport function moveLayer(layer: WordsLayer, moves: readonly WordsMove[]): WordsLayer {\n const own = owners(layer, moves);\n const out = emptyLayer(layer.width, layer.height);\n for (let i = 0; i < own.length; i++) {\n if ((own[i] ?? -1) < 0 && (layer.alpha[i] ?? 0) > 0)\n takePixel(out, i, layer, { at: [i, i, i, i], w: [1, 0, 0, 0] });\n }\n for (const [k, { fit }] of moves.entries()) moveBlock(out, layer, own, k, fit);\n return out;\n}\n\n/** The part of `layer` inside the pixel rectangle `rect`. */\nexport function cropLayer(layer: WordsLayer, rect: Rect): WordsLayer {\n const out = emptyLayer(rect.width, rect.height);\n for (let y = 0; y < rect.height; y++) {\n const from = (rect.y + y) * layer.width + rect.x;\n const to = y * rect.width;\n out.alpha.set(layer.alpha.subarray(from, from + rect.width), to);\n out.ink.set(layer.ink.subarray(from, from + rect.width), to);\n out.gain.set(layer.gain.subarray(from * 3, (from + rect.width) * 3), to * 3);\n layer.pixels.copy(out.pixels, to * 3, from * 3, (from + rect.width) * 3);\n }\n return out;\n}\n","/**\n * The words model's render taken whole as a size of a static ad on one picture.\n *\n * Lettering a picture that already has its frame is what the model does well: its type, cards,\n * bands and pills come back clean. Keeping only what it changed at the words (`words-layer.ts`)\n * left their seams on the ad as boxes and smears. So the size is the model's render, lined up with\n * the cut, and only what must not change is put back from the picture: each person, face and\n * product (and the scene's own words) where the model redrew them, through a soft mask, toned to\n * the render's light. A render that moved the picture or redrew a subject is no lettering of the\n * picture; it is refused, and the size's words are set again.\n *\n * Pure: raw RGB buffers and fractions in, buffers and numbers out.\n */\nimport { blockingPlacements } from \"../../../scaffold/platform-safe-area.ts\";\nimport { bandViolations } from \"./band-check.ts\";\nimport { remembered } from \"./picture-memo.ts\";\nimport type { SubjectBox } from \"./subject-boxes.ts\";\nimport type { PixelRect } from \"./subject-crop.ts\";\nimport type { TextBox } from \"./text-boxes.ts\";\nimport { type BandMove, bandUnder, type LaidMap, laidAround, laidMap, moveBand } from \"./words-band.ts\";\nimport {\n compose,\n movedPart,\n movedSpan,\n moveLayer,\n padded,\n planWordsShift,\n type Raw,\n type Registration,\n registerToSource,\n type Span,\n type WordsMove,\n warpToCut,\n wordsLayer,\n} from \"./words-layer.ts\";\n\n/**\n * How the render (lined up) differs from the cut, per pixel. `structure`: the low-pass difference\n * once the render's own light is taken out (a scrim is a tone, a moved arm is not); `detail`: the\n * same, lightly blurred (what a redrawn face changes); `flat`: the render has no texture there;\n * `surface`: a flat card, band or pill the words sit on, laid over the picture, where it changed\n * it; `ground`: the same card to its edges, also where it hides the picture's texture without\n * changing its tone (a white card over a white shirt); `gain`: the render's light over the cut's,\n * three values a pixel.\n */\nexport type RenderDiff = {\n width: number;\n height: number;\n structure: Float32Array;\n detail: Float32Array;\n flat: Uint8Array;\n surface: Uint8Array;\n /** The cards, bands and pills the words sit on, to their edges: never put back from the picture. */\n readonly ground: Uint8Array;\n gain: Float32Array;\n};\n\nconst inSpans = (spans: readonly Span[], fx: number, fy: number) =>\n spans.some((s) => fx >= s.x0 && fx <= s.x1 && fy >= s.y0 && fy <= s.y1);\n\n/** One line of `src` (`n` values from `start`, `step` apart) averaged over 2r+1 values into `out`, its edges carried. */\nfunction blurLine(src: Float32Array, out: Float32Array, start: number, step: number, n: number, r: number): void {\n const last = start + (n - 1) * step;\n let acc = 0;\n for (let k = -r; k <= r; k++) acc += src[k <= 0 ? start : k >= n - 1 ? last : start + k * step] ?? 0;\n for (let k = 0; k < n; k++) {\n out[start + k * step] = acc / (2 * r + 1);\n const enter = k + r + 1;\n const leave = k - r;\n acc +=\n (src[enter >= n - 1 ? last : start + enter * step] ?? 0) - (src[leave <= 0 ? start : start + leave * step] ?? 0);\n }\n}\n\n/**\n * `blurLine` down every column of `src` at once, row by row: each column's running sum takes the\n * same values in the same order, read along the rows the frame is stored in.\n */\nfunction blurColumns(src: Float32Array, out: Float32Array, width: number, height: number, r: number): void {\n const acc = new Float64Array(width);\n const row = (k: number) => (k <= 0 ? 0 : k >= height - 1 ? height - 1 : k) * width;\n for (let k = -r; k <= r; k++) {\n const from = row(k);\n for (let x = 0; x < width; x++) acc[x] = (acc[x] ?? 0) + (src[from + x] ?? 0);\n }\n for (let k = 0; k < height; k++) {\n const to = k * width;\n const enter = row(k + r + 1);\n const leave = row(k - r);\n for (let x = 0; x < width; x++) {\n out[to + x] = (acc[x] ?? 0) / (2 * r + 1);\n acc[x] = (acc[x] ?? 0) + ((src[enter + x] ?? 0) - (src[leave + x] ?? 0));\n }\n }\n}\n\n/** `src` averaged over a (2r+1)² box, edges carried: rows, then columns, of running sums. */\nfunction boxBlur(src: Float32Array, width: number, height: number, r: number): Float32Array {\n if (r < 1) return Float32Array.from(src);\n const along = new Float32Array(width * height);\n for (let y = 0; y < height; y++) blurLine(src, along, y * width, 1, width, r);\n const out = new Float32Array(width * height);\n blurColumns(along, out, width, height, r);\n return out;\n}\n\n/** Two box passes: a tent, smooth enough for a tone or a mask. */\nconst soften = (src: Float32Array, width: number, height: number, r: number) =>\n boxBlur(boxBlur(src, width, height, r), width, height, r);\n\nfunction channelOf(img: Raw, c: number): Float32Array {\n const out = new Float32Array(img.width * img.height);\n for (let i = 0; i < out.length; i++) out[i] = img.data[i * img.channels + c] ?? 0;\n return out;\n}\n\n/** The radius structure is read at, as a share of the frame's width: a hand's width, never a strand of hair. */\nconst STRUCTURE_RADIUS = 0.008;\n/** The gain the render's light may apply either way: past it, it is not light but something else drawn there. */\nconst GAIN_MAX = 2.5;\n/** The local spread (grey levels) under which the render is flat there: a card, a band, a pill. */\nconst FLAT = 2.5;\n/** Structure differences under this (grey levels) are the same thing drawn again; over `MOVED`, something else. */\nexport const STILL = 14;\nexport const MOVED = 28;\n\n/** Where the render has no texture of its own (5×5 spread of its grey under `FLAT`). */\nfunction flatOf(img: Raw): Uint8Array {\n const { width, height } = img;\n const grey = new Float32Array(width * height);\n for (let i = 0; i < grey.length; i++) {\n const o = i * img.channels;\n grey[i] = 0.299 * (img.data[o] ?? 0) + 0.587 * (img.data[o + 1] ?? 0) + 0.114 * (img.data[o + 2] ?? 0);\n }\n const squares = new Float32Array(grey.length);\n for (let i = 0; i < grey.length; i++) squares[i] = (grey[i] ?? 0) * (grey[i] ?? 0);\n const mean = boxBlur(grey, width, height, 2);\n const square = boxBlur(squares, width, height, 2);\n const flat = new Uint8Array(mean.length);\n for (let i = 0; i < mean.length; i++) {\n const m = mean[i] ?? 0;\n flat[i] = Math.sqrt(Math.max(0, (square[i] ?? 0) - m * m)) < FLAT ? 1 : 0;\n }\n return flat;\n}\n\n/** A grid of square cells over a frame, `size` pixels a side. */\ntype CellGrid = { size: number; gw: number; gh: number };\n\nconst gridOver = (width: number, height: number, size: number): CellGrid => ({\n size,\n gw: Math.ceil(width / size),\n gh: Math.ceil(height / size),\n});\n\n/** The cell pixel `i` of a `width`-wide frame falls in. */\nfunction cellOf(grid: CellGrid, i: number, width: number): number {\n const x = i % width;\n return Math.floor((i - x) / width / grid.size) * grid.gw + Math.floor(x / grid.size);\n}\n\n/** The cells within `reach` of `g` (itself included), clipped to the grid. */\nfunction cellsNear(grid: CellGrid, g: number, reach: number): number[] {\n const gx = g % grid.gw;\n const gy = (g - gx) / grid.gw;\n const out: number[] = [];\n for (let ny = Math.max(0, gy - reach); ny <= Math.min(grid.gh - 1, gy + reach); ny++) {\n for (let nx = Math.max(0, gx - reach); nx <= Math.min(grid.gw - 1, gx + reach); nx++) out.push(ny * grid.gw + nx);\n }\n return out;\n}\n\n/** The grid a laid surface is followed on, in pixels a cell. */\nconst SURFACE_CELL = 8;\n\n/** The cells mostly flat in the render where the picture changed (1), as a laid card or band is. */\nfunction laidCells(flat: Uint8Array, structure: Float32Array, width: number, grid: CellGrid): Uint8Array {\n const laid = new Float32Array(grid.gw * grid.gh);\n const count = new Float32Array(grid.gw * grid.gh);\n for (let i = 0; i < flat.length; i++) {\n const g = cellOf(grid, i, width);\n count[g] = (count[g] ?? 0) + 1;\n if (flat[i] && (structure[i] ?? 0) > MOVED) laid[g] = (laid[g] ?? 0) + 1;\n }\n return Uint8Array.from(laid, (n, g) => (n >= (count[g] ?? 1) / 2 ? 1 : 0));\n}\n\n/** The cells a words box (fractions) reaches into. */\nfunction wordCells(words: readonly Span[], width: number, height: number, grid: CellGrid): number[] {\n const out: number[] = [];\n for (let g = 0; g < grid.gw * grid.gh; g++) {\n const gx = g % grid.gw;\n const gy = (g - gx) / grid.gw;\n const x0 = (gx * grid.size) / width;\n const y0 = (gy * grid.size) / height;\n const x1 = ((gx + 1) * grid.size) / width;\n const y1 = ((gy + 1) * grid.size) / height;\n if (words.some((w) => w.x0 < x1 && w.x1 > x0 && w.y0 < y1 && w.y1 > y0)) out.push(g);\n }\n return out;\n}\n\n/** Every cell reached from `seeds` through the cells `open` lets through (8-connected). */\nfunction flood(seeds: readonly number[], open: Uint8Array, grid: CellGrid): Uint8Array {\n const reached = new Uint8Array(grid.gw * grid.gh);\n for (const g of seeds) reached[g] = 1;\n const stack = [...seeds];\n while (stack.length > 0) {\n const next = cellsNear(grid, stack.pop() ?? 0, 1).filter((n) => !reached[n] && open[n]);\n for (const n of next) reached[n] = 1;\n stack.push(...next);\n }\n return reached;\n}\n\n/**\n * The cards, bands and pills the words sit on: flat in the render where the picture changed, and\n * joined to the words (a cell grid flooded from the words' boxes through cells mostly flat and\n * changed). A plain wall a moved subject left behind is flat too, but touches no words.\n */\nfunction surfaceOf(flat: Uint8Array, structure: Float32Array, width: number, height: number, words: readonly Span[]) {\n const grid = gridOver(width, height, SURFACE_CELL);\n const reached = flood(wordCells(words, width, height, grid), laidCells(flat, structure, width, grid), grid);\n const surface = new Uint8Array(structure.length);\n for (let y = 0; y < height; y++) {\n const row = Math.floor(y / grid.size) * grid.gw;\n for (let x = 0; x < width; x++) {\n const i = y * width + x;\n surface[i] = reached[row + Math.floor(x / grid.size)] && (structure[i] ?? 0) > MOVED ? 1 : 0;\n }\n }\n return surface;\n}\n\n/** How far (judged pixels) past a card's colour its own lines are: a hairline, a divider, its edge. */\nconst GROUND_LINE = 3;\n/** How close (levels, each channel) a pixel's colour is to a card's to be the card. */\nconst CARD_TONE = 16;\n/** The share of the line past a card's edge in its colour for the card to run on there. */\nconst CARD_RUN = 0.6;\n\n/** A half-open rectangle of pixels. */\ntype PxRect = { x0: number; y0: number; x1: number; y1: number };\n\n/** Whether pixel `i` of `img` is within `CARD_TONE` of `tone` on every channel. */\nconst inTone = (img: Raw, i: number, tone: readonly number[]) =>\n [0, 1, 2].every((c) => Math.abs((img.data[i * img.channels + c] ?? 0) - (tone[c] ?? 0)) <= CARD_TONE);\n\n/** The pixels of `r` inside the frame. */\nfunction* pixelsOf(r: PxRect, width: number, height: number): Generator<number> {\n for (let y = Math.max(0, r.y0); y < Math.min(height, r.y1); y++) {\n for (let x = Math.max(0, r.x0); x < Math.min(width, r.x1); x++) yield y * width + x;\n }\n}\n\n/** The four strips `depth` deep just past the sides of `r`: above, below, left, right. */\nconst stripsPast = (r: PxRect, depth: number): PxRect[] => [\n { ...r, y0: r.y0 - depth, y1: r.y0 },\n { ...r, y0: r.y1, y1: r.y1 + depth },\n { ...r, x0: r.x0 - depth, x1: r.x0 },\n { ...r, x0: r.x1, x1: r.x1 + depth },\n];\n\n/** Whether pixel `i` of a `width`-wide frame lies in one of `boxes`. */\nconst inBoxes = (boxes: readonly PxRect[], i: number, width: number) => {\n const x = i % width;\n const y = (i - x) / width;\n return boxes.some((b) => x >= b.x0 && x < b.x1 && y >= b.y0 && y < b.y1);\n};\n\n/**\n * The colour of the card a line of words sits on: the median of the flat pixels just around its\n * box, each channel, leaving out what lies in the other lines' boxes (a line set tight between two\n * others has their letters just above and below it). Null when too few of them are flat: words set\n * on the picture itself.\n */\nfunction cardTone(img: Raw, flat: Uint8Array, box: PxRect, others: readonly PxRect[] = []): number[] | null {\n const { width, height } = img;\n const around = stripsPast(box, GROUND_LINE)\n .flatMap((s) => [...pixelsOf(s, width, height)])\n .filter((i) => !inBoxes(others, i, width));\n const flatOnes = around.filter((i) => flat[i]);\n if (around.length === 0 || flatOnes.length < around.length / 2) return null;\n return [0, 1, 2].map((c) => {\n const values = flatOnes.map((i) => img.data[i * img.channels + c] ?? 0).sort((a, b) => a - b);\n return values[Math.floor(values.length / 2)] ?? 0;\n });\n}\n\n/** `r` grown by `by` pixels on side `side` (above, below, left, right). */\nconst grownBy = (r: PxRect, side: number, by: number): PxRect =>\n side === 0\n ? { ...r, y0: r.y0 - by }\n : side === 1\n ? { ...r, y1: r.y1 + by }\n : side === 2\n ? { ...r, x0: r.x0 - by }\n : { ...r, x1: r.x1 + by };\n\n/**\n * The card of colour `tone` around `box`: grown while a line just past each side is mostly that\n * colour, across a hairline or divider up to `GROUND_LINE` thick.\n */\nfunction cardAround(img: Raw, box: PxRect, tone: readonly number[]): PxRect {\n const { width, height } = img;\n const share = (s: PxRect) => {\n const px = [...pixelsOf(s, width, height)];\n return px.length > 0 ? px.filter((i) => inTone(img, i, tone)).length / px.length : 0;\n };\n // How far past side `side` of `r` the card runs on: the nearest line in its colour, else 0.\n const runs = (r: PxRect, side: number) => {\n for (let by = 1; by <= GROUND_LINE + 1; by++)\n if (share(stripsPast(grownBy(r, side, by - 1), 1)[side] ?? r) >= CARD_RUN) return by;\n return 0;\n };\n let r = box;\n for (let grew = true; grew; ) {\n grew = false;\n for (let side = 0; side < 4; side++) {\n const by = runs(r, side);\n if (by === 0) continue;\n r = grownBy(r, side, by);\n grew = true;\n }\n }\n return r;\n}\n\n/**\n * The cards, bands and pills the words sit on, to their edges (`RenderDiff.ground`): around each\n * line, the rectangle of its card's colour, and in it every pixel of that colour or within\n * `GROUND_LINE` of it (the card's hairlines and dividers), never a photo set on the card. A white\n * card over a white shirt changes little of its tone, but hides its folds.\n */\nfunction groundOf(aligned: Raw, flat: Uint8Array, words: readonly Span[]): Uint8Array {\n const { width, height } = aligned;\n const toned = new Float32Array(width * height);\n const inCard = new Uint8Array(width * height);\n const boxes = words.map((w) => ({\n x0: Math.max(0, Math.floor(w.x0 * width)),\n y0: Math.max(0, Math.floor(w.y0 * height)),\n x1: Math.min(width, Math.ceil(w.x1 * width)),\n y1: Math.min(height, Math.ceil(w.y1 * height)),\n }));\n for (const box of boxes) {\n const tone = cardTone(\n aligned,\n flat,\n box,\n boxes.filter((b) => b !== box),\n );\n if (!tone) continue;\n for (const i of pixelsOf(cardAround(aligned, box, tone), width, height)) {\n inCard[i] = 1;\n if (inTone(aligned, i, tone)) toned[i] = 1;\n }\n }\n const near = boxBlur(toned, width, height, GROUND_LINE);\n return Uint8Array.from(near, (v, i) => (v > 0 && inCard[i] ? 1 : 0));\n}\n\n/** Where the light is read from: everywhere but the words, which differ on purpose. */\nfunction trustOf(width: number, height: number, words: readonly Span[]): Float32Array {\n const trust = new Float32Array(width * height);\n for (let i = 0; i < trust.length; i++) {\n const x = i % width;\n trust[i] = inSpans(words, (x + 0.5) / width, ((i - x) / width + 0.5) / height) ? 0 : 1;\n }\n return trust;\n}\n\n/** One picture's three channels: as they are, low-passed (structure) and lightly blurred (detail). */\ntype Planes = { own: Float32Array[]; low: Float32Array[]; fine: Float32Array[] };\n\n/** A size's cut is judged against every render made for it: its planes and its shrunk pixels are read once. */\nconst cutPlanes = remembered<Planes>();\nconst shrunkCuts = remembered<Raw>();\n\nfunction planesOf(img: Raw, r1: number): Planes {\n const own = [0, 1, 2].map((c) => channelOf(img, c));\n return {\n own,\n low: own.map((p) => soften(p, img.width, img.height, r1)),\n fine: own.map((p) => boxBlur(p, img.width, img.height, 1)),\n };\n}\n\n/** The grid the render's light is read on, as a share of the frame's width (16 px at 1080). */\nconst LIGHT_CELL = 0.015;\n/** How many cells each way the light's median reaches: past a card's width, short of a scene's. */\nconst LIGHT_REACH = 3;\n\n/** Each cell's sums over the pixels `open` keeps: the render's three channels, the cut's three, and their count. */\nfunction cellSums(a: Planes, b: Planes, open: Float32Array, width: number, grid: CellGrid): Float32Array {\n const sums = new Float32Array(grid.gw * grid.gh * 7);\n const own = [...a.own, ...b.own];\n for (let i = 0; i < open.length; i++) {\n if (!open[i]) continue;\n const g = cellOf(grid, i, width) * 7;\n for (let c = 0; c < 6; c++) sums[g + c] = (sums[g + c] ?? 0) + (own[c]?.[i] ?? 0);\n sums[g + 6] = (sums[g + 6] ?? 0) + 1;\n }\n return sums;\n}\n\n/** Each cell's light ratio, per channel, over the pixels `open` keeps; NaN where too few are kept. */\nfunction cellRatios(a: Planes, b: Planes, open: Float32Array, width: number, grid: CellGrid): Float32Array {\n const sums = cellSums(a, b, open, width, grid);\n const ratio = new Float32Array(grid.gw * grid.gh * 3).fill(Number.NaN);\n for (let g = 0; g < grid.gw * grid.gh; g++) {\n const n = sums[g * 7 + 6] ?? 0;\n if (n < (grid.size * grid.size) / 4) continue;\n for (let c = 0; c < 3; c++) {\n ratio[g * 3 + c] = ((sums[g * 7 + c] ?? 0) / n + 8) / ((sums[g * 7 + 3 + c] ?? 0) / n + 8);\n }\n }\n return ratio;\n}\n\n/** The median of the known values (three a cell) in cells `near`, channel `c`, sorted in `scratch`; 1 when none is known. */\nfunction medianNear(values: Float32Array, near: readonly number[], c: number, scratch: Float64Array): number {\n let known = 0;\n for (const n of near) {\n const v = values[n * 3 + c] ?? Number.NaN;\n if (!Number.isNaN(v)) scratch[known++] = v;\n }\n if (known === 0) return 1;\n const sorted = scratch.subarray(0, known).sort();\n return sorted[Math.floor(known / 2)] ?? 1;\n}\n\n/** The median of the known values around each cell, per channel (1 where none is known), then a 3×3 mean. */\nfunction medianLight(ratio: Float32Array, grid: CellGrid): Float32Array {\n const cells = grid.gw * grid.gh;\n const median = new Float32Array(cells * 3);\n const scratch = new Float64Array((2 * LIGHT_REACH + 1) ** 2);\n for (let g = 0; g < cells; g++) {\n const near = cellsNear(grid, g, LIGHT_REACH);\n for (let c = 0; c < 3; c++) median[g * 3 + c] = medianNear(ratio, near, c, scratch);\n }\n const smooth = new Float32Array(cells * 3);\n for (let k = 0; k < cells * 3; k++) {\n const near = cellsNear(grid, Math.floor(k / 3), 1);\n smooth[k] = near.reduce((sum, n) => sum + (median[n * 3 + (k % 3)] ?? 1), 0) / near.length;\n }\n return smooth;\n}\n\n/**\n * The render's light over the cut's, per pixel and channel: each cell's ratio over the pixels\n * `open` keeps, the median of the cells around it (a card or a redrawn arm is a minority, a scrim\n * or a warmer grade is not), drawn smoothly between cell centres, kept within `GAIN_MAX`.\n */\nfunction lightOf(a: Planes, b: Planes, open: Float32Array, width: number, height: number): Float32Array {\n const grid = gridOver(width, height, Math.max(8, Math.round(width * LIGHT_CELL)));\n const light = medianLight(cellRatios(a, b, open, width, grid), grid);\n const gain = enlarge(light, { width: grid.gw, height: grid.gh }, { width, height }, 3);\n const kept = new Float32Array(gain.length);\n for (let i = 0; i < gain.length; i++) kept[i] = Math.min(GAIN_MAX, Math.max(1 / GAIN_MAX, gain[i] ?? 0));\n return kept;\n}\n\n/** The structure and detail differences of the render from the cut in `gain`'s light, largest channel. */\nfunction compared(a: Planes, b: Planes, gain: Float32Array, n: number) {\n const structure = new Float32Array(n);\n const detail = new Float32Array(n);\n for (let c = 0; c < 3; c++) {\n const [aLow, bLow, aFine, bFine] = [a.low[c], b.low[c], a.fine[c], b.fine[c]];\n for (let i = 0; i < n; i++) {\n const g = gain[i * 3 + c] ?? 1;\n structure[i] = Math.max(structure[i] ?? 0, Math.abs((aLow?.[i] ?? 0) - g * (bLow?.[i] ?? 0)));\n detail[i] = Math.max(detail[i] ?? 0, Math.abs((aFine?.[i] ?? 0) - g * (bFine?.[i] ?? 0)));\n }\n }\n return { structure, detail };\n}\n\n/**\n * How `aligned` (the words render, lined up with the cut) differs from `cut`, in the render's\n * light, read off everything but `words` (padded boxes, fractions). Pure.\n */\nexport function renderDiff(aligned: Raw, cut: Raw, words: readonly Span[]): RenderDiff {\n const { width, height } = cut;\n const r1 = Math.max(2, Math.round(width * STRUCTURE_RADIUS));\n const a = planesOf(aligned, r1);\n const b = cutPlanes(cut, String(r1), () => planesOf(cut, r1));\n const gain = lightOf(a, b, trustOf(width, height, words), width, height);\n const { structure, detail } = compared(a, b, gain, width * height);\n const flat = flatOf(aligned);\n const surface = surfaceOf(flat, structure, width, height, words);\n let ground: Uint8Array | undefined;\n return {\n width,\n height,\n structure,\n detail,\n flat,\n surface,\n gain,\n // Read only to put a subject back: a render refused is never read for it.\n get ground() {\n ground ??= groundOf(aligned, flat, words);\n return ground;\n },\n };\n}\n\n/**\n * How a subject fared in the render: `shown`, the share of its box neither under the words\n * (`words`, padded boxes) nor under a card or band laid over it; `moved`, the share of what the\n * words leave of it whose structure changed with no surface there (it moved, or was drawn in\n * another pose); `drift`, the mean detail difference where its structure held (a face drawn\n * again). Pure.\n */\nexport function subjectDrift(\n diff: RenderDiff,\n subject: Span,\n words: readonly Span[],\n): { shown: number; moved: number; drift: number } {\n const { width, height } = diff;\n const x0 = Math.max(0, Math.floor(subject.x0 * width));\n const x1 = Math.min(width, Math.ceil(subject.x1 * width));\n const y0 = Math.max(0, Math.floor(subject.y0 * height));\n const y1 = Math.min(height, Math.ceil(subject.y1 * height));\n const n = { all: 0, open: 0, covered: 0, moved: 0, drift: 0, held: 0 };\n for (let y = y0; y < y1; y++) {\n for (let x = x0; x < x1; x++) {\n n.all++;\n if (!inSpans(words, (x + 0.5) / width, (y + 0.5) / height)) countDrift(n, diff, y * width + x);\n }\n }\n return {\n shown: n.all > 0 ? (n.open - n.covered) / n.all : 0,\n moved: n.open > 0 ? n.moved / n.open : 0,\n drift: n.held > 0 ? n.drift / n.held : 0,\n };\n}\n\n/** Counts pixel `i`, off the words, as held (and how far its detail drifted), covered by a surface, or moved. */\nfunction countDrift(\n n: { open: number; covered: number; moved: number; drift: number; held: number },\n diff: RenderDiff,\n i: number,\n): void {\n n.open++;\n if ((diff.structure[i] ?? 0) <= MOVED) {\n n.drift += diff.detail[i] ?? 0;\n n.held++;\n } else if (diff.surface[i]) n.covered++;\n else n.moved++;\n}\n\n/**\n * A subject whose detail drifted more than this (mean grey levels, judged at half a delivered\n * size's pixels) is put back from the picture. Dev, Oct 2026: faces GPT lettered around drifted\n * 3.0-5.5, a round photo it drew again in place 20-22; under 3 nobody tells the two apart.\n */\nconst DRIFTED = 3;\n/**\n * The least `keptShare` of a render that lettered the picture. Dev, Oct 2026 (16 words renders on\n * two companies, judged at half their pixels): every render that kept the picture in place kept\n * 0.83 or more, every one that shrank or moved it 0.69 or less.\n */\nconst MIN_KEPT = 0.75;\n/** The most of the frame's side the line-up may bring in from past the render's edge: a few pixels of carried edge. */\nconst MAX_CARRIED = 0.005;\n/**\n * The share of a subject (`subjectDrift` `moved`) past which the model drew it elsewhere or in\n * another pose. Dev, Oct 2026: subjects lettered around moved 0.14 or less; a head turned, or a\n * round photo moved inside its card, 0.36 or more.\n */\nconst REDRAWN = 0.2;\n\n/** What was read of one render taken whole: what it kept, and what became of its subjects and its words. */\nexport type WholeReading = {\n /** `keptShare`. */\n kept: number;\n /** How much of the size's frame the line-up brings in from past the render's edge, a share of its side. */\n carried: number;\n subjects: ReadonlyArray<{ label: string; moved: number; drift: number; shown: number }>;\n /** `wordsLost`. */\n lost: readonly string[];\n /** `wordsOnFaces`. */\n onFace: readonly string[];\n};\n\n/** Why a render cannot be the size as it is. */\nexport const WHOLE_PROBLEMS = [\"picture_moved\", \"subject_redrawn\", \"words_lost\", \"words_over_face\"] as const;\nexport type WholeProblem = (typeof WHOLE_PROBLEMS)[number];\n\nexport type WholeVerdict = { ok: true; restore: string[] } | { ok: false; problem: WholeProblem; what: string[] };\n\n/**\n * Whether a render can be the size as it is: taken, with the subjects it drew again put back\n * (`restore`, by label), or refused with what was wrong. Pure.\n */\nexport function wholeVerdict(r: WholeReading): WholeVerdict {\n if (r.kept < MIN_KEPT || r.carried > MAX_CARRIED) return { ok: false, problem: \"picture_moved\", what: [] };\n const redrawn = r.subjects.filter((s) => s.moved > REDRAWN).map((s) => s.label);\n if (redrawn.length > 0) return { ok: false, problem: \"subject_redrawn\", what: redrawn };\n if (r.lost.length > 0) return { ok: false, problem: \"words_lost\", what: [...r.lost] };\n if (r.onFace.length > 0) return { ok: false, problem: \"words_over_face\", what: [...r.onFace] };\n return { ok: true, restore: r.subjects.filter((s) => s.drift > DRIFTED).map((s) => s.label) };\n}\n\n/** A grey picture, `width` × `height`. */\ntype Grey = { data: Float32Array; width: number; height: number };\n\n/** `img` in grey, averaged down by a whole factor `f`. */\nfunction greyOf(img: Raw, f: number): Grey {\n const width = Math.max(1, Math.floor(img.width / f));\n const height = Math.max(1, Math.floor(img.height / f));\n const data = new Float32Array(width * height);\n for (let i = 0; i < width * height; i++) {\n const x = (i % width) * f;\n const y = Math.floor(i / width) * f;\n let sum = 0;\n for (let j = 0; j < f; j++) {\n for (let k = 0; k < f; k++) {\n const o = ((y + j) * img.width + x + k) * img.channels;\n sum += 0.299 * (img.data[o] ?? 0) + 0.587 * (img.data[o + 1] ?? 0) + 0.114 * (img.data[o + 2] ?? 0);\n }\n }\n data[i] = sum / (f * f);\n }\n return { data, width, height };\n}\n\n/** A candidate place for a subject: moved by (dx, dy) pixels, scaled by `scale` about its centre. */\ntype Place = { dx: number; dy: number; scale: number };\n\n/**\n * How alike the cut's patch (`box`, pixels of `cut`) and the render are once the patch is put at\n * `place`: normalized cross-correlation, -1 when the patch would leave the render.\n */\nfunction likeness(render: Grey, cut: Grey, box: PixelRect, place: Place): number {\n const cx = box.x + box.width / 2;\n const cy = box.y + box.height / 2;\n const n = { count: 0, a: 0, c: 0, aa: 0, cc: 0, ac: 0 };\n for (let y = box.y; y < box.y + box.height; y++) {\n for (let x = box.x; x < box.x + box.width; x++) {\n const u = Math.round(cx + place.scale * (x - cx) + place.dx);\n const v = Math.round(cy + place.scale * (y - cy) + place.dy);\n if (u < 0 || v < 0 || u >= render.width || v >= render.height) return -1;\n const a = render.data[v * render.width + u] ?? 0;\n const c = cut.data[y * cut.width + x] ?? 0;\n n.count++;\n n.a += a;\n n.c += c;\n n.aa += a * a;\n n.cc += c * c;\n n.ac += a * c;\n }\n }\n const va = n.aa - (n.a * n.a) / n.count;\n const vc = n.cc - (n.c * n.c) / n.count;\n return va > 1e-6 && vc > 1e-6 ? (n.ac - (n.a * n.c) / n.count) / Math.sqrt(va * vc) : -1;\n}\n\n/** The pixel box of `s` inside a `g`, without `inset` of its size on each side (the background at its corners). */\nfunction boxIn(s: Span, g: Grey, inset: number): PixelRect {\n const w = (s.x1 - s.x0) * g.width;\n const h = (s.y1 - s.y0) * g.height;\n const x = Math.max(0, Math.round(s.x0 * g.width + inset * w));\n const y = Math.max(0, Math.round(s.y0 * g.height + inset * h));\n return {\n x,\n y,\n width: Math.max(1, Math.min(g.width - x, Math.round(w * (1 - 2 * inset)))),\n height: Math.max(1, Math.min(g.height - y, Math.round(h * (1 - 2 * inset)))),\n };\n}\n\n/** The best place among `places` for the cut's patch in the render. */\nfunction bestPlace(render: Grey, cut: Grey, box: PixelRect, places: Iterable<Place>): Place & { score: number } {\n let best = { dx: 0, dy: 0, scale: 1, score: -2 };\n for (const place of places) {\n const score = likeness(render, cut, box, place);\n if (score > best.score) best = { ...place, score };\n }\n return best;\n}\n\n/** How far a subject is looked for, as a share of the frame each way, and at which sizes. */\nconst TRACK_REACH = 0.25;\nconst TRACK_SCALES = [0.85, 0.92, 1, 1.08, 1.15];\n/** The frame's width the search first runs at, in pixels. */\nconst TRACK_WIDTH = 180;\n\n/** Every place within `reach` pixels each way of `around`, at each of `scales`. */\nfunction* placesNear(around: Place, reach: number, scales: readonly number[]): Generator<Place> {\n for (const scale of scales) {\n for (let dy = -reach; dy <= reach; dy++) {\n for (let dx = -reach; dx <= reach; dx++) yield { dx: around.dx + dx, dy: around.dy + dy, scale };\n }\n }\n}\n\n/**\n * Where `subject` (a box of the cut, fractions) went in the render: the shift (fractions of the\n * frame) and scale at which the cut's own patch matches the render best, and how well (`score`,\n * normalized cross-correlation: near 1 for the same photo moved, low for one drawn again). Searched\n * coarse, a quarter of the frame each way, then refined at the given pixels. Pure.\n */\nexport function tracked(\n aligned: Raw,\n cut: Raw,\n subject: Span,\n): { dx: number; dy: number; scale: number; score: number } {\n const f = Math.max(1, Math.round(cut.width / TRACK_WIDTH));\n const coarse = { render: greyOf(aligned, f), cut: greyOf(cut, f) };\n const reach = Math.round(TRACK_REACH * coarse.cut.width);\n const found = bestPlace(\n coarse.render,\n coarse.cut,\n boxIn(subject, coarse.cut, 0.1),\n placesNear({ dx: 0, dy: 0, scale: 1 }, reach, TRACK_SCALES),\n );\n const fine = { render: greyOf(aligned, 1), cut: greyOf(cut, 1) };\n const near = [found.scale - 0.03, found.scale, found.scale + 0.03];\n const refined = bestPlace(\n fine.render,\n fine.cut,\n boxIn(subject, fine.cut, 0.1),\n placesNear({ dx: found.dx * f, dy: found.dy * f, scale: 1 }, f, near),\n );\n return {\n dx: refined.dx / cut.width,\n dy: refined.dy / cut.height,\n scale: refined.scale,\n score: refined.score,\n };\n}\n\n/** How much of a face's box, on each side, is its edge (hair, ears, the background at its corners) rather than the face. */\nconst FACE_EDGE = 0.15;\n\n/**\n * The faces (fractions of the render) whose middle a designed line covers: the box without its\n * edges, so a line that reaches the hair beside a face hides nothing. Pure.\n */\nexport function wordsOnFaces(words: readonly Span[], faces: ReadonlyArray<Span & { label: string }>): string[] {\n return facesUnder(words, faces).map((f) => f.label);\n}\n\n/** The faces whose middle a designed line covers (`wordsOnFaces`), themselves. */\nfunction facesUnder<T extends Span>(words: readonly Span[], faces: readonly T[]): T[] {\n return faces.filter((f) => {\n const dx = FACE_EDGE * (f.x1 - f.x0);\n const dy = FACE_EDGE * (f.y1 - f.y0);\n return words.some((w) => w.x0 < f.x1 - dx && w.x1 > f.x0 + dx && w.y0 < f.y1 - dy && w.y1 > f.y0 + dy);\n });\n}\n\n/**\n * How close to the size's frame a line may come (a share of its side) and not read as cut by it:\n * the review called a 4:5's headline 0.7% from its top cut, and its button's pill 0.1% past its\n * bottom clipped (dev, Oct 2026).\n */\nconst FRAME_MARGIN = 0.01;\n\n/**\n * The designed lines (fractions of the size's frame) the size loses: cut by its frame or so close\n * to it they read as cut, or under the interface its placements draw (`blockingPlacements`, as the\n * review blocks). A line only near that interface is kept, as the review keeps it. Pure.\n */\nexport function wordsLost(\n words: readonly TextBox[],\n format: string,\n placements?: readonly string[],\n keepOut: readonly Span[] = [],\n): string[] {\n const cut = words.filter(\n (b) =>\n b.x0 < FRAME_MARGIN ||\n b.y0 < FRAME_MARGIN ||\n b.x1 > 1 - FRAME_MARGIN ||\n b.y1 > 1 - FRAME_MARGIN ||\n keepOut.some((k) => overlaps(b, k)),\n );\n const covered = bandViolations(\n words.filter((b) => !cut.includes(b)),\n format,\n { placements: blockingPlacements(placements) },\n ).filter((v) => v.covered);\n return [...cut.map((b) => b.text), ...covered.map((v) => v.text)];\n}\n\n/** How far past a subject's box its restore fades out, as a share of the box's longer side: hair and shoulders reach past a box. */\nconst ZONE_MARGIN = 0.12;\n/** The feather of the restore's own edge, as a share of the frame's width. */\nconst FEATHER = 0.004;\n\n/** 1 inside `zone`, falling smoothly to 0 over its margin past it, the corners round; added into `into` as a maximum. */\nfunction addZone(into: Float32Array, zone: Span, width: number, height: number): void {\n const x0 = zone.x0 * width;\n const x1 = zone.x1 * width;\n const y0 = zone.y0 * height;\n const y1 = zone.y1 * height;\n const margin = Math.max(4, ZONE_MARGIN * Math.max(x1 - x0, y1 - y0));\n for (let y = Math.max(0, Math.floor(y0 - margin)); y < Math.min(height, Math.ceil(y1 + margin)); y++) {\n for (let x = Math.max(0, Math.floor(x0 - margin)); x < Math.min(width, Math.ceil(x1 + margin)); x++) {\n const dx = Math.max(0, x0 - (x + 0.5), x + 0.5 - x1);\n const dy = Math.max(0, y0 - (y + 0.5), y + 0.5 - y1);\n const t = 1 - Math.min(1, Math.sqrt(dx * dx + dy * dy) / margin);\n const i = y * width + x;\n into[i] = Math.max(into[i] ?? 0, t * t * (3 - 2 * t));\n }\n }\n}\n\n/**\n * Where the picture goes back over the render, 0 to 1 a pixel: each zone (a subject to put back,\n * fractions) fading out past its box, as far as its structure still matches the render's (`STILL`\n * to `MOVED`: a card laid over it stays the render's), feathered, and never on the words (padded\n * boxes). No edge of it is a rectangle. Pure.\n */\nexport function restoreMask(diff: RenderDiff, zones: readonly Span[], words: readonly Span[]): Float32Array {\n const { width, height } = diff;\n const zone = new Float32Array(width * height);\n for (const z of zones) addZone(zone, z, width, height);\n // What the render laid flat over the picture (a card, a band, a pill) stays the render's to its last pixel.\n const laid = boxBlur(\n Float32Array.from(diff.flat, (f, i) => ((f && (diff.detail[i] ?? 0) > KEPT_DETAIL) || diff.ground[i] ? 1 : 0)),\n width,\n height,\n 1,\n );\n const off = trustOf(width, height, words).map((t, i) => (t > 0 && (laid[i] ?? 0) === 0 ? 0 : 1));\n const held = zone.map((z, i) =>\n z > 0 && !off[i] ? z * Math.min(1, Math.max(0, (MOVED - (diff.structure[i] ?? 0)) / (MOVED - STILL))) : 0,\n );\n const feathered = soften(held, width, height, Math.max(2, Math.round(width * FEATHER)));\n return feathered.map((m, i) => (off[i] ? 0 : m));\n}\n\n/**\n * The render with the cut put back under `mask`, each put-back pixel the cut's in the render's\n * light (`gain`, three values a pixel: `RenderDiff.gain`), so a subject comes back as the picture\n * drew it and lit as the render is: no edge where the two meet. Where the mask is 0 the pixel is\n * the render's own. Pure.\n */\nexport function restoreSubjects(aligned: Raw, cut: Raw, gain: Float32Array, mask: Float32Array): Raw {\n const { width, height } = cut;\n const out = Buffer.alloc(width * height * 3);\n for (let i = 0; i < width * height; i++) {\n const m = mask[i] ?? 0;\n for (let c = 0; c < 3; c++) {\n const own = aligned.data[i * aligned.channels + c] ?? 0;\n if (m <= 0) {\n out[i * 3 + c] = own;\n continue;\n }\n const back = Math.min(255, (cut.data[i * cut.channels + c] ?? 0) * (gain[i * 3 + c] ?? 1));\n out[i * 3 + c] = Math.round(own * (1 - m) + back * m);\n }\n }\n return { data: out, width, height, channels: 3 };\n}\n\n/** A detail difference under this (grey levels) is the picture's own pixel drawn again in place. */\nconst KEPT_DETAIL = 24;\n\n/**\n * The share of the picture's textured pixels (outside `words` and the surfaces laid for them) the\n * render kept where they were: near 1 when the model lettered the picture, low when it shrank,\n * moved or reframed it. Pure.\n */\nexport function keptShare(diff: RenderDiff, words: readonly Span[]): number {\n const { width, height } = diff;\n let textured = 0;\n let kept = 0;\n for (let i = 0; i < width * height; i++) {\n if (diff.flat[i] || diff.surface[i]) continue;\n const x = i % width;\n if (inSpans(words, (x + 0.5) / width, ((i - x) / width + 0.5) / height)) continue;\n textured++;\n if ((diff.detail[i] ?? 0) < KEPT_DETAIL) kept++;\n }\n return textured > 0 ? kept / textured : 1;\n}\n\n/** The pixel rectangle `rect` of `img`, as RGB. */\nexport function cropRaw(img: Raw, rect: PixelRect): Raw {\n const data = Buffer.alloc(rect.width * rect.height * 3);\n for (let y = 0; y < rect.height; y++) {\n const from = ((rect.y + y) * img.width + rect.x) * img.channels;\n if (img.channels === 3) {\n img.data.copy(data, y * rect.width * 3, from, from + rect.width * 3);\n continue;\n }\n for (let x = 0; x < rect.width; x++) {\n for (let c = 0; c < 3; c++) data[(y * rect.width + x) * 3 + c] = img.data[from + x * img.channels + c] ?? 0;\n }\n }\n return { data, width: rect.width, height: rect.height, channels: 3 };\n}\n\n/** How much of `frame` (inside a `width`×`height` render) `fit` brings in from past the render's edge, a share of its side. */\nfunction carriedBy(fit: Registration, frame: PixelRect, width: number, height: number): number {\n const at = (x: number, y: number) => [\n width / 2 + fit.scale * (x - width / 2) + fit.dx,\n height / 2 + fit.scale * (y - height / 2) + fit.dy,\n ];\n const [left = 0, top = 0] = at(frame.x, frame.y);\n const [right = 0, bottom = 0] = at(frame.x + frame.width, frame.y + frame.height);\n return Math.max(\n 0,\n -left / frame.width,\n -top / frame.height,\n (right - width) / frame.width,\n (bottom - height) / frame.height,\n );\n}\n\n/** A subject is hidden by the words when less than this share of its box shows. */\nconst SHOWN_MIN = 0.5;\n/** The widest frame a render is judged at: a delivered size is judged at half its pixels, and put back at full. */\nconst JUDGED_WIDTH = 720;\n\n/** `img` averaged down by a whole factor `f`. */\nfunction shrinkRaw(img: Raw, f: number): Raw {\n const width = Math.floor(img.width / f);\n const height = Math.floor(img.height / f);\n const data = Buffer.alloc(width * height * 3);\n for (let i = 0; i < width * height; i++) {\n const x = (i % width) * f;\n const y = Math.floor(i / width) * f;\n for (let c = 0; c < 3; c++) {\n let sum = 0;\n for (let j = 0; j < f; j++) {\n const row = ((y + j) * img.width + x) * img.channels + c;\n for (let k = 0; k < f; k++) sum += img.data[row + k * img.channels] ?? 0;\n }\n data[i * 3 + c] = Math.round(sum / (f * f));\n }\n }\n return { data, width, height, channels: 3 };\n}\n\n/** For each position along one axis, the two it falls between and how far past the first. */\ntype Taps = { near: Int32Array; far: Int32Array; t: Float32Array };\n\n/** For each of `to` positions along one axis, the two of `from` it falls between and how far past the first. */\nfunction axisTaps(from: number, to: number): Taps {\n const near = new Int32Array(to);\n const far = new Int32Array(to);\n const t = new Float32Array(to);\n for (let k = 0; k < to; k++) {\n const u = Math.min(from - 1, Math.max(0, ((k + 0.5) * from) / to - 0.5));\n near[k] = Math.floor(u);\n far[k] = Math.min(from - 1, Math.floor(u) + 1);\n t[k] = u - Math.floor(u);\n }\n return { near, far, t };\n}\n\n/** Output row `y` of `enlarge`, from input rows `top` and `bottom` (pixel offsets), `fy` between them. */\nfunction enlargeRow(\n values: Float32Array,\n out: Float32Array,\n xs: Taps,\n row: { y: number; top: number; bottom: number; fy: number; width: number },\n stride: number,\n): void {\n const { top, bottom, fy } = row;\n for (let x = 0; x < row.width; x++) {\n const left = xs.near[x] ?? 0;\n const right = xs.far[x] ?? 0;\n const fx = xs.t[x] ?? 0;\n const o = (row.y * row.width + x) * stride;\n for (let c = 0; c < stride; c++) {\n const upper =\n (values[(top + left) * stride + c] ?? 0) * (1 - fx) + (values[(top + right) * stride + c] ?? 0) * fx;\n const lower =\n (values[(bottom + left) * stride + c] ?? 0) * (1 - fx) + (values[(bottom + right) * stride + c] ?? 0) * fx;\n out[o + c] = upper * (1 - fy) + lower * fy;\n }\n }\n}\n\n/** `values` (`stride` a pixel, `from` pixels) drawn at `to` pixels, bilinear. */\nfunction enlarge(\n values: Float32Array,\n from: { width: number; height: number },\n to: { width: number; height: number },\n stride: number,\n): Float32Array {\n if (from.width === to.width && from.height === to.height) return values;\n const xs = axisTaps(from.width, to.width);\n const ys = axisTaps(from.height, to.height);\n const out = new Float32Array(to.width * to.height * stride);\n for (let y = 0; y < to.height; y++) {\n const top = (ys.near[y] ?? 0) * from.width;\n const bottom = (ys.far[y] ?? 0) * from.width;\n enlargeRow(values, out, xs, { y, top, bottom, fy: ys.t[y] ?? 0, width: to.width }, stride);\n }\n return out;\n}\n\n/** What a size's words render is taken whole with: the render, the cut it lettered, and what was read on both. */\nexport type WholeInput = {\n /** The words model's render and the cut it was shown, at the same (work) pixels. */\n render: Raw;\n cut: Raw;\n /** The size's own frame inside them. */\n frame: PixelRect;\n /** The render's designed words and the scene's own lines, as read on it (fractions); null when nobody could read them. */\n words: { designed: readonly TextBox[]; inScene: readonly TextBox[] } | null;\n /** The people, faces, animals and products of the cut (fractions). */\n subjects: readonly SubjectBox[];\n format: string;\n placements?: readonly string[];\n /** The smallest scale a block of words is moved at (`planWordsShift`). */\n minScale?: number;\n /** Where no word may sit (the slot kept for the logo file), fractions of the size's frame. */\n keepOut?: readonly Span[];\n};\n\n/**\n * The render taken whole: `out`, the size (its frame, lined up with the cut), with the subjects\n * it redrew put back (`restored`) and each block of words code moved (`moves`, fractions of the\n * size); `covered`, the products and animals its words hide most of. Refused with `problem` when\n * it cannot be the size as it is.\n */\nexport type WholeTake =\n | {\n ok: true;\n out: Raw;\n restored: string[];\n covered: string[];\n moves: WordsMove[];\n kept: number;\n residual: number;\n }\n | {\n ok: false;\n problem: WholeProblem;\n what: string[];\n kept: number;\n residual: number;\n /** When only where its words sit is wrong: the render as it is, its subjects put back. */\n whole?: { out: Raw; restored: string[]; covered: string[] };\n };\n\n/** A move planned on the size's frame, as fractions of the whole render the frame sits in. */\nfunction moveOnRender(m: WordsMove, frame: PixelRect, width: number, height: number): WordsMove {\n const x = (v: number) => (frame.x + v * frame.width) / width;\n const y = (v: number) => (frame.y + v * frame.height) / height;\n return {\n group: { x0: x(m.group.x0), y0: y(m.group.y0), x1: x(m.group.x1), y1: y(m.group.y1) },\n fit: {\n scale: m.fit.scale,\n cx: x(m.fit.cx),\n cy: y(m.fit.cy),\n dx: (m.fit.dx * frame.width) / width,\n dy: (m.fit.dy * frame.height) / height,\n },\n };\n}\n\n/** What `placeWords` is given: the render lined up, the cut, the size so far, the light, and where the words sit. */\ntype Placing = {\n aligned: Raw;\n cut: Raw;\n out: Raw;\n gain: Float32Array;\n /** The render lined up and the cut, at the pixels they are judged at: what lies around each block. */\n judged: { aligned: Raw; cut: Raw };\n frame: PixelRect;\n words: { designed: readonly TextBox[]; inScene: readonly TextBox[] };\n subjects: readonly SubjectBox[];\n format: string;\n placements?: readonly string[];\n minScale?: number;\n keepOut?: readonly Span[];\n};\n\n/** Two spans overlap. */\nconst overlaps = (a: Span, b: Span) => a.x0 < b.x1 && a.x1 > b.x0 && a.y0 < b.y1 && a.y1 > b.y0;\n\n/** `box` moved by (`dx`, `dy`). */\nconst shifted = <T extends Span>(box: T, dx: number, dy: number): T => ({\n ...box,\n x0: box.x0 + dx,\n y0: box.y0 + dy,\n x1: box.x1 + dx,\n y1: box.y1 + dy,\n});\n\n/** The block of `moves` that holds `box` (its middle inside the block), if any. */\nconst moveOf = (box: Span, moves: readonly WordsMove[]) =>\n moves.find((m) => inSpans([m.group], (box.x0 + box.x1) / 2, (box.y0 + box.y1) / 2));\n\n/** The smallest span holding `a` and `b`. */\nconst hull = (a: Span, b: Span): Span => ({\n x0: Math.min(a.x0, b.x0),\n y0: Math.min(a.y0, b.y0),\n x1: Math.max(a.x1, b.x1),\n y1: Math.max(a.y1, b.y1),\n});\n\n/**\n * Words are lifted off the render alone only where it laid nothing around them past this share:\n * a quote on a soft glow (3-6% of its ring) came off with squares of the glow (dev, Oct 2026).\n */\nconst BARE = 0.02;\n\n/** The size's frame, as fractions of the `width`×`height` render it sits in. */\nconst frameSpan = (frame: PixelRect, width: number, height: number): Span => ({\n x0: frame.x / width,\n y0: frame.y / height,\n x1: (frame.x + frame.width) / width,\n y1: (frame.y + frame.height) / height,\n});\n\n/** How far past the frame's edge (a share of its side) a card runs before the frame cuts it. */\nconst CARD_CUT = 0.005;\n\n/**\n * Whether `band` (render fractions) is a card the frame `f` cuts: it runs past an edge, and is no\n * band spanning the frame from side to side across that edge (a band runs off the frame by design).\n */\nfunction cardCut(band: Span, f: Span): boolean {\n const w = f.x1 - f.x0;\n const h = f.y1 - f.y0;\n const across = band.x0 <= f.x0 + FRAME_MARGIN * w && band.x1 >= f.x1 - FRAME_MARGIN * w;\n const down = band.y0 <= f.y0 + FRAME_MARGIN * h && band.y1 >= f.y1 - FRAME_MARGIN * h;\n const pastY = band.y0 < f.y0 - CARD_CUT * h || band.y1 > f.y1 + CARD_CUT * h;\n const pastX = band.x0 < f.x0 - CARD_CUT * w || band.x1 > f.x1 + CARD_CUT * w;\n return (pastY && !across) || (pastX && !down);\n}\n\n/** The card (render fractions) a designed line sits on when the size's frame cuts it, else null. */\nfunction cutCardOf(laid: LaidMap, line: Span, f: Span): Span | null {\n const band = bandUnder(laid, line);\n return band && cardCut(band, f) ? band : null;\n}\n\n/** The boxes, one for each place (lines placed as one card are one box). */\nconst unique = (boxes: readonly TextBox[]): TextBox[] =>\n boxes.filter(\n (b, i) => boxes.findIndex((o) => o.x0 === b.x0 && o.y0 === b.y0 && o.x1 === b.x1 && o.y1 === b.y1) === i,\n );\n\n/** The spans, those that overlap merged into one. */\nfunction merged(spans: readonly Span[]): Span[] {\n const out: Span[] = [];\n for (const s of spans) {\n let joined = s;\n for (let i = out.length - 1; i >= 0; i--) {\n const o = out[i];\n if (o && overlaps(o, joined)) {\n joined = hull(o, joined);\n out.splice(i, 1);\n }\n }\n out.push(joined);\n }\n return out;\n}\n\n/**\n * What the lines of block `m` sit on: the bands, cards and pills (render fractions, one for lines\n * on the same), `picture` when every line sits on the picture itself, `mixed` when only some do.\n */\nfunction carriersOf(m: WordsMove, laid: LaidMap, designed: readonly TextBox[]): Span[] | \"picture\" | \"mixed\" {\n const lines = designed.filter((b) => inSpans([m.group], (b.x0 + b.x1) / 2, (b.y0 + b.y1) / 2));\n const bands = lines.flatMap((b) => {\n const band = bandUnder(laid, b);\n return band ? [band] : [];\n });\n if (bands.length === 0) return \"picture\";\n return bands.length < lines.length ? \"mixed\" : merged(bands);\n}\n\n/**\n * Each block of `banded` (blocks of `moves` on a band, card or pill) as that band moved with it\n * (render fractions): never scaled, never landing on a face, every line it carries still clear\n * of the frame and the app where it lands, and every other line, where it ends up, clear of where\n * the band was and goes. Null when a band cannot be found or moved so: the words are set again.\n */\nfunction bandMoves(\n banded: ReadonlyArray<{ move: WordsMove; band: Span }>,\n moves: readonly WordsMove[],\n p: Placing,\n at: { inFrame: (b: TextBox) => TextBox; extent: (b: TextBox) => Span },\n): BandMove[] | null {\n const faces = p.subjects.filter((s) => s.kind === \"face\");\n const out: BandMove[] = [];\n for (const { move: m, band } of banded) {\n if (m.fit.scale < 1 - 1e-9 || out.some((o) => overlaps(o.band, band))) return null;\n const { dx, dy } = m.fit;\n const landing = shifted(band, dx, dy);\n const carried = p.words.designed.filter((b) => inSpans([band], (b.x0 + b.x1) / 2, (b.y0 + b.y1) / 2));\n const others = p.words.designed.filter((b) => !carried.includes(b));\n // Where another line ends up, with the pill or card it sits on.\n const ends = (b: TextBox) => {\n const own = moveOf(b, moves);\n return own ? movedSpan(at.extent(b), own.fit) : at.extent(b);\n };\n const lost = wordsLost(\n carried.map((b) => at.inFrame(shifted(b, dx, dy))),\n p.format,\n p.placements,\n );\n const crossed =\n carried.some((b) => (moveOf(b, moves) ?? m) !== m) || others.some((b) => overlaps(ends(b), hull(band, landing)));\n if (lost.length > 0 || crossed || facesUnder([landing], faces).length > 0) return null;\n out.push({ band, dx, dy, words: carried });\n }\n return out;\n}\n\n/**\n * `out` with the blocks of `moves`, set on the picture itself, lifted off the render (`wordsLayer`,\n * `movedPart`), the picture put back where they were in the render's light, and set down where\n * they move.\n */\nfunction wordsMoved(p: Placing, out: Raw, moves: readonly WordsMove[]): Raw {\n const { layer } = wordsLayer(p.aligned, p.cut, p.words.designed, {\n subjects: p.subjects,\n keepOut: p.words.inScene,\n });\n const part = movedPart(layer, moves);\n const left = soften(\n part.alpha.map((a) => (a > 0 ? 1 : 0)),\n p.cut.width,\n p.cut.height,\n 2,\n ).map((a, i) => Math.max(a, part.alpha[i] ?? 0));\n return compose(restoreSubjects(out, p.cut, p.gain, left), moveLayer(part, moves));\n}\n\n/**\n * The render's words that the size's frame cuts, its app covers or a face sits under, moved by\n * code (`planWordsShift`) on the render's own picture: a block set on the picture itself on its\n * own (`wordsMoved`), a block on a band or card with its band (`moveBand`). Null when no move\n * clears them: the words are set again. Moved on the whole render, so a button half past the\n * frame's edge comes in whole.\n */\nfunction placeWords(p: Placing): { out: Raw; moves: WordsMove[] } | null {\n const { width, height } = p.cut;\n const inFrame = <T extends Span>(b: T): T => ({\n ...b,\n x0: (b.x0 * width - p.frame.x) / p.frame.width,\n x1: (b.x1 * width - p.frame.x) / p.frame.width,\n y0: (b.y0 * height - p.frame.y) / p.frame.height,\n y1: (b.y1 * height - p.frame.y) / p.frame.height,\n });\n const showing = (b: Span) => b.x1 > 0 && b.y1 > 0 && b.x0 < 1 && b.y0 < 1;\n const laid = laidMap(p.judged.aligned, p.judged.cut);\n const f = frameSpan(p.frame, width, height);\n // A line on a card the frame cuts is placed as its card, so the whole card comes inside.\n const placed = p.words.designed.map((b) => {\n const card = cutCardOf(laid, b, f);\n return card ? { ...b, ...card } : b;\n });\n const plan = planWordsShift(unique(placed).map(inFrame).filter(showing), p.format, {\n ...(p.placements ? { placements: p.placements } : {}),\n ...(p.minScale !== undefined ? { minScale: p.minScale } : {}),\n faces: p.subjects\n .filter((s) => s.kind === \"face\")\n .map(inFrame)\n .filter(showing),\n // Never into the logo's slot, nor out of it: a block moved out of it had its band cut through the letters.\n ...(p.keepOut ? { keepOut: p.keepOut } : {}),\n });\n if (plan.reason || plan.moves.length === 0) return null;\n const moves = plan.moves.map((m) => moveOnRender(m, p.frame, width, height));\n const under = moves.map((move) => ({ move, on: carriersOf(move, laid, p.words.designed) }));\n // Lifted off alone, words take squares of what lies around them: a band nobody can tell the edges\n // of, a soft glow, the other part of a block only partly on a band. Those words are set again.\n const unsure = (u: (typeof under)[number]) =>\n u.on === \"mixed\" || (u.on === \"picture\" && laidAround(laid, u.move.group) > BARE);\n if (under.some(unsure)) return null;\n const banded = under.flatMap((u) => (Array.isArray(u.on) ? u.on.map((band) => ({ move: u.move, band })) : []));\n const bands = bandMoves(banded, moves, p, { inFrame, extent: (b) => bandUnder(laid, b) ?? b });\n if (!bands) return null;\n const loose = under.flatMap((u) => (u.on === \"picture\" ? [u.move] : []));\n let out = loose.length > 0 ? wordsMoved(p, p.out, loose) : p.out;\n for (const band of bands) out = moveBand({ aligned: p.aligned, cut: p.cut, out }, band);\n return { out, moves: plan.moves };\n}\n\n/**\n * A size's words render taken whole: lined up with the cut (`registerToSource`), judged\n * (`wholeVerdict`), and its redrawn subjects and the scene's own lines put back from the cut\n * (`restoreMask`, `restoreSubjects`). With its words unread, the render is the size as it is and\n * nothing is put back: nobody knows where its words sit. Pure.\n */\nexport function takeWhole(input: WholeInput): WholeTake {\n const { render, cut, frame } = input;\n const fit = registerToSource(render, cut, input.words?.designed ?? []);\n const aligned = warpToCut(render, fit);\n if (!input.words) {\n const out = cropRaw(aligned, frame);\n return { ok: true, out, restored: [], covered: [], moves: [], kept: 1, residual: fit.residual };\n }\n const judging = judge(input, input.words, fit, aligned);\n const { verdict, kept } = judging;\n // Words only out of place are moved by code below; anything else is the render's own fault.\n const misplaced = !verdict.ok && (verdict.problem === \"words_lost\" || verdict.problem === \"words_over_face\");\n if (!verdict.ok && !misplaced) return { ...verdict, kept, residual: fit.residual };\n const { out, gain, taken } = putBack(input, input.words, aligned, judging);\n const done = { ...taken, kept, residual: fit.residual };\n if (verdict.ok) return { ok: true, out: cropRaw(out, frame), moves: [], ...done };\n const placed = placeWords({\n aligned,\n cut,\n out,\n gain: gain(),\n judged: judging.judged,\n frame,\n words: input.words,\n subjects: input.subjects,\n format: input.format,\n ...(input.placements ? { placements: input.placements } : {}),\n ...(input.minScale !== undefined ? { minScale: input.minScale } : {}),\n ...(input.keepOut ? { keepOut: input.keepOut } : {}),\n });\n if (!placed) return { ...verdict, kept, residual: fit.residual, whole: { out: cropRaw(out, frame), ...taken } };\n return { ok: true, out: cropRaw(placed.out, frame), moves: placed.moves, ...done };\n}\n\n/** What `judge` found: the verdict, what was read for it, and the subjects the model only moved. */\ntype Judging = {\n verdict: WholeVerdict;\n reading: WholeReading;\n kept: number;\n diff: RenderDiff;\n judged: { aligned: Raw; cut: Raw };\n words: Span[];\n drifts: Array<{ subject: SubjectBox; shown: number }>;\n relocated: Relocation[];\n};\n\n/** The render lined up, read and judged (`wholeVerdict`), a small subject the model only moved followed where it went. */\nfunction judge(\n input: WholeInput,\n read: { designed: readonly TextBox[]; inScene: readonly TextBox[] },\n fit: Registration,\n aligned: Raw,\n): Judging {\n const { cut, frame } = input;\n const { width, height } = cut;\n const words = read.designed.map((b) => padded(b, width, height));\n // Judged at half its pixels: what is read is shapes and shares, and a delivered size is 1080 wide.\n const shrink = Math.max(1, Math.round(width / JUDGED_WIDTH));\n const judged =\n shrink > 1\n ? { aligned: shrinkRaw(aligned, shrink), cut: shrunkCuts(cut, String(shrink), () => shrinkRaw(cut, shrink)) }\n : { aligned, cut };\n const diff = renderDiff(judged.aligned, judged.cut, words);\n const drifts = input.subjects.map((s) => ({ subject: s, ...subjectDrift(diff, s, words) }));\n const inFrame = (b: TextBox): TextBox => ({\n ...b,\n x0: (b.x0 * width - frame.x) / frame.width,\n x1: (b.x1 * width - frame.x) / frame.width,\n y0: (b.y0 * height - frame.y) / frame.height,\n y1: (b.y1 * height - frame.y) / frame.height,\n });\n const kept = keptShare(diff, words);\n const gone = new Set<SubjectBox>();\n const laid = laidMap(judged.aligned, judged.cut);\n const f = frameSpan(frame, width, height);\n // A line whose card the frame cuts is cut with it, the review reads: its card moves inside.\n const carded = read.designed.filter((b) => cutCardOf(laid, b, f)).map((b) => b.text);\n const lost = wordsLost(read.designed.map(inFrame), input.format, input.placements, input.keepOut);\n const base = {\n kept,\n carried: carriedBy(fit, frame, width, height),\n lost: [...lost, ...carded.filter((t) => !lost.includes(t))],\n };\n const faces = () => input.subjects.filter((s) => s.kind === \"face\" && !gone.has(s));\n const readingNow = (): WholeReading => ({\n ...base,\n subjects: drifts\n .filter((d) => !gone.has(d.subject))\n .map((d) => ({ label: d.subject.label, moved: d.moved, drift: d.drift, shown: d.shown })),\n onFace: wordsOnFaces(read.designed, faces()),\n });\n let verdict = wholeVerdict(readingNow());\n const relocated: Relocation[] = [];\n // A small photo the model moved (its words then sit where it was) is followed where it went, twice at most.\n for (let round = 0; round < 2 && !verdict.ok && FOLLOWED.has(verdict.problem); round++) {\n const suspects =\n verdict.problem === \"subject_redrawn\"\n ? drifts.filter((d) => !gone.has(d.subject) && d.moved > REDRAWN).map((d) => d.subject)\n : facesUnder(read.designed, faces());\n const found = relocations(withTheirPeople(suspects, input.subjects), judged);\n if (!found) break;\n relocated.push(...found);\n for (const r of found) gone.add(r.subject);\n verdict = wholeVerdict(readingNow());\n }\n return { verdict, reading: readingNow(), kept, diff, judged, words, drifts, relocated };\n}\n\n/** Each subject with the person around a face of it (the same label, holding the face): they move together. */\nfunction withTheirPeople(suspects: readonly SubjectBox[], subjects: readonly SubjectBox[]): SubjectBox[] {\n const holds = (outer: SubjectBox, inner: SubjectBox) =>\n outer.x0 <= inner.x0 + 0.01 &&\n outer.y0 <= inner.y0 + 0.01 &&\n outer.x1 >= inner.x1 - 0.01 &&\n outer.y1 >= inner.y1 - 0.01;\n const people = subjects.filter(\n (p) => p.kind === \"person\" && suspects.some((f) => f.kind === \"face\" && f.label === p.label && holds(p, f)),\n );\n return [...new Set([...suspects, ...people])];\n}\n\n/** The refusals a small subject the model only moved explains: it is not redrawn, and words over where it was are over nothing. */\nconst FOLLOWED: ReadonlySet<WholeProblem> = new Set([\"subject_redrawn\", \"words_over_face\"]);\n\n/** The render with the picture put back: each subject it redrew where it was, each it moved where it went, the scene's own lines. */\nfunction putBack(\n input: WholeInput,\n read: { designed: readonly TextBox[]; inScene: readonly TextBox[] },\n aligned: Raw,\n j: Judging,\n): { out: Raw; gain: () => Float32Array; taken: { restored: string[]; covered: string[] } } {\n const { cut } = input;\n const full = { width: cut.width, height: cut.height };\n const settled = j.verdict.ok ? j.verdict : wholeVerdict({ ...j.reading, lost: [], onFace: [] });\n const restored = settled.ok ? settled.restore : [];\n const back = input.subjects.filter((s) => restored.includes(s.label));\n const zones = [...back, ...read.inScene.map((b) => padded(b, full.width, full.height))];\n const covered = j.drifts\n .filter((d) => (d.subject.kind === \"product\" || d.subject.kind === \"animal\") && d.shown < SHOWN_MIN)\n .map((d) => d.subject.label);\n // At full pixels only when a subject is put back or the words are moved: a render taken as it is never reads it.\n let enlarged: Float32Array | undefined;\n const gain = () => {\n enlarged ??= enlarge(j.diff.gain, j.diff, full, 3);\n return enlarged;\n };\n let out =\n zones.length === 0\n ? aligned\n : restoreSubjects(aligned, cut, gain(), enlarge(restoreMask(j.diff, zones, j.words), j.diff, full, 1));\n for (const r of j.relocated) out = putMoved(out, cut, r, j);\n const moved = j.relocated.map((r) => r.subject.label);\n return { out, gain, taken: { restored: [...new Set([...restored, ...moved])], covered } };\n}\n\n/** A small subject the words model moved whole (`tracked`), and the place it moved it to. */\ntype Relocation = { subject: SubjectBox; place: { dx: number; dy: number; scale: number } };\n\n/** The most of the frame a subject may cover and still be followed where the model moved it: a round photo, a thumbnail. */\nconst TRACK_MAX_AREA = 0.06;\n/** The likeness (`tracked` score) from which a subject the model moved is the same subject, not one drawn again. */\nconst RELOCATED = 0.8;\n/** A subject found less than this far from where it was (a share of the frame) stayed where it was. */\nconst STAYED = 0.005;\n\n/**\n * Where each of `subjects` went, each small and only moved; null when any was too large to follow,\n * was drawn again or did not move. Dev, Oct 2026: GPT moved a quote card's round photo 2-3% to\n * fit the attribution, the same photo (likeness 0.87-0.99). Pure.\n */\nfunction relocations(subjects: readonly SubjectBox[], judged: { aligned: Raw; cut: Raw }): Relocation[] | null {\n if (subjects.length === 0) return null;\n const out: Relocation[] = [];\n for (const subject of subjects) {\n if ((subject.x1 - subject.x0) * (subject.y1 - subject.y0) > TRACK_MAX_AREA) return null;\n const place = tracked(judged.aligned, judged.cut, subject);\n // Found where it was, it did not move: what is wrong with it is not where it went.\n const stayed = Math.hypot(place.dx, place.dy) < STAYED && Math.abs(place.scale - 1) < 0.02;\n if (place.score < RELOCATED || stayed) return null;\n out.push({ subject, place });\n }\n return out;\n}\n\n/** `box` (fractions) moved by `place` about its centre. */\nfunction movedBox(box: Span, place: Relocation[\"place\"]): Span {\n const cx = (box.x0 + box.x1) / 2;\n const cy = (box.y0 + box.y1) / 2;\n return {\n x0: cx + place.dx + place.scale * (box.x0 - cx),\n y0: cy + place.dy + place.scale * (box.y0 - cy),\n x1: cx + place.dx + place.scale * (box.x1 - cx),\n y1: cy + place.dy + place.scale * (box.y1 - cy),\n };\n}\n\n/** The cut with the patch around `box` drawn where `place` takes it (bilinear); the rest the cut as it is. */\nfunction cutMoved(cut: Raw, box: Span, place: Relocation[\"place\"]): Raw {\n const { width, height } = cut;\n const out = Buffer.alloc(width * height * 3);\n if (cut.channels === 3) cut.data.copy(out, 0, 0, width * height * 3);\n else for (let i = 0; i < width * height; i++) cut.data.copy(out, i * 3, i * cut.channels, i * cut.channels + 3);\n const to = movedBox(box, place);\n const margin = (ZONE_MARGIN + FEATHER) * Math.max((to.x1 - to.x0) * width, (to.y1 - to.y0) * height) + 4;\n const cx = ((box.x0 + box.x1) / 2) * width;\n const cy = ((box.y0 + box.y1) / 2) * height;\n for (let y = Math.max(0, Math.floor(to.y0 * height - margin)); y < Math.min(height, to.y1 * height + margin); y++) {\n for (let x = Math.max(0, Math.floor(to.x0 * width - margin)); x < Math.min(width, to.x1 * width + margin); x++) {\n const u = Math.min(width - 1.001, Math.max(0, cx + (x - cx - place.dx * width) / place.scale));\n const v = Math.min(height - 1.001, Math.max(0, cy + (y - cy - place.dy * height) / place.scale));\n const x0 = Math.floor(u);\n const y0 = Math.floor(v);\n const fx = u - x0;\n const fy = v - y0;\n for (let c = 0; c < 3; c++) {\n const at = (px: number, py: number) => cut.data[(py * width + px) * cut.channels + c] ?? 0;\n const top = at(x0, y0) * (1 - fx) + at(x0 + 1, y0) * fx;\n const bottom = at(x0, y0 + 1) * (1 - fx) + at(x0 + 1, y0 + 1) * fx;\n out[(y * width + x) * 3 + c] = Math.round(top * (1 - fy) + bottom * fy);\n }\n }\n }\n return { data: out, width, height, channels: 3 };\n}\n\n/** `out` with a subject the model moved put back as the picture drew it, where the model set it. */\nfunction putMoved(out: Raw, cut: Raw, r: Relocation, j: Judging): Raw {\n const full = { width: cut.width, height: cut.height };\n const moved = cutMoved(cut, r.subject, r.place);\n const judgedMoved =\n j.judged.cut.width === cut.width ? moved : shrinkRaw(moved, Math.round(cut.width / j.judged.cut.width));\n const diff = renderDiff(j.judged.aligned, judgedMoved, j.words);\n const mask = restoreMask(diff, [movedBox(r.subject, r.place)], j.words);\n return restoreSubjects(out, moved, enlarge(diff.gain, diff, full, 3), enlarge(mask, diff, full, 1));\n}\n","/**\n * Whether one size of a static ad shows what its main size shows: the same people, the same\n * product, nothing twice, nobody stretched, never the main picture boxed inside a bigger frame.\n *\n * Box-based where boxes can say it (`boxDifferences`, on `subject-boxes.ts` reads): how many\n * people, faces and animals each size shows. The rest is the vision comparison's\n * (`SIZE_MATCH_PROMPT`): the product, who the people are, anything twice, anything stretched,\n * the main picture boxed in a bigger frame.\n *\n * Calibration (Oct 2026, 29 production size pairs of 20 relayout creatives, each image read twice):\n * - people, faces and animals counted as below flagged none of the 29 pairs; product counts flapped\n * on 4 (a laptop, a box, a court listed on one read and not the other), so products are not counted;\n * - a face's shape is not measured on boxes: one picture cut to 4:5 and 9:16 (the same pixels), read\n * 4 times each, gave the man's face 0.69-0.73 wide for its height on the 4:5 and 0.78-0.84 on the\n * 9:16, as wide a gap as a 25% squeeze makes.\n */\nimport { SIZE_MATCH_MODEL } from \"@baker/canvas-contract\";\nimport sharp from \"sharp\";\nimport { z } from \"zod\";\nimport { askAboutImages, type RenderFinding, type ReviewUsage } from \"./render-review.ts\";\nimport { bytesOf } from \"./static-review.ts\";\nimport { readSubjectBoxes, type SubjectBox, type SubjectKind } from \"./subject-boxes.ts\";\nimport type { Size } from \"./subject-crop.ts\";\n\n/** One image's subjects as the reader read them, one list per read (two reads tell a subject from a misread). */\nexport type SubjectReads = { size: Size; reads: SubjectBox[][] };\n\nexport type SizeDifference = {\n kind: \"added\" | \"missing\" | \"stretched\" | \"other_people\" | \"other_product\" | \"no_product\" | \"duplicated\" | \"framed\";\n /** What differs, in the words the agent acts on, without the size. */\n what: string;\n};\n\n/** A subject counted as shown: its box holds at least this share of the frame (a crowd's faces do not). */\nconst SHOWN_AREA = 0.01;\n/** A subject counted as possibly shown, on the side a difference is measured against: a third of `SHOWN_AREA`. */\nconst SEEN_AREA = SHOWN_AREA / 3;\n/** Two reads' boxes are one subject when they overlap this much (intersection over union). */\nconst SAME_BOX = 0.3;\n\nconst COUNTED: ReadonlyArray<{ kind: SubjectKind; name: string }> = [\n { kind: \"person\", name: \"people\" },\n { kind: \"face\", name: \"faces\" },\n { kind: \"animal\", name: \"animals\" },\n];\n\nconst area = (b: SubjectBox) => Math.max(0, b.x1 - b.x0) * Math.max(0, b.y1 - b.y0);\n\nfunction overlap(a: SubjectBox, b: SubjectBox): number {\n const ix = Math.max(0, Math.min(a.x1, b.x1) - Math.max(a.x0, b.x0));\n const iy = Math.max(0, Math.min(a.y1, b.y1) - Math.max(a.y0, b.y0));\n const union = area(a) + area(b) - ix * iy;\n return union > 0 ? (ix * iy) / union : 0;\n}\n\n/** Subjects of `kind` every read found, each a shown one: what the image certainly shows. */\nfunction surely(image: SubjectReads, kind: SubjectKind): SubjectBox[] {\n const [first = [], ...rest] = image.reads.map((r) => r.filter((b) => b.kind === kind));\n return first.filter((b) => area(b) >= SHOWN_AREA && rest.every((r) => r.some((o) => overlap(b, o) >= SAME_BOX)));\n}\n\n/** The most subjects of `kind` any read found, small ones included: what the image may show. */\nfunction atMost(image: SubjectReads, kind: SubjectKind): number {\n return Math.max(0, ...image.reads.map((r) => r.filter((b) => b.kind === kind && area(b) >= SEEN_AREA).length));\n}\n\n/**\n * How `size` differs from `master` by its subjects' boxes: more people, faces or animals than the\n * main size shows at most, or fewer than it surely shows. A count is surely-shown on one side\n * against may-be-shown on the other, so neither a misread nor a subject at the edge of counting\n * flags. Pure.\n */\nexport function boxDifferences(master: SubjectReads, size: SubjectReads): SizeDifference[] {\n return COUNTED.flatMap(({ kind, name }): SizeDifference[] => {\n const shown = surely(size, kind).length;\n const shownBefore = atMost(master, kind);\n if (shown > shownBefore) {\n return [{ kind: \"added\", what: `shows ${shown} ${name} where the main size shows ${shownBefore}` }];\n }\n const before = surely(master, kind).length;\n const now = atMost(size, kind);\n if (before > now) return [{ kind: \"missing\", what: `shows ${now} ${name} where the main size shows ${before}` }];\n return [];\n });\n}\n\n/** A subject is in what was painted when this share of its box was painted. */\nconst PAINTED = 0.6;\n\n/**\n * The subjects of a picture painted from another (`static_plate`) that every read finds mostly in\n * what was painted (`paintedShare` of a box, 0-1): a person, face or animal is one the picture it\n * was painted from does not show; a product only when it repeats one the kept part shows (its label\n * shares a word with it), since a painted scene may well hold things the reader calls products. Pure.\n */\nexport function paintedSubjects(plate: SubjectReads, paintedShare: (box: SubjectBox) => number): string[] {\n const words = (label: string) => label.toLowerCase().match(/\\p{L}{3,}/gu) ?? [];\n const keptProducts = new Set(\n surely(plate, \"product\")\n .filter((b) => paintedShare(b) < PAINTED)\n .flatMap((b) => words(b.label)),\n );\n return ([\"person\", \"face\", \"animal\", \"product\"] as const).flatMap((kind) =>\n surely(plate, kind)\n .filter((b) => paintedShare(b) >= PAINTED)\n .filter((b) => kind !== \"product\" || words(b.label).some((w) => keptProducts.has(w)))\n .map((b) => b.label),\n );\n}\n\n/**\n * The comparison of one size with the main size, for what boxes cannot say: whether the product\n * and the people are the same ones, shown once, unstretched, and not the main picture boxed in a\n * bigger frame. Calibration (Oct 2026): on the 29 production pairs, asked twice each, it flagged\n * none; it named a size squeezed into another shape, the main picture shrunk onto a blurred 9:16,\n * a man shown twice, and another product (4 of 4 twice, a 25% squeeze once of two).\n */\nexport const SIZE_MATCH_PROMPT = [\n \"Image 1 is the main size of one static ad. Image 2 is the same ad made in another size. Image 2 may show more or less of the scene and lay the words out differently: that is expected and never a finding. Compare only the people, animals and products the two pictures show:\",\n \"- people: Image 2 shows a different number of the ad's people than Image 1, or a different person where Image 1 has one (another face, age, gender or clothing).\",\n \"- product: the product the ad is about (the thing sold or shown in use) is a different object in Image 2 (another model, shape, colour or label), or is missing from it.\",\n \"- duplicated: Image 2 shows the same person, animal or product twice where Image 1 shows it once.\",\n \"- stretched: a person, face or product in Image 2 is visibly stretched or squashed compared with Image 1 (wider or taller than it is).\",\n \"- framed: Image 2 holds Image 1's picture as a smaller rectangle inside a bigger frame, with a visible edge, border or seam around it.\",\n \"Someone in the far background, a crowd, and a prop a bigger frame shows more of are never findings. Say only what you see clearly at phone size; when unsure, it is the same.\",\n 'Reply with only this JSON: {\"people\":\"same|different\",\"product\":\"same|different|missing|none\",\"duplicated\":\"<what is shown twice>|null\",\"stretched\":\"<who or what>|null\",\"framed\":true|false,\"what\":\"<one short sentence naming what differs, or empty>\"}',\n].join(\"\\n\");\n\nconst SizeMatchAnswer = z.object({\n people: z.enum([\"same\", \"different\"]),\n product: z.enum([\"same\", \"different\", \"missing\", \"none\"]),\n duplicated: z.string().nullable().optional(),\n stretched: z.string().nullable().optional(),\n framed: z.boolean(),\n});\n\nconst named = (text: string | null | undefined): string | null => {\n const t = text?.trim();\n return t && t.toLowerCase() !== \"null\" ? t : null;\n};\n\n/** The comparison's answer as differences; null when it is not the shape asked for (\"not compared\", never \"the same\"). Pure. */\nexport function sizeMatchFromAnswer(answer: unknown): SizeDifference[] | null {\n const parsed = SizeMatchAnswer.safeParse(answer);\n if (!parsed.success) return null;\n const a = parsed.data;\n const twice = named(a.duplicated);\n const stretched = named(a.stretched);\n return [\n ...(a.people === \"different\"\n ? [{ kind: \"other_people\" as const, what: \"shows other people than the main size\" }]\n : []),\n ...(a.product === \"different\"\n ? [{ kind: \"other_product\" as const, what: \"shows another product than the main size\" }]\n : a.product === \"missing\"\n ? [{ kind: \"no_product\" as const, what: \"no longer shows the product the main size shows\" }]\n : []),\n ...(twice ? [{ kind: \"duplicated\" as const, what: `shows ${twice} twice` }] : []),\n ...(stretched ? [{ kind: \"stretched\" as const, what: `shows ${stretched} stretched or squashed` }] : []),\n ...(a.framed\n ? [{ kind: \"framed\" as const, what: \"shows the main size's picture boxed inside a bigger frame\" }]\n : []),\n ];\n}\n\n/** One delivered size of the ad, on disk or at a URL. */\nexport type SizeImage = { path: string; format: string };\n\n/** What comparing one size with the main size found; `compared` false when neither the boxes nor the comparison could be read. */\nexport type SizeComparison = { format: string; compared: boolean; differences: SizeDifference[] };\n\n/** Reads of each picture: two tell a subject from a misread (`surely`). */\nconst READS = 2;\n/** Longest edge the comparison is sent: the size it judges at, as a phone shows the ad. */\nconst MATCH_EDGE = 1024;\n\n/** A picture's subjects read twice (`READS`); null when a read did not answer. */\nexport async function readTwice(bytes: Buffer, onSpend?: (usage: ReviewUsage) => void): Promise<SubjectReads | null> {\n const meta = await sharp(bytes).metadata();\n const reads = await Promise.all(Array.from({ length: READS }, () => readSubjectBoxes(bytes, { onSpend })));\n const boxes = reads.flatMap((r) => (r.status === \"read\" ? [r.boxes] : []));\n return boxes.length === READS ? { size: { width: meta.width ?? 0, height: meta.height ?? 0 }, reads: boxes } : null;\n}\n\nconst matchJpeg = async (bytes: Buffer) =>\n (\n await sharp(bytes)\n .resize(MATCH_EDGE, MATCH_EDGE, { fit: \"inside\", withoutEnlargement: true })\n .jpeg({ quality: 88 })\n .toBuffer()\n ).toString(\"base64\");\n\n/** One differences list per kind, each said once: the boxes and the comparison may both name a person added. */\nconst unique = (diffs: readonly SizeDifference[]) =>\n diffs.filter((d, i) => diffs.findIndex((o) => o.what === d.what) === i);\n\n/**\n * Each of `sizes` compared with the main size `master`: its people, faces and animals read twice\n * and counted against the main size's (`boxDifferences`), and the pair shown to the comparison model\n * once (`SIZE_MATCH_PROMPT`). Everything is asked at once.\n */\nexport async function compareSizes(\n master: SizeImage,\n sizes: readonly SizeImage[],\n opts: { onSpend?: (usage: ReviewUsage) => void } = {},\n): Promise<SizeComparison[]> {\n const masterBytes = await bytesOf(master.path);\n const [masterReads, masterJpeg] = await Promise.all([readTwice(masterBytes, opts.onSpend), matchJpeg(masterBytes)]);\n return await Promise.all(\n sizes.map(async (size): Promise<SizeComparison> => {\n const bytes = await bytesOf(size.path);\n const [reads, answer] = await Promise.all([\n readTwice(bytes, opts.onSpend),\n matchJpeg(bytes).then((jpeg) =>\n askAboutImages(SIZE_MATCH_MODEL, [masterJpeg, jpeg], SIZE_MATCH_PROMPT, opts.onSpend, 60_000, {\n effort: \"low\",\n }),\n ),\n ]);\n const boxed = masterReads && reads ? boxDifferences(masterReads, reads) : null;\n const seen = sizeMatchFromAnswer(answer);\n return {\n format: size.format,\n compared: boxed !== null || seen !== null,\n differences: unique([...(boxed ?? []), ...(seen ?? [])]),\n };\n }),\n );\n}\n\n/**\n * One size's differences as the review's blocking finding on it (\"9:16: …\"), typed as the sizes\n * item: autofix makes that size again from the main one, never the main picture. Pure.\n */\nexport function sizeDifferenceFinding(format: string, differences: readonly SizeDifference[]): RenderFinding {\n const missing = differences.some((d) => d.kind === \"missing\" || d.kind === \"no_product\");\n return {\n severity: \"blocking\",\n what: `${format}: ${differences.map((d) => d.what).join(\"; \")}. It must show the main size's people and product, once each, at their own proportions.`,\n kind: { item: \"sizes\", element: \"picture\", defect: missing ? \"missing\" : \"other\", edges: [] },\n };\n}\n"],"mappings":"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","names":["z","z","sharp","z","unionOf","area","across","past","area","across","shrunk","across","neighbours","inBoxes","misfit","unionOf","area","past","inSpans","GAIN_MAX","FLAT","flatOf","flood","share","r","overlaps","into","z","across","placed","out","shrink","holds","z","across","sharp","placed","take","sharp","z","overlap","z","sharp","unique"]}